ok = OBJ_GET_PROPERTY(cx, obj, fid, &rval);
ok = OBJ_GET_PROPERTY(cx, origobj, fid, &rval);
          enum_next_property:          {            jsid fid;            /* Get the next jsid to be enumerated and store it in fid. */            ok =#if JS_HAS_XML_SUPPORT                 (foreach && OBJECT_IS_XML(cx, obj))                 ? ((JSXMLObjectOps *) obj->map->ops)->enumerateValues                                (cx, obj, JSENUMERATE_NEXT, &iter_state,                                 &fid, &rval)                 : #endif                   OBJ_ENUMERATE(cx, obj, JSENUMERATE_NEXT, &iter_state, &fid);            propobj->slots[JSSLOT_ITER_STATE] = iter_state;            /* No more jsids to iterate in obj? */            if (iter_state == JSVAL_NULL) {                /* Enumerate the properties on obj's prototype chain. */                obj = OBJ_GET_PROTO(cx, obj);                if (!obj) {                    /* End of property list -- terminate loop. */                    rval = JSVAL_FALSE;                    goto end_forinloop;                }                ok =#if JS_HAS_XML_SUPPORT                     (foreach && OBJECT_IS_XML(cx, obj))                     ? ((JSXMLObjectOps *) obj->map->ops)->enumerateValues                                    (cx, obj, JSENUMERATE_INIT, &iter_state,                                     NULL, NULL)                     :#endif                       OBJ_ENUMERATE(cx, obj, JSENUMERATE_INIT, &iter_state,                                     NULL);                /*                 * Stash private iteration state into property iterator object.                 * We do this before checking 'ok' to ensure that propobj is                 * in a valid state even if OBJ_ENUMERATE returned JS_FALSE.                 * NB: This code knows that the first slots are pre-allocated.                 */                propobj->slots[JSSLOT_ITER_STATE] = iter_state;                if (!ok)                    goto out;                /*                 * Update the iterator JSObject's parent link to refer to the                 * current object. This is used in the iterator JSObject's                 * finalizer.                 */                propobj->slots[JSSLOT_PARENT] = OBJECT_TO_JSVAL(obj);                goto enum_next_property;            }            /* Skip properties not owned by obj when looking from origobj. */            ok = OBJ_LOOKUP_PROPERTY(cx, origobj, fid, &obj2, &prop);            if (!ok)                goto out;            if (prop)                OBJ_DROP_PROPERTY(cx, obj2, prop);            /* If the id was deleted, or found in a prototype, skip it. */            if (!prop || obj2 != obj)                goto enum_next_property;#if JS_HAS_XML_SUPPORT            if (foreach) {                /* Clear the local foreach flag set by our prefix bytecode. */                foreach = JS_FALSE;                /* If obj is not XML, we must get rval given its fid. */                if (!OBJECT_IS_XML(cx, obj)) {                    ok = OBJ_GET_PROPERTY(cx, obj, fid, &rval);                    if (!ok)                        goto out;                }            } else#endif            {                /* Make rval a string for uniformity and compatibility. */                if (JSID_IS_ATOM(fid)) {                    rval = ATOM_KEY(JSID_TO_ATOM(fid));                }#if JS_HAS_XML_SUPPORT                else if (JSID_IS_OBJECT(fid)) {                    str = js_ValueToString(cx, OBJECT_JSID_TO_JSVAL(fid));                    if (!str) {                        ok = JS_FALSE;                        goto out;                    }                    rval = STRING_TO_JSVAL(str);                }#endif                else if (!JS_VERSION_IS_1_2(cx)) {                    str = js_NumberToString(cx, (jsdouble) JSID_TO_INT(fid));                    if (!str) {                        ok = JS_FALSE;                        goto out;                    }                    rval = STRING_TO_JSVAL(str);                } else {                    rval = INT_JSID_TO_JSVAL(fid);                }            }            switch (op) {              case JSOP_FORARG:                slot = GET_ARGNO(pc);                JS_ASSERT(slot < fp->fun->nargs);                fp->argv[slot] = rval;                break;              case JSOP_FORVAR:                slot = GET_VARNO(pc);                JS_ASSERT(slot < fp->fun->nvars);                fp->vars[slot] = rval;                break;              case JSOP_FORELEM:                /* FORELEM is not a SET operation, it's more like BINDNAME. */                PUSH_OPND(rval);                break;              default:                /* Convert lval to a non-null object containing id. */                VALUE_TO_OBJECT(cx, lval, obj);                if (i + 1 < 0)                    STORE_OPND(i + 1, OBJECT_TO_JSVAL(obj));                /* Set the variable obj[id] to refer to rval. */                fp->flags |= JSFRAME_ASSIGNING;                ok = OBJ_SET_PROPERTY(cx, obj, id, &rval);                fp->flags &= ~JSFRAME_ASSIGNING;                if (!ok)                    goto out;                break;            }