1 // Copyright 2018 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_OBJECTS_JS_WEAK_REFS_H_ 6 #define V8_OBJECTS_JS_WEAK_REFS_H_ 7 8 #include "src/objects/js-objects.h" 9 #include "torque-generated/bit-fields.h" 10 11 // Has to be the last include (doesn't have include guards): 12 #include "src/objects/object-macros.h" 13 14 namespace v8 { 15 namespace internal { 16 17 class NativeContext; 18 class WeakCell; 19 20 #include "torque-generated/src/objects/js-weak-refs-tq.inc" 21 22 // FinalizationRegistry object from the JS Weak Refs spec proposal: 23 // https://github.com/tc39/proposal-weakrefs 24 class JSFinalizationRegistry 25 : public TorqueGeneratedJSFinalizationRegistry<JSFinalizationRegistry, 26 JSObject> { 27 public: 28 DECL_PRINTER(JSFinalizationRegistry) 29 EXPORT_DECL_VERIFIER(JSFinalizationRegistry) 30 31 DECL_BOOLEAN_ACCESSORS(scheduled_for_cleanup) 32 33 class BodyDescriptor; 34 35 inline static void RegisterWeakCellWithUnregisterToken( 36 Handle<JSFinalizationRegistry> finalization_registry, 37 Handle<WeakCell> weak_cell, Isolate* isolate); 38 inline static bool Unregister( 39 Handle<JSFinalizationRegistry> finalization_registry, 40 Handle<HeapObject> unregister_token, Isolate* isolate); 41 42 // RemoveUnregisterToken is called from both Unregister and during GC. Since 43 // it modifies slots in key_map and WeakCells and the normal write barrier is 44 // disabled during GC, we need to tell the GC about the modified slots via the 45 // gc_notify_updated_slot function. 46 enum RemoveUnregisterTokenMode { 47 kRemoveMatchedCellsFromRegistry, 48 kKeepMatchedCellsInRegistry 49 }; 50 template <typename GCNotifyUpdatedSlotCallback> 51 inline bool RemoveUnregisterToken( 52 HeapObject unregister_token, Isolate* isolate, 53 RemoveUnregisterTokenMode removal_mode, 54 GCNotifyUpdatedSlotCallback gc_notify_updated_slot); 55 56 // Returns true if the cleared_cells list is non-empty. 57 inline bool NeedsCleanup() const; 58 59 // Remove the already-popped weak_cell from its unregister token linked list, 60 // as well as removing the entry from the key map if it is the only WeakCell 61 // with its unregister token. This method cannot GC and does not shrink the 62 // key map. Asserts that weak_cell has a non-undefined unregister token. 63 // 64 // It takes raw Addresses because it is called from CSA and Torque. 65 V8_EXPORT_PRIVATE static void RemoveCellFromUnregisterTokenMap( 66 Isolate* isolate, Address raw_finalization_registry, 67 Address raw_weak_cell); 68 69 // Bitfields in flags. 70 DEFINE_TORQUE_GENERATED_FINALIZATION_REGISTRY_FLAGS() 71 72 TQ_OBJECT_CONSTRUCTORS(JSFinalizationRegistry) 73 }; 74 75 // Internal object for storing weak references in JSFinalizationRegistry. 76 class WeakCell : public TorqueGeneratedWeakCell<WeakCell, HeapObject> { 77 public: 78 EXPORT_DECL_VERIFIER(WeakCell) 79 80 class BodyDescriptor; 81 82 // Provide relaxed load access to target field. 83 inline HeapObject relaxed_target() const; 84 85 // Provide relaxed load access to the unregister token field. 86 inline HeapObject relaxed_unregister_token() const; 87 88 // Nullify is called during GC and it modifies the pointers in WeakCell and 89 // JSFinalizationRegistry. Thus we need to tell the GC about the modified 90 // slots via the gc_notify_updated_slot function. The normal write barrier is 91 // not enough, since it's disabled before GC. 92 template <typename GCNotifyUpdatedSlotCallback> 93 inline void Nullify(Isolate* isolate, 94 GCNotifyUpdatedSlotCallback gc_notify_updated_slot); 95 96 inline void RemoveFromFinalizationRegistryCells(Isolate* isolate); 97 98 TQ_OBJECT_CONSTRUCTORS(WeakCell) 99 }; 100 101 class JSWeakRef : public TorqueGeneratedJSWeakRef<JSWeakRef, JSObject> { 102 public: 103 DECL_PRINTER(JSWeakRef) 104 EXPORT_DECL_VERIFIER(JSWeakRef) 105 106 class BodyDescriptor; 107 108 TQ_OBJECT_CONSTRUCTORS(JSWeakRef) 109 }; 110 111 } // namespace internal 112 } // namespace v8 113 114 #include "src/objects/object-macros-undef.h" 115 116 #endif // V8_OBJECTS_JS_WEAK_REFS_H_ 117