1320408 - Change method that does GC on |this| to static method with Handle parameter.
parent
8e874d3abd
commit
df9455157d
|
@ -988,7 +988,7 @@ Wrap(JSContext *cx, JS::HandleObject existing, JS::HandleObject obj)
|
|||
}
|
||||
|
||||
if (existing) {
|
||||
js::Wrapper::Renew(cx, existing, obj, wrapper);
|
||||
js::Wrapper::Renew(existing, obj, wrapper);
|
||||
}
|
||||
return js::Wrapper::New(cx, obj, wrapper);
|
||||
}
|
||||
|
|
|
@ -1117,7 +1117,7 @@ JSObject*
|
|||
AtomicsObject::initClass(JSContext* cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
// Create Atomics Object.
|
||||
RootedObject objProto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
RootedObject objProto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!objProto)
|
||||
return nullptr;
|
||||
RootedObject Atomics(cx, NewObjectWithGivenProto(cx, &AtomicsObject::class_, objProto,
|
||||
|
|
|
@ -270,7 +270,7 @@ Collator(JSContext* cx, const CallArgs& args, bool construct)
|
|||
// See https://github.com/tc39/ecma402/issues/57
|
||||
if (!construct) {
|
||||
// ES Intl 1st ed., 10.1.2.1 step 3
|
||||
JSObject* intl = cx->global()->getOrCreateIntlObject(cx);
|
||||
JSObject* intl = GlobalObject::getOrCreateIntlObject(cx, cx->global());
|
||||
if (!intl)
|
||||
return false;
|
||||
RootedValue self(cx, args.thisv());
|
||||
|
@ -298,7 +298,7 @@ Collator(JSContext* cx, const CallArgs& args, bool construct)
|
|||
return false;
|
||||
|
||||
if (!proto) {
|
||||
proto = cx->global()->getOrCreateCollatorPrototype(cx);
|
||||
proto = GlobalObject::getOrCreateCollatorPrototype(cx, cx->global());
|
||||
if (!proto)
|
||||
return false;
|
||||
}
|
||||
|
@ -358,11 +358,12 @@ collator_finalize(FreeOp* fop, JSObject* obj)
|
|||
static JSObject*
|
||||
CreateCollatorPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObject*> global)
|
||||
{
|
||||
RootedFunction ctor(cx, global->createConstructor(cx, &Collator, cx->names().Collator, 0));
|
||||
RootedFunction ctor(cx, GlobalObject::createConstructor(cx, &Collator, cx->names().Collator,
|
||||
0));
|
||||
if (!ctor)
|
||||
return nullptr;
|
||||
|
||||
RootedNativeObject proto(cx, global->createBlankPrototype(cx, &CollatorClass));
|
||||
RootedNativeObject proto(cx, GlobalObject::createBlankPrototype(cx, global, &CollatorClass));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
proto->setReservedSlot(UCOLLATOR_SLOT, PrivateValue(nullptr));
|
||||
|
@ -772,7 +773,7 @@ NumberFormat(JSContext* cx, const CallArgs& args, bool construct)
|
|||
// See https://github.com/tc39/ecma402/issues/57
|
||||
if (!construct) {
|
||||
// ES Intl 1st ed., 11.1.2.1 step 3
|
||||
JSObject* intl = cx->global()->getOrCreateIntlObject(cx);
|
||||
JSObject* intl = GlobalObject::getOrCreateIntlObject(cx, cx->global());
|
||||
if (!intl)
|
||||
return false;
|
||||
RootedValue self(cx, args.thisv());
|
||||
|
@ -800,7 +801,7 @@ NumberFormat(JSContext* cx, const CallArgs& args, bool construct)
|
|||
return false;
|
||||
|
||||
if (!proto) {
|
||||
proto = cx->global()->getOrCreateNumberFormatPrototype(cx);
|
||||
proto = GlobalObject::getOrCreateNumberFormatPrototype(cx, cx->global());
|
||||
if (!proto)
|
||||
return false;
|
||||
}
|
||||
|
@ -862,11 +863,12 @@ static JSObject*
|
|||
CreateNumberFormatPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObject*> global)
|
||||
{
|
||||
RootedFunction ctor(cx);
|
||||
ctor = global->createConstructor(cx, &NumberFormat, cx->names().NumberFormat, 0);
|
||||
ctor = GlobalObject::createConstructor(cx, &NumberFormat, cx->names().NumberFormat, 0);
|
||||
if (!ctor)
|
||||
return nullptr;
|
||||
|
||||
RootedNativeObject proto(cx, global->createBlankPrototype(cx, &NumberFormatClass));
|
||||
RootedNativeObject proto(cx, GlobalObject::createBlankPrototype(cx, global,
|
||||
&NumberFormatClass));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
proto->setReservedSlot(UNUMBER_FORMAT_SLOT, PrivateValue(nullptr));
|
||||
|
@ -1250,7 +1252,7 @@ DateTimeFormat(JSContext* cx, const CallArgs& args, bool construct)
|
|||
// See https://github.com/tc39/ecma402/issues/57
|
||||
if (!construct) {
|
||||
// ES Intl 1st ed., 12.1.2.1 step 3
|
||||
JSObject* intl = cx->global()->getOrCreateIntlObject(cx);
|
||||
JSObject* intl = GlobalObject::getOrCreateIntlObject(cx, cx->global());
|
||||
if (!intl)
|
||||
return false;
|
||||
RootedValue self(cx, args.thisv());
|
||||
|
@ -1278,7 +1280,7 @@ DateTimeFormat(JSContext* cx, const CallArgs& args, bool construct)
|
|||
return false;
|
||||
|
||||
if (!proto) {
|
||||
proto = cx->global()->getOrCreateDateTimeFormatPrototype(cx);
|
||||
proto = GlobalObject::getOrCreateDateTimeFormatPrototype(cx, cx->global());
|
||||
if (!proto)
|
||||
return false;
|
||||
}
|
||||
|
@ -1340,11 +1342,12 @@ static JSObject*
|
|||
CreateDateTimeFormatPrototype(JSContext* cx, HandleObject Intl, Handle<GlobalObject*> global)
|
||||
{
|
||||
RootedFunction ctor(cx);
|
||||
ctor = global->createConstructor(cx, &DateTimeFormat, cx->names().DateTimeFormat, 0);
|
||||
ctor = GlobalObject::createConstructor(cx, &DateTimeFormat, cx->names().DateTimeFormat, 0);
|
||||
if (!ctor)
|
||||
return nullptr;
|
||||
|
||||
RootedNativeObject proto(cx, global->createBlankPrototype(cx, &DateTimeFormatClass));
|
||||
RootedNativeObject proto(cx, GlobalObject::createBlankPrototype(cx, global,
|
||||
&DateTimeFormatClass));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
proto->setReservedSlot(UDATE_FORMAT_SLOT, PrivateValue(nullptr));
|
||||
|
@ -2731,10 +2734,10 @@ static const JSFunctionSpec intl_static_methods[] = {
|
|||
* Initializes the Intl Object and its standard built-in properties.
|
||||
* Spec: ECMAScript Internationalization API Specification, 8.0, 8.1
|
||||
*/
|
||||
bool
|
||||
/* static */ bool
|
||||
GlobalObject::initIntlObject(JSContext* cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
RootedObject proto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
RootedObject proto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!proto)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -164,7 +164,7 @@ MapIteratorObject::kind() const
|
|||
return MapObject::IteratorKind(i);
|
||||
}
|
||||
|
||||
bool
|
||||
/* static */ bool
|
||||
GlobalObject::initMapIteratorProto(JSContext* cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
Rooted<JSObject*> base(cx, GlobalObject::getOrCreateIteratorPrototype(cx, global));
|
||||
|
@ -924,7 +924,7 @@ SetIteratorObject::kind() const
|
|||
return SetObject::IteratorKind(i);
|
||||
}
|
||||
|
||||
bool
|
||||
/* static */ bool
|
||||
GlobalObject::initSetIteratorProto(JSContext* cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
Rooted<JSObject*> base(cx, GlobalObject::getOrCreateIteratorPrototype(cx, global));
|
||||
|
|
|
@ -103,7 +103,7 @@ GlobalObject::initImportEntryProto(JSContext* cx, Handle<GlobalObject*> global)
|
|||
JS_PS_END
|
||||
};
|
||||
|
||||
RootedObject proto(cx, global->createBlankPrototype<PlainObject>(cx));
|
||||
RootedObject proto(cx, GlobalObject::createBlankPrototype<PlainObject>(cx, global));
|
||||
if (!proto)
|
||||
return false;
|
||||
|
||||
|
@ -169,7 +169,7 @@ GlobalObject::initExportEntryProto(JSContext* cx, Handle<GlobalObject*> global)
|
|||
JS_PS_END
|
||||
};
|
||||
|
||||
RootedObject proto(cx, global->createBlankPrototype<PlainObject>(cx));
|
||||
RootedObject proto(cx, GlobalObject::createBlankPrototype<PlainObject>(cx, global));
|
||||
if (!proto)
|
||||
return false;
|
||||
|
||||
|
@ -788,7 +788,7 @@ AssertModuleScopesMatch(ModuleObject* module)
|
|||
}
|
||||
|
||||
void
|
||||
ModuleObject::fixEnvironmentsAfterCompartmentMerge(JSContext* cx)
|
||||
ModuleObject::fixEnvironmentsAfterCompartmentMerge()
|
||||
{
|
||||
AssertModuleScopesMatch(this);
|
||||
initialEnvironment().fixEnclosingEnvironmentAfterCompartmentMerge(script()->global());
|
||||
|
@ -1020,7 +1020,7 @@ GlobalObject::initModuleProto(JSContext* cx, Handle<GlobalObject*> global)
|
|||
JS_FS_END
|
||||
};
|
||||
|
||||
RootedObject proto(cx, global->createBlankPrototype<PlainObject>(cx));
|
||||
RootedObject proto(cx, GlobalObject::createBlankPrototype<PlainObject>(cx, global));
|
||||
if (!proto)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -244,7 +244,7 @@ class ModuleObject : public NativeObject
|
|||
#ifdef DEBUG
|
||||
static bool IsFrozen(JSContext* cx, HandleModuleObject self);
|
||||
#endif
|
||||
void fixEnvironmentsAfterCompartmentMerge(JSContext* cx);
|
||||
void fixEnvironmentsAfterCompartmentMerge();
|
||||
|
||||
JSScript* script() const;
|
||||
Scope* enclosingScope() const;
|
||||
|
|
|
@ -1408,8 +1408,8 @@ FinishObjectClassInit(JSContext* cx, JS::HandleObject ctor, JS::HandleObject pro
|
|||
* only set the [[Prototype]] if it hasn't already been set.
|
||||
*/
|
||||
Rooted<TaggedProto> tagged(cx, TaggedProto(proto));
|
||||
if (global->shouldSplicePrototype(cx)) {
|
||||
if (!global->splicePrototype(cx, global->getClass(), tagged))
|
||||
if (global->shouldSplicePrototype()) {
|
||||
if (!JSObject::splicePrototype(cx, global, global->getClass(), tagged))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -603,7 +603,7 @@ ResolvePromise(JSContext* cx, Handle<PromiseObject*> promise, HandleValue valueO
|
|||
|
||||
// Now that everything else is done, do the things the debugger needs.
|
||||
// Step 7 of RejectPromise implemented in onSettled.
|
||||
promise->onSettled(cx);
|
||||
PromiseObject::onSettled(cx, promise);
|
||||
|
||||
// Step 7 of FulfillPromise.
|
||||
// Step 8 of RejectPromise.
|
||||
|
@ -2631,14 +2631,14 @@ PromiseObject::dependentPromises(JSContext* cx, MutableHandle<GCVector<Value>> v
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
PromiseObject::resolve(JSContext* cx, HandleValue resolutionValue)
|
||||
/* static */ bool
|
||||
PromiseObject::resolve(JSContext* cx, Handle<PromiseObject*> promise, HandleValue resolutionValue)
|
||||
{
|
||||
MOZ_ASSERT(!PromiseHasAnyFlag(*this, PROMISE_FLAG_ASYNC));
|
||||
if (state() != JS::PromiseState::Pending)
|
||||
MOZ_ASSERT(!PromiseHasAnyFlag(*promise, PROMISE_FLAG_ASYNC));
|
||||
if (promise->state() != JS::PromiseState::Pending)
|
||||
return true;
|
||||
|
||||
RootedObject resolveFun(cx, GetResolveFunctionFromPromise(this));
|
||||
RootedObject resolveFun(cx, GetResolveFunctionFromPromise(promise));
|
||||
RootedValue funVal(cx, ObjectValue(*resolveFun));
|
||||
|
||||
// For xray'd Promises, the resolve fun may have been created in another
|
||||
|
@ -2654,14 +2654,14 @@ PromiseObject::resolve(JSContext* cx, HandleValue resolutionValue)
|
|||
return Call(cx, funVal, UndefinedHandleValue, args, &dummy);
|
||||
}
|
||||
|
||||
bool
|
||||
PromiseObject::reject(JSContext* cx, HandleValue rejectionValue)
|
||||
/* static */ bool
|
||||
PromiseObject::reject(JSContext* cx, Handle<PromiseObject*> promise, HandleValue rejectionValue)
|
||||
{
|
||||
MOZ_ASSERT(!PromiseHasAnyFlag(*this, PROMISE_FLAG_ASYNC));
|
||||
if (state() != JS::PromiseState::Pending)
|
||||
MOZ_ASSERT(!PromiseHasAnyFlag(*promise, PROMISE_FLAG_ASYNC));
|
||||
if (promise->state() != JS::PromiseState::Pending)
|
||||
return true;
|
||||
|
||||
RootedValue funVal(cx, this->getFixedSlot(PromiseSlot_RejectFunction));
|
||||
RootedValue funVal(cx, promise->getFixedSlot(PromiseSlot_RejectFunction));
|
||||
MOZ_ASSERT(IsCallable(funVal));
|
||||
|
||||
FixedInvokeArgs<1> args(cx);
|
||||
|
@ -2671,10 +2671,9 @@ PromiseObject::reject(JSContext* cx, HandleValue rejectionValue)
|
|||
return Call(cx, funVal, UndefinedHandleValue, args, &dummy);
|
||||
}
|
||||
|
||||
void
|
||||
PromiseObject::onSettled(JSContext* cx)
|
||||
/* static */ void
|
||||
PromiseObject::onSettled(JSContext* cx, Handle<PromiseObject*> promise)
|
||||
{
|
||||
Rooted<PromiseObject*> promise(cx, this);
|
||||
RootedObject stack(cx);
|
||||
if (cx->options().asyncStack() || cx->compartment()->isDebuggee()) {
|
||||
if (!JS::CaptureCurrentStack(cx, &stack, JS::StackCapture(JS::AllFrames()))) {
|
||||
|
@ -2734,7 +2733,7 @@ PromiseTask::executeAndFinish(JSContext* cx)
|
|||
static JSObject*
|
||||
CreatePromisePrototype(JSContext* cx, JSProtoKey key)
|
||||
{
|
||||
return cx->global()->createBlankPrototype(cx, &PromiseObject::protoClass_);
|
||||
return GlobalObject::createBlankPrototype(cx, cx->global(), &PromiseObject::protoClass_);
|
||||
}
|
||||
|
||||
static const JSFunctionSpec promise_methods[] = {
|
||||
|
|
|
@ -66,10 +66,12 @@ class PromiseObject : public NativeObject
|
|||
return getFixedSlot(PromiseSlot_ReactionsOrResult);
|
||||
}
|
||||
|
||||
MOZ_MUST_USE bool resolve(JSContext* cx, HandleValue resolutionValue);
|
||||
MOZ_MUST_USE bool reject(JSContext* cx, HandleValue rejectionValue);
|
||||
static MOZ_MUST_USE bool resolve(JSContext* cx, Handle<PromiseObject*> promise,
|
||||
HandleValue resolutionValue);
|
||||
static MOZ_MUST_USE bool reject(JSContext* cx, Handle<PromiseObject*> promise,
|
||||
HandleValue rejectionValue);
|
||||
|
||||
void onSettled(JSContext* cx);
|
||||
static void onSettled(JSContext* cx, Handle<PromiseObject*> promise);
|
||||
|
||||
double allocationTime() { return getFixedSlot(PromiseSlot_AllocationTime).toNumber(); }
|
||||
double resolutionTime() { return getFixedSlot(PromiseSlot_ResolutionTime).toNumber(); }
|
||||
|
|
|
@ -268,7 +268,8 @@ static const JSFunctionSpec methods[] = {
|
|||
JSObject*
|
||||
js::InitReflect(JSContext* cx, HandleObject obj)
|
||||
{
|
||||
RootedObject proto(cx, obj->as<GlobalObject>().getOrCreateObjectPrototype(cx));
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
RootedObject proto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -140,12 +140,12 @@ ExecuteRegExpImpl(JSContext* cx, RegExpStatics* res, RegExpShared& re, HandleLin
|
|||
|
||||
/* Legacy ExecuteRegExp behavior is baked into the JSAPI. */
|
||||
bool
|
||||
js::ExecuteRegExpLegacy(JSContext* cx, RegExpStatics* res, RegExpObject& reobj,
|
||||
js::ExecuteRegExpLegacy(JSContext* cx, RegExpStatics* res, Handle<RegExpObject*> reobj,
|
||||
HandleLinearString input, size_t* lastIndex, bool test,
|
||||
MutableHandleValue rval)
|
||||
{
|
||||
RegExpGuard shared(cx);
|
||||
if (!reobj.getShared(cx, &shared))
|
||||
if (!RegExpObject::getShared(cx, reobj, &shared))
|
||||
return false;
|
||||
|
||||
ScopedMatchPairs matches(&cx->tempLifoAlloc());
|
||||
|
@ -801,7 +801,7 @@ const JSFunctionSpec js::regexp_methods[] = {
|
|||
name(JSContext* cx, unsigned argc, Value* vp) \
|
||||
{ \
|
||||
CallArgs args = CallArgsFromVp(argc, vp); \
|
||||
RegExpStatics* res = cx->global()->getRegExpStatics(cx); \
|
||||
RegExpStatics* res = GlobalObject::getRegExpStatics(cx, cx->global()); \
|
||||
if (!res) \
|
||||
return false; \
|
||||
code; \
|
||||
|
@ -827,7 +827,7 @@ DEFINE_STATIC_GETTER(static_paren9_getter, STATIC_PAREN_GETTER_CODE(9))
|
|||
static bool \
|
||||
name(JSContext* cx, unsigned argc, Value* vp) \
|
||||
{ \
|
||||
RegExpStatics* res = cx->global()->getRegExpStatics(cx); \
|
||||
RegExpStatics* res = GlobalObject::getRegExpStatics(cx, cx->global()); \
|
||||
if (!res) \
|
||||
return false; \
|
||||
code; \
|
||||
|
@ -838,7 +838,7 @@ static bool
|
|||
static_input_setter(JSContext* cx, unsigned argc, Value* vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
RegExpStatics* res = cx->global()->getRegExpStatics(cx);
|
||||
RegExpStatics* res = GlobalObject::getRegExpStatics(cx, cx->global());
|
||||
if (!res)
|
||||
return false;
|
||||
|
||||
|
@ -918,12 +918,12 @@ ExecuteRegExp(JSContext* cx, HandleObject regexp, HandleString string,
|
|||
Rooted<RegExpObject*> reobj(cx, ®exp->as<RegExpObject>());
|
||||
|
||||
RegExpGuard re(cx);
|
||||
if (!reobj->getShared(cx, &re))
|
||||
if (!RegExpObject::getShared(cx, reobj, &re))
|
||||
return RegExpRunStatus_Error;
|
||||
|
||||
RegExpStatics* res;
|
||||
if (staticsUpdate == UpdateRegExpStatics) {
|
||||
res = cx->global()->getRegExpStatics(cx);
|
||||
res = GlobalObject::getRegExpStatics(cx, cx->global());
|
||||
if (!res)
|
||||
return RegExpRunStatus_Error;
|
||||
} else {
|
||||
|
@ -1725,7 +1725,7 @@ js::intrinsic_GetElemBaseForLambda(JSContext* cx, unsigned argc, Value* vp)
|
|||
if (!fun->isInterpreted() || fun->isClassConstructor())
|
||||
return true;
|
||||
|
||||
JSScript* script = fun->getOrCreateScript(cx);
|
||||
JSScript* script = JSFunction::getOrCreateScript(cx, fun);
|
||||
if (!script)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ enum RegExpStaticsUpdate { UpdateRegExpStatics, DontUpdateRegExpStatics };
|
|||
* |chars| and |length|.
|
||||
*/
|
||||
MOZ_MUST_USE bool
|
||||
ExecuteRegExpLegacy(JSContext* cx, RegExpStatics* res, RegExpObject& reobj,
|
||||
ExecuteRegExpLegacy(JSContext* cx, RegExpStatics* res, Handle<RegExpObject*> reobj,
|
||||
HandleLinearString input, size_t* lastIndex, bool test,
|
||||
MutableHandleValue rval);
|
||||
|
||||
|
|
|
@ -475,7 +475,7 @@ const Class SimdObject::class_ = {
|
|||
&SimdObjectClassOps
|
||||
};
|
||||
|
||||
bool
|
||||
/* static */ bool
|
||||
GlobalObject::initSimdObject(JSContext* cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
// SIMD relies on the TypedObject module being initialized.
|
||||
|
@ -483,11 +483,11 @@ GlobalObject::initSimdObject(JSContext* cx, Handle<GlobalObject*> global)
|
|||
// to be able to call GetTypedObjectModule(). It is NOT necessary
|
||||
// to install the TypedObjectModule global, but at the moment
|
||||
// those two things are not separable.
|
||||
if (!global->getOrCreateTypedObjectModule(cx))
|
||||
if (!GlobalObject::getOrCreateTypedObjectModule(cx, global))
|
||||
return false;
|
||||
|
||||
RootedObject globalSimdObject(cx);
|
||||
RootedObject objProto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
RootedObject objProto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!objProto)
|
||||
return false;
|
||||
|
||||
|
@ -510,7 +510,7 @@ static bool
|
|||
CreateSimdType(JSContext* cx, Handle<GlobalObject*> global, HandlePropertyName stringRepr,
|
||||
SimdType simdType, const JSFunctionSpec* methods)
|
||||
{
|
||||
RootedObject funcProto(cx, global->getOrCreateFunctionPrototype(cx));
|
||||
RootedObject funcProto(cx, GlobalObject::getOrCreateFunctionPrototype(cx, global));
|
||||
if (!funcProto)
|
||||
return false;
|
||||
|
||||
|
@ -531,7 +531,7 @@ CreateSimdType(JSContext* cx, Handle<GlobalObject*> global, HandlePropertyName s
|
|||
return false;
|
||||
|
||||
// Create prototype property, which inherits from Object.prototype.
|
||||
RootedObject objProto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
RootedObject objProto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!objProto)
|
||||
return false;
|
||||
Rooted<TypedProto*> proto(cx);
|
||||
|
@ -551,7 +551,7 @@ CreateSimdType(JSContext* cx, Handle<GlobalObject*> global, HandlePropertyName s
|
|||
}
|
||||
|
||||
// Bind type descriptor to the global SIMD object
|
||||
RootedObject globalSimdObject(cx, global->getOrCreateSimdGlobalObject(cx));
|
||||
RootedObject globalSimdObject(cx, GlobalObject::getOrCreateSimdGlobalObject(cx, global));
|
||||
MOZ_ASSERT(globalSimdObject);
|
||||
|
||||
RootedValue typeValue(cx, ObjectValue(*typeDescr));
|
||||
|
@ -568,7 +568,7 @@ CreateSimdType(JSContext* cx, Handle<GlobalObject*> global, HandlePropertyName s
|
|||
return !!typeDescr;
|
||||
}
|
||||
|
||||
bool
|
||||
/* static */ bool
|
||||
GlobalObject::initSimdType(JSContext* cx, Handle<GlobalObject*> global, SimdType simdType)
|
||||
{
|
||||
#define CREATE_(Type) \
|
||||
|
@ -584,13 +584,13 @@ GlobalObject::initSimdType(JSContext* cx, Handle<GlobalObject*> global, SimdType
|
|||
#undef CREATE_
|
||||
}
|
||||
|
||||
SimdTypeDescr*
|
||||
/* static */ SimdTypeDescr*
|
||||
GlobalObject::getOrCreateSimdTypeDescr(JSContext* cx, Handle<GlobalObject*> global,
|
||||
SimdType simdType)
|
||||
{
|
||||
MOZ_ASSERT(unsigned(simdType) < unsigned(SimdType::Count), "Invalid SIMD type");
|
||||
|
||||
RootedObject globalSimdObject(cx, global->getOrCreateSimdGlobalObject(cx));
|
||||
RootedObject globalSimdObject(cx, GlobalObject::getOrCreateSimdGlobalObject(cx, global));
|
||||
if (!globalSimdObject)
|
||||
return nullptr;
|
||||
|
||||
|
@ -628,8 +628,8 @@ SimdObject::resolve(JSContext* cx, JS::HandleObject obj, JS::HandleId id, bool*
|
|||
JSObject*
|
||||
js::InitSimdClass(JSContext* cx, HandleObject obj)
|
||||
{
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
return global->getOrCreateSimdGlobalObject(cx);
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
return GlobalObject::getOrCreateSimdGlobalObject(cx, global);
|
||||
}
|
||||
|
||||
template<typename V>
|
||||
|
|
|
@ -53,17 +53,17 @@ const JSFunctionSpec SymbolObject::staticMethods[] = {
|
|||
JSObject*
|
||||
SymbolObject::initClass(JSContext* cx, HandleObject obj)
|
||||
{
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
|
||||
// This uses &JSObject::class_ because: "The Symbol prototype object is an
|
||||
// ordinary object. It is not a Symbol instance and does not have a
|
||||
// [[SymbolData]] internal slot." (ES6 rev 24, 19.4.3)
|
||||
RootedObject proto(cx, global->createBlankPrototype<PlainObject>(cx));
|
||||
RootedObject proto(cx, GlobalObject::createBlankPrototype<PlainObject>(cx, global));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
|
||||
RootedFunction ctor(cx, global->createConstructor(cx, construct,
|
||||
ClassName(JSProto_Symbol, cx), 0));
|
||||
RootedFunction ctor(cx, GlobalObject::createConstructor(cx, construct,
|
||||
ClassName(JSProto_Symbol, cx), 0));
|
||||
if (!ctor)
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -3218,13 +3218,13 @@ ByteSizeOfScript(JSContext*cx, unsigned argc, Value* vp)
|
|||
return false;
|
||||
}
|
||||
|
||||
JSFunction* fun = &args[0].toObject().as<JSFunction>();
|
||||
RootedFunction fun(cx, &args[0].toObject().as<JSFunction>());
|
||||
if (fun->isNative()) {
|
||||
JS_ReportErrorASCII(cx, "Argument must be a scripted function");
|
||||
return false;
|
||||
}
|
||||
|
||||
RootedScript script(cx, fun->getOrCreateScript(cx));
|
||||
RootedScript script(cx, JSFunction::getOrCreateScript(cx, fun));
|
||||
if (!script)
|
||||
return false;
|
||||
|
||||
|
@ -3319,7 +3319,8 @@ GetConstructorName(JSContext* cx, unsigned argc, Value* vp)
|
|||
}
|
||||
|
||||
RootedAtom name(cx);
|
||||
if (!args[0].toObject().constructorDisplayAtom(cx, &name))
|
||||
RootedObject obj(cx, &args[0].toObject());
|
||||
if (!JSObject::constructorDisplayAtom(cx, obj, &name))
|
||||
return false;
|
||||
|
||||
if (name) {
|
||||
|
@ -4023,7 +4024,7 @@ DisRegExp(JSContext* cx, unsigned argc, Value* vp)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!reobj->dumpBytecode(cx, match_only, input))
|
||||
if (!RegExpObject::dumpBytecode(cx, reobj, match_only, input))
|
||||
return false;
|
||||
|
||||
args.rval().setUndefined();
|
||||
|
|
|
@ -1124,11 +1124,11 @@ DefineSimpleTypeDescr(JSContext* cx,
|
|||
typename T::Type type,
|
||||
HandlePropertyName className)
|
||||
{
|
||||
RootedObject objProto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
RootedObject objProto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!objProto)
|
||||
return false;
|
||||
|
||||
RootedObject funcProto(cx, global->getOrCreateFunctionPrototype(cx));
|
||||
RootedObject funcProto(cx, GlobalObject::getOrCreateFunctionPrototype(cx, global));
|
||||
if (!funcProto)
|
||||
return false;
|
||||
|
||||
|
@ -1185,7 +1185,7 @@ DefineMetaTypeDescr(JSContext* cx,
|
|||
if (!className)
|
||||
return nullptr;
|
||||
|
||||
RootedObject funcProto(cx, global->getOrCreateFunctionPrototype(cx));
|
||||
RootedObject funcProto(cx, GlobalObject::getOrCreateFunctionPrototype(cx, global));
|
||||
if (!funcProto)
|
||||
return nullptr;
|
||||
|
||||
|
@ -1197,7 +1197,7 @@ DefineMetaTypeDescr(JSContext* cx,
|
|||
|
||||
// Create ctor.prototype.prototype, which inherits from Object.__proto__
|
||||
|
||||
RootedObject objProto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
RootedObject objProto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!objProto)
|
||||
return nullptr;
|
||||
RootedObject protoProto(cx);
|
||||
|
@ -1216,7 +1216,7 @@ DefineMetaTypeDescr(JSContext* cx,
|
|||
|
||||
const int constructorLength = 2;
|
||||
RootedFunction ctor(cx);
|
||||
ctor = global->createConstructor(cx, T::construct, className, constructorLength);
|
||||
ctor = GlobalObject::createConstructor(cx, T::construct, className, constructorLength);
|
||||
if (!ctor ||
|
||||
!LinkConstructorAndPrototype(cx, ctor, proto) ||
|
||||
!DefinePropertiesAndFunctions(cx, proto,
|
||||
|
@ -1240,10 +1240,10 @@ DefineMetaTypeDescr(JSContext* cx,
|
|||
* initializer for the `TypedObject` class populate the
|
||||
* `TypedObject` global (which is referred to as "module" herein).
|
||||
*/
|
||||
bool
|
||||
/* static */ bool
|
||||
GlobalObject::initTypedObjectModule(JSContext* cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
RootedObject objProto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
RootedObject objProto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!objProto)
|
||||
return false;
|
||||
|
||||
|
@ -1317,9 +1317,8 @@ GlobalObject::initTypedObjectModule(JSContext* cx, Handle<GlobalObject*> global)
|
|||
JSObject*
|
||||
js::InitTypedObjectModuleObject(JSContext* cx, HandleObject obj)
|
||||
{
|
||||
MOZ_ASSERT(obj->is<GlobalObject>());
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
return global->getOrCreateTypedObjectModule(cx);
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
return GlobalObject::getOrCreateTypedObjectModule(cx, global);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
|
@ -350,14 +350,14 @@ InitWeakMapClass(JSContext* cx, HandleObject obj, bool defineMembers)
|
|||
{
|
||||
MOZ_ASSERT(obj->isNative());
|
||||
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
|
||||
RootedPlainObject proto(cx, NewBuiltinClassInstance<PlainObject>(cx));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
|
||||
RootedFunction ctor(cx, global->createConstructor(cx, WeakMap_construct,
|
||||
cx->names().WeakMap, 0));
|
||||
RootedFunction ctor(cx, GlobalObject::createConstructor(cx, WeakMap_construct,
|
||||
cx->names().WeakMap, 0));
|
||||
if (!ctor)
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -41,14 +41,15 @@ const JSFunctionSpec WeakSetObject::methods[] = {
|
|||
};
|
||||
|
||||
JSObject*
|
||||
WeakSetObject::initClass(JSContext* cx, JSObject* obj)
|
||||
WeakSetObject::initClass(JSContext* cx, HandleObject obj)
|
||||
{
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
RootedPlainObject proto(cx, NewBuiltinClassInstance<PlainObject>(cx));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
|
||||
Rooted<JSFunction*> ctor(cx, global->createConstructor(cx, construct, ClassName(JSProto_WeakSet, cx), 0));
|
||||
Rooted<JSFunction*> ctor(cx, GlobalObject::createConstructor(cx, construct,
|
||||
ClassName(JSProto_WeakSet, cx), 0));
|
||||
if (!ctor ||
|
||||
!LinkConstructorAndPrototype(cx, ctor, proto) ||
|
||||
!DefinePropertiesAndFunctions(cx, proto, properties, methods) ||
|
||||
|
|
|
@ -16,7 +16,7 @@ class WeakSetObject : public NativeObject
|
|||
public:
|
||||
static const unsigned RESERVED_SLOTS = 1;
|
||||
|
||||
static JSObject* initClass(JSContext* cx, JSObject* obj);
|
||||
static JSObject* initClass(JSContext* cx, HandleObject obj);
|
||||
static const Class class_;
|
||||
|
||||
private:
|
||||
|
|
|
@ -287,7 +287,8 @@ BytecodeCompiler::deoptimizeArgumentsInEnclosingScripts(JSContext* cx, HandleObj
|
|||
RootedObject env(cx, environment);
|
||||
while (env->is<EnvironmentObject>() || env->is<DebugEnvironmentProxy>()) {
|
||||
if (env->is<CallObject>()) {
|
||||
RootedScript script(cx, env->as<CallObject>().callee().getOrCreateScript(cx));
|
||||
RootedFunction fun(cx, &env->as<CallObject>().callee());
|
||||
RootedScript script(cx, JSFunction::getOrCreateScript(cx, fun));
|
||||
if (!script)
|
||||
return false;
|
||||
if (script->argumentsHasVarBinding()) {
|
||||
|
|
|
@ -2253,14 +2253,20 @@ DenseOrUnboxedArraySetElemStubExists(JSContext* cx, ICStub::Kind kind,
|
|||
for (ICStubConstIterator iter = stub->beginChainConst(); !iter.atEnd(); iter++) {
|
||||
if (kind == ICStub::SetElem_DenseOrUnboxedArray && iter->isSetElem_DenseOrUnboxedArray()) {
|
||||
ICSetElem_DenseOrUnboxedArray* nstub = iter->toSetElem_DenseOrUnboxedArray();
|
||||
if (obj->maybeShape() == nstub->shape() && obj->getGroup(cx) == nstub->group())
|
||||
if (obj->maybeShape() == nstub->shape() &&
|
||||
JSObject::getGroup(cx, obj) == nstub->group())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (kind == ICStub::SetElem_DenseOrUnboxedArrayAdd && iter->isSetElem_DenseOrUnboxedArrayAdd()) {
|
||||
ICSetElem_DenseOrUnboxedArrayAdd* nstub = iter->toSetElem_DenseOrUnboxedArrayAdd();
|
||||
if (obj->getGroup(cx) == nstub->group() && SetElemAddHasSameShapes(nstub, obj))
|
||||
if (JSObject::getGroup(cx, obj) == nstub->group() &&
|
||||
SetElemAddHasSameShapes(nstub, obj))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
@ -2446,7 +2452,7 @@ DoSetElemFallback(JSContext* cx, BaselineFrame* frame, ICSetElem_Fallback* stub_
|
|||
&addingCase, &protoDepth))
|
||||
{
|
||||
RootedShape shape(cx, obj->maybeShape());
|
||||
RootedObjectGroup group(cx, obj->getGroup(cx));
|
||||
RootedObjectGroup group(cx, JSObject::getGroup(cx, obj));
|
||||
if (!group)
|
||||
return false;
|
||||
|
||||
|
@ -4277,7 +4283,7 @@ DoSetPropFallback(JSContext* cx, BaselineFrame* frame, ICSetProp_Fallback* stub_
|
|||
if (!obj)
|
||||
return false;
|
||||
RootedShape oldShape(cx, obj->maybeShape());
|
||||
RootedObjectGroup oldGroup(cx, obj->getGroup(cx));
|
||||
RootedObjectGroup oldGroup(cx, JSObject::getGroup(cx, obj));
|
||||
if (!oldGroup)
|
||||
return false;
|
||||
RootedReceiverGuard oldGuard(cx, ReceiverGuard(obj));
|
||||
|
@ -5175,14 +5181,13 @@ GetTemplateObjectForNative(JSContext* cx, HandleFunction target, const CallArgs&
|
|||
|
||||
if (native == js::array_slice) {
|
||||
if (args.thisv().isObject()) {
|
||||
JSObject* obj = &args.thisv().toObject();
|
||||
RootedObject obj(cx, &args.thisv().toObject());
|
||||
if (!obj->isSingleton()) {
|
||||
if (obj->group()->maybePreliminaryObjects()) {
|
||||
*skipAttach = true;
|
||||
return true;
|
||||
}
|
||||
res.set(NewFullyAllocatedArrayTryReuseGroup(cx, &args.thisv().toObject(), 0,
|
||||
TenuredObject));
|
||||
res.set(NewFullyAllocatedArrayTryReuseGroup(cx, obj, 0, TenuredObject));
|
||||
return !!res;
|
||||
}
|
||||
}
|
||||
|
@ -7961,7 +7966,7 @@ ICUpdatedStub*
|
|||
ICSetElemDenseOrUnboxedArrayAddCompiler::getStubSpecific(ICStubSpace* space,
|
||||
Handle<ShapeVector> shapes)
|
||||
{
|
||||
RootedObjectGroup group(cx, obj_->getGroup(cx));
|
||||
RootedObjectGroup group(cx, JSObject::getGroup(cx, obj_));
|
||||
if (!group)
|
||||
return nullptr;
|
||||
Rooted<JitCode*> stubCode(cx, getStubCode());
|
||||
|
@ -8098,7 +8103,7 @@ ICSetProp_Native::ICSetProp_Native(JitCode* stubCode, ObjectGroup* group, Shape*
|
|||
ICSetProp_Native*
|
||||
ICSetProp_Native::Compiler::getStub(ICStubSpace* space)
|
||||
{
|
||||
RootedObjectGroup group(cx, obj_->getGroup(cx));
|
||||
RootedObjectGroup group(cx, JSObject::getGroup(cx, obj_));
|
||||
if (!group)
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -1940,7 +1940,7 @@ class ICSetPropNativeAddCompiler : public ICStubCompiler
|
|||
template <size_t ProtoChainDepth>
|
||||
ICUpdatedStub* getStubSpecific(ICStubSpace* space, Handle<ShapeVector> shapes)
|
||||
{
|
||||
RootedObjectGroup newGroup(cx, obj_->getGroup(cx));
|
||||
RootedObjectGroup newGroup(cx, JSObject::getGroup(cx, obj_));
|
||||
if (!newGroup)
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -273,7 +273,7 @@ jit::BaselineCompile(JSContext* cx, JSScript* script, bool forceDebugInstrumenta
|
|||
MOZ_ASSERT(script->canBaselineCompile());
|
||||
MOZ_ASSERT(IsBaselineEnabled(cx));
|
||||
|
||||
script->ensureNonLazyCanonicalFunction(cx);
|
||||
script->ensureNonLazyCanonicalFunction();
|
||||
|
||||
LifoAlloc alloc(TempAllocator::PreferredLifoChunkSize);
|
||||
TempAllocator* temp = alloc.new_<TempAllocator>(&alloc);
|
||||
|
|
|
@ -1053,7 +1053,7 @@ PrepareAndExecuteRegExp(JSContext* cx, MacroAssembler& masm, Register regexp, Re
|
|||
|
||||
Address pairsVectorAddress(masm.getStackPointer(), pairsVectorStartOffset);
|
||||
|
||||
RegExpStatics* res = cx->global()->getRegExpStatics(cx);
|
||||
RegExpStatics* res = GlobalObject::getRegExpStatics(cx, cx->global());
|
||||
if (!res)
|
||||
return false;
|
||||
#ifdef JS_USE_LINK_REGISTER
|
||||
|
|
|
@ -2153,7 +2153,7 @@ IonCompile(JSContext* cx, JSScript* script,
|
|||
|
||||
// Make sure the script's canonical function isn't lazy. We can't de-lazify
|
||||
// it in a helper thread.
|
||||
script->ensureNonLazyCanonicalFunction(cx);
|
||||
script->ensureNonLazyCanonicalFunction();
|
||||
|
||||
TrackPropertiesForSingletonScopes(cx, script, baselineFrame);
|
||||
|
||||
|
|
|
@ -4055,7 +4055,7 @@ AnalyzePoppedThis(JSContext* cx, ObjectGroup* group,
|
|||
// Add the property to the object, being careful not to update type information.
|
||||
DebugOnly<unsigned> slotSpan = baseobj->slotSpan();
|
||||
MOZ_ASSERT(!baseobj->containsPure(id));
|
||||
if (!baseobj->addDataProperty(cx, id, baseobj->slotSpan(), JSPROP_ENUMERATE))
|
||||
if (!NativeObject::addDataProperty(cx, baseobj, id, baseobj->slotSpan(), JSPROP_ENUMERATE))
|
||||
return false;
|
||||
MOZ_ASSERT(baseobj->slotSpan() != slotSpan);
|
||||
MOZ_ASSERT(!baseobj->inDictionaryMode());
|
||||
|
@ -4132,7 +4132,7 @@ CmpInstructions(const void* a, const void* b)
|
|||
}
|
||||
|
||||
bool
|
||||
jit::AnalyzeNewScriptDefiniteProperties(JSContext* cx, JSFunction* fun,
|
||||
jit::AnalyzeNewScriptDefiniteProperties(JSContext* cx, HandleFunction fun,
|
||||
ObjectGroup* group, HandlePlainObject baseobj,
|
||||
Vector<TypeNewScript::Initializer>* initializerList)
|
||||
{
|
||||
|
@ -4142,7 +4142,7 @@ jit::AnalyzeNewScriptDefiniteProperties(JSContext* cx, JSFunction* fun,
|
|||
// which will definitely be added to the created object before it has a
|
||||
// chance to escape and be accessed elsewhere.
|
||||
|
||||
RootedScript script(cx, fun->getOrCreateScript(cx));
|
||||
RootedScript script(cx, JSFunction::getOrCreateScript(cx, fun));
|
||||
if (!script)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -196,7 +196,7 @@ MCompare*
|
|||
ConvertLinearInequality(TempAllocator& alloc, MBasicBlock* block, const LinearSum& sum);
|
||||
|
||||
MOZ_MUST_USE bool
|
||||
AnalyzeNewScriptDefiniteProperties(JSContext* cx, JSFunction* fun,
|
||||
AnalyzeNewScriptDefiniteProperties(JSContext* cx, HandleFunction fun,
|
||||
ObjectGroup* group, HandlePlainObject baseobj,
|
||||
Vector<TypeNewScript::Initializer>* initializerList);
|
||||
|
||||
|
|
|
@ -466,7 +466,8 @@ IonBuilder::canInlineTarget(JSFunction* target, CallInfo& callInfo)
|
|||
// Allow constructing lazy scripts when performing the definite properties
|
||||
// analysis, as baseline has not been used to warm the caller up yet.
|
||||
if (target->isInterpreted() && info().analysisMode() == Analysis_DefiniteProperties) {
|
||||
RootedScript script(analysisContext, target->getOrCreateScript(analysisContext));
|
||||
RootedFunction fun(analysisContext, target);
|
||||
RootedScript script(analysisContext, JSFunction::getOrCreateScript(analysisContext, fun));
|
||||
if (!script)
|
||||
return InliningDecision_Error;
|
||||
|
||||
|
|
|
@ -3316,7 +3316,7 @@ SetPropertyIC::update(JSContext* cx, HandleScript outerScript, size_t cacheIndex
|
|||
RootedObjectGroup oldGroup(cx);
|
||||
RootedShape oldShape(cx);
|
||||
if (cache.canAttachStub()) {
|
||||
oldGroup = obj->getGroup(cx);
|
||||
oldGroup = JSObject::getGroup(cx, obj);
|
||||
if (!oldGroup)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -555,7 +555,7 @@ CreateThis(JSContext* cx, HandleObject callee, HandleObject newTarget, MutableHa
|
|||
if (callee->is<JSFunction>()) {
|
||||
RootedFunction fun(cx, &callee->as<JSFunction>());
|
||||
if (fun->isInterpreted() && fun->isConstructor()) {
|
||||
JSScript* script = fun->getOrCreateScript(cx);
|
||||
JSScript* script = JSFunction::getOrCreateScript(cx, fun);
|
||||
if (!script || !script->ensureHasTypes(cx))
|
||||
return false;
|
||||
if (fun->isBoundFunction() || script->isDerivedClassConstructor()) {
|
||||
|
|
|
@ -646,7 +646,7 @@ BEGIN_TEST(test_JS_ubi_Node_scriptFilename)
|
|||
CHECK(obj->is<JSFunction>());
|
||||
JS::RootedFunction func(cx, &obj->as<JSFunction>());
|
||||
|
||||
JS::RootedScript script(cx, func->getOrCreateScript(cx));
|
||||
JS::RootedScript script(cx, JSFunction::getOrCreateScript(cx, func));
|
||||
CHECK(script);
|
||||
CHECK(script->filename());
|
||||
|
||||
|
|
|
@ -1022,7 +1022,7 @@ JS_ResolveStandardClass(JSContext* cx, HandleObject obj, HandleId id, bool* reso
|
|||
CHECK_REQUEST(cx);
|
||||
assertSameCompartment(cx, obj, id);
|
||||
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
*resolved = false;
|
||||
|
||||
if (!JSID_IS_ATOM(id))
|
||||
|
@ -1066,10 +1066,7 @@ JS_ResolveStandardClass(JSContext* cx, HandleObject obj, HandleId id, bool* reso
|
|||
// more way: its prototype chain is lazily initialized. That is,
|
||||
// global->getProto() might be null right now because we haven't created
|
||||
// Object.prototype yet. Force it now.
|
||||
if (!global->getOrCreateObjectPrototype(cx))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
return GlobalObject::getOrCreateObjectPrototype(cx, global);
|
||||
}
|
||||
|
||||
JS_PUBLIC_API(bool)
|
||||
|
@ -1102,8 +1099,7 @@ JS_EnumerateStandardClasses(JSContext* cx, HandleObject obj)
|
|||
AssertHeapIsIdle(cx);
|
||||
CHECK_REQUEST(cx);
|
||||
assertSameCompartment(cx, obj);
|
||||
MOZ_ASSERT(obj->is<GlobalObject>());
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
return GlobalObject::initStandardClasses(cx, global);
|
||||
}
|
||||
|
||||
|
@ -1159,7 +1155,8 @@ JS_GetObjectPrototype(JSContext* cx, HandleObject forObj)
|
|||
{
|
||||
CHECK_REQUEST(cx);
|
||||
assertSameCompartment(cx, forObj);
|
||||
return forObj->global().getOrCreateObjectPrototype(cx);
|
||||
Rooted<GlobalObject*> global(cx, &forObj->global());
|
||||
return GlobalObject::getOrCreateObjectPrototype(cx, global);
|
||||
}
|
||||
|
||||
JS_PUBLIC_API(JSObject*)
|
||||
|
@ -1167,7 +1164,8 @@ JS_GetFunctionPrototype(JSContext* cx, HandleObject forObj)
|
|||
{
|
||||
CHECK_REQUEST(cx);
|
||||
assertSameCompartment(cx, forObj);
|
||||
return forObj->global().getOrCreateFunctionPrototype(cx);
|
||||
Rooted<GlobalObject*> global(cx, &forObj->global());
|
||||
return GlobalObject::getOrCreateFunctionPrototype(cx, global);
|
||||
}
|
||||
|
||||
JS_PUBLIC_API(JSObject*)
|
||||
|
@ -3489,7 +3487,7 @@ CreateNonSyntacticEnvironmentChain(JSContext* cx, AutoObjectVector& envChain,
|
|||
// declaration was qualified by "var". There is only sadness.
|
||||
//
|
||||
// See JSObject::isQualifiedVarObj.
|
||||
if (!env->setQualifiedVarObj(cx))
|
||||
if (!JSObject::setQualifiedVarObj(cx, env))
|
||||
return false;
|
||||
|
||||
// Also get a non-syntactic lexical environment to capture 'let' and
|
||||
|
@ -3549,7 +3547,7 @@ CloneFunctionObject(JSContext* cx, HandleObject funobj, HandleObject env, Handle
|
|||
RootedFunction fun(cx, &funobj->as<JSFunction>());
|
||||
if (fun->isInterpretedLazy()) {
|
||||
AutoCompartment ac(cx, funobj);
|
||||
if (!fun->getOrCreateScript(cx))
|
||||
if (!JSFunction::getOrCreateScript(cx, fun))
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -3581,7 +3579,7 @@ CloneFunctionObject(JSContext* cx, HandleObject funobj, HandleObject env, Handle
|
|||
// Fail here if we OOM during debug asserting.
|
||||
// CloneFunctionReuseScript will delazify the script anyways, so we
|
||||
// are not creating an extra failure condition for DEBUG builds.
|
||||
if (!fun->getOrCreateScript(cx))
|
||||
if (!JSFunction::getOrCreateScript(cx, fun))
|
||||
return nullptr;
|
||||
MOZ_ASSERT(scope->as<GlobalScope>().isSyntactic() ||
|
||||
fun->nonLazyScript()->hasNonSyntacticScope());
|
||||
|
@ -4234,7 +4232,7 @@ JS_GetFunctionScript(JSContext* cx, HandleFunction fun)
|
|||
return nullptr;
|
||||
if (fun->isInterpretedLazy()) {
|
||||
AutoCompartment funCompartment(cx, fun);
|
||||
JSScript* script = fun->getOrCreateScript(cx);
|
||||
JSScript* script = JSFunction::getOrCreateScript(cx, fun);
|
||||
if (!script)
|
||||
MOZ_CRASH();
|
||||
return script;
|
||||
|
@ -4405,14 +4403,15 @@ JS_DecompileScript(JSContext* cx, HandleScript script, const char* name, unsigne
|
|||
|
||||
AssertHeapIsIdle(cx);
|
||||
CHECK_REQUEST(cx);
|
||||
script->ensureNonLazyCanonicalFunction(cx);
|
||||
script->ensureNonLazyCanonicalFunction();
|
||||
RootedFunction fun(cx, script->functionNonDelazifying());
|
||||
if (fun)
|
||||
return JS_DecompileFunction(cx, fun, indent);
|
||||
bool haveSource = script->scriptSource()->hasSourceData();
|
||||
if (!haveSource && !JSScript::loadSource(cx, script->scriptSource(), &haveSource))
|
||||
return nullptr;
|
||||
return haveSource ? script->sourceData(cx) : NewStringCopyZ<CanGC>(cx, "[no source]");
|
||||
return haveSource ? JSScript::sourceData(cx, script)
|
||||
: NewStringCopyZ<CanGC>(cx, "[no source]");
|
||||
}
|
||||
|
||||
JS_PUBLIC_API(JSString*)
|
||||
|
@ -4926,8 +4925,8 @@ ResolveOrRejectPromise(JSContext* cx, JS::HandleObject promiseObj, JS::HandleVal
|
|||
}
|
||||
|
||||
return reject
|
||||
? promise->reject(cx, resultOrReason)
|
||||
: promise->resolve(cx, resultOrReason);
|
||||
? PromiseObject::reject(cx, promise, resultOrReason)
|
||||
: PromiseObject::resolve(cx, promise, resultOrReason);
|
||||
}
|
||||
|
||||
JS_PUBLIC_API(bool)
|
||||
|
@ -6014,7 +6013,8 @@ JS_SetRegExpInput(JSContext* cx, HandleObject obj, HandleString input)
|
|||
CHECK_REQUEST(cx);
|
||||
assertSameCompartment(cx, input);
|
||||
|
||||
RegExpStatics* res = obj->as<GlobalObject>().getRegExpStatics(cx);
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
RegExpStatics* res = GlobalObject::getRegExpStatics(cx, global);
|
||||
if (!res)
|
||||
return false;
|
||||
|
||||
|
@ -6029,7 +6029,8 @@ JS_ClearRegExpStatics(JSContext* cx, HandleObject obj)
|
|||
CHECK_REQUEST(cx);
|
||||
MOZ_ASSERT(obj);
|
||||
|
||||
RegExpStatics* res = obj->as<GlobalObject>().getRegExpStatics(cx);
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
RegExpStatics* res = GlobalObject::getRegExpStatics(cx, global);
|
||||
if (!res)
|
||||
return false;
|
||||
|
||||
|
@ -6044,7 +6045,8 @@ JS_ExecuteRegExp(JSContext* cx, HandleObject obj, HandleObject reobj, char16_t*
|
|||
AssertHeapIsIdle(cx);
|
||||
CHECK_REQUEST(cx);
|
||||
|
||||
RegExpStatics* res = obj->as<GlobalObject>().getRegExpStatics(cx);
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
RegExpStatics* res = GlobalObject::getRegExpStatics(cx, global);
|
||||
if (!res)
|
||||
return false;
|
||||
|
||||
|
@ -6052,7 +6054,7 @@ JS_ExecuteRegExp(JSContext* cx, HandleObject obj, HandleObject reobj, char16_t*
|
|||
if (!input)
|
||||
return false;
|
||||
|
||||
return ExecuteRegExpLegacy(cx, res, reobj->as<RegExpObject>(), input, indexp, test, rval);
|
||||
return ExecuteRegExpLegacy(cx, res, reobj.as<RegExpObject>(), input, indexp, test, rval);
|
||||
}
|
||||
|
||||
JS_PUBLIC_API(bool)
|
||||
|
@ -6066,7 +6068,7 @@ JS_ExecuteRegExpNoStatics(JSContext* cx, HandleObject obj, char16_t* chars, size
|
|||
if (!input)
|
||||
return false;
|
||||
|
||||
return ExecuteRegExpLegacy(cx, nullptr, obj->as<RegExpObject>(), input, indexp, test,
|
||||
return ExecuteRegExpLegacy(cx, nullptr, obj.as<RegExpObject>(), input, indexp, test,
|
||||
rval);
|
||||
}
|
||||
|
||||
|
|
|
@ -602,7 +602,7 @@ js::ArraySetLength(JSContext* cx, Handle<ArrayObject*> arr, HandleId id,
|
|||
// for..in iteration over the array. Keys deleted before being reached
|
||||
// during the iteration must not be visited, and suppressing them here
|
||||
// would be too costly.
|
||||
ObjectGroup* arrGroup = arr->getGroup(cx);
|
||||
ObjectGroup* arrGroup = JSObject::getGroup(cx, arr);
|
||||
if (MOZ_UNLIKELY(!arrGroup))
|
||||
return false;
|
||||
if (!arr->isIndexed() && !MOZ_UNLIKELY(arrGroup->hasAllFlags(OBJECT_FLAG_ITERATED))) {
|
||||
|
@ -1285,7 +1285,7 @@ InitArrayElements(JSContext* cx, HandleObject obj, uint32_t start,
|
|||
if (count == 0)
|
||||
return true;
|
||||
|
||||
ObjectGroup* group = obj->getGroup(cx);
|
||||
ObjectGroup* group = JSObject::getGroup(cx, obj);
|
||||
if (!group)
|
||||
return false;
|
||||
|
||||
|
@ -1662,11 +1662,11 @@ MatchNumericComparator(JSContext* cx, const Value& v)
|
|||
if (!obj.is<JSFunction>())
|
||||
return Match_None;
|
||||
|
||||
JSFunction* fun = &obj.as<JSFunction>();
|
||||
RootedFunction fun(cx, &obj.as<JSFunction>());
|
||||
if (!fun->isInterpreted() || fun->isClassConstructor())
|
||||
return Match_None;
|
||||
|
||||
JSScript* script = fun->getOrCreateScript(cx);
|
||||
JSScript* script = JSFunction::getOrCreateScript(cx, fun);
|
||||
if (!script)
|
||||
return Match_Failure;
|
||||
|
||||
|
@ -2144,7 +2144,7 @@ ArrayShiftDenseKernel(JSContext* cx, HandleObject obj, MutableHandleValue rval)
|
|||
if (ObjectMayHaveExtraIndexedProperties(obj))
|
||||
return DenseElementResult::Incomplete;
|
||||
|
||||
RootedObjectGroup group(cx, obj->getGroup(cx));
|
||||
RootedObjectGroup group(cx, JSObject::getGroup(cx, obj));
|
||||
if (MOZ_UNLIKELY(!group))
|
||||
return DenseElementResult::Failure;
|
||||
|
||||
|
@ -2340,7 +2340,7 @@ CanOptimizeForDenseStorage(HandleObject arr, uint32_t startingIndex, uint32_t co
|
|||
* deleted if a hole is moved from one location to another location not yet
|
||||
* visited. See bug 690622.
|
||||
*/
|
||||
ObjectGroup* arrGroup = arr->getGroup(cx);
|
||||
ObjectGroup* arrGroup = JSObject::getGroup(cx, arr);
|
||||
if (!arrGroup) {
|
||||
cx->recoverFromOutOfMemory();
|
||||
return false;
|
||||
|
@ -3246,7 +3246,7 @@ static JSObject*
|
|||
CreateArrayPrototype(JSContext* cx, JSProtoKey key)
|
||||
{
|
||||
MOZ_ASSERT(key == JSProto_Array);
|
||||
RootedObject proto(cx, cx->global()->getOrCreateObjectPrototype(cx));
|
||||
RootedObject proto(cx, GlobalObject::getOrCreateObjectPrototype(cx, cx->global()));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
|
||||
|
@ -3266,7 +3266,7 @@ CreateArrayPrototype(JSContext* cx, JSProtoKey key)
|
|||
metadata));
|
||||
if (!arrayProto ||
|
||||
!JSObject::setSingleton(cx, arrayProto) ||
|
||||
!arrayProto->setDelegate(cx) ||
|
||||
!JSObject::setDelegate(cx, arrayProto) ||
|
||||
!AddLengthProperty(cx, arrayProto))
|
||||
{
|
||||
return nullptr;
|
||||
|
@ -3586,7 +3586,7 @@ js::NewPartlyAllocatedArrayTryUseGroup(ExclusiveContext* cx, HandleObjectGroup g
|
|||
// will have unknown property types.
|
||||
template <uint32_t maxLength>
|
||||
static inline ArrayObject*
|
||||
NewArrayTryReuseGroup(JSContext* cx, JSObject* obj, size_t length,
|
||||
NewArrayTryReuseGroup(JSContext* cx, HandleObject obj, size_t length,
|
||||
NewObjectKind newKind = GenericObject)
|
||||
{
|
||||
if (!obj->is<ArrayObject>())
|
||||
|
@ -3595,7 +3595,7 @@ NewArrayTryReuseGroup(JSContext* cx, JSObject* obj, size_t length,
|
|||
if (obj->staticPrototype() != cx->global()->maybeGetArrayPrototype())
|
||||
return NewArray<maxLength>(cx, length, nullptr, newKind);
|
||||
|
||||
RootedObjectGroup group(cx, obj->getGroup(cx));
|
||||
RootedObjectGroup group(cx, JSObject::getGroup(cx, obj));
|
||||
if (!group)
|
||||
return nullptr;
|
||||
|
||||
|
@ -3603,14 +3603,14 @@ NewArrayTryReuseGroup(JSContext* cx, JSObject* obj, size_t length,
|
|||
}
|
||||
|
||||
ArrayObject*
|
||||
js::NewFullyAllocatedArrayTryReuseGroup(JSContext* cx, JSObject* obj, size_t length,
|
||||
js::NewFullyAllocatedArrayTryReuseGroup(JSContext* cx, HandleObject obj, size_t length,
|
||||
NewObjectKind newKind)
|
||||
{
|
||||
return NewArrayTryReuseGroup<UINT32_MAX>(cx, obj, length, newKind);
|
||||
}
|
||||
|
||||
ArrayObject*
|
||||
js::NewPartlyAllocatedArrayTryReuseGroup(JSContext* cx, JSObject* obj, size_t length)
|
||||
js::NewPartlyAllocatedArrayTryReuseGroup(JSContext* cx, HandleObject obj, size_t length)
|
||||
{
|
||||
return NewArrayTryReuseGroup<ArrayObject::EagerAllocationMaxLength>(cx, obj, length);
|
||||
}
|
||||
|
|
|
@ -83,11 +83,11 @@ extern ArrayObject*
|
|||
NewPartlyAllocatedArrayTryUseGroup(ExclusiveContext* cx, HandleObjectGroup group, size_t length);
|
||||
|
||||
extern ArrayObject*
|
||||
NewFullyAllocatedArrayTryReuseGroup(JSContext* cx, JSObject* obj, size_t length,
|
||||
NewFullyAllocatedArrayTryReuseGroup(JSContext* cx, HandleObject obj, size_t length,
|
||||
NewObjectKind newKind = GenericObject);
|
||||
|
||||
extern ArrayObject*
|
||||
NewPartlyAllocatedArrayTryReuseGroup(JSContext* cx, JSObject* obj, size_t length);
|
||||
NewPartlyAllocatedArrayTryReuseGroup(JSContext* cx, HandleObject obj, size_t length);
|
||||
|
||||
extern ArrayObject*
|
||||
NewFullyAllocatedArrayForCallingAllocationSite(JSContext* cx, size_t length,
|
||||
|
|
|
@ -137,14 +137,14 @@ js::InitBooleanClass(JSContext* cx, HandleObject obj)
|
|||
{
|
||||
MOZ_ASSERT(obj->isNative());
|
||||
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
|
||||
Rooted<BooleanObject*> booleanProto(cx, global->createBlankPrototype<BooleanObject>(cx));
|
||||
Rooted<BooleanObject*> booleanProto(cx, GlobalObject::createBlankPrototype<BooleanObject>(cx, global));
|
||||
if (!booleanProto)
|
||||
return nullptr;
|
||||
booleanProto->setFixedSlot(BooleanObject::PRIMITIVE_VALUE_SLOT, BooleanValue(false));
|
||||
|
||||
RootedFunction ctor(cx, global->createConstructor(cx, Boolean, cx->names().Boolean, 1));
|
||||
RootedFunction ctor(cx, GlobalObject::createConstructor(cx, Boolean, cx->names().Boolean, 1));
|
||||
if (!ctor)
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -1075,18 +1075,18 @@ CreateLazyScriptsForCompartment(JSContext* cx)
|
|||
// Create scripts for each lazy function, updating the list of functions to
|
||||
// process with any newly exposed inner functions in created scripts.
|
||||
// A function cannot be delazified until its outer script exists.
|
||||
RootedFunction fun(cx);
|
||||
for (size_t i = 0; i < lazyFunctions.length(); i++) {
|
||||
JSFunction* fun = &lazyFunctions[i]->as<JSFunction>();
|
||||
fun = &lazyFunctions[i]->as<JSFunction>();
|
||||
|
||||
// lazyFunctions may have been populated with multiple functions for
|
||||
// a lazy script.
|
||||
if (!fun->isInterpretedLazy())
|
||||
continue;
|
||||
|
||||
LazyScript* lazy = fun->lazyScript();
|
||||
bool lazyScriptHadNoScript = !lazy->maybeScript();
|
||||
bool lazyScriptHadNoScript = !fun->lazyScript()->maybeScript();
|
||||
|
||||
JSScript* script = fun->getOrCreateScript(cx);
|
||||
JSScript* script = JSFunction::getOrCreateScript(cx, fun);
|
||||
if (!script)
|
||||
return false;
|
||||
if (lazyScriptHadNoScript && !AddInnerLazyFunctionsFromScript(script, lazyFunctions))
|
||||
|
|
|
@ -3163,7 +3163,7 @@ js::DateConstructor(JSContext* cx, unsigned argc, Value* vp)
|
|||
static JSObject*
|
||||
CreateDatePrototype(JSContext* cx, JSProtoKey key)
|
||||
{
|
||||
return cx->global()->createBlankPrototype(cx, &DateObject::protoClass_);
|
||||
return GlobalObject::createBlankPrototype(cx, cx->global(), &DateObject::protoClass_);
|
||||
}
|
||||
|
||||
static bool
|
||||
|
|
|
@ -512,14 +512,17 @@ ErrorObject::createProto(JSContext* cx, JSProtoKey key)
|
|||
{
|
||||
JSExnType type = ExnTypeFromProtoKey(key);
|
||||
|
||||
if (type == JSEXN_ERR)
|
||||
return cx->global()->createBlankPrototype(cx, &ErrorObject::protoClasses[JSEXN_ERR]);
|
||||
if (type == JSEXN_ERR) {
|
||||
return GlobalObject::createBlankPrototype(cx, cx->global(),
|
||||
&ErrorObject::protoClasses[JSEXN_ERR]);
|
||||
}
|
||||
|
||||
RootedObject protoProto(cx, GlobalObject::getOrCreateErrorPrototype(cx, cx->global()));
|
||||
if (!protoProto)
|
||||
return nullptr;
|
||||
|
||||
return cx->global()->createBlankPrototypeInheriting(cx, &ErrorObject::protoClasses[type],
|
||||
return GlobalObject::createBlankPrototypeInheriting(cx, cx->global(),
|
||||
&ErrorObject::protoClasses[type],
|
||||
protoProto);
|
||||
}
|
||||
|
||||
|
|
|
@ -113,7 +113,7 @@ JS_SplicePrototype(JSContext* cx, HandleObject obj, HandleObject proto)
|
|||
}
|
||||
|
||||
Rooted<TaggedProto> tagged(cx, TaggedProto(proto));
|
||||
return obj->splicePrototype(cx, obj->getClass(), tagged);
|
||||
return JSObject::splicePrototype(cx, obj, obj->getClass(), tagged);
|
||||
}
|
||||
|
||||
JS_FRIEND_API(JSObject*)
|
||||
|
|
|
@ -379,7 +379,7 @@ ResolveInterpretedFunctionPrototype(JSContext* cx, HandleFunction fun, HandleId
|
|||
if (isStarGenerator)
|
||||
objProto = GlobalObject::getOrCreateStarGeneratorObjectPrototype(cx, global);
|
||||
else
|
||||
objProto = fun->global().getOrCreateObjectPrototype(cx);
|
||||
objProto = GlobalObject::getOrCreateObjectPrototype(cx, global);
|
||||
if (!objProto)
|
||||
return false;
|
||||
|
||||
|
@ -476,7 +476,7 @@ fun_resolve(JSContext* cx, HandleObject obj, HandleId id, bool* resolvedp)
|
|||
if (fun->hasResolvedLength())
|
||||
return true;
|
||||
|
||||
if (!fun->getUnresolvedLength(cx, &v))
|
||||
if (!JSFunction::getUnresolvedLength(cx, fun, &v))
|
||||
return false;
|
||||
} else {
|
||||
if (fun->hasResolvedName())
|
||||
|
@ -826,7 +826,7 @@ CreateFunctionPrototype(JSContext* cx, JSProtoKey key)
|
|||
return nullptr;
|
||||
|
||||
functionProto->initScript(script);
|
||||
ObjectGroup* protoGroup = functionProto->getGroup(cx);
|
||||
ObjectGroup* protoGroup = JSObject::getGroup(cx, functionProto);
|
||||
if (!protoGroup)
|
||||
return nullptr;
|
||||
|
||||
|
@ -902,7 +902,7 @@ const Class* const js::FunctionClassPtr = &JSFunction::class_;
|
|||
JSString*
|
||||
js::FunctionToString(JSContext* cx, HandleFunction fun, bool prettyPrint)
|
||||
{
|
||||
if (fun->isInterpretedLazy() && !fun->getOrCreateScript(cx))
|
||||
if (fun->isInterpretedLazy() && !JSFunction::getOrCreateScript(cx, fun))
|
||||
return nullptr;
|
||||
|
||||
if (IsAsmJSModule(fun))
|
||||
|
@ -973,7 +973,7 @@ js::FunctionToString(JSContext* cx, HandleFunction fun, bool prettyPrint)
|
|||
};
|
||||
|
||||
if (haveSource) {
|
||||
Rooted<JSFlatString*> src(cx, script->sourceDataWithPrelude(cx));
|
||||
Rooted<JSFlatString*> src(cx, JSScript::sourceDataWithPrelude(cx, script));
|
||||
if (!src)
|
||||
return nullptr;
|
||||
|
||||
|
@ -1242,34 +1242,33 @@ JSFunction::isDerivedClassConstructor()
|
|||
return derived;
|
||||
}
|
||||
|
||||
bool
|
||||
JSFunction::getLength(JSContext* cx, uint16_t* length)
|
||||
/* static */ bool
|
||||
JSFunction::getLength(JSContext* cx, HandleFunction fun, uint16_t* length)
|
||||
{
|
||||
JS::RootedFunction self(cx, this);
|
||||
MOZ_ASSERT(!self->isBoundFunction());
|
||||
if (self->isInterpretedLazy() && !self->getOrCreateScript(cx))
|
||||
MOZ_ASSERT(!fun->isBoundFunction());
|
||||
if (fun->isInterpretedLazy() && !getOrCreateScript(cx, fun))
|
||||
return false;
|
||||
|
||||
*length = self->isNative() ? self->nargs() : self->nonLazyScript()->funLength();
|
||||
*length = fun->isNative() ? fun->nargs() : fun->nonLazyScript()->funLength();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
JSFunction::getUnresolvedLength(JSContext* cx, MutableHandleValue v)
|
||||
/* static */ bool
|
||||
JSFunction::getUnresolvedLength(JSContext* cx, HandleFunction fun, MutableHandleValue v)
|
||||
{
|
||||
MOZ_ASSERT(!IsInternalFunctionObject(*this));
|
||||
MOZ_ASSERT(!hasResolvedLength());
|
||||
MOZ_ASSERT(!IsInternalFunctionObject(*fun));
|
||||
MOZ_ASSERT(!fun->hasResolvedLength());
|
||||
|
||||
// Bound functions' length can have values up to MAX_SAFE_INTEGER, so
|
||||
// they're handled differently from other functions.
|
||||
if (isBoundFunction()) {
|
||||
MOZ_ASSERT(getExtendedSlot(BOUND_FUN_LENGTH_SLOT).isNumber());
|
||||
v.set(getExtendedSlot(BOUND_FUN_LENGTH_SLOT));
|
||||
if (fun->isBoundFunction()) {
|
||||
MOZ_ASSERT(fun->getExtendedSlot(BOUND_FUN_LENGTH_SLOT).isNumber());
|
||||
v.set(fun->getExtendedSlot(BOUND_FUN_LENGTH_SLOT));
|
||||
return true;
|
||||
}
|
||||
|
||||
uint16_t length;
|
||||
if (!getLength(cx, &length))
|
||||
if (!JSFunction::getLength(cx, fun, &length))
|
||||
return false;
|
||||
|
||||
v.setInt32(length);
|
||||
|
@ -1326,13 +1325,11 @@ GetBoundFunctionArguments(const JSFunction* boundFun)
|
|||
}
|
||||
|
||||
const js::Value&
|
||||
JSFunction::getBoundFunctionArgument(JSContext* cx, unsigned which) const
|
||||
JSFunction::getBoundFunctionArgument(unsigned which) const
|
||||
{
|
||||
MOZ_ASSERT(which < getBoundFunctionArgumentCount());
|
||||
|
||||
RootedArrayObject boundArgs(cx, GetBoundFunctionArguments(this));
|
||||
RootedValue res(cx);
|
||||
return boundArgs->getDenseElement(which);
|
||||
return GetBoundFunctionArguments(this)->getDenseElement(which);
|
||||
}
|
||||
|
||||
size_t
|
||||
|
@ -1369,7 +1366,7 @@ JSFunction::createScriptForLazilyInterpretedFunction(JSContext* cx, HandleFuncti
|
|||
}
|
||||
|
||||
if (fun != lazy->functionNonDelazifying()) {
|
||||
if (!lazy->functionDelazifying(cx))
|
||||
if (!LazyScript::functionDelazifying(cx, lazy))
|
||||
return false;
|
||||
script = lazy->functionNonDelazifying()->nonLazyScript();
|
||||
if (!script)
|
||||
|
|
|
@ -306,7 +306,8 @@ class JSFunction : public js::NativeObject
|
|||
nonLazyScript()->setAsyncKind(asyncKind);
|
||||
}
|
||||
|
||||
bool getUnresolvedLength(JSContext* cx, js::MutableHandleValue v);
|
||||
static bool getUnresolvedLength(JSContext* cx, js::HandleFunction fun,
|
||||
js::MutableHandleValue v);
|
||||
|
||||
JSAtom* getUnresolvedName(JSContext* cx);
|
||||
|
||||
|
@ -411,16 +412,15 @@ class JSFunction : public js::NativeObject
|
|||
//
|
||||
// - For functions known to have a JSScript, nonLazyScript() will get it.
|
||||
|
||||
JSScript* getOrCreateScript(JSContext* cx) {
|
||||
MOZ_ASSERT(isInterpreted());
|
||||
static JSScript* getOrCreateScript(JSContext* cx, js::HandleFunction fun) {
|
||||
MOZ_ASSERT(fun->isInterpreted());
|
||||
MOZ_ASSERT(cx);
|
||||
if (isInterpretedLazy()) {
|
||||
JS::RootedFunction self(cx, this);
|
||||
if (!createScriptForLazilyInterpretedFunction(cx, self))
|
||||
if (fun->isInterpretedLazy()) {
|
||||
if (!createScriptForLazilyInterpretedFunction(cx, fun))
|
||||
return nullptr;
|
||||
return self->nonLazyScript();
|
||||
return fun->nonLazyScript();
|
||||
}
|
||||
return nonLazyScript();
|
||||
return fun->nonLazyScript();
|
||||
}
|
||||
|
||||
JSScript* existingScriptNonDelazifying() const {
|
||||
|
@ -478,7 +478,7 @@ class JSFunction : public js::NativeObject
|
|||
return u.i.s.script_;
|
||||
}
|
||||
|
||||
bool getLength(JSContext* cx, uint16_t* length);
|
||||
static bool getLength(JSContext* cx, js::HandleFunction fun, uint16_t* length);
|
||||
|
||||
js::LazyScript* lazyScript() const {
|
||||
MOZ_ASSERT(isInterpretedLazy() && u.i.s.lazy_);
|
||||
|
@ -591,7 +591,7 @@ class JSFunction : public js::NativeObject
|
|||
|
||||
JSObject* getBoundFunctionTarget() const;
|
||||
const js::Value& getBoundFunctionThis() const;
|
||||
const js::Value& getBoundFunctionArgument(JSContext* cx, unsigned which) const;
|
||||
const js::Value& getBoundFunctionArgument(unsigned which) const;
|
||||
size_t getBoundFunctionArgumentCount() const;
|
||||
|
||||
private:
|
||||
|
|
|
@ -88,7 +88,7 @@ CloneFunctionObjectIfNotSingleton(JSContext* cx, HandleFunction fun, HandleObjec
|
|||
if (CanReuseScriptForClone(cx->compartment(), fun, parent))
|
||||
return CloneFunctionReuseScript(cx, fun, parent, kind, newKind, proto);
|
||||
|
||||
RootedScript script(cx, fun->getOrCreateScript(cx));
|
||||
RootedScript script(cx, JSFunction::getOrCreateScript(cx, fun));
|
||||
if (!script)
|
||||
return nullptr;
|
||||
RootedScope enclosingScope(cx, script->enclosingScope());
|
||||
|
|
|
@ -654,7 +654,7 @@ VectorToKeyIterator(JSContext* cx, HandleObject obj, unsigned flags, AutoIdVecto
|
|||
{
|
||||
MOZ_ASSERT(!(flags & JSITER_FOREACH));
|
||||
|
||||
if (obj->isSingleton() && !obj->setIteratedSingleton(cx))
|
||||
if (obj->isSingleton() && !JSObject::setIteratedSingleton(cx, obj))
|
||||
return false;
|
||||
MarkObjectGroupFlags(cx, obj, OBJECT_FLAG_ITERATED);
|
||||
|
||||
|
@ -698,7 +698,7 @@ VectorToValueIterator(JSContext* cx, HandleObject obj, unsigned flags, AutoIdVec
|
|||
{
|
||||
MOZ_ASSERT(flags & JSITER_FOREACH);
|
||||
|
||||
if (obj->isSingleton() && !obj->setIteratedSingleton(cx))
|
||||
if (obj->isSingleton() && !JSObject::setIteratedSingleton(cx, obj))
|
||||
return false;
|
||||
MarkObjectGroupFlags(cx, obj, OBJECT_FLAG_ITERATED);
|
||||
|
||||
|
@ -921,7 +921,7 @@ js::CreateItrResultObject(JSContext* cx, HandleValue value, bool done)
|
|||
// FIXME: We can cache the iterator result object shape somewhere.
|
||||
AssertHeapIsIdle(cx);
|
||||
|
||||
RootedObject proto(cx, cx->global()->getOrCreateObjectPrototype(cx));
|
||||
RootedObject proto(cx, GlobalObject::getOrCreateObjectPrototype(cx, cx->global()));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
|
||||
|
@ -1497,7 +1497,7 @@ GlobalObject::initIteratorProto(JSContext* cx, Handle<GlobalObject*> global)
|
|||
if (global->getReservedSlot(ITERATOR_PROTO).isObject())
|
||||
return true;
|
||||
|
||||
RootedObject proto(cx, global->createBlankPrototype<PlainObject>(cx));
|
||||
RootedObject proto(cx, GlobalObject::createBlankPrototype<PlainObject>(cx, global));
|
||||
if (!proto || !DefinePropertiesAndFunctions(cx, proto, nullptr, iterator_proto_methods))
|
||||
return false;
|
||||
|
||||
|
@ -1516,7 +1516,8 @@ GlobalObject::initArrayIteratorProto(JSContext* cx, Handle<GlobalObject*> global
|
|||
return false;
|
||||
|
||||
const Class* cls = &ArrayIteratorPrototypeClass;
|
||||
RootedObject proto(cx, global->createBlankPrototypeInheriting(cx, cls, iteratorProto));
|
||||
RootedObject proto(cx, GlobalObject::createBlankPrototypeInheriting(cx, global, cls,
|
||||
iteratorProto));
|
||||
if (!proto ||
|
||||
!DefinePropertiesAndFunctions(cx, proto, nullptr, array_iterator_methods) ||
|
||||
!DefineToStringTag(cx, proto, cx->names().ArrayIterator))
|
||||
|
@ -1539,7 +1540,8 @@ GlobalObject::initStringIteratorProto(JSContext* cx, Handle<GlobalObject*> globa
|
|||
return false;
|
||||
|
||||
const Class* cls = &StringIteratorPrototypeClass;
|
||||
RootedObject proto(cx, global->createBlankPrototypeInheriting(cx, cls, iteratorProto));
|
||||
RootedObject proto(cx, GlobalObject::createBlankPrototypeInheriting(cx, global, cls,
|
||||
iteratorProto));
|
||||
if (!proto ||
|
||||
!DefinePropertiesAndFunctions(cx, proto, nullptr, string_iterator_methods) ||
|
||||
!DefineToStringTag(cx, proto, cx->names().StringIterator))
|
||||
|
@ -1560,7 +1562,8 @@ js::InitLegacyIteratorClass(JSContext* cx, HandleObject obj)
|
|||
return &global->getPrototype(JSProto_Iterator).toObject();
|
||||
|
||||
RootedObject iteratorProto(cx);
|
||||
iteratorProto = global->createBlankPrototype(cx, &PropertyIteratorObject::class_);
|
||||
iteratorProto = GlobalObject::createBlankPrototype(cx, global,
|
||||
&PropertyIteratorObject::class_);
|
||||
if (!iteratorProto)
|
||||
return nullptr;
|
||||
|
||||
|
@ -1572,7 +1575,7 @@ js::InitLegacyIteratorClass(JSContext* cx, HandleObject obj)
|
|||
ni->init(nullptr, nullptr, 0 /* flags */, 0, 0);
|
||||
|
||||
Rooted<JSFunction*> ctor(cx);
|
||||
ctor = global->createConstructor(cx, IteratorConstructor, cx->names().Iterator, 2);
|
||||
ctor = GlobalObject::createConstructor(cx, IteratorConstructor, cx->names().Iterator, 2);
|
||||
if (!ctor)
|
||||
return nullptr;
|
||||
if (!LinkConstructorAndPrototype(cx, ctor, iteratorProto))
|
||||
|
@ -1593,7 +1596,8 @@ js::InitStopIterationClass(JSContext* cx, HandleObject obj)
|
|||
{
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
if (!global->getPrototype(JSProto_StopIteration).isObject()) {
|
||||
RootedObject proto(cx, global->createBlankPrototype(cx, &StopIterationObject::class_));
|
||||
RootedObject proto(cx, GlobalObject::createBlankPrototype(cx, global,
|
||||
&StopIterationObject::class_));
|
||||
if (!proto || !FreezeObject(cx, proto))
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -1417,7 +1417,8 @@ static const JSFunctionSpec math_static_methods[] = {
|
|||
JSObject*
|
||||
js::InitMathClass(JSContext* cx, HandleObject obj)
|
||||
{
|
||||
RootedObject proto(cx, obj->as<GlobalObject>().getOrCreateObjectPrototype(cx));
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
RootedObject proto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
RootedObject Math(cx, NewObjectWithGivenProto(cx, &MathClass, proto, SingletonObject));
|
||||
|
|
|
@ -1005,15 +1005,16 @@ js::InitNumberClass(JSContext* cx, HandleObject obj)
|
|||
/* XXX must do at least once per new thread, so do it per JSContext... */
|
||||
FIX_FPU();
|
||||
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
|
||||
RootedObject numberProto(cx, global->createBlankPrototype(cx, &NumberObject::class_));
|
||||
RootedObject numberProto(cx, GlobalObject::createBlankPrototype(cx, global,
|
||||
&NumberObject::class_));
|
||||
if (!numberProto)
|
||||
return nullptr;
|
||||
numberProto->as<NumberObject>().setPrimitiveValue(0);
|
||||
|
||||
RootedFunction ctor(cx);
|
||||
ctor = global->createConstructor(cx, Number, cx->names().Number, 1);
|
||||
ctor = GlobalObject::createConstructor(cx, Number, cx->names().Number, 1);
|
||||
if (!ctor)
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -884,7 +884,7 @@ CreateThisForFunctionWithGroup(JSContext* cx, HandleObjectGroup group,
|
|||
|
||||
if (newKind == SingletonObject) {
|
||||
Rooted<TaggedProto> proto(cx, TaggedProto(templateObject->staticPrototype()));
|
||||
if (!res->splicePrototype(cx, &PlainObject::class_, proto))
|
||||
if (!JSObject::splicePrototype(cx, res, &PlainObject::class_, proto))
|
||||
return nullptr;
|
||||
} else {
|
||||
res->setGroup(group);
|
||||
|
@ -952,7 +952,7 @@ js::CreateThisForFunctionWithProto(JSContext* cx, HandleObject callee, HandleObj
|
|||
}
|
||||
|
||||
if (res) {
|
||||
JSScript* script = callee->as<JSFunction>().getOrCreateScript(cx);
|
||||
JSScript* script = JSFunction::getOrCreateScript(cx, callee.as<JSFunction>());
|
||||
if (!script)
|
||||
return nullptr;
|
||||
TypeScript::SetThis(cx, script, TypeSet::ObjectType(res));
|
||||
|
@ -1430,40 +1430,41 @@ js::XDRObjectLiteral(XDRState<XDR_ENCODE>* xdr, MutableHandleObject obj);
|
|||
template bool
|
||||
js::XDRObjectLiteral(XDRState<XDR_DECODE>* xdr, MutableHandleObject obj);
|
||||
|
||||
bool
|
||||
NativeObject::fillInAfterSwap(JSContext* cx, const Vector<Value>& values, void* priv)
|
||||
/* static */ bool
|
||||
NativeObject::fillInAfterSwap(JSContext* cx, HandleNativeObject obj,
|
||||
const Vector<Value>& values, void* priv)
|
||||
{
|
||||
// This object has just been swapped with some other object, and its shape
|
||||
// no longer reflects its allocated size. Correct this information and
|
||||
// fill the slots in with the specified values.
|
||||
MOZ_ASSERT(slotSpan() == values.length());
|
||||
MOZ_ASSERT(obj->slotSpan() == values.length());
|
||||
|
||||
// Make sure the shape's numFixedSlots() is correct.
|
||||
size_t nfixed = gc::GetGCKindSlots(asTenured().getAllocKind(), getClass());
|
||||
if (nfixed != shape_->numFixedSlots()) {
|
||||
if (!generateOwnShape(cx))
|
||||
size_t nfixed = gc::GetGCKindSlots(obj->asTenured().getAllocKind(), obj->getClass());
|
||||
if (nfixed != obj->shape_->numFixedSlots()) {
|
||||
if (!NativeObject::generateOwnShape(cx, obj))
|
||||
return false;
|
||||
shape_->setNumFixedSlots(nfixed);
|
||||
obj->shape_->setNumFixedSlots(nfixed);
|
||||
}
|
||||
|
||||
if (hasPrivate())
|
||||
setPrivate(priv);
|
||||
if (obj->hasPrivate())
|
||||
obj->setPrivate(priv);
|
||||
else
|
||||
MOZ_ASSERT(!priv);
|
||||
|
||||
if (slots_) {
|
||||
js_free(slots_);
|
||||
slots_ = nullptr;
|
||||
if (obj->slots_) {
|
||||
js_free(obj->slots_);
|
||||
obj->slots_ = nullptr;
|
||||
}
|
||||
|
||||
if (size_t ndynamic = dynamicSlotsCount(nfixed, values.length(), getClass())) {
|
||||
slots_ = cx->zone()->pod_malloc<HeapSlot>(ndynamic);
|
||||
if (!slots_)
|
||||
if (size_t ndynamic = dynamicSlotsCount(nfixed, values.length(), obj->getClass())) {
|
||||
obj->slots_ = cx->zone()->pod_malloc<HeapSlot>(ndynamic);
|
||||
if (!obj->slots_)
|
||||
return false;
|
||||
Debug_SetSlotRangeToCrashOnTouch(slots_, ndynamic);
|
||||
Debug_SetSlotRangeToCrashOnTouch(obj->slots_, ndynamic);
|
||||
}
|
||||
|
||||
initSlotRange(0, values.begin(), values.length());
|
||||
obj->initSlotRange(0, values.begin(), values.length());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1489,9 +1490,9 @@ JSObject::swap(JSContext* cx, HandleObject a, HandleObject b)
|
|||
|
||||
AutoCompartment ac(cx, a);
|
||||
|
||||
if (!a->getGroup(cx))
|
||||
if (!JSObject::getGroup(cx, a))
|
||||
oomUnsafe.crash("JSObject::swap");
|
||||
if (!b->getGroup(cx))
|
||||
if (!JSObject::getGroup(cx, b))
|
||||
oomUnsafe.crash("JSObject::swap");
|
||||
|
||||
/*
|
||||
|
@ -1573,10 +1574,14 @@ JSObject::swap(JSContext* cx, HandleObject a, HandleObject b)
|
|||
a->fixDictionaryShapeAfterSwap();
|
||||
b->fixDictionaryShapeAfterSwap();
|
||||
|
||||
if (na && !b->as<NativeObject>().fillInAfterSwap(cx, avals, apriv))
|
||||
oomUnsafe.crash("fillInAfterSwap");
|
||||
if (nb && !a->as<NativeObject>().fillInAfterSwap(cx, bvals, bpriv))
|
||||
oomUnsafe.crash("fillInAfterSwap");
|
||||
if (na) {
|
||||
if (!NativeObject::fillInAfterSwap(cx, b.as<NativeObject>(), avals, apriv))
|
||||
oomUnsafe.crash("fillInAfterSwap");
|
||||
}
|
||||
if (nb) {
|
||||
if (!NativeObject::fillInAfterSwap(cx, a.as<NativeObject>(), bvals, bpriv))
|
||||
oomUnsafe.crash("fillInAfterSwap");
|
||||
}
|
||||
}
|
||||
|
||||
// Swapping the contents of two objects invalidates type sets which contain
|
||||
|
@ -1722,7 +1727,7 @@ DefineConstructorAndPrototype(JSContext* cx, HandleObject obj, JSProtoKey key, H
|
|||
|
||||
/* Bootstrap Function.prototype (see also JS_InitStandardClasses). */
|
||||
Rooted<TaggedProto> tagged(cx, TaggedProto(proto));
|
||||
if (ctor->getClass() == clasp && !ctor->splicePrototype(cx, clasp, tagged))
|
||||
if (ctor->getClass() == clasp && !JSObject::splicePrototype(cx, ctor, clasp, tagged))
|
||||
goto bad;
|
||||
}
|
||||
|
||||
|
@ -1839,10 +1844,10 @@ js::SetClassAndProto(JSContext* cx, HandleObject obj,
|
|||
// We always generate a new shape if the object is a singleton,
|
||||
// regardless of the uncacheable-proto flag. ICs may rely on
|
||||
// this.
|
||||
if (!oldproto->as<NativeObject>().generateOwnShape(cx))
|
||||
if (!NativeObject::generateOwnShape(cx, oldproto.as<NativeObject>()))
|
||||
return false;
|
||||
} else {
|
||||
if (!oldproto->setUncacheableProto(cx))
|
||||
if (!JSObject::setUncacheableProto(cx, oldproto))
|
||||
return false;
|
||||
}
|
||||
if (!obj->isDelegate()) {
|
||||
|
@ -1854,15 +1859,18 @@ js::SetClassAndProto(JSContext* cx, HandleObject obj,
|
|||
oldproto = oldproto->staticPrototype();
|
||||
}
|
||||
|
||||
if (proto.isObject() && !proto.toObject()->setDelegate(cx))
|
||||
return false;
|
||||
if (proto.isObject()) {
|
||||
RootedObject protoObj(cx, proto.toObject());
|
||||
if (!JSObject::setDelegate(cx, protoObj))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (obj->isSingleton()) {
|
||||
/*
|
||||
* Just splice the prototype, but mark the properties as unknown for
|
||||
* consistent behavior.
|
||||
*/
|
||||
if (!obj->splicePrototype(cx, clasp, proto))
|
||||
if (!JSObject::splicePrototype(cx, obj, clasp, proto))
|
||||
return false;
|
||||
MarkObjectGroupUnknownProperties(cx, obj->group());
|
||||
return true;
|
||||
|
@ -1982,7 +1990,8 @@ js::GetObjectFromIncumbentGlobal(JSContext* cx, MutableHandleObject obj)
|
|||
|
||||
{
|
||||
AutoCompartment ac(cx, globalObj);
|
||||
obj.set(globalObj->as<GlobalObject>().getOrCreateObjectPrototype(cx));
|
||||
Handle<GlobalObject*> global = globalObj.as<GlobalObject>();
|
||||
obj.set(GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!obj)
|
||||
return false;
|
||||
}
|
||||
|
@ -2195,7 +2204,8 @@ js::LookupNameUnqualified(JSContext* cx, HandlePropertyName name, HandleObject e
|
|||
// environments.
|
||||
if (env->is<DebugEnvironmentProxy>()) {
|
||||
RootedValue v(cx);
|
||||
if (!env->as<DebugEnvironmentProxy>().getMaybeSentinelValue(cx, id, &v))
|
||||
Rooted<DebugEnvironmentProxy*> envProxy(cx, &env->as<DebugEnvironmentProxy>());
|
||||
if (!DebugEnvironmentProxy::getMaybeSentinelValue(cx, envProxy, id, &v))
|
||||
return false;
|
||||
isTDZ = IsUninitializedLexical(v);
|
||||
} else {
|
||||
|
@ -2451,7 +2461,7 @@ js::HasOwnDataPropertyPure(JSContext* cx, JSObject* obj, jsid id, bool* result)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
/* static */ bool
|
||||
JSObject::reportReadOnly(JSContext* cx, jsid id, unsigned report)
|
||||
{
|
||||
RootedValue val(cx, IdToValue(id));
|
||||
|
@ -2460,7 +2470,7 @@ JSObject::reportReadOnly(JSContext* cx, jsid id, unsigned report)
|
|||
nullptr, nullptr);
|
||||
}
|
||||
|
||||
bool
|
||||
/* static */ bool
|
||||
JSObject::reportNotConfigurable(JSContext* cx, jsid id, unsigned report)
|
||||
{
|
||||
RootedValue val(cx, IdToValue(id));
|
||||
|
@ -2469,10 +2479,10 @@ JSObject::reportNotConfigurable(JSContext* cx, jsid id, unsigned report)
|
|||
nullptr, nullptr);
|
||||
}
|
||||
|
||||
bool
|
||||
JSObject::reportNotExtensible(JSContext* cx, unsigned report)
|
||||
/* static */ bool
|
||||
JSObject::reportNotExtensible(JSContext* cx, HandleObject obj, unsigned report)
|
||||
{
|
||||
RootedValue val(cx, ObjectValue(*this));
|
||||
RootedValue val(cx, ObjectValue(*obj));
|
||||
return ReportValueErrorFlags(cx, report, JSMSG_OBJECT_NOT_EXTENSIBLE,
|
||||
JSDVG_IGNORE_STACK, val, nullptr,
|
||||
nullptr, nullptr);
|
||||
|
@ -2544,7 +2554,7 @@ js::SetPrototype(JSContext* cx, HandleObject obj, HandleObject proto, JS::Object
|
|||
// [[Prototype]] chain is always properly immutable, even in the presence
|
||||
// of lazy standard classes.
|
||||
if (obj->is<GlobalObject>()) {
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
if (!GlobalObject::ensureConstructor(cx, global, JSProto_Object))
|
||||
return false;
|
||||
}
|
||||
|
@ -2611,7 +2621,7 @@ js::PreventExtensions(JSContext* cx, HandleObject obj, ObjectOpResult& result, I
|
|||
}
|
||||
}
|
||||
|
||||
if (!obj->setFlags(cx, BaseShape::NOT_EXTENSIBLE, JSObject::GENERATE_SHAPE)) {
|
||||
if (!JSObject::setFlags(cx, obj, BaseShape::NOT_EXTENSIBLE, JSObject::GENERATE_SHAPE)) {
|
||||
// We failed to mark the object non-extensible, so reset the frozen
|
||||
// flag on the elements.
|
||||
MOZ_ASSERT(obj->nonProxyIsExtensible());
|
||||
|
@ -2751,7 +2761,7 @@ js::SetImmutablePrototype(ExclusiveContext* cx, HandleObject obj, bool* succeede
|
|||
return Proxy::setImmutablePrototype(cx->asJSContext(), obj, succeeded);
|
||||
}
|
||||
|
||||
if (!obj->setFlags(cx, BaseShape::IMMUTABLE_PROTOTYPE))
|
||||
if (!JSObject::setFlags(cx, obj, BaseShape::IMMUTABLE_PROTOTYPE))
|
||||
return false;
|
||||
*succeeded = true;
|
||||
return true;
|
||||
|
@ -3849,10 +3859,10 @@ displayAtomFromObjectGroup(ObjectGroup& group)
|
|||
return script->function()->displayAtom();
|
||||
}
|
||||
|
||||
bool
|
||||
JSObject::constructorDisplayAtom(JSContext* cx, js::MutableHandleAtom name)
|
||||
/* static */ bool
|
||||
JSObject::constructorDisplayAtom(JSContext* cx, js::HandleObject obj, js::MutableHandleAtom name)
|
||||
{
|
||||
ObjectGroup *g = getGroup(cx);
|
||||
ObjectGroup *g = JSObject::getGroup(cx, obj);
|
||||
if (!g)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -200,8 +200,8 @@ class JSObject : public js::gc::Cell
|
|||
GENERATE_SHAPE
|
||||
};
|
||||
|
||||
bool setFlags(js::ExclusiveContext* cx, js::BaseShape::Flag flags,
|
||||
GenerateShape generateShape = GENERATE_NONE);
|
||||
static bool setFlags(js::ExclusiveContext* cx, JS::HandleObject obj, js::BaseShape::Flag flags,
|
||||
GenerateShape generateShape = GENERATE_NONE);
|
||||
inline bool hasAllFlags(js::BaseShape::Flag flags) const;
|
||||
|
||||
/*
|
||||
|
@ -214,16 +214,16 @@ class JSObject : public js::gc::Cell
|
|||
* (see Purge{Scope,Proto}Chain in jsobj.cpp).
|
||||
*/
|
||||
inline bool isDelegate() const;
|
||||
bool setDelegate(js::ExclusiveContext* cx) {
|
||||
return setFlags(cx, js::BaseShape::DELEGATE, GENERATE_SHAPE);
|
||||
static bool setDelegate(js::ExclusiveContext* cx, JS::HandleObject obj) {
|
||||
return setFlags(cx, obj, js::BaseShape::DELEGATE, GENERATE_SHAPE);
|
||||
}
|
||||
|
||||
inline bool isBoundFunction() const;
|
||||
inline bool hasSpecialEquality() const;
|
||||
|
||||
inline bool watched() const;
|
||||
bool setWatched(js::ExclusiveContext* cx) {
|
||||
return setFlags(cx, js::BaseShape::WATCHED, GENERATE_SHAPE);
|
||||
static bool setWatched(js::ExclusiveContext* cx, JS::HandleObject obj) {
|
||||
return setFlags(cx, obj, js::BaseShape::WATCHED, GENERATE_SHAPE);
|
||||
}
|
||||
|
||||
// A "qualified" varobj is the object on which "qualified" variable
|
||||
|
@ -247,8 +247,8 @@ class JSObject : public js::gc::Cell
|
|||
// (e.g., Gecko and XPConnect), as they often wish to run scripts under a
|
||||
// scope that captures var bindings.
|
||||
inline bool isQualifiedVarObj() const;
|
||||
bool setQualifiedVarObj(js::ExclusiveContext* cx) {
|
||||
return setFlags(cx, js::BaseShape::QUALIFIED_VAROBJ);
|
||||
static bool setQualifiedVarObj(js::ExclusiveContext* cx, JS::HandleObject obj) {
|
||||
return setFlags(cx, obj, js::BaseShape::QUALIFIED_VAROBJ);
|
||||
}
|
||||
|
||||
// An "unqualified" varobj is the object on which "unqualified"
|
||||
|
@ -262,11 +262,11 @@ class JSObject : public js::gc::Cell
|
|||
// generate a new shape when their prototype changes, regardless of this
|
||||
// hasUncacheableProto flag.
|
||||
inline bool hasUncacheableProto() const;
|
||||
bool setUncacheableProto(js::ExclusiveContext* cx) {
|
||||
MOZ_ASSERT(hasStaticPrototype(),
|
||||
static bool setUncacheableProto(js::ExclusiveContext* cx, JS::HandleObject obj) {
|
||||
MOZ_ASSERT(obj->hasStaticPrototype(),
|
||||
"uncacheability as a concept is only applicable to static "
|
||||
"(not dynamically-computed) prototypes");
|
||||
return setFlags(cx, js::BaseShape::UNCACHEABLE_PROTO, GENERATE_SHAPE);
|
||||
return setFlags(cx, obj, js::BaseShape::UNCACHEABLE_PROTO, GENERATE_SHAPE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -274,8 +274,8 @@ class JSObject : public js::gc::Cell
|
|||
* PropertyTree::MAX_HEIGHT.
|
||||
*/
|
||||
inline bool hadElementsAccess() const;
|
||||
bool setHadElementsAccess(js::ExclusiveContext* cx) {
|
||||
return setFlags(cx, js::BaseShape::HAD_ELEMENTS_ACCESS);
|
||||
static bool setHadElementsAccess(js::ExclusiveContext* cx, JS::HandleObject obj) {
|
||||
return setFlags(cx, obj, js::BaseShape::HAD_ELEMENTS_ACCESS);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -288,7 +288,8 @@ class JSObject : public js::gc::Cell
|
|||
* If this object was instantiated with `new Ctor`, return the constructor's
|
||||
* display atom. Otherwise, return nullptr.
|
||||
*/
|
||||
bool constructorDisplayAtom(JSContext* cx, js::MutableHandleAtom name);
|
||||
static bool constructorDisplayAtom(JSContext* cx, js::HandleObject obj,
|
||||
js::MutableHandleAtom name);
|
||||
|
||||
/*
|
||||
* The same as constructorDisplayAtom above, however if this object has a
|
||||
|
@ -348,7 +349,7 @@ class JSObject : public js::gc::Cell
|
|||
// Change an existing object to have a singleton group.
|
||||
static bool changeToSingleton(JSContext* cx, js::HandleObject obj);
|
||||
|
||||
inline js::ObjectGroup* getGroup(JSContext* cx);
|
||||
static inline js::ObjectGroup* getGroup(JSContext* cx, js::HandleObject obj);
|
||||
|
||||
const js::GCPtrObjectGroup& groupFromGC() const {
|
||||
/* Direct field access for use by GC. */
|
||||
|
@ -420,8 +421,8 @@ class JSObject : public js::gc::Cell
|
|||
* is purged on GC.
|
||||
*/
|
||||
inline bool isIteratedSingleton() const;
|
||||
bool setIteratedSingleton(js::ExclusiveContext* cx) {
|
||||
return setFlags(cx, js::BaseShape::ITERATED_SINGLETON);
|
||||
static bool setIteratedSingleton(js::ExclusiveContext* cx, JS::HandleObject obj) {
|
||||
return setFlags(cx, obj, js::BaseShape::ITERATED_SINGLETON);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -433,18 +434,19 @@ class JSObject : public js::gc::Cell
|
|||
|
||||
// Mark an object as having its 'new' script information cleared.
|
||||
inline bool wasNewScriptCleared() const;
|
||||
bool setNewScriptCleared(js::ExclusiveContext* cx) {
|
||||
return setFlags(cx, js::BaseShape::NEW_SCRIPT_CLEARED);
|
||||
static bool setNewScriptCleared(js::ExclusiveContext* cx, JS::HandleObject obj) {
|
||||
return setFlags(cx, obj, js::BaseShape::NEW_SCRIPT_CLEARED);
|
||||
}
|
||||
|
||||
/* Set a new prototype for an object with a singleton type. */
|
||||
bool splicePrototype(JSContext* cx, const js::Class* clasp, js::Handle<js::TaggedProto> proto);
|
||||
static bool splicePrototype(JSContext* cx, js::HandleObject obj, const js::Class* clasp,
|
||||
js::Handle<js::TaggedProto> proto);
|
||||
|
||||
/*
|
||||
* For bootstrapping, whether to splice a prototype for Function.prototype
|
||||
* or the global object.
|
||||
*/
|
||||
bool shouldSplicePrototype(JSContext* cx);
|
||||
bool shouldSplicePrototype();
|
||||
|
||||
/*
|
||||
* Environment chains.
|
||||
|
@ -518,8 +520,9 @@ class JSObject : public js::gc::Cell
|
|||
|
||||
public:
|
||||
static bool reportReadOnly(JSContext* cx, jsid id, unsigned report = JSREPORT_ERROR);
|
||||
bool reportNotConfigurable(JSContext* cx, jsid id, unsigned report = JSREPORT_ERROR);
|
||||
bool reportNotExtensible(JSContext* cx, unsigned report = JSREPORT_ERROR);
|
||||
static bool reportNotConfigurable(JSContext* cx, jsid id, unsigned report = JSREPORT_ERROR);
|
||||
static bool reportNotExtensible(JSContext* cx, js::HandleObject obj,
|
||||
unsigned report = JSREPORT_ERROR);
|
||||
|
||||
static bool nonNativeSetProperty(JSContext* cx, js::HandleObject obj, js::HandleId id,
|
||||
js::HandleValue v, js::HandleValue receiver,
|
||||
|
|
|
@ -117,17 +117,16 @@ JSObject::setSingleton(js::ExclusiveContext* cx, js::HandleObject obj)
|
|||
return true;
|
||||
}
|
||||
|
||||
inline js::ObjectGroup*
|
||||
JSObject::getGroup(JSContext* cx)
|
||||
/* static */ inline js::ObjectGroup*
|
||||
JSObject::getGroup(JSContext* cx, js::HandleObject obj)
|
||||
{
|
||||
MOZ_ASSERT(cx->compartment() == compartment());
|
||||
if (hasLazyGroup()) {
|
||||
JS::RootedObject self(cx, this);
|
||||
if (cx->compartment() != compartment())
|
||||
MOZ_ASSERT(cx->compartment() == obj->compartment());
|
||||
if (obj->hasLazyGroup()) {
|
||||
if (cx->compartment() != obj->compartment())
|
||||
MOZ_CRASH();
|
||||
return makeLazyGroup(cx, self);
|
||||
return makeLazyGroup(cx, obj);
|
||||
}
|
||||
return group_;
|
||||
return obj->group_;
|
||||
}
|
||||
|
||||
inline void
|
||||
|
|
|
@ -971,9 +971,9 @@ static const JSFunctionSpec json_static_methods[] = {
|
|||
JSObject*
|
||||
js::InitJSONClass(JSContext* cx, HandleObject obj)
|
||||
{
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
|
||||
RootedObject proto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
RootedObject proto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
RootedObject JSON(cx, NewObjectWithGivenProto(cx, &JSONClass, proto, SingletonObject));
|
||||
|
|
|
@ -2214,6 +2214,7 @@ GenerateLcovInfo(JSContext* cx, JSCompartment* comp, GenericPrinter& out)
|
|||
return false;
|
||||
|
||||
RootedScript script(cx);
|
||||
RootedFunction fun(cx);
|
||||
do {
|
||||
script = queue.popCopy();
|
||||
compCover.collectCodeCoverageInfo(comp, script->sourceObject(), script);
|
||||
|
@ -2231,15 +2232,15 @@ GenerateLcovInfo(JSContext* cx, JSCompartment* comp, GenericPrinter& out)
|
|||
// Only continue on JSFunction objects.
|
||||
if (!obj->is<JSFunction>())
|
||||
continue;
|
||||
JSFunction& fun = obj->as<JSFunction>();
|
||||
fun = &obj->as<JSFunction>();
|
||||
|
||||
// Let's skip wasm for now.
|
||||
if (!fun.isInterpreted())
|
||||
if (!fun->isInterpreted())
|
||||
continue;
|
||||
|
||||
// Queue the script in the list of script associated to the
|
||||
// current source.
|
||||
JSScript* childScript = fun.getOrCreateScript(cx);
|
||||
JSScript* childScript = JSFunction::getOrCreateScript(cx, fun);
|
||||
if (!childScript || !queue.append(childScript))
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -1435,18 +1435,18 @@ JSScript::loadSource(JSContext* cx, ScriptSource* ss, bool* worked)
|
|||
return true;
|
||||
}
|
||||
|
||||
JSFlatString*
|
||||
JSScript::sourceData(JSContext* cx)
|
||||
/* static */ JSFlatString*
|
||||
JSScript::sourceData(JSContext* cx, HandleScript script)
|
||||
{
|
||||
MOZ_ASSERT(scriptSource()->hasSourceData());
|
||||
return scriptSource()->substring(cx, sourceStart(), sourceEnd());
|
||||
MOZ_ASSERT(script->scriptSource()->hasSourceData());
|
||||
return script->scriptSource()->substring(cx, script->sourceStart(), script->sourceEnd());
|
||||
}
|
||||
|
||||
JSFlatString*
|
||||
JSScript::sourceDataWithPrelude(JSContext* cx)
|
||||
/* static */ JSFlatString*
|
||||
JSScript::sourceDataWithPrelude(JSContext* cx, HandleScript script)
|
||||
{
|
||||
MOZ_ASSERT(scriptSource()->hasSourceData());
|
||||
return scriptSource()->substring(cx, preludeStart(), sourceEnd());
|
||||
MOZ_ASSERT(script->scriptSource()->hasSourceData());
|
||||
return script->scriptSource()->substring(cx, script->preludeStart(), script->sourceEnd());
|
||||
}
|
||||
|
||||
UncompressedSourceCache::AutoHoldEntry::AutoHoldEntry()
|
||||
|
@ -3268,7 +3268,7 @@ js::detail::CopyScript(JSContext* cx, HandleScript src, HandleScript dst,
|
|||
} else {
|
||||
if (innerFun->isInterpretedLazy()) {
|
||||
AutoCompartment ac(cx, innerFun);
|
||||
if (!innerFun->getOrCreateScript(cx))
|
||||
if (!JSFunction::getOrCreateScript(cx, innerFun))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -4296,7 +4296,7 @@ JSScript::AutoDelazify::holdScript(JS::HandleFunction fun)
|
|||
script_ = fun->nonLazyScript();
|
||||
} else {
|
||||
JSAutoCompartment ac(cx_, fun);
|
||||
script_ = fun->getOrCreateScript(cx_);
|
||||
script_ = JSFunction::getOrCreateScript(cx_, fun);
|
||||
if (script_) {
|
||||
oldDoNotRelazify_ = script_->doNotRelazify_;
|
||||
script_->setDoNotRelazify(true);
|
||||
|
|
|
@ -1499,7 +1499,7 @@ class JSScript : public js::gc::TenuredCell
|
|||
* De-lazifies the canonical function. Must be called before entering code
|
||||
* that expects the function to be non-lazy.
|
||||
*/
|
||||
inline void ensureNonLazyCanonicalFunction(JSContext* cx);
|
||||
inline void ensureNonLazyCanonicalFunction();
|
||||
|
||||
js::ModuleObject* module() const {
|
||||
if (bodyScope()->is<js::ModuleScope>())
|
||||
|
@ -1518,8 +1518,8 @@ class JSScript : public js::gc::TenuredCell
|
|||
// directly, via lazy arguments or a rest parameter.
|
||||
bool mayReadFrameArgsDirectly();
|
||||
|
||||
JSFlatString* sourceData(JSContext* cx);
|
||||
JSFlatString* sourceDataWithPrelude(JSContext* cx);
|
||||
static JSFlatString* sourceData(JSContext* cx, JS::HandleScript script);
|
||||
static JSFlatString* sourceDataWithPrelude(JSContext* cx, JS::HandleScript script);
|
||||
|
||||
static bool loadSource(JSContext* cx, js::ScriptSource* ss, bool* worked);
|
||||
|
||||
|
@ -2034,7 +2034,7 @@ class LazyScript : public gc::TenuredCell
|
|||
|
||||
void initRuntimeFields(uint64_t packedFields);
|
||||
|
||||
inline JSFunction* functionDelazifying(JSContext* cx) const;
|
||||
static inline JSFunction* functionDelazifying(JSContext* cx, Handle<LazyScript*>);
|
||||
JSFunction* functionNonDelazifying() const {
|
||||
return function_;
|
||||
}
|
||||
|
|
|
@ -74,13 +74,13 @@ void
|
|||
SetFrameArgumentsObject(JSContext* cx, AbstractFramePtr frame,
|
||||
HandleScript script, JSObject* argsobj);
|
||||
|
||||
inline JSFunction*
|
||||
LazyScript::functionDelazifying(JSContext* cx) const
|
||||
/* static */ inline JSFunction*
|
||||
LazyScript::functionDelazifying(JSContext* cx, Handle<LazyScript*> script)
|
||||
{
|
||||
Rooted<const LazyScript*> self(cx, this);
|
||||
if (self->function_ && !self->function_->getOrCreateScript(cx))
|
||||
RootedFunction fun(cx, script->function_);
|
||||
if (script->function_ && !JSFunction::getOrCreateScript(cx, fun))
|
||||
return nullptr;
|
||||
return self->function_;
|
||||
return script->function_;
|
||||
}
|
||||
|
||||
} // namespace js
|
||||
|
@ -100,7 +100,7 @@ JSScript::functionDelazifying() const
|
|||
}
|
||||
|
||||
inline void
|
||||
JSScript::ensureNonLazyCanonicalFunction(JSContext* cx)
|
||||
JSScript::ensureNonLazyCanonicalFunction()
|
||||
{
|
||||
// Infallibly delazify the canonical script.
|
||||
JSFunction* fun = function();
|
||||
|
|
|
@ -2905,8 +2905,8 @@ StringObject::assignInitialShape(ExclusiveContext* cx, Handle<StringObject*> obj
|
|||
{
|
||||
MOZ_ASSERT(obj->empty());
|
||||
|
||||
return obj->addDataProperty(cx, cx->names().length, LENGTH_SLOT,
|
||||
JSPROP_PERMANENT | JSPROP_READONLY);
|
||||
return NativeObject::addDataProperty(cx, obj, cx->names().length, LENGTH_SLOT,
|
||||
JSPROP_PERMANENT | JSPROP_READONLY);
|
||||
}
|
||||
|
||||
JSObject*
|
||||
|
@ -2914,17 +2914,20 @@ js::InitStringClass(JSContext* cx, HandleObject obj)
|
|||
{
|
||||
MOZ_ASSERT(obj->isNative());
|
||||
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
|
||||
Rooted<JSString*> empty(cx, cx->runtime()->emptyString);
|
||||
RootedObject proto(cx, global->createBlankPrototype(cx, &StringObject::class_));
|
||||
if (!proto || !proto->as<StringObject>().init(cx, empty))
|
||||
RootedObject proto(cx, GlobalObject::createBlankPrototype(cx, global, &StringObject::class_));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
Handle<StringObject*> protoObj = proto.as<StringObject>();
|
||||
if (!StringObject::init(cx, protoObj, empty))
|
||||
return nullptr;
|
||||
|
||||
/* Now create the String function. */
|
||||
RootedFunction ctor(cx);
|
||||
ctor = global->createConstructor(cx, StringConstructor, cx->names().String, 1,
|
||||
AllocKind::FUNCTION, &jit::JitInfo_String);
|
||||
ctor = GlobalObject::createConstructor(cx, StringConstructor, cx->names().String, 1,
|
||||
AllocKind::FUNCTION, &jit::JitInfo_String);
|
||||
if (!ctor)
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@ WatchpointMap::watch(JSContext* cx, HandleObject obj, HandleId id,
|
|||
{
|
||||
MOZ_ASSERT(JSID_IS_STRING(id) || JSID_IS_INT(id) || JSID_IS_SYMBOL(id));
|
||||
|
||||
if (!obj->setWatched(cx))
|
||||
if (!JSObject::setWatched(cx, obj))
|
||||
return false;
|
||||
|
||||
Watchpoint w(handler, closure, false);
|
||||
|
|
|
@ -136,7 +136,7 @@ class JS_FRIEND_API(Wrapper) : public BaseProxyHandler
|
|||
static JSObject* New(JSContext* cx, JSObject* obj, const Wrapper* handler,
|
||||
const WrapperOptions& options = WrapperOptions());
|
||||
|
||||
static JSObject* Renew(JSContext* cx, JSObject* existing, JSObject* obj, const Wrapper* handler);
|
||||
static JSObject* Renew(JSObject* existing, JSObject* obj, const Wrapper* handler);
|
||||
|
||||
static const Wrapper* wrapperHandler(JSObject* wrapper);
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@ CrossCompartmentWrapper::getPrototype(JSContext* cx, HandleObject wrapper,
|
|||
if (!GetPrototype(cx, wrapped, protop))
|
||||
return false;
|
||||
if (protop) {
|
||||
if (!protop->setDelegate(cx))
|
||||
if (!JSObject::setDelegate(cx, protop))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -122,7 +122,7 @@ CrossCompartmentWrapper::getPrototypeIfOrdinary(JSContext* cx, HandleObject wrap
|
|||
return true;
|
||||
|
||||
if (protop) {
|
||||
if (!protop->setDelegate(cx))
|
||||
if (!JSObject::setDelegate(cx, protop))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -774,7 +774,7 @@ js::NewProxyObject(JSContext* cx, const BaseProxyHandler* handler, HandleValue p
|
|||
}
|
||||
|
||||
void
|
||||
ProxyObject::renew(JSContext* cx, const BaseProxyHandler* handler, const Value& priv)
|
||||
ProxyObject::renew(const BaseProxyHandler* handler, const Value& priv)
|
||||
{
|
||||
MOZ_ASSERT(!IsInsideNursery(this));
|
||||
MOZ_ASSERT_IF(IsCrossCompartmentWrapper(this), IsDeadProxyObject(this));
|
||||
|
@ -796,9 +796,9 @@ js::InitProxyClass(JSContext* cx, HandleObject obj)
|
|||
JS_FS_END
|
||||
};
|
||||
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
RootedFunction ctor(cx);
|
||||
ctor = global->createConstructor(cx, proxy, cx->names().Proxy, 2);
|
||||
ctor = GlobalObject::createConstructor(cx, proxy, cx->names().Proxy, 2);
|
||||
if (!ctor)
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -312,9 +312,9 @@ Wrapper::New(JSContext* cx, JSObject* obj, const Wrapper* handler,
|
|||
}
|
||||
|
||||
JSObject*
|
||||
Wrapper::Renew(JSContext* cx, JSObject* existing, JSObject* obj, const Wrapper* handler)
|
||||
Wrapper::Renew(JSObject* existing, JSObject* obj, const Wrapper* handler)
|
||||
{
|
||||
existing->as<ProxyObject>().renew(cx, handler, ObjectValue(*obj));
|
||||
existing->as<ProxyObject>().renew(handler, ObjectValue(*obj));
|
||||
return existing;
|
||||
}
|
||||
|
||||
|
|
|
@ -2310,7 +2310,7 @@ ValueToScript(JSContext* cx, HandleValue v, JSFunction** funp = nullptr)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
JSScript* script = fun->getOrCreateScript(cx);
|
||||
JSScript* script = JSFunction::getOrCreateScript(cx, fun);
|
||||
if (!script)
|
||||
return nullptr;
|
||||
|
||||
|
@ -2726,7 +2726,7 @@ DisassembleScript(JSContext* cx, HandleScript script, HandleFunction fun,
|
|||
|
||||
RootedFunction fun(cx, &obj->as<JSFunction>());
|
||||
if (fun->isInterpreted()) {
|
||||
RootedScript script(cx, fun->getOrCreateScript(cx));
|
||||
RootedScript script(cx, JSFunction::getOrCreateScript(cx, fun));
|
||||
if (script) {
|
||||
if (!DisassembleScript(cx, script, fun, lines, recursive, sourceNotes, sp))
|
||||
return false;
|
||||
|
@ -3488,8 +3488,8 @@ GroupOf(JSContext* cx, unsigned argc, JS::Value* vp)
|
|||
JS_ReportErrorASCII(cx, "groupOf: object expected");
|
||||
return false;
|
||||
}
|
||||
JSObject* obj = &args[0].toObject();
|
||||
ObjectGroup* group = obj->getGroup(cx);
|
||||
RootedObject obj(cx, &args[0].toObject());
|
||||
ObjectGroup* group = JSObject::getGroup(cx, obj);
|
||||
if (!group)
|
||||
return false;
|
||||
args.rval().set(JS_NumberValue(double(uintptr_t(group) >> 3)));
|
||||
|
@ -5403,7 +5403,7 @@ DumpScopeChain(JSContext* cx, unsigned argc, Value* vp)
|
|||
ReportUsageErrorASCII(cx, callee, "Argument must be an interpreted function");
|
||||
return false;
|
||||
}
|
||||
script = fun->getOrCreateScript(cx);
|
||||
script = JSFunction::getOrCreateScript(cx, fun);
|
||||
} else {
|
||||
script = obj->as<ModuleObject>().script();
|
||||
}
|
||||
|
|
|
@ -214,7 +214,7 @@ ArgumentsObject::createTemplateObject(JSContext* cx, bool mapped)
|
|||
? &MappedArgumentsObject::class_
|
||||
: &UnmappedArgumentsObject::class_;
|
||||
|
||||
RootedObject proto(cx, cx->global()->getOrCreateObjectPrototype(cx));
|
||||
RootedObject proto(cx, GlobalObject::getOrCreateObjectPrototype(cx, cx->global()));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
|
||||
|
@ -475,7 +475,7 @@ MappedArgSetter(JSContext* cx, HandleObject obj, HandleId id, MutableHandleValue
|
|||
attrs &= (JSPROP_ENUMERATE | JSPROP_PERMANENT); /* only valid attributes */
|
||||
|
||||
RootedFunction callee(cx, &argsobj->callee());
|
||||
RootedScript script(cx, callee->getOrCreateScript(cx));
|
||||
RootedScript script(cx, JSFunction::getOrCreateScript(cx, callee));
|
||||
if (!script)
|
||||
return false;
|
||||
|
||||
|
@ -630,7 +630,7 @@ MappedArgumentsObject::obj_defineProperty(JSContext* cx, HandleObject obj, Handl
|
|||
} else {
|
||||
if (desc.hasValue()) {
|
||||
RootedFunction callee(cx, &argsobj->callee());
|
||||
RootedScript script(cx, callee->getOrCreateScript(cx));
|
||||
RootedScript script(cx, JSFunction::getOrCreateScript(cx, callee));
|
||||
if (!script)
|
||||
return false;
|
||||
argsobj->setElement(cx, arg, desc.value());
|
||||
|
|
|
@ -140,7 +140,7 @@ static const Class ArrayBufferObjectProtoClass = {
|
|||
static JSObject*
|
||||
CreateArrayBufferPrototype(JSContext* cx, JSProtoKey key)
|
||||
{
|
||||
return cx->global()->createBlankPrototype(cx, &ArrayBufferObjectProtoClass);
|
||||
return GlobalObject::createBlankPrototype(cx, cx->global(), &ArrayBufferObjectProtoClass);
|
||||
}
|
||||
|
||||
static const ClassOps ArrayBufferObjectClassOps = {
|
||||
|
@ -344,7 +344,7 @@ ArrayBufferObject::detach(JSContext* cx, Handle<ArrayBufferObject*> buffer,
|
|||
// Make sure the global object's group has been instantiated, so the
|
||||
// flag change will be observed.
|
||||
AutoEnterOOMUnsafeRegion oomUnsafe;
|
||||
if (!cx->global()->getGroup(cx))
|
||||
if (!JSObject::getGroup(cx, cx->global()))
|
||||
oomUnsafe.crash("ArrayBufferObject::detach");
|
||||
MarkObjectGroupFlags(cx, cx->global(), OBJECT_FLAG_TYPED_OBJECT_HAS_DETACHED_BUFFER);
|
||||
cx->compartment()->detachedTypedObjects = 1;
|
||||
|
|
|
@ -118,7 +118,7 @@ js::WrapAsyncFunctionWithProto(JSContext* cx, HandleFunction unwrapped, HandleOb
|
|||
|
||||
RootedAtom funName(cx, unwrapped->explicitName());
|
||||
uint16_t length;
|
||||
if (!unwrapped->getLength(cx, &length))
|
||||
if (!JSFunction::getLength(cx, unwrapped, &length))
|
||||
return nullptr;
|
||||
|
||||
// Steps 3 (partially).
|
||||
|
|
|
@ -224,7 +224,7 @@ EnsureFunctionHasScript(JSContext* cx, HandleFunction fun)
|
|||
{
|
||||
if (fun->isInterpretedLazy()) {
|
||||
AutoCompartment ac(cx, fun);
|
||||
return !!fun->getOrCreateScript(cx);
|
||||
return !!JSFunction::getOrCreateScript(cx, fun);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2234,7 +2234,7 @@ Debugger::appendAllocationSite(JSContext* cx, HandleObject obj, HandleSavedFrame
|
|||
RootedAtom ctorName(cx);
|
||||
{
|
||||
AutoCompartment ac(cx, obj);
|
||||
if (!obj->constructorDisplayAtom(cx, &ctorName))
|
||||
if (!JSObject::constructorDisplayAtom(cx, obj, &ctorName))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -7227,8 +7227,8 @@ static const JSFunctionSpec DebuggerSource_methods[] = {
|
|||
/* static */ NativeObject*
|
||||
DebuggerFrame::initClass(JSContext* cx, HandleObject dbgCtor, HandleObject obj)
|
||||
{
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
RootedObject objProto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
RootedObject objProto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
|
||||
return InitClass(cx, dbgCtor, objProto, &class_, construct, 0, properties_,
|
||||
methods_, nullptr, nullptr);
|
||||
|
@ -9376,8 +9376,8 @@ const JSFunctionSpec DebuggerObject::methods_[] = {
|
|||
/* static */ NativeObject*
|
||||
DebuggerObject::initClass(JSContext* cx, HandleObject obj, HandleObject debugCtor)
|
||||
{
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
RootedObject objProto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
RootedObject objProto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
|
||||
RootedNativeObject objectProto(cx, InitClass(cx, debugCtor, objProto, &class_,
|
||||
construct, 0, properties_,
|
||||
|
@ -9611,7 +9611,7 @@ DebuggerObject::getBoundArguments(JSContext* cx, HandleDebuggerObject object,
|
|||
if (!result.resize(length))
|
||||
return false;
|
||||
for (size_t i = 0; i < length; i++) {
|
||||
result[i].set(referent->getBoundFunctionArgument(cx, i));
|
||||
result[i].set(referent->getBoundFunctionArgument(i));
|
||||
if (!dbg->wrapDebuggeeValue(cx, result[i]))
|
||||
return false;
|
||||
}
|
||||
|
@ -10577,8 +10577,8 @@ const JSFunctionSpec DebuggerEnvironment::methods_[] = {
|
|||
/* static */ NativeObject*
|
||||
DebuggerEnvironment::initClass(JSContext* cx, HandleObject dbgCtor, HandleObject obj)
|
||||
{
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
RootedObject objProto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
RootedObject objProto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
|
||||
return InitClass(cx, dbgCtor, objProto, &DebuggerEnvironment::class_, construct, 0,
|
||||
properties_, methods_, nullptr, nullptr);
|
||||
|
@ -10774,7 +10774,8 @@ DebuggerEnvironment::getVariable(JSContext* cx, HandleDebuggerEnvironment enviro
|
|||
//
|
||||
// See wrapDebuggeeValue for how the sentinel values are wrapped.
|
||||
if (referent->is<DebugEnvironmentProxy>()) {
|
||||
if (!referent->as<DebugEnvironmentProxy>().getMaybeSentinelValue(cx, id, result))
|
||||
Rooted<DebugEnvironmentProxy*> env(cx, &referent->as<DebugEnvironmentProxy>());
|
||||
if (!DebugEnvironmentProxy::getMaybeSentinelValue(cx, env, id, result))
|
||||
return false;
|
||||
} else {
|
||||
if (!GetProperty(cx, referent, referent, id, result))
|
||||
|
@ -10942,9 +10943,9 @@ JS_DefineDebuggerObject(JSContext* cx, HandleObject obj)
|
|||
memoryProto(cx);
|
||||
RootedObject debuggeeWouldRunProto(cx);
|
||||
RootedValue debuggeeWouldRunCtor(cx);
|
||||
Rooted<GlobalObject*> global(cx, &obj->as<GlobalObject>());
|
||||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
|
||||
objProto = global->getOrCreateObjectPrototype(cx);
|
||||
objProto = GlobalObject::getOrCreateObjectPrototype(cx, global);
|
||||
if (!objProto)
|
||||
return false;
|
||||
debugProto = InitClass(cx, obj,
|
||||
|
|
|
@ -816,7 +816,7 @@ NonSyntacticVariablesObject::create(JSContext* cx)
|
|||
return nullptr;
|
||||
|
||||
MOZ_ASSERT(obj->isUnqualifiedVarObj());
|
||||
if (!obj->setQualifiedVarObj(cx))
|
||||
if (!JSObject::setQualifiedVarObj(cx, obj))
|
||||
return nullptr;
|
||||
|
||||
obj->initEnclosingEnvironment(&cx->global()->lexicalEnvironment());
|
||||
|
@ -957,7 +957,7 @@ LexicalEnvironmentObject::createHollowForDebug(JSContext* cx, Handle<LexicalScop
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
if (!env->setFlags(cx, BaseShape::NOT_EXTENSIBLE, JSObject::GENERATE_SHAPE))
|
||||
if (!JSObject::setFlags(cx, env, BaseShape::NOT_EXTENSIBLE, JSObject::GENERATE_SHAPE))
|
||||
return nullptr;
|
||||
|
||||
env->initScopeUnchecked(scope);
|
||||
|
@ -1425,7 +1425,8 @@ class DebugEnvironmentProxyHandler : public BaseProxyHandler
|
|||
/* Handle unaliased formals, vars, lets, and consts at function scope. */
|
||||
if (env->is<CallObject>()) {
|
||||
CallObject& callobj = env->as<CallObject>();
|
||||
RootedScript script(cx, callobj.callee().getOrCreateScript(cx));
|
||||
RootedFunction fun(cx, &callobj.callee());
|
||||
RootedScript script(cx, JSFunction::getOrCreateScript(cx, fun));
|
||||
if (!script->ensureHasTypes(cx) || !script->ensureHasAnalyzedArgsUsage(cx))
|
||||
return false;
|
||||
|
||||
|
@ -2233,11 +2234,11 @@ DebugEnvironmentProxy::isForDeclarative() const
|
|||
e.is<LexicalEnvironmentObject>();
|
||||
}
|
||||
|
||||
bool
|
||||
DebugEnvironmentProxy::getMaybeSentinelValue(JSContext* cx, HandleId id, MutableHandleValue vp)
|
||||
/* static */ bool
|
||||
DebugEnvironmentProxy::getMaybeSentinelValue(JSContext* cx, Handle<DebugEnvironmentProxy*> env,
|
||||
HandleId id, MutableHandleValue vp)
|
||||
{
|
||||
Rooted<DebugEnvironmentProxy*> self(cx, this);
|
||||
return DebugEnvironmentProxyHandler::singleton.getMaybeSentinelValue(cx, self, id, vp);
|
||||
return DebugEnvironmentProxyHandler::singleton.getMaybeSentinelValue(cx, env, id, vp);
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -2960,7 +2961,7 @@ js::GetDebugEnvironmentForFunction(JSContext* cx, HandleFunction fun)
|
|||
MOZ_ASSERT(CanUseDebugEnvironmentMaps(cx));
|
||||
if (!DebugEnvironments::updateLiveEnvironments(cx))
|
||||
return nullptr;
|
||||
JSScript* script = fun->getOrCreateScript(cx);
|
||||
JSScript* script = JSFunction::getOrCreateScript(cx, fun);
|
||||
if (!script)
|
||||
return nullptr;
|
||||
EnvironmentIter ei(cx, fun->environment(), script->enclosingScope());
|
||||
|
@ -3468,11 +3469,13 @@ RemoveReferencedNames(JSContext* cx, HandleScript script, PropertyNameSet& remai
|
|||
|
||||
if (script->hasObjects()) {
|
||||
ObjectArray* objects = script->objects();
|
||||
RootedFunction fun(cx);
|
||||
RootedScript innerScript(cx);
|
||||
for (size_t i = 0; i < objects->length; i++) {
|
||||
JSObject* obj = objects->vector[i];
|
||||
if (obj->is<JSFunction>() && obj->as<JSFunction>().isInterpreted()) {
|
||||
JSFunction* fun = &obj->as<JSFunction>();
|
||||
RootedScript innerScript(cx, fun->getOrCreateScript(cx));
|
||||
fun = &obj->as<JSFunction>();
|
||||
innerScript = JSFunction::getOrCreateScript(cx, fun);
|
||||
if (!innerScript)
|
||||
return false;
|
||||
|
||||
|
@ -3535,11 +3538,13 @@ AnalyzeEntrainedVariablesInScript(JSContext* cx, HandleScript script, HandleScri
|
|||
|
||||
if (innerScript->hasObjects()) {
|
||||
ObjectArray* objects = innerScript->objects();
|
||||
RootedFunction fun(cx);
|
||||
RootedScript innerInnerScript(cx);
|
||||
for (size_t i = 0; i < objects->length; i++) {
|
||||
JSObject* obj = objects->vector[i];
|
||||
if (obj->is<JSFunction>() && obj->as<JSFunction>().isInterpreted()) {
|
||||
JSFunction* fun = &obj->as<JSFunction>();
|
||||
RootedScript innerInnerScript(cx, fun->getOrCreateScript(cx));
|
||||
fun = &obj->as<JSFunction>();
|
||||
innerInnerScript = JSFunction::getOrCreateScript(cx, fun);
|
||||
if (!innerInnerScript ||
|
||||
!AnalyzeEntrainedVariablesInScript(cx, script, innerInnerScript))
|
||||
{
|
||||
|
@ -3570,11 +3575,13 @@ js::AnalyzeEntrainedVariables(JSContext* cx, HandleScript script)
|
|||
return true;
|
||||
|
||||
ObjectArray* objects = script->objects();
|
||||
RootedFunction fun(cx);
|
||||
RootedScript innerScript(cx);
|
||||
for (size_t i = 0; i < objects->length; i++) {
|
||||
JSObject* obj = objects->vector[i];
|
||||
if (obj->is<JSFunction>() && obj->as<JSFunction>().isInterpreted()) {
|
||||
JSFunction* fun = &obj->as<JSFunction>();
|
||||
RootedScript innerScript(cx, fun->getOrCreateScript(cx));
|
||||
fun = &obj->as<JSFunction>();
|
||||
innerScript = JSFunction::getOrCreateScript(cx, fun);
|
||||
if (!innerScript)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -872,7 +872,8 @@ class DebugEnvironmentProxy : public ProxyObject
|
|||
|
||||
// Get a property by 'id', but returns sentinel values instead of throwing
|
||||
// on exceptional cases.
|
||||
bool getMaybeSentinelValue(JSContext* cx, HandleId id, MutableHandleValue vp);
|
||||
static bool getMaybeSentinelValue(JSContext* cx, Handle<DebugEnvironmentProxy*> env,
|
||||
HandleId id, MutableHandleValue vp);
|
||||
|
||||
// Returns true iff this is a function environment with its own this-binding
|
||||
// (all functions except arrow functions and generator expression lambdas).
|
||||
|
|
|
@ -29,11 +29,11 @@ js::ErrorObject::assignInitialShape(ExclusiveContext* cx, Handle<ErrorObject*> o
|
|||
{
|
||||
MOZ_ASSERT(obj->empty());
|
||||
|
||||
if (!obj->addDataProperty(cx, cx->names().fileName, FILENAME_SLOT, 0))
|
||||
if (!NativeObject::addDataProperty(cx, obj, cx->names().fileName, FILENAME_SLOT, 0))
|
||||
return nullptr;
|
||||
if (!obj->addDataProperty(cx, cx->names().lineNumber, LINENUMBER_SLOT, 0))
|
||||
if (!NativeObject::addDataProperty(cx, obj, cx->names().lineNumber, LINENUMBER_SLOT, 0))
|
||||
return nullptr;
|
||||
return obj->addDataProperty(cx, cx->names().columnNumber, COLUMNNUMBER_SLOT, 0);
|
||||
return NativeObject::addDataProperty(cx, obj, cx->names().columnNumber, COLUMNNUMBER_SLOT, 0);
|
||||
}
|
||||
|
||||
/* static */ bool
|
||||
|
@ -57,7 +57,7 @@ js::ErrorObject::init(JSContext* cx, Handle<ErrorObject*> obj, JSExnType type,
|
|||
// |new Error()|.
|
||||
RootedShape messageShape(cx);
|
||||
if (message) {
|
||||
messageShape = obj->addDataProperty(cx, cx->names().message, MESSAGE_SLOT, 0);
|
||||
messageShape = NativeObject::addDataProperty(cx, obj, cx->names().message, MESSAGE_SLOT, 0);
|
||||
if (!messageShape)
|
||||
return false;
|
||||
MOZ_ASSERT(messageShape->slot() == MESSAGE_SLOT);
|
||||
|
|
|
@ -256,7 +256,7 @@ static const JSFunctionSpec legacy_generator_methods[] = {
|
|||
static JSObject*
|
||||
NewSingletonObjectWithObjectPrototype(JSContext* cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
RootedObject proto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
RootedObject proto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
return NewObjectWithGivenProto<PlainObject>(cx, proto, SingletonObject);
|
||||
|
@ -265,7 +265,7 @@ NewSingletonObjectWithObjectPrototype(JSContext* cx, Handle<GlobalObject*> globa
|
|||
JSObject*
|
||||
js::NewSingletonObjectWithFunctionPrototype(JSContext* cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
RootedObject proto(cx, global->getOrCreateFunctionPrototype(cx));
|
||||
RootedObject proto(cx, GlobalObject::getOrCreateFunctionPrototype(cx, global));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
return NewObjectWithGivenProto<PlainObject>(cx, proto, SingletonObject);
|
||||
|
@ -278,7 +278,7 @@ GlobalObject::initLegacyGeneratorProto(JSContext* cx, Handle<GlobalObject*> glob
|
|||
return true;
|
||||
|
||||
RootedObject proto(cx, NewSingletonObjectWithObjectPrototype(cx, global));
|
||||
if (!proto || !proto->setDelegate(cx))
|
||||
if (!proto || !JSObject::setDelegate(cx, proto))
|
||||
return false;
|
||||
if (!DefinePropertiesAndFunctions(cx, proto, nullptr, legacy_generator_methods))
|
||||
return false;
|
||||
|
@ -297,9 +297,9 @@ GlobalObject::initStarGenerators(JSContext* cx, Handle<GlobalObject*> global)
|
|||
if (!iteratorProto)
|
||||
return false;
|
||||
|
||||
RootedObject genObjectProto(cx, global->createBlankPrototypeInheriting(cx,
|
||||
&PlainObject::class_,
|
||||
iteratorProto));
|
||||
RootedObject genObjectProto(cx, GlobalObject::createBlankPrototypeInheriting(cx, global,
|
||||
&PlainObject::class_,
|
||||
iteratorProto));
|
||||
if (!genObjectProto)
|
||||
return false;
|
||||
if (!DefinePropertiesAndFunctions(cx, genObjectProto, nullptr, star_generator_methods) ||
|
||||
|
@ -309,7 +309,7 @@ GlobalObject::initStarGenerators(JSContext* cx, Handle<GlobalObject*> global)
|
|||
}
|
||||
|
||||
RootedObject genFunctionProto(cx, NewSingletonObjectWithFunctionPrototype(cx, global));
|
||||
if (!genFunctionProto || !genFunctionProto->setDelegate(cx))
|
||||
if (!genFunctionProto || !JSObject::setDelegate(cx, genFunctionProto))
|
||||
return false;
|
||||
if (!LinkConstructorAndPrototype(cx, genFunctionProto, genObjectProto) ||
|
||||
!DefineToStringTag(cx, genFunctionProto, cx->names().GeneratorFunction))
|
||||
|
|
|
@ -329,15 +329,15 @@ GlobalObject::createInternal(JSContext* cx, const Class* clasp)
|
|||
|
||||
cx->compartment()->initGlobal(*global);
|
||||
|
||||
if (!global->setQualifiedVarObj(cx))
|
||||
if (!JSObject::setQualifiedVarObj(cx, global))
|
||||
return nullptr;
|
||||
if (!global->setDelegate(cx))
|
||||
if (!JSObject::setDelegate(cx, global))
|
||||
return nullptr;
|
||||
|
||||
return global;
|
||||
}
|
||||
|
||||
GlobalObject*
|
||||
/* static */ GlobalObject*
|
||||
GlobalObject::new_(JSContext* cx, const Class* clasp, JSPrincipals* principals,
|
||||
JS::OnNewGlobalHookOption hookOption,
|
||||
const JS::CompartmentOptions& options)
|
||||
|
@ -398,7 +398,7 @@ GlobalObject::emptyGlobalScope() const
|
|||
GlobalObject::getOrCreateEval(JSContext* cx, Handle<GlobalObject*> global,
|
||||
MutableHandleObject eval)
|
||||
{
|
||||
if (!global->getOrCreateObjectPrototype(cx))
|
||||
if (!getOrCreateObjectPrototype(cx, global))
|
||||
return false;
|
||||
eval.set(&global->getSlot(EVAL).toObject());
|
||||
return true;
|
||||
|
@ -573,7 +573,7 @@ GlobalObject::warnOnceAbout(JSContext* cx, HandleObject obj, WarnOnceFlag flag,
|
|||
return true;
|
||||
}
|
||||
|
||||
JSFunction*
|
||||
/* static */ JSFunction*
|
||||
GlobalObject::createConstructor(JSContext* cx, Native ctor, JSAtom* nameArg, unsigned length,
|
||||
gc::AllocKind kind, const JSJitInfo* jitInfo)
|
||||
{
|
||||
|
@ -595,28 +595,27 @@ CreateBlankProto(JSContext* cx, const Class* clasp, HandleObject proto, HandleOb
|
|||
|
||||
RootedNativeObject blankProto(cx, NewNativeObjectWithGivenProto(cx, clasp, proto,
|
||||
SingletonObject));
|
||||
if (!blankProto || !blankProto->setDelegate(cx))
|
||||
if (!blankProto || !JSObject::setDelegate(cx, blankProto))
|
||||
return nullptr;
|
||||
|
||||
return blankProto;
|
||||
}
|
||||
|
||||
NativeObject*
|
||||
GlobalObject::createBlankPrototype(JSContext* cx, const Class* clasp)
|
||||
/* static */ NativeObject*
|
||||
GlobalObject::createBlankPrototype(JSContext* cx, Handle<GlobalObject*> global, const Class* clasp)
|
||||
{
|
||||
Rooted<GlobalObject*> self(cx, this);
|
||||
RootedObject objectProto(cx, getOrCreateObjectPrototype(cx));
|
||||
RootedObject objectProto(cx, getOrCreateObjectPrototype(cx, global));
|
||||
if (!objectProto)
|
||||
return nullptr;
|
||||
|
||||
return CreateBlankProto(cx, clasp, objectProto, self);
|
||||
return CreateBlankProto(cx, clasp, objectProto, global);
|
||||
}
|
||||
|
||||
NativeObject*
|
||||
GlobalObject::createBlankPrototypeInheriting(JSContext* cx, const Class* clasp, HandleObject proto)
|
||||
/* static */ NativeObject*
|
||||
GlobalObject::createBlankPrototypeInheriting(JSContext* cx, Handle<GlobalObject*> global,
|
||||
const Class* clasp, HandleObject proto)
|
||||
{
|
||||
Rooted<GlobalObject*> self(cx, this);
|
||||
return CreateBlankProto(cx, clasp, proto, self);
|
||||
return CreateBlankProto(cx, clasp, proto, global);
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -729,21 +728,20 @@ GlobalObject::hasRegExpStatics() const
|
|||
return !getSlot(REGEXP_STATICS).isUndefined();
|
||||
}
|
||||
|
||||
RegExpStatics*
|
||||
GlobalObject::getRegExpStatics(ExclusiveContext* cx) const
|
||||
/* static */ RegExpStatics*
|
||||
GlobalObject::getRegExpStatics(ExclusiveContext* cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
MOZ_ASSERT(cx);
|
||||
Rooted<GlobalObject*> self(cx, const_cast<GlobalObject*>(this));
|
||||
|
||||
RegExpStaticsObject* resObj = nullptr;
|
||||
const Value& val = this->getSlot(REGEXP_STATICS);
|
||||
const Value& val = global->getSlot(REGEXP_STATICS);
|
||||
if (!val.isObject()) {
|
||||
MOZ_ASSERT(val.isUndefined());
|
||||
resObj = RegExpStatics::create(cx, self);
|
||||
resObj = RegExpStatics::create(cx, global);
|
||||
if (!resObj)
|
||||
return nullptr;
|
||||
|
||||
self->initSlot(REGEXP_STATICS, ObjectValue(*resObj));
|
||||
global->initSlot(REGEXP_STATICS, ObjectValue(*resObj));
|
||||
} else {
|
||||
resObj = &val.toObject().as<RegExpStaticsObject>();
|
||||
}
|
||||
|
@ -866,7 +864,7 @@ GlobalObject::addIntrinsicValue(JSContext* cx, Handle<GlobalObject*> global,
|
|||
/* static */ bool
|
||||
GlobalObject::ensureModulePrototypesCreated(JSContext *cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
return global->getOrCreateObject(cx, MODULE_PROTO, initModuleProto) &&
|
||||
global->getOrCreateObject(cx, IMPORT_ENTRY_PROTO, initImportEntryProto) &&
|
||||
global->getOrCreateObject(cx, EXPORT_ENTRY_PROTO, initExportEntryProto);
|
||||
return getOrCreateObject(cx, global, MODULE_PROTO, initModuleProto) &&
|
||||
getOrCreateObject(cx, global, IMPORT_ENTRY_PROTO, initImportEntryProto) &&
|
||||
getOrCreateObject(cx, global, EXPORT_ENTRY_PROTO, initExportEntryProto);
|
||||
}
|
||||
|
|
|
@ -290,8 +290,8 @@ class GlobalObject : public NativeObject
|
|||
* Create a constructor function with the specified name and length using
|
||||
* ctor, a method which creates objects with the given class.
|
||||
*/
|
||||
JSFunction*
|
||||
createConstructor(JSContext* cx, JSNative ctor, JSAtom* name, unsigned length,
|
||||
static JSFunction*
|
||||
createConstructor(JSContext* cx, JSNative ctor, JSAtom* name, unsigned length,
|
||||
gc::AllocKind kind = gc::AllocKind::FUNCTION,
|
||||
const JSJitInfo* jitInfo = nullptr);
|
||||
|
||||
|
@ -303,48 +303,44 @@ class GlobalObject : public NativeObject
|
|||
* complete the minimal initialization to make the returned object safe to
|
||||
* touch.
|
||||
*/
|
||||
NativeObject* createBlankPrototype(JSContext* cx, const js::Class* clasp);
|
||||
static NativeObject*
|
||||
createBlankPrototype(JSContext* cx, Handle<GlobalObject*> global, const js::Class* clasp);
|
||||
|
||||
/*
|
||||
* Identical to createBlankPrototype, but uses proto as the [[Prototype]]
|
||||
* of the returned blank prototype.
|
||||
*/
|
||||
NativeObject* createBlankPrototypeInheriting(JSContext* cx, const js::Class* clasp,
|
||||
HandleObject proto);
|
||||
static NativeObject*
|
||||
createBlankPrototypeInheriting(JSContext* cx, Handle<GlobalObject*> global,
|
||||
const js::Class* clasp, HandleObject proto);
|
||||
|
||||
template <typename T>
|
||||
T* createBlankPrototype(JSContext* cx) {
|
||||
NativeObject* res = createBlankPrototype(cx, &T::class_);
|
||||
static T*
|
||||
createBlankPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
NativeObject* res = createBlankPrototype(cx, global, &T::class_);
|
||||
return res ? &res->template as<T>() : nullptr;
|
||||
}
|
||||
|
||||
NativeObject* getOrCreateObjectPrototype(JSContext* cx) {
|
||||
if (functionObjectClassesInitialized())
|
||||
return &getPrototype(JSProto_Object).toObject().as<NativeObject>();
|
||||
RootedGlobalObject self(cx, this);
|
||||
if (!ensureConstructor(cx, self, JSProto_Object))
|
||||
static NativeObject*
|
||||
getOrCreateObjectPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (global->functionObjectClassesInitialized())
|
||||
return &global->getPrototype(JSProto_Object).toObject().as<NativeObject>();
|
||||
if (!ensureConstructor(cx, global, JSProto_Object))
|
||||
return nullptr;
|
||||
return &self->getPrototype(JSProto_Object).toObject().as<NativeObject>();
|
||||
return &global->getPrototype(JSProto_Object).toObject().as<NativeObject>();
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateObjectPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return global->getOrCreateObjectPrototype(cx);
|
||||
}
|
||||
|
||||
NativeObject* getOrCreateFunctionPrototype(JSContext* cx) {
|
||||
if (functionObjectClassesInitialized())
|
||||
return &getPrototype(JSProto_Function).toObject().as<NativeObject>();
|
||||
RootedGlobalObject self(cx, this);
|
||||
if (!ensureConstructor(cx, self, JSProto_Object))
|
||||
static NativeObject*
|
||||
getOrCreateFunctionPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (global->functionObjectClassesInitialized())
|
||||
return &global->getPrototype(JSProto_Function).toObject().as<NativeObject>();
|
||||
if (!ensureConstructor(cx, global, JSProto_Object))
|
||||
return nullptr;
|
||||
return &self->getPrototype(JSProto_Function).toObject().as<NativeObject>();
|
||||
return &global->getPrototype(JSProto_Function).toObject().as<NativeObject>();
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateFunctionPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return global->getOrCreateFunctionPrototype(cx);
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateArrayPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
static NativeObject*
|
||||
getOrCreateArrayPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_Array))
|
||||
return nullptr;
|
||||
return &global->getPrototype(JSProto_Array).toObject().as<NativeObject>();
|
||||
|
@ -356,37 +352,43 @@ class GlobalObject : public NativeObject
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateBooleanPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
static NativeObject*
|
||||
getOrCreateBooleanPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_Boolean))
|
||||
return nullptr;
|
||||
return &global->getPrototype(JSProto_Boolean).toObject().as<NativeObject>();
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateNumberPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
static NativeObject*
|
||||
getOrCreateNumberPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_Number))
|
||||
return nullptr;
|
||||
return &global->getPrototype(JSProto_Number).toObject().as<NativeObject>();
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateStringPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
static NativeObject*
|
||||
getOrCreateStringPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_String))
|
||||
return nullptr;
|
||||
return &global->getPrototype(JSProto_String).toObject().as<NativeObject>();
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateSymbolPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
static NativeObject*
|
||||
getOrCreateSymbolPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_Symbol))
|
||||
return nullptr;
|
||||
return &global->getPrototype(JSProto_Symbol).toObject().as<NativeObject>();
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreatePromisePrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
static NativeObject*
|
||||
getOrCreatePromisePrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_Promise))
|
||||
return nullptr;
|
||||
return &global->getPrototype(JSProto_Promise).toObject().as<NativeObject>();
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateRegExpPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
static NativeObject*
|
||||
getOrCreateRegExpPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_RegExp))
|
||||
return nullptr;
|
||||
return &global->getPrototype(JSProto_RegExp).toObject().as<NativeObject>();
|
||||
|
@ -398,28 +400,30 @@ class GlobalObject : public NativeObject
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateSavedFramePrototype(JSContext* cx,
|
||||
Handle<GlobalObject*> global) {
|
||||
static NativeObject*
|
||||
getOrCreateSavedFramePrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_SavedFrame))
|
||||
return nullptr;
|
||||
return &global->getPrototype(JSProto_SavedFrame).toObject().as<NativeObject>();
|
||||
}
|
||||
|
||||
static JSObject* getOrCreateArrayBufferPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
static JSObject*
|
||||
getOrCreateArrayBufferPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_ArrayBuffer))
|
||||
return nullptr;
|
||||
return &global->getPrototype(JSProto_ArrayBuffer).toObject();
|
||||
}
|
||||
|
||||
JSObject* getOrCreateSharedArrayBufferPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
static JSObject*
|
||||
getOrCreateSharedArrayBufferPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_SharedArrayBuffer))
|
||||
return nullptr;
|
||||
return &global->getPrototype(JSProto_SharedArrayBuffer).toObject();
|
||||
}
|
||||
|
||||
static JSObject* getOrCreateCustomErrorPrototype(JSContext* cx,
|
||||
Handle<GlobalObject*> global,
|
||||
JSExnType exnType)
|
||||
static JSObject*
|
||||
getOrCreateCustomErrorPrototype(JSContext* cx, Handle<GlobalObject*> global,
|
||||
JSExnType exnType)
|
||||
{
|
||||
JSProtoKey key = GetExceptionProtoKey(exnType);
|
||||
if (!ensureConstructor(cx, global, key))
|
||||
|
@ -439,35 +443,41 @@ class GlobalObject : public NativeObject
|
|||
return getOrCreateCustomErrorPrototype(cx, global, JSEXN_ERR);
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateSetPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
static NativeObject*
|
||||
getOrCreateSetPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_Set))
|
||||
return nullptr;
|
||||
return &global->getPrototype(JSProto_Set).toObject().as<NativeObject>();
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateWeakSetPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
static NativeObject*
|
||||
getOrCreateWeakSetPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_WeakSet))
|
||||
return nullptr;
|
||||
return &global->getPrototype(JSProto_WeakSet).toObject().as<NativeObject>();
|
||||
}
|
||||
|
||||
JSObject* getOrCreateIntlObject(JSContext* cx) {
|
||||
return getOrCreateObject(cx, APPLICATION_SLOTS + JSProto_Intl, initIntlObject);
|
||||
static JSObject*
|
||||
getOrCreateIntlObject(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return getOrCreateObject(cx, global, APPLICATION_SLOTS + JSProto_Intl, initIntlObject);
|
||||
}
|
||||
|
||||
JSObject* getOrCreateTypedObjectModule(JSContext* cx) {
|
||||
return getOrCreateObject(cx, APPLICATION_SLOTS + JSProto_TypedObject, initTypedObjectModule);
|
||||
static JSObject*
|
||||
getOrCreateTypedObjectModule(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return getOrCreateObject(cx, global, APPLICATION_SLOTS + JSProto_TypedObject,
|
||||
initTypedObjectModule);
|
||||
}
|
||||
|
||||
JSObject* getOrCreateSimdGlobalObject(JSContext* cx) {
|
||||
return getOrCreateObject(cx, APPLICATION_SLOTS + JSProto_SIMD, initSimdObject);
|
||||
static JSObject*
|
||||
getOrCreateSimdGlobalObject(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return getOrCreateObject(cx, global, APPLICATION_SLOTS + JSProto_SIMD, initSimdObject);
|
||||
}
|
||||
|
||||
// Get the type descriptor for one of the SIMD types.
|
||||
// simdType is one of the JS_SIMDTYPEREPR_* constants.
|
||||
// Implemented in builtin/SIMD.cpp.
|
||||
static SimdTypeDescr* getOrCreateSimdTypeDescr(JSContext* cx, Handle<GlobalObject*> global,
|
||||
SimdType simdType);
|
||||
static SimdTypeDescr*
|
||||
getOrCreateSimdTypeDescr(JSContext* cx, Handle<GlobalObject*> global, SimdType simdType);
|
||||
|
||||
TypedObjectModuleObject& getTypedObjectModule() const;
|
||||
|
||||
|
@ -475,16 +485,19 @@ class GlobalObject : public NativeObject
|
|||
return &getPrototype(JSProto_Iterator).toObject();
|
||||
}
|
||||
|
||||
JSObject* getOrCreateCollatorPrototype(JSContext* cx) {
|
||||
return getOrCreateObject(cx, COLLATOR_PROTO, initIntlObject);
|
||||
static JSObject*
|
||||
getOrCreateCollatorPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return getOrCreateObject(cx, global, COLLATOR_PROTO, initIntlObject);
|
||||
}
|
||||
|
||||
JSObject* getOrCreateNumberFormatPrototype(JSContext* cx) {
|
||||
return getOrCreateObject(cx, NUMBER_FORMAT_PROTO, initIntlObject);
|
||||
static JSObject*
|
||||
getOrCreateNumberFormatPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return getOrCreateObject(cx, global, NUMBER_FORMAT_PROTO, initIntlObject);
|
||||
}
|
||||
|
||||
JSObject* getOrCreateDateTimeFormatPrototype(JSContext* cx) {
|
||||
return getOrCreateObject(cx, DATE_TIME_FORMAT_PROTO, initIntlObject);
|
||||
static JSObject*
|
||||
getOrCreateDateTimeFormatPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return getOrCreateObject(cx, global, DATE_TIME_FORMAT_PROTO, initIntlObject);
|
||||
}
|
||||
|
||||
static bool ensureModulePrototypesCreated(JSContext *cx, Handle<GlobalObject*> global);
|
||||
|
@ -539,88 +552,86 @@ class GlobalObject : public NativeObject
|
|||
private:
|
||||
typedef bool (*ObjectInitOp)(JSContext* cx, Handle<GlobalObject*> global);
|
||||
|
||||
JSObject* getOrCreateObject(JSContext* cx, unsigned slot, ObjectInitOp init) {
|
||||
Value v = getSlotRef(slot);
|
||||
static JSObject*
|
||||
getOrCreateObject(JSContext* cx, Handle<GlobalObject*> global, unsigned slot,
|
||||
ObjectInitOp init)
|
||||
{
|
||||
Value v = global->getSlotRef(slot);
|
||||
if (v.isObject())
|
||||
return &v.toObject();
|
||||
RootedGlobalObject self(cx, this);
|
||||
if (!init(cx, self))
|
||||
if (!init(cx, global))
|
||||
return nullptr;
|
||||
return &self->getSlot(slot).toObject();
|
||||
return &global->getSlot(slot).toObject();
|
||||
}
|
||||
|
||||
public:
|
||||
static NativeObject* getOrCreateIteratorPrototype(JSContext* cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
return MaybeNativeObject(global->getOrCreateObject(cx, ITERATOR_PROTO, initIteratorProto));
|
||||
static NativeObject*
|
||||
getOrCreateIteratorPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return MaybeNativeObject(getOrCreateObject(cx, global, ITERATOR_PROTO, initIteratorProto));
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateArrayIteratorPrototype(JSContext* cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
return MaybeNativeObject(global->getOrCreateObject(cx, ARRAY_ITERATOR_PROTO, initArrayIteratorProto));
|
||||
static NativeObject*
|
||||
getOrCreateArrayIteratorPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return MaybeNativeObject(getOrCreateObject(cx, global, ARRAY_ITERATOR_PROTO,
|
||||
initArrayIteratorProto));
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateStringIteratorPrototype(JSContext* cx,
|
||||
Handle<GlobalObject*> global)
|
||||
{
|
||||
return MaybeNativeObject(global->getOrCreateObject(cx, STRING_ITERATOR_PROTO, initStringIteratorProto));
|
||||
static NativeObject*
|
||||
getOrCreateStringIteratorPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return MaybeNativeObject(getOrCreateObject(cx, global, STRING_ITERATOR_PROTO,
|
||||
initStringIteratorProto));
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateLegacyGeneratorObjectPrototype(JSContext* cx,
|
||||
Handle<GlobalObject*> global)
|
||||
{
|
||||
return MaybeNativeObject(global->getOrCreateObject(cx, LEGACY_GENERATOR_OBJECT_PROTO,
|
||||
initLegacyGeneratorProto));
|
||||
static NativeObject*
|
||||
getOrCreateLegacyGeneratorObjectPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return MaybeNativeObject(getOrCreateObject(cx, global, LEGACY_GENERATOR_OBJECT_PROTO,
|
||||
initLegacyGeneratorProto));
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateStarGeneratorObjectPrototype(JSContext* cx,
|
||||
Handle<GlobalObject*> global)
|
||||
static NativeObject*
|
||||
getOrCreateStarGeneratorObjectPrototype(JSContext* cx, Handle<GlobalObject*> global)
|
||||
{
|
||||
return MaybeNativeObject(global->getOrCreateObject(cx, STAR_GENERATOR_OBJECT_PROTO, initStarGenerators));
|
||||
return MaybeNativeObject(getOrCreateObject(cx, global, STAR_GENERATOR_OBJECT_PROTO,
|
||||
initStarGenerators));
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateStarGeneratorFunctionPrototype(JSContext* cx,
|
||||
Handle<GlobalObject*> global)
|
||||
{
|
||||
return MaybeNativeObject(global->getOrCreateObject(cx, STAR_GENERATOR_FUNCTION_PROTO, initStarGenerators));
|
||||
static NativeObject*
|
||||
getOrCreateStarGeneratorFunctionPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return MaybeNativeObject(getOrCreateObject(cx, global, STAR_GENERATOR_FUNCTION_PROTO,
|
||||
initStarGenerators));
|
||||
}
|
||||
|
||||
static JSObject* getOrCreateStarGeneratorFunction(JSContext* cx,
|
||||
Handle<GlobalObject*> global)
|
||||
{
|
||||
return global->getOrCreateObject(cx, STAR_GENERATOR_FUNCTION, initStarGenerators);
|
||||
static JSObject*
|
||||
getOrCreateStarGeneratorFunction(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return getOrCreateObject(cx, global, STAR_GENERATOR_FUNCTION, initStarGenerators);
|
||||
}
|
||||
|
||||
static NativeObject* getOrCreateAsyncFunctionPrototype(JSContext* cx,
|
||||
Handle<GlobalObject*> global)
|
||||
{
|
||||
return MaybeNativeObject(global->getOrCreateObject(cx, ASYNC_FUNCTION_PROTO,
|
||||
initAsyncFunction));
|
||||
static NativeObject*
|
||||
getOrCreateAsyncFunctionPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return MaybeNativeObject(getOrCreateObject(cx, global, ASYNC_FUNCTION_PROTO,
|
||||
initAsyncFunction));
|
||||
}
|
||||
|
||||
static JSObject* getOrCreateAsyncFunction(JSContext* cx,
|
||||
Handle<GlobalObject*> global)
|
||||
{
|
||||
return global->getOrCreateObject(cx, ASYNC_FUNCTION, initAsyncFunction);
|
||||
static JSObject*
|
||||
getOrCreateAsyncFunction(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return getOrCreateObject(cx, global, ASYNC_FUNCTION, initAsyncFunction);
|
||||
}
|
||||
|
||||
static JSObject* getOrCreateMapIteratorPrototype(JSContext* cx,
|
||||
Handle<GlobalObject*> global)
|
||||
{
|
||||
return global->getOrCreateObject(cx, MAP_ITERATOR_PROTO, initMapIteratorProto);
|
||||
static JSObject*
|
||||
getOrCreateMapIteratorPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return getOrCreateObject(cx, global, MAP_ITERATOR_PROTO, initMapIteratorProto);
|
||||
}
|
||||
|
||||
static JSObject* getOrCreateSetIteratorPrototype(JSContext* cx,
|
||||
Handle<GlobalObject*> global)
|
||||
{
|
||||
return global->getOrCreateObject(cx, SET_ITERATOR_PROTO, initSetIteratorProto);
|
||||
static JSObject*
|
||||
getOrCreateSetIteratorPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
return getOrCreateObject(cx, global, SET_ITERATOR_PROTO, initSetIteratorProto);
|
||||
}
|
||||
|
||||
JSObject* getOrCreateDataViewPrototype(JSContext* cx) {
|
||||
RootedGlobalObject self(cx, this);
|
||||
if (!ensureConstructor(cx, self, JSProto_DataView))
|
||||
static JSObject*
|
||||
getOrCreateDataViewPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||
if (!ensureConstructor(cx, global, JSProto_DataView))
|
||||
return nullptr;
|
||||
return &self->getPrototype(JSProto_DataView).toObject();
|
||||
return &global->getPrototype(JSProto_DataView).toObject();
|
||||
}
|
||||
|
||||
static JSFunction*
|
||||
|
@ -678,8 +689,9 @@ class GlobalObject : public NativeObject
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool getIntrinsicValue(JSContext* cx, Handle<GlobalObject*> global,
|
||||
HandlePropertyName name, MutableHandleValue value)
|
||||
static bool
|
||||
getIntrinsicValue(JSContext* cx, Handle<GlobalObject*> global,
|
||||
HandlePropertyName name, MutableHandleValue value)
|
||||
{
|
||||
bool exists = false;
|
||||
if (!GlobalObject::maybeGetIntrinsicValue(cx, global, name, value, &exists))
|
||||
|
@ -709,7 +721,8 @@ class GlobalObject : public NativeObject
|
|||
unsigned nargs, MutableHandleValue funVal);
|
||||
|
||||
bool hasRegExpStatics() const;
|
||||
RegExpStatics* getRegExpStatics(ExclusiveContext* cx) const;
|
||||
static RegExpStatics* getRegExpStatics(ExclusiveContext* cx,
|
||||
Handle<GlobalObject*> global);
|
||||
RegExpStatics* getAlreadyCreatedRegExpStatics() const;
|
||||
|
||||
JSObject* getThrowTypeError() const {
|
||||
|
@ -996,7 +1009,7 @@ GenericCreateConstructor(JSContext* cx, JSProtoKey key)
|
|||
// Note - We duplicate the trick from ClassName() so that we don't need to
|
||||
// include jsatominlines.h here.
|
||||
PropertyName* name = (&cx->names().Null)[key];
|
||||
return cx->global()->createConstructor(cx, ctor, name, length, kind, jitInfo);
|
||||
return GlobalObject::createConstructor(cx, ctor, name, length, kind, jitInfo);
|
||||
}
|
||||
|
||||
inline JSObject*
|
||||
|
@ -1009,7 +1022,7 @@ GenericCreatePrototype(JSContext* cx, JSProtoKey key)
|
|||
if (!GlobalObject::ensureConstructor(cx, cx->global(), protoKey))
|
||||
return nullptr;
|
||||
RootedObject parentProto(cx, &cx->global()->getPrototype(protoKey).toObject());
|
||||
return cx->global()->createBlankPrototypeInheriting(cx, clasp, parentProto);
|
||||
return GlobalObject::createBlankPrototypeInheriting(cx, cx->global(), clasp, parentProto);
|
||||
}
|
||||
|
||||
inline JSProtoKey
|
||||
|
|
|
@ -1291,7 +1291,7 @@ GlobalHelperThreadState::finishModuleParseTask(JSContext* cx, void* token)
|
|||
MOZ_ASSERT(script->module());
|
||||
|
||||
RootedModuleObject module(cx, script->module());
|
||||
module->fixEnvironmentsAfterCompartmentMerge(cx);
|
||||
module->fixEnvironmentsAfterCompartmentMerge();
|
||||
if (!ModuleObject::Freeze(cx, module))
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -830,7 +830,7 @@ class FastCallGuard
|
|||
|
||||
if (useIon_ && fun_) {
|
||||
if (!script_) {
|
||||
script_ = fun_->getOrCreateScript(cx);
|
||||
script_ = JSFunction::getOrCreateScript(cx, fun_);
|
||||
if (!script_)
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -373,7 +373,7 @@ js::RunScript(JSContext* cx, RunState& state)
|
|||
|
||||
SPSEntryMarker marker(cx->runtime(), state.script());
|
||||
|
||||
state.script()->ensureNonLazyCanonicalFunction(cx);
|
||||
state.script()->ensureNonLazyCanonicalFunction();
|
||||
|
||||
if (jit::IsIonEnabled(cx)) {
|
||||
jit::MethodStatus status = jit::CanEnter(cx, state);
|
||||
|
@ -446,7 +446,7 @@ js::InternalCallOrConstruct(JSContext* cx, const CallArgs& args, MaybeConstruct
|
|||
}
|
||||
|
||||
/* Invoke native functions. */
|
||||
JSFunction* fun = &args.callee().as<JSFunction>();
|
||||
RootedFunction fun(cx, &args.callee().as<JSFunction>());
|
||||
if (construct != CONSTRUCT && fun->isClassConstructor()) {
|
||||
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_CANT_CALL_CLASS_CONSTRUCTOR);
|
||||
return false;
|
||||
|
@ -457,7 +457,7 @@ js::InternalCallOrConstruct(JSContext* cx, const CallArgs& args, MaybeConstruct
|
|||
return CallJSNative(cx, fun->native(), args);
|
||||
}
|
||||
|
||||
if (!fun->getOrCreateScript(cx))
|
||||
if (!JSFunction::getOrCreateScript(cx, fun))
|
||||
return false;
|
||||
|
||||
/* Run function until JSOP_RETRVAL, JSOP_RETURN or error. */
|
||||
|
@ -1543,7 +1543,7 @@ SetObjectElementOperation(JSContext* cx, HandleObject obj, HandleId id, HandleVa
|
|||
}
|
||||
}
|
||||
|
||||
if (obj->isNative() && !JSID_IS_INT(id) && !obj->setHadElementsAccess(cx))
|
||||
if (obj->isNative() && !JSID_IS_INT(id) && !JSObject::setHadElementsAccess(cx, obj))
|
||||
return false;
|
||||
|
||||
ObjectOpResult result;
|
||||
|
@ -3000,7 +3000,7 @@ CASE(JSOP_FUNCALL)
|
|||
{
|
||||
MOZ_ASSERT(maybeFun);
|
||||
ReservedRooted<JSFunction*> fun(&rootFunction0, maybeFun);
|
||||
ReservedRooted<JSScript*> funScript(&rootScript0, fun->getOrCreateScript(cx));
|
||||
ReservedRooted<JSScript*> funScript(&rootScript0, JSFunction::getOrCreateScript(cx, fun));
|
||||
if (!funScript)
|
||||
goto error;
|
||||
|
||||
|
@ -4725,7 +4725,8 @@ js::RunOnceScriptPrologue(JSContext* cx, HandleScript script)
|
|||
|
||||
// Force instantiation of the script's function's group to ensure the flag
|
||||
// is preserved in type information.
|
||||
if (!script->functionNonDelazifying()->getGroup(cx))
|
||||
RootedFunction fun(cx, script->functionNonDelazifying());
|
||||
if (!JSObject::getGroup(cx, fun))
|
||||
return false;
|
||||
|
||||
MarkObjectGroupFlags(cx, script->functionNonDelazifying(), OBJECT_FLAG_RUNONCE_INVALIDATED);
|
||||
|
|
|
@ -672,10 +672,10 @@ NativeObject::maybeDensifySparseElements(js::ExclusiveContext* cx, HandleNativeO
|
|||
*/
|
||||
if (shape != obj->lastProperty()) {
|
||||
shape = shape->previous();
|
||||
if (!obj->removeProperty(cx, id))
|
||||
if (!NativeObject::removeProperty(cx, obj, id))
|
||||
return DenseElementResult::Failure;
|
||||
} else {
|
||||
if (!obj->removeProperty(cx, id))
|
||||
if (!NativeObject::removeProperty(cx, obj, id))
|
||||
return DenseElementResult::Failure;
|
||||
shape = obj->lastProperty();
|
||||
}
|
||||
|
@ -691,7 +691,7 @@ NativeObject::maybeDensifySparseElements(js::ExclusiveContext* cx, HandleNativeO
|
|||
* flag so that we will not start using sparse indexes again if we need
|
||||
* to grow the object.
|
||||
*/
|
||||
if (!obj->clearFlag(cx, BaseShape::INDEXED))
|
||||
if (!NativeObject::clearFlag(cx, obj, BaseShape::INDEXED))
|
||||
return DenseElementResult::Failure;
|
||||
|
||||
return DenseElementResult::Success;
|
||||
|
@ -996,23 +996,22 @@ NativeObject::freeSlot(ExclusiveContext* cx, uint32_t slot)
|
|||
setSlot(slot, UndefinedValue());
|
||||
}
|
||||
|
||||
Shape*
|
||||
NativeObject::addDataProperty(ExclusiveContext* cx, jsid idArg, uint32_t slot, unsigned attrs)
|
||||
/* static */ Shape*
|
||||
NativeObject::addDataProperty(ExclusiveContext* cx, HandleNativeObject obj,
|
||||
jsid idArg, uint32_t slot, unsigned attrs)
|
||||
{
|
||||
MOZ_ASSERT(!(attrs & (JSPROP_GETTER | JSPROP_SETTER)));
|
||||
RootedNativeObject self(cx, this);
|
||||
RootedId id(cx, idArg);
|
||||
return addProperty(cx, self, id, nullptr, nullptr, slot, attrs, 0);
|
||||
return addProperty(cx, obj, id, nullptr, nullptr, slot, attrs, 0);
|
||||
}
|
||||
|
||||
Shape*
|
||||
NativeObject::addDataProperty(ExclusiveContext* cx, HandlePropertyName name,
|
||||
uint32_t slot, unsigned attrs)
|
||||
/* static */ Shape*
|
||||
NativeObject::addDataProperty(ExclusiveContext* cx, HandleNativeObject obj,
|
||||
HandlePropertyName name, uint32_t slot, unsigned attrs)
|
||||
{
|
||||
MOZ_ASSERT(!(attrs & (JSPROP_GETTER | JSPROP_SETTER)));
|
||||
RootedNativeObject self(cx, this);
|
||||
RootedId id(cx, NameToId(name));
|
||||
return addProperty(cx, self, id, nullptr, nullptr, slot, attrs, 0);
|
||||
return addProperty(cx, obj, id, nullptr, nullptr, slot, attrs, 0);
|
||||
}
|
||||
|
||||
template <AllowGC allowGC>
|
||||
|
@ -1046,7 +1045,7 @@ CallAddPropertyHook(ExclusiveContext* cx, HandleNativeObject obj, HandleShape sh
|
|||
|
||||
RootedId id(cx, shape->propid());
|
||||
if (!CallJSAddPropertyOp(cx->asJSContext(), addProperty, obj, id, value)) {
|
||||
obj->removeProperty(cx, shape->propid());
|
||||
NativeObject::removeProperty(cx, obj, shape->propid());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -1118,7 +1117,7 @@ PurgeProtoChain(ExclusiveContext* cx, JSObject* objArg, HandleId id)
|
|||
|
||||
shape = obj->as<NativeObject>().lookup(cx, id);
|
||||
if (shape)
|
||||
return obj->as<NativeObject>().shadowingShapeChange(cx, *shape);
|
||||
return NativeObject::shadowingShapeChange(cx, obj.as<NativeObject>(), *shape);
|
||||
|
||||
obj = obj->staticPrototype();
|
||||
}
|
||||
|
@ -2529,7 +2528,7 @@ js::NativeDeleteProperty(JSContext* cx, HandleNativeObject obj, HandleId id,
|
|||
|
||||
obj->setDenseElementHole(cx, JSID_TO_INT(id));
|
||||
} else {
|
||||
if (!obj->removeProperty(cx, id))
|
||||
if (!NativeObject::removeProperty(cx, obj, id))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -491,8 +491,8 @@ class NativeObject : public ShapedObject
|
|||
void checkShapeConsistency() { }
|
||||
#endif
|
||||
|
||||
Shape*
|
||||
replaceWithNewEquivalentShape(ExclusiveContext* cx,
|
||||
static Shape*
|
||||
replaceWithNewEquivalentShape(ExclusiveContext* cx, HandleNativeObject obj,
|
||||
Shape* existingShape, Shape* newShape = nullptr,
|
||||
bool accessorShape = false);
|
||||
|
||||
|
@ -510,7 +510,7 @@ class NativeObject : public ShapedObject
|
|||
*/
|
||||
bool setSlotSpan(ExclusiveContext* cx, uint32_t span);
|
||||
|
||||
bool toDictionaryMode(ExclusiveContext* cx);
|
||||
static MOZ_MUST_USE bool toDictionaryMode(ExclusiveContext* cx, HandleNativeObject obj);
|
||||
|
||||
private:
|
||||
friend class TenuringTracer;
|
||||
|
@ -609,12 +609,15 @@ class NativeObject : public ShapedObject
|
|||
}
|
||||
|
||||
public:
|
||||
bool generateOwnShape(ExclusiveContext* cx, Shape* newShape = nullptr) {
|
||||
return replaceWithNewEquivalentShape(cx, lastProperty(), newShape);
|
||||
static MOZ_MUST_USE bool generateOwnShape(ExclusiveContext* cx, HandleNativeObject obj,
|
||||
Shape* newShape = nullptr)
|
||||
{
|
||||
return replaceWithNewEquivalentShape(cx, obj, obj->lastProperty(), newShape);
|
||||
}
|
||||
|
||||
bool shadowingShapeChange(ExclusiveContext* cx, const Shape& shape);
|
||||
bool clearFlag(ExclusiveContext* cx, BaseShape::Flag flag);
|
||||
static MOZ_MUST_USE bool shadowingShapeChange(ExclusiveContext* cx, HandleNativeObject obj,
|
||||
const Shape& shape);
|
||||
static bool clearFlag(ExclusiveContext* cx, HandleNativeObject obj, BaseShape::Flag flag);
|
||||
|
||||
// The maximum number of slots in an object.
|
||||
// |MAX_SLOTS_COUNT * sizeof(JS::Value)| shouldn't overflow
|
||||
|
@ -741,10 +744,10 @@ class NativeObject : public ShapedObject
|
|||
bool allowDictionary = true);
|
||||
|
||||
/* Add a data property whose id is not yet in this scope. */
|
||||
Shape* addDataProperty(ExclusiveContext* cx,
|
||||
jsid id_, uint32_t slot, unsigned attrs);
|
||||
Shape* addDataProperty(ExclusiveContext* cx, HandlePropertyName name,
|
||||
uint32_t slot, unsigned attrs);
|
||||
static Shape* addDataProperty(ExclusiveContext* cx, HandleNativeObject obj,
|
||||
jsid id_, uint32_t slot, unsigned attrs);
|
||||
static Shape* addDataProperty(ExclusiveContext* cx, HandleNativeObject obj,
|
||||
HandlePropertyName name, uint32_t slot, unsigned attrs);
|
||||
|
||||
/* Add or overwrite a property for id in this scope. */
|
||||
static Shape*
|
||||
|
@ -764,7 +767,7 @@ class NativeObject : public ShapedObject
|
|||
unsigned attrs, JSGetterOp getter, JSSetterOp setter);
|
||||
|
||||
/* Remove the property named by id from this object. */
|
||||
bool removeProperty(ExclusiveContext* cx, jsid id);
|
||||
static bool removeProperty(ExclusiveContext* cx, HandleNativeObject obj, jsid id);
|
||||
|
||||
/* Clear the scope, making it empty. */
|
||||
static void clear(ExclusiveContext* cx, HandleNativeObject obj);
|
||||
|
@ -783,7 +786,8 @@ class NativeObject : public ShapedObject
|
|||
unsigned flags, ShapeTable::Entry* entry, bool allowDictionary,
|
||||
const AutoKeepShapeTables& keep);
|
||||
|
||||
bool fillInAfterSwap(JSContext* cx, const Vector<Value>& values, void* priv);
|
||||
static MOZ_MUST_USE bool fillInAfterSwap(JSContext* cx, HandleNativeObject obj,
|
||||
const Vector<Value>& values, void* priv);
|
||||
|
||||
public:
|
||||
// Return true if this object has been converted from shared-immutable
|
||||
|
|
|
@ -249,7 +249,7 @@ ObjectGroup::useSingletonForAllocationSite(JSScript* script, jsbytecode* pc, con
|
|||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool
|
||||
JSObject::shouldSplicePrototype(JSContext* cx)
|
||||
JSObject::shouldSplicePrototype()
|
||||
{
|
||||
/*
|
||||
* During bootstrapping, if inference is enabled we need to make sure not
|
||||
|
@ -262,33 +262,36 @@ JSObject::shouldSplicePrototype(JSContext* cx)
|
|||
return isSingleton();
|
||||
}
|
||||
|
||||
bool
|
||||
JSObject::splicePrototype(JSContext* cx, const Class* clasp, Handle<TaggedProto> proto)
|
||||
/* static */ bool
|
||||
JSObject::splicePrototype(JSContext* cx, HandleObject obj, const Class* clasp,
|
||||
Handle<TaggedProto> proto)
|
||||
{
|
||||
MOZ_ASSERT(cx->compartment() == compartment());
|
||||
|
||||
RootedObject self(cx, this);
|
||||
MOZ_ASSERT(cx->compartment() == obj->compartment());
|
||||
|
||||
/*
|
||||
* For singleton groups representing only a single JSObject, the proto
|
||||
* can be rearranged as needed without destroying type information for
|
||||
* the old or new types.
|
||||
*/
|
||||
MOZ_ASSERT(self->isSingleton());
|
||||
MOZ_ASSERT(obj->isSingleton());
|
||||
|
||||
// Windows may not appear on prototype chains.
|
||||
MOZ_ASSERT_IF(proto.isObject(), !IsWindow(proto.toObject()));
|
||||
|
||||
if (proto.isObject() && !proto.toObject()->setDelegate(cx))
|
||||
return false;
|
||||
if (proto.isObject()) {
|
||||
RootedObject protoObj(cx, proto.toObject());
|
||||
if (!JSObject::setDelegate(cx, protoObj))
|
||||
return false;
|
||||
}
|
||||
|
||||
// Force type instantiation when splicing lazy group.
|
||||
RootedObjectGroup group(cx, self->getGroup(cx));
|
||||
RootedObjectGroup group(cx, JSObject::getGroup(cx, obj));
|
||||
if (!group)
|
||||
return false;
|
||||
RootedObjectGroup protoGroup(cx, nullptr);
|
||||
if (proto.isObject()) {
|
||||
protoGroup = proto.toObject()->getGroup(cx);
|
||||
RootedObject protoObj(cx, proto.toObject());
|
||||
protoGroup = JSObject::getGroup(cx, protoObj);
|
||||
if (!protoGroup)
|
||||
return false;
|
||||
}
|
||||
|
@ -307,7 +310,7 @@ JSObject::makeLazyGroup(JSContext* cx, HandleObject obj)
|
|||
/* De-lazification of functions can GC, so we need to do it up here. */
|
||||
if (obj->is<JSFunction>() && obj->as<JSFunction>().isInterpretedLazy()) {
|
||||
RootedFunction fun(cx, &obj->as<JSFunction>());
|
||||
if (!fun->getOrCreateScript(cx))
|
||||
if (!JSFunction::getOrCreateScript(cx, fun))
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -346,7 +349,7 @@ JSObject::makeLazyGroup(JSContext* cx, HandleObject obj)
|
|||
JSObject::setNewGroupUnknown(JSContext* cx, const js::Class* clasp, JS::HandleObject obj)
|
||||
{
|
||||
ObjectGroup::setDefaultNewGroupUnknown(cx, clasp, obj);
|
||||
return obj->setFlags(cx, BaseShape::NEW_GROUP_UNKNOWN);
|
||||
return JSObject::setFlags(cx, obj, BaseShape::NEW_GROUP_UNKNOWN);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
@ -508,7 +511,7 @@ ObjectGroup::defaultNewGroup(ExclusiveContext* cx, const Class* clasp,
|
|||
|
||||
if (proto.isObject() && !proto.toObject()->isDelegate()) {
|
||||
RootedObject protoObj(cx, proto.toObject());
|
||||
if (!protoObj->setDelegate(cx))
|
||||
if (!JSObject::setDelegate(cx, protoObj))
|
||||
return nullptr;
|
||||
|
||||
// Objects which are prototypes of one another should be singletons, so
|
||||
|
|
|
@ -104,7 +104,7 @@ class ProxyObject : public ShapedObject
|
|||
public:
|
||||
static unsigned grayLinkExtraSlot(JSObject* obj);
|
||||
|
||||
void renew(JSContext* cx, const BaseProxyHandler* handler, const Value& priv);
|
||||
void renew(const BaseProxyHandler* handler, const Value& priv);
|
||||
|
||||
static void trace(JSTracer* trc, JSObject* obj);
|
||||
|
||||
|
|
|
@ -129,10 +129,10 @@ RegExpSharedReadBarrier(JSContext* cx, RegExpShared* shared)
|
|||
shared->unmarkGray();
|
||||
}
|
||||
|
||||
bool
|
||||
RegExpObject::getShared(JSContext* cx, RegExpGuard* g)
|
||||
/* static */ bool
|
||||
RegExpObject::getShared(JSContext* cx, Handle<RegExpObject*> regexp, RegExpGuard* g)
|
||||
{
|
||||
if (RegExpShared* shared = maybeShared()) {
|
||||
if (RegExpShared* shared = regexp->maybeShared()) {
|
||||
// Fetching a RegExpShared from an object requires a read
|
||||
// barrier, as the shared pointer might be weak.
|
||||
RegExpSharedReadBarrier(cx, shared);
|
||||
|
@ -141,7 +141,7 @@ RegExpObject::getShared(JSContext* cx, RegExpGuard* g)
|
|||
return true;
|
||||
}
|
||||
|
||||
return createShared(cx, g);
|
||||
return createShared(cx, regexp, g);
|
||||
}
|
||||
|
||||
/* static */ bool
|
||||
|
@ -199,7 +199,7 @@ RegExpObject::trace(JSTracer* trc, JSObject* obj)
|
|||
static JSObject*
|
||||
CreateRegExpPrototype(JSContext* cx, JSProtoKey key)
|
||||
{
|
||||
return cx->global()->createBlankPrototype(cx, &RegExpObject::protoClass_);
|
||||
return GlobalObject::createBlankPrototype(cx, cx->global(), &RegExpObject::protoClass_);
|
||||
}
|
||||
|
||||
static const ClassOps RegExpObjectClassOps = {
|
||||
|
@ -279,16 +279,14 @@ RegExpObject::create(ExclusiveContext* cx, HandleAtom source, RegExpFlag flags,
|
|||
return regexp;
|
||||
}
|
||||
|
||||
bool
|
||||
RegExpObject::createShared(JSContext* cx, RegExpGuard* g)
|
||||
/* static */ bool
|
||||
RegExpObject::createShared(JSContext* cx, Handle<RegExpObject*> regexp, RegExpGuard* g)
|
||||
{
|
||||
Rooted<RegExpObject*> self(cx, this);
|
||||
|
||||
MOZ_ASSERT(!maybeShared());
|
||||
if (!cx->compartment()->regExps.get(cx, getSource(), getFlags(), g))
|
||||
MOZ_ASSERT(!regexp->maybeShared());
|
||||
if (!cx->compartment()->regExps.get(cx, regexp->getSource(), regexp->getFlags(), g))
|
||||
return false;
|
||||
|
||||
self->setShared(**g);
|
||||
regexp->setShared(**g);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -300,7 +298,8 @@ RegExpObject::assignInitialShape(ExclusiveContext* cx, Handle<RegExpObject*> sel
|
|||
JS_STATIC_ASSERT(LAST_INDEX_SLOT == 0);
|
||||
|
||||
/* The lastIndex property alone is writable but non-configurable. */
|
||||
return self->addDataProperty(cx, cx->names().lastIndex, LAST_INDEX_SLOT, JSPROP_PERMANENT);
|
||||
return NativeObject::addDataProperty(cx, self, cx->names().lastIndex, LAST_INDEX_SLOT,
|
||||
JSPROP_PERMANENT);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -891,11 +890,12 @@ RegExpShared::dumpBytecode(JSContext* cx, bool match_only, HandleLinearString in
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
RegExpObject::dumpBytecode(JSContext* cx, bool match_only, HandleLinearString input)
|
||||
/* static */ bool
|
||||
RegExpObject::dumpBytecode(JSContext* cx, Handle<RegExpObject*> regexp,
|
||||
bool match_only, HandleLinearString input)
|
||||
{
|
||||
RegExpGuard g(cx);
|
||||
if (!getShared(cx, &g))
|
||||
if (!getShared(cx, regexp, &g))
|
||||
return false;
|
||||
|
||||
return g.re()->dumpBytecode(cx, match_only, input);
|
||||
|
@ -1430,7 +1430,7 @@ js::CloneRegExpObject(JSContext* cx, JSObject* obj_)
|
|||
Rooted<JSAtom*> source(cx, regex->getSource());
|
||||
|
||||
RegExpGuard g(cx);
|
||||
if (!regex->getShared(cx, &g))
|
||||
if (!RegExpObject::getShared(cx, regex, &g))
|
||||
return nullptr;
|
||||
|
||||
clone->initAndZeroLastIndex(source, g->getFlags(), cx);
|
||||
|
|
|
@ -483,7 +483,8 @@ class RegExpObject : public NativeObject
|
|||
|
||||
static bool isOriginalFlagGetter(JSNative native, RegExpFlag* mask);
|
||||
|
||||
bool getShared(JSContext* cx, RegExpGuard* g);
|
||||
static MOZ_MUST_USE bool getShared(JSContext* cx, Handle<RegExpObject*> regexp,
|
||||
RegExpGuard* g);
|
||||
|
||||
void setShared(RegExpShared& shared) {
|
||||
MOZ_ASSERT(!maybeShared());
|
||||
|
@ -500,7 +501,8 @@ class RegExpObject : public NativeObject
|
|||
void initAndZeroLastIndex(HandleAtom source, RegExpFlag flags, ExclusiveContext* cx);
|
||||
|
||||
#ifdef DEBUG
|
||||
bool dumpBytecode(JSContext* cx, bool match_only, HandleLinearString input);
|
||||
static MOZ_MUST_USE bool dumpBytecode(JSContext* cx, Handle<RegExpObject*> regexp,
|
||||
bool match_only, HandleLinearString input);
|
||||
#endif
|
||||
|
||||
private:
|
||||
|
@ -508,7 +510,8 @@ class RegExpObject : public NativeObject
|
|||
* Precondition: the syntax for |source| has already been validated.
|
||||
* Side effect: sets the private field.
|
||||
*/
|
||||
bool createShared(JSContext* cx, RegExpGuard* g);
|
||||
static MOZ_MUST_USE bool createShared(JSContext* cx, Handle<RegExpObject*> regexp,
|
||||
RegExpGuard* g);
|
||||
RegExpShared* maybeShared() const {
|
||||
return static_cast<RegExpShared*>(NativeObject::getPrivate(PRIVATE_SLOT));
|
||||
}
|
||||
|
@ -531,7 +534,7 @@ inline bool
|
|||
RegExpToShared(JSContext* cx, HandleObject obj, RegExpGuard* g)
|
||||
{
|
||||
if (obj->is<RegExpObject>())
|
||||
return obj->as<RegExpObject>().getShared(cx, g);
|
||||
return RegExpObject::getShared(cx, obj.as<RegExpObject>(), g);
|
||||
|
||||
return Proxy::regexp_toShared(cx, obj, g);
|
||||
}
|
||||
|
|
|
@ -477,7 +477,7 @@ intrinsic_FinishBoundFunctionInit(JSContext* cx, unsigned argc, Value* vp)
|
|||
// Try to avoid invoking the resolve hook.
|
||||
if (targetObj->is<JSFunction>() && !targetObj->as<JSFunction>().hasResolvedLength()) {
|
||||
RootedValue targetLength(cx);
|
||||
if (!targetObj->as<JSFunction>().getUnresolvedLength(cx, &targetLength))
|
||||
if (!JSFunction::getUnresolvedLength(cx, targetObj.as<JSFunction>(), &targetLength))
|
||||
return false;
|
||||
|
||||
length = Max(0.0, targetLength.toNumber() - argCount);
|
||||
|
@ -3008,7 +3008,7 @@ JSRuntime::cloneSelfHostedFunctionScript(JSContext* cx, HandlePropertyName name,
|
|||
MOZ_ASSERT(targetFun->isInterpretedLazy());
|
||||
MOZ_ASSERT(targetFun->isSelfHostedBuiltin());
|
||||
|
||||
RootedScript sourceScript(cx, sourceFun->getOrCreateScript(cx));
|
||||
RootedScript sourceScript(cx, JSFunction::getOrCreateScript(cx, sourceFun));
|
||||
if (!sourceScript)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -460,15 +460,13 @@ NativeObject::getChildProperty(ExclusiveContext* cx,
|
|||
return shape;
|
||||
}
|
||||
|
||||
bool
|
||||
js::NativeObject::toDictionaryMode(ExclusiveContext* cx)
|
||||
/* static */ bool
|
||||
js::NativeObject::toDictionaryMode(ExclusiveContext* cx, HandleNativeObject obj)
|
||||
{
|
||||
MOZ_ASSERT(!inDictionaryMode());
|
||||
MOZ_ASSERT(cx->isInsideCurrentCompartment(this));
|
||||
MOZ_ASSERT(!obj->inDictionaryMode());
|
||||
MOZ_ASSERT(cx->isInsideCurrentCompartment(obj));
|
||||
|
||||
uint32_t span = slotSpan();
|
||||
|
||||
Rooted<NativeObject*> self(cx, this);
|
||||
uint32_t span = obj->slotSpan();
|
||||
|
||||
// Clone the shapes into a new dictionary list. Don't update the last
|
||||
// property of this object until done, otherwise a GC triggered while
|
||||
|
@ -476,7 +474,7 @@ js::NativeObject::toDictionaryMode(ExclusiveContext* cx)
|
|||
RootedShape root(cx);
|
||||
RootedShape dictionaryShape(cx);
|
||||
|
||||
RootedShape shape(cx, lastProperty());
|
||||
RootedShape shape(cx, obj->lastProperty());
|
||||
while (shape) {
|
||||
MOZ_ASSERT(!shape->inDictionary());
|
||||
|
||||
|
@ -488,7 +486,7 @@ js::NativeObject::toDictionaryMode(ExclusiveContext* cx)
|
|||
|
||||
GCPtrShape* listp = dictionaryShape ? &dictionaryShape->parent : nullptr;
|
||||
StackShape child(shape);
|
||||
dprop->initDictionaryShape(child, self->numFixedSlots(), listp);
|
||||
dprop->initDictionaryShape(child, obj->numFixedSlots(), listp);
|
||||
|
||||
if (!dictionaryShape)
|
||||
root = dprop;
|
||||
|
@ -503,18 +501,18 @@ js::NativeObject::toDictionaryMode(ExclusiveContext* cx)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (IsInsideNursery(self) &&
|
||||
!cx->asJSContext()->gc.nursery.queueDictionaryModeObjectToSweep(self))
|
||||
if (IsInsideNursery(obj) &&
|
||||
!cx->asJSContext()->gc.nursery.queueDictionaryModeObjectToSweep(obj))
|
||||
{
|
||||
ReportOutOfMemory(cx);
|
||||
return false;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(root->listp == nullptr);
|
||||
root->listp = &self->shape_;
|
||||
self->shape_ = root;
|
||||
root->listp = &obj->shape_;
|
||||
obj->shape_ = root;
|
||||
|
||||
MOZ_ASSERT(self->inDictionaryMode());
|
||||
MOZ_ASSERT(obj->inDictionaryMode());
|
||||
root->base()->setSlotSpan(span);
|
||||
|
||||
return true;
|
||||
|
@ -534,7 +532,7 @@ NativeObject::addProperty(ExclusiveContext* cx, HandleNativeObject obj, HandleId
|
|||
return nullptr;
|
||||
if (!extensible) {
|
||||
if (cx->isJSContext())
|
||||
obj->reportNotExtensible(cx->asJSContext());
|
||||
JSObject::reportNotExtensible(cx->asJSContext(), obj);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -592,7 +590,7 @@ NativeObject::addPropertyInternal(ExclusiveContext* cx,
|
|||
if (allowDictionary &&
|
||||
(!stableSlot || ShouldConvertToDictionary(obj)))
|
||||
{
|
||||
if (!obj->toDictionaryMode(cx))
|
||||
if (!toDictionaryMode(cx, obj))
|
||||
return nullptr;
|
||||
table = obj->lastProperty()->maybeTable(keep);
|
||||
entry = &table->search<MaybeAdding::Adding>(id, keep);
|
||||
|
@ -727,7 +725,7 @@ CheckCanChangeAttrs(ExclusiveContext* cx, JSObject* obj, Shape* shape, unsigned*
|
|||
(*attrsp & (JSPROP_GETTER | JSPROP_SETTER | JSPROP_SHARED)))
|
||||
{
|
||||
if (cx->isJSContext())
|
||||
obj->reportNotConfigurable(cx->asJSContext(), shape->propid());
|
||||
JSObject::reportNotConfigurable(cx->asJSContext(), shape->propid());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -785,7 +783,7 @@ NativeObject::putProperty(ExclusiveContext* cx, HandleNativeObject obj, HandleId
|
|||
|
||||
if (!extensible) {
|
||||
if (cx->isJSContext())
|
||||
obj->reportNotExtensible(cx->asJSContext());
|
||||
JSObject::reportNotExtensible(cx->asJSContext(), obj);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -834,7 +832,7 @@ NativeObject::putProperty(ExclusiveContext* cx, HandleNativeObject obj, HandleId
|
|||
* addPropertyInternal because a failure under add would lose data.
|
||||
*/
|
||||
if (shape != obj->lastProperty() && !obj->inDictionaryMode()) {
|
||||
if (!obj->toDictionaryMode(cx))
|
||||
if (!toDictionaryMode(cx, obj))
|
||||
return nullptr;
|
||||
ShapeTable* table = obj->lastProperty()->maybeTable(keep);
|
||||
MOZ_ASSERT(table);
|
||||
|
@ -853,10 +851,11 @@ NativeObject::putProperty(ExclusiveContext* cx, HandleNativeObject obj, HandleId
|
|||
*/
|
||||
bool updateLast = (shape == obj->lastProperty());
|
||||
bool accessorShape = getter || setter || (attrs & (JSPROP_GETTER | JSPROP_SETTER));
|
||||
shape = obj->replaceWithNewEquivalentShape(cx, shape, nullptr, accessorShape);
|
||||
shape = NativeObject::replaceWithNewEquivalentShape(cx, obj, shape, nullptr,
|
||||
accessorShape);
|
||||
if (!shape)
|
||||
return nullptr;
|
||||
if (!updateLast && !obj->generateOwnShape(cx))
|
||||
if (!updateLast && !NativeObject::generateOwnShape(cx, obj))
|
||||
return nullptr;
|
||||
|
||||
/*
|
||||
|
@ -968,16 +967,15 @@ NativeObject::changeProperty(ExclusiveContext* cx, HandleNativeObject obj, Handl
|
|||
return newShape;
|
||||
}
|
||||
|
||||
bool
|
||||
NativeObject::removeProperty(ExclusiveContext* cx, jsid id_)
|
||||
/* static */ bool
|
||||
NativeObject::removeProperty(ExclusiveContext* cx, HandleNativeObject obj, jsid id_)
|
||||
{
|
||||
RootedId id(cx, id_);
|
||||
RootedNativeObject self(cx, this);
|
||||
|
||||
AutoKeepShapeTables keep(cx);
|
||||
ShapeTable::Entry* entry;
|
||||
RootedShape shape(cx);
|
||||
if (!Shape::search(cx, lastProperty(), id, keep, shape.address(), &entry))
|
||||
if (!Shape::search(cx, obj->lastProperty(), id, keep, shape.address(), &entry))
|
||||
return false;
|
||||
|
||||
if (!shape)
|
||||
|
@ -987,10 +985,10 @@ NativeObject::removeProperty(ExclusiveContext* cx, jsid id_)
|
|||
* If shape is not the last property added, or the last property cannot
|
||||
* be removed, switch to dictionary mode.
|
||||
*/
|
||||
if (!self->inDictionaryMode() && (shape != self->lastProperty() || !self->canRemoveLastProperty())) {
|
||||
if (!self->toDictionaryMode(cx))
|
||||
if (!obj->inDictionaryMode() && (shape != obj->lastProperty() || !obj->canRemoveLastProperty())) {
|
||||
if (!toDictionaryMode(cx, obj))
|
||||
return false;
|
||||
ShapeTable* table = self->lastProperty()->maybeTable(keep);
|
||||
ShapeTable* table = obj->lastProperty()->maybeTable(keep);
|
||||
MOZ_ASSERT(table);
|
||||
entry = &table->search<MaybeAdding::NotAdding>(shape->propid(), keep);
|
||||
shape = entry->shape();
|
||||
|
@ -1004,21 +1002,21 @@ NativeObject::removeProperty(ExclusiveContext* cx, jsid id_)
|
|||
* the object or table, so the remaining removal is infallible.
|
||||
*/
|
||||
RootedShape spare(cx);
|
||||
if (self->inDictionaryMode()) {
|
||||
if (obj->inDictionaryMode()) {
|
||||
/* For simplicity, always allocate an accessor shape for now. */
|
||||
spare = Allocate<AccessorShape>(cx);
|
||||
if (!spare)
|
||||
return false;
|
||||
new (spare) Shape(shape->base()->unowned(), 0);
|
||||
if (shape == self->lastProperty()) {
|
||||
if (shape == obj->lastProperty()) {
|
||||
/*
|
||||
* Get an up to date unowned base shape for the new last property
|
||||
* when removing the dictionary's last property. Information in
|
||||
* base shapes for non-last properties may be out of sync with the
|
||||
* object's state.
|
||||
*/
|
||||
RootedShape previous(cx, self->lastProperty()->parent);
|
||||
StackBaseShape base(self->lastProperty()->base());
|
||||
RootedShape previous(cx, obj->lastProperty()->parent);
|
||||
StackBaseShape base(obj->lastProperty()->base());
|
||||
BaseShape* nbase = BaseShape::getUnowned(cx, base);
|
||||
if (!nbase)
|
||||
return false;
|
||||
|
@ -1028,7 +1026,7 @@ NativeObject::removeProperty(ExclusiveContext* cx, jsid id_)
|
|||
|
||||
/* If shape has a slot, free its slot number. */
|
||||
if (shape->hasSlot()) {
|
||||
self->freeSlot(cx, shape->slot());
|
||||
obj->freeSlot(cx, shape->slot());
|
||||
if (cx->isJSContext())
|
||||
++cx->asJSContext()->runtime()->propertyRemovals;
|
||||
}
|
||||
|
@ -1038,8 +1036,8 @@ NativeObject::removeProperty(ExclusiveContext* cx, jsid id_)
|
|||
* doubly linked list, hashed by lastProperty()->table. So we can edit the
|
||||
* list and hash in place.
|
||||
*/
|
||||
if (self->inDictionaryMode()) {
|
||||
ShapeTable* table = self->lastProperty()->maybeTable(keep);
|
||||
if (obj->inDictionaryMode()) {
|
||||
ShapeTable* table = obj->lastProperty()->maybeTable(keep);
|
||||
MOZ_ASSERT(table);
|
||||
|
||||
if (entry->hadCollision()) {
|
||||
|
@ -1056,23 +1054,23 @@ NativeObject::removeProperty(ExclusiveContext* cx, jsid id_)
|
|||
* checks not to alter significantly the complexity of the
|
||||
* delete in debug builds, see bug 534493.
|
||||
*/
|
||||
Shape* aprop = self->lastProperty();
|
||||
Shape* aprop = obj->lastProperty();
|
||||
for (int n = 50; --n >= 0 && aprop->parent; aprop = aprop->parent)
|
||||
MOZ_ASSERT_IF(aprop != shape, self->contains(cx, aprop));
|
||||
MOZ_ASSERT_IF(aprop != shape, obj->contains(cx, aprop));
|
||||
#endif
|
||||
}
|
||||
|
||||
{
|
||||
/* Remove shape from its non-circular doubly linked list. */
|
||||
Shape* oldLastProp = self->lastProperty();
|
||||
shape->removeFromDictionary(self);
|
||||
Shape* oldLastProp = obj->lastProperty();
|
||||
shape->removeFromDictionary(obj);
|
||||
|
||||
/* Hand off table from the old to new last property. */
|
||||
oldLastProp->handoffTableTo(self->lastProperty());
|
||||
oldLastProp->handoffTableTo(obj->lastProperty());
|
||||
}
|
||||
|
||||
/* Generate a new shape for the object, infallibly. */
|
||||
JS_ALWAYS_TRUE(self->generateOwnShape(cx, spare));
|
||||
JS_ALWAYS_TRUE(NativeObject::generateOwnShape(cx, obj, spare));
|
||||
|
||||
/* Consider shrinking table if its load factor is <= .25. */
|
||||
uint32_t size = table->capacity();
|
||||
|
@ -1085,11 +1083,11 @@ NativeObject::removeProperty(ExclusiveContext* cx, jsid id_)
|
|||
* lazily make via a later hashify the exact table for the new property
|
||||
* lineage.
|
||||
*/
|
||||
MOZ_ASSERT(shape == self->lastProperty());
|
||||
self->removeLastProperty(cx);
|
||||
MOZ_ASSERT(shape == obj->lastProperty());
|
||||
obj->removeLastProperty(cx);
|
||||
}
|
||||
|
||||
self->checkShapeConsistency();
|
||||
obj->checkShapeConsistency();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1133,35 +1131,30 @@ NativeObject::rollbackProperties(ExclusiveContext* cx, HandleNativeObject obj, u
|
|||
if (slot < slotSpan)
|
||||
break;
|
||||
}
|
||||
if (!obj->removeProperty(cx, obj->lastProperty()->propid()))
|
||||
if (!NativeObject::removeProperty(cx, obj, obj->lastProperty()->propid()))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Shape*
|
||||
NativeObject::replaceWithNewEquivalentShape(ExclusiveContext* cx, Shape* oldShape, Shape* newShape,
|
||||
bool accessorShape)
|
||||
/* static */ Shape*
|
||||
NativeObject::replaceWithNewEquivalentShape(ExclusiveContext* cx, HandleNativeObject obj,
|
||||
Shape* oldShape, Shape* newShape, bool accessorShape)
|
||||
{
|
||||
MOZ_ASSERT(cx->isInsideCurrentZone(oldShape));
|
||||
MOZ_ASSERT_IF(oldShape != lastProperty(),
|
||||
inDictionaryMode() && lookup(cx, oldShape->propidRef()) == oldShape);
|
||||
MOZ_ASSERT_IF(oldShape != obj->lastProperty(),
|
||||
obj->inDictionaryMode() && obj->lookup(cx, oldShape->propidRef()) == oldShape);
|
||||
|
||||
NativeObject* self = this;
|
||||
|
||||
if (!inDictionaryMode()) {
|
||||
RootedNativeObject selfRoot(cx, self);
|
||||
if (!obj->inDictionaryMode()) {
|
||||
RootedShape newRoot(cx, newShape);
|
||||
if (!toDictionaryMode(cx))
|
||||
if (!toDictionaryMode(cx, obj))
|
||||
return nullptr;
|
||||
oldShape = selfRoot->lastProperty();
|
||||
self = selfRoot;
|
||||
oldShape = obj->lastProperty();
|
||||
newShape = newRoot;
|
||||
}
|
||||
|
||||
if (!newShape) {
|
||||
RootedNativeObject selfRoot(cx, self);
|
||||
RootedShape oldRoot(cx, oldShape);
|
||||
newShape = (oldShape->isAccessorShape() || accessorShape)
|
||||
? Allocate<AccessorShape>(cx)
|
||||
|
@ -1169,12 +1162,11 @@ NativeObject::replaceWithNewEquivalentShape(ExclusiveContext* cx, Shape* oldShap
|
|||
if (!newShape)
|
||||
return nullptr;
|
||||
new (newShape) Shape(oldRoot->base()->unowned(), 0);
|
||||
self = selfRoot;
|
||||
oldShape = oldRoot;
|
||||
}
|
||||
|
||||
AutoCheckCannotGC nogc;
|
||||
ShapeTable* table = self->lastProperty()->ensureTableForDictionary(cx, nogc);
|
||||
ShapeTable* table = obj->lastProperty()->ensureTableForDictionary(cx, nogc);
|
||||
if (!table)
|
||||
return nullptr;
|
||||
|
||||
|
@ -1187,12 +1179,12 @@ NativeObject::replaceWithNewEquivalentShape(ExclusiveContext* cx, Shape* oldShap
|
|||
* enumeration order (see bug 601399).
|
||||
*/
|
||||
StackShape nshape(oldShape);
|
||||
newShape->initDictionaryShape(nshape, self->numFixedSlots(), oldShape->listp);
|
||||
newShape->initDictionaryShape(nshape, obj->numFixedSlots(), oldShape->listp);
|
||||
|
||||
MOZ_ASSERT(newShape->parent == oldShape);
|
||||
oldShape->removeFromDictionary(self);
|
||||
oldShape->removeFromDictionary(obj);
|
||||
|
||||
if (newShape == self->lastProperty())
|
||||
if (newShape == obj->lastProperty())
|
||||
oldShape->handoffTableTo(newShape);
|
||||
|
||||
if (entry)
|
||||
|
@ -1200,63 +1192,63 @@ NativeObject::replaceWithNewEquivalentShape(ExclusiveContext* cx, Shape* oldShap
|
|||
return newShape;
|
||||
}
|
||||
|
||||
bool
|
||||
NativeObject::shadowingShapeChange(ExclusiveContext* cx, const Shape& shape)
|
||||
/* static */ bool
|
||||
NativeObject::shadowingShapeChange(ExclusiveContext* cx, HandleNativeObject obj, const Shape& shape)
|
||||
{
|
||||
return generateOwnShape(cx);
|
||||
return generateOwnShape(cx, obj);
|
||||
}
|
||||
|
||||
bool
|
||||
JSObject::setFlags(ExclusiveContext* cx, BaseShape::Flag flags, GenerateShape generateShape)
|
||||
/* static */ bool
|
||||
JSObject::setFlags(ExclusiveContext* cx, HandleObject obj, BaseShape::Flag flags,
|
||||
GenerateShape generateShape)
|
||||
{
|
||||
if (hasAllFlags(flags))
|
||||
if (obj->hasAllFlags(flags))
|
||||
return true;
|
||||
|
||||
RootedObject self(cx, this);
|
||||
|
||||
Shape* existingShape = self->ensureShape(cx);
|
||||
Shape* existingShape = obj->ensureShape(cx);
|
||||
if (!existingShape)
|
||||
return false;
|
||||
|
||||
if (isNative() && as<NativeObject>().inDictionaryMode()) {
|
||||
if (generateShape == GENERATE_SHAPE && !as<NativeObject>().generateOwnShape(cx))
|
||||
return false;
|
||||
StackBaseShape base(self->as<NativeObject>().lastProperty());
|
||||
if (obj->isNative() && obj->as<NativeObject>().inDictionaryMode()) {
|
||||
if (generateShape == GENERATE_SHAPE) {
|
||||
if (!NativeObject::generateOwnShape(cx, obj.as<NativeObject>()))
|
||||
return false;
|
||||
}
|
||||
StackBaseShape base(obj->as<NativeObject>().lastProperty());
|
||||
base.flags |= flags;
|
||||
UnownedBaseShape* nbase = BaseShape::getUnowned(cx, base);
|
||||
if (!nbase)
|
||||
return false;
|
||||
|
||||
self->as<NativeObject>().lastProperty()->base()->adoptUnowned(nbase);
|
||||
obj->as<NativeObject>().lastProperty()->base()->adoptUnowned(nbase);
|
||||
return true;
|
||||
}
|
||||
|
||||
Shape* newShape = Shape::setObjectFlags(cx, flags, self->taggedProto(), existingShape);
|
||||
Shape* newShape = Shape::setObjectFlags(cx, flags, obj->taggedProto(), existingShape);
|
||||
if (!newShape)
|
||||
return false;
|
||||
|
||||
// The success of the |JSObject::ensureShape| call above means that |self|
|
||||
// The success of the |JSObject::ensureShape| call above means that |obj|
|
||||
// can be assumed to have a shape.
|
||||
self->as<ShapedObject>().setShape(newShape);
|
||||
obj->as<ShapedObject>().setShape(newShape);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
NativeObject::clearFlag(ExclusiveContext* cx, BaseShape::Flag flag)
|
||||
/* static */ bool
|
||||
NativeObject::clearFlag(ExclusiveContext* cx, HandleNativeObject obj, BaseShape::Flag flag)
|
||||
{
|
||||
MOZ_ASSERT(inDictionaryMode());
|
||||
MOZ_ASSERT(obj->inDictionaryMode());
|
||||
|
||||
RootedNativeObject self(cx, &as<NativeObject>());
|
||||
MOZ_ASSERT(self->lastProperty()->getObjectFlags() & flag);
|
||||
MOZ_ASSERT(obj->lastProperty()->getObjectFlags() & flag);
|
||||
|
||||
StackBaseShape base(self->lastProperty());
|
||||
StackBaseShape base(obj->lastProperty());
|
||||
base.flags &= ~flag;
|
||||
UnownedBaseShape* nbase = BaseShape::getUnowned(cx, base);
|
||||
if (!nbase)
|
||||
return false;
|
||||
|
||||
self->lastProperty()->base()->adoptUnowned(nbase);
|
||||
obj->lastProperty()->base()->adoptUnowned(nbase);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -905,9 +905,6 @@ class Shape : public gc::TenuredCell
|
|||
setter() == rawSetter;
|
||||
}
|
||||
|
||||
bool set(JSContext* cx, HandleNativeObject obj, HandleObject receiver, MutableHandleValue vp,
|
||||
ObjectOpResult& result);
|
||||
|
||||
BaseShape* base() const { return base_.get(); }
|
||||
|
||||
bool hasSlot() const {
|
||||
|
|
|
@ -366,7 +366,8 @@ static const Class SharedArrayBufferObjectProtoClass = {
|
|||
static JSObject*
|
||||
CreateSharedArrayBufferPrototype(JSContext* cx, JSProtoKey key)
|
||||
{
|
||||
return cx->global()->createBlankPrototype(cx, &SharedArrayBufferObjectProtoClass);
|
||||
return GlobalObject::createBlankPrototype(cx, cx->global(),
|
||||
&SharedArrayBufferObjectProtoClass);
|
||||
}
|
||||
|
||||
static const ClassOps SharedArrayBufferObjectClassOps = {
|
||||
|
|
|
@ -306,7 +306,7 @@ InterpreterStack::pushInlineFrame(JSContext* cx, InterpreterRegs& regs, const Ca
|
|||
MOZ_ASSERT(regs.sp == args.end());
|
||||
MOZ_ASSERT(callee->nonLazyScript() == script);
|
||||
|
||||
script->ensureNonLazyCanonicalFunction(cx);
|
||||
script->ensureNonLazyCanonicalFunction();
|
||||
|
||||
InterpreterFrame* prev = regs.fp();
|
||||
jsbytecode* prevpc = regs.pc;
|
||||
|
@ -336,13 +336,13 @@ InterpreterStack::resumeGeneratorCallFrame(JSContext* cx, InterpreterRegs& regs,
|
|||
HandleObject envChain)
|
||||
{
|
||||
MOZ_ASSERT(callee->isGenerator());
|
||||
RootedScript script(cx, callee->getOrCreateScript(cx));
|
||||
RootedScript script(cx, JSFunction::getOrCreateScript(cx, callee));
|
||||
InterpreterFrame* prev = regs.fp();
|
||||
jsbytecode* prevpc = regs.pc;
|
||||
Value* prevsp = regs.sp;
|
||||
MOZ_ASSERT(prev);
|
||||
|
||||
script->ensureNonLazyCanonicalFunction(cx);
|
||||
script->ensureNonLazyCanonicalFunction();
|
||||
|
||||
LifoAlloc::Mark mark = allocator_.mark();
|
||||
|
||||
|
|
|
@ -15,31 +15,29 @@
|
|||
|
||||
namespace js {
|
||||
|
||||
inline bool
|
||||
StringObject::init(JSContext* cx, HandleString str)
|
||||
/* static */ inline bool
|
||||
StringObject::init(JSContext* cx, Handle<StringObject*> obj, HandleString str)
|
||||
{
|
||||
MOZ_ASSERT(numFixedSlots() == 2);
|
||||
MOZ_ASSERT(obj->numFixedSlots() == 2);
|
||||
|
||||
Rooted<StringObject*> self(cx, this);
|
||||
|
||||
if (!EmptyShape::ensureInitialCustomShape<StringObject>(cx, self))
|
||||
if (!EmptyShape::ensureInitialCustomShape<StringObject>(cx, obj))
|
||||
return false;
|
||||
|
||||
MOZ_ASSERT(self->lookup(cx, NameToId(cx->names().length))->slot() == LENGTH_SLOT);
|
||||
MOZ_ASSERT(obj->lookup(cx, NameToId(cx->names().length))->slot() == LENGTH_SLOT);
|
||||
|
||||
self->setStringThis(str);
|
||||
obj->setStringThis(str);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
inline StringObject*
|
||||
/* static */ inline StringObject*
|
||||
StringObject::create(JSContext* cx, HandleString str, HandleObject proto, NewObjectKind newKind)
|
||||
{
|
||||
JSObject* obj = NewObjectWithClassProto(cx, &class_, proto, newKind);
|
||||
if (!obj)
|
||||
return nullptr;
|
||||
Rooted<StringObject*> strobj(cx, &obj->as<StringObject>());
|
||||
if (!strobj->init(cx, str))
|
||||
if (!StringObject::init(cx, strobj, str))
|
||||
return nullptr;
|
||||
return strobj;
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ class StringObject : public NativeObject
|
|||
}
|
||||
|
||||
private:
|
||||
inline bool init(JSContext* cx, HandleString str);
|
||||
static inline bool init(JSContext* cx, Handle<StringObject*> obj, HandleString str);
|
||||
|
||||
void setStringThis(JSString* str) {
|
||||
MOZ_ASSERT(getReservedSlot(PRIMITIVE_VALUE_SLOT).isUndefined());
|
||||
|
|
|
@ -1319,7 +1319,8 @@ js::EnsureTrackPropertyTypes(JSContext* cx, JSObject* obj, jsid id)
|
|||
AutoEnterAnalysis enter(cx);
|
||||
if (obj->hasLazyGroup()) {
|
||||
AutoEnterOOMUnsafeRegion oomUnsafe;
|
||||
if (!obj->getGroup(cx)) {
|
||||
RootedObject objRoot(cx, obj);
|
||||
if (!JSObject::getGroup(cx, objRoot)) {
|
||||
oomUnsafe.crash("Could not allocate ObjectGroup in EnsureTrackPropertyTypes");
|
||||
return;
|
||||
}
|
||||
|
@ -1338,9 +1339,12 @@ HeapTypeSetKey::instantiate(JSContext* cx)
|
|||
{
|
||||
if (maybeTypes())
|
||||
return true;
|
||||
if (object()->isSingleton() && !object()->singleton()->getGroup(cx)) {
|
||||
cx->clearPendingException();
|
||||
return false;
|
||||
if (object()->isSingleton()) {
|
||||
RootedObject obj(cx, object()->singleton());
|
||||
if (!JSObject::getGroup(cx, obj)) {
|
||||
cx->clearPendingException();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
JSObject* obj = object()->isSingleton() ? object()->singleton() : nullptr;
|
||||
maybeTypes_ = object()->maybeGroup()->getProperty(cx, obj, id());
|
||||
|
@ -2941,7 +2945,8 @@ ObjectGroup::clearNewScript(ExclusiveContext* cx, ObjectGroup* replacement /* =
|
|||
|
||||
// Mark the constructing function as having its 'new' script cleared, so we
|
||||
// will not try to construct another one later.
|
||||
if (!newScript->function()->setNewScriptCleared(cx))
|
||||
RootedFunction fun(cx, newScript->function());
|
||||
if (!JSObject::setNewScriptCleared(cx, fun))
|
||||
cx->recoverFromOutOfMemory();
|
||||
}
|
||||
|
||||
|
@ -3088,7 +3093,7 @@ js::AddClearDefiniteGetterSetterForPrototypeChain(JSContext* cx, ObjectGroup* gr
|
|||
*/
|
||||
RootedObject proto(cx, group->proto().toObjectOrNull());
|
||||
while (proto) {
|
||||
ObjectGroup* protoGroup = proto->getGroup(cx);
|
||||
ObjectGroup* protoGroup = JSObject::getGroup(cx, proto);
|
||||
if (!protoGroup) {
|
||||
cx->recoverFromOutOfMemory();
|
||||
return false;
|
||||
|
@ -3712,7 +3717,8 @@ TypeNewScript::maybeAnalyze(JSContext* cx, ObjectGroup* group, bool* regenerate,
|
|||
Vector<Initializer> initializerVector(cx);
|
||||
|
||||
RootedPlainObject templateRoot(cx, templateObject());
|
||||
if (!jit::AnalyzeNewScriptDefiniteProperties(cx, function(), group, templateRoot, &initializerVector))
|
||||
RootedFunction fun(cx, function());
|
||||
if (!jit::AnalyzeNewScriptDefiniteProperties(cx, fun, group, templateRoot, &initializerVector))
|
||||
return false;
|
||||
|
||||
if (!group->newScript())
|
||||
|
|
|
@ -361,7 +361,7 @@ class TypedArrayObjectTemplate : public TypedArrayObject
|
|||
return nullptr;
|
||||
|
||||
const Class* clasp = TypedArrayObject::protoClassForType(ArrayTypeID());
|
||||
return global->createBlankPrototypeInheriting(cx, clasp, typedArrayProto);
|
||||
return GlobalObject::createBlankPrototypeInheriting(cx, global, clasp, typedArrayProto);
|
||||
}
|
||||
|
||||
static JSObject*
|
||||
|
@ -1892,7 +1892,7 @@ DataViewObject::constructWrapped(JSContext* cx, HandleObject bufobj, const CallA
|
|||
|
||||
Rooted<GlobalObject*> global(cx, cx->compartment()->maybeGlobal());
|
||||
if (!proto) {
|
||||
proto = global->getOrCreateDataViewPrototype(cx);
|
||||
proto = GlobalObject::getOrCreateDataViewPrototype(cx, global);
|
||||
if (!proto)
|
||||
return false;
|
||||
}
|
||||
|
@ -2892,12 +2892,13 @@ DataViewObject::initClass(JSContext* cx)
|
|||
if (global->isStandardClassResolved(JSProto_DataView))
|
||||
return true;
|
||||
|
||||
RootedNativeObject proto(cx, global->createBlankPrototype(cx, &DataViewObject::protoClass));
|
||||
RootedNativeObject proto(cx, GlobalObject::createBlankPrototype(cx, global,
|
||||
&DataViewObject::protoClass));
|
||||
if (!proto)
|
||||
return false;
|
||||
|
||||
RootedFunction ctor(cx, global->createConstructor(cx, DataViewObject::class_constructor,
|
||||
cx->names().DataView, 3));
|
||||
RootedFunction ctor(cx, GlobalObject::createConstructor(cx, DataViewObject::class_constructor,
|
||||
cx->names().DataView, 3));
|
||||
if (!ctor)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -1659,7 +1659,7 @@ Reject(JSContext* cx, const CompileArgs& args, UniqueChars error, Handle<Promise
|
|||
if (!cx->getPendingException(&rejectionValue))
|
||||
return false;
|
||||
|
||||
return promise->reject(cx, rejectionValue);
|
||||
return PromiseObject::reject(cx, promise, rejectionValue);
|
||||
}
|
||||
|
||||
RootedObject stack(cx, promise->allocationSite());
|
||||
|
@ -1687,7 +1687,7 @@ Reject(JSContext* cx, const CompileArgs& args, UniqueChars error, Handle<Promise
|
|||
return false;
|
||||
|
||||
RootedValue rejectionValue(cx, ObjectValue(*errorObj));
|
||||
return promise->reject(cx, rejectionValue);
|
||||
return PromiseObject::reject(cx, promise, rejectionValue);
|
||||
}
|
||||
|
||||
static bool
|
||||
|
@ -1699,7 +1699,7 @@ ResolveCompilation(JSContext* cx, Module& module, Handle<PromiseObject*> promise
|
|||
return false;
|
||||
|
||||
RootedValue resolutionValue(cx, ObjectValue(*moduleObj));
|
||||
return promise->resolve(cx, resolutionValue);
|
||||
return PromiseObject::resolve(cx, promise, resolutionValue);
|
||||
}
|
||||
|
||||
struct CompileTask : PromiseTask
|
||||
|
@ -1734,7 +1734,7 @@ RejectWithPendingException(JSContext* cx, Handle<PromiseObject*> promise)
|
|||
if (!GetAndClearException(cx, &rejectionValue))
|
||||
return false;
|
||||
|
||||
return promise->reject(cx, rejectionValue);
|
||||
return PromiseObject::reject(cx, promise, rejectionValue);
|
||||
}
|
||||
|
||||
static bool
|
||||
|
@ -1822,7 +1822,7 @@ ResolveInstantiation(JSContext* cx, Module& module, HandleObject importObj,
|
|||
return false;
|
||||
|
||||
val = ObjectValue(*resultObj);
|
||||
return promise->resolve(cx, val);
|
||||
return PromiseObject::resolve(cx, promise, val);
|
||||
}
|
||||
|
||||
struct InstantiateTask : CompileTask
|
||||
|
@ -1894,7 +1894,7 @@ WebAssembly_instantiate(JSContext* cx, unsigned argc, Value* vp)
|
|||
return RejectWithPendingException(cx, promise, callArgs);
|
||||
|
||||
RootedValue resolutionValue(cx, ObjectValue(*instanceObj));
|
||||
if (!promise->resolve(cx, resolutionValue))
|
||||
if (!PromiseObject::resolve(cx, promise, resolutionValue))
|
||||
return false;
|
||||
} else {
|
||||
auto task = cx->make_unique<InstantiateTask>(cx, promise, importObj);
|
||||
|
@ -2018,7 +2018,7 @@ js::InitWebAssemblyClass(JSContext* cx, HandleObject obj)
|
|||
Handle<GlobalObject*> global = obj.as<GlobalObject>();
|
||||
MOZ_ASSERT(!global->isStandardClassResolved(JSProto_WebAssembly));
|
||||
|
||||
RootedObject proto(cx, global->getOrCreateObjectPrototype(cx));
|
||||
RootedObject proto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
|
||||
if (!proto)
|
||||
return nullptr;
|
||||
|
||||
|
|
|
@ -536,7 +536,7 @@ WrapperFactory::Rewrap(JSContext* cx, HandleObject existing, HandleObject obj)
|
|||
DEBUG_CheckUnwrapSafety(obj, wrapper, origin, target);
|
||||
|
||||
if (existing)
|
||||
return Wrapper::Renew(cx, existing, obj, wrapper);
|
||||
return Wrapper::Renew(existing, obj, wrapper);
|
||||
|
||||
return Wrapper::New(cx, obj, wrapper);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue