Skip to content

Commit cd756ba

Browse files
committed
Extracted array ranges should not be shared even if the original was.
1 parent 1701064 commit cd756ba

File tree

3 files changed

+12
-2
lines changed

3 files changed

+12
-2
lines changed

src/main/java/org/truffleruby/core/array/ArrayCopyOnWriteNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ protected Object extractFromMutableArray(RubyArray array, int start, int length,
3535
@CachedLibrary("store") ArrayStoreLibrary stores) {
3636
int size = array.size;
3737
Object cowStore = stores.extractRange(store, 0, size);
38-
Object range = stores.extractRange(store, start, start + length);
38+
Object range = stores.extractRangeAndUnshare(store, start, start + length);
3939
array.store = cowStore;
4040
return range;
4141
}
@@ -44,7 +44,7 @@ protected Object extractFromMutableArray(RubyArray array, int start, int length,
4444
protected Object extractFromNonMutableArray(RubyArray array, int start, int length,
4545
@Bind("array.store") Object store,
4646
@CachedLibrary("store") ArrayStoreLibrary stores) {
47-
Object range = stores.extractRange(store, start, start + length);
47+
Object range = stores.extractRangeAndUnshare(store, start, start + length);
4848
return range;
4949
}
5050
}

src/main/java/org/truffleruby/core/array/library/ArrayStoreLibrary.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ public Object extractRange(Object store, int start, int end) {
143143
return new DelegatedArrayStorage(store, start, (end - start));
144144
}
145145

146+
public Object extractRangeAndUnshare(Object store, int start, int end) {
147+
return extractRange(store, start, end);
148+
}
149+
146150
/** Copy a range from this array store into a plane Object[]. */
147151
public abstract Object[] boxedCopyOfRange(Object store, int start, int length);
148152

src/main/java/org/truffleruby/core/array/library/SharedArrayStorage.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,12 @@ protected Object extractRange(int start, int end,
153153
return new SharedArrayStorage(stores.extractRange(storage, start, end));
154154
}
155155

156+
@ExportMessage
157+
protected Object extractRangeAndUnshare(int start, int end,
158+
@CachedLibrary(limit = "1") ArrayStoreLibrary stores) {
159+
return stores.extractRange(storage, start, end);
160+
}
161+
156162
@ExportMessage
157163
protected Object[] boxedCopyOfRange(int start, int length,
158164
@CachedLibrary(limit = "1") ArrayStoreLibrary stores) {

0 commit comments

Comments
 (0)