Bug 1233011 - SharedArrayBuffer subclassing + tests. r=efaust

--HG--
extra : rebase_source : d4764a8be911c263edad6ddfb56bd7b1f789fa14
extra : amend_source : 5c5efcdd1dcf013f299eb93e49b2f2d8c247424f
This commit is contained in:
Lars T Hansen 2015-12-16 16:22:50 +01:00
parent 3c35bb857f
commit 2d373bc654
4 changed files with 74 additions and 8 deletions

View 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);

View File

@ -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");

View File

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

View File

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