Use ordinary objects for Error prototypes

This commit is contained in:
janekptacijarabaci 2018-03-17 16:56:31 +01:00 • committed by Roy Tam
commit 105cbadae7
4 changed files with 161 additions and 91 deletions

View file

@ -38,9 +38,8 @@ class ErrorObject : public NativeObject
ScopedJSFreePtr<JSErrorReport>* errorReport, HandleString fileName, HandleObject stack,
uint32_t lineNumber, uint32_t columnNumber, HandleString message);
static const ClassSpec errorClassSpec_;
static const ClassSpec subErrorClassSpec_;
static const ClassSpec nonGlobalErrorClassSpec_;
static const ClassSpec classSpecs[JSEXN_ERROR_LIMIT];
static const Class protoClasses[JSEXN_ERROR_LIMIT];
protected:
static const uint32_t EXNTYPE_SLOT = 0;
@ -54,7 +53,7 @@ class ErrorObject : public NativeObject
static const uint32_t RESERVED_SLOTS = MESSAGE_SLOT + 1;
public:
static const Class classes[JSEXN_LIMIT];
static const Class classes[JSEXN_ERROR_LIMIT];
static const Class * classForType(JSExnType type) {
MOZ_ASSERT(type < JSEXN_WARN);

View file

@ -427,6 +427,18 @@ class GlobalObject : public NativeObject
return &global->getPrototype(key).toObject();
}
static JSFunction*
getOrCreateErrorConstructor(JSContext* cx, Handle<GlobalObject*> global) {
if (!ensureConstructor(cx, global, JSProto_Error))
return nullptr;
return &global->getConstructor(JSProto_Error).toObject().as<JSFunction>();
}
static JSObject*
getOrCreateErrorPrototype(JSContext* cx, Handle<GlobalObject*> global) {
return getOrCreateCustomErrorPrototype(cx, global, JSEXN_ERR);
}
static NativeObject* getOrCreateSetPrototype(JSContext* cx, Handle<GlobalObject*> global) {
if (!ensureConstructor(cx, global, JSProto_Set))
return nullptr;
@ -1003,10 +1015,7 @@ GenericCreatePrototype(JSContext* cx, JSProtoKey key)
inline JSProtoKey
StandardProtoKeyOrNull(const JSObject* obj)
{
JSProtoKey key = JSCLASS_CACHED_PROTO_KEY(obj->getClass());
if (key == JSProto_Error)
return GetExceptionProtoKey(obj->as<ErrorObject>().type());
return key;
return JSCLASS_CACHED_PROTO_KEY(obj->getClass());
}
JSObject*