Bug 595884 - JM: make f.apply(x, arguments) fast (r=dvander)

This commit is contained in:
Luke Wagner
2010-10-21 11:42:28 -07:00
parent 960c7156db
commit 26df29e0cf
7 changed files with 189 additions and 62 deletions

View File

@@ -391,20 +391,6 @@ GetElement(JSContext *cx, JSObject *obj, jsdouble index, JSBool *hole, Value *vp
return JS_TRUE;
}
struct STATIC_SKIP_INFERENCE CopyNonHoleArgs
{
CopyNonHoleArgs(JSObject *aobj, Value *dst) : aobj(aobj), dst(dst) {}
JSObject *aobj;
Value *dst;
void operator()(uintN argi, Value *src) {
if (aobj->getArgsElement(argi).isMagic(JS_ARGS_HOLE))
dst->setUndefined();
else
*dst = *src;
++dst;
}
};
namespace js {
bool
@@ -424,7 +410,7 @@ GetElements(JSContext *cx, JSObject *aobj, jsuint length, Value *vp)
*/
if (JSStackFrame *fp = (JSStackFrame *) aobj->getPrivate()) {
JS_ASSERT(fp->numActualArgs() <= JS_ARGS_LENGTH_MAX);
fp->forEachCanonicalActualArg(CopyNonHoleArgs(aobj, vp));
fp->forEachCanonicalActualArg(CopyNonHoleArgsTo(aobj, vp));
} else {
Value *srcbeg = aobj->getArgsElements();
Value *srcend = srcbeg + length;