libv8 6.7.288.46.1-universal-darwin-18 → 7.3.492.27.1-universal-darwin-18

Sign up to get free protection for your applications and to get access to all the features.
@@ -25,13 +25,11 @@ enum PersistentContainerCallbackType {
25
25
  kNotWeak,
26
26
  // These correspond to v8::WeakCallbackType
27
27
  kWeakWithParameter,
28
- kWeakWithInternalFields,
29
- kWeak = kWeakWithParameter // For backwards compatibility. Deprecate.
28
+ kWeakWithInternalFields
30
29
  };
31
30
 
32
-
33
31
  /**
34
- * A default trait implemenation for PersistentValueMap which uses std::map
32
+ * A default trait implementation for PersistentValueMap which uses std::map
35
33
  * as a backing map.
36
34
  *
37
35
  * Users will have to implement their own weak callbacks & dispose traits.
@@ -94,11 +92,11 @@ class DefaultPersistentValueMapTraits : public StdMapTraits<K, V> {
94
92
 
95
93
  static WeakCallbackDataType* WeakCallbackParameter(
96
94
  MapType* map, const K& key, Local<V> value) {
97
- return NULL;
95
+ return nullptr;
98
96
  }
99
97
  static MapType* MapFromWeakCallbackInfo(
100
98
  const WeakCallbackInfo<WeakCallbackDataType>& data) {
101
- return NULL;
99
+ return nullptr;
102
100
  }
103
101
  static K KeyFromWeakCallbackInfo(
104
102
  const WeakCallbackInfo<WeakCallbackDataType>& data) {
@@ -203,7 +201,7 @@ class PersistentValueMapBase {
203
201
  void RegisterExternallyReferencedObject(K& key) {
204
202
  assert(Contains(key));
205
203
  V8::RegisterExternallyReferencedObject(
206
- reinterpret_cast<internal::Object**>(FromVal(Traits::Get(&impl_, key))),
204
+ reinterpret_cast<internal::Address*>(FromVal(Traits::Get(&impl_, key))),
207
205
  reinterpret_cast<internal::Isolate*>(GetIsolate()));
208
206
  }
209
207
 
@@ -289,7 +287,10 @@ class PersistentValueMapBase {
289
287
  }
290
288
 
291
289
  protected:
292
- explicit PersistentValueMapBase(Isolate* isolate) : isolate_(isolate) {}
290
+ explicit PersistentValueMapBase(Isolate* isolate)
291
+ : isolate_(isolate), label_(nullptr) {}
292
+ PersistentValueMapBase(Isolate* isolate, const char* label)
293
+ : isolate_(isolate), label_(label) {}
293
294
 
294
295
  ~PersistentValueMapBase() { Clear(); }
295
296
 
@@ -302,7 +303,7 @@ class PersistentValueMapBase {
302
303
 
303
304
  static PersistentContainerValue ClearAndLeak(Global<V>* persistent) {
304
305
  V* v = persistent->val_;
305
- persistent->val_ = 0;
306
+ persistent->val_ = nullptr;
306
307
  return reinterpret_cast<PersistentContainerValue>(v);
307
308
  }
308
309
 
@@ -331,6 +332,10 @@ class PersistentValueMapBase {
331
332
  p.Reset();
332
333
  }
333
334
 
335
+ void AnnotateStrongRetainer(Global<V>* persistent) {
336
+ persistent->AnnotateStrongRetainer(label_);
337
+ }
338
+
334
339
  private:
335
340
  PersistentValueMapBase(PersistentValueMapBase&);
336
341
  void operator=(PersistentValueMapBase&);
@@ -340,13 +345,14 @@ class PersistentValueMapBase {
340
345
  bool hasValue = value != kPersistentContainerNotFound;
341
346
  if (hasValue) {
342
347
  returnValue->SetInternal(
343
- *reinterpret_cast<internal::Object**>(FromVal(value)));
348
+ *reinterpret_cast<internal::Address*>(FromVal(value)));
344
349
  }
345
350
  return hasValue;
346
351
  }
347
352
 
348
353
  Isolate* isolate_;
349
354
  typename Traits::Impl impl_;
355
+ const char* label_;
350
356
  };
351
357
 
352
358
 
@@ -355,6 +361,8 @@ class PersistentValueMap : public PersistentValueMapBase<K, V, Traits> {
355
361
  public:
356
362
  explicit PersistentValueMap(Isolate* isolate)
357
363
  : PersistentValueMapBase<K, V, Traits>(isolate) {}
364
+ PersistentValueMap(Isolate* isolate, const char* label)
365
+ : PersistentValueMapBase<K, V, Traits>(isolate, label) {}
358
366
 
359
367
  typedef
360
368
  typename PersistentValueMapBase<K, V, Traits>::PersistentValueReference
@@ -382,7 +390,9 @@ class PersistentValueMap : public PersistentValueMapBase<K, V, Traits> {
382
390
  * by the Traits class.
383
391
  */
384
392
  Global<V> SetUnique(const K& key, Global<V>* persistent) {
385
- if (Traits::kCallbackType != kNotWeak) {
393
+ if (Traits::kCallbackType == kNotWeak) {
394
+ this->AnnotateStrongRetainer(persistent);
395
+ } else {
386
396
  WeakCallbackType callback_type =
387
397
  Traits::kCallbackType == kWeakWithInternalFields
388
398
  ? WeakCallbackType::kInternalFields
@@ -427,6 +437,8 @@ class GlobalValueMap : public PersistentValueMapBase<K, V, Traits> {
427
437
  public:
428
438
  explicit GlobalValueMap(Isolate* isolate)
429
439
  : PersistentValueMapBase<K, V, Traits>(isolate) {}
440
+ GlobalValueMap(Isolate* isolate, const char* label)
441
+ : PersistentValueMapBase<K, V, Traits>(isolate, label) {}
430
442
 
431
443
  typedef
432
444
  typename PersistentValueMapBase<K, V, Traits>::PersistentValueReference
@@ -454,7 +466,9 @@ class GlobalValueMap : public PersistentValueMapBase<K, V, Traits> {
454
466
  * by the Traits class.
455
467
  */
456
468
  Global<V> SetUnique(const K& key, Global<V>* persistent) {
457
- if (Traits::kCallbackType != kNotWeak) {
469
+ if (Traits::kCallbackType == kNotWeak) {
470
+ this->AnnotateStrongRetainer(persistent);
471
+ } else {
458
472
  WeakCallbackType callback_type =
459
473
  Traits::kCallbackType == kWeakWithInternalFields
460
474
  ? WeakCallbackType::kInternalFields
@@ -633,7 +647,7 @@ class PersistentValueVector {
633
647
  private:
634
648
  static PersistentContainerValue ClearAndLeak(Global<V>* persistent) {
635
649
  V* v = persistent->val_;
636
- persistent->val_ = 0;
650
+ persistent->val_ = nullptr;
637
651
  return reinterpret_cast<PersistentContainerValue>(v);
638
652
  }
639
653
 
@@ -8,10 +8,10 @@
8
8
  // These macros define the version number for the current version.
9
9
  // NOTE these macros are used by some of the tool scripts and the build
10
10
  // system so their names cannot be changed without changing the scripts.
11
- #define V8_MAJOR_VERSION 6
12
- #define V8_MINOR_VERSION 7
13
- #define V8_BUILD_NUMBER 288
14
- #define V8_PATCH_LEVEL 46
11
+ #define V8_MAJOR_VERSION 7
12
+ #define V8_MINOR_VERSION 3
13
+ #define V8_BUILD_NUMBER 492
14
+ #define V8_PATCH_LEVEL 27
15
15
 
16
16
  // Use 1 for candidates and 0 otherwise.
17
17
  // (Boolean macro values are not supported by all preprocessors.)
@@ -0,0 +1,31 @@
1
+ // Copyright 2018 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_WASM_TRAP_HANDLER_POSIX_H_
6
+ #define V8_WASM_TRAP_HANDLER_POSIX_H_
7
+
8
+ #include <signal.h>
9
+
10
+ #include "v8config.h" // NOLINT(build/include)
11
+
12
+ namespace v8 {
13
+ /**
14
+ * This function determines whether a memory access violation has been an
15
+ * out-of-bounds memory access in WebAssembly. If so, it will modify the context
16
+ * parameter and add a return address where the execution can continue after the
17
+ * signal handling, and return true. Otherwise, false will be returned.
18
+ *
19
+ * The parameters to this function correspond to those passed to a Posix signal
20
+ * handler. Use this function only on Linux and Mac.
21
+ *
22
+ * \param sig_code The signal code, e.g. SIGSEGV.
23
+ * \param info A pointer to the siginfo_t struct provided to the signal handler.
24
+ * \param context A pointer to a ucontext_t struct provided to the signal
25
+ * handler.
26
+ */
27
+ V8_EXPORT bool TryHandleWebAssemblyTrapPosix(int sig_code, siginfo_t* info,
28
+ void* context);
29
+
30
+ } // namespace v8
31
+ #endif // V8_WASM_TRAP_HANDLER_POSIX_H_
@@ -0,0 +1,28 @@
1
+ // Copyright 2018 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_WASM_TRAP_HANDLER_WIN_H_
6
+ #define V8_WASM_TRAP_HANDLER_WIN_H_
7
+
8
+ #include <windows.h>
9
+
10
+ #include "v8config.h" // NOLINT(build/include)
11
+
12
+ namespace v8 {
13
+ /**
14
+ * This function determines whether a memory access violation has been an
15
+ * out-of-bounds memory access in WebAssembly. If so, it will modify the
16
+ * exception parameter and add a return address where the execution can continue
17
+ * after the exception handling, and return true. Otherwise the return value
18
+ * will be false.
19
+ *
20
+ * The parameter to this function corresponds to the one passed to a Windows
21
+ * vectored exception handler. Use this function only on Windows.
22
+ *
23
+ * \param exception An EXCEPTION_POINTERS* as provided to the exception handler.
24
+ */
25
+ V8_EXPORT bool TryHandleWebAssemblyTrapWindows(EXCEPTION_POINTERS* exception);
26
+
27
+ } // namespace v8
28
+ #endif // V8_WASM_TRAP_HANDLER_WIN_H_
@@ -22,42 +22,13 @@
22
22
  #include <utility>
23
23
  #include <vector>
24
24
 
25
- #include "v8-version.h" // NOLINT(build/include)
26
- #include "v8config.h" // NOLINT(build/include)
25
+ #include "v8-internal.h" // NOLINT(build/include)
26
+ #include "v8-version.h" // NOLINT(build/include)
27
+ #include "v8config.h" // NOLINT(build/include)
27
28
 
28
29
  // We reserve the V8_* prefix for macros defined in V8 public API and
29
30
  // assume there are no name conflicts with the embedder's code.
30
31
 
31
- #ifdef V8_OS_WIN
32
-
33
- // Setup for Windows DLL export/import. When building the V8 DLL the
34
- // BUILDING_V8_SHARED needs to be defined. When building a program which uses
35
- // the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8
36
- // static library or building a program which uses the V8 static library neither
37
- // BUILDING_V8_SHARED nor USING_V8_SHARED should be defined.
38
- #ifdef BUILDING_V8_SHARED
39
- # define V8_EXPORT __declspec(dllexport)
40
- #elif USING_V8_SHARED
41
- # define V8_EXPORT __declspec(dllimport)
42
- #else
43
- # define V8_EXPORT
44
- #endif // BUILDING_V8_SHARED
45
-
46
- #else // V8_OS_WIN
47
-
48
- // Setup for Linux shared library export.
49
- #if V8_HAS_ATTRIBUTE_VISIBILITY
50
- # ifdef BUILDING_V8_SHARED
51
- # define V8_EXPORT __attribute__ ((visibility("default")))
52
- # else
53
- # define V8_EXPORT
54
- # endif
55
- #else
56
- # define V8_EXPORT
57
- #endif
58
-
59
- #endif // V8_OS_WIN
60
-
61
32
  /**
62
33
  * The v8 JavaScript engine.
63
34
  */
@@ -71,7 +42,6 @@ class BigIntObject;
71
42
  class Boolean;
72
43
  class BooleanObject;
73
44
  class Context;
74
- class CpuProfiler;
75
45
  class Data;
76
46
  class Date;
77
47
  class External;
@@ -111,7 +81,7 @@ class Private;
111
81
  class Uint32;
112
82
  class Utils;
113
83
  class Value;
114
- class WasmCompiledModule;
84
+ class WasmModuleObject;
115
85
  template <class T> class Local;
116
86
  template <class T>
117
87
  class MaybeLocal;
@@ -146,16 +116,20 @@ class DeferredHandles;
146
116
  class Heap;
147
117
  class HeapObject;
148
118
  class Isolate;
149
- class Object;
119
+ class LocalEmbedderHeapTracer;
120
+ class NeverReadOnlySpaceObject;
150
121
  struct ScriptStreamingData;
151
122
  template<typename T> class CustomArguments;
152
123
  class PropertyCallbackArguments;
153
124
  class FunctionCallbackArguments;
154
125
  class GlobalHandles;
126
+ class ScopedExternalStringLock;
155
127
 
156
128
  namespace wasm {
129
+ class NativeModule;
157
130
  class StreamingDecoder;
158
131
  } // namespace wasm
132
+
159
133
  } // namespace internal
160
134
 
161
135
  namespace debug {
@@ -203,7 +177,7 @@ class ConsoleCallArguments;
203
177
  template <class T>
204
178
  class Local {
205
179
  public:
206
- V8_INLINE Local() : val_(0) {}
180
+ V8_INLINE Local() : val_(nullptr) {}
207
181
  template <class S>
208
182
  V8_INLINE Local(Local<S> that)
209
183
  : val_(reinterpret_cast<T*>(*that)) {
@@ -218,12 +192,12 @@ class Local {
218
192
  /**
219
193
  * Returns true if the handle is empty.
220
194
  */
221
- V8_INLINE bool IsEmpty() const { return val_ == 0; }
195
+ V8_INLINE bool IsEmpty() const { return val_ == nullptr; }
222
196
 
223
197
  /**
224
198
  * Sets the handle to be empty. IsEmpty() will then return true.
225
199
  */
226
- V8_INLINE void Clear() { val_ = 0; }
200
+ V8_INLINE void Clear() { val_ = nullptr; }
227
201
 
228
202
  V8_INLINE T* operator->() const { return val_; }
229
203
 
@@ -237,19 +211,19 @@ class Local {
237
211
  */
238
212
  template <class S>
239
213
  V8_INLINE bool operator==(const Local<S>& that) const {
240
- internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
241
- internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
242
- if (a == 0) return b == 0;
243
- if (b == 0) return false;
214
+ internal::Address* a = reinterpret_cast<internal::Address*>(this->val_);
215
+ internal::Address* b = reinterpret_cast<internal::Address*>(that.val_);
216
+ if (a == nullptr) return b == nullptr;
217
+ if (b == nullptr) return false;
244
218
  return *a == *b;
245
219
  }
246
220
 
247
221
  template <class S> V8_INLINE bool operator==(
248
222
  const PersistentBase<S>& that) const {
249
- internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
250
- internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
251
- if (a == 0) return b == 0;
252
- if (b == 0) return false;
223
+ internal::Address* a = reinterpret_cast<internal::Address*>(this->val_);
224
+ internal::Address* b = reinterpret_cast<internal::Address*>(that.val_);
225
+ if (a == nullptr) return b == nullptr;
226
+ if (b == nullptr) return false;
253
227
  return *a == *b;
254
228
  }
255
229
 
@@ -493,7 +467,7 @@ template <class T> class PersistentBase {
493
467
  template <class S>
494
468
  V8_INLINE void Reset(Isolate* isolate, const PersistentBase<S>& other);
495
469
 
496
- V8_INLINE bool IsEmpty() const { return val_ == NULL; }
470
+ V8_INLINE bool IsEmpty() const { return val_ == nullptr; }
497
471
  V8_INLINE void Empty() { val_ = 0; }
498
472
 
499
473
  V8_INLINE Local<T> Get(Isolate* isolate) const {
@@ -502,19 +476,19 @@ template <class T> class PersistentBase {
502
476
 
503
477
  template <class S>
504
478
  V8_INLINE bool operator==(const PersistentBase<S>& that) const {
505
- internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
506
- internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
507
- if (a == NULL) return b == NULL;
508
- if (b == NULL) return false;
479
+ internal::Address* a = reinterpret_cast<internal::Address*>(this->val_);
480
+ internal::Address* b = reinterpret_cast<internal::Address*>(that.val_);
481
+ if (a == nullptr) return b == nullptr;
482
+ if (b == nullptr) return false;
509
483
  return *a == *b;
510
484
  }
511
485
 
512
486
  template <class S>
513
487
  V8_INLINE bool operator==(const Local<S>& that) const {
514
- internal::Object** a = reinterpret_cast<internal::Object**>(this->val_);
515
- internal::Object** b = reinterpret_cast<internal::Object**>(that.val_);
516
- if (a == NULL) return b == NULL;
517
- if (b == NULL) return false;
488
+ internal::Address* a = reinterpret_cast<internal::Address*>(this->val_);
489
+ internal::Address* b = reinterpret_cast<internal::Address*>(that.val_);
490
+ if (a == nullptr) return b == nullptr;
491
+ if (b == nullptr) return false;
518
492
  return *a == *b;
519
493
  }
520
494
 
@@ -594,7 +568,9 @@ template <class T> class PersistentBase {
594
568
  V8_INLINE bool IsIndependent() const);
595
569
 
596
570
  /** Checks if the handle holds the only reference to an object. */
597
- V8_INLINE bool IsNearDeath() const;
571
+ V8_DEPRECATE_SOON(
572
+ "Garbage collection internal state should not be relied on.",
573
+ V8_INLINE bool IsNearDeath() const);
598
574
 
599
575
  /** Returns true if the handle's reference is weak. */
600
576
  V8_INLINE bool IsWeak() const;
@@ -687,7 +663,7 @@ template <class T, class M> class Persistent : public PersistentBase<T> {
687
663
  /**
688
664
  * A Persistent with no storage cell.
689
665
  */
690
- V8_INLINE Persistent() : PersistentBase<T>(0) { }
666
+ V8_INLINE Persistent() : PersistentBase<T>(nullptr) {}
691
667
  /**
692
668
  * Construct a Persistent from a Local.
693
669
  * When the Local is non-empty, a new storage cell is created
@@ -714,14 +690,14 @@ template <class T, class M> class Persistent : public PersistentBase<T> {
714
690
  * traits class is called, allowing the setting of flags based on the
715
691
  * copied Persistent.
716
692
  */
717
- V8_INLINE Persistent(const Persistent& that) : PersistentBase<T>(0) {
693
+ V8_INLINE Persistent(const Persistent& that) : PersistentBase<T>(nullptr) {
718
694
  Copy(that);
719
695
  }
720
696
  template <class S, class M2>
721
697
  V8_INLINE Persistent(const Persistent<S, M2>& that) : PersistentBase<T>(0) {
722
698
  Copy(that);
723
699
  }
724
- V8_INLINE Persistent& operator=(const Persistent& that) { // NOLINT
700
+ V8_INLINE Persistent& operator=(const Persistent& that) {
725
701
  Copy(that);
726
702
  return *this;
727
703
  }
@@ -805,7 +781,7 @@ class Global : public PersistentBase<T> {
805
781
  /**
806
782
  * Move constructor.
807
783
  */
808
- V8_INLINE Global(Global&& other) : PersistentBase<T>(other.val_) { // NOLINT
784
+ V8_INLINE Global(Global&& other) : PersistentBase<T>(other.val_) {
809
785
  other.val_ = nullptr;
810
786
  }
811
787
  V8_INLINE ~Global() { this->Reset(); }
@@ -880,12 +856,12 @@ class V8_EXPORT HandleScope {
880
856
  void operator=(const HandleScope&) = delete;
881
857
 
882
858
  protected:
883
- V8_INLINE HandleScope() {}
859
+ V8_INLINE HandleScope() = default;
884
860
 
885
861
  void Initialize(Isolate* isolate);
886
862
 
887
- static internal::Object** CreateHandle(internal::Isolate* isolate,
888
- internal::Object* value);
863
+ static internal::Address* CreateHandle(internal::Isolate* isolate,
864
+ internal::Address value);
889
865
 
890
866
  private:
891
867
  // Declaring operator new and delete as deleted is not spec compliant.
@@ -895,19 +871,15 @@ class V8_EXPORT HandleScope {
895
871
  void operator delete(void*, size_t);
896
872
  void operator delete[](void*, size_t);
897
873
 
898
- // Uses heap_object to obtain the current Isolate.
899
- static internal::Object** CreateHandle(internal::HeapObject* heap_object,
900
- internal::Object* value);
901
-
902
874
  internal::Isolate* isolate_;
903
- internal::Object** prev_next_;
904
- internal::Object** prev_limit_;
875
+ internal::Address* prev_next_;
876
+ internal::Address* prev_limit_;
905
877
 
906
878
  // Local::New uses CreateHandle with an Isolate* parameter.
907
879
  template<class F> friend class Local;
908
880
 
909
881
  // Object::GetInternalField and Context::GetEmbedderData use CreateHandle with
910
- // a HeapObject* in their shortcuts.
882
+ // a HeapObject in their shortcuts.
911
883
  friend class Object;
912
884
  friend class Context;
913
885
  };
@@ -920,7 +892,7 @@ class V8_EXPORT HandleScope {
920
892
  class V8_EXPORT EscapableHandleScope : public HandleScope {
921
893
  public:
922
894
  explicit EscapableHandleScope(Isolate* isolate);
923
- V8_INLINE ~EscapableHandleScope() {}
895
+ V8_INLINE ~EscapableHandleScope() = default;
924
896
 
925
897
  /**
926
898
  * Pushes the value into the previous scope and returns a handle to it.
@@ -928,11 +900,16 @@ class V8_EXPORT EscapableHandleScope : public HandleScope {
928
900
  */
929
901
  template <class T>
930
902
  V8_INLINE Local<T> Escape(Local<T> value) {
931
- internal::Object** slot =
932
- Escape(reinterpret_cast<internal::Object**>(*value));
903
+ internal::Address* slot =
904
+ Escape(reinterpret_cast<internal::Address*>(*value));
933
905
  return Local<T>(reinterpret_cast<T*>(slot));
934
906
  }
935
907
 
908
+ template <class T>
909
+ V8_INLINE MaybeLocal<T> EscapeMaybe(MaybeLocal<T> value) {
910
+ return Escape(value.FromMaybe(Local<T>()));
911
+ }
912
+
936
913
  EscapableHandleScope(const EscapableHandleScope&) = delete;
937
914
  void operator=(const EscapableHandleScope&) = delete;
938
915
 
@@ -944,8 +921,8 @@ class V8_EXPORT EscapableHandleScope : public HandleScope {
944
921
  void operator delete(void*, size_t);
945
922
  void operator delete[](void*, size_t);
946
923
 
947
- internal::Object** Escape(internal::Object** escape_value);
948
- internal::Object** escape_slot_;
924
+ internal::Address* Escape(internal::Address* escape_value);
925
+ internal::Address* escape_slot_;
949
926
  };
950
927
 
951
928
  /**
@@ -970,7 +947,7 @@ class V8_EXPORT SealHandleScope {
970
947
  void operator delete[](void*, size_t);
971
948
 
972
949
  internal::Isolate* const isolate_;
973
- internal::Object** prev_limit_;
950
+ internal::Address* prev_limit_;
974
951
  int prev_sealed_level_;
975
952
  };
976
953
 
@@ -1019,8 +996,8 @@ class V8_EXPORT PrimitiveArray {
1019
996
  public:
1020
997
  static Local<PrimitiveArray> New(Isolate* isolate, int length);
1021
998
  int Length() const;
1022
- void Set(int index, Local<Primitive> item);
1023
- Local<Primitive> Get(int index);
999
+ void Set(Isolate* isolate, int index, Local<Primitive> item);
1000
+ Local<Primitive> Get(Isolate* isolate, int index);
1024
1001
  };
1025
1002
 
1026
1003
  /**
@@ -1123,6 +1100,13 @@ class V8_EXPORT UnboundScript {
1123
1100
  static const int kNoScriptId = 0;
1124
1101
  };
1125
1102
 
1103
+ /**
1104
+ * A compiled JavaScript module, not yet tied to a Context.
1105
+ */
1106
+ class V8_EXPORT UnboundModuleScript {
1107
+ // Only used as a container for code caching.
1108
+ };
1109
+
1126
1110
  /**
1127
1111
  * A location in JavaScript source.
1128
1112
  */
@@ -1222,6 +1206,14 @@ class V8_EXPORT Module {
1222
1206
  * The module's status must be at least kInstantiated.
1223
1207
  */
1224
1208
  Local<Value> GetModuleNamespace();
1209
+
1210
+ /**
1211
+ * Returns the corresponding context-unbound module script.
1212
+ *
1213
+ * The module must be unevaluated, i.e. its status must not be kEvaluating,
1214
+ * kEvaluated or kErrored.
1215
+ */
1216
+ Local<UnboundModuleScript> GetUnboundModuleScript();
1225
1217
  };
1226
1218
 
1227
1219
  /**
@@ -1233,23 +1225,15 @@ class V8_EXPORT Script {
1233
1225
  /**
1234
1226
  * A shorthand for ScriptCompiler::Compile().
1235
1227
  */
1236
- static V8_DEPRECATED("Use maybe version",
1237
- Local<Script> Compile(Local<String> source,
1238
- ScriptOrigin* origin = nullptr));
1239
1228
  static V8_WARN_UNUSED_RESULT MaybeLocal<Script> Compile(
1240
1229
  Local<Context> context, Local<String> source,
1241
1230
  ScriptOrigin* origin = nullptr);
1242
1231
 
1243
- static Local<Script> V8_DEPRECATED("Use maybe version",
1244
- Compile(Local<String> source,
1245
- Local<String> file_name));
1246
-
1247
1232
  /**
1248
1233
  * Runs the script returning the resulting value. It will be run in the
1249
1234
  * context in which it was created (ScriptCompiler::CompileBound or
1250
1235
  * UnboundScript::BindToCurrentContext()).
1251
1236
  */
1252
- V8_DEPRECATED("Use maybe version", Local<Value> Run());
1253
1237
  V8_WARN_UNUSED_RESULT MaybeLocal<Value> Run(Local<Context> context);
1254
1238
 
1255
1239
  /**
@@ -1278,7 +1262,7 @@ class V8_EXPORT ScriptCompiler {
1278
1262
  };
1279
1263
 
1280
1264
  CachedData()
1281
- : data(NULL),
1265
+ : data(nullptr),
1282
1266
  length(0),
1283
1267
  rejected(false),
1284
1268
  buffer_policy(BufferNotOwned) {}
@@ -1309,9 +1293,9 @@ class V8_EXPORT ScriptCompiler {
1309
1293
  public:
1310
1294
  // Source takes ownership of CachedData.
1311
1295
  V8_INLINE Source(Local<String> source_string, const ScriptOrigin& origin,
1312
- CachedData* cached_data = NULL);
1296
+ CachedData* cached_data = nullptr);
1313
1297
  V8_INLINE Source(Local<String> source_string,
1314
- CachedData* cached_data = NULL);
1298
+ CachedData* cached_data = nullptr);
1315
1299
  V8_INLINE ~Source();
1316
1300
 
1317
1301
  // Ownership of the CachedData or its buffers is *not* transferred to the
@@ -1350,7 +1334,7 @@ class V8_EXPORT ScriptCompiler {
1350
1334
  */
1351
1335
  class V8_EXPORT ExternalSourceStream {
1352
1336
  public:
1353
- virtual ~ExternalSourceStream() {}
1337
+ virtual ~ExternalSourceStream() = default;
1354
1338
 
1355
1339
  /**
1356
1340
  * V8 calls this to request the next chunk of data from the embedder. This
@@ -1364,6 +1348,10 @@ class V8_EXPORT ScriptCompiler {
1364
1348
  * more than two data chunks. The embedder can avoid this problem by always
1365
1349
  * returning at least 2 bytes of data.
1366
1350
  *
1351
+ * When streaming UTF-16 data, V8 does not handle characters split between
1352
+ * two data chunks. The embedder has to make sure that chunks have an even
1353
+ * length.
1354
+ *
1367
1355
  * If the embedder wants to cancel the streaming, they should make the next
1368
1356
  * GetMoreData call return 0. V8 will interpret it as end of data (and most
1369
1357
  * probably, parsing will fail). The streaming task will return as soon as
@@ -1389,12 +1377,11 @@ class V8_EXPORT ScriptCompiler {
1389
1377
  virtual void ResetToBookmark();
1390
1378
  };
1391
1379
 
1392
-
1393
1380
  /**
1394
1381
  * Source code which can be streamed into V8 in pieces. It will be parsed
1395
- * while streaming. It can be compiled after the streaming is complete.
1396
- * StreamedSource must be kept alive while the streaming task is ran (see
1397
- * ScriptStreamingTask below).
1382
+ * while streaming and compiled after parsing has completed. StreamedSource
1383
+ * must be kept alive while the streaming task is run (see ScriptStreamingTask
1384
+ * below).
1398
1385
  */
1399
1386
  class V8_EXPORT StreamedSource {
1400
1387
  public:
@@ -1403,37 +1390,35 @@ class V8_EXPORT ScriptCompiler {
1403
1390
  StreamedSource(ExternalSourceStream* source_stream, Encoding encoding);
1404
1391
  ~StreamedSource();
1405
1392
 
1406
- // Ownership of the CachedData or its buffers is *not* transferred to the
1407
- // caller. The CachedData object is alive as long as the StreamedSource
1408
- // object is alive.
1409
- const CachedData* GetCachedData() const;
1410
-
1411
- internal::ScriptStreamingData* impl() const { return impl_; }
1393
+ internal::ScriptStreamingData* impl() const { return impl_.get(); }
1412
1394
 
1413
1395
  // Prevent copying.
1414
1396
  StreamedSource(const StreamedSource&) = delete;
1415
1397
  StreamedSource& operator=(const StreamedSource&) = delete;
1416
1398
 
1417
1399
  private:
1418
- internal::ScriptStreamingData* impl_;
1400
+ std::unique_ptr<internal::ScriptStreamingData> impl_;
1419
1401
  };
1420
1402
 
1421
1403
  /**
1422
1404
  * A streaming task which the embedder must run on a background thread to
1423
1405
  * stream scripts into V8. Returned by ScriptCompiler::StartStreamingScript.
1424
1406
  */
1425
- class ScriptStreamingTask {
1407
+ class V8_EXPORT ScriptStreamingTask final {
1426
1408
  public:
1427
- virtual ~ScriptStreamingTask() {}
1428
- virtual void Run() = 0;
1409
+ void Run();
1410
+
1411
+ private:
1412
+ friend class ScriptCompiler;
1413
+
1414
+ explicit ScriptStreamingTask(internal::ScriptStreamingData* data)
1415
+ : data_(data) {}
1416
+
1417
+ internal::ScriptStreamingData* data_;
1429
1418
  };
1430
1419
 
1431
1420
  enum CompileOptions {
1432
1421
  kNoCompileOptions = 0,
1433
- kProduceParserCache,
1434
- kConsumeParserCache,
1435
- kProduceCodeCache,
1436
- kProduceFullCodeCache,
1437
1422
  kConsumeCodeCache,
1438
1423
  kEagerCompile
1439
1424
  };
@@ -1547,7 +1532,9 @@ class V8_EXPORT ScriptCompiler {
1547
1532
  * ECMAScript specification.
1548
1533
  */
1549
1534
  static V8_WARN_UNUSED_RESULT MaybeLocal<Module> CompileModule(
1550
- Isolate* isolate, Source* source);
1535
+ Isolate* isolate, Source* source,
1536
+ CompileOptions options = kNoCompileOptions,
1537
+ NoCacheReason no_cache_reason = kNoCacheNoReason);
1551
1538
 
1552
1539
  /**
1553
1540
  * Compile a function for a given context. This is equivalent to running
@@ -1559,13 +1546,6 @@ class V8_EXPORT ScriptCompiler {
1559
1546
  * It is possible to specify multiple context extensions (obj in the above
1560
1547
  * example).
1561
1548
  */
1562
- static V8_DEPRECATED("Use maybe version",
1563
- Local<Function> CompileFunctionInContext(
1564
- Isolate* isolate, Source* source,
1565
- Local<Context> context, size_t arguments_count,
1566
- Local<String> arguments[],
1567
- size_t context_extension_count,
1568
- Local<Object> context_extensions[]));
1569
1549
  static V8_WARN_UNUSED_RESULT MaybeLocal<Function> CompileFunctionInContext(
1570
1550
  Local<Context> context, Source* source, size_t arguments_count,
1571
1551
  Local<String> arguments[], size_t context_extension_count,
@@ -1578,8 +1558,15 @@ class V8_EXPORT ScriptCompiler {
1578
1558
  * This will return nullptr if the script cannot be serialized. The
1579
1559
  * CachedData returned by this function should be owned by the caller.
1580
1560
  */
1581
- static CachedData* CreateCodeCache(Local<UnboundScript> unbound_script,
1582
- Local<String> source);
1561
+ static CachedData* CreateCodeCache(Local<UnboundScript> unbound_script);
1562
+
1563
+ /**
1564
+ * Creates and returns code cache for the specified unbound_module_script.
1565
+ * This will return nullptr if the script cannot be serialized. The
1566
+ * CachedData returned by this function should be owned by the caller.
1567
+ */
1568
+ static CachedData* CreateCodeCache(
1569
+ Local<UnboundModuleScript> unbound_module_script);
1583
1570
 
1584
1571
  /**
1585
1572
  * Creates and returns code cache for the specified function that was
@@ -1587,8 +1574,7 @@ class V8_EXPORT ScriptCompiler {
1587
1574
  * This will return nullptr if the script cannot be serialized. The
1588
1575
  * CachedData returned by this function should be owned by the caller.
1589
1576
  */
1590
- static CachedData* CreateCodeCacheForFunction(Local<Function> function,
1591
- Local<String> source);
1577
+ static CachedData* CreateCodeCacheForFunction(Local<Function> function);
1592
1578
 
1593
1579
  private:
1594
1580
  static V8_WARN_UNUSED_RESULT MaybeLocal<UnboundScript> CompileUnboundInternal(
@@ -1604,7 +1590,11 @@ class V8_EXPORT Message {
1604
1590
  public:
1605
1591
  Local<String> Get() const;
1606
1592
 
1607
- V8_DEPRECATED("Use maybe version", Local<String> GetSourceLine() const);
1593
+ /**
1594
+ * Return the isolate to which the Message belongs.
1595
+ */
1596
+ Isolate* GetIsolate() const;
1597
+
1608
1598
  V8_WARN_UNUSED_RESULT MaybeLocal<String> GetSourceLine(
1609
1599
  Local<Context> context) const;
1610
1600
 
@@ -1630,7 +1620,6 @@ class V8_EXPORT Message {
1630
1620
  /**
1631
1621
  * Returns the number, 1-based, of the line where the error occurred.
1632
1622
  */
1633
- V8_DEPRECATED("Use maybe version", int GetLineNumber() const);
1634
1623
  V8_WARN_UNUSED_RESULT Maybe<int> GetLineNumber(Local<Context> context) const;
1635
1624
 
1636
1625
  /**
@@ -1710,7 +1699,7 @@ class V8_EXPORT StackTrace {
1710
1699
  /**
1711
1700
  * Returns a StackFrame at a particular index.
1712
1701
  */
1713
- Local<StackFrame> GetFrame(uint32_t index) const;
1702
+ Local<StackFrame> GetFrame(Isolate* isolate, uint32_t index) const;
1714
1703
 
1715
1704
  /**
1716
1705
  * Returns the number of StackFrames.
@@ -1826,6 +1815,21 @@ struct SampleInfo {
1826
1815
  // executing an external callback.
1827
1816
  };
1828
1817
 
1818
+ struct MemoryRange {
1819
+ const void* start = nullptr;
1820
+ size_t length_in_bytes = 0;
1821
+ };
1822
+
1823
+ struct JSEntryStub {
1824
+ MemoryRange code;
1825
+ };
1826
+
1827
+ struct UnwindState {
1828
+ MemoryRange code_range;
1829
+ MemoryRange embedded_code_range;
1830
+ JSEntryStub js_entry_stub;
1831
+ };
1832
+
1829
1833
  /**
1830
1834
  * A JSON Parser and Stringifier.
1831
1835
  */
@@ -1835,12 +1839,10 @@ class V8_EXPORT JSON {
1835
1839
  * Tries to parse the string |json_string| and returns it as value if
1836
1840
  * successful.
1837
1841
  *
1842
+ * \param the context in which to parse and create the value.
1838
1843
  * \param json_string The string to parse.
1839
1844
  * \return The corresponding value if successfully parsed.
1840
1845
  */
1841
- static V8_DEPRECATE_SOON("Use the maybe version taking context",
1842
- MaybeLocal<Value> Parse(Isolate* isolate,
1843
- Local<String> json_string));
1844
1846
  static V8_WARN_UNUSED_RESULT MaybeLocal<Value> Parse(
1845
1847
  Local<Context> context, Local<String> json_string);
1846
1848
 
@@ -1868,7 +1870,7 @@ class V8_EXPORT ValueSerializer {
1868
1870
  public:
1869
1871
  class V8_EXPORT Delegate {
1870
1872
  public:
1871
- virtual ~Delegate() {}
1873
+ virtual ~Delegate() = default;
1872
1874
 
1873
1875
  /**
1874
1876
  * Handles the case where a DataCloneError would be thrown in the structured
@@ -1898,7 +1900,7 @@ class V8_EXPORT ValueSerializer {
1898
1900
  Isolate* isolate, Local<SharedArrayBuffer> shared_array_buffer);
1899
1901
 
1900
1902
  virtual Maybe<uint32_t> GetWasmModuleTransferId(
1901
- Isolate* isolate, Local<WasmCompiledModule> module);
1903
+ Isolate* isolate, Local<WasmModuleObject> module);
1902
1904
  /**
1903
1905
  * Allocates memory for the buffer of at least the size provided. The actual
1904
1906
  * size (which may be greater or equal) is written to |actual_size|. If no
@@ -1907,12 +1909,16 @@ class V8_EXPORT ValueSerializer {
1907
1909
  * If the memory cannot be allocated, nullptr should be returned.
1908
1910
  * |actual_size| will be ignored. It is assumed that |old_buffer| is still
1909
1911
  * valid in this case and has not been modified.
1912
+ *
1913
+ * The default implementation uses the stdlib's `realloc()` function.
1910
1914
  */
1911
1915
  virtual void* ReallocateBufferMemory(void* old_buffer, size_t size,
1912
1916
  size_t* actual_size);
1913
1917
 
1914
1918
  /**
1915
1919
  * Frees a buffer allocated with |ReallocateBufferMemory|.
1920
+ *
1921
+ * The default implementation uses the stdlib's `free()` function.
1916
1922
  */
1917
1923
  virtual void FreeBufferMemory(void* buffer);
1918
1924
  };
@@ -1932,17 +1938,11 @@ class V8_EXPORT ValueSerializer {
1932
1938
  V8_WARN_UNUSED_RESULT Maybe<bool> WriteValue(Local<Context> context,
1933
1939
  Local<Value> value);
1934
1940
 
1935
- /**
1936
- * Returns the stored data. This serializer should not be used once the buffer
1937
- * is released. The contents are undefined if a previous write has failed.
1938
- */
1939
- V8_DEPRECATE_SOON("Use Release()", std::vector<uint8_t> ReleaseBuffer());
1940
-
1941
1941
  /**
1942
1942
  * Returns the stored data (allocated using the delegate's
1943
- * AllocateBufferMemory) and its size. This serializer should not be used once
1944
- * the buffer is released. The contents are undefined if a previous write has
1945
- * failed.
1943
+ * ReallocateBufferMemory) and its size. This serializer should not be used
1944
+ * once the buffer is released. The contents are undefined if a previous write
1945
+ * has failed. Ownership of the buffer is transferred to the caller.
1946
1946
  */
1947
1947
  V8_WARN_UNUSED_RESULT std::pair<uint8_t*, size_t> Release();
1948
1948
 
@@ -1954,13 +1954,6 @@ class V8_EXPORT ValueSerializer {
1954
1954
  void TransferArrayBuffer(uint32_t transfer_id,
1955
1955
  Local<ArrayBuffer> array_buffer);
1956
1956
 
1957
- /**
1958
- * Similar to TransferArrayBuffer, but for SharedArrayBuffer.
1959
- */
1960
- V8_DEPRECATE_SOON("Use Delegate::GetSharedArrayBufferId",
1961
- void TransferSharedArrayBuffer(
1962
- uint32_t transfer_id,
1963
- Local<SharedArrayBuffer> shared_array_buffer));
1964
1957
 
1965
1958
  /**
1966
1959
  * Indicate whether to treat ArrayBufferView objects as host objects,
@@ -2001,7 +1994,7 @@ class V8_EXPORT ValueDeserializer {
2001
1994
  public:
2002
1995
  class V8_EXPORT Delegate {
2003
1996
  public:
2004
- virtual ~Delegate() {}
1997
+ virtual ~Delegate() = default;
2005
1998
 
2006
1999
  /**
2007
2000
  * The embedder overrides this method to read some kind of host object, if
@@ -2011,10 +2004,10 @@ class V8_EXPORT ValueDeserializer {
2011
2004
  virtual MaybeLocal<Object> ReadHostObject(Isolate* isolate);
2012
2005
 
2013
2006
  /**
2014
- * Get a WasmCompiledModule given a transfer_id previously provided
2007
+ * Get a WasmModuleObject given a transfer_id previously provided
2015
2008
  * by ValueSerializer::GetWasmModuleTransferId
2016
2009
  */
2017
- virtual MaybeLocal<WasmCompiledModule> GetWasmModuleFromId(
2010
+ virtual MaybeLocal<WasmModuleObject> GetWasmModuleFromId(
2018
2011
  Isolate* isolate, uint32_t transfer_id);
2019
2012
 
2020
2013
  /**
@@ -2378,10 +2371,16 @@ class V8_EXPORT Value : public Data {
2378
2371
 
2379
2372
  bool IsWebAssemblyCompiledModule() const;
2380
2373
 
2374
+ /**
2375
+ * Returns true if the value is a Module Namespace Object.
2376
+ */
2377
+ bool IsModuleNamespaceObject() const;
2378
+
2381
2379
  V8_WARN_UNUSED_RESULT MaybeLocal<BigInt> ToBigInt(
2382
2380
  Local<Context> context) const;
2383
- V8_WARN_UNUSED_RESULT MaybeLocal<Boolean> ToBoolean(
2384
- Local<Context> context) const;
2381
+ V8_DEPRECATE_SOON("ToBoolean can never throw. Use Local version.",
2382
+ V8_WARN_UNUSED_RESULT MaybeLocal<Boolean> ToBoolean(
2383
+ Local<Context> context) const);
2385
2384
  V8_WARN_UNUSED_RESULT MaybeLocal<Number> ToNumber(
2386
2385
  Local<Context> context) const;
2387
2386
  V8_WARN_UNUSED_RESULT MaybeLocal<String> ToString(
@@ -2396,8 +2395,7 @@ class V8_EXPORT Value : public Data {
2396
2395
  Local<Context> context) const;
2397
2396
  V8_WARN_UNUSED_RESULT MaybeLocal<Int32> ToInt32(Local<Context> context) const;
2398
2397
 
2399
- V8_DEPRECATE_SOON("Use maybe version",
2400
- Local<Boolean> ToBoolean(Isolate* isolate) const);
2398
+ Local<Boolean> ToBoolean(Isolate* isolate) const;
2401
2399
  V8_DEPRECATE_SOON("Use maybe version",
2402
2400
  Local<Number> ToNumber(Isolate* isolate) const);
2403
2401
  V8_DEPRECATE_SOON("Use maybe version",
@@ -2409,13 +2407,6 @@ class V8_EXPORT Value : public Data {
2409
2407
  V8_DEPRECATE_SOON("Use maybe version",
2410
2408
  Local<Int32> ToInt32(Isolate* isolate) const);
2411
2409
 
2412
- inline V8_DEPRECATE_SOON("Use maybe version",
2413
- Local<Boolean> ToBoolean() const);
2414
- inline V8_DEPRECATE_SOON("Use maybe version", Local<String> ToString() const);
2415
- inline V8_DEPRECATE_SOON("Use maybe version", Local<Object> ToObject() const);
2416
- inline V8_DEPRECATE_SOON("Use maybe version",
2417
- Local<Integer> ToInteger() const);
2418
-
2419
2410
  /**
2420
2411
  * Attempts to convert a string to an array index.
2421
2412
  * Returns an empty handle if the conversion fails.
@@ -2423,7 +2414,11 @@ class V8_EXPORT Value : public Data {
2423
2414
  V8_WARN_UNUSED_RESULT MaybeLocal<Uint32> ToArrayIndex(
2424
2415
  Local<Context> context) const;
2425
2416
 
2426
- V8_WARN_UNUSED_RESULT Maybe<bool> BooleanValue(Local<Context> context) const;
2417
+ bool BooleanValue(Isolate* isolate) const;
2418
+
2419
+ V8_DEPRECATE_SOON("BooleanValue can never throw. Use Isolate version.",
2420
+ V8_WARN_UNUSED_RESULT Maybe<bool> BooleanValue(
2421
+ Local<Context> context) const);
2427
2422
  V8_WARN_UNUSED_RESULT Maybe<double> NumberValue(Local<Context> context) const;
2428
2423
  V8_WARN_UNUSED_RESULT Maybe<int64_t> IntegerValue(
2429
2424
  Local<Context> context) const;
@@ -2431,14 +2426,7 @@ class V8_EXPORT Value : public Data {
2431
2426
  Local<Context> context) const;
2432
2427
  V8_WARN_UNUSED_RESULT Maybe<int32_t> Int32Value(Local<Context> context) const;
2433
2428
 
2434
- V8_DEPRECATE_SOON("Use maybe version", bool BooleanValue() const);
2435
- V8_DEPRECATE_SOON("Use maybe version", double NumberValue() const);
2436
- V8_DEPRECATE_SOON("Use maybe version", int64_t IntegerValue() const);
2437
- V8_DEPRECATE_SOON("Use maybe version", uint32_t Uint32Value() const);
2438
- V8_DEPRECATE_SOON("Use maybe version", int32_t Int32Value() const);
2439
-
2440
2429
  /** JS == */
2441
- V8_DEPRECATE_SOON("Use maybe version", bool Equals(Local<Value> that) const);
2442
2430
  V8_WARN_UNUSED_RESULT Maybe<bool> Equals(Local<Context> context,
2443
2431
  Local<Value> that) const;
2444
2432
  bool StrictEquals(Local<Value> that) const;
@@ -2527,8 +2515,9 @@ enum class NewStringType {
2527
2515
  */
2528
2516
  class V8_EXPORT String : public Name {
2529
2517
  public:
2530
- static constexpr int kMaxLength =
2531
- sizeof(void*) == 4 ? (1 << 28) - 16 : (1 << 30) - 1 - 24;
2518
+ static constexpr int kMaxLength = internal::kApiTaggedSize == 4
2519
+ ? (1 << 28) - 16
2520
+ : internal::kSmiMaxValue / 2 - 24;
2532
2521
 
2533
2522
  enum Encoding {
2534
2523
  UNKNOWN_ENCODING = 0x1,
@@ -2544,7 +2533,7 @@ class V8_EXPORT String : public Name {
2544
2533
  * Returns the number of bytes in the UTF-8 encoded
2545
2534
  * representation of this string.
2546
2535
  */
2547
- int Utf8Length() const;
2536
+ int Utf8Length(Isolate* isolate) const;
2548
2537
 
2549
2538
  /**
2550
2539
  * Returns whether this string is known to contain only one byte data,
@@ -2598,20 +2587,14 @@ class V8_EXPORT String : public Name {
2598
2587
  };
2599
2588
 
2600
2589
  // 16-bit character codes.
2601
- int Write(uint16_t* buffer,
2602
- int start = 0,
2603
- int length = -1,
2590
+ int Write(Isolate* isolate, uint16_t* buffer, int start = 0, int length = -1,
2604
2591
  int options = NO_OPTIONS) const;
2605
2592
  // One byte characters.
2606
- int WriteOneByte(uint8_t* buffer,
2607
- int start = 0,
2608
- int length = -1,
2609
- int options = NO_OPTIONS) const;
2593
+ int WriteOneByte(Isolate* isolate, uint8_t* buffer, int start = 0,
2594
+ int length = -1, int options = NO_OPTIONS) const;
2610
2595
  // UTF-8 encoded characters.
2611
- int WriteUtf8(char* buffer,
2612
- int length = -1,
2613
- int* nchars_ref = NULL,
2614
- int options = NO_OPTIONS) const;
2596
+ int WriteUtf8(Isolate* isolate, char* buffer, int length = -1,
2597
+ int* nchars_ref = nullptr, int options = NO_OPTIONS) const;
2615
2598
 
2616
2599
  /**
2617
2600
  * A zero length string.
@@ -2630,12 +2613,21 @@ class V8_EXPORT String : public Name {
2630
2613
 
2631
2614
  class V8_EXPORT ExternalStringResourceBase { // NOLINT
2632
2615
  public:
2633
- virtual ~ExternalStringResourceBase() {}
2616
+ virtual ~ExternalStringResourceBase() = default;
2634
2617
 
2635
- virtual bool IsCompressible() const { return false; }
2618
+ V8_DEPRECATED("Use IsCacheable().", virtual bool IsCompressible() const) {
2619
+ return false;
2620
+ }
2621
+
2622
+ /**
2623
+ * If a string is cacheable, the value returned by
2624
+ * ExternalStringResource::data() may be cached, otherwise it is not
2625
+ * expected to be stable beyond the current top-level task.
2626
+ */
2627
+ virtual bool IsCacheable() const { return true; }
2636
2628
 
2637
2629
  protected:
2638
- ExternalStringResourceBase() {}
2630
+ ExternalStringResourceBase() = default;
2639
2631
 
2640
2632
  /**
2641
2633
  * Internally V8 will call this Dispose method when the external string
@@ -2645,6 +2637,24 @@ class V8_EXPORT String : public Name {
2645
2637
  */
2646
2638
  virtual void Dispose() { delete this; }
2647
2639
 
2640
+ /**
2641
+ * For a non-cacheable string, the value returned by
2642
+ * |ExternalStringResource::data()| has to be stable between |Lock()| and
2643
+ * |Unlock()|, that is the string must behave as is |IsCacheable()| returned
2644
+ * true.
2645
+ *
2646
+ * These two functions must be thread-safe, and can be called from anywhere.
2647
+ * They also must handle lock depth, in the sense that each can be called
2648
+ * several times, from different threads, and unlocking should only happen
2649
+ * when the balance of Lock() and Unlock() calls is 0.
2650
+ */
2651
+ virtual void Lock() const {}
2652
+
2653
+ /**
2654
+ * Unlocks the string.
2655
+ */
2656
+ virtual void Unlock() const {}
2657
+
2648
2658
  // Disallow copying and assigning.
2649
2659
  ExternalStringResourceBase(const ExternalStringResourceBase&) = delete;
2650
2660
  void operator=(const ExternalStringResourceBase&) = delete;
@@ -2652,6 +2662,7 @@ class V8_EXPORT String : public Name {
2652
2662
  private:
2653
2663
  friend class internal::Heap;
2654
2664
  friend class v8::String;
2665
+ friend class internal::ScopedExternalStringLock;
2655
2666
  };
2656
2667
 
2657
2668
  /**
@@ -2667,7 +2678,7 @@ class V8_EXPORT String : public Name {
2667
2678
  * Override the destructor to manage the life cycle of the underlying
2668
2679
  * buffer.
2669
2680
  */
2670
- virtual ~ExternalStringResource() {}
2681
+ ~ExternalStringResource() override = default;
2671
2682
 
2672
2683
  /**
2673
2684
  * The string data from the underlying buffer.
@@ -2680,7 +2691,7 @@ class V8_EXPORT String : public Name {
2680
2691
  virtual size_t length() const = 0;
2681
2692
 
2682
2693
  protected:
2683
- ExternalStringResource() {}
2694
+ ExternalStringResource() = default;
2684
2695
  };
2685
2696
 
2686
2697
  /**
@@ -2700,13 +2711,13 @@ class V8_EXPORT String : public Name {
2700
2711
  * Override the destructor to manage the life cycle of the underlying
2701
2712
  * buffer.
2702
2713
  */
2703
- virtual ~ExternalOneByteStringResource() {}
2714
+ ~ExternalOneByteStringResource() override = default;
2704
2715
  /** The string data from the underlying buffer.*/
2705
2716
  virtual const char* data() const = 0;
2706
2717
  /** The number of Latin-1 characters in the string.*/
2707
2718
  virtual size_t length() const = 0;
2708
2719
  protected:
2709
- ExternalOneByteStringResource() {}
2720
+ ExternalOneByteStringResource() = default;
2710
2721
  };
2711
2722
 
2712
2723
  /**
@@ -2738,7 +2749,7 @@ class V8_EXPORT String : public Name {
2738
2749
  };
2739
2750
 
2740
2751
  /** Allocates a new string from UTF-8 data.*/
2741
- static V8_DEPRECATE_SOON(
2752
+ static V8_DEPRECATED(
2742
2753
  "Use maybe version",
2743
2754
  Local<String> NewFromUtf8(Isolate* isolate, const char* data,
2744
2755
  NewStringType type = kNormalString,
@@ -2773,7 +2784,8 @@ class V8_EXPORT String : public Name {
2773
2784
  * Creates a new string by concatenating the left and the right strings
2774
2785
  * passed in as parameters.
2775
2786
  */
2776
- static Local<String> Concat(Local<String> left, Local<String> right);
2787
+ static Local<String> Concat(Isolate* isolate, Local<String> left,
2788
+ Local<String> right);
2777
2789
 
2778
2790
  /**
2779
2791
  * Creates a new external string using the data defined in the given
@@ -2828,6 +2840,11 @@ class V8_EXPORT String : public Name {
2828
2840
  */
2829
2841
  bool CanMakeExternal();
2830
2842
 
2843
+ /**
2844
+ * Returns true if the strings values are equal. Same as JS ==/===.
2845
+ */
2846
+ bool StringEquals(Local<String> str);
2847
+
2831
2848
  /**
2832
2849
  * Converts an object to a UTF-8-encoded character array. Useful if
2833
2850
  * you want to print the object. If conversion to a string fails
@@ -2837,8 +2854,6 @@ class V8_EXPORT String : public Name {
2837
2854
  */
2838
2855
  class V8_EXPORT Utf8Value {
2839
2856
  public:
2840
- V8_DEPRECATED("Use Isolate version",
2841
- explicit Utf8Value(Local<v8::Value> obj));
2842
2857
  Utf8Value(Isolate* isolate, Local<v8::Value> obj);
2843
2858
  ~Utf8Value();
2844
2859
  char* operator*() { return str_; }
@@ -2862,7 +2877,6 @@ class V8_EXPORT String : public Name {
2862
2877
  */
2863
2878
  class V8_EXPORT Value {
2864
2879
  public:
2865
- V8_DEPRECATED("Use Isolate version", explicit Value(Local<v8::Value> obj));
2866
2880
  Value(Isolate* isolate, Local<v8::Value> obj);
2867
2881
  ~Value();
2868
2882
  uint16_t* operator*() { return str_; }
@@ -2882,6 +2896,10 @@ class V8_EXPORT String : public Name {
2882
2896
  void VerifyExternalStringResourceBase(ExternalStringResourceBase* v,
2883
2897
  Encoding encoding) const;
2884
2898
  void VerifyExternalStringResource(ExternalStringResource* val) const;
2899
+ ExternalStringResource* GetExternalStringResourceSlow() const;
2900
+ ExternalStringResourceBase* GetExternalStringResourceBaseSlow(
2901
+ String::Encoding* encoding_out) const;
2902
+
2885
2903
  static void CheckCast(v8::Value* obj);
2886
2904
  };
2887
2905
 
@@ -2918,6 +2936,7 @@ class V8_EXPORT Symbol : public Name {
2918
2936
  static Local<Symbol> ForApi(Isolate *isolate, Local<String> name);
2919
2937
 
2920
2938
  // Well-known symbols
2939
+ static Local<Symbol> GetAsyncIterator(Isolate* isolate);
2921
2940
  static Local<Symbol> GetHasInstance(Isolate* isolate);
2922
2941
  static Local<Symbol> GetIsConcatSpreadable(Isolate* isolate);
2923
2942
  static Local<Symbol> GetIterator(Isolate* isolate);
@@ -3037,6 +3056,48 @@ class V8_EXPORT Uint32 : public Integer {
3037
3056
  class V8_EXPORT BigInt : public Primitive {
3038
3057
  public:
3039
3058
  static Local<BigInt> New(Isolate* isolate, int64_t value);
3059
+ static Local<BigInt> NewFromUnsigned(Isolate* isolate, uint64_t value);
3060
+ /**
3061
+ * Creates a new BigInt object using a specified sign bit and a
3062
+ * specified list of digits/words.
3063
+ * The resulting number is calculated as:
3064
+ *
3065
+ * (-1)^sign_bit * (words[0] * (2^64)^0 + words[1] * (2^64)^1 + ...)
3066
+ */
3067
+ static MaybeLocal<BigInt> NewFromWords(Local<Context> context, int sign_bit,
3068
+ int word_count, const uint64_t* words);
3069
+
3070
+ /**
3071
+ * Returns the value of this BigInt as an unsigned 64-bit integer.
3072
+ * If `lossless` is provided, it will reflect whether the return value was
3073
+ * truncated or wrapped around. In particular, it is set to `false` if this
3074
+ * BigInt is negative.
3075
+ */
3076
+ uint64_t Uint64Value(bool* lossless = nullptr) const;
3077
+
3078
+ /**
3079
+ * Returns the value of this BigInt as a signed 64-bit integer.
3080
+ * If `lossless` is provided, it will reflect whether this BigInt was
3081
+ * truncated or not.
3082
+ */
3083
+ int64_t Int64Value(bool* lossless = nullptr) const;
3084
+
3085
+ /**
3086
+ * Returns the number of 64-bit words needed to store the result of
3087
+ * ToWordsArray().
3088
+ */
3089
+ int WordCount() const;
3090
+
3091
+ /**
3092
+ * Writes the contents of this BigInt to a specified memory location.
3093
+ * `sign_bit` must be provided and will be set to 1 if this BigInt is
3094
+ * negative.
3095
+ * `*word_count` has to be initialized to the length of the `words` array.
3096
+ * Upon return, it will be set to the actual number of words that would
3097
+ * be needed to store this BigInt (i.e. the return value of `WordCount()`).
3098
+ */
3099
+ void ToWordsArray(int* sign_bit, int* word_count, uint64_t* words) const;
3100
+
3040
3101
  V8_INLINE static BigInt* Cast(v8::Value* obj);
3041
3102
 
3042
3103
  private:
@@ -3113,10 +3174,17 @@ enum PropertyFilter {
3113
3174
  * Options for marking whether callbacks may trigger JS-observable side effects.
3114
3175
  * Side-effect-free callbacks are whitelisted during debug evaluation with
3115
3176
  * throwOnSideEffect. It applies when calling a Function, FunctionTemplate,
3116
- * or an Accessor's getter callback. For Interceptors, please see
3177
+ * or an Accessor callback. For Interceptors, please see
3117
3178
  * PropertyHandlerFlags's kHasNoSideEffect.
3179
+ * Callbacks that only cause side effects to the receiver are whitelisted if
3180
+ * invoked on receiver objects that are created within the same debug-evaluate
3181
+ * call, as these objects are temporary and the side effect does not escape.
3118
3182
  */
3119
- enum class SideEffectType { kHasSideEffect, kHasNoSideEffect };
3183
+ enum class SideEffectType {
3184
+ kHasSideEffect,
3185
+ kHasNoSideEffect,
3186
+ kHasSideEffectToReceiver
3187
+ };
3120
3188
 
3121
3189
  /**
3122
3190
  * Keys/Properties filter enums:
@@ -3151,6 +3219,10 @@ class V8_EXPORT Object : public Value {
3151
3219
  public:
3152
3220
  V8_DEPRECATE_SOON("Use maybe version",
3153
3221
  bool Set(Local<Value> key, Local<Value> value));
3222
+ /**
3223
+ * Set only return Just(true) or Empty(), so if it should never fail, use
3224
+ * result.Check().
3225
+ */
3154
3226
  V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context,
3155
3227
  Local<Value> key, Local<Value> value);
3156
3228
 
@@ -3221,7 +3293,6 @@ class V8_EXPORT Object : public Value {
3221
3293
  V8_WARN_UNUSED_RESULT MaybeLocal<Value> GetOwnPropertyDescriptor(
3222
3294
  Local<Context> context, Local<Name> key);
3223
3295
 
3224
- V8_DEPRECATE_SOON("Use maybe version", bool Has(Local<Value> key));
3225
3296
  /**
3226
3297
  * Object::Has() calls the abstract operation HasProperty(O, P) described
3227
3298
  * in ECMA-262, 7.3.10. Has() returns
@@ -3240,7 +3311,6 @@ class V8_EXPORT Object : public Value {
3240
3311
  V8_WARN_UNUSED_RESULT Maybe<bool> Has(Local<Context> context,
3241
3312
  Local<Value> key);
3242
3313
 
3243
- V8_DEPRECATE_SOON("Use maybe version", bool Delete(Local<Value> key));
3244
3314
  V8_WARN_UNUSED_RESULT Maybe<bool> Delete(Local<Context> context,
3245
3315
  Local<Value> key);
3246
3316
 
@@ -3254,10 +3324,12 @@ class V8_EXPORT Object : public Value {
3254
3324
  */
3255
3325
  V8_WARN_UNUSED_RESULT Maybe<bool> SetAccessor(
3256
3326
  Local<Context> context, Local<Name> name,
3257
- AccessorNameGetterCallback getter, AccessorNameSetterCallback setter = 0,
3327
+ AccessorNameGetterCallback getter,
3328
+ AccessorNameSetterCallback setter = nullptr,
3258
3329
  MaybeLocal<Value> data = MaybeLocal<Value>(),
3259
3330
  AccessControl settings = DEFAULT, PropertyAttribute attribute = None,
3260
- SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect);
3331
+ SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
3332
+ SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
3261
3333
 
3262
3334
  void SetAccessorProperty(Local<Name> name, Local<Function> getter,
3263
3335
  Local<Function> setter = Local<Function>(),
@@ -3273,7 +3345,8 @@ class V8_EXPORT Object : public Value {
3273
3345
  AccessorNameGetterCallback getter,
3274
3346
  AccessorNameSetterCallback setter = nullptr,
3275
3347
  Local<Value> data = Local<Value>(), PropertyAttribute attributes = None,
3276
- SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect);
3348
+ SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
3349
+ SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
3277
3350
 
3278
3351
  /**
3279
3352
  * Attempts to create a property with the given name which behaves like a data
@@ -3287,7 +3360,8 @@ class V8_EXPORT Object : public Value {
3287
3360
  Local<Context> context, Local<Name> name,
3288
3361
  AccessorNameGetterCallback getter, Local<Value> data = Local<Value>(),
3289
3362
  PropertyAttribute attributes = None,
3290
- SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect);
3363
+ SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
3364
+ SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
3291
3365
 
3292
3366
  /**
3293
3367
  * Functionality for private properties.
@@ -3307,7 +3381,7 @@ class V8_EXPORT Object : public Value {
3307
3381
  * array returned by this method contains the same values as would
3308
3382
  * be enumerated by a for-in statement over this object.
3309
3383
  */
3310
- V8_DEPRECATE_SOON("Use maybe version", Local<Array> GetPropertyNames());
3384
+ V8_DEPRECATED("Use maybe version", Local<Array> GetPropertyNames());
3311
3385
  V8_WARN_UNUSED_RESULT MaybeLocal<Array> GetPropertyNames(
3312
3386
  Local<Context> context);
3313
3387
  V8_WARN_UNUSED_RESULT MaybeLocal<Array> GetPropertyNames(
@@ -3320,7 +3394,7 @@ class V8_EXPORT Object : public Value {
3320
3394
  * the returned array doesn't contain the names of properties from
3321
3395
  * prototype objects.
3322
3396
  */
3323
- V8_DEPRECATE_SOON("Use maybe version", Local<Array> GetOwnPropertyNames());
3397
+ V8_DEPRECATED("Use maybe version", Local<Array> GetOwnPropertyNames());
3324
3398
  V8_WARN_UNUSED_RESULT MaybeLocal<Array> GetOwnPropertyNames(
3325
3399
  Local<Context> context);
3326
3400
 
@@ -3419,8 +3493,8 @@ class V8_EXPORT Object : public Value {
3419
3493
  Local<Name> key);
3420
3494
  V8_WARN_UNUSED_RESULT Maybe<bool> HasOwnProperty(Local<Context> context,
3421
3495
  uint32_t index);
3422
- V8_DEPRECATE_SOON("Use maybe version",
3423
- bool HasRealNamedProperty(Local<String> key));
3496
+ V8_DEPRECATED("Use maybe version",
3497
+ bool HasRealNamedProperty(Local<String> key));
3424
3498
  /**
3425
3499
  * Use HasRealNamedProperty() if you want to check if an object has an own
3426
3500
  * property without causing side effects, i.e., without calling interceptors.
@@ -3436,12 +3510,12 @@ class V8_EXPORT Object : public Value {
3436
3510
  */
3437
3511
  V8_WARN_UNUSED_RESULT Maybe<bool> HasRealNamedProperty(Local<Context> context,
3438
3512
  Local<Name> key);
3439
- V8_DEPRECATE_SOON("Use maybe version",
3440
- bool HasRealIndexedProperty(uint32_t index));
3513
+ V8_DEPRECATED("Use maybe version",
3514
+ bool HasRealIndexedProperty(uint32_t index));
3441
3515
  V8_WARN_UNUSED_RESULT Maybe<bool> HasRealIndexedProperty(
3442
3516
  Local<Context> context, uint32_t index);
3443
- V8_DEPRECATE_SOON("Use maybe version",
3444
- bool HasRealNamedCallbackProperty(Local<String> key));
3517
+ V8_DEPRECATED("Use maybe version",
3518
+ bool HasRealNamedCallbackProperty(Local<String> key));
3445
3519
  V8_WARN_UNUSED_RESULT Maybe<bool> HasRealNamedCallbackProperty(
3446
3520
  Local<Context> context, Local<Name> key);
3447
3521
 
@@ -3544,8 +3618,31 @@ class V8_EXPORT Object : public Value {
3544
3618
  */
3545
3619
  Isolate* GetIsolate();
3546
3620
 
3621
+ /**
3622
+ * If this object is a Set, Map, WeakSet or WeakMap, this returns a
3623
+ * representation of the elements of this object as an array.
3624
+ * If this object is a SetIterator or MapIterator, this returns all
3625
+ * elements of the underlying collection, starting at the iterator's current
3626
+ * position.
3627
+ * For other types, this will return an empty MaybeLocal<Array> (without
3628
+ * scheduling an exception).
3629
+ */
3630
+ MaybeLocal<Array> PreviewEntries(bool* is_key_value);
3631
+
3547
3632
  static Local<Object> New(Isolate* isolate);
3548
3633
 
3634
+ /**
3635
+ * Creates a JavaScript object with the given properties, and
3636
+ * a the given prototype_or_null (which can be any JavaScript
3637
+ * value, and if it's null, the newly created object won't have
3638
+ * a prototype at all). This is similar to Object.create().
3639
+ * All properties will be created as enumerable, configurable
3640
+ * and writable properties.
3641
+ */
3642
+ static Local<Object> New(Isolate* isolate, Local<Value> prototype_or_null,
3643
+ Local<Name>* names, Local<Value>* values,
3644
+ size_t length);
3645
+
3549
3646
  V8_INLINE static Object* Cast(Value* obj);
3550
3647
 
3551
3648
  private:
@@ -3569,6 +3666,12 @@ class V8_EXPORT Array : public Object {
3569
3666
  */
3570
3667
  static Local<Array> New(Isolate* isolate, int length = 0);
3571
3668
 
3669
+ /**
3670
+ * Creates a JavaScript array out of a Local<Value> array in C++
3671
+ * with a known length.
3672
+ */
3673
+ static Local<Array> New(Isolate* isolate, Local<Value>* elements,
3674
+ size_t length);
3572
3675
  V8_INLINE static Array* Cast(Value* obj);
3573
3676
  private:
3574
3677
  Array();
@@ -3653,8 +3756,8 @@ class ReturnValue {
3653
3756
  }
3654
3757
  // Local setters
3655
3758
  template <typename S>
3656
- V8_INLINE V8_DEPRECATE_SOON("Use Global<> instead",
3657
- void Set(const Persistent<S>& handle));
3759
+ V8_INLINE V8_DEPRECATED("Use Global<> instead",
3760
+ void Set(const Persistent<S>& handle));
3658
3761
  template <typename S>
3659
3762
  V8_INLINE void Set(const Global<S>& handle);
3660
3763
  template <typename S>
@@ -3686,10 +3789,10 @@ class ReturnValue {
3686
3789
  template<class F> friend class PropertyCallbackInfo;
3687
3790
  template <class F, class G, class H>
3688
3791
  friend class PersistentValueMapBase;
3689
- V8_INLINE void SetInternal(internal::Object* value) { *value_ = value; }
3690
- V8_INLINE internal::Object* GetDefaultValue();
3691
- V8_INLINE explicit ReturnValue(internal::Object** slot);
3692
- internal::Object** value_;
3792
+ V8_INLINE void SetInternal(internal::Address value) { *value_ = value; }
3793
+ V8_INLINE internal::Address GetDefaultValue();
3794
+ V8_INLINE explicit ReturnValue(internal::Address* slot);
3795
+ internal::Address* value_;
3693
3796
  };
3694
3797
 
3695
3798
 
@@ -3743,10 +3846,10 @@ class FunctionCallbackInfo {
3743
3846
  static const int kDataIndex = 4;
3744
3847
  static const int kNewTargetIndex = 5;
3745
3848
 
3746
- V8_INLINE FunctionCallbackInfo(internal::Object** implicit_args,
3747
- internal::Object** values, int length);
3748
- internal::Object** implicit_args_;
3749
- internal::Object** values_;
3849
+ V8_INLINE FunctionCallbackInfo(internal::Address* implicit_args,
3850
+ internal::Address* values, int length);
3851
+ internal::Address* implicit_args_;
3852
+ internal::Address* values_;
3750
3853
  int length_;
3751
3854
  };
3752
3855
 
@@ -3858,8 +3961,8 @@ class PropertyCallbackInfo {
3858
3961
  static const int kDataIndex = 5;
3859
3962
  static const int kThisIndex = 6;
3860
3963
 
3861
- V8_INLINE PropertyCallbackInfo(internal::Object** args) : args_(args) {}
3862
- internal::Object** args_;
3964
+ V8_INLINE PropertyCallbackInfo(internal::Address* args) : args_(args) {}
3965
+ internal::Address* args_;
3863
3966
  };
3864
3967
 
3865
3968
 
@@ -3881,10 +3984,11 @@ class V8_EXPORT Function : public Object {
3881
3984
  Local<Value> data = Local<Value>(), int length = 0,
3882
3985
  ConstructorBehavior behavior = ConstructorBehavior::kAllow,
3883
3986
  SideEffectType side_effect_type = SideEffectType::kHasSideEffect);
3884
- static V8_DEPRECATE_SOON(
3885
- "Use maybe version",
3886
- Local<Function> New(Isolate* isolate, FunctionCallback callback,
3887
- Local<Value> data = Local<Value>(), int length = 0));
3987
+ static V8_DEPRECATED("Use maybe version",
3988
+ Local<Function> New(Isolate* isolate,
3989
+ FunctionCallback callback,
3990
+ Local<Value> data = Local<Value>(),
3991
+ int length = 0));
3888
3992
 
3889
3993
  V8_WARN_UNUSED_RESULT MaybeLocal<Object> NewInstance(
3890
3994
  Local<Context> context, int argc, Local<Value> argv[]) const;
@@ -3894,9 +3998,18 @@ class V8_EXPORT Function : public Object {
3894
3998
  return NewInstance(context, 0, nullptr);
3895
3999
  }
3896
4000
 
3897
- V8_DEPRECATE_SOON("Use maybe version",
3898
- Local<Value> Call(Local<Value> recv, int argc,
3899
- Local<Value> argv[]));
4001
+ /**
4002
+ * When side effect checks are enabled, passing kHasNoSideEffect allows the
4003
+ * constructor to be invoked without throwing. Calls made within the
4004
+ * constructor are still checked.
4005
+ */
4006
+ V8_WARN_UNUSED_RESULT MaybeLocal<Object> NewInstanceWithSideEffectType(
4007
+ Local<Context> context, int argc, Local<Value> argv[],
4008
+ SideEffectType side_effect_type = SideEffectType::kHasSideEffect) const;
4009
+
4010
+ V8_DEPRECATED("Use maybe version",
4011
+ Local<Value> Call(Local<Value> recv, int argc,
4012
+ Local<Value> argv[]));
3900
4013
  V8_WARN_UNUSED_RESULT MaybeLocal<Value> Call(Local<Context> context,
3901
4014
  Local<Value> recv, int argc,
3902
4015
  Local<Value> argv[]);
@@ -3976,8 +4089,6 @@ class V8_EXPORT Promise : public Object {
3976
4089
  /**
3977
4090
  * Create a new resolver, along with an associated promise in pending state.
3978
4091
  */
3979
- static V8_DEPRECATED("Use maybe version",
3980
- Local<Resolver> New(Isolate* isolate));
3981
4092
  static V8_WARN_UNUSED_RESULT MaybeLocal<Resolver> New(
3982
4093
  Local<Context> context);
3983
4094
 
@@ -3990,11 +4101,9 @@ class V8_EXPORT Promise : public Object {
3990
4101
  * Resolve/reject the associated promise with a given value.
3991
4102
  * Ignored if the promise is no longer pending.
3992
4103
  */
3993
- V8_DEPRECATED("Use maybe version", void Resolve(Local<Value> value));
3994
4104
  V8_WARN_UNUSED_RESULT Maybe<bool> Resolve(Local<Context> context,
3995
4105
  Local<Value> value);
3996
4106
 
3997
- V8_DEPRECATED("Use maybe version", void Reject(Local<Value> value));
3998
4107
  V8_WARN_UNUSED_RESULT Maybe<bool> Reject(Local<Context> context,
3999
4108
  Local<Value> value);
4000
4109
 
@@ -4017,6 +4126,10 @@ class V8_EXPORT Promise : public Object {
4017
4126
  V8_WARN_UNUSED_RESULT MaybeLocal<Promise> Then(Local<Context> context,
4018
4127
  Local<Function> handler);
4019
4128
 
4129
+ V8_WARN_UNUSED_RESULT MaybeLocal<Promise> Then(Local<Context> context,
4130
+ Local<Function> on_fulfilled,
4131
+ Local<Function> on_rejected);
4132
+
4020
4133
  /**
4021
4134
  * Returns true if the promise has at least one derived promise, and
4022
4135
  * therefore resolve/reject handlers (including default handler).
@@ -4034,6 +4147,11 @@ class V8_EXPORT Promise : public Object {
4034
4147
  */
4035
4148
  PromiseState State();
4036
4149
 
4150
+ /**
4151
+ * Marks this promise as handled to avoid reporting unhandled rejections.
4152
+ */
4153
+ void MarkAsHandled();
4154
+
4037
4155
  V8_INLINE static Promise* Cast(Value* obj);
4038
4156
 
4039
4157
  static const int kEmbedderFieldCount = V8_PROMISE_INTERNAL_FIELD_COUNT;
@@ -4076,8 +4194,16 @@ class V8_EXPORT PropertyDescriptor {
4076
4194
  // GenericDescriptor
4077
4195
  PropertyDescriptor();
4078
4196
 
4197
+ // DataDescriptor (implicit / DEPRECATED)
4198
+ // Templatized such that the explicit constructor is chosen first.
4199
+ // TODO(clemensh): Remove after 7.3 branch.
4200
+ template <std::nullptr_t = nullptr>
4201
+ V8_DEPRECATED(
4202
+ "Use explicit constructor",
4203
+ PropertyDescriptor(Local<Value> value)); // NOLINT(runtime/explicit)
4204
+
4079
4205
  // DataDescriptor
4080
- PropertyDescriptor(Local<Value> value);
4206
+ explicit PropertyDescriptor(Local<Value> value);
4081
4207
 
4082
4208
  // DataDescriptor with writable property
4083
4209
  PropertyDescriptor(Local<Value> value, bool writable);
@@ -4116,6 +4242,11 @@ class V8_EXPORT PropertyDescriptor {
4116
4242
  PrivateData* private_;
4117
4243
  };
4118
4244
 
4245
+ // TODO(clemensh): Remove after 7.3 branch.
4246
+ template <std::nullptr_t>
4247
+ PropertyDescriptor::PropertyDescriptor(Local<Value> value)
4248
+ : PropertyDescriptor(value) {}
4249
+
4119
4250
  /**
4120
4251
  * An instance of the built-in Proxy constructor (ECMA-262, 6th Edition,
4121
4252
  * 26.2.1).
@@ -4141,19 +4272,97 @@ class V8_EXPORT Proxy : public Object {
4141
4272
  static void CheckCast(Value* obj);
4142
4273
  };
4143
4274
 
4144
- // TODO(mtrofin): rename WasmCompiledModule to WasmModuleObject, for
4145
- // consistency with internal APIs.
4146
- class V8_EXPORT WasmCompiledModule : public Object {
4275
+ /**
4276
+ * Points to an unowned continous buffer holding a known number of elements.
4277
+ *
4278
+ * This is similar to std::span (under consideration for C++20), but does not
4279
+ * require advanced C++ support. In the (far) future, this may be replaced with
4280
+ * or aliased to std::span.
4281
+ *
4282
+ * To facilitate future migration, this class exposes a subset of the interface
4283
+ * implemented by std::span.
4284
+ */
4285
+ template <typename T>
4286
+ class V8_EXPORT MemorySpan {
4287
+ public:
4288
+ /** The default constructor creates an empty span. */
4289
+ constexpr MemorySpan() = default;
4290
+
4291
+ constexpr MemorySpan(T* data, size_t size) : data_(data), size_(size) {}
4292
+
4293
+ /** Returns a pointer to the beginning of the buffer. */
4294
+ constexpr T* data() const { return data_; }
4295
+ /** Returns the number of elements that the buffer holds. */
4296
+ constexpr size_t size() const { return size_; }
4297
+
4298
+ private:
4299
+ T* data_ = nullptr;
4300
+ size_t size_ = 0;
4301
+ };
4302
+
4303
+ /**
4304
+ * An owned byte buffer with associated size.
4305
+ */
4306
+ struct OwnedBuffer {
4307
+ std::unique_ptr<const uint8_t[]> buffer;
4308
+ size_t size = 0;
4309
+ OwnedBuffer(std::unique_ptr<const uint8_t[]> buffer, size_t size)
4310
+ : buffer(std::move(buffer)), size(size) {}
4311
+ OwnedBuffer() = default;
4312
+ };
4313
+
4314
+ // Wrapper around a compiled WebAssembly module, which is potentially shared by
4315
+ // different WasmModuleObjects.
4316
+ class V8_EXPORT CompiledWasmModule {
4317
+ public:
4318
+ /**
4319
+ * Serialize the compiled module. The serialized data does not include the
4320
+ * wire bytes.
4321
+ */
4322
+ OwnedBuffer Serialize();
4323
+
4324
+ /**
4325
+ * Get the (wasm-encoded) wire bytes that were used to compile this module.
4326
+ */
4327
+ MemorySpan<const uint8_t> GetWireBytesRef();
4328
+
4329
+ private:
4330
+ explicit CompiledWasmModule(std::shared_ptr<internal::wasm::NativeModule>);
4331
+ friend class Utils;
4332
+
4333
+ const std::shared_ptr<internal::wasm::NativeModule> native_module_;
4334
+ };
4335
+
4336
+ // An instance of WebAssembly.Module.
4337
+ class V8_EXPORT WasmModuleObject : public Object {
4147
4338
  public:
4148
- typedef std::pair<std::unique_ptr<const uint8_t[]>, size_t> SerializedModule;
4339
+ // TODO(clemensh): Remove after 7.3 branch.
4340
+ V8_DEPRECATED("Use OwnedBuffer", typedef)
4341
+ std::pair<std::unique_ptr<const uint8_t[]>, size_t> SerializedModule;
4342
+
4149
4343
  /**
4150
- * A buffer that is owned by the caller.
4344
+ * A unowned reference to a byte buffer.
4345
+ * TODO(clemensh): Remove after 7.3 branch.
4151
4346
  */
4152
- typedef std::pair<const uint8_t*, size_t> CallerOwnedBuffer;
4347
+ V8_DEPRECATED("Use MemorySpan<const uint8_t>", struct) BufferReference {
4348
+ const uint8_t* start;
4349
+ size_t size;
4350
+ BufferReference(const uint8_t* start, size_t size)
4351
+ : start(start), size(size) {}
4352
+
4353
+ // Implicit conversion to and from MemorySpan<const uint8_t>.
4354
+ BufferReference(MemorySpan<const uint8_t> span) // NOLINT(runtime/explicit)
4355
+ : start(span.data()), size(span.size()) {}
4356
+ operator MemorySpan<const uint8_t>() const {
4357
+ return MemorySpan<const uint8_t>{start, size};
4358
+ }
4359
+ };
4153
4360
 
4154
4361
  /**
4155
4362
  * An opaque, native heap object for transferring wasm modules. It
4156
4363
  * supports move semantics, and does not support copy semantics.
4364
+ * TODO(wasm): Merge this with CompiledWasmModule once code sharing is always
4365
+ * enabled.
4157
4366
  */
4158
4367
  class TransferrableModule final {
4159
4368
  public:
@@ -4164,13 +4373,16 @@ class V8_EXPORT WasmCompiledModule : public Object {
4164
4373
  TransferrableModule& operator=(const TransferrableModule& src) = delete;
4165
4374
 
4166
4375
  private:
4167
- typedef std::pair<std::unique_ptr<const uint8_t[]>, size_t> OwnedBuffer;
4168
- friend class WasmCompiledModule;
4169
- TransferrableModule(OwnedBuffer&& code, OwnedBuffer&& bytes)
4170
- : compiled_code(std::move(code)), wire_bytes(std::move(bytes)) {}
4171
-
4172
- OwnedBuffer compiled_code = {nullptr, 0};
4173
- OwnedBuffer wire_bytes = {nullptr, 0};
4376
+ typedef std::shared_ptr<internal::wasm::NativeModule> SharedModule;
4377
+ friend class WasmModuleObject;
4378
+ explicit TransferrableModule(SharedModule shared_module)
4379
+ : shared_module_(std::move(shared_module)) {}
4380
+ TransferrableModule(OwnedBuffer serialized, OwnedBuffer bytes)
4381
+ : serialized_(std::move(serialized)), wire_bytes_(std::move(bytes)) {}
4382
+
4383
+ SharedModule shared_module_;
4384
+ OwnedBuffer serialized_ = {nullptr, 0};
4385
+ OwnedBuffer wire_bytes_ = {nullptr, 0};
4174
4386
  };
4175
4387
 
4176
4388
  /**
@@ -4181,48 +4393,132 @@ class V8_EXPORT WasmCompiledModule : public Object {
4181
4393
  TransferrableModule GetTransferrableModule();
4182
4394
 
4183
4395
  /**
4184
- * Efficiently re-create a WasmCompiledModule, without recompiling, from
4396
+ * Efficiently re-create a WasmModuleObject, without recompiling, from
4185
4397
  * a TransferrableModule.
4186
4398
  */
4187
- static MaybeLocal<WasmCompiledModule> FromTransferrableModule(
4399
+ static MaybeLocal<WasmModuleObject> FromTransferrableModule(
4188
4400
  Isolate* isolate, const TransferrableModule&);
4189
4401
 
4190
4402
  /**
4191
4403
  * Get the wasm-encoded bytes that were used to compile this module.
4192
4404
  */
4193
- Local<String> GetWasmWireBytes();
4405
+ V8_DEPRECATED("Use CompiledWasmModule::GetWireBytesRef()",
4406
+ BufferReference GetWasmWireBytesRef());
4407
+
4408
+ /**
4409
+ * Get the compiled module for this module object. The compiled module can be
4410
+ * shared by several module objects.
4411
+ */
4412
+ CompiledWasmModule GetCompiledModule();
4194
4413
 
4195
4414
  /**
4196
4415
  * Serialize the compiled module. The serialized data does not include the
4197
4416
  * uncompiled bytes.
4198
4417
  */
4199
- SerializedModule Serialize();
4418
+ V8_DEPRECATED("Use CompiledWasmModule::Serialize()",
4419
+ SerializedModule Serialize());
4200
4420
 
4201
4421
  /**
4202
4422
  * If possible, deserialize the module, otherwise compile it from the provided
4203
4423
  * uncompiled bytes.
4204
4424
  */
4205
- static MaybeLocal<WasmCompiledModule> DeserializeOrCompile(
4206
- Isolate* isolate, const CallerOwnedBuffer& serialized_module,
4207
- const CallerOwnedBuffer& wire_bytes);
4208
- V8_INLINE static WasmCompiledModule* Cast(Value* obj);
4425
+ static MaybeLocal<WasmModuleObject> DeserializeOrCompile(
4426
+ Isolate* isolate, MemorySpan<const uint8_t> serialized_module,
4427
+ MemorySpan<const uint8_t> wire_bytes);
4428
+ V8_INLINE static WasmModuleObject* Cast(Value* obj);
4209
4429
 
4210
4430
  private:
4211
- static MaybeLocal<WasmCompiledModule> Deserialize(
4212
- Isolate* isolate, const CallerOwnedBuffer& serialized_module,
4213
- const CallerOwnedBuffer& wire_bytes);
4214
- static MaybeLocal<WasmCompiledModule> Compile(Isolate* isolate,
4215
- const uint8_t* start,
4216
- size_t length);
4217
- static CallerOwnedBuffer AsCallerOwned(
4218
- const TransferrableModule::OwnedBuffer& buff) {
4219
- return {buff.first.get(), buff.second};
4431
+ static MaybeLocal<WasmModuleObject> Deserialize(
4432
+ Isolate* isolate, MemorySpan<const uint8_t> serialized_module,
4433
+ MemorySpan<const uint8_t> wire_bytes);
4434
+ static MaybeLocal<WasmModuleObject> Compile(Isolate* isolate,
4435
+ const uint8_t* start,
4436
+ size_t length);
4437
+ static MemorySpan<const uint8_t> AsReference(const OwnedBuffer& buff) {
4438
+ return {buff.buffer.get(), buff.size};
4220
4439
  }
4221
4440
 
4222
- WasmCompiledModule();
4441
+ WasmModuleObject();
4223
4442
  static void CheckCast(Value* obj);
4224
4443
  };
4225
4444
 
4445
+ V8_DEPRECATED("Use WasmModuleObject",
4446
+ typedef WasmModuleObject WasmCompiledModule);
4447
+
4448
+ /**
4449
+ * The V8 interface for WebAssembly streaming compilation. When streaming
4450
+ * compilation is initiated, V8 passes a {WasmStreaming} object to the embedder
4451
+ * such that the embedder can pass the input bytes for streaming compilation to
4452
+ * V8.
4453
+ */
4454
+ class V8_EXPORT WasmStreaming final {
4455
+ public:
4456
+ class WasmStreamingImpl;
4457
+
4458
+ /**
4459
+ * Client to receive streaming event notifications.
4460
+ */
4461
+ class Client {
4462
+ public:
4463
+ virtual ~Client() = default;
4464
+ /**
4465
+ * Passes the fully compiled module to the client. This can be used to
4466
+ * implement code caching.
4467
+ */
4468
+ virtual void OnModuleCompiled(CompiledWasmModule compiled_module) = 0;
4469
+ };
4470
+
4471
+ explicit WasmStreaming(std::unique_ptr<WasmStreamingImpl> impl);
4472
+
4473
+ ~WasmStreaming();
4474
+
4475
+ /**
4476
+ * Pass a new chunk of bytes to WebAssembly streaming compilation.
4477
+ * The buffer passed into {OnBytesReceived} is owned by the caller.
4478
+ */
4479
+ void OnBytesReceived(const uint8_t* bytes, size_t size);
4480
+
4481
+ /**
4482
+ * {Finish} should be called after all received bytes where passed to
4483
+ * {OnBytesReceived} to tell V8 that there will be no more bytes. {Finish}
4484
+ * does not have to be called after {Abort} has been called already.
4485
+ */
4486
+ void Finish();
4487
+
4488
+ /**
4489
+ * Abort streaming compilation. If {exception} has a value, then the promise
4490
+ * associated with streaming compilation is rejected with that value. If
4491
+ * {exception} does not have value, the promise does not get rejected.
4492
+ */
4493
+ void Abort(MaybeLocal<Value> exception);
4494
+
4495
+ /**
4496
+ * Passes previously compiled module bytes. This must be called before
4497
+ * {OnBytesReceived}, {Finish}, or {Abort}. Returns true if the module bytes
4498
+ * can be used, false otherwise. The buffer passed via {bytes} and {size}
4499
+ * is owned by the caller. If {SetCompiledModuleBytes} returns true, the
4500
+ * buffer must remain valid until either {Finish} or {Abort} completes.
4501
+ */
4502
+ bool SetCompiledModuleBytes(const uint8_t* bytes, size_t size);
4503
+
4504
+ /**
4505
+ * Sets the client object that will receive streaming event notifications.
4506
+ * This must be called before {OnBytesReceived}, {Finish}, or {Abort}.
4507
+ */
4508
+ void SetClient(std::shared_ptr<Client> client);
4509
+
4510
+ /**
4511
+ * Unpacks a {WasmStreaming} object wrapped in a {Managed} for the embedder.
4512
+ * Since the embedder is on the other side of the API, it cannot unpack the
4513
+ * {Managed} itself.
4514
+ */
4515
+ static std::shared_ptr<WasmStreaming> Unpack(Isolate* isolate,
4516
+ Local<Value> value);
4517
+
4518
+ private:
4519
+ std::unique_ptr<WasmStreamingImpl> impl_;
4520
+ };
4521
+
4226
4522
  // TODO(mtrofin): when streaming compilation is done, we can rename this
4227
4523
  // to simply WasmModuleObjectBuilder
4228
4524
  class V8_EXPORT WasmModuleObjectBuilderStreaming final {
@@ -4241,11 +4537,9 @@ class V8_EXPORT WasmModuleObjectBuilderStreaming final {
4241
4537
  void Abort(MaybeLocal<Value> exception);
4242
4538
  Local<Promise> GetPromise();
4243
4539
 
4244
- ~WasmModuleObjectBuilderStreaming();
4540
+ ~WasmModuleObjectBuilderStreaming() = default;
4245
4541
 
4246
4542
  private:
4247
- typedef std::pair<std::unique_ptr<const uint8_t[]>, size_t> Buffer;
4248
-
4249
4543
  WasmModuleObjectBuilderStreaming(const WasmModuleObjectBuilderStreaming&) =
4250
4544
  delete;
4251
4545
  WasmModuleObjectBuilderStreaming(WasmModuleObjectBuilderStreaming&&) =
@@ -4268,8 +4562,6 @@ class V8_EXPORT WasmModuleObjectBuilderStreaming final {
4268
4562
  #else
4269
4563
  Persistent<Promise> promise_;
4270
4564
  #endif
4271
- std::vector<Buffer> received_buffers_;
4272
- size_t total_size_ = 0;
4273
4565
  std::shared_ptr<internal::wasm::StreamingDecoder> streaming_decoder_;
4274
4566
  };
4275
4567
 
@@ -4304,7 +4596,7 @@ class V8_EXPORT ArrayBuffer : public Object {
4304
4596
  */
4305
4597
  class V8_EXPORT Allocator { // NOLINT
4306
4598
  public:
4307
- virtual ~Allocator() {}
4599
+ virtual ~Allocator() = default;
4308
4600
 
4309
4601
  /**
4310
4602
  * Allocate |length| bytes. Return NULL if allocation is not successful.
@@ -4345,17 +4637,22 @@ class V8_EXPORT ArrayBuffer : public Object {
4345
4637
  * returns an instance of this class, populated, with a pointer to data
4346
4638
  * and byte length.
4347
4639
  *
4348
- * The Data pointer of ArrayBuffer::Contents is always allocated with
4349
- * Allocator::Allocate that is set via Isolate::CreateParams.
4640
+ * The Data pointer of ArrayBuffer::Contents must be freed using the provided
4641
+ * deleter, which will call ArrayBuffer::Allocator::Free if the buffer
4642
+ * was allocated with ArraryBuffer::Allocator::Allocate.
4350
4643
  */
4351
4644
  class V8_EXPORT Contents { // NOLINT
4352
4645
  public:
4646
+ using DeleterCallback = void (*)(void* buffer, size_t length, void* info);
4647
+
4353
4648
  Contents()
4354
4649
  : data_(nullptr),
4355
4650
  byte_length_(0),
4356
4651
  allocation_base_(nullptr),
4357
4652
  allocation_length_(0),
4358
- allocation_mode_(Allocator::AllocationMode::kNormal) {}
4653
+ allocation_mode_(Allocator::AllocationMode::kNormal),
4654
+ deleter_(nullptr),
4655
+ deleter_data_(nullptr) {}
4359
4656
 
4360
4657
  void* AllocationBase() const { return allocation_base_; }
4361
4658
  size_t AllocationLength() const { return allocation_length_; }
@@ -4365,13 +4662,22 @@ class V8_EXPORT ArrayBuffer : public Object {
4365
4662
 
4366
4663
  void* Data() const { return data_; }
4367
4664
  size_t ByteLength() const { return byte_length_; }
4665
+ DeleterCallback Deleter() const { return deleter_; }
4666
+ void* DeleterData() const { return deleter_data_; }
4368
4667
 
4369
4668
  private:
4669
+ Contents(void* data, size_t byte_length, void* allocation_base,
4670
+ size_t allocation_length,
4671
+ Allocator::AllocationMode allocation_mode, DeleterCallback deleter,
4672
+ void* deleter_data);
4673
+
4370
4674
  void* data_;
4371
4675
  size_t byte_length_;
4372
4676
  void* allocation_base_;
4373
4677
  size_t allocation_length_;
4374
4678
  Allocator::AllocationMode allocation_mode_;
4679
+ DeleterCallback deleter_;
4680
+ void* deleter_data_;
4375
4681
 
4376
4682
  friend class ArrayBuffer;
4377
4683
  };
@@ -4410,17 +4716,26 @@ class V8_EXPORT ArrayBuffer : public Object {
4410
4716
  bool IsExternal() const;
4411
4717
 
4412
4718
  /**
4413
- * Returns true if this ArrayBuffer may be neutered.
4719
+ * Returns true if this ArrayBuffer may be detached.
4414
4720
  */
4415
- bool IsNeuterable() const;
4721
+ bool IsDetachable() const;
4722
+
4723
+ // TODO(913887): fix the use of 'neuter' in the API.
4724
+ V8_DEPRECATE_SOON("Use IsDetachable() instead.",
4725
+ inline bool IsNeuterable() const) {
4726
+ return IsDetachable();
4727
+ }
4416
4728
 
4417
4729
  /**
4418
- * Neuters this ArrayBuffer and all its views (typed arrays).
4419
- * Neutering sets the byte length of the buffer and all typed arrays to zero,
4730
+ * Detaches this ArrayBuffer and all its views (typed arrays).
4731
+ * Detaching sets the byte length of the buffer and all typed arrays to zero,
4420
4732
  * preventing JavaScript from ever accessing underlying backing store.
4421
- * ArrayBuffer should have been externalized and must be neuterable.
4733
+ * ArrayBuffer should have been externalized and must be detachable.
4422
4734
  */
4423
- void Neuter();
4735
+ void Detach();
4736
+
4737
+ // TODO(913887): fix the use of 'neuter' in the API.
4738
+ V8_DEPRECATE_SOON("Use Detach() instead.", inline void Neuter()) { Detach(); }
4424
4739
 
4425
4740
  /**
4426
4741
  * Make this ArrayBuffer external. The pointer to underlying memory block
@@ -4428,8 +4743,9 @@ class V8_EXPORT ArrayBuffer : public Object {
4428
4743
  * had been externalized, it does no longer own the memory block. The caller
4429
4744
  * should take steps to free memory when it is no longer needed.
4430
4745
  *
4431
- * The memory block is guaranteed to be allocated with |Allocator::Allocate|
4432
- * that has been set via Isolate::CreateParams.
4746
+ * The Data pointer of ArrayBuffer::Contents must be freed using the provided
4747
+ * deleter, which will call ArrayBuffer::Allocator::Free if the buffer
4748
+ * was allocated with ArraryBuffer::Allocator::Allocate.
4433
4749
  */
4434
4750
  Contents Externalize();
4435
4751
 
@@ -4440,8 +4756,6 @@ class V8_EXPORT ArrayBuffer : public Object {
4440
4756
  *
4441
4757
  * The embedder should make sure to hold a strong reference to the
4442
4758
  * ArrayBuffer while accessing this pointer.
4443
- *
4444
- * The memory block is guaranteed to be allocated with |Allocator::Allocate|.
4445
4759
  */
4446
4760
  Contents GetContents();
4447
4761
 
@@ -4520,8 +4834,7 @@ class V8_EXPORT TypedArray : public ArrayBufferView {
4520
4834
  /*
4521
4835
  * The largest typed array size that can be constructed using New.
4522
4836
  */
4523
- static constexpr size_t kMaxLength =
4524
- sizeof(void*) == 4 ? (1u << 30) - 1 : (1u << 31) - 1;
4837
+ static constexpr size_t kMaxLength = internal::kSmiMaxValue;
4525
4838
 
4526
4839
  /**
4527
4840
  * Number of elements in this typed array
@@ -4749,41 +5062,54 @@ class V8_EXPORT SharedArrayBuffer : public Object {
4749
5062
  * |SharedArrayBuffer| returns an instance of this class, populated, with a
4750
5063
  * pointer to data and byte length.
4751
5064
  *
4752
- * The Data pointer of SharedArrayBuffer::Contents is always allocated with
4753
- * |ArrayBuffer::Allocator::Allocate| by the allocator specified in
4754
- * v8::Isolate::CreateParams::array_buffer_allocator.
5065
+ * The Data pointer of ArrayBuffer::Contents must be freed using the provided
5066
+ * deleter, which will call ArrayBuffer::Allocator::Free if the buffer
5067
+ * was allocated with ArraryBuffer::Allocator::Allocate.
4755
5068
  *
4756
5069
  * This API is experimental and may change significantly.
4757
5070
  */
4758
5071
  class V8_EXPORT Contents { // NOLINT
4759
5072
  public:
5073
+ using Allocator = v8::ArrayBuffer::Allocator;
5074
+ using DeleterCallback = void (*)(void* buffer, size_t length, void* info);
5075
+
4760
5076
  Contents()
4761
5077
  : data_(nullptr),
4762
5078
  byte_length_(0),
4763
5079
  allocation_base_(nullptr),
4764
5080
  allocation_length_(0),
4765
- allocation_mode_(ArrayBuffer::Allocator::AllocationMode::kNormal) {}
5081
+ allocation_mode_(Allocator::AllocationMode::kNormal),
5082
+ deleter_(nullptr),
5083
+ deleter_data_(nullptr) {}
4766
5084
 
4767
5085
  void* AllocationBase() const { return allocation_base_; }
4768
5086
  size_t AllocationLength() const { return allocation_length_; }
4769
- ArrayBuffer::Allocator::AllocationMode AllocationMode() const {
5087
+ Allocator::AllocationMode AllocationMode() const {
4770
5088
  return allocation_mode_;
4771
5089
  }
4772
5090
 
4773
5091
  void* Data() const { return data_; }
4774
5092
  size_t ByteLength() const { return byte_length_; }
5093
+ DeleterCallback Deleter() const { return deleter_; }
5094
+ void* DeleterData() const { return deleter_data_; }
4775
5095
 
4776
5096
  private:
5097
+ Contents(void* data, size_t byte_length, void* allocation_base,
5098
+ size_t allocation_length,
5099
+ Allocator::AllocationMode allocation_mode, DeleterCallback deleter,
5100
+ void* deleter_data);
5101
+
4777
5102
  void* data_;
4778
5103
  size_t byte_length_;
4779
5104
  void* allocation_base_;
4780
5105
  size_t allocation_length_;
4781
- ArrayBuffer::Allocator::AllocationMode allocation_mode_;
5106
+ Allocator::AllocationMode allocation_mode_;
5107
+ DeleterCallback deleter_;
5108
+ void* deleter_data_;
4782
5109
 
4783
5110
  friend class SharedArrayBuffer;
4784
5111
  };
4785
5112
 
4786
-
4787
5113
  /**
4788
5114
  * Data length in bytes.
4789
5115
  */
@@ -4856,8 +5182,6 @@ class V8_EXPORT SharedArrayBuffer : public Object {
4856
5182
  */
4857
5183
  class V8_EXPORT Date : public Object {
4858
5184
  public:
4859
- static V8_DEPRECATE_SOON("Use maybe version.",
4860
- Local<Value> New(Isolate* isolate, double time));
4861
5185
  static V8_WARN_UNUSED_RESULT MaybeLocal<Value> New(Local<Context> context,
4862
5186
  double time);
4863
5187
 
@@ -4939,7 +5263,7 @@ class V8_EXPORT BooleanObject : public Object {
4939
5263
  */
4940
5264
  class V8_EXPORT StringObject : public Object {
4941
5265
  public:
4942
- static Local<Value> New(Local<String> value);
5266
+ static Local<Value> New(Isolate* isolate, Local<String> value);
4943
5267
 
4944
5268
  Local<String> ValueOf() const;
4945
5269
 
@@ -4995,8 +5319,6 @@ class V8_EXPORT RegExp : public Object {
4995
5319
  * static_cast<RegExp::Flags>(kGlobal | kMultiline))
4996
5320
  * is equivalent to evaluating "/foo/gm".
4997
5321
  */
4998
- static V8_DEPRECATED("Use maybe version",
4999
- Local<RegExp> New(Local<String> pattern, Flags flags));
5000
5322
  static V8_WARN_UNUSED_RESULT MaybeLocal<RegExp> New(Local<Context> context,
5001
5323
  Local<String> pattern,
5002
5324
  Flags flags);
@@ -5102,26 +5424,32 @@ class V8_EXPORT Template : public Data {
5102
5424
  */
5103
5425
  void SetNativeDataProperty(
5104
5426
  Local<String> name, AccessorGetterCallback getter,
5105
- AccessorSetterCallback setter = 0,
5427
+ AccessorSetterCallback setter = nullptr,
5106
5428
  // TODO(dcarney): gcc can't handle Local below
5107
5429
  Local<Value> data = Local<Value>(), PropertyAttribute attribute = None,
5108
5430
  Local<AccessorSignature> signature = Local<AccessorSignature>(),
5109
- AccessControl settings = DEFAULT);
5431
+ AccessControl settings = DEFAULT,
5432
+ SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
5433
+ SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
5110
5434
  void SetNativeDataProperty(
5111
5435
  Local<Name> name, AccessorNameGetterCallback getter,
5112
- AccessorNameSetterCallback setter = 0,
5436
+ AccessorNameSetterCallback setter = nullptr,
5113
5437
  // TODO(dcarney): gcc can't handle Local below
5114
5438
  Local<Value> data = Local<Value>(), PropertyAttribute attribute = None,
5115
5439
  Local<AccessorSignature> signature = Local<AccessorSignature>(),
5116
- AccessControl settings = DEFAULT);
5440
+ AccessControl settings = DEFAULT,
5441
+ SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
5442
+ SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
5117
5443
 
5118
5444
  /**
5119
5445
  * Like SetNativeDataProperty, but V8 will replace the native data property
5120
5446
  * with a real data property on first access.
5121
5447
  */
5122
- void SetLazyDataProperty(Local<Name> name, AccessorNameGetterCallback getter,
5123
- Local<Value> data = Local<Value>(),
5124
- PropertyAttribute attribute = None);
5448
+ void SetLazyDataProperty(
5449
+ Local<Name> name, AccessorNameGetterCallback getter,
5450
+ Local<Value> data = Local<Value>(), PropertyAttribute attribute = None,
5451
+ SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
5452
+ SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
5125
5453
 
5126
5454
  /**
5127
5455
  * During template instantiation, sets the value with the intrinsic property
@@ -5137,60 +5465,11 @@ class V8_EXPORT Template : public Data {
5137
5465
  friend class FunctionTemplate;
5138
5466
  };
5139
5467
 
5468
+ // TODO(dcarney): Replace GenericNamedPropertyFooCallback with just
5469
+ // NamedPropertyFooCallback.
5140
5470
 
5141
5471
  /**
5142
- * NamedProperty[Getter|Setter] are used as interceptors on object.
5143
- * See ObjectTemplate::SetNamedPropertyHandler.
5144
- */
5145
- typedef void (*NamedPropertyGetterCallback)(
5146
- Local<String> property,
5147
- const PropertyCallbackInfo<Value>& info);
5148
-
5149
-
5150
- /**
5151
- * Returns the value if the setter intercepts the request.
5152
- * Otherwise, returns an empty handle.
5153
- */
5154
- typedef void (*NamedPropertySetterCallback)(
5155
- Local<String> property,
5156
- Local<Value> value,
5157
- const PropertyCallbackInfo<Value>& info);
5158
-
5159
-
5160
- /**
5161
- * Returns a non-empty handle if the interceptor intercepts the request.
5162
- * The result is an integer encoding property attributes (like v8::None,
5163
- * v8::DontEnum, etc.)
5164
- */
5165
- typedef void (*NamedPropertyQueryCallback)(
5166
- Local<String> property,
5167
- const PropertyCallbackInfo<Integer>& info);
5168
-
5169
-
5170
- /**
5171
- * Returns a non-empty handle if the deleter intercepts the request.
5172
- * The return value is true if the property could be deleted and false
5173
- * otherwise.
5174
- */
5175
- typedef void (*NamedPropertyDeleterCallback)(
5176
- Local<String> property,
5177
- const PropertyCallbackInfo<Boolean>& info);
5178
-
5179
- /**
5180
- * Returns an array containing the names of the properties the named
5181
- * property getter intercepts.
5182
- *
5183
- * Note: The values in the array must be of type v8::Name.
5184
- */
5185
- typedef void (*NamedPropertyEnumeratorCallback)(
5186
- const PropertyCallbackInfo<Array>& info);
5187
-
5188
-
5189
- // TODO(dcarney): Deprecate and remove previous typedefs, and replace
5190
- // GenericNamedPropertyFooCallback with just NamedPropertyFooCallback.
5191
-
5192
- /**
5193
- * Interceptor for get requests on an object.
5472
+ * Interceptor for get requests on an object.
5194
5473
  *
5195
5474
  * Use `info.GetReturnValue().Set()` to set the return value of the
5196
5475
  * intercepted get request.
@@ -5531,7 +5810,7 @@ class V8_EXPORT FunctionTemplate : public Template {
5531
5810
  public:
5532
5811
  /** Creates a function template.*/
5533
5812
  static Local<FunctionTemplate> New(
5534
- Isolate* isolate, FunctionCallback callback = 0,
5813
+ Isolate* isolate, FunctionCallback callback = nullptr,
5535
5814
  Local<Value> data = Local<Value>(),
5536
5815
  Local<Signature> signature = Local<Signature>(), int length = 0,
5537
5816
  ConstructorBehavior behavior = ConstructorBehavior::kAllow,
@@ -5551,7 +5830,7 @@ class V8_EXPORT FunctionTemplate : public Template {
5551
5830
  SideEffectType side_effect_type = SideEffectType::kHasSideEffect);
5552
5831
 
5553
5832
  /** Returns the unique function instance in the current execution context.*/
5554
- V8_DEPRECATE_SOON("Use maybe version", Local<Function> GetFunction());
5833
+ V8_DEPRECATED("Use maybe version", Local<Function> GetFunction());
5555
5834
  V8_WARN_UNUSED_RESULT MaybeLocal<Function> GetFunction(
5556
5835
  Local<Context> context);
5557
5836
 
@@ -5690,13 +5969,33 @@ enum class PropertyHandlerFlags {
5690
5969
  };
5691
5970
 
5692
5971
  struct NamedPropertyHandlerConfiguration {
5972
+ NamedPropertyHandlerConfiguration(
5973
+ GenericNamedPropertyGetterCallback getter,
5974
+ GenericNamedPropertySetterCallback setter,
5975
+ GenericNamedPropertyQueryCallback query,
5976
+ GenericNamedPropertyDeleterCallback deleter,
5977
+ GenericNamedPropertyEnumeratorCallback enumerator,
5978
+ GenericNamedPropertyDefinerCallback definer,
5979
+ GenericNamedPropertyDescriptorCallback descriptor,
5980
+ Local<Value> data = Local<Value>(),
5981
+ PropertyHandlerFlags flags = PropertyHandlerFlags::kNone)
5982
+ : getter(getter),
5983
+ setter(setter),
5984
+ query(query),
5985
+ deleter(deleter),
5986
+ enumerator(enumerator),
5987
+ definer(definer),
5988
+ descriptor(descriptor),
5989
+ data(data),
5990
+ flags(flags) {}
5991
+
5693
5992
  NamedPropertyHandlerConfiguration(
5694
5993
  /** Note: getter is required */
5695
- GenericNamedPropertyGetterCallback getter = 0,
5696
- GenericNamedPropertySetterCallback setter = 0,
5697
- GenericNamedPropertyQueryCallback query = 0,
5698
- GenericNamedPropertyDeleterCallback deleter = 0,
5699
- GenericNamedPropertyEnumeratorCallback enumerator = 0,
5994
+ GenericNamedPropertyGetterCallback getter = nullptr,
5995
+ GenericNamedPropertySetterCallback setter = nullptr,
5996
+ GenericNamedPropertyQueryCallback query = nullptr,
5997
+ GenericNamedPropertyDeleterCallback deleter = nullptr,
5998
+ GenericNamedPropertyEnumeratorCallback enumerator = nullptr,
5700
5999
  Local<Value> data = Local<Value>(),
5701
6000
  PropertyHandlerFlags flags = PropertyHandlerFlags::kNone)
5702
6001
  : getter(getter),
@@ -5704,8 +6003,8 @@ struct NamedPropertyHandlerConfiguration {
5704
6003
  query(query),
5705
6004
  deleter(deleter),
5706
6005
  enumerator(enumerator),
5707
- definer(0),
5708
- descriptor(0),
6006
+ definer(nullptr),
6007
+ descriptor(nullptr),
5709
6008
  data(data),
5710
6009
  flags(flags) {}
5711
6010
 
@@ -5720,7 +6019,7 @@ struct NamedPropertyHandlerConfiguration {
5720
6019
  PropertyHandlerFlags flags = PropertyHandlerFlags::kNone)
5721
6020
  : getter(getter),
5722
6021
  setter(setter),
5723
- query(0),
6022
+ query(nullptr),
5724
6023
  deleter(deleter),
5725
6024
  enumerator(enumerator),
5726
6025
  definer(definer),
@@ -5741,13 +6040,32 @@ struct NamedPropertyHandlerConfiguration {
5741
6040
 
5742
6041
 
5743
6042
  struct IndexedPropertyHandlerConfiguration {
6043
+ IndexedPropertyHandlerConfiguration(
6044
+ IndexedPropertyGetterCallback getter,
6045
+ IndexedPropertySetterCallback setter, IndexedPropertyQueryCallback query,
6046
+ IndexedPropertyDeleterCallback deleter,
6047
+ IndexedPropertyEnumeratorCallback enumerator,
6048
+ IndexedPropertyDefinerCallback definer,
6049
+ IndexedPropertyDescriptorCallback descriptor,
6050
+ Local<Value> data = Local<Value>(),
6051
+ PropertyHandlerFlags flags = PropertyHandlerFlags::kNone)
6052
+ : getter(getter),
6053
+ setter(setter),
6054
+ query(query),
6055
+ deleter(deleter),
6056
+ enumerator(enumerator),
6057
+ definer(definer),
6058
+ descriptor(descriptor),
6059
+ data(data),
6060
+ flags(flags) {}
6061
+
5744
6062
  IndexedPropertyHandlerConfiguration(
5745
6063
  /** Note: getter is required */
5746
- IndexedPropertyGetterCallback getter = 0,
5747
- IndexedPropertySetterCallback setter = 0,
5748
- IndexedPropertyQueryCallback query = 0,
5749
- IndexedPropertyDeleterCallback deleter = 0,
5750
- IndexedPropertyEnumeratorCallback enumerator = 0,
6064
+ IndexedPropertyGetterCallback getter = nullptr,
6065
+ IndexedPropertySetterCallback setter = nullptr,
6066
+ IndexedPropertyQueryCallback query = nullptr,
6067
+ IndexedPropertyDeleterCallback deleter = nullptr,
6068
+ IndexedPropertyEnumeratorCallback enumerator = nullptr,
5751
6069
  Local<Value> data = Local<Value>(),
5752
6070
  PropertyHandlerFlags flags = PropertyHandlerFlags::kNone)
5753
6071
  : getter(getter),
@@ -5755,8 +6073,8 @@ struct IndexedPropertyHandlerConfiguration {
5755
6073
  query(query),
5756
6074
  deleter(deleter),
5757
6075
  enumerator(enumerator),
5758
- definer(0),
5759
- descriptor(0),
6076
+ definer(nullptr),
6077
+ descriptor(nullptr),
5760
6078
  data(data),
5761
6079
  flags(flags) {}
5762
6080
 
@@ -5771,7 +6089,7 @@ struct IndexedPropertyHandlerConfiguration {
5771
6089
  PropertyHandlerFlags flags = PropertyHandlerFlags::kNone)
5772
6090
  : getter(getter),
5773
6091
  setter(setter),
5774
- query(0),
6092
+ query(nullptr),
5775
6093
  deleter(deleter),
5776
6094
  enumerator(enumerator),
5777
6095
  definer(definer),
@@ -5809,7 +6127,7 @@ class V8_EXPORT ObjectTemplate : public Template {
5809
6127
  size_t index);
5810
6128
 
5811
6129
  /** Creates a new instance of this template.*/
5812
- V8_DEPRECATE_SOON("Use maybe version", Local<Object> NewInstance());
6130
+ V8_DEPRECATED("Use maybe version", Local<Object> NewInstance());
5813
6131
  V8_WARN_UNUSED_RESULT MaybeLocal<Object> NewInstance(Local<Context> context);
5814
6132
 
5815
6133
  /**
@@ -5843,47 +6161,20 @@ class V8_EXPORT ObjectTemplate : public Template {
5843
6161
  */
5844
6162
  void SetAccessor(
5845
6163
  Local<String> name, AccessorGetterCallback getter,
5846
- AccessorSetterCallback setter = 0, Local<Value> data = Local<Value>(),
5847
- AccessControl settings = DEFAULT, PropertyAttribute attribute = None,
5848
- Local<AccessorSignature> signature = Local<AccessorSignature>());
6164
+ AccessorSetterCallback setter = nullptr,
6165
+ Local<Value> data = Local<Value>(), AccessControl settings = DEFAULT,
6166
+ PropertyAttribute attribute = None,
6167
+ Local<AccessorSignature> signature = Local<AccessorSignature>(),
6168
+ SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
6169
+ SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
5849
6170
  void SetAccessor(
5850
6171
  Local<Name> name, AccessorNameGetterCallback getter,
5851
- AccessorNameSetterCallback setter = 0, Local<Value> data = Local<Value>(),
5852
- AccessControl settings = DEFAULT, PropertyAttribute attribute = None,
5853
- Local<AccessorSignature> signature = Local<AccessorSignature>());
5854
-
5855
- /**
5856
- * Sets a named property handler on the object template.
5857
- *
5858
- * Whenever a property whose name is a string is accessed on objects created
5859
- * from this object template, the provided callback is invoked instead of
5860
- * accessing the property directly on the JavaScript object.
5861
- *
5862
- * SetNamedPropertyHandler() is different from SetHandler(), in
5863
- * that the latter can intercept symbol-named properties as well as
5864
- * string-named properties when called with a
5865
- * NamedPropertyHandlerConfiguration. New code should use SetHandler().
5866
- *
5867
- * \param getter The callback to invoke when getting a property.
5868
- * \param setter The callback to invoke when setting a property.
5869
- * \param query The callback to invoke to check if a property is present,
5870
- * and if present, get its attributes.
5871
- * \param deleter The callback to invoke when deleting a property.
5872
- * \param enumerator The callback to invoke to enumerate all the named
5873
- * properties of an object.
5874
- * \param data A piece of data that will be passed to the callbacks
5875
- * whenever they are invoked.
5876
- */
5877
- V8_DEPRECATED(
5878
- "Use SetHandler(const NamedPropertyHandlerConfiguration) "
5879
- "with the kOnlyInterceptStrings flag set.",
5880
- void SetNamedPropertyHandler(
5881
- NamedPropertyGetterCallback getter,
5882
- NamedPropertySetterCallback setter = 0,
5883
- NamedPropertyQueryCallback query = 0,
5884
- NamedPropertyDeleterCallback deleter = 0,
5885
- NamedPropertyEnumeratorCallback enumerator = 0,
5886
- Local<Value> data = Local<Value>()));
6172
+ AccessorNameSetterCallback setter = nullptr,
6173
+ Local<Value> data = Local<Value>(), AccessControl settings = DEFAULT,
6174
+ PropertyAttribute attribute = None,
6175
+ Local<AccessorSignature> signature = Local<AccessorSignature>(),
6176
+ SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
6177
+ SideEffectType setter_side_effect_type = SideEffectType::kHasSideEffect);
5887
6178
 
5888
6179
  /**
5889
6180
  * Sets a named property handler on the object template.
@@ -5917,10 +6208,10 @@ class V8_EXPORT ObjectTemplate : public Template {
5917
6208
  // TODO(dcarney): deprecate
5918
6209
  void SetIndexedPropertyHandler(
5919
6210
  IndexedPropertyGetterCallback getter,
5920
- IndexedPropertySetterCallback setter = 0,
5921
- IndexedPropertyQueryCallback query = 0,
5922
- IndexedPropertyDeleterCallback deleter = 0,
5923
- IndexedPropertyEnumeratorCallback enumerator = 0,
6211
+ IndexedPropertySetterCallback setter = nullptr,
6212
+ IndexedPropertyQueryCallback query = nullptr,
6213
+ IndexedPropertyDeleterCallback deleter = nullptr,
6214
+ IndexedPropertyEnumeratorCallback enumerator = nullptr,
5924
6215
  Local<Value> data = Local<Value>()) {
5925
6216
  SetHandler(IndexedPropertyHandlerConfiguration(getter, setter, query,
5926
6217
  deleter, enumerator, data));
@@ -6056,15 +6347,15 @@ class V8_EXPORT AccessorSignature : public Data {
6056
6347
 
6057
6348
 
6058
6349
  // --- Extensions ---
6059
-
6060
- class V8_EXPORT ExternalOneByteStringResourceImpl
6350
+ V8_DEPRECATED("Implementation detail", class)
6351
+ V8_EXPORT ExternalOneByteStringResourceImpl
6061
6352
  : public String::ExternalOneByteStringResource {
6062
6353
  public:
6063
- ExternalOneByteStringResourceImpl() : data_(0), length_(0) {}
6354
+ ExternalOneByteStringResourceImpl() : data_(nullptr), length_(0) {}
6064
6355
  ExternalOneByteStringResourceImpl(const char* data, size_t length)
6065
6356
  : data_(data), length_(length) {}
6066
- const char* data() const { return data_; }
6067
- size_t length() const { return length_; }
6357
+ const char* data() const override { return data_; }
6358
+ size_t length() const override { return length_; }
6068
6359
 
6069
6360
  private:
6070
6361
  const char* data_;
@@ -6078,12 +6369,9 @@ class V8_EXPORT Extension { // NOLINT
6078
6369
  public:
6079
6370
  // Note that the strings passed into this constructor must live as long
6080
6371
  // as the Extension itself.
6081
- Extension(const char* name,
6082
- const char* source = 0,
6083
- int dep_count = 0,
6084
- const char** deps = 0,
6085
- int source_length = -1);
6086
- virtual ~Extension() { }
6372
+ Extension(const char* name, const char* source = nullptr, int dep_count = 0,
6373
+ const char** deps = nullptr, int source_length = -1);
6374
+ virtual ~Extension() { delete source_; }
6087
6375
  virtual Local<FunctionTemplate> GetNativeFunctionTemplate(
6088
6376
  Isolate* isolate, Local<String> name) {
6089
6377
  return Local<FunctionTemplate>();
@@ -6092,7 +6380,8 @@ class V8_EXPORT Extension { // NOLINT
6092
6380
  const char* name() const { return name_; }
6093
6381
  size_t source_length() const { return source_length_; }
6094
6382
  const String::ExternalOneByteStringResource* source() const {
6095
- return &source_; }
6383
+ return source_;
6384
+ }
6096
6385
  int dependency_count() { return dep_count_; }
6097
6386
  const char** dependencies() { return deps_; }
6098
6387
  void set_auto_enable(bool value) { auto_enable_ = value; }
@@ -6105,7 +6394,7 @@ class V8_EXPORT Extension { // NOLINT
6105
6394
  private:
6106
6395
  const char* name_;
6107
6396
  size_t source_length_; // expected to initialize before source_
6108
- ExternalOneByteStringResourceImpl source_;
6397
+ String::ExternalOneByteStringResource* source_;
6109
6398
  int dep_count_;
6110
6399
  const char** deps_;
6111
6400
  bool auto_enable_;
@@ -6152,18 +6441,6 @@ class V8_EXPORT ResourceConstraints {
6152
6441
  void ConfigureDefaults(uint64_t physical_memory,
6153
6442
  uint64_t virtual_memory_limit);
6154
6443
 
6155
- // Returns the max semi-space size in MB.
6156
- V8_DEPRECATE_SOON("Use max_semi_space_size_in_kb()",
6157
- size_t max_semi_space_size()) {
6158
- return max_semi_space_size_in_kb_ / 1024;
6159
- }
6160
-
6161
- // Sets the max semi-space size in MB.
6162
- V8_DEPRECATE_SOON("Use set_max_semi_space_size_in_kb(size_t limit_in_kb)",
6163
- void set_max_semi_space_size(size_t limit_in_mb)) {
6164
- max_semi_space_size_in_kb_ = limit_in_mb * 1024;
6165
- }
6166
-
6167
6444
  // Returns the max semi-space size in KB.
6168
6445
  size_t max_semi_space_size_in_kb() const {
6169
6446
  return max_semi_space_size_in_kb_;
@@ -6178,14 +6455,6 @@ class V8_EXPORT ResourceConstraints {
6178
6455
  void set_max_old_space_size(size_t limit_in_mb) {
6179
6456
  max_old_space_size_ = limit_in_mb;
6180
6457
  }
6181
- V8_DEPRECATE_SOON("max_executable_size_ is subsumed by max_old_space_size_",
6182
- size_t max_executable_size() const) {
6183
- return max_executable_size_;
6184
- }
6185
- V8_DEPRECATE_SOON("max_executable_size_ is subsumed by max_old_space_size_",
6186
- void set_max_executable_size(size_t limit_in_mb)) {
6187
- max_executable_size_ = limit_in_mb;
6188
- }
6189
6458
  uint32_t* stack_limit() const { return stack_limit_; }
6190
6459
  // Sets an address beyond which the VM's stack may not grow.
6191
6460
  void set_stack_limit(uint32_t* value) { stack_limit_ = value; }
@@ -6202,7 +6471,6 @@ class V8_EXPORT ResourceConstraints {
6202
6471
 
6203
6472
  // The remaining limits are in MB
6204
6473
  size_t max_old_space_size_;
6205
- size_t max_executable_size_;
6206
6474
  uint32_t* stack_limit_;
6207
6475
  size_t code_range_size_;
6208
6476
  size_t max_zone_pool_size_;
@@ -6266,7 +6534,6 @@ typedef void (*AddHistogramSampleCallback)(void* histogram, int sample);
6266
6534
  // --- Enter/Leave Script Callback ---
6267
6535
  typedef void (*BeforeCallEnteredCallback)(Isolate*);
6268
6536
  typedef void (*CallCompletedCallback)(Isolate*);
6269
- typedef void (*DeprecatedCallCompletedCallback)();
6270
6537
 
6271
6538
  /**
6272
6539
  * HostImportModuleDynamicallyCallback is called when we require the
@@ -6306,6 +6573,17 @@ typedef void (*HostInitializeImportMetaObjectCallback)(Local<Context> context,
6306
6573
  Local<Module> module,
6307
6574
  Local<Object> meta);
6308
6575
 
6576
+ /**
6577
+ * PrepareStackTraceCallback is called when the stack property of an error is
6578
+ * first accessed. The return value will be used as the stack value. If this
6579
+ * callback is registed, the |Error.prepareStackTrace| API will be disabled.
6580
+ * |sites| is an array of call sites, specified in
6581
+ * https://github.com/v8/v8/wiki/Stack-Trace-API
6582
+ */
6583
+ typedef MaybeLocal<Value> (*PrepareStackTraceCallback)(Local<Context> context,
6584
+ Local<Value> error,
6585
+ Local<Array> sites);
6586
+
6309
6587
  /**
6310
6588
  * PromiseHook with type kInit is called when a new promise is
6311
6589
  * created. When a new promise is created as part of the chain in the
@@ -6330,7 +6608,9 @@ typedef void (*PromiseHook)(PromiseHookType type, Local<Promise> promise,
6330
6608
  // --- Promise Reject Callback ---
6331
6609
  enum PromiseRejectEvent {
6332
6610
  kPromiseRejectWithNoHandler = 0,
6333
- kPromiseHandlerAddedAfterReject = 1
6611
+ kPromiseHandlerAddedAfterReject = 1,
6612
+ kPromiseRejectAfterResolved = 2,
6613
+ kPromiseResolveAfterResolved = 3,
6334
6614
  };
6335
6615
 
6336
6616
  class PromiseRejectMessage {
@@ -6435,6 +6715,12 @@ typedef bool (*AllowWasmCodeGenerationCallback)(Local<Context> context,
6435
6715
  // by the embedder. Example: WebAssembly.{compile|instantiate}Streaming ---
6436
6716
  typedef void (*ApiImplementationCallback)(const FunctionCallbackInfo<Value>&);
6437
6717
 
6718
+ // --- Callback for WebAssembly.compileStreaming ---
6719
+ typedef void (*WasmStreamingCallback)(const FunctionCallbackInfo<Value>&);
6720
+
6721
+ // --- Callback for checking if WebAssembly threads are enabled ---
6722
+ typedef bool (*WasmThreadsEnabledCallback)(Local<Context> context);
6723
+
6438
6724
  // --- Garbage Collection Callbacks ---
6439
6725
 
6440
6726
  /**
@@ -6507,6 +6793,7 @@ class V8_EXPORT HeapStatistics {
6507
6793
  size_t used_heap_size() { return used_heap_size_; }
6508
6794
  size_t heap_size_limit() { return heap_size_limit_; }
6509
6795
  size_t malloced_memory() { return malloced_memory_; }
6796
+ size_t external_memory() { return external_memory_; }
6510
6797
  size_t peak_malloced_memory() { return peak_malloced_memory_; }
6511
6798
  size_t number_of_native_contexts() { return number_of_native_contexts_; }
6512
6799
  size_t number_of_detached_contexts() { return number_of_detached_contexts_; }
@@ -6525,6 +6812,7 @@ class V8_EXPORT HeapStatistics {
6525
6812
  size_t used_heap_size_;
6526
6813
  size_t heap_size_limit_;
6527
6814
  size_t malloced_memory_;
6815
+ size_t external_memory_;
6528
6816
  size_t peak_malloced_memory_;
6529
6817
  bool does_zap_garbage_;
6530
6818
  size_t number_of_native_contexts_;
@@ -6577,31 +6865,18 @@ class V8_EXPORT HeapCodeStatistics {
6577
6865
  HeapCodeStatistics();
6578
6866
  size_t code_and_metadata_size() { return code_and_metadata_size_; }
6579
6867
  size_t bytecode_and_metadata_size() { return bytecode_and_metadata_size_; }
6868
+ size_t external_script_source_size() { return external_script_source_size_; }
6580
6869
 
6581
6870
  private:
6582
6871
  size_t code_and_metadata_size_;
6583
6872
  size_t bytecode_and_metadata_size_;
6873
+ size_t external_script_source_size_;
6584
6874
 
6585
6875
  friend class Isolate;
6586
6876
  };
6587
6877
 
6588
6878
  class RetainedObjectInfo;
6589
6879
 
6590
-
6591
- /**
6592
- * FunctionEntryHook is the type of the profile entry hook called at entry to
6593
- * any generated function when function-level profiling is enabled.
6594
- *
6595
- * \param function the address of the function that's being entered.
6596
- * \param return_addr_location points to a location on stack where the machine
6597
- * return address resides. This can be used to identify the caller of
6598
- * \p function, and/or modified to divert execution when \p function exits.
6599
- *
6600
- * \note the entry hook must not cause garbage collection.
6601
- */
6602
- typedef void (*FunctionEntryHook)(uintptr_t function,
6603
- uintptr_t return_addr_location);
6604
-
6605
6880
  /**
6606
6881
  * A JIT code event is issued each time code is added, moved or removed.
6607
6882
  *
@@ -6673,6 +6948,8 @@ struct JitCodeEvent {
6673
6948
  // New location of instructions. Only valid for CODE_MOVED.
6674
6949
  void* new_code_start;
6675
6950
  };
6951
+
6952
+ Isolate* isolate;
6676
6953
  };
6677
6954
 
6678
6955
  /**
@@ -6720,7 +6997,7 @@ typedef void (*JitCodeEventHandler)(const JitCodeEvent* event);
6720
6997
  */
6721
6998
  class V8_EXPORT ExternalResourceVisitor { // NOLINT
6722
6999
  public:
6723
- virtual ~ExternalResourceVisitor() {}
7000
+ virtual ~ExternalResourceVisitor() = default;
6724
7001
  virtual void VisitExternalString(Local<String> string) {}
6725
7002
  };
6726
7003
 
@@ -6730,7 +7007,7 @@ class V8_EXPORT ExternalResourceVisitor { // NOLINT
6730
7007
  */
6731
7008
  class V8_EXPORT PersistentHandleVisitor { // NOLINT
6732
7009
  public:
6733
- virtual ~PersistentHandleVisitor() {}
7010
+ virtual ~PersistentHandleVisitor() = default;
6734
7011
  virtual void VisitPersistentHandle(Persistent<Value>* value,
6735
7012
  uint16_t class_id) {}
6736
7013
  };
@@ -6746,27 +7023,23 @@ class V8_EXPORT PersistentHandleVisitor { // NOLINT
6746
7023
  enum class MemoryPressureLevel { kNone, kModerate, kCritical };
6747
7024
 
6748
7025
  /**
6749
- * Interface for tracing through the embedder heap. During a v8 garbage
6750
- * collection, v8 collects hidden fields of all potential wrappers, and at the
7026
+ * Interface for tracing through the embedder heap. During a V8 garbage
7027
+ * collection, V8 collects hidden fields of all potential wrappers, and at the
6751
7028
  * end of its marking phase iterates the collection and asks the embedder to
6752
7029
  * trace through its heap and use reporter to report each JavaScript object
6753
7030
  * reachable from any of the given wrappers.
6754
- *
6755
- * Before the first call to the TraceWrappersFrom function TracePrologue will be
6756
- * called. When the garbage collection cycle is finished, TraceEpilogue will be
6757
- * called.
6758
7031
  */
6759
7032
  class V8_EXPORT EmbedderHeapTracer {
6760
7033
  public:
6761
- enum ForceCompletionAction { FORCE_COMPLETION, DO_NOT_FORCE_COMPLETION };
6762
-
6763
- struct AdvanceTracingActions {
6764
- explicit AdvanceTracingActions(ForceCompletionAction force_completion_)
6765
- : force_completion(force_completion_) {}
6766
-
6767
- ForceCompletionAction force_completion;
7034
+ // Indicator for the stack state of the embedder.
7035
+ enum EmbedderStackState {
7036
+ kUnknown,
7037
+ kNonEmpty,
7038
+ kEmpty,
6768
7039
  };
6769
7040
 
7041
+ virtual ~EmbedderHeapTracer() = default;
7042
+
6770
7043
  /**
6771
7044
  * Called by v8 to register internal fields of found wrappers.
6772
7045
  *
@@ -6782,17 +7055,22 @@ class V8_EXPORT EmbedderHeapTracer {
6782
7055
  virtual void TracePrologue() = 0;
6783
7056
 
6784
7057
  /**
6785
- * Called to to make a tracing step in the embedder.
7058
+ * Called to advance tracing in the embedder.
6786
7059
  *
6787
7060
  * The embedder is expected to trace its heap starting from wrappers reported
6788
7061
  * by RegisterV8References method, and report back all reachable wrappers.
6789
7062
  * Furthermore, the embedder is expected to stop tracing by the given
6790
- * deadline.
7063
+ * deadline. A deadline of infinity means that tracing should be finished.
6791
7064
  *
6792
- * Returns true if there is still work to do.
7065
+ * Returns |true| if tracing is done, and false otherwise.
7066
+ */
7067
+ virtual bool AdvanceTracing(double deadline_in_ms) = 0;
7068
+
7069
+ /*
7070
+ * Returns true if there no more tracing work to be done (see AdvanceTracing)
7071
+ * and false otherwise.
6793
7072
  */
6794
- virtual bool AdvanceTracing(double deadline_in_ms,
6795
- AdvanceTracingActions actions) = 0;
7073
+ virtual bool IsTracingDone() = 0;
6796
7074
 
6797
7075
  /**
6798
7076
  * Called at the end of a GC cycle.
@@ -6805,7 +7083,7 @@ class V8_EXPORT EmbedderHeapTracer {
6805
7083
  * Called upon entering the final marking pause. No more incremental marking
6806
7084
  * steps will follow this call.
6807
7085
  */
6808
- virtual void EnterFinalPause() = 0;
7086
+ virtual void EnterFinalPause(EmbedderStackState stack_state) = 0;
6809
7087
 
6810
7088
  /**
6811
7089
  * Called when tracing is aborted.
@@ -6813,20 +7091,46 @@ class V8_EXPORT EmbedderHeapTracer {
6813
7091
  * The embedder is expected to throw away all intermediate data and reset to
6814
7092
  * the initial state.
6815
7093
  */
6816
- virtual void AbortTracing() = 0;
7094
+ V8_DEPRECATED("Obsolete as V8 will not abort tracing anymore.",
7095
+ virtual void AbortTracing()) {}
6817
7096
 
6818
- /**
6819
- * Returns the number of wrappers that are still to be traced by the embedder.
7097
+ /*
7098
+ * Called by the embedder to request immediate finalization of the currently
7099
+ * running tracing phase that has been started with TracePrologue and not
7100
+ * yet finished with TraceEpilogue.
7101
+ *
7102
+ * Will be a noop when currently not in tracing.
7103
+ *
7104
+ * This is an experimental feature.
7105
+ */
7106
+ void FinalizeTracing();
7107
+
7108
+ /*
7109
+ * Called by the embedder to immediately perform a full garbage collection.
7110
+ *
7111
+ * Should only be used in testing code.
6820
7112
  */
6821
- virtual size_t NumberOfWrappersToTrace() { return 0; }
7113
+ void GarbageCollectionForTesting(EmbedderStackState stack_state);
7114
+
7115
+ /*
7116
+ * Returns the v8::Isolate this tracer is attached too and |nullptr| if it
7117
+ * is not attached to any v8::Isolate.
7118
+ */
7119
+ v8::Isolate* isolate() const { return isolate_; }
6822
7120
 
6823
7121
  protected:
6824
- virtual ~EmbedderHeapTracer() = default;
7122
+ v8::Isolate* isolate_ = nullptr;
7123
+
7124
+ friend class internal::LocalEmbedderHeapTracer;
6825
7125
  };
6826
7126
 
6827
7127
  /**
6828
7128
  * Callback and supporting data used in SnapshotCreator to implement embedder
6829
7129
  * logic to serialize internal fields.
7130
+ * Internal fields that directly reference V8 objects are serialized without
7131
+ * calling this callback. Internal fields that contain aligned pointers are
7132
+ * serialized by this callback if it returns non-zero result. Otherwise it is
7133
+ * serialized verbatim.
6830
7134
  */
6831
7135
  struct SerializeInternalFieldsCallback {
6832
7136
  typedef StartupData (*CallbackFunction)(Local<Object> holder, int index,
@@ -6872,25 +7176,15 @@ class V8_EXPORT Isolate {
6872
7176
  */
6873
7177
  struct CreateParams {
6874
7178
  CreateParams()
6875
- : entry_hook(nullptr),
6876
- code_event_handler(nullptr),
7179
+ : code_event_handler(nullptr),
6877
7180
  snapshot_blob(nullptr),
6878
7181
  counter_lookup_callback(nullptr),
6879
7182
  create_histogram_callback(nullptr),
6880
7183
  add_histogram_sample_callback(nullptr),
6881
7184
  array_buffer_allocator(nullptr),
6882
7185
  external_references(nullptr),
6883
- allow_atomics_wait(true) {}
6884
-
6885
- /**
6886
- * The optional entry_hook allows the host application to provide the
6887
- * address of a function that's invoked on entry to every V8-generated
6888
- * function. Note that entry_hook is invoked at the very start of each
6889
- * generated function.
6890
- * An entry_hook can only be provided in no-snapshot builds; in snapshot
6891
- * builds it must be nullptr.
6892
- */
6893
- FunctionEntryHook entry_hook;
7186
+ allow_atomics_wait(true),
7187
+ only_terminate_in_safe_scope(false) {}
6894
7188
 
6895
7189
  /**
6896
7190
  * Allows the host application to provide the address of a function that is
@@ -6943,6 +7237,11 @@ class V8_EXPORT Isolate {
6943
7237
  * this isolate. This can also be configured via SetAllowAtomicsWait.
6944
7238
  */
6945
7239
  bool allow_atomics_wait;
7240
+
7241
+ /**
7242
+ * Termination is postponed when there is no active SafeForTerminationScope.
7243
+ */
7244
+ bool only_terminate_in_safe_scope;
6946
7245
  };
6947
7246
 
6948
7247
 
@@ -6972,7 +7271,7 @@ class V8_EXPORT Isolate {
6972
7271
  */
6973
7272
  class V8_EXPORT DisallowJavascriptExecutionScope {
6974
7273
  public:
6975
- enum OnFailure { CRASH_ON_FAILURE, THROW_ON_FAILURE };
7274
+ enum OnFailure { CRASH_ON_FAILURE, THROW_ON_FAILURE, DUMP_ON_FAILURE };
6976
7275
 
6977
7276
  DisallowJavascriptExecutionScope(Isolate* isolate, OnFailure on_failure);
6978
7277
  ~DisallowJavascriptExecutionScope();
@@ -6984,7 +7283,7 @@ class V8_EXPORT Isolate {
6984
7283
  const DisallowJavascriptExecutionScope&) = delete;
6985
7284
 
6986
7285
  private:
6987
- bool on_failure_;
7286
+ OnFailure on_failure_;
6988
7287
  void* internal_;
6989
7288
  };
6990
7289
 
@@ -7006,6 +7305,7 @@ class V8_EXPORT Isolate {
7006
7305
  private:
7007
7306
  void* internal_throws_;
7008
7307
  void* internal_assert_;
7308
+ void* internal_dump_;
7009
7309
  };
7010
7310
 
7011
7311
  /**
@@ -7027,6 +7327,24 @@ class V8_EXPORT Isolate {
7027
7327
  internal::Isolate* const isolate_;
7028
7328
  };
7029
7329
 
7330
+ /**
7331
+ * This scope allows terminations inside direct V8 API calls and forbid them
7332
+ * inside any recursice API calls without explicit SafeForTerminationScope.
7333
+ */
7334
+ class V8_EXPORT SafeForTerminationScope {
7335
+ public:
7336
+ explicit SafeForTerminationScope(v8::Isolate* isolate);
7337
+ ~SafeForTerminationScope();
7338
+
7339
+ // Prevent copying of Scope objects.
7340
+ SafeForTerminationScope(const SafeForTerminationScope&) = delete;
7341
+ SafeForTerminationScope& operator=(const SafeForTerminationScope&) = delete;
7342
+
7343
+ private:
7344
+ internal::Isolate* isolate_;
7345
+ bool prev_value_;
7346
+ };
7347
+
7030
7348
  /**
7031
7349
  * Types of garbage collections that can be requested via
7032
7350
  * RequestGarbageCollectionForTesting.
@@ -7090,6 +7408,33 @@ class V8_EXPORT Isolate {
7090
7408
  kErrorStackTraceLimit = 45,
7091
7409
  kWebAssemblyInstantiation = 46,
7092
7410
  kDeoptimizerDisableSpeculation = 47,
7411
+ kArrayPrototypeSortJSArrayModifiedPrototype = 48,
7412
+ kFunctionTokenOffsetTooLongForToString = 49,
7413
+ kWasmSharedMemory = 50,
7414
+ kWasmThreadOpcodes = 51,
7415
+ kAtomicsNotify = 52,
7416
+ kAtomicsWake = 53,
7417
+ kCollator = 54,
7418
+ kNumberFormat = 55,
7419
+ kDateTimeFormat = 56,
7420
+ kPluralRules = 57,
7421
+ kRelativeTimeFormat = 58,
7422
+ kLocale = 59,
7423
+ kListFormat = 60,
7424
+ kSegmenter = 61,
7425
+ kStringLocaleCompare = 62,
7426
+ kStringToLocaleUpperCase = 63,
7427
+ kStringToLocaleLowerCase = 64,
7428
+ kNumberToLocaleString = 65,
7429
+ kDateToLocaleString = 66,
7430
+ kDateToLocaleDateString = 67,
7431
+ kDateToLocaleTimeString = 68,
7432
+ kAttemptOverrideReadOnlyOnPrototypeSloppy = 69,
7433
+ kAttemptOverrideReadOnlyOnPrototypeStrict = 70,
7434
+ kOptimizedFunctionWithOneShotBytecode = 71,
7435
+ kRegExpMatchIsTrueishOnNonJSRegExp = 72,
7436
+ kRegExpMatchIsFalseishOnJSRegExp = 73,
7437
+ kDateGetTimezoneOffset = 74,
7093
7438
 
7094
7439
  // If you add new values here, you'll also need to update Chromium's:
7095
7440
  // web_feature.mojom, UseCounterCallback.cpp, and enums.xml. V8 changes to
@@ -7110,6 +7455,26 @@ class V8_EXPORT Isolate {
7110
7455
  typedef void (*UseCounterCallback)(Isolate* isolate,
7111
7456
  UseCounterFeature feature);
7112
7457
 
7458
+ /**
7459
+ * Allocates a new isolate but does not initialize it. Does not change the
7460
+ * currently entered isolate.
7461
+ *
7462
+ * Only Isolate::GetData() and Isolate::SetData(), which access the
7463
+ * embedder-controlled parts of the isolate, are allowed to be called on the
7464
+ * uninitialized isolate. To initialize the isolate, call
7465
+ * Isolate::Initialize().
7466
+ *
7467
+ * When an isolate is no longer used its resources should be freed
7468
+ * by calling Dispose(). Using the delete operator is not allowed.
7469
+ *
7470
+ * V8::Initialize() must have run prior to this.
7471
+ */
7472
+ static Isolate* Allocate();
7473
+
7474
+ /**
7475
+ * Initialize an Isolate previously allocated by Isolate::Allocate().
7476
+ */
7477
+ static void Initialize(Isolate* isolate, const CreateParams& params);
7113
7478
 
7114
7479
  /**
7115
7480
  * Creates a new isolate. Does not change the currently entered
@@ -7157,6 +7522,12 @@ class V8_EXPORT Isolate {
7157
7522
  void SetHostInitializeImportMetaObjectCallback(
7158
7523
  HostInitializeImportMetaObjectCallback callback);
7159
7524
 
7525
+ /**
7526
+ * This specifies the callback called when the stack property of Error
7527
+ * is accessed.
7528
+ */
7529
+ void SetPrepareStackTraceCallback(PrepareStackTraceCallback callback);
7530
+
7160
7531
  /**
7161
7532
  * Optional notification that the system is running low on memory.
7162
7533
  * V8 uses these notifications to guide heuristics.
@@ -7325,15 +7696,7 @@ class V8_EXPORT Isolate {
7325
7696
  HeapProfiler* GetHeapProfiler();
7326
7697
 
7327
7698
  /**
7328
- * Returns CPU profiler for this isolate. Will return NULL unless the isolate
7329
- * is initialized. It is the embedder's responsibility to stop all CPU
7330
- * profiling activities if it has started any.
7331
- */
7332
- V8_DEPRECATED("CpuProfiler should be created with CpuProfiler::New call.",
7333
- CpuProfiler* GetCpuProfiler());
7334
-
7335
- /**
7336
- * Tells the CPU profiler whether the embedder is idle.
7699
+ * Tells the VM whether the embedder is idle or not.
7337
7700
  */
7338
7701
  void SetIdle(bool is_idle);
7339
7702
 
@@ -7346,18 +7709,9 @@ class V8_EXPORT Isolate {
7346
7709
  */
7347
7710
  Local<Context> GetCurrentContext();
7348
7711
 
7349
- /**
7350
- * Returns the context of the calling JavaScript code. That is the
7351
- * context of the top-most JavaScript frame. If there are no
7352
- * JavaScript frames an empty handle is returned.
7353
- */
7354
- V8_DEPRECATED(
7355
- "Calling context concept is not compatible with tail calls, and will be "
7356
- "removed.",
7357
- Local<Context> GetCallingContext());
7358
-
7359
7712
  /** Returns the last context entered through V8's C++ API. */
7360
- Local<Context> GetEnteredContext();
7713
+ V8_DEPRECATED("Use GetEnteredOrMicrotaskContext().",
7714
+ Local<Context> GetEnteredContext());
7361
7715
 
7362
7716
  /**
7363
7717
  * Returns either the last context entered through V8's C++ API, or the
@@ -7412,6 +7766,90 @@ class V8_EXPORT Isolate {
7412
7766
  */
7413
7767
  void SetEmbedderHeapTracer(EmbedderHeapTracer* tracer);
7414
7768
 
7769
+ /*
7770
+ * Gets the currently active heap tracer for the isolate.
7771
+ */
7772
+ EmbedderHeapTracer* GetEmbedderHeapTracer();
7773
+
7774
+ /**
7775
+ * Use for |AtomicsWaitCallback| to indicate the type of event it receives.
7776
+ */
7777
+ enum class AtomicsWaitEvent {
7778
+ /** Indicates that this call is happening before waiting. */
7779
+ kStartWait,
7780
+ /** `Atomics.wait()` finished because of an `Atomics.wake()` call. */
7781
+ kWokenUp,
7782
+ /** `Atomics.wait()` finished because it timed out. */
7783
+ kTimedOut,
7784
+ /** `Atomics.wait()` was interrupted through |TerminateExecution()|. */
7785
+ kTerminatedExecution,
7786
+ /** `Atomics.wait()` was stopped through |AtomicsWaitWakeHandle|. */
7787
+ kAPIStopped,
7788
+ /** `Atomics.wait()` did not wait, as the initial condition was not met. */
7789
+ kNotEqual
7790
+ };
7791
+
7792
+ /**
7793
+ * Passed to |AtomicsWaitCallback| as a means of stopping an ongoing
7794
+ * `Atomics.wait` call.
7795
+ */
7796
+ class V8_EXPORT AtomicsWaitWakeHandle {
7797
+ public:
7798
+ /**
7799
+ * Stop this `Atomics.wait()` call and call the |AtomicsWaitCallback|
7800
+ * with |kAPIStopped|.
7801
+ *
7802
+ * This function may be called from another thread. The caller has to ensure
7803
+ * through proper synchronization that it is not called after
7804
+ * the finishing |AtomicsWaitCallback|.
7805
+ *
7806
+ * Note that the ECMAScript specification does not plan for the possibility
7807
+ * of wakeups that are neither coming from a timeout or an `Atomics.wake()`
7808
+ * call, so this may invalidate assumptions made by existing code.
7809
+ * The embedder may accordingly wish to schedule an exception in the
7810
+ * finishing |AtomicsWaitCallback|.
7811
+ */
7812
+ void Wake();
7813
+ };
7814
+
7815
+ /**
7816
+ * Embedder callback for `Atomics.wait()` that can be added through
7817
+ * |SetAtomicsWaitCallback|.
7818
+ *
7819
+ * This will be called just before starting to wait with the |event| value
7820
+ * |kStartWait| and after finishing waiting with one of the other
7821
+ * values of |AtomicsWaitEvent| inside of an `Atomics.wait()` call.
7822
+ *
7823
+ * |array_buffer| will refer to the underlying SharedArrayBuffer,
7824
+ * |offset_in_bytes| to the location of the waited-on memory address inside
7825
+ * the SharedArrayBuffer.
7826
+ *
7827
+ * |value| and |timeout_in_ms| will be the values passed to
7828
+ * the `Atomics.wait()` call. If no timeout was used, |timeout_in_ms|
7829
+ * will be `INFINITY`.
7830
+ *
7831
+ * In the |kStartWait| callback, |stop_handle| will be an object that
7832
+ * is only valid until the corresponding finishing callback and that
7833
+ * can be used to stop the wait process while it is happening.
7834
+ *
7835
+ * This callback may schedule exceptions, *unless* |event| is equal to
7836
+ * |kTerminatedExecution|.
7837
+ */
7838
+ typedef void (*AtomicsWaitCallback)(AtomicsWaitEvent event,
7839
+ Local<SharedArrayBuffer> array_buffer,
7840
+ size_t offset_in_bytes, int64_t value,
7841
+ double timeout_in_ms,
7842
+ AtomicsWaitWakeHandle* stop_handle,
7843
+ void* data);
7844
+
7845
+ /**
7846
+ * Set a new |AtomicsWaitCallback|. This overrides an earlier
7847
+ * |AtomicsWaitCallback|, if there was any. If |callback| is nullptr,
7848
+ * this unsets the callback. |data| will be passed to the callback
7849
+ * as its last parameter.
7850
+ */
7851
+ void SetAtomicsWaitCallback(AtomicsWaitCallback callback, void* data);
7852
+
7415
7853
  /**
7416
7854
  * Enables the host application to receive a notification after a
7417
7855
  * garbage collection. Allocations are allowed in the callback function,
@@ -7528,17 +7966,11 @@ class V8_EXPORT Isolate {
7528
7966
  * further callbacks.
7529
7967
  */
7530
7968
  void AddCallCompletedCallback(CallCompletedCallback callback);
7531
- V8_DEPRECATED(
7532
- "Use callback with parameter",
7533
- void AddCallCompletedCallback(DeprecatedCallCompletedCallback callback));
7534
7969
 
7535
7970
  /**
7536
7971
  * Removes callback that was installed by AddCallCompletedCallback.
7537
7972
  */
7538
7973
  void RemoveCallCompletedCallback(CallCompletedCallback callback);
7539
- V8_DEPRECATED("Use callback with parameter",
7540
- void RemoveCallCompletedCallback(
7541
- DeprecatedCallCompletedCallback callback));
7542
7974
 
7543
7975
  /**
7544
7976
  * Set the PromiseHook callback for various promise lifecycle
@@ -7572,14 +8004,11 @@ class V8_EXPORT Isolate {
7572
8004
  * Controls how Microtasks are invoked. See MicrotasksPolicy for details.
7573
8005
  */
7574
8006
  void SetMicrotasksPolicy(MicrotasksPolicy policy);
7575
- V8_DEPRECATED("Use SetMicrotasksPolicy",
7576
- void SetAutorunMicrotasks(bool autorun));
7577
8007
 
7578
8008
  /**
7579
8009
  * Returns the policy controlling how Microtasks are invoked.
7580
8010
  */
7581
8011
  MicrotasksPolicy GetMicrotasksPolicy() const;
7582
- V8_DEPRECATED("Use GetMicrotasksPolicy", bool WillAutorunMicrotasks() const);
7583
8012
 
7584
8013
  /**
7585
8014
  * Adds a callback to notify the host application after
@@ -7665,6 +8094,18 @@ class V8_EXPORT Isolate {
7665
8094
  */
7666
8095
  void IsolateInBackgroundNotification();
7667
8096
 
8097
+ /**
8098
+ * Optional notification which will enable the memory savings mode.
8099
+ * V8 uses this notification to guide heuristics which may result in a
8100
+ * smaller memory footprint at the cost of reduced runtime performance.
8101
+ */
8102
+ void EnableMemorySavingsMode();
8103
+
8104
+ /**
8105
+ * Optional notification which will disable the memory savings mode.
8106
+ */
8107
+ void DisableMemorySavingsMode();
8108
+
7668
8109
  /**
7669
8110
  * Optional notification to tell V8 the current performance requirements
7670
8111
  * of the embedder based on RAIL.
@@ -7728,7 +8169,9 @@ class V8_EXPORT Isolate {
7728
8169
  void SetStackLimit(uintptr_t stack_limit);
7729
8170
 
7730
8171
  /**
7731
- * Returns a memory range that can potentially contain jitted code.
8172
+ * Returns a memory range that can potentially contain jitted code. Code for
8173
+ * V8's 'builtins' will not be in this range if embedded builtins is enabled.
8174
+ * Instead, see GetEmbeddedCodeRange.
7732
8175
  *
7733
8176
  * On Win64, embedders are advised to install function table callbacks for
7734
8177
  * these ranges, as default SEH won't be able to unwind through jitted code.
@@ -7742,6 +8185,11 @@ class V8_EXPORT Isolate {
7742
8185
  */
7743
8186
  void GetCodeRange(void** start, size_t* length_in_bytes);
7744
8187
 
8188
+ /**
8189
+ * Returns the UnwindState necessary for use with the Unwinder API.
8190
+ */
8191
+ UnwindState GetUnwindState();
8192
+
7745
8193
  /** Set the callback to invoke in case of fatal errors. */
7746
8194
  void SetFatalErrorHandler(FatalErrorCallback that);
7747
8195
 
@@ -7765,6 +8213,14 @@ class V8_EXPORT Isolate {
7765
8213
  void RemoveNearHeapLimitCallback(NearHeapLimitCallback callback,
7766
8214
  size_t heap_limit);
7767
8215
 
8216
+ /**
8217
+ * If the heap limit was changed by the NearHeapLimitCallback, then the
8218
+ * initial heap limit will be restored once the heap size falls below the
8219
+ * given threshold percentage of the initial heap limit.
8220
+ * The threshold percentage is a number in (0.0, 1.0) range.
8221
+ */
8222
+ void AutomaticallyRestoreInitialHeapLimit(double threshold_percent = 0.5);
8223
+
7768
8224
  /**
7769
8225
  * Set the callback to invoke to check if code generation from
7770
8226
  * strings should be allowed.
@@ -7786,7 +8242,13 @@ class V8_EXPORT Isolate {
7786
8242
  void SetWasmModuleCallback(ExtensionCallback callback);
7787
8243
  void SetWasmInstanceCallback(ExtensionCallback callback);
7788
8244
 
7789
- void SetWasmCompileStreamingCallback(ApiImplementationCallback callback);
8245
+ V8_DEPRECATED(
8246
+ "The callback set in SetWasmStreamingCallback is used now",
8247
+ void SetWasmCompileStreamingCallback(ApiImplementationCallback callback));
8248
+
8249
+ void SetWasmStreamingCallback(WasmStreamingCallback callback);
8250
+
8251
+ void SetWasmThreadsEnabledCallback(WasmThreadsEnabledCallback callback);
7790
8252
 
7791
8253
  /**
7792
8254
  * Check if V8 is dead and therefore unusable. This is the case after
@@ -7857,7 +8319,9 @@ class V8_EXPORT Isolate {
7857
8319
  * garbage collection but is free to visit an arbitrary superset of these
7858
8320
  * objects.
7859
8321
  */
7860
- void VisitHandlesForPartialDependence(PersistentHandleVisitor* visitor);
8322
+ V8_DEPRECATE_SOON(
8323
+ "Use VisitHandlesWithClassIds",
8324
+ void VisitHandlesForPartialDependence(PersistentHandleVisitor* visitor));
7861
8325
 
7862
8326
  /**
7863
8327
  * Iterates through all the persistent handles in the current isolate's heap
@@ -7894,7 +8358,7 @@ class V8_EXPORT Isolate {
7894
8358
  template <class K, class V, class Traits>
7895
8359
  friend class PersistentValueMapBase;
7896
8360
 
7897
- internal::Object** GetDataFromSnapshotOnce(size_t index);
8361
+ internal::Address* GetDataFromSnapshotOnce(size_t index);
7898
8362
  void ReportExternalAllocationLimitReached();
7899
8363
  void CheckMemoryPressure();
7900
8364
  };
@@ -7952,25 +8416,6 @@ class V8_EXPORT V8 {
7952
8416
  static void SetNativesDataBlob(StartupData* startup_blob);
7953
8417
  static void SetSnapshotDataBlob(StartupData* startup_blob);
7954
8418
 
7955
- /**
7956
- * Bootstrap an isolate and a context from scratch to create a startup
7957
- * snapshot. Include the side-effects of running the optional script.
7958
- * Returns { NULL, 0 } on failure.
7959
- * The caller acquires ownership of the data array in the return value.
7960
- */
7961
- static StartupData CreateSnapshotDataBlob(const char* embedded_source = NULL);
7962
-
7963
- /**
7964
- * Bootstrap an isolate and a context from the cold startup blob, run the
7965
- * warm-up script to trigger code compilation. The side effects are then
7966
- * discarded. The resulting startup snapshot will include compiled code.
7967
- * Returns { NULL, 0 } on failure.
7968
- * The caller acquires ownership of the data array in the return value.
7969
- * The argument startup blob is untouched.
7970
- */
7971
- static StartupData WarmUpSnapshotDataBlob(StartupData cold_startup_blob,
7972
- const char* warmup_source);
7973
-
7974
8419
  /** Set the callback to invoke in case of Dcheck failures. */
7975
8420
  static void SetDcheckErrorHandler(DcheckErrorCallback that);
7976
8421
 
@@ -8095,15 +8540,17 @@ class V8_EXPORT V8 {
8095
8540
  * \param context The third argument passed to the Linux signal handler, which
8096
8541
  * points to a ucontext_t structure.
8097
8542
  */
8098
- static bool TryHandleSignal(int signal_number, void* info, void* context);
8543
+ V8_DEPRECATE_SOON("Use TryHandleWebAssemblyTrapPosix",
8544
+ static bool TryHandleSignal(int signal_number, void* info,
8545
+ void* context));
8099
8546
  #endif // V8_OS_POSIX
8100
8547
 
8101
8548
  /**
8102
8549
  * Enable the default signal handler rather than using one provided by the
8103
8550
  * embedder.
8104
8551
  */
8105
- V8_DEPRECATE_SOON("Use EnableWebAssemblyTrapHandler",
8106
- static bool RegisterDefaultSignalHandler());
8552
+ V8_DEPRECATED("Use EnableWebAssemblyTrapHandler",
8553
+ static bool RegisterDefaultSignalHandler());
8107
8554
 
8108
8555
  /**
8109
8556
  * Activate trap-based bounds checking for WebAssembly.
@@ -8116,26 +8563,20 @@ class V8_EXPORT V8 {
8116
8563
  private:
8117
8564
  V8();
8118
8565
 
8119
- static internal::Object** GlobalizeReference(internal::Isolate* isolate,
8120
- internal::Object** handle);
8121
- static internal::Object** CopyPersistent(internal::Object** handle);
8122
- static void DisposeGlobal(internal::Object** global_handle);
8123
- static void MakeWeak(internal::Object** location, void* data,
8566
+ static internal::Address* GlobalizeReference(internal::Isolate* isolate,
8567
+ internal::Address* handle);
8568
+ static internal::Address* CopyPersistent(internal::Address* handle);
8569
+ static void DisposeGlobal(internal::Address* global_handle);
8570
+ static void MakeWeak(internal::Address* location, void* data,
8124
8571
  WeakCallbackInfo<void>::Callback weak_callback,
8125
8572
  WeakCallbackType type);
8126
- static void MakeWeak(internal::Object** location, void* data,
8127
- // Must be 0 or -1.
8128
- int internal_field_index1,
8129
- // Must be 1 or -1.
8130
- int internal_field_index2,
8131
- WeakCallbackInfo<void>::Callback weak_callback);
8132
- static void MakeWeak(internal::Object*** location_addr);
8133
- static void* ClearWeak(internal::Object** location);
8134
- static void AnnotateStrongRetainer(internal::Object** location,
8573
+ static void MakeWeak(internal::Address** location_addr);
8574
+ static void* ClearWeak(internal::Address* location);
8575
+ static void AnnotateStrongRetainer(internal::Address* location,
8135
8576
  const char* label);
8136
8577
  static Value* Eternalize(Isolate* isolate, Value* handle);
8137
8578
 
8138
- static void RegisterExternallyReferencedObject(internal::Object** object,
8579
+ static void RegisterExternallyReferencedObject(internal::Address* location,
8139
8580
  internal::Isolate* isolate);
8140
8581
 
8141
8582
  template <class K, class V, class T>
@@ -8164,6 +8605,18 @@ class V8_EXPORT SnapshotCreator {
8164
8605
  public:
8165
8606
  enum class FunctionCodeHandling { kClear, kKeep };
8166
8607
 
8608
+ /**
8609
+ * Initialize and enter an isolate, and set it up for serialization.
8610
+ * The isolate is either created from scratch or from an existing snapshot.
8611
+ * The caller keeps ownership of the argument snapshot.
8612
+ * \param existing_blob existing snapshot from which to create this one.
8613
+ * \param external_references a null-terminated array of external references
8614
+ * that must be equivalent to CreateParams::external_references.
8615
+ */
8616
+ SnapshotCreator(Isolate* isolate,
8617
+ const intptr_t* external_references = nullptr,
8618
+ StartupData* existing_blob = nullptr);
8619
+
8167
8620
  /**
8168
8621
  * Create and enter an isolate, and set it up for serialization.
8169
8622
  * The isolate is either created from scratch or from an existing snapshot.
@@ -8244,8 +8697,8 @@ class V8_EXPORT SnapshotCreator {
8244
8697
  void operator=(const SnapshotCreator&) = delete;
8245
8698
 
8246
8699
  private:
8247
- size_t AddData(Local<Context> context, internal::Object* object);
8248
- size_t AddData(internal::Object* object);
8700
+ size_t AddData(Local<Context> context, internal::Address object);
8701
+ size_t AddData(internal::Address object);
8249
8702
 
8250
8703
  void* data_;
8251
8704
  };
@@ -8271,6 +8724,14 @@ class Maybe {
8271
8724
  */
8272
8725
  V8_INLINE T ToChecked() const { return FromJust(); }
8273
8726
 
8727
+ /**
8728
+ * Short-hand for ToChecked(), which doesn't return a value. To be used, where
8729
+ * the actual value of the Maybe is not needed like Object::Set.
8730
+ */
8731
+ V8_INLINE void Check() const {
8732
+ if (V8_UNLIKELY(!IsJust())) V8::FromJustIsNothing();
8733
+ }
8734
+
8274
8735
  /**
8275
8736
  * Converts this Maybe<> to a value of type T. If this Maybe<> is
8276
8737
  * nothing (empty), |false| is returned and |out| is left untouched.
@@ -8426,7 +8887,6 @@ class V8_EXPORT TryCatch {
8426
8887
  * Returns the .stack property of the thrown object. If no .stack
8427
8888
  * property is present an empty handle is returned.
8428
8889
  */
8429
- V8_DEPRECATED("Use maybe version.", Local<Value> StackTrace() const);
8430
8890
  V8_WARN_UNUSED_RESULT MaybeLocal<Value> StackTrace(
8431
8891
  Local<Context> context) const;
8432
8892
 
@@ -8485,7 +8945,7 @@ class V8_EXPORT TryCatch {
8485
8945
  * of the C++ try catch handler itself.
8486
8946
  */
8487
8947
  static void* JSStackComparableAddress(TryCatch* handler) {
8488
- if (handler == NULL) return NULL;
8948
+ if (handler == nullptr) return nullptr;
8489
8949
  return handler->js_stack_comparable_address_;
8490
8950
  }
8491
8951
 
@@ -8525,7 +8985,7 @@ class V8_EXPORT TryCatch {
8525
8985
  */
8526
8986
  class V8_EXPORT ExtensionConfiguration {
8527
8987
  public:
8528
- ExtensionConfiguration() : name_count_(0), names_(NULL) { }
8988
+ ExtensionConfiguration() : name_count_(0), names_(nullptr) {}
8529
8989
  ExtensionConfiguration(int name_count, const char* names[])
8530
8990
  : name_count_(name_count), names_(names) { }
8531
8991
 
@@ -8582,7 +9042,7 @@ class V8_EXPORT Context {
8582
9042
  * and only object identify will remain.
8583
9043
  */
8584
9044
  static Local<Context> New(
8585
- Isolate* isolate, ExtensionConfiguration* extensions = NULL,
9045
+ Isolate* isolate, ExtensionConfiguration* extensions = nullptr,
8586
9046
  MaybeLocal<ObjectTemplate> global_template = MaybeLocal<ObjectTemplate>(),
8587
9047
  MaybeLocal<Value> global_object = MaybeLocal<Value>(),
8588
9048
  DeserializeInternalFieldsCallback internal_fields_deserializer =
@@ -8767,7 +9227,7 @@ class V8_EXPORT Context {
8767
9227
  * stack.
8768
9228
  * https://html.spec.whatwg.org/multipage/webappapis.html#backup-incumbent-settings-object-stack
8769
9229
  */
8770
- class V8_EXPORT BackupIncumbentScope {
9230
+ class V8_EXPORT BackupIncumbentScope final {
8771
9231
  public:
8772
9232
  /**
8773
9233
  * |backup_incumbent_context| is pushed onto the backup incumbent settings
@@ -8776,10 +9236,20 @@ class V8_EXPORT Context {
8776
9236
  explicit BackupIncumbentScope(Local<Context> backup_incumbent_context);
8777
9237
  ~BackupIncumbentScope();
8778
9238
 
9239
+ /**
9240
+ * Returns address that is comparable with JS stack address. Note that JS
9241
+ * stack may be allocated separately from the native stack. See also
9242
+ * |TryCatch::JSStackComparableAddress| for details.
9243
+ */
9244
+ uintptr_t JSStackComparableAddress() const {
9245
+ return js_stack_comparable_address_;
9246
+ }
9247
+
8779
9248
  private:
8780
9249
  friend class internal::Isolate;
8781
9250
 
8782
9251
  Local<Context> backup_incumbent_context_;
9252
+ uintptr_t js_stack_comparable_address_ = 0;
8783
9253
  const BackupIncumbentScope* prev_ = nullptr;
8784
9254
  };
8785
9255
 
@@ -8789,7 +9259,7 @@ class V8_EXPORT Context {
8789
9259
  friend class Object;
8790
9260
  friend class Function;
8791
9261
 
8792
- internal::Object** GetDataFromSnapshotOnce(size_t index);
9262
+ internal::Address* GetDataFromSnapshotOnce(size_t index);
8793
9263
  Local<Value> SlowGetEmbedderData(int index);
8794
9264
  void* SlowGetAlignedPointerFromEmbedderData(int index);
8795
9265
  };
@@ -8918,282 +9388,57 @@ class V8_EXPORT Locker {
8918
9388
  internal::Isolate* isolate_;
8919
9389
  };
8920
9390
 
8921
-
8922
- // --- Implementation ---
8923
-
8924
-
8925
- namespace internal {
8926
-
8927
- const int kApiPointerSize = sizeof(void*); // NOLINT
8928
- const int kApiIntSize = sizeof(int); // NOLINT
8929
- const int kApiInt64Size = sizeof(int64_t); // NOLINT
8930
-
8931
- // Tag information for HeapObject.
8932
- const int kHeapObjectTag = 1;
8933
- const int kWeakHeapObjectTag = 3;
8934
- const int kHeapObjectTagSize = 2;
8935
- const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1;
8936
-
8937
- // Tag information for Smi.
8938
- const int kSmiTag = 0;
8939
- const int kSmiTagSize = 1;
8940
- const intptr_t kSmiTagMask = (1 << kSmiTagSize) - 1;
8941
-
8942
- template <size_t ptr_size> struct SmiTagging;
8943
-
8944
- template<int kSmiShiftSize>
8945
- V8_INLINE internal::Object* IntToSmi(int value) {
8946
- int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
8947
- uintptr_t tagged_value =
8948
- (static_cast<uintptr_t>(value) << smi_shift_bits) | kSmiTag;
8949
- return reinterpret_cast<internal::Object*>(tagged_value);
8950
- }
8951
-
8952
- // Smi constants for 32-bit systems.
8953
- template <> struct SmiTagging<4> {
8954
- enum { kSmiShiftSize = 0, kSmiValueSize = 31 };
8955
- static int SmiShiftSize() { return kSmiShiftSize; }
8956
- static int SmiValueSize() { return kSmiValueSize; }
8957
- V8_INLINE static int SmiToInt(const internal::Object* value) {
8958
- int shift_bits = kSmiTagSize + kSmiShiftSize;
8959
- // Throw away top 32 bits and shift down (requires >> to be sign extending).
8960
- return static_cast<int>(reinterpret_cast<intptr_t>(value)) >> shift_bits;
8961
- }
8962
- V8_INLINE static internal::Object* IntToSmi(int value) {
8963
- return internal::IntToSmi<kSmiShiftSize>(value);
8964
- }
8965
- V8_INLINE static bool IsValidSmi(intptr_t value) {
8966
- // To be representable as an tagged small integer, the two
8967
- // most-significant bits of 'value' must be either 00 or 11 due to
8968
- // sign-extension. To check this we add 01 to the two
8969
- // most-significant bits, and check if the most-significant bit is 0
8970
- //
8971
- // CAUTION: The original code below:
8972
- // bool result = ((value + 0x40000000) & 0x80000000) == 0;
8973
- // may lead to incorrect results according to the C language spec, and
8974
- // in fact doesn't work correctly with gcc4.1.1 in some cases: The
8975
- // compiler may produce undefined results in case of signed integer
8976
- // overflow. The computation must be done w/ unsigned ints.
8977
- return static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U;
8978
- }
8979
- };
8980
-
8981
- // Smi constants for 64-bit systems.
8982
- template <> struct SmiTagging<8> {
8983
- enum { kSmiShiftSize = 31, kSmiValueSize = 32 };
8984
- static int SmiShiftSize() { return kSmiShiftSize; }
8985
- static int SmiValueSize() { return kSmiValueSize; }
8986
- V8_INLINE static int SmiToInt(const internal::Object* value) {
8987
- int shift_bits = kSmiTagSize + kSmiShiftSize;
8988
- // Shift down and throw away top 32 bits.
8989
- return static_cast<int>(reinterpret_cast<intptr_t>(value) >> shift_bits);
8990
- }
8991
- V8_INLINE static internal::Object* IntToSmi(int value) {
8992
- return internal::IntToSmi<kSmiShiftSize>(value);
8993
- }
8994
- V8_INLINE static bool IsValidSmi(intptr_t value) {
8995
- // To be representable as a long smi, the value must be a 32-bit integer.
8996
- return (value == static_cast<int32_t>(value));
8997
- }
8998
- };
8999
-
9000
- typedef SmiTagging<kApiPointerSize> PlatformSmiTagging;
9001
- const int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize;
9002
- const int kSmiValueSize = PlatformSmiTagging::kSmiValueSize;
9003
- V8_INLINE static bool SmiValuesAre31Bits() { return kSmiValueSize == 31; }
9004
- V8_INLINE static bool SmiValuesAre32Bits() { return kSmiValueSize == 32; }
9005
-
9006
9391
  /**
9007
- * This class exports constants and functionality from within v8 that
9008
- * is necessary to implement inline functions in the v8 api. Don't
9009
- * depend on functions and constants defined here.
9392
+ * Various helpers for skipping over V8 frames in a given stack.
9393
+ *
9394
+ * The unwinder API is only supported on the x64 architecture.
9010
9395
  */
9011
- class Internals {
9396
+ class V8_EXPORT Unwinder {
9012
9397
  public:
9013
- // These values match non-compiler-dependent values defined within
9014
- // the implementation of v8.
9015
- static const int kHeapObjectMapOffset = 0;
9016
- static const int kMapInstanceTypeOffset = 1 * kApiPointerSize + kApiIntSize;
9017
- static const int kStringResourceOffset = 3 * kApiPointerSize;
9018
-
9019
- static const int kOddballKindOffset = 4 * kApiPointerSize + sizeof(double);
9020
- static const int kForeignAddressOffset = kApiPointerSize;
9021
- static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
9022
- static const int kFixedArrayHeaderSize = 2 * kApiPointerSize;
9023
- static const int kContextHeaderSize = 2 * kApiPointerSize;
9024
- static const int kContextEmbedderDataIndex = 5;
9025
- static const int kFullStringRepresentationMask = 0x0f;
9026
- static const int kStringEncodingMask = 0x8;
9027
- static const int kExternalTwoByteRepresentationTag = 0x02;
9028
- static const int kExternalOneByteRepresentationTag = 0x0a;
9029
-
9030
- static const int kIsolateEmbedderDataOffset = 0 * kApiPointerSize;
9031
- static const int kExternalMemoryOffset = 4 * kApiPointerSize;
9032
- static const int kExternalMemoryLimitOffset =
9033
- kExternalMemoryOffset + kApiInt64Size;
9034
- static const int kExternalMemoryAtLastMarkCompactOffset =
9035
- kExternalMemoryLimitOffset + kApiInt64Size;
9036
- static const int kIsolateRootsOffset = kExternalMemoryLimitOffset +
9037
- kApiInt64Size + kApiInt64Size +
9038
- kApiPointerSize + kApiPointerSize;
9039
- static const int kUndefinedValueRootIndex = 4;
9040
- static const int kTheHoleValueRootIndex = 5;
9041
- static const int kNullValueRootIndex = 6;
9042
- static const int kTrueValueRootIndex = 7;
9043
- static const int kFalseValueRootIndex = 8;
9044
- static const int kEmptyStringRootIndex = 9;
9045
-
9046
- static const int kNodeClassIdOffset = 1 * kApiPointerSize;
9047
- static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3;
9048
- static const int kNodeStateMask = 0x7;
9049
- static const int kNodeStateIsWeakValue = 2;
9050
- static const int kNodeStateIsPendingValue = 3;
9051
- static const int kNodeStateIsNearDeathValue = 4;
9052
- static const int kNodeIsIndependentShift = 3;
9053
- static const int kNodeIsActiveShift = 4;
9054
-
9055
- static const int kFirstNonstringType = 0x80;
9056
- static const int kOddballType = 0x83;
9057
- static const int kForeignType = 0x87;
9058
- static const int kJSSpecialApiObjectType = 0x410;
9059
- static const int kJSApiObjectType = 0x420;
9060
- static const int kJSObjectType = 0x421;
9061
-
9062
- static const int kUndefinedOddballKind = 5;
9063
- static const int kNullOddballKind = 3;
9064
-
9065
- static const uint32_t kNumIsolateDataSlots = 4;
9066
-
9067
- V8_EXPORT static void CheckInitializedImpl(v8::Isolate* isolate);
9068
- V8_INLINE static void CheckInitialized(v8::Isolate* isolate) {
9069
- #ifdef V8_ENABLE_CHECKS
9070
- CheckInitializedImpl(isolate);
9071
- #endif
9072
- }
9073
-
9074
- V8_INLINE static bool HasHeapObjectTag(const internal::Object* value) {
9075
- return ((reinterpret_cast<intptr_t>(value) & kHeapObjectTagMask) ==
9076
- kHeapObjectTag);
9077
- }
9078
-
9079
- V8_INLINE static int SmiValue(const internal::Object* value) {
9080
- return PlatformSmiTagging::SmiToInt(value);
9081
- }
9082
-
9083
- V8_INLINE static internal::Object* IntToSmi(int value) {
9084
- return PlatformSmiTagging::IntToSmi(value);
9085
- }
9086
-
9087
- V8_INLINE static bool IsValidSmi(intptr_t value) {
9088
- return PlatformSmiTagging::IsValidSmi(value);
9089
- }
9090
-
9091
- V8_INLINE static int GetInstanceType(const internal::Object* obj) {
9092
- typedef internal::Object O;
9093
- O* map = ReadField<O*>(obj, kHeapObjectMapOffset);
9094
- return ReadField<uint16_t>(map, kMapInstanceTypeOffset);
9095
- }
9096
-
9097
- V8_INLINE static int GetOddballKind(const internal::Object* obj) {
9098
- typedef internal::Object O;
9099
- return SmiValue(ReadField<O*>(obj, kOddballKindOffset));
9100
- }
9101
-
9102
- V8_INLINE static bool IsExternalTwoByteString(int instance_type) {
9103
- int representation = (instance_type & kFullStringRepresentationMask);
9104
- return representation == kExternalTwoByteRepresentationTag;
9105
- }
9106
-
9107
- V8_INLINE static uint8_t GetNodeFlag(internal::Object** obj, int shift) {
9108
- uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
9109
- return *addr & static_cast<uint8_t>(1U << shift);
9110
- }
9111
-
9112
- V8_INLINE static void UpdateNodeFlag(internal::Object** obj,
9113
- bool value, int shift) {
9114
- uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
9115
- uint8_t mask = static_cast<uint8_t>(1U << shift);
9116
- *addr = static_cast<uint8_t>((*addr & ~mask) | (value << shift));
9117
- }
9118
-
9119
- V8_INLINE static uint8_t GetNodeState(internal::Object** obj) {
9120
- uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
9121
- return *addr & kNodeStateMask;
9122
- }
9123
-
9124
- V8_INLINE static void UpdateNodeState(internal::Object** obj,
9125
- uint8_t value) {
9126
- uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
9127
- *addr = static_cast<uint8_t>((*addr & ~kNodeStateMask) | value);
9128
- }
9129
-
9130
- V8_INLINE static void SetEmbedderData(v8::Isolate* isolate,
9131
- uint32_t slot,
9132
- void* data) {
9133
- uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
9134
- kIsolateEmbedderDataOffset + slot * kApiPointerSize;
9135
- *reinterpret_cast<void**>(addr) = data;
9136
- }
9137
-
9138
- V8_INLINE static void* GetEmbedderData(const v8::Isolate* isolate,
9139
- uint32_t slot) {
9140
- const uint8_t* addr = reinterpret_cast<const uint8_t*>(isolate) +
9141
- kIsolateEmbedderDataOffset + slot * kApiPointerSize;
9142
- return *reinterpret_cast<void* const*>(addr);
9143
- }
9144
-
9145
- V8_INLINE static internal::Object** GetRoot(v8::Isolate* isolate,
9146
- int index) {
9147
- uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateRootsOffset;
9148
- return reinterpret_cast<internal::Object**>(addr + index * kApiPointerSize);
9149
- }
9150
-
9151
- template <typename T>
9152
- V8_INLINE static T ReadField(const internal::Object* ptr, int offset) {
9153
- const uint8_t* addr =
9154
- reinterpret_cast<const uint8_t*>(ptr) + offset - kHeapObjectTag;
9155
- return *reinterpret_cast<const T*>(addr);
9156
- }
9157
-
9158
- template <typename T>
9159
- V8_INLINE static T ReadEmbedderData(const v8::Context* context, int index) {
9160
- typedef internal::Object O;
9161
- typedef internal::Internals I;
9162
- O* ctx = *reinterpret_cast<O* const*>(context);
9163
- int embedder_data_offset = I::kContextHeaderSize +
9164
- (internal::kApiPointerSize * I::kContextEmbedderDataIndex);
9165
- O* embedder_data = I::ReadField<O*>(ctx, embedder_data_offset);
9166
- int value_offset =
9167
- I::kFixedArrayHeaderSize + (internal::kApiPointerSize * index);
9168
- return I::ReadField<T>(embedder_data, value_offset);
9169
- }
9170
- };
9398
+ /**
9399
+ * Attempt to unwind the stack to the most recent C++ frame. This function is
9400
+ * signal-safe and does not access any V8 state and thus doesn't require an
9401
+ * Isolate.
9402
+ *
9403
+ * The unwinder needs to know the location of the JS Entry Stub (a piece of
9404
+ * code that is run when C++ code calls into generated JS code). This is used
9405
+ * for edge cases where the current frame is being constructed or torn down
9406
+ * when the stack sample occurs.
9407
+ *
9408
+ * The unwinder also needs the virtual memory range of all possible V8 code
9409
+ * objects. There are two ranges required - the heap code range and the range
9410
+ * for code embedded in the binary. The V8 API provides all required inputs
9411
+ * via an UnwindState object through the Isolate::GetUnwindState() API. These
9412
+ * values will not change after Isolate initialization, so the same
9413
+ * |unwind_state| can be used for multiple calls.
9414
+ *
9415
+ * \param unwind_state Input state for the Isolate that the stack comes from.
9416
+ * \param register_state The current registers. This is an in-out param that
9417
+ * will be overwritten with the register values after unwinding, on success.
9418
+ * \param stack_base The resulting stack pointer and frame pointer values are
9419
+ * bounds-checked against the stack_base and the original stack pointer value
9420
+ * to ensure that they are valid locations in the given stack. If these values
9421
+ * or any intermediate frame pointer values used during unwinding are ever out
9422
+ * of these bounds, unwinding will fail.
9423
+ *
9424
+ * \return True on success.
9425
+ */
9426
+ static bool TryUnwindV8Frames(const UnwindState& unwind_state,
9427
+ RegisterState* register_state,
9428
+ const void* stack_base);
9171
9429
 
9172
- // Only perform cast check for types derived from v8::Data since
9173
- // other types do not implement the Cast method.
9174
- template <bool PerformCheck>
9175
- struct CastCheck {
9176
- template <class T>
9177
- static void Perform(T* data);
9430
+ /**
9431
+ * Whether the PC is within the V8 code range represented by code_range or
9432
+ * embedded_code_range in |unwind_state|.
9433
+ *
9434
+ * If this returns false, then calling UnwindV8Frames() with the same PC
9435
+ * and unwind_state will always fail. If it returns true, then unwinding may
9436
+ * (but not necessarily) be successful.
9437
+ */
9438
+ static bool PCIsInV8(const UnwindState& unwind_state, void* pc);
9178
9439
  };
9179
9440
 
9180
- template <>
9181
- template <class T>
9182
- void CastCheck<true>::Perform(T* data) {
9183
- T::Cast(data);
9184
- }
9185
-
9186
- template <>
9187
- template <class T>
9188
- void CastCheck<false>::Perform(T* data) {}
9189
-
9190
- template <class T>
9191
- V8_INLINE void PerformCastCheck(T* data) {
9192
- CastCheck<std::is_base_of<Data, T>::value>::Perform(data);
9193
- }
9194
-
9195
- } // namespace internal
9196
-
9441
+ // --- Implementation ---
9197
9442
 
9198
9443
  template <class T>
9199
9444
  Local<T> Local<T>::New(Isolate* isolate, Local<T> that) {
@@ -9208,9 +9453,9 @@ Local<T> Local<T>::New(Isolate* isolate, const PersistentBase<T>& that) {
9208
9453
 
9209
9454
  template <class T>
9210
9455
  Local<T> Local<T>::New(Isolate* isolate, T* that) {
9211
- if (that == NULL) return Local<T>();
9456
+ if (that == nullptr) return Local<T>();
9212
9457
  T* that_ptr = that;
9213
- internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
9458
+ internal::Address* p = reinterpret_cast<internal::Address*>(that_ptr);
9214
9459
  return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
9215
9460
  reinterpret_cast<internal::Isolate*>(isolate), *p)));
9216
9461
  }
@@ -9252,8 +9497,8 @@ void* WeakCallbackInfo<T>::GetInternalField(int index) const {
9252
9497
 
9253
9498
  template <class T>
9254
9499
  T* PersistentBase<T>::New(Isolate* isolate, T* that) {
9255
- if (that == NULL) return NULL;
9256
- internal::Object** p = reinterpret_cast<internal::Object**>(that);
9500
+ if (that == nullptr) return nullptr;
9501
+ internal::Address* p = reinterpret_cast<internal::Address*>(that);
9257
9502
  return reinterpret_cast<T*>(
9258
9503
  V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate),
9259
9504
  p));
@@ -9266,7 +9511,7 @@ void Persistent<T, M>::Copy(const Persistent<S, M2>& that) {
9266
9511
  TYPE_CHECK(T, S);
9267
9512
  this->Reset();
9268
9513
  if (that.IsEmpty()) return;
9269
- internal::Object** p = reinterpret_cast<internal::Object**>(that.val_);
9514
+ internal::Address* p = reinterpret_cast<internal::Address*>(that.val_);
9270
9515
  this->val_ = reinterpret_cast<T*>(V8::CopyPersistent(p));
9271
9516
  M::Copy(that, this);
9272
9517
  }
@@ -9275,7 +9520,7 @@ template <class T>
9275
9520
  bool PersistentBase<T>::IsIndependent() const {
9276
9521
  typedef internal::Internals I;
9277
9522
  if (this->IsEmpty()) return false;
9278
- return I::GetNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
9523
+ return I::GetNodeFlag(reinterpret_cast<internal::Address*>(this->val_),
9279
9524
  I::kNodeIsIndependentShift);
9280
9525
  }
9281
9526
 
@@ -9284,7 +9529,7 @@ bool PersistentBase<T>::IsNearDeath() const {
9284
9529
  typedef internal::Internals I;
9285
9530
  if (this->IsEmpty()) return false;
9286
9531
  uint8_t node_state =
9287
- I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_));
9532
+ I::GetNodeState(reinterpret_cast<internal::Address*>(this->val_));
9288
9533
  return node_state == I::kNodeStateIsNearDeathValue ||
9289
9534
  node_state == I::kNodeStateIsPendingValue;
9290
9535
  }
@@ -9294,16 +9539,16 @@ template <class T>
9294
9539
  bool PersistentBase<T>::IsWeak() const {
9295
9540
  typedef internal::Internals I;
9296
9541
  if (this->IsEmpty()) return false;
9297
- return I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_)) ==
9298
- I::kNodeStateIsWeakValue;
9542
+ return I::GetNodeState(reinterpret_cast<internal::Address*>(this->val_)) ==
9543
+ I::kNodeStateIsWeakValue;
9299
9544
  }
9300
9545
 
9301
9546
 
9302
9547
  template <class T>
9303
9548
  void PersistentBase<T>::Reset() {
9304
9549
  if (this->IsEmpty()) return;
9305
- V8::DisposeGlobal(reinterpret_cast<internal::Object**>(this->val_));
9306
- val_ = 0;
9550
+ V8::DisposeGlobal(reinterpret_cast<internal::Address*>(this->val_));
9551
+ val_ = nullptr;
9307
9552
  }
9308
9553
 
9309
9554
 
@@ -9334,25 +9579,25 @@ V8_INLINE void PersistentBase<T>::SetWeak(
9334
9579
  P* parameter, typename WeakCallbackInfo<P>::Callback callback,
9335
9580
  WeakCallbackType type) {
9336
9581
  typedef typename WeakCallbackInfo<void>::Callback Callback;
9337
- V8::MakeWeak(reinterpret_cast<internal::Object**>(this->val_), parameter,
9582
+ V8::MakeWeak(reinterpret_cast<internal::Address*>(this->val_), parameter,
9338
9583
  reinterpret_cast<Callback>(callback), type);
9339
9584
  }
9340
9585
 
9341
9586
  template <class T>
9342
9587
  void PersistentBase<T>::SetWeak() {
9343
- V8::MakeWeak(reinterpret_cast<internal::Object***>(&this->val_));
9588
+ V8::MakeWeak(reinterpret_cast<internal::Address**>(&this->val_));
9344
9589
  }
9345
9590
 
9346
9591
  template <class T>
9347
9592
  template <typename P>
9348
9593
  P* PersistentBase<T>::ClearWeak() {
9349
9594
  return reinterpret_cast<P*>(
9350
- V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_)));
9595
+ V8::ClearWeak(reinterpret_cast<internal::Address*>(this->val_)));
9351
9596
  }
9352
9597
 
9353
9598
  template <class T>
9354
9599
  void PersistentBase<T>::AnnotateStrongRetainer(const char* label) {
9355
- V8::AnnotateStrongRetainer(reinterpret_cast<internal::Object**>(this->val_),
9600
+ V8::AnnotateStrongRetainer(reinterpret_cast<internal::Address*>(this->val_),
9356
9601
  label);
9357
9602
  }
9358
9603
 
@@ -9360,7 +9605,7 @@ template <class T>
9360
9605
  void PersistentBase<T>::RegisterExternalReference(Isolate* isolate) const {
9361
9606
  if (IsEmpty()) return;
9362
9607
  V8::RegisterExternallyReferencedObject(
9363
- reinterpret_cast<internal::Object**>(this->val_),
9608
+ reinterpret_cast<internal::Address*>(this->val_),
9364
9609
  reinterpret_cast<internal::Isolate*>(isolate));
9365
9610
  }
9366
9611
 
@@ -9368,7 +9613,7 @@ template <class T>
9368
9613
  void PersistentBase<T>::MarkIndependent() {
9369
9614
  typedef internal::Internals I;
9370
9615
  if (this->IsEmpty()) return;
9371
- I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_), true,
9616
+ I::UpdateNodeFlag(reinterpret_cast<internal::Address*>(this->val_), true,
9372
9617
  I::kNodeIsIndependentShift);
9373
9618
  }
9374
9619
 
@@ -9376,7 +9621,7 @@ template <class T>
9376
9621
  void PersistentBase<T>::MarkActive() {
9377
9622
  typedef internal::Internals I;
9378
9623
  if (this->IsEmpty()) return;
9379
- I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_), true,
9624
+ I::UpdateNodeFlag(reinterpret_cast<internal::Address*>(this->val_), true,
9380
9625
  I::kNodeIsActiveShift);
9381
9626
  }
9382
9627
 
@@ -9385,7 +9630,7 @@ template <class T>
9385
9630
  void PersistentBase<T>::SetWrapperClassId(uint16_t class_id) {
9386
9631
  typedef internal::Internals I;
9387
9632
  if (this->IsEmpty()) return;
9388
- internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
9633
+ internal::Address* obj = reinterpret_cast<internal::Address*>(this->val_);
9389
9634
  uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
9390
9635
  *reinterpret_cast<uint16_t*>(addr) = class_id;
9391
9636
  }
@@ -9395,14 +9640,13 @@ template <class T>
9395
9640
  uint16_t PersistentBase<T>::WrapperClassId() const {
9396
9641
  typedef internal::Internals I;
9397
9642
  if (this->IsEmpty()) return 0;
9398
- internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
9643
+ internal::Address* obj = reinterpret_cast<internal::Address*>(this->val_);
9399
9644
  uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
9400
9645
  return *reinterpret_cast<uint16_t*>(addr);
9401
9646
  }
9402
9647
 
9403
-
9404
- template<typename T>
9405
- ReturnValue<T>::ReturnValue(internal::Object** slot) : value_(slot) {}
9648
+ template <typename T>
9649
+ ReturnValue<T>::ReturnValue(internal::Address* slot) : value_(slot) {}
9406
9650
 
9407
9651
  template<typename T>
9408
9652
  template<typename S>
@@ -9411,7 +9655,7 @@ void ReturnValue<T>::Set(const Persistent<S>& handle) {
9411
9655
  if (V8_UNLIKELY(handle.IsEmpty())) {
9412
9656
  *value_ = GetDefaultValue();
9413
9657
  } else {
9414
- *value_ = *reinterpret_cast<internal::Object**>(*handle);
9658
+ *value_ = *reinterpret_cast<internal::Address*>(*handle);
9415
9659
  }
9416
9660
  }
9417
9661
 
@@ -9422,7 +9666,7 @@ void ReturnValue<T>::Set(const Global<S>& handle) {
9422
9666
  if (V8_UNLIKELY(handle.IsEmpty())) {
9423
9667
  *value_ = GetDefaultValue();
9424
9668
  } else {
9425
- *value_ = *reinterpret_cast<internal::Object**>(*handle);
9669
+ *value_ = *reinterpret_cast<internal::Address*>(*handle);
9426
9670
  }
9427
9671
  }
9428
9672
 
@@ -9433,7 +9677,7 @@ void ReturnValue<T>::Set(const Local<S> handle) {
9433
9677
  if (V8_UNLIKELY(handle.IsEmpty())) {
9434
9678
  *value_ = GetDefaultValue();
9435
9679
  } else {
9436
- *value_ = *reinterpret_cast<internal::Object**>(*handle);
9680
+ *value_ = *reinterpret_cast<internal::Address*>(*handle);
9437
9681
  }
9438
9682
  }
9439
9683
 
@@ -9521,15 +9765,15 @@ void ReturnValue<T>::Set(S* whatever) {
9521
9765
  TYPE_CHECK(S*, Primitive);
9522
9766
  }
9523
9767
 
9524
- template<typename T>
9525
- internal::Object* ReturnValue<T>::GetDefaultValue() {
9768
+ template <typename T>
9769
+ internal::Address ReturnValue<T>::GetDefaultValue() {
9526
9770
  // Default value is always the pointer below value_ on the stack.
9527
9771
  return value_[-1];
9528
9772
  }
9529
9773
 
9530
9774
  template <typename T>
9531
- FunctionCallbackInfo<T>::FunctionCallbackInfo(internal::Object** implicit_args,
9532
- internal::Object** values,
9775
+ FunctionCallbackInfo<T>::FunctionCallbackInfo(internal::Address* implicit_args,
9776
+ internal::Address* values,
9533
9777
  int length)
9534
9778
  : implicit_args_(implicit_args), values_(values), length_(length) {}
9535
9779
 
@@ -9698,20 +9942,22 @@ AccessorSignature* AccessorSignature::Cast(Data* data) {
9698
9942
  }
9699
9943
 
9700
9944
  Local<Value> Object::GetInternalField(int index) {
9701
- #ifndef V8_ENABLE_CHECKS
9702
- typedef internal::Object O;
9703
- typedef internal::HeapObject HO;
9945
+ #if !defined(V8_ENABLE_CHECKS) && !defined(V8_COMPRESS_POINTERS)
9946
+ typedef internal::Address A;
9704
9947
  typedef internal::Internals I;
9705
- O* obj = *reinterpret_cast<O**>(this);
9948
+ A obj = *reinterpret_cast<A*>(this);
9706
9949
  // Fast path: If the object is a plain JSObject, which is the common case, we
9707
9950
  // know where to find the internal fields and can return the value directly.
9708
9951
  auto instance_type = I::GetInstanceType(obj);
9709
9952
  if (instance_type == I::kJSObjectType ||
9710
9953
  instance_type == I::kJSApiObjectType ||
9711
9954
  instance_type == I::kJSSpecialApiObjectType) {
9712
- int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
9713
- O* value = I::ReadField<O*>(obj, offset);
9714
- O** result = HandleScope::CreateHandle(reinterpret_cast<HO*>(obj), value);
9955
+ int offset = I::kJSObjectHeaderSizeForEmbedderFields +
9956
+ (I::kEmbedderDataSlotSize * index);
9957
+ A value = I::ReadTaggedAnyField(obj, offset);
9958
+ internal::Isolate* isolate =
9959
+ internal::IsolateFromNeverReadOnlySpaceObject(obj);
9960
+ A* result = HandleScope::CreateHandle(isolate, value);
9715
9961
  return Local<Value>(reinterpret_cast<Value*>(result));
9716
9962
  }
9717
9963
  #endif
@@ -9720,18 +9966,19 @@ Local<Value> Object::GetInternalField(int index) {
9720
9966
 
9721
9967
 
9722
9968
  void* Object::GetAlignedPointerFromInternalField(int index) {
9723
- #ifndef V8_ENABLE_CHECKS
9724
- typedef internal::Object O;
9969
+ #if !defined(V8_ENABLE_CHECKS) && !defined(V8_COMPRESS_POINTERS)
9970
+ typedef internal::Address A;
9725
9971
  typedef internal::Internals I;
9726
- O* obj = *reinterpret_cast<O**>(this);
9972
+ A obj = *reinterpret_cast<A*>(this);
9727
9973
  // Fast path: If the object is a plain JSObject, which is the common case, we
9728
9974
  // know where to find the internal fields and can return the value directly.
9729
9975
  auto instance_type = I::GetInstanceType(obj);
9730
9976
  if (V8_LIKELY(instance_type == I::kJSObjectType ||
9731
9977
  instance_type == I::kJSApiObjectType ||
9732
9978
  instance_type == I::kJSSpecialApiObjectType)) {
9733
- int offset = I::kJSObjectHeaderSize + (internal::kApiPointerSize * index);
9734
- return I::ReadField<void*>(obj, offset);
9979
+ int offset = I::kJSObjectHeaderSizeForEmbedderFields +
9980
+ (I::kEmbedderDataSlotSize * index);
9981
+ return I::ReadRawField<void*>(obj, offset);
9735
9982
  }
9736
9983
  #endif
9737
9984
  return SlowGetAlignedPointerFromInternalField(index);
@@ -9746,7 +9993,7 @@ String* String::Cast(v8::Value* value) {
9746
9993
 
9747
9994
 
9748
9995
  Local<String> String::Empty(Isolate* isolate) {
9749
- typedef internal::Object* S;
9996
+ typedef internal::Address S;
9750
9997
  typedef internal::Internals I;
9751
9998
  I::CheckInitialized(isolate);
9752
9999
  S* slot = I::GetRoot(isolate, I::kEmptyStringRootIndex);
@@ -9755,15 +10002,16 @@ Local<String> String::Empty(Isolate* isolate) {
9755
10002
 
9756
10003
 
9757
10004
  String::ExternalStringResource* String::GetExternalStringResource() const {
9758
- typedef internal::Object O;
10005
+ typedef internal::Address A;
9759
10006
  typedef internal::Internals I;
9760
- O* obj = *reinterpret_cast<O* const*>(this);
9761
- String::ExternalStringResource* result;
10007
+ A obj = *reinterpret_cast<const A*>(this);
10008
+
10009
+ ExternalStringResource* result;
9762
10010
  if (I::IsExternalTwoByteString(I::GetInstanceType(obj))) {
9763
- void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
10011
+ void* value = I::ReadRawField<void*>(obj, I::kStringResourceOffset);
9764
10012
  result = reinterpret_cast<String::ExternalStringResource*>(value);
9765
10013
  } else {
9766
- result = NULL;
10014
+ result = GetExternalStringResourceSlow();
9767
10015
  }
9768
10016
  #ifdef V8_ENABLE_CHECKS
9769
10017
  VerifyExternalStringResource(result);
@@ -9774,19 +10022,21 @@ String::ExternalStringResource* String::GetExternalStringResource() const {
9774
10022
 
9775
10023
  String::ExternalStringResourceBase* String::GetExternalStringResourceBase(
9776
10024
  String::Encoding* encoding_out) const {
9777
- typedef internal::Object O;
10025
+ typedef internal::Address A;
9778
10026
  typedef internal::Internals I;
9779
- O* obj = *reinterpret_cast<O* const*>(this);
10027
+ A obj = *reinterpret_cast<const A*>(this);
9780
10028
  int type = I::GetInstanceType(obj) & I::kFullStringRepresentationMask;
9781
10029
  *encoding_out = static_cast<Encoding>(type & I::kStringEncodingMask);
9782
- ExternalStringResourceBase* resource = NULL;
10030
+ ExternalStringResourceBase* resource;
9783
10031
  if (type == I::kExternalOneByteRepresentationTag ||
9784
10032
  type == I::kExternalTwoByteRepresentationTag) {
9785
- void* value = I::ReadField<void*>(obj, I::kStringResourceOffset);
10033
+ void* value = I::ReadRawField<void*>(obj, I::kStringResourceOffset);
9786
10034
  resource = static_cast<ExternalStringResourceBase*>(value);
10035
+ } else {
10036
+ resource = GetExternalStringResourceBaseSlow(encoding_out);
9787
10037
  }
9788
10038
  #ifdef V8_ENABLE_CHECKS
9789
- VerifyExternalStringResourceBase(resource, *encoding_out);
10039
+ VerifyExternalStringResourceBase(resource, *encoding_out);
9790
10040
  #endif
9791
10041
  return resource;
9792
10042
  }
@@ -9801,9 +10051,9 @@ bool Value::IsUndefined() const {
9801
10051
  }
9802
10052
 
9803
10053
  bool Value::QuickIsUndefined() const {
9804
- typedef internal::Object O;
10054
+ typedef internal::Address A;
9805
10055
  typedef internal::Internals I;
9806
- O* obj = *reinterpret_cast<O* const*>(this);
10056
+ A obj = *reinterpret_cast<const A*>(this);
9807
10057
  if (!I::HasHeapObjectTag(obj)) return false;
9808
10058
  if (I::GetInstanceType(obj) != I::kOddballType) return false;
9809
10059
  return (I::GetOddballKind(obj) == I::kUndefinedOddballKind);
@@ -9819,9 +10069,9 @@ bool Value::IsNull() const {
9819
10069
  }
9820
10070
 
9821
10071
  bool Value::QuickIsNull() const {
9822
- typedef internal::Object O;
10072
+ typedef internal::Address A;
9823
10073
  typedef internal::Internals I;
9824
- O* obj = *reinterpret_cast<O* const*>(this);
10074
+ A obj = *reinterpret_cast<const A*>(this);
9825
10075
  if (!I::HasHeapObjectTag(obj)) return false;
9826
10076
  if (I::GetInstanceType(obj) != I::kOddballType) return false;
9827
10077
  return (I::GetOddballKind(obj) == I::kNullOddballKind);
@@ -9836,9 +10086,9 @@ bool Value::IsNullOrUndefined() const {
9836
10086
  }
9837
10087
 
9838
10088
  bool Value::QuickIsNullOrUndefined() const {
9839
- typedef internal::Object O;
10089
+ typedef internal::Address A;
9840
10090
  typedef internal::Internals I;
9841
- O* obj = *reinterpret_cast<O* const*>(this);
10091
+ A obj = *reinterpret_cast<const A*>(this);
9842
10092
  if (!I::HasHeapObjectTag(obj)) return false;
9843
10093
  if (I::GetInstanceType(obj) != I::kOddballType) return false;
9844
10094
  int kind = I::GetOddballKind(obj);
@@ -9854,9 +10104,9 @@ bool Value::IsString() const {
9854
10104
  }
9855
10105
 
9856
10106
  bool Value::QuickIsString() const {
9857
- typedef internal::Object O;
10107
+ typedef internal::Address A;
9858
10108
  typedef internal::Internals I;
9859
- O* obj = *reinterpret_cast<O* const*>(this);
10109
+ A obj = *reinterpret_cast<const A*>(this);
9860
10110
  if (!I::HasHeapObjectTag(obj)) return false;
9861
10111
  return (I::GetInstanceType(obj) < I::kFirstNonstringType);
9862
10112
  }
@@ -9867,30 +10117,6 @@ template <class T> Value* Value::Cast(T* value) {
9867
10117
  }
9868
10118
 
9869
10119
 
9870
- Local<Boolean> Value::ToBoolean() const {
9871
- return ToBoolean(Isolate::GetCurrent()->GetCurrentContext())
9872
- .FromMaybe(Local<Boolean>());
9873
- }
9874
-
9875
-
9876
- Local<String> Value::ToString() const {
9877
- return ToString(Isolate::GetCurrent()->GetCurrentContext())
9878
- .FromMaybe(Local<String>());
9879
- }
9880
-
9881
-
9882
- Local<Object> Value::ToObject() const {
9883
- return ToObject(Isolate::GetCurrent()->GetCurrentContext())
9884
- .FromMaybe(Local<Object>());
9885
- }
9886
-
9887
-
9888
- Local<Integer> Value::ToInteger() const {
9889
- return ToInteger(Isolate::GetCurrent()->GetCurrentContext())
9890
- .FromMaybe(Local<Integer>());
9891
- }
9892
-
9893
-
9894
10120
  Boolean* Boolean::Cast(v8::Value* value) {
9895
10121
  #ifdef V8_ENABLE_CHECKS
9896
10122
  CheckCast(value);
@@ -10062,11 +10288,11 @@ Proxy* Proxy::Cast(v8::Value* value) {
10062
10288
  return static_cast<Proxy*>(value);
10063
10289
  }
10064
10290
 
10065
- WasmCompiledModule* WasmCompiledModule::Cast(v8::Value* value) {
10291
+ WasmModuleObject* WasmModuleObject::Cast(v8::Value* value) {
10066
10292
  #ifdef V8_ENABLE_CHECKS
10067
10293
  CheckCast(value);
10068
10294
  #endif
10069
- return static_cast<WasmCompiledModule*>(value);
10295
+ return static_cast<WasmModuleObject*>(value);
10070
10296
  }
10071
10297
 
10072
10298
  Promise::Resolver* Promise::Resolver::Cast(v8::Value* value) {
@@ -10255,7 +10481,7 @@ bool PropertyCallbackInfo<T>::ShouldThrowOnError() const {
10255
10481
 
10256
10482
 
10257
10483
  Local<Primitive> Undefined(Isolate* isolate) {
10258
- typedef internal::Object* S;
10484
+ typedef internal::Address S;
10259
10485
  typedef internal::Internals I;
10260
10486
  I::CheckInitialized(isolate);
10261
10487
  S* slot = I::GetRoot(isolate, I::kUndefinedValueRootIndex);
@@ -10264,7 +10490,7 @@ Local<Primitive> Undefined(Isolate* isolate) {
10264
10490
 
10265
10491
 
10266
10492
  Local<Primitive> Null(Isolate* isolate) {
10267
- typedef internal::Object* S;
10493
+ typedef internal::Address S;
10268
10494
  typedef internal::Internals I;
10269
10495
  I::CheckInitialized(isolate);
10270
10496
  S* slot = I::GetRoot(isolate, I::kNullValueRootIndex);
@@ -10273,7 +10499,7 @@ Local<Primitive> Null(Isolate* isolate) {
10273
10499
 
10274
10500
 
10275
10501
  Local<Boolean> True(Isolate* isolate) {
10276
- typedef internal::Object* S;
10502
+ typedef internal::Address S;
10277
10503
  typedef internal::Internals I;
10278
10504
  I::CheckInitialized(isolate);
10279
10505
  S* slot = I::GetRoot(isolate, I::kTrueValueRootIndex);
@@ -10282,7 +10508,7 @@ Local<Boolean> True(Isolate* isolate) {
10282
10508
 
10283
10509
 
10284
10510
  Local<Boolean> False(Isolate* isolate) {
10285
- typedef internal::Object* S;
10511
+ typedef internal::Address S;
10286
10512
  typedef internal::Internals I;
10287
10513
  I::CheckInitialized(isolate);
10288
10514
  S* slot = I::GetRoot(isolate, I::kFalseValueRootIndex);
@@ -10317,7 +10543,7 @@ MaybeLocal<T> Isolate::GetDataFromSnapshotOnce(size_t index) {
10317
10543
  int64_t Isolate::AdjustAmountOfExternalAllocatedMemory(
10318
10544
  int64_t change_in_bytes) {
10319
10545
  typedef internal::Internals I;
10320
- const int64_t kMemoryReducerActivationLimit = 32 * 1024 * 1024;
10546
+ constexpr int64_t kMemoryReducerActivationLimit = 32 * 1024 * 1024;
10321
10547
  int64_t* external_memory = reinterpret_cast<int64_t*>(
10322
10548
  reinterpret_cast<uint8_t*>(this) + I::kExternalMemoryOffset);
10323
10549
  int64_t* external_memory_limit = reinterpret_cast<int64_t*>(
@@ -10325,37 +10551,36 @@ int64_t Isolate::AdjustAmountOfExternalAllocatedMemory(
10325
10551
  int64_t* external_memory_at_last_mc =
10326
10552
  reinterpret_cast<int64_t*>(reinterpret_cast<uint8_t*>(this) +
10327
10553
  I::kExternalMemoryAtLastMarkCompactOffset);
10328
- const int64_t amount = *external_memory + change_in_bytes;
10329
10554
 
10555
+ const int64_t amount = *external_memory + change_in_bytes;
10330
10556
  *external_memory = amount;
10331
10557
 
10332
10558
  int64_t allocation_diff_since_last_mc =
10333
- *external_memory_at_last_mc - *external_memory;
10334
- allocation_diff_since_last_mc = allocation_diff_since_last_mc < 0
10335
- ? -allocation_diff_since_last_mc
10336
- : allocation_diff_since_last_mc;
10559
+ *external_memory - *external_memory_at_last_mc;
10560
+ // Only check memory pressure and potentially trigger GC if the amount of
10561
+ // external memory increased.
10337
10562
  if (allocation_diff_since_last_mc > kMemoryReducerActivationLimit) {
10338
10563
  CheckMemoryPressure();
10339
10564
  }
10340
10565
 
10341
10566
  if (change_in_bytes < 0) {
10342
- *external_memory_limit += change_in_bytes;
10343
- }
10344
-
10345
- if (change_in_bytes > 0 && amount > *external_memory_limit) {
10567
+ const int64_t lower_limit = *external_memory_limit + change_in_bytes;
10568
+ if (lower_limit > I::kExternalAllocationSoftLimit)
10569
+ *external_memory_limit = lower_limit;
10570
+ } else if (change_in_bytes > 0 && amount > *external_memory_limit) {
10346
10571
  ReportExternalAllocationLimitReached();
10347
10572
  }
10348
10573
  return *external_memory;
10349
10574
  }
10350
10575
 
10351
10576
  Local<Value> Context::GetEmbedderData(int index) {
10352
- #ifndef V8_ENABLE_CHECKS
10353
- typedef internal::Object O;
10354
- typedef internal::HeapObject HO;
10577
+ #if !defined(V8_ENABLE_CHECKS) && !defined(V8_COMPRESS_POINTERS)
10578
+ typedef internal::Address A;
10355
10579
  typedef internal::Internals I;
10356
- HO* context = *reinterpret_cast<HO**>(this);
10357
- O** result =
10358
- HandleScope::CreateHandle(context, I::ReadEmbedderData<O*>(this, index));
10580
+ internal::Isolate* isolate = internal::IsolateFromNeverReadOnlySpaceObject(
10581
+ *reinterpret_cast<A*>(this));
10582
+ A* result =
10583
+ HandleScope::CreateHandle(isolate, I::ReadEmbedderData<A>(this, index));
10359
10584
  return Local<Value>(reinterpret_cast<Value*>(result));
10360
10585
  #else
10361
10586
  return SlowGetEmbedderData(index);
@@ -10364,7 +10589,7 @@ Local<Value> Context::GetEmbedderData(int index) {
10364
10589
 
10365
10590
 
10366
10591
  void* Context::GetAlignedPointerFromEmbedderData(int index) {
10367
- #ifndef V8_ENABLE_CHECKS
10592
+ #if !defined(V8_ENABLE_CHECKS) && !defined(V8_COMPRESS_POINTERS)
10368
10593
  typedef internal::Internals I;
10369
10594
  return I::ReadEmbedderData<void*>(this, index);
10370
10595
  #else
@@ -10382,14 +10607,14 @@ MaybeLocal<T> Context::GetDataFromSnapshotOnce(size_t index) {
10382
10607
  template <class T>
10383
10608
  size_t SnapshotCreator::AddData(Local<Context> context, Local<T> object) {
10384
10609
  T* object_ptr = *object;
10385
- internal::Object** p = reinterpret_cast<internal::Object**>(object_ptr);
10610
+ internal::Address* p = reinterpret_cast<internal::Address*>(object_ptr);
10386
10611
  return AddData(context, *p);
10387
10612
  }
10388
10613
 
10389
10614
  template <class T>
10390
10615
  size_t SnapshotCreator::AddData(Local<T> object) {
10391
10616
  T* object_ptr = *object;
10392
- internal::Object** p = reinterpret_cast<internal::Object**>(object_ptr);
10617
+ internal::Address* p = reinterpret_cast<internal::Address*>(object_ptr);
10393
10618
  return AddData(*p);
10394
10619
  }
10395
10620