Bug 1595745 - Part 7: Change Atomics to use ClassSpec. r=mgaudet

Similar changes like in part 5, only now for the Atomics object.

Differential Revision: https://phabricator.services.mozilla.com/D52663

--HG--
extra : moz-landing-system : lando
This commit is contained in:
André Bargull 2019-11-15 15:03:42 +00:00
parent 563f03bb43
commit 4acd45cff3
3 changed files with 15 additions and 41 deletions

View File

@ -108,7 +108,7 @@
REAL(WeakSet, InitViaClassSpec, OCLASP(WeakSet)) \
REAL(TypedArray, InitViaClassSpec, \
&js::TypedArrayObject::sharedTypedArrayPrototypeClass) \
REAL(Atomics, InitAtomicsClass, OCLASP(Atomics)) \
REAL(Atomics, InitViaClassSpec, OCLASP(Atomics)) \
REAL(SavedFrame, InitViaClassSpec, &js::SavedFrame::class_) \
REAL(Promise, InitViaClassSpec, OCLASP(Promise)) \
REAL(AsyncFunction, InitAsyncFunction, nullptr) \

View File

@ -72,9 +72,6 @@
using namespace js;
const JSClass AtomicsObject::class_ = {
"Atomics", JSCLASS_HAS_CACHED_PROTO(JSProto_Atomics)};
static bool ReportBadArrayType(JSContext* cx) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
JSMSG_ATOMICS_BAD_ARRAY);
@ -957,42 +954,25 @@ const JSFunctionSpec AtomicsMethods[] = {
JS_FN("wake", atomics_notify, 3, 0), // Legacy name
JS_FS_END};
JSObject* AtomicsObject::initClass(JSContext* cx,
Handle<GlobalObject*> global) {
// Create Atomics Object.
RootedObject objProto(cx,
GlobalObject::getOrCreateObjectPrototype(cx, global));
if (!objProto) {
return nullptr;
}
RootedObject Atomics(cx, NewObjectWithGivenProto(cx, &AtomicsObject::class_,
objProto, SingletonObject));
if (!Atomics) {
return nullptr;
}
static const JSPropertySpec AtomicsProperties[] = {
JS_STRING_SYM_PS(toStringTag, "Atomics", JSPROP_READONLY), JS_PS_END};
if (!JS_DefineFunctions(cx, Atomics, AtomicsMethods)) {
static JSObject* CreateAtomicsObject(JSContext* cx, JSProtoKey key) {
Handle<GlobalObject*> global = cx->global();
RootedObject proto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
if (!proto) {
return nullptr;
}
if (!DefineToStringTag(cx, Atomics, cx->names().Atomics)) {
return nullptr;
}
RootedValue AtomicsValue(cx, ObjectValue(*Atomics));
// Everything is set up, install Atomics on the global object.
if (!DefineDataProperty(cx, global, cx->names().Atomics, AtomicsValue,
JSPROP_RESOLVING)) {
return nullptr;
}
global->setConstructor(JSProto_Atomics, AtomicsValue);
return Atomics;
return NewObjectWithGivenProto(cx, &AtomicsObject::class_, proto,
SingletonObject);
}
JSObject* js::InitAtomicsClass(JSContext* cx, Handle<GlobalObject*> global) {
return AtomicsObject::initClass(cx, global);
}
static const ClassSpec AtomicsClassSpec = {CreateAtomicsObject, nullptr,
AtomicsMethods, AtomicsProperties};
const JSClass AtomicsObject::class_ = {
"Atomics", JSCLASS_HAS_CACHED_PROTO(JSProto_Atomics), JS_NULL_CLASS_OPS,
&AtomicsClassSpec};
#undef CXX11_ATOMICS
#undef GNU_ATOMICS

View File

@ -18,15 +18,11 @@
namespace js {
class GlobalObject;
class SharedArrayRawBuffer;
class AtomicsObject : public NativeObject {
public:
static const JSClass class_;
static JSObject* initClass(JSContext* cx, Handle<GlobalObject*> global);
static MOZ_MUST_USE bool toString(JSContext* cx, unsigned int argc,
Value* vp);
};
MOZ_MUST_USE bool atomics_compareExchange(JSContext* cx, unsigned argc,
@ -141,8 +137,6 @@ class FutexThread {
ThreadData<bool> canWait_;
};
JSObject* InitAtomicsClass(JSContext* cx, Handle<GlobalObject*> global);
// Go to sleep if the int32_t value at the given address equals `value`.
MOZ_MUST_USE FutexThread::WaitResult atomics_wait_impl(
JSContext* cx, SharedArrayRawBuffer* sarb, uint32_t byteOffset,