From d9f25753a45571ba0b2ecc35ce6efd4381be5913 Mon Sep 17 00:00:00 2001 From: "dbaron%dbaron.org" Date: Fri, 8 Feb 2008 19:50:47 +0000 Subject: [PATCH] More detailed description of JS objects. b=414972 r+sr=peterv a=not part of default build (DEBUG_CC only) git-svn-id: svn://10.0.0.236/trunk@245248 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/js/src/xpconnect/src/nsXPConnect.cpp | 30 +++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/mozilla/js/src/xpconnect/src/nsXPConnect.cpp b/mozilla/js/src/xpconnect/src/nsXPConnect.cpp index e0b1691a3c2..f61947d0d1c 100644 --- a/mozilla/js/src/xpconnect/src/nsXPConnect.cpp +++ b/mozilla/js/src/xpconnect/src/nsXPConnect.cpp @@ -749,6 +749,7 @@ nsXPConnect::Traverse(void *p, nsCycleCollectionTraversalCallback &cb) CCNodeType type; #ifdef DEBUG_CC + { // Note that the conditions under which we specify GCMarked vs. // GCUnmarked are different between ExplainLiveExpectedGarbage and // the normal case. In the normal case, we're saying that anything @@ -772,11 +773,11 @@ nsXPConnect::Traverse(void *p, nsCycleCollectionTraversalCallback &cb) type = JS_IsAboutToBeFinalized(cx, p) ? GCUnmarked : GCMarked; } + char name[72]; if(traceKind == JSTRACE_OBJECT) { JSObject *obj = static_cast(p); JSClass *clazz = OBJ_GET_CLASS(cx, obj); - char name[72]; if(XPCNativeWrapper::IsNativeWrapperClass(clazz)) { XPCWrappedNative* wn = XPCNativeWrapper::GetWrappedNative(obj); @@ -867,12 +868,33 @@ nsXPConnect::Traverse(void *p, nsCycleCollectionTraversalCallback &cb) JS_snprintf(name, sizeof(name), "JS Object (%s)", clazz->name); } } - - cb.DescribeNode(type, 0, sizeof(JSObject), name); } else { - cb.DescribeNode(type, 0, sizeof(JSObject), "JS Object"); + static const char trace_types[JSTRACE_LIMIT][10] = { + "Object", + "Double", + "String", + "Function", + "Namespace", + "Qname", + "Xml" + }; + JS_snprintf(name, sizeof(name), "JS %s", trace_types[traceKind]); + } + + if(traceKind == JSTRACE_OBJECT || traceKind == JSTRACE_NAMESPACE || + traceKind == JSTRACE_QNAME || traceKind == JSTRACE_XML) { + JSObject *global = static_cast(p), *parent; + while((parent = JS_GetParent(cx, global))) + global = parent; + char fullname[100]; + JS_snprintf(fullname, sizeof(fullname), "%s (global=%p)", name, global); + cb.DescribeNode(type, 0, sizeof(JSObject), fullname); + } else { + cb.DescribeNode(type, 0, sizeof(JSObject), name); + } + } #else type = JS_IsAboutToBeFinalized(cx, p) ? GCUnmarked : GCMarked;