*sp = js_InflateString(cx, buf, len);
*sp = js_InflateString(cx, buf, &len);
js_EnterSharpObject(JSContext *cx, JSObject *obj, JSIdArray **idap,                    jschar **sp){    JSSharpObjectMap *map;    JSHashTable *table;    JSIdArray *ida;    JSHashNumber hash;    JSHashEntry *he, **hep;    jsatomid sharpid;    char buf[20];    size_t len;    if (JS_HAS_NATIVE_BRANCH_CALLBACK_OPTION(cx) &&        cx->branchCallback &&        !cx->branchCallback(cx, NULL)) {        return NULL;    }    /* Set to null in case we return an early error. */    *sp = NULL;    map = &cx->sharpObjectMap;    table = map->table;    if (!table) {        table = JS_NewHashTable(8, js_hash_object, JS_CompareValues,                                JS_CompareValues, NULL, NULL);        if (!table) {            JS_ReportOutOfMemory(cx);            return NULL;        }        map->table = table;    }    ida = NULL;    if (map->depth == 0) {        he = MarkSharpObjects(cx, obj, &ida);        if (!he)            goto bad;        JS_ASSERT((JS_PTR_TO_UINT32(he->value) & SHARP_BIT) == 0);        if (!idap) {            JS_DestroyIdArray(cx, ida);            ida = NULL;        }    } else {        hash = js_hash_object(obj);        hep = JS_HashTableRawLookup(table, hash, obj);        he = *hep;        /*         * It's possible that the value of a property has changed from the         * first time the object's properties are traversed (when the property         * ids are entered into the hash table) to the second (when they are         * converted to strings), i.e., the OBJ_GET_PROPERTY() call is not         * idempotent.         */        if (!he) {            he = JS_HashTableRawAdd(table, hep, hash, obj, NULL);            if (!he) {                JS_ReportOutOfMemory(cx);                goto bad;            }            sharpid = 0;            goto out;        }    }    sharpid = JS_PTR_TO_UINT32(he->value);    if (sharpid != 0) {        len = JS_snprintf(buf, sizeof buf, "#%u%c",                          sharpid >> SHARP_ID_SHIFT,                          (sharpid & SHARP_BIT) ? '#' : '=');        *sp = js_InflateString(cx, buf, len);        if (!*sp) {            if (ida)                JS_DestroyIdArray(cx, ida);            goto bad;        }    }out:    JS_ASSERT(he);    if ((sharpid & SHARP_BIT) == 0) {        if (idap && !ida) {            ida = JS_Enumerate(cx, obj);            if (!ida) {                if (*sp) {                    JS_free(cx, *sp);                    *sp = NULL;                }                goto bad;            }        }        map->depth++;    }    if (idap)        *idap = ida;    return he;bad:    /* Clean up the sharpObjectMap table on outermost error. */    if (map->depth == 0) {        map->sharpgen = 0;        JS_HashTableDestroy(map->table);        map->table = NULL;    }    return NULL;}