Bug 880041 (part 2) - Use JSObject::{is,as} for {Normal,Strict,}ArgumentsObjects. r=luke.

--HG--
extra : rebase_source : 1648dd8eae1d1fdcc28644b9865960560ba301f8
This commit is contained in:
Nicholas Nethercote 2013-06-16 17:06:04 -07:00
parent de3c995fe0
commit f27d4f199a
10 changed files with 62 additions and 90 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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___ */

View File

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