Skip to content

Commit 73a6f6a

Browse files
committed
[GR-30290] Backport: ArrayBuffer.prototype.byteLength should handle detached interop array buffer.
PullRequest: js/1944
2 parents 31fbb8b + 4b84adf commit 73a6f6a

File tree

3 files changed

+19
-1
lines changed

3 files changed

+19
-1
lines changed

graal-js/src/com.oracle.truffle.js.test/src/com/oracle/truffle/js/test/interop/InteropByteBufferTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,4 +278,19 @@ public void testReadOnlyByteBuffer() {
278278
assertThrows(() -> jsBuffer.setArrayElement(0, 42), e -> assertTrue(e.getMessage(), e.getMessage().startsWith("TypeError")));
279279
}
280280
}
281+
282+
@Test
283+
public void testDetachedInteropArrayBuffer() {
284+
HostAccess hostAccess = HostAccess.newBuilder().allowBufferAccess(true).build();
285+
try (Context context = JSTest.newContextBuilder().allowHostAccess(hostAccess).allowExperimentalOptions(true).option("js.debug-builtin", "true").option("js.v8-compat", "true").build()) {
286+
ByteBuffer buffer = ByteBuffer.wrap(new byte[]{1, 2, 3});
287+
context.getBindings("js").putMember("buffer", buffer);
288+
Value byteLength = context.eval(ID, "" +
289+
"var arrayBuffer = new ArrayBuffer(buffer);\n" +
290+
"Debug.typedArrayDetachBuffer(arrayBuffer);\n" +
291+
"arrayBuffer.byteLength;");
292+
assertEquals(0, byteLength.asInt());
293+
}
294+
}
295+
281296
}

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/builtins/ArrayBufferPrototypeBuiltins.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ protected int directArrayBuffer(Object thisObj) {
140140
protected int interopArrayBuffer(Object thisObj,
141141
@CachedLibrary(limit = "InteropLibraryLimit") InteropLibrary interop) {
142142
Object buffer = JSArrayBuffer.getInteropBuffer(thisObj);
143+
if (!getContext().getTypedArrayNotDetachedAssumption().isValid() && buffer == null) {
144+
return handleDetachedBuffer();
145+
}
143146
try {
144147
long bufferSize = interop.getBufferSize(buffer);
145148
// Buffer size was already checked in the ArrayBuffer constructor.

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/builtins/DebugBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ public DebugTypedArrayDetachBufferNode(JSContext context, JSBuiltin builtin) {
690690
@TruffleBoundary
691691
@Specialization
692692
protected static Object detachBuffer(Object obj) {
693-
if (!(JSArrayBuffer.isJSHeapArrayBuffer(obj) || JSArrayBuffer.isJSDirectArrayBuffer(obj))) {
693+
if (!(JSArrayBuffer.isJSHeapArrayBuffer(obj) || JSArrayBuffer.isJSDirectArrayBuffer(obj) || JSArrayBuffer.isJSInteropArrayBuffer(obj))) {
694694
throw Errors.createTypeError("ArrayBuffer expected");
695695
}
696696
JSArrayBuffer.detachArrayBuffer((DynamicObject) obj);

0 commit comments

Comments
 (0)