Skip to content

Commit ec2d80c

Browse files
committed
Hoist index read.
1 parent ecab15b commit ec2d80c

File tree

1 file changed

+23
-10
lines changed
  • truffle/src/com.oracle.truffle.api.object/src/com/oracle/truffle/api/object

1 file changed

+23
-10
lines changed

truffle/src/com.oracle.truffle.api.object/src/com/oracle/truffle/api/object/Location.java

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -202,23 +202,26 @@ protected double getDouble(DynamicObject store, boolean guard) throws Unexpected
202202
* @return the read value
203203
*/
204204
final Object getInternal(DynamicObject store, Shape expectedShape, boolean guard) {
205+
long idx = Integer.toUnsignedLong(index);
205206
if (this instanceof ObjectLocation objectLocation) {
206207
Object base;
207208
long offset;
209+
Object value;
208210
if (field == null) {
209211
base = getObjectArray(store, guard);
210-
offset = getObjectArrayOffset();
212+
offset = computeObjectArrayOffset(idx);
213+
value = UnsafeAccess.unsafeGetObject(base, offset, guard, this);
211214
} else {
212215
field.receiverCheck(store);
213216
base = store;
214217
offset = getFieldOffset();
218+
value = UnsafeAccess.unsafeGetObject(base, offset, guard, this);
215219
}
216-
Object value = UnsafeAccess.unsafeGetObject(base, offset, guard, this);
217220
return CompilerDirectives.inInterpreter() ? value : objectLocation.assumedTypeCast(value, guard);
218221
} else {
219222
if (field == null) {
220223
Object array = getPrimitiveArray(store, guard);
221-
long offset = getPrimitiveArrayOffset();
224+
long offset = computePrimitiveArrayOffset(idx);
222225
if (isIntLocation()) {
223226
return UnsafeAccess.unsafeGetInt(array, offset, guard, this);
224227
} else if (isLongLocation()) {
@@ -442,6 +445,7 @@ final void setDoubleSafe(DynamicObject store, double value, boolean guard, boole
442445
*/
443446
final void setInternal(DynamicObject receiver, Object value, boolean guard, Shape oldShape, Shape newShape) {
444447
assert canStoreValue(value) : value;
448+
long idx = Integer.toUnsignedLong(index);
445449
boolean init = newShape != oldShape;
446450
if (init) {
447451
DynamicObjectSupport.grow(receiver, oldShape, newShape);
@@ -460,20 +464,21 @@ final void setInternal(DynamicObject receiver, Object value, boolean guard, Shap
460464
long offset;
461465
if (field == null) {
462466
base = getObjectArray(receiver, guard);
463-
offset = getObjectArrayOffset();
467+
offset = computeObjectArrayOffset(idx);
468+
UnsafeAccess.unsafePutObject(base, offset, value, this);
464469
} else {
465470
field.receiverCheck(receiver);
466471
base = receiver;
467472
offset = getFieldOffset();
473+
UnsafeAccess.unsafePutObject(base, offset, value, this);
468474
}
469-
UnsafeAccess.unsafePutObject(base, offset, value, this);
470475
} else { // primitive location
471476
long longValue;
472477
if (isIntLocation()) {
473478
int intValue = (int) value;
474479
if (field == null) {
475480
Object array = getPrimitiveArray(receiver, guard);
476-
long offset = getPrimitiveArrayOffset();
481+
long offset = computePrimitiveArrayOffset(idx);
477482
UnsafeAccess.unsafePutInt(array, offset, intValue, this);
478483
return;
479484
} else {
@@ -489,7 +494,7 @@ final void setInternal(DynamicObject receiver, Object value, boolean guard, Shap
489494
}
490495
if (field == null) {
491496
Object array = getPrimitiveArray(receiver, guard);
492-
long offset = getPrimitiveArrayOffset();
497+
long offset = computePrimitiveArrayOffset(idx);
493498
UnsafeAccess.unsafePutLong(array, offset, longValue, this);
494499
return;
495500
}
@@ -504,7 +509,7 @@ final void setInternal(DynamicObject receiver, Object value, boolean guard, Shap
504509
}
505510
if (field == null) {
506511
Object array = getPrimitiveArray(receiver, guard);
507-
long offset = getPrimitiveArrayOffset();
512+
long offset = computePrimitiveArrayOffset(idx);
508513
UnsafeAccess.unsafePutDouble(array, offset, doubleValue, this);
509514
return;
510515
} else {
@@ -745,12 +750,20 @@ final long getFieldOffset() {
745750
return field.offset();
746751
}
747752

753+
static long computeObjectArrayOffset(long index) {
754+
return index * Unsafe.ARRAY_OBJECT_INDEX_SCALE + Unsafe.ARRAY_OBJECT_BASE_OFFSET;
755+
}
756+
757+
static long computePrimitiveArrayOffset(long index) {
758+
return index * Unsafe.ARRAY_INT_INDEX_SCALE + Unsafe.ARRAY_INT_BASE_OFFSET;
759+
}
760+
748761
final long getObjectArrayOffset() {
749-
return Integer.toUnsignedLong(index) * Unsafe.ARRAY_OBJECT_INDEX_SCALE + Unsafe.ARRAY_OBJECT_BASE_OFFSET;
762+
return computeObjectArrayOffset(Integer.toUnsignedLong(index));
750763
}
751764

752765
final long getPrimitiveArrayOffset() {
753-
return Integer.toUnsignedLong(index) * Unsafe.ARRAY_INT_INDEX_SCALE + Unsafe.ARRAY_INT_BASE_OFFSET;
766+
return computePrimitiveArrayOffset(Integer.toUnsignedLong(index));
754767
}
755768

756769
static Object getObjectArray(DynamicObject store, boolean condition) {

0 commit comments

Comments
 (0)