void XPCTraceableVariant::TraceJS(JSTracer* trc) { jsval val = GetJSValPreserveColor(); NS_ASSERTION(JSVAL_IS_TRACEABLE(val), "Must be traceable"); JS_SET_TRACING_DETAILS(trc, PrintTraceName, this, 0); JS_CallTracer(trc, JSVAL_TO_TRACEABLE(val), JSVAL_TRACE_KIND(val)); }
void traceValue(JSTracer* tracer, jsval val) { JS_SET_TRACING_DETAILS(tracer, printTraceName, NULL, 0); if (JSVAL_IS_TRACEABLE(val)) { uint32 kind = JSVAL_TRACE_KIND(val); JS_CallTracer(tracer, JSVAL_TO_TRACEABLE(val), kind); } }
static void trace_foreach(void *key, void *value, void *data) { Child *child = value; JSTracer *tracer = data; if (child->child != NULL) { jsval val; JS_SET_TRACING_DETAILS(tracer, NULL, "keep-alive", 0); val = OBJECT_TO_JSVAL(child->child); JS_CallTracer(tracer, JSVAL_TO_TRACEABLE (val), JSTRACE_OBJECT); } }
static void trace_foreach(void *key, void *value, void *data) { Child *child = (Child *) value; JSTracer *tracer = (JSTracer *) data; if (child->child != NULL) { jsval val; JS_SET_TRACING_DETAILS(tracer, NULL, "keep-alive", 0); val = OBJECT_TO_JSVAL(child->child); g_assert (JSVAL_TO_TRACEABLE (val)); JS_CallValueTracer(tracer, &val, "keep-alive::val"); } }
static JSBool DumpHeap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char *fileName = NULL; void* startThing = NULL; uint32 startTraceKind = 0; void *thingToFind = NULL; size_t maxDepth = (size_t)-1; void *thingToIgnore = NULL; jsval *vp; FILE *dumpFile; JSBool ok; vp = &argv[0]; if (*vp != JSVAL_NULL && *vp != JSVAL_VOID) { JSString *str; str = JS_ValueToString(cx, *vp); if (!str) return JS_FALSE; *vp = STRING_TO_JSVAL(str); fileName = JS_GetStringBytes(str); } vp = &argv[1]; if (*vp != JSVAL_NULL && *vp != JSVAL_VOID) { if (!JSVAL_IS_TRACEABLE(*vp)) goto not_traceable_arg; startThing = JSVAL_TO_TRACEABLE(*vp); startTraceKind = JSVAL_TRACE_KIND(*vp); } vp = &argv[2]; if (*vp != JSVAL_NULL && *vp != JSVAL_VOID) { if (!JSVAL_IS_TRACEABLE(*vp)) goto not_traceable_arg; thingToFind = JSVAL_TO_TRACEABLE(*vp); } vp = &argv[3]; if (*vp != JSVAL_NULL && *vp != JSVAL_VOID) { uint32 depth; if (!JS_ValueToECMAUint32(cx, *vp, &depth)) return JS_FALSE; maxDepth = depth; } vp = &argv[4]; if (*vp != JSVAL_NULL && *vp != JSVAL_VOID) { if (!JSVAL_IS_TRACEABLE(*vp)) goto not_traceable_arg; thingToIgnore = JSVAL_TO_TRACEABLE(*vp); } if (!fileName) { dumpFile = gOutFile; } else { dumpFile = fopen(fileName, "w"); if (!dumpFile) { fprintf(gErrFile, "dumpHeap: can't open %s: %s\n", fileName, strerror(errno)); return JS_FALSE; } } ok = JS_DumpHeap(cx, dumpFile, startThing, startTraceKind, thingToFind, maxDepth, thingToIgnore); if (dumpFile != gOutFile) fclose(dumpFile); return ok; not_traceable_arg: fprintf(gErrFile, "dumpHeap: argument %u is not null or a heap-allocated thing\n", (unsigned)(vp - argv)); return JS_FALSE; }
void TraceCallbackFunc::Trace(JS::Heap<JS::Value>* p, const char* name, void* closure) const { mCallback(JSVAL_TO_TRACEABLE(p->get()), name, closure); }
void XPCTraceableVariant::TraceJS(JSTracer* trc) { NS_ASSERTION(JSVAL_IS_TRACEABLE(mJSVal), "Must be traceable"); JS_SET_TRACING_DETAILS(trc, PrintTraceName, this, 0); JS_CallTracer(trc, JSVAL_TO_TRACEABLE(mJSVal), JSVAL_TRACE_KIND(mJSVal)); }