libv8-node 19.9.0.0-x86_64-linux-musl → 20.2.0.0-x86_64-linux-musl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/libv8/node/version.rb +3 -3
- data/vendor/v8/include/cppgc/cross-thread-persistent.h +4 -2
- data/vendor/v8/include/cppgc/heap-consistency.h +2 -2
- data/vendor/v8/include/cppgc/heap-handle.h +5 -0
- data/vendor/v8/include/cppgc/internal/api-constants.h +4 -1
- data/vendor/v8/include/cppgc/internal/gc-info.h +35 -33
- data/vendor/v8/include/cppgc/internal/member-storage.h +19 -7
- data/vendor/v8/include/cppgc/internal/pointer-policies.h +38 -2
- data/vendor/v8/include/cppgc/internal/write-barrier.h +15 -5
- data/vendor/v8/include/cppgc/macros.h +10 -1
- data/vendor/v8/include/cppgc/member.h +167 -129
- data/vendor/v8/include/cppgc/persistent.h +22 -15
- data/vendor/v8/include/cppgc/platform.h +6 -4
- data/vendor/v8/include/cppgc/type-traits.h +4 -3
- data/vendor/v8/include/cppgc/visitor.h +16 -1
- data/vendor/v8/include/libplatform/v8-tracing.h +2 -2
- data/vendor/v8/include/v8-array-buffer.h +59 -0
- data/vendor/v8/include/v8-callbacks.h +14 -1
- data/vendor/v8/include/v8-context.h +50 -3
- data/vendor/v8/include/v8-cppgc.h +10 -0
- data/vendor/v8/include/v8-data.h +1 -1
- data/vendor/v8/include/v8-embedder-heap.h +0 -169
- data/vendor/v8/include/v8-fast-api-calls.h +7 -3
- data/vendor/v8/include/v8-function-callback.h +69 -42
- data/vendor/v8/include/v8-function.h +1 -0
- data/vendor/v8/include/v8-inspector.h +20 -5
- data/vendor/v8/include/v8-internal.h +242 -150
- data/vendor/v8/include/v8-isolate.h +30 -40
- data/vendor/v8/include/v8-local-handle.h +81 -48
- data/vendor/v8/include/v8-metrics.h +28 -2
- data/vendor/v8/include/v8-microtask-queue.h +5 -0
- data/vendor/v8/include/v8-object.h +21 -3
- data/vendor/v8/include/v8-persistent-handle.h +25 -16
- data/vendor/v8/include/v8-platform.h +79 -10
- data/vendor/v8/include/v8-primitive.h +19 -12
- data/vendor/v8/include/v8-profiler.h +49 -31
- data/vendor/v8/include/v8-script.h +29 -1
- data/vendor/v8/include/v8-snapshot.h +4 -8
- data/vendor/v8/include/v8-template.h +3 -1
- data/vendor/v8/include/v8-traced-handle.h +22 -28
- data/vendor/v8/include/v8-util.h +9 -3
- data/vendor/v8/include/v8-value.h +31 -4
- data/vendor/v8/include/v8-version.h +4 -4
- data/vendor/v8/include/v8-wasm.h +2 -1
- data/vendor/v8/include/v8config.h +73 -2
- data/vendor/v8/x86_64-linux-musl/libv8/obj/libv8_monolith.a +0 -0
- metadata +1 -1
@@ -233,7 +233,7 @@ class V8_EXPORT Isolate {
|
|
233
233
|
* Explicitly specify a startup snapshot blob. The embedder owns the blob.
|
234
234
|
* The embedder *must* ensure that the snapshot is from a trusted source.
|
235
235
|
*/
|
236
|
-
StartupData* snapshot_blob = nullptr;
|
236
|
+
const StartupData* snapshot_blob = nullptr;
|
237
237
|
|
238
238
|
/**
|
239
239
|
* Enables the host application to provide a mechanism for recording
|
@@ -333,12 +333,9 @@ class V8_EXPORT Isolate {
|
|
333
333
|
const DisallowJavascriptExecutionScope&) = delete;
|
334
334
|
|
335
335
|
private:
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
bool was_execution_allowed_assert_;
|
340
|
-
bool was_execution_allowed_throws_;
|
341
|
-
bool was_execution_allowed_dump_;
|
336
|
+
v8::Isolate* const v8_isolate_;
|
337
|
+
const OnFailure on_failure_;
|
338
|
+
bool was_execution_allowed_;
|
342
339
|
};
|
343
340
|
|
344
341
|
/**
|
@@ -356,7 +353,7 @@ class V8_EXPORT Isolate {
|
|
356
353
|
const AllowJavascriptExecutionScope&) = delete;
|
357
354
|
|
358
355
|
private:
|
359
|
-
Isolate* v8_isolate_;
|
356
|
+
Isolate* const v8_isolate_;
|
360
357
|
bool was_execution_allowed_assert_;
|
361
358
|
bool was_execution_allowed_throws_;
|
362
359
|
bool was_execution_allowed_dump_;
|
@@ -537,6 +534,8 @@ class V8_EXPORT Isolate {
|
|
537
534
|
kTurboFanOsrCompileStarted = 115,
|
538
535
|
kAsyncStackTaggingCreateTaskCall = 116,
|
539
536
|
kDurationFormat = 117,
|
537
|
+
kInvalidatedNumberStringPrototypeNoReplaceProtector = 118,
|
538
|
+
kRegExpUnicodeSetIncompatibilitiesWithUnicodeMode = 119, // Unused.
|
540
539
|
|
541
540
|
// If you add new values here, you'll also need to update Chromium's:
|
542
541
|
// web_feature.mojom, use_counter_callback.cc, and enums.xml. V8 changes to
|
@@ -924,27 +923,10 @@ class V8_EXPORT Isolate {
|
|
924
923
|
void RemoveGCPrologueCallback(GCCallbackWithData, void* data = nullptr);
|
925
924
|
void RemoveGCPrologueCallback(GCCallback callback);
|
926
925
|
|
927
|
-
START_ALLOW_USE_DEPRECATED()
|
928
|
-
/**
|
929
|
-
* Sets the embedder heap tracer for the isolate.
|
930
|
-
* SetEmbedderHeapTracer cannot be used simultaneously with AttachCppHeap.
|
931
|
-
*/
|
932
|
-
void SetEmbedderHeapTracer(EmbedderHeapTracer* tracer);
|
933
|
-
|
934
|
-
/*
|
935
|
-
* Gets the currently active heap tracer for the isolate that was set with
|
936
|
-
* SetEmbedderHeapTracer.
|
937
|
-
*/
|
938
|
-
EmbedderHeapTracer* GetEmbedderHeapTracer();
|
939
|
-
END_ALLOW_USE_DEPRECATED()
|
940
|
-
|
941
926
|
/**
|
942
927
|
* Sets an embedder roots handle that V8 should consider when performing
|
943
|
-
* non-unified heap garbage collections.
|
944
|
-
*
|
945
|
-
* Using only EmbedderHeapTracer automatically sets up a default handler.
|
946
|
-
* The intended use case is for setting a custom handler after invoking
|
947
|
-
* `AttachCppHeap()`.
|
928
|
+
* non-unified heap garbage collections. The intended use case is for setting
|
929
|
+
* a custom handler after invoking `AttachCppHeap()`.
|
948
930
|
*
|
949
931
|
* V8 does not take ownership of the handler.
|
950
932
|
*/
|
@@ -954,22 +936,18 @@ class V8_EXPORT Isolate {
|
|
954
936
|
* Attaches a managed C++ heap as an extension to the JavaScript heap. The
|
955
937
|
* embedder maintains ownership of the CppHeap. At most one C++ heap can be
|
956
938
|
* attached to V8.
|
957
|
-
* AttachCppHeap cannot be used simultaneously with SetEmbedderHeapTracer.
|
958
939
|
*
|
959
|
-
*
|
940
|
+
* Multi-threaded use requires the use of v8::Locker/v8::Unlocker, see
|
941
|
+
* CppHeap.
|
960
942
|
*/
|
961
943
|
void AttachCppHeap(CppHeap*);
|
962
944
|
|
963
945
|
/**
|
964
946
|
* Detaches a managed C++ heap if one was attached using `AttachCppHeap()`.
|
965
|
-
*
|
966
|
-
* This is an experimental feature and may still change significantly.
|
967
947
|
*/
|
968
948
|
void DetachCppHeap();
|
969
949
|
|
970
950
|
/**
|
971
|
-
* This is an experimental feature and may still change significantly.
|
972
|
-
|
973
951
|
* \returns the C++ heap managed by V8. Only available if such a heap has been
|
974
952
|
* attached using `AttachCppHeap()`.
|
975
953
|
*/
|
@@ -1145,9 +1123,8 @@ class V8_EXPORT Isolate {
|
|
1145
1123
|
*
|
1146
1124
|
* This should only be used for testing purposes and not to enforce a garbage
|
1147
1125
|
* collection schedule. It has strong negative impact on the garbage
|
1148
|
-
* collection performance. Use
|
1149
|
-
*
|
1150
|
-
* schedule.
|
1126
|
+
* collection performance. Use MemoryPressureNotification() instead to
|
1127
|
+
* influence the garbage collection schedule.
|
1151
1128
|
*/
|
1152
1129
|
void RequestGarbageCollectionForTesting(GarbageCollectionType type);
|
1153
1130
|
|
@@ -1158,9 +1135,8 @@ class V8_EXPORT Isolate {
|
|
1158
1135
|
*
|
1159
1136
|
* This should only be used for testing purposes and not to enforce a garbage
|
1160
1137
|
* collection schedule. It has strong negative impact on the garbage
|
1161
|
-
* collection performance. Use
|
1162
|
-
*
|
1163
|
-
* schedule.
|
1138
|
+
* collection performance. Use MemoryPressureNotification() instead to
|
1139
|
+
* influence the garbage collection schedule.
|
1164
1140
|
*/
|
1165
1141
|
void RequestGarbageCollectionForTesting(GarbageCollectionType type,
|
1166
1142
|
StackState stack_state);
|
@@ -1312,6 +1288,8 @@ class V8_EXPORT Isolate {
|
|
1312
1288
|
* that function. There is no guarantee that the actual work will be done
|
1313
1289
|
* within the time limit.
|
1314
1290
|
*/
|
1291
|
+
V8_DEPRECATE_SOON(
|
1292
|
+
"Use MemoryPressureNotification() to influence the GC schedule.")
|
1315
1293
|
bool IdleNotificationDeadline(double deadline_in_seconds);
|
1316
1294
|
|
1317
1295
|
/**
|
@@ -1348,11 +1326,13 @@ class V8_EXPORT Isolate {
|
|
1348
1326
|
* V8 uses this notification to guide heuristics which may result in a
|
1349
1327
|
* smaller memory footprint at the cost of reduced runtime performance.
|
1350
1328
|
*/
|
1329
|
+
V8_DEPRECATED("Use IsolateInBackgroundNotification() instead")
|
1351
1330
|
void EnableMemorySavingsMode();
|
1352
1331
|
|
1353
1332
|
/**
|
1354
1333
|
* Optional notification which will disable the memory savings mode.
|
1355
1334
|
*/
|
1335
|
+
V8_DEPRECATED("Use IsolateInBackgroundNotification() instead")
|
1356
1336
|
void DisableMemorySavingsMode();
|
1357
1337
|
|
1358
1338
|
/**
|
@@ -1526,10 +1506,19 @@ class V8_EXPORT Isolate {
|
|
1526
1506
|
|
1527
1507
|
void SetWasmLoadSourceMapCallback(WasmLoadSourceMapCallback callback);
|
1528
1508
|
|
1509
|
+
V8_DEPRECATED("Wasm SIMD is always enabled")
|
1529
1510
|
void SetWasmSimdEnabledCallback(WasmSimdEnabledCallback callback);
|
1530
1511
|
|
1512
|
+
V8_DEPRECATED("Wasm exceptions are always enabled")
|
1531
1513
|
void SetWasmExceptionsEnabledCallback(WasmExceptionsEnabledCallback callback);
|
1532
1514
|
|
1515
|
+
/**
|
1516
|
+
* Register callback to control whehter Wasm GC is enabled.
|
1517
|
+
* The callback overwrites the value of the flag.
|
1518
|
+
* If the callback returns true, it will also enable Wasm stringrefs.
|
1519
|
+
*/
|
1520
|
+
void SetWasmGCEnabledCallback(WasmGCEnabledCallback callback);
|
1521
|
+
|
1533
1522
|
void SetSharedArrayBufferConstructorEnabledCallback(
|
1534
1523
|
SharedArrayBufferConstructorEnabledCallback callback);
|
1535
1524
|
|
@@ -1684,7 +1673,8 @@ uint32_t Isolate::GetNumberOfDataSlots() {
|
|
1684
1673
|
|
1685
1674
|
template <class T>
|
1686
1675
|
MaybeLocal<T> Isolate::GetDataFromSnapshotOnce(size_t index) {
|
1687
|
-
T* data =
|
1676
|
+
T* data =
|
1677
|
+
internal::ValueHelper::SlotAsValue<T>(GetDataFromSnapshotOnce(index));
|
1688
1678
|
if (data) internal::PerformCastCheck(data);
|
1689
1679
|
return Local<T>(data);
|
1690
1680
|
}
|
@@ -50,9 +50,14 @@ class TracedReference;
|
|
50
50
|
class TracedReferenceBase;
|
51
51
|
class Utils;
|
52
52
|
|
53
|
+
namespace debug {
|
54
|
+
class ConsoleCallArguments;
|
55
|
+
}
|
56
|
+
|
53
57
|
namespace internal {
|
54
58
|
template <typename T>
|
55
59
|
class CustomArguments;
|
60
|
+
class SamplingHeapProfiler;
|
56
61
|
} // namespace internal
|
57
62
|
|
58
63
|
namespace api_internal {
|
@@ -92,6 +97,9 @@ class V8_EXPORT V8_NODISCARD HandleScope {
|
|
92
97
|
HandleScope(const HandleScope&) = delete;
|
93
98
|
void operator=(const HandleScope&) = delete;
|
94
99
|
|
100
|
+
static internal::Address* CreateHandleForCurrentIsolate(
|
101
|
+
internal::Address value);
|
102
|
+
|
95
103
|
protected:
|
96
104
|
V8_INLINE HandleScope() = default;
|
97
105
|
|
@@ -122,6 +130,33 @@ class V8_EXPORT V8_NODISCARD HandleScope {
|
|
122
130
|
friend class Context;
|
123
131
|
};
|
124
132
|
|
133
|
+
namespace internal {
|
134
|
+
|
135
|
+
/**
|
136
|
+
* Helper functions about handles.
|
137
|
+
*/
|
138
|
+
class HandleHelper final {
|
139
|
+
public:
|
140
|
+
/**
|
141
|
+
* Checks whether two handles are equal.
|
142
|
+
* They are equal iff they are both empty or they are both non-empty and the
|
143
|
+
* objects to which they refer are physically equal.
|
144
|
+
*
|
145
|
+
* If both handles refer to JS objects, this is the same as strict equality.
|
146
|
+
* For primitives, such as numbers or strings, a `false` return value does not
|
147
|
+
* indicate that the values aren't equal in the JavaScript sense.
|
148
|
+
* Use `Value::StrictEquals()` to check primitives for equality.
|
149
|
+
*/
|
150
|
+
template <typename T1, typename T2>
|
151
|
+
V8_INLINE static bool EqualHandles(const T1& lhs, const T2& rhs) {
|
152
|
+
if (lhs.IsEmpty()) return rhs.IsEmpty();
|
153
|
+
if (rhs.IsEmpty()) return false;
|
154
|
+
return lhs.address() == rhs.address();
|
155
|
+
}
|
156
|
+
};
|
157
|
+
|
158
|
+
} // namespace internal
|
159
|
+
|
125
160
|
/**
|
126
161
|
* An object reference managed by the v8 garbage collector.
|
127
162
|
*
|
@@ -154,7 +189,8 @@ class V8_EXPORT V8_NODISCARD HandleScope {
|
|
154
189
|
template <class T>
|
155
190
|
class Local {
|
156
191
|
public:
|
157
|
-
V8_INLINE Local() : val_(
|
192
|
+
V8_INLINE Local() : val_(internal::ValueHelper::EmptyValue<T>()) {}
|
193
|
+
|
158
194
|
template <class S>
|
159
195
|
V8_INLINE Local(Local<S> that) : val_(reinterpret_cast<T*>(*that)) {
|
160
196
|
/**
|
@@ -168,55 +204,40 @@ class Local {
|
|
168
204
|
/**
|
169
205
|
* Returns true if the handle is empty.
|
170
206
|
*/
|
171
|
-
V8_INLINE bool IsEmpty() const {
|
207
|
+
V8_INLINE bool IsEmpty() const {
|
208
|
+
return val_ == internal::ValueHelper::EmptyValue<T>();
|
209
|
+
}
|
172
210
|
|
173
211
|
/**
|
174
212
|
* Sets the handle to be empty. IsEmpty() will then return true.
|
175
213
|
*/
|
176
|
-
V8_INLINE void Clear() { val_ =
|
214
|
+
V8_INLINE void Clear() { val_ = internal::ValueHelper::EmptyValue<T>(); }
|
177
215
|
|
178
216
|
V8_INLINE T* operator->() const { return val_; }
|
179
217
|
|
180
218
|
V8_INLINE T* operator*() const { return val_; }
|
181
219
|
|
182
220
|
/**
|
183
|
-
* Checks whether two handles are
|
184
|
-
*
|
185
|
-
* are
|
221
|
+
* Checks whether two handles are equal or different.
|
222
|
+
* They are equal iff they are both empty or they are both non-empty and the
|
223
|
+
* objects to which they refer are physically equal.
|
186
224
|
*
|
187
|
-
* If both handles refer to JS objects, this is the same as strict
|
188
|
-
* For primitives, such as numbers or strings, a `
|
189
|
-
* indicate that the values aren't equal in the JavaScript
|
190
|
-
* Use `Value::StrictEquals()` to check primitives for equality.
|
225
|
+
* If both handles refer to JS objects, this is the same as strict
|
226
|
+
* non-equality. For primitives, such as numbers or strings, a `true` return
|
227
|
+
* value does not indicate that the values aren't equal in the JavaScript
|
228
|
+
* sense. Use `Value::StrictEquals()` to check primitives for equality.
|
191
229
|
*/
|
230
|
+
|
192
231
|
template <class S>
|
193
232
|
V8_INLINE bool operator==(const Local<S>& that) const {
|
194
|
-
|
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;
|
233
|
+
return internal::HandleHelper::EqualHandles(*this, that);
|
199
234
|
}
|
200
235
|
|
201
236
|
template <class S>
|
202
237
|
V8_INLINE bool operator==(const PersistentBase<S>& that) const {
|
203
|
-
|
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;
|
238
|
+
return internal::HandleHelper::EqualHandles(*this, that);
|
208
239
|
}
|
209
240
|
|
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
241
|
template <class S>
|
221
242
|
V8_INLINE bool operator!=(const Local<S>& that) const {
|
222
243
|
return !operator==(that);
|
@@ -263,12 +284,12 @@ class Local {
|
|
263
284
|
|
264
285
|
V8_INLINE static Local<T> New(Isolate* isolate,
|
265
286
|
const PersistentBase<T>& that) {
|
266
|
-
return New(isolate, that.val_);
|
287
|
+
return New(isolate, internal::ValueHelper::SlotAsValue<T>(that.val_));
|
267
288
|
}
|
268
289
|
|
269
290
|
V8_INLINE static Local<T> New(Isolate* isolate,
|
270
291
|
const BasicTracedReference<T>& that) {
|
271
|
-
return New(isolate, *that);
|
292
|
+
return New(isolate, internal::ValueHelper::SlotAsValue<T>(*that));
|
272
293
|
}
|
273
294
|
|
274
295
|
private:
|
@@ -277,12 +298,6 @@ class Local {
|
|
277
298
|
template <class F>
|
278
299
|
friend class Eternal;
|
279
300
|
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
301
|
friend class MaybeLocal;
|
287
302
|
template <class F>
|
288
303
|
friend class FunctionCallbackInfo;
|
@@ -309,19 +324,31 @@ class Local {
|
|
309
324
|
friend class ReturnValue;
|
310
325
|
template <class F>
|
311
326
|
friend class Traced;
|
312
|
-
|
313
|
-
friend class
|
314
|
-
|
315
|
-
friend class TracedReference;
|
327
|
+
friend class internal::SamplingHeapProfiler;
|
328
|
+
friend class internal::HandleHelper;
|
329
|
+
friend class debug::ConsoleCallArguments;
|
316
330
|
|
317
331
|
explicit V8_INLINE Local(T* that) : val_(that) {}
|
332
|
+
|
333
|
+
V8_INLINE internal::Address address() const {
|
334
|
+
return internal::ValueHelper::ValueAsAddress(val_);
|
335
|
+
}
|
336
|
+
|
337
|
+
V8_INLINE static Local<T> FromSlot(internal::Address* slot) {
|
338
|
+
return Local<T>(internal::ValueHelper::SlotAsValue<T>(slot));
|
339
|
+
}
|
340
|
+
|
318
341
|
V8_INLINE static Local<T> New(Isolate* isolate, T* that) {
|
342
|
+
#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
|
343
|
+
return Local<T>(that);
|
344
|
+
#else
|
319
345
|
if (that == nullptr) return Local<T>();
|
320
|
-
|
321
|
-
internal::Address* p = reinterpret_cast<internal::Address*>(that_ptr);
|
346
|
+
internal::Address* p = reinterpret_cast<internal::Address*>(that);
|
322
347
|
return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
|
323
348
|
reinterpret_cast<internal::Isolate*>(isolate), *p)));
|
349
|
+
#endif
|
324
350
|
}
|
351
|
+
|
325
352
|
T* val_;
|
326
353
|
};
|
327
354
|
|
@@ -344,13 +371,15 @@ using Handle = Local<T>;
|
|
344
371
|
template <class T>
|
345
372
|
class MaybeLocal {
|
346
373
|
public:
|
347
|
-
V8_INLINE MaybeLocal() : val_(
|
374
|
+
V8_INLINE MaybeLocal() : val_(internal::ValueHelper::EmptyValue<T>()) {}
|
348
375
|
template <class S>
|
349
376
|
V8_INLINE MaybeLocal(Local<S> that) : val_(reinterpret_cast<T*>(*that)) {
|
350
377
|
static_assert(std::is_base_of<T, S>::value, "type check");
|
351
378
|
}
|
352
379
|
|
353
|
-
V8_INLINE bool IsEmpty() const {
|
380
|
+
V8_INLINE bool IsEmpty() const {
|
381
|
+
return val_ == internal::ValueHelper::EmptyValue<T>();
|
382
|
+
}
|
354
383
|
|
355
384
|
/**
|
356
385
|
* Converts this MaybeLocal<> to a Local<>. If this MaybeLocal<> is empty,
|
@@ -358,7 +387,7 @@ class MaybeLocal {
|
|
358
387
|
*/
|
359
388
|
template <class S>
|
360
389
|
V8_WARN_UNUSED_RESULT V8_INLINE bool ToLocal(Local<S>* out) const {
|
361
|
-
out->val_ = IsEmpty() ?
|
390
|
+
out->val_ = IsEmpty() ? internal::ValueHelper::EmptyValue<T>() : this->val_;
|
362
391
|
return !IsEmpty();
|
363
392
|
}
|
364
393
|
|
@@ -367,7 +396,7 @@ class MaybeLocal {
|
|
367
396
|
* V8 will crash the process.
|
368
397
|
*/
|
369
398
|
V8_INLINE Local<T> ToLocalChecked() {
|
370
|
-
if (V8_UNLIKELY(
|
399
|
+
if (V8_UNLIKELY(IsEmpty())) api_internal::ToLocalEmpty();
|
371
400
|
return Local<T>(val_);
|
372
401
|
}
|
373
402
|
|
@@ -399,9 +428,13 @@ class V8_EXPORT V8_NODISCARD EscapableHandleScope : public HandleScope {
|
|
399
428
|
*/
|
400
429
|
template <class T>
|
401
430
|
V8_INLINE Local<T> Escape(Local<T> value) {
|
431
|
+
#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
|
432
|
+
return value;
|
433
|
+
#else
|
402
434
|
internal::Address* slot =
|
403
435
|
Escape(reinterpret_cast<internal::Address*>(*value));
|
404
436
|
return Local<T>(reinterpret_cast<T*>(slot));
|
437
|
+
#endif
|
405
438
|
}
|
406
439
|
|
407
440
|
template <class T>
|
@@ -12,6 +12,7 @@
|
|
12
12
|
|
13
13
|
#include "v8-internal.h" // NOLINT(build/include_directory)
|
14
14
|
#include "v8-local-handle.h" // NOLINT(build/include_directory)
|
15
|
+
#include "v8config.h" // NOLINT(build/include_directory)
|
15
16
|
|
16
17
|
namespace v8 {
|
17
18
|
|
@@ -96,16 +97,42 @@ struct GarbageCollectionYoungCycle {
|
|
96
97
|
};
|
97
98
|
|
98
99
|
struct WasmModuleDecoded {
|
100
|
+
WasmModuleDecoded() = default;
|
101
|
+
WasmModuleDecoded(bool async, bool streamed, bool success,
|
102
|
+
size_t module_size_in_bytes, size_t function_count,
|
103
|
+
int64_t wall_clock_duration_in_us)
|
104
|
+
: async(async),
|
105
|
+
streamed(streamed),
|
106
|
+
success(success),
|
107
|
+
module_size_in_bytes(module_size_in_bytes),
|
108
|
+
function_count(function_count),
|
109
|
+
wall_clock_duration_in_us(wall_clock_duration_in_us) {}
|
110
|
+
|
99
111
|
bool async = false;
|
100
112
|
bool streamed = false;
|
101
113
|
bool success = false;
|
102
114
|
size_t module_size_in_bytes = 0;
|
103
115
|
size_t function_count = 0;
|
104
116
|
int64_t wall_clock_duration_in_us = -1;
|
105
|
-
int64_t cpu_duration_in_us = -1;
|
106
117
|
};
|
107
118
|
|
108
119
|
struct WasmModuleCompiled {
|
120
|
+
WasmModuleCompiled() = default;
|
121
|
+
|
122
|
+
WasmModuleCompiled(bool async, bool streamed, bool cached, bool deserialized,
|
123
|
+
bool lazy, bool success, size_t code_size_in_bytes,
|
124
|
+
size_t liftoff_bailout_count,
|
125
|
+
int64_t wall_clock_duration_in_us)
|
126
|
+
: async(async),
|
127
|
+
streamed(streamed),
|
128
|
+
cached(cached),
|
129
|
+
deserialized(deserialized),
|
130
|
+
lazy(lazy),
|
131
|
+
success(success),
|
132
|
+
code_size_in_bytes(code_size_in_bytes),
|
133
|
+
liftoff_bailout_count(liftoff_bailout_count),
|
134
|
+
wall_clock_duration_in_us(wall_clock_duration_in_us) {}
|
135
|
+
|
109
136
|
bool async = false;
|
110
137
|
bool streamed = false;
|
111
138
|
bool cached = false;
|
@@ -115,7 +142,6 @@ struct WasmModuleCompiled {
|
|
115
142
|
size_t code_size_in_bytes = 0;
|
116
143
|
size_t liftoff_bailout_count = 0;
|
117
144
|
int64_t wall_clock_duration_in_us = -1;
|
118
|
-
int64_t cpu_duration_in_us = -1;
|
119
145
|
};
|
120
146
|
|
121
147
|
struct WasmModuleInstantiated {
|
@@ -118,7 +118,12 @@ class V8_EXPORT V8_NODISCARD MicrotasksScope {
|
|
118
118
|
public:
|
119
119
|
enum Type { kRunMicrotasks, kDoNotRunMicrotasks };
|
120
120
|
|
121
|
+
V8_DEPRECATE_SOON(
|
122
|
+
"May be incorrect if context was created with non-default microtask "
|
123
|
+
"queue")
|
121
124
|
MicrotasksScope(Isolate* isolate, Type type);
|
125
|
+
|
126
|
+
MicrotasksScope(Local<Context> context, Type type);
|
122
127
|
MicrotasksScope(Isolate* isolate, MicrotaskQueue* microtask_queue, Type type);
|
123
128
|
~MicrotasksScope();
|
124
129
|
|
@@ -607,6 +607,19 @@ class V8_EXPORT Object : public Value {
|
|
607
607
|
return object.val_->GetCreationContext();
|
608
608
|
}
|
609
609
|
|
610
|
+
/**
|
611
|
+
* Gets the context in which the object was created (see GetCreationContext())
|
612
|
+
* and if it's available reads respective embedder field value.
|
613
|
+
* If the context can't be obtained nullptr is returned.
|
614
|
+
* Basically it's a shortcut for
|
615
|
+
* obj->GetCreationContext().GetAlignedPointerFromEmbedderData(index)
|
616
|
+
* which doesn't create a handle for Context object on the way and doesn't
|
617
|
+
* try to expand the embedder data attached to the context.
|
618
|
+
* In case the Local<Context> is already available because of other reasons,
|
619
|
+
* it's fine to keep using Context::GetAlignedPointerFromEmbedderData().
|
620
|
+
*/
|
621
|
+
void* GetAlignedPointerFromEmbedderDataInCreationContext(int index);
|
622
|
+
|
610
623
|
/**
|
611
624
|
* Checks whether a callback is set by the
|
612
625
|
* ObjectTemplate::SetCallAsFunctionHandler method.
|
@@ -707,7 +720,7 @@ Local<Value> Object::GetInternalField(int index) {
|
|
707
720
|
#ifndef V8_ENABLE_CHECKS
|
708
721
|
using A = internal::Address;
|
709
722
|
using I = internal::Internals;
|
710
|
-
A obj =
|
723
|
+
A obj = internal::ValueHelper::ValueAsAddress(this);
|
711
724
|
// Fast path: If the object is a plain JSObject, which is the common case, we
|
712
725
|
// know where to find the internal fields and can return the value directly.
|
713
726
|
int instance_type = I::GetInstanceType(obj);
|
@@ -717,12 +730,17 @@ Local<Value> Object::GetInternalField(int index) {
|
|
717
730
|
#ifdef V8_COMPRESS_POINTERS
|
718
731
|
// We read the full pointer value and then decompress it in order to avoid
|
719
732
|
// dealing with potential endiannes issues.
|
720
|
-
value = I::
|
733
|
+
value = I::DecompressTaggedField(obj, static_cast<uint32_t>(value));
|
721
734
|
#endif
|
735
|
+
|
736
|
+
#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
|
737
|
+
return Local<Value>(reinterpret_cast<Value*>(value));
|
738
|
+
#else
|
722
739
|
internal::Isolate* isolate =
|
723
740
|
internal::IsolateFromNeverReadOnlySpaceObject(obj);
|
724
741
|
A* result = HandleScope::CreateHandle(isolate, value);
|
725
742
|
return Local<Value>(reinterpret_cast<Value*>(result));
|
743
|
+
#endif
|
726
744
|
}
|
727
745
|
#endif
|
728
746
|
return SlowGetInternalField(index);
|
@@ -732,7 +750,7 @@ void* Object::GetAlignedPointerFromInternalField(int index) {
|
|
732
750
|
#if !defined(V8_ENABLE_CHECKS)
|
733
751
|
using A = internal::Address;
|
734
752
|
using I = internal::Internals;
|
735
|
-
A obj =
|
753
|
+
A obj = internal::ValueHelper::ValueAsAddress(this);
|
736
754
|
// Fast path: If the object is a plain JSObject, which is the common case, we
|
737
755
|
// know where to find the internal fields and can return the value directly.
|
738
756
|
auto instance_type = I::GetInstanceType(obj);
|
@@ -55,7 +55,7 @@ class Eternal {
|
|
55
55
|
V8_INLINE Local<T> Get(Isolate* isolate) const {
|
56
56
|
// The eternal handle will never go away, so as with the roots, we don't
|
57
57
|
// even need to open a handle.
|
58
|
-
return Local<T>(val_);
|
58
|
+
return Local<T>(internal::ValueHelper::SlotAsValue<T>(val_));
|
59
59
|
}
|
60
60
|
|
61
61
|
V8_INLINE bool IsEmpty() const { return val_ == nullptr; }
|
@@ -68,6 +68,10 @@ class Eternal {
|
|
68
68
|
}
|
69
69
|
|
70
70
|
private:
|
71
|
+
V8_INLINE internal::Address address() const {
|
72
|
+
return *reinterpret_cast<internal::Address*>(val_);
|
73
|
+
}
|
74
|
+
|
71
75
|
T* val_;
|
72
76
|
};
|
73
77
|
|
@@ -122,20 +126,12 @@ class PersistentBase {
|
|
122
126
|
|
123
127
|
template <class S>
|
124
128
|
V8_INLINE bool operator==(const PersistentBase<S>& that) const {
|
125
|
-
|
126
|
-
internal::Address* b = reinterpret_cast<internal::Address*>(that.val_);
|
127
|
-
if (a == nullptr) return b == nullptr;
|
128
|
-
if (b == nullptr) return false;
|
129
|
-
return *a == *b;
|
129
|
+
return internal::HandleHelper::EqualHandles(*this, that);
|
130
130
|
}
|
131
131
|
|
132
132
|
template <class S>
|
133
133
|
V8_INLINE bool operator==(const Local<S>& that) const {
|
134
|
-
|
135
|
-
internal::Address* b = reinterpret_cast<internal::Address*>(that.val_);
|
136
|
-
if (a == nullptr) return b == nullptr;
|
137
|
-
if (b == nullptr) return false;
|
138
|
-
return *a == *b;
|
134
|
+
return internal::HandleHelper::EqualHandles(*this, that);
|
139
135
|
}
|
140
136
|
|
141
137
|
template <class S>
|
@@ -221,8 +217,15 @@ class PersistentBase {
|
|
221
217
|
template <class F1, class F2>
|
222
218
|
friend class PersistentValueVector;
|
223
219
|
friend class Object;
|
220
|
+
friend class internal::HandleHelper;
|
224
221
|
|
225
222
|
explicit V8_INLINE PersistentBase(T* val) : val_(val) {}
|
223
|
+
V8_INLINE T* operator*() const { return this->val_; }
|
224
|
+
V8_INLINE internal::Address address() const {
|
225
|
+
return *reinterpret_cast<internal::Address*>(val_);
|
226
|
+
}
|
227
|
+
|
228
|
+
V8_INLINE static T* New(Isolate* isolate, Local<T> that);
|
226
229
|
V8_INLINE static T* New(Isolate* isolate, T* that);
|
227
230
|
|
228
231
|
T* val_;
|
@@ -282,11 +285,13 @@ class Persistent : public PersistentBase<T> {
|
|
282
285
|
* When the Local is non-empty, a new storage cell is created
|
283
286
|
* pointing to the same object, and no flags are set.
|
284
287
|
*/
|
288
|
+
|
285
289
|
template <class S>
|
286
290
|
V8_INLINE Persistent(Isolate* isolate, Local<S> that)
|
287
|
-
: PersistentBase<T>(PersistentBase<T>::New(isolate,
|
291
|
+
: PersistentBase<T>(PersistentBase<T>::New(isolate, that)) {
|
288
292
|
static_assert(std::is_base_of<T, S>::value, "type check");
|
289
293
|
}
|
294
|
+
|
290
295
|
/**
|
291
296
|
* Construct a Persistent from a Persistent.
|
292
297
|
* When the Persistent is non-empty, a new storage cell is created
|
@@ -356,7 +361,6 @@ class Persistent : public PersistentBase<T> {
|
|
356
361
|
friend class ReturnValue;
|
357
362
|
|
358
363
|
explicit V8_INLINE Persistent(T* that) : PersistentBase<T>(that) {}
|
359
|
-
V8_INLINE T* operator*() const { return this->val_; }
|
360
364
|
template <class S, class M2>
|
361
365
|
V8_INLINE void Copy(const Persistent<S, M2>& that);
|
362
366
|
};
|
@@ -381,7 +385,7 @@ class Global : public PersistentBase<T> {
|
|
381
385
|
*/
|
382
386
|
template <class S>
|
383
387
|
V8_INLINE Global(Isolate* isolate, Local<S> that)
|
384
|
-
: PersistentBase<T>(PersistentBase<T>::New(isolate,
|
388
|
+
: PersistentBase<T>(PersistentBase<T>::New(isolate, that)) {
|
385
389
|
static_assert(std::is_base_of<T, S>::value, "type check");
|
386
390
|
}
|
387
391
|
|
@@ -425,7 +429,6 @@ class Global : public PersistentBase<T> {
|
|
425
429
|
private:
|
426
430
|
template <class F>
|
427
431
|
friend class ReturnValue;
|
428
|
-
V8_INLINE T* operator*() const { return this->val_; }
|
429
432
|
};
|
430
433
|
|
431
434
|
// UniquePersistent is an alias for Global for historical reason.
|
@@ -442,6 +445,12 @@ class V8_EXPORT PersistentHandleVisitor {
|
|
442
445
|
uint16_t class_id) {}
|
443
446
|
};
|
444
447
|
|
448
|
+
template <class T>
|
449
|
+
T* PersistentBase<T>::New(Isolate* isolate, Local<T> that) {
|
450
|
+
return PersistentBase<T>::New(isolate,
|
451
|
+
internal::ValueHelper::ValueAsSlot(*that));
|
452
|
+
}
|
453
|
+
|
445
454
|
template <class T>
|
446
455
|
T* PersistentBase<T>::New(Isolate* isolate, T* that) {
|
447
456
|
if (that == nullptr) return nullptr;
|
@@ -486,7 +495,7 @@ void PersistentBase<T>::Reset(Isolate* isolate, const Local<S>& other) {
|
|
486
495
|
static_assert(std::is_base_of<T, S>::value, "type check");
|
487
496
|
Reset();
|
488
497
|
if (other.IsEmpty()) return;
|
489
|
-
this->val_ = New(isolate, other
|
498
|
+
this->val_ = New(isolate, internal::ValueHelper::ValueAsSlot(*other));
|
490
499
|
}
|
491
500
|
|
492
501
|
/**
|