diff options
Diffstat (limited to 'deps/v8/src/objects/js-weak-refs.h')
-rw-r--r-- | deps/v8/src/objects/js-weak-refs.h | 172 |
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 |