changeset 16744:3507ad1b0c44

Clone value arrays in CompositeValue.clone().
author Josef Eisl <josef.eisl@jku.at>
date Mon, 11 Aug 2014 14:29:56 +0200
parents 3bfeb592ed76
children ef3c7944261b b60c111b43f9
files graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValue.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValueClass.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRIntrospection.java
diffstat 3 files changed, 19 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValue.java	Mon Aug 11 13:58:08 2014 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValue.java	Mon Aug 11 14:29:56 2014 +0200
@@ -89,11 +89,17 @@
 
     @Override
     public final CompositeValue clone() {
+        CompositeValue compositeValue = null;
         try {
-            return (CompositeValue) super.clone();
+            compositeValue = (CompositeValue) super.clone();
         } catch (CloneNotSupportedException e) {
             throw new GraalInternalError(e);
         }
+
+        // copy value arrays
+        getValueClass().copyValueArrays(compositeValue);
+
+        return compositeValue;
     }
 
 }
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValueClass.java	Mon Aug 11 13:58:08 2014 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/CompositeValueClass.java	Mon Aug 11 14:29:56 2014 +0200
@@ -172,4 +172,12 @@
     EnumSet<OperandFlag> getFlags(ValuePosition pos) {
         return componentFlags[pos.getIndex()];
     }
+
+    void copyValueArrays(CompositeValue compositeValue) {
+        for (int i = directComponentCount; i < componentOffsets.length; i++) {
+            Value[] valueArray = getValueArray(compositeValue, componentOffsets[i]);
+            Value[] newValueArray = Arrays.copyOf(valueArray, valueArray.length);
+            setValueArray(compositeValue, componentOffsets[i], newValueArray);
+        }
+    }
 }
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRIntrospection.java	Mon Aug 11 13:58:08 2014 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIRIntrospection.java	Mon Aug 11 14:29:56 2014 +0200
@@ -260,6 +260,10 @@
         return (Value[]) unsafe.getObject(obj, offset);
     }
 
+    protected static void setValueArray(Object obj, long offset, Value[] valueArray) {
+        unsafe.putObject(obj, offset, valueArray);
+    }
+
     protected void appendValues(StringBuilder result, Object obj, String start, String end, String startMultiple, String endMultiple, String[] prefix, long[]... moffsets) {
         int total = 0;
         for (long[] offsets : moffsets) {