mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-18 15:55:36 +00:00
Bug 1233011 - SharedArrayBuffer subclassing + tests. r=efaust
--HG-- extra : rebase_source : d4764a8be911c263edad6ddfb56bd7b1f789fa14 extra : amend_source : 5c5efcdd1dcf013f299eb93e49b2f2d8c247424f
This commit is contained in:
parent
3c35bb857f
commit
2d373bc654
53
js/src/jit-test/tests/sharedbuf/subtypes.js
Normal file
53
js/src/jit-test/tests/sharedbuf/subtypes.js
Normal file
@ -0,0 +1,53 @@
|
||||
// Test cases for subclasses of SharedArrayBuffer.
|
||||
|
||||
if (!this.SharedArrayBuffer)
|
||||
quit(0);
|
||||
|
||||
load(libdir + "asserts.js");
|
||||
|
||||
// Basic subclassing.
|
||||
|
||||
class MySharedArrayBuffer1 extends SharedArrayBuffer {
|
||||
constructor(n) { super(n) }
|
||||
}
|
||||
|
||||
let mv1 = new MySharedArrayBuffer1(1024);
|
||||
assertEq(mv1 instanceof SharedArrayBuffer, true);
|
||||
assertEq(mv1 instanceof MySharedArrayBuffer1, true);
|
||||
assertEq(mv1.byteLength, 1024);
|
||||
|
||||
// Can construct views on the subclasses and read/write elements.
|
||||
|
||||
let mva1 = new Int8Array(mv1);
|
||||
assertEq(mva1.length, mv1.byteLength);
|
||||
assertEq(mva1.buffer, mv1);
|
||||
|
||||
for ( let i=1 ; i < mva1.length ; i++ )
|
||||
mva1[i] = i;
|
||||
|
||||
for ( let i=1 ; i < mva1.length ; i++ )
|
||||
assertEq(mva1[i], (i << 24) >> 24);
|
||||
|
||||
// Passing modified arguments to superclass to get a different length.
|
||||
|
||||
class MySharedArrayBuffer2 extends SharedArrayBuffer {
|
||||
constructor(n) { super(n-1) }
|
||||
}
|
||||
|
||||
let mv2 = new MySharedArrayBuffer2(10);
|
||||
assertEq(mv2 instanceof SharedArrayBuffer, true);
|
||||
assertEq(mv2 instanceof MySharedArrayBuffer2, true);
|
||||
assertEq(mv2.byteLength, 9);
|
||||
|
||||
// Returning a different object altogether.
|
||||
|
||||
class MySharedArrayBuffer3 extends SharedArrayBuffer {
|
||||
constructor(n) {
|
||||
return new Array(n);
|
||||
}
|
||||
}
|
||||
|
||||
let mv3 = new MySharedArrayBuffer3(10);
|
||||
assertEq(mv3 instanceof Array, true);
|
||||
assertEq(mv3 instanceof MySharedArrayBuffer3, false);
|
||||
assertEq(mv3.length, 10);
|
@ -101,5 +101,8 @@ testBuiltin(Array, 3.0);
|
||||
testBuiltin(Array, "non-length one-arg");
|
||||
testBuiltin(Array, 5, 10, 15, "these are elements");
|
||||
|
||||
if (this.SharedArrayBuffer)
|
||||
testBuiltin(SharedArrayBuffer);
|
||||
|
||||
if (typeof reportCompare === 'function')
|
||||
reportCompare(0,0,"OK");
|
||||
|
@ -239,7 +239,12 @@ SharedArrayBufferObject::class_constructor(JSContext* cx, unsigned argc, Value*
|
||||
return false;
|
||||
}
|
||||
|
||||
JSObject* bufobj = New(cx, length);
|
||||
RootedObject proto(cx);
|
||||
RootedObject newTarget(cx, &args.newTarget().toObject());
|
||||
if (!GetPrototypeFromConstructor(cx, newTarget, &proto))
|
||||
return false;
|
||||
|
||||
JSObject* bufobj = New(cx, length, proto);
|
||||
if (!bufobj)
|
||||
return false;
|
||||
args.rval().setObject(*bufobj);
|
||||
@ -247,20 +252,21 @@ SharedArrayBufferObject::class_constructor(JSContext* cx, unsigned argc, Value*
|
||||
}
|
||||
|
||||
SharedArrayBufferObject*
|
||||
SharedArrayBufferObject::New(JSContext* cx, uint32_t length)
|
||||
SharedArrayBufferObject::New(JSContext* cx, uint32_t length, HandleObject proto)
|
||||
{
|
||||
SharedArrayRawBuffer* buffer = SharedArrayRawBuffer::New(cx, length);
|
||||
if (!buffer)
|
||||
return nullptr;
|
||||
|
||||
return New(cx, buffer);
|
||||
return New(cx, buffer, proto);
|
||||
}
|
||||
|
||||
SharedArrayBufferObject*
|
||||
SharedArrayBufferObject::New(JSContext* cx, SharedArrayRawBuffer* buffer)
|
||||
SharedArrayBufferObject::New(JSContext* cx, SharedArrayRawBuffer* buffer, HandleObject proto)
|
||||
{
|
||||
AutoSetNewObjectMetadata metadata(cx);
|
||||
Rooted<SharedArrayBufferObject*> obj(cx, NewBuiltinClassInstance<SharedArrayBufferObject>(cx));
|
||||
Rooted<SharedArrayBufferObject*> obj(cx,
|
||||
NewObjectWithClassProto<SharedArrayBufferObject>(cx, proto));
|
||||
if (!obj)
|
||||
return nullptr;
|
||||
|
||||
@ -423,7 +429,7 @@ JS_FRIEND_API(JSObject*)
|
||||
JS_NewSharedArrayBuffer(JSContext* cx, uint32_t nbytes)
|
||||
{
|
||||
MOZ_ASSERT(nbytes <= INT32_MAX);
|
||||
return SharedArrayBufferObject::New(cx, nbytes);
|
||||
return SharedArrayBufferObject::New(cx, nbytes, /* proto = */ nullptr);
|
||||
}
|
||||
|
||||
JS_FRIEND_API(bool)
|
||||
|
@ -130,10 +130,14 @@ class SharedArrayBufferObject : public ArrayBufferObjectMaybeShared
|
||||
static bool class_constructor(JSContext* cx, unsigned argc, Value* vp);
|
||||
|
||||
// Create a SharedArrayBufferObject with a new SharedArrayRawBuffer.
|
||||
static SharedArrayBufferObject* New(JSContext* cx, uint32_t length);
|
||||
static SharedArrayBufferObject* New(JSContext* cx,
|
||||
uint32_t length,
|
||||
HandleObject proto = nullptr);
|
||||
|
||||
// Create a SharedArrayBufferObject using an existing SharedArrayRawBuffer.
|
||||
static SharedArrayBufferObject* New(JSContext* cx, SharedArrayRawBuffer* buffer);
|
||||
static SharedArrayBufferObject* New(JSContext* cx,
|
||||
SharedArrayRawBuffer* buffer,
|
||||
HandleObject proto = nullptr);
|
||||
|
||||
static void Finalize(FreeOp* fop, JSObject* obj);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user