diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java @ 11185:5daaa0821406

Truffle-DSL: Changed executeAndSpecialize to use an int as minimumState instead of a class.
author Christian Humer <christian.humer@gmail.com>
date Tue, 30 Jul 2013 16:11:08 +0200
parents a9cb98ff8fd9
children 4a9936bb03a4
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java	Mon Jul 29 19:20:33 2013 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java	Tue Jul 30 16:11:08 2013 +0200
@@ -1439,7 +1439,7 @@
 
             TypeMirror genericReturnType = node.getGenericSpecialization().getReturnType().getType();
             CodeExecutableElement method = new CodeExecutableElement(modifiers(PROTECTED), genericReturnType, EXECUTE_SPECIALIZE_NAME);
-            method.addParameter(new CodeVariableElement(getContext().getType(Class.class), "minimumState"));
+            method.addParameter(new CodeVariableElement(getContext().getType(int.class), "minimumState"));
             addInternalValueParameters(method, node.getGenericSpecialization(), true, false);
             method.addParameter(new CodeVariableElement(getContext().getType(String.class), "reason"));
 
@@ -1453,8 +1453,6 @@
 
             builder.defaultDeclaration(getContext().getType(Class.class), "resultClass");
 
-            builder.startStatement().string("boolean allowed = (minimumState == ").string(nodeSpecializationClassName(node.getSpecializations().get(0))).string(".class)").end();
-
             builder.startStatement().string("String message = ").startCall("createInfo0").string("reason");
             addInternalValueParameterNames(builder, node.getGenericSpecialization(), node.getGenericSpecialization(), null, false, true);
             builder.end().end();
@@ -1473,10 +1471,6 @@
                 if (current.isReachable()) {
                     CodeTree execute = createGenericInvokeAndSpecialize(builder, node.getGenericSpecialization(), current);
 
-                    if (!current.isGeneric()) {
-                        builder.startStatement().string("allowed = allowed || (minimumState == ").string(nodeSpecializationClassName(current)).string(".class)").end();
-                    }
-
                     builder.tree(createGuardAndCast(builder, prefix, current.getNode().getGenericSpecialization(), current, true, execute, null, true, false));
                 } else {
                     if (firstUnreachable) {
@@ -1559,7 +1553,9 @@
 
             boolean ifAllowed = current.hasRewrite(getContext());
             if (ifAllowed) {
-                builder.startIf().string("allowed").end().startBlock();
+                builder.startIf();
+                builder.string("minimumState < ").string(String.valueOf(node.getSpecializations().indexOf(current)));
+                builder.end().startBlock();
             }
 
             if (!current.isGeneric() || !node.isPolymorphic()) {
@@ -1571,13 +1567,13 @@
                     builder.startIf().string("resultClass == ").string(nodeSpecializationClassName(node.getGenericSpecialization())).string(".class").end();
                     builder.startBlock();
 
-                    boolean maybePolymorphic = node.getPolymorphicDepth() > 1;
-                    if (maybePolymorphic) {
+                    if (node.isPolymorphic()) {
                         builder.startIf().string("next0 == null").end();
                         builder.startBlock();
                     }
                     builder.tree(createRewriteGeneric(builder, current));
-                    if (maybePolymorphic) {
+
+                    if (node.isPolymorphic()) {
                         builder.end().startElseBlock();
                         builder.statement("Node searchNode = super.getParent()");
                         builder.startWhile().string("searchNode != null").end();
@@ -2037,10 +2033,11 @@
         }
 
         protected CodeTree createReturnExecuteAndSpecialize(CodeTreeBuilder parent, ExecutableTypeData executable, SpecializationData nextSpecialization, ActualParameter exceptionParam, String reason) {
-            SpecializationData generic = getModel().getNode().getGenericSpecialization();
+            NodeData node = getModel().getNode();
+            SpecializationData generic = node.getGenericSpecialization();
             CodeTreeBuilder specializeCall = new CodeTreeBuilder(parent);
             specializeCall.startCall(EXECUTE_SPECIALIZE_NAME);
-            specializeCall.string(nodeSpecializationClassName(nextSpecialization) + ".class");
+            specializeCall.string(String.valueOf(node.getSpecializations().indexOf(nextSpecialization)));
             addInternalValueParameterNames(specializeCall, generic, nextSpecialization.getNode().getGenericSpecialization(), exceptionParam != null ? exceptionParam.getLocalName() : null, true, true);
             specializeCall.doubleQuote(reason);
             specializeCall.end().end();
@@ -2321,7 +2318,7 @@
 
             CodeTreeBuilder specializeCall = new CodeTreeBuilder(builder);
             specializeCall.startCall(EXECUTE_SPECIALIZE_NAME);
-            specializeCall.string(nodeSpecializationClassName(node.getUninitializedSpecialization()) + ".class");
+            specializeCall.string("0");
             addInternalValueParameterNames(specializeCall, specialization, node.getGenericSpecialization(), null, true, true);
             specializeCall.startGroup().doubleQuote("Uninitialized polymorphic (").string(" + depth + ").doubleQuote("/" + node.getPolymorphicDepth() + ")").end();
             specializeCall.end().end();
@@ -2469,7 +2466,7 @@
                 returnBuilder.end();
             } else if (specialization.isUninitialized()) {
                 returnBuilder.startCall("super", EXECUTE_SPECIALIZE_NAME);
-                returnBuilder.startGroup().string(nodeSpecializationClassName(specialization)).string(".class").end();
+                returnBuilder.string("0");
                 addInternalValueParameterNames(returnBuilder, specialization, specialization, null, true, true);
                 returnBuilder.doubleQuote("Uninitialized monomorphic");
                 returnBuilder.end();