if (implicitWith)
if (indirectCall)
obj_eval(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){    JSStackFrame *caller;    JSObject *scopeobj;    JSString *str;    const char *file;    uintN line;    JSPrincipals *principals;    JSScript *script;    JSBool ok;#if JS_HAS_EVAL_THIS_SCOPE    JSObject *callerScopeChain;    JSBool implicitWith = JS_FALSE; /* unnecessary init to kill gcc warning */#endif    caller = cx->fp->down;    if (JSVERSION_IS_ECMA(cx->version) &&	caller->pc &&	*caller->pc != JSOP_EVAL) {	JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,			     JSMSG_BAD_INDIRECT_CALL, js_eval_str);        return JS_FALSE;    }    if (!JSVAL_IS_STRING(argv[0])) {	*rval = argv[0];	return JS_TRUE;    }#if JS_HAS_SCRIPT_OBJECT    /*     * Script.prototype.compile/exec and Object.prototype.eval all take an     * optional trailing argument that overrides the scope object.     */    scopeobj = NULL;    if (argc >= 2) {	if (!js_ValueToObject(cx, argv[1], &scopeobj))	    return JS_FALSE;	argv[1] = OBJECT_TO_JSVAL(scopeobj);    }    if (!scopeobj)#endif    {#if JS_HAS_EVAL_THIS_SCOPE	/* If obj.eval(str), emulate 'with (obj) eval(str)' in the caller. */	callerScopeChain = caller->scopeChain;	implicitWith = (caller->pc && *caller->pc != JSOP_EVAL);	if (implicitWith) {	    scopeobj = js_NewObject(cx, &js_WithClass, obj, callerScopeChain);	    if (!scopeobj)		return JS_FALSE;	    caller->scopeChain = scopeobj;	}	/* From here on, control must exit through label out with ok set. */#endif#if JS_BUG_EVAL_THIS_SCOPE	/* An old version used the object in which eval was found for scope. */	scopeobj = obj;#else	/* Compile using caller's current scope object (might be a function). */	scopeobj = caller->scopeChain;#endif    }    str = JSVAL_TO_STRING(argv[0]);    if (caller->script) {	file = caller->script->filename;	line = js_PCToLineNumber(caller->script, caller->pc);	principals = caller->script->principals;    } else {	file = NULL;	line = 0;	principals = NULL;    }    script = JS_CompileUCScriptForPrincipals(cx, scopeobj, principals,					     str->chars, str->length,					     file, line);    if (!script) {	ok = JS_FALSE;	goto out;    }#if !JS_BUG_EVAL_THIS_SCOPE#if JS_HAS_SCRIPT_OBJECT    if (argc < 2)#endif    {	/* Execute using caller's new scope object (might be a Call object). */	scopeobj = caller->scopeChain;    }#endif    ok = js_Execute(cx, scopeobj, script, caller->fun, caller, JSFRAME_EVAL,                    rval);    JS_DestroyScript(cx, script);out:#if JS_HAS_EVAL_THIS_SCOPE    /* Restore OBJ_GET_PARENT(scopeobj) not callerScopeChain in case of Call. */    if (implicitWith)	caller->scopeChain = OBJ_GET_PARENT(cx, scopeobj);#endif    return ok;}