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.
- checksums.yaml +7 -0
- data/ext/libv8-node/.location.yml +1 -0
- data/ext/libv8-node/location.rb +76 -0
- data/ext/libv8-node/paths.rb +30 -0
- data/lib/libv8-node.rb +1 -0
- data/lib/libv8/node.rb +11 -0
- data/lib/libv8/node/version.rb +7 -0
- data/vendor/v8/include/cppgc/allocation.h +229 -0
- data/vendor/v8/include/cppgc/common.h +29 -0
- data/vendor/v8/include/cppgc/cross-thread-persistent.h +345 -0
- data/vendor/v8/include/cppgc/custom-space.h +97 -0
- data/vendor/v8/include/cppgc/default-platform.h +75 -0
- data/vendor/v8/include/cppgc/ephemeron-pair.h +30 -0
- data/vendor/v8/include/cppgc/garbage-collected.h +116 -0
- data/vendor/v8/include/cppgc/heap-consistency.h +236 -0
- data/vendor/v8/include/cppgc/heap-state.h +59 -0
- data/vendor/v8/include/cppgc/heap-statistics.h +110 -0
- data/vendor/v8/include/cppgc/heap.h +199 -0
- data/vendor/v8/include/cppgc/internal/api-constants.h +47 -0
- data/vendor/v8/include/cppgc/internal/atomic-entry-flag.h +48 -0
- data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +68 -0
- data/vendor/v8/include/cppgc/internal/compiler-specific.h +38 -0
- data/vendor/v8/include/cppgc/internal/finalizer-trait.h +90 -0
- data/vendor/v8/include/cppgc/internal/gc-info.h +47 -0
- data/vendor/v8/include/cppgc/internal/logging.h +50 -0
- data/vendor/v8/include/cppgc/internal/name-trait.h +111 -0
- data/vendor/v8/include/cppgc/internal/persistent-node.h +132 -0
- data/vendor/v8/include/cppgc/internal/pointer-policies.h +143 -0
- data/vendor/v8/include/cppgc/internal/prefinalizer-handler.h +30 -0
- data/vendor/v8/include/cppgc/internal/write-barrier.h +390 -0
- data/vendor/v8/include/cppgc/liveness-broker.h +74 -0
- data/vendor/v8/include/cppgc/macros.h +26 -0
- data/vendor/v8/include/cppgc/member.h +271 -0
- data/vendor/v8/include/cppgc/name-provider.h +65 -0
- data/vendor/v8/include/cppgc/object-size-trait.h +58 -0
- data/vendor/v8/include/cppgc/persistent.h +365 -0
- data/vendor/v8/include/cppgc/platform.h +151 -0
- data/vendor/v8/include/cppgc/prefinalizer.h +52 -0
- data/vendor/v8/include/cppgc/process-heap-statistics.h +36 -0
- data/vendor/v8/include/cppgc/sentinel-pointer.h +32 -0
- data/vendor/v8/include/cppgc/source-location.h +91 -0
- data/vendor/v8/include/cppgc/testing.h +50 -0
- data/vendor/v8/include/cppgc/trace-trait.h +116 -0
- data/vendor/v8/include/cppgc/type-traits.h +228 -0
- data/vendor/v8/include/cppgc/visitor.h +340 -0
- data/vendor/v8/include/libplatform/libplatform-export.h +29 -0
- data/vendor/v8/include/libplatform/libplatform.h +117 -0
- data/vendor/v8/include/libplatform/v8-tracing.h +334 -0
- data/vendor/v8/include/v8-cppgc.h +278 -0
- data/vendor/v8/include/v8-fast-api-calls.h +419 -0
- data/vendor/v8/include/v8-inspector-protocol.h +13 -0
- data/vendor/v8/include/v8-inspector.h +336 -0
- data/vendor/v8/include/v8-internal.h +462 -0
- data/vendor/v8/include/v8-metrics.h +189 -0
- data/vendor/v8/include/v8-platform.h +710 -0
- data/vendor/v8/include/v8-profiler.h +1116 -0
- data/vendor/v8/include/v8-unwinder-state.h +30 -0
- data/vendor/v8/include/v8-util.h +652 -0
- data/vendor/v8/include/v8-value-serializer-version.h +24 -0
- data/vendor/v8/include/v8-version-string.h +38 -0
- data/vendor/v8/include/v8-version.h +20 -0
- data/vendor/v8/include/v8-wasm-trap-handler-posix.h +31 -0
- data/vendor/v8/include/v8-wasm-trap-handler-win.h +28 -0
- data/vendor/v8/include/v8.h +12479 -0
- data/vendor/v8/include/v8config.h +521 -0
- data/vendor/v8/out.gn/libv8/obj/libv8_monolith.a +0 -0
- 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_
|