Where Online Learning is simpler!
The C and C++ Include Header Files
cat -n /usr/include/nodejs/src/node_external_reference.h
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 // This class manages the external references from the V8 heap 14 // to the C++ addresses in Node.js. 15 class ExternalReferenceRegistry { 16 public: 17 ExternalReferenceRegistry(); 18 19 #define ALLOWED_EXTERNAL_REFERENCE_TYPES(V) \ 20 V(v8::FunctionCallback) \ 21 V(v8::AccessorNameGetterCallback) \ 22 V(v8::AccessorNameSetterCallback) \ 23 V(v8::NamedPropertyGetterCallback) \ 24 V(v8::NamedPropertyDefinerCallback) \ 25 V(v8::NamedPropertyDeleterCallback) \ 26 V(v8::NamedPropertyEnumeratorCallback) \ 27 V(v8::NamedPropertyQueryCallback) \ 28 V(v8::NamedPropertySetterCallback) \ 29 V(v8::IndexedPropertyGetterCallbackV2) \ 30 V(v8::IndexedPropertySetterCallbackV2) \ 31 V(v8::IndexedPropertyDefinerCallbackV2) \ 32 V(v8::IndexedPropertyDeleterCallbackV2) \ 33 V(v8::IndexedPropertyQueryCallbackV2) \ 34 V(const v8::String::ExternalStringResourceBase*) 35 36 #define V(ExternalReferenceType) \ 37 void Register(ExternalReferenceType addr) { RegisterT(addr); } 38 ALLOWED_EXTERNAL_REFERENCE_TYPES(V) 39 #undef V 40 41 // Registers both the underlying function pointer 42 // and the corresponding CFunctionInfo. 43 void Register(const v8::CFunction& c_func) { 44 RegisterT(c_func.GetAddress()); 45 RegisterT(c_func.GetTypeInfo()); 46 } 47 48 // This can be called only once. 49 const std::vector<intptr_t>& external_references(); 50 51 bool is_empty() { return external_references_.empty(); } 52 53 private: 54 template <typename T> 55 void RegisterT(T* address) { 56 external_references_.push_back(reinterpret_cast<intptr_t>(address)); 57 } 58 bool is_finalized_ = false; 59 std::vector<intptr_t> external_references_; 60 }; 61 62 #define EXTERNAL_REFERENCE_BINDING_LIST_BASE(V) \ 63 V(async_wrap) \ 64 V(binding) \ 65 V(blob) \ 66 V(buffer) \ 67 V(builtins) \ 68 V(cares_wrap) \ 69 V(config) \ 70 V(contextify) \ 71 V(credentials) \ 72 V(encoding_binding) \ 73 V(env_var) \ 74 V(errors) \ 75 V(fs) \ 76 V(fs_dir) \ 77 V(fs_event_wrap) \ 78 V(handle_wrap) \ 79 V(heap_utils) \ 80 V(http_parser) \ 81 V(internal_only_v8) \ 82 V(messaging) \ 83 V(mksnapshot) \ 84 V(module_wrap) \ 85 V(modules) \ 86 V(options) \ 87 V(os) \ 88 V(performance) \ 89 V(permission) \ 90 V(process_methods) \ 91 V(process_object) \ 92 V(process_wrap) \ 93 V(report) \ 94 V(task_queue) \ 95 V(tcp_wrap) \ 96 V(tty_wrap) \ 97 V(udp_wrap) \ 98 V(url) \ 99 V(util) \ 100 V(pipe_wrap) \ 101 V(sea) \ 102 V(serdes) \ 103 V(string_decoder) \ 104 V(stream_wrap) \ 105 V(signal_wrap) \ 106 V(spawn_sync) \ 107 V(trace_events) \ 108 V(timers) \ 109 V(types) \ 110 V(uv) \ 111 V(v8) \ 112 V(zlib) \ 113 V(wasm_web_api) \ 114 V(worker) 115 116 #if NODE_HAVE_I18N_SUPPORT 117 #define EXTERNAL_REFERENCE_BINDING_LIST_I18N(V) V(icu) 118 #else 119 #define EXTERNAL_REFERENCE_BINDING_LIST_I18N(V) 120 #endif // NODE_HAVE_I18N_SUPPORT 121 122 #if HAVE_INSPECTOR 123 #define EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V) \ 124 V(inspector) \ 125 V(profiler) 126 #else 127 #define EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V) 128 #endif // HAVE_INSPECTOR 129 130 #if HAVE_OPENSSL 131 #define EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V) V(crypto) V(tls_wrap) 132 #else 133 #define EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V) 134 #endif // HAVE_OPENSSL 135 136 #if HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC 137 #define EXTERNAL_REFERENCE_BINDING_LIST_QUIC(V) V(quic) 138 #else 139 #define EXTERNAL_REFERENCE_BINDING_LIST_QUIC(V) 140 #endif 141 142 #define EXTERNAL_REFERENCE_BINDING_LIST(V) \ 143 EXTERNAL_REFERENCE_BINDING_LIST_BASE(V) \ 144 EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V) \ 145 EXTERNAL_REFERENCE_BINDING_LIST_I18N(V) \ 146 EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V) \ 147 EXTERNAL_REFERENCE_BINDING_LIST_QUIC(V) 148 149 } // namespace node 150 151 // Declare all the external reference registration functions here, 152 // and define them later with #NODE_BINDING_EXTERNAL_REFERENCE(modname, func); 153 #define V(modname) \ 154 void _register_external_reference_##modname( \ 155 node::ExternalReferenceRegistry* registry); 156 EXTERNAL_REFERENCE_BINDING_LIST(V) 157 #undef V 158 159 #define NODE_BINDING_EXTERNAL_REFERENCE(modname, func) \ 160 void _register_external_reference_##modname( \ 161 node::ExternalReferenceRegistry* registry) { \ 162 func(registry); \ 163 } 164 #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS 165 #endif // SRC_NODE_EXTERNAL_REFERENCE_H_