changeset 18795:e9cbe1618733

Truffle: refactor size calculation in location allocator to visitor pattern
author Andreas Woess <andreas.woess@jku.at>
date Wed, 07 Jan 2015 15:11:38 +0100
parents e688e42b41e3
children c4fcd94dad19
files graal/com.oracle.truffle.object.basic/src/com/oracle/truffle/object/basic/BasicLocations.java graal/com.oracle.truffle.object/src/com/oracle/truffle/object/LocationImpl.java graal/com.oracle.truffle.object/src/com/oracle/truffle/object/Locations.java graal/com.oracle.truffle.object/src/com/oracle/truffle/object/ShapeImpl.java
diffstat 4 files changed, 101 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.object.basic/src/com/oracle/truffle/object/basic/BasicLocations.java	Mon Jan 05 19:01:01 2015 +0100
+++ b/graal/com.oracle.truffle.object.basic/src/com/oracle/truffle/object/basic/BasicLocations.java	Wed Jan 07 15:11:38 2015 +0100
@@ -164,6 +164,11 @@
         public int objectArrayCount() {
             return OBJECT_SIZE;
         }
+
+        @Override
+        public final void accept(LocationVisitor locationVisitor) {
+            locationVisitor.visitObjectArray(index, OBJECT_SIZE);
+        }
     }
 
     public static class ObjectFieldLocation extends MethodHandleFieldLocation implements ObjectLocation {
@@ -209,6 +214,11 @@
         public int objectFieldCount() {
             return OBJECT_SIZE;
         }
+
+        @Override
+        public final void accept(LocationVisitor locationVisitor) {
+            locationVisitor.visitObjectField(getIndex(), OBJECT_SIZE);
+        }
     }
 
     public abstract static class SimpleObjectFieldLocation extends FieldLocation implements ObjectLocation {
@@ -240,6 +250,11 @@
         public int objectFieldCount() {
             return OBJECT_SIZE;
         }
+
+        @Override
+        public final void accept(LocationVisitor locationVisitor) {
+            locationVisitor.visitObjectField(getIndex(), OBJECT_SIZE);
+        }
     }
 
     public static class LongArrayLocation extends ArrayLocation implements InternalLongLocation {
@@ -302,7 +317,7 @@
             return value instanceof Long || (allowInt && value instanceof Integer);
         }
 
-        public Class<Long> getType() {
+        public final Class<Long> getType() {
             return long.class;
         }
 
@@ -310,6 +325,11 @@
         public int primitiveArrayCount() {
             return LONG_SIZE;
         }
+
+        @Override
+        public final void accept(LocationVisitor locationVisitor) {
+            locationVisitor.visitPrimitiveArray(getIndex(), LONG_SIZE);
+        }
     }
 
     public static class LongFieldLocation extends MethodHandleFieldLocation implements InternalLongLocation {
@@ -385,9 +405,14 @@
             return LONG_SIZE;
         }
 
-        public Class<Long> getType() {
+        public final Class<Long> getType() {
             return long.class;
         }
+
+        @Override
+        public final void accept(LocationVisitor locationVisitor) {
+            locationVisitor.visitPrimitiveField(getIndex(), LONG_SIZE);
+        }
     }
 
     public static class LongLocationDecorator extends PrimitiveLocationDecorator implements InternalLongLocation {
@@ -480,9 +505,14 @@
             return LONG_SIZE;
         }
 
-        public Class<Long> getType() {
+        public final Class<Long> getType() {
             return long.class;
         }
+
+        @Override
+        public final void accept(LocationVisitor locationVisitor) {
+            locationVisitor.visitPrimitiveField(getIndex(), LONG_SIZE);
+        }
     }
 
     public abstract static class PrimitiveLocationDecorator extends LocationImpl {
@@ -521,6 +551,11 @@
         public final int primitiveArrayCount() {
             return ((LocationImpl) longLocation).primitiveArrayCount();
         }
+
+        @Override
+        public final void accept(LocationVisitor locationVisitor) {
+            ((LocationImpl) longLocation).accept(locationVisitor);
+        }
     }
 
     public static class IntLocationDecorator extends PrimitiveLocationDecorator implements IntLocation {
--- a/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/LocationImpl.java	Mon Jan 05 19:01:01 2015 +0100
+++ b/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/LocationImpl.java	Wed Jan 07 15:11:38 2015 +0100
@@ -25,6 +25,29 @@
 import com.oracle.truffle.api.object.*;
 
 public abstract class LocationImpl extends Location {
+
+    public interface EffectivelyFinalLocation<T extends Location> {
+        T toNonFinalLocation();
+    }
+
+    public interface TypedObjectLocation<T extends Location & ObjectLocation> extends ObjectLocation {
+        T toUntypedLocation();
+    }
+
+    public interface InternalLongLocation extends LongLocation {
+        void setLongInternal(DynamicObject store, long value);
+    }
+
+    public interface LocationVisitor {
+        void visitObjectField(int index, int count);
+
+        void visitObjectArray(int index, int count);
+
+        void visitPrimitiveField(int index, int count);
+
+        void visitPrimitiveArray(int index, int count);
+    }
+
     @Override
     public void set(DynamicObject store, Object value, Shape shape) throws IncompatibleLocationException, FinalLocationException {
         setInternal(store, value);
@@ -53,18 +76,6 @@
         return true;
     }
 
-    public interface EffectivelyFinalLocation<T extends Location> {
-        T toNonFinalLocation();
-    }
-
-    public interface TypedObjectLocation<T extends Location & ObjectLocation> extends ObjectLocation {
-        T toUntypedLocation();
-    }
-
-    public interface InternalLongLocation extends LongLocation {
-        void setLongInternal(DynamicObject store, long value);
-    }
-
     @Override
     public boolean isFinal() {
         return false;
@@ -142,6 +153,13 @@
     }
 
     /**
+     * Accept a visitor for location allocation for this and every nested location.
+     *
+     * @param locationVisitor visitor to be notified of every allocated slot in use by this location
+     */
+    public abstract void accept(LocationVisitor locationVisitor);
+
+    /**
      * Boxed values need to be compared by value not by reference.
      *
      * The first parameter should be the one with the more precise type information.
--- a/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/Locations.java	Mon Jan 05 19:01:01 2015 +0100
+++ b/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/Locations.java	Wed Jan 07 15:11:38 2015 +0100
@@ -98,6 +98,10 @@
         public String toString() {
             return "=" + String.valueOf(value);
         }
+
+        @Override
+        public final void accept(LocationVisitor locationVisitor) {
+        }
     }
 
     public static final class ConstantLocation extends ValueLocation {
@@ -204,6 +208,12 @@
         }
 
         @Override
+        public final void accept(LocationVisitor locationVisitor) {
+            ((LocationImpl) primitiveLocation).accept(locationVisitor);
+            ((LocationImpl) objectLocation).accept(locationVisitor);
+        }
+
+        @Override
         public String toString() {
             return objectLocation.toString() + "," + primitiveLocation.toString() + "," + type;
         }
--- a/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/ShapeImpl.java	Mon Jan 05 19:01:01 2015 +0100
+++ b/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/ShapeImpl.java	Wed Jan 07 15:11:38 2015 +0100
@@ -31,7 +31,7 @@
 import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.api.object.*;
 import com.oracle.truffle.api.utilities.*;
-import com.oracle.truffle.object.LocationImpl.InternalLongLocation;
+import com.oracle.truffle.object.LocationImpl.*;
 import com.oracle.truffle.object.Locations.ConstantLocation;
 import com.oracle.truffle.object.Locations.DeclaredDualLocation;
 import com.oracle.truffle.object.Locations.DeclaredLocation;
@@ -954,7 +954,7 @@
         return null;
     }
 
-    public abstract static class BaseAllocator extends Allocator {
+    public abstract static class BaseAllocator extends Allocator implements LocationVisitor {
         protected final LayoutImpl layout;
         protected int objectArraySize;
         protected int objectFieldSize;
@@ -1056,15 +1056,13 @@
         protected <T extends Location> T advance(T location0) {
             if (location0 instanceof LocationImpl) {
                 LocationImpl location = (LocationImpl) location0;
-                objectArraySize += location.objectArrayCount();
-                primitiveArraySize += location.primitiveArrayCount();
-                primitiveFieldSize += location.primitiveFieldCount();
+                if (location != layout.getPrimitiveArrayLocation()) {
+                    location.accept(this);
+                }
                 if (layout.hasPrimitiveExtensionArray()) {
-                    hasPrimitiveArray |= location == layout.getPrimitiveArrayLocation() || location.primitiveArrayCount() != 0;
-                    objectFieldSize = location == layout.getPrimitiveArrayLocation() ? objectFieldSize : Math.max(objectFieldSize, layout.objectFieldIndex(location) + location.objectFieldCount());
+                    hasPrimitiveArray |= location == layout.getPrimitiveArrayLocation() || primitiveArraySize > 0;
                 } else {
-                    assert !hasPrimitiveArray && location.primitiveArrayCount() == 0;
-                    objectFieldSize += location.objectFieldCount();
+                    assert !hasPrimitiveArray && primitiveArraySize == 0;
                 }
             }
             depth++;
@@ -1076,6 +1074,22 @@
             advance(location);
             return this;
         }
+
+        public void visitObjectField(int index, int count) {
+            objectFieldSize = Math.max(objectFieldSize, index + count);
+        }
+
+        public void visitObjectArray(int index, int count) {
+            objectArraySize = Math.max(objectArraySize, index + count);
+        }
+
+        public void visitPrimitiveArray(int index, int count) {
+            primitiveArraySize = Math.max(primitiveArraySize, index + count);
+        }
+
+        public void visitPrimitiveField(int index, int count) {
+            primitiveFieldSize = Math.max(primitiveFieldSize, index + count);
+        }
     }
 
     private static void debugRegisterShape(ShapeImpl newShape) {