Mercurial > hg > graal-jvmci-8
comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/ImplicitCastNodeFactory.java @ 20938:18c0f02fa4d2
Truffle-DSL: make type systems optional.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Tue, 14 Apr 2015 15:12:48 +0200 |
parents | a665483c3881 |
children | b1530a6cce8c |
comparison
equal
deleted
inserted
replaced
20937:37ea76052733 | 20938:18c0f02fa4d2 |
---|---|
42 import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.*; | 42 import static com.oracle.truffle.dsl.processor.generator.GeneratorUtils.*; |
43 | 43 |
44 public class ImplicitCastNodeFactory { | 44 public class ImplicitCastNodeFactory { |
45 | 45 |
46 private final ProcessorContext context; | 46 private final ProcessorContext context; |
47 private final TypeData forType; | 47 private final TypeMirror forType; |
48 private final TypeSystemData typeSystem; | 48 private final TypeSystemData typeSystem; |
49 private final DSLOptions options; | 49 private final DSLOptions options; |
50 private final List<TypeData> sourceTypes; | 50 private final List<TypeMirror> sourceTypes; |
51 | 51 |
52 public ImplicitCastNodeFactory(ProcessorContext context, TypeData forType) { | 52 public ImplicitCastNodeFactory(ProcessorContext context, TypeSystemData typeSystem, TypeMirror forType) { |
53 this.context = context; | 53 this.context = context; |
54 this.forType = forType; | 54 this.forType = forType; |
55 this.typeSystem = forType.getTypeSystem(); | 55 this.typeSystem = typeSystem; |
56 this.options = typeSystem.getOptions(); | 56 this.options = typeSystem.getOptions(); |
57 this.sourceTypes = typeSystem.lookupSourceTypes(forType); | 57 this.sourceTypes = typeSystem.lookupSourceTypes(forType); |
58 } | 58 } |
59 | 59 |
60 public static String typeName(TypeData type) { | 60 public static String typeName(TypeMirror type) { |
61 return "Implicit" + getTypeId(type.getBoxedType()) + "Cast"; | 61 return "Implicit" + getTypeId(type) + "Cast"; |
62 } | 62 } |
63 | 63 |
64 public static TypeMirror type(TypeData type) { | 64 public static TypeMirror type(TypeSystemData typeSystem, TypeMirror type) { |
65 TypeSystemData typeSystem = type.getTypeSystem(); | |
66 String typeSystemName = TypeSystemCodeGenerator.typeName(typeSystem); | 65 String typeSystemName = TypeSystemCodeGenerator.typeName(typeSystem); |
67 return new GeneratedTypeMirror(ElementUtils.getPackageName(typeSystem.getTemplateType()) + "." + typeSystemName, typeName(type)); | 66 return new GeneratedTypeMirror(ElementUtils.getPackageName(typeSystem.getTemplateType()) + "." + typeSystemName, typeName(type)); |
68 } | 67 } |
69 | 68 |
70 public static CodeTree create(TypeData type, CodeTree value) { | 69 public static CodeTree create(TypeSystemData typeSystem, TypeMirror type, CodeTree value) { |
71 return CodeTreeBuilder.createBuilder().startStaticCall(type(type), "create").tree(value).end().build(); | 70 return CodeTreeBuilder.createBuilder().startStaticCall(type(typeSystem, type), "create").tree(value).end().build(); |
72 } | 71 } |
73 | 72 |
74 public static CodeTree cast(String nodeName, CodeTree value) { | 73 public static CodeTree cast(String nodeName, CodeTree value) { |
75 return CodeTreeBuilder.createBuilder().startCall(nodeName, "cast").tree(value).end().build(); | 74 return CodeTreeBuilder.createBuilder().startCall(nodeName, "cast").tree(value).end().build(); |
76 } | 75 } |
77 | 76 |
78 public static CodeTree check(String nodeName, CodeTree value) { | 77 public static CodeTree check(String nodeName, CodeTree value) { |
79 return CodeTreeBuilder.createBuilder().startCall(nodeName, "check").tree(value).end().build(); | 78 return CodeTreeBuilder.createBuilder().startCall(nodeName, "check").tree(value).end().build(); |
80 } | 79 } |
81 | 80 |
82 private static String seenFieldName(TypeData type) { | 81 private static String seenFieldName(TypeMirror type) { |
83 return "seen" + getTypeId(type.getBoxedType()); | 82 return "seen" + getTypeId(type); |
84 } | 83 } |
85 | 84 |
86 public CodeTypeElement create() { | 85 public CodeTypeElement create() { |
87 String typeName = typeName(forType); | 86 String typeName = typeName(forType); |
88 TypeMirror baseType = context.getType(Object.class); | 87 TypeMirror baseType = context.getType(Object.class); |
89 CodeTypeElement clazz = GeneratorUtils.createClass(typeSystem, null, modifiers(PUBLIC, FINAL, STATIC), typeName, baseType); | 88 CodeTypeElement clazz = GeneratorUtils.createClass(typeSystem, null, modifiers(PUBLIC, FINAL, STATIC), typeName, baseType); |
90 | 89 |
91 for (TypeData sourceType : sourceTypes) { | 90 for (TypeMirror sourceType : sourceTypes) { |
92 CodeVariableElement hasSeen = new CodeVariableElement(modifiers(PUBLIC), context.getType(boolean.class), seenFieldName(sourceType)); | 91 CodeVariableElement hasSeen = new CodeVariableElement(modifiers(PUBLIC), context.getType(boolean.class), seenFieldName(sourceType)); |
93 hasSeen.getAnnotationMirrors().add(new CodeAnnotationMirror(context.getDeclaredType(CompilationFinal.class))); | 92 hasSeen.getAnnotationMirrors().add(new CodeAnnotationMirror(context.getDeclaredType(CompilationFinal.class))); |
94 clazz.add(hasSeen); | 93 clazz.add(hasSeen); |
95 } | 94 } |
96 | 95 |
111 String methodName = "isMonomorphic"; | 110 String methodName = "isMonomorphic"; |
112 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), context.getType(boolean.class), methodName); | 111 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), context.getType(boolean.class), methodName); |
113 CodeTreeBuilder builder = method.createBuilder(); | 112 CodeTreeBuilder builder = method.createBuilder(); |
114 builder.startReturn(); | 113 builder.startReturn(); |
115 String operator = ""; | 114 String operator = ""; |
116 for (TypeData sourceType : sourceTypes) { | 115 for (TypeMirror sourceType : sourceTypes) { |
117 builder.string(operator); | 116 builder.string(operator); |
118 builder.string(seenFieldName(sourceType)); | 117 builder.string(seenFieldName(sourceType)); |
119 operator = " ^ "; | 118 operator = " ^ "; |
120 } | 119 } |
121 builder.end(); | 120 builder.end(); |
127 } | 126 } |
128 | 127 |
129 private Element createCreate(CodeTypeElement clazz) { | 128 private Element createCreate(CodeTypeElement clazz) { |
130 String methodName = "create"; | 129 String methodName = "create"; |
131 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC, STATIC), clazz.asType(), methodName); | 130 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC, STATIC), clazz.asType(), methodName); |
132 method.addParameter(new CodeVariableElement(typeSystem.getGenericType(), "value")); | 131 method.addParameter(new CodeVariableElement(context.getType(Object.class), "value")); |
133 CodeTreeBuilder builder = method.createBuilder(); | 132 CodeTreeBuilder builder = method.createBuilder(); |
134 | 133 |
135 builder.declaration(clazz.asType(), "newCast", builder.create().startNew(clazz.asType()).end()); | 134 builder.declaration(clazz.asType(), "newCast", builder.create().startNew(clazz.asType()).end()); |
136 | 135 |
137 for (TypeData sourceType : sourceTypes) { | 136 for (TypeMirror sourceType : sourceTypes) { |
138 String seenField = seenFieldName(sourceType); | 137 String seenField = seenFieldName(sourceType); |
139 builder.startStatement(); | 138 builder.startStatement(); |
140 builder.string("newCast.").string(seenField).string(" = ").tree(TypeSystemCodeGenerator.check(sourceType, "value")); | 139 builder.string("newCast.").string(seenField).string(" = ").tree(TypeSystemCodeGenerator.check(typeSystem, sourceType, "value")); |
141 builder.end(); | 140 builder.end(); |
142 } | 141 } |
143 builder.startReturn().string("newCast").end(); | 142 builder.startReturn().string("newCast").end(); |
144 return method; | 143 return method; |
145 } | 144 } |
148 String methodName = "merge"; | 147 String methodName = "merge"; |
149 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), context.getType(void.class), methodName); | 148 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), context.getType(void.class), methodName); |
150 method.addParameter(new CodeVariableElement(clazz.asType(), "otherCast")); | 149 method.addParameter(new CodeVariableElement(clazz.asType(), "otherCast")); |
151 CodeTreeBuilder builder = method.createBuilder(); | 150 CodeTreeBuilder builder = method.createBuilder(); |
152 | 151 |
153 for (TypeData sourceType : sourceTypes) { | 152 for (TypeMirror sourceType : sourceTypes) { |
154 String seenField = seenFieldName(sourceType); | 153 String seenField = seenFieldName(sourceType); |
155 builder.startStatement(); | 154 builder.startStatement(); |
156 builder.string("this.").string(seenField).string(" |= ").string("otherCast.").string(seenField); | 155 builder.string("this.").string(seenField).string(" |= ").string("otherCast.").string(seenField); |
157 builder.end(); | 156 builder.end(); |
158 } | 157 } |
160 } | 159 } |
161 | 160 |
162 private Element createCheck() { | 161 private Element createCheck() { |
163 String methodName = "check"; | 162 String methodName = "check"; |
164 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), context.getType(boolean.class), methodName); | 163 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), context.getType(boolean.class), methodName); |
165 method.addParameter(new CodeVariableElement(typeSystem.getGenericType(), "value")); | 164 method.addParameter(new CodeVariableElement(context.getType(Object.class), "value")); |
166 CodeTreeBuilder builder = method.createBuilder(); | 165 CodeTreeBuilder builder = method.createBuilder(); |
167 | 166 |
168 boolean elseIf = false; | 167 boolean elseIf = false; |
169 for (TypeData sourceType : sourceTypes) { | 168 for (TypeMirror sourceType : sourceTypes) { |
170 elseIf = builder.startIf(elseIf); | 169 elseIf = builder.startIf(elseIf); |
171 builder.string(seenFieldName(sourceType)).string(" && ").tree(TypeSystemCodeGenerator.check(sourceType, "value")); | 170 builder.string(seenFieldName(sourceType)).string(" && ").tree(TypeSystemCodeGenerator.check(typeSystem, sourceType, "value")); |
172 builder.end(); | 171 builder.end(); |
173 builder.startBlock().returnTrue().end(); | 172 builder.startBlock().returnTrue().end(); |
174 } | 173 } |
175 builder.returnFalse(); | 174 builder.returnFalse(); |
176 return method; | 175 return method; |
177 } | 176 } |
178 | 177 |
179 private Element createCast(boolean expect) { | 178 private Element createCast(boolean expect) { |
180 String methodName = expect ? "expect" : "cast"; | 179 String methodName = expect ? "expect" : "cast"; |
181 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), forType.getPrimitiveType(), methodName); | 180 CodeExecutableElement method = new CodeExecutableElement(modifiers(PUBLIC), forType, methodName); |
182 method.addParameter(new CodeVariableElement(typeSystem.getGenericType(), "value")); | 181 method.addParameter(new CodeVariableElement(context.getType(Object.class), "value")); |
183 if (expect) { | 182 if (expect) { |
184 method.getThrownTypes().add(context.getType(UnexpectedResultException.class)); | 183 method.getThrownTypes().add(context.getType(UnexpectedResultException.class)); |
185 } | 184 } |
186 | 185 |
187 CodeTreeBuilder builder = method.createBuilder(); | 186 CodeTreeBuilder builder = method.createBuilder(); |
188 | 187 |
189 boolean elseIf = false; | 188 boolean elseIf = false; |
190 for (TypeData sourceType : sourceTypes) { | 189 for (TypeMirror sourceType : sourceTypes) { |
191 elseIf = builder.startIf(elseIf); | 190 elseIf = builder.startIf(elseIf); |
192 builder.string(seenFieldName(sourceType)).string(" && ").tree(TypeSystemCodeGenerator.check(sourceType, "value")); | 191 builder.string(seenFieldName(sourceType)).string(" && ").tree(TypeSystemCodeGenerator.check(typeSystem, sourceType, "value")); |
193 builder.end(); | 192 builder.end(); |
194 builder.startBlock(); | 193 builder.startBlock(); |
195 builder.startReturn(); | 194 builder.startReturn(); |
196 CodeTree castTree = TypeSystemCodeGenerator.cast(sourceType, "value"); | 195 CodeTree castTree = TypeSystemCodeGenerator.cast(typeSystem, sourceType, "value"); |
197 ImplicitCastData cast = typeSystem.lookupCast(sourceType, forType); | 196 ImplicitCastData cast = typeSystem.lookupCast(sourceType, forType); |
198 if (cast != null) { | 197 if (cast != null) { |
199 builder.tree(TypeSystemCodeGenerator.invokeImplicitCast(cast, castTree)); | 198 builder.tree(TypeSystemCodeGenerator.invokeImplicitCast(typeSystem, cast, castTree)); |
200 } else { | 199 } else { |
201 builder.tree(castTree); | 200 builder.tree(castTree); |
202 } | 201 } |
203 builder.end(); | 202 builder.end(); |
204 builder.end(); | 203 builder.end(); |