# HG changeset patch # User Christian Humer # Date 1425858102 -3600 # Node ID e9e99d8dca54e474c8c2756975475032e9c78f7c # Parent 48eeda5dfdbf0337e0eb02abdf656f0293138735 Truffle-DSL: fixed possible wrong variable accesses when calling node constructors. diff -r 48eeda5dfdbf -r e9e99d8dca54 graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java Fri Mar 06 18:51:31 2015 +0100 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java Mon Mar 09 00:41:42 2015 +0100 @@ -1078,7 +1078,7 @@ String varName = name + specialization.getIndex(); TypeMirror type = assumption.getExpression().getResolvedType(); builder.declaration(type, varName, assumptions); - currentValues.set(name, new LocalVariable(null, type, varName, null)); + currentValues.set(name, new LocalVariable(null, type, varName, null, null)); } builder.startIf(); @@ -1244,8 +1244,11 @@ for (Parameter p : specialization.getSignatureParameters()) { CodeVariableElement var = createImplicitProfileParameter(p.getSpecification().getExecution(), p.getTypeSystemType()); if (var != null) { - // we need the original name here - builder.tree(LocalVariable.fromParameter(p).createReference()); + LocalVariable variable = currentValues.get(p.getLocalName()); + if (variable == null) { + throw new AssertionError("Could not bind cached value " + p.getLocalName() + ": " + currentValues); + } + builder.tree(variable.original().createReference()); } } for (CacheExpression cache : specialization.getCaches()) { @@ -2282,7 +2285,7 @@ String varName = name + specialization.getIndex(); TypeMirror type = cache.getParameter().getType(); builder.declaration(type, varName, initializer); - currentValues.set(name, new LocalVariable(null, type, varName, null)); + currentValues.set(name, new LocalVariable(null, type, varName, null, null)); } public static final class LocalContext { @@ -2298,13 +2301,13 @@ for (CacheExpression cache : specialization.getCaches()) { Parameter cacheParameter = cache.getParameter(); String name = cacheParameter.getVariableElement().getSimpleName().toString(); - set(cacheParameter.getLocalName(), new LocalVariable(cacheParameter.getTypeSystemType(), cacheParameter.getType(), name, CodeTreeBuilder.singleString("this." + name))); + set(cacheParameter.getLocalName(), new LocalVariable(cacheParameter.getTypeSystemType(), cacheParameter.getType(), name, CodeTreeBuilder.singleString("this." + name), null)); } for (AssumptionExpression assumption : specialization.getAssumptionExpressions()) { String name = assumptionName(assumption); TypeMirror type = assumption.getExpression().getResolvedType(); - set(name, new LocalVariable(null, type, name, CodeTreeBuilder.singleString("this." + name))); + set(name, new LocalVariable(null, type, name, CodeTreeBuilder.singleString("this." + name), null)); } } @@ -2336,11 +2339,11 @@ @SuppressWarnings("static-method") public LocalVariable createValue(NodeExecutionData execution, TypeData type) { - return new LocalVariable(type, type.getPrimitiveType(), valueName(execution), null); + return new LocalVariable(type, type.getPrimitiveType(), valueName(execution), null, null); } public LocalVariable createShortCircuitValue(NodeExecutionData execution) { - return new LocalVariable(factory.typeSystem.getBooleanType(), factory.getType(boolean.class), shortCircuitName(execution), null); + return new LocalVariable(factory.typeSystem.getBooleanType(), factory.getType(boolean.class), shortCircuitName(execution), null, null); } private static String valueName(NodeExecutionData execution) { @@ -2411,11 +2414,11 @@ } private void loadValues(int evaluatedArguments, int varargsThreshold) { - values.put(FRAME_VALUE, new LocalVariable(null, factory.getType(Frame.class), FRAME_VALUE, null)); + values.put(FRAME_VALUE, new LocalVariable(null, factory.getType(Frame.class), FRAME_VALUE, null, null)); for (NodeFieldData field : factory.node.getFields()) { String fieldName = fieldValueName(field); - values.put(fieldName, new LocalVariable(null, field.getType(), fieldName, factory.accessParent(field.getName()))); + values.put(fieldName, new LocalVariable(null, field.getType(), fieldName, factory.accessParent(field.getName()), null)); } boolean varargs = needsVarargs(false, varargsThreshold); @@ -2430,13 +2433,13 @@ if (varargs) { shortCircuit = shortCircuit.accessWith(createReadVarargs(i)); } - values.put(shortCircuit.getName(), shortCircuit); + values.put(shortCircuit.getName(), shortCircuit.makeOriginal()); } LocalVariable value = createValue(execution, factory.genericType); if (varargs) { value = value.accessWith(createReadVarargs(i)); } - values.put(value.getName(), value); + values.put(value.getName(), value.makeOriginal()); } } @@ -2519,6 +2522,7 @@ private final TypeMirror typeMirror; private final CodeTree accessorTree; private final String name; + private final LocalVariable previous; public static LocalVariable fromParameter(Parameter parameter) { NodeExecutionData execution = parameter.getSpecification().getExecution(); @@ -2528,15 +2532,16 @@ } else { name = createName(execution); } - return new LocalVariable(parameter.getTypeSystemType(), parameter.getType(), name, null); + return new LocalVariable(parameter.getTypeSystemType(), parameter.getType(), name, null, null); } - private LocalVariable(TypeData type, TypeMirror typeMirror, String name, CodeTree accessorTree) { + private LocalVariable(TypeData type, TypeMirror typeMirror, String name, CodeTree accessorTree, LocalVariable previous) { Objects.requireNonNull(typeMirror); this.typeMirror = typeMirror; this.accessorTree = accessorTree; this.type = type; this.name = name; + this.previous = previous; } public TypeData getType() { @@ -2583,19 +2588,31 @@ } public LocalVariable newType(TypeData newType) { - return new LocalVariable(newType, newType.getPrimitiveType(), name, accessorTree); + return new LocalVariable(newType, newType.getPrimitiveType(), name, accessorTree, this); } public LocalVariable newType(TypeMirror newType) { - return new LocalVariable(type, newType, name, accessorTree); + return new LocalVariable(type, newType, name, accessorTree, this); } public LocalVariable accessWith(CodeTree tree) { - return new LocalVariable(type, typeMirror, name, tree); + return new LocalVariable(type, typeMirror, name, tree, this); } public LocalVariable nextName() { - return new LocalVariable(type, typeMirror, createNextName(name), accessorTree); + return new LocalVariable(type, typeMirror, createNextName(name), accessorTree, this); + } + + public LocalVariable makeOriginal() { + return new LocalVariable(type, typeMirror, name, accessorTree, null); + } + + public LocalVariable original() { + LocalVariable variable = this; + while (variable.previous != null) { + variable = variable.previous; + } + return variable; } public LocalVariable makeGeneric() {