aha-libv8-node 16.0.0.0-linux

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/ext/libv8-node/.location.yml +1 -0
  3. data/ext/libv8-node/location.rb +76 -0
  4. data/ext/libv8-node/paths.rb +30 -0
  5. data/lib/libv8-node.rb +1 -0
  6. data/lib/libv8/node.rb +11 -0
  7. data/lib/libv8/node/version.rb +7 -0
  8. data/vendor/v8/include/cppgc/allocation.h +229 -0
  9. data/vendor/v8/include/cppgc/common.h +29 -0
  10. data/vendor/v8/include/cppgc/cross-thread-persistent.h +345 -0
  11. data/vendor/v8/include/cppgc/custom-space.h +97 -0
  12. data/vendor/v8/include/cppgc/default-platform.h +75 -0
  13. data/vendor/v8/include/cppgc/ephemeron-pair.h +30 -0
  14. data/vendor/v8/include/cppgc/garbage-collected.h +116 -0
  15. data/vendor/v8/include/cppgc/heap-consistency.h +236 -0
  16. data/vendor/v8/include/cppgc/heap-state.h +59 -0
  17. data/vendor/v8/include/cppgc/heap-statistics.h +110 -0
  18. data/vendor/v8/include/cppgc/heap.h +199 -0
  19. data/vendor/v8/include/cppgc/internal/api-constants.h +47 -0
  20. data/vendor/v8/include/cppgc/internal/atomic-entry-flag.h +48 -0
  21. data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +68 -0
  22. data/vendor/v8/include/cppgc/internal/compiler-specific.h +38 -0
  23. data/vendor/v8/include/cppgc/internal/finalizer-trait.h +90 -0
  24. data/vendor/v8/include/cppgc/internal/gc-info.h +47 -0
  25. data/vendor/v8/include/cppgc/internal/logging.h +50 -0
  26. data/vendor/v8/include/cppgc/internal/name-trait.h +111 -0
  27. data/vendor/v8/include/cppgc/internal/persistent-node.h +132 -0
  28. data/vendor/v8/include/cppgc/internal/pointer-policies.h +143 -0
  29. data/vendor/v8/include/cppgc/internal/prefinalizer-handler.h +30 -0
  30. data/vendor/v8/include/cppgc/internal/write-barrier.h +390 -0
  31. data/vendor/v8/include/cppgc/liveness-broker.h +74 -0
  32. data/vendor/v8/include/cppgc/macros.h +26 -0
  33. data/vendor/v8/include/cppgc/member.h +271 -0
  34. data/vendor/v8/include/cppgc/name-provider.h +65 -0
  35. data/vendor/v8/include/cppgc/object-size-trait.h +58 -0
  36. data/vendor/v8/include/cppgc/persistent.h +365 -0
  37. data/vendor/v8/include/cppgc/platform.h +151 -0
  38. data/vendor/v8/include/cppgc/prefinalizer.h +52 -0
  39. data/vendor/v8/include/cppgc/process-heap-statistics.h +36 -0
  40. data/vendor/v8/include/cppgc/sentinel-pointer.h +32 -0
  41. data/vendor/v8/include/cppgc/source-location.h +91 -0
  42. data/vendor/v8/include/cppgc/testing.h +50 -0
  43. data/vendor/v8/include/cppgc/trace-trait.h +116 -0
  44. data/vendor/v8/include/cppgc/type-traits.h +228 -0
  45. data/vendor/v8/include/cppgc/visitor.h +340 -0
  46. data/vendor/v8/include/libplatform/libplatform-export.h +29 -0
  47. data/vendor/v8/include/libplatform/libplatform.h +117 -0
  48. data/vendor/v8/include/libplatform/v8-tracing.h +334 -0
  49. data/vendor/v8/include/v8-cppgc.h +278 -0
  50. data/vendor/v8/include/v8-fast-api-calls.h +419 -0
  51. data/vendor/v8/include/v8-inspector-protocol.h +13 -0
  52. data/vendor/v8/include/v8-inspector.h +336 -0
  53. data/vendor/v8/include/v8-internal.h +462 -0
  54. data/vendor/v8/include/v8-metrics.h +189 -0
  55. data/vendor/v8/include/v8-platform.h +710 -0
  56. data/vendor/v8/include/v8-profiler.h +1116 -0
  57. data/vendor/v8/include/v8-unwinder-state.h +30 -0
  58. data/vendor/v8/include/v8-util.h +652 -0
  59. data/vendor/v8/include/v8-value-serializer-version.h +24 -0
  60. data/vendor/v8/include/v8-version-string.h +38 -0
  61. data/vendor/v8/include/v8-version.h +20 -0
  62. data/vendor/v8/include/v8-wasm-trap-handler-posix.h +31 -0
  63. data/vendor/v8/include/v8-wasm-trap-handler-win.h +28 -0
  64. data/vendor/v8/include/v8.h +12479 -0
  65. data/vendor/v8/include/v8config.h +521 -0
  66. data/vendor/v8/out.gn/libv8/obj/libv8_monolith.a +0 -0
  67. metadata +137 -0
@@ -0,0 +1,334 @@
1
+ // Copyright 2016 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_LIBPLATFORM_V8_TRACING_H_
6
+ #define V8_LIBPLATFORM_V8_TRACING_H_
7
+
8
+ #include <atomic>
9
+ #include <fstream>
10
+ #include <memory>
11
+ #include <unordered_set>
12
+ #include <vector>
13
+
14
+ #include "libplatform/libplatform-export.h"
15
+ #include "v8-platform.h" // NOLINT(build/include_directory)
16
+
17
+ namespace perfetto {
18
+ namespace trace_processor {
19
+ class TraceProcessorStorage;
20
+ }
21
+ class TracingSession;
22
+ }
23
+
24
+ namespace v8 {
25
+
26
+ namespace base {
27
+ class Mutex;
28
+ } // namespace base
29
+
30
+ namespace platform {
31
+ namespace tracing {
32
+
33
+ class TraceEventListener;
34
+
35
+ const int kTraceMaxNumArgs = 2;
36
+
37
+ class V8_PLATFORM_EXPORT TraceObject {
38
+ public:
39
+ union ArgValue {
40
+ V8_DEPRECATED("use as_uint ? true : false") bool as_bool;
41
+ uint64_t as_uint;
42
+ int64_t as_int;
43
+ double as_double;
44
+ const void* as_pointer;
45
+ const char* as_string;
46
+ };
47
+
48
+ TraceObject() = default;
49
+ ~TraceObject();
50
+ void Initialize(
51
+ char phase, const uint8_t* category_enabled_flag, const char* name,
52
+ const char* scope, uint64_t id, uint64_t bind_id, int num_args,
53
+ const char** arg_names, const uint8_t* arg_types,
54
+ const uint64_t* arg_values,
55
+ std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
56
+ unsigned int flags, int64_t timestamp, int64_t cpu_timestamp);
57
+ void UpdateDuration(int64_t timestamp, int64_t cpu_timestamp);
58
+ void InitializeForTesting(
59
+ char phase, const uint8_t* category_enabled_flag, const char* name,
60
+ const char* scope, uint64_t id, uint64_t bind_id, int num_args,
61
+ const char** arg_names, const uint8_t* arg_types,
62
+ const uint64_t* arg_values,
63
+ std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
64
+ unsigned int flags, int pid, int tid, int64_t ts, int64_t tts,
65
+ uint64_t duration, uint64_t cpu_duration);
66
+
67
+ int pid() const { return pid_; }
68
+ int tid() const { return tid_; }
69
+ char phase() const { return phase_; }
70
+ const uint8_t* category_enabled_flag() const {
71
+ return category_enabled_flag_;
72
+ }
73
+ const char* name() const { return name_; }
74
+ const char* scope() const { return scope_; }
75
+ uint64_t id() const { return id_; }
76
+ uint64_t bind_id() const { return bind_id_; }
77
+ int num_args() const { return num_args_; }
78
+ const char** arg_names() { return arg_names_; }
79
+ uint8_t* arg_types() { return arg_types_; }
80
+ ArgValue* arg_values() { return arg_values_; }
81
+ std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables() {
82
+ return arg_convertables_;
83
+ }
84
+ unsigned int flags() const { return flags_; }
85
+ int64_t ts() { return ts_; }
86
+ int64_t tts() { return tts_; }
87
+ uint64_t duration() { return duration_; }
88
+ uint64_t cpu_duration() { return cpu_duration_; }
89
+
90
+ private:
91
+ int pid_;
92
+ int tid_;
93
+ char phase_;
94
+ const char* name_;
95
+ const char* scope_;
96
+ const uint8_t* category_enabled_flag_;
97
+ uint64_t id_;
98
+ uint64_t bind_id_;
99
+ int num_args_ = 0;
100
+ const char* arg_names_[kTraceMaxNumArgs];
101
+ uint8_t arg_types_[kTraceMaxNumArgs];
102
+ ArgValue arg_values_[kTraceMaxNumArgs];
103
+ std::unique_ptr<v8::ConvertableToTraceFormat>
104
+ arg_convertables_[kTraceMaxNumArgs];
105
+ char* parameter_copy_storage_ = nullptr;
106
+ unsigned int flags_;
107
+ int64_t ts_;
108
+ int64_t tts_;
109
+ uint64_t duration_;
110
+ uint64_t cpu_duration_;
111
+
112
+ // Disallow copy and assign
113
+ TraceObject(const TraceObject&) = delete;
114
+ void operator=(const TraceObject&) = delete;
115
+ };
116
+
117
+ class V8_PLATFORM_EXPORT TraceWriter {
118
+ public:
119
+ TraceWriter() = default;
120
+ virtual ~TraceWriter() = default;
121
+ virtual void AppendTraceEvent(TraceObject* trace_event) = 0;
122
+ virtual void Flush() = 0;
123
+
124
+ static TraceWriter* CreateJSONTraceWriter(std::ostream& stream);
125
+ static TraceWriter* CreateJSONTraceWriter(std::ostream& stream,
126
+ const std::string& tag);
127
+
128
+ static TraceWriter* CreateSystemInstrumentationTraceWriter();
129
+
130
+ private:
131
+ // Disallow copy and assign
132
+ TraceWriter(const TraceWriter&) = delete;
133
+ void operator=(const TraceWriter&) = delete;
134
+ };
135
+
136
+ class V8_PLATFORM_EXPORT TraceBufferChunk {
137
+ public:
138
+ explicit TraceBufferChunk(uint32_t seq);
139
+
140
+ void Reset(uint32_t new_seq);
141
+ bool IsFull() const { return next_free_ == kChunkSize; }
142
+ TraceObject* AddTraceEvent(size_t* event_index);
143
+ TraceObject* GetEventAt(size_t index) { return &chunk_[index]; }
144
+
145
+ uint32_t seq() const { return seq_; }
146
+ size_t size() const { return next_free_; }
147
+
148
+ static const size_t kChunkSize = 64;
149
+
150
+ private:
151
+ size_t next_free_ = 0;
152
+ TraceObject chunk_[kChunkSize];
153
+ uint32_t seq_;
154
+
155
+ // Disallow copy and assign
156
+ TraceBufferChunk(const TraceBufferChunk&) = delete;
157
+ void operator=(const TraceBufferChunk&) = delete;
158
+ };
159
+
160
+ class V8_PLATFORM_EXPORT TraceBuffer {
161
+ public:
162
+ TraceBuffer() = default;
163
+ virtual ~TraceBuffer() = default;
164
+
165
+ virtual TraceObject* AddTraceEvent(uint64_t* handle) = 0;
166
+ virtual TraceObject* GetEventByHandle(uint64_t handle) = 0;
167
+ virtual bool Flush() = 0;
168
+
169
+ static const size_t kRingBufferChunks = 1024;
170
+
171
+ static TraceBuffer* CreateTraceBufferRingBuffer(size_t max_chunks,
172
+ TraceWriter* trace_writer);
173
+
174
+ private:
175
+ // Disallow copy and assign
176
+ TraceBuffer(const TraceBuffer&) = delete;
177
+ void operator=(const TraceBuffer&) = delete;
178
+ };
179
+
180
+ // Options determines how the trace buffer stores data.
181
+ enum TraceRecordMode {
182
+ // Record until the trace buffer is full.
183
+ RECORD_UNTIL_FULL,
184
+
185
+ // Record until the user ends the trace. The trace buffer is a fixed size
186
+ // and we use it as a ring buffer during recording.
187
+ RECORD_CONTINUOUSLY,
188
+
189
+ // Record until the trace buffer is full, but with a huge buffer size.
190
+ RECORD_AS_MUCH_AS_POSSIBLE,
191
+
192
+ // Echo to console. Events are discarded.
193
+ ECHO_TO_CONSOLE,
194
+ };
195
+
196
+ class V8_PLATFORM_EXPORT TraceConfig {
197
+ public:
198
+ typedef std::vector<std::string> StringList;
199
+
200
+ static TraceConfig* CreateDefaultTraceConfig();
201
+
202
+ TraceConfig() : enable_systrace_(false), enable_argument_filter_(false) {}
203
+ TraceRecordMode GetTraceRecordMode() const { return record_mode_; }
204
+ const StringList& GetEnabledCategories() const {
205
+ return included_categories_;
206
+ }
207
+ bool IsSystraceEnabled() const { return enable_systrace_; }
208
+ bool IsArgumentFilterEnabled() const { return enable_argument_filter_; }
209
+
210
+ void SetTraceRecordMode(TraceRecordMode mode) { record_mode_ = mode; }
211
+ void EnableSystrace() { enable_systrace_ = true; }
212
+ void EnableArgumentFilter() { enable_argument_filter_ = true; }
213
+
214
+ void AddIncludedCategory(const char* included_category);
215
+
216
+ bool IsCategoryGroupEnabled(const char* category_group) const;
217
+
218
+ private:
219
+ TraceRecordMode record_mode_;
220
+ bool enable_systrace_ : 1;
221
+ bool enable_argument_filter_ : 1;
222
+ StringList included_categories_;
223
+
224
+ // Disallow copy and assign
225
+ TraceConfig(const TraceConfig&) = delete;
226
+ void operator=(const TraceConfig&) = delete;
227
+ };
228
+
229
+ #if defined(_MSC_VER)
230
+ #define V8_PLATFORM_NON_EXPORTED_BASE(code) \
231
+ __pragma(warning(suppress : 4275)) code
232
+ #else
233
+ #define V8_PLATFORM_NON_EXPORTED_BASE(code) code
234
+ #endif // defined(_MSC_VER)
235
+
236
+ class V8_PLATFORM_EXPORT TracingController
237
+ : public V8_PLATFORM_NON_EXPORTED_BASE(v8::TracingController) {
238
+ public:
239
+ TracingController();
240
+ ~TracingController() override;
241
+
242
+ #if defined(V8_USE_PERFETTO)
243
+ // Must be called before StartTracing() if V8_USE_PERFETTO is true. Provides
244
+ // the output stream for the JSON trace data.
245
+ void InitializeForPerfetto(std::ostream* output_stream);
246
+ // Provide an optional listener for testing that will receive trace events.
247
+ // Must be called before StartTracing().
248
+ void SetTraceEventListenerForTesting(TraceEventListener* listener);
249
+ #else // defined(V8_USE_PERFETTO)
250
+ // The pointer returned from GetCategoryGroupEnabled() points to a value with
251
+ // zero or more of the following bits. Used in this class only. The
252
+ // TRACE_EVENT macros should only use the value as a bool. These values must
253
+ // be in sync with macro values in TraceEvent.h in Blink.
254
+ enum CategoryGroupEnabledFlags {
255
+ // Category group enabled for the recording mode.
256
+ ENABLED_FOR_RECORDING = 1 << 0,
257
+ // Category group enabled by SetEventCallbackEnabled().
258
+ ENABLED_FOR_EVENT_CALLBACK = 1 << 2,
259
+ // Category group enabled to export events to ETW.
260
+ ENABLED_FOR_ETW_EXPORT = 1 << 3
261
+ };
262
+
263
+ // Takes ownership of |trace_buffer|.
264
+ void Initialize(TraceBuffer* trace_buffer);
265
+
266
+ // v8::TracingController implementation.
267
+ const uint8_t* GetCategoryGroupEnabled(const char* category_group) override;
268
+ uint64_t AddTraceEvent(
269
+ char phase, const uint8_t* category_enabled_flag, const char* name,
270
+ const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
271
+ const char** arg_names, const uint8_t* arg_types,
272
+ const uint64_t* arg_values,
273
+ std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
274
+ unsigned int flags) override;
275
+ uint64_t AddTraceEventWithTimestamp(
276
+ char phase, const uint8_t* category_enabled_flag, const char* name,
277
+ const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
278
+ const char** arg_names, const uint8_t* arg_types,
279
+ const uint64_t* arg_values,
280
+ std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
281
+ unsigned int flags, int64_t timestamp) override;
282
+ void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
283
+ const char* name, uint64_t handle) override;
284
+
285
+ static const char* GetCategoryGroupName(const uint8_t* category_enabled_flag);
286
+ #endif // !defined(V8_USE_PERFETTO)
287
+
288
+ void AddTraceStateObserver(
289
+ v8::TracingController::TraceStateObserver* observer) override;
290
+ void RemoveTraceStateObserver(
291
+ v8::TracingController::TraceStateObserver* observer) override;
292
+
293
+ void StartTracing(TraceConfig* trace_config);
294
+ void StopTracing();
295
+
296
+ protected:
297
+ #if !defined(V8_USE_PERFETTO)
298
+ virtual int64_t CurrentTimestampMicroseconds();
299
+ virtual int64_t CurrentCpuTimestampMicroseconds();
300
+ #endif // !defined(V8_USE_PERFETTO)
301
+
302
+ private:
303
+ #if !defined(V8_USE_PERFETTO)
304
+ void UpdateCategoryGroupEnabledFlag(size_t category_index);
305
+ void UpdateCategoryGroupEnabledFlags();
306
+ #endif // !defined(V8_USE_PERFETTO)
307
+
308
+ std::unique_ptr<base::Mutex> mutex_;
309
+ std::unique_ptr<TraceConfig> trace_config_;
310
+ std::atomic_bool recording_{false};
311
+ std::unordered_set<v8::TracingController::TraceStateObserver*> observers_;
312
+
313
+ #if defined(V8_USE_PERFETTO)
314
+ std::ostream* output_stream_ = nullptr;
315
+ std::unique_ptr<perfetto::trace_processor::TraceProcessorStorage>
316
+ trace_processor_;
317
+ TraceEventListener* listener_for_testing_ = nullptr;
318
+ std::unique_ptr<perfetto::TracingSession> tracing_session_;
319
+ #else // !defined(V8_USE_PERFETTO)
320
+ std::unique_ptr<TraceBuffer> trace_buffer_;
321
+ #endif // !defined(V8_USE_PERFETTO)
322
+
323
+ // Disallow copy and assign
324
+ TracingController(const TracingController&) = delete;
325
+ void operator=(const TracingController&) = delete;
326
+ };
327
+
328
+ #undef V8_PLATFORM_NON_EXPORTED_BASE
329
+
330
+ } // namespace tracing
331
+ } // namespace platform
332
+ } // namespace v8
333
+
334
+ #endif // V8_LIBPLATFORM_V8_TRACING_H_
@@ -0,0 +1,278 @@
1
+ // Copyright 2020 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 INCLUDE_V8_CPPGC_H_
6
+ #define INCLUDE_V8_CPPGC_H_
7
+
8
+ #include <cstdint>
9
+ #include <memory>
10
+ #include <vector>
11
+
12
+ #include "cppgc/custom-space.h"
13
+ #include "cppgc/heap-statistics.h"
14
+ #include "cppgc/internal/write-barrier.h"
15
+ #include "cppgc/visitor.h"
16
+ #include "v8-internal.h" // NOLINT(build/include_directory)
17
+ #include "v8.h" // NOLINT(build/include_directory)
18
+
19
+ namespace cppgc {
20
+ class AllocationHandle;
21
+ class HeapHandle;
22
+ } // namespace cppgc
23
+
24
+ namespace v8 {
25
+
26
+ namespace internal {
27
+ class CppHeap;
28
+ } // namespace internal
29
+
30
+ /**
31
+ * Describes how V8 wrapper objects maintain references to garbage-collected C++
32
+ * objects.
33
+ */
34
+ struct WrapperDescriptor final {
35
+ /**
36
+ * The index used on `v8::Ojbect::SetAlignedPointerFromInternalField()` and
37
+ * related APIs to add additional data to an object which is used to identify
38
+ * JS->C++ references.
39
+ */
40
+ using InternalFieldIndex = int;
41
+
42
+ /**
43
+ * Unknown embedder id. The value is reserved for internal usages and must not
44
+ * be used with `CppHeap`.
45
+ */
46
+ static constexpr uint16_t kUnknownEmbedderId = UINT16_MAX;
47
+
48
+ constexpr WrapperDescriptor(InternalFieldIndex wrappable_type_index,
49
+ InternalFieldIndex wrappable_instance_index,
50
+ uint16_t embedder_id_for_garbage_collected)
51
+ : wrappable_type_index(wrappable_type_index),
52
+ wrappable_instance_index(wrappable_instance_index),
53
+ embedder_id_for_garbage_collected(embedder_id_for_garbage_collected) {}
54
+
55
+ /**
56
+ * Index of the wrappable type.
57
+ */
58
+ InternalFieldIndex wrappable_type_index;
59
+
60
+ /**
61
+ * Index of the wrappable instance.
62
+ */
63
+ InternalFieldIndex wrappable_instance_index;
64
+
65
+ /**
66
+ * Embedder id identifying instances of garbage-collected objects. It is
67
+ * expected that the first field of the wrappable type is a uint16_t holding
68
+ * the id. Only references to instances of wrappables types with an id of
69
+ * `embedder_id_for_garbage_collected` will be considered by CppHeap.
70
+ */
71
+ uint16_t embedder_id_for_garbage_collected;
72
+ };
73
+
74
+ struct V8_EXPORT CppHeapCreateParams {
75
+ CppHeapCreateParams(const CppHeapCreateParams&) = delete;
76
+ CppHeapCreateParams& operator=(const CppHeapCreateParams&) = delete;
77
+
78
+ std::vector<std::unique_ptr<cppgc::CustomSpaceBase>> custom_spaces;
79
+ WrapperDescriptor wrapper_descriptor;
80
+ };
81
+
82
+ /**
83
+ * A heap for allocating managed C++ objects.
84
+ */
85
+ class V8_EXPORT CppHeap {
86
+ public:
87
+ static std::unique_ptr<CppHeap> Create(v8::Platform* platform,
88
+ const CppHeapCreateParams& params);
89
+
90
+ virtual ~CppHeap() = default;
91
+
92
+ /**
93
+ * \returns the opaque handle for allocating objects using
94
+ * `MakeGarbageCollected()`.
95
+ */
96
+ cppgc::AllocationHandle& GetAllocationHandle();
97
+
98
+ /**
99
+ * \returns the opaque heap handle which may be used to refer to this heap in
100
+ * other APIs. Valid as long as the underlying `CppHeap` is alive.
101
+ */
102
+ cppgc::HeapHandle& GetHeapHandle();
103
+
104
+ /**
105
+ * Terminate clears all roots and performs multiple garbage collections to
106
+ * reclaim potentially newly created objects in destructors.
107
+ *
108
+ * After this call, object allocation is prohibited.
109
+ */
110
+ void Terminate();
111
+
112
+ /**
113
+ * \param detail_level specifies whether should return detailed
114
+ * statistics or only brief summary statistics.
115
+ * \returns current CppHeap statistics regarding memory consumption
116
+ * and utilization.
117
+ */
118
+ cppgc::HeapStatistics CollectStatistics(
119
+ cppgc::HeapStatistics::DetailLevel detail_level);
120
+
121
+ private:
122
+ CppHeap() = default;
123
+
124
+ friend class internal::CppHeap;
125
+ };
126
+
127
+ class JSVisitor : public cppgc::Visitor {
128
+ public:
129
+ explicit JSVisitor(cppgc::Visitor::Key key) : cppgc::Visitor(key) {}
130
+
131
+ void Trace(const TracedReferenceBase& ref) {
132
+ if (ref.IsEmptyThreadSafe()) return;
133
+ Visit(ref);
134
+ }
135
+
136
+ protected:
137
+ using cppgc::Visitor::Visit;
138
+
139
+ virtual void Visit(const TracedReferenceBase& ref) {}
140
+ };
141
+
142
+ /**
143
+ * **DO NOT USE: Use the appropriate managed types.**
144
+ *
145
+ * Consistency helpers that aid in maintaining a consistent internal state of
146
+ * the garbage collector.
147
+ */
148
+ class V8_EXPORT JSHeapConsistency final {
149
+ public:
150
+ using WriteBarrierParams = cppgc::internal::WriteBarrier::Params;
151
+ using WriteBarrierType = cppgc::internal::WriteBarrier::Type;
152
+
153
+ /**
154
+ * Gets the required write barrier type for a specific write.
155
+ *
156
+ * Note: Handling for C++ to JS references.
157
+ *
158
+ * \param ref The reference being written to.
159
+ * \param params Parameters that may be used for actual write barrier calls.
160
+ * Only filled if return value indicates that a write barrier is needed. The
161
+ * contents of the `params` are an implementation detail.
162
+ * \param callback Callback returning the corresponding heap handle. The
163
+ * callback is only invoked if the heap cannot otherwise be figured out. The
164
+ * callback must not allocate.
165
+ * \returns whether a write barrier is needed and which barrier to invoke.
166
+ */
167
+ template <typename HeapHandleCallback>
168
+ static V8_INLINE WriteBarrierType
169
+ GetWriteBarrierType(const TracedReferenceBase& ref,
170
+ WriteBarrierParams& params, HeapHandleCallback callback) {
171
+ if (ref.IsEmpty()) return WriteBarrierType::kNone;
172
+
173
+ if (V8_LIKELY(!cppgc::internal::WriteBarrier::
174
+ IsAnyIncrementalOrConcurrentMarking())) {
175
+ return cppgc::internal::WriteBarrier::Type::kNone;
176
+ }
177
+ cppgc::HeapHandle& handle = callback();
178
+ if (!cppgc::subtle::HeapState::IsMarking(handle)) {
179
+ return cppgc::internal::WriteBarrier::Type::kNone;
180
+ }
181
+ params.heap = &handle;
182
+ #if V8_ENABLE_CHECKS
183
+ params.type = cppgc::internal::WriteBarrier::Type::kMarking;
184
+ #endif // !V8_ENABLE_CHECKS
185
+ return cppgc::internal::WriteBarrier::Type::kMarking;
186
+ }
187
+
188
+ /**
189
+ * Gets the required write barrier type for a specific write.
190
+ *
191
+ * Note: Handling for JS to C++ references.
192
+ *
193
+ * \param wrapper The wrapper that has been written into.
194
+ * \param wrapper_index The wrapper index in `wrapper` that has been written
195
+ * into.
196
+ * \param wrappable The value that was written.
197
+ * \param params Parameters that may be used for actual write barrier calls.
198
+ * Only filled if return value indicates that a write barrier is needed. The
199
+ * contents of the `params` are an implementation detail.
200
+ * \param callback Callback returning the corresponding heap handle. The
201
+ * callback is only invoked if the heap cannot otherwise be figured out. The
202
+ * callback must not allocate.
203
+ * \returns whether a write barrier is needed and which barrier to invoke.
204
+ */
205
+ template <typename HeapHandleCallback>
206
+ static V8_INLINE WriteBarrierType GetWriteBarrierType(
207
+ v8::Local<v8::Object>& wrapper, int wrapper_index, const void* wrappable,
208
+ WriteBarrierParams& params, HeapHandleCallback callback) {
209
+ #if V8_ENABLE_CHECKS
210
+ CheckWrapper(wrapper, wrapper_index, wrappable);
211
+ #endif // V8_ENABLE_CHECKS
212
+ return cppgc::internal::WriteBarrier::
213
+ GetWriteBarrierTypeForExternallyReferencedObject(wrappable, params,
214
+ callback);
215
+ }
216
+
217
+ /**
218
+ * Conservative Dijkstra-style write barrier that processes an object if it
219
+ * has not yet been processed.
220
+ *
221
+ * \param params The parameters retrieved from `GetWriteBarrierType()`.
222
+ * \param ref The reference being written to.
223
+ */
224
+ static V8_INLINE void DijkstraMarkingBarrier(const WriteBarrierParams& params,
225
+ cppgc::HeapHandle& heap_handle,
226
+ const TracedReferenceBase& ref) {
227
+ cppgc::internal::WriteBarrier::CheckParams(WriteBarrierType::kMarking,
228
+ params);
229
+ DijkstraMarkingBarrierSlow(heap_handle, ref);
230
+ }
231
+
232
+ /**
233
+ * Conservative Dijkstra-style write barrier that processes an object if it
234
+ * has not yet been processed.
235
+ *
236
+ * \param params The parameters retrieved from `GetWriteBarrierType()`.
237
+ * \param object The pointer to the object. May be an interior pointer to a
238
+ * an interface of the actual object.
239
+ */
240
+ static V8_INLINE void DijkstraMarkingBarrier(const WriteBarrierParams& params,
241
+ cppgc::HeapHandle& heap_handle,
242
+ const void* object) {
243
+ cppgc::internal::WriteBarrier::DijkstraMarkingBarrier(params, object);
244
+ }
245
+
246
+ /**
247
+ * Generational barrier for maintaining consistency when running with multiple
248
+ * generations.
249
+ *
250
+ * \param params The parameters retrieved from `GetWriteBarrierType()`.
251
+ * \param ref The reference being written to.
252
+ */
253
+ static V8_INLINE void GenerationalBarrier(const WriteBarrierParams& params,
254
+ const TracedReferenceBase& ref) {}
255
+
256
+ private:
257
+ JSHeapConsistency() = delete;
258
+
259
+ static void CheckWrapper(v8::Local<v8::Object>&, int, const void*);
260
+
261
+ static void DijkstraMarkingBarrierSlow(cppgc::HeapHandle&,
262
+ const TracedReferenceBase& ref);
263
+ };
264
+
265
+ } // namespace v8
266
+
267
+ namespace cppgc {
268
+
269
+ template <typename T>
270
+ struct TraceTrait<v8::TracedReference<T>> {
271
+ static void Trace(Visitor* visitor, const v8::TracedReference<T>* self) {
272
+ static_cast<v8::JSVisitor*>(visitor)->Trace(*self);
273
+ }
274
+ };
275
+
276
+ } // namespace cppgc
277
+
278
+ #endif // INCLUDE_V8_CPPGC_H_