diff --git a/quickjs.c b/quickjs.c index 0e038ccff..f674470ff 100644 --- a/quickjs.c +++ b/quickjs.c @@ -9858,6 +9858,15 @@ int JS_PreventExtensions(JSContext *ctx, JSValueConst obj) p = JS_VALUE_GET_OBJ(obj); if (unlikely(p->class_id == JS_CLASS_PROXY)) return js_proxy_preventExtensions(ctx, obj); + if (is_typed_array(p->class_id)) { + JSTypedArray *ta = p->u.typed_array; + JSArrayBuffer *abuf = ta->buffer->u.array_buffer; + if (ta->track_rab || + (array_buffer_is_resizable(abuf) && !abuf->shared)) + { + return false; + } + } p->extensible = false; return true; } @@ -41752,7 +41761,7 @@ static JSValue js_object_preventExtensions(JSContext *ctx, JSValueConst this_val return js_bool(ret); } else { if (!ret) - return JS_ThrowTypeError(ctx, "proxy preventExtensions handler returned false"); + return JS_ThrowTypeError(ctx, "Cannot prevent extensions"); return js_dup(obj); } } diff --git a/tests/bug1691.js b/tests/bug1691.js new file mode 100644 index 000000000..7a5b55398 --- /dev/null +++ b/tests/bug1691.js @@ -0,0 +1,3 @@ +import { assertThrows } from "./assert.js"; + +assertThrows(TypeError, function () {Object.preventExtensions(new Int8Array(new ArrayBuffer(16, { maxByteLength: 16 })));}); \ No newline at end of file