# HG changeset patch # User Andreas Woess # Date 1420643157 -3600 # Node ID c4fcd94dad190158d2bcb7ed29f31662e6ff96fa # Parent e9cbe16187335debb7d84504ae7f00a9d71ff166# Parent ef51dadd50f79a0727a625cfc3701fe5ae5fffe6 Merge diff -r ef51dadd50f7 -r c4fcd94dad19 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/LoopNode.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/LoopNode.java Wed Jan 07 14:05:14 2015 +0100 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/LoopNode.java Wed Jan 07 16:05:57 2015 +0100 @@ -31,13 +31,10 @@ */ public abstract class LoopNode extends Node { - /* - * TODO Unfortunately we cannot yet use interface typed fields as child fields. - */ - @Child protected Node repeatingNode; + @Child protected RepeatingNode repeatingNode; public LoopNode(RepeatingNode repeatingNode) { - this.repeatingNode = (Node) repeatingNode; + this.repeatingNode = repeatingNode; } public abstract void executeLoop(VirtualFrame frame); @@ -47,7 +44,7 @@ } public final RepeatingNode getRepeatingNode() { - return (RepeatingNode) repeatingNode; + return repeatingNode; } } diff -r ef51dadd50f7 -r c4fcd94dad19 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/RepeatingNode.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/RepeatingNode.java Wed Jan 07 14:05:14 2015 +0100 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/RepeatingNode.java Wed Jan 07 16:05:57 2015 +0100 @@ -29,7 +29,7 @@ /** * Experimental API: may change significantly without notice. */ -public interface RepeatingNode { +public interface RepeatingNode extends NodeInterface { boolean executeRepeating(VirtualFrame frame); diff -r ef51dadd50f7 -r c4fcd94dad19 graal/com.oracle.truffle.object.basic/src/com/oracle/truffle/object/basic/BasicLocations.java --- a/graal/com.oracle.truffle.object.basic/src/com/oracle/truffle/object/basic/BasicLocations.java Wed Jan 07 14:05:14 2015 +0100 +++ b/graal/com.oracle.truffle.object.basic/src/com/oracle/truffle/object/basic/BasicLocations.java Wed Jan 07 16:05:57 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 getType() { + public final Class 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 getType() { + public final Class 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 getType() { + public final Class 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 { diff -r ef51dadd50f7 -r c4fcd94dad19 graal/com.oracle.truffle.object/src/com/oracle/truffle/object/LocationImpl.java --- a/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/LocationImpl.java Wed Jan 07 14:05:14 2015 +0100 +++ b/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/LocationImpl.java Wed Jan 07 16:05:57 2015 +0100 @@ -25,6 +25,29 @@ import com.oracle.truffle.api.object.*; public abstract class LocationImpl extends Location { + + public interface EffectivelyFinalLocation { + T toNonFinalLocation(); + } + + public interface TypedObjectLocation 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 toNonFinalLocation(); - } - - public interface TypedObjectLocation 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. diff -r ef51dadd50f7 -r c4fcd94dad19 graal/com.oracle.truffle.object/src/com/oracle/truffle/object/Locations.java --- a/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/Locations.java Wed Jan 07 14:05:14 2015 +0100 +++ b/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/Locations.java Wed Jan 07 16:05:57 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; } diff -r ef51dadd50f7 -r c4fcd94dad19 graal/com.oracle.truffle.object/src/com/oracle/truffle/object/ShapeImpl.java --- a/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/ShapeImpl.java Wed Jan 07 14:05:14 2015 +0100 +++ b/graal/com.oracle.truffle.object/src/com/oracle/truffle/object/ShapeImpl.java Wed Jan 07 16:05:57 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 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) {