libv8-node 18.13.0.1-x86_64-darwin → 20.2.0.0-x86_64-darwin
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/libv8/node/version.rb +3 -3
- data/vendor/v8/include/cppgc/common.h +0 -1
- data/vendor/v8/include/cppgc/cross-thread-persistent.h +11 -10
- data/vendor/v8/include/cppgc/heap-consistency.h +46 -3
- data/vendor/v8/include/cppgc/heap-handle.h +48 -0
- data/vendor/v8/include/cppgc/heap-statistics.h +2 -2
- data/vendor/v8/include/cppgc/heap.h +3 -7
- data/vendor/v8/include/cppgc/internal/api-constants.h +14 -1
- data/vendor/v8/include/cppgc/internal/base-page-handle.h +45 -0
- data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +40 -8
- data/vendor/v8/include/cppgc/internal/caged-heap.h +61 -0
- data/vendor/v8/include/cppgc/internal/gc-info.h +35 -34
- data/vendor/v8/include/cppgc/internal/member-storage.h +248 -0
- data/vendor/v8/include/cppgc/internal/name-trait.h +21 -6
- data/vendor/v8/include/cppgc/internal/persistent-node.h +11 -13
- data/vendor/v8/include/cppgc/internal/pointer-policies.h +65 -8
- data/vendor/v8/include/cppgc/internal/write-barrier.h +153 -101
- data/vendor/v8/include/cppgc/liveness-broker.h +8 -7
- data/vendor/v8/include/cppgc/macros.h +10 -1
- data/vendor/v8/include/cppgc/member.h +424 -111
- data/vendor/v8/include/cppgc/name-provider.h +4 -4
- data/vendor/v8/include/cppgc/persistent.h +27 -24
- data/vendor/v8/include/cppgc/platform.h +7 -5
- data/vendor/v8/include/cppgc/sentinel-pointer.h +1 -1
- data/vendor/v8/include/cppgc/trace-trait.h +4 -0
- data/vendor/v8/include/cppgc/type-traits.h +13 -3
- data/vendor/v8/include/cppgc/visitor.h +104 -57
- data/vendor/v8/include/libplatform/v8-tracing.h +2 -2
- data/vendor/v8/include/v8-array-buffer.h +59 -0
- data/vendor/v8/include/v8-callbacks.h +32 -5
- data/vendor/v8/include/v8-context.h +63 -11
- data/vendor/v8/include/v8-cppgc.h +22 -0
- data/vendor/v8/include/v8-data.h +1 -1
- data/vendor/v8/include/v8-date.h +5 -0
- data/vendor/v8/include/v8-embedder-heap.h +0 -164
- data/vendor/v8/include/v8-exception.h +1 -1
- data/vendor/v8/include/v8-fast-api-calls.h +49 -31
- data/vendor/v8/include/v8-function-callback.h +69 -42
- data/vendor/v8/include/v8-function.h +9 -0
- data/vendor/v8/include/v8-initialization.h +23 -49
- data/vendor/v8/include/v8-inspector.h +32 -11
- data/vendor/v8/include/v8-internal.h +480 -183
- data/vendor/v8/include/v8-isolate.h +52 -77
- data/vendor/v8/include/v8-local-handle.h +86 -53
- data/vendor/v8/include/v8-locker.h +0 -11
- data/vendor/v8/include/v8-maybe.h +24 -1
- data/vendor/v8/include/v8-message.h +2 -4
- data/vendor/v8/include/v8-metrics.h +48 -40
- data/vendor/v8/include/v8-microtask-queue.h +6 -1
- data/vendor/v8/include/v8-object.h +29 -18
- data/vendor/v8/include/v8-persistent-handle.h +25 -18
- data/vendor/v8/include/v8-platform.h +133 -35
- data/vendor/v8/include/v8-primitive.h +27 -20
- data/vendor/v8/include/v8-profiler.h +133 -53
- data/vendor/v8/include/v8-regexp.h +2 -1
- data/vendor/v8/include/v8-script.h +91 -7
- data/vendor/v8/include/v8-snapshot.h +4 -8
- data/vendor/v8/include/v8-template.h +16 -77
- data/vendor/v8/include/v8-traced-handle.h +22 -28
- data/vendor/v8/include/v8-unwinder-state.h +4 -4
- data/vendor/v8/include/v8-util.h +11 -7
- data/vendor/v8/include/v8-value-serializer.h +46 -23
- data/vendor/v8/include/v8-value.h +31 -4
- data/vendor/v8/include/v8-version.h +4 -4
- data/vendor/v8/include/v8-wasm.h +7 -63
- data/vendor/v8/include/v8-weak-callback-info.h +0 -7
- data/vendor/v8/include/v8config.h +353 -15
- data/vendor/v8/x86_64-darwin/libv8/obj/libv8_monolith.a +0 -0
- metadata +5 -1
@@ -70,7 +70,7 @@ class V8_EXPORT ScriptOrigin {
|
|
70
70
|
bool resource_is_opaque = false, bool is_wasm = false,
|
71
71
|
bool is_module = false,
|
72
72
|
Local<Data> host_defined_options = Local<Data>())
|
73
|
-
:
|
73
|
+
: v8_isolate_(isolate),
|
74
74
|
resource_name_(resource_name),
|
75
75
|
resource_line_offset_(resource_line_offset),
|
76
76
|
resource_column_offset_(resource_column_offset),
|
@@ -87,14 +87,12 @@ class V8_EXPORT ScriptOrigin {
|
|
87
87
|
V8_INLINE int ColumnOffset() const;
|
88
88
|
V8_INLINE int ScriptId() const;
|
89
89
|
V8_INLINE Local<Value> SourceMapUrl() const;
|
90
|
-
V8_DEPRECATE_SOON("Use GetHostDefinedOptions")
|
91
|
-
Local<PrimitiveArray> HostDefinedOptions() const;
|
92
90
|
V8_INLINE Local<Data> GetHostDefinedOptions() const;
|
93
91
|
V8_INLINE ScriptOriginOptions Options() const { return options_; }
|
94
92
|
|
95
93
|
private:
|
96
94
|
void VerifyHostDefinedOptions() const;
|
97
|
-
Isolate*
|
95
|
+
Isolate* v8_isolate_;
|
98
96
|
Local<Value> resource_name_;
|
99
97
|
int resource_line_offset_;
|
100
98
|
int resource_column_offset_;
|
@@ -12,6 +12,7 @@
|
|
12
12
|
|
13
13
|
#include "v8-internal.h" // NOLINT(build/include_directory)
|
14
14
|
#include "v8-local-handle.h" // NOLINT(build/include_directory)
|
15
|
+
#include "v8config.h" // NOLINT(build/include_directory)
|
15
16
|
|
16
17
|
namespace v8 {
|
17
18
|
|
@@ -96,16 +97,42 @@ struct GarbageCollectionYoungCycle {
|
|
96
97
|
};
|
97
98
|
|
98
99
|
struct WasmModuleDecoded {
|
100
|
+
WasmModuleDecoded() = default;
|
101
|
+
WasmModuleDecoded(bool async, bool streamed, bool success,
|
102
|
+
size_t module_size_in_bytes, size_t function_count,
|
103
|
+
int64_t wall_clock_duration_in_us)
|
104
|
+
: async(async),
|
105
|
+
streamed(streamed),
|
106
|
+
success(success),
|
107
|
+
module_size_in_bytes(module_size_in_bytes),
|
108
|
+
function_count(function_count),
|
109
|
+
wall_clock_duration_in_us(wall_clock_duration_in_us) {}
|
110
|
+
|
99
111
|
bool async = false;
|
100
112
|
bool streamed = false;
|
101
113
|
bool success = false;
|
102
114
|
size_t module_size_in_bytes = 0;
|
103
115
|
size_t function_count = 0;
|
104
116
|
int64_t wall_clock_duration_in_us = -1;
|
105
|
-
int64_t cpu_duration_in_us = -1;
|
106
117
|
};
|
107
118
|
|
108
119
|
struct WasmModuleCompiled {
|
120
|
+
WasmModuleCompiled() = default;
|
121
|
+
|
122
|
+
WasmModuleCompiled(bool async, bool streamed, bool cached, bool deserialized,
|
123
|
+
bool lazy, bool success, size_t code_size_in_bytes,
|
124
|
+
size_t liftoff_bailout_count,
|
125
|
+
int64_t wall_clock_duration_in_us)
|
126
|
+
: async(async),
|
127
|
+
streamed(streamed),
|
128
|
+
cached(cached),
|
129
|
+
deserialized(deserialized),
|
130
|
+
lazy(lazy),
|
131
|
+
success(success),
|
132
|
+
code_size_in_bytes(code_size_in_bytes),
|
133
|
+
liftoff_bailout_count(liftoff_bailout_count),
|
134
|
+
wall_clock_duration_in_us(wall_clock_duration_in_us) {}
|
135
|
+
|
109
136
|
bool async = false;
|
110
137
|
bool streamed = false;
|
111
138
|
bool cached = false;
|
@@ -115,7 +142,6 @@ struct WasmModuleCompiled {
|
|
115
142
|
size_t code_size_in_bytes = 0;
|
116
143
|
size_t liftoff_bailout_count = 0;
|
117
144
|
int64_t wall_clock_duration_in_us = -1;
|
118
|
-
int64_t cpu_duration_in_us = -1;
|
119
145
|
};
|
120
146
|
|
121
147
|
struct WasmModuleInstantiated {
|
@@ -125,31 +151,10 @@ struct WasmModuleInstantiated {
|
|
125
151
|
int64_t wall_clock_duration_in_us = -1;
|
126
152
|
};
|
127
153
|
|
128
|
-
struct WasmModuleTieredUp {
|
129
|
-
bool lazy = false;
|
130
|
-
size_t code_size_in_bytes = 0;
|
131
|
-
int64_t wall_clock_duration_in_us = -1;
|
132
|
-
int64_t cpu_duration_in_us = -1;
|
133
|
-
};
|
134
|
-
|
135
154
|
struct WasmModulesPerIsolate {
|
136
155
|
size_t count = 0;
|
137
156
|
};
|
138
157
|
|
139
|
-
#define V8_MAIN_THREAD_METRICS_EVENTS(V) \
|
140
|
-
V(GarbageCollectionFullCycle) \
|
141
|
-
V(GarbageCollectionFullMainThreadIncrementalMark) \
|
142
|
-
V(GarbageCollectionFullMainThreadBatchedIncrementalMark) \
|
143
|
-
V(GarbageCollectionFullMainThreadIncrementalSweep) \
|
144
|
-
V(GarbageCollectionFullMainThreadBatchedIncrementalSweep) \
|
145
|
-
V(GarbageCollectionYoungCycle) \
|
146
|
-
V(WasmModuleDecoded) \
|
147
|
-
V(WasmModuleCompiled) \
|
148
|
-
V(WasmModuleInstantiated) \
|
149
|
-
V(WasmModuleTieredUp)
|
150
|
-
|
151
|
-
#define V8_THREAD_SAFE_METRICS_EVENTS(V) V(WasmModulesPerIsolate)
|
152
|
-
|
153
158
|
/**
|
154
159
|
* This class serves as a base class for recording event-based metrics in V8.
|
155
160
|
* There a two kinds of metrics, those which are expected to be thread-safe and
|
@@ -159,19 +164,6 @@ struct WasmModulesPerIsolate {
|
|
159
164
|
* background thread, it will be delayed and executed by the foreground task
|
160
165
|
* runner.
|
161
166
|
*
|
162
|
-
* The thread-safe events are listed in the V8_THREAD_SAFE_METRICS_EVENTS
|
163
|
-
* macro above while the main thread event are listed in
|
164
|
-
* V8_MAIN_THREAD_METRICS_EVENTS above. For the former, a virtual method
|
165
|
-
* AddMainThreadEvent(const E& event, v8::Context::Token token) will be
|
166
|
-
* generated and for the latter AddThreadSafeEvent(const E& event).
|
167
|
-
*
|
168
|
-
* Thread-safe events are not allowed to access the context and therefore do
|
169
|
-
* not carry a context ID with them. These IDs can be generated using
|
170
|
-
* Recorder::GetContextId() and the ID will be valid throughout the lifetime
|
171
|
-
* of the isolate. It is not guaranteed that the ID will still resolve to
|
172
|
-
* a valid context using Recorder::GetContext() at the time the metric is
|
173
|
-
* recorded. In this case, an empty handle will be returned.
|
174
|
-
*
|
175
167
|
* The embedder is expected to call v8::Isolate::SetMetricsRecorder()
|
176
168
|
* providing its implementation and have the virtual methods overwritten
|
177
169
|
* for the events it cares about.
|
@@ -202,14 +194,30 @@ class V8_EXPORT Recorder {
|
|
202
194
|
|
203
195
|
virtual ~Recorder() = default;
|
204
196
|
|
197
|
+
// Main thread events. Those are only triggered on the main thread, and hence
|
198
|
+
// can access the context.
|
205
199
|
#define ADD_MAIN_THREAD_EVENT(E) \
|
206
|
-
virtual void AddMainThreadEvent(const E
|
207
|
-
|
200
|
+
virtual void AddMainThreadEvent(const E&, ContextId) {}
|
201
|
+
ADD_MAIN_THREAD_EVENT(GarbageCollectionFullCycle)
|
202
|
+
ADD_MAIN_THREAD_EVENT(GarbageCollectionFullMainThreadIncrementalMark)
|
203
|
+
ADD_MAIN_THREAD_EVENT(GarbageCollectionFullMainThreadBatchedIncrementalMark)
|
204
|
+
ADD_MAIN_THREAD_EVENT(GarbageCollectionFullMainThreadIncrementalSweep)
|
205
|
+
ADD_MAIN_THREAD_EVENT(GarbageCollectionFullMainThreadBatchedIncrementalSweep)
|
206
|
+
ADD_MAIN_THREAD_EVENT(GarbageCollectionYoungCycle)
|
207
|
+
ADD_MAIN_THREAD_EVENT(WasmModuleDecoded)
|
208
|
+
ADD_MAIN_THREAD_EVENT(WasmModuleCompiled)
|
209
|
+
ADD_MAIN_THREAD_EVENT(WasmModuleInstantiated)
|
208
210
|
#undef ADD_MAIN_THREAD_EVENT
|
209
211
|
|
212
|
+
// Thread-safe events are not allowed to access the context and therefore do
|
213
|
+
// not carry a context ID with them. These IDs can be generated using
|
214
|
+
// Recorder::GetContextId() and the ID will be valid throughout the lifetime
|
215
|
+
// of the isolate. It is not guaranteed that the ID will still resolve to
|
216
|
+
// a valid context using Recorder::GetContext() at the time the metric is
|
217
|
+
// recorded. In this case, an empty handle will be returned.
|
210
218
|
#define ADD_THREAD_SAFE_EVENT(E) \
|
211
|
-
virtual void AddThreadSafeEvent(const E&
|
212
|
-
|
219
|
+
virtual void AddThreadSafeEvent(const E&) {}
|
220
|
+
ADD_THREAD_SAFE_EVENT(WasmModulesPerIsolate)
|
213
221
|
#undef ADD_THREAD_SAFE_EVENT
|
214
222
|
|
215
223
|
virtual void NotifyIsolateDisposal() {}
|
@@ -118,7 +118,12 @@ class V8_EXPORT V8_NODISCARD MicrotasksScope {
|
|
118
118
|
public:
|
119
119
|
enum Type { kRunMicrotasks, kDoNotRunMicrotasks };
|
120
120
|
|
121
|
+
V8_DEPRECATE_SOON(
|
122
|
+
"May be incorrect if context was created with non-default microtask "
|
123
|
+
"queue")
|
121
124
|
MicrotasksScope(Isolate* isolate, Type type);
|
125
|
+
|
126
|
+
MicrotasksScope(Local<Context> context, Type type);
|
122
127
|
MicrotasksScope(Isolate* isolate, MicrotaskQueue* microtask_queue, Type type);
|
123
128
|
~MicrotasksScope();
|
124
129
|
|
@@ -142,7 +147,7 @@ class V8_EXPORT V8_NODISCARD MicrotasksScope {
|
|
142
147
|
MicrotasksScope& operator=(const MicrotasksScope&) = delete;
|
143
148
|
|
144
149
|
private:
|
145
|
-
internal::Isolate* const
|
150
|
+
internal::Isolate* const i_isolate_;
|
146
151
|
internal::MicrotaskQueue* const microtask_queue_;
|
147
152
|
bool run_;
|
148
153
|
};
|
@@ -594,8 +594,6 @@ class V8_EXPORT Object : public Value {
|
|
594
594
|
/**
|
595
595
|
* Returns the context in which the object was created.
|
596
596
|
*/
|
597
|
-
V8_DEPRECATED("Use MaybeLocal<Context> GetCreationContext()")
|
598
|
-
Local<Context> CreationContext();
|
599
597
|
MaybeLocal<Context> GetCreationContext();
|
600
598
|
|
601
599
|
/**
|
@@ -604,15 +602,24 @@ class V8_EXPORT Object : public Value {
|
|
604
602
|
Local<Context> GetCreationContextChecked();
|
605
603
|
|
606
604
|
/** Same as above, but works for Persistents */
|
607
|
-
V8_DEPRECATED(
|
608
|
-
"Use MaybeLocal<Context> GetCreationContext(const "
|
609
|
-
"PersistentBase<Object>& object)")
|
610
|
-
static Local<Context> CreationContext(const PersistentBase<Object>& object);
|
611
605
|
V8_INLINE static MaybeLocal<Context> GetCreationContext(
|
612
606
|
const PersistentBase<Object>& object) {
|
613
607
|
return object.val_->GetCreationContext();
|
614
608
|
}
|
615
609
|
|
610
|
+
/**
|
611
|
+
* Gets the context in which the object was created (see GetCreationContext())
|
612
|
+
* and if it's available reads respective embedder field value.
|
613
|
+
* If the context can't be obtained nullptr is returned.
|
614
|
+
* Basically it's a shortcut for
|
615
|
+
* obj->GetCreationContext().GetAlignedPointerFromEmbedderData(index)
|
616
|
+
* which doesn't create a handle for Context object on the way and doesn't
|
617
|
+
* try to expand the embedder data attached to the context.
|
618
|
+
* In case the Local<Context> is already available because of other reasons,
|
619
|
+
* it's fine to keep using Context::GetAlignedPointerFromEmbedderData().
|
620
|
+
*/
|
621
|
+
void* GetAlignedPointerFromEmbedderDataInCreationContext(int index);
|
622
|
+
|
616
623
|
/**
|
617
624
|
* Checks whether a callback is set by the
|
618
625
|
* ObjectTemplate::SetCallAsFunctionHandler method.
|
@@ -713,22 +720,27 @@ Local<Value> Object::GetInternalField(int index) {
|
|
713
720
|
#ifndef V8_ENABLE_CHECKS
|
714
721
|
using A = internal::Address;
|
715
722
|
using I = internal::Internals;
|
716
|
-
A obj =
|
723
|
+
A obj = internal::ValueHelper::ValueAsAddress(this);
|
717
724
|
// Fast path: If the object is a plain JSObject, which is the common case, we
|
718
725
|
// know where to find the internal fields and can return the value directly.
|
719
726
|
int instance_type = I::GetInstanceType(obj);
|
720
|
-
if (
|
727
|
+
if (I::CanHaveInternalField(instance_type)) {
|
721
728
|
int offset = I::kJSObjectHeaderSize + (I::kEmbedderDataSlotSize * index);
|
722
729
|
A value = I::ReadRawField<A>(obj, offset);
|
723
730
|
#ifdef V8_COMPRESS_POINTERS
|
724
731
|
// We read the full pointer value and then decompress it in order to avoid
|
725
732
|
// dealing with potential endiannes issues.
|
726
|
-
value = I::
|
733
|
+
value = I::DecompressTaggedField(obj, static_cast<uint32_t>(value));
|
727
734
|
#endif
|
735
|
+
|
736
|
+
#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING
|
737
|
+
return Local<Value>(reinterpret_cast<Value*>(value));
|
738
|
+
#else
|
728
739
|
internal::Isolate* isolate =
|
729
740
|
internal::IsolateFromNeverReadOnlySpaceObject(obj);
|
730
741
|
A* result = HandleScope::CreateHandle(isolate, value);
|
731
742
|
return Local<Value>(reinterpret_cast<Value*>(result));
|
743
|
+
#endif
|
732
744
|
}
|
733
745
|
#endif
|
734
746
|
return SlowGetInternalField(index);
|
@@ -738,18 +750,17 @@ void* Object::GetAlignedPointerFromInternalField(int index) {
|
|
738
750
|
#if !defined(V8_ENABLE_CHECKS)
|
739
751
|
using A = internal::Address;
|
740
752
|
using I = internal::Internals;
|
741
|
-
A obj =
|
753
|
+
A obj = internal::ValueHelper::ValueAsAddress(this);
|
742
754
|
// Fast path: If the object is a plain JSObject, which is the common case, we
|
743
755
|
// know where to find the internal fields and can return the value directly.
|
744
756
|
auto instance_type = I::GetInstanceType(obj);
|
745
|
-
if (
|
746
|
-
int offset = I::kJSObjectHeaderSize + (I::kEmbedderDataSlotSize * index)
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
isolate, obj, offset, internal::kEmbedderDataSlotPayloadTag);
|
757
|
+
if (I::CanHaveInternalField(instance_type)) {
|
758
|
+
int offset = I::kJSObjectHeaderSize + (I::kEmbedderDataSlotSize * index) +
|
759
|
+
I::kEmbedderDataSlotExternalPointerOffset;
|
760
|
+
Isolate* isolate = I::GetIsolateForSandbox(obj);
|
761
|
+
A value =
|
762
|
+
I::ReadExternalPointerField<internal::kEmbedderDataSlotPayloadTag>(
|
763
|
+
isolate, obj, offset);
|
753
764
|
return reinterpret_cast<void*>(value);
|
754
765
|
}
|
755
766
|
#endif
|
@@ -55,7 +55,7 @@ class Eternal {
|
|
55
55
|
V8_INLINE Local<T> Get(Isolate* isolate) const {
|
56
56
|
// The eternal handle will never go away, so as with the roots, we don't
|
57
57
|
// even need to open a handle.
|
58
|
-
return Local<T>(val_);
|
58
|
+
return Local<T>(internal::ValueHelper::SlotAsValue<T>(val_));
|
59
59
|
}
|
60
60
|
|
61
61
|
V8_INLINE bool IsEmpty() const { return val_ == nullptr; }
|
@@ -68,6 +68,10 @@ class Eternal {
|
|
68
68
|
}
|
69
69
|
|
70
70
|
private:
|
71
|
+
V8_INLINE internal::Address address() const {
|
72
|
+
return *reinterpret_cast<internal::Address*>(val_);
|
73
|
+
}
|
74
|
+
|
71
75
|
T* val_;
|
72
76
|
};
|
73
77
|
|
@@ -122,20 +126,12 @@ class PersistentBase {
|
|
122
126
|
|
123
127
|
template <class S>
|
124
128
|
V8_INLINE bool operator==(const PersistentBase<S>& that) const {
|
125
|
-
|
126
|
-
internal::Address* b = reinterpret_cast<internal::Address*>(that.val_);
|
127
|
-
if (a == nullptr) return b == nullptr;
|
128
|
-
if (b == nullptr) return false;
|
129
|
-
return *a == *b;
|
129
|
+
return internal::HandleHelper::EqualHandles(*this, that);
|
130
130
|
}
|
131
131
|
|
132
132
|
template <class S>
|
133
133
|
V8_INLINE bool operator==(const Local<S>& that) const {
|
134
|
-
|
135
|
-
internal::Address* b = reinterpret_cast<internal::Address*>(that.val_);
|
136
|
-
if (a == nullptr) return b == nullptr;
|
137
|
-
if (b == nullptr) return false;
|
138
|
-
return *a == *b;
|
134
|
+
return internal::HandleHelper::EqualHandles(*this, that);
|
139
135
|
}
|
140
136
|
|
141
137
|
template <class S>
|
@@ -169,8 +165,6 @@ class PersistentBase {
|
|
169
165
|
* Turns this handle into a weak phantom handle without finalization callback.
|
170
166
|
* The handle will be reset automatically when the garbage collector detects
|
171
167
|
* that the object is no longer reachable.
|
172
|
-
* A related function Isolate::NumberOfPhantomHandleResetsSinceLastCall
|
173
|
-
* returns how many phantom handles were reset by the garbage collector.
|
174
168
|
*/
|
175
169
|
V8_INLINE void SetWeak();
|
176
170
|
|
@@ -223,8 +217,15 @@ class PersistentBase {
|
|
223
217
|
template <class F1, class F2>
|
224
218
|
friend class PersistentValueVector;
|
225
219
|
friend class Object;
|
220
|
+
friend class internal::HandleHelper;
|
226
221
|
|
227
222
|
explicit V8_INLINE PersistentBase(T* val) : val_(val) {}
|
223
|
+
V8_INLINE T* operator*() const { return this->val_; }
|
224
|
+
V8_INLINE internal::Address address() const {
|
225
|
+
return *reinterpret_cast<internal::Address*>(val_);
|
226
|
+
}
|
227
|
+
|
228
|
+
V8_INLINE static T* New(Isolate* isolate, Local<T> that);
|
228
229
|
V8_INLINE static T* New(Isolate* isolate, T* that);
|
229
230
|
|
230
231
|
T* val_;
|
@@ -284,11 +285,13 @@ class Persistent : public PersistentBase<T> {
|
|
284
285
|
* When the Local is non-empty, a new storage cell is created
|
285
286
|
* pointing to the same object, and no flags are set.
|
286
287
|
*/
|
288
|
+
|
287
289
|
template <class S>
|
288
290
|
V8_INLINE Persistent(Isolate* isolate, Local<S> that)
|
289
|
-
: PersistentBase<T>(PersistentBase<T>::New(isolate,
|
291
|
+
: PersistentBase<T>(PersistentBase<T>::New(isolate, that)) {
|
290
292
|
static_assert(std::is_base_of<T, S>::value, "type check");
|
291
293
|
}
|
294
|
+
|
292
295
|
/**
|
293
296
|
* Construct a Persistent from a Persistent.
|
294
297
|
* When the Persistent is non-empty, a new storage cell is created
|
@@ -358,7 +361,6 @@ class Persistent : public PersistentBase<T> {
|
|
358
361
|
friend class ReturnValue;
|
359
362
|
|
360
363
|
explicit V8_INLINE Persistent(T* that) : PersistentBase<T>(that) {}
|
361
|
-
V8_INLINE T* operator*() const { return this->val_; }
|
362
364
|
template <class S, class M2>
|
363
365
|
V8_INLINE void Copy(const Persistent<S, M2>& that);
|
364
366
|
};
|
@@ -383,7 +385,7 @@ class Global : public PersistentBase<T> {
|
|
383
385
|
*/
|
384
386
|
template <class S>
|
385
387
|
V8_INLINE Global(Isolate* isolate, Local<S> that)
|
386
|
-
: PersistentBase<T>(PersistentBase<T>::New(isolate,
|
388
|
+
: PersistentBase<T>(PersistentBase<T>::New(isolate, that)) {
|
387
389
|
static_assert(std::is_base_of<T, S>::value, "type check");
|
388
390
|
}
|
389
391
|
|
@@ -427,7 +429,6 @@ class Global : public PersistentBase<T> {
|
|
427
429
|
private:
|
428
430
|
template <class F>
|
429
431
|
friend class ReturnValue;
|
430
|
-
V8_INLINE T* operator*() const { return this->val_; }
|
431
432
|
};
|
432
433
|
|
433
434
|
// UniquePersistent is an alias for Global for historical reason.
|
@@ -444,6 +445,12 @@ class V8_EXPORT PersistentHandleVisitor {
|
|
444
445
|
uint16_t class_id) {}
|
445
446
|
};
|
446
447
|
|
448
|
+
template <class T>
|
449
|
+
T* PersistentBase<T>::New(Isolate* isolate, Local<T> that) {
|
450
|
+
return PersistentBase<T>::New(isolate,
|
451
|
+
internal::ValueHelper::ValueAsSlot(*that));
|
452
|
+
}
|
453
|
+
|
447
454
|
template <class T>
|
448
455
|
T* PersistentBase<T>::New(Isolate* isolate, T* that) {
|
449
456
|
if (that == nullptr) return nullptr;
|
@@ -488,7 +495,7 @@ void PersistentBase<T>::Reset(Isolate* isolate, const Local<S>& other) {
|
|
488
495
|
static_assert(std::is_base_of<T, S>::value, "type check");
|
489
496
|
Reset();
|
490
497
|
if (other.IsEmpty()) return;
|
491
|
-
this->val_ = New(isolate, other
|
498
|
+
this->val_ = New(isolate, internal::ValueHelper::ValueAsSlot(*other));
|
492
499
|
}
|
493
500
|
|
494
501
|
/**
|