(cx->version >= JSVERSION_1_2) ? NULL : cx->runtime->atomState.anonymousAtom);
(JSVERSION_IS_ECMA(cx->version)) ? cx->runtime->atomState.anonymousAtom : NULL);
Function(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){    JSFunction *fun;    JSObject *parent;    uintN i, n, lineno;    JSAtom *atom;    const char *filename;    JSObject *obj2;    JSScopeProperty *sprop;    JSString *str;    JSStackFrame *fp;    JSTokenStream *ts;    JSPrincipals *principals;    if (cx->fp && !cx->fp->constructing) {	obj = js_NewObject(cx, &js_FunctionClass, NULL, NULL);	if (!obj)	    return JS_FALSE;	*rval = OBJECT_TO_JSVAL(obj);    }    fun = JS_GetPrivate(cx, obj);    if (fun)	return JS_TRUE;#if JS_HAS_CALL_OBJECT    /*     * NB: (new Function) is not lexically closed by its caller, it's just an     * anonymous function in the top-level scope that its constructor inhabits.     * Thus 'var x = 42; f = new Function("return x"); print(f())' prints 42,     * and so would a call to f from another top-level's script or function.     *     * In older versions, before call objects, a new Function was adopted by     * its running context's globalObject, which might be different from the     * top-level reachable from scopeChain (in HTML frames, e.g.).     */    parent = OBJ_GET_PARENT(cx, JSVAL_TO_OBJECT(argv[-2]));#else    /* Set up for dynamic parenting (see Call in jsinterp.c). */    parent = NULL;#endif    fun = js_NewFunction(cx, obj, NULL, 0, 0, parent,			 (cx->version >= JSVERSION_1_2)			 ? NULL			 : cx->runtime->atomState.anonymousAtom);    if (!fun)	return JS_FALSE;    n = argc ? argc - 1 : 0;    for (i = 0; i < n; i++) {	atom = js_ValueToStringAtom(cx, argv[i]);	if (!atom)	    return JS_FALSE;	str = ATOM_TO_STRING(atom);	if (!js_IsIdentifier(str)) {	    JS_ReportError(cx, "illegal formal argument name %s",			   JS_GetStringBytes(str));	    return JS_FALSE;	}	if (!js_LookupProperty(cx, obj, (jsid)atom, &obj2,			       (JSProperty **)&sprop)) {	    return JS_FALSE;	}#ifdef CHECK_ARGUMENT_HIDING	if (sprop && obj2 == obj) {	    PR_ASSERT(sprop->getter == js_GetArgument);	    OBJ_DROP_PROPERTY(cx, obj2, (JSProperty *)sprop);	    JS_ReportError(cx, "duplicate formal argument %s",			   ATOM_BYTES(atom));	    return JS_FALSE;	}#endif	if (sprop)	    OBJ_DROP_PROPERTY(cx, obj2, (JSProperty *)sprop);	if (!js_DefineProperty(cx, obj, (jsid)atom, JSVAL_VOID,			       js_GetArgument, js_SetArgument,			       JSPROP_ENUMERATE | JSPROP_PERMANENT,			       (JSProperty **)&sprop)) {	    return JS_FALSE;	}	PR_ASSERT(sprop);	sprop->id = INT_TO_JSVAL(fun->nargs++);	OBJ_DROP_PROPERTY(cx, obj, (JSProperty *)sprop);    }    if (argc) {	str = js_ValueToString(cx, argv[argc-1]);    } else {	/* Can't use cx->runtime->emptyString because we're called too early. */	str = js_NewStringCopyZ(cx, js_empty_ucstr, 0);    }    if (!str)	return JS_FALSE;    if (argv) {	/* Use the last arg (or this if argc == 0) as a local GC root. */	argv[argc-1] = STRING_TO_JSVAL(str);    }    if ((fp = cx->fp) != NULL && (fp = fp->down) != NULL && fp->script) {	filename = fp->script->filename;	lineno = js_PCToLineNumber(fp->script, fp->pc);        principals = fp->script->principals;    } else {	filename = NULL;	lineno = 0;        principals = NULL;    }    ts = js_NewTokenStream(cx, str->chars, str->length, filename, lineno,                           principals);    if (!ts)	return JS_FALSE;    return js_ParseFunctionBody(cx, ts, fun) &&	   js_CloseTokenStream(cx, ts);}