js_MarkAtom(cx, sym_atom(sym), arg);
GC_MARK_ATOM(cx, sym_atom(sym), arg);
js_Mark(JSContext *cx, JSObject *obj, void *arg){    JSScope *scope;    JSScopeProperty *sprop;    JSSymbol *sym;    JSClass *clasp;    JS_ASSERT(OBJ_IS_NATIVE(obj));    scope = OBJ_SCOPE(obj);    for (sprop = scope->props; sprop; sprop = sprop->next) {        for (sym = sprop->symbols; sym; sym = sym->next) {            if (JSVAL_IS_INT(sym_id(sym)))                continue;            js_MarkAtom(cx, sym_atom(sym), arg);        }#if JS_HAS_GETTER_SETTER        if (sprop->attrs & (JSPROP_GETTER | JSPROP_SETTER)) {#ifdef GC_MARK_DEBUG            char buf[64];            JSAtom *atom = sym_atom(sprop->symbols);            const char *id = (atom && ATOM_IS_STRING(atom))                             ? JS_GetStringBytes(ATOM_TO_STRING(atom))                             : "unknown";#endif            if (sprop->attrs & JSPROP_GETTER) {#ifdef GC_MARK_DEBUG                JS_snprintf(buf, sizeof buf, "%s %s",                            id, js_getter_str);#endif                GC_MARK(cx,                        JSVAL_TO_GCTHING((jsval)                            SPROP_GETTER_SCOPE(sprop, scope)),                        buf,                        arg);            }            if (sprop->attrs & JSPROP_SETTER) {#ifdef GC_MARK_DEBUG                JS_snprintf(buf, sizeof buf, "%s %s",                            id, js_setter_str);#endif                GC_MARK(cx,                        JSVAL_TO_GCTHING((jsval)                            SPROP_SETTER_SCOPE(sprop, scope)),                        buf,                        arg);            }        }#endif /* JS_HAS_GETTER_SETTER */    }    /* No one runs while the GC is running, so we can use LOCKED_... here. */    clasp = LOCKED_OBJ_GET_CLASS(obj);    if (clasp->mark)        (void) clasp->mark(cx, obj, arg);    return (scope->object == obj) ? obj->map->freeslot : JS_INITIAL_NSLOTS;}