1 #ifndef SRC_NODE_EXTERNAL_REFERENCE_H_ 2 #define SRC_NODE_EXTERNAL_REFERENCE_H_ 3 4 #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS 5 6 #include <cinttypes> 7 #include <vector> 8 #include "v8-fast-api-calls.h" 9 #include "v8.h" 10 11 namespace node { 12 13 using CFunctionCallback = void (*)(v8::Local<v8::Value> receiver); 14 15 // This class manages the external references from the V8 heap 16 // to the C++ addresses in Node.js. 17 class ExternalReferenceRegistry { 18 public: 19 ExternalReferenceRegistry(); 20 21 #define ALLOWED_EXTERNAL_REFERENCE_TYPES(V) \ 22 V(CFunctionCallback) \ 23 V(const v8::CFunctionInfo*) \ 24 V(v8::FunctionCallback) \ 25 V(v8::AccessorGetterCallback) \ 26 V(v8::AccessorSetterCallback) \ 27 V(v8::AccessorNameGetterCallback) \ 28 V(v8::AccessorNameSetterCallback) \ 29 V(v8::GenericNamedPropertyDefinerCallback) \ 30 V(v8::GenericNamedPropertyDeleterCallback) \ 31 V(v8::GenericNamedPropertyEnumeratorCallback) \ 32 V(v8::GenericNamedPropertyQueryCallback) \ 33 V(v8::GenericNamedPropertySetterCallback) \ 34 V(v8::IndexedPropertySetterCallback) \ 35 V(v8::IndexedPropertyDefinerCallback) \ 36 V(v8::IndexedPropertyDeleterCallback) \ 37 V(v8::IndexedPropertyQueryCallback) \ 38 V(v8::IndexedPropertyDescriptorCallback) 39 40 #define V(ExternalReferenceType) \ 41 void Register(ExternalReferenceType addr) { RegisterT(addr); } 42 ALLOWED_EXTERNAL_REFERENCE_TYPES(V) 43 #undef V 44 45 // This can be called only once. 46 const std::vector<intptr_t>& external_references(); 47 is_empty()48 bool is_empty() { return external_references_.empty(); } 49 50 private: 51 template <typename T> RegisterT(T * address)52 void RegisterT(T* address) { 53 external_references_.push_back(reinterpret_cast<intptr_t>(address)); 54 } 55 bool is_finalized_ = false; 56 std::vector<intptr_t> external_references_; 57 }; 58 59 #define EXTERNAL_REFERENCE_BINDING_LIST_BASE(V) \ 60 V(async_wrap) \ 61 V(binding) \ 62 V(blob) \ 63 V(buffer) \ 64 V(builtins) \ 65 V(cares_wrap) \ 66 V(contextify) \ 67 V(credentials) \ 68 V(env_var) \ 69 V(errors) \ 70 V(fs) \ 71 V(fs_dir) \ 72 V(fs_event_wrap) \ 73 V(handle_wrap) \ 74 V(heap_utils) \ 75 V(messaging) \ 76 V(mksnapshot) \ 77 V(options) \ 78 V(os) \ 79 V(performance) \ 80 V(process_methods) \ 81 V(process_object) \ 82 V(report) \ 83 V(task_queue) \ 84 V(tcp_wrap) \ 85 V(tty_wrap) \ 86 V(url) \ 87 V(util) \ 88 V(pipe_wrap) \ 89 V(sea) \ 90 V(serdes) \ 91 V(string_decoder) \ 92 V(stream_wrap) \ 93 V(signal_wrap) \ 94 V(trace_events) \ 95 V(timers) \ 96 V(types) \ 97 V(uv) \ 98 V(v8) \ 99 V(zlib) \ 100 V(wasm_web_api) \ 101 V(worker) 102 103 #if NODE_HAVE_I18N_SUPPORT 104 #define EXTERNAL_REFERENCE_BINDING_LIST_I18N(V) V(icu) 105 #else 106 #define EXTERNAL_REFERENCE_BINDING_LIST_I18N(V) 107 #endif // NODE_HAVE_I18N_SUPPORT 108 109 #if HAVE_INSPECTOR 110 #define EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V) \ 111 V(inspector) \ 112 V(profiler) 113 #else 114 #define EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V) 115 #endif // HAVE_INSPECTOR 116 117 #if HAVE_DTRACE || HAVE_ETW 118 #define EXTERNAL_REFERENCE_BINDING_LIST_DTRACE(V) V(dtrace) 119 #else 120 #define EXTERNAL_REFERENCE_BINDING_LIST_DTRACE(V) 121 #endif 122 123 #if HAVE_OPENSSL 124 #define EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V) V(crypto) V(tls_wrap) 125 #else 126 #define EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V) 127 #endif // HAVE_OPENSSL 128 129 #define EXTERNAL_REFERENCE_BINDING_LIST(V) \ 130 EXTERNAL_REFERENCE_BINDING_LIST_BASE(V) \ 131 EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V) \ 132 EXTERNAL_REFERENCE_BINDING_LIST_I18N(V) \ 133 EXTERNAL_REFERENCE_BINDING_LIST_DTRACE(V) \ 134 EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V) 135 136 } // namespace node 137 138 // Declare all the external reference registration functions here, 139 // and define them later with #NODE_BINDING_EXTERNAL_REFERENCE(modname, func); 140 #define V(modname) \ 141 void _register_external_reference_##modname( \ 142 node::ExternalReferenceRegistry* registry); 143 EXTERNAL_REFERENCE_BINDING_LIST(V) 144 #undef V 145 146 #define NODE_BINDING_EXTERNAL_REFERENCE(modname, func) \ 147 void _register_external_reference_##modname( \ 148 node::ExternalReferenceRegistry* registry) { \ 149 func(registry); \ 150 } 151 #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS 152 #endif // SRC_NODE_EXTERNAL_REFERENCE_H_ 153