Skip to content

Commit

Permalink
Bug 726115 - Make the tracer callback take an indirect pointer; r=billm
Browse files Browse the repository at this point in the history
This will be required for a tracer to move objects.  This patch only
updates the tracer interface and users of the interface.

--HG--
extra : rebase_source : 844d819a80cf6cb1dba0d07ea97f647802c66d40
  • Loading branch information
Terrence Cole committed Feb 16, 2012
1 parent 83e494a commit 2480b14
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 30 deletions.
3 changes: 2 additions & 1 deletion js/src/jsapi.cpp
Expand Up @@ -2642,8 +2642,9 @@ typedef struct JSDumpingTracer {
} JSDumpingTracer;

static void
DumpNotify(JSTracer *trc, void *thing, JSGCTraceKind kind)
DumpNotify(JSTracer *trc, void **thingp, JSGCTraceKind kind)
{
void *thing = *thingp;
JSDumpingTracer *dtrc;
JSContext *cx;
JSDHashEntryStub *entry;
Expand Down
2 changes: 1 addition & 1 deletion js/src/jsapi.h
Expand Up @@ -3098,7 +3098,7 @@ JSVAL_TRACE_KIND(jsval v)
* wants to use the existing liveness of entries.
*/
typedef void
(* JSTraceCallback)(JSTracer *trc, void *thing, JSGCTraceKind kind);
(* JSTraceCallback)(JSTracer *trc, void **thingp, JSGCTraceKind kind);

struct JSTracer {
JSRuntime *runtime;
Expand Down
11 changes: 6 additions & 5 deletions js/src/jsfriendapi.cpp
Expand Up @@ -483,13 +483,14 @@ struct JSDumpHeapTracer : public JSTracer {
};

static void
DumpHeapVisitChild(JSTracer *trc, void *thing, JSGCTraceKind kind);
DumpHeapVisitChild(JSTracer *trc, void **thingp, JSGCTraceKind kind);

static void
DumpHeapPushIfNew(JSTracer *trc, void *thing, JSGCTraceKind kind)
DumpHeapPushIfNew(JSTracer *trc, void **thingp, JSGCTraceKind kind)
{
JS_ASSERT(trc->callback == DumpHeapPushIfNew ||
trc->callback == DumpHeapVisitChild);
void *thing = *thingp;
JSDumpHeapTracer *dtrc = static_cast<JSDumpHeapTracer *>(trc);

/*
Expand All @@ -509,13 +510,13 @@ DumpHeapPushIfNew(JSTracer *trc, void *thing, JSGCTraceKind kind)
}

static void
DumpHeapVisitChild(JSTracer *trc, void *thing, JSGCTraceKind kind)
DumpHeapVisitChild(JSTracer *trc, void **thingp, JSGCTraceKind kind)
{
JS_ASSERT(trc->callback == DumpHeapVisitChild);
JSDumpHeapTracer *dtrc = static_cast<JSDumpHeapTracer *>(trc);
const char *edgeName = JS_GetTraceEdgeName(dtrc, dtrc->buffer, sizeof(dtrc->buffer));
fprintf(dtrc->output, "> %p %s\n", (void *)thing, edgeName);
DumpHeapPushIfNew(dtrc, thing, kind);
fprintf(dtrc->output, "> %p %s\n", *thingp, edgeName);
DumpHeapPushIfNew(dtrc, thingp, kind);
}

void
Expand Down
14 changes: 7 additions & 7 deletions js/src/jsgc.cpp
Expand Up @@ -1815,7 +1815,7 @@ GCMarker::markDelayedChildren()

#ifdef DEBUG
static void
EmptyMarkCallback(JSTracer *trc, void *thing, JSGCTraceKind kind)
EmptyMarkCallback(JSTracer *trc, void **thingp, JSGCTraceKind kind)
{
}
#endif
Expand Down Expand Up @@ -3393,7 +3393,7 @@ struct VerifyTracer : JSTracer {
* node.
*/
static void
AccumulateEdge(JSTracer *jstrc, void *thing, JSGCTraceKind kind)
AccumulateEdge(JSTracer *jstrc, void **thingp, JSGCTraceKind kind)
{
VerifyTracer *trc = (VerifyTracer *)jstrc;

Expand All @@ -3406,7 +3406,7 @@ AccumulateEdge(JSTracer *jstrc, void *thing, JSGCTraceKind kind)
VerifyNode *node = trc->curnode;
uint32_t i = node->count;

node->edges[i].thing = thing;
node->edges[i].thing = *thingp;
node->edges[i].kind = kind;
node->edges[i].label = trc->debugPrinter ? NULL : (char *)trc->debugPrintArg;
node->count++;
Expand Down Expand Up @@ -3547,9 +3547,9 @@ StartVerifyBarriers(JSContext *cx)
}

static void
CheckAutorooter(JSTracer *jstrc, void *thing, JSGCTraceKind kind)
CheckAutorooter(JSTracer *jstrc, void **thingp, JSGCTraceKind kind)
{
static_cast<Cell *>(thing)->markIfUnmarked();
static_cast<Cell *>(*thingp)->markIfUnmarked();
}

/*
Expand All @@ -3560,13 +3560,13 @@ CheckAutorooter(JSTracer *jstrc, void *thing, JSGCTraceKind kind)
* modified) must point to marked objects.
*/
static void
CheckEdge(JSTracer *jstrc, void *thing, JSGCTraceKind kind)
CheckEdge(JSTracer *jstrc, void **thingp, JSGCTraceKind kind)
{
VerifyTracer *trc = (VerifyTracer *)jstrc;
VerifyNode *node = trc->curnode;

for (uint32_t i = 0; i < node->count; i++) {
if (node->edges[i].thing == thing) {
if (node->edges[i].thing == *thingp) {
JS_ASSERT(node->edges[i].kind == kind);
node->edges[i].thing = NULL;
return;
Expand Down
9 changes: 6 additions & 3 deletions js/src/jsgcmark.cpp
Expand Up @@ -106,10 +106,13 @@ MarkInternal(JSTracer *trc, T *thing)
* GC.
*/
if (!rt->gcCurrentCompartment || thing->compartment() == rt->gcCurrentCompartment) {
if (IS_GC_MARKING_TRACER(trc))
if (IS_GC_MARKING_TRACER(trc)) {
PushMarkStack(static_cast<GCMarker *>(trc), thing);
else
trc->callback(trc, (void *)thing, GetGCThingTraceKind(thing));
} else {
void *tmp = (void *)thing;
trc->callback(trc, &tmp, GetGCThingTraceKind(thing));
JS_ASSERT(tmp == thing);
}
}

#ifdef DEBUG
Expand Down
3 changes: 2 additions & 1 deletion js/src/shell/js.cpp
Expand Up @@ -1446,11 +1446,12 @@ typedef struct JSCountHeapTracer {
} JSCountHeapTracer;

static void
CountHeapNotify(JSTracer *trc, void *thing, JSGCTraceKind kind)
CountHeapNotify(JSTracer *trc, void **thingp, JSGCTraceKind kind)
{
JSCountHeapTracer *countTracer;
JSDHashEntryStub *entry;
JSCountHeapNode *node;
void *thing = *thingp;

JS_ASSERT(trc->callback == CountHeapNotify);
countTracer = (JSCountHeapTracer *)trc;
Expand Down
14 changes: 6 additions & 8 deletions js/src/shell/jsheaptools.cpp
Expand Up @@ -232,7 +232,7 @@ class HeapReverser : public JSTracer {
* A stack of work items. We represent the stack explicitly to avoid
* overflowing the C++ stack when traversing long chains of objects.
*/
Vector<Child> work;
Vector<Child> work;

/* When traverseEdge is called, the Cell and kind at which the edge originated. */
void *parent;
Expand All @@ -249,19 +249,17 @@ class HeapReverser : public JSTracer {
bool traversalStatus;

/* Static member function wrapping 'traverseEdge'. */
static void traverseEdgeWithThis(JSTracer *tracer, void *cell, JSGCTraceKind kind) {
static void traverseEdgeWithThis(JSTracer *tracer, void **thingp, JSGCTraceKind kind) {
HeapReverser *reverser = static_cast<HeapReverser *>(tracer);
reverser->traversalStatus = reverser->traverseEdge(cell, kind);
reverser->traversalStatus = reverser->traverseEdge(*thingp, kind);
}

/* Return a jsval representing a node, if possible; otherwise, return JSVAL_VOID. */
jsval nodeToValue(void *cell, int kind) {
if (kind == JSTRACE_OBJECT) {
JSObject *object = static_cast<JSObject *>(cell);
return OBJECT_TO_JSVAL(object);
} else {
if (kind != JSTRACE_OBJECT)
return JSVAL_VOID;
}
JSObject *object = static_cast<JSObject *>(cell);
return OBJECT_TO_JSVAL(object);
}
};

Expand Down
11 changes: 7 additions & 4 deletions js/xpconnect/src/nsXPConnect.cpp
Expand Up @@ -480,9 +480,10 @@ struct NoteWeakMapChildrenTracer : public JSTracer
};

static void
TraceWeakMappingChild(JSTracer *trc, void *thing, JSGCTraceKind kind)
TraceWeakMappingChild(JSTracer *trc, void **thingp, JSGCTraceKind kind)
{
MOZ_ASSERT(trc->callback == TraceWeakMappingChild);
void *thing = *thingp;
NoteWeakMapChildrenTracer *tracer =
static_cast<NoteWeakMapChildrenTracer *>(trc);
if (kind == JSTRACE_STRING)
Expand Down Expand Up @@ -721,8 +722,9 @@ xpc_GCThingIsGrayCCThing(void *thing)
* re-coloring.
*/
static void
UnmarkGrayChildren(JSTracer *trc, void *thing, JSGCTraceKind kind)
UnmarkGrayChildren(JSTracer *trc, void **thingp, JSGCTraceKind kind)
{
void *thing = *thingp;
int stackDummy;
if (!JS_CHECK_STACK_SIZE(js::GetContextStackLimit(trc->context), &stackDummy)) {
/*
Expand Down Expand Up @@ -776,9 +778,10 @@ struct TraversalTracer : public JSTracer
};

static void
NoteJSChild(JSTracer *trc, void *thing, JSGCTraceKind kind)
NoteJSChild(JSTracer *trc, void **thingp, JSGCTraceKind kind)
{
TraversalTracer *tracer = static_cast<TraversalTracer*>(trc);
void *thing = *thingp;

// Don't traverse non-gray objects, unless we want all traces.
if (!xpc_IsGrayGCThing(thing) && !tracer->cb.WantAllTraces())
Expand Down Expand Up @@ -1166,7 +1169,7 @@ struct VerifyTraceXPCGlobalCalledTracer
};

static void
VerifyTraceXPCGlobalCalled(JSTracer *trc, void *thing, JSGCTraceKind kind)
VerifyTraceXPCGlobalCalled(JSTracer *trc, void **thingp, JSGCTraceKind kind)
{
// We don't do anything here, we only want to verify that TraceXPCGlobal
// was called.
Expand Down

0 comments on commit 2480b14

Please sign in to comment.