# HG changeset patch # User Thomas Wuerthinger # Date 1424128131 -3600 # Node ID 936f9d0b58e230cfde934d44456812239c17b572 # Parent 2e91c189b0d84da0da9505cdf33054b1a91106ac Small simplifications of FrameWithoutBoxing. diff -r 2e91c189b0d8 -r 936f9d0b58e2 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/FrameWithoutBoxing.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/FrameWithoutBoxing.java Mon Feb 16 23:21:37 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/FrameWithoutBoxing.java Tue Feb 17 00:08:51 2015 +0100 @@ -41,6 +41,25 @@ private Object[] locals; private long[] primitiveLocals; private byte[] tags; + public static final byte OBJECT_TAG = 0; + public static final byte ILLEGAL_TAG = 1; + public static final byte LONG_TAG = 2; + public static final byte INT_TAG = 3; + public static final byte DOUBLE_TAG = 4; + public static final byte FLOAT_TAG = 5; + public static final byte BOOLEAN_TAG = 6; + public static final byte BYTE_TAG = 7; + + static { + assert OBJECT_TAG == FrameSlotKind.Object.tag; + assert ILLEGAL_TAG == FrameSlotKind.Illegal.tag; + assert LONG_TAG == FrameSlotKind.Long.tag; + assert INT_TAG == FrameSlotKind.Int.tag; + assert DOUBLE_TAG == FrameSlotKind.Double.tag; + assert FLOAT_TAG == FrameSlotKind.Float.tag; + assert BOOLEAN_TAG == FrameSlotKind.Boolean.tag; + assert BYTE_TAG == FrameSlotKind.Byte.tag; + } public FrameWithoutBoxing(FrameDescriptor descriptor, Object[] arguments) { this.descriptor = descriptor; @@ -67,8 +86,9 @@ @Override public Object getObject(FrameSlot slot) throws FrameSlotTypeException { - verifyGet(slot, FrameSlotKind.Object); - return getObjectUnsafe(slot); + int slotIndex = slot.getIndex(); + verifyGet(slotIndex, OBJECT_TAG); + return getObjectUnsafe(slotIndex, slot); } private Object[] getLocals() { @@ -83,156 +103,168 @@ return unsafeCast(tags, byte[].class, true, true); } - private Object getObjectUnsafe(FrameSlot slot) { - int slotIndex = slot.getIndex(); - return unsafeGetObject(getLocals(), Unsafe.ARRAY_OBJECT_BASE_OFFSET + slotIndex * (long) Unsafe.ARRAY_OBJECT_INDEX_SCALE, this.getTags()[slotIndex] == FrameSlotKind.Object.ordinal(), slot); + private Object getObjectUnsafe(int slotIndex, FrameSlot slot) { + return unsafeGetObject(getLocals(), Unsafe.ARRAY_OBJECT_BASE_OFFSET + slotIndex * (long) Unsafe.ARRAY_OBJECT_INDEX_SCALE, this.getTags()[slotIndex] == FrameSlotKind.Object.tag, slot); } @Override public void setObject(FrameSlot slot, Object value) { - verifySet(slot, FrameSlotKind.Object); - setObjectUnsafe(slot, value); + int slotIndex = slot.getIndex(); + verifySet(slotIndex, OBJECT_TAG); + setObjectUnsafe(slotIndex, slot, value); } - private void setObjectUnsafe(FrameSlot slot, Object value) { - unsafePutObject(getLocals(), Unsafe.ARRAY_OBJECT_BASE_OFFSET + slot.getIndex() * (long) Unsafe.ARRAY_OBJECT_INDEX_SCALE, value, slot); + private void setObjectUnsafe(int slotIndex, FrameSlot slot, Object value) { + unsafePutObject(getLocals(), Unsafe.ARRAY_OBJECT_BASE_OFFSET + slotIndex * (long) Unsafe.ARRAY_OBJECT_INDEX_SCALE, value, slot); } @Override public byte getByte(FrameSlot slot) throws FrameSlotTypeException { - verifyGet(slot, FrameSlotKind.Byte); - return getByteUnsafe(slot); + int slotIndex = slot.getIndex(); + verifyGet(slotIndex, BYTE_TAG); + return getByteUnsafe(slotIndex, slot); } - private byte getByteUnsafe(FrameSlot slot) { - long offset = getPrimitiveOffset(slot); - boolean condition = this.getTags()[slot.getIndex()] == FrameSlotKind.Byte.ordinal(); + private byte getByteUnsafe(int slotIndex, FrameSlot slot) { + long offset = getPrimitiveOffset(slotIndex); + boolean condition = this.getTags()[slotIndex] == FrameSlotKind.Byte.tag; return (byte) unsafeGetInt(getPrimitiveLocals(), offset, condition, slot); } @Override public void setByte(FrameSlot slot, byte value) { - verifySet(slot, FrameSlotKind.Byte); - setByteUnsafe(slot, value); + int slotIndex = slot.getIndex(); + verifySet(slotIndex, BYTE_TAG); + setByteUnsafe(slotIndex, slot, value); } - private void setByteUnsafe(FrameSlot slot, byte value) { - long offset = getPrimitiveOffset(slot); + private void setByteUnsafe(int slotIndex, FrameSlot slot, byte value) { + long offset = getPrimitiveOffset(slotIndex); unsafePutInt(getPrimitiveLocals(), offset, value, slot); } @Override public boolean getBoolean(FrameSlot slot) throws FrameSlotTypeException { - verifyGet(slot, FrameSlotKind.Boolean); - return getBooleanUnsafe(slot); + int slotIndex = slot.getIndex(); + verifyGet(slotIndex, BOOLEAN_TAG); + return getBooleanUnsafe(slotIndex, slot); } - private boolean getBooleanUnsafe(FrameSlot slot) { - long offset = getPrimitiveOffset(slot); - boolean condition = this.getTags()[slot.getIndex()] == FrameSlotKind.Boolean.ordinal(); + private boolean getBooleanUnsafe(int slotIndex, FrameSlot slot) { + long offset = getPrimitiveOffset(slotIndex); + boolean condition = this.getTags()[slotIndex] == FrameSlotKind.Boolean.tag; return unsafeGetInt(getPrimitiveLocals(), offset, condition, slot) != 0; } @Override public void setBoolean(FrameSlot slot, boolean value) { - verifySet(slot, FrameSlotKind.Boolean); - setBooleanUnsafe(slot, value); + int slotIndex = slot.getIndex(); + verifySet(slotIndex, BOOLEAN_TAG); + setBooleanUnsafe(slotIndex, slot, value); } - private void setBooleanUnsafe(FrameSlot slot, boolean value) { - long offset = getPrimitiveOffset(slot); + private void setBooleanUnsafe(int slotIndex, FrameSlot slot, boolean value) { + long offset = getPrimitiveOffset(slotIndex); unsafePutInt(getPrimitiveLocals(), offset, value ? 1 : 0, slot); } @Override public float getFloat(FrameSlot slot) throws FrameSlotTypeException { - verifyGet(slot, FrameSlotKind.Float); - return getFloatUnsafe(slot); + int slotIndex = slot.getIndex(); + verifyGet(slotIndex, FLOAT_TAG); + return getFloatUnsafe(slotIndex, slot); } - private float getFloatUnsafe(FrameSlot slot) { - long offset = getPrimitiveOffset(slot); - boolean condition = this.getTags()[slot.getIndex()] == FrameSlotKind.Float.ordinal(); + private float getFloatUnsafe(int slotIndex, FrameSlot slot) { + long offset = getPrimitiveOffset(slotIndex); + boolean condition = this.getTags()[slotIndex] == FrameSlotKind.Float.tag; return unsafeGetFloat(getPrimitiveLocals(), offset, condition, slot); } @Override public void setFloat(FrameSlot slot, float value) { - verifySet(slot, FrameSlotKind.Float); - setFloatUnsafe(slot, value); + int slotIndex = slot.getIndex(); + verifySet(slotIndex, FLOAT_TAG); + setFloatUnsafe(slotIndex, slot, value); } - private void setFloatUnsafe(FrameSlot slot, float value) { - long offset = getPrimitiveOffset(slot); + private void setFloatUnsafe(int slotIndex, FrameSlot slot, float value) { + long offset = getPrimitiveOffset(slotIndex); unsafePutFloat(getPrimitiveLocals(), offset, value, slot); } @Override public long getLong(FrameSlot slot) throws FrameSlotTypeException { - verifyGet(slot, FrameSlotKind.Long); - return getLongUnsafe(slot); + int slotIndex = slot.getIndex(); + verifyGet(slotIndex, LONG_TAG); + return getLongUnsafe(slotIndex, slot); } - private long getLongUnsafe(FrameSlot slot) { - long offset = getPrimitiveOffset(slot); - boolean condition = this.getTags()[slot.getIndex()] == FrameSlotKind.Long.ordinal(); + private long getLongUnsafe(int slotIndex, FrameSlot slot) { + long offset = getPrimitiveOffset(slotIndex); + boolean condition = this.getTags()[slotIndex] == FrameSlotKind.Long.tag; return unsafeGetLong(getPrimitiveLocals(), offset, condition, slot); } @Override public void setLong(FrameSlot slot, long value) { - verifySet(slot, FrameSlotKind.Long); - setLongUnsafe(slot, value); + int slotIndex = slot.getIndex(); + verifySet(slotIndex, LONG_TAG); + setLongUnsafe(slotIndex, slot, value); } - private void setLongUnsafe(FrameSlot slot, long value) { - long offset = getPrimitiveOffset(slot); + private void setLongUnsafe(int slotIndex, FrameSlot slot, long value) { + long offset = getPrimitiveOffset(slotIndex); unsafePutLong(getPrimitiveLocals(), offset, value, slot); } @Override public int getInt(FrameSlot slot) throws FrameSlotTypeException { - verifyGet(slot, FrameSlotKind.Int); - return getIntUnsafe(slot); + int slotIndex = slot.getIndex(); + verifyGet(slotIndex, INT_TAG); + return getIntUnsafe(slotIndex, slot); } - private int getIntUnsafe(FrameSlot slot) { - long offset = getPrimitiveOffset(slot); - boolean condition = this.getTags()[slot.getIndex()] == FrameSlotKind.Int.ordinal(); + private int getIntUnsafe(int slotIndex, FrameSlot slot) { + long offset = getPrimitiveOffset(slotIndex); + boolean condition = this.getTags()[slot.getIndex()] == FrameSlotKind.Int.tag; return unsafeGetInt(getPrimitiveLocals(), offset, condition, slot); } @Override public void setInt(FrameSlot slot, int value) { - verifySet(slot, FrameSlotKind.Int); - setIntUnsafe(slot, value); + int slotIndex = slot.getIndex(); + verifySet(slotIndex, INT_TAG); + setIntUnsafe(slotIndex, slot, value); } - private void setIntUnsafe(FrameSlot slot, int value) { - long offset = getPrimitiveOffset(slot); + private void setIntUnsafe(int slotIndex, FrameSlot slot, int value) { + long offset = getPrimitiveOffset(slotIndex); unsafePutInt(getPrimitiveLocals(), offset, value, slot); } @Override public double getDouble(FrameSlot slot) throws FrameSlotTypeException { - verifyGet(slot, FrameSlotKind.Double); - return getDoubleUnsafe(slot); + int slotIndex = slot.getIndex(); + verifyGet(slotIndex, DOUBLE_TAG); + return getDoubleUnsafe(slotIndex, slot); } - private double getDoubleUnsafe(FrameSlot slot) { - long offset = getPrimitiveOffset(slot); - boolean condition = this.getTags()[slot.getIndex()] == FrameSlotKind.Double.ordinal(); + private double getDoubleUnsafe(int slotIndex, FrameSlot slot) { + long offset = getPrimitiveOffset(slotIndex); + boolean condition = this.getTags()[slotIndex] == FrameSlotKind.Double.tag; return unsafeGetDouble(getPrimitiveLocals(), offset, condition, slot); } @Override public void setDouble(FrameSlot slot, double value) { - verifySet(slot, FrameSlotKind.Double); - setDoubleUnsafe(slot, value); + int slotIndex = slot.getIndex(); + verifySet(slotIndex, DOUBLE_TAG); + setDoubleUnsafe(slotIndex, slot, value); } - private void setDoubleUnsafe(FrameSlot slot, double value) { - long offset = getPrimitiveOffset(slot); + private void setDoubleUnsafe(int slotIndex, FrameSlot slot, double value) { + long offset = getPrimitiveOffset(slotIndex); unsafePutDouble(getPrimitiveLocals(), offset, value, slot); } @@ -241,59 +273,54 @@ return this.descriptor; } - private void verifySet(FrameSlot slot, FrameSlotKind accessKind) { - int slotIndex = slot.getIndex(); - if (slotIndex >= getTags().length) { - CompilerDirectives.transferToInterpreter(); + private void verifySet(int slotIndex, byte tag) { + if (CompilerDirectives.inInterpreter() && slotIndex >= getTags().length) { if (!resize()) { - throw new IllegalArgumentException(String.format("The frame slot '%s' is not known by the frame descriptor.", slot)); + throw new IllegalArgumentException(String.format("The frame slot '%s' is not known by the frame descriptor.", slotIndex)); } } - getTags()[slotIndex] = (byte) accessKind.ordinal(); + getTags()[slotIndex] = tag; } - private void verifyGet(FrameSlot slot, FrameSlotKind accessKind) throws FrameSlotTypeException { - int slotIndex = slot.getIndex(); - if (slotIndex >= getTags().length) { - CompilerDirectives.transferToInterpreter(); + private void verifyGet(int slotIndex, byte tag) throws FrameSlotTypeException { + if (CompilerDirectives.inInterpreter() && slotIndex >= getTags().length) { if (!resize()) { - throw new IllegalArgumentException(String.format("The frame slot '%s' is not known by the frame descriptor.", slot)); + throw new IllegalArgumentException(String.format("The frame slot '%s' is not known by the frame descriptor.", slotIndex)); } } - byte tag = this.getTags()[slotIndex]; - if (tag != accessKind.ordinal()) { + if (getTags()[slotIndex] != tag) { CompilerDirectives.transferToInterpreter(); throw new FrameSlotTypeException(); } } - private static long getPrimitiveOffset(FrameSlot slot) { - return Unsafe.ARRAY_LONG_BASE_OFFSET + slot.getIndex() * (long) Unsafe.ARRAY_LONG_INDEX_SCALE; + private static long getPrimitiveOffset(int slotIndex) { + return Unsafe.ARRAY_LONG_BASE_OFFSET + slotIndex * (long) Unsafe.ARRAY_LONG_INDEX_SCALE; } @Override public Object getValue(FrameSlot slot) { int slotIndex = slot.getIndex(); - if (slotIndex >= getTags().length) { + if (CompilerDirectives.inInterpreter() && slotIndex >= getTags().length) { CompilerDirectives.transferToInterpreter(); resize(); } byte tag = getTags()[slotIndex]; - if (tag == FrameSlotKind.Boolean.ordinal()) { - return getBooleanUnsafe(slot); - } else if (tag == FrameSlotKind.Byte.ordinal()) { - return getByteUnsafe(slot); - } else if (tag == FrameSlotKind.Int.ordinal()) { - return getIntUnsafe(slot); - } else if (tag == FrameSlotKind.Double.ordinal()) { - return getDoubleUnsafe(slot); - } else if (tag == FrameSlotKind.Long.ordinal()) { - return getLongUnsafe(slot); - } else if (tag == FrameSlotKind.Float.ordinal()) { - return getFloatUnsafe(slot); + if (tag == FrameSlotKind.Boolean.tag) { + return getBooleanUnsafe(slotIndex, slot); + } else if (tag == FrameSlotKind.Byte.tag) { + return getByteUnsafe(slotIndex, slot); + } else if (tag == FrameSlotKind.Int.tag) { + return getIntUnsafe(slotIndex, slot); + } else if (tag == FrameSlotKind.Double.tag) { + return getDoubleUnsafe(slotIndex, slot); + } else if (tag == FrameSlotKind.Long.tag) { + return getLongUnsafe(slotIndex, slot); + } else if (tag == FrameSlotKind.Float.tag) { + return getFloatUnsafe(slotIndex, slot); } else { - assert tag == FrameSlotKind.Object.ordinal(); - return getObjectUnsafe(slot); + assert tag == FrameSlotKind.Object.tag; + return getObjectUnsafe(slotIndex, slot); } } @@ -321,37 +348,37 @@ @Override public boolean isObject(FrameSlot slot) { - return getTag(slot) == FrameSlotKind.Object.ordinal(); + return getTag(slot) == FrameSlotKind.Object.tag; } @Override public boolean isByte(FrameSlot slot) { - return getTag(slot) == FrameSlotKind.Byte.ordinal(); + return getTag(slot) == FrameSlotKind.Byte.tag; } @Override public boolean isBoolean(FrameSlot slot) { - return getTag(slot) == FrameSlotKind.Boolean.ordinal(); + return getTag(slot) == FrameSlotKind.Boolean.tag; } @Override public boolean isInt(FrameSlot slot) { - return getTag(slot) == FrameSlotKind.Int.ordinal(); + return getTag(slot) == FrameSlotKind.Int.tag; } @Override public boolean isLong(FrameSlot slot) { - return getTag(slot) == FrameSlotKind.Long.ordinal(); + return getTag(slot) == FrameSlotKind.Long.tag; } @Override public boolean isFloat(FrameSlot slot) { - return getTag(slot) == FrameSlotKind.Float.ordinal(); + return getTag(slot) == FrameSlotKind.Float.tag; } @Override public boolean isDouble(FrameSlot slot) { - return getTag(slot) == FrameSlotKind.Double.ordinal(); + return getTag(slot) == FrameSlotKind.Double.tag; } @SuppressWarnings({"unchecked", "unused"}) diff -r 2e91c189b0d8 -r 936f9d0b58e2 graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameSlotKind.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameSlotKind.java Mon Feb 16 23:21:37 2015 +0100 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameSlotKind.java Tue Feb 17 00:08:51 2015 +0100 @@ -33,4 +33,10 @@ Float, Boolean, Byte; + + public final byte tag; + + private FrameSlotKind() { + this.tag = (byte) ordinal(); + } }