JSStackFrame *down, uintN flags, jsval *result)
JSStackFrame *down, uintN special, jsval *result)
js_Execute(JSContext *cx, JSObject *chain, JSScript *script, JSFunction *fun,	   JSStackFrame *down, uintN flags, jsval *result){    JSStackFrame *oldfp, frame;    JSBool ok;    JSInterpreterHook hook;    void *hookData;    hook = cx->runtime->executeHook;    hookData = NULL;    oldfp = cx->fp;    frame.callobj = frame.argsobj = NULL;    frame.script = script;    frame.fun = fun;    if (down) {	/* Propagate arg/var state for eval and the debugger API. */	frame.thisp = down->thisp;	frame.argc = down->argc;	frame.argv = down->argv;	frame.nvars = down->nvars;	frame.vars = down->vars;	frame.annotation = down->annotation;	frame.sharpArray = down->sharpArray;    } else {	frame.thisp = chain;	frame.argc = frame.nvars = 0;	frame.argv = frame.vars = NULL;	frame.annotation = NULL;	frame.sharpArray = NULL;    }    frame.rval = JSVAL_VOID;    frame.down = down;    frame.scopeChain = chain;    frame.pc = NULL;    frame.sp = oldfp ? oldfp->sp : NULL;    frame.sharpDepth = 0;    frame.constructing = JS_FALSE;    frame.overrides = 0;    frame.flags = (uint8) flags;    frame.dormantNext = NULL;    /*     * Here we wrap the call to js_Interpret with code to (conditionally)     * save and restore the old stack frame chain into a chain of 'dormant'     * frame chains. Since we are replacing cx->fp we were running into the     * problem that if gc was called, then some of the objects associated     * with the old frame chain (stored here in the C stack as 'oldfp') were     * not rooted and were being collected. This was bad. So, now we     * preserve the links to these 'dormant' frame chains in cx before     * calling js_Interpret and cleanup afterwards. gc walks these dormant     * chains and marks objects in the same way that it marks object in the     * primary cx->fp chain.     */    if (oldfp && oldfp != down) {	JS_ASSERT(!oldfp->dormantNext);	oldfp->dormantNext = cx->dormantFrameChain;	cx->dormantFrameChain = oldfp;    }    cx->fp = &frame;    if (hook)        hookData = hook(cx, &frame, JS_TRUE, 0, cx->runtime->executeHookData);    ok = js_Interpret(cx, result);    if (hook && hookData)        hook(cx, &frame, JS_FALSE, &ok, hookData);    cx->fp = oldfp;    if (oldfp && oldfp != down) {	JS_ASSERT(cx->dormantFrameChain == oldfp);	cx->dormantFrameChain = oldfp->dormantNext;	oldfp->dormantNext = NULL;    }    return ok;}