@@ -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