bool RootList::init(HandleObject debuggees) { MOZ_ASSERT(debuggees && JS::dbg::IsDebugger(ObjectValue(*debuggees))); js::Debugger *dbg = js::Debugger::fromJSObject(debuggees); ZoneSet debuggeeZones; if (!debuggeeZones.init()) return false; for (js::WeakGlobalObjectSet::Range r = dbg->allDebuggees(); !r.empty(); r.popFront()) { if (!debuggeeZones.put(r.front()->zone())) return false; } if (!init(debuggeeZones)) return false; // Ensure that each of our debuggee globals are in the root list. for (js::WeakGlobalObjectSet::Range r = dbg->allDebuggees(); !r.empty(); r.popFront()) { if (!addRoot(JS::ubi::Node(static_cast<JSObject *>(r.front())), MOZ_UTF16("debuggee global"))) { return false; } } return true; }
void PictureZoneEditor::commitZones() { ZoneSet zones; BOOST_FOREACH(EditableZoneSet::Zone const& zone, m_zones) { zones.add(Zone(*zone.spline(), *zone.properties())); }
void FillZoneEditor::commitZones() { ZoneSet zones; BOOST_FOREACH(EditableZoneSet::Zone const& zone, m_zones) { SerializableSpline const spline( SerializableSpline(*zone.spline()).transformed(m_imageToOrig) ); zones.add(Zone(spline, *zone.properties())); }
void Filter::loadSettings(ProjectReader const& reader, QDomElement const& filters_el) { m_ptrSettings->clear(); QDomElement const filter_el( filters_el.namedItem("output").toElement() ); QString const page_tag_name("page"); QDomNode node(filter_el.firstChild()); for (; !node.isNull(); node = node.nextSibling()) { if (!node.isElement()) { continue; } if (node.nodeName() != page_tag_name) { continue; } QDomElement const el(node.toElement()); bool ok = true; int const id = el.attribute("id").toInt(&ok); if (!ok) { continue; } PageId const page_id(reader.pageId(id)); if (page_id.isNull()) { continue; } ZoneSet const picture_zones(el.namedItem("zones").toElement(), m_pictureZonePropFactory); if (!picture_zones.empty()) { m_ptrSettings->setPictureZones(page_id, picture_zones); } ZoneSet const fill_zones(el.namedItem("fill-zones").toElement(), m_fillZonePropFactory); if (!fill_zones.empty()) { m_ptrSettings->setFillZones(page_id, fill_zones); } QDomElement const params_el(el.namedItem("params").toElement()); if (!params_el.isNull()) { Params const params(params_el); m_ptrSettings->setParams(page_id, params); } QDomElement const output_params_el(el.namedItem("output-params").toElement()); if (!output_params_el.isNull()) { OutputParams const output_params(output_params_el); m_ptrSettings->setOutputParams(page_id, output_params); } } }
// If we are only taking a snapshot of the heap affected by the given set of // globals, find the set of zones the globals are allocated within. Returns // false on OOM failure. static bool PopulateZonesWithGlobals(ZoneSet& zones, AutoObjectVector& globals) { if (!zones.init()) return false; unsigned length = globals.length(); for (unsigned i = 0; i < length; i++) { if (!zones.put(GetObjectZone(globals[i]))) return false; } return true; }
bool RootList::init(ZoneSet &debuggees) { SimpleEdgeVector allRootEdges(cx); SimpleEdgeVectorTracer tracer(cx, &allRootEdges, wantNames); JS_TraceRuntime(&tracer); if (!tracer.okay) return false; JS_TraceIncomingCCWs(&tracer, debuggees); if (!tracer.okay) return false; for (SimpleEdgeVector::Range r = allRootEdges.all(); !r.empty(); r.popFront()) { SimpleEdge &edge = r.front(); Zone *zone = edge.referent.zone(); if (zone && !debuggees.has(zone)) continue; if (!edges.append(mozilla::Move(edge))) return false; } noGC.emplace(cx->runtime()); return true; }
bool RootList::init(CompartmentSet& debuggees) { EdgeVector allRootEdges; EdgeVectorTracer tracer(rt, &allRootEdges, wantNames); ZoneSet debuggeeZones; if (!debuggeeZones.init()) return false; for (auto range = debuggees.all(); !range.empty(); range.popFront()) { if (!debuggeeZones.put(range.front()->zone())) return false; } js::TraceRuntime(&tracer); if (!tracer.okay) return false; TraceIncomingCCWs(&tracer, debuggees); if (!tracer.okay) return false; for (EdgeVector::Range r = allRootEdges.all(); !r.empty(); r.popFront()) { Edge& edge = r.front(); JSCompartment* compartment = edge.referent.compartment(); if (compartment && !debuggees.has(compartment)) continue; Zone* zone = edge.referent.zone(); if (zone && !debuggeeZones.has(zone)) continue; if (!edges.append(mozilla::Move(edge))) return false; } noGC.emplace(rt); return true; }
// Choose roots and limits for a traversal, given `boundaries`. Set `roots` to // the set of nodes within the boundaries that are referred to by nodes // outside. If `boundaries` does not include all JS zones, initialize `zones` to // the set of included zones; otherwise, leave `zones` uninitialized. (You can // use zones.initialized() to check.) // // If `boundaries` is incoherent, or we encounter an error while trying to // handle it, or we run out of memory, set `rv` appropriately and return // `false`. static bool EstablishBoundaries(JSContext* cx, ErrorResult& rv, const HeapSnapshotBoundaries& boundaries, ubi::RootList& roots, ZoneSet& zones) { MOZ_ASSERT(!roots.initialized()); MOZ_ASSERT(!zones.initialized()); bool foundBoundaryProperty = false; if (boundaries.mRuntime.WasPassed()) { foundBoundaryProperty = true; if (!boundaries.mRuntime.Value()) { rv.Throw(NS_ERROR_INVALID_ARG); return false; } if (!roots.init()) { rv.Throw(NS_ERROR_OUT_OF_MEMORY); return false; } } if (boundaries.mDebugger.WasPassed()) { if (foundBoundaryProperty) { rv.Throw(NS_ERROR_INVALID_ARG); return false; } foundBoundaryProperty = true; JSObject* dbgObj = boundaries.mDebugger.Value(); if (!dbgObj || !dbg::IsDebugger(*dbgObj)) { rv.Throw(NS_ERROR_INVALID_ARG); return false; } AutoObjectVector globals(cx); if (!dbg::GetDebuggeeGlobals(cx, *dbgObj, globals) || !PopulateZonesWithGlobals(zones, globals) || !roots.init(zones) || !AddGlobalsAsRoots(globals, roots)) { rv.Throw(NS_ERROR_OUT_OF_MEMORY); return false; } } if (boundaries.mGlobals.WasPassed()) { if (foundBoundaryProperty) { rv.Throw(NS_ERROR_INVALID_ARG); return false; } foundBoundaryProperty = true; uint32_t length = boundaries.mGlobals.Value().Length(); if (length == 0) { rv.Throw(NS_ERROR_INVALID_ARG); return false; } AutoObjectVector globals(cx); for (uint32_t i = 0; i < length; i++) { JSObject* global = boundaries.mGlobals.Value().ElementAt(i); if (!JS_IsGlobalObject(global)) { rv.Throw(NS_ERROR_INVALID_ARG); return false; } if (!globals.append(global)) { rv.Throw(NS_ERROR_OUT_OF_MEMORY); return false; } } if (!PopulateZonesWithGlobals(zones, globals) || !roots.init(zones) || !AddGlobalsAsRoots(globals, roots)) { rv.Throw(NS_ERROR_OUT_OF_MEMORY); return false; } } if (!foundBoundaryProperty) { rv.Throw(NS_ERROR_INVALID_ARG); return false; } MOZ_ASSERT(roots.initialized()); MOZ_ASSERT_IF(boundaries.mDebugger.WasPassed(), zones.initialized()); MOZ_ASSERT_IF(boundaries.mGlobals.WasPassed(), zones.initialized()); return true; }