Bug 1395509 - Add FreeOp methods to deal with releasing RefCounted types r=sfink

Differential Revision: https://phabricator.services.mozilla.com/D35484
This commit is contained in:
Jon Coppeard 2019-06-20 15:17:06 -07:00
parent 928742d3ea
commit 532b9e4484
2 changed files with 38 additions and 4 deletions

View File

@ -10,6 +10,7 @@
#include "gc/FreeOp.h"
#include "gc/ZoneAllocator.h"
#include "js/RefCounted.h"
namespace js {
@ -42,6 +43,14 @@ inline void FreeOp::freeLater(void* p) {
}
}
template <class T>
inline void FreeOp::release(gc::Cell* cell, T* p, size_t nbytes, MemoryUse use) {
if (p) {
RemoveCellMemory(cell, nbytes, use);
p->Release();
}
}
} // namespace js
#endif // gc_FreeOp_inl_h

View File

@ -86,8 +86,8 @@ class FreeOp : public JSFreeOp {
}
}
// Delete a C++ object that associated with a GC thing and update the memory
// accounting. The size is determined by the type T.
// Delete a C++ object that was associated with a GC thing and update the
// memory accounting. The size is determined by the type T.
//
// The memory should have been associated with the GC thing using
// js::InitReservedSlot or js::InitObjectPrivate, or possibly
@ -97,8 +97,8 @@ class FreeOp : public JSFreeOp {
delete_(cell, p, sizeof(T), use);
}
// Delete a C++ object that associated with a GC thing and update the memory
// accounting.
// Delete a C++ object that was associated with a GC thing and update the
// memory accounting.
//
// The memory should have been associated with the GC thing using
// js::InitReservedSlot or js::InitObjectPrivate, or possibly
@ -110,6 +110,31 @@ class FreeOp : public JSFreeOp {
free_(cell, p, nbytes, use);
}
}
// Release a RefCounted object that was associated with a GC thing and update
// the memory accounting.
//
// The memory should have been associated with the GC thing using
// js::InitReservedSlot or js::InitObjectPrivate, or possibly
// js::AddCellMemory.
//
// This counts the memory once per association with a GC thing. It's not
// expected that the same object is associated with more than one GC thing in
// each zone. If this is the case then some other form of accounting would be
// more appropriate.
template <class T>
void release(gc::Cell* cell, T* p, MemoryUse use) {
release(cell, p, sizeof(T), use);
}
// Release a RefCounted object and that was associated with a GC thing and
// update the memory accounting.
//
// The memory should have been associated with the GC thing using
// js::InitReservedSlot or js::InitObjectPrivate, or possibly
// js::AddCellMemory.
template <class T>
void release(gc::Cell* cell, T* p, size_t nbytes, MemoryUse use);
};
} // namespace js