libv8 7.3.492.27.1-universal-darwin-20 → 8.4.255.0-universal-darwin-20
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/libv8/version.rb +1 -1
- data/vendor/v8/include/cppgc/allocation.h +124 -0
- data/vendor/v8/include/cppgc/garbage-collected.h +192 -0
- data/vendor/v8/include/cppgc/heap.h +50 -0
- data/vendor/v8/include/cppgc/internal/accessors.h +26 -0
- data/vendor/v8/include/cppgc/internal/api-constants.h +44 -0
- data/vendor/v8/include/cppgc/internal/compiler-specific.h +26 -0
- data/vendor/v8/include/cppgc/internal/finalizer-trait.h +90 -0
- data/vendor/v8/include/cppgc/internal/gc-info.h +43 -0
- data/vendor/v8/include/cppgc/internal/logging.h +50 -0
- data/vendor/v8/include/cppgc/internal/persistent-node.h +109 -0
- data/vendor/v8/include/cppgc/internal/pointer-policies.h +133 -0
- data/vendor/v8/include/cppgc/internal/prefinalizer-handler.h +31 -0
- data/vendor/v8/include/cppgc/liveness-broker.h +50 -0
- data/vendor/v8/include/cppgc/macros.h +26 -0
- data/vendor/v8/include/cppgc/member.h +206 -0
- data/vendor/v8/include/cppgc/persistent.h +304 -0
- data/vendor/v8/include/cppgc/platform.h +31 -0
- data/vendor/v8/include/cppgc/prefinalizer.h +54 -0
- data/vendor/v8/include/cppgc/source-location.h +59 -0
- data/vendor/v8/include/cppgc/trace-trait.h +67 -0
- data/vendor/v8/include/cppgc/type-traits.h +109 -0
- data/vendor/v8/include/cppgc/visitor.h +137 -0
- data/vendor/v8/include/libplatform/libplatform.h +13 -19
- data/vendor/v8/include/libplatform/v8-tracing.h +50 -15
- data/vendor/v8/include/v8-fast-api-calls.h +412 -0
- data/vendor/v8/include/v8-inspector-protocol.h +4 -4
- data/vendor/v8/include/v8-inspector.h +60 -29
- data/vendor/v8/include/v8-internal.h +98 -82
- data/vendor/v8/include/v8-platform.h +181 -42
- data/vendor/v8/include/v8-profiler.h +162 -224
- data/vendor/v8/include/v8-util.h +1 -13
- data/vendor/v8/include/v8-version-string.h +1 -1
- data/vendor/v8/include/v8-version.h +4 -4
- data/vendor/v8/include/v8-wasm-trap-handler-posix.h +1 -1
- data/vendor/v8/include/v8-wasm-trap-handler-win.h +1 -1
- data/vendor/v8/include/v8.h +1990 -611
- data/vendor/v8/include/v8config.h +129 -48
- data/vendor/v8/out.gn/libv8/obj/libv8_libbase.a +0 -0
- data/vendor/v8/out.gn/libv8/obj/libv8_libplatform.a +0 -0
- data/vendor/v8/out.gn/libv8/obj/libv8_monolith.a +0 -0
- data/vendor/v8/out.gn/libv8/obj/third_party/icu/libicui18n.a +0 -0
- data/vendor/v8/out.gn/libv8/obj/third_party/icu/libicuuc.a +0 -0
- data/vendor/v8/out.gn/libv8/obj/third_party/zlib/google/libcompression_utils_portable.a +0 -0
- data/vendor/v8/out.gn/libv8/obj/third_party/zlib/libchrome_zlib.a +0 -0
- metadata +29 -3
- data/vendor/v8/include/v8-testing.h +0 -48
data/vendor/v8/include/v8-util.h
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
#ifndef V8_UTIL_H_
|
6
6
|
#define V8_UTIL_H_
|
7
7
|
|
8
|
-
#include "v8.h" // NOLINT(build/
|
8
|
+
#include "v8.h" // NOLINT(build/include_directory)
|
9
9
|
#include <assert.h>
|
10
10
|
#include <map>
|
11
11
|
#include <vector>
|
@@ -194,17 +194,6 @@ class PersistentValueMapBase {
|
|
194
194
|
return SetReturnValueFromVal(&returnValue, Traits::Get(&impl_, key));
|
195
195
|
}
|
196
196
|
|
197
|
-
/**
|
198
|
-
* Call V8::RegisterExternallyReferencedObject with the map value for given
|
199
|
-
* key.
|
200
|
-
*/
|
201
|
-
void RegisterExternallyReferencedObject(K& key) {
|
202
|
-
assert(Contains(key));
|
203
|
-
V8::RegisterExternallyReferencedObject(
|
204
|
-
reinterpret_cast<internal::Address*>(FromVal(Traits::Get(&impl_, key))),
|
205
|
-
reinterpret_cast<internal::Isolate*>(GetIsolate()));
|
206
|
-
}
|
207
|
-
|
208
197
|
/**
|
209
198
|
* Return value for key and remove it from the map.
|
210
199
|
*/
|
@@ -355,7 +344,6 @@ class PersistentValueMapBase {
|
|
355
344
|
const char* label_;
|
356
345
|
};
|
357
346
|
|
358
|
-
|
359
347
|
template <typename K, typename V, typename Traits>
|
360
348
|
class PersistentValueMap : public PersistentValueMapBase<K, V, Traits> {
|
361
349
|
public:
|
@@ -5,7 +5,7 @@
|
|
5
5
|
#ifndef V8_VERSION_STRING_H_
|
6
6
|
#define V8_VERSION_STRING_H_
|
7
7
|
|
8
|
-
#include "v8-version.h" // NOLINT(build/
|
8
|
+
#include "v8-version.h" // NOLINT(build/include_directory)
|
9
9
|
|
10
10
|
// This is here rather than v8-version.h to keep that file simple and
|
11
11
|
// machine-processable.
|
@@ -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
|
12
|
-
#define V8_MINOR_VERSION
|
13
|
-
#define V8_BUILD_NUMBER
|
14
|
-
#define V8_PATCH_LEVEL
|
11
|
+
#define V8_MAJOR_VERSION 8
|
12
|
+
#define V8_MINOR_VERSION 4
|
13
|
+
#define V8_BUILD_NUMBER 255
|
14
|
+
#define V8_PATCH_LEVEL 0
|
15
15
|
|
16
16
|
// Use 1 for candidates and 0 otherwise.
|
17
17
|
// (Boolean macro values are not supported by all preprocessors.)
|
data/vendor/v8/include/v8.h
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
* This set of documents provides reference material generated from the
|
10
10
|
* V8 header file, include/v8.h.
|
11
11
|
*
|
12
|
-
* For other documentation see
|
12
|
+
* For other documentation see https://v8.dev/.
|
13
13
|
*/
|
14
14
|
|
15
15
|
#ifndef INCLUDE_V8_H_
|
@@ -19,12 +19,14 @@
|
|
19
19
|
#include <stdint.h>
|
20
20
|
#include <stdio.h>
|
21
21
|
#include <memory>
|
22
|
+
#include <string>
|
23
|
+
#include <type_traits>
|
22
24
|
#include <utility>
|
23
25
|
#include <vector>
|
24
26
|
|
25
|
-
#include "v8-internal.h" // NOLINT(build/
|
26
|
-
#include "v8-version.h" // NOLINT(build/
|
27
|
-
#include "v8config.h" // NOLINT(build/
|
27
|
+
#include "v8-internal.h" // NOLINT(build/include_directory)
|
28
|
+
#include "v8-version.h" // NOLINT(build/include_directory)
|
29
|
+
#include "v8config.h" // NOLINT(build/include_directory)
|
28
30
|
|
29
31
|
// We reserve the V8_* prefix for macros defined in V8 public API and
|
30
32
|
// assume there are no name conflicts with the embedder's code.
|
@@ -54,6 +56,7 @@ class Integer;
|
|
54
56
|
class Isolate;
|
55
57
|
template <class T>
|
56
58
|
class Maybe;
|
59
|
+
class MicrotaskQueue;
|
57
60
|
class Name;
|
58
61
|
class Number;
|
59
62
|
class NumberObject;
|
@@ -92,6 +95,12 @@ template <class T, class M = NonCopyablePersistentTraits<T> >
|
|
92
95
|
class Persistent;
|
93
96
|
template <class T>
|
94
97
|
class Global;
|
98
|
+
template <class T>
|
99
|
+
class TracedGlobal;
|
100
|
+
template <class T>
|
101
|
+
class TracedReference;
|
102
|
+
template <class T>
|
103
|
+
class TracedReferenceBase;
|
95
104
|
template<class K, class V, class T> class PersistentValueMap;
|
96
105
|
template <class K, class V, class T>
|
97
106
|
class PersistentValueMapBase;
|
@@ -111,19 +120,23 @@ class EscapableHandleScope;
|
|
111
120
|
template<typename T> class ReturnValue;
|
112
121
|
|
113
122
|
namespace internal {
|
123
|
+
enum class ArgumentsType;
|
124
|
+
template <ArgumentsType>
|
114
125
|
class Arguments;
|
115
126
|
class DeferredHandles;
|
116
127
|
class Heap;
|
117
128
|
class HeapObject;
|
129
|
+
class ExternalString;
|
118
130
|
class Isolate;
|
119
131
|
class LocalEmbedderHeapTracer;
|
120
|
-
class
|
132
|
+
class MicrotaskQueue;
|
121
133
|
struct ScriptStreamingData;
|
122
134
|
template<typename T> class CustomArguments;
|
123
135
|
class PropertyCallbackArguments;
|
124
136
|
class FunctionCallbackArguments;
|
125
137
|
class GlobalHandles;
|
126
138
|
class ScopedExternalStringLock;
|
139
|
+
class ThreadLocalTop;
|
127
140
|
|
128
141
|
namespace wasm {
|
129
142
|
class NativeModule;
|
@@ -138,11 +151,6 @@ class ConsoleCallArguments;
|
|
138
151
|
|
139
152
|
// --- Handles ---
|
140
153
|
|
141
|
-
#define TYPE_CHECK(T, S) \
|
142
|
-
while (false) { \
|
143
|
-
*(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \
|
144
|
-
}
|
145
|
-
|
146
154
|
/**
|
147
155
|
* An object reference managed by the v8 garbage collector.
|
148
156
|
*
|
@@ -186,7 +194,7 @@ class Local {
|
|
186
194
|
* handles. For example, converting from a Local<String> to a
|
187
195
|
* Local<Number>.
|
188
196
|
*/
|
189
|
-
|
197
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
190
198
|
}
|
191
199
|
|
192
200
|
/**
|
@@ -205,9 +213,13 @@ class Local {
|
|
205
213
|
|
206
214
|
/**
|
207
215
|
* Checks whether two handles are the same.
|
208
|
-
* Returns true if both are empty, or if the objects
|
209
|
-
*
|
210
|
-
*
|
216
|
+
* Returns true if both are empty, or if the objects to which they refer
|
217
|
+
* are identical.
|
218
|
+
*
|
219
|
+
* If both handles refer to JS objects, this is the same as strict equality.
|
220
|
+
* For primitives, such as numbers or strings, a `false` return value does not
|
221
|
+
* indicate that the values aren't equal in the JavaScript sense.
|
222
|
+
* Use `Value::StrictEquals()` to check primitives for equality.
|
211
223
|
*/
|
212
224
|
template <class S>
|
213
225
|
V8_INLINE bool operator==(const Local<S>& that) const {
|
@@ -231,7 +243,11 @@ class Local {
|
|
231
243
|
* Checks whether two handles are different.
|
232
244
|
* Returns true if only one of the handles is empty, or if
|
233
245
|
* the objects to which they refer are different.
|
234
|
-
*
|
246
|
+
*
|
247
|
+
* If both handles refer to JS objects, this is the same as strict
|
248
|
+
* non-equality. For primitives, such as numbers or strings, a `true` return
|
249
|
+
* value does not indicate that the values aren't equal in the JavaScript
|
250
|
+
* sense. Use `Value::StrictEquals()` to check primitives for equality.
|
235
251
|
*/
|
236
252
|
template <class S>
|
237
253
|
V8_INLINE bool operator!=(const Local<S>& that) const {
|
@@ -275,6 +291,8 @@ class Local {
|
|
275
291
|
V8_INLINE static Local<T> New(Isolate* isolate, Local<T> that);
|
276
292
|
V8_INLINE static Local<T> New(Isolate* isolate,
|
277
293
|
const PersistentBase<T>& that);
|
294
|
+
V8_INLINE static Local<T> New(Isolate* isolate,
|
295
|
+
const TracedReferenceBase<T>& that);
|
278
296
|
|
279
297
|
private:
|
280
298
|
friend class Utils;
|
@@ -303,6 +321,14 @@ class Local {
|
|
303
321
|
template<class F1, class F2> friend class PersistentValueVector;
|
304
322
|
template <class F>
|
305
323
|
friend class ReturnValue;
|
324
|
+
template <class F>
|
325
|
+
friend class Traced;
|
326
|
+
template <class F>
|
327
|
+
friend class TracedGlobal;
|
328
|
+
template <class F>
|
329
|
+
friend class TracedReferenceBase;
|
330
|
+
template <class F>
|
331
|
+
friend class TracedReference;
|
306
332
|
|
307
333
|
explicit V8_INLINE Local(T* that) : val_(that) {}
|
308
334
|
V8_INLINE static Local<T> New(Isolate* isolate, T* that);
|
@@ -334,7 +360,7 @@ class MaybeLocal {
|
|
334
360
|
template <class S>
|
335
361
|
V8_INLINE MaybeLocal(Local<S> that)
|
336
362
|
: val_(reinterpret_cast<T*>(*that)) {
|
337
|
-
|
363
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
338
364
|
}
|
339
365
|
|
340
366
|
V8_INLINE bool IsEmpty() const { return val_ == nullptr; }
|
@@ -503,11 +529,16 @@ template <class T> class PersistentBase {
|
|
503
529
|
}
|
504
530
|
|
505
531
|
/**
|
506
|
-
*
|
507
|
-
*
|
508
|
-
*
|
509
|
-
*
|
510
|
-
*
|
532
|
+
* Install a finalization callback on this object.
|
533
|
+
* NOTE: There is no guarantee as to *when* or even *if* the callback is
|
534
|
+
* invoked. The invocation is performed solely on a best effort basis.
|
535
|
+
* As always, GC-based finalization should *not* be relied upon for any
|
536
|
+
* critical form of resource management!
|
537
|
+
*
|
538
|
+
* The callback is supposed to reset the handle. No further V8 API may be
|
539
|
+
* called in this callback. In case additional work involving V8 needs to be
|
540
|
+
* done, a second callback can be scheduled using
|
541
|
+
* WeakCallbackInfo<void>::SetSecondPassCallback.
|
511
542
|
*/
|
512
543
|
template <typename P>
|
513
544
|
V8_INLINE void SetWeak(P* parameter,
|
@@ -537,47 +568,11 @@ template <class T> class PersistentBase {
|
|
537
568
|
*/
|
538
569
|
V8_INLINE void AnnotateStrongRetainer(const char* label);
|
539
570
|
|
540
|
-
/**
|
541
|
-
* Allows the embedder to tell the v8 garbage collector that a certain object
|
542
|
-
* is alive. Only allowed when the embedder is asked to trace its heap by
|
543
|
-
* EmbedderHeapTracer.
|
544
|
-
*/
|
545
|
-
V8_INLINE void RegisterExternalReference(Isolate* isolate) const;
|
546
|
-
|
547
|
-
/**
|
548
|
-
* Marks the reference to this object independent. Garbage collector is free
|
549
|
-
* to ignore any object groups containing this object. Weak callback for an
|
550
|
-
* independent handle should not assume that it will be preceded by a global
|
551
|
-
* GC prologue callback or followed by a global GC epilogue callback.
|
552
|
-
*/
|
553
|
-
V8_DEPRECATE_SOON(
|
554
|
-
"Objects are always considered independent. "
|
555
|
-
"Use MarkActive to avoid collecting otherwise dead weak handles.",
|
556
|
-
V8_INLINE void MarkIndependent());
|
557
|
-
|
558
|
-
/**
|
559
|
-
* Marks the reference to this object as active. The scavenge garbage
|
560
|
-
* collection should not reclaim the objects marked as active, even if the
|
561
|
-
* object held by the handle is otherwise unreachable.
|
562
|
-
*
|
563
|
-
* This bit is cleared after the each garbage collection pass.
|
564
|
-
*/
|
565
|
-
V8_INLINE void MarkActive();
|
566
|
-
|
567
|
-
V8_DEPRECATE_SOON("See MarkIndependent.",
|
568
|
-
V8_INLINE bool IsIndependent() const);
|
569
|
-
|
570
|
-
/** Checks if the handle holds the only reference to an object. */
|
571
|
-
V8_DEPRECATE_SOON(
|
572
|
-
"Garbage collection internal state should not be relied on.",
|
573
|
-
V8_INLINE bool IsNearDeath() const);
|
574
|
-
|
575
571
|
/** Returns true if the handle's reference is weak. */
|
576
572
|
V8_INLINE bool IsWeak() const;
|
577
573
|
|
578
574
|
/**
|
579
|
-
* Assigns a wrapper class ID to the handle.
|
580
|
-
* description in v8-profiler.h for details.
|
575
|
+
* Assigns a wrapper class ID to the handle.
|
581
576
|
*/
|
582
577
|
V8_INLINE void SetWrapperClassId(uint16_t class_id);
|
583
578
|
|
@@ -625,11 +620,8 @@ class NonCopyablePersistentTraits {
|
|
625
620
|
template<class S, class M>
|
626
621
|
V8_INLINE static void Copy(const Persistent<S, M>& source,
|
627
622
|
NonCopyablePersistent* dest) {
|
628
|
-
|
629
|
-
|
630
|
-
// TODO(dcarney): come up with a good compile error here.
|
631
|
-
template<class O> V8_INLINE static void Uncompilable() {
|
632
|
-
TYPE_CHECK(O, Primitive);
|
623
|
+
static_assert(sizeof(S) < 0,
|
624
|
+
"NonCopyablePersistentTraits::Copy is not instantiable");
|
633
625
|
}
|
634
626
|
};
|
635
627
|
|
@@ -672,7 +664,7 @@ template <class T, class M> class Persistent : public PersistentBase<T> {
|
|
672
664
|
template <class S>
|
673
665
|
V8_INLINE Persistent(Isolate* isolate, Local<S> that)
|
674
666
|
: PersistentBase<T>(PersistentBase<T>::New(isolate, *that)) {
|
675
|
-
|
667
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
676
668
|
}
|
677
669
|
/**
|
678
670
|
* Construct a Persistent from a Persistent.
|
@@ -682,7 +674,7 @@ template <class T, class M> class Persistent : public PersistentBase<T> {
|
|
682
674
|
template <class S, class M2>
|
683
675
|
V8_INLINE Persistent(Isolate* isolate, const Persistent<S, M2>& that)
|
684
676
|
: PersistentBase<T>(PersistentBase<T>::New(isolate, *that)) {
|
685
|
-
|
677
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
686
678
|
}
|
687
679
|
/**
|
688
680
|
* The copy constructors and assignment operator create a Persistent
|
@@ -758,6 +750,7 @@ class Global : public PersistentBase<T> {
|
|
758
750
|
* A Global with no storage cell.
|
759
751
|
*/
|
760
752
|
V8_INLINE Global() : PersistentBase<T>(nullptr) {}
|
753
|
+
|
761
754
|
/**
|
762
755
|
* Construct a Global from a Local.
|
763
756
|
* When the Local is non-empty, a new storage cell is created
|
@@ -766,8 +759,9 @@ class Global : public PersistentBase<T> {
|
|
766
759
|
template <class S>
|
767
760
|
V8_INLINE Global(Isolate* isolate, Local<S> that)
|
768
761
|
: PersistentBase<T>(PersistentBase<T>::New(isolate, *that)) {
|
769
|
-
|
762
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
770
763
|
}
|
764
|
+
|
771
765
|
/**
|
772
766
|
* Construct a Global from a PersistentBase.
|
773
767
|
* When the Persistent is non-empty, a new storage cell is created
|
@@ -776,28 +770,22 @@ class Global : public PersistentBase<T> {
|
|
776
770
|
template <class S>
|
777
771
|
V8_INLINE Global(Isolate* isolate, const PersistentBase<S>& that)
|
778
772
|
: PersistentBase<T>(PersistentBase<T>::New(isolate, that.val_)) {
|
779
|
-
|
773
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
780
774
|
}
|
775
|
+
|
781
776
|
/**
|
782
777
|
* Move constructor.
|
783
778
|
*/
|
784
|
-
V8_INLINE Global(Global&& other)
|
785
|
-
|
786
|
-
}
|
779
|
+
V8_INLINE Global(Global&& other);
|
780
|
+
|
787
781
|
V8_INLINE ~Global() { this->Reset(); }
|
782
|
+
|
788
783
|
/**
|
789
784
|
* Move via assignment.
|
790
785
|
*/
|
791
786
|
template <class S>
|
792
|
-
V8_INLINE Global& operator=(Global<S>&& rhs)
|
793
|
-
|
794
|
-
if (this != &rhs) {
|
795
|
-
this->Reset();
|
796
|
-
this->val_ = rhs.val_;
|
797
|
-
rhs.val_ = nullptr;
|
798
|
-
}
|
799
|
-
return *this;
|
800
|
-
}
|
787
|
+
V8_INLINE Global& operator=(Global<S>&& rhs);
|
788
|
+
|
801
789
|
/**
|
802
790
|
* Pass allows returning uniques from functions, etc.
|
803
791
|
*/
|
@@ -822,6 +810,345 @@ class Global : public PersistentBase<T> {
|
|
822
810
|
template <class T>
|
823
811
|
using UniquePersistent = Global<T>;
|
824
812
|
|
813
|
+
/**
|
814
|
+
* Deprecated. Use |TracedReference<T>| instead.
|
815
|
+
*/
|
816
|
+
template <typename T>
|
817
|
+
struct TracedGlobalTrait {};
|
818
|
+
|
819
|
+
/**
|
820
|
+
* A traced handle with copy and move semantics. The handle is to be used
|
821
|
+
* together with |v8::EmbedderHeapTracer| and specifies edges from the embedder
|
822
|
+
* into V8's heap.
|
823
|
+
*
|
824
|
+
* The exact semantics are:
|
825
|
+
* - Tracing garbage collections use |v8::EmbedderHeapTracer|.
|
826
|
+
* - Non-tracing garbage collections refer to
|
827
|
+
* |v8::EmbedderHeapTracer::IsRootForNonTracingGC()| whether the handle should
|
828
|
+
* be treated as root or not.
|
829
|
+
*
|
830
|
+
* Note that the base class cannot be instantiated itself. Choose from
|
831
|
+
* - TracedGlobal
|
832
|
+
* - TracedReference
|
833
|
+
*/
|
834
|
+
template <typename T>
|
835
|
+
class TracedReferenceBase {
|
836
|
+
public:
|
837
|
+
/**
|
838
|
+
* Returns true if this TracedReferenceBase is empty, i.e., has not been
|
839
|
+
* assigned an object.
|
840
|
+
*/
|
841
|
+
bool IsEmpty() const { return val_ == nullptr; }
|
842
|
+
|
843
|
+
/**
|
844
|
+
* If non-empty, destroy the underlying storage cell. |IsEmpty| will return
|
845
|
+
* true after this call.
|
846
|
+
*/
|
847
|
+
V8_INLINE void Reset();
|
848
|
+
|
849
|
+
/**
|
850
|
+
* Construct a Local<T> from this handle.
|
851
|
+
*/
|
852
|
+
Local<T> Get(Isolate* isolate) const { return Local<T>::New(isolate, *this); }
|
853
|
+
|
854
|
+
template <class S>
|
855
|
+
V8_INLINE bool operator==(const TracedReferenceBase<S>& that) const {
|
856
|
+
internal::Address* a = reinterpret_cast<internal::Address*>(val_);
|
857
|
+
internal::Address* b = reinterpret_cast<internal::Address*>(that.val_);
|
858
|
+
if (a == nullptr) return b == nullptr;
|
859
|
+
if (b == nullptr) return false;
|
860
|
+
return *a == *b;
|
861
|
+
}
|
862
|
+
|
863
|
+
template <class S>
|
864
|
+
V8_INLINE bool operator==(const Local<S>& that) const {
|
865
|
+
internal::Address* a = reinterpret_cast<internal::Address*>(val_);
|
866
|
+
internal::Address* b = reinterpret_cast<internal::Address*>(that.val_);
|
867
|
+
if (a == nullptr) return b == nullptr;
|
868
|
+
if (b == nullptr) return false;
|
869
|
+
return *a == *b;
|
870
|
+
}
|
871
|
+
|
872
|
+
template <class S>
|
873
|
+
V8_INLINE bool operator!=(const TracedReferenceBase<S>& that) const {
|
874
|
+
return !operator==(that);
|
875
|
+
}
|
876
|
+
|
877
|
+
template <class S>
|
878
|
+
V8_INLINE bool operator!=(const Local<S>& that) const {
|
879
|
+
return !operator==(that);
|
880
|
+
}
|
881
|
+
|
882
|
+
/**
|
883
|
+
* Assigns a wrapper class ID to the handle.
|
884
|
+
*/
|
885
|
+
V8_INLINE void SetWrapperClassId(uint16_t class_id);
|
886
|
+
|
887
|
+
/**
|
888
|
+
* Returns the class ID previously assigned to this handle or 0 if no class ID
|
889
|
+
* was previously assigned.
|
890
|
+
*/
|
891
|
+
V8_INLINE uint16_t WrapperClassId() const;
|
892
|
+
|
893
|
+
template <class S>
|
894
|
+
V8_INLINE TracedReferenceBase<S>& As() const {
|
895
|
+
return reinterpret_cast<TracedReferenceBase<S>&>(
|
896
|
+
const_cast<TracedReferenceBase<T>&>(*this));
|
897
|
+
}
|
898
|
+
|
899
|
+
private:
|
900
|
+
enum DestructionMode { kWithDestructor, kWithoutDestructor };
|
901
|
+
|
902
|
+
/**
|
903
|
+
* An empty TracedReferenceBase without storage cell.
|
904
|
+
*/
|
905
|
+
TracedReferenceBase() = default;
|
906
|
+
|
907
|
+
V8_INLINE static T* New(Isolate* isolate, T* that, void* slot,
|
908
|
+
DestructionMode destruction_mode);
|
909
|
+
|
910
|
+
T* val_ = nullptr;
|
911
|
+
|
912
|
+
friend class EmbedderHeapTracer;
|
913
|
+
template <typename F>
|
914
|
+
friend class Local;
|
915
|
+
friend class Object;
|
916
|
+
template <typename F>
|
917
|
+
friend class TracedGlobal;
|
918
|
+
template <typename F>
|
919
|
+
friend class TracedReference;
|
920
|
+
template <typename F>
|
921
|
+
friend class ReturnValue;
|
922
|
+
};
|
923
|
+
|
924
|
+
/**
|
925
|
+
* A traced handle with destructor that clears the handle. For more details see
|
926
|
+
* TracedReferenceBase.
|
927
|
+
*/
|
928
|
+
template <typename T>
|
929
|
+
class TracedGlobal : public TracedReferenceBase<T> {
|
930
|
+
public:
|
931
|
+
using TracedReferenceBase<T>::Reset;
|
932
|
+
|
933
|
+
/**
|
934
|
+
* Destructor resetting the handle.
|
935
|
+
*/
|
936
|
+
~TracedGlobal() { this->Reset(); }
|
937
|
+
|
938
|
+
/**
|
939
|
+
* An empty TracedGlobal without storage cell.
|
940
|
+
*/
|
941
|
+
TracedGlobal() : TracedReferenceBase<T>() {}
|
942
|
+
|
943
|
+
/**
|
944
|
+
* Construct a TracedGlobal from a Local.
|
945
|
+
*
|
946
|
+
* When the Local is non-empty, a new storage cell is created
|
947
|
+
* pointing to the same object.
|
948
|
+
*/
|
949
|
+
template <class S>
|
950
|
+
TracedGlobal(Isolate* isolate, Local<S> that) : TracedReferenceBase<T>() {
|
951
|
+
this->val_ = this->New(isolate, that.val_, &this->val_,
|
952
|
+
TracedReferenceBase<T>::kWithDestructor);
|
953
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
954
|
+
}
|
955
|
+
|
956
|
+
/**
|
957
|
+
* Move constructor initializing TracedGlobal from an existing one.
|
958
|
+
*/
|
959
|
+
V8_INLINE TracedGlobal(TracedGlobal&& other) {
|
960
|
+
// Forward to operator=.
|
961
|
+
*this = std::move(other);
|
962
|
+
}
|
963
|
+
|
964
|
+
/**
|
965
|
+
* Move constructor initializing TracedGlobal from an existing one.
|
966
|
+
*/
|
967
|
+
template <typename S>
|
968
|
+
V8_INLINE TracedGlobal(TracedGlobal<S>&& other) {
|
969
|
+
// Forward to operator=.
|
970
|
+
*this = std::move(other);
|
971
|
+
}
|
972
|
+
|
973
|
+
/**
|
974
|
+
* Copy constructor initializing TracedGlobal from an existing one.
|
975
|
+
*/
|
976
|
+
V8_INLINE TracedGlobal(const TracedGlobal& other) {
|
977
|
+
// Forward to operator=;
|
978
|
+
*this = other;
|
979
|
+
}
|
980
|
+
|
981
|
+
/**
|
982
|
+
* Copy constructor initializing TracedGlobal from an existing one.
|
983
|
+
*/
|
984
|
+
template <typename S>
|
985
|
+
V8_INLINE TracedGlobal(const TracedGlobal<S>& other) {
|
986
|
+
// Forward to operator=;
|
987
|
+
*this = other;
|
988
|
+
}
|
989
|
+
|
990
|
+
/**
|
991
|
+
* Move assignment operator initializing TracedGlobal from an existing one.
|
992
|
+
*/
|
993
|
+
V8_INLINE TracedGlobal& operator=(TracedGlobal&& rhs);
|
994
|
+
|
995
|
+
/**
|
996
|
+
* Move assignment operator initializing TracedGlobal from an existing one.
|
997
|
+
*/
|
998
|
+
template <class S>
|
999
|
+
V8_INLINE TracedGlobal& operator=(TracedGlobal<S>&& rhs);
|
1000
|
+
|
1001
|
+
/**
|
1002
|
+
* Copy assignment operator initializing TracedGlobal from an existing one.
|
1003
|
+
*
|
1004
|
+
* Note: Prohibited when |other| has a finalization callback set through
|
1005
|
+
* |SetFinalizationCallback|.
|
1006
|
+
*/
|
1007
|
+
V8_INLINE TracedGlobal& operator=(const TracedGlobal& rhs);
|
1008
|
+
|
1009
|
+
/**
|
1010
|
+
* Copy assignment operator initializing TracedGlobal from an existing one.
|
1011
|
+
*
|
1012
|
+
* Note: Prohibited when |other| has a finalization callback set through
|
1013
|
+
* |SetFinalizationCallback|.
|
1014
|
+
*/
|
1015
|
+
template <class S>
|
1016
|
+
V8_INLINE TracedGlobal& operator=(const TracedGlobal<S>& rhs);
|
1017
|
+
|
1018
|
+
/**
|
1019
|
+
* If non-empty, destroy the underlying storage cell and create a new one with
|
1020
|
+
* the contents of other if other is non empty
|
1021
|
+
*/
|
1022
|
+
template <class S>
|
1023
|
+
V8_INLINE void Reset(Isolate* isolate, const Local<S>& other);
|
1024
|
+
|
1025
|
+
template <class S>
|
1026
|
+
V8_INLINE TracedGlobal<S>& As() const {
|
1027
|
+
return reinterpret_cast<TracedGlobal<S>&>(
|
1028
|
+
const_cast<TracedGlobal<T>&>(*this));
|
1029
|
+
}
|
1030
|
+
|
1031
|
+
/**
|
1032
|
+
* Adds a finalization callback to the handle. The type of this callback is
|
1033
|
+
* similar to WeakCallbackType::kInternalFields, i.e., it will pass the
|
1034
|
+
* parameter and the first two internal fields of the object.
|
1035
|
+
*
|
1036
|
+
* The callback is then supposed to reset the handle in the callback. No
|
1037
|
+
* further V8 API may be called in this callback. In case additional work
|
1038
|
+
* involving V8 needs to be done, a second callback can be scheduled using
|
1039
|
+
* WeakCallbackInfo<void>::SetSecondPassCallback.
|
1040
|
+
*/
|
1041
|
+
V8_INLINE void SetFinalizationCallback(
|
1042
|
+
void* parameter, WeakCallbackInfo<void>::Callback callback);
|
1043
|
+
};
|
1044
|
+
|
1045
|
+
/**
|
1046
|
+
* A traced handle without destructor that clears the handle. The embedder needs
|
1047
|
+
* to ensure that the handle is not accessed once the V8 object has been
|
1048
|
+
* reclaimed. This can happen when the handle is not passed through the
|
1049
|
+
* EmbedderHeapTracer. For more details see TracedReferenceBase.
|
1050
|
+
*
|
1051
|
+
* The reference assumes the embedder has precise knowledge about references at
|
1052
|
+
* all times. In case V8 needs to separately handle on-stack references, the
|
1053
|
+
* embedder is required to set the stack start through
|
1054
|
+
* |EmbedderHeapTracer::SetStackStart|.
|
1055
|
+
*/
|
1056
|
+
template <typename T>
|
1057
|
+
class TracedReference : public TracedReferenceBase<T> {
|
1058
|
+
public:
|
1059
|
+
using TracedReferenceBase<T>::Reset;
|
1060
|
+
|
1061
|
+
/**
|
1062
|
+
* An empty TracedReference without storage cell.
|
1063
|
+
*/
|
1064
|
+
TracedReference() : TracedReferenceBase<T>() {}
|
1065
|
+
|
1066
|
+
/**
|
1067
|
+
* Construct a TracedReference from a Local.
|
1068
|
+
*
|
1069
|
+
* When the Local is non-empty, a new storage cell is created
|
1070
|
+
* pointing to the same object.
|
1071
|
+
*/
|
1072
|
+
template <class S>
|
1073
|
+
TracedReference(Isolate* isolate, Local<S> that) : TracedReferenceBase<T>() {
|
1074
|
+
this->val_ = this->New(isolate, that.val_, &this->val_,
|
1075
|
+
TracedReferenceBase<T>::kWithoutDestructor);
|
1076
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
1077
|
+
}
|
1078
|
+
|
1079
|
+
/**
|
1080
|
+
* Move constructor initializing TracedReference from an
|
1081
|
+
* existing one.
|
1082
|
+
*/
|
1083
|
+
V8_INLINE TracedReference(TracedReference&& other) {
|
1084
|
+
// Forward to operator=.
|
1085
|
+
*this = std::move(other);
|
1086
|
+
}
|
1087
|
+
|
1088
|
+
/**
|
1089
|
+
* Move constructor initializing TracedReference from an
|
1090
|
+
* existing one.
|
1091
|
+
*/
|
1092
|
+
template <typename S>
|
1093
|
+
V8_INLINE TracedReference(TracedReference<S>&& other) {
|
1094
|
+
// Forward to operator=.
|
1095
|
+
*this = std::move(other);
|
1096
|
+
}
|
1097
|
+
|
1098
|
+
/**
|
1099
|
+
* Copy constructor initializing TracedReference from an
|
1100
|
+
* existing one.
|
1101
|
+
*/
|
1102
|
+
V8_INLINE TracedReference(const TracedReference& other) {
|
1103
|
+
// Forward to operator=;
|
1104
|
+
*this = other;
|
1105
|
+
}
|
1106
|
+
|
1107
|
+
/**
|
1108
|
+
* Copy constructor initializing TracedReference from an
|
1109
|
+
* existing one.
|
1110
|
+
*/
|
1111
|
+
template <typename S>
|
1112
|
+
V8_INLINE TracedReference(const TracedReference<S>& other) {
|
1113
|
+
// Forward to operator=;
|
1114
|
+
*this = other;
|
1115
|
+
}
|
1116
|
+
|
1117
|
+
/**
|
1118
|
+
* Move assignment operator initializing TracedGlobal from an existing one.
|
1119
|
+
*/
|
1120
|
+
V8_INLINE TracedReference& operator=(TracedReference&& rhs);
|
1121
|
+
|
1122
|
+
/**
|
1123
|
+
* Move assignment operator initializing TracedGlobal from an existing one.
|
1124
|
+
*/
|
1125
|
+
template <class S>
|
1126
|
+
V8_INLINE TracedReference& operator=(TracedReference<S>&& rhs);
|
1127
|
+
|
1128
|
+
/**
|
1129
|
+
* Copy assignment operator initializing TracedGlobal from an existing one.
|
1130
|
+
*/
|
1131
|
+
V8_INLINE TracedReference& operator=(const TracedReference& rhs);
|
1132
|
+
|
1133
|
+
/**
|
1134
|
+
* Copy assignment operator initializing TracedGlobal from an existing one.
|
1135
|
+
*/
|
1136
|
+
template <class S>
|
1137
|
+
V8_INLINE TracedReference& operator=(const TracedReference<S>& rhs);
|
1138
|
+
|
1139
|
+
/**
|
1140
|
+
* If non-empty, destroy the underlying storage cell and create a new one with
|
1141
|
+
* the contents of other if other is non empty
|
1142
|
+
*/
|
1143
|
+
template <class S>
|
1144
|
+
V8_INLINE void Reset(Isolate* isolate, const Local<S>& other);
|
1145
|
+
|
1146
|
+
template <class S>
|
1147
|
+
V8_INLINE TracedReference<S>& As() const {
|
1148
|
+
return reinterpret_cast<TracedReference<S>&>(
|
1149
|
+
const_cast<TracedReference<T>&>(*this));
|
1150
|
+
}
|
1151
|
+
};
|
825
1152
|
|
826
1153
|
/**
|
827
1154
|
* A stack-allocated class that governs a number of local handles.
|
@@ -954,9 +1281,8 @@ class V8_EXPORT SealHandleScope {
|
|
954
1281
|
|
955
1282
|
// --- Special objects ---
|
956
1283
|
|
957
|
-
|
958
1284
|
/**
|
959
|
-
* The superclass of
|
1285
|
+
* The superclass of objects that can reside on V8's heap.
|
960
1286
|
*/
|
961
1287
|
class V8_EXPORT Data {
|
962
1288
|
private:
|
@@ -1103,7 +1429,7 @@ class V8_EXPORT UnboundScript {
|
|
1103
1429
|
/**
|
1104
1430
|
* A compiled JavaScript module, not yet tied to a Context.
|
1105
1431
|
*/
|
1106
|
-
class V8_EXPORT UnboundModuleScript {
|
1432
|
+
class V8_EXPORT UnboundModuleScript : public Data {
|
1107
1433
|
// Only used as a container for code caching.
|
1108
1434
|
};
|
1109
1435
|
|
@@ -1126,7 +1452,7 @@ class V8_EXPORT Location {
|
|
1126
1452
|
/**
|
1127
1453
|
* A compiled JavaScript module.
|
1128
1454
|
*/
|
1129
|
-
class V8_EXPORT Module {
|
1455
|
+
class V8_EXPORT Module : public Data {
|
1130
1456
|
public:
|
1131
1457
|
/**
|
1132
1458
|
* The different states a module can be in.
|
@@ -1214,6 +1540,45 @@ class V8_EXPORT Module {
|
|
1214
1540
|
* kEvaluated or kErrored.
|
1215
1541
|
*/
|
1216
1542
|
Local<UnboundModuleScript> GetUnboundModuleScript();
|
1543
|
+
|
1544
|
+
/*
|
1545
|
+
* Callback defined in the embedder. This is responsible for setting
|
1546
|
+
* the module's exported values with calls to SetSyntheticModuleExport().
|
1547
|
+
* The callback must return a Value to indicate success (where no
|
1548
|
+
* exception was thrown) and return an empy MaybeLocal to indicate falure
|
1549
|
+
* (where an exception was thrown).
|
1550
|
+
*/
|
1551
|
+
typedef MaybeLocal<Value> (*SyntheticModuleEvaluationSteps)(
|
1552
|
+
Local<Context> context, Local<Module> module);
|
1553
|
+
|
1554
|
+
/**
|
1555
|
+
* Creates a new SyntheticModule with the specified export names, where
|
1556
|
+
* evaluation_steps will be executed upon module evaluation.
|
1557
|
+
* export_names must not contain duplicates.
|
1558
|
+
* module_name is used solely for logging/debugging and doesn't affect module
|
1559
|
+
* behavior.
|
1560
|
+
*/
|
1561
|
+
static Local<Module> CreateSyntheticModule(
|
1562
|
+
Isolate* isolate, Local<String> module_name,
|
1563
|
+
const std::vector<Local<String>>& export_names,
|
1564
|
+
SyntheticModuleEvaluationSteps evaluation_steps);
|
1565
|
+
|
1566
|
+
/**
|
1567
|
+
* Set this module's exported value for the name export_name to the specified
|
1568
|
+
* export_value. This method must be called only on Modules created via
|
1569
|
+
* CreateSyntheticModule. An error will be thrown if export_name is not one
|
1570
|
+
* of the export_names that were passed in that CreateSyntheticModule call.
|
1571
|
+
* Returns Just(true) on success, Nothing<bool>() if an error was thrown.
|
1572
|
+
*/
|
1573
|
+
V8_WARN_UNUSED_RESULT Maybe<bool> SetSyntheticModuleExport(
|
1574
|
+
Isolate* isolate, Local<String> export_name, Local<Value> export_value);
|
1575
|
+
V8_DEPRECATE_SOON(
|
1576
|
+
"Use the preceding SetSyntheticModuleExport with an Isolate parameter, "
|
1577
|
+
"instead of the one that follows. The former will throw a runtime "
|
1578
|
+
"error if called for an export that doesn't exist (as per spec); "
|
1579
|
+
"the latter will crash with a failed CHECK().")
|
1580
|
+
void SetSyntheticModuleExport(Local<String> export_name,
|
1581
|
+
Local<Value> export_value);
|
1217
1582
|
};
|
1218
1583
|
|
1219
1584
|
/**
|
@@ -1387,7 +1752,12 @@ class V8_EXPORT ScriptCompiler {
|
|
1387
1752
|
public:
|
1388
1753
|
enum Encoding { ONE_BYTE, TWO_BYTE, UTF8 };
|
1389
1754
|
|
1755
|
+
V8_DEPRECATE_SOON(
|
1756
|
+
"This class takes ownership of source_stream, so use the constructor "
|
1757
|
+
"taking a unique_ptr to make these semantics clearer")
|
1390
1758
|
StreamedSource(ExternalSourceStream* source_stream, Encoding encoding);
|
1759
|
+
StreamedSource(std::unique_ptr<ExternalSourceStream> source_stream,
|
1760
|
+
Encoding encoding);
|
1391
1761
|
~StreamedSource();
|
1392
1762
|
|
1393
1763
|
internal::ScriptStreamingData* impl() const { return impl_.get(); }
|
@@ -1551,7 +1921,8 @@ class V8_EXPORT ScriptCompiler {
|
|
1551
1921
|
Local<String> arguments[], size_t context_extension_count,
|
1552
1922
|
Local<Object> context_extensions[],
|
1553
1923
|
CompileOptions options = kNoCompileOptions,
|
1554
|
-
NoCacheReason no_cache_reason = kNoCacheNoReason
|
1924
|
+
NoCacheReason no_cache_reason = kNoCacheNoReason,
|
1925
|
+
Local<ScriptOrModule>* script_or_module_out = nullptr);
|
1555
1926
|
|
1556
1927
|
/**
|
1557
1928
|
* Creates and returns code cache for the specified unbound_script.
|
@@ -1634,6 +2005,12 @@ class V8_EXPORT Message {
|
|
1634
2005
|
*/
|
1635
2006
|
int GetEndPosition() const;
|
1636
2007
|
|
2008
|
+
/**
|
2009
|
+
* Returns the Wasm function index where the error occurred. Returns -1 if
|
2010
|
+
* message is not from a Wasm script.
|
2011
|
+
*/
|
2012
|
+
int GetWasmFunctionIndex() const;
|
2013
|
+
|
1637
2014
|
/**
|
1638
2015
|
* Returns the error level of the message.
|
1639
2016
|
*/
|
@@ -1666,6 +2043,7 @@ class V8_EXPORT Message {
|
|
1666
2043
|
static const int kNoLineNumberInfo = 0;
|
1667
2044
|
static const int kNoColumnInfo = 0;
|
1668
2045
|
static const int kNoScriptIdInfo = 0;
|
2046
|
+
static const int kNoWasmFunctionIndexInfo = -1;
|
1669
2047
|
};
|
1670
2048
|
|
1671
2049
|
|
@@ -1783,6 +2161,11 @@ class V8_EXPORT StackFrame {
|
|
1783
2161
|
* Returns whether or not the associated functions is defined in wasm.
|
1784
2162
|
*/
|
1785
2163
|
bool IsWasm() const;
|
2164
|
+
|
2165
|
+
/**
|
2166
|
+
* Returns whether or not the associated function is defined by the user.
|
2167
|
+
*/
|
2168
|
+
bool IsUserJavaScript() const;
|
1786
2169
|
};
|
1787
2170
|
|
1788
2171
|
|
@@ -1795,16 +2178,18 @@ enum StateTag {
|
|
1795
2178
|
COMPILER,
|
1796
2179
|
OTHER,
|
1797
2180
|
EXTERNAL,
|
2181
|
+
ATOMICS_WAIT,
|
1798
2182
|
IDLE
|
1799
2183
|
};
|
1800
2184
|
|
1801
2185
|
// A RegisterState represents the current state of registers used
|
1802
2186
|
// by the sampling profiler API.
|
1803
2187
|
struct RegisterState {
|
1804
|
-
RegisterState() : pc(nullptr), sp(nullptr), fp(nullptr) {}
|
2188
|
+
RegisterState() : pc(nullptr), sp(nullptr), fp(nullptr), lr(nullptr) {}
|
1805
2189
|
void* pc; // Instruction pointer.
|
1806
2190
|
void* sp; // Stack pointer.
|
1807
2191
|
void* fp; // Frame pointer.
|
2192
|
+
void* lr; // Link register (or nullptr on platforms without a link register).
|
1808
2193
|
};
|
1809
2194
|
|
1810
2195
|
// The output structure filled up by GetStackSample API function.
|
@@ -1813,6 +2198,7 @@ struct SampleInfo {
|
|
1813
2198
|
StateTag vm_state; // Current VM state.
|
1814
2199
|
void* external_callback_entry; // External callback address if VM is
|
1815
2200
|
// executing an external callback.
|
2201
|
+
void* top_context; // Incumbent native context address.
|
1816
2202
|
};
|
1817
2203
|
|
1818
2204
|
struct MemoryRange {
|
@@ -1828,6 +2214,14 @@ struct UnwindState {
|
|
1828
2214
|
MemoryRange code_range;
|
1829
2215
|
MemoryRange embedded_code_range;
|
1830
2216
|
JSEntryStub js_entry_stub;
|
2217
|
+
JSEntryStub js_construct_entry_stub;
|
2218
|
+
JSEntryStub js_run_microtasks_entry_stub;
|
2219
|
+
};
|
2220
|
+
|
2221
|
+
struct JSEntryStubs {
|
2222
|
+
JSEntryStub js_entry_stub;
|
2223
|
+
JSEntryStub js_construct_entry_stub;
|
2224
|
+
JSEntryStub js_run_microtasks_entry_stub;
|
1831
2225
|
};
|
1832
2226
|
|
1833
2227
|
/**
|
@@ -1861,10 +2255,6 @@ class V8_EXPORT JSON {
|
|
1861
2255
|
/**
|
1862
2256
|
* Value serialization compatible with the HTML structured clone algorithm.
|
1863
2257
|
* The format is backward-compatible (i.e. safe to store to disk).
|
1864
|
-
*
|
1865
|
-
* WARNING: This API is under development, and changes (including incompatible
|
1866
|
-
* changes to the API or wire format) may occur without notice until this
|
1867
|
-
* warning is removed.
|
1868
2258
|
*/
|
1869
2259
|
class V8_EXPORT ValueSerializer {
|
1870
2260
|
public:
|
@@ -1974,10 +2364,10 @@ class V8_EXPORT ValueSerializer {
|
|
1974
2364
|
void WriteDouble(double value);
|
1975
2365
|
void WriteRawBytes(const void* source, size_t length);
|
1976
2366
|
|
1977
|
-
private:
|
1978
2367
|
ValueSerializer(const ValueSerializer&) = delete;
|
1979
2368
|
void operator=(const ValueSerializer&) = delete;
|
1980
2369
|
|
2370
|
+
private:
|
1981
2371
|
struct PrivateData;
|
1982
2372
|
PrivateData* private_;
|
1983
2373
|
};
|
@@ -1985,10 +2375,6 @@ class V8_EXPORT ValueSerializer {
|
|
1985
2375
|
/**
|
1986
2376
|
* Deserializes values from data written with ValueSerializer, or a compatible
|
1987
2377
|
* implementation.
|
1988
|
-
*
|
1989
|
-
* WARNING: This API is under development, and changes (including incompatible
|
1990
|
-
* changes to the API or wire format) may occur without notice until this
|
1991
|
-
* warning is removed.
|
1992
2378
|
*/
|
1993
2379
|
class V8_EXPORT ValueDeserializer {
|
1994
2380
|
public:
|
@@ -2058,11 +2444,6 @@ class V8_EXPORT ValueDeserializer {
|
|
2058
2444
|
*/
|
2059
2445
|
void SetSupportsLegacyWireFormat(bool supports_legacy_wire_format);
|
2060
2446
|
|
2061
|
-
/**
|
2062
|
-
* Expect inline wasm in the data stream (rather than in-memory transfer)
|
2063
|
-
*/
|
2064
|
-
void SetExpectInlineWasm(bool allow_inline_wasm);
|
2065
|
-
|
2066
2447
|
/**
|
2067
2448
|
* Reads the underlying wire format version. Likely mostly to be useful to
|
2068
2449
|
* legacy code reading old wire format versions. Must be called after
|
@@ -2080,10 +2461,10 @@ class V8_EXPORT ValueDeserializer {
|
|
2080
2461
|
V8_WARN_UNUSED_RESULT bool ReadDouble(double* value);
|
2081
2462
|
V8_WARN_UNUSED_RESULT bool ReadRawBytes(size_t length, const void** data);
|
2082
2463
|
|
2083
|
-
private:
|
2084
2464
|
ValueDeserializer(const ValueDeserializer&) = delete;
|
2085
2465
|
void operator=(const ValueDeserializer&) = delete;
|
2086
2466
|
|
2467
|
+
private:
|
2087
2468
|
struct PrivateData;
|
2088
2469
|
PrivateData* private_;
|
2089
2470
|
};
|
@@ -2100,12 +2481,16 @@ class V8_EXPORT Value : public Data {
|
|
2100
2481
|
/**
|
2101
2482
|
* Returns true if this value is the undefined value. See ECMA-262
|
2102
2483
|
* 4.3.10.
|
2484
|
+
*
|
2485
|
+
* This is equivalent to `value === undefined` in JS.
|
2103
2486
|
*/
|
2104
2487
|
V8_INLINE bool IsUndefined() const;
|
2105
2488
|
|
2106
2489
|
/**
|
2107
2490
|
* Returns true if this value is the null value. See ECMA-262
|
2108
2491
|
* 4.3.11.
|
2492
|
+
*
|
2493
|
+
* This is equivalent to `value === null` in JS.
|
2109
2494
|
*/
|
2110
2495
|
V8_INLINE bool IsNull() const;
|
2111
2496
|
|
@@ -2113,37 +2498,56 @@ class V8_EXPORT Value : public Data {
|
|
2113
2498
|
* Returns true if this value is either the null or the undefined value.
|
2114
2499
|
* See ECMA-262
|
2115
2500
|
* 4.3.11. and 4.3.12
|
2501
|
+
*
|
2502
|
+
* This is equivalent to `value == null` in JS.
|
2116
2503
|
*/
|
2117
2504
|
V8_INLINE bool IsNullOrUndefined() const;
|
2118
2505
|
|
2119
2506
|
/**
|
2120
|
-
|
2121
|
-
|
2507
|
+
* Returns true if this value is true.
|
2508
|
+
*
|
2509
|
+
* This is not the same as `BooleanValue()`. The latter performs a
|
2510
|
+
* conversion to boolean, i.e. the result of `Boolean(value)` in JS, whereas
|
2511
|
+
* this checks `value === true`.
|
2512
|
+
*/
|
2122
2513
|
bool IsTrue() const;
|
2123
2514
|
|
2124
2515
|
/**
|
2125
2516
|
* Returns true if this value is false.
|
2517
|
+
*
|
2518
|
+
* This is not the same as `!BooleanValue()`. The latter performs a
|
2519
|
+
* conversion to boolean, i.e. the result of `!Boolean(value)` in JS, whereas
|
2520
|
+
* this checks `value === false`.
|
2126
2521
|
*/
|
2127
2522
|
bool IsFalse() const;
|
2128
2523
|
|
2129
2524
|
/**
|
2130
2525
|
* Returns true if this value is a symbol or a string.
|
2526
|
+
*
|
2527
|
+
* This is equivalent to
|
2528
|
+
* `typeof value === 'string' || typeof value === 'symbol'` in JS.
|
2131
2529
|
*/
|
2132
2530
|
bool IsName() const;
|
2133
2531
|
|
2134
2532
|
/**
|
2135
2533
|
* Returns true if this value is an instance of the String type.
|
2136
2534
|
* See ECMA-262 8.4.
|
2535
|
+
*
|
2536
|
+
* This is equivalent to `typeof value === 'string'` in JS.
|
2137
2537
|
*/
|
2138
2538
|
V8_INLINE bool IsString() const;
|
2139
2539
|
|
2140
2540
|
/**
|
2141
2541
|
* Returns true if this value is a symbol.
|
2542
|
+
*
|
2543
|
+
* This is equivalent to `typeof value === 'symbol'` in JS.
|
2142
2544
|
*/
|
2143
2545
|
bool IsSymbol() const;
|
2144
2546
|
|
2145
2547
|
/**
|
2146
2548
|
* Returns true if this value is a function.
|
2549
|
+
*
|
2550
|
+
* This is equivalent to `typeof value === 'function'` in JS.
|
2147
2551
|
*/
|
2148
2552
|
bool IsFunction() const;
|
2149
2553
|
|
@@ -2160,21 +2564,27 @@ class V8_EXPORT Value : public Data {
|
|
2160
2564
|
|
2161
2565
|
/**
|
2162
2566
|
* Returns true if this value is a bigint.
|
2567
|
+
*
|
2568
|
+
* This is equivalent to `typeof value === 'bigint'` in JS.
|
2163
2569
|
*/
|
2164
2570
|
bool IsBigInt() const;
|
2165
2571
|
|
2166
2572
|
/**
|
2167
2573
|
* Returns true if this value is boolean.
|
2574
|
+
*
|
2575
|
+
* This is equivalent to `typeof value === 'boolean'` in JS.
|
2168
2576
|
*/
|
2169
2577
|
bool IsBoolean() const;
|
2170
2578
|
|
2171
2579
|
/**
|
2172
2580
|
* Returns true if this value is a number.
|
2581
|
+
*
|
2582
|
+
* This is equivalent to `typeof value === 'number'` in JS.
|
2173
2583
|
*/
|
2174
2584
|
bool IsNumber() const;
|
2175
2585
|
|
2176
2586
|
/**
|
2177
|
-
* Returns true if this value is
|
2587
|
+
* Returns true if this value is an `External` object.
|
2178
2588
|
*/
|
2179
2589
|
bool IsExternal() const;
|
2180
2590
|
|
@@ -2360,7 +2770,6 @@ class V8_EXPORT Value : public Data {
|
|
2360
2770
|
|
2361
2771
|
/**
|
2362
2772
|
* Returns true if this value is a SharedArrayBuffer.
|
2363
|
-
* This is an experimental feature.
|
2364
2773
|
*/
|
2365
2774
|
bool IsSharedArrayBuffer() const;
|
2366
2775
|
|
@@ -2369,43 +2778,68 @@ class V8_EXPORT Value : public Data {
|
|
2369
2778
|
*/
|
2370
2779
|
bool IsProxy() const;
|
2371
2780
|
|
2372
|
-
|
2781
|
+
/**
|
2782
|
+
* Returns true if this value is a WasmModuleObject.
|
2783
|
+
*/
|
2784
|
+
bool IsWasmModuleObject() const;
|
2373
2785
|
|
2374
2786
|
/**
|
2375
2787
|
* Returns true if the value is a Module Namespace Object.
|
2376
2788
|
*/
|
2377
2789
|
bool IsModuleNamespaceObject() const;
|
2378
2790
|
|
2791
|
+
/**
|
2792
|
+
* Perform the equivalent of `BigInt(value)` in JS.
|
2793
|
+
*/
|
2379
2794
|
V8_WARN_UNUSED_RESULT MaybeLocal<BigInt> ToBigInt(
|
2380
2795
|
Local<Context> context) const;
|
2381
|
-
|
2382
|
-
|
2383
|
-
|
2796
|
+
/**
|
2797
|
+
* Perform the equivalent of `Number(value)` in JS.
|
2798
|
+
*/
|
2384
2799
|
V8_WARN_UNUSED_RESULT MaybeLocal<Number> ToNumber(
|
2385
2800
|
Local<Context> context) const;
|
2801
|
+
/**
|
2802
|
+
* Perform the equivalent of `String(value)` in JS.
|
2803
|
+
*/
|
2386
2804
|
V8_WARN_UNUSED_RESULT MaybeLocal<String> ToString(
|
2387
2805
|
Local<Context> context) const;
|
2806
|
+
/**
|
2807
|
+
* Provide a string representation of this value usable for debugging.
|
2808
|
+
* This operation has no observable side effects and will succeed
|
2809
|
+
* unless e.g. execution is being terminated.
|
2810
|
+
*/
|
2388
2811
|
V8_WARN_UNUSED_RESULT MaybeLocal<String> ToDetailString(
|
2389
2812
|
Local<Context> context) const;
|
2813
|
+
/**
|
2814
|
+
* Perform the equivalent of `Object(value)` in JS.
|
2815
|
+
*/
|
2390
2816
|
V8_WARN_UNUSED_RESULT MaybeLocal<Object> ToObject(
|
2391
2817
|
Local<Context> context) const;
|
2818
|
+
/**
|
2819
|
+
* Perform the equivalent of `Number(value)` in JS and convert the result
|
2820
|
+
* to an integer. Negative values are rounded up, positive values are rounded
|
2821
|
+
* down. NaN is converted to 0. Infinite values yield undefined results.
|
2822
|
+
*/
|
2392
2823
|
V8_WARN_UNUSED_RESULT MaybeLocal<Integer> ToInteger(
|
2393
2824
|
Local<Context> context) const;
|
2825
|
+
/**
|
2826
|
+
* Perform the equivalent of `Number(value)` in JS and convert the result
|
2827
|
+
* to an unsigned 32-bit integer by performing the steps in
|
2828
|
+
* https://tc39.es/ecma262/#sec-touint32.
|
2829
|
+
*/
|
2394
2830
|
V8_WARN_UNUSED_RESULT MaybeLocal<Uint32> ToUint32(
|
2395
2831
|
Local<Context> context) const;
|
2832
|
+
/**
|
2833
|
+
* Perform the equivalent of `Number(value)` in JS and convert the result
|
2834
|
+
* to a signed 32-bit integer by performing the steps in
|
2835
|
+
* https://tc39.es/ecma262/#sec-toint32.
|
2836
|
+
*/
|
2396
2837
|
V8_WARN_UNUSED_RESULT MaybeLocal<Int32> ToInt32(Local<Context> context) const;
|
2397
2838
|
|
2839
|
+
/**
|
2840
|
+
* Perform the equivalent of `Boolean(value)` in JS. This can never fail.
|
2841
|
+
*/
|
2398
2842
|
Local<Boolean> ToBoolean(Isolate* isolate) const;
|
2399
|
-
V8_DEPRECATE_SOON("Use maybe version",
|
2400
|
-
Local<Number> ToNumber(Isolate* isolate) const);
|
2401
|
-
V8_DEPRECATE_SOON("Use maybe version",
|
2402
|
-
Local<String> ToString(Isolate* isolate) const);
|
2403
|
-
V8_DEPRECATE_SOON("Use maybe version",
|
2404
|
-
Local<Object> ToObject(Isolate* isolate) const);
|
2405
|
-
V8_DEPRECATE_SOON("Use maybe version",
|
2406
|
-
Local<Integer> ToInteger(Isolate* isolate) const);
|
2407
|
-
V8_DEPRECATE_SOON("Use maybe version",
|
2408
|
-
Local<Int32> ToInt32(Isolate* isolate) const);
|
2409
2843
|
|
2410
2844
|
/**
|
2411
2845
|
* Attempts to convert a string to an array index.
|
@@ -2414,16 +2848,18 @@ class V8_EXPORT Value : public Data {
|
|
2414
2848
|
V8_WARN_UNUSED_RESULT MaybeLocal<Uint32> ToArrayIndex(
|
2415
2849
|
Local<Context> context) const;
|
2416
2850
|
|
2851
|
+
/** Returns the equivalent of `ToBoolean()->Value()`. */
|
2417
2852
|
bool BooleanValue(Isolate* isolate) const;
|
2418
2853
|
|
2419
|
-
|
2420
|
-
V8_WARN_UNUSED_RESULT Maybe<bool> BooleanValue(
|
2421
|
-
Local<Context> context) const);
|
2854
|
+
/** Returns the equivalent of `ToNumber()->Value()`. */
|
2422
2855
|
V8_WARN_UNUSED_RESULT Maybe<double> NumberValue(Local<Context> context) const;
|
2856
|
+
/** Returns the equivalent of `ToInteger()->Value()`. */
|
2423
2857
|
V8_WARN_UNUSED_RESULT Maybe<int64_t> IntegerValue(
|
2424
2858
|
Local<Context> context) const;
|
2859
|
+
/** Returns the equivalent of `ToUint32()->Value()`. */
|
2425
2860
|
V8_WARN_UNUSED_RESULT Maybe<uint32_t> Uint32Value(
|
2426
2861
|
Local<Context> context) const;
|
2862
|
+
/** Returns the equivalent of `ToInt32()->Value()`. */
|
2427
2863
|
V8_WARN_UNUSED_RESULT Maybe<int32_t> Int32Value(Local<Context> context) const;
|
2428
2864
|
|
2429
2865
|
/** JS == */
|
@@ -2515,9 +2951,8 @@ enum class NewStringType {
|
|
2515
2951
|
*/
|
2516
2952
|
class V8_EXPORT String : public Name {
|
2517
2953
|
public:
|
2518
|
-
static constexpr int kMaxLength =
|
2519
|
-
|
2520
|
-
: internal::kSmiMaxValue / 2 - 24;
|
2954
|
+
static constexpr int kMaxLength =
|
2955
|
+
internal::kApiSystemPointerSize == 4 ? (1 << 28) - 16 : (1 << 29) - 24;
|
2521
2956
|
|
2522
2957
|
enum Encoding {
|
2523
2958
|
UNKNOWN_ENCODING = 0x1,
|
@@ -2615,10 +3050,6 @@ class V8_EXPORT String : public Name {
|
|
2615
3050
|
public:
|
2616
3051
|
virtual ~ExternalStringResourceBase() = default;
|
2617
3052
|
|
2618
|
-
V8_DEPRECATED("Use IsCacheable().", virtual bool IsCompressible() const) {
|
2619
|
-
return false;
|
2620
|
-
}
|
2621
|
-
|
2622
3053
|
/**
|
2623
3054
|
* If a string is cacheable, the value returned by
|
2624
3055
|
* ExternalStringResource::data() may be cached, otherwise it is not
|
@@ -2626,6 +3057,10 @@ class V8_EXPORT String : public Name {
|
|
2626
3057
|
*/
|
2627
3058
|
virtual bool IsCacheable() const { return true; }
|
2628
3059
|
|
3060
|
+
// Disallow copying and assigning.
|
3061
|
+
ExternalStringResourceBase(const ExternalStringResourceBase&) = delete;
|
3062
|
+
void operator=(const ExternalStringResourceBase&) = delete;
|
3063
|
+
|
2629
3064
|
protected:
|
2630
3065
|
ExternalStringResourceBase() = default;
|
2631
3066
|
|
@@ -2655,12 +3090,8 @@ class V8_EXPORT String : public Name {
|
|
2655
3090
|
*/
|
2656
3091
|
virtual void Unlock() const {}
|
2657
3092
|
|
2658
|
-
// Disallow copying and assigning.
|
2659
|
-
ExternalStringResourceBase(const ExternalStringResourceBase&) = delete;
|
2660
|
-
void operator=(const ExternalStringResourceBase&) = delete;
|
2661
|
-
|
2662
3093
|
private:
|
2663
|
-
friend class internal::
|
3094
|
+
friend class internal::ExternalString;
|
2664
3095
|
friend class v8::String;
|
2665
3096
|
friend class internal::ScopedExternalStringLock;
|
2666
3097
|
};
|
@@ -2742,43 +3173,40 @@ class V8_EXPORT String : public Name {
|
|
2742
3173
|
|
2743
3174
|
V8_INLINE static String* Cast(v8::Value* obj);
|
2744
3175
|
|
2745
|
-
|
2746
|
-
|
2747
|
-
|
2748
|
-
|
2749
|
-
|
2750
|
-
|
2751
|
-
|
2752
|
-
|
2753
|
-
|
2754
|
-
|
2755
|
-
|
2756
|
-
|
3176
|
+
/**
|
3177
|
+
* Allocates a new string from a UTF-8 literal. This is equivalent to calling
|
3178
|
+
* String::NewFromUtf(isolate, "...").ToLocalChecked(), but without the check
|
3179
|
+
* overhead.
|
3180
|
+
*
|
3181
|
+
* When called on a string literal containing '\0', the inferred length is the
|
3182
|
+
* length of the input array minus 1 (for the final '\0') and not the value
|
3183
|
+
* returned by strlen.
|
3184
|
+
**/
|
3185
|
+
template <int N>
|
3186
|
+
static V8_WARN_UNUSED_RESULT Local<String> NewFromUtf8Literal(
|
3187
|
+
Isolate* isolate, const char (&literal)[N],
|
3188
|
+
NewStringType type = NewStringType::kNormal) {
|
3189
|
+
static_assert(N <= kMaxLength, "String is too long");
|
3190
|
+
return NewFromUtf8Literal(isolate, literal, type, N - 1);
|
3191
|
+
}
|
2757
3192
|
|
2758
3193
|
/** Allocates a new string from UTF-8 data. Only returns an empty value when
|
2759
3194
|
* length > kMaxLength. **/
|
2760
3195
|
static V8_WARN_UNUSED_RESULT MaybeLocal<String> NewFromUtf8(
|
2761
|
-
Isolate* isolate, const char* data,
|
2762
|
-
int length = -1);
|
3196
|
+
Isolate* isolate, const char* data,
|
3197
|
+
NewStringType type = NewStringType::kNormal, int length = -1);
|
2763
3198
|
|
2764
3199
|
/** Allocates a new string from Latin-1 data. Only returns an empty value
|
2765
3200
|
* when length > kMaxLength. **/
|
2766
3201
|
static V8_WARN_UNUSED_RESULT MaybeLocal<String> NewFromOneByte(
|
2767
|
-
Isolate* isolate, const uint8_t* data,
|
2768
|
-
int length = -1);
|
2769
|
-
|
2770
|
-
/** Allocates a new string from UTF-16 data.*/
|
2771
|
-
static V8_DEPRECATE_SOON(
|
2772
|
-
"Use maybe version",
|
2773
|
-
Local<String> NewFromTwoByte(Isolate* isolate, const uint16_t* data,
|
2774
|
-
NewStringType type = kNormalString,
|
2775
|
-
int length = -1));
|
3202
|
+
Isolate* isolate, const uint8_t* data,
|
3203
|
+
NewStringType type = NewStringType::kNormal, int length = -1);
|
2776
3204
|
|
2777
3205
|
/** Allocates a new string from UTF-16 data. Only returns an empty value when
|
2778
3206
|
* length > kMaxLength. **/
|
2779
3207
|
static V8_WARN_UNUSED_RESULT MaybeLocal<String> NewFromTwoByte(
|
2780
|
-
Isolate* isolate, const uint16_t* data,
|
2781
|
-
int length = -1);
|
3208
|
+
Isolate* isolate, const uint16_t* data,
|
3209
|
+
NewStringType type = NewStringType::kNormal, int length = -1);
|
2782
3210
|
|
2783
3211
|
/**
|
2784
3212
|
* Creates a new string by concatenating the left and the right strings
|
@@ -2817,10 +3245,6 @@ class V8_EXPORT String : public Name {
|
|
2817
3245
|
* should the underlying buffer be deallocated or modified except through the
|
2818
3246
|
* destructor of the external string resource.
|
2819
3247
|
*/
|
2820
|
-
static V8_DEPRECATE_SOON(
|
2821
|
-
"Use maybe version",
|
2822
|
-
Local<String> NewExternal(Isolate* isolate,
|
2823
|
-
ExternalOneByteStringResource* resource));
|
2824
3248
|
static V8_WARN_UNUSED_RESULT MaybeLocal<String> NewExternalOneByte(
|
2825
3249
|
Isolate* isolate, ExternalOneByteStringResource* resource);
|
2826
3250
|
|
@@ -2900,9 +3324,20 @@ class V8_EXPORT String : public Name {
|
|
2900
3324
|
ExternalStringResourceBase* GetExternalStringResourceBaseSlow(
|
2901
3325
|
String::Encoding* encoding_out) const;
|
2902
3326
|
|
3327
|
+
static Local<v8::String> NewFromUtf8Literal(Isolate* isolate,
|
3328
|
+
const char* literal,
|
3329
|
+
NewStringType type, int length);
|
3330
|
+
|
2903
3331
|
static void CheckCast(v8::Value* obj);
|
2904
3332
|
};
|
2905
3333
|
|
3334
|
+
// Zero-length string specialization (templated string size includes
|
3335
|
+
// terminator).
|
3336
|
+
template <>
|
3337
|
+
inline V8_WARN_UNUSED_RESULT Local<String> String::NewFromUtf8Literal(
|
3338
|
+
Isolate* isolate, const char (&literal)[1], NewStringType type) {
|
3339
|
+
return String::Empty(isolate);
|
3340
|
+
}
|
2906
3341
|
|
2907
3342
|
/**
|
2908
3343
|
* A JavaScript symbol (ECMA-262 edition 6)
|
@@ -2910,30 +3345,35 @@ class V8_EXPORT String : public Name {
|
|
2910
3345
|
class V8_EXPORT Symbol : public Name {
|
2911
3346
|
public:
|
2912
3347
|
/**
|
2913
|
-
* Returns the
|
3348
|
+
* Returns the description string of the symbol, or undefined if none.
|
2914
3349
|
*/
|
2915
|
-
Local<Value>
|
3350
|
+
Local<Value> Description() const;
|
3351
|
+
|
3352
|
+
V8_DEPRECATE_SOON("Use Symbol::Description()")
|
3353
|
+
Local<Value> Name() const { return Description(); }
|
2916
3354
|
|
2917
3355
|
/**
|
2918
|
-
* Create a symbol. If
|
3356
|
+
* Create a symbol. If description is not empty, it will be used as the
|
3357
|
+
* description.
|
2919
3358
|
*/
|
2920
3359
|
static Local<Symbol> New(Isolate* isolate,
|
2921
|
-
Local<String>
|
3360
|
+
Local<String> description = Local<String>());
|
2922
3361
|
|
2923
3362
|
/**
|
2924
3363
|
* Access global symbol registry.
|
2925
3364
|
* Note that symbols created this way are never collected, so
|
2926
3365
|
* they should only be used for statically fixed properties.
|
2927
|
-
* Also, there is only one global name space for the
|
3366
|
+
* Also, there is only one global name space for the descriptions used as
|
3367
|
+
* keys.
|
2928
3368
|
* To minimize the potential for clashes, use qualified names as keys.
|
2929
3369
|
*/
|
2930
|
-
static Local<Symbol> For(Isolate
|
3370
|
+
static Local<Symbol> For(Isolate* isolate, Local<String> description);
|
2931
3371
|
|
2932
3372
|
/**
|
2933
3373
|
* Retrieve a global symbol. Similar to |For|, but using a separate
|
2934
3374
|
* registry that is not accessible by (and cannot clash with) JavaScript code.
|
2935
3375
|
*/
|
2936
|
-
static Local<Symbol> ForApi(Isolate
|
3376
|
+
static Local<Symbol> ForApi(Isolate* isolate, Local<String> description);
|
2937
3377
|
|
2938
3378
|
// Well-known symbols
|
2939
3379
|
static Local<Symbol> GetAsyncIterator(Isolate* isolate);
|
@@ -3205,7 +3645,7 @@ enum class IndexFilter { kIncludeIndices, kSkipIndices };
|
|
3205
3645
|
* kConvertToString will convert integer indices to strings.
|
3206
3646
|
* kKeepNumbers will return numbers for integer indices.
|
3207
3647
|
*/
|
3208
|
-
enum class KeyConversionMode { kConvertToString, kKeepNumbers };
|
3648
|
+
enum class KeyConversionMode { kConvertToString, kKeepNumbers, kNoNumbers };
|
3209
3649
|
|
3210
3650
|
/**
|
3211
3651
|
* Integrity level for objects.
|
@@ -3217,8 +3657,6 @@ enum class IntegrityLevel { kFrozen, kSealed };
|
|
3217
3657
|
*/
|
3218
3658
|
class V8_EXPORT Object : public Value {
|
3219
3659
|
public:
|
3220
|
-
V8_DEPRECATE_SOON("Use maybe version",
|
3221
|
-
bool Set(Local<Value> key, Local<Value> value));
|
3222
3660
|
/**
|
3223
3661
|
* Set only return Just(true) or Empty(), so if it should never fail, use
|
3224
3662
|
* result.Check().
|
@@ -3226,8 +3664,6 @@ class V8_EXPORT Object : public Value {
|
|
3226
3664
|
V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context,
|
3227
3665
|
Local<Value> key, Local<Value> value);
|
3228
3666
|
|
3229
|
-
V8_DEPRECATE_SOON("Use maybe version",
|
3230
|
-
bool Set(uint32_t index, Local<Value> value));
|
3231
3667
|
V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, uint32_t index,
|
3232
3668
|
Local<Value> value);
|
3233
3669
|
|
@@ -3269,13 +3705,12 @@ class V8_EXPORT Object : public Value {
|
|
3269
3705
|
//
|
3270
3706
|
// Returns true on success.
|
3271
3707
|
V8_WARN_UNUSED_RESULT Maybe<bool> DefineProperty(
|
3272
|
-
Local<Context> context, Local<Name> key,
|
3708
|
+
Local<Context> context, Local<Name> key,
|
3709
|
+
PropertyDescriptor& descriptor); // NOLINT(runtime/references)
|
3273
3710
|
|
3274
|
-
V8_DEPRECATE_SOON("Use maybe version", Local<Value> Get(Local<Value> key));
|
3275
3711
|
V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
|
3276
3712
|
Local<Value> key);
|
3277
3713
|
|
3278
|
-
V8_DEPRECATE_SOON("Use maybe version", Local<Value> Get(uint32_t index));
|
3279
3714
|
V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
|
3280
3715
|
uint32_t index);
|
3281
3716
|
|
@@ -3381,7 +3816,6 @@ class V8_EXPORT Object : public Value {
|
|
3381
3816
|
* array returned by this method contains the same values as would
|
3382
3817
|
* be enumerated by a for-in statement over this object.
|
3383
3818
|
*/
|
3384
|
-
V8_DEPRECATED("Use maybe version", Local<Array> GetPropertyNames());
|
3385
3819
|
V8_WARN_UNUSED_RESULT MaybeLocal<Array> GetPropertyNames(
|
3386
3820
|
Local<Context> context);
|
3387
3821
|
V8_WARN_UNUSED_RESULT MaybeLocal<Array> GetPropertyNames(
|
@@ -3394,7 +3828,6 @@ class V8_EXPORT Object : public Value {
|
|
3394
3828
|
* the returned array doesn't contain the names of properties from
|
3395
3829
|
* prototype objects.
|
3396
3830
|
*/
|
3397
|
-
V8_DEPRECATED("Use maybe version", Local<Array> GetOwnPropertyNames());
|
3398
3831
|
V8_WARN_UNUSED_RESULT MaybeLocal<Array> GetOwnPropertyNames(
|
3399
3832
|
Local<Context> context);
|
3400
3833
|
|
@@ -3450,12 +3883,18 @@ class V8_EXPORT Object : public Value {
|
|
3450
3883
|
/** Gets the number of internal fields for this Object. */
|
3451
3884
|
int InternalFieldCount();
|
3452
3885
|
|
3453
|
-
/** Same as above, but works for
|
3886
|
+
/** Same as above, but works for PersistentBase. */
|
3454
3887
|
V8_INLINE static int InternalFieldCount(
|
3455
3888
|
const PersistentBase<Object>& object) {
|
3456
3889
|
return object.val_->InternalFieldCount();
|
3457
3890
|
}
|
3458
3891
|
|
3892
|
+
/** Same as above, but works for TracedReferenceBase. */
|
3893
|
+
V8_INLINE static int InternalFieldCount(
|
3894
|
+
const TracedReferenceBase<Object>& object) {
|
3895
|
+
return object.val_->InternalFieldCount();
|
3896
|
+
}
|
3897
|
+
|
3459
3898
|
/** Gets the value from an internal field. */
|
3460
3899
|
V8_INLINE Local<Value> GetInternalField(int index);
|
3461
3900
|
|
@@ -3469,12 +3908,18 @@ class V8_EXPORT Object : public Value {
|
|
3469
3908
|
*/
|
3470
3909
|
V8_INLINE void* GetAlignedPointerFromInternalField(int index);
|
3471
3910
|
|
3472
|
-
/** Same as above, but works for
|
3911
|
+
/** Same as above, but works for PersistentBase. */
|
3473
3912
|
V8_INLINE static void* GetAlignedPointerFromInternalField(
|
3474
3913
|
const PersistentBase<Object>& object, int index) {
|
3475
3914
|
return object.val_->GetAlignedPointerFromInternalField(index);
|
3476
3915
|
}
|
3477
3916
|
|
3917
|
+
/** Same as above, but works for TracedGlobal. */
|
3918
|
+
V8_INLINE static void* GetAlignedPointerFromInternalField(
|
3919
|
+
const TracedReferenceBase<Object>& object, int index) {
|
3920
|
+
return object.val_->GetAlignedPointerFromInternalField(index);
|
3921
|
+
}
|
3922
|
+
|
3478
3923
|
/**
|
3479
3924
|
* Sets a 2-byte-aligned native pointer in an internal field. To retrieve such
|
3480
3925
|
* a field, GetAlignedPointerFromInternalField must be used, everything else
|
@@ -3493,8 +3938,6 @@ class V8_EXPORT Object : public Value {
|
|
3493
3938
|
Local<Name> key);
|
3494
3939
|
V8_WARN_UNUSED_RESULT Maybe<bool> HasOwnProperty(Local<Context> context,
|
3495
3940
|
uint32_t index);
|
3496
|
-
V8_DEPRECATED("Use maybe version",
|
3497
|
-
bool HasRealNamedProperty(Local<String> key));
|
3498
3941
|
/**
|
3499
3942
|
* Use HasRealNamedProperty() if you want to check if an object has an own
|
3500
3943
|
* property without causing side effects, i.e., without calling interceptors.
|
@@ -3510,12 +3953,8 @@ class V8_EXPORT Object : public Value {
|
|
3510
3953
|
*/
|
3511
3954
|
V8_WARN_UNUSED_RESULT Maybe<bool> HasRealNamedProperty(Local<Context> context,
|
3512
3955
|
Local<Name> key);
|
3513
|
-
V8_DEPRECATED("Use maybe version",
|
3514
|
-
bool HasRealIndexedProperty(uint32_t index));
|
3515
3956
|
V8_WARN_UNUSED_RESULT Maybe<bool> HasRealIndexedProperty(
|
3516
3957
|
Local<Context> context, uint32_t index);
|
3517
|
-
V8_DEPRECATED("Use maybe version",
|
3518
|
-
bool HasRealNamedCallbackProperty(Local<String> key));
|
3519
3958
|
V8_WARN_UNUSED_RESULT Maybe<bool> HasRealNamedCallbackProperty(
|
3520
3959
|
Local<Context> context, Local<Name> key);
|
3521
3960
|
|
@@ -3596,6 +4035,22 @@ class V8_EXPORT Object : public Value {
|
|
3596
4035
|
*/
|
3597
4036
|
bool IsConstructor();
|
3598
4037
|
|
4038
|
+
/**
|
4039
|
+
* True if this object can carry information relevant to the embedder in its
|
4040
|
+
* embedder fields, false otherwise. This is generally true for objects
|
4041
|
+
* constructed through function templates but also holds for other types where
|
4042
|
+
* V8 automatically adds internal fields at compile time, such as e.g.
|
4043
|
+
* v8::ArrayBuffer.
|
4044
|
+
*/
|
4045
|
+
bool IsApiWrapper();
|
4046
|
+
|
4047
|
+
/**
|
4048
|
+
* True if this object was created from an object template which was marked
|
4049
|
+
* as undetectable. See v8::ObjectTemplate::MarkAsUndetectable for more
|
4050
|
+
* information.
|
4051
|
+
*/
|
4052
|
+
bool IsUndetectable();
|
4053
|
+
|
3599
4054
|
/**
|
3600
4055
|
* Call an Object as a function if a callback is set by the
|
3601
4056
|
* ObjectTemplate::SetCallAsFunctionHandler method.
|
@@ -3752,15 +4207,14 @@ class ReturnValue {
|
|
3752
4207
|
public:
|
3753
4208
|
template <class S> V8_INLINE ReturnValue(const ReturnValue<S>& that)
|
3754
4209
|
: value_(that.value_) {
|
3755
|
-
|
4210
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
3756
4211
|
}
|
3757
4212
|
// Local setters
|
3758
4213
|
template <typename S>
|
3759
|
-
V8_INLINE V8_DEPRECATED("Use Global<> instead",
|
3760
|
-
void Set(const Persistent<S>& handle));
|
3761
|
-
template <typename S>
|
3762
4214
|
V8_INLINE void Set(const Global<S>& handle);
|
3763
4215
|
template <typename S>
|
4216
|
+
V8_INLINE void Set(const TracedReferenceBase<S>& handle);
|
4217
|
+
template <typename S>
|
3764
4218
|
V8_INLINE void Set(const Local<S> handle);
|
3765
4219
|
// Fast primitive setters
|
3766
4220
|
V8_INLINE void Set(bool value);
|
@@ -3807,7 +4261,10 @@ class FunctionCallbackInfo {
|
|
3807
4261
|
public:
|
3808
4262
|
/** The number of available arguments. */
|
3809
4263
|
V8_INLINE int Length() const;
|
3810
|
-
/**
|
4264
|
+
/**
|
4265
|
+
* Accessor for the available arguments. Returns `undefined` if the index
|
4266
|
+
* is out of bounds.
|
4267
|
+
*/
|
3811
4268
|
V8_INLINE Local<Value> operator[](int i) const;
|
3812
4269
|
/** Returns the receiver. This corresponds to the "this" value. */
|
3813
4270
|
V8_INLINE Local<Object> This() const;
|
@@ -3984,11 +4441,6 @@ class V8_EXPORT Function : public Object {
|
|
3984
4441
|
Local<Value> data = Local<Value>(), int length = 0,
|
3985
4442
|
ConstructorBehavior behavior = ConstructorBehavior::kAllow,
|
3986
4443
|
SideEffectType side_effect_type = SideEffectType::kHasSideEffect);
|
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));
|
3992
4444
|
|
3993
4445
|
V8_WARN_UNUSED_RESULT MaybeLocal<Object> NewInstance(
|
3994
4446
|
Local<Context> context, int argc, Local<Value> argv[]) const;
|
@@ -4007,9 +4459,6 @@ class V8_EXPORT Function : public Object {
|
|
4007
4459
|
Local<Context> context, int argc, Local<Value> argv[],
|
4008
4460
|
SideEffectType side_effect_type = SideEffectType::kHasSideEffect) const;
|
4009
4461
|
|
4010
|
-
V8_DEPRECATED("Use maybe version",
|
4011
|
-
Local<Value> Call(Local<Value> recv, int argc,
|
4012
|
-
Local<Value> argv[]));
|
4013
4462
|
V8_WARN_UNUSED_RESULT MaybeLocal<Value> Call(Local<Context> context,
|
4014
4463
|
Local<Value> recv, int argc,
|
4015
4464
|
Local<Value> argv[]);
|
@@ -4194,14 +4643,6 @@ class V8_EXPORT PropertyDescriptor {
|
|
4194
4643
|
// GenericDescriptor
|
4195
4644
|
PropertyDescriptor();
|
4196
4645
|
|
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
|
-
|
4205
4646
|
// DataDescriptor
|
4206
4647
|
explicit PropertyDescriptor(Local<Value> value);
|
4207
4648
|
|
@@ -4242,11 +4683,6 @@ class V8_EXPORT PropertyDescriptor {
|
|
4242
4683
|
PrivateData* private_;
|
4243
4684
|
};
|
4244
4685
|
|
4245
|
-
// TODO(clemensh): Remove after 7.3 branch.
|
4246
|
-
template <std::nullptr_t>
|
4247
|
-
PropertyDescriptor::PropertyDescriptor(Local<Value> value)
|
4248
|
-
: PropertyDescriptor(value) {}
|
4249
|
-
|
4250
4686
|
/**
|
4251
4687
|
* An instance of the built-in Proxy constructor (ECMA-262, 6th Edition,
|
4252
4688
|
* 26.2.1).
|
@@ -4336,74 +4772,14 @@ class V8_EXPORT CompiledWasmModule {
|
|
4336
4772
|
// An instance of WebAssembly.Module.
|
4337
4773
|
class V8_EXPORT WasmModuleObject : public Object {
|
4338
4774
|
public:
|
4339
|
-
|
4340
|
-
V8_DEPRECATED("Use OwnedBuffer", typedef)
|
4341
|
-
std::pair<std::unique_ptr<const uint8_t[]>, size_t> SerializedModule;
|
4342
|
-
|
4343
|
-
/**
|
4344
|
-
* A unowned reference to a byte buffer.
|
4345
|
-
* TODO(clemensh): Remove after 7.3 branch.
|
4346
|
-
*/
|
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
|
-
};
|
4360
|
-
|
4361
|
-
/**
|
4362
|
-
* An opaque, native heap object for transferring wasm modules. It
|
4363
|
-
* supports move semantics, and does not support copy semantics.
|
4364
|
-
* TODO(wasm): Merge this with CompiledWasmModule once code sharing is always
|
4365
|
-
* enabled.
|
4366
|
-
*/
|
4367
|
-
class TransferrableModule final {
|
4368
|
-
public:
|
4369
|
-
TransferrableModule(TransferrableModule&& src) = default;
|
4370
|
-
TransferrableModule(const TransferrableModule& src) = delete;
|
4371
|
-
|
4372
|
-
TransferrableModule& operator=(TransferrableModule&& src) = default;
|
4373
|
-
TransferrableModule& operator=(const TransferrableModule& src) = delete;
|
4374
|
-
|
4375
|
-
private:
|
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};
|
4386
|
-
};
|
4387
|
-
|
4388
|
-
/**
|
4389
|
-
* Get an in-memory, non-persistable, and context-independent (meaning,
|
4390
|
-
* suitable for transfer to another Isolate and Context) representation
|
4391
|
-
* of this wasm compiled module.
|
4392
|
-
*/
|
4393
|
-
TransferrableModule GetTransferrableModule();
|
4775
|
+
WasmModuleObject() = delete;
|
4394
4776
|
|
4395
4777
|
/**
|
4396
4778
|
* Efficiently re-create a WasmModuleObject, without recompiling, from
|
4397
|
-
* a
|
4398
|
-
*/
|
4399
|
-
static MaybeLocal<WasmModuleObject> FromTransferrableModule(
|
4400
|
-
Isolate* isolate, const TransferrableModule&);
|
4401
|
-
|
4402
|
-
/**
|
4403
|
-
* Get the wasm-encoded bytes that were used to compile this module.
|
4779
|
+
* a CompiledWasmModule.
|
4404
4780
|
*/
|
4405
|
-
|
4406
|
-
|
4781
|
+
static MaybeLocal<WasmModuleObject> FromCompiledModule(
|
4782
|
+
Isolate* isolate, const CompiledWasmModule&);
|
4407
4783
|
|
4408
4784
|
/**
|
4409
4785
|
* Get the compiled module for this module object. The compiled module can be
|
@@ -4411,40 +4787,12 @@ class V8_EXPORT WasmModuleObject : public Object {
|
|
4411
4787
|
*/
|
4412
4788
|
CompiledWasmModule GetCompiledModule();
|
4413
4789
|
|
4414
|
-
/**
|
4415
|
-
* Serialize the compiled module. The serialized data does not include the
|
4416
|
-
* uncompiled bytes.
|
4417
|
-
*/
|
4418
|
-
V8_DEPRECATED("Use CompiledWasmModule::Serialize()",
|
4419
|
-
SerializedModule Serialize());
|
4420
|
-
|
4421
|
-
/**
|
4422
|
-
* If possible, deserialize the module, otherwise compile it from the provided
|
4423
|
-
* uncompiled bytes.
|
4424
|
-
*/
|
4425
|
-
static MaybeLocal<WasmModuleObject> DeserializeOrCompile(
|
4426
|
-
Isolate* isolate, MemorySpan<const uint8_t> serialized_module,
|
4427
|
-
MemorySpan<const uint8_t> wire_bytes);
|
4428
4790
|
V8_INLINE static WasmModuleObject* Cast(Value* obj);
|
4429
4791
|
|
4430
4792
|
private:
|
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};
|
4439
|
-
}
|
4440
|
-
|
4441
|
-
WasmModuleObject();
|
4442
4793
|
static void CheckCast(Value* obj);
|
4443
4794
|
};
|
4444
4795
|
|
4445
|
-
V8_DEPRECATED("Use WasmModuleObject",
|
4446
|
-
typedef WasmModuleObject WasmCompiledModule);
|
4447
|
-
|
4448
4796
|
/**
|
4449
4797
|
* The V8 interface for WebAssembly streaming compilation. When streaming
|
4450
4798
|
* compilation is initiated, V8 passes a {WasmStreaming} object to the embedder
|
@@ -4507,6 +4855,12 @@ class V8_EXPORT WasmStreaming final {
|
|
4507
4855
|
*/
|
4508
4856
|
void SetClient(std::shared_ptr<Client> client);
|
4509
4857
|
|
4858
|
+
/*
|
4859
|
+
* Sets the UTF-8 encoded source URL for the {Script} object. This must be
|
4860
|
+
* called before {Finish}.
|
4861
|
+
*/
|
4862
|
+
void SetUrl(const char* url, size_t length);
|
4863
|
+
|
4510
4864
|
/**
|
4511
4865
|
* Unpacks a {WasmStreaming} object wrapped in a {Managed} for the embedder.
|
4512
4866
|
* Since the embedder is on the other side of the API, it cannot unpack the
|
@@ -4571,8 +4925,85 @@ class V8_EXPORT WasmModuleObjectBuilderStreaming final {
|
|
4571
4925
|
#endif
|
4572
4926
|
|
4573
4927
|
|
4574
|
-
enum class ArrayBufferCreationMode { kInternalized, kExternalized };
|
4928
|
+
enum class ArrayBufferCreationMode { kInternalized, kExternalized };
|
4929
|
+
|
4930
|
+
/**
|
4931
|
+
* A wrapper around the backing store (i.e. the raw memory) of an array buffer.
|
4932
|
+
* See a document linked in http://crbug.com/v8/9908 for more information.
|
4933
|
+
*
|
4934
|
+
* The allocation and destruction of backing stores is generally managed by
|
4935
|
+
* V8. Clients should always use standard C++ memory ownership types (i.e.
|
4936
|
+
* std::unique_ptr and std::shared_ptr) to manage lifetimes of backing stores
|
4937
|
+
* properly, since V8 internal objects may alias backing stores.
|
4938
|
+
*
|
4939
|
+
* This object does not keep the underlying |ArrayBuffer::Allocator| alive by
|
4940
|
+
* default. Use Isolate::CreateParams::array_buffer_allocator_shared when
|
4941
|
+
* creating the Isolate to make it hold a reference to the allocator itself.
|
4942
|
+
*/
|
4943
|
+
class V8_EXPORT BackingStore : public v8::internal::BackingStoreBase {
|
4944
|
+
public:
|
4945
|
+
~BackingStore();
|
4946
|
+
|
4947
|
+
/**
|
4948
|
+
* Return a pointer to the beginning of the memory block for this backing
|
4949
|
+
* store. The pointer is only valid as long as this backing store object
|
4950
|
+
* lives.
|
4951
|
+
*/
|
4952
|
+
void* Data() const;
|
4953
|
+
|
4954
|
+
/**
|
4955
|
+
* The length (in bytes) of this backing store.
|
4956
|
+
*/
|
4957
|
+
size_t ByteLength() const;
|
4958
|
+
|
4959
|
+
/**
|
4960
|
+
* Indicates whether the backing store was created for an ArrayBuffer or
|
4961
|
+
* a SharedArrayBuffer.
|
4962
|
+
*/
|
4963
|
+
bool IsShared() const;
|
4964
|
+
|
4965
|
+
/**
|
4966
|
+
* Wrapper around ArrayBuffer::Allocator::Reallocate that preserves IsShared.
|
4967
|
+
* Assumes that the backing_store was allocated by the ArrayBuffer allocator
|
4968
|
+
* of the given isolate.
|
4969
|
+
*/
|
4970
|
+
static std::unique_ptr<BackingStore> Reallocate(
|
4971
|
+
v8::Isolate* isolate, std::unique_ptr<BackingStore> backing_store,
|
4972
|
+
size_t byte_length);
|
4973
|
+
|
4974
|
+
/**
|
4975
|
+
* This callback is used only if the memory block for a BackingStore cannot be
|
4976
|
+
* allocated with an ArrayBuffer::Allocator. In such cases the destructor of
|
4977
|
+
* the BackingStore invokes the callback to free the memory block.
|
4978
|
+
*/
|
4979
|
+
using DeleterCallback = void (*)(void* data, size_t length,
|
4980
|
+
void* deleter_data);
|
4981
|
+
|
4982
|
+
/**
|
4983
|
+
* If the memory block of a BackingStore is static or is managed manually,
|
4984
|
+
* then this empty deleter along with nullptr deleter_data can be passed to
|
4985
|
+
* ArrayBuffer::NewBackingStore to indicate that.
|
4986
|
+
*
|
4987
|
+
* The manually managed case should be used with caution and only when it
|
4988
|
+
* is guaranteed that the memory block freeing happens after detaching its
|
4989
|
+
* ArrayBuffer.
|
4990
|
+
*/
|
4991
|
+
static void EmptyDeleter(void* data, size_t length, void* deleter_data);
|
4992
|
+
|
4993
|
+
private:
|
4994
|
+
/**
|
4995
|
+
* See [Shared]ArrayBuffer::GetBackingStore and
|
4996
|
+
* [Shared]ArrayBuffer::NewBackingStore.
|
4997
|
+
*/
|
4998
|
+
BackingStore();
|
4999
|
+
};
|
5000
|
+
|
5001
|
+
#if !defined(V8_IMMINENT_DEPRECATION_WARNINGS)
|
5002
|
+
// Use v8::BackingStore::DeleterCallback instead.
|
5003
|
+
using BackingStoreDeleterCallback = void (*)(void* data, size_t length,
|
5004
|
+
void* deleter_data);
|
4575
5005
|
|
5006
|
+
#endif
|
4576
5007
|
|
4577
5008
|
/**
|
4578
5009
|
* An instance of the built-in ArrayBuffer constructor (ES6 draft 15.13.5).
|
@@ -4599,13 +5030,13 @@ class V8_EXPORT ArrayBuffer : public Object {
|
|
4599
5030
|
virtual ~Allocator() = default;
|
4600
5031
|
|
4601
5032
|
/**
|
4602
|
-
* Allocate |length| bytes. Return
|
5033
|
+
* Allocate |length| bytes. Return nullptr if allocation is not successful.
|
4603
5034
|
* Memory should be initialized to zeroes.
|
4604
5035
|
*/
|
4605
5036
|
virtual void* Allocate(size_t length) = 0;
|
4606
5037
|
|
4607
5038
|
/**
|
4608
|
-
* Allocate |length| bytes. Return
|
5039
|
+
* Allocate |length| bytes. Return nullptr if allocation is not successful.
|
4609
5040
|
* Memory does not have to be initialized.
|
4610
5041
|
*/
|
4611
5042
|
virtual void* AllocateUninitialized(size_t length) = 0;
|
@@ -4616,6 +5047,20 @@ class V8_EXPORT ArrayBuffer : public Object {
|
|
4616
5047
|
*/
|
4617
5048
|
virtual void Free(void* data, size_t length) = 0;
|
4618
5049
|
|
5050
|
+
/**
|
5051
|
+
* Reallocate the memory block of size |old_length| to a memory block of
|
5052
|
+
* size |new_length| by expanding, contracting, or copying the existing
|
5053
|
+
* memory block. If |new_length| > |old_length|, then the new part of
|
5054
|
+
* the memory must be initialized to zeros. Return nullptr if reallocation
|
5055
|
+
* is not successful.
|
5056
|
+
*
|
5057
|
+
* The caller guarantees that the memory block was previously allocated
|
5058
|
+
* using Allocate or AllocateUninitialized.
|
5059
|
+
*
|
5060
|
+
* The default implementation allocates a new block and copies data.
|
5061
|
+
*/
|
5062
|
+
virtual void* Reallocate(void* data, size_t old_length, size_t new_length);
|
5063
|
+
|
4619
5064
|
/**
|
4620
5065
|
* ArrayBuffer allocation mode. kNormal is a malloc/free style allocation,
|
4621
5066
|
* while kReservation is for larger allocations with the ability to set
|
@@ -4705,14 +5150,58 @@ class V8_EXPORT ArrayBuffer : public Object {
|
|
4705
5150
|
* |Allocator::Free| once all ArrayBuffers referencing it are collected by
|
4706
5151
|
* the garbage collector.
|
4707
5152
|
*/
|
5153
|
+
V8_DEPRECATE_SOON(
|
5154
|
+
"Use the version that takes a BackingStore. "
|
5155
|
+
"See http://crbug.com/v8/9908.")
|
4708
5156
|
static Local<ArrayBuffer> New(
|
4709
5157
|
Isolate* isolate, void* data, size_t byte_length,
|
4710
5158
|
ArrayBufferCreationMode mode = ArrayBufferCreationMode::kExternalized);
|
4711
5159
|
|
5160
|
+
/**
|
5161
|
+
* Create a new ArrayBuffer with an existing backing store.
|
5162
|
+
* The created array keeps a reference to the backing store until the array
|
5163
|
+
* is garbage collected. Note that the IsExternal bit does not affect this
|
5164
|
+
* reference from the array to the backing store.
|
5165
|
+
*
|
5166
|
+
* In future IsExternal bit will be removed. Until then the bit is set as
|
5167
|
+
* follows. If the backing store does not own the underlying buffer, then
|
5168
|
+
* the array is created in externalized state. Otherwise, the array is created
|
5169
|
+
* in internalized state. In the latter case the array can be transitioned
|
5170
|
+
* to the externalized state using Externalize(backing_store).
|
5171
|
+
*/
|
5172
|
+
static Local<ArrayBuffer> New(Isolate* isolate,
|
5173
|
+
std::shared_ptr<BackingStore> backing_store);
|
5174
|
+
|
5175
|
+
/**
|
5176
|
+
* Returns a new standalone BackingStore that is allocated using the array
|
5177
|
+
* buffer allocator of the isolate. The result can be later passed to
|
5178
|
+
* ArrayBuffer::New.
|
5179
|
+
*
|
5180
|
+
* If the allocator returns nullptr, then the function may cause GCs in the
|
5181
|
+
* given isolate and re-try the allocation. If GCs do not help, then the
|
5182
|
+
* function will crash with an out-of-memory error.
|
5183
|
+
*/
|
5184
|
+
static std::unique_ptr<BackingStore> NewBackingStore(Isolate* isolate,
|
5185
|
+
size_t byte_length);
|
5186
|
+
/**
|
5187
|
+
* Returns a new standalone BackingStore that takes over the ownership of
|
5188
|
+
* the given buffer. The destructor of the BackingStore invokes the given
|
5189
|
+
* deleter callback.
|
5190
|
+
*
|
5191
|
+
* The result can be later passed to ArrayBuffer::New. The raw pointer
|
5192
|
+
* to the buffer must not be passed again to any V8 API function.
|
5193
|
+
*/
|
5194
|
+
static std::unique_ptr<BackingStore> NewBackingStore(
|
5195
|
+
void* data, size_t byte_length, v8::BackingStore::DeleterCallback deleter,
|
5196
|
+
void* deleter_data);
|
5197
|
+
|
4712
5198
|
/**
|
4713
5199
|
* Returns true if ArrayBuffer is externalized, that is, does not
|
4714
5200
|
* own its memory block.
|
4715
5201
|
*/
|
5202
|
+
V8_DEPRECATE_SOON(
|
5203
|
+
"With v8::BackingStore externalized ArrayBuffers are "
|
5204
|
+
"the same as ordinary ArrayBuffers. See http://crbug.com/v8/9908.")
|
4716
5205
|
bool IsExternal() const;
|
4717
5206
|
|
4718
5207
|
/**
|
@@ -4720,12 +5209,6 @@ class V8_EXPORT ArrayBuffer : public Object {
|
|
4720
5209
|
*/
|
4721
5210
|
bool IsDetachable() const;
|
4722
5211
|
|
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
|
-
}
|
4728
|
-
|
4729
5212
|
/**
|
4730
5213
|
* Detaches this ArrayBuffer and all its views (typed arrays).
|
4731
5214
|
* Detaching sets the byte length of the buffer and all typed arrays to zero,
|
@@ -4734,9 +5217,6 @@ class V8_EXPORT ArrayBuffer : public Object {
|
|
4734
5217
|
*/
|
4735
5218
|
void Detach();
|
4736
5219
|
|
4737
|
-
// TODO(913887): fix the use of 'neuter' in the API.
|
4738
|
-
V8_DEPRECATE_SOON("Use Detach() instead.", inline void Neuter()) { Detach(); }
|
4739
|
-
|
4740
5220
|
/**
|
4741
5221
|
* Make this ArrayBuffer external. The pointer to underlying memory block
|
4742
5222
|
* and byte length are returned as |Contents| structure. After ArrayBuffer
|
@@ -4745,10 +5225,22 @@ class V8_EXPORT ArrayBuffer : public Object {
|
|
4745
5225
|
*
|
4746
5226
|
* The Data pointer of ArrayBuffer::Contents must be freed using the provided
|
4747
5227
|
* deleter, which will call ArrayBuffer::Allocator::Free if the buffer
|
4748
|
-
* was allocated with
|
5228
|
+
* was allocated with ArrayBuffer::Allocator::Allocate.
|
4749
5229
|
*/
|
5230
|
+
V8_DEPRECATE_SOON(
|
5231
|
+
"Use GetBackingStore or Detach. See http://crbug.com/v8/9908.")
|
4750
5232
|
Contents Externalize();
|
4751
5233
|
|
5234
|
+
/**
|
5235
|
+
* Marks this ArrayBuffer external given a witness that the embedder
|
5236
|
+
* has fetched the backing store using the new GetBackingStore() function.
|
5237
|
+
*
|
5238
|
+
* With the new lifetime management of backing stores there is no need for
|
5239
|
+
* externalizing, so this function exists only to make the transition easier.
|
5240
|
+
*/
|
5241
|
+
V8_DEPRECATE_SOON("This will be removed together with IsExternal.")
|
5242
|
+
void Externalize(const std::shared_ptr<BackingStore>& backing_store);
|
5243
|
+
|
4752
5244
|
/**
|
4753
5245
|
* Get a pointer to the ArrayBuffer's underlying memory block without
|
4754
5246
|
* externalizing it. If the ArrayBuffer is not externalized, this pointer
|
@@ -4757,8 +5249,19 @@ class V8_EXPORT ArrayBuffer : public Object {
|
|
4757
5249
|
* The embedder should make sure to hold a strong reference to the
|
4758
5250
|
* ArrayBuffer while accessing this pointer.
|
4759
5251
|
*/
|
5252
|
+
V8_DEPRECATE_SOON("Use GetBackingStore. See http://crbug.com/v8/9908.")
|
4760
5253
|
Contents GetContents();
|
4761
5254
|
|
5255
|
+
/**
|
5256
|
+
* Get a shared pointer to the backing store of this array buffer. This
|
5257
|
+
* pointer coordinates the lifetime management of the internal storage
|
5258
|
+
* with any live ArrayBuffers on the heap, even across isolates. The embedder
|
5259
|
+
* should not attempt to manage lifetime of the storage through other means.
|
5260
|
+
*
|
5261
|
+
* This function replaces both Externalize() and GetContents().
|
5262
|
+
*/
|
5263
|
+
std::shared_ptr<BackingStore> GetBackingStore();
|
5264
|
+
|
4762
5265
|
V8_INLINE static ArrayBuffer* Cast(Value* obj);
|
4763
5266
|
|
4764
5267
|
static const int kInternalFieldCount = V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT;
|
@@ -4767,6 +5270,7 @@ class V8_EXPORT ArrayBuffer : public Object {
|
|
4767
5270
|
private:
|
4768
5271
|
ArrayBuffer();
|
4769
5272
|
static void CheckCast(Value* obj);
|
5273
|
+
Contents GetContents(bool externalize);
|
4770
5274
|
};
|
4771
5275
|
|
4772
5276
|
|
@@ -4834,7 +5338,9 @@ class V8_EXPORT TypedArray : public ArrayBufferView {
|
|
4834
5338
|
/*
|
4835
5339
|
* The largest typed array size that can be constructed using New.
|
4836
5340
|
*/
|
4837
|
-
static constexpr size_t kMaxLength = internal::
|
5341
|
+
static constexpr size_t kMaxLength = internal::kApiSystemPointerSize == 4
|
5342
|
+
? internal::kSmiMaxValue
|
5343
|
+
: 0xFFFFFFFF;
|
4838
5344
|
|
4839
5345
|
/**
|
4840
5346
|
* Number of elements in this typed array
|
@@ -5053,7 +5559,6 @@ class V8_EXPORT DataView : public ArrayBufferView {
|
|
5053
5559
|
|
5054
5560
|
/**
|
5055
5561
|
* An instance of the built-in SharedArrayBuffer constructor.
|
5056
|
-
* This API is experimental and may change significantly.
|
5057
5562
|
*/
|
5058
5563
|
class V8_EXPORT SharedArrayBuffer : public Object {
|
5059
5564
|
public:
|
@@ -5065,8 +5570,6 @@ class V8_EXPORT SharedArrayBuffer : public Object {
|
|
5065
5570
|
* The Data pointer of ArrayBuffer::Contents must be freed using the provided
|
5066
5571
|
* deleter, which will call ArrayBuffer::Allocator::Free if the buffer
|
5067
5572
|
* was allocated with ArraryBuffer::Allocator::Allocate.
|
5068
|
-
*
|
5069
|
-
* This API is experimental and may change significantly.
|
5070
5573
|
*/
|
5071
5574
|
class V8_EXPORT Contents { // NOLINT
|
5072
5575
|
public:
|
@@ -5129,14 +5632,69 @@ class V8_EXPORT SharedArrayBuffer : public Object {
|
|
5129
5632
|
* specified. The memory block will not be reclaimed when a created
|
5130
5633
|
* SharedArrayBuffer is garbage-collected.
|
5131
5634
|
*/
|
5635
|
+
V8_DEPRECATE_SOON(
|
5636
|
+
"Use the version that takes a BackingStore. "
|
5637
|
+
"See http://crbug.com/v8/9908.")
|
5132
5638
|
static Local<SharedArrayBuffer> New(
|
5133
5639
|
Isolate* isolate, void* data, size_t byte_length,
|
5134
5640
|
ArrayBufferCreationMode mode = ArrayBufferCreationMode::kExternalized);
|
5135
5641
|
|
5642
|
+
/**
|
5643
|
+
* Create a new SharedArrayBuffer with an existing backing store.
|
5644
|
+
* The created array keeps a reference to the backing store until the array
|
5645
|
+
* is garbage collected. Note that the IsExternal bit does not affect this
|
5646
|
+
* reference from the array to the backing store.
|
5647
|
+
*
|
5648
|
+
* In future IsExternal bit will be removed. Until then the bit is set as
|
5649
|
+
* follows. If the backing store does not own the underlying buffer, then
|
5650
|
+
* the array is created in externalized state. Otherwise, the array is created
|
5651
|
+
* in internalized state. In the latter case the array can be transitioned
|
5652
|
+
* to the externalized state using Externalize(backing_store).
|
5653
|
+
*/
|
5654
|
+
static Local<SharedArrayBuffer> New(
|
5655
|
+
Isolate* isolate, std::shared_ptr<BackingStore> backing_store);
|
5656
|
+
|
5657
|
+
/**
|
5658
|
+
* Returns a new standalone BackingStore that is allocated using the array
|
5659
|
+
* buffer allocator of the isolate. The result can be later passed to
|
5660
|
+
* SharedArrayBuffer::New.
|
5661
|
+
*
|
5662
|
+
* If the allocator returns nullptr, then the function may cause GCs in the
|
5663
|
+
* given isolate and re-try the allocation. If GCs do not help, then the
|
5664
|
+
* function will crash with an out-of-memory error.
|
5665
|
+
*/
|
5666
|
+
static std::unique_ptr<BackingStore> NewBackingStore(Isolate* isolate,
|
5667
|
+
size_t byte_length);
|
5668
|
+
/**
|
5669
|
+
* Returns a new standalone BackingStore that takes over the ownership of
|
5670
|
+
* the given buffer. The destructor of the BackingStore invokes the given
|
5671
|
+
* deleter callback.
|
5672
|
+
*
|
5673
|
+
* The result can be later passed to SharedArrayBuffer::New. The raw pointer
|
5674
|
+
* to the buffer must not be passed again to any V8 functions.
|
5675
|
+
*/
|
5676
|
+
static std::unique_ptr<BackingStore> NewBackingStore(
|
5677
|
+
void* data, size_t byte_length, v8::BackingStore::DeleterCallback deleter,
|
5678
|
+
void* deleter_data);
|
5679
|
+
|
5680
|
+
/**
|
5681
|
+
* Create a new SharedArrayBuffer over an existing memory block. Propagate
|
5682
|
+
* flags to indicate whether the underlying buffer can be grown.
|
5683
|
+
*/
|
5684
|
+
V8_DEPRECATED(
|
5685
|
+
"Use the version that takes a BackingStore. "
|
5686
|
+
"See http://crbug.com/v8/9908.")
|
5687
|
+
static Local<SharedArrayBuffer> New(
|
5688
|
+
Isolate* isolate, const SharedArrayBuffer::Contents&,
|
5689
|
+
ArrayBufferCreationMode mode = ArrayBufferCreationMode::kExternalized);
|
5690
|
+
|
5136
5691
|
/**
|
5137
5692
|
* Returns true if SharedArrayBuffer is externalized, that is, does not
|
5138
5693
|
* own its memory block.
|
5139
5694
|
*/
|
5695
|
+
V8_DEPRECATE_SOON(
|
5696
|
+
"With v8::BackingStore externalized SharedArrayBuffers are the same "
|
5697
|
+
"as ordinary SharedArrayBuffers. See http://crbug.com/v8/9908.")
|
5140
5698
|
bool IsExternal() const;
|
5141
5699
|
|
5142
5700
|
/**
|
@@ -5151,8 +5709,20 @@ class V8_EXPORT SharedArrayBuffer : public Object {
|
|
5151
5709
|
* v8::Isolate::CreateParams::array_buffer_allocator.
|
5152
5710
|
*
|
5153
5711
|
*/
|
5712
|
+
V8_DEPRECATE_SOON(
|
5713
|
+
"Use GetBackingStore or Detach. See http://crbug.com/v8/9908.")
|
5154
5714
|
Contents Externalize();
|
5155
5715
|
|
5716
|
+
/**
|
5717
|
+
* Marks this SharedArrayBuffer external given a witness that the embedder
|
5718
|
+
* has fetched the backing store using the new GetBackingStore() function.
|
5719
|
+
*
|
5720
|
+
* With the new lifetime management of backing stores there is no need for
|
5721
|
+
* externalizing, so this function exists only to make the transition easier.
|
5722
|
+
*/
|
5723
|
+
V8_DEPRECATE_SOON("This will be removed together with IsExternal.")
|
5724
|
+
void Externalize(const std::shared_ptr<BackingStore>& backing_store);
|
5725
|
+
|
5156
5726
|
/**
|
5157
5727
|
* Get a pointer to the ArrayBuffer's underlying memory block without
|
5158
5728
|
* externalizing it. If the ArrayBuffer is not externalized, this pointer
|
@@ -5165,8 +5735,19 @@ class V8_EXPORT SharedArrayBuffer : public Object {
|
|
5165
5735
|
* by the allocator specified in
|
5166
5736
|
* v8::Isolate::CreateParams::array_buffer_allocator.
|
5167
5737
|
*/
|
5738
|
+
V8_DEPRECATE_SOON("Use GetBackingStore. See http://crbug.com/v8/9908.")
|
5168
5739
|
Contents GetContents();
|
5169
5740
|
|
5741
|
+
/**
|
5742
|
+
* Get a shared pointer to the backing store of this array buffer. This
|
5743
|
+
* pointer coordinates the lifetime management of the internal storage
|
5744
|
+
* with any live ArrayBuffers on the heap, even across isolates. The embedder
|
5745
|
+
* should not attempt to manage lifetime of the storage through other means.
|
5746
|
+
*
|
5747
|
+
* This function replaces both Externalize() and GetContents().
|
5748
|
+
*/
|
5749
|
+
std::shared_ptr<BackingStore> GetBackingStore();
|
5750
|
+
|
5170
5751
|
V8_INLINE static SharedArrayBuffer* Cast(Value* obj);
|
5171
5752
|
|
5172
5753
|
static const int kInternalFieldCount = V8_ARRAY_BUFFER_INTERNAL_FIELD_COUNT;
|
@@ -5174,6 +5755,7 @@ class V8_EXPORT SharedArrayBuffer : public Object {
|
|
5174
5755
|
private:
|
5175
5756
|
SharedArrayBuffer();
|
5176
5757
|
static void CheckCast(Value* obj);
|
5758
|
+
Contents GetContents(bool externalize);
|
5177
5759
|
};
|
5178
5760
|
|
5179
5761
|
|
@@ -5193,20 +5775,6 @@ class V8_EXPORT Date : public Object {
|
|
5193
5775
|
|
5194
5776
|
V8_INLINE static Date* Cast(Value* obj);
|
5195
5777
|
|
5196
|
-
/**
|
5197
|
-
* Notification that the embedder has changed the time zone,
|
5198
|
-
* daylight savings time, or other date / time configuration
|
5199
|
-
* parameters. V8 keeps a cache of various values used for
|
5200
|
-
* date / time computation. This notification will reset
|
5201
|
-
* those cached values for the current context so that date /
|
5202
|
-
* time configuration changes would be reflected in the Date
|
5203
|
-
* object.
|
5204
|
-
*
|
5205
|
-
* This API should not be called more than needed as it will
|
5206
|
-
* negatively impact the performance of date operations.
|
5207
|
-
*/
|
5208
|
-
static void DateTimeConfigurationChangeNotification(Isolate* isolate);
|
5209
|
-
|
5210
5778
|
private:
|
5211
5779
|
static void CheckCast(Value* obj);
|
5212
5780
|
};
|
@@ -5309,6 +5877,8 @@ class V8_EXPORT RegExp : public Object {
|
|
5309
5877
|
kDotAll = 1 << 5,
|
5310
5878
|
};
|
5311
5879
|
|
5880
|
+
static constexpr int kFlagCount = 6;
|
5881
|
+
|
5312
5882
|
/**
|
5313
5883
|
* Creates a regular expression from the given pattern string and
|
5314
5884
|
* the flags bit field. May throw a JavaScript exception as
|
@@ -5323,6 +5893,29 @@ class V8_EXPORT RegExp : public Object {
|
|
5323
5893
|
Local<String> pattern,
|
5324
5894
|
Flags flags);
|
5325
5895
|
|
5896
|
+
/**
|
5897
|
+
* Like New, but additionally specifies a backtrack limit. If the number of
|
5898
|
+
* backtracks done in one Exec call hits the limit, a match failure is
|
5899
|
+
* immediately returned.
|
5900
|
+
*/
|
5901
|
+
static V8_WARN_UNUSED_RESULT MaybeLocal<RegExp> NewWithBacktrackLimit(
|
5902
|
+
Local<Context> context, Local<String> pattern, Flags flags,
|
5903
|
+
uint32_t backtrack_limit);
|
5904
|
+
|
5905
|
+
/**
|
5906
|
+
* Executes the current RegExp instance on the given subject string.
|
5907
|
+
* Equivalent to RegExp.prototype.exec as described in
|
5908
|
+
*
|
5909
|
+
* https://tc39.es/ecma262/#sec-regexp.prototype.exec
|
5910
|
+
*
|
5911
|
+
* On success, an Array containing the matched strings is returned. On
|
5912
|
+
* failure, returns Null.
|
5913
|
+
*
|
5914
|
+
* Note: modifies global context state, accessible e.g. through RegExp.input.
|
5915
|
+
*/
|
5916
|
+
V8_WARN_UNUSED_RESULT MaybeLocal<Object> Exec(Local<Context> context,
|
5917
|
+
Local<String> subject);
|
5918
|
+
|
5326
5919
|
/**
|
5327
5920
|
* Returns the value of the source property: a string representing
|
5328
5921
|
* the regular expression.
|
@@ -5340,7 +5933,6 @@ class V8_EXPORT RegExp : public Object {
|
|
5340
5933
|
static void CheckCast(Value* obj);
|
5341
5934
|
};
|
5342
5935
|
|
5343
|
-
|
5344
5936
|
/**
|
5345
5937
|
* A JavaScript value that wraps a C++ void*. This type of value is mainly used
|
5346
5938
|
* to associate C++ data structures with JavaScript objects.
|
@@ -5354,13 +5946,14 @@ class V8_EXPORT External : public Value {
|
|
5354
5946
|
static void CheckCast(v8::Value* obj);
|
5355
5947
|
};
|
5356
5948
|
|
5357
|
-
#define V8_INTRINSICS_LIST(F)
|
5358
|
-
F(ArrayProto_entries, array_entries_iterator)
|
5359
|
-
F(ArrayProto_forEach, array_for_each_iterator)
|
5360
|
-
F(ArrayProto_keys, array_keys_iterator)
|
5361
|
-
F(ArrayProto_values, array_values_iterator)
|
5362
|
-
F(ErrorPrototype, initial_error_prototype)
|
5363
|
-
F(IteratorPrototype, initial_iterator_prototype)
|
5949
|
+
#define V8_INTRINSICS_LIST(F) \
|
5950
|
+
F(ArrayProto_entries, array_entries_iterator) \
|
5951
|
+
F(ArrayProto_forEach, array_for_each_iterator) \
|
5952
|
+
F(ArrayProto_keys, array_keys_iterator) \
|
5953
|
+
F(ArrayProto_values, array_values_iterator) \
|
5954
|
+
F(ErrorPrototype, initial_error_prototype) \
|
5955
|
+
F(IteratorPrototype, initial_iterator_prototype) \
|
5956
|
+
F(ObjProto_valueOf, object_value_of_function)
|
5364
5957
|
|
5365
5958
|
enum Intrinsic {
|
5366
5959
|
#define V8_DECL_INTRINSIC(name, iname) k##name,
|
@@ -5706,6 +6299,7 @@ typedef bool (*AccessCheckCallback)(Local<Context> accessing_context,
|
|
5706
6299
|
Local<Object> accessed_object,
|
5707
6300
|
Local<Value> data);
|
5708
6301
|
|
6302
|
+
class CFunction;
|
5709
6303
|
/**
|
5710
6304
|
* A FunctionTemplate is used to create functions at runtime. There
|
5711
6305
|
* can only be one function created from a FunctionTemplate in a
|
@@ -5741,11 +6335,12 @@ typedef bool (*AccessCheckCallback)(Local<Context> accessing_context,
|
|
5741
6335
|
* proto_t->Set(isolate, "proto_const", v8::Number::New(isolate, 2));
|
5742
6336
|
*
|
5743
6337
|
* v8::Local<v8::ObjectTemplate> instance_t = t->InstanceTemplate();
|
5744
|
-
* instance_t->SetAccessor(
|
5745
|
-
|
6338
|
+
* instance_t->SetAccessor(
|
6339
|
+
String::NewFromUtf8Literal(isolate, "instance_accessor"),
|
6340
|
+
* InstanceAccessorCallback);
|
5746
6341
|
* instance_t->SetHandler(
|
5747
6342
|
* NamedPropertyHandlerConfiguration(PropertyHandlerCallback));
|
5748
|
-
* instance_t->Set(String::
|
6343
|
+
* instance_t->Set(String::NewFromUtf8Literal(isolate, "instance_property"),
|
5749
6344
|
* Number::New(isolate, 3));
|
5750
6345
|
*
|
5751
6346
|
* v8::Local<v8::Function> function = t->GetFunction();
|
@@ -5805,6 +6400,12 @@ typedef bool (*AccessCheckCallback)(Local<Context> accessing_context,
|
|
5805
6400
|
* child_instance.instance_accessor calls 'InstanceAccessorCallback'
|
5806
6401
|
* child_instance.instance_property == 3;
|
5807
6402
|
* \endcode
|
6403
|
+
*
|
6404
|
+
* The additional 'c_function' parameter refers to a fast API call, which
|
6405
|
+
* must not trigger GC or JavaScript execution, or call into V8 in other
|
6406
|
+
* ways. For more information how to define them, see
|
6407
|
+
* include/v8-fast-api-calls.h. Please note that this feature is still
|
6408
|
+
* experimental.
|
5808
6409
|
*/
|
5809
6410
|
class V8_EXPORT FunctionTemplate : public Template {
|
5810
6411
|
public:
|
@@ -5814,11 +6415,8 @@ class V8_EXPORT FunctionTemplate : public Template {
|
|
5814
6415
|
Local<Value> data = Local<Value>(),
|
5815
6416
|
Local<Signature> signature = Local<Signature>(), int length = 0,
|
5816
6417
|
ConstructorBehavior behavior = ConstructorBehavior::kAllow,
|
5817
|
-
SideEffectType side_effect_type = SideEffectType::kHasSideEffect
|
5818
|
-
|
5819
|
-
/** Get a template included in the snapshot by index. */
|
5820
|
-
static MaybeLocal<FunctionTemplate> FromSnapshot(Isolate* isolate,
|
5821
|
-
size_t index);
|
6418
|
+
SideEffectType side_effect_type = SideEffectType::kHasSideEffect,
|
6419
|
+
const CFunction* c_function = nullptr);
|
5822
6420
|
|
5823
6421
|
/**
|
5824
6422
|
* Creates a function template backed/cached by a private property.
|
@@ -5830,7 +6428,6 @@ class V8_EXPORT FunctionTemplate : public Template {
|
|
5830
6428
|
SideEffectType side_effect_type = SideEffectType::kHasSideEffect);
|
5831
6429
|
|
5832
6430
|
/** Returns the unique function instance in the current execution context.*/
|
5833
|
-
V8_DEPRECATED("Use maybe version", Local<Function> GetFunction());
|
5834
6431
|
V8_WARN_UNUSED_RESULT MaybeLocal<Function> GetFunction(
|
5835
6432
|
Local<Context> context);
|
5836
6433
|
|
@@ -5846,11 +6443,13 @@ class V8_EXPORT FunctionTemplate : public Template {
|
|
5846
6443
|
/**
|
5847
6444
|
* Set the call-handler callback for a FunctionTemplate. This
|
5848
6445
|
* callback is called whenever the function created from this
|
5849
|
-
* FunctionTemplate is called.
|
6446
|
+
* FunctionTemplate is called. The 'c_function' represents a fast
|
6447
|
+
* API call, see the comment above the class declaration.
|
5850
6448
|
*/
|
5851
6449
|
void SetCallHandler(
|
5852
6450
|
FunctionCallback callback, Local<Value> data = Local<Value>(),
|
5853
|
-
SideEffectType side_effect_type = SideEffectType::kHasSideEffect
|
6451
|
+
SideEffectType side_effect_type = SideEffectType::kHasSideEffect,
|
6452
|
+
const CFunction* c_function = nullptr);
|
5854
6453
|
|
5855
6454
|
/** Set the predefined length property for the FunctionTemplate. */
|
5856
6455
|
void SetLength(int length);
|
@@ -5893,20 +6492,6 @@ class V8_EXPORT FunctionTemplate : public Template {
|
|
5893
6492
|
*/
|
5894
6493
|
void SetAcceptAnyReceiver(bool value);
|
5895
6494
|
|
5896
|
-
/**
|
5897
|
-
* Determines whether the __proto__ accessor ignores instances of
|
5898
|
-
* the function template. If instances of the function template are
|
5899
|
-
* ignored, __proto__ skips all instances and instead returns the
|
5900
|
-
* next object in the prototype chain.
|
5901
|
-
*
|
5902
|
-
* Call with a value of true to make the __proto__ accessor ignore
|
5903
|
-
* instances of the function template. Call with a value of false
|
5904
|
-
* to make the __proto__ accessor not ignore instances of the
|
5905
|
-
* function template. By default, instances of a function template
|
5906
|
-
* are not ignored.
|
5907
|
-
*/
|
5908
|
-
void SetHiddenPrototype(bool value);
|
5909
|
-
|
5910
6495
|
/**
|
5911
6496
|
* Sets the ReadOnly flag in the attributes of the 'prototype' property
|
5912
6497
|
* of functions created from this FunctionTemplate to true.
|
@@ -6122,12 +6707,7 @@ class V8_EXPORT ObjectTemplate : public Template {
|
|
6122
6707
|
Isolate* isolate,
|
6123
6708
|
Local<FunctionTemplate> constructor = Local<FunctionTemplate>());
|
6124
6709
|
|
6125
|
-
/** Get a template included in the snapshot by index. */
|
6126
|
-
static MaybeLocal<ObjectTemplate> FromSnapshot(Isolate* isolate,
|
6127
|
-
size_t index);
|
6128
|
-
|
6129
6710
|
/** Creates a new instance of this template.*/
|
6130
|
-
V8_DEPRECATED("Use maybe version", Local<Object> NewInstance());
|
6131
6711
|
V8_WARN_UNUSED_RESULT MaybeLocal<Object> NewInstance(Local<Context> context);
|
6132
6712
|
|
6133
6713
|
/**
|
@@ -6347,20 +6927,6 @@ class V8_EXPORT AccessorSignature : public Data {
|
|
6347
6927
|
|
6348
6928
|
|
6349
6929
|
// --- Extensions ---
|
6350
|
-
V8_DEPRECATED("Implementation detail", class)
|
6351
|
-
V8_EXPORT ExternalOneByteStringResourceImpl
|
6352
|
-
: public String::ExternalOneByteStringResource {
|
6353
|
-
public:
|
6354
|
-
ExternalOneByteStringResourceImpl() : data_(nullptr), length_(0) {}
|
6355
|
-
ExternalOneByteStringResourceImpl(const char* data, size_t length)
|
6356
|
-
: data_(data), length_(length) {}
|
6357
|
-
const char* data() const override { return data_; }
|
6358
|
-
size_t length() const override { return length_; }
|
6359
|
-
|
6360
|
-
private:
|
6361
|
-
const char* data_;
|
6362
|
-
size_t length_;
|
6363
|
-
};
|
6364
6930
|
|
6365
6931
|
/**
|
6366
6932
|
* Ignore
|
@@ -6382,8 +6948,8 @@ class V8_EXPORT Extension { // NOLINT
|
|
6382
6948
|
const String::ExternalOneByteStringResource* source() const {
|
6383
6949
|
return source_;
|
6384
6950
|
}
|
6385
|
-
int dependency_count() { return dep_count_; }
|
6386
|
-
const char** dependencies() { return deps_; }
|
6951
|
+
int dependency_count() const { return dep_count_; }
|
6952
|
+
const char** dependencies() const { return deps_; }
|
6387
6953
|
void set_auto_enable(bool value) { auto_enable_ = value; }
|
6388
6954
|
bool auto_enable() { return auto_enable_; }
|
6389
6955
|
|
@@ -6400,9 +6966,7 @@ class V8_EXPORT Extension { // NOLINT
|
|
6400
6966
|
bool auto_enable_;
|
6401
6967
|
};
|
6402
6968
|
|
6403
|
-
|
6404
|
-
void V8_EXPORT RegisterExtension(Extension* extension);
|
6405
|
-
|
6969
|
+
void V8_EXPORT RegisterExtension(std::unique_ptr<Extension>);
|
6406
6970
|
|
6407
6971
|
// --- Statics ---
|
6408
6972
|
|
@@ -6427,7 +6991,26 @@ V8_INLINE Local<Boolean> False(Isolate* isolate);
|
|
6427
6991
|
*/
|
6428
6992
|
class V8_EXPORT ResourceConstraints {
|
6429
6993
|
public:
|
6430
|
-
|
6994
|
+
/**
|
6995
|
+
* Configures the constraints with reasonable default values based on the
|
6996
|
+
* provided heap size limit. The heap size includes both the young and
|
6997
|
+
* the old generation.
|
6998
|
+
*
|
6999
|
+
* \param initial_heap_size_in_bytes The initial heap size or zero.
|
7000
|
+
* By default V8 starts with a small heap and dynamically grows it to
|
7001
|
+
* match the set of live objects. This may lead to ineffective
|
7002
|
+
* garbage collections at startup if the live set is large.
|
7003
|
+
* Setting the initial heap size avoids such garbage collections.
|
7004
|
+
* Note that this does not affect young generation garbage collections.
|
7005
|
+
*
|
7006
|
+
* \param maximum_heap_size_in_bytes The hard limit for the heap size.
|
7007
|
+
* When the heap size approaches this limit, V8 will perform series of
|
7008
|
+
* garbage collections and invoke the NearHeapLimitCallback. If the garbage
|
7009
|
+
* collections do not help and the callback does not increase the limit,
|
7010
|
+
* then V8 will crash with V8::FatalProcessOutOfMemory.
|
7011
|
+
*/
|
7012
|
+
void ConfigureDefaultsFromHeapSize(size_t initial_heap_size_in_bytes,
|
7013
|
+
size_t maximum_heap_size_in_bytes);
|
6431
7014
|
|
6432
7015
|
/**
|
6433
7016
|
* Configures the constraints with reasonable default values based on the
|
@@ -6441,39 +7024,92 @@ class V8_EXPORT ResourceConstraints {
|
|
6441
7024
|
void ConfigureDefaults(uint64_t physical_memory,
|
6442
7025
|
uint64_t virtual_memory_limit);
|
6443
7026
|
|
6444
|
-
|
6445
|
-
|
6446
|
-
|
7027
|
+
/**
|
7028
|
+
* The address beyond which the VM's stack may not grow.
|
7029
|
+
*/
|
7030
|
+
uint32_t* stack_limit() const { return stack_limit_; }
|
7031
|
+
void set_stack_limit(uint32_t* value) { stack_limit_ = value; }
|
7032
|
+
|
7033
|
+
/**
|
7034
|
+
* The amount of virtual memory reserved for generated code. This is relevant
|
7035
|
+
* for 64-bit architectures that rely on code range for calls in code.
|
7036
|
+
*/
|
7037
|
+
size_t code_range_size_in_bytes() const { return code_range_size_; }
|
7038
|
+
void set_code_range_size_in_bytes(size_t limit) { code_range_size_ = limit; }
|
7039
|
+
|
7040
|
+
/**
|
7041
|
+
* The maximum size of the old generation.
|
7042
|
+
* When the old generation approaches this limit, V8 will perform series of
|
7043
|
+
* garbage collections and invoke the NearHeapLimitCallback.
|
7044
|
+
* If the garbage collections do not help and the callback does not
|
7045
|
+
* increase the limit, then V8 will crash with V8::FatalProcessOutOfMemory.
|
7046
|
+
*/
|
7047
|
+
size_t max_old_generation_size_in_bytes() const {
|
7048
|
+
return max_old_generation_size_;
|
7049
|
+
}
|
7050
|
+
void set_max_old_generation_size_in_bytes(size_t limit) {
|
7051
|
+
max_old_generation_size_ = limit;
|
7052
|
+
}
|
7053
|
+
|
7054
|
+
/**
|
7055
|
+
* The maximum size of the young generation, which consists of two semi-spaces
|
7056
|
+
* and a large object space. This affects frequency of Scavenge garbage
|
7057
|
+
* collections and should be typically much smaller that the old generation.
|
7058
|
+
*/
|
7059
|
+
size_t max_young_generation_size_in_bytes() const {
|
7060
|
+
return max_young_generation_size_;
|
7061
|
+
}
|
7062
|
+
void set_max_young_generation_size_in_bytes(size_t limit) {
|
7063
|
+
max_young_generation_size_ = limit;
|
6447
7064
|
}
|
6448
7065
|
|
6449
|
-
|
6450
|
-
|
6451
|
-
|
7066
|
+
size_t initial_old_generation_size_in_bytes() const {
|
7067
|
+
return initial_old_generation_size_;
|
7068
|
+
}
|
7069
|
+
void set_initial_old_generation_size_in_bytes(size_t initial_size) {
|
7070
|
+
initial_old_generation_size_ = initial_size;
|
6452
7071
|
}
|
6453
7072
|
|
6454
|
-
size_t
|
6455
|
-
|
6456
|
-
max_old_space_size_ = limit_in_mb;
|
7073
|
+
size_t initial_young_generation_size_in_bytes() const {
|
7074
|
+
return initial_young_generation_size_;
|
6457
7075
|
}
|
6458
|
-
|
6459
|
-
|
6460
|
-
|
6461
|
-
|
7076
|
+
void set_initial_young_generation_size_in_bytes(size_t initial_size) {
|
7077
|
+
initial_young_generation_size_ = initial_size;
|
7078
|
+
}
|
7079
|
+
|
7080
|
+
/**
|
7081
|
+
* Deprecated functions. Do not use in new code.
|
7082
|
+
*/
|
7083
|
+
V8_DEPRECATE_SOON("Use code_range_size_in_bytes.")
|
7084
|
+
size_t code_range_size() const { return code_range_size_ / kMB; }
|
7085
|
+
V8_DEPRECATE_SOON("Use set_code_range_size_in_bytes.")
|
6462
7086
|
void set_code_range_size(size_t limit_in_mb) {
|
6463
|
-
code_range_size_ = limit_in_mb;
|
7087
|
+
code_range_size_ = limit_in_mb * kMB;
|
6464
7088
|
}
|
7089
|
+
V8_DEPRECATE_SOON("Use max_young_generation_size_in_bytes.")
|
7090
|
+
size_t max_semi_space_size_in_kb() const;
|
7091
|
+
V8_DEPRECATE_SOON("Use set_max_young_generation_size_in_bytes.")
|
7092
|
+
void set_max_semi_space_size_in_kb(size_t limit_in_kb);
|
7093
|
+
V8_DEPRECATE_SOON("Use max_old_generation_size_in_bytes.")
|
7094
|
+
size_t max_old_space_size() const { return max_old_generation_size_ / kMB; }
|
7095
|
+
V8_DEPRECATE_SOON("Use set_max_old_generation_size_in_bytes.")
|
7096
|
+
void set_max_old_space_size(size_t limit_in_mb) {
|
7097
|
+
max_old_generation_size_ = limit_in_mb * kMB;
|
7098
|
+
}
|
7099
|
+
V8_DEPRECATE_SOON("Zone does not pool memory any more.")
|
6465
7100
|
size_t max_zone_pool_size() const { return max_zone_pool_size_; }
|
7101
|
+
V8_DEPRECATE_SOON("Zone does not pool memory any more.")
|
6466
7102
|
void set_max_zone_pool_size(size_t bytes) { max_zone_pool_size_ = bytes; }
|
6467
7103
|
|
6468
7104
|
private:
|
6469
|
-
|
6470
|
-
size_t
|
6471
|
-
|
6472
|
-
|
6473
|
-
size_t
|
6474
|
-
|
6475
|
-
size_t
|
6476
|
-
|
7105
|
+
static constexpr size_t kMB = 1048576u;
|
7106
|
+
size_t code_range_size_ = 0;
|
7107
|
+
size_t max_old_generation_size_ = 0;
|
7108
|
+
size_t max_young_generation_size_ = 0;
|
7109
|
+
size_t max_zone_pool_size_ = 0;
|
7110
|
+
size_t initial_old_generation_size_ = 0;
|
7111
|
+
size_t initial_young_generation_size_ = 0;
|
7112
|
+
uint32_t* stack_limit_ = nullptr;
|
6477
7113
|
};
|
6478
7114
|
|
6479
7115
|
|
@@ -6503,6 +7139,9 @@ class V8_EXPORT Exception {
|
|
6503
7139
|
static Local<Value> ReferenceError(Local<String> message);
|
6504
7140
|
static Local<Value> SyntaxError(Local<String> message);
|
6505
7141
|
static Local<Value> TypeError(Local<String> message);
|
7142
|
+
static Local<Value> WasmCompileError(Local<String> message);
|
7143
|
+
static Local<Value> WasmLinkError(Local<String> message);
|
7144
|
+
static Local<Value> WasmRuntimeError(Local<String> message);
|
6506
7145
|
static Local<Value> Error(Local<String> message);
|
6507
7146
|
|
6508
7147
|
/**
|
@@ -6531,6 +7170,17 @@ typedef void* (*CreateHistogramCallback)(const char* name,
|
|
6531
7170
|
|
6532
7171
|
typedef void (*AddHistogramSampleCallback)(void* histogram, int sample);
|
6533
7172
|
|
7173
|
+
// --- Crashkeys Callback ---
|
7174
|
+
enum class CrashKeyId {
|
7175
|
+
kIsolateAddress,
|
7176
|
+
kReadonlySpaceFirstPageAddress,
|
7177
|
+
kMapSpaceFirstPageAddress,
|
7178
|
+
kCodeSpaceFirstPageAddress,
|
7179
|
+
kDumpType,
|
7180
|
+
};
|
7181
|
+
|
7182
|
+
typedef void (*AddCrashKeyCallback)(CrashKeyId id, const std::string& value);
|
7183
|
+
|
6534
7184
|
// --- Enter/Leave Script Callback ---
|
6535
7185
|
typedef void (*BeforeCallEnteredCallback)(Isolate*);
|
6536
7186
|
typedef void (*CallCompletedCallback)(Isolate*);
|
@@ -6578,7 +7228,7 @@ typedef void (*HostInitializeImportMetaObjectCallback)(Local<Context> context,
|
|
6578
7228
|
* first accessed. The return value will be used as the stack value. If this
|
6579
7229
|
* callback is registed, the |Error.prepareStackTrace| API will be disabled.
|
6580
7230
|
* |sites| is an array of call sites, specified in
|
6581
|
-
* https://
|
7231
|
+
* https://v8.dev/docs/stack-trace-api
|
6582
7232
|
*/
|
6583
7233
|
typedef MaybeLocal<Value> (*PrepareStackTraceCallback)(Local<Context> context,
|
6584
7234
|
Local<Value> error,
|
@@ -6616,11 +7266,8 @@ enum PromiseRejectEvent {
|
|
6616
7266
|
class PromiseRejectMessage {
|
6617
7267
|
public:
|
6618
7268
|
PromiseRejectMessage(Local<Promise> promise, PromiseRejectEvent event,
|
6619
|
-
Local<Value> value
|
6620
|
-
: promise_(promise),
|
6621
|
-
event_(event),
|
6622
|
-
value_(value),
|
6623
|
-
stack_trace_(stack_trace) {}
|
7269
|
+
Local<Value> value)
|
7270
|
+
: promise_(promise), event_(event), value_(value) {}
|
6624
7271
|
|
6625
7272
|
V8_INLINE Local<Promise> GetPromise() const { return promise_; }
|
6626
7273
|
V8_INLINE PromiseRejectEvent GetEvent() const { return event_; }
|
@@ -6630,28 +7277,111 @@ class PromiseRejectMessage {
|
|
6630
7277
|
Local<Promise> promise_;
|
6631
7278
|
PromiseRejectEvent event_;
|
6632
7279
|
Local<Value> value_;
|
6633
|
-
Local<StackTrace> stack_trace_;
|
6634
7280
|
};
|
6635
7281
|
|
6636
7282
|
typedef void (*PromiseRejectCallback)(PromiseRejectMessage message);
|
6637
7283
|
|
6638
7284
|
// --- Microtasks Callbacks ---
|
7285
|
+
V8_DEPRECATE_SOON("Use *WithData version.")
|
6639
7286
|
typedef void (*MicrotasksCompletedCallback)(Isolate*);
|
7287
|
+
typedef void (*MicrotasksCompletedCallbackWithData)(Isolate*, void*);
|
6640
7288
|
typedef void (*MicrotaskCallback)(void* data);
|
6641
7289
|
|
6642
|
-
|
6643
7290
|
/**
|
6644
7291
|
* Policy for running microtasks:
|
6645
|
-
* - explicit: microtasks are invoked with
|
7292
|
+
* - explicit: microtasks are invoked with the
|
7293
|
+
* Isolate::PerformMicrotaskCheckpoint() method;
|
6646
7294
|
* - scoped: microtasks invocation is controlled by MicrotasksScope objects;
|
6647
7295
|
* - auto: microtasks are invoked when the script call depth decrements
|
6648
7296
|
* to zero.
|
6649
7297
|
*/
|
6650
7298
|
enum class MicrotasksPolicy { kExplicit, kScoped, kAuto };
|
6651
7299
|
|
7300
|
+
/**
|
7301
|
+
* Represents the microtask queue, where microtasks are stored and processed.
|
7302
|
+
* https://html.spec.whatwg.org/multipage/webappapis.html#microtask-queue
|
7303
|
+
* https://html.spec.whatwg.org/multipage/webappapis.html#enqueuejob(queuename,-job,-arguments)
|
7304
|
+
* https://html.spec.whatwg.org/multipage/webappapis.html#perform-a-microtask-checkpoint
|
7305
|
+
*
|
7306
|
+
* A MicrotaskQueue instance may be associated to multiple Contexts by passing
|
7307
|
+
* it to Context::New(), and they can be detached by Context::DetachGlobal().
|
7308
|
+
* The embedder must keep the MicrotaskQueue instance alive until all associated
|
7309
|
+
* Contexts are gone or detached.
|
7310
|
+
*
|
7311
|
+
* Use the same instance of MicrotaskQueue for all Contexts that may access each
|
7312
|
+
* other synchronously. E.g. for Web embedding, use the same instance for all
|
7313
|
+
* origins that share the same URL scheme and eTLD+1.
|
7314
|
+
*/
|
7315
|
+
class V8_EXPORT MicrotaskQueue {
|
7316
|
+
public:
|
7317
|
+
/**
|
7318
|
+
* Creates an empty MicrotaskQueue instance.
|
7319
|
+
*/
|
7320
|
+
static std::unique_ptr<MicrotaskQueue> New(
|
7321
|
+
Isolate* isolate, MicrotasksPolicy policy = MicrotasksPolicy::kAuto);
|
7322
|
+
|
7323
|
+
virtual ~MicrotaskQueue() = default;
|
7324
|
+
|
7325
|
+
/**
|
7326
|
+
* Enqueues the callback to the queue.
|
7327
|
+
*/
|
7328
|
+
virtual void EnqueueMicrotask(Isolate* isolate,
|
7329
|
+
Local<Function> microtask) = 0;
|
7330
|
+
|
7331
|
+
/**
|
7332
|
+
* Enqueues the callback to the queue.
|
7333
|
+
*/
|
7334
|
+
virtual void EnqueueMicrotask(v8::Isolate* isolate,
|
7335
|
+
MicrotaskCallback callback,
|
7336
|
+
void* data = nullptr) = 0;
|
7337
|
+
|
7338
|
+
/**
|
7339
|
+
* Adds a callback to notify the embedder after microtasks were run. The
|
7340
|
+
* callback is triggered by explicit RunMicrotasks call or automatic
|
7341
|
+
* microtasks execution (see Isolate::SetMicrotasksPolicy).
|
7342
|
+
*
|
7343
|
+
* Callback will trigger even if microtasks were attempted to run,
|
7344
|
+
* but the microtasks queue was empty and no single microtask was actually
|
7345
|
+
* executed.
|
7346
|
+
*
|
7347
|
+
* Executing scripts inside the callback will not re-trigger microtasks and
|
7348
|
+
* the callback.
|
7349
|
+
*/
|
7350
|
+
virtual void AddMicrotasksCompletedCallback(
|
7351
|
+
MicrotasksCompletedCallbackWithData callback, void* data = nullptr) = 0;
|
7352
|
+
|
7353
|
+
/**
|
7354
|
+
* Removes callback that was installed by AddMicrotasksCompletedCallback.
|
7355
|
+
*/
|
7356
|
+
virtual void RemoveMicrotasksCompletedCallback(
|
7357
|
+
MicrotasksCompletedCallbackWithData callback, void* data = nullptr) = 0;
|
7358
|
+
|
7359
|
+
/**
|
7360
|
+
* Runs microtasks if no microtask is running on this MicrotaskQueue instance.
|
7361
|
+
*/
|
7362
|
+
virtual void PerformCheckpoint(Isolate* isolate) = 0;
|
7363
|
+
|
7364
|
+
/**
|
7365
|
+
* Returns true if a microtask is running on this MicrotaskQueue instance.
|
7366
|
+
*/
|
7367
|
+
virtual bool IsRunningMicrotasks() const = 0;
|
7368
|
+
|
7369
|
+
/**
|
7370
|
+
* Returns the current depth of nested MicrotasksScope that has
|
7371
|
+
* kRunMicrotasks.
|
7372
|
+
*/
|
7373
|
+
virtual int GetMicrotasksScopeDepth() const = 0;
|
7374
|
+
|
7375
|
+
MicrotaskQueue(const MicrotaskQueue&) = delete;
|
7376
|
+
MicrotaskQueue& operator=(const MicrotaskQueue&) = delete;
|
7377
|
+
|
7378
|
+
private:
|
7379
|
+
friend class internal::MicrotaskQueue;
|
7380
|
+
MicrotaskQueue() = default;
|
7381
|
+
};
|
6652
7382
|
|
6653
7383
|
/**
|
6654
|
-
* This scope is used to control microtasks when
|
7384
|
+
* This scope is used to control microtasks when MicrotasksPolicy::kScoped
|
6655
7385
|
* is used on Isolate. In this mode every non-primitive call to V8 should be
|
6656
7386
|
* done inside some MicrotasksScope.
|
6657
7387
|
* Microtasks are executed when topmost MicrotasksScope marked as kRunMicrotasks
|
@@ -6664,6 +7394,7 @@ class V8_EXPORT MicrotasksScope {
|
|
6664
7394
|
enum Type { kRunMicrotasks, kDoNotRunMicrotasks };
|
6665
7395
|
|
6666
7396
|
MicrotasksScope(Isolate* isolate, Type type);
|
7397
|
+
MicrotasksScope(Isolate* isolate, MicrotaskQueue* microtask_queue, Type type);
|
6667
7398
|
~MicrotasksScope();
|
6668
7399
|
|
6669
7400
|
/**
|
@@ -6687,6 +7418,7 @@ class V8_EXPORT MicrotasksScope {
|
|
6687
7418
|
|
6688
7419
|
private:
|
6689
7420
|
internal::Isolate* const isolate_;
|
7421
|
+
internal::MicrotaskQueue* const microtask_queue_;
|
6690
7422
|
bool run_;
|
6691
7423
|
};
|
6692
7424
|
|
@@ -6705,6 +7437,23 @@ typedef void (*FailedAccessCheckCallback)(Local<Object> target,
|
|
6705
7437
|
typedef bool (*AllowCodeGenerationFromStringsCallback)(Local<Context> context,
|
6706
7438
|
Local<String> source);
|
6707
7439
|
|
7440
|
+
struct ModifyCodeGenerationFromStringsResult {
|
7441
|
+
// If true, proceed with the codegen algorithm. Otherwise, block it.
|
7442
|
+
bool codegen_allowed = false;
|
7443
|
+
// Overwrite the original source with this string, if present.
|
7444
|
+
// Use the original source if empty.
|
7445
|
+
// This field is considered only if codegen_allowed is true.
|
7446
|
+
MaybeLocal<String> modified_source;
|
7447
|
+
};
|
7448
|
+
|
7449
|
+
/**
|
7450
|
+
* Callback to check if codegen is allowed from a source object, and convert
|
7451
|
+
* the source to string if necessary.See ModifyCodeGenerationFromStrings.
|
7452
|
+
*/
|
7453
|
+
typedef ModifyCodeGenerationFromStringsResult (
|
7454
|
+
*ModifyCodeGenerationFromStringsCallback)(Local<Context> context,
|
7455
|
+
Local<Value> source);
|
7456
|
+
|
6708
7457
|
// --- WebAssembly compilation callbacks ---
|
6709
7458
|
typedef bool (*ExtensionCallback)(const FunctionCallbackInfo<Value>&);
|
6710
7459
|
|
@@ -6721,6 +7470,10 @@ typedef void (*WasmStreamingCallback)(const FunctionCallbackInfo<Value>&);
|
|
6721
7470
|
// --- Callback for checking if WebAssembly threads are enabled ---
|
6722
7471
|
typedef bool (*WasmThreadsEnabledCallback)(Local<Context> context);
|
6723
7472
|
|
7473
|
+
// --- Callback for loading source map file for Wasm profiling support
|
7474
|
+
typedef Local<String> (*WasmLoadSourceMapCallback)(Isolate* isolate,
|
7475
|
+
const char* name);
|
7476
|
+
|
6724
7477
|
// --- Garbage Collection Callbacks ---
|
6725
7478
|
|
6726
7479
|
/**
|
@@ -6777,10 +7530,33 @@ typedef void (*InterruptCallback)(Isolate* isolate, void* data);
|
|
6777
7530
|
typedef size_t (*NearHeapLimitCallback)(void* data, size_t current_heap_limit,
|
6778
7531
|
size_t initial_heap_limit);
|
6779
7532
|
|
7533
|
+
/**
|
7534
|
+
* Collection of shared per-process V8 memory information.
|
7535
|
+
*
|
7536
|
+
* Instances of this class can be passed to
|
7537
|
+
* v8::V8::GetSharedMemoryStatistics to get shared memory statistics from V8.
|
7538
|
+
*/
|
7539
|
+
class V8_EXPORT SharedMemoryStatistics {
|
7540
|
+
public:
|
7541
|
+
SharedMemoryStatistics();
|
7542
|
+
size_t read_only_space_size() { return read_only_space_size_; }
|
7543
|
+
size_t read_only_space_used_size() { return read_only_space_used_size_; }
|
7544
|
+
size_t read_only_space_physical_size() {
|
7545
|
+
return read_only_space_physical_size_;
|
7546
|
+
}
|
7547
|
+
|
7548
|
+
private:
|
7549
|
+
size_t read_only_space_size_;
|
7550
|
+
size_t read_only_space_used_size_;
|
7551
|
+
size_t read_only_space_physical_size_;
|
7552
|
+
|
7553
|
+
friend class V8;
|
7554
|
+
};
|
7555
|
+
|
6780
7556
|
/**
|
6781
7557
|
* Collection of V8 heap information.
|
6782
7558
|
*
|
6783
|
-
* Instances of this class can be passed to v8::
|
7559
|
+
* Instances of this class can be passed to v8::Isolate::GetHeapStatistics to
|
6784
7560
|
* get heap statistics from V8.
|
6785
7561
|
*/
|
6786
7562
|
class V8_EXPORT HeapStatistics {
|
@@ -6790,6 +7566,8 @@ class V8_EXPORT HeapStatistics {
|
|
6790
7566
|
size_t total_heap_size_executable() { return total_heap_size_executable_; }
|
6791
7567
|
size_t total_physical_size() { return total_physical_size_; }
|
6792
7568
|
size_t total_available_size() { return total_available_size_; }
|
7569
|
+
size_t total_global_handles_size() { return total_global_handles_size_; }
|
7570
|
+
size_t used_global_handles_size() { return used_global_handles_size_; }
|
6793
7571
|
size_t used_heap_size() { return used_heap_size_; }
|
6794
7572
|
size_t heap_size_limit() { return heap_size_limit_; }
|
6795
7573
|
size_t malloced_memory() { return malloced_memory_; }
|
@@ -6817,6 +7595,8 @@ class V8_EXPORT HeapStatistics {
|
|
6817
7595
|
bool does_zap_garbage_;
|
6818
7596
|
size_t number_of_native_contexts_;
|
6819
7597
|
size_t number_of_detached_contexts_;
|
7598
|
+
size_t total_global_handles_size_;
|
7599
|
+
size_t used_global_handles_size_;
|
6820
7600
|
|
6821
7601
|
friend class V8;
|
6822
7602
|
friend class Isolate;
|
@@ -6875,8 +7655,6 @@ class V8_EXPORT HeapCodeStatistics {
|
|
6875
7655
|
friend class Isolate;
|
6876
7656
|
};
|
6877
7657
|
|
6878
|
-
class RetainedObjectInfo;
|
6879
|
-
|
6880
7658
|
/**
|
6881
7659
|
* A JIT code event is issued each time code is added, moved or removed.
|
6882
7660
|
*
|
@@ -6938,6 +7716,20 @@ struct JitCodeEvent {
|
|
6938
7716
|
PositionType position_type;
|
6939
7717
|
};
|
6940
7718
|
|
7719
|
+
struct wasm_source_info_t {
|
7720
|
+
// Source file name.
|
7721
|
+
const char* filename;
|
7722
|
+
// Length of filename.
|
7723
|
+
size_t filename_size;
|
7724
|
+
// Line number table, which maps offsets of JITted code to line numbers of
|
7725
|
+
// source file.
|
7726
|
+
const line_info_t* line_number_table;
|
7727
|
+
// Number of entries in the line number table.
|
7728
|
+
size_t line_number_table_size;
|
7729
|
+
};
|
7730
|
+
|
7731
|
+
wasm_source_info_t* wasm_source_info;
|
7732
|
+
|
6941
7733
|
union {
|
6942
7734
|
// Only valid for CODE_ADDED.
|
6943
7735
|
struct name_t name;
|
@@ -6957,7 +7749,7 @@ struct JitCodeEvent {
|
|
6957
7749
|
* See documentation https://developers.google.com/web/tools/chrome-devtools/
|
6958
7750
|
* profile/evaluate-performance/rail
|
6959
7751
|
*/
|
6960
|
-
enum RAILMode {
|
7752
|
+
enum RAILMode : unsigned {
|
6961
7753
|
// Response performance mode: In this mode very low virtual machine latency
|
6962
7754
|
// is provided. V8 will try to avoid JavaScript execution interruptions.
|
6963
7755
|
// Throughput may be throttled.
|
@@ -6991,6 +7783,13 @@ enum JitCodeEventOptions {
|
|
6991
7783
|
*/
|
6992
7784
|
typedef void (*JitCodeEventHandler)(const JitCodeEvent* event);
|
6993
7785
|
|
7786
|
+
/**
|
7787
|
+
* Callback function passed to SetUnhandledExceptionCallback.
|
7788
|
+
*/
|
7789
|
+
#if defined(V8_OS_WIN)
|
7790
|
+
typedef int (*UnhandledExceptionCallback)(
|
7791
|
+
_EXCEPTION_POINTERS* exception_pointers);
|
7792
|
+
#endif
|
6994
7793
|
|
6995
7794
|
/**
|
6996
7795
|
* Interface for iterating through all external resources in the heap.
|
@@ -7031,6 +7830,11 @@ enum class MemoryPressureLevel { kNone, kModerate, kCritical };
|
|
7031
7830
|
*/
|
7032
7831
|
class V8_EXPORT EmbedderHeapTracer {
|
7033
7832
|
public:
|
7833
|
+
enum TraceFlags : uint64_t {
|
7834
|
+
kNoFlags = 0,
|
7835
|
+
kReduceMemory = 1 << 0,
|
7836
|
+
};
|
7837
|
+
|
7034
7838
|
// Indicator for the stack state of the embedder.
|
7035
7839
|
enum EmbedderStackState {
|
7036
7840
|
kUnknown,
|
@@ -7038,8 +7842,53 @@ class V8_EXPORT EmbedderHeapTracer {
|
|
7038
7842
|
kEmpty,
|
7039
7843
|
};
|
7040
7844
|
|
7845
|
+
/**
|
7846
|
+
* Interface for iterating through TracedGlobal handles.
|
7847
|
+
*/
|
7848
|
+
class V8_EXPORT TracedGlobalHandleVisitor {
|
7849
|
+
public:
|
7850
|
+
virtual ~TracedGlobalHandleVisitor() = default;
|
7851
|
+
virtual void VisitTracedGlobalHandle(const TracedGlobal<Value>& handle) {}
|
7852
|
+
virtual void VisitTracedReference(const TracedReference<Value>& handle) {}
|
7853
|
+
};
|
7854
|
+
|
7855
|
+
/**
|
7856
|
+
* Summary of a garbage collection cycle. See |TraceEpilogue| on how the
|
7857
|
+
* summary is reported.
|
7858
|
+
*/
|
7859
|
+
struct TraceSummary {
|
7860
|
+
/**
|
7861
|
+
* Time spent managing the retained memory in milliseconds. This can e.g.
|
7862
|
+
* include the time tracing through objects in the embedder.
|
7863
|
+
*/
|
7864
|
+
double time = 0.0;
|
7865
|
+
|
7866
|
+
/**
|
7867
|
+
* Memory retained by the embedder through the |EmbedderHeapTracer|
|
7868
|
+
* mechanism in bytes.
|
7869
|
+
*/
|
7870
|
+
size_t allocated_size = 0;
|
7871
|
+
};
|
7872
|
+
|
7041
7873
|
virtual ~EmbedderHeapTracer() = default;
|
7042
7874
|
|
7875
|
+
/**
|
7876
|
+
* Iterates all TracedGlobal handles created for the v8::Isolate the tracer is
|
7877
|
+
* attached to.
|
7878
|
+
*/
|
7879
|
+
void IterateTracedGlobalHandles(TracedGlobalHandleVisitor* visitor);
|
7880
|
+
|
7881
|
+
/**
|
7882
|
+
* Called by the embedder to set the start of the stack which is e.g. used by
|
7883
|
+
* V8 to determine whether handles are used from stack or heap.
|
7884
|
+
*/
|
7885
|
+
void SetStackStart(void* stack_start);
|
7886
|
+
|
7887
|
+
/**
|
7888
|
+
* Called by the embedder to notify V8 of an empty execution stack.
|
7889
|
+
*/
|
7890
|
+
void NotifyEmptyEmbedderStack();
|
7891
|
+
|
7043
7892
|
/**
|
7044
7893
|
* Called by v8 to register internal fields of found wrappers.
|
7045
7894
|
*
|
@@ -7049,10 +7898,12 @@ class V8_EXPORT EmbedderHeapTracer {
|
|
7049
7898
|
virtual void RegisterV8References(
|
7050
7899
|
const std::vector<std::pair<void*, void*> >& embedder_fields) = 0;
|
7051
7900
|
|
7901
|
+
void RegisterEmbedderReference(const TracedReferenceBase<v8::Data>& ref);
|
7902
|
+
|
7052
7903
|
/**
|
7053
7904
|
* Called at the beginning of a GC cycle.
|
7054
7905
|
*/
|
7055
|
-
virtual void TracePrologue()
|
7906
|
+
virtual void TracePrologue(TraceFlags flags) {}
|
7056
7907
|
|
7057
7908
|
/**
|
7058
7909
|
* Called to advance tracing in the embedder.
|
@@ -7075,9 +7926,11 @@ class V8_EXPORT EmbedderHeapTracer {
|
|
7075
7926
|
/**
|
7076
7927
|
* Called at the end of a GC cycle.
|
7077
7928
|
*
|
7078
|
-
* Note that allocation is *not* allowed within |TraceEpilogue|.
|
7929
|
+
* Note that allocation is *not* allowed within |TraceEpilogue|. Can be
|
7930
|
+
* overriden to fill a |TraceSummary| that is used by V8 to schedule future
|
7931
|
+
* garbage collections.
|
7079
7932
|
*/
|
7080
|
-
virtual void TraceEpilogue()
|
7933
|
+
virtual void TraceEpilogue(TraceSummary* trace_summary) {}
|
7081
7934
|
|
7082
7935
|
/**
|
7083
7936
|
* Called upon entering the final marking pause. No more incremental marking
|
@@ -7085,15 +7938,6 @@ class V8_EXPORT EmbedderHeapTracer {
|
|
7085
7938
|
*/
|
7086
7939
|
virtual void EnterFinalPause(EmbedderStackState stack_state) = 0;
|
7087
7940
|
|
7088
|
-
/**
|
7089
|
-
* Called when tracing is aborted.
|
7090
|
-
*
|
7091
|
-
* The embedder is expected to throw away all intermediate data and reset to
|
7092
|
-
* the initial state.
|
7093
|
-
*/
|
7094
|
-
V8_DEPRECATED("Obsolete as V8 will not abort tracing anymore.",
|
7095
|
-
virtual void AbortTracing()) {}
|
7096
|
-
|
7097
7941
|
/*
|
7098
7942
|
* Called by the embedder to request immediate finalization of the currently
|
7099
7943
|
* running tracing phase that has been started with TracePrologue and not
|
@@ -7105,6 +7949,39 @@ class V8_EXPORT EmbedderHeapTracer {
|
|
7105
7949
|
*/
|
7106
7950
|
void FinalizeTracing();
|
7107
7951
|
|
7952
|
+
/**
|
7953
|
+
* Returns true if the TracedGlobal handle should be considered as root for
|
7954
|
+
* the currently running non-tracing garbage collection and false otherwise.
|
7955
|
+
* The default implementation will keep all TracedGlobal references as roots.
|
7956
|
+
*
|
7957
|
+
* If this returns false, then V8 may decide that the object referred to by
|
7958
|
+
* such a handle is reclaimed. In that case:
|
7959
|
+
* - No action is required if handles are used with destructors, i.e., by just
|
7960
|
+
* using |TracedGlobal|.
|
7961
|
+
* - When run without destructors, i.e., by using
|
7962
|
+
* |TracedReference|, V8 calls |ResetHandleInNonTracingGC|.
|
7963
|
+
*
|
7964
|
+
* Note that the |handle| is different from the handle that the embedder holds
|
7965
|
+
* for retaining the object. The embedder may use |WrapperClassId()| to
|
7966
|
+
* distinguish cases where it wants handles to be treated as roots from not
|
7967
|
+
* being treated as roots.
|
7968
|
+
*/
|
7969
|
+
virtual bool IsRootForNonTracingGC(
|
7970
|
+
const v8::TracedReference<v8::Value>& handle);
|
7971
|
+
virtual bool IsRootForNonTracingGC(const v8::TracedGlobal<v8::Value>& handle);
|
7972
|
+
|
7973
|
+
/**
|
7974
|
+
* Used in combination with |IsRootForNonTracingGC|. Called by V8 when an
|
7975
|
+
* object that is backed by a handle is reclaimed by a non-tracing garbage
|
7976
|
+
* collection. It is up to the embedder to reset the original handle.
|
7977
|
+
*
|
7978
|
+
* Note that the |handle| is different from the handle that the embedder holds
|
7979
|
+
* for retaining the object. It is up to the embedder to find the original
|
7980
|
+
* handle via the object or class id.
|
7981
|
+
*/
|
7982
|
+
virtual void ResetHandleInNonTracingGC(
|
7983
|
+
const v8::TracedReference<v8::Value>& handle);
|
7984
|
+
|
7108
7985
|
/*
|
7109
7986
|
* Called by the embedder to immediately perform a full garbage collection.
|
7110
7987
|
*
|
@@ -7112,6 +7989,15 @@ class V8_EXPORT EmbedderHeapTracer {
|
|
7112
7989
|
*/
|
7113
7990
|
void GarbageCollectionForTesting(EmbedderStackState stack_state);
|
7114
7991
|
|
7992
|
+
/*
|
7993
|
+
* Called by the embedder to signal newly allocated or freed memory. Not bound
|
7994
|
+
* to tracing phases. Embedders should trade off when increments are reported
|
7995
|
+
* as V8 may consult global heuristics on whether to trigger garbage
|
7996
|
+
* collection on this change.
|
7997
|
+
*/
|
7998
|
+
void IncreaseAllocatedSize(size_t bytes);
|
7999
|
+
void DecreaseAllocatedSize(size_t bytes);
|
8000
|
+
|
7115
8001
|
/*
|
7116
8002
|
* Returns the v8::Isolate this tracer is attached too and |nullptr| if it
|
7117
8003
|
* is not attached to any v8::Isolate.
|
@@ -7159,7 +8045,67 @@ struct DeserializeInternalFieldsCallback {
|
|
7159
8045
|
void* data);
|
7160
8046
|
void* data;
|
7161
8047
|
};
|
7162
|
-
typedef DeserializeInternalFieldsCallback DeserializeEmbedderFieldsCallback;
|
8048
|
+
typedef DeserializeInternalFieldsCallback DeserializeEmbedderFieldsCallback;
|
8049
|
+
|
8050
|
+
/**
|
8051
|
+
* Controls how the default MeasureMemoryDelegate reports the result of
|
8052
|
+
* the memory measurement to JS. With kSummary only the total size is reported.
|
8053
|
+
* With kDetailed the result includes the size of each native context.
|
8054
|
+
*/
|
8055
|
+
enum class MeasureMemoryMode { kSummary, kDetailed };
|
8056
|
+
|
8057
|
+
/**
|
8058
|
+
* Controls how promptly a memory measurement request is executed.
|
8059
|
+
* By default the measurement is folded with the next scheduled GC which may
|
8060
|
+
* happen after a while. The kEager starts increment GC right away and
|
8061
|
+
* is useful for testing.
|
8062
|
+
*/
|
8063
|
+
enum class MeasureMemoryExecution { kDefault, kEager };
|
8064
|
+
|
8065
|
+
/**
|
8066
|
+
* The delegate is used in Isolate::MeasureMemory API.
|
8067
|
+
*
|
8068
|
+
* It specifies the contexts that need to be measured and gets called when
|
8069
|
+
* the measurement is completed to report the results.
|
8070
|
+
*/
|
8071
|
+
class V8_EXPORT MeasureMemoryDelegate {
|
8072
|
+
public:
|
8073
|
+
virtual ~MeasureMemoryDelegate() = default;
|
8074
|
+
|
8075
|
+
/**
|
8076
|
+
* Returns true if the size of the given context needs to be measured.
|
8077
|
+
*/
|
8078
|
+
virtual bool ShouldMeasure(Local<Context> context) = 0;
|
8079
|
+
|
8080
|
+
/**
|
8081
|
+
* This function is called when memory measurement finishes.
|
8082
|
+
*
|
8083
|
+
* \param context_sizes_in_bytes a vector of (context, size) pairs that
|
8084
|
+
* includes each context for which ShouldMeasure returned true and that
|
8085
|
+
* was not garbage collected while the memory measurement was in progress.
|
8086
|
+
*
|
8087
|
+
* \param unattributed_size_in_bytes total size of objects that were not
|
8088
|
+
* attributed to any context (i.e. are likely shared objects).
|
8089
|
+
*/
|
8090
|
+
virtual void MeasurementComplete(
|
8091
|
+
const std::vector<std::pair<Local<Context>, size_t>>&
|
8092
|
+
context_sizes_in_bytes,
|
8093
|
+
size_t unattributed_size_in_bytes) = 0;
|
8094
|
+
|
8095
|
+
/**
|
8096
|
+
* Returns a default delegate that resolves the given promise when
|
8097
|
+
* the memory measurement completes.
|
8098
|
+
*
|
8099
|
+
* \param isolate the current isolate
|
8100
|
+
* \param context the current context
|
8101
|
+
* \param promise_resolver the promise resolver that is given the
|
8102
|
+
* result of the memory measurement.
|
8103
|
+
* \param mode the detail level of the result.
|
8104
|
+
*/
|
8105
|
+
static std::unique_ptr<MeasureMemoryDelegate> Default(
|
8106
|
+
Isolate* isolate, Local<Context> context,
|
8107
|
+
Local<Promise::Resolver> promise_resolver, MeasureMemoryMode mode);
|
8108
|
+
};
|
7163
8109
|
|
7164
8110
|
/**
|
7165
8111
|
* Isolate represents an isolated instance of the V8 engine. V8 isolates have
|
@@ -7182,9 +8128,12 @@ class V8_EXPORT Isolate {
|
|
7182
8128
|
create_histogram_callback(nullptr),
|
7183
8129
|
add_histogram_sample_callback(nullptr),
|
7184
8130
|
array_buffer_allocator(nullptr),
|
8131
|
+
array_buffer_allocator_shared(),
|
7185
8132
|
external_references(nullptr),
|
7186
8133
|
allow_atomics_wait(true),
|
7187
|
-
only_terminate_in_safe_scope(false)
|
8134
|
+
only_terminate_in_safe_scope(false),
|
8135
|
+
embedder_wrapper_type_index(-1),
|
8136
|
+
embedder_wrapper_object_index(-1) {}
|
7188
8137
|
|
7189
8138
|
/**
|
7190
8139
|
* Allows the host application to provide the address of a function that is
|
@@ -7221,8 +8170,14 @@ class V8_EXPORT Isolate {
|
|
7221
8170
|
/**
|
7222
8171
|
* The ArrayBuffer::Allocator to use for allocating and freeing the backing
|
7223
8172
|
* store of ArrayBuffers.
|
8173
|
+
*
|
8174
|
+
* If the shared_ptr version is used, the Isolate instance and every
|
8175
|
+
* |BackingStore| allocated using this allocator hold a std::shared_ptr
|
8176
|
+
* to the allocator, in order to facilitate lifetime
|
8177
|
+
* management for the allocator instance.
|
7224
8178
|
*/
|
7225
8179
|
ArrayBuffer::Allocator* array_buffer_allocator;
|
8180
|
+
std::shared_ptr<ArrayBuffer::Allocator> array_buffer_allocator_shared;
|
7226
8181
|
|
7227
8182
|
/**
|
7228
8183
|
* Specifies an optional nullptr-terminated array of raw addresses in the
|
@@ -7242,6 +8197,14 @@ class V8_EXPORT Isolate {
|
|
7242
8197
|
* Termination is postponed when there is no active SafeForTerminationScope.
|
7243
8198
|
*/
|
7244
8199
|
bool only_terminate_in_safe_scope;
|
8200
|
+
|
8201
|
+
/**
|
8202
|
+
* The following parameters describe the offsets for addressing type info
|
8203
|
+
* for wrapped API objects and are used by the fast C API
|
8204
|
+
* (for details see v8-fast-api-calls.h).
|
8205
|
+
*/
|
8206
|
+
int embedder_wrapper_type_index;
|
8207
|
+
int embedder_wrapper_object_index;
|
7245
8208
|
};
|
7246
8209
|
|
7247
8210
|
|
@@ -7314,7 +8277,8 @@ class V8_EXPORT Isolate {
|
|
7314
8277
|
*/
|
7315
8278
|
class V8_EXPORT SuppressMicrotaskExecutionScope {
|
7316
8279
|
public:
|
7317
|
-
explicit SuppressMicrotaskExecutionScope(
|
8280
|
+
explicit SuppressMicrotaskExecutionScope(
|
8281
|
+
Isolate* isolate, MicrotaskQueue* microtask_queue = nullptr);
|
7318
8282
|
~SuppressMicrotaskExecutionScope();
|
7319
8283
|
|
7320
8284
|
// Prevent copying of Scope objects.
|
@@ -7325,6 +8289,10 @@ class V8_EXPORT Isolate {
|
|
7325
8289
|
|
7326
8290
|
private:
|
7327
8291
|
internal::Isolate* const isolate_;
|
8292
|
+
internal::MicrotaskQueue* const microtask_queue_;
|
8293
|
+
internal::Address previous_stack_height_;
|
8294
|
+
|
8295
|
+
friend class internal::ThreadLocalTop;
|
7328
8296
|
};
|
7329
8297
|
|
7330
8298
|
/**
|
@@ -7434,10 +8402,41 @@ class V8_EXPORT Isolate {
|
|
7434
8402
|
kOptimizedFunctionWithOneShotBytecode = 71,
|
7435
8403
|
kRegExpMatchIsTrueishOnNonJSRegExp = 72,
|
7436
8404
|
kRegExpMatchIsFalseishOnJSRegExp = 73,
|
7437
|
-
kDateGetTimezoneOffset = 74,
|
8405
|
+
kDateGetTimezoneOffset = 74, // Unused.
|
8406
|
+
kStringNormalize = 75,
|
8407
|
+
kCallSiteAPIGetFunctionSloppyCall = 76,
|
8408
|
+
kCallSiteAPIGetThisSloppyCall = 77,
|
8409
|
+
kRegExpMatchAllWithNonGlobalRegExp = 78,
|
8410
|
+
kRegExpExecCalledOnSlowRegExp = 79,
|
8411
|
+
kRegExpReplaceCalledOnSlowRegExp = 80,
|
8412
|
+
kDisplayNames = 81,
|
8413
|
+
kSharedArrayBufferConstructed = 82,
|
8414
|
+
kArrayPrototypeHasElements = 83,
|
8415
|
+
kObjectPrototypeHasElements = 84,
|
8416
|
+
kNumberFormatStyleUnit = 85,
|
8417
|
+
kDateTimeFormatRange = 86,
|
8418
|
+
kDateTimeFormatDateTimeStyle = 87,
|
8419
|
+
kBreakIteratorTypeWord = 88,
|
8420
|
+
kBreakIteratorTypeLine = 89,
|
8421
|
+
kInvalidatedArrayBufferDetachingProtector = 90,
|
8422
|
+
kInvalidatedArrayConstructorProtector = 91,
|
8423
|
+
kInvalidatedArrayIteratorLookupChainProtector = 92,
|
8424
|
+
kInvalidatedArraySpeciesLookupChainProtector = 93,
|
8425
|
+
kInvalidatedIsConcatSpreadableLookupChainProtector = 94,
|
8426
|
+
kInvalidatedMapIteratorLookupChainProtector = 95,
|
8427
|
+
kInvalidatedNoElementsProtector = 96,
|
8428
|
+
kInvalidatedPromiseHookProtector = 97,
|
8429
|
+
kInvalidatedPromiseResolveLookupChainProtector = 98,
|
8430
|
+
kInvalidatedPromiseSpeciesLookupChainProtector = 99,
|
8431
|
+
kInvalidatedPromiseThenLookupChainProtector = 100,
|
8432
|
+
kInvalidatedRegExpSpeciesLookupChainProtector = 101,
|
8433
|
+
kInvalidatedSetIteratorLookupChainProtector = 102,
|
8434
|
+
kInvalidatedStringIteratorLookupChainProtector = 103,
|
8435
|
+
kInvalidatedStringLengthOverflowLookupChainProtector = 104,
|
8436
|
+
kInvalidatedTypedArraySpeciesLookupChainProtector = 105,
|
7438
8437
|
|
7439
8438
|
// If you add new values here, you'll also need to update Chromium's:
|
7440
|
-
// web_feature.mojom,
|
8439
|
+
// web_feature.mojom, use_counter_callback.cc, and enums.xml. V8 changes to
|
7441
8440
|
// this list need to be landed first, then changes on the Chromium side.
|
7442
8441
|
kUseCounterFeatureCount // This enum value must be last.
|
7443
8442
|
};
|
@@ -7495,6 +8494,21 @@ class V8_EXPORT Isolate {
|
|
7495
8494
|
*/
|
7496
8495
|
static Isolate* GetCurrent();
|
7497
8496
|
|
8497
|
+
/**
|
8498
|
+
* Clears the set of objects held strongly by the heap. This set of
|
8499
|
+
* objects are originally built when a WeakRef is created or
|
8500
|
+
* successfully dereferenced.
|
8501
|
+
*
|
8502
|
+
* This is invoked automatically after microtasks are run. See
|
8503
|
+
* MicrotasksPolicy for when microtasks are run.
|
8504
|
+
*
|
8505
|
+
* This needs to be manually invoked only if the embedder is manually running
|
8506
|
+
* microtasks via a custom MicrotaskQueue class's PerformCheckpoint. In that
|
8507
|
+
* case, it is the embedder's responsibility to make this call at a time which
|
8508
|
+
* does not interrupt synchronous ECMAScript code execution.
|
8509
|
+
*/
|
8510
|
+
void ClearKeptObjects();
|
8511
|
+
|
7498
8512
|
/**
|
7499
8513
|
* Custom callback used by embedders to help V8 determine if it should abort
|
7500
8514
|
* when it throws and no internal handler is predicted to catch the
|
@@ -7652,6 +8666,26 @@ class V8_EXPORT Isolate {
|
|
7652
8666
|
*/
|
7653
8667
|
bool GetHeapCodeAndMetadataStatistics(HeapCodeStatistics* object_statistics);
|
7654
8668
|
|
8669
|
+
/**
|
8670
|
+
* This API is experimental and may change significantly.
|
8671
|
+
*
|
8672
|
+
* Enqueues a memory measurement request and invokes the delegate with the
|
8673
|
+
* results.
|
8674
|
+
*
|
8675
|
+
* \param delegate the delegate that defines which contexts to measure and
|
8676
|
+
* reports the results.
|
8677
|
+
*
|
8678
|
+
* \param execution promptness executing the memory measurement.
|
8679
|
+
* The kEager value is expected to be used only in tests.
|
8680
|
+
*/
|
8681
|
+
bool MeasureMemory(
|
8682
|
+
std::unique_ptr<MeasureMemoryDelegate> delegate,
|
8683
|
+
MeasureMemoryExecution execution = MeasureMemoryExecution::kDefault);
|
8684
|
+
|
8685
|
+
V8_DEPRECATE_SOON("Use the version with a delegate")
|
8686
|
+
MaybeLocal<Promise> MeasureMemory(Local<Context> context,
|
8687
|
+
MeasureMemoryMode mode);
|
8688
|
+
|
7655
8689
|
/**
|
7656
8690
|
* Get a call stack sample from the isolate.
|
7657
8691
|
* \param state Execution state.
|
@@ -7700,6 +8734,9 @@ class V8_EXPORT Isolate {
|
|
7700
8734
|
*/
|
7701
8735
|
void SetIdle(bool is_idle);
|
7702
8736
|
|
8737
|
+
/** Returns the ArrayBuffer::Allocator used in this isolate. */
|
8738
|
+
ArrayBuffer::Allocator* GetArrayBufferAllocator();
|
8739
|
+
|
7703
8740
|
/** Returns true if this isolate has a current context. */
|
7704
8741
|
bool InContext();
|
7705
8742
|
|
@@ -7710,8 +8747,8 @@ class V8_EXPORT Isolate {
|
|
7710
8747
|
Local<Context> GetCurrentContext();
|
7711
8748
|
|
7712
8749
|
/** Returns the last context entered through V8's C++ API. */
|
7713
|
-
V8_DEPRECATED("Use GetEnteredOrMicrotaskContext()."
|
7714
|
-
|
8750
|
+
V8_DEPRECATED("Use GetEnteredOrMicrotaskContext().")
|
8751
|
+
Local<Context> GetEnteredContext();
|
7715
8752
|
|
7716
8753
|
/**
|
7717
8754
|
* Returns either the last context entered through V8's C++ API, or the
|
@@ -7985,18 +9022,26 @@ class V8_EXPORT Isolate {
|
|
7985
9022
|
void SetPromiseRejectCallback(PromiseRejectCallback callback);
|
7986
9023
|
|
7987
9024
|
/**
|
7988
|
-
*
|
7989
|
-
|
9025
|
+
* An alias for PerformMicrotaskCheckpoint.
|
9026
|
+
*/
|
9027
|
+
V8_DEPRECATE_SOON("Use PerformMicrotaskCheckpoint.")
|
9028
|
+
void RunMicrotasks() { PerformMicrotaskCheckpoint(); }
|
9029
|
+
|
9030
|
+
/**
|
9031
|
+
* Runs the default MicrotaskQueue until it gets empty and perform other
|
9032
|
+
* microtask checkpoint steps, such as calling ClearKeptObjects. Asserts that
|
9033
|
+
* the MicrotasksPolicy is not kScoped. Any exceptions thrown by microtask
|
9034
|
+
* callbacks are swallowed.
|
7990
9035
|
*/
|
7991
|
-
void
|
9036
|
+
void PerformMicrotaskCheckpoint();
|
7992
9037
|
|
7993
9038
|
/**
|
7994
|
-
* Enqueues the callback to the
|
9039
|
+
* Enqueues the callback to the default MicrotaskQueue
|
7995
9040
|
*/
|
7996
9041
|
void EnqueueMicrotask(Local<Function> microtask);
|
7997
9042
|
|
7998
9043
|
/**
|
7999
|
-
* Enqueues the callback to the
|
9044
|
+
* Enqueues the callback to the default MicrotaskQueue
|
8000
9045
|
*/
|
8001
9046
|
void EnqueueMicrotask(MicrotaskCallback callback, void* data = nullptr);
|
8002
9047
|
|
@@ -8012,22 +9057,29 @@ class V8_EXPORT Isolate {
|
|
8012
9057
|
|
8013
9058
|
/**
|
8014
9059
|
* Adds a callback to notify the host application after
|
8015
|
-
* microtasks were run. The callback is
|
8016
|
-
* call or automatic microtasks execution
|
9060
|
+
* microtasks were run on the default MicrotaskQueue. The callback is
|
9061
|
+
* triggered by explicit RunMicrotasks call or automatic microtasks execution
|
9062
|
+
* (see SetMicrotaskPolicy).
|
8017
9063
|
*
|
8018
9064
|
* Callback will trigger even if microtasks were attempted to run,
|
8019
9065
|
* but the microtasks queue was empty and no single microtask was actually
|
8020
9066
|
* executed.
|
8021
9067
|
*
|
8022
|
-
* Executing
|
9068
|
+
* Executing scripts inside the callback will not re-trigger microtasks and
|
8023
9069
|
* the callback.
|
8024
9070
|
*/
|
9071
|
+
V8_DEPRECATE_SOON("Use *WithData version.")
|
8025
9072
|
void AddMicrotasksCompletedCallback(MicrotasksCompletedCallback callback);
|
9073
|
+
void AddMicrotasksCompletedCallback(
|
9074
|
+
MicrotasksCompletedCallbackWithData callback, void* data = nullptr);
|
8026
9075
|
|
8027
9076
|
/**
|
8028
9077
|
* Removes callback that was installed by AddMicrotasksCompletedCallback.
|
8029
9078
|
*/
|
9079
|
+
V8_DEPRECATE_SOON("Use *WithData version.")
|
8030
9080
|
void RemoveMicrotasksCompletedCallback(MicrotasksCompletedCallback callback);
|
9081
|
+
void RemoveMicrotasksCompletedCallback(
|
9082
|
+
MicrotasksCompletedCallbackWithData callback, void* data = nullptr);
|
8031
9083
|
|
8032
9084
|
/**
|
8033
9085
|
* Sets a callback for counting the number of times a feature of V8 is used.
|
@@ -8049,6 +9101,13 @@ class V8_EXPORT Isolate {
|
|
8049
9101
|
void SetCreateHistogramFunction(CreateHistogramCallback);
|
8050
9102
|
void SetAddHistogramSampleFunction(AddHistogramSampleCallback);
|
8051
9103
|
|
9104
|
+
/**
|
9105
|
+
* Enables the host application to provide a mechanism for recording a
|
9106
|
+
* predefined set of data as crash keys to be used in postmortem debugging in
|
9107
|
+
* case of a crash.
|
9108
|
+
*/
|
9109
|
+
void SetAddCrashKeyCallback(AddCrashKeyCallback);
|
9110
|
+
|
8052
9111
|
/**
|
8053
9112
|
* Optional notification that the embedder is idle.
|
8054
9113
|
* V8 uses the notification to perform garbage collection.
|
@@ -8072,10 +9131,10 @@ class V8_EXPORT Isolate {
|
|
8072
9131
|
void LowMemoryNotification();
|
8073
9132
|
|
8074
9133
|
/**
|
8075
|
-
* Optional notification that a context has been disposed. V8 uses
|
8076
|
-
*
|
8077
|
-
* of context disposals - including this one
|
8078
|
-
* V8 had a chance to clean up.
|
9134
|
+
* Optional notification that a context has been disposed. V8 uses these
|
9135
|
+
* notifications to guide the GC heuristic and cancel FinalizationRegistry
|
9136
|
+
* cleanup tasks. Returns the number of context disposals - including this one
|
9137
|
+
* - since the last time V8 had a chance to clean up.
|
8079
9138
|
*
|
8080
9139
|
* The optional parameter |dependant_context| specifies whether the disposed
|
8081
9140
|
* context was depending on state from other contexts or not.
|
@@ -8171,13 +9230,13 @@ class V8_EXPORT Isolate {
|
|
8171
9230
|
/**
|
8172
9231
|
* Returns a memory range that can potentially contain jitted code. Code for
|
8173
9232
|
* V8's 'builtins' will not be in this range if embedded builtins is enabled.
|
8174
|
-
* Instead, see GetEmbeddedCodeRange.
|
8175
9233
|
*
|
8176
9234
|
* On Win64, embedders are advised to install function table callbacks for
|
8177
9235
|
* these ranges, as default SEH won't be able to unwind through jitted code.
|
8178
|
-
*
|
8179
9236
|
* The first page of the code range is reserved for the embedder and is
|
8180
|
-
* committed, writable, and executable
|
9237
|
+
* committed, writable, and executable, to be used to store unwind data, as
|
9238
|
+
* documented in
|
9239
|
+
* https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64.
|
8181
9240
|
*
|
8182
9241
|
* Might be empty on other platforms.
|
8183
9242
|
*
|
@@ -8188,8 +9247,32 @@ class V8_EXPORT Isolate {
|
|
8188
9247
|
/**
|
8189
9248
|
* Returns the UnwindState necessary for use with the Unwinder API.
|
8190
9249
|
*/
|
9250
|
+
// TODO(petermarshall): Remove this API.
|
9251
|
+
V8_DEPRECATED("Use entry_stubs + code_pages version.")
|
8191
9252
|
UnwindState GetUnwindState();
|
8192
9253
|
|
9254
|
+
/**
|
9255
|
+
* Returns the JSEntryStubs necessary for use with the Unwinder API.
|
9256
|
+
*/
|
9257
|
+
JSEntryStubs GetJSEntryStubs();
|
9258
|
+
|
9259
|
+
static constexpr size_t kMinCodePagesBufferSize = 32;
|
9260
|
+
|
9261
|
+
/**
|
9262
|
+
* Copies the code heap pages currently in use by V8 into |code_pages_out|.
|
9263
|
+
* |code_pages_out| must have at least kMinCodePagesBufferSize capacity and
|
9264
|
+
* must be empty.
|
9265
|
+
*
|
9266
|
+
* Signal-safe, does not allocate, does not access the V8 heap.
|
9267
|
+
* No code on the stack can rely on pages that might be missing.
|
9268
|
+
*
|
9269
|
+
* Returns the number of pages available to be copied, which might be greater
|
9270
|
+
* than |capacity|. In this case, only |capacity| pages will be copied into
|
9271
|
+
* |code_pages_out|. The caller should provide a bigger buffer on the next
|
9272
|
+
* call in order to get all available code pages, but this is not required.
|
9273
|
+
*/
|
9274
|
+
size_t CopyCodePages(size_t capacity, MemoryRange* code_pages_out);
|
9275
|
+
|
8193
9276
|
/** Set the callback to invoke in case of fatal errors. */
|
8194
9277
|
void SetFatalErrorHandler(FatalErrorCallback that);
|
8195
9278
|
|
@@ -8225,8 +9308,13 @@ class V8_EXPORT Isolate {
|
|
8225
9308
|
* Set the callback to invoke to check if code generation from
|
8226
9309
|
* strings should be allowed.
|
8227
9310
|
*/
|
9311
|
+
V8_DEPRECATED(
|
9312
|
+
"Use Isolate::SetModifyCodeGenerationFromStringsCallback instead. "
|
9313
|
+
"See http://crbug.com/v8/10096.")
|
8228
9314
|
void SetAllowCodeGenerationFromStringsCallback(
|
8229
9315
|
AllowCodeGenerationFromStringsCallback callback);
|
9316
|
+
void SetModifyCodeGenerationFromStringsCallback(
|
9317
|
+
ModifyCodeGenerationFromStringsCallback callback);
|
8230
9318
|
|
8231
9319
|
/**
|
8232
9320
|
* Set the callback to invoke to check if wasm code generation should
|
@@ -8242,14 +9330,12 @@ class V8_EXPORT Isolate {
|
|
8242
9330
|
void SetWasmModuleCallback(ExtensionCallback callback);
|
8243
9331
|
void SetWasmInstanceCallback(ExtensionCallback callback);
|
8244
9332
|
|
8245
|
-
V8_DEPRECATED(
|
8246
|
-
"The callback set in SetWasmStreamingCallback is used now",
|
8247
|
-
void SetWasmCompileStreamingCallback(ApiImplementationCallback callback));
|
8248
|
-
|
8249
9333
|
void SetWasmStreamingCallback(WasmStreamingCallback callback);
|
8250
9334
|
|
8251
9335
|
void SetWasmThreadsEnabledCallback(WasmThreadsEnabledCallback callback);
|
8252
9336
|
|
9337
|
+
void SetWasmLoadSourceMapCallback(WasmLoadSourceMapCallback callback);
|
9338
|
+
|
8253
9339
|
/**
|
8254
9340
|
* Check if V8 is dead and therefore unusable. This is the case after
|
8255
9341
|
* fatal errors such as out-of-memory situations.
|
@@ -8312,17 +9398,6 @@ class V8_EXPORT Isolate {
|
|
8312
9398
|
*/
|
8313
9399
|
void VisitHandlesWithClassIds(PersistentHandleVisitor* visitor);
|
8314
9400
|
|
8315
|
-
/**
|
8316
|
-
* Iterates through all the persistent handles in the current isolate's heap
|
8317
|
-
* that have class_ids and are candidates to be marked as partially dependent
|
8318
|
-
* handles. This will visit handles to young objects created since the last
|
8319
|
-
* garbage collection but is free to visit an arbitrary superset of these
|
8320
|
-
* objects.
|
8321
|
-
*/
|
8322
|
-
V8_DEPRECATE_SOON(
|
8323
|
-
"Use VisitHandlesWithClassIds",
|
8324
|
-
void VisitHandlesForPartialDependence(PersistentHandleVisitor* visitor));
|
8325
|
-
|
8326
9401
|
/**
|
8327
9402
|
* Iterates through all the persistent handles in the current isolate's heap
|
8328
9403
|
* that have class_ids and are weak to be marked as inactive if there is no
|
@@ -8343,6 +9418,45 @@ class V8_EXPORT Isolate {
|
|
8343
9418
|
*/
|
8344
9419
|
void SetAllowAtomicsWait(bool allow);
|
8345
9420
|
|
9421
|
+
/**
|
9422
|
+
* Time zone redetection indicator for
|
9423
|
+
* DateTimeConfigurationChangeNotification.
|
9424
|
+
*
|
9425
|
+
* kSkip indicates V8 that the notification should not trigger redetecting
|
9426
|
+
* host time zone. kRedetect indicates V8 that host time zone should be
|
9427
|
+
* redetected, and used to set the default time zone.
|
9428
|
+
*
|
9429
|
+
* The host time zone detection may require file system access or similar
|
9430
|
+
* operations unlikely to be available inside a sandbox. If v8 is run inside a
|
9431
|
+
* sandbox, the host time zone has to be detected outside the sandbox before
|
9432
|
+
* calling DateTimeConfigurationChangeNotification function.
|
9433
|
+
*/
|
9434
|
+
enum class TimeZoneDetection { kSkip, kRedetect };
|
9435
|
+
|
9436
|
+
/**
|
9437
|
+
* Notification that the embedder has changed the time zone, daylight savings
|
9438
|
+
* time or other date / time configuration parameters. V8 keeps a cache of
|
9439
|
+
* various values used for date / time computation. This notification will
|
9440
|
+
* reset those cached values for the current context so that date / time
|
9441
|
+
* configuration changes would be reflected.
|
9442
|
+
*
|
9443
|
+
* This API should not be called more than needed as it will negatively impact
|
9444
|
+
* the performance of date operations.
|
9445
|
+
*/
|
9446
|
+
void DateTimeConfigurationChangeNotification(
|
9447
|
+
TimeZoneDetection time_zone_detection = TimeZoneDetection::kSkip);
|
9448
|
+
|
9449
|
+
/**
|
9450
|
+
* Notification that the embedder has changed the locale. V8 keeps a cache of
|
9451
|
+
* various values used for locale computation. This notification will reset
|
9452
|
+
* those cached values for the current context so that locale configuration
|
9453
|
+
* changes would be reflected.
|
9454
|
+
*
|
9455
|
+
* This API should not be called more than needed as it will negatively impact
|
9456
|
+
* the performance of locale operations.
|
9457
|
+
*/
|
9458
|
+
void LocaleConfigurationChangeNotification();
|
9459
|
+
|
8346
9460
|
Isolate() = delete;
|
8347
9461
|
~Isolate() = delete;
|
8348
9462
|
Isolate(const Isolate&) = delete;
|
@@ -8360,11 +9474,17 @@ class V8_EXPORT Isolate {
|
|
8360
9474
|
|
8361
9475
|
internal::Address* GetDataFromSnapshotOnce(size_t index);
|
8362
9476
|
void ReportExternalAllocationLimitReached();
|
8363
|
-
void CheckMemoryPressure();
|
8364
9477
|
};
|
8365
9478
|
|
8366
9479
|
class V8_EXPORT StartupData {
|
8367
9480
|
public:
|
9481
|
+
/**
|
9482
|
+
* Whether the data created can be rehashed and and the hash seed can be
|
9483
|
+
* recomputed when deserialized.
|
9484
|
+
* Only valid for StartupData returned by SnapshotCreator::CreateBlob().
|
9485
|
+
*/
|
9486
|
+
bool CanBeRehashed() const;
|
9487
|
+
|
8368
9488
|
const char* data;
|
8369
9489
|
int raw_size;
|
8370
9490
|
};
|
@@ -8413,7 +9533,6 @@ class V8_EXPORT V8 {
|
|
8413
9533
|
* handled entirely on the embedders' side.
|
8414
9534
|
* - The call will abort if the data is invalid.
|
8415
9535
|
*/
|
8416
|
-
static void SetNativesDataBlob(StartupData* startup_blob);
|
8417
9536
|
static void SetSnapshotDataBlob(StartupData* startup_blob);
|
8418
9537
|
|
8419
9538
|
/** Set the callback to invoke in case of Dcheck failures. */
|
@@ -8423,7 +9542,8 @@ class V8_EXPORT V8 {
|
|
8423
9542
|
/**
|
8424
9543
|
* Sets V8 flags from a string.
|
8425
9544
|
*/
|
8426
|
-
static void SetFlagsFromString(const char* str
|
9545
|
+
static void SetFlagsFromString(const char* str);
|
9546
|
+
static void SetFlagsFromString(const char* str, size_t length);
|
8427
9547
|
|
8428
9548
|
/**
|
8429
9549
|
* Sets V8 flags from the command line.
|
@@ -8439,7 +9559,12 @@ class V8_EXPORT V8 {
|
|
8439
9559
|
* Initializes V8. This function needs to be called before the first Isolate
|
8440
9560
|
* is created. It always returns true.
|
8441
9561
|
*/
|
8442
|
-
static bool Initialize()
|
9562
|
+
V8_INLINE static bool Initialize() {
|
9563
|
+
const int kBuildConfiguration =
|
9564
|
+
(internal::PointerCompressionIsEnabled() ? kPointerCompression : 0) |
|
9565
|
+
(internal::SmiValuesAre31Bits() ? k31BitSmis : 0);
|
9566
|
+
return Initialize(kBuildConfiguration);
|
9567
|
+
}
|
8443
9568
|
|
8444
9569
|
/**
|
8445
9570
|
* Allows the host application to provide a callback which can be used
|
@@ -8497,17 +9622,16 @@ class V8_EXPORT V8 {
|
|
8497
9622
|
* V8 needs to be given those external files during startup. There are
|
8498
9623
|
* three ways to do this:
|
8499
9624
|
* - InitializeExternalStartupData(const char*)
|
8500
|
-
* This will look in the given directory for
|
8501
|
-
*
|
8502
|
-
*
|
8503
|
-
*
|
8504
|
-
*
|
8505
|
-
* This will read the blobs from the given data structures and will
|
9625
|
+
* This will look in the given directory for the file "snapshot_blob.bin".
|
9626
|
+
* - InitializeExternalStartupDataFromFile(const char*)
|
9627
|
+
* As above, but will directly use the given file name.
|
9628
|
+
* - Call SetSnapshotDataBlob.
|
9629
|
+
* This will read the blobs from the given data structure and will
|
8506
9630
|
* not perform any file IO.
|
8507
9631
|
*/
|
8508
9632
|
static void InitializeExternalStartupData(const char* directory_path);
|
8509
|
-
static void
|
8510
|
-
|
9633
|
+
static void InitializeExternalStartupDataFromFile(const char* snapshot_blob);
|
9634
|
+
|
8511
9635
|
/**
|
8512
9636
|
* Sets the v8::Platform to use. This should be invoked before V8 is
|
8513
9637
|
* initialized.
|
@@ -8540,18 +9664,10 @@ class V8_EXPORT V8 {
|
|
8540
9664
|
* \param context The third argument passed to the Linux signal handler, which
|
8541
9665
|
* points to a ucontext_t structure.
|
8542
9666
|
*/
|
8543
|
-
V8_DEPRECATE_SOON("Use TryHandleWebAssemblyTrapPosix"
|
8544
|
-
|
8545
|
-
void* context));
|
9667
|
+
V8_DEPRECATE_SOON("Use TryHandleWebAssemblyTrapPosix")
|
9668
|
+
static bool TryHandleSignal(int signal_number, void* info, void* context);
|
8546
9669
|
#endif // V8_OS_POSIX
|
8547
9670
|
|
8548
|
-
/**
|
8549
|
-
* Enable the default signal handler rather than using one provided by the
|
8550
|
-
* embedder.
|
8551
|
-
*/
|
8552
|
-
V8_DEPRECATED("Use EnableWebAssemblyTrapHandler",
|
8553
|
-
static bool RegisterDefaultSignalHandler());
|
8554
|
-
|
8555
9671
|
/**
|
8556
9672
|
* Activate trap-based bounds checking for WebAssembly.
|
8557
9673
|
*
|
@@ -8560,37 +9676,86 @@ class V8_EXPORT V8 {
|
|
8560
9676
|
*/
|
8561
9677
|
static bool EnableWebAssemblyTrapHandler(bool use_v8_signal_handler);
|
8562
9678
|
|
9679
|
+
#if defined(V8_OS_WIN)
|
9680
|
+
/**
|
9681
|
+
* On Win64, by default V8 does not emit unwinding data for jitted code,
|
9682
|
+
* which means the OS cannot walk the stack frames and the system Structured
|
9683
|
+
* Exception Handling (SEH) cannot unwind through V8-generated code:
|
9684
|
+
* https://code.google.com/p/v8/issues/detail?id=3598.
|
9685
|
+
*
|
9686
|
+
* This function allows embedders to register a custom exception handler for
|
9687
|
+
* exceptions in V8-generated code.
|
9688
|
+
*/
|
9689
|
+
static void SetUnhandledExceptionCallback(
|
9690
|
+
UnhandledExceptionCallback unhandled_exception_callback);
|
9691
|
+
#endif
|
9692
|
+
|
9693
|
+
/**
|
9694
|
+
* Get statistics about the shared memory usage.
|
9695
|
+
*/
|
9696
|
+
static void GetSharedMemoryStatistics(SharedMemoryStatistics* statistics);
|
9697
|
+
|
8563
9698
|
private:
|
8564
9699
|
V8();
|
8565
9700
|
|
9701
|
+
enum BuildConfigurationFeatures {
|
9702
|
+
kPointerCompression = 1 << 0,
|
9703
|
+
k31BitSmis = 1 << 1,
|
9704
|
+
};
|
9705
|
+
|
9706
|
+
/**
|
9707
|
+
* Checks that the embedder build configuration is compatible with
|
9708
|
+
* the V8 binary and if so initializes V8.
|
9709
|
+
*/
|
9710
|
+
static bool Initialize(int build_config);
|
9711
|
+
|
8566
9712
|
static internal::Address* GlobalizeReference(internal::Isolate* isolate,
|
8567
9713
|
internal::Address* handle);
|
8568
|
-
static internal::Address*
|
9714
|
+
static internal::Address* GlobalizeTracedReference(internal::Isolate* isolate,
|
9715
|
+
internal::Address* handle,
|
9716
|
+
internal::Address* slot,
|
9717
|
+
bool has_destructor);
|
9718
|
+
static void MoveGlobalReference(internal::Address** from,
|
9719
|
+
internal::Address** to);
|
9720
|
+
static void MoveTracedGlobalReference(internal::Address** from,
|
9721
|
+
internal::Address** to);
|
9722
|
+
static void CopyTracedGlobalReference(const internal::Address* const* from,
|
9723
|
+
internal::Address** to);
|
9724
|
+
static internal::Address* CopyGlobalReference(internal::Address* from);
|
8569
9725
|
static void DisposeGlobal(internal::Address* global_handle);
|
9726
|
+
static void DisposeTracedGlobal(internal::Address* global_handle);
|
8570
9727
|
static void MakeWeak(internal::Address* location, void* data,
|
8571
9728
|
WeakCallbackInfo<void>::Callback weak_callback,
|
8572
9729
|
WeakCallbackType type);
|
8573
9730
|
static void MakeWeak(internal::Address** location_addr);
|
8574
9731
|
static void* ClearWeak(internal::Address* location);
|
9732
|
+
static void SetFinalizationCallbackTraced(
|
9733
|
+
internal::Address* location, void* parameter,
|
9734
|
+
WeakCallbackInfo<void>::Callback callback);
|
8575
9735
|
static void AnnotateStrongRetainer(internal::Address* location,
|
8576
9736
|
const char* label);
|
8577
9737
|
static Value* Eternalize(Isolate* isolate, Value* handle);
|
8578
9738
|
|
8579
|
-
static void RegisterExternallyReferencedObject(internal::Address* location,
|
8580
|
-
internal::Isolate* isolate);
|
8581
|
-
|
8582
9739
|
template <class K, class V, class T>
|
8583
9740
|
friend class PersistentValueMapBase;
|
8584
9741
|
|
8585
9742
|
static void FromJustIsNothing();
|
8586
9743
|
static void ToLocalEmpty();
|
8587
9744
|
static void InternalFieldOutOfBounds(int index);
|
9745
|
+
template <class T>
|
9746
|
+
friend class Global;
|
8588
9747
|
template <class T> friend class Local;
|
8589
9748
|
template <class T>
|
8590
9749
|
friend class MaybeLocal;
|
8591
9750
|
template <class T>
|
8592
9751
|
friend class Maybe;
|
8593
9752
|
template <class T>
|
9753
|
+
friend class TracedReferenceBase;
|
9754
|
+
template <class T>
|
9755
|
+
friend class TracedGlobal;
|
9756
|
+
template <class T>
|
9757
|
+
friend class TracedReference;
|
9758
|
+
template <class T>
|
8594
9759
|
friend class WeakCallbackInfo;
|
8595
9760
|
template <class T> friend class Eternal;
|
8596
9761
|
template <class T> friend class PersistentBase;
|
@@ -8600,6 +9765,11 @@ class V8_EXPORT V8 {
|
|
8600
9765
|
|
8601
9766
|
/**
|
8602
9767
|
* Helper class to create a snapshot data blob.
|
9768
|
+
*
|
9769
|
+
* The Isolate used by a SnapshotCreator is owned by it, and will be entered
|
9770
|
+
* and exited by the constructor and destructor, respectively; The destructor
|
9771
|
+
* will also destroy the Isolate. Experimental language features, including
|
9772
|
+
* those available by default, are not available while creating a snapshot.
|
8603
9773
|
*/
|
8604
9774
|
class V8_EXPORT SnapshotCreator {
|
8605
9775
|
public:
|
@@ -8628,6 +9798,10 @@ class V8_EXPORT SnapshotCreator {
|
|
8628
9798
|
SnapshotCreator(const intptr_t* external_references = nullptr,
|
8629
9799
|
StartupData* existing_blob = nullptr);
|
8630
9800
|
|
9801
|
+
/**
|
9802
|
+
* Destroy the snapshot creator, and exit and dispose of the Isolate
|
9803
|
+
* associated with it.
|
9804
|
+
*/
|
8631
9805
|
~SnapshotCreator();
|
8632
9806
|
|
8633
9807
|
/**
|
@@ -8658,12 +9832,6 @@ class V8_EXPORT SnapshotCreator {
|
|
8658
9832
|
SerializeInternalFieldsCallback callback =
|
8659
9833
|
SerializeInternalFieldsCallback());
|
8660
9834
|
|
8661
|
-
/**
|
8662
|
-
* Add a template to be included in the snapshot blob.
|
8663
|
-
* \returns the index of the template in the snapshot blob.
|
8664
|
-
*/
|
8665
|
-
size_t AddTemplate(Local<Template> template_obj);
|
8666
|
-
|
8667
9835
|
/**
|
8668
9836
|
* Attach arbitrary V8::Data to the context snapshot, which can be retrieved
|
8669
9837
|
* via Context::GetDataFromSnapshot after deserialization. This data does not
|
@@ -8884,9 +10052,17 @@ class V8_EXPORT TryCatch {
|
|
8884
10052
|
Local<Value> Exception() const;
|
8885
10053
|
|
8886
10054
|
/**
|
8887
|
-
* Returns the .stack property of
|
10055
|
+
* Returns the .stack property of an object. If no .stack
|
8888
10056
|
* property is present an empty handle is returned.
|
8889
10057
|
*/
|
10058
|
+
V8_WARN_UNUSED_RESULT static MaybeLocal<Value> StackTrace(
|
10059
|
+
Local<Context> context, Local<Value> exception);
|
10060
|
+
|
10061
|
+
/**
|
10062
|
+
* Returns the .stack property of the thrown object. If no .stack property is
|
10063
|
+
* present or if this try/catch block has not caught an exception, an empty
|
10064
|
+
* handle is returned.
|
10065
|
+
*/
|
8890
10066
|
V8_WARN_UNUSED_RESULT MaybeLocal<Value> StackTrace(
|
8891
10067
|
Local<Context> context) const;
|
8892
10068
|
|
@@ -9046,7 +10222,8 @@ class V8_EXPORT Context {
|
|
9046
10222
|
MaybeLocal<ObjectTemplate> global_template = MaybeLocal<ObjectTemplate>(),
|
9047
10223
|
MaybeLocal<Value> global_object = MaybeLocal<Value>(),
|
9048
10224
|
DeserializeInternalFieldsCallback internal_fields_deserializer =
|
9049
|
-
DeserializeInternalFieldsCallback()
|
10225
|
+
DeserializeInternalFieldsCallback(),
|
10226
|
+
MicrotaskQueue* microtask_queue = nullptr);
|
9050
10227
|
|
9051
10228
|
/**
|
9052
10229
|
* Create a new context from a (non-default) context snapshot. There
|
@@ -9066,13 +10243,13 @@ class V8_EXPORT Context {
|
|
9066
10243
|
*
|
9067
10244
|
* \param global_object See v8::Context::New.
|
9068
10245
|
*/
|
9069
|
-
|
9070
10246
|
static MaybeLocal<Context> FromSnapshot(
|
9071
10247
|
Isolate* isolate, size_t context_snapshot_index,
|
9072
10248
|
DeserializeInternalFieldsCallback embedder_fields_deserializer =
|
9073
10249
|
DeserializeInternalFieldsCallback(),
|
9074
10250
|
ExtensionConfiguration* extensions = nullptr,
|
9075
|
-
MaybeLocal<Value> global_object = MaybeLocal<Value>()
|
10251
|
+
MaybeLocal<Value> global_object = MaybeLocal<Value>(),
|
10252
|
+
MicrotaskQueue* microtask_queue = nullptr);
|
9076
10253
|
|
9077
10254
|
/**
|
9078
10255
|
* Returns an global object that isn't backed by an actual context.
|
@@ -9207,6 +10384,27 @@ class V8_EXPORT Context {
|
|
9207
10384
|
template <class T>
|
9208
10385
|
V8_INLINE MaybeLocal<T> GetDataFromSnapshotOnce(size_t index);
|
9209
10386
|
|
10387
|
+
/**
|
10388
|
+
* If callback is set, abort any attempt to execute JavaScript in this
|
10389
|
+
* context, call the specified callback, and throw an exception.
|
10390
|
+
* To unset abort, pass nullptr as callback.
|
10391
|
+
*/
|
10392
|
+
typedef void (*AbortScriptExecutionCallback)(Isolate* isolate,
|
10393
|
+
Local<Context> context);
|
10394
|
+
void SetAbortScriptExecution(AbortScriptExecutionCallback callback);
|
10395
|
+
|
10396
|
+
/**
|
10397
|
+
* Returns the value that was set or restored by
|
10398
|
+
* SetContinuationPreservedEmbedderData(), if any.
|
10399
|
+
*/
|
10400
|
+
Local<Value> GetContinuationPreservedEmbedderData() const;
|
10401
|
+
|
10402
|
+
/**
|
10403
|
+
* Sets a value that will be stored on continuations and reset while the
|
10404
|
+
* continuation runs.
|
10405
|
+
*/
|
10406
|
+
void SetContinuationPreservedEmbedderData(Local<Value> context);
|
10407
|
+
|
9210
10408
|
/**
|
9211
10409
|
* Stack-allocated class which sets the execution context for all
|
9212
10410
|
* operations executed within a local scope.
|
@@ -9391,7 +10589,7 @@ class V8_EXPORT Locker {
|
|
9391
10589
|
/**
|
9392
10590
|
* Various helpers for skipping over V8 frames in a given stack.
|
9393
10591
|
*
|
9394
|
-
* The unwinder API is only supported on the x64
|
10592
|
+
* The unwinder API is only supported on the x64, ARM64 and ARM32 architectures.
|
9395
10593
|
*/
|
9396
10594
|
class V8_EXPORT Unwinder {
|
9397
10595
|
public:
|
@@ -9423,10 +10621,26 @@ class V8_EXPORT Unwinder {
|
|
9423
10621
|
*
|
9424
10622
|
* \return True on success.
|
9425
10623
|
*/
|
10624
|
+
// TODO(petermarshall): Remove this API
|
10625
|
+
V8_DEPRECATED("Use entry_stubs + code_pages version.")
|
9426
10626
|
static bool TryUnwindV8Frames(const UnwindState& unwind_state,
|
9427
10627
|
RegisterState* register_state,
|
9428
10628
|
const void* stack_base);
|
9429
10629
|
|
10630
|
+
/**
|
10631
|
+
* The same as above, but is available on x64, ARM64 and ARM32.
|
10632
|
+
*
|
10633
|
+
* \param code_pages A list of all of the ranges in which V8 has allocated
|
10634
|
+
* executable code. The caller should obtain this list by calling
|
10635
|
+
* Isolate::CopyCodePages() during the same interrupt/thread suspension that
|
10636
|
+
* captures the stack.
|
10637
|
+
*/
|
10638
|
+
static bool TryUnwindV8Frames(const JSEntryStubs& entry_stubs,
|
10639
|
+
size_t code_pages_length,
|
10640
|
+
const MemoryRange* code_pages,
|
10641
|
+
RegisterState* register_state,
|
10642
|
+
const void* stack_base);
|
10643
|
+
|
9430
10644
|
/**
|
9431
10645
|
* Whether the PC is within the V8 code range represented by code_range or
|
9432
10646
|
* embedded_code_range in |unwind_state|.
|
@@ -9435,7 +10649,16 @@ class V8_EXPORT Unwinder {
|
|
9435
10649
|
* and unwind_state will always fail. If it returns true, then unwinding may
|
9436
10650
|
* (but not necessarily) be successful.
|
9437
10651
|
*/
|
10652
|
+
// TODO(petermarshall): Remove this API
|
10653
|
+
V8_DEPRECATED("Use code_pages version.")
|
9438
10654
|
static bool PCIsInV8(const UnwindState& unwind_state, void* pc);
|
10655
|
+
|
10656
|
+
/**
|
10657
|
+
* The same as above, but is available on x64, ARM64 and ARM32. See the
|
10658
|
+
* comment on TryUnwindV8Frames.
|
10659
|
+
*/
|
10660
|
+
static bool PCIsInV8(size_t code_pages_length, const MemoryRange* code_pages,
|
10661
|
+
void* pc);
|
9439
10662
|
};
|
9440
10663
|
|
9441
10664
|
// --- Implementation ---
|
@@ -9450,6 +10673,10 @@ Local<T> Local<T>::New(Isolate* isolate, const PersistentBase<T>& that) {
|
|
9450
10673
|
return New(isolate, that.val_);
|
9451
10674
|
}
|
9452
10675
|
|
10676
|
+
template <class T>
|
10677
|
+
Local<T> Local<T>::New(Isolate* isolate, const TracedReferenceBase<T>& that) {
|
10678
|
+
return New(isolate, that.val_);
|
10679
|
+
}
|
9453
10680
|
|
9454
10681
|
template <class T>
|
9455
10682
|
Local<T> Local<T>::New(Isolate* isolate, T* that) {
|
@@ -9464,7 +10691,7 @@ Local<T> Local<T>::New(Isolate* isolate, T* that) {
|
|
9464
10691
|
template<class T>
|
9465
10692
|
template<class S>
|
9466
10693
|
void Eternal<T>::Set(Isolate* isolate, Local<S> handle) {
|
9467
|
-
|
10694
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
9468
10695
|
val_ = reinterpret_cast<T*>(
|
9469
10696
|
V8::Eternalize(isolate, reinterpret_cast<Value*>(*handle)));
|
9470
10697
|
}
|
@@ -9508,33 +10735,14 @@ T* PersistentBase<T>::New(Isolate* isolate, T* that) {
|
|
9508
10735
|
template <class T, class M>
|
9509
10736
|
template <class S, class M2>
|
9510
10737
|
void Persistent<T, M>::Copy(const Persistent<S, M2>& that) {
|
9511
|
-
|
10738
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
9512
10739
|
this->Reset();
|
9513
10740
|
if (that.IsEmpty()) return;
|
9514
10741
|
internal::Address* p = reinterpret_cast<internal::Address*>(that.val_);
|
9515
|
-
this->val_ = reinterpret_cast<T*>(V8::
|
10742
|
+
this->val_ = reinterpret_cast<T*>(V8::CopyGlobalReference(p));
|
9516
10743
|
M::Copy(that, this);
|
9517
10744
|
}
|
9518
10745
|
|
9519
|
-
template <class T>
|
9520
|
-
bool PersistentBase<T>::IsIndependent() const {
|
9521
|
-
typedef internal::Internals I;
|
9522
|
-
if (this->IsEmpty()) return false;
|
9523
|
-
return I::GetNodeFlag(reinterpret_cast<internal::Address*>(this->val_),
|
9524
|
-
I::kNodeIsIndependentShift);
|
9525
|
-
}
|
9526
|
-
|
9527
|
-
template <class T>
|
9528
|
-
bool PersistentBase<T>::IsNearDeath() const {
|
9529
|
-
typedef internal::Internals I;
|
9530
|
-
if (this->IsEmpty()) return false;
|
9531
|
-
uint8_t node_state =
|
9532
|
-
I::GetNodeState(reinterpret_cast<internal::Address*>(this->val_));
|
9533
|
-
return node_state == I::kNodeStateIsNearDeathValue ||
|
9534
|
-
node_state == I::kNodeStateIsPendingValue;
|
9535
|
-
}
|
9536
|
-
|
9537
|
-
|
9538
10746
|
template <class T>
|
9539
10747
|
bool PersistentBase<T>::IsWeak() const {
|
9540
10748
|
typedef internal::Internals I;
|
@@ -9555,7 +10763,7 @@ void PersistentBase<T>::Reset() {
|
|
9555
10763
|
template <class T>
|
9556
10764
|
template <class S>
|
9557
10765
|
void PersistentBase<T>::Reset(Isolate* isolate, const Local<S>& other) {
|
9558
|
-
|
10766
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
9559
10767
|
Reset();
|
9560
10768
|
if (other.IsEmpty()) return;
|
9561
10769
|
this->val_ = New(isolate, other.val_);
|
@@ -9566,7 +10774,7 @@ template <class T>
|
|
9566
10774
|
template <class S>
|
9567
10775
|
void PersistentBase<T>::Reset(Isolate* isolate,
|
9568
10776
|
const PersistentBase<S>& other) {
|
9569
|
-
|
10777
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
9570
10778
|
Reset();
|
9571
10779
|
if (other.IsEmpty()) return;
|
9572
10780
|
this->val_ = New(isolate, other.val_);
|
@@ -9602,56 +10810,199 @@ void PersistentBase<T>::AnnotateStrongRetainer(const char* label) {
|
|
9602
10810
|
}
|
9603
10811
|
|
9604
10812
|
template <class T>
|
9605
|
-
void PersistentBase<T>::
|
9606
|
-
|
9607
|
-
|
9608
|
-
|
9609
|
-
|
10813
|
+
void PersistentBase<T>::SetWrapperClassId(uint16_t class_id) {
|
10814
|
+
typedef internal::Internals I;
|
10815
|
+
if (this->IsEmpty()) return;
|
10816
|
+
internal::Address* obj = reinterpret_cast<internal::Address*>(this->val_);
|
10817
|
+
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
|
10818
|
+
*reinterpret_cast<uint16_t*>(addr) = class_id;
|
9610
10819
|
}
|
9611
10820
|
|
10821
|
+
|
9612
10822
|
template <class T>
|
9613
|
-
|
10823
|
+
uint16_t PersistentBase<T>::WrapperClassId() const {
|
9614
10824
|
typedef internal::Internals I;
|
9615
|
-
if (this->IsEmpty()) return;
|
9616
|
-
|
9617
|
-
|
10825
|
+
if (this->IsEmpty()) return 0;
|
10826
|
+
internal::Address* obj = reinterpret_cast<internal::Address*>(this->val_);
|
10827
|
+
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
|
10828
|
+
return *reinterpret_cast<uint16_t*>(addr);
|
9618
10829
|
}
|
9619
10830
|
|
9620
10831
|
template <class T>
|
9621
|
-
|
9622
|
-
|
9623
|
-
|
9624
|
-
|
9625
|
-
|
10832
|
+
Global<T>::Global(Global&& other) : PersistentBase<T>(other.val_) {
|
10833
|
+
if (other.val_ != nullptr) {
|
10834
|
+
V8::MoveGlobalReference(reinterpret_cast<internal::Address**>(&other.val_),
|
10835
|
+
reinterpret_cast<internal::Address**>(&this->val_));
|
10836
|
+
other.val_ = nullptr;
|
10837
|
+
}
|
10838
|
+
}
|
10839
|
+
|
10840
|
+
template <class T>
|
10841
|
+
template <class S>
|
10842
|
+
Global<T>& Global<T>::operator=(Global<S>&& rhs) {
|
10843
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
10844
|
+
if (this != &rhs) {
|
10845
|
+
this->Reset();
|
10846
|
+
if (rhs.val_ != nullptr) {
|
10847
|
+
this->val_ = rhs.val_;
|
10848
|
+
V8::MoveGlobalReference(
|
10849
|
+
reinterpret_cast<internal::Address**>(&rhs.val_),
|
10850
|
+
reinterpret_cast<internal::Address**>(&this->val_));
|
10851
|
+
rhs.val_ = nullptr;
|
10852
|
+
}
|
10853
|
+
}
|
10854
|
+
return *this;
|
9626
10855
|
}
|
9627
10856
|
|
10857
|
+
template <class T>
|
10858
|
+
T* TracedReferenceBase<T>::New(Isolate* isolate, T* that, void* slot,
|
10859
|
+
DestructionMode destruction_mode) {
|
10860
|
+
if (that == nullptr) return nullptr;
|
10861
|
+
internal::Address* p = reinterpret_cast<internal::Address*>(that);
|
10862
|
+
return reinterpret_cast<T*>(V8::GlobalizeTracedReference(
|
10863
|
+
reinterpret_cast<internal::Isolate*>(isolate), p,
|
10864
|
+
reinterpret_cast<internal::Address*>(slot),
|
10865
|
+
destruction_mode == kWithDestructor));
|
10866
|
+
}
|
9628
10867
|
|
9629
10868
|
template <class T>
|
9630
|
-
void
|
10869
|
+
void TracedReferenceBase<T>::Reset() {
|
10870
|
+
if (IsEmpty()) return;
|
10871
|
+
V8::DisposeTracedGlobal(reinterpret_cast<internal::Address*>(val_));
|
10872
|
+
val_ = nullptr;
|
10873
|
+
}
|
10874
|
+
|
10875
|
+
template <class T>
|
10876
|
+
template <class S>
|
10877
|
+
void TracedGlobal<T>::Reset(Isolate* isolate, const Local<S>& other) {
|
10878
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
10879
|
+
Reset();
|
10880
|
+
if (other.IsEmpty()) return;
|
10881
|
+
this->val_ = this->New(isolate, other.val_, &this->val_,
|
10882
|
+
TracedReferenceBase<T>::kWithDestructor);
|
10883
|
+
}
|
10884
|
+
|
10885
|
+
template <class T>
|
10886
|
+
template <class S>
|
10887
|
+
TracedGlobal<T>& TracedGlobal<T>::operator=(TracedGlobal<S>&& rhs) {
|
10888
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
10889
|
+
*this = std::move(rhs.template As<T>());
|
10890
|
+
return *this;
|
10891
|
+
}
|
10892
|
+
|
10893
|
+
template <class T>
|
10894
|
+
template <class S>
|
10895
|
+
TracedGlobal<T>& TracedGlobal<T>::operator=(const TracedGlobal<S>& rhs) {
|
10896
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
10897
|
+
*this = rhs.template As<T>();
|
10898
|
+
return *this;
|
10899
|
+
}
|
10900
|
+
|
10901
|
+
template <class T>
|
10902
|
+
TracedGlobal<T>& TracedGlobal<T>::operator=(TracedGlobal&& rhs) {
|
10903
|
+
if (this != &rhs) {
|
10904
|
+
V8::MoveTracedGlobalReference(
|
10905
|
+
reinterpret_cast<internal::Address**>(&rhs.val_),
|
10906
|
+
reinterpret_cast<internal::Address**>(&this->val_));
|
10907
|
+
}
|
10908
|
+
return *this;
|
10909
|
+
}
|
10910
|
+
|
10911
|
+
template <class T>
|
10912
|
+
TracedGlobal<T>& TracedGlobal<T>::operator=(const TracedGlobal& rhs) {
|
10913
|
+
if (this != &rhs) {
|
10914
|
+
this->Reset();
|
10915
|
+
if (rhs.val_ != nullptr) {
|
10916
|
+
V8::CopyTracedGlobalReference(
|
10917
|
+
reinterpret_cast<const internal::Address* const*>(&rhs.val_),
|
10918
|
+
reinterpret_cast<internal::Address**>(&this->val_));
|
10919
|
+
}
|
10920
|
+
}
|
10921
|
+
return *this;
|
10922
|
+
}
|
10923
|
+
|
10924
|
+
template <class T>
|
10925
|
+
template <class S>
|
10926
|
+
void TracedReference<T>::Reset(Isolate* isolate, const Local<S>& other) {
|
10927
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
10928
|
+
Reset();
|
10929
|
+
if (other.IsEmpty()) return;
|
10930
|
+
this->val_ = this->New(isolate, other.val_, &this->val_,
|
10931
|
+
TracedReferenceBase<T>::kWithoutDestructor);
|
10932
|
+
}
|
10933
|
+
|
10934
|
+
template <class T>
|
10935
|
+
template <class S>
|
10936
|
+
TracedReference<T>& TracedReference<T>::operator=(TracedReference<S>&& rhs) {
|
10937
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
10938
|
+
*this = std::move(rhs.template As<T>());
|
10939
|
+
return *this;
|
10940
|
+
}
|
10941
|
+
|
10942
|
+
template <class T>
|
10943
|
+
template <class S>
|
10944
|
+
TracedReference<T>& TracedReference<T>::operator=(
|
10945
|
+
const TracedReference<S>& rhs) {
|
10946
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
10947
|
+
*this = rhs.template As<T>();
|
10948
|
+
return *this;
|
10949
|
+
}
|
10950
|
+
|
10951
|
+
template <class T>
|
10952
|
+
TracedReference<T>& TracedReference<T>::operator=(TracedReference&& rhs) {
|
10953
|
+
if (this != &rhs) {
|
10954
|
+
V8::MoveTracedGlobalReference(
|
10955
|
+
reinterpret_cast<internal::Address**>(&rhs.val_),
|
10956
|
+
reinterpret_cast<internal::Address**>(&this->val_));
|
10957
|
+
}
|
10958
|
+
return *this;
|
10959
|
+
}
|
10960
|
+
|
10961
|
+
template <class T>
|
10962
|
+
TracedReference<T>& TracedReference<T>::operator=(const TracedReference& rhs) {
|
10963
|
+
if (this != &rhs) {
|
10964
|
+
this->Reset();
|
10965
|
+
if (rhs.val_ != nullptr) {
|
10966
|
+
V8::CopyTracedGlobalReference(
|
10967
|
+
reinterpret_cast<const internal::Address* const*>(&rhs.val_),
|
10968
|
+
reinterpret_cast<internal::Address**>(&this->val_));
|
10969
|
+
}
|
10970
|
+
}
|
10971
|
+
return *this;
|
10972
|
+
}
|
10973
|
+
|
10974
|
+
template <class T>
|
10975
|
+
void TracedReferenceBase<T>::SetWrapperClassId(uint16_t class_id) {
|
9631
10976
|
typedef internal::Internals I;
|
9632
|
-
if (
|
9633
|
-
internal::Address* obj = reinterpret_cast<internal::Address*>(
|
10977
|
+
if (IsEmpty()) return;
|
10978
|
+
internal::Address* obj = reinterpret_cast<internal::Address*>(val_);
|
9634
10979
|
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
|
9635
10980
|
*reinterpret_cast<uint16_t*>(addr) = class_id;
|
9636
10981
|
}
|
9637
10982
|
|
9638
|
-
|
9639
10983
|
template <class T>
|
9640
|
-
uint16_t
|
10984
|
+
uint16_t TracedReferenceBase<T>::WrapperClassId() const {
|
9641
10985
|
typedef internal::Internals I;
|
9642
|
-
if (
|
9643
|
-
internal::Address* obj = reinterpret_cast<internal::Address*>(
|
10986
|
+
if (IsEmpty()) return 0;
|
10987
|
+
internal::Address* obj = reinterpret_cast<internal::Address*>(val_);
|
9644
10988
|
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + I::kNodeClassIdOffset;
|
9645
10989
|
return *reinterpret_cast<uint16_t*>(addr);
|
9646
10990
|
}
|
9647
10991
|
|
10992
|
+
template <class T>
|
10993
|
+
void TracedGlobal<T>::SetFinalizationCallback(
|
10994
|
+
void* parameter, typename WeakCallbackInfo<void>::Callback callback) {
|
10995
|
+
V8::SetFinalizationCallbackTraced(
|
10996
|
+
reinterpret_cast<internal::Address*>(this->val_), parameter, callback);
|
10997
|
+
}
|
10998
|
+
|
9648
10999
|
template <typename T>
|
9649
11000
|
ReturnValue<T>::ReturnValue(internal::Address* slot) : value_(slot) {}
|
9650
11001
|
|
9651
|
-
template<typename T>
|
9652
|
-
template<typename S>
|
9653
|
-
void ReturnValue<T>::Set(const
|
9654
|
-
|
11002
|
+
template <typename T>
|
11003
|
+
template <typename S>
|
11004
|
+
void ReturnValue<T>::Set(const Global<S>& handle) {
|
11005
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
9655
11006
|
if (V8_UNLIKELY(handle.IsEmpty())) {
|
9656
11007
|
*value_ = GetDefaultValue();
|
9657
11008
|
} else {
|
@@ -9661,19 +11012,20 @@ void ReturnValue<T>::Set(const Persistent<S>& handle) {
|
|
9661
11012
|
|
9662
11013
|
template <typename T>
|
9663
11014
|
template <typename S>
|
9664
|
-
void ReturnValue<T>::Set(const
|
9665
|
-
|
11015
|
+
void ReturnValue<T>::Set(const TracedReferenceBase<S>& handle) {
|
11016
|
+
static_assert(std::is_base_of<T, S>::value, "type check");
|
9666
11017
|
if (V8_UNLIKELY(handle.IsEmpty())) {
|
9667
11018
|
*value_ = GetDefaultValue();
|
9668
11019
|
} else {
|
9669
|
-
*value_ = *reinterpret_cast<internal::Address*>(
|
11020
|
+
*value_ = *reinterpret_cast<internal::Address*>(handle.val_);
|
9670
11021
|
}
|
9671
11022
|
}
|
9672
11023
|
|
9673
11024
|
template <typename T>
|
9674
11025
|
template <typename S>
|
9675
11026
|
void ReturnValue<T>::Set(const Local<S> handle) {
|
9676
|
-
|
11027
|
+
static_assert(std::is_void<T>::value || std::is_base_of<T, S>::value,
|
11028
|
+
"type check");
|
9677
11029
|
if (V8_UNLIKELY(handle.IsEmpty())) {
|
9678
11030
|
*value_ = GetDefaultValue();
|
9679
11031
|
} else {
|
@@ -9683,13 +11035,13 @@ void ReturnValue<T>::Set(const Local<S> handle) {
|
|
9683
11035
|
|
9684
11036
|
template<typename T>
|
9685
11037
|
void ReturnValue<T>::Set(double i) {
|
9686
|
-
|
11038
|
+
static_assert(std::is_base_of<T, Number>::value, "type check");
|
9687
11039
|
Set(Number::New(GetIsolate(), i));
|
9688
11040
|
}
|
9689
11041
|
|
9690
11042
|
template<typename T>
|
9691
11043
|
void ReturnValue<T>::Set(int32_t i) {
|
9692
|
-
|
11044
|
+
static_assert(std::is_base_of<T, Integer>::value, "type check");
|
9693
11045
|
typedef internal::Internals I;
|
9694
11046
|
if (V8_LIKELY(I::IsValidSmi(i))) {
|
9695
11047
|
*value_ = I::IntToSmi(i);
|
@@ -9700,7 +11052,7 @@ void ReturnValue<T>::Set(int32_t i) {
|
|
9700
11052
|
|
9701
11053
|
template<typename T>
|
9702
11054
|
void ReturnValue<T>::Set(uint32_t i) {
|
9703
|
-
|
11055
|
+
static_assert(std::is_base_of<T, Integer>::value, "type check");
|
9704
11056
|
// Can't simply use INT32_MAX here for whatever reason.
|
9705
11057
|
bool fits_into_int32_t = (i & (1U << 31)) == 0;
|
9706
11058
|
if (V8_LIKELY(fits_into_int32_t)) {
|
@@ -9712,7 +11064,7 @@ void ReturnValue<T>::Set(uint32_t i) {
|
|
9712
11064
|
|
9713
11065
|
template<typename T>
|
9714
11066
|
void ReturnValue<T>::Set(bool value) {
|
9715
|
-
|
11067
|
+
static_assert(std::is_base_of<T, Boolean>::value, "type check");
|
9716
11068
|
typedef internal::Internals I;
|
9717
11069
|
int root_index;
|
9718
11070
|
if (value) {
|
@@ -9725,21 +11077,21 @@ void ReturnValue<T>::Set(bool value) {
|
|
9725
11077
|
|
9726
11078
|
template<typename T>
|
9727
11079
|
void ReturnValue<T>::SetNull() {
|
9728
|
-
|
11080
|
+
static_assert(std::is_base_of<T, Primitive>::value, "type check");
|
9729
11081
|
typedef internal::Internals I;
|
9730
11082
|
*value_ = *I::GetRoot(GetIsolate(), I::kNullValueRootIndex);
|
9731
11083
|
}
|
9732
11084
|
|
9733
11085
|
template<typename T>
|
9734
11086
|
void ReturnValue<T>::SetUndefined() {
|
9735
|
-
|
11087
|
+
static_assert(std::is_base_of<T, Primitive>::value, "type check");
|
9736
11088
|
typedef internal::Internals I;
|
9737
11089
|
*value_ = *I::GetRoot(GetIsolate(), I::kUndefinedValueRootIndex);
|
9738
11090
|
}
|
9739
11091
|
|
9740
11092
|
template<typename T>
|
9741
11093
|
void ReturnValue<T>::SetEmptyString() {
|
9742
|
-
|
11094
|
+
static_assert(std::is_base_of<T, String>::value, "type check");
|
9743
11095
|
typedef internal::Internals I;
|
9744
11096
|
*value_ = *I::GetRoot(GetIsolate(), I::kEmptyStringRootIndex);
|
9745
11097
|
}
|
@@ -9761,8 +11113,7 @@ Local<Value> ReturnValue<T>::Get() const {
|
|
9761
11113
|
template <typename T>
|
9762
11114
|
template <typename S>
|
9763
11115
|
void ReturnValue<T>::Set(S* whatever) {
|
9764
|
-
|
9765
|
-
TYPE_CHECK(S*, Primitive);
|
11116
|
+
static_assert(sizeof(S) < 0, "incompilable to prevent inadvertent misuse");
|
9766
11117
|
}
|
9767
11118
|
|
9768
11119
|
template <typename T>
|
@@ -9779,14 +11130,24 @@ FunctionCallbackInfo<T>::FunctionCallbackInfo(internal::Address* implicit_args,
|
|
9779
11130
|
|
9780
11131
|
template<typename T>
|
9781
11132
|
Local<Value> FunctionCallbackInfo<T>::operator[](int i) const {
|
11133
|
+
// values_ points to the first argument (not the receiver).
|
9782
11134
|
if (i < 0 || length_ <= i) return Local<Value>(*Undefined(GetIsolate()));
|
11135
|
+
#ifdef V8_REVERSE_JSARGS
|
11136
|
+
return Local<Value>(reinterpret_cast<Value*>(values_ + i));
|
11137
|
+
#else
|
9783
11138
|
return Local<Value>(reinterpret_cast<Value*>(values_ - i));
|
11139
|
+
#endif
|
9784
11140
|
}
|
9785
11141
|
|
9786
11142
|
|
9787
11143
|
template<typename T>
|
9788
11144
|
Local<Object> FunctionCallbackInfo<T>::This() const {
|
11145
|
+
// values_ points to the first argument (not the receiver).
|
11146
|
+
#ifdef V8_REVERSE_JSARGS
|
11147
|
+
return Local<Object>(reinterpret_cast<Object*>(values_ - 1));
|
11148
|
+
#else
|
9789
11149
|
return Local<Object>(reinterpret_cast<Object*>(values_ + 1));
|
11150
|
+
#endif
|
9790
11151
|
}
|
9791
11152
|
|
9792
11153
|
|
@@ -9942,7 +11303,7 @@ AccessorSignature* AccessorSignature::Cast(Data* data) {
|
|
9942
11303
|
}
|
9943
11304
|
|
9944
11305
|
Local<Value> Object::GetInternalField(int index) {
|
9945
|
-
#
|
11306
|
+
#ifndef V8_ENABLE_CHECKS
|
9946
11307
|
typedef internal::Address A;
|
9947
11308
|
typedef internal::Internals I;
|
9948
11309
|
A obj = *reinterpret_cast<A*>(this);
|
@@ -9952,9 +11313,13 @@ Local<Value> Object::GetInternalField(int index) {
|
|
9952
11313
|
if (instance_type == I::kJSObjectType ||
|
9953
11314
|
instance_type == I::kJSApiObjectType ||
|
9954
11315
|
instance_type == I::kJSSpecialApiObjectType) {
|
9955
|
-
int offset = I::
|
9956
|
-
|
9957
|
-
|
11316
|
+
int offset = I::kJSObjectHeaderSize + (I::kEmbedderDataSlotSize * index);
|
11317
|
+
A value = I::ReadRawField<A>(obj, offset);
|
11318
|
+
#ifdef V8_COMPRESS_POINTERS
|
11319
|
+
// We read the full pointer value and then decompress it in order to avoid
|
11320
|
+
// dealing with potential endiannes issues.
|
11321
|
+
value = I::DecompressTaggedAnyField(obj, static_cast<uint32_t>(value));
|
11322
|
+
#endif
|
9958
11323
|
internal::Isolate* isolate =
|
9959
11324
|
internal::IsolateFromNeverReadOnlySpaceObject(obj);
|
9960
11325
|
A* result = HandleScope::CreateHandle(isolate, value);
|
@@ -9966,7 +11331,7 @@ Local<Value> Object::GetInternalField(int index) {
|
|
9966
11331
|
|
9967
11332
|
|
9968
11333
|
void* Object::GetAlignedPointerFromInternalField(int index) {
|
9969
|
-
#
|
11334
|
+
#ifndef V8_ENABLE_CHECKS
|
9970
11335
|
typedef internal::Address A;
|
9971
11336
|
typedef internal::Internals I;
|
9972
11337
|
A obj = *reinterpret_cast<A*>(this);
|
@@ -9976,8 +11341,7 @@ void* Object::GetAlignedPointerFromInternalField(int index) {
|
|
9976
11341
|
if (V8_LIKELY(instance_type == I::kJSObjectType ||
|
9977
11342
|
instance_type == I::kJSApiObjectType ||
|
9978
11343
|
instance_type == I::kJSSpecialApiObjectType)) {
|
9979
|
-
int offset = I::
|
9980
|
-
(I::kEmbedderDataSlotSize * index);
|
11344
|
+
int offset = I::kJSObjectHeaderSize + (I::kEmbedderDataSlotSize * index);
|
9981
11345
|
return I::ReadRawField<void*>(obj, offset);
|
9982
11346
|
}
|
9983
11347
|
#endif
|
@@ -10476,10 +11840,14 @@ ReturnValue<T> PropertyCallbackInfo<T>::GetReturnValue() const {
|
|
10476
11840
|
template <typename T>
|
10477
11841
|
bool PropertyCallbackInfo<T>::ShouldThrowOnError() const {
|
10478
11842
|
typedef internal::Internals I;
|
10479
|
-
|
11843
|
+
if (args_[kShouldThrowOnErrorIndex] !=
|
11844
|
+
I::IntToSmi(I::kInferShouldThrowMode)) {
|
11845
|
+
return args_[kShouldThrowOnErrorIndex] != I::IntToSmi(I::kDontThrow);
|
11846
|
+
}
|
11847
|
+
return v8::internal::ShouldThrowOnError(
|
11848
|
+
reinterpret_cast<v8::internal::Isolate*>(GetIsolate()));
|
10480
11849
|
}
|
10481
11850
|
|
10482
|
-
|
10483
11851
|
Local<Primitive> Undefined(Isolate* isolate) {
|
10484
11852
|
typedef internal::Address S;
|
10485
11853
|
typedef internal::Internals I;
|
@@ -10543,44 +11911,53 @@ MaybeLocal<T> Isolate::GetDataFromSnapshotOnce(size_t index) {
|
|
10543
11911
|
int64_t Isolate::AdjustAmountOfExternalAllocatedMemory(
|
10544
11912
|
int64_t change_in_bytes) {
|
10545
11913
|
typedef internal::Internals I;
|
10546
|
-
constexpr int64_t kMemoryReducerActivationLimit = 32 * 1024 * 1024;
|
10547
11914
|
int64_t* external_memory = reinterpret_cast<int64_t*>(
|
10548
11915
|
reinterpret_cast<uint8_t*>(this) + I::kExternalMemoryOffset);
|
10549
11916
|
int64_t* external_memory_limit = reinterpret_cast<int64_t*>(
|
10550
11917
|
reinterpret_cast<uint8_t*>(this) + I::kExternalMemoryLimitOffset);
|
10551
|
-
int64_t*
|
11918
|
+
int64_t* external_memory_low_since_mc =
|
10552
11919
|
reinterpret_cast<int64_t*>(reinterpret_cast<uint8_t*>(this) +
|
10553
|
-
I::
|
11920
|
+
I::kExternalMemoryLowSinceMarkCompactOffset);
|
10554
11921
|
|
10555
|
-
|
11922
|
+
// Embedders are weird: we see both over- and underflows here. Perform the
|
11923
|
+
// addition with unsigned types to avoid undefined behavior.
|
11924
|
+
const int64_t amount =
|
11925
|
+
static_cast<int64_t>(static_cast<uint64_t>(change_in_bytes) +
|
11926
|
+
static_cast<uint64_t>(*external_memory));
|
10556
11927
|
*external_memory = amount;
|
10557
11928
|
|
10558
|
-
|
10559
|
-
|
10560
|
-
|
10561
|
-
// external memory increased.
|
10562
|
-
if (allocation_diff_since_last_mc > kMemoryReducerActivationLimit) {
|
10563
|
-
CheckMemoryPressure();
|
11929
|
+
if (amount < *external_memory_low_since_mc) {
|
11930
|
+
*external_memory_low_since_mc = amount;
|
11931
|
+
*external_memory_limit = amount + I::kExternalAllocationSoftLimit;
|
10564
11932
|
}
|
10565
11933
|
|
10566
|
-
if (change_in_bytes
|
10567
|
-
|
10568
|
-
|
10569
|
-
*external_memory_limit = lower_limit;
|
10570
|
-
} else if (change_in_bytes > 0 && amount > *external_memory_limit) {
|
11934
|
+
if (change_in_bytes <= 0) return *external_memory;
|
11935
|
+
|
11936
|
+
if (amount > *external_memory_limit) {
|
10571
11937
|
ReportExternalAllocationLimitReached();
|
10572
11938
|
}
|
10573
11939
|
return *external_memory;
|
10574
11940
|
}
|
10575
11941
|
|
10576
11942
|
Local<Value> Context::GetEmbedderData(int index) {
|
10577
|
-
#
|
11943
|
+
#ifndef V8_ENABLE_CHECKS
|
10578
11944
|
typedef internal::Address A;
|
10579
11945
|
typedef internal::Internals I;
|
11946
|
+
A ctx = *reinterpret_cast<const A*>(this);
|
11947
|
+
A embedder_data =
|
11948
|
+
I::ReadTaggedPointerField(ctx, I::kNativeContextEmbedderDataOffset);
|
11949
|
+
int value_offset =
|
11950
|
+
I::kEmbedderDataArrayHeaderSize + (I::kEmbedderDataSlotSize * index);
|
11951
|
+
A value = I::ReadRawField<A>(embedder_data, value_offset);
|
11952
|
+
#ifdef V8_COMPRESS_POINTERS
|
11953
|
+
// We read the full pointer value and then decompress it in order to avoid
|
11954
|
+
// dealing with potential endiannes issues.
|
11955
|
+
value =
|
11956
|
+
I::DecompressTaggedAnyField(embedder_data, static_cast<uint32_t>(value));
|
11957
|
+
#endif
|
10580
11958
|
internal::Isolate* isolate = internal::IsolateFromNeverReadOnlySpaceObject(
|
10581
11959
|
*reinterpret_cast<A*>(this));
|
10582
|
-
A* result =
|
10583
|
-
HandleScope::CreateHandle(isolate, I::ReadEmbedderData<A>(this, index));
|
11960
|
+
A* result = HandleScope::CreateHandle(isolate, value);
|
10584
11961
|
return Local<Value>(reinterpret_cast<Value*>(result));
|
10585
11962
|
#else
|
10586
11963
|
return SlowGetEmbedderData(index);
|
@@ -10589,9 +11966,15 @@ Local<Value> Context::GetEmbedderData(int index) {
|
|
10589
11966
|
|
10590
11967
|
|
10591
11968
|
void* Context::GetAlignedPointerFromEmbedderData(int index) {
|
10592
|
-
#
|
11969
|
+
#ifndef V8_ENABLE_CHECKS
|
11970
|
+
typedef internal::Address A;
|
10593
11971
|
typedef internal::Internals I;
|
10594
|
-
|
11972
|
+
A ctx = *reinterpret_cast<const A*>(this);
|
11973
|
+
A embedder_data =
|
11974
|
+
I::ReadTaggedPointerField(ctx, I::kNativeContextEmbedderDataOffset);
|
11975
|
+
int value_offset =
|
11976
|
+
I::kEmbedderDataArrayHeaderSize + (I::kEmbedderDataSlotSize * index);
|
11977
|
+
return I::ReadRawField<void*>(embedder_data, value_offset);
|
10595
11978
|
#else
|
10596
11979
|
return SlowGetAlignedPointerFromEmbedderData(index);
|
10597
11980
|
#endif
|
@@ -10632,8 +12015,4 @@ size_t SnapshotCreator::AddData(Local<T> object) {
|
|
10632
12015
|
|
10633
12016
|
} // namespace v8
|
10634
12017
|
|
10635
|
-
|
10636
|
-
#undef TYPE_CHECK
|
10637
|
-
|
10638
|
-
|
10639
12018
|
#endif // INCLUDE_V8_H_
|