Mercurial > hg > truffle
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; |