From 9c28e24d10c39cfe5b3d1ea43716ca99d0685729 Mon Sep 17 00:00:00 2001 From: "igor%mir2.org" Date: Mon, 1 Oct 2007 19:11:41 +0000 Subject: [PATCH] Bug 396758: the system flag is moved from GC flags to JSObject itself. r=brendan --- js/src/jsapi.c | 3 +-- js/src/jsdbgapi.c | 15 ++++++++++----- js/src/jsgc.h | 3 +-- js/src/jsobj.c | 9 ++++++++- js/src/jsobj.h | 13 ++++++++++--- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/js/src/jsapi.c b/js/src/jsapi.c index 1e36f2eda73..fd2b2e41bd1 100644 --- a/js/src/jsapi.c +++ b/js/src/jsapi.c @@ -2754,8 +2754,7 @@ bad: JS_PUBLIC_API(JSClass *) JS_GetClass(JSContext *cx, JSObject *obj) { - return (JSClass *) - JSVAL_TO_PRIVATE(GC_AWARE_GET_SLOT(cx, obj, JSSLOT_CLASS)); + return GC_AWARE_GET_CLASS(cx, obj); } #else JS_PUBLIC_API(JSClass *) diff --git a/js/src/jsdbgapi.c b/js/src/jsdbgapi.c index 6d2f5330c1f..0d9d70d69f9 100644 --- a/js/src/jsdbgapi.c +++ b/js/src/jsdbgapi.c @@ -1643,16 +1643,21 @@ JS_FlagScriptFilenamePrefix(JSRuntime *rt, const char *prefix, uint32 flags) JS_PUBLIC_API(JSBool) JS_IsSystemObject(JSContext *cx, JSObject *obj) { - return (*js_GetGCThingFlags(obj) & GCF_SYSTEM) != 0; + return STOBJ_IS_SYSTEM(obj); } JS_PUBLIC_API(void) JS_FlagSystemObject(JSContext *cx, JSObject *obj) { - uint8 *flagp; - - flagp = js_GetGCThingFlags(obj); - *flagp |= GCF_SYSTEM; + /* + * We do not need to lock the object here. This method is the only API + * that modifies JSSLOT_CLASS after the object is created and the slot is + * initialized with the object's class. Since we just set the system flag + * here and access to jsval is atomic, any thread that calls the method + * will end up writing the same (jsval)class_pointer | 3 value into the + * slot. + */ + STOBJ_SET_SYSTEM(obj); } /************************************************************************/ diff --git a/js/src/jsgc.h b/js/src/jsgc.h index eeac04b3e78..3e03c299d13 100644 --- a/js/src/jsgc.h +++ b/js/src/jsgc.h @@ -66,8 +66,7 @@ JS_BEGIN_EXTERN_C #define GCF_TYPEMASK JS_BITMASK(GCX_NTYPES_LOG2) #define GCF_MARK JS_BIT(GCX_NTYPES_LOG2) #define GCF_FINAL JS_BIT(GCX_NTYPES_LOG2 + 1) -#define GCF_SYSTEM JS_BIT(GCX_NTYPES_LOG2 + 2) -#define GCF_LOCKSHIFT (GCX_NTYPES_LOG2 + 3) /* lock bit shift */ +#define GCF_LOCKSHIFT (GCX_NTYPES_LOG2 + 2) /* lock bit shift */ #define GCF_LOCK JS_BIT(GCF_LOCKSHIFT) /* lock request bit in API */ extern JS_FRIEND_API(uint8 *) diff --git a/js/src/jsobj.c b/js/src/jsobj.c index d9c69bbf070..dcd36647b70 100644 --- a/js/src/jsobj.c +++ b/js/src/jsobj.c @@ -2472,10 +2472,17 @@ js_NewObject(JSContext *cx, JSClass *clasp, JSObject *proto, JSObject *parent) obj->map = NULL; obj->dslots = NULL; - /* Set the proto, parent, and class properties. */ + /* Set the proto and parent properties. */ STOBJ_SET_PROTO(obj, proto); STOBJ_SET_PARENT(obj, parent); + + /* + * Set the class slot with the initial value of the system flag set to + * false. + */ + JS_ASSERT(((jsuword) clasp & 3) == 0); STOBJ_SET_SLOT(obj, JSSLOT_CLASS, PRIVATE_TO_JSVAL(clasp)); + JS_ASSERT(!STOBJ_IS_SYSTEM(obj)); /* Initialize the remaining fixed slots. */ for (i = JSSLOT_PRIVATE; i != JS_INITIAL_NSLOTS; ++i) diff --git a/js/src/jsobj.h b/js/src/jsobj.h index 19d44a01b06..783a2281c41 100644 --- a/js/src/jsobj.h +++ b/js/src/jsobj.h @@ -164,10 +164,17 @@ struct JSObject { #define STOBJ_SET_PARENT(obj,parent) \ ((obj)->fslots[JSSLOT_PARENT] = OBJECT_TO_JSVAL(parent)) -#define STOBJ_GET_CLASS(obj) \ - ((JSClass *)JSVAL_TO_PRIVATE((obj)->fslots[JSSLOT_CLASS])) +/* + * We use JSSLOT_CLASS to store both JSClass* and the system flag as an int- + * tagged value (see jsapi.h for details) with the system flag stored in the + * second lowest bit. + */ +#define STOBJ_GET_CLASS(obj) ((JSClass *)((obj)->fslots[JSSLOT_CLASS] & ~3)) +#define STOBJ_IS_SYSTEM(obj) (((obj)->fslots[JSSLOT_CLASS] & 2) != 0) -#define STOBJ_GET_PRIVATE(obj) \ +#define STOBJ_SET_SYSTEM(obj) ((void)((obj)->fslots[JSSLOT_CLASS] |= 2)) + +#define STOBJ_GET_PRIVATE(obj) \ (JS_ASSERT(JSVAL_IS_INT(STOBJ_GET_SLOT(obj, JSSLOT_PRIVATE))), \ JSVAL_TO_PRIVATE(STOBJ_GET_SLOT(obj, JSSLOT_PRIVATE)))