mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 806283 - Split up and add native iterators to "object/misc" memory reports. r=jorendorff.
--HG-- extra : rebase_source : 867e178d0c921de9e144fb274e1c0d77c8845b81
This commit is contained in:
parent
aefe00a614
commit
7c4faece03
@ -146,10 +146,12 @@ struct CompartmentStats
|
||||
#if JS_HAS_XML_SUPPORT
|
||||
, gcHeapXML(0)
|
||||
#endif
|
||||
, objectSlots(0)
|
||||
, objectElements(0)
|
||||
, objectMisc(0)
|
||||
, objectPrivate(0)
|
||||
, objectsExtraSlots(0)
|
||||
, objectsExtraElements(0)
|
||||
, objectsExtraArgumentsData(0)
|
||||
, objectsExtraRegExpStatics(0)
|
||||
, objectsExtraPropertyIteratorData(0)
|
||||
, objectsExtraPrivate(0)
|
||||
, stringCharsNonHuge(0)
|
||||
, shapesExtraTreeTables(0)
|
||||
, shapesExtraDictTables(0)
|
||||
@ -186,10 +188,12 @@ struct CompartmentStats
|
||||
#if JS_HAS_XML_SUPPORT
|
||||
, gcHeapXML(other.gcHeapXML)
|
||||
#endif
|
||||
, objectSlots(other.objectSlots)
|
||||
, objectElements(other.objectElements)
|
||||
, objectMisc(other.objectMisc)
|
||||
, objectPrivate(other.objectPrivate)
|
||||
, objectsExtraSlots(other.objectsExtraSlots)
|
||||
, objectsExtraElements(other.objectsExtraElements)
|
||||
, objectsExtraArgumentsData(other.objectsExtraArgumentsData)
|
||||
, objectsExtraRegExpStatics(other.objectsExtraRegExpStatics)
|
||||
, objectsExtraPropertyIteratorData(other.objectsExtraPropertyIteratorData)
|
||||
, objectsExtraPrivate(other.objectsExtraPrivate)
|
||||
, stringCharsNonHuge(other.stringCharsNonHuge)
|
||||
, shapesExtraTreeTables(other.shapesExtraTreeTables)
|
||||
, shapesExtraDictTables(other.shapesExtraDictTables)
|
||||
@ -234,10 +238,12 @@ struct CompartmentStats
|
||||
size_t gcHeapXML;
|
||||
#endif
|
||||
|
||||
size_t objectSlots;
|
||||
size_t objectElements;
|
||||
size_t objectMisc;
|
||||
size_t objectPrivate;
|
||||
size_t objectsExtraSlots;
|
||||
size_t objectsExtraElements;
|
||||
size_t objectsExtraArgumentsData;
|
||||
size_t objectsExtraRegExpStatics;
|
||||
size_t objectsExtraPropertyIteratorData;
|
||||
size_t objectsExtraPrivate;
|
||||
size_t stringCharsNonHuge;
|
||||
size_t shapesExtraTreeTables;
|
||||
size_t shapesExtraDictTables;
|
||||
@ -280,10 +286,12 @@ struct CompartmentStats
|
||||
ADD(gcHeapXML);
|
||||
#endif
|
||||
|
||||
ADD(objectSlots);
|
||||
ADD(objectElements);
|
||||
ADD(objectMisc);
|
||||
ADD(objectPrivate);
|
||||
ADD(objectsExtraSlots);
|
||||
ADD(objectsExtraElements);
|
||||
ADD(objectsExtraArgumentsData);
|
||||
ADD(objectsExtraRegExpStatics);
|
||||
ADD(objectsExtraPropertyIteratorData);
|
||||
ADD(objectsExtraPrivate);
|
||||
ADD(stringCharsNonHuge);
|
||||
ADD(shapesExtraTreeTables);
|
||||
ADD(shapesExtraDictTables);
|
||||
|
@ -22,6 +22,13 @@ JSObject::asPropertyIterator()
|
||||
return *static_cast<js::PropertyIteratorObject *>(this);
|
||||
}
|
||||
|
||||
inline const js::PropertyIteratorObject &
|
||||
JSObject::asPropertyIterator() const
|
||||
{
|
||||
JS_ASSERT(isPropertyIterator());
|
||||
return *static_cast<const js::PropertyIteratorObject *>(this);
|
||||
}
|
||||
|
||||
js::NativeIterator *
|
||||
js::PropertyIteratorObject::getNativeIterator() const
|
||||
{
|
||||
|
@ -821,6 +821,12 @@ iterator_iteratorObject(JSContext *cx, HandleObject obj, JSBool keysonly)
|
||||
return obj;
|
||||
}
|
||||
|
||||
size_t
|
||||
PropertyIteratorObject::sizeOfMisc(JSMallocSizeOfFun mallocSizeOf) const
|
||||
{
|
||||
return mallocSizeOf(getPrivate());
|
||||
}
|
||||
|
||||
void
|
||||
PropertyIteratorObject::trace(JSTracer *trc, RawObject obj)
|
||||
{
|
||||
|
@ -78,6 +78,8 @@ class PropertyIteratorObject : public JSObject
|
||||
inline NativeIterator *getNativeIterator() const;
|
||||
inline void setNativeIterator(js::NativeIterator *ni);
|
||||
|
||||
size_t sizeOfMisc(JSMallocSizeOfFun mallocSizeOf) const;
|
||||
|
||||
private:
|
||||
static void trace(JSTracer *trc, RawObject obj);
|
||||
static void finalize(FreeOp *fop, RawObject obj);
|
||||
|
@ -155,19 +155,23 @@ StatsCellCallback(JSRuntime *rt, void *data, void *thing, JSGCTraceKind traceKin
|
||||
} else {
|
||||
cStats->gcHeapObjectsOrdinary += thingSize;
|
||||
}
|
||||
size_t slotsSize, elementsSize, miscSize;
|
||||
obj->sizeOfExcludingThis(rtStats->mallocSizeOf, &slotsSize,
|
||||
&elementsSize, &miscSize);
|
||||
cStats->objectSlots += slotsSize;
|
||||
cStats->objectElements += elementsSize;
|
||||
cStats->objectMisc += miscSize;
|
||||
size_t slotsSize, elementsSize, argumentsDataSize, regExpStaticsSize,
|
||||
propertyIteratorDataSize;
|
||||
obj->sizeOfExcludingThis(rtStats->mallocSizeOf, &slotsSize, &elementsSize,
|
||||
&argumentsDataSize, ®ExpStaticsSize,
|
||||
&propertyIteratorDataSize);
|
||||
cStats->objectsExtraSlots += slotsSize;
|
||||
cStats->objectsExtraElements += elementsSize;
|
||||
cStats->objectsExtraArgumentsData += argumentsDataSize;
|
||||
cStats->objectsExtraRegExpStatics += regExpStaticsSize;
|
||||
cStats->objectsExtraPropertyIteratorData += propertyIteratorDataSize;
|
||||
|
||||
if (ObjectPrivateVisitor *opv = closure->opv) {
|
||||
js::Class *clazz = js::GetObjectClass(obj);
|
||||
if (clazz->flags & JSCLASS_HAS_PRIVATE &&
|
||||
clazz->flags & JSCLASS_PRIVATE_IS_NSISUPPORTS)
|
||||
{
|
||||
cStats->objectPrivate += opv->sizeOfIncludingThis(GetObjectPrivate(obj));
|
||||
cStats->objectsExtraPrivate += opv->sizeOfIncludingThis(GetObjectPrivate(obj));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -368,9 +368,10 @@ struct JSObject : public js::ObjectImpl
|
||||
|
||||
inline size_t computedSizeOfThisSlotsElements() const;
|
||||
|
||||
inline void sizeOfExcludingThis(JSMallocSizeOfFun mallocSizeOf,
|
||||
size_t *slotsSize, size_t *elementsSize,
|
||||
size_t *miscSize) const;
|
||||
inline void sizeOfExcludingThis(JSMallocSizeOfFun mallocSizeOf, size_t *slotsSize,
|
||||
size_t *elementsSize, size_t *argumentsDataSize,
|
||||
size_t *regExpStaticsSize,
|
||||
size_t *propertyIteratorDataSize) const;
|
||||
|
||||
bool hasIdempotentProtoChain() const;
|
||||
|
||||
@ -1020,6 +1021,7 @@ struct JSObject : public js::ObjectImpl
|
||||
inline js::NormalArgumentsObject &asNormalArguments();
|
||||
inline js::NumberObject &asNumber();
|
||||
inline js::PropertyIteratorObject &asPropertyIterator();
|
||||
inline const js::PropertyIteratorObject &asPropertyIterator() const;
|
||||
inline js::RegExpObject &asRegExp();
|
||||
inline js::ScopeObject &asScope();
|
||||
inline js::SetObject &asSet();
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "jswrapper.h"
|
||||
|
||||
#include "builtin/MapObject.h"
|
||||
#include "builtin/Iterator-inl.h"
|
||||
#include "gc/Barrier.h"
|
||||
#include "gc/Marking.h"
|
||||
#include "gc/Root.h"
|
||||
@ -989,9 +990,9 @@ JSObject::computedSizeOfThisSlotsElements() const
|
||||
}
|
||||
|
||||
inline void
|
||||
JSObject::sizeOfExcludingThis(JSMallocSizeOfFun mallocSizeOf,
|
||||
size_t *slotsSize, size_t *elementsSize,
|
||||
size_t *miscSize) const
|
||||
JSObject::sizeOfExcludingThis(JSMallocSizeOfFun mallocSizeOf, size_t *slotsSize,
|
||||
size_t *elementsSize, size_t *argumentsDataSize,
|
||||
size_t *regExpStaticsSize, size_t *propertyIteratorDataSize) const
|
||||
{
|
||||
*slotsSize = 0;
|
||||
if (hasDynamicSlots()) {
|
||||
@ -1004,11 +1005,15 @@ JSObject::sizeOfExcludingThis(JSMallocSizeOfFun mallocSizeOf,
|
||||
}
|
||||
|
||||
/* Other things may be measured in the future if DMD indicates it is worthwhile. */
|
||||
*miscSize = 0;
|
||||
*argumentsDataSize = 0;
|
||||
*regExpStaticsSize = 0;
|
||||
*propertyIteratorDataSize = 0;
|
||||
if (isArguments()) {
|
||||
*miscSize += asArguments().sizeOfMisc(mallocSizeOf);
|
||||
*argumentsDataSize += asArguments().sizeOfMisc(mallocSizeOf);
|
||||
} else if (isRegExpStatics()) {
|
||||
*miscSize += js::SizeOfRegExpStaticsData(this, mallocSizeOf);
|
||||
*regExpStaticsSize += js::SizeOfRegExpStaticsData(this, mallocSizeOf);
|
||||
} else if (isPropertyIterator()) {
|
||||
*propertyIteratorDataSize += asPropertyIterator().sizeOfMisc(mallocSizeOf);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1559,30 +1559,38 @@ ReportCompartmentStats(const JS::CompartmentStats &cStats,
|
||||
"heap that holds E4X XML objects.");
|
||||
#endif
|
||||
|
||||
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/slots"),
|
||||
cStats.objectSlots,
|
||||
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects-extra/slots"),
|
||||
cStats.objectsExtraSlots,
|
||||
"Memory allocated for the non-fixed object "
|
||||
"slot arrays, which are used to represent object properties. "
|
||||
"Some objects also contain a fixed number of slots which are "
|
||||
"stored on the JavaScript heap; those slots "
|
||||
"are not counted here, but in 'gc-heap/objects' instead.");
|
||||
|
||||
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/elements"),
|
||||
cStats.objectElements,
|
||||
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects-extra/elements"),
|
||||
cStats.objectsExtraElements,
|
||||
"Memory allocated for object element "
|
||||
"arrays, which are used to represent indexed object "
|
||||
"properties.");
|
||||
|
||||
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects/misc"),
|
||||
cStats.objectMisc,
|
||||
"Memory allocated for various small, miscellaneous "
|
||||
"structures that hang off certain kinds of objects.");
|
||||
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects-extra/arguments-data"),
|
||||
cStats.objectsExtraArgumentsData,
|
||||
"Memory allocated for data belonging to arguments objects.");
|
||||
|
||||
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects-extra/regexp-statics"),
|
||||
cStats.objectsExtraRegExpStatics,
|
||||
"Memory allocated for data belonging to the RegExpStatics object.");
|
||||
|
||||
CREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("objects-extra/property-iterator-data"),
|
||||
cStats.objectsExtraPropertyIteratorData,
|
||||
"Memory allocated for data belonging to property iterator "
|
||||
"objects.");
|
||||
|
||||
// Note that we use cDOMPathPrefix here. This is because we measure orphan
|
||||
// DOM nodes in the JS multi-reporter, but we want to report them in a
|
||||
// "dom" sub-tree rather than a "js" sub-tree.
|
||||
CREPORT_BYTES(cDOMPathPrefix + NS_LITERAL_CSTRING("orphan-nodes"),
|
||||
cStats.objectPrivate,
|
||||
cStats.objectsExtraPrivate,
|
||||
"Memory used by orphan DOM nodes that are only reachable "
|
||||
"from JavaScript objects.");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user