[JAEGER] Implement JSOP_LENGTH; r=dvander.

This commit is contained in:
Sean Stangl 2010-06-08 16:28:17 -07:00
parent 6e9131b6eb
commit 54d4bab987
3 changed files with 35 additions and 0 deletions

View File

@ -596,6 +596,13 @@ mjit::Compiler::generateMethod()
jsop_getprop_slow();
END_CASE(JSOP_GETPROP)
BEGIN_CASE(JSOP_LENGTH)
prepareStubCall();
stubCall(stubs::Length, Uses(1), Defs(1));
frame.pop();
frame.pushSynced();
END_CASE(JSOP_LENGTH)
BEGIN_CASE(JSOP_GETELEM)
prepareStubCall();
stubCall(stubs::GetElem, Uses(2), Defs(1));

View File

@ -2163,6 +2163,33 @@ stubs::CallProp(VMFrame &f, JSAtom *atom)
#endif /* JS_HAS_NO_SUCH_METHOD */
}
void JS_FASTCALL
stubs::Length(VMFrame &f)
{
JSFrameRegs &regs = f.regs;
Value *vp = &regs.sp[-1];
if (vp->isString()) {
vp->setInt32(vp->asString()->length());
return;
} else if (vp->isObject()) {
JSObject *obj = &vp->asObject();
if (obj->isArray()) {
jsuint length = obj->getArrayLength();
regs.sp[-1].setDouble(length);
return;
} else if (obj->isArguments() && !obj->isArgsLengthOverridden()) {
uint32 length = obj->getArgsLength();
JS_ASSERT(length < INT32_MAX);
regs.sp[-1].setInt32(int32_t(length));
return;
}
}
if (!InlineGetProp(f))
THROW();
}
void JS_FASTCALL
stubs::Iter(VMFrame &f, uint32 flags)
{

View File

@ -67,6 +67,7 @@ void JS_FASTCALL Name(VMFrame &f, uint32 index);
void JS_FASTCALL GetProp(VMFrame &f);
void JS_FASTCALL GetElem(VMFrame &f);
void JS_FASTCALL SetElem(VMFrame &f);
void JS_FASTCALL Length(VMFrame &f);
void JS_FASTCALL CallName(VMFrame &f, uint32 index);
void JS_FASTCALL GetUpvar(VMFrame &f, uint32 index);