void stubs::UncachedCallHelper(VMFrame &f, uint32_t argc, bool lowered, UncachedCallResult &ucr) { ucr.init(); JSContext *cx = f.cx; CallArgs args = CallArgsFromSp(argc, f.regs.sp); RootedScript fscript(cx, f.script()); if (!ucr.setFunction(cx, args, fscript, f.pc())) THROW(); if (ucr.fun) { if (ucr.fun->isInterpreted()) { InitialFrameFlags initial = lowered ? INITIAL_LOWERED : INITIAL_NONE; if (!UncachedInlineCall(f, initial, &ucr.codeAddr, &ucr.unjittable, argc)) THROW(); return; } if (ucr.fun->isNative()) { if (!CallJSNative(cx, ucr.fun->native(), args)) THROW(); RootedScript fscript(cx, f.script()); types::TypeScript::Monitor(f.cx, fscript, f.pc(), args.rval()); return; } } if (!InvokeKernel(f.cx, args)) THROW(); types::TypeScript::Monitor(f.cx, fscript, f.pc(), args.rval()); return; }
void stubs::UncachedNewHelper(VMFrame &f, uint32_t argc, UncachedCallResult &ucr) { ucr.init(); JSContext *cx = f.cx; CallArgs args = CallArgsFromSp(argc, f.regs.sp); RootedScript fscript(cx, f.script()); if (!ucr.setFunction(cx, args, fscript, f.pc())) THROW(); /* Try to do a fast inline call before the general Invoke path. */ if (ucr.fun && ucr.fun->isInterpretedConstructor()) { if (!UncachedInlineCall(f, INITIAL_CONSTRUCT, &ucr.codeAddr, &ucr.unjittable, argc)) THROW(); } else { if (!InvokeConstructorKernel(cx, args)) THROW(); types::TypeScript::Monitor(f.cx, fscript, f.pc(), args.rval()); } }