diff --git a/js/public/TraceableVector.h b/js/public/TraceableVector.h index 2be4860ac0..1ab1f95cee 100644 --- a/js/public/TraceableVector.h +++ b/js/public/TraceableVector.h @@ -132,7 +132,7 @@ class MutableTraceableVectorOperations vec().infallibleAppend(aBegin, aLength); } void popBack() { vec().popBack(); } - T popCopy() { return vec().podCopy(); } + T popCopy() { return vec().popCopy(); } template T* insert(T* aP, U&& aVal) { return vec().insert(aP, mozilla::Forward(aVal)); } diff --git a/js/src/ds/IdValuePair.h b/js/src/ds/IdValuePair.h index 2ac9b59f30..8ca5f29947 100644 --- a/js/src/ds/IdValuePair.h +++ b/js/src/ds/IdValuePair.h @@ -10,39 +10,35 @@ #include "jsapi.h" #include "NamespaceImports.h" +#include "gc/Tracer.h" #include "js/Id.h" +#include "js/TraceableVector.h" namespace js { struct IdValuePair { - jsid id; Value value; + jsid id; IdValuePair() - : id(JSID_EMPTY), value(UndefinedValue()) + : value(UndefinedValue()), id(JSID_EMPTY) {} explicit IdValuePair(jsid idArg) - : id(idArg), value(UndefinedValue()) + : value(UndefinedValue()), id(idArg) {} IdValuePair(jsid idArg, Value valueArg) - : id(idArg), value(valueArg) + : value(valueArg), id(idArg) {} -}; -class MOZ_STACK_CLASS AutoIdValueVector : public JS::AutoVectorRooterBase -{ - public: - explicit AutoIdValueVector(ContextFriendFields* cx - MOZ_GUARD_OBJECT_NOTIFIER_PARAM) - : AutoVectorRooterBase(cx, IDVALVECTOR) - { - MOZ_GUARD_OBJECT_NOTIFIER_INIT; + void trace(JSTracer* trc) { + TraceRoot(trc, &value, "IdValuePair::value"); + TraceRoot(trc, &id, "IdValuePair::id"); } - - MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER }; +using IdValueVector = TraceableVector; + } /* namespace js */ #endif /* ds_IdValuePair_h */ diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index c4290ca0d0..ade5900dbb 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -4832,7 +4832,7 @@ ParseNode::getConstantValue(ExclusiveContext* cx, AllowConstantObjects allowObje } MOZ_ASSERT(allowObjects == AllowObjects); - AutoIdValueVector properties(cx); + Rooted properties(cx, IdValueVector(cx)); RootedValue value(cx), idvalue(cx); for (ParseNode* pn = pn_head; pn; pn = pn->pn_next) { diff --git a/js/src/gc/RootMarking.cpp b/js/src/gc/RootMarking.cpp index 8d01209deb..bda26da85a 100644 --- a/js/src/gc/RootMarking.cpp +++ b/js/src/gc/RootMarking.cpp @@ -152,27 +152,12 @@ AutoGCRooter::trace(JSTracer* trc) return; } - case IDVALVECTOR: { - AutoIdValueVector::VectorImpl& vector = static_cast(this)->vector; - for (size_t i = 0; i < vector.length(); i++) { - TraceRoot(trc, &vector[i].id, "js::AutoIdValueVector id"); - TraceRoot(trc, &vector[i].value, "js::AutoIdValueVector value"); - } - return; - } - case OBJVECTOR: { AutoObjectVector::VectorImpl& vector = static_cast(this)->vector; TraceRootRange(trc, vector.length(), vector.begin(), "JS::AutoObjectVector.vector"); return; } - case STRINGVECTOR: { - AutoStringVector::VectorImpl& vector = static_cast(this)->vector; - TraceRootRange(trc, vector.length(), vector.begin(), "js::AutoStringVector.vector"); - return; - } - case NAMEVECTOR: { AutoNameVector::VectorImpl& vector = static_cast(this)->vector; TraceRootRange(trc, vector.length(), vector.begin(), "js::AutoNameVector.vector"); diff --git a/js/src/jscntxt.h b/js/src/jscntxt.h index 333600f0b6..2475cfda79 100644 --- a/js/src/jscntxt.h +++ b/js/src/jscntxt.h @@ -505,10 +505,11 @@ struct AutoResolving { /* * Enumerate all contexts in a runtime. */ -class ContextIter { +class ContextIter +{ JSContext* iter; -public: + public: explicit ContextIter(JSRuntime* rt) { iter = rt->contextList.getFirst(); } @@ -663,10 +664,10 @@ CheckForInterrupt(JSContext* cx) /************************************************************************/ -typedef JS::AutoVectorRooter AutoStringVector; typedef JS::AutoVectorRooter AutoPropertyNameVector; using ShapeVector = js::TraceableVector; +using StringVector = js::TraceableVector; /* AutoArrayRooter roots an external array of Values. */ class AutoArrayRooter : private JS::AutoGCRooter diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index 60ed799547..49213cad6a 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -1227,7 +1227,8 @@ GetScriptArrayObjectElements(JSContext* cx, HandleObject obj, AutoValueVector& v } static bool -GetScriptPlainObjectProperties(JSContext* cx, HandleObject obj, AutoIdValueVector& properties) +GetScriptPlainObjectProperties(JSContext* cx, HandleObject obj, + MutableHandle properties) { if (obj->is()) { PlainObject* nobj = &obj->as(); @@ -1313,8 +1314,8 @@ js::DeepCloneObjectLiteral(JSContext* cx, HandleObject obj, NewObjectKind newKin arrayKind); } - AutoIdValueVector properties(cx); - if (!GetScriptPlainObjectProperties(cx, obj, properties)) + Rooted properties(cx, IdValueVector(cx)); + if (!GetScriptPlainObjectProperties(cx, obj, &properties)) return nullptr; for (size_t i = 0; i < properties.length(); i++) { @@ -1464,8 +1465,8 @@ js::XDRObjectLiteral(XDRState* xdr, MutableHandleObject obj) } // Code the properties in the object. - AutoIdValueVector properties(cx); - if (mode == XDR_ENCODE && !GetScriptPlainObjectProperties(cx, obj, properties)) + Rooted properties(cx, IdValueVector(cx)); + if (mode == XDR_ENCODE && !GetScriptPlainObjectProperties(cx, obj, &properties)) return false; uint32_t nproperties = properties.length(); diff --git a/js/src/jspubtd.h b/js/src/jspubtd.h index 088f5bfa65..cfbf34bfee 100644 --- a/js/src/jspubtd.h +++ b/js/src/jspubtd.h @@ -222,9 +222,7 @@ class JS_PUBLIC_API(AutoGCRooter) IDARRAY = -6, /* js::AutoIdArray */ VALVECTOR = -10, /* js::AutoValueVector */ IDVECTOR = -11, /* js::AutoIdVector */ - IDVALVECTOR = -12, /* js::AutoIdValueVector */ OBJVECTOR = -14, /* js::AutoObjectVector */ - STRINGVECTOR =-15, /* js::AutoStringVector */ SCRIPTVECTOR =-16, /* js::AutoScriptVector */ NAMEVECTOR = -17, /* js::AutoNameVector */ HASHABLEVALUE=-18, /* js::HashableValue */ @@ -239,7 +237,6 @@ class JS_PUBLIC_API(AutoGCRooter) static ptrdiff_t GetTag(const jsid& id) { return IDVECTOR; } static ptrdiff_t GetTag(JSObject* obj) { return OBJVECTOR; } static ptrdiff_t GetTag(JSScript* script) { return SCRIPTVECTOR; } - static ptrdiff_t GetTag(JSString* string) { return STRINGVECTOR; } private: AutoGCRooter ** const stackTop; diff --git a/js/src/jsstr.cpp b/js/src/jsstr.cpp index 424be77608..96df09dd50 100644 --- a/js/src/jsstr.cpp +++ b/js/src/jsstr.cpp @@ -1348,7 +1348,7 @@ class StringSegmentRange { // If malloc() shows up in any profiles from this vector, we can add a new // StackAllocPolicy which stashes a reusable freed-at-gc buffer in the cx. - AutoStringVector stack; + Rooted stack; RootedLinearString cur; bool settle(JSString* str) { @@ -1364,7 +1364,7 @@ class StringSegmentRange public: explicit StringSegmentRange(JSContext* cx) - : stack(cx), cur(cx) + : stack(cx, StringVector(cx)), cur(cx) {} MOZ_WARN_UNUSED_RESULT bool init(JSString* str) {