diff --git a/js/src/xpconnect/src/xpcwrappednativescope.cpp b/js/src/xpconnect/src/xpcwrappednativescope.cpp index 22b2b8cdf6b2..59c279b53967 100644 --- a/js/src/xpconnect/src/xpcwrappednativescope.cpp +++ b/js/src/xpconnect/src/xpcwrappednativescope.cpp @@ -272,13 +272,17 @@ WrappedNativeJSGCThingTracer(JSDHashTable *table, JSDHashEntryHdr *hdr, JS_CALL_OBJECT_TRACER(trc, wrapper->GetFlatJSObject(), "XPCWrappedNative::mFlatJSObject"); - // FIXME: this call appears to do more harm than good, but - // there is reason to imagine it might clean up some cycles - // formed by a poor order between C++ and JS garbage cycle - // formations. See Bug 368869. - // - // if (JS_IsGCMarkingTracer(trc)) - // nsCycleCollector_suspectCurrent(wrapper); + if (JS_IsGCMarkingTracer(trc)) + { + XPCWrappedNativeProto* proto = wrapper->GetProto(); + if (proto && + proto->ClassIsMainThreadOnly()) + { + NS_ASSERTION(NS_IsMainThread(), + "Tracing wrapped natives from non-main thread"); + nsCycleCollector_suspectCurrent(wrapper); + } + } } return JS_DHASH_NEXT; }