mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-24 10:45:42 +00:00
Bug 880041 (part 2) - Use JSObject::{is,as} for {Normal,Strict,}ArgumentsObjects. r=luke.
--HG-- extra : rebase_source : 1648dd8eae1d1fdcc28644b9865960560ba301f8
This commit is contained in:
parent
de3c995fe0
commit
f27d4f199a
@ -560,7 +560,7 @@ InitFromBailout(JSContext *cx, HandleScript caller, jsbytecode *callerPC,
|
||||
v = iter.read();
|
||||
JS_ASSERT(v.isObject() || v.isUndefined());
|
||||
if (v.isObject())
|
||||
argsObj = &v.toObject().asArguments();
|
||||
argsObj = &v.toObject().as<ArgumentsObject>();
|
||||
}
|
||||
}
|
||||
IonSpew(IonSpew_BaselineBailouts, " ScopeChain=%p", scopeChain);
|
||||
|
@ -3532,9 +3532,9 @@ TryAttachGetElemStub(JSContext *cx, HandleScript script, ICGetElem_Fallback *stu
|
||||
RootedObject obj(cx, &lhs.toObject());
|
||||
|
||||
// Check for ArgumentsObj[int] accesses
|
||||
if (obj->isArguments() && rhs.isInt32()) {
|
||||
if (obj->is<ArgumentsObject>() && rhs.isInt32()) {
|
||||
ICGetElem_Arguments::Which which = ICGetElem_Arguments::Normal;
|
||||
if (obj->isStrictArguments())
|
||||
if (obj->is<StrictArgumentsObject>())
|
||||
which = ICGetElem_Arguments::Strict;
|
||||
if (!ArgumentsGetElemStubExists(stub, which)) {
|
||||
IonSpew(IonSpew_BaselineIC, " Generating GetElem(ArgsObj[Int32]) stub");
|
||||
@ -3926,7 +3926,7 @@ ICGetElem_Arguments::Compiler::generateStubCode(MacroAssembler &masm)
|
||||
which_ == ICGetElem_Arguments::Normal);
|
||||
|
||||
bool isStrict = which_ == ICGetElem_Arguments::Strict;
|
||||
Class *clasp = isStrict ? &StrictArgumentsObjectClass : &NormalArgumentsObjectClass;
|
||||
Class *clasp = isStrict ? &StrictArgumentsObject::class_ : &NormalArgumentsObject::class_;
|
||||
|
||||
GeneralRegisterSet regs(availableGeneralRegs(2));
|
||||
Register scratchReg = regs.takeAny();
|
||||
@ -5192,11 +5192,11 @@ TryAttachLengthStub(JSContext *cx, HandleScript script, ICGetProp_Fallback *stub
|
||||
return true;
|
||||
}
|
||||
|
||||
if (obj->isArguments() && res.isInt32()) {
|
||||
if (obj->is<ArgumentsObject>() && res.isInt32()) {
|
||||
IonSpew(IonSpew_BaselineIC, " Generating GetProp(ArgsObj.length %s) stub",
|
||||
obj->isStrictArguments() ? "Strict" : "Normal");
|
||||
obj->is<StrictArgumentsObject>() ? "Strict" : "Normal");
|
||||
ICGetProp_ArgumentsLength::Which which = ICGetProp_ArgumentsLength::Normal;
|
||||
if (obj->isStrictArguments())
|
||||
if (obj->is<StrictArgumentsObject>())
|
||||
which = ICGetProp_ArgumentsLength::Strict;
|
||||
ICGetProp_ArgumentsLength::Compiler compiler(cx, which);
|
||||
ICStub *newStub = compiler.getStub(compiler.getStubSpace(script));
|
||||
@ -6115,7 +6115,7 @@ ICGetProp_ArgumentsLength::Compiler::generateStubCode(MacroAssembler &masm)
|
||||
which_ == ICGetProp_ArgumentsLength::Normal);
|
||||
|
||||
bool isStrict = which_ == ICGetProp_ArgumentsLength::Strict;
|
||||
Class *clasp = isStrict ? &StrictArgumentsObjectClass : &NormalArgumentsObjectClass;
|
||||
Class *clasp = isStrict ? &StrictArgumentsObject::class_ : &NormalArgumentsObject::class_;
|
||||
|
||||
Register scratchReg = R1.scratchReg();
|
||||
|
||||
|
@ -555,10 +555,10 @@ IsCacheableNoProperty(JSObject *obj, JSObject *holder, Shape *shape, jsbytecode
|
||||
static bool
|
||||
IsOptimizableArgumentsObjectForLength(JSObject *obj)
|
||||
{
|
||||
if (!obj->isArguments())
|
||||
if (!obj->is<ArgumentsObject>())
|
||||
return false;
|
||||
|
||||
if (obj->asArguments().hasOverriddenLength())
|
||||
if (obj->as<ArgumentsObject>().hasOverriddenLength())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@ -570,7 +570,7 @@ IsOptimizableArgumentsObjectForGetElem(JSObject *obj, Value idval)
|
||||
if (!IsOptimizableArgumentsObjectForLength(obj))
|
||||
return false;
|
||||
|
||||
ArgumentsObject &argsObj = obj->asArguments();
|
||||
ArgumentsObject &argsObj = obj->as<ArgumentsObject>();
|
||||
|
||||
if (argsObj.isAnyElementDeleted())
|
||||
return false;
|
||||
@ -1252,7 +1252,7 @@ GetPropertyIC::attachTypedArrayLength(JSContext *cx, IonScript *ion, JSObject *o
|
||||
bool
|
||||
GetPropertyIC::attachArgumentsLength(JSContext *cx, IonScript *ion, JSObject *obj)
|
||||
{
|
||||
JS_ASSERT(obj->isArguments());
|
||||
JS_ASSERT(obj->is<ArgumentsObject>());
|
||||
JS_ASSERT(!idempotent());
|
||||
|
||||
Label failures;
|
||||
@ -1268,8 +1268,8 @@ GetPropertyIC::attachArgumentsLength(JSContext *cx, IonScript *ion, JSObject *ob
|
||||
}
|
||||
JS_ASSERT(object() != tmpReg);
|
||||
|
||||
Class *clasp = obj->isStrictArguments() ? &StrictArgumentsObjectClass
|
||||
: &NormalArgumentsObjectClass;
|
||||
Class *clasp = obj->is<StrictArgumentsObject>() ? &StrictArgumentsObject::class_
|
||||
: &NormalArgumentsObject::class_;
|
||||
|
||||
Label fail;
|
||||
Label pass;
|
||||
@ -1293,7 +1293,7 @@ GetPropertyIC::attachArgumentsLength(JSContext *cx, IonScript *ion, JSObject *ob
|
||||
masm.bind(&failures);
|
||||
attacher.jumpNextStub(masm);
|
||||
|
||||
if (obj->isStrictArguments()) {
|
||||
if (obj->is<StrictArgumentsObject>()) {
|
||||
JS_ASSERT(!hasStrictArgumentsLengthStub_);
|
||||
hasStrictArgumentsLengthStub_ = true;
|
||||
return linkAndAttachStub(cx, masm, attacher, ion, "ArgsObj length (strict)");
|
||||
@ -1462,7 +1462,7 @@ GetPropertyIC::update(JSContext *cx, size_t cacheIndex,
|
||||
if (name == cx->names().length &&
|
||||
IsOptimizableArgumentsObjectForLength(obj) &&
|
||||
(cache.output().type() == MIRType_Value || cache.output().type() == MIRType_Int32) &&
|
||||
!cache.hasArgumentsLengthStub(obj->isStrictArguments()))
|
||||
!cache.hasArgumentsLengthStub(obj->is<StrictArgumentsObject>()))
|
||||
{
|
||||
isCacheable = true;
|
||||
if (!cache.attachArgumentsLength(cx, ion, obj))
|
||||
@ -2372,7 +2372,7 @@ GetElementIC::attachTypedArrayElement(JSContext *cx, IonScript *ion, JSObject *o
|
||||
bool
|
||||
GetElementIC::attachArgumentsElement(JSContext *cx, IonScript *ion, JSObject *obj)
|
||||
{
|
||||
JS_ASSERT(obj->isArguments());
|
||||
JS_ASSERT(obj->is<ArgumentsObject>());
|
||||
|
||||
Label failures;
|
||||
MacroAssembler masm(cx);
|
||||
@ -2381,8 +2381,8 @@ GetElementIC::attachArgumentsElement(JSContext *cx, IonScript *ion, JSObject *ob
|
||||
Register tmpReg = output().scratchReg().gpr();
|
||||
JS_ASSERT(tmpReg != InvalidReg);
|
||||
|
||||
Class *clasp = obj->isStrictArguments() ? &StrictArgumentsObjectClass
|
||||
: &NormalArgumentsObjectClass;
|
||||
Class *clasp = obj->is<StrictArgumentsObject>() ? &StrictArgumentsObject::class_
|
||||
: &NormalArgumentsObject::class_;
|
||||
|
||||
Label fail;
|
||||
Label pass;
|
||||
@ -2467,7 +2467,7 @@ GetElementIC::attachArgumentsElement(JSContext *cx, IonScript *ion, JSObject *ob
|
||||
attacher.jumpNextStub(masm);
|
||||
|
||||
|
||||
if (obj->isStrictArguments()) {
|
||||
if (obj->is<StrictArgumentsObject>()) {
|
||||
JS_ASSERT(!hasStrictArgumentsStub_);
|
||||
hasStrictArgumentsStub_ = true;
|
||||
return linkAndAttachStub(cx, masm, attacher, ion, "ArgsObj element (strict)");
|
||||
@ -2507,7 +2507,7 @@ GetElementIC::update(JSContext *cx, size_t cacheIndex, HandleObject obj,
|
||||
bool attachedStub = false;
|
||||
if (cache.canAttachStub()) {
|
||||
if (IsOptimizableArgumentsObjectForGetElem(obj, idval) &&
|
||||
!cache.hasArgumentsStub(obj->isStrictArguments()) &&
|
||||
!cache.hasArgumentsStub(obj->is<StrictArgumentsObject>()) &&
|
||||
!cache.index().constant() &&
|
||||
(cache.index().reg().hasValue() ||
|
||||
cache.index().reg().type() == MIRType_Int32) &&
|
||||
|
@ -90,7 +90,7 @@ ExhaustiveTest(const char funcode[])
|
||||
EVAL(funcode, v.address());
|
||||
|
||||
EVAL(CALL_CODES[ArgCount], v.address());
|
||||
Rooted<ArgumentsObject*> argsobj(cx, &JSVAL_TO_OBJECT(v)->asArguments());
|
||||
Rooted<ArgumentsObject*> argsobj(cx, &JSVAL_TO_OBJECT(v)->as<ArgumentsObject>());
|
||||
|
||||
Value elems[MAX_ELEMS];
|
||||
|
||||
|
@ -57,8 +57,8 @@ js::GetLengthProperty(JSContext *cx, HandleObject obj, uint32_t *lengthp)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (obj->isArguments()) {
|
||||
ArgumentsObject &argsobj = obj->asArguments();
|
||||
if (obj->is<ArgumentsObject>()) {
|
||||
ArgumentsObject &argsobj = obj->as<ArgumentsObject>();
|
||||
if (!argsobj.hasOverriddenLength()) {
|
||||
*lengthp = argsobj.initialLength();
|
||||
return true;
|
||||
@ -213,8 +213,8 @@ GetElement(JSContext *cx, HandleObject obj, IndexType index, JSBool *hole, Mutab
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (obj->isArguments()) {
|
||||
if (obj->asArguments().maybeGetElement(uint32_t(index), vp)) {
|
||||
if (obj->is<ArgumentsObject>()) {
|
||||
if (obj->as<ArgumentsObject>().maybeGetElement(uint32_t(index), vp)) {
|
||||
*hole = false;
|
||||
return true;
|
||||
}
|
||||
@ -249,8 +249,8 @@ js::GetElements(JSContext *cx, HandleObject aobj, uint32_t length, Value *vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (aobj->isArguments()) {
|
||||
ArgumentsObject &argsobj = aobj->asArguments();
|
||||
if (aobj->is<ArgumentsObject>()) {
|
||||
ArgumentsObject &argsobj = aobj->as<ArgumentsObject>();
|
||||
if (!argsobj.hasOverriddenLength()) {
|
||||
if (argsobj.maybeGetElements(0, length, vp))
|
||||
return true;
|
||||
|
@ -5341,8 +5341,8 @@ JSObject::sizeOfExcludingThis(JSMallocSizeOfFun mallocSizeOf, JS::ObjectsExtraSi
|
||||
|
||||
// Other things may be measured in the future if DMD indicates it is worthwhile.
|
||||
// Note that sizes->private_ is measured elsewhere.
|
||||
if (isArguments()) {
|
||||
sizes->argumentsData = asArguments().sizeOfMisc(mallocSizeOf);
|
||||
if (is<ArgumentsObject>()) {
|
||||
sizes->argumentsData = as<ArgumentsObject>().sizeOfMisc(mallocSizeOf);
|
||||
} else if (isRegExpStatics()) {
|
||||
sizes->regExpStatics = js::SizeOfRegExpStaticsData(this, mallocSizeOf);
|
||||
} else if (isPropertyIterator()) {
|
||||
|
@ -218,7 +218,6 @@ extern Class JSONClass;
|
||||
extern Class MapIteratorClass;
|
||||
extern Class MathClass;
|
||||
extern Class NumberClass;
|
||||
extern Class NormalArgumentsObjectClass;
|
||||
extern Class ObjectClass;
|
||||
extern Class ProxyClass;
|
||||
extern Class RegExpClass;
|
||||
@ -227,11 +226,9 @@ extern Class SetIteratorClass;
|
||||
extern Class ScriptSourceClass;
|
||||
extern Class StopIterationClass;
|
||||
extern Class StringClass;
|
||||
extern Class StrictArgumentsObjectClass;
|
||||
extern Class WeakMapClass;
|
||||
extern Class WithClass;
|
||||
|
||||
class ArgumentsObject;
|
||||
class ArrayBufferObject;
|
||||
class BlockObject;
|
||||
class BooleanObject;
|
||||
@ -982,7 +979,6 @@ class JSObject : public js::ObjectImpl
|
||||
|
||||
/* Direct subtypes of JSObject: */
|
||||
inline bool isArray() const { return hasClass(&js::ArrayClass); }
|
||||
inline bool isArguments() const { return isNormalArguments() || isStrictArguments(); }
|
||||
inline bool isArrayBuffer() const { return hasClass(&js::ArrayBufferClass); }
|
||||
inline bool isDataView() const { return hasClass(&js::DataViewClass); }
|
||||
inline bool isDate() const { return hasClass(&js::DateClass); }
|
||||
@ -1019,19 +1015,13 @@ class JSObject : public js::ObjectImpl
|
||||
inline bool isNumber() const { return hasClass(&js::NumberClass); }
|
||||
inline bool isString() const { return hasClass(&js::StringClass); }
|
||||
|
||||
/* Subtypes of ArgumentsObject. */
|
||||
inline bool isNormalArguments() const { return hasClass(&js::NormalArgumentsObjectClass); }
|
||||
inline bool isStrictArguments() const { return hasClass(&js::StrictArgumentsObjectClass); }
|
||||
|
||||
/* Subtypes of Proxy. */
|
||||
inline bool isDebugScope() const;
|
||||
inline bool isWrapper() const;
|
||||
inline bool isFunctionProxy() const { return hasClass(&js::FunctionProxyClass); }
|
||||
inline bool isCrossCompartmentWrapper() const;
|
||||
|
||||
inline js::ArgumentsObject &asArguments();
|
||||
inline js::ArrayBufferObject &asArrayBuffer();
|
||||
inline const js::ArgumentsObject &asArguments() const;
|
||||
inline js::BlockObject &asBlock();
|
||||
inline js::BooleanObject &asBoolean();
|
||||
inline js::CallObject &asCall();
|
||||
@ -1043,7 +1033,6 @@ class JSObject : public js::ObjectImpl
|
||||
inline js::MapObject &asMap();
|
||||
inline js::MapIteratorObject &asMapIterator();
|
||||
inline js::NestedScopeObject &asNestedScope();
|
||||
inline js::NormalArgumentsObject &asNormalArguments();
|
||||
inline js::NumberObject &asNumber();
|
||||
inline js::PropertyIteratorObject &asPropertyIterator();
|
||||
inline const js::PropertyIteratorObject &asPropertyIterator() const;
|
||||
@ -1052,7 +1041,6 @@ class JSObject : public js::ObjectImpl
|
||||
inline js::SetObject &asSet();
|
||||
inline js::SetIteratorObject &asSetIterator();
|
||||
inline js::ScriptSourceObject &asScriptSource();
|
||||
inline js::StrictArgumentsObject &asStrictArguments();
|
||||
inline js::StaticBlockObject &asStaticBlock();
|
||||
inline js::StringObject &asString();
|
||||
inline js::WithObject &asWith();
|
||||
|
@ -180,7 +180,7 @@ ArgumentsObject::create(JSContext *cx, HandleScript script, HandleFunction calle
|
||||
return NULL;
|
||||
|
||||
bool strict = callee->strict();
|
||||
Class *clasp = strict ? &StrictArgumentsObjectClass : &NormalArgumentsObjectClass;
|
||||
Class *clasp = strict ? &StrictArgumentsObject::class_ : &NormalArgumentsObject::class_;
|
||||
|
||||
RootedTypeObject type(cx, proto->getNewType(cx, clasp));
|
||||
if (!type)
|
||||
@ -226,7 +226,7 @@ ArgumentsObject::create(JSContext *cx, HandleScript script, HandleFunction calle
|
||||
|
||||
copy.maybeForwardToCallObject(obj, data);
|
||||
|
||||
ArgumentsObject &argsobj = obj->asArguments();
|
||||
ArgumentsObject &argsobj = obj->as<ArgumentsObject>();
|
||||
JS_ASSERT(argsobj.initialLength() == numActuals);
|
||||
JS_ASSERT(!argsobj.hasOverriddenLength());
|
||||
return &argsobj;
|
||||
@ -282,7 +282,7 @@ ArgumentsObject::createForIon(JSContext *cx, ion::IonJSFrameLayout *frame, Handl
|
||||
static JSBool
|
||||
args_delProperty(JSContext *cx, HandleObject obj, HandleId id, JSBool *succeeded)
|
||||
{
|
||||
ArgumentsObject &argsobj = obj->asArguments();
|
||||
ArgumentsObject &argsobj = obj->as<ArgumentsObject>();
|
||||
if (JSID_IS_INT(id)) {
|
||||
unsigned arg = unsigned(JSID_TO_INT(id));
|
||||
if (arg < argsobj.initialLength() && !argsobj.isElementDeleted(arg))
|
||||
@ -290,7 +290,7 @@ args_delProperty(JSContext *cx, HandleObject obj, HandleId id, JSBool *succeeded
|
||||
} else if (JSID_IS_ATOM(id, cx->names().length)) {
|
||||
argsobj.markLengthOverridden();
|
||||
} else if (JSID_IS_ATOM(id, cx->names().callee)) {
|
||||
argsobj.asNormalArguments().clearCallee();
|
||||
argsobj.as<NormalArgumentsObject>().clearCallee();
|
||||
}
|
||||
*succeeded = true;
|
||||
return true;
|
||||
@ -299,10 +299,10 @@ args_delProperty(JSContext *cx, HandleObject obj, HandleId id, JSBool *succeeded
|
||||
static JSBool
|
||||
ArgGetter(JSContext *cx, HandleObject obj, HandleId id, MutableHandleValue vp)
|
||||
{
|
||||
if (!obj->isNormalArguments())
|
||||
if (!obj->is<NormalArgumentsObject>())
|
||||
return true;
|
||||
|
||||
NormalArgumentsObject &argsobj = obj->asNormalArguments();
|
||||
NormalArgumentsObject &argsobj = obj->as<NormalArgumentsObject>();
|
||||
if (JSID_IS_INT(id)) {
|
||||
/*
|
||||
* arg can exceed the number of arguments if a script changed the
|
||||
@ -325,7 +325,7 @@ ArgGetter(JSContext *cx, HandleObject obj, HandleId id, MutableHandleValue vp)
|
||||
static JSBool
|
||||
ArgSetter(JSContext *cx, HandleObject obj, HandleId id, JSBool strict, MutableHandleValue vp)
|
||||
{
|
||||
if (!obj->isNormalArguments())
|
||||
if (!obj->is<NormalArgumentsObject>())
|
||||
return true;
|
||||
|
||||
unsigned attrs;
|
||||
@ -334,7 +334,7 @@ ArgSetter(JSContext *cx, HandleObject obj, HandleId id, JSBool strict, MutableHa
|
||||
JS_ASSERT(!(attrs & JSPROP_READONLY));
|
||||
attrs &= (JSPROP_ENUMERATE | JSPROP_PERMANENT); /* only valid attributes */
|
||||
|
||||
NormalArgumentsObject &argsobj = obj->asNormalArguments();
|
||||
NormalArgumentsObject &argsobj = obj->as<NormalArgumentsObject>();
|
||||
RootedScript script(cx, argsobj.containingScript());
|
||||
|
||||
if (JSID_IS_INT(id)) {
|
||||
@ -368,7 +368,7 @@ args_resolve(JSContext *cx, HandleObject obj, HandleId id, unsigned flags,
|
||||
{
|
||||
objp.set(NULL);
|
||||
|
||||
Rooted<NormalArgumentsObject*> argsobj(cx, &obj->asNormalArguments());
|
||||
Rooted<NormalArgumentsObject*> argsobj(cx, &obj->as<NormalArgumentsObject>());
|
||||
|
||||
unsigned attrs = JSPROP_SHARED | JSPROP_SHADOWABLE;
|
||||
if (JSID_IS_INT(id)) {
|
||||
@ -399,7 +399,7 @@ args_resolve(JSContext *cx, HandleObject obj, HandleId id, unsigned flags,
|
||||
static JSBool
|
||||
args_enumerate(JSContext *cx, HandleObject obj)
|
||||
{
|
||||
Rooted<NormalArgumentsObject*> argsobj(cx, &obj->asNormalArguments());
|
||||
Rooted<NormalArgumentsObject*> argsobj(cx, &obj->as<NormalArgumentsObject>());
|
||||
RootedId id(cx);
|
||||
|
||||
/*
|
||||
@ -425,10 +425,10 @@ args_enumerate(JSContext *cx, HandleObject obj)
|
||||
static JSBool
|
||||
StrictArgGetter(JSContext *cx, HandleObject obj, HandleId id, MutableHandleValue vp)
|
||||
{
|
||||
if (!obj->isStrictArguments())
|
||||
if (!obj->is<StrictArgumentsObject>())
|
||||
return true;
|
||||
|
||||
StrictArgumentsObject &argsobj = obj->asStrictArguments();
|
||||
StrictArgumentsObject &argsobj = obj->as<StrictArgumentsObject>();
|
||||
|
||||
if (JSID_IS_INT(id)) {
|
||||
/*
|
||||
@ -449,7 +449,7 @@ StrictArgGetter(JSContext *cx, HandleObject obj, HandleId id, MutableHandleValue
|
||||
static JSBool
|
||||
StrictArgSetter(JSContext *cx, HandleObject obj, HandleId id, JSBool strict, MutableHandleValue vp)
|
||||
{
|
||||
if (!obj->isStrictArguments())
|
||||
if (!obj->is<StrictArgumentsObject>())
|
||||
return true;
|
||||
|
||||
unsigned attrs;
|
||||
@ -458,7 +458,7 @@ StrictArgSetter(JSContext *cx, HandleObject obj, HandleId id, JSBool strict, Mut
|
||||
JS_ASSERT(!(attrs & JSPROP_READONLY));
|
||||
attrs &= (JSPROP_ENUMERATE | JSPROP_PERMANENT); /* only valid attributes */
|
||||
|
||||
Rooted<StrictArgumentsObject*> argsobj(cx, &obj->asStrictArguments());
|
||||
Rooted<StrictArgumentsObject*> argsobj(cx, &obj->as<StrictArgumentsObject>());
|
||||
|
||||
if (JSID_IS_INT(id)) {
|
||||
unsigned arg = unsigned(JSID_TO_INT(id));
|
||||
@ -487,7 +487,7 @@ strictargs_resolve(JSContext *cx, HandleObject obj, HandleId id, unsigned flags,
|
||||
{
|
||||
objp.set(NULL);
|
||||
|
||||
Rooted<StrictArgumentsObject*> argsobj(cx, &obj->asStrictArguments());
|
||||
Rooted<StrictArgumentsObject*> argsobj(cx, &obj->as<StrictArgumentsObject>());
|
||||
|
||||
unsigned attrs = JSPROP_SHARED | JSPROP_SHADOWABLE;
|
||||
PropertyOp getter = StrictArgGetter;
|
||||
@ -522,7 +522,7 @@ strictargs_resolve(JSContext *cx, HandleObject obj, HandleId id, unsigned flags,
|
||||
static JSBool
|
||||
strictargs_enumerate(JSContext *cx, HandleObject obj)
|
||||
{
|
||||
Rooted<StrictArgumentsObject*> argsobj(cx, &obj->asStrictArguments());
|
||||
Rooted<StrictArgumentsObject*> argsobj(cx, &obj->as<StrictArgumentsObject>());
|
||||
|
||||
/*
|
||||
* Trigger reflection in strictargs_resolve using a series of
|
||||
@ -559,13 +559,13 @@ strictargs_enumerate(JSContext *cx, HandleObject obj)
|
||||
void
|
||||
ArgumentsObject::finalize(FreeOp *fop, JSObject *obj)
|
||||
{
|
||||
fop->free_(reinterpret_cast<void *>(obj->asArguments().data()));
|
||||
fop->free_(reinterpret_cast<void *>(obj->as<ArgumentsObject>().data()));
|
||||
}
|
||||
|
||||
void
|
||||
ArgumentsObject::trace(JSTracer *trc, JSObject *obj)
|
||||
{
|
||||
ArgumentsObject &argsobj = obj->asArguments();
|
||||
ArgumentsObject &argsobj = obj->as<ArgumentsObject>();
|
||||
ArgumentsData *data = argsobj.data();
|
||||
MarkValue(trc, &data->callee, js_callee_str);
|
||||
MarkValueRange(trc, data->numArgs, data->args, js_arguments_str);
|
||||
@ -578,7 +578,7 @@ ArgumentsObject::trace(JSTracer *trc, JSObject *obj)
|
||||
* StackFrame with their corresponding property values in the frame's
|
||||
* arguments object.
|
||||
*/
|
||||
Class js::NormalArgumentsObjectClass = {
|
||||
Class NormalArgumentsObject::class_ = {
|
||||
"Arguments",
|
||||
JSCLASS_NEW_RESOLVE | JSCLASS_IMPLEMENTS_BARRIERS |
|
||||
JSCLASS_HAS_RESERVED_SLOTS(NormalArgumentsObject::RESERVED_SLOTS) |
|
||||
@ -609,7 +609,7 @@ Class js::NormalArgumentsObjectClass = {
|
||||
* arguments, so it is represented by a different class while sharing some
|
||||
* functionality.
|
||||
*/
|
||||
Class js::StrictArgumentsObjectClass = {
|
||||
Class StrictArgumentsObject::class_ = {
|
||||
"Arguments",
|
||||
JSCLASS_NEW_RESOLVE | JSCLASS_IMPLEMENTS_BARRIERS |
|
||||
JSCLASS_HAS_RESERVED_SLOTS(StrictArgumentsObject::RESERVED_SLOTS) |
|
||||
|
@ -220,6 +220,8 @@ class ArgumentsObject : public JSObject
|
||||
class NormalArgumentsObject : public ArgumentsObject
|
||||
{
|
||||
public:
|
||||
static Class class_;
|
||||
|
||||
/*
|
||||
* Stores arguments.callee, or MagicValue(JS_ARGS_HOLE) if the callee has
|
||||
* been cleared.
|
||||
@ -231,36 +233,18 @@ class NormalArgumentsObject : public ArgumentsObject
|
||||
};
|
||||
|
||||
class StrictArgumentsObject : public ArgumentsObject
|
||||
{};
|
||||
{
|
||||
public:
|
||||
static Class class_;
|
||||
};
|
||||
|
||||
} // namespace js
|
||||
|
||||
js::NormalArgumentsObject &
|
||||
JSObject::asNormalArguments()
|
||||
template<>
|
||||
inline bool
|
||||
JSObject::is<js::ArgumentsObject>() const
|
||||
{
|
||||
JS_ASSERT(isNormalArguments());
|
||||
return *static_cast<js::NormalArgumentsObject *>(this);
|
||||
}
|
||||
|
||||
js::StrictArgumentsObject &
|
||||
JSObject::asStrictArguments()
|
||||
{
|
||||
JS_ASSERT(isStrictArguments());
|
||||
return *static_cast<js::StrictArgumentsObject *>(this);
|
||||
}
|
||||
|
||||
js::ArgumentsObject &
|
||||
JSObject::asArguments()
|
||||
{
|
||||
JS_ASSERT(isArguments());
|
||||
return *static_cast<js::ArgumentsObject *>(this);
|
||||
}
|
||||
|
||||
const js::ArgumentsObject &
|
||||
JSObject::asArguments() const
|
||||
{
|
||||
JS_ASSERT(isArguments());
|
||||
return *static_cast<const js::ArgumentsObject *>(this);
|
||||
return is<js::NormalArgumentsObject>() || is<js::StrictArgumentsObject>();
|
||||
}
|
||||
|
||||
#endif /* ArgumentsObject_h___ */
|
||||
|
@ -227,8 +227,8 @@ GetLengthProperty(const Value &lval, MutableHandleValue vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (obj->isArguments()) {
|
||||
ArgumentsObject *argsobj = &obj->asArguments();
|
||||
if (obj->is<ArgumentsObject>()) {
|
||||
ArgumentsObject *argsobj = &obj->as<ArgumentsObject>();
|
||||
if (!argsobj->hasOverriddenLength()) {
|
||||
uint32_t length = argsobj->initialLength();
|
||||
JS_ASSERT(length < INT32_MAX);
|
||||
|
Loading…
Reference in New Issue
Block a user