str = js_DecompileValueGenerator(cx, JS_FALSE, ID_TO_VALUE(id), NULL);
str = js_DecompileValueGenerator(cx, 0, ID_TO_VALUE(id), NULL);
js_GetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){    JSObject *obj2;    JSProperty *prop;    JSScope *scope;    JSScopeProperty *sprop;    uint32 slot;    /*     * Handle old bug that took empty string as zero index.  Also convert     * string indices to integers if appropriate.     */    CHECK_FOR_FUNNY_INDEX(id);    if (!js_LookupProperty(cx, obj, id, &obj2, &prop))        return JS_FALSE;    if (!prop) {        jsval default_val;#if JS_BUG_NULL_INDEX_PROPS        /* Indexed properties defaulted to null in old versions. */        default_val = (JSVAL_IS_INT(id) && JSVAL_TO_INT(id) >= 0)                      ? JSVAL_NULL                      : JSVAL_VOID;#else        default_val = JSVAL_VOID;#endif        *vp = default_val;        if (!OBJ_GET_CLASS(cx, obj)->getProperty(cx, obj, ID_TO_VALUE(id), vp))            return JS_FALSE;        /*         * Give a strict warning if foo.bar is evaluated by a script for an         * object foo with no property named 'bar'.         */        if (JS_HAS_STRICT_OPTION(cx) &&            *vp == default_val &&            cx->fp && cx->fp->pc &&            (*cx->fp->pc == JSOP_GETPROP || *cx->fp->pc == JSOP_GETELEM))        {            jsbytecode *pc, *endpc;            JSString *str;            /* Kludge to allow (typeof foo == "undefined") tests. */            JS_ASSERT(cx->fp->script);            pc = cx->fp->pc;            pc += js_CodeSpec[*pc].length;            endpc = cx->fp->script->code + cx->fp->script->length;            while (pc < endpc) {                if (*pc == JSOP_TYPEOF)                    return JS_TRUE;                if (*pc != JSOP_GROUP)                    break;                pc++;            }            /* Ok, bad undefined property reference: whine about it. */            str = js_DecompileValueGenerator(cx, JS_FALSE, ID_TO_VALUE(id),                                             NULL);            if (!str ||                !JS_ReportErrorFlagsAndNumber(cx,                                              JSREPORT_WARNING|JSREPORT_STRICT,                                              js_GetErrorMessage, NULL,                                              JSMSG_UNDEFINED_PROP,                                              JS_GetStringBytes(str))) {                return JS_FALSE;            }        }        return JS_TRUE;    }    if (!OBJ_IS_NATIVE(obj2)) {        OBJ_DROP_PROPERTY(cx, obj2, prop);        return OBJ_GET_PROPERTY(cx, obj2, id, vp);    }    /* Unlock obj2 before calling getter, relock after to avoid deadlock. */    scope = OBJ_SCOPE(obj2);    sprop = (JSScopeProperty *) prop;    slot = sprop->slot;    if (slot != SPROP_INVALID_SLOT) {        JS_ASSERT(slot < obj2->map->freeslot);        *vp = LOCKED_OBJ_GET_SLOT(obj2, slot);        /* If sprop has a stub getter, we're done. */        if (!sprop->getter)            goto out;    } else {        *vp = JSVAL_VOID;    }    JS_UNLOCK_SCOPE(cx, scope);    if (!SPROP_GET(cx, sprop, obj, obj2, vp))        return JS_FALSE;    JS_LOCK_SCOPE(cx, scope);    if (SPROP_HAS_VALID_SLOT(sprop, scope)) {        LOCKED_OBJ_SET_SLOT(obj2, slot, *vp);        PROPERTY_CACHE_FILL(&cx->runtime->propertyCache, obj2, id, sprop);    }out:    JS_UNLOCK_SCOPE(cx, scope);    return JS_TRUE;}