| 1 | |
|---|
| 2 | |
|---|
| 3 | |
|---|
| 4 | |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 9 | |
|---|
| 10 | |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | |
|---|
| 14 | |
|---|
| 15 | |
|---|
| 16 | |
|---|
| 17 | package com.sun.fortress.compiler.nativeInterface; |
|---|
| 18 | |
|---|
| 19 | import com.sun.fortress.interpreter.evaluator.values.FString; |
|---|
| 20 | import com.sun.fortress.interpreter.evaluator.values.FInt; |
|---|
| 21 | import com.sun.fortress.interpreter.evaluator.values.FLong; |
|---|
| 22 | import com.sun.fortress.interpreter.evaluator.values.FChar; |
|---|
| 23 | import com.sun.fortress.interpreter.evaluator.values.FFloat; |
|---|
| 24 | import com.sun.fortress.interpreter.evaluator.values.FBool; |
|---|
| 25 | |
|---|
| 26 | |
|---|
| 27 | import java.util.ArrayList; |
|---|
| 28 | import java.util.List; |
|---|
| 29 | import java.util.Iterator; |
|---|
| 30 | import java.util.NoSuchElementException; |
|---|
| 31 | |
|---|
| 32 | public class SignatureParser { |
|---|
| 33 | private List<String> arguments; |
|---|
| 34 | private List<String> fortressArguments; |
|---|
| 35 | private String result; |
|---|
| 36 | private String fortressResult; |
|---|
| 37 | private String signature; |
|---|
| 38 | |
|---|
| 39 | private final String prefix = "com/sun/fortress/interpreter/evaluator/values/"; |
|---|
| 40 | |
|---|
| 41 | |
|---|
| 42 | |
|---|
| 43 | SignatureParser(String s) { |
|---|
| 44 | arguments = new ArrayList<String>(); |
|---|
| 45 | fortressArguments = new ArrayList<String>(); |
|---|
| 46 | signature = s; |
|---|
| 47 | |
|---|
| 48 | if (s.charAt(0) != '(') error(s); |
|---|
| 49 | int index = 1; |
|---|
| 50 | int ch = s.charAt(index); |
|---|
| 51 | |
|---|
| 52 | while (ch != ')') { |
|---|
| 53 | switch(ch) { |
|---|
| 54 | case 'B': error(s); |
|---|
| 55 | case 'S': error(s); |
|---|
| 56 | case '[': error(s); |
|---|
| 57 | case 'D': error(s); |
|---|
| 58 | case 'C': |
|---|
| 59 | arguments.add("C"); |
|---|
| 60 | fortressArguments.add("L" + prefix + "FChar;"); |
|---|
| 61 | index++; break; |
|---|
| 62 | case 'F': |
|---|
| 63 | arguments.add("F"); |
|---|
| 64 | fortressArguments.add("L" + prefix + "FFloat;"); |
|---|
| 65 | index++; |
|---|
| 66 | break; |
|---|
| 67 | case 'I': |
|---|
| 68 | arguments.add("I"); |
|---|
| 69 | fortressArguments.add("L" + prefix + "FInt;"); |
|---|
| 70 | index++; |
|---|
| 71 | break; |
|---|
| 72 | case 'J': |
|---|
| 73 | arguments.add("J"); |
|---|
| 74 | fortressArguments.add("L" + prefix + "FLong;"); |
|---|
| 75 | index++; |
|---|
| 76 | break; |
|---|
| 77 | case 'Z': |
|---|
| 78 | arguments.add("Z"); |
|---|
| 79 | fortressArguments.add("L" + prefix + "FBool;"); |
|---|
| 80 | index++; |
|---|
| 81 | break; |
|---|
| 82 | case 'L': |
|---|
| 83 | int end = s.indexOf(';', index) + 1; |
|---|
| 84 | String javaType = s.substring(index, end); |
|---|
| 85 | arguments.add(javaType); |
|---|
| 86 | if (javaType.equals("Ljava/lang/String;")) { |
|---|
| 87 | fortressArguments.add("L" + prefix + "FString;"); |
|---|
| 88 | index = end; |
|---|
| 89 | } else { |
|---|
| 90 | error(s); |
|---|
| 91 | } |
|---|
| 92 | break; |
|---|
| 93 | default: error(s); |
|---|
| 94 | } |
|---|
| 95 | ch = s.charAt(index); |
|---|
| 96 | } |
|---|
| 97 | |
|---|
| 98 | index++; |
|---|
| 99 | ch = s.charAt(index); |
|---|
| 100 | |
|---|
| 101 | switch(ch) { |
|---|
| 102 | case 'B': error(s); |
|---|
| 103 | case 'S': error(s); |
|---|
| 104 | case '[': error(s); |
|---|
| 105 | case 'D': error(s); |
|---|
| 106 | case 'V': result = "V"; fortressResult = "L" + prefix + "FVoid;"; break; |
|---|
| 107 | case 'C': result = "C"; fortressResult = "L" + prefix + "FChar;"; break; |
|---|
| 108 | case 'F': result = "F"; fortressResult = "L" + prefix + "FFloat;"; break; |
|---|
| 109 | case 'I': result = "I"; fortressResult = "L" + prefix + "FInt;"; break; |
|---|
| 110 | case 'J': result = "J"; fortressResult = "L" + prefix + "FLong;"; break; |
|---|
| 111 | case 'Z': result = "Z"; fortressResult = "L" + prefix + "FBool;"; break; |
|---|
| 112 | case 'L': |
|---|
| 113 | int end = s.indexOf(';', index ) + 1; |
|---|
| 114 | String javaType = s.substring(index, end); |
|---|
| 115 | result = javaType; |
|---|
| 116 | if (javaType.equals("Ljava/lang/String;")) { |
|---|
| 117 | fortressResult = "L" + prefix + "FString;"; |
|---|
| 118 | } else { |
|---|
| 119 | error(s); |
|---|
| 120 | } |
|---|
| 121 | break; |
|---|
| 122 | default: error(s); |
|---|
| 123 | } |
|---|
| 124 | } |
|---|
| 125 | |
|---|
| 126 | List<String> getArguments() { return arguments;} |
|---|
| 127 | List<String> getFortressArguments() { return fortressArguments;} |
|---|
| 128 | String getResult() {return result;} |
|---|
| 129 | String getFortressResult() {return fortressResult;} |
|---|
| 130 | |
|---|
| 131 | String getFortressifiedSignature() { |
|---|
| 132 | String result = "("; |
|---|
| 133 | |
|---|
| 134 | for (String s : fortressArguments) |
|---|
| 135 | result = result + s; |
|---|
| 136 | result = result + ")" + fortressResult; |
|---|
| 137 | return result; |
|---|
| 138 | } |
|---|
| 139 | |
|---|
| 140 | String getSignature() { |
|---|
| 141 | return signature; |
|---|
| 142 | } |
|---|
| 143 | |
|---|
| 144 | void error(String s) {throw new RuntimeException("Bad Signature " + s);} |
|---|
| 145 | |
|---|
| 146 | } |
|---|