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 | 
             
            /**
         |