bool js::DirectEval(JSContext *cx, const CallArgs &args) { // Direct eval can assume it was called from an interpreted or baseline frame. ScriptFrameIter iter(cx); AbstractFramePtr caller = iter.abstractFramePtr(); JS_ASSERT(IsBuiltinEvalForScope(caller.scopeChain(), args.calleev())); JS_ASSERT(JSOp(*iter.pc()) == JSOP_EVAL); JS_ASSERT_IF(caller.isFunctionFrame(), caller.compartment() == caller.callee()->compartment()); if (!WarnOnTooManyArgs(cx, args)) return false; RootedObject scopeChain(cx, caller.scopeChain()); return EvalKernel(cx, args, DIRECT_EVAL, caller, scopeChain, iter.pc()); }
bool js::DirectEval(JSContext* cx, const CallArgs& args) { // Direct eval can assume it was called from an interpreted or baseline frame. ScriptFrameIter iter(cx); AbstractFramePtr caller = iter.abstractFramePtr(); MOZ_ASSERT(caller.scopeChain()->global().valueIsEval(args.calleev())); MOZ_ASSERT(JSOp(*iter.pc()) == JSOP_EVAL || JSOp(*iter.pc()) == JSOP_STRICTEVAL || JSOp(*iter.pc()) == JSOP_SPREADEVAL || JSOp(*iter.pc()) == JSOP_STRICTSPREADEVAL); MOZ_ASSERT_IF(caller.isFunctionFrame(), caller.compartment() == caller.callee()->compartment()); RootedObject scopeChain(cx, caller.scopeChain()); return EvalKernel(cx, args, DIRECT_EVAL, caller, scopeChain, iter.pc()); }
void stubs::UncachedNewHelper(VMFrame &f, uint32_t argc, UncachedCallResult &ucr) { ucr.init(); JSContext *cx = f.cx; CallArgs args = CallArgsFromSp(argc, f.regs.sp); /* Try to do a fast inline call before the general Invoke path. */ if (IsFunctionObject(args.calleev(), ucr.fun.address()) && ucr.fun->isInterpretedConstructor()) { if (!UncachedInlineCall(f, INITIAL_CONSTRUCT, &ucr.codeAddr, &ucr.unjittable, argc)) THROW(); } else { if (!InvokeConstructorKernel(cx, args)) THROW(); RootedScript fscript(cx, f.script()); types::TypeScript::Monitor(f.cx, fscript, f.pc(), args.rval()); } }
void JS_FASTCALL stubs::Eval(VMFrame &f, uint32_t argc) { CallArgs args = CallArgsFromSp(argc, f.regs.sp); if (!IsBuiltinEvalForScope(f.fp()->scopeChain(), args.calleev())) { if (!InvokeKernel(f.cx, args)) THROW(); types::TypeScript::Monitor(f.cx, f.script(), f.pc(), args.rval()); return; } JS_ASSERT(f.fp() == f.cx->fp()); if (!DirectEval(f.cx, args)) THROW(); types::TypeScript::Monitor(f.cx, f.script(), f.pc(), args.rval()); }