libv8-node 18.13.0.1-x86_64-linux-musl → 20.2.0.0-x86_64-linux-musl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/lib/libv8/node/version.rb +3 -3
  3. data/vendor/v8/include/cppgc/common.h +0 -1
  4. data/vendor/v8/include/cppgc/cross-thread-persistent.h +11 -10
  5. data/vendor/v8/include/cppgc/heap-consistency.h +46 -3
  6. data/vendor/v8/include/cppgc/heap-handle.h +48 -0
  7. data/vendor/v8/include/cppgc/heap-statistics.h +2 -2
  8. data/vendor/v8/include/cppgc/heap.h +3 -7
  9. data/vendor/v8/include/cppgc/internal/api-constants.h +14 -1
  10. data/vendor/v8/include/cppgc/internal/base-page-handle.h +45 -0
  11. data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +40 -8
  12. data/vendor/v8/include/cppgc/internal/caged-heap.h +61 -0
  13. data/vendor/v8/include/cppgc/internal/gc-info.h +35 -34
  14. data/vendor/v8/include/cppgc/internal/member-storage.h +248 -0
  15. data/vendor/v8/include/cppgc/internal/name-trait.h +21 -6
  16. data/vendor/v8/include/cppgc/internal/persistent-node.h +11 -13
  17. data/vendor/v8/include/cppgc/internal/pointer-policies.h +65 -8
  18. data/vendor/v8/include/cppgc/internal/write-barrier.h +153 -101
  19. data/vendor/v8/include/cppgc/liveness-broker.h +8 -7
  20. data/vendor/v8/include/cppgc/macros.h +10 -1
  21. data/vendor/v8/include/cppgc/member.h +424 -111
  22. data/vendor/v8/include/cppgc/name-provider.h +4 -4
  23. data/vendor/v8/include/cppgc/persistent.h +27 -24
  24. data/vendor/v8/include/cppgc/platform.h +7 -5
  25. data/vendor/v8/include/cppgc/sentinel-pointer.h +1 -1
  26. data/vendor/v8/include/cppgc/trace-trait.h +4 -0
  27. data/vendor/v8/include/cppgc/type-traits.h +13 -3
  28. data/vendor/v8/include/cppgc/visitor.h +104 -57
  29. data/vendor/v8/include/libplatform/v8-tracing.h +2 -2
  30. data/vendor/v8/include/v8-array-buffer.h +59 -0
  31. data/vendor/v8/include/v8-callbacks.h +32 -5
  32. data/vendor/v8/include/v8-context.h +63 -11
  33. data/vendor/v8/include/v8-cppgc.h +22 -0
  34. data/vendor/v8/include/v8-data.h +1 -1
  35. data/vendor/v8/include/v8-date.h +5 -0
  36. data/vendor/v8/include/v8-embedder-heap.h +0 -164
  37. data/vendor/v8/include/v8-exception.h +1 -1
  38. data/vendor/v8/include/v8-fast-api-calls.h +49 -31
  39. data/vendor/v8/include/v8-function-callback.h +69 -42
  40. data/vendor/v8/include/v8-function.h +9 -0
  41. data/vendor/v8/include/v8-initialization.h +23 -49
  42. data/vendor/v8/include/v8-inspector.h +32 -11
  43. data/vendor/v8/include/v8-internal.h +480 -183
  44. data/vendor/v8/include/v8-isolate.h +52 -77
  45. data/vendor/v8/include/v8-local-handle.h +86 -53
  46. data/vendor/v8/include/v8-locker.h +0 -11
  47. data/vendor/v8/include/v8-maybe.h +24 -1
  48. data/vendor/v8/include/v8-message.h +2 -4
  49. data/vendor/v8/include/v8-metrics.h +48 -40
  50. data/vendor/v8/include/v8-microtask-queue.h +6 -1
  51. data/vendor/v8/include/v8-object.h +29 -18
  52. data/vendor/v8/include/v8-persistent-handle.h +25 -18
  53. data/vendor/v8/include/v8-platform.h +133 -35
  54. data/vendor/v8/include/v8-primitive.h +27 -20
  55. data/vendor/v8/include/v8-profiler.h +133 -53
  56. data/vendor/v8/include/v8-regexp.h +2 -1
  57. data/vendor/v8/include/v8-script.h +91 -7
  58. data/vendor/v8/include/v8-snapshot.h +4 -8
  59. data/vendor/v8/include/v8-template.h +16 -77
  60. data/vendor/v8/include/v8-traced-handle.h +22 -28
  61. data/vendor/v8/include/v8-unwinder-state.h +4 -4
  62. data/vendor/v8/include/v8-util.h +11 -7
  63. data/vendor/v8/include/v8-value-serializer.h +46 -23
  64. data/vendor/v8/include/v8-value.h +31 -4
  65. data/vendor/v8/include/v8-version.h +4 -4
  66. data/vendor/v8/include/v8-wasm.h +7 -63
  67. data/vendor/v8/include/v8-weak-callback-info.h +0 -7
  68. data/vendor/v8/include/v8config.h +353 -15
  69. data/vendor/v8/x86_64-linux-musl/libv8/obj/libv8_monolith.a +0 -0
  70. metadata +5 -1
@@ -11,6 +11,7 @@
11
11
  #include <memory>
12
12
  #include <vector>
13
13
 
14
+ #include "v8-callbacks.h" // NOLINT(build/include_directory)
14
15
  #include "v8-data.h" // NOLINT(build/include_directory)
15
16
  #include "v8-local-handle.h" // NOLINT(build/include_directory)
16
17
  #include "v8-maybe.h" // NOLINT(build/include_directory)
@@ -20,6 +21,7 @@
20
21
  namespace v8 {
21
22
 
22
23
  class Function;
24
+ class Message;
23
25
  class Object;
24
26
  class PrimitiveArray;
25
27
  class Script;
@@ -47,8 +49,6 @@ class V8_EXPORT ScriptOrModule {
47
49
  * The options that were passed by the embedder as HostDefinedOptions to
48
50
  * the ScriptOrigin.
49
51
  */
50
- V8_DEPRECATED("Use HostDefinedOptions")
51
- Local<PrimitiveArray> GetHostDefinedOptions();
52
52
  Local<Data> HostDefinedOptions();
53
53
  };
54
54
 
@@ -78,7 +78,13 @@ class V8_EXPORT UnboundScript {
78
78
  * Returns zero based line number of the code_pos location in the script.
79
79
  * -1 will be returned if no information available.
80
80
  */
81
- int GetLineNumber(int code_pos);
81
+ int GetLineNumber(int code_pos = 0);
82
+
83
+ /**
84
+ * Returns zero based column number of the code_pos location in the script.
85
+ * -1 will be returned if no information available.
86
+ */
87
+ int GetColumnNumber(int code_pos = 0);
82
88
 
83
89
  static const int kNoScriptId = 0;
84
90
  };
@@ -87,7 +93,15 @@ class V8_EXPORT UnboundScript {
87
93
  * A compiled JavaScript module, not yet tied to a Context.
88
94
  */
89
95
  class V8_EXPORT UnboundModuleScript : public Data {
90
- // Only used as a container for code caching.
96
+ public:
97
+ /**
98
+ * Data read from magic sourceURL comments.
99
+ */
100
+ Local<Value> GetSourceURL();
101
+ /**
102
+ * Data read from magic sourceMappingURL comments.
103
+ */
104
+ Local<Value> GetSourceMappingURL();
91
105
  };
92
106
 
93
107
  /**
@@ -286,6 +300,16 @@ class V8_EXPORT Module : public Data {
286
300
  V8_WARN_UNUSED_RESULT Maybe<bool> SetSyntheticModuleExport(
287
301
  Isolate* isolate, Local<String> export_name, Local<Value> export_value);
288
302
 
303
+ /**
304
+ * Search the modules requested directly or indirectly by the module for
305
+ * any top-level await that has not yet resolved. If there is any, the
306
+ * returned vector contains a tuple of the unresolved module and a message
307
+ * with the pending top-level await.
308
+ * An embedder may call this before exiting to improve error messages.
309
+ */
310
+ std::vector<std::tuple<Local<Module>, Local<Message>>>
311
+ GetStalledTopLevelAwaitMessage(Isolate* isolate);
312
+
289
313
  V8_INLINE static Module* Cast(Data* data);
290
314
 
291
315
  private:
@@ -324,6 +348,12 @@ class V8_EXPORT Script {
324
348
  * ScriptOrigin. This can be either a v8::String or v8::Undefined.
325
349
  */
326
350
  Local<Value> GetResourceName();
351
+
352
+ /**
353
+ * If the script was compiled, returns the positions of lazy functions which
354
+ * were eventually compiled and executed.
355
+ */
356
+ std::vector<int> GetProducedCompileHints() const;
327
357
  };
328
358
 
329
359
  enum class ScriptType { kClassic, kModule };
@@ -384,6 +414,8 @@ class V8_EXPORT ScriptCompiler {
384
414
  V8_INLINE explicit Source(
385
415
  Local<String> source_string, CachedData* cached_data = nullptr,
386
416
  ConsumeCodeCacheTask* consume_cache_task = nullptr);
417
+ V8_INLINE Source(Local<String> source_string, const ScriptOrigin& origin,
418
+ CompileHintCallback callback, void* callback_data);
387
419
  V8_INLINE ~Source() = default;
388
420
 
389
421
  // Ownership of the CachedData or its buffers is *not* transferred to the
@@ -411,6 +443,10 @@ class V8_EXPORT ScriptCompiler {
411
443
  // set when calling a compile method.
412
444
  std::unique_ptr<CachedData> cached_data;
413
445
  std::unique_ptr<ConsumeCodeCacheTask> consume_cache_task;
446
+
447
+ // For requesting compile hints from the embedder.
448
+ CompileHintCallback compile_hint_callback = nullptr;
449
+ void* compile_hint_callback_data = nullptr;
414
450
  };
415
451
 
416
452
  /**
@@ -489,7 +525,7 @@ class V8_EXPORT ScriptCompiler {
489
525
  /**
490
526
  * A task which the embedder must run on a background thread to
491
527
  * consume a V8 code cache. Returned by
492
- * ScriptCompiler::StarConsumingCodeCache.
528
+ * ScriptCompiler::StartConsumingCodeCache.
493
529
  */
494
530
  class V8_EXPORT ConsumeCodeCacheTask final {
495
531
  public:
@@ -497,6 +533,36 @@ class V8_EXPORT ScriptCompiler {
497
533
 
498
534
  void Run();
499
535
 
536
+ /**
537
+ * Provides the source text string and origin information to the consumption
538
+ * task. May be called before, during, or after Run(). This step checks
539
+ * whether the script matches an existing script in the Isolate's
540
+ * compilation cache. To check whether such a script was found, call
541
+ * ShouldMergeWithExistingScript.
542
+ *
543
+ * The Isolate provided must be the same one used during
544
+ * StartConsumingCodeCache and must be currently entered on the thread that
545
+ * calls this function. The source text and origin provided in this step
546
+ * must precisely match those used later in the ScriptCompiler::Source that
547
+ * will contain this ConsumeCodeCacheTask.
548
+ */
549
+ void SourceTextAvailable(Isolate* isolate, Local<String> source_text,
550
+ const ScriptOrigin& origin);
551
+
552
+ /**
553
+ * Returns whether the embedder should call MergeWithExistingScript. This
554
+ * function may be called from any thread, any number of times, but its
555
+ * return value is only meaningful after SourceTextAvailable has completed.
556
+ */
557
+ bool ShouldMergeWithExistingScript() const;
558
+
559
+ /**
560
+ * Merges newly deserialized data into an existing script which was found
561
+ * during SourceTextAvailable. May be called only after Run() has completed.
562
+ * Can execute on any thread, like Run().
563
+ */
564
+ void MergeWithExistingScript();
565
+
500
566
  private:
501
567
  friend class ScriptCompiler;
502
568
 
@@ -509,7 +575,9 @@ class V8_EXPORT ScriptCompiler {
509
575
  enum CompileOptions {
510
576
  kNoCompileOptions = 0,
511
577
  kConsumeCodeCache,
512
- kEagerCompile
578
+ kEagerCompile,
579
+ kProduceCompileHints,
580
+ kConsumeCompileHints
513
581
  };
514
582
 
515
583
  /**
@@ -581,7 +649,8 @@ class V8_EXPORT ScriptCompiler {
581
649
  */
582
650
  static ScriptStreamingTask* StartStreaming(
583
651
  Isolate* isolate, StreamedSource* source,
584
- ScriptType type = ScriptType::kClassic);
652
+ ScriptType type = ScriptType::kClassic,
653
+ CompileOptions options = kNoCompileOptions);
585
654
 
586
655
  static ConsumeCodeCacheTask* StartConsumingCodeCache(
587
656
  Isolate* isolate, std::unique_ptr<CachedData> source);
@@ -650,6 +719,7 @@ class V8_EXPORT ScriptCompiler {
650
719
  * It is possible to specify multiple context extensions (obj in the above
651
720
  * example).
652
721
  */
722
+ V8_DEPRECATED("Use CompileFunction")
653
723
  static V8_WARN_UNUSED_RESULT MaybeLocal<Function> CompileFunctionInContext(
654
724
  Local<Context> context, Source* source, size_t arguments_count,
655
725
  Local<String> arguments[], size_t context_extension_count,
@@ -657,6 +727,7 @@ class V8_EXPORT ScriptCompiler {
657
727
  CompileOptions options = kNoCompileOptions,
658
728
  NoCacheReason no_cache_reason = kNoCacheNoReason,
659
729
  Local<ScriptOrModule>* script_or_module_out = nullptr);
730
+
660
731
  static V8_WARN_UNUSED_RESULT MaybeLocal<Function> CompileFunction(
661
732
  Local<Context> context, Source* source, size_t arguments_count = 0,
662
733
  Local<String> arguments[] = nullptr, size_t context_extension_count = 0,
@@ -719,6 +790,19 @@ ScriptCompiler::Source::Source(Local<String> string, CachedData* data,
719
790
  cached_data(data),
720
791
  consume_cache_task(consume_cache_task) {}
721
792
 
793
+ ScriptCompiler::Source::Source(Local<String> string, const ScriptOrigin& origin,
794
+ CompileHintCallback callback,
795
+ void* callback_data)
796
+ : source_string(string),
797
+ resource_name(origin.ResourceName()),
798
+ resource_line_offset(origin.LineOffset()),
799
+ resource_column_offset(origin.ColumnOffset()),
800
+ resource_options(origin.Options()),
801
+ source_map_url(origin.SourceMapUrl()),
802
+ host_defined_options(origin.GetHostDefinedOptions()),
803
+ compile_hint_callback(callback),
804
+ compile_hint_callback_data(callback_data) {}
805
+
722
806
  const ScriptCompiler::CachedData* ScriptCompiler::Source::GetCachedData()
723
807
  const {
724
808
  return cached_data.get();
@@ -91,7 +91,7 @@ class V8_EXPORT SnapshotCreator {
91
91
  */
92
92
  SnapshotCreator(Isolate* isolate,
93
93
  const intptr_t* external_references = nullptr,
94
- StartupData* existing_blob = nullptr);
94
+ const StartupData* existing_blob = nullptr);
95
95
 
96
96
  /**
97
97
  * Create and enter an isolate, and set it up for serialization.
@@ -102,7 +102,7 @@ class V8_EXPORT SnapshotCreator {
102
102
  * that must be equivalent to CreateParams::external_references.
103
103
  */
104
104
  SnapshotCreator(const intptr_t* external_references = nullptr,
105
- StartupData* existing_blob = nullptr);
105
+ const StartupData* existing_blob = nullptr);
106
106
 
107
107
  /**
108
108
  * Destroy the snapshot creator, and exit and dispose of the Isolate
@@ -179,16 +179,12 @@ class V8_EXPORT SnapshotCreator {
179
179
 
180
180
  template <class T>
181
181
  size_t SnapshotCreator::AddData(Local<Context> context, Local<T> object) {
182
- T* object_ptr = *object;
183
- internal::Address* p = reinterpret_cast<internal::Address*>(object_ptr);
184
- return AddData(context, *p);
182
+ return AddData(context, internal::ValueHelper::ValueAsAddress(*object));
185
183
  }
186
184
 
187
185
  template <class T>
188
186
  size_t SnapshotCreator::AddData(Local<T> object) {
189
- T* object_ptr = *object;
190
- internal::Address* p = reinterpret_cast<internal::Address*>(object_ptr);
191
- return AddData(*p);
187
+ return AddData(internal::ValueHelper::ValueAsAddress(*object));
192
188
  }
193
189
 
194
190
  } // namespace v8
@@ -14,7 +14,6 @@
14
14
 
15
15
  namespace v8 {
16
16
 
17
- class AccessorSignature;
18
17
  class CFunction;
19
18
  class FunctionTemplate;
20
19
  class ObjectTemplate;
@@ -31,7 +30,9 @@ class Signature;
31
30
  F(AsyncIteratorPrototype, initial_async_iterator_prototype) \
32
31
  F(ErrorPrototype, initial_error_prototype) \
33
32
  F(IteratorPrototype, initial_iterator_prototype) \
34
- F(ObjProto_valueOf, object_value_of_function)
33
+ F(MapIteratorPrototype, initial_map_iterator_prototype) \
34
+ F(ObjProto_valueOf, object_value_of_function) \
35
+ F(SetIteratorPrototype, initial_set_iterator_prototype)
35
36
 
36
37
  enum Intrinsic {
37
38
  #define V8_DECL_INTRINSIC(name, iname) k##name,
@@ -83,28 +84,7 @@ class V8_EXPORT Template : public Data {
83
84
  * cross-context access.
84
85
  * \param attribute The attributes of the property for which an accessor
85
86
  * is added.
86
- * \param signature The signature describes valid receivers for the accessor
87
- * and is used to perform implicit instance checks against them. If the
88
- * receiver is incompatible (i.e. is not an instance of the constructor as
89
- * defined by FunctionTemplate::HasInstance()), an implicit TypeError is
90
- * thrown and no callback is invoked.
91
87
  */
92
- V8_DEPRECATED("Do signature check in accessor")
93
- void SetNativeDataProperty(
94
- Local<String> name, AccessorGetterCallback getter,
95
- AccessorSetterCallback setter, Local<Value> data,
96
- PropertyAttribute attribute, Local<AccessorSignature> signature,
97
- AccessControl settings = DEFAULT,
98
- SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
99
- SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
100
- V8_DEPRECATED("Do signature check in accessor")
101
- void SetNativeDataProperty(
102
- Local<Name> name, AccessorNameGetterCallback getter,
103
- AccessorNameSetterCallback setter, Local<Value> data,
104
- PropertyAttribute attribute, Local<AccessorSignature> signature,
105
- AccessControl settings = DEFAULT,
106
- SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
107
- SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
108
88
  void SetNativeDataProperty(
109
89
  Local<String> name, AccessorGetterCallback getter,
110
90
  AccessorSetterCallback setter = nullptr,
@@ -151,7 +131,8 @@ class V8_EXPORT Template : public Data {
151
131
  * Interceptor for get requests on an object.
152
132
  *
153
133
  * Use `info.GetReturnValue().Set()` to set the return value of the
154
- * intercepted get request.
134
+ * intercepted get request. If the property does not exist the callback should
135
+ * not set the result and must not produce side effects.
155
136
  *
156
137
  * \param property The name of the property for which the request was
157
138
  * intercepted.
@@ -192,9 +173,9 @@ using GenericNamedPropertyGetterCallback =
192
173
  * Use `info.GetReturnValue()` to indicate whether the request was intercepted
193
174
  * or not. If the setter successfully intercepts the request, i.e., if the
194
175
  * request should not be further executed, call
195
- * `info.GetReturnValue().Set(value)`. If the setter
196
- * did not intercept the request, i.e., if the request should be handled as
197
- * if no interceptor is present, do not not call `Set()`.
176
+ * `info.GetReturnValue().Set(value)`. If the setter did not intercept the
177
+ * request, i.e., if the request should be handled as if no interceptor is
178
+ * present, do not not call `Set()` and do not produce side effects.
198
179
  *
199
180
  * \param property The name of the property for which the request was
200
181
  * intercepted.
@@ -217,7 +198,9 @@ using GenericNamedPropertySetterCallback =
217
198
  * defineProperty().
218
199
  *
219
200
  * Use `info.GetReturnValue().Set(value)` to set the property attributes. The
220
- * value is an integer encoding a `v8::PropertyAttribute`.
201
+ * value is an integer encoding a `v8::PropertyAttribute`. If the property does
202
+ * not exist the callback should not set the result and must not produce side
203
+ * effects.
221
204
  *
222
205
  * \param property The name of the property for which the request was
223
206
  * intercepted.
@@ -242,7 +225,8 @@ using GenericNamedPropertyQueryCallback =
242
225
  * or not. If the deleter successfully intercepts the request, i.e., if the
243
226
  * request should not be further executed, call
244
227
  * `info.GetReturnValue().Set(value)` with a boolean `value`. The `value` is
245
- * used as the return value of `delete`.
228
+ * used as the return value of `delete`. If the deleter does not intercept the
229
+ * request then it should not set the result and must not produce side effects.
246
230
  *
247
231
  * \param property The name of the property for which the request was
248
232
  * intercepted.
@@ -274,9 +258,9 @@ using GenericNamedPropertyEnumeratorCallback =
274
258
  * Use `info.GetReturnValue()` to indicate whether the request was intercepted
275
259
  * or not. If the definer successfully intercepts the request, i.e., if the
276
260
  * request should not be further executed, call
277
- * `info.GetReturnValue().Set(value)`. If the definer
278
- * did not intercept the request, i.e., if the request should be handled as
279
- * if no interceptor is present, do not not call `Set()`.
261
+ * `info.GetReturnValue().Set(value)`. If the definer did not intercept the
262
+ * request, i.e., if the request should be handled as if no interceptor is
263
+ * present, do not not call `Set()` and do not produce side effects.
280
264
  *
281
265
  * \param property The name of the property for which the request was
282
266
  * intercepted.
@@ -821,27 +805,7 @@ class V8_EXPORT ObjectTemplate : public Template {
821
805
  * cross-context access.
822
806
  * \param attribute The attributes of the property for which an accessor
823
807
  * is added.
824
- * \param signature The signature describes valid receivers for the accessor
825
- * and is used to perform implicit instance checks against them. If the
826
- * receiver is incompatible (i.e. is not an instance of the constructor as
827
- * defined by FunctionTemplate::HasInstance()), an implicit TypeError is
828
- * thrown and no callback is invoked.
829
808
  */
830
- V8_DEPRECATED("Do signature check in accessor")
831
- void SetAccessor(
832
- Local<String> name, AccessorGetterCallback getter,
833
- AccessorSetterCallback setter, Local<Value> data, AccessControl settings,
834
- PropertyAttribute attribute, Local<AccessorSignature> signature,
835
- SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
836
- SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
837
- V8_DEPRECATED("Do signature check in accessor")
838
- void SetAccessor(
839
- Local<Name> name, AccessorNameGetterCallback getter,
840
- AccessorNameSetterCallback setter, Local<Value> data,
841
- AccessControl settings, PropertyAttribute attribute,
842
- Local<AccessorSignature> signature,
843
- SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
844
- SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
845
809
  void SetAccessor(
846
810
  Local<String> name, AccessorGetterCallback getter,
847
811
  AccessorSetterCallback setter = nullptr,
@@ -1019,24 +983,6 @@ class V8_EXPORT Signature : public Data {
1019
983
  static void CheckCast(Data* that);
1020
984
  };
1021
985
 
1022
- /**
1023
- * An AccessorSignature specifies which receivers are valid parameters
1024
- * to an accessor callback.
1025
- */
1026
- class V8_EXPORT AccessorSignature : public Data {
1027
- public:
1028
- static Local<AccessorSignature> New(
1029
- Isolate* isolate,
1030
- Local<FunctionTemplate> receiver = Local<FunctionTemplate>());
1031
-
1032
- V8_INLINE static AccessorSignature* Cast(Data* data);
1033
-
1034
- private:
1035
- AccessorSignature();
1036
-
1037
- static void CheckCast(Data* that);
1038
- };
1039
-
1040
986
  // --- Implementation ---
1041
987
 
1042
988
  void Template::Set(Isolate* isolate, const char* name, Local<Data> value,
@@ -1067,13 +1013,6 @@ Signature* Signature::Cast(Data* data) {
1067
1013
  return reinterpret_cast<Signature*>(data);
1068
1014
  }
1069
1015
 
1070
- AccessorSignature* AccessorSignature::Cast(Data* data) {
1071
- #ifdef V8_ENABLE_CHECKS
1072
- CheckCast(data);
1073
- #endif
1074
- return reinterpret_cast<AccessorSignature*>(data);
1075
- }
1076
-
1077
1016
  } // namespace v8
1078
1017
 
1079
1018
  #endif // INCLUDE_V8_TEMPLATE_H_
@@ -62,7 +62,8 @@ class TracedReferenceBase {
62
62
  */
63
63
  V8_INLINE v8::Local<v8::Value> Get(v8::Isolate* isolate) const {
64
64
  if (IsEmpty()) return Local<Value>();
65
- return Local<Value>::New(isolate, reinterpret_cast<Value*>(val_));
65
+ return Local<Value>::New(isolate,
66
+ internal::ValueHelper::SlotAsValue<Value>(val_));
66
67
  }
67
68
 
68
69
  /**
@@ -103,10 +104,13 @@ class TracedReferenceBase {
103
104
 
104
105
  V8_EXPORT void CheckValue() const;
105
106
 
107
+ V8_INLINE internal::Address address() const { return *val_; }
108
+
106
109
  // val_ points to a GlobalHandles node.
107
110
  internal::Address* val_ = nullptr;
108
111
 
109
112
  friend class internal::BasicTracedReferenceExtractor;
113
+ friend class internal::HandleHelper;
110
114
  template <typename F>
111
115
  friend class Local;
112
116
  template <typename U>
@@ -117,11 +121,11 @@ class TracedReferenceBase {
117
121
 
118
122
  /**
119
123
  * A traced handle with copy and move semantics. The handle is to be used
120
- * together with |v8::EmbedderHeapTracer| or as part of GarbageCollected objects
121
- * (see v8-cppgc.h) and specifies edges from C++ objects to JavaScript.
124
+ * together as part of GarbageCollected objects (see v8-cppgc.h) or from stack
125
+ * and specifies edges from C++ objects to JavaScript.
122
126
  *
123
127
  * The exact semantics are:
124
- * - Tracing garbage collections use |v8::EmbedderHeapTracer| or cppgc.
128
+ * - Tracing garbage collections using CppHeap.
125
129
  * - Non-tracing garbage collections refer to
126
130
  * |v8::EmbedderRootsHandler::IsRoot()| whether the handle should
127
131
  * be treated as root or not.
@@ -135,7 +139,12 @@ class BasicTracedReference : public TracedReferenceBase {
135
139
  /**
136
140
  * Construct a Local<T> from this handle.
137
141
  */
138
- Local<T> Get(Isolate* isolate) const { return Local<T>::New(isolate, *this); }
142
+ Local<T> Get(Isolate* isolate) const {
143
+ #ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
144
+ if (val_ == nullptr) return Local<T>();
145
+ #endif
146
+ return Local<T>::New(isolate, *this);
147
+ }
139
148
 
140
149
  template <class S>
141
150
  V8_INLINE BasicTracedReference<S>& As() const {
@@ -166,7 +175,6 @@ class BasicTracedReference : public TracedReferenceBase {
166
175
  Isolate* isolate, T* that, void* slot,
167
176
  internal::GlobalHandleStoreMode store_mode);
168
177
 
169
- friend class EmbedderHeapTracer;
170
178
  template <typename F>
171
179
  friend class Local;
172
180
  friend class Object;
@@ -181,13 +189,7 @@ class BasicTracedReference : public TracedReferenceBase {
181
189
  /**
182
190
  * A traced handle without destructor that clears the handle. The embedder needs
183
191
  * to ensure that the handle is not accessed once the V8 object has been
184
- * reclaimed. This can happen when the handle is not passed through the
185
- * EmbedderHeapTracer. For more details see BasicTracedReference.
186
- *
187
- * The reference assumes the embedder has precise knowledge about references at
188
- * all times. In case V8 needs to separately handle on-stack references, the
189
- * embedder is required to set the stack start through
190
- * |EmbedderHeapTracer::SetStackStart|.
192
+ * reclaimed. For more details see BasicTracedReference.
191
193
  */
192
194
  template <typename T>
193
195
  class TracedReference : public BasicTracedReference<T> {
@@ -207,7 +209,7 @@ class TracedReference : public BasicTracedReference<T> {
207
209
  */
208
210
  template <class S>
209
211
  TracedReference(Isolate* isolate, Local<S> that) : BasicTracedReference<T>() {
210
- this->val_ = this->New(isolate, that.val_, &this->val_,
212
+ this->val_ = this->New(isolate, *that, &this->val_,
211
213
  internal::GlobalHandleStoreMode::kInitializingStore);
212
214
  static_assert(std::is_base_of<T, S>::value, "type check");
213
215
  }
@@ -291,7 +293,7 @@ template <class T>
291
293
  internal::Address* BasicTracedReference<T>::New(
292
294
  Isolate* isolate, T* that, void* slot,
293
295
  internal::GlobalHandleStoreMode store_mode) {
294
- if (that == nullptr) return nullptr;
296
+ if (that == internal::ValueHelper::EmptyValue<T>()) return nullptr;
295
297
  internal::Address* p = reinterpret_cast<internal::Address*>(that);
296
298
  return internal::GlobalizeTracedReference(
297
299
  reinterpret_cast<internal::Isolate*>(isolate), p,
@@ -306,21 +308,13 @@ void TracedReferenceBase::Reset() {
306
308
 
307
309
  V8_INLINE bool operator==(const TracedReferenceBase& lhs,
308
310
  const TracedReferenceBase& rhs) {
309
- v8::internal::Address* a = reinterpret_cast<v8::internal::Address*>(lhs.val_);
310
- v8::internal::Address* b = reinterpret_cast<v8::internal::Address*>(rhs.val_);
311
- if (a == nullptr) return b == nullptr;
312
- if (b == nullptr) return false;
313
- return *a == *b;
311
+ return internal::HandleHelper::EqualHandles(lhs, rhs);
314
312
  }
315
313
 
316
314
  template <typename U>
317
315
  V8_INLINE bool operator==(const TracedReferenceBase& lhs,
318
316
  const v8::Local<U>& rhs) {
319
- v8::internal::Address* a = reinterpret_cast<v8::internal::Address*>(lhs.val_);
320
- v8::internal::Address* b = reinterpret_cast<v8::internal::Address*>(*rhs);
321
- if (a == nullptr) return b == nullptr;
322
- if (b == nullptr) return false;
323
- return *a == *b;
317
+ return internal::HandleHelper::EqualHandles(lhs, rhs);
324
318
  }
325
319
 
326
320
  template <typename U>
@@ -353,7 +347,7 @@ void TracedReference<T>::Reset(Isolate* isolate, const Local<S>& other) {
353
347
  this->Reset();
354
348
  if (other.IsEmpty()) return;
355
349
  this->SetSlotThreadSafe(
356
- this->New(isolate, other.val_, &this->val_,
350
+ this->New(isolate, *other, &this->val_,
357
351
  internal::GlobalHandleStoreMode::kAssigningStore));
358
352
  }
359
353
 
@@ -403,7 +397,7 @@ void TracedReferenceBase::SetWrapperClassId(uint16_t class_id) {
403
397
  using I = internal::Internals;
404
398
  if (IsEmpty()) return;
405
399
  internal::Address* obj = reinterpret_cast<internal::Address*>(val_);
406
- uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
400
+ uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kTracedNodeClassIdOffset;
407
401
  *reinterpret_cast<uint16_t*>(addr) = class_id;
408
402
  }
409
403
 
@@ -411,7 +405,7 @@ uint16_t TracedReferenceBase::WrapperClassId() const {
411
405
  using I = internal::Internals;
412
406
  if (IsEmpty()) return 0;
413
407
  internal::Address* obj = reinterpret_cast<internal::Address*>(val_);
414
- uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
408
+ uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kTracedNodeClassIdOffset;
415
409
  return *reinterpret_cast<uint16_t*>(addr);
416
410
  }
417
411
 
@@ -17,10 +17,10 @@ struct CalleeSavedRegisters {
17
17
  void* arm_r9;
18
18
  void* arm_r10;
19
19
  };
20
- #elif V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 || \
21
- V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC || \
22
- V8_TARGET_ARCH_PPC64 || V8_TARGET_ARCH_RISCV64 || V8_TARGET_ARCH_S390 || \
23
- V8_TARGET_ARCH_LOONG64
20
+ #elif V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 || \
21
+ V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_PPC64 || \
22
+ V8_TARGET_ARCH_RISCV64 || V8_TARGET_ARCH_S390 || V8_TARGET_ARCH_LOONG64 || \
23
+ V8_TARGET_ARCH_RISCV32
24
24
  struct CalleeSavedRegisters {};
25
25
  #else
26
26
  #error Target architecture was not detected as supported by v8
@@ -181,7 +181,11 @@ class PersistentValueMapBase {
181
181
  * Get value stored in map.
182
182
  */
183
183
  Local<V> Get(const K& key) {
184
- return Local<V>::New(isolate_, FromVal(Traits::Get(&impl_, key)));
184
+ V* p = FromVal(Traits::Get(&impl_, key));
185
+ #ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
186
+ if (p == nullptr) return Local<V>();
187
+ #endif
188
+ return Local<V>::New(isolate_, p);
185
189
  }
186
190
 
187
191
  /**
@@ -236,7 +240,8 @@ class PersistentValueMapBase {
236
240
  : value_(other.value_) { }
237
241
 
238
242
  Local<V> NewLocal(Isolate* isolate) const {
239
- return Local<V>::New(isolate, FromVal(value_));
243
+ return Local<V>::New(
244
+ isolate, internal::ValueHelper::SlotAsValue<V>(FromVal(value_)));
240
245
  }
241
246
  bool IsEmpty() const {
242
247
  return value_ == kPersistentContainerNotFound;
@@ -537,7 +542,6 @@ class StdGlobalValueMap : public GlobalValueMap<K, V, Traits> {
537
542
  : GlobalValueMap<K, V, Traits>(isolate) {}
538
543
  };
539
544
 
540
-
541
545
  class DefaultPersistentValueVectorTraits {
542
546
  public:
543
547
  typedef std::vector<PersistentContainerValue> Impl;
@@ -562,7 +566,6 @@ class DefaultPersistentValueVectorTraits {
562
566
  }
563
567
  };
564
568
 
565
-
566
569
  /**
567
570
  * A vector wrapper that safely stores Global values.
568
571
  * C++11 embedders don't need this class, as they can use Global
@@ -573,8 +576,8 @@ class DefaultPersistentValueVectorTraits {
573
576
  * PersistentContainerValue, with all conversion into and out of V8
574
577
  * handles being transparently handled by this class.
575
578
  */
576
- template<typename V, typename Traits = DefaultPersistentValueVectorTraits>
577
- class PersistentValueVector {
579
+ template <typename V, typename Traits = DefaultPersistentValueVectorTraits>
580
+ class V8_DEPRECATE_SOON("Use std::vector<Global<V>>.") PersistentValueVector {
578
581
  public:
579
582
  explicit PersistentValueVector(Isolate* isolate) : isolate_(isolate) { }
580
583
 
@@ -615,7 +618,8 @@ class PersistentValueVector {
615
618
  * Retrieve the i-th value in the vector.
616
619
  */
617
620
  Local<V> Get(size_t index) const {
618
- return Local<V>::New(isolate_, FromVal(Traits::Get(&impl_, index)));
621
+ return Local<V>::New(isolate_, internal::ValueHelper::SlotAsValue<V>(
622
+ FromVal(Traits::Get(&impl_, index))));
619
623
  }
620
624
 
621
625
  /**