aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/objects/js-weak-refs.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/objects/js-weak-refs.h')
-rw-r--r--deps/v8/src/objects/js-weak-refs.h172
1 files changed, 100 insertions, 72 deletions
diff --git a/deps/v8/src/objects/js-weak-refs.h b/deps/v8/src/objects/js-weak-refs.h
index 5938c27b2f..975d8beca9 100644
--- a/deps/v8/src/objects/js-weak-refs.h
+++ b/deps/v8/src/objects/js-weak-refs.h
@@ -14,29 +14,35 @@
namespace v8 {
namespace internal {
-class JSWeakCell;
class NativeContext;
+class WeakCell;
-// WeakFactory object from the JS Weak Refs spec proposal:
+// FinalizationGroup object from the JS Weak Refs spec proposal:
// https://github.com/tc39/proposal-weakrefs
-class JSWeakFactory : public JSObject {
+class JSFinalizationGroup : public JSObject {
public:
- DECL_PRINTER(JSWeakFactory)
- DECL_VERIFIER(JSWeakFactory)
- DECL_CAST(JSWeakFactory)
+ DECL_PRINTER(JSFinalizationGroup)
+ DECL_VERIFIER(JSFinalizationGroup)
+ DECL_CAST(JSFinalizationGroup)
DECL_ACCESSORS(native_context, NativeContext)
DECL_ACCESSORS(cleanup, Object)
+
DECL_ACCESSORS(active_cells, Object)
DECL_ACCESSORS(cleared_cells, Object)
+ DECL_ACCESSORS(key_map, Object)
- // For storing a list of JSWeakFactory objects in NativeContext.
+ // For storing a list of JSFinalizationGroup objects in NativeContext.
DECL_ACCESSORS(next, Object)
DECL_INT_ACCESSORS(flags)
- // Adds a newly constructed JSWeakCell object into this JSWeakFactory.
- inline void AddWeakCell(JSWeakCell weak_cell);
+ inline static void Register(Handle<JSFinalizationGroup> finalization_group,
+ Handle<JSReceiver> target,
+ Handle<Object> holdings, Handle<Object> key,
+ Isolate* isolate);
+ inline static void Unregister(Handle<JSFinalizationGroup> finalization_group,
+ Handle<Object> key, Isolate* isolate);
// Returns true if the cleared_cells list is non-empty.
inline bool NeedsCleanup() const;
@@ -44,76 +50,92 @@ class JSWeakFactory : public JSObject {
inline bool scheduled_for_cleanup() const;
inline void set_scheduled_for_cleanup(bool scheduled_for_cleanup);
- // Get and remove the first cleared JSWeakCell from the cleared_cells
- // list. (Assumes there is one.)
- inline JSWeakCell PopClearedCell(Isolate* isolate);
+ // Remove the first cleared WeakCell from the cleared_cells
+ // list (assumes there is one) and return its holdings.
+ inline static Object PopClearedCellHoldings(
+ Handle<JSFinalizationGroup> finalization_group, Isolate* isolate);
// Constructs an iterator for the WeakCells in the cleared_cells list and
// calls the user's cleanup function.
- static void Cleanup(Handle<JSWeakFactory> weak_factory, Isolate* isolate);
+ static void Cleanup(Handle<JSFinalizationGroup> finalization_group,
+ Isolate* isolate);
// Layout description.
-#define JS_WEAK_FACTORY_FIELDS(V) \
- V(kNativeContextOffset, kTaggedSize) \
- V(kCleanupOffset, kTaggedSize) \
- V(kActiveCellsOffset, kTaggedSize) \
- V(kClearedCellsOffset, kTaggedSize) \
- V(kNextOffset, kTaggedSize) \
- V(kFlagsOffset, kTaggedSize) \
- /* Header size. */ \
+#define JS_FINALIZATION_GROUP_FIELDS(V) \
+ V(kNativeContextOffset, kTaggedSize) \
+ V(kCleanupOffset, kTaggedSize) \
+ V(kActiveCellsOffset, kTaggedSize) \
+ V(kClearedCellsOffset, kTaggedSize) \
+ V(kKeyMapOffset, kTaggedSize) \
+ V(kNextOffset, kTaggedSize) \
+ V(kFlagsOffset, kTaggedSize) \
+ /* Header size. */ \
V(kSize, 0)
- DEFINE_FIELD_OFFSET_CONSTANTS(JSObject::kHeaderSize, JS_WEAK_FACTORY_FIELDS)
-#undef JS_WEAK_FACTORY_FIELDS
+ DEFINE_FIELD_OFFSET_CONSTANTS(JSObject::kHeaderSize,
+ JS_FINALIZATION_GROUP_FIELDS)
+#undef JS_FINALIZATION_GROUP_FIELDS
// Bitfields in flags.
class ScheduledForCleanupField : public BitField<bool, 0, 1> {};
- OBJECT_CONSTRUCTORS(JSWeakFactory, JSObject);
+ OBJECT_CONSTRUCTORS(JSFinalizationGroup, JSObject);
};
-// WeakCell object from the JS Weak Refs spec proposal.
-class JSWeakCell : public JSObject {
+// Internal object for storing weak references in JSFinalizationGroup.
+class WeakCell : public HeapObject {
public:
- DECL_PRINTER(JSWeakCell)
- DECL_VERIFIER(JSWeakCell)
- DECL_CAST(JSWeakCell)
+ DECL_PRINTER(WeakCell)
+ DECL_VERIFIER(WeakCell)
+ DECL_CAST(WeakCell)
- DECL_ACCESSORS(factory, Object)
- DECL_ACCESSORS(target, Object)
+ DECL_ACCESSORS(finalization_group, Object)
+ DECL_ACCESSORS(target, HeapObject)
DECL_ACCESSORS(holdings, Object)
- // For storing doubly linked lists of JSWeakCells in JSWeakFactory.
+ // For storing doubly linked lists of WeakCells in JSFinalizationGroup's
+ // "active_cells" and "cleared_cells" lists.
DECL_ACCESSORS(prev, Object)
DECL_ACCESSORS(next, Object)
+ // For storing doubly linked lists of WeakCells per key in
+ // JSFinalizationGroup's key-based hashmap. WeakCell also needs to know its
+ // key, so that we can remove the key from the key_map when we remove the last
+ // WeakCell associated with it.
+ DECL_ACCESSORS(key, Object)
+ DECL_ACCESSORS(key_list_prev, Object)
+ DECL_ACCESSORS(key_list_next, Object)
+
// Layout description.
-#define JS_WEAK_CELL_FIELDS(V) \
- V(kFactoryOffset, kTaggedSize) \
- V(kTargetOffset, kTaggedSize) \
- V(kHoldingsOffset, kTaggedSize) \
- V(kPrevOffset, kTaggedSize) \
- V(kNextOffset, kTaggedSize) \
- /* Header size. */ \
+#define WEAK_CELL_FIELDS(V) \
+ V(kFinalizationGroupOffset, kTaggedSize) \
+ V(kTargetOffset, kTaggedSize) \
+ V(kHoldingsOffset, kTaggedSize) \
+ V(kPrevOffset, kTaggedSize) \
+ V(kNextOffset, kTaggedSize) \
+ V(kKeyOffset, kTaggedSize) \
+ V(kKeyListPrevOffset, kTaggedSize) \
+ V(kKeyListNextOffset, kTaggedSize) \
+ /* Header size. */ \
V(kSize, 0)
- DEFINE_FIELD_OFFSET_CONSTANTS(JSObject::kHeaderSize, JS_WEAK_CELL_FIELDS)
-#undef JS_WEAK_CELL_FIELDS
+ DEFINE_FIELD_OFFSET_CONSTANTS(HeapObject::kHeaderSize, WEAK_CELL_FIELDS)
+#undef WEAK_CELL_FIELDS
class BodyDescriptor;
- // Nullify is called during GC and it modifies the pointers in JSWeakCell and
- // JSWeakFactory. Thus we need to tell the GC about the modified slots via the
- // gc_notify_updated_slot function. The normal write barrier is not enough,
- // since it's disabled before GC.
+ // Nullify is called during GC and it modifies the pointers in WeakCell and
+ // JSFinalizationGroup. Thus we need to tell the GC about the modified slots
+ // via the gc_notify_updated_slot function. The normal write barrier is not
+ // enough, since it's disabled before GC.
inline void Nullify(
Isolate* isolate,
std::function<void(HeapObject object, ObjectSlot slot, Object target)>
gc_notify_updated_slot);
- inline void Clear(Isolate* isolate);
+ inline void RemoveFromFinalizationGroupCells(Isolate* isolate);
- OBJECT_CONSTRUCTORS(JSWeakCell, JSObject);
+ OBJECT_CONSTRUCTORS(WeakCell, HeapObject);
};
class JSWeakRef : public JSObject {
@@ -122,56 +144,62 @@ class JSWeakRef : public JSObject {
DECL_VERIFIER(JSWeakRef)
DECL_CAST(JSWeakRef)
- DECL_ACCESSORS(target, Object)
+ DECL_ACCESSORS(target, HeapObject)
+
+// Layout description.
+#define JS_WEAK_REF_FIELDS(V) \
+ V(kTargetOffset, kTaggedSize) \
+ /* Header size. */ \
+ V(kSize, 0)
- static const int kTargetOffset = JSObject::kHeaderSize;
- static const int kSize = kTargetOffset + kPointerSize;
+ DEFINE_FIELD_OFFSET_CONSTANTS(JSObject::kHeaderSize, JS_WEAK_REF_FIELDS)
+#undef JS_WEAK_REF_FIELDS
class BodyDescriptor;
OBJECT_CONSTRUCTORS(JSWeakRef, JSObject);
};
-class WeakFactoryCleanupJobTask : public Microtask {
+class FinalizationGroupCleanupJobTask : public Microtask {
public:
- DECL_ACCESSORS(factory, JSWeakFactory)
+ DECL_ACCESSORS(finalization_group, JSFinalizationGroup)
- DECL_CAST(WeakFactoryCleanupJobTask)
- DECL_VERIFIER(WeakFactoryCleanupJobTask)
- DECL_PRINTER(WeakFactoryCleanupJobTask)
+ DECL_CAST(FinalizationGroupCleanupJobTask)
+ DECL_VERIFIER(FinalizationGroupCleanupJobTask)
+ DECL_PRINTER(FinalizationGroupCleanupJobTask)
// Layout description.
-#define WEAK_FACTORY_CLEANUP_JOB_TASK_FIELDS(V) \
- V(kFactoryOffset, kTaggedSize) \
- /* Total size. */ \
+#define FINALIZATION_GROUP_CLEANUP_JOB_TASK_FIELDS(V) \
+ V(kFinalizationGroupOffset, kTaggedSize) \
+ /* Total size. */ \
V(kSize, 0)
DEFINE_FIELD_OFFSET_CONSTANTS(Microtask::kHeaderSize,
- WEAK_FACTORY_CLEANUP_JOB_TASK_FIELDS)
-#undef WEAK_FACTORY_CLEANUP_JOB_TASK_FIELDS
+ FINALIZATION_GROUP_CLEANUP_JOB_TASK_FIELDS)
+#undef FINALIZATION_GROUP_CLEANUP_JOB_TASK_FIELDS
- OBJECT_CONSTRUCTORS(WeakFactoryCleanupJobTask, Microtask)
+ OBJECT_CONSTRUCTORS(FinalizationGroupCleanupJobTask, Microtask);
};
-class JSWeakFactoryCleanupIterator : public JSObject {
+class JSFinalizationGroupCleanupIterator : public JSObject {
public:
- DECL_PRINTER(JSWeakFactoryCleanupIterator)
- DECL_VERIFIER(JSWeakFactoryCleanupIterator)
- DECL_CAST(JSWeakFactoryCleanupIterator)
+ DECL_PRINTER(JSFinalizationGroupCleanupIterator)
+ DECL_VERIFIER(JSFinalizationGroupCleanupIterator)
+ DECL_CAST(JSFinalizationGroupCleanupIterator)
- DECL_ACCESSORS(factory, JSWeakFactory)
+ DECL_ACCESSORS(finalization_group, JSFinalizationGroup)
// Layout description.
-#define JS_WEAK_FACTORY_CLEANUP_ITERATOR_FIELDS(V) \
- V(kFactoryOffset, kTaggedSize) \
- /* Header size. */ \
+#define JS_FINALIZATION_GROUP_CLEANUP_ITERATOR_FIELDS(V) \
+ V(kFinalizationGroupOffset, kTaggedSize) \
+ /* Header size. */ \
V(kSize, 0)
DEFINE_FIELD_OFFSET_CONSTANTS(JSObject::kHeaderSize,
- JS_WEAK_FACTORY_CLEANUP_ITERATOR_FIELDS)
-#undef JS_WEAK_FACTORY_CLEANUP_ITERATOR_FIELDS
+ JS_FINALIZATION_GROUP_CLEANUP_ITERATOR_FIELDS)
+#undef JS_FINALIZATION_GROUP_CLEANUP_ITERATOR_FIELDS
- OBJECT_CONSTRUCTORS(JSWeakFactoryCleanupIterator, JSObject);
+ OBJECT_CONSTRUCTORS(JSFinalizationGroupCleanupIterator, JSObject);
};
} // namespace internal