changeset 19704:e9e99d8dca54

Truffle-DSL: fixed possible wrong variable accesses when calling node constructors.
author Christian Humer <christian.humer@gmail.com>
date Mon, 09 Mar 2015 00:41:42 +0100
parents 48eeda5dfdbf
children 2f5d4df2af90
files graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java
diffstat 1 files changed, 35 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- 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() {