libv8-node 16.10.0.0-x86_64-linux → 18.8.0.0-x86_64-linux

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libv8-node/paths.rb +5 -1
  3. data/lib/libv8/node/version.rb +3 -3
  4. data/vendor/v8/include/cppgc/allocation.h +100 -22
  5. data/vendor/v8/include/cppgc/cross-thread-persistent.h +114 -33
  6. data/vendor/v8/include/cppgc/default-platform.h +2 -10
  7. data/vendor/v8/include/cppgc/explicit-management.h +22 -4
  8. data/vendor/v8/include/cppgc/garbage-collected.h +15 -26
  9. data/vendor/v8/include/cppgc/heap-consistency.h +30 -0
  10. data/vendor/v8/include/cppgc/heap-state.h +12 -0
  11. data/vendor/v8/include/cppgc/heap.h +7 -2
  12. data/vendor/v8/include/cppgc/internal/api-constants.h +8 -0
  13. data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +25 -14
  14. data/vendor/v8/include/cppgc/internal/finalizer-trait.h +4 -1
  15. data/vendor/v8/include/cppgc/internal/gc-info.h +90 -10
  16. data/vendor/v8/include/cppgc/internal/logging.h +3 -3
  17. data/vendor/v8/include/cppgc/internal/name-trait.h +11 -0
  18. data/vendor/v8/include/cppgc/internal/persistent-node.h +73 -29
  19. data/vendor/v8/include/cppgc/internal/pointer-policies.h +26 -15
  20. data/vendor/v8/include/cppgc/internal/write-barrier.h +62 -23
  21. data/vendor/v8/include/cppgc/liveness-broker.h +4 -1
  22. data/vendor/v8/include/cppgc/member.h +7 -2
  23. data/vendor/v8/include/cppgc/persistent.h +38 -33
  24. data/vendor/v8/include/cppgc/platform.h +4 -1
  25. data/vendor/v8/include/cppgc/prefinalizer.h +35 -12
  26. data/vendor/v8/include/cppgc/testing.h +9 -2
  27. data/vendor/v8/include/cppgc/type-traits.h +6 -13
  28. data/vendor/v8/include/cppgc/visitor.h +9 -7
  29. data/vendor/v8/include/libplatform/libplatform.h +0 -11
  30. data/vendor/v8/include/libplatform/v8-tracing.h +0 -1
  31. data/vendor/v8/include/v8-array-buffer.h +445 -0
  32. data/vendor/v8/include/v8-callbacks.h +397 -0
  33. data/vendor/v8/include/v8-container.h +129 -0
  34. data/vendor/v8/include/v8-context.h +407 -0
  35. data/vendor/v8/include/v8-cppgc.h +21 -128
  36. data/vendor/v8/include/v8-data.h +80 -0
  37. data/vendor/v8/include/v8-date.h +43 -0
  38. data/vendor/v8/include/v8-debug.h +168 -0
  39. data/vendor/v8/include/v8-embedder-heap.h +218 -0
  40. data/vendor/v8/include/v8-embedder-state-scope.h +51 -0
  41. data/vendor/v8/include/v8-exception.h +217 -0
  42. data/vendor/v8/include/v8-extension.h +62 -0
  43. data/vendor/v8/include/v8-external.h +37 -0
  44. data/vendor/v8/include/v8-fast-api-calls.h +172 -24
  45. data/vendor/v8/include/v8-forward.h +81 -0
  46. data/vendor/v8/include/v8-function-callback.h +475 -0
  47. data/vendor/v8/include/v8-function.h +125 -0
  48. data/vendor/v8/include/v8-initialization.h +315 -0
  49. data/vendor/v8/include/v8-inspector.h +56 -28
  50. data/vendor/v8/include/v8-internal.h +217 -55
  51. data/vendor/v8/include/v8-isolate.h +1709 -0
  52. data/vendor/v8/include/v8-json.h +47 -0
  53. data/vendor/v8/include/v8-local-handle.h +455 -0
  54. data/vendor/v8/include/v8-locker.h +149 -0
  55. data/vendor/v8/include/v8-maybe.h +137 -0
  56. data/vendor/v8/include/v8-memory-span.h +43 -0
  57. data/vendor/v8/include/v8-message.h +216 -0
  58. data/vendor/v8/include/v8-metrics.h +69 -16
  59. data/vendor/v8/include/v8-microtask-queue.h +152 -0
  60. data/vendor/v8/include/v8-microtask.h +28 -0
  61. data/vendor/v8/include/v8-object.h +775 -0
  62. data/vendor/v8/include/v8-persistent-handle.h +590 -0
  63. data/vendor/v8/include/v8-platform.h +400 -17
  64. data/vendor/v8/include/v8-primitive-object.h +118 -0
  65. data/vendor/v8/include/v8-primitive.h +866 -0
  66. data/vendor/v8/include/v8-profiler.h +88 -13
  67. data/vendor/v8/include/v8-promise.h +174 -0
  68. data/vendor/v8/include/v8-proxy.h +50 -0
  69. data/vendor/v8/include/v8-regexp.h +105 -0
  70. data/vendor/v8/include/v8-script.h +747 -0
  71. data/vendor/v8/include/v8-snapshot.h +196 -0
  72. data/vendor/v8/include/v8-statistics.h +217 -0
  73. data/vendor/v8/include/v8-template.h +1079 -0
  74. data/vendor/v8/include/v8-traced-handle.h +420 -0
  75. data/vendor/v8/include/v8-typed-array.h +282 -0
  76. data/vendor/v8/include/v8-unwinder-state.h +4 -3
  77. data/vendor/v8/include/v8-unwinder.h +132 -0
  78. data/vendor/v8/include/v8-util.h +7 -1
  79. data/vendor/v8/include/v8-value-serializer-version.h +1 -1
  80. data/vendor/v8/include/v8-value-serializer.h +279 -0
  81. data/vendor/v8/include/v8-value.h +526 -0
  82. data/vendor/v8/include/v8-version.h +4 -4
  83. data/vendor/v8/include/v8-wasm.h +257 -0
  84. data/vendor/v8/include/v8-weak-callback-info.h +87 -0
  85. data/vendor/v8/include/v8.h +41 -12601
  86. data/vendor/v8/include/v8config.h +102 -12
  87. data/vendor/v8/x86_64-linux/libv8/obj/libv8_monolith.a +0 -0
  88. metadata +47 -5
  89. data/vendor/v8/include/cppgc/internal/prefinalizer-handler.h +0 -30
@@ -0,0 +1,47 @@
1
+ // Copyright 2021 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_JSON_H_
6
+ #define INCLUDE_V8_JSON_H_
7
+
8
+ #include "v8-local-handle.h" // NOLINT(build/include_directory)
9
+ #include "v8config.h" // NOLINT(build/include_directory)
10
+
11
+ namespace v8 {
12
+
13
+ class Context;
14
+ class Value;
15
+ class String;
16
+
17
+ /**
18
+ * A JSON Parser and Stringifier.
19
+ */
20
+ class V8_EXPORT JSON {
21
+ public:
22
+ /**
23
+ * Tries to parse the string |json_string| and returns it as value if
24
+ * successful.
25
+ *
26
+ * \param the context in which to parse and create the value.
27
+ * \param json_string The string to parse.
28
+ * \return The corresponding value if successfully parsed.
29
+ */
30
+ static V8_WARN_UNUSED_RESULT MaybeLocal<Value> Parse(
31
+ Local<Context> context, Local<String> json_string);
32
+
33
+ /**
34
+ * Tries to stringify the JSON-serializable object |json_object| and returns
35
+ * it as string if successful.
36
+ *
37
+ * \param json_object The JSON-serializable object to stringify.
38
+ * \return The corresponding string if successfully stringified.
39
+ */
40
+ static V8_WARN_UNUSED_RESULT MaybeLocal<String> Stringify(
41
+ Local<Context> context, Local<Value> json_object,
42
+ Local<String> gap = Local<String>());
43
+ };
44
+
45
+ } // namespace v8
46
+
47
+ #endif // INCLUDE_V8_JSON_H_
@@ -0,0 +1,455 @@
1
+ // Copyright 2021 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_LOCAL_HANDLE_H_
6
+ #define INCLUDE_V8_LOCAL_HANDLE_H_
7
+
8
+ #include <stddef.h>
9
+
10
+ #include <type_traits>
11
+
12
+ #include "v8-internal.h" // NOLINT(build/include_directory)
13
+
14
+ namespace v8 {
15
+
16
+ class Boolean;
17
+ template <class T>
18
+ class BasicTracedReference;
19
+ class Context;
20
+ class EscapableHandleScope;
21
+ template <class F>
22
+ class Eternal;
23
+ template <class F>
24
+ class FunctionCallbackInfo;
25
+ class Isolate;
26
+ template <class F>
27
+ class MaybeLocal;
28
+ template <class T>
29
+ class NonCopyablePersistentTraits;
30
+ class Object;
31
+ template <class T, class M = NonCopyablePersistentTraits<T>>
32
+ class Persistent;
33
+ template <class T>
34
+ class PersistentBase;
35
+ template <class F1, class F2, class F3>
36
+ class PersistentValueMapBase;
37
+ template <class F1, class F2>
38
+ class PersistentValueVector;
39
+ class Primitive;
40
+ class Private;
41
+ template <class F>
42
+ class PropertyCallbackInfo;
43
+ template <class F>
44
+ class ReturnValue;
45
+ class String;
46
+ template <class F>
47
+ class Traced;
48
+ template <class F>
49
+ class TracedReference;
50
+ class TracedReferenceBase;
51
+ class Utils;
52
+
53
+ namespace internal {
54
+ template <typename T>
55
+ class CustomArguments;
56
+ } // namespace internal
57
+
58
+ namespace api_internal {
59
+ // Called when ToLocalChecked is called on an empty Local.
60
+ V8_EXPORT void ToLocalEmpty();
61
+ } // namespace api_internal
62
+
63
+ /**
64
+ * A stack-allocated class that governs a number of local handles.
65
+ * After a handle scope has been created, all local handles will be
66
+ * allocated within that handle scope until either the handle scope is
67
+ * deleted or another handle scope is created. If there is already a
68
+ * handle scope and a new one is created, all allocations will take
69
+ * place in the new handle scope until it is deleted. After that,
70
+ * new handles will again be allocated in the original handle scope.
71
+ *
72
+ * After the handle scope of a local handle has been deleted the
73
+ * garbage collector will no longer track the object stored in the
74
+ * handle and may deallocate it. The behavior of accessing a handle
75
+ * for which the handle scope has been deleted is undefined.
76
+ */
77
+ class V8_EXPORT V8_NODISCARD HandleScope {
78
+ public:
79
+ explicit HandleScope(Isolate* isolate);
80
+
81
+ ~HandleScope();
82
+
83
+ /**
84
+ * Counts the number of allocated handles.
85
+ */
86
+ static int NumberOfHandles(Isolate* isolate);
87
+
88
+ V8_INLINE Isolate* GetIsolate() const {
89
+ return reinterpret_cast<Isolate*>(isolate_);
90
+ }
91
+
92
+ HandleScope(const HandleScope&) = delete;
93
+ void operator=(const HandleScope&) = delete;
94
+
95
+ protected:
96
+ V8_INLINE HandleScope() = default;
97
+
98
+ void Initialize(Isolate* isolate);
99
+
100
+ static internal::Address* CreateHandle(internal::Isolate* isolate,
101
+ internal::Address value);
102
+
103
+ private:
104
+ // Declaring operator new and delete as deleted is not spec compliant.
105
+ // Therefore declare them private instead to disable dynamic alloc
106
+ void* operator new(size_t size);
107
+ void* operator new[](size_t size);
108
+ void operator delete(void*, size_t);
109
+ void operator delete[](void*, size_t);
110
+
111
+ internal::Isolate* isolate_;
112
+ internal::Address* prev_next_;
113
+ internal::Address* prev_limit_;
114
+
115
+ // Local::New uses CreateHandle with an Isolate* parameter.
116
+ template <class F>
117
+ friend class Local;
118
+
119
+ // Object::GetInternalField and Context::GetEmbedderData use CreateHandle with
120
+ // a HeapObject in their shortcuts.
121
+ friend class Object;
122
+ friend class Context;
123
+ };
124
+
125
+ /**
126
+ * An object reference managed by the v8 garbage collector.
127
+ *
128
+ * All objects returned from v8 have to be tracked by the garbage collector so
129
+ * that it knows that the objects are still alive. Also, because the garbage
130
+ * collector may move objects, it is unsafe to point directly to an object.
131
+ * Instead, all objects are stored in handles which are known by the garbage
132
+ * collector and updated whenever an object moves. Handles should always be
133
+ * passed by value (except in cases like out-parameters) and they should never
134
+ * be allocated on the heap.
135
+ *
136
+ * There are two types of handles: local and persistent handles.
137
+ *
138
+ * Local handles are light-weight and transient and typically used in local
139
+ * operations. They are managed by HandleScopes. That means that a HandleScope
140
+ * must exist on the stack when they are created and that they are only valid
141
+ * inside of the HandleScope active during their creation. For passing a local
142
+ * handle to an outer HandleScope, an EscapableHandleScope and its Escape()
143
+ * method must be used.
144
+ *
145
+ * Persistent handles can be used when storing objects across several
146
+ * independent operations and have to be explicitly deallocated when they're no
147
+ * longer used.
148
+ *
149
+ * It is safe to extract the object stored in the handle by dereferencing the
150
+ * handle (for instance, to extract the Object* from a Local<Object>); the value
151
+ * will still be governed by a handle behind the scenes and the same rules apply
152
+ * to these values as to their handles.
153
+ */
154
+ template <class T>
155
+ class Local {
156
+ public:
157
+ V8_INLINE Local() : val_(nullptr) {}
158
+ template <class S>
159
+ V8_INLINE Local(Local<S> that) : val_(reinterpret_cast<T*>(*that)) {
160
+ /**
161
+ * This check fails when trying to convert between incompatible
162
+ * handles. For example, converting from a Local<String> to a
163
+ * Local<Number>.
164
+ */
165
+ static_assert(std::is_base_of<T, S>::value, "type check");
166
+ }
167
+
168
+ /**
169
+ * Returns true if the handle is empty.
170
+ */
171
+ V8_INLINE bool IsEmpty() const { return val_ == nullptr; }
172
+
173
+ /**
174
+ * Sets the handle to be empty. IsEmpty() will then return true.
175
+ */
176
+ V8_INLINE void Clear() { val_ = nullptr; }
177
+
178
+ V8_INLINE T* operator->() const { return val_; }
179
+
180
+ V8_INLINE T* operator*() const { return val_; }
181
+
182
+ /**
183
+ * Checks whether two handles are the same.
184
+ * Returns true if both are empty, or if the objects to which they refer
185
+ * are identical.
186
+ *
187
+ * If both handles refer to JS objects, this is the same as strict equality.
188
+ * For primitives, such as numbers or strings, a `false` return value does not
189
+ * indicate that the values aren't equal in the JavaScript sense.
190
+ * Use `Value::StrictEquals()` to check primitives for equality.
191
+ */
192
+ template <class S>
193
+ V8_INLINE bool operator==(const Local<S>& that) const {
194
+ internal::Address* a = reinterpret_cast<internal::Address*>(this->val_);
195
+ internal::Address* b = reinterpret_cast<internal::Address*>(that.val_);
196
+ if (a == nullptr) return b == nullptr;
197
+ if (b == nullptr) return false;
198
+ return *a == *b;
199
+ }
200
+
201
+ template <class S>
202
+ V8_INLINE bool operator==(const PersistentBase<S>& that) const {
203
+ internal::Address* a = reinterpret_cast<internal::Address*>(this->val_);
204
+ internal::Address* b = reinterpret_cast<internal::Address*>(that.val_);
205
+ if (a == nullptr) return b == nullptr;
206
+ if (b == nullptr) return false;
207
+ return *a == *b;
208
+ }
209
+
210
+ /**
211
+ * Checks whether two handles are different.
212
+ * Returns true if only one of the handles is empty, or if
213
+ * the objects to which they refer are different.
214
+ *
215
+ * If both handles refer to JS objects, this is the same as strict
216
+ * non-equality. For primitives, such as numbers or strings, a `true` return
217
+ * value does not indicate that the values aren't equal in the JavaScript
218
+ * sense. Use `Value::StrictEquals()` to check primitives for equality.
219
+ */
220
+ template <class S>
221
+ V8_INLINE bool operator!=(const Local<S>& that) const {
222
+ return !operator==(that);
223
+ }
224
+
225
+ template <class S>
226
+ V8_INLINE bool operator!=(const Persistent<S>& that) const {
227
+ return !operator==(that);
228
+ }
229
+
230
+ /**
231
+ * Cast a handle to a subclass, e.g. Local<Value> to Local<Object>.
232
+ * This is only valid if the handle actually refers to a value of the
233
+ * target type.
234
+ */
235
+ template <class S>
236
+ V8_INLINE static Local<T> Cast(Local<S> that) {
237
+ #ifdef V8_ENABLE_CHECKS
238
+ // If we're going to perform the type check then we have to check
239
+ // that the handle isn't empty before doing the checked cast.
240
+ if (that.IsEmpty()) return Local<T>();
241
+ #endif
242
+ return Local<T>(T::Cast(*that));
243
+ }
244
+
245
+ /**
246
+ * Calling this is equivalent to Local<S>::Cast().
247
+ * In particular, this is only valid if the handle actually refers to a value
248
+ * of the target type.
249
+ */
250
+ template <class S>
251
+ V8_INLINE Local<S> As() const {
252
+ return Local<S>::Cast(*this);
253
+ }
254
+
255
+ /**
256
+ * Create a local handle for the content of another handle.
257
+ * The referee is kept alive by the local handle even when
258
+ * the original handle is destroyed/disposed.
259
+ */
260
+ V8_INLINE static Local<T> New(Isolate* isolate, Local<T> that) {
261
+ return New(isolate, that.val_);
262
+ }
263
+
264
+ V8_INLINE static Local<T> New(Isolate* isolate,
265
+ const PersistentBase<T>& that) {
266
+ return New(isolate, that.val_);
267
+ }
268
+
269
+ V8_INLINE static Local<T> New(Isolate* isolate,
270
+ const BasicTracedReference<T>& that) {
271
+ return New(isolate, *that);
272
+ }
273
+
274
+ private:
275
+ friend class TracedReferenceBase;
276
+ friend class Utils;
277
+ template <class F>
278
+ friend class Eternal;
279
+ template <class F>
280
+ friend class PersistentBase;
281
+ template <class F, class M>
282
+ friend class Persistent;
283
+ template <class F>
284
+ friend class Local;
285
+ template <class F>
286
+ friend class MaybeLocal;
287
+ template <class F>
288
+ friend class FunctionCallbackInfo;
289
+ template <class F>
290
+ friend class PropertyCallbackInfo;
291
+ friend class String;
292
+ friend class Object;
293
+ friend class Context;
294
+ friend class Isolate;
295
+ friend class Private;
296
+ template <class F>
297
+ friend class internal::CustomArguments;
298
+ friend Local<Primitive> Undefined(Isolate* isolate);
299
+ friend Local<Primitive> Null(Isolate* isolate);
300
+ friend Local<Boolean> True(Isolate* isolate);
301
+ friend Local<Boolean> False(Isolate* isolate);
302
+ friend class HandleScope;
303
+ friend class EscapableHandleScope;
304
+ template <class F1, class F2, class F3>
305
+ friend class PersistentValueMapBase;
306
+ template <class F1, class F2>
307
+ friend class PersistentValueVector;
308
+ template <class F>
309
+ friend class ReturnValue;
310
+ template <class F>
311
+ friend class Traced;
312
+ template <class F>
313
+ friend class BasicTracedReference;
314
+ template <class F>
315
+ friend class TracedReference;
316
+
317
+ explicit V8_INLINE Local(T* that) : val_(that) {}
318
+ V8_INLINE static Local<T> New(Isolate* isolate, T* that) {
319
+ if (that == nullptr) return Local<T>();
320
+ T* that_ptr = that;
321
+ internal::Address* p = reinterpret_cast<internal::Address*>(that_ptr);
322
+ return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
323
+ reinterpret_cast<internal::Isolate*>(isolate), *p)));
324
+ }
325
+ T* val_;
326
+ };
327
+
328
+ #if !defined(V8_IMMINENT_DEPRECATION_WARNINGS)
329
+ // Handle is an alias for Local for historical reasons.
330
+ template <class T>
331
+ using Handle = Local<T>;
332
+ #endif
333
+
334
+ /**
335
+ * A MaybeLocal<> is a wrapper around Local<> that enforces a check whether
336
+ * the Local<> is empty before it can be used.
337
+ *
338
+ * If an API method returns a MaybeLocal<>, the API method can potentially fail
339
+ * either because an exception is thrown, or because an exception is pending,
340
+ * e.g. because a previous API call threw an exception that hasn't been caught
341
+ * yet, or because a TerminateExecution exception was thrown. In that case, an
342
+ * empty MaybeLocal is returned.
343
+ */
344
+ template <class T>
345
+ class MaybeLocal {
346
+ public:
347
+ V8_INLINE MaybeLocal() : val_(nullptr) {}
348
+ template <class S>
349
+ V8_INLINE MaybeLocal(Local<S> that) : val_(reinterpret_cast<T*>(*that)) {
350
+ static_assert(std::is_base_of<T, S>::value, "type check");
351
+ }
352
+
353
+ V8_INLINE bool IsEmpty() const { return val_ == nullptr; }
354
+
355
+ /**
356
+ * Converts this MaybeLocal<> to a Local<>. If this MaybeLocal<> is empty,
357
+ * |false| is returned and |out| is left untouched.
358
+ */
359
+ template <class S>
360
+ V8_WARN_UNUSED_RESULT V8_INLINE bool ToLocal(Local<S>* out) const {
361
+ out->val_ = IsEmpty() ? nullptr : this->val_;
362
+ return !IsEmpty();
363
+ }
364
+
365
+ /**
366
+ * Converts this MaybeLocal<> to a Local<>. If this MaybeLocal<> is empty,
367
+ * V8 will crash the process.
368
+ */
369
+ V8_INLINE Local<T> ToLocalChecked() {
370
+ if (V8_UNLIKELY(val_ == nullptr)) api_internal::ToLocalEmpty();
371
+ return Local<T>(val_);
372
+ }
373
+
374
+ /**
375
+ * Converts this MaybeLocal<> to a Local<>, using a default value if this
376
+ * MaybeLocal<> is empty.
377
+ */
378
+ template <class S>
379
+ V8_INLINE Local<S> FromMaybe(Local<S> default_value) const {
380
+ return IsEmpty() ? default_value : Local<S>(val_);
381
+ }
382
+
383
+ private:
384
+ T* val_;
385
+ };
386
+
387
+ /**
388
+ * A HandleScope which first allocates a handle in the current scope
389
+ * which will be later filled with the escape value.
390
+ */
391
+ class V8_EXPORT V8_NODISCARD EscapableHandleScope : public HandleScope {
392
+ public:
393
+ explicit EscapableHandleScope(Isolate* isolate);
394
+ V8_INLINE ~EscapableHandleScope() = default;
395
+
396
+ /**
397
+ * Pushes the value into the previous scope and returns a handle to it.
398
+ * Cannot be called twice.
399
+ */
400
+ template <class T>
401
+ V8_INLINE Local<T> Escape(Local<T> value) {
402
+ internal::Address* slot =
403
+ Escape(reinterpret_cast<internal::Address*>(*value));
404
+ return Local<T>(reinterpret_cast<T*>(slot));
405
+ }
406
+
407
+ template <class T>
408
+ V8_INLINE MaybeLocal<T> EscapeMaybe(MaybeLocal<T> value) {
409
+ return Escape(value.FromMaybe(Local<T>()));
410
+ }
411
+
412
+ EscapableHandleScope(const EscapableHandleScope&) = delete;
413
+ void operator=(const EscapableHandleScope&) = delete;
414
+
415
+ private:
416
+ // Declaring operator new and delete as deleted is not spec compliant.
417
+ // Therefore declare them private instead to disable dynamic alloc
418
+ void* operator new(size_t size);
419
+ void* operator new[](size_t size);
420
+ void operator delete(void*, size_t);
421
+ void operator delete[](void*, size_t);
422
+
423
+ internal::Address* Escape(internal::Address* escape_value);
424
+ internal::Address* escape_slot_;
425
+ };
426
+
427
+ /**
428
+ * A SealHandleScope acts like a handle scope in which no handle allocations
429
+ * are allowed. It can be useful for debugging handle leaks.
430
+ * Handles can be allocated within inner normal HandleScopes.
431
+ */
432
+ class V8_EXPORT V8_NODISCARD SealHandleScope {
433
+ public:
434
+ explicit SealHandleScope(Isolate* isolate);
435
+ ~SealHandleScope();
436
+
437
+ SealHandleScope(const SealHandleScope&) = delete;
438
+ void operator=(const SealHandleScope&) = delete;
439
+
440
+ private:
441
+ // Declaring operator new and delete as deleted is not spec compliant.
442
+ // Therefore declare them private instead to disable dynamic alloc
443
+ void* operator new(size_t size);
444
+ void* operator new[](size_t size);
445
+ void operator delete(void*, size_t);
446
+ void operator delete[](void*, size_t);
447
+
448
+ internal::Isolate* const isolate_;
449
+ internal::Address* prev_limit_;
450
+ int prev_sealed_level_;
451
+ };
452
+
453
+ } // namespace v8
454
+
455
+ #endif // INCLUDE_V8_LOCAL_HANDLE_H_
@@ -0,0 +1,149 @@
1
+ // Copyright 2021 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_LOCKER_H_
6
+ #define INCLUDE_V8_LOCKER_H_
7
+
8
+ #include "v8config.h" // NOLINT(build/include_directory)
9
+
10
+ namespace v8 {
11
+
12
+ namespace internal {
13
+ class Isolate;
14
+ } // namespace internal
15
+
16
+ class Isolate;
17
+
18
+ /**
19
+ * Multiple threads in V8 are allowed, but only one thread at a time is allowed
20
+ * to use any given V8 isolate, see the comments in the Isolate class. The
21
+ * definition of 'using a V8 isolate' includes accessing handles or holding onto
22
+ * object pointers obtained from V8 handles while in the particular V8 isolate.
23
+ * It is up to the user of V8 to ensure, perhaps with locking, that this
24
+ * constraint is not violated. In addition to any other synchronization
25
+ * mechanism that may be used, the v8::Locker and v8::Unlocker classes must be
26
+ * used to signal thread switches to V8.
27
+ *
28
+ * v8::Locker is a scoped lock object. While it's active, i.e. between its
29
+ * construction and destruction, the current thread is allowed to use the locked
30
+ * isolate. V8 guarantees that an isolate can be locked by at most one thread at
31
+ * any time. In other words, the scope of a v8::Locker is a critical section.
32
+ *
33
+ * Sample usage:
34
+ * \code
35
+ * ...
36
+ * {
37
+ * v8::Locker locker(isolate);
38
+ * v8::Isolate::Scope isolate_scope(isolate);
39
+ * ...
40
+ * // Code using V8 and isolate goes here.
41
+ * ...
42
+ * } // Destructor called here
43
+ * \endcode
44
+ *
45
+ * If you wish to stop using V8 in a thread A you can do this either by
46
+ * destroying the v8::Locker object as above or by constructing a v8::Unlocker
47
+ * object:
48
+ *
49
+ * \code
50
+ * {
51
+ * isolate->Exit();
52
+ * v8::Unlocker unlocker(isolate);
53
+ * ...
54
+ * // Code not using V8 goes here while V8 can run in another thread.
55
+ * ...
56
+ * } // Destructor called here.
57
+ * isolate->Enter();
58
+ * \endcode
59
+ *
60
+ * The Unlocker object is intended for use in a long-running callback from V8,
61
+ * where you want to release the V8 lock for other threads to use.
62
+ *
63
+ * The v8::Locker is a recursive lock, i.e. you can lock more than once in a
64
+ * given thread. This can be useful if you have code that can be called either
65
+ * from code that holds the lock or from code that does not. The Unlocker is
66
+ * not recursive so you can not have several Unlockers on the stack at once, and
67
+ * you cannot use an Unlocker in a thread that is not inside a Locker's scope.
68
+ *
69
+ * An unlocker will unlock several lockers if it has to and reinstate the
70
+ * correct depth of locking on its destruction, e.g.:
71
+ *
72
+ * \code
73
+ * // V8 not locked.
74
+ * {
75
+ * v8::Locker locker(isolate);
76
+ * Isolate::Scope isolate_scope(isolate);
77
+ * // V8 locked.
78
+ * {
79
+ * v8::Locker another_locker(isolate);
80
+ * // V8 still locked (2 levels).
81
+ * {
82
+ * isolate->Exit();
83
+ * v8::Unlocker unlocker(isolate);
84
+ * // V8 not locked.
85
+ * }
86
+ * isolate->Enter();
87
+ * // V8 locked again (2 levels).
88
+ * }
89
+ * // V8 still locked (1 level).
90
+ * }
91
+ * // V8 Now no longer locked.
92
+ * \endcode
93
+ */
94
+ class V8_EXPORT Unlocker {
95
+ public:
96
+ /**
97
+ * Initialize Unlocker for a given Isolate.
98
+ */
99
+ V8_INLINE explicit Unlocker(Isolate* isolate) { Initialize(isolate); }
100
+
101
+ ~Unlocker();
102
+
103
+ private:
104
+ void Initialize(Isolate* isolate);
105
+
106
+ internal::Isolate* isolate_;
107
+ };
108
+
109
+ class V8_EXPORT Locker {
110
+ public:
111
+ /**
112
+ * Initialize Locker for a given Isolate.
113
+ */
114
+ V8_INLINE explicit Locker(Isolate* isolate) { Initialize(isolate); }
115
+
116
+ ~Locker();
117
+
118
+ /**
119
+ * Returns whether or not the locker for a given isolate, is locked by the
120
+ * current thread.
121
+ */
122
+ static bool IsLocked(Isolate* isolate);
123
+
124
+ /**
125
+ * Returns whether any v8::Locker has ever been used in this process.
126
+ * TODO(cbruni, chromium:1240851): Fix locking checks on a per-thread basis.
127
+ * The current implementation is quite confusing and leads to unexpected
128
+ * results if anybody uses v8::Locker in the current process.
129
+ */
130
+ V8_DEPRECATE_SOON("This method will be removed.")
131
+ static bool WasEverUsed();
132
+ V8_DEPRECATED("Use WasEverUsed instead")
133
+ static bool IsActive();
134
+
135
+ // Disallow copying and assigning.
136
+ Locker(const Locker&) = delete;
137
+ void operator=(const Locker&) = delete;
138
+
139
+ private:
140
+ void Initialize(Isolate* isolate);
141
+
142
+ bool has_lock_;
143
+ bool top_level_;
144
+ internal::Isolate* isolate_;
145
+ };
146
+
147
+ } // namespace v8
148
+
149
+ #endif // INCLUDE_V8_LOCKER_H_