void callback(void **thingp, JSGCTraceKind kind) { if (!okay) return; char16_t *name16 = nullptr; if (wantNames) { // Ask the tracer to compute an edge name for us. char buffer[1024]; const char *name = getTracingEdgeName(buffer, sizeof(buffer)); // Convert the name to char16_t characters. name16 = js_pod_malloc<char16_t>(strlen(name) + 1); if (!name16) { okay = false; return; } size_t i; for (i = 0; name[i]; i++) name16[i] = name[i]; name16[i] = '\0'; } // The simplest code is correct! The temporary SimpleEdge takes // ownership of name; if the append succeeds, the vector element // then takes ownership; if the append fails, then the temporary // retains it, and its destructor will free it. if (!vec->append(mozilla::Move(SimpleEdge(name16, Node(kind, *thingp))))) { okay = false; return; } }
void onChild(const JS::GCCellPtr& thing) override { if (!okay) return; // Don't trace permanent atoms and well-known symbols that are owned by // a parent JSRuntime. if (thing.is<JSString>() && thing.as<JSString>().isPermanentAtom()) return; if (thing.is<JS::Symbol>() && thing.as<JS::Symbol>().isWellKnownSymbol()) return; char16_t* name16 = nullptr; if (wantNames) { // Ask the tracer to compute an edge name for us. char buffer[1024]; getTracingEdgeName(buffer, sizeof(buffer)); const char* name = buffer; // Convert the name to char16_t characters. name16 = js_pod_malloc<char16_t>(strlen(name) + 1); if (!name16) { okay = false; return; } size_t i; for (i = 0; name[i]; i++) name16[i] = name[i]; name16[i] = '\0'; } // The simplest code is correct! The temporary SimpleEdge takes // ownership of name; if the append succeeds, the vector element // then takes ownership; if the append fails, then the temporary // retains it, and its destructor will free it. if (!vec->append(mozilla::Move(SimpleEdge(name16, Node(thing))))) { okay = false; return; } }