changeset 7765:f20c2b1f5289

fix for Object.clone virtualization
author Lukas Stadler <lukas.stadler@jku.at>
date Mon, 11 Feb 2013 10:44:40 +0100
parents cff55cdeea48
children e393b8156c42
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/ObjectCloneNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/BoxedVirtualObjectNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualArrayNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualInstanceNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java
diffstat 5 files changed, 26 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/ObjectCloneNode.java	Fri Feb 08 11:14:15 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/ObjectCloneNode.java	Mon Feb 11 10:44:40 2013 +0100
@@ -107,7 +107,7 @@
                 for (int i = 0; i < newEntryState.length; i++) {
                     newEntryState[i] = originalState.getEntry(i);
                 }
-                VirtualObjectNode newVirtual = (VirtualObjectNode) originalVirtual.copyWithInputs();
+                VirtualObjectNode newVirtual = originalVirtual.duplicate();
                 tool.createVirtualObject(newVirtual, newEntryState, 0);
                 tool.replaceWithVirtual(newVirtual);
             }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/BoxedVirtualObjectNode.java	Fri Feb 08 11:14:15 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/BoxedVirtualObjectNode.java	Mon Feb 11 10:44:40 2013 +0100
@@ -70,4 +70,9 @@
     public Kind entryKind(int index) {
         return kind;
     }
+
+    @Override
+    public BoxedVirtualObjectNode duplicate() {
+        return new BoxedVirtualObjectNode(type, kind, unboxedValue);
+    }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualArrayNode.java	Fri Feb 08 11:14:15 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualArrayNode.java	Mon Feb 11 10:44:40 2013 +0100
@@ -132,4 +132,9 @@
         assert index >= 0 && index < length;
         return componentType.getKind();
     }
+
+    @Override
+    public VirtualArrayNode duplicate() {
+        return new VirtualArrayNode(componentType, length);
+    }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualInstanceNode.java	Fri Feb 08 11:14:15 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualInstanceNode.java	Mon Feb 11 10:44:40 2013 +0100
@@ -32,16 +32,23 @@
 
     private final ResolvedJavaType type;
     private final ResolvedJavaField[] fields;
-    private final HashMap<ResolvedJavaField, Integer> fieldMap = new HashMap<>();
+    private final HashMap<ResolvedJavaField, Integer> fieldMap;
 
     public VirtualInstanceNode(ResolvedJavaType type, ResolvedJavaField[] fields) {
         this.type = type;
         this.fields = fields;
+        fieldMap = new HashMap<>();
         for (int i = 0; i < fields.length; i++) {
             fieldMap.put(fields[i], i);
         }
     }
 
+    private VirtualInstanceNode(ResolvedJavaType type, ResolvedJavaField[] fields, HashMap<ResolvedJavaField, Integer> fieldMap) {
+        this.type = type;
+        this.fields = fields;
+        this.fieldMap = fieldMap;
+    }
+
     @Override
     public ResolvedJavaType type() {
         return type;
@@ -85,4 +92,9 @@
         assert index >= 0 && index < fields.length;
         return fields[index].getKind();
     }
+
+    @Override
+    public VirtualInstanceNode duplicate() {
+        return new VirtualInstanceNode(type, fields, fieldMap);
+    }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java	Fri Feb 08 11:14:15 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java	Mon Feb 11 10:44:40 2013 +0100
@@ -53,4 +53,6 @@
     public abstract int entryIndexForOffset(long constantOffset);
 
     public abstract Kind entryKind(int index);
+
+    public abstract VirtualObjectNode duplicate();
 }