GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: node_external_reference.h Lines: 4 4 100.0 %
Date: 2022-09-18 04:22:26 Branches: 0 0 - %

Line Branch Exec Source
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
4085192
  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
48
  bool is_empty() { return external_references_.empty(); }
49
50
 private:
51
  template <typename T>
52
4085192
  void RegisterT(T* address) {
53
4085192
    external_references_.push_back(reinterpret_cast<intptr_t>(address));
54
4085192
  }
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(contextify)                                                                \
66
  V(credentials)                                                               \
67
  V(env_var)                                                                   \
68
  V(errors)                                                                    \
69
  V(fs)                                                                        \
70
  V(fs_dir)                                                                    \
71
  V(fs_event_wrap)                                                             \
72
  V(handle_wrap)                                                               \
73
  V(heap_utils)                                                                \
74
  V(messaging)                                                                 \
75
  V(mksnapshot)                                                                \
76
  V(options)                                                                   \
77
  V(os)                                                                        \
78
  V(performance)                                                               \
79
  V(process_methods)                                                           \
80
  V(process_object)                                                            \
81
  V(report)                                                                    \
82
  V(task_queue)                                                                \
83
  V(tcp_wrap)                                                                  \
84
  V(tty_wrap)                                                                  \
85
  V(url)                                                                       \
86
  V(util)                                                                      \
87
  V(pipe_wrap)                                                                 \
88
  V(serdes)                                                                    \
89
  V(string_decoder)                                                            \
90
  V(stream_wrap)                                                               \
91
  V(signal_wrap)                                                               \
92
  V(trace_events)                                                              \
93
  V(timers)                                                                    \
94
  V(types)                                                                     \
95
  V(uv)                                                                        \
96
  V(v8)                                                                        \
97
  V(zlib)                                                                      \
98
  V(wasm_web_api)                                                              \
99
  V(worker)
100
101
#if NODE_HAVE_I18N_SUPPORT
102
#define EXTERNAL_REFERENCE_BINDING_LIST_I18N(V) V(icu)
103
#else
104
#define EXTERNAL_REFERENCE_BINDING_LIST_I18N(V)
105
#endif  // NODE_HAVE_I18N_SUPPORT
106
107
#if HAVE_INSPECTOR
108
#define EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V)                           \
109
  V(inspector)                                                                 \
110
  V(profiler)
111
#else
112
#define EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V)
113
#endif  // HAVE_INSPECTOR
114
115
#if HAVE_OPENSSL
116
#define EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V) V(crypto) V(tls_wrap)
117
#else
118
#define EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V)
119
#endif  // HAVE_OPENSSL
120
121
#define EXTERNAL_REFERENCE_BINDING_LIST(V)                                     \
122
  EXTERNAL_REFERENCE_BINDING_LIST_BASE(V)                                      \
123
  EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V)                                 \
124
  EXTERNAL_REFERENCE_BINDING_LIST_I18N(V)                                      \
125
  EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V)
126
127
}  // namespace node
128
129
// Declare all the external reference registration functions here,
130
// and define them later with #NODE_MODULE_EXTERNAL_REFERENCE(modname, func);
131
#define V(modname)                                                             \
132
  void _register_external_reference_##modname(                                 \
133
      node::ExternalReferenceRegistry* registry);
134
EXTERNAL_REFERENCE_BINDING_LIST(V)
135
#undef V
136
137
#define NODE_MODULE_EXTERNAL_REFERENCE(modname, func)                          \
138
  void _register_external_reference_##modname(                                 \
139
      node::ExternalReferenceRegistry* registry) {                             \
140
    func(registry);                                                            \
141
  }
142
#endif  // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
143
#endif  // SRC_NODE_EXTERNAL_REFERENCE_H_