diff graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java @ 6399:6ad5bf2efb5e

cleanups, merge EscapeRecord and VirtualObjectNode
author Lukas Stadler <lukas.stadler@jku.at>
date Fri, 14 Sep 2012 15:26:57 +0200
parents adf0879a41c1
children b3f5dc099f9d
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java	Fri Sep 14 15:16:50 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java	Fri Sep 14 15:26:57 2012 +0200
@@ -29,7 +29,6 @@
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
-import com.oracle.graal.nodes.util.*;
 import com.oracle.graal.nodes.virtual.*;
 
 /**
@@ -43,6 +42,7 @@
 
     /**
      * Constructs a NewInstanceNode.
+     *
      * @param type the class being allocated
      */
     public NewInstanceNode(ResolvedJavaType type, boolean fillContents) {
@@ -53,6 +53,7 @@
 
     /**
      * Gets the instance class being allocated by this node.
+     *
      * @return the instance class allocated
      */
     public ResolvedJavaType instanceClass() {
@@ -73,76 +74,39 @@
         gen.visitNewInstance(this);
     }
 
-    @Override
-    public EscapeOp getEscapeOp() {
-        return instanceClass == null ? null : new EscapeOpImpl();
-    }
-
-    private final class EscapeOpImpl extends EscapeOp {
-
-        @Override
-        public ResolvedJavaType type() {
-            return instanceClass();
-        }
-
-        private void fillEscapeFields(ResolvedJavaType type, List<EscapeField> escapeFields) {
-            if (type != null) {
-                fillEscapeFields(type.superType(), escapeFields);
-                JavaField[] declaredFields = type.declaredFields();
-                assert declaredFields != null : "the runtime must specify the declared fields of that type";
-                for (JavaField field : declaredFields) {
-                    escapeFields.add(new EscapeField(field.name(), field, field.type()));
-                }
+    private void fillEscapeFields(ResolvedJavaType type, List<ResolvedJavaField> escapeFields) {
+        if (type != null) {
+            fillEscapeFields(type.superType(), escapeFields);
+            for (ResolvedJavaField field : type.declaredFields()) {
+                escapeFields.add(field);
             }
         }
-
-        @Override
-        public EscapeField[] fields() {
-            assert !instanceClass().isArrayClass();
-            List<EscapeField> escapeFields = new ArrayList<>();
-            fillEscapeFields(instanceClass(), escapeFields);
-            return escapeFields.toArray(new EscapeField[escapeFields.size()]);
-        }
+    }
 
-        @Override
-        public ValueNode[] fieldState() {
-            EscapeField[] fields = fields();
-            ValueNode[] state = new ValueNode[fields.length];
-            for (int i = 0; i < state.length; i++) {
-                state[i] = ConstantNode.defaultForKind(fields[i].type().kind(), graph());
-            }
-            return state;
-        }
+    @Override
+    public EscapeOp getEscapeOp() {
+        if (instanceClass != null) {
+            assert !instanceClass().isArrayClass();
+            List<ResolvedJavaField> escapeFields = new ArrayList<>();
+            fillEscapeFields(instanceClass(), escapeFields);
+            final ResolvedJavaField[] fields = escapeFields.toArray(new ResolvedJavaField[escapeFields.size()]);
+            return new EscapeOp() {
 
-        @Override
-        public void beforeUpdate(Node usage) {
-            if (usage instanceof RegisterFinalizerNode) {
-                RegisterFinalizerNode x = (RegisterFinalizerNode) usage;
-                ((StructuredGraph) x.graph()).removeFixed(x);
-            } else {
-                super.beforeUpdate(NewInstanceNode.this, usage);
-            }
-        }
+                @Override
+                public ValueNode[] fieldState() {
+                    ValueNode[] state = new ValueNode[fields.length];
+                    for (int i = 0; i < state.length; i++) {
+                        state[i] = ConstantNode.defaultForKind(fields[i].type().kind(), graph());
+                    }
+                    return state;
+                }
 
-        @Override
-        public int updateState(VirtualObjectNode node, Node current, Map<Object, Integer> fieldIndex, ValueNode[] fieldState) {
-            if (current instanceof AccessFieldNode) {
-                AccessFieldNode x = (AccessFieldNode) current;
-                if (GraphUtil.unProxify(x.object()) == node) {
-                    int field = fieldIndex.get(x.field());
-                    StructuredGraph graph = (StructuredGraph) x.graph();
-                    if (current instanceof LoadFieldNode) {
-                        assert fieldState[field] != null : field + ", " + x.field();
-                        x.replaceAtUsages(fieldState[field]);
-                        graph.removeFixed(x);
-                    } else if (current instanceof StoreFieldNode) {
-                        fieldState[field] = ((StoreFieldNode) x).value();
-                        graph.removeFixed(x);
-                        return field;
-                    }
+                @Override
+                public VirtualObjectNode virtualObject(int virtualId) {
+                    return new VirtualInstanceNode(virtualId, instanceClass(), fields);
                 }
-            }
-            return -1;
+            };
         }
+        return null;
     }
 }