From 5630e4dcb718ee64e1164fabcf00a32b8e7c4097 Mon Sep 17 00:00:00 2001 From: "reed%reedloden.com" Date: Thu, 15 Nov 2007 04:16:36 +0000 Subject: [PATCH] relanding bug 400687 since it doesn't look to be the source of the Ts regression git-svn-id: svn://10.0.0.236/trunk@239415 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/js/src/jsapi.c | 12 +- mozilla/js/src/jsatom.c | 2 +- mozilla/js/src/jsgc.c | 145 +++++++++--------- mozilla/js/src/jsgc.h | 77 ++++++---- mozilla/js/src/jspubtd.h | 3 +- mozilla/js/src/jsstr.c | 17 +- mozilla/js/src/jsstr.h | 6 +- mozilla/js/src/xpconnect/src/nsXPConnect.cpp | 41 +---- mozilla/js/src/xpconnect/src/xpcjsruntime.cpp | 2 +- mozilla/js/src/xpconnect/src/xpcprivate.h | 2 - 10 files changed, 151 insertions(+), 156 deletions(-) diff --git a/mozilla/js/src/jsapi.c b/mozilla/js/src/jsapi.c index 70580d6280d..647e9528928 100644 --- a/mozilla/js/src/jsapi.c +++ b/mozilla/js/src/jsapi.c @@ -2513,9 +2513,10 @@ JS_NewExternalString(JSContext *cx, jschar *chars, size_t length, intN type) JSString *str; CHECK_REQUEST(cx); - JS_ASSERT(GCX_EXTERNAL_STRING <= type && type < (intN) GCX_NTYPES); + JS_ASSERT((uintN) type < (uintN) (GCX_NTYPES - GCX_EXTERNAL_STRING)); - str = (JSString *) js_NewGCThing(cx, (uintN) type, sizeof(JSString)); + str = (JSString *) js_NewGCThing(cx, (uintN) type + GCX_EXTERNAL_STRING, + sizeof(JSString)); if (!str) return NULL; JSSTRING_INIT(str, chars, length); @@ -2525,12 +2526,7 @@ JS_NewExternalString(JSContext *cx, jschar *chars, size_t length, intN type) JS_PUBLIC_API(intN) JS_GetExternalStringGCType(JSRuntime *rt, JSString *str) { - uint8 type = (uint8) (*js_GetGCThingFlags(str) & GCF_TYPEMASK); - - if (type >= GCX_EXTERNAL_STRING) - return (intN)type; - JS_ASSERT(type == GCX_STRING); - return -1; + return js_GetExternalStringGCType(str); } JS_PUBLIC_API(void) diff --git a/mozilla/js/src/jsatom.c b/mozilla/js/src/jsatom.c index 2897b85004e..285b074ec66 100644 --- a/mozilla/js/src/jsatom.c +++ b/mozilla/js/src/jsatom.c @@ -408,7 +408,7 @@ js_string_uninterner(JSDHashTable *table, JSDHashEntryHdr *hdr, str = (JSString *)ATOM_ENTRY_KEY(entry); /* Pass null as context. */ - js_FinalizeStringRT(rt, str, GCF_TYPEMASK & *js_GetGCThingFlags(str), NULL); + js_FinalizeStringRT(rt, str, js_GetExternalStringGCType(str), NULL); return JS_DHASH_NEXT; } diff --git a/mozilla/js/src/jsgc.c b/mozilla/js/src/jsgc.c index 1794f6d5d86..3acd22d56a0 100644 --- a/mozilla/js/src/jsgc.c +++ b/mozilla/js/src/jsgc.c @@ -359,25 +359,6 @@ JS_STATIC_ASSERT(sizeof(JSGCThing) >= sizeof(jsdouble)); /* We want to use all the available GC thing space for object's slots. */ JS_STATIC_ASSERT(sizeof(JSObject) % sizeof(JSGCThing) == 0); -static uint8 GCTypeToTraceKindMap[GCX_NTYPES] = { - JSTRACE_OBJECT, /* GCX_OBJECT */ - JSTRACE_STRING, /* GCX_STRING */ - JSTRACE_DOUBLE, /* GCX_DOUBLE */ - JSTRACE_FUNCTION, /* GCX_FUNCTION */ - JSTRACE_NAMESPACE, /* GCX_NAMESPACE */ - JSTRACE_QNAME, /* GCX_QNAME */ - JSTRACE_XML, /* GCX_XML */ - (uint8)-1, /* unused */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 0 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 1 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 2 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 3 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 4 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 5 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 6 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 7 */ -}; - /* * Ensure that JSObject is allocated from a different GC-list rather than * jsdouble and JSString so we can easily finalize JSObject before these 2 @@ -784,8 +765,8 @@ FinishGCArenaLists(JSRuntime *rt) JS_ASSERT(rt->gcChunkList == 0); } -JS_FRIEND_API(uint8 *) -js_GetGCThingFlags(void *thing) +static uint8 * +GetGCThingFlags(void *thing) { JSGCArenaInfo *a; uint32 index; @@ -795,6 +776,32 @@ js_GetGCThingFlags(void *thing) return THING_FLAGP(a, index); } +intN +js_GetExternalStringGCType(JSString *str) +{ + uintN type; + + type = (uintN) *GetGCThingFlags(str) & GCF_TYPEMASK; + JS_ASSERT(type == GCX_STRING || type >= GCX_EXTERNAL_STRING); + return (type == GCX_STRING) ? -1 : (intN) (type - GCX_EXTERNAL_STRING); +} + +static uint32 +MapGCFlagsToTraceKind(uintN flags) +{ + uint32 type; + + type = flags & GCF_TYPEMASK; + JS_ASSERT(type < GCX_NTYPES); + return (type < GCX_EXTERNAL_STRING) ? type : JSTRACE_STRING; +} + +JS_FRIEND_API(uint32) +js_GetGCThingTraceKind(void *thing) +{ + return MapGCFlagsToTraceKind(*GetGCThingFlags(thing)); +} + JSRuntime* js_GetGCStringRuntime(JSString *str) { @@ -811,34 +818,11 @@ js_GetGCStringRuntime(JSString *str) JSBool js_IsAboutToBeFinalized(JSContext *cx, void *thing) { - uint8 flags = *js_GetGCThingFlags(thing); + uint8 flags = *GetGCThingFlags(thing); return !(flags & (GCF_MARK | GCF_LOCK | GCF_FINAL)); } -#ifdef DEBUG -static const char newborn_external_string[] = "newborn external string"; - -static const char *gc_typenames[GCX_NTYPES] = { - "newborn object", - "newborn string", - "newborn double", - "newborn mutable string", - "newborn function", - "newborn Namespace", - "newborn QName", - "newborn XML", - newborn_external_string, - newborn_external_string, - newborn_external_string, - newborn_external_string, - newborn_external_string, - newborn_external_string, - newborn_external_string, - newborn_external_string -}; -#endif - /* This is compatible with JSDHashEntryStub. */ typedef struct JSGCRootHashEntry { JSDHashEntryHdr hdr; @@ -1595,7 +1579,7 @@ js_LockGCThingRT(JSRuntime *rt, void *thing) if (!thing) return ok; - flagp = js_GetGCThingFlags(thing); + flagp = GetGCThingFlags(thing); JS_LOCK_GC(rt); flags = *flagp; @@ -1658,7 +1642,7 @@ js_UnlockGCThingRT(JSRuntime *rt, void *thing) if (!thing) return JS_TRUE; - flagp = js_GetGCThingFlags(thing); + flagp = GetGCThingFlags(thing); JS_LOCK_GC(rt); flags = *flagp; @@ -1876,8 +1860,7 @@ TraceDelayedChildren(JSTracer *trc) --rt->gcTraceLaterCount; #endif thing = FLAGP_TO_THING(flagp, thingSize); - JS_TraceChildren(trc, thing, - GCTypeToTraceKindMap[*flagp & GCF_TYPEMASK]); + JS_TraceChildren(trc, thing, MapGCFlagsToTraceKind(*flagp)); } while (++thingIndex != endIndex); } @@ -1932,6 +1915,9 @@ JS_CallTracer(JSTracer *trc, void *thing, uint32 kind) JS_ASSERT(rt->gcMarkingTracer == trc); JS_ASSERT(rt->gcLevel > 0); + if (rt->gcThingCallback) + rt->gcThingCallback(thing, kind, rt->gcThingCallbackClosure); + /* * Optimize for string and double as their size is known and their tracing * is not recursive. @@ -1940,10 +1926,7 @@ JS_CallTracer(JSTracer *trc, void *thing, uint32 kind) case JSTRACE_DOUBLE: flagp = THING_TO_FLAGP(thing, sizeof(JSGCThing)); JS_ASSERT((*flagp & GCF_FINAL) == 0); - JS_ASSERT(GCTypeToTraceKindMap[*flagp & GCF_TYPEMASK] == kind); - if (rt->gcThingCallback) - rt->gcThingCallback(thing, *flagp, rt->gcThingCallbackClosure); - + JS_ASSERT(kind == MapGCFlagsToTraceKind(*flagp)); *flagp |= GCF_MARK; goto out; @@ -1951,10 +1934,7 @@ JS_CallTracer(JSTracer *trc, void *thing, uint32 kind) for (;;) { flagp = THING_TO_FLAGP(thing, sizeof(JSGCThing)); JS_ASSERT((*flagp & GCF_FINAL) == 0); - JS_ASSERT(GCTypeToTraceKindMap[*flagp & GCF_TYPEMASK] == kind); - if (rt->gcThingCallback) - rt->gcThingCallback(thing, *flagp, rt->gcThingCallbackClosure); - + JS_ASSERT(kind == MapGCFlagsToTraceKind(*flagp)); if (!JSSTRING_IS_DEPENDENT((JSString *) thing)) { *flagp |= GCF_MARK; goto out; @@ -1963,16 +1943,14 @@ JS_CallTracer(JSTracer *trc, void *thing, uint32 kind) goto out; *flagp |= GCF_MARK; thing = JSSTRDEP_BASE((JSString *) thing); + if (rt->gcThingCallback) + rt->gcThingCallback(thing, kind, rt->gcThingCallbackClosure); } /* NOTREACHED */ } - flagp = js_GetGCThingFlags(thing); - JS_ASSERT(GCTypeToTraceKindMap[*flagp & GCF_TYPEMASK] == kind); - - if (rt->gcThingCallback) - rt->gcThingCallback(thing, *flagp, rt->gcThingCallbackClosure); - + flagp = GetGCThingFlags(thing); + JS_ASSERT(kind == MapGCFlagsToTraceKind(*flagp)); if (*flagp & GCF_MARK) goto out; @@ -2037,10 +2015,11 @@ js_CallValueTracerIfGCThing(JSTracer *trc, jsval v) if (JSVAL_IS_DOUBLE(v) || JSVAL_IS_STRING(v)) { thing = JSVAL_TO_TRACEABLE(v); kind = JSVAL_TRACE_KIND(v); + JS_ASSERT(kind == js_GetGCThingTraceKind(JSVAL_TO_GCTHING(v))); } else if (JSVAL_IS_OBJECT(v) && v != JSVAL_NULL) { /* v can be an arbitrary GC thing reinterpreted as an object. */ thing = JSVAL_TO_OBJECT(v); - kind = GCTypeToTraceKindMap[*js_GetGCThingFlags(thing) & GCF_TYPEMASK]; + kind = js_GetGCThingTraceKind(thing); } else { return; } @@ -2102,14 +2081,12 @@ gc_lock_traversal(JSDHashTable *table, JSDHashEntryHdr *hdr, uint32 num, JSGCLockHashEntry *lhe = (JSGCLockHashEntry *)hdr; void *thing = (void *)lhe->thing; JSTracer *trc = (JSTracer *)arg; - uint8 flags; uint32 traceKind; JSRuntime *rt; uint32 n; JS_ASSERT(lhe->count >= 1); - flags = *js_GetGCThingFlags(thing); - traceKind = GCTypeToTraceKindMap[flags & GCF_TYPEMASK]; + traceKind = js_GetGCThingTraceKind(thing); JS_CALL_TRACER(trc, thing, traceKind, "locked object"); /* @@ -2123,7 +2100,7 @@ gc_lock_traversal(JSDHashTable *table, JSDHashEntryHdr *hdr, uint32 num, rt = trc->context->runtime; if (rt->gcThingCallback) { do { - rt->gcThingCallback(thing, flags, + rt->gcThingCallback(thing, traceKind, rt->gcThingCallbackClosure); } while (--n != 0); } @@ -2214,16 +2191,36 @@ js_TraceStackFrame(JSTracer *trc, JSStackFrame *fp) static void TraceWeakRoots(JSTracer *trc, JSWeakRoots *wr) { - uintN i; + uint32 i; void *thing; - for (i = 0; i < GCX_NTYPES; i++) { +#ifdef DEBUG + static const char *weakRootNames[JSTRACE_LIMIT] = { + "newborn object", + "newborn double", + "newborn string", + "newborn function", + "newborn namespace", + "newborn qname", + "newborn xml" + }; +#endif + + for (i = 0; i != JSTRACE_LIMIT; i++) { + thing = wr->newborn[i]; + if (thing) + JS_CALL_TRACER(trc, thing, i, weakRootNames[i]); + } + JS_ASSERT(i == GCX_EXTERNAL_STRING); + for (; i != GCX_NTYPES; ++i) { thing = wr->newborn[i]; if (thing) { - JS_CALL_TRACER(trc, thing, GCTypeToTraceKindMap[i], - gc_typenames[i]); + JS_SET_TRACING_INDEX(trc, "newborn external string", + i - GCX_EXTERNAL_STRING); + JS_CallTracer(trc, thing, JSTRACE_STRING); } } + JS_CALL_VALUE_TRACER(trc, wr->lastAtom, "lastAtom"); JS_SET_TRACING_NAME(trc, "lastInternalResult"); js_CallValueTracerIfGCThing(trc, wr->lastInternalResult); @@ -2664,7 +2661,9 @@ restart: JS_ASSERT(type == GCX_STRING || type - GCX_EXTERNAL_STRING < GCX_NTYPES - GCX_EXTERNAL_STRING); - js_FinalizeStringRT(rt, (JSString *) thing, type, cx); + js_FinalizeStringRT(rt, (JSString *) thing, + (intN) (type - GCX_EXTERNAL_STRING), + cx); break; } thing->flagp = flagp; diff --git a/mozilla/js/src/jsgc.h b/mozilla/js/src/jsgc.h index 3e03c299d13..b129b351b44 100644 --- a/mozilla/js/src/jsgc.h +++ b/mozilla/js/src/jsgc.h @@ -49,28 +49,60 @@ JS_BEGIN_EXTERN_C -/* GC thing type indexes. */ -#define GCX_OBJECT 0 /* JSObject */ -#define GCX_STRING 1 /* JSString */ -#define GCX_DOUBLE 2 /* jsdouble */ -#define GCX_FUNCTION 3 /* JSFunction */ -#define GCX_NAMESPACE 4 /* JSXMLNamespace */ -#define GCX_QNAME 5 /* JSXMLQName */ -#define GCX_XML 6 /* JSXML */ -#define GCX_EXTERNAL_STRING 8 /* JSString w/ external chars */ +JS_STATIC_ASSERT(JSTRACE_STRING == 2); -#define GCX_NTYPES_LOG2 4 /* type index bits */ -#define GCX_NTYPES JS_BIT(GCX_NTYPES_LOG2) +#define JSTRACE_FUNCTION 3 +#define JSTRACE_NAMESPACE 4 +#define JSTRACE_QNAME 5 +#define JSTRACE_XML 6 + +/* + * One past the maximum trace kind. + */ +#define JSTRACE_LIMIT 7 + +/* + * We use the trace kinds as the types for all GC things except external + * strings. + */ +#define GCX_OBJECT JSTRACE_OBJECT /* JSObject */ +#define GCX_DOUBLE JSTRACE_DOUBLE /* jsdouble */ +#define GCX_STRING JSTRACE_STRING /* JSString */ +#define GCX_FUNCTION JSTRACE_FUNCTION /* JSFunction */ +#define GCX_NAMESPACE JSTRACE_NAMESPACE /* JSXMLNamespace */ +#define GCX_QNAME JSTRACE_QNAME /* JSXMLQName */ +#define GCX_XML JSTRACE_XML /* JSXML */ +#define GCX_EXTERNAL_STRING JSTRACE_LIMIT /* JSString with external + chars */ +/* + * The number of defined GC types. + */ +#define GCX_NTYPES (GCX_EXTERNAL_STRING + 8) + +/* + * The maximum limit for the number of GC types. + */ +#define GCX_LIMIT_LOG2 4 /* type index bits */ +#define GCX_LIMIT JS_BIT(GCX_LIMIT_LOG2) + +JS_STATIC_ASSERT(GCX_NTYPES <= GCX_LIMIT); /* GC flag definitions, must fit in 8 bits (type index goes in the low bits). */ -#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_LOCKSHIFT (GCX_NTYPES_LOG2 + 2) /* lock bit shift */ +#define GCF_TYPEMASK JS_BITMASK(GCX_LIMIT_LOG2) +#define GCF_MARK JS_BIT(GCX_LIMIT_LOG2) +#define GCF_FINAL JS_BIT(GCX_LIMIT_LOG2 + 1) +#define GCF_LOCKSHIFT (GCX_LIMIT_LOG2 + 2) /* lock bit shift */ #define GCF_LOCK JS_BIT(GCF_LOCKSHIFT) /* lock request bit in API */ -extern JS_FRIEND_API(uint8 *) -js_GetGCThingFlags(void *thing); +/* + * Get the type of the external string or -1 if the string was not created + * with JS_NewExternalString. + */ +extern intN +js_GetExternalStringGCType(JSString *str); + +extern JS_FRIEND_API(uint32) +js_GetGCThingTraceKind(void *thing); /* * The sole purpose of the function is to preserve public API compatibility @@ -168,13 +200,6 @@ js_IsAboutToBeFinalized(JSContext *cx, void *thing); */ #define IS_GC_MARKING_TRACER(trc) ((trc)->callback == NULL) -JS_STATIC_ASSERT(JSTRACE_STRING == 2); - -#define JSTRACE_FUNCTION 3 -#define JSTRACE_NAMESPACE 4 -#define JSTRACE_QNAME 5 -#define JSTRACE_XML 6 - #if JS_HAS_XML_SUPPORT # define JS_IS_VALID_TRACE_KIND(kind) ((uint32)(kind) <= JSTRACE_XML) #else @@ -189,8 +214,8 @@ JS_STATIC_ASSERT(JSTRACE_FUNCTION + 1 == JSTRACE_NAMESPACE); /* * Trace jsval when JSVAL_IS_OBJECT(v) can be an arbitrary GC thing casted as - * JSVAL_OBJECT and js_GetGCThingFlags has to be used to find the real type - * behind v. + * JSVAL_OBJECT and js_GetGCThingTraceKind has to be used to find the real + * type behind v. */ extern void js_CallValueTracerIfGCThing(JSTracer *trc, jsval v); diff --git a/mozilla/js/src/jspubtd.h b/mozilla/js/src/jspubtd.h index 63757037dae..e3ab3374962 100644 --- a/mozilla/js/src/jspubtd.h +++ b/mozilla/js/src/jspubtd.h @@ -637,7 +637,8 @@ typedef JSBool (* JS_DLL_CALLBACK JSGCCallback)(JSContext *cx, JSGCStatus status); typedef void -(* JS_DLL_CALLBACK JSGCThingCallback)(void *thing, uint8 flags, void *closure); +(* JS_DLL_CALLBACK JSGCThingCallback)(void *thing, uint32 traceKind, + void *closure); /* * Generic trace operation that calls JS_CallTracer on each traceable thing diff --git a/mozilla/js/src/jsstr.c b/mozilla/js/src/jsstr.c index 833b78b39ed..27909cb17a1 100644 --- a/mozilla/js/src/jsstr.c +++ b/mozilla/js/src/jsstr.c @@ -2633,7 +2633,7 @@ js_ChangeExternalStringFinalizer(JSStringFinalizeOp oldop, for (i = 0; i != JS_ARRAY_LENGTH(str_finalizers); i++) { if (str_finalizers[i] == oldop) { str_finalizers[i] = newop; - return (intN) i + GCX_EXTERNAL_STRING; + return (intN) i; } } return -1; @@ -2644,15 +2644,15 @@ js_ChangeExternalStringFinalizer(JSStringFinalizeOp oldop, * finalization of the permanently interned strings. */ void -js_FinalizeStringRT(JSRuntime *rt, JSString *str, uintN gctype, JSContext *cx) +js_FinalizeStringRT(JSRuntime *rt, JSString *str, intN type, JSContext *cx) { JSBool valid; JSStringFinalizeOp finalizer; JS_RUNTIME_UNMETER(rt, liveStrings); if (JSSTRING_IS_DEPENDENT(str)) { - JS_ASSERT(gctype == GCX_STRING); - /* If JSSTRFLAG_DEPENDENT is set, this string must be valid. */ + /* A dependent string can not be external and must be valid. */ + JS_ASSERT(type < 0); JS_ASSERT(JSSTRDEP_BASE(str)); JS_RUNTIME_UNMETER(rt, liveDependentStrings); valid = JS_TRUE; @@ -2662,14 +2662,13 @@ js_FinalizeStringRT(JSRuntime *rt, JSString *str, uintN gctype, JSContext *cx) if (valid) { if (IN_UNIT_STRING_SPACE_RT(rt, str->u.chars)) { JS_ASSERT(rt->unitStrings[*str->u.chars] == str); - JS_ASSERT(gctype == GCX_STRING); + JS_ASSERT(type < 0); rt->unitStrings[*str->u.chars] = NULL; - } else if (gctype == GCX_STRING) { + } else if (type < 0) { free(str->u.chars); } else { - JS_ASSERT(gctype - GCX_EXTERNAL_STRING < - JS_ARRAY_LENGTH(str_finalizers)); - finalizer = str_finalizers[gctype - GCX_EXTERNAL_STRING]; + JS_ASSERT((uintN) type < JS_ARRAY_LENGTH(str_finalizers)); + finalizer = str_finalizers[type]; if (finalizer) { /* * Assume that the finalizer for the permanently interned diff --git a/mozilla/js/src/jsstr.h b/mozilla/js/src/jsstr.h index 1187e0e2e17..896103b8844 100644 --- a/mozilla/js/src/jsstr.h +++ b/mozilla/js/src/jsstr.h @@ -407,12 +407,14 @@ extern JSString * js_NewStringCopyZ(JSContext *cx, const jschar *s); /* - * Free the chars held by str when it is finalized by the GC. + * Free the chars held by str when it is finalized by the GC. When type is + * less then zero, it denotes an internal string. Otherwise it denotes the + * type of the external string allocated with JS_NewExternalString. * * This function always needs rt but can live with null cx. */ extern void -js_FinalizeStringRT(JSRuntime *rt, JSString *str, uintN gctype, JSContext *cx); +js_FinalizeStringRT(JSRuntime *rt, JSString *str, intN type, JSContext *cx); /* * Convert a value to a printable C string. diff --git a/mozilla/js/src/xpconnect/src/nsXPConnect.cpp b/mozilla/js/src/xpconnect/src/nsXPConnect.cpp index 3b8e6b752ea..7c79392bcd8 100644 --- a/mozilla/js/src/xpconnect/src/nsXPConnect.cpp +++ b/mozilla/js/src/xpconnect/src/nsXPConnect.cpp @@ -699,33 +699,6 @@ NoteJSChild(JSTracer *trc, void *thing, uint32 kind) } } -static uint8 GCTypeToTraceKindMap[GCX_NTYPES] = { - JSTRACE_OBJECT, /* GCX_OBJECT */ - JSTRACE_STRING, /* GCX_STRING */ - JSTRACE_DOUBLE, /* GCX_DOUBLE */ - JSTRACE_FUNCTION, /* GCX_FUNCTION */ - JSTRACE_NAMESPACE, /* GCX_NAMESPACE */ - JSTRACE_QNAME, /* GCX_QNAME */ - JSTRACE_XML, /* GCX_XML */ - (uint8)-1, /* unused */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 0 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 1 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 2 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 3 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 4 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 5 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 6 */ - JSTRACE_STRING, /* GCX_EXTERNAL_STRING + 7 */ -}; - -// static -uint8 -nsXPConnect::GetTraceKind(void *thing) -{ - uint8 type = *js_GetGCThingFlags(thing) & GCF_TYPEMASK; - return GCTypeToTraceKindMap[type]; -} - NS_IMETHODIMP nsXPConnect::Traverse(void *p, nsCycleCollectionTraversalCallback &cb) { @@ -734,7 +707,7 @@ nsXPConnect::Traverse(void *p, nsCycleCollectionTraversalCallback &cb) JSContext *cx = mCycleCollectionContext->GetJSContext(); - uint8 ty = GetTraceKind(p); + uint32 traceKind = js_GetGCThingTraceKind(p); CCNodeType type; @@ -750,7 +723,7 @@ nsXPConnect::Traverse(void *p, nsCycleCollectionTraversalCallback &cb) type = JS_IsAboutToBeFinalized(cx, p) ? GCUnmarked : GCMarked; } - if(ty == GCX_OBJECT) + if(traceKind == JSTRACE_OBJECT) { JSObject *obj = static_cast(p); JSClass *clazz = OBJ_GET_CLASS(cx, obj); @@ -857,8 +830,10 @@ nsXPConnect::Traverse(void *p, nsCycleCollectionTraversalCallback &cb) cb.DescribeNode(type, 0); #endif - if(ty != GCX_OBJECT && ty != GCX_NAMESPACE && ty != GCX_QNAME && - ty != GCX_XML) + if(traceKind != JSTRACE_OBJECT && + traceKind != JSTRACE_NAMESPACE && + traceKind != JSTRACE_QNAME && + traceKind != JSTRACE_XML) return NS_OK; #ifndef DEBUG_CC @@ -873,9 +848,9 @@ nsXPConnect::Traverse(void *p, nsCycleCollectionTraversalCallback &cb) TraversalTracer trc(cb); JS_TRACER_INIT(&trc, cx, NoteJSChild); - JS_TraceChildren(&trc, p, GCTypeToTraceKindMap[ty]); + JS_TraceChildren(&trc, p, traceKind); - if(ty != GCX_OBJECT) + if(traceKind != JSTRACE_OBJECT) return NS_OK; JSObject *obj = static_cast(p); diff --git a/mozilla/js/src/xpconnect/src/xpcjsruntime.cpp b/mozilla/js/src/xpconnect/src/xpcjsruntime.cpp index bce26bc52f6..815ae0f20bf 100644 --- a/mozilla/js/src/xpconnect/src/xpcjsruntime.cpp +++ b/mozilla/js/src/xpconnect/src/xpcjsruntime.cpp @@ -332,7 +332,7 @@ TraceJSObject(PRUint32 aLangID, void *aScriptThing, void *aClosure) if(aLangID == nsIProgrammingLanguage::JAVASCRIPT) { JS_CALL_TRACER(static_cast(aClosure), aScriptThing, - nsXPConnect::GetXPConnect()->GetTraceKind(aScriptThing), + js_GetGCThingTraceKind(aScriptThing), "JSObjectHolder"); } } diff --git a/mozilla/js/src/xpconnect/src/xpcprivate.h b/mozilla/js/src/xpconnect/src/xpcprivate.h index 071cfaf4388..e83d63a5383 100644 --- a/mozilla/js/src/xpconnect/src/xpcprivate.h +++ b/mozilla/js/src/xpconnect/src/xpcprivate.h @@ -506,8 +506,6 @@ public: return !mCycleCollecting; } - static uint8 GetTraceKind(void *thing); - XPCCallContext* GetCycleCollectionContext() { return mCycleCollectionContext;