comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java @ 19293:21b9b9941775

Truffle-DSL: initialize caches late if possible; fix assumption arrays need a @CompilationFinal to be checked.
author Christian Humer <christian.humer@gmail.com>
date Wed, 11 Feb 2015 12:13:44 +0100
parents f4792a544170
children b31b2f289e7d
comparison
equal deleted inserted replaced
19292:906367e494ca 19293:21b9b9941775
1035 1035
1036 if (node.isFrameUsedByAnyGuard()) { 1036 if (node.isFrameUsedByAnyGuard()) {
1037 builder.tree(createTransferToInterpreterAndInvalidate()); 1037 builder.tree(createTransferToInterpreterAndInvalidate());
1038 } 1038 }
1039 1039
1040 // caches unbound to guards are invoked after all guards
1041 for (CacheExpression cache : specialization.getCaches()) {
1042 if (!specialization.isCacheBoundByGuard(cache)) {
1043 initializeCache(builder, specialization, cache, currentValues);
1044 }
1045 }
1040 boolean hasAssumptions = !specialization.getAssumptionExpressions().isEmpty(); 1046 boolean hasAssumptions = !specialization.getAssumptionExpressions().isEmpty();
1041 if (hasAssumptions) { 1047 if (hasAssumptions) {
1048
1042 for (AssumptionExpression assumption : specialization.getAssumptionExpressions()) { 1049 for (AssumptionExpression assumption : specialization.getAssumptionExpressions()) {
1043 CodeTree assumptions = DSLExpressionGenerator.write(assumption.getExpression(), accessParent(null), 1050 CodeTree assumptions = DSLExpressionGenerator.write(assumption.getExpression(), accessParent(null),
1044 castBoundTypes(bindExpressionValues(assumption.getExpression(), specialization, currentValues))); 1051 castBoundTypes(bindExpressionValues(assumption.getExpression(), specialization, currentValues)));
1045 String name = assumptionName(assumption); 1052 String name = assumptionName(assumption);
1046 // needs specialization index for assumption to make unique 1053 // needs specialization index for assumption to make unique
1325 } 1332 }
1326 1333
1327 for (AssumptionExpression assumption : specialization.getAssumptionExpressions()) { 1334 for (AssumptionExpression assumption : specialization.getAssumptionExpressions()) {
1328 String name = assumptionName(assumption); 1335 String name = assumptionName(assumption);
1329 TypeMirror type = assumption.getExpression().getResolvedType(); 1336 TypeMirror type = assumption.getExpression().getResolvedType();
1330 clazz.add(new CodeVariableElement(modifiers(PRIVATE, FINAL), type, name)); 1337 CodeVariableElement field = clazz.add(new CodeVariableElement(modifiers(PRIVATE, FINAL), type, name));
1338 field.addAnnotationMirror(new CodeAnnotationMirror(context.getDeclaredType(CompilationFinal.class)));
1331 constructor.addParameter(new CodeVariableElement(type, name)); 1339 constructor.addParameter(new CodeVariableElement(type, name));
1332 builder.startStatement().string("this.").string(name).string(" = ").string(name).end(); 1340 builder.startStatement().string("this.").string(name).string(" = ").string(name).end();
1333 } 1341 }
1334 } 1342 }
1335 1343
2227 checksBuilder.tree(checkBuilder.build()); 2235 checksBuilder.tree(checkBuilder.build());
2228 } 2236 }
2229 2237
2230 if (specialization != null && !specializationExecution.isFastPath()) { 2238 if (specialization != null && !specializationExecution.isFastPath()) {
2231 for (CacheExpression cache : specialization.getCaches()) { 2239 for (CacheExpression cache : specialization.getCaches()) {
2232 CodeTree initializer = DSLExpressionGenerator.write(cache.getExpression(), accessParent(null), 2240 if (specialization.isCacheBoundByGuard(cache)) {
2233 castBoundTypes(bindExpressionValues(cache.getExpression(), specialization, currentValues))); 2241 initializeCache(localsBuilder, specialization, cache, currentValues);
2234 String name = cache.getParameter().getLocalName(); 2242 }
2235 // multiple specializations might use the same name
2236 String varName = name + specialization.getIndex();
2237 TypeMirror type = cache.getParameter().getType();
2238 localsBuilder.declaration(type, varName, initializer);
2239 currentValues.set(name, new LocalVariable(null, type, varName, null));
2240 } 2243 }
2241 } 2244 }
2242 2245
2243 return new CodeTree[]{checksBuilder.build(), localsBuilder.build()}; 2246 return new CodeTree[]{checksBuilder.build(), localsBuilder.build()};
2247 }
2248
2249 private void initializeCache(CodeTreeBuilder builder, SpecializationData specialization, CacheExpression cache, LocalContext currentValues) {
2250 CodeTree initializer = DSLExpressionGenerator.write(cache.getExpression(), accessParent(null), castBoundTypes(bindExpressionValues(cache.getExpression(), specialization, currentValues)));
2251 String name = cache.getParameter().getLocalName();
2252 // multiple specializations might use the same name
2253 String varName = name + specialization.getIndex();
2254 TypeMirror type = cache.getParameter().getType();
2255 builder.declaration(type, varName, initializer);
2256 currentValues.set(name, new LocalVariable(null, type, varName, null));
2244 } 2257 }
2245 2258
2246 public static final class LocalContext { 2259 public static final class LocalContext {
2247 2260
2248 private final NodeGenFactory factory; 2261 private final NodeGenFactory factory;