libv8-node 15.14.0.1-aarch64-linux-musl → 16.17.0.0-aarch64-linux-musl
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/ext/libv8-node/location.rb +1 -1
- data/ext/libv8-node/paths.rb +5 -1
- data/lib/libv8/node/version.rb +3 -3
- data/vendor/v8/{out.gn → aarch64-linux-musl}/libv8/obj/libv8_monolith.a +0 -0
- data/vendor/v8/include/cppgc/allocation.h +105 -45
- data/vendor/v8/include/cppgc/common.h +9 -6
- data/vendor/v8/include/cppgc/cross-thread-persistent.h +413 -0
- data/vendor/v8/include/cppgc/custom-space.h +37 -2
- data/vendor/v8/include/cppgc/default-platform.h +47 -48
- data/vendor/v8/include/cppgc/ephemeron-pair.h +30 -0
- data/vendor/v8/include/cppgc/explicit-management.h +82 -0
- data/vendor/v8/include/cppgc/garbage-collected.h +4 -3
- data/vendor/v8/include/cppgc/heap-consistency.h +253 -0
- data/vendor/v8/include/cppgc/heap-state.h +70 -0
- data/vendor/v8/include/cppgc/heap-statistics.h +120 -0
- data/vendor/v8/include/cppgc/heap.h +68 -6
- data/vendor/v8/include/cppgc/internal/api-constants.h +3 -3
- data/vendor/v8/include/cppgc/internal/caged-heap-local-data.h +2 -1
- data/vendor/v8/include/cppgc/internal/compiler-specific.h +2 -2
- data/vendor/v8/include/cppgc/internal/gc-info.h +44 -13
- data/vendor/v8/include/cppgc/internal/name-trait.h +111 -0
- data/vendor/v8/include/cppgc/internal/persistent-node.h +58 -2
- data/vendor/v8/include/cppgc/internal/pointer-policies.h +69 -28
- data/vendor/v8/include/cppgc/internal/prefinalizer-handler.h +1 -1
- data/vendor/v8/include/cppgc/internal/write-barrier.h +390 -35
- data/vendor/v8/include/cppgc/liveness-broker.h +11 -2
- data/vendor/v8/include/cppgc/macros.h +2 -0
- data/vendor/v8/include/cppgc/member.h +87 -25
- data/vendor/v8/include/cppgc/name-provider.h +65 -0
- data/vendor/v8/include/cppgc/object-size-trait.h +58 -0
- data/vendor/v8/include/cppgc/persistent.h +40 -10
- data/vendor/v8/include/cppgc/platform.h +49 -25
- data/vendor/v8/include/cppgc/prefinalizer.h +1 -1
- data/vendor/v8/include/cppgc/process-heap-statistics.h +36 -0
- data/vendor/v8/include/cppgc/sentinel-pointer.h +32 -0
- data/vendor/v8/include/cppgc/source-location.h +2 -1
- data/vendor/v8/include/cppgc/testing.h +99 -0
- data/vendor/v8/include/cppgc/trace-trait.h +8 -3
- data/vendor/v8/include/cppgc/type-traits.h +157 -19
- data/vendor/v8/include/cppgc/visitor.h +194 -28
- data/vendor/v8/include/libplatform/libplatform.h +11 -0
- data/vendor/v8/include/libplatform/v8-tracing.h +2 -0
- data/vendor/v8/include/v8-cppgc.h +258 -159
- data/vendor/v8/include/v8-fast-api-calls.h +603 -155
- data/vendor/v8/include/v8-inspector.h +22 -4
- data/vendor/v8/include/v8-internal.h +111 -27
- data/vendor/v8/include/v8-metrics.h +77 -8
- data/vendor/v8/include/v8-platform.h +47 -22
- data/vendor/v8/include/v8-profiler.h +75 -11
- data/vendor/v8/include/v8-unwinder-state.h +30 -0
- data/vendor/v8/include/v8-util.h +1 -1
- data/vendor/v8/include/v8-version.h +4 -4
- data/vendor/v8/include/v8.h +1196 -642
- data/vendor/v8/include/v8config.h +87 -11
- metadata +17 -5
- data/vendor/v8/include/cppgc/internal/process-heap.h +0 -34
| @@ -105,7 +105,9 @@ class V8_EXPORT V8StackTrace { | |
| 105 105 | 
             
              virtual StringView topSourceURL() const = 0;
         | 
| 106 106 | 
             
              virtual int topLineNumber() const = 0;
         | 
| 107 107 | 
             
              virtual int topColumnNumber() const = 0;
         | 
| 108 | 
            -
              virtual  | 
| 108 | 
            +
              virtual int topScriptId() const = 0;
         | 
| 109 | 
            +
              V8_DEPRECATE_SOON("Use V8::StackTrace::topScriptId() instead.")
         | 
| 110 | 
            +
              int topScriptIdAsInteger() const { return topScriptId(); }
         | 
| 109 111 | 
             
              virtual StringView topFunctionName() const = 0;
         | 
| 110 112 |  | 
| 111 113 | 
             
              virtual ~V8StackTrace() = default;
         | 
| @@ -129,6 +131,10 @@ class V8_EXPORT V8InspectorSession { | |
| 129 131 | 
             
                virtual v8::Local<v8::Value> get(v8::Local<v8::Context>) = 0;
         | 
| 130 132 | 
             
                virtual ~Inspectable() = default;
         | 
| 131 133 | 
             
              };
         | 
| 134 | 
            +
              class V8_EXPORT CommandLineAPIScope {
         | 
| 135 | 
            +
               public:
         | 
| 136 | 
            +
                virtual ~CommandLineAPIScope() = default;
         | 
| 137 | 
            +
              };
         | 
| 132 138 | 
             
              virtual void addInspectedObject(std::unique_ptr<Inspectable>) = 0;
         | 
| 133 139 |  | 
| 134 140 | 
             
              // Dispatching protocol messages.
         | 
| @@ -138,6 +144,9 @@ class V8_EXPORT V8InspectorSession { | |
| 138 144 | 
             
              virtual std::vector<std::unique_ptr<protocol::Schema::API::Domain>>
         | 
| 139 145 | 
             
              supportedDomains() = 0;
         | 
| 140 146 |  | 
| 147 | 
            +
              virtual std::unique_ptr<V8InspectorSession::CommandLineAPIScope>
         | 
| 148 | 
            +
              initializeCommandLineAPIScope(int executionContextId) = 0;
         | 
| 149 | 
            +
             | 
| 141 150 | 
             
              // Debugger actions.
         | 
| 142 151 | 
             
              virtual void schedulePauseOnNextStatement(StringView breakReason,
         | 
| 143 152 | 
             
                                                        StringView breakDetails) = 0;
         | 
| @@ -161,7 +170,7 @@ class V8_EXPORT V8InspectorSession { | |
| 161 170 | 
             
                                        v8::Local<v8::Context>*,
         | 
| 162 171 | 
             
                                        std::unique_ptr<StringBuffer>* objectGroup) = 0;
         | 
| 163 172 | 
             
              virtual void releaseObjectGroup(StringView) = 0;
         | 
| 164 | 
            -
              virtual void triggerPreciseCoverageDeltaUpdate(StringView  | 
| 173 | 
            +
              virtual void triggerPreciseCoverageDeltaUpdate(StringView occasion) = 0;
         | 
| 165 174 | 
             
            };
         | 
| 166 175 |  | 
| 167 176 | 
             
            class V8_EXPORT V8InspectorClient {
         | 
| @@ -181,8 +190,9 @@ class V8_EXPORT V8InspectorClient { | |
| 181 190 | 
             
              virtual std::unique_ptr<StringBuffer> valueSubtype(v8::Local<v8::Value>) {
         | 
| 182 191 | 
             
                return nullptr;
         | 
| 183 192 | 
             
              }
         | 
| 184 | 
            -
              virtual  | 
| 185 | 
            -
             | 
| 193 | 
            +
              virtual std::unique_ptr<StringBuffer> descriptionForValueSubtype(
         | 
| 194 | 
            +
                  v8::Local<v8::Context>, v8::Local<v8::Value>) {
         | 
| 195 | 
            +
                return nullptr;
         | 
| 186 196 | 
             
              }
         | 
| 187 197 | 
             
              virtual bool isInspectableHeapObject(v8::Local<v8::Object>) { return true; }
         | 
| 188 198 |  | 
| @@ -224,6 +234,10 @@ class V8_EXPORT V8InspectorClient { | |
| 224 234 | 
             
                  const StringView& resourceName) {
         | 
| 225 235 | 
             
                return nullptr;
         | 
| 226 236 | 
             
              }
         | 
| 237 | 
            +
             | 
| 238 | 
            +
              // The caller would defer to generating a random 64 bit integer if
         | 
| 239 | 
            +
              // this method returns 0.
         | 
| 240 | 
            +
              virtual int64_t generateUniqueId() { return 0; }
         | 
| 227 241 | 
             
            };
         | 
| 228 242 |  | 
| 229 243 | 
             
            // These stack trace ids are intended to be passed between debuggers and be
         | 
| @@ -284,6 +298,10 @@ class V8_EXPORT V8Inspector { | |
| 284 298 | 
             
                                               int scriptId) = 0;
         | 
| 285 299 | 
             
              virtual void exceptionRevoked(v8::Local<v8::Context>, unsigned exceptionId,
         | 
| 286 300 | 
             
                                            StringView message) = 0;
         | 
| 301 | 
            +
              virtual bool associateExceptionData(v8::Local<v8::Context>,
         | 
| 302 | 
            +
                                                  v8::Local<v8::Value> exception,
         | 
| 303 | 
            +
                                                  v8::Local<v8::Name> key,
         | 
| 304 | 
            +
                                                  v8::Local<v8::Value> value) = 0;
         | 
| 287 305 |  | 
| 288 306 | 
             
              // Connection.
         | 
| 289 307 | 
             
              class V8_EXPORT Channel {
         | 
| @@ -15,9 +15,12 @@ | |
| 15 15 |  | 
| 16 16 | 
             
            namespace v8 {
         | 
| 17 17 |  | 
| 18 | 
            +
            class Array;
         | 
| 18 19 | 
             
            class Context;
         | 
| 19 20 | 
             
            class Data;
         | 
| 20 21 | 
             
            class Isolate;
         | 
| 22 | 
            +
            template <typename T>
         | 
| 23 | 
            +
            class Local;
         | 
| 21 24 |  | 
| 22 25 | 
             
            namespace internal {
         | 
| 23 26 |  | 
| @@ -40,6 +43,13 @@ const int kWeakHeapObjectTag = 3; | |
| 40 43 | 
             
            const int kHeapObjectTagSize = 2;
         | 
| 41 44 | 
             
            const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1;
         | 
| 42 45 |  | 
| 46 | 
            +
            // Tag information for fowarding pointers stored in object headers.
         | 
| 47 | 
            +
            // 0b00 at the lowest 2 bits in the header indicates that the map word is a
         | 
| 48 | 
            +
            // forwarding pointer.
         | 
| 49 | 
            +
            const int kForwardingTag = 0;
         | 
| 50 | 
            +
            const int kForwardingTagSize = 2;
         | 
| 51 | 
            +
            const intptr_t kForwardingTagMask = (1 << kForwardingTagSize) - 1;
         | 
| 52 | 
            +
             | 
| 43 53 | 
             
            // Tag information for Smi.
         | 
| 44 54 | 
             
            const int kSmiTag = 0;
         | 
| 45 55 | 
             
            const int kSmiTagSize = 1;
         | 
| @@ -120,6 +130,29 @@ constexpr bool HeapSandboxIsEnabled() { | |
| 120 130 |  | 
| 121 131 | 
             
            using ExternalPointer_t = Address;
         | 
| 122 132 |  | 
| 133 | 
            +
            // If the heap sandbox is enabled, these tag values will be ORed with the
         | 
| 134 | 
            +
            // external pointers in the external pointer table to prevent use of pointers of
         | 
| 135 | 
            +
            // the wrong type. When a pointer is loaded, it is ANDed with the inverse of the
         | 
| 136 | 
            +
            // expected type's tag. The tags are constructed in a way that guarantees that a
         | 
| 137 | 
            +
            // failed type check will result in one or more of the top bits of the pointer
         | 
| 138 | 
            +
            // to be set, rendering the pointer inacessible. This construction allows
         | 
| 139 | 
            +
            // performing the type check and removing GC marking bits from the pointer at
         | 
| 140 | 
            +
            // the same time.
         | 
| 141 | 
            +
            enum ExternalPointerTag : uint64_t {
         | 
| 142 | 
            +
              kExternalPointerNullTag = 0x0000000000000000,
         | 
| 143 | 
            +
              kArrayBufferBackingStoreTag = 0x00ff000000000000,      // 0b000000011111111
         | 
| 144 | 
            +
              kTypedArrayExternalPointerTag = 0x017f000000000000,    // 0b000000101111111
         | 
| 145 | 
            +
              kDataViewDataPointerTag = 0x01bf000000000000,          // 0b000000110111111
         | 
| 146 | 
            +
              kExternalStringResourceTag = 0x01df000000000000,       // 0b000000111011111
         | 
| 147 | 
            +
              kExternalStringResourceDataTag = 0x01ef000000000000,   // 0b000000111101111
         | 
| 148 | 
            +
              kForeignForeignAddressTag = 0x01f7000000000000,        // 0b000000111110111
         | 
| 149 | 
            +
              kNativeContextMicrotaskQueueTag = 0x01fb000000000000,  // 0b000000111111011
         | 
| 150 | 
            +
              kEmbedderDataSlotPayloadTag = 0x01fd000000000000,      // 0b000000111111101
         | 
| 151 | 
            +
              kCodeEntryPointTag = 0x01fe000000000000,               // 0b000000111111110
         | 
| 152 | 
            +
            };
         | 
| 153 | 
            +
             | 
| 154 | 
            +
            constexpr uint64_t kExternalPointerTagMask = 0xffff000000000000;
         | 
| 155 | 
            +
             | 
| 123 156 | 
             
            #ifdef V8_31BIT_SMIS_ON_64BIT_ARCH
         | 
| 124 157 | 
             
            using PlatformSmiTagging = SmiTagging<kApiInt32Size>;
         | 
| 125 158 | 
             
            #else
         | 
| @@ -140,6 +173,11 @@ V8_INLINE static constexpr internal::Address IntToSmi(int value) { | |
| 140 173 | 
             
                     kSmiTag;
         | 
| 141 174 | 
             
            }
         | 
| 142 175 |  | 
| 176 | 
            +
            // Converts encoded external pointer to address.
         | 
| 177 | 
            +
            V8_EXPORT Address DecodeExternalPointerImpl(const Isolate* isolate,
         | 
| 178 | 
            +
                                                        ExternalPointer_t pointer,
         | 
| 179 | 
            +
                                                        ExternalPointerTag tag);
         | 
| 180 | 
            +
             | 
| 143 181 | 
             
            // {obj} must be the raw tagged pointer representation of a HeapObject
         | 
| 144 182 | 
             
            // that's guaranteed to never be in ReadOnlySpace.
         | 
| 145 183 | 
             
            V8_EXPORT internal::Isolate* IsolateFromNeverReadOnlySpaceObject(Address obj);
         | 
| @@ -155,6 +193,14 @@ V8_EXPORT bool ShouldThrowOnError(v8::internal::Isolate* isolate); | |
| 155 193 | 
             
             * depend on functions and constants defined here.
         | 
| 156 194 | 
             
             */
         | 
| 157 195 | 
             
            class Internals {
         | 
| 196 | 
            +
            #ifdef V8_MAP_PACKING
         | 
| 197 | 
            +
              V8_INLINE static constexpr internal::Address UnpackMapWord(
         | 
| 198 | 
            +
                  internal::Address mapword) {
         | 
| 199 | 
            +
                // TODO(wenyuzhao): Clear header metadata.
         | 
| 200 | 
            +
                return mapword ^ kMapWordXorMask;
         | 
| 201 | 
            +
              }
         | 
| 202 | 
            +
            #endif
         | 
| 203 | 
            +
             | 
| 158 204 | 
             
             public:
         | 
| 159 205 | 
             
              // These values match non-compiler-dependent values defined within
         | 
| 160 206 | 
             
              // the implementation of v8.
         | 
| @@ -168,6 +214,9 @@ class Internals { | |
| 168 214 | 
             
              static const int kFixedArrayHeaderSize = 2 * kApiTaggedSize;
         | 
| 169 215 | 
             
              static const int kEmbedderDataArrayHeaderSize = 2 * kApiTaggedSize;
         | 
| 170 216 | 
             
              static const int kEmbedderDataSlotSize = kApiSystemPointerSize;
         | 
| 217 | 
            +
            #ifdef V8_HEAP_SANDBOX
         | 
| 218 | 
            +
              static const int kEmbedderDataSlotRawPayloadOffset = kApiTaggedSize;
         | 
| 219 | 
            +
            #endif
         | 
| 171 220 | 
             
              static const int kNativeContextEmbedderDataOffset = 6 * kApiTaggedSize;
         | 
| 172 221 | 
             
              static const int kFullStringRepresentationMask = 0x0f;
         | 
| 173 222 | 
             
              static const int kStringEncodingMask = 0x8;
         | 
| @@ -182,11 +231,19 @@ class Internals { | |
| 182 231 | 
             
                  kNumIsolateDataSlots * kApiSystemPointerSize;
         | 
| 183 232 | 
             
              static const int kIsolateFastCCallCallerPcOffset =
         | 
| 184 233 | 
             
                  kIsolateFastCCallCallerFpOffset + kApiSystemPointerSize;
         | 
| 185 | 
            -
              static const int  | 
| 234 | 
            +
              static const int kIsolateFastApiCallTargetOffset =
         | 
| 186 235 | 
             
                  kIsolateFastCCallCallerPcOffset + kApiSystemPointerSize;
         | 
| 236 | 
            +
              static const int kIsolateStackGuardOffset =
         | 
| 237 | 
            +
                  kIsolateFastApiCallTargetOffset + kApiSystemPointerSize;
         | 
| 187 238 | 
             
              static const int kIsolateRootsOffset =
         | 
| 188 239 | 
             
                  kIsolateStackGuardOffset + 7 * kApiSystemPointerSize;
         | 
| 189 240 |  | 
| 241 | 
            +
              static const int kExternalPointerTableBufferOffset = 0;
         | 
| 242 | 
            +
              static const int kExternalPointerTableLengthOffset =
         | 
| 243 | 
            +
                  kExternalPointerTableBufferOffset + kApiSystemPointerSize;
         | 
| 244 | 
            +
              static const int kExternalPointerTableCapacityOffset =
         | 
| 245 | 
            +
                  kExternalPointerTableLengthOffset + kApiInt32Size;
         | 
| 246 | 
            +
             | 
| 190 247 | 
             
              static const int kUndefinedValueRootIndex = 4;
         | 
| 191 248 | 
             
              static const int kTheHoleValueRootIndex = 5;
         | 
| 192 249 | 
             
              static const int kNullValueRootIndex = 6;
         | 
| @@ -220,6 +277,17 @@ class Internals { | |
| 220 277 | 
             
              // incremental GC once the external memory reaches this limit.
         | 
| 221 278 | 
             
              static constexpr int kExternalAllocationSoftLimit = 64 * 1024 * 1024;
         | 
| 222 279 |  | 
| 280 | 
            +
            #ifdef V8_MAP_PACKING
         | 
| 281 | 
            +
              static const uintptr_t kMapWordMetadataMask = 0xffffULL << 48;
         | 
| 282 | 
            +
              // The lowest two bits of mapwords are always `0b10`
         | 
| 283 | 
            +
              static const uintptr_t kMapWordSignature = 0b10;
         | 
| 284 | 
            +
              // XORing a (non-compressed) map with this mask ensures that the two
         | 
| 285 | 
            +
              // low-order bits are 0b10. The 0 at the end makes this look like a Smi,
         | 
| 286 | 
            +
              // although real Smis have all lower 32 bits unset. We only rely on these
         | 
| 287 | 
            +
              // values passing as Smis in very few places.
         | 
| 288 | 
            +
              static const int kMapWordXorMask = 0b11;
         | 
| 289 | 
            +
            #endif
         | 
| 290 | 
            +
             | 
| 223 291 | 
             
              V8_EXPORT static void CheckInitializedImpl(v8::Isolate* isolate);
         | 
| 224 292 | 
             
              V8_INLINE static void CheckInitialized(v8::Isolate* isolate) {
         | 
| 225 293 | 
             
            #ifdef V8_ENABLE_CHECKS
         | 
| @@ -246,6 +314,9 @@ class Internals { | |
| 246 314 | 
             
              V8_INLINE static int GetInstanceType(const internal::Address obj) {
         | 
| 247 315 | 
             
                typedef internal::Address A;
         | 
| 248 316 | 
             
                A map = ReadTaggedPointerField(obj, kHeapObjectMapOffset);
         | 
| 317 | 
            +
            #ifdef V8_MAP_PACKING
         | 
| 318 | 
            +
                map = UnpackMapWord(map);
         | 
| 319 | 
            +
            #endif
         | 
| 249 320 | 
             
                return ReadRawField<uint16_t>(map, kMapInstanceTypeOffset);
         | 
| 250 321 | 
             
              }
         | 
| 251 322 |  | 
| @@ -325,8 +396,9 @@ class Internals { | |
| 325 396 | 
             
                  internal::Address heap_object_ptr, int offset) {
         | 
| 326 397 | 
             
            #ifdef V8_COMPRESS_POINTERS
         | 
| 327 398 | 
             
                uint32_t value = ReadRawField<uint32_t>(heap_object_ptr, offset);
         | 
| 328 | 
            -
                internal::Address  | 
| 329 | 
            -
             | 
| 399 | 
            +
                internal::Address base =
         | 
| 400 | 
            +
                    GetPtrComprCageBaseFromOnHeapAddress(heap_object_ptr);
         | 
| 401 | 
            +
                return base + static_cast<internal::Address>(static_cast<uintptr_t>(value));
         | 
| 330 402 | 
             
            #else
         | 
| 331 403 | 
             
                return ReadRawField<internal::Address>(heap_object_ptr, offset);
         | 
| 332 404 | 
             
            #endif
         | 
| @@ -352,45 +424,47 @@ class Internals { | |
| 352 424 | 
             
            #endif
         | 
| 353 425 | 
             
              }
         | 
| 354 426 |  | 
| 427 | 
            +
              V8_INLINE static Address DecodeExternalPointer(
         | 
| 428 | 
            +
                  const Isolate* isolate, ExternalPointer_t encoded_pointer,
         | 
| 429 | 
            +
                  ExternalPointerTag tag) {
         | 
| 430 | 
            +
            #ifdef V8_HEAP_SANDBOX
         | 
| 431 | 
            +
                return internal::DecodeExternalPointerImpl(isolate, encoded_pointer, tag);
         | 
| 432 | 
            +
            #else
         | 
| 433 | 
            +
                return encoded_pointer;
         | 
| 434 | 
            +
            #endif
         | 
| 435 | 
            +
              }
         | 
| 436 | 
            +
             | 
| 355 437 | 
             
              V8_INLINE static internal::Address ReadExternalPointerField(
         | 
| 356 | 
            -
                  internal::Isolate* isolate, internal::Address heap_object_ptr,
         | 
| 357 | 
            -
                   | 
| 358 | 
            -
                internal::Address value = ReadRawField<Address>(heap_object_ptr, offset);
         | 
| 438 | 
            +
                  internal::Isolate* isolate, internal::Address heap_object_ptr, int offset,
         | 
| 439 | 
            +
                  ExternalPointerTag tag) {
         | 
| 359 440 | 
             
            #ifdef V8_HEAP_SANDBOX
         | 
| 441 | 
            +
                internal::ExternalPointer_t encoded_value =
         | 
| 442 | 
            +
                    ReadRawField<uint32_t>(heap_object_ptr, offset);
         | 
| 360 443 | 
             
                // We currently have to treat zero as nullptr in embedder slots.
         | 
| 361 | 
            -
                 | 
| 444 | 
            +
                return encoded_value ? DecodeExternalPointer(isolate, encoded_value, tag)
         | 
| 445 | 
            +
                                     : 0;
         | 
| 446 | 
            +
            #else
         | 
| 447 | 
            +
                return ReadRawField<Address>(heap_object_ptr, offset);
         | 
| 362 448 | 
             
            #endif
         | 
| 363 | 
            -
                return value;
         | 
| 364 449 | 
             
              }
         | 
| 365 450 |  | 
| 366 451 | 
             
            #ifdef V8_COMPRESS_POINTERS
         | 
| 367 452 | 
             
              // See v8:7703 or src/ptr-compr.* for details about pointer compression.
         | 
| 368 | 
            -
              static constexpr size_t  | 
| 369 | 
            -
              static constexpr size_t  | 
| 370 | 
            -
             | 
| 371 | 
            -
              // See v8:10391 for details about V8 heap sandbox.
         | 
| 372 | 
            -
              static constexpr uint32_t kExternalPointerSalt =
         | 
| 373 | 
            -
                  0x7fffffff & ~static_cast<uint32_t>(kHeapObjectTagMask);
         | 
| 453 | 
            +
              static constexpr size_t kPtrComprCageReservationSize = size_t{1} << 32;
         | 
| 454 | 
            +
              static constexpr size_t kPtrComprCageBaseAlignment = size_t{1} << 32;
         | 
| 374 455 |  | 
| 375 | 
            -
              V8_INLINE static internal::Address  | 
| 456 | 
            +
              V8_INLINE static internal::Address GetPtrComprCageBaseFromOnHeapAddress(
         | 
| 376 457 | 
             
                  internal::Address addr) {
         | 
| 377 | 
            -
                return addr & -static_cast<intptr_t>( | 
| 458 | 
            +
                return addr & -static_cast<intptr_t>(kPtrComprCageBaseAlignment);
         | 
| 378 459 | 
             
              }
         | 
| 379 460 |  | 
| 380 461 | 
             
              V8_INLINE static internal::Address DecompressTaggedAnyField(
         | 
| 381 462 | 
             
                  internal::Address heap_object_ptr, uint32_t value) {
         | 
| 382 | 
            -
                internal::Address  | 
| 383 | 
            -
             | 
| 463 | 
            +
                internal::Address base =
         | 
| 464 | 
            +
                    GetPtrComprCageBaseFromOnHeapAddress(heap_object_ptr);
         | 
| 465 | 
            +
                return base + static_cast<internal::Address>(static_cast<uintptr_t>(value));
         | 
| 384 466 | 
             
              }
         | 
| 385 467 |  | 
| 386 | 
            -
              V8_INLINE static Address DecodeExternalPointer(
         | 
| 387 | 
            -
                  const Isolate* isolate, ExternalPointer_t encoded_pointer) {
         | 
| 388 | 
            -
            #ifndef V8_HEAP_SANDBOX
         | 
| 389 | 
            -
                return encoded_pointer;
         | 
| 390 | 
            -
            #else
         | 
| 391 | 
            -
                return encoded_pointer ^ kExternalPointerSalt;
         | 
| 392 | 
            -
            #endif
         | 
| 393 | 
            -
              }
         | 
| 394 468 | 
             
            #endif  // V8_COMPRESS_POINTERS
         | 
| 395 469 | 
             
            };
         | 
| 396 470 |  | 
| @@ -414,7 +488,8 @@ void CastCheck<false>::Perform(T* data) {} | |
| 414 488 |  | 
| 415 489 | 
             
            template <class T>
         | 
| 416 490 | 
             
            V8_INLINE void PerformCastCheck(T* data) {
         | 
| 417 | 
            -
              CastCheck<std::is_base_of<Data, T>::value | 
| 491 | 
            +
              CastCheck<std::is_base_of<Data, T>::value &&
         | 
| 492 | 
            +
                        !std::is_same<Data, std::remove_cv_t<T>>::value>::Perform(data);
         | 
| 418 493 | 
             
            }
         | 
| 419 494 |  | 
| 420 495 | 
             
            // A base class for backing stores, which is needed due to vagaries of
         | 
| @@ -422,6 +497,15 @@ V8_INLINE void PerformCastCheck(T* data) { | |
| 422 497 | 
             
            class BackingStoreBase {};
         | 
| 423 498 |  | 
| 424 499 | 
             
            }  // namespace internal
         | 
| 500 | 
            +
             | 
| 501 | 
            +
            V8_EXPORT bool CopyAndConvertArrayToCppBufferInt32(Local<Array> src,
         | 
| 502 | 
            +
                                                               int32_t* dst,
         | 
| 503 | 
            +
                                                               uint32_t max_length);
         | 
| 504 | 
            +
             | 
| 505 | 
            +
            V8_EXPORT bool CopyAndConvertArrayToCppBufferFloat64(Local<Array> src,
         | 
| 506 | 
            +
                                                                 double* dst,
         | 
| 507 | 
            +
                                                                 uint32_t max_length);
         | 
| 508 | 
            +
             | 
| 425 509 | 
             
            }  // namespace v8
         | 
| 426 510 |  | 
| 427 511 | 
             
            #endif  // INCLUDE_V8_INTERNAL_H_
         | 
| @@ -10,13 +10,74 @@ | |
| 10 10 | 
             
            namespace v8 {
         | 
| 11 11 | 
             
            namespace metrics {
         | 
| 12 12 |  | 
| 13 | 
            +
            struct GarbageCollectionPhases {
         | 
| 14 | 
            +
              int64_t compact_wall_clock_duration_in_us = -1;
         | 
| 15 | 
            +
              int64_t mark_wall_clock_duration_in_us = -1;
         | 
| 16 | 
            +
              int64_t sweep_wall_clock_duration_in_us = -1;
         | 
| 17 | 
            +
              int64_t weak_wall_clock_duration_in_us = -1;
         | 
| 18 | 
            +
            };
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            struct GarbageCollectionSizes {
         | 
| 21 | 
            +
              int64_t bytes_before = -1;
         | 
| 22 | 
            +
              int64_t bytes_after = -1;
         | 
| 23 | 
            +
              int64_t bytes_freed = -1;
         | 
| 24 | 
            +
            };
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            struct GarbageCollectionFullCycle {
         | 
| 27 | 
            +
              GarbageCollectionPhases total;
         | 
| 28 | 
            +
              GarbageCollectionPhases total_cpp;
         | 
| 29 | 
            +
              GarbageCollectionPhases main_thread;
         | 
| 30 | 
            +
              GarbageCollectionPhases main_thread_cpp;
         | 
| 31 | 
            +
              GarbageCollectionPhases main_thread_atomic;
         | 
| 32 | 
            +
              GarbageCollectionPhases main_thread_atomic_cpp;
         | 
| 33 | 
            +
              GarbageCollectionPhases main_thread_incremental;
         | 
| 34 | 
            +
              GarbageCollectionPhases main_thread_incremental_cpp;
         | 
| 35 | 
            +
              GarbageCollectionSizes objects;
         | 
| 36 | 
            +
              GarbageCollectionSizes objects_cpp;
         | 
| 37 | 
            +
              GarbageCollectionSizes memory;
         | 
| 38 | 
            +
              GarbageCollectionSizes memory_cpp;
         | 
| 39 | 
            +
              double collection_rate_in_percent;
         | 
| 40 | 
            +
              double collection_rate_cpp_in_percent;
         | 
| 41 | 
            +
              double efficiency_in_bytes_per_us;
         | 
| 42 | 
            +
              double efficiency_cpp_in_bytes_per_us;
         | 
| 43 | 
            +
              double main_thread_efficiency_in_bytes_per_us;
         | 
| 44 | 
            +
              double main_thread_efficiency_cpp_in_bytes_per_us;
         | 
| 45 | 
            +
            };
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            struct GarbageCollectionFullMainThreadIncrementalMark {
         | 
| 48 | 
            +
              int64_t wall_clock_duration_in_us = -1;
         | 
| 49 | 
            +
              int64_t cpp_wall_clock_duration_in_us = -1;
         | 
| 50 | 
            +
            };
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            struct GarbageCollectionFullMainThreadBatchedIncrementalMark {
         | 
| 53 | 
            +
              std::vector<GarbageCollectionFullMainThreadIncrementalMark> events;
         | 
| 54 | 
            +
            };
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            struct GarbageCollectionFullMainThreadIncrementalSweep {
         | 
| 57 | 
            +
              int64_t wall_clock_duration_in_us = -1;
         | 
| 58 | 
            +
              int64_t cpp_wall_clock_duration_in_us = -1;
         | 
| 59 | 
            +
            };
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            struct GarbageCollectionFullMainThreadBatchedIncrementalSweep {
         | 
| 62 | 
            +
              std::vector<GarbageCollectionFullMainThreadIncrementalSweep> events;
         | 
| 63 | 
            +
            };
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            struct GarbageCollectionYoungCycle {
         | 
| 66 | 
            +
              int64_t total_wall_clock_duration_in_us = -1;
         | 
| 67 | 
            +
              int64_t main_thread_wall_clock_duration_in_us = -1;
         | 
| 68 | 
            +
              double collection_rate_in_percent;
         | 
| 69 | 
            +
              double efficiency_in_bytes_per_us;
         | 
| 70 | 
            +
              double main_thread_efficiency_in_bytes_per_us;
         | 
| 71 | 
            +
            };
         | 
| 72 | 
            +
             | 
| 13 73 | 
             
            struct WasmModuleDecoded {
         | 
| 14 74 | 
             
              bool async = false;
         | 
| 15 75 | 
             
              bool streamed = false;
         | 
| 16 76 | 
             
              bool success = false;
         | 
| 17 77 | 
             
              size_t module_size_in_bytes = 0;
         | 
| 18 78 | 
             
              size_t function_count = 0;
         | 
| 19 | 
            -
              int64_t  | 
| 79 | 
            +
              int64_t wall_clock_duration_in_us = -1;
         | 
| 80 | 
            +
              int64_t cpu_duration_in_us = -1;
         | 
| 20 81 | 
             
            };
         | 
| 21 82 |  | 
| 22 83 | 
             
            struct WasmModuleCompiled {
         | 
| @@ -28,30 +89,38 @@ struct WasmModuleCompiled { | |
| 28 89 | 
             
              bool success = false;
         | 
| 29 90 | 
             
              size_t code_size_in_bytes = 0;
         | 
| 30 91 | 
             
              size_t liftoff_bailout_count = 0;
         | 
| 31 | 
            -
              int64_t  | 
| 92 | 
            +
              int64_t wall_clock_duration_in_us = -1;
         | 
| 93 | 
            +
              int64_t cpu_duration_in_us = -1;
         | 
| 32 94 | 
             
            };
         | 
| 33 95 |  | 
| 34 96 | 
             
            struct WasmModuleInstantiated {
         | 
| 35 97 | 
             
              bool async = false;
         | 
| 36 98 | 
             
              bool success = false;
         | 
| 37 99 | 
             
              size_t imported_function_count = 0;
         | 
| 38 | 
            -
              int64_t  | 
| 100 | 
            +
              int64_t wall_clock_duration_in_us = -1;
         | 
| 39 101 | 
             
            };
         | 
| 40 102 |  | 
| 41 103 | 
             
            struct WasmModuleTieredUp {
         | 
| 42 104 | 
             
              bool lazy = false;
         | 
| 43 105 | 
             
              size_t code_size_in_bytes = 0;
         | 
| 44 | 
            -
              int64_t  | 
| 106 | 
            +
              int64_t wall_clock_duration_in_us = -1;
         | 
| 107 | 
            +
              int64_t cpu_duration_in_us = -1;
         | 
| 45 108 | 
             
            };
         | 
| 46 109 |  | 
| 47 110 | 
             
            struct WasmModulesPerIsolate {
         | 
| 48 111 | 
             
              size_t count = 0;
         | 
| 49 112 | 
             
            };
         | 
| 50 113 |  | 
| 51 | 
            -
            #define V8_MAIN_THREAD_METRICS_EVENTS(V) | 
| 52 | 
            -
              V( | 
| 53 | 
            -
              V( | 
| 54 | 
            -
              V( | 
| 114 | 
            +
            #define V8_MAIN_THREAD_METRICS_EVENTS(V)                    \
         | 
| 115 | 
            +
              V(GarbageCollectionFullCycle)                             \
         | 
| 116 | 
            +
              V(GarbageCollectionFullMainThreadIncrementalMark)         \
         | 
| 117 | 
            +
              V(GarbageCollectionFullMainThreadBatchedIncrementalMark)  \
         | 
| 118 | 
            +
              V(GarbageCollectionFullMainThreadIncrementalSweep)        \
         | 
| 119 | 
            +
              V(GarbageCollectionFullMainThreadBatchedIncrementalSweep) \
         | 
| 120 | 
            +
              V(GarbageCollectionYoungCycle)                            \
         | 
| 121 | 
            +
              V(WasmModuleDecoded)                                      \
         | 
| 122 | 
            +
              V(WasmModuleCompiled)                                     \
         | 
| 123 | 
            +
              V(WasmModuleInstantiated)                                 \
         | 
| 55 124 | 
             
              V(WasmModuleTieredUp)
         | 
| 56 125 |  | 
| 57 126 | 
             
            #define V8_THREAD_SAFE_METRICS_EVENTS(V) V(WasmModulesPerIsolate)
         | 
| @@ -175,9 +175,15 @@ class JobDelegate { | |
| 175 175 | 
             
               * Returns a task_id unique among threads currently running this job, such
         | 
| 176 176 | 
             
               * that GetTaskId() < worker count. To achieve this, the same task_id may be
         | 
| 177 177 | 
             
               * reused by a different thread after a worker_task returns.
         | 
| 178 | 
            +
               */
         | 
| 179 | 
            +
              virtual uint8_t GetTaskId() = 0;
         | 
| 180 | 
            +
             | 
| 181 | 
            +
              /**
         | 
| 182 | 
            +
               * Returns true if the current task is called from the thread currently
         | 
| 183 | 
            +
               * running JobHandle::Join().
         | 
| 178 184 | 
             
               * TODO(etiennep): Make pure virtual once custom embedders implement it.
         | 
| 179 185 | 
             
               */
         | 
| 180 | 
            -
              virtual  | 
| 186 | 
            +
              virtual bool IsJoiningThread() const { return false; }
         | 
| 181 187 | 
             
            };
         | 
| 182 188 |  | 
| 183 189 | 
             
            /**
         | 
| @@ -210,17 +216,43 @@ class JobHandle { | |
| 210 216 | 
             
               */
         | 
| 211 217 | 
             
              virtual void Cancel() = 0;
         | 
| 212 218 |  | 
| 219 | 
            +
              /*
         | 
| 220 | 
            +
               * Forces all existing workers to yield ASAP but doesn’t wait for them.
         | 
| 221 | 
            +
               * Warning, this is dangerous if the Job's callback is bound to or has access
         | 
| 222 | 
            +
               * to state which may be deleted after this call.
         | 
| 223 | 
            +
               * TODO(etiennep): Cleanup once implemented by all embedders.
         | 
| 224 | 
            +
               */
         | 
| 225 | 
            +
              virtual void CancelAndDetach() { Cancel(); }
         | 
| 226 | 
            +
             | 
| 213 227 | 
             
              /**
         | 
| 214 | 
            -
               * Returns true if there's  | 
| 215 | 
            -
               * TODO(etiennep): Make pure virtual once custom embedders implement it.
         | 
| 228 | 
            +
               * Returns true if there's any work pending or any worker running.
         | 
| 216 229 | 
             
               */
         | 
| 217 | 
            -
              virtual bool  | 
| 230 | 
            +
              virtual bool IsActive() = 0;
         | 
| 231 | 
            +
             | 
| 232 | 
            +
              // TODO(etiennep): Clean up once all overrides are removed.
         | 
| 233 | 
            +
              V8_DEPRECATED("Use !IsActive() instead.")
         | 
| 234 | 
            +
              virtual bool IsCompleted() { return !IsActive(); }
         | 
| 218 235 |  | 
| 219 236 | 
             
              /**
         | 
| 220 237 | 
             
               * Returns true if associated with a Job and other methods may be called.
         | 
| 221 | 
            -
               * Returns false after Join() or Cancel() was called.
         | 
| 238 | 
            +
               * Returns false after Join() or Cancel() was called. This may return true
         | 
| 239 | 
            +
               * even if no workers are running and IsCompleted() returns true
         | 
| 222 240 | 
             
               */
         | 
| 223 | 
            -
              virtual bool  | 
| 241 | 
            +
              virtual bool IsValid() = 0;
         | 
| 242 | 
            +
             | 
| 243 | 
            +
              // TODO(etiennep): Clean up once all overrides are removed.
         | 
| 244 | 
            +
              V8_DEPRECATED("Use IsValid() instead.")
         | 
| 245 | 
            +
              virtual bool IsRunning() { return IsValid(); }
         | 
| 246 | 
            +
             | 
| 247 | 
            +
              /**
         | 
| 248 | 
            +
               * Returns true if job priority can be changed.
         | 
| 249 | 
            +
               */
         | 
| 250 | 
            +
              virtual bool UpdatePriorityEnabled() const { return false; }
         | 
| 251 | 
            +
             | 
| 252 | 
            +
              /**
         | 
| 253 | 
            +
               *  Update this Job's priority.
         | 
| 254 | 
            +
               */
         | 
| 255 | 
            +
              virtual void UpdatePriority(TaskPriority new_priority) {}
         | 
| 224 256 | 
             
            };
         | 
| 225 257 |  | 
| 226 258 | 
             
            /**
         | 
| @@ -233,23 +265,17 @@ class JobTask { | |
| 233 265 | 
             
              virtual void Run(JobDelegate* delegate) = 0;
         | 
| 234 266 |  | 
| 235 267 | 
             
              /**
         | 
| 236 | 
            -
               * Controls the maximum number of threads calling Run() concurrently | 
| 237 | 
            -
               *  | 
| 238 | 
            -
               *  | 
| 239 | 
            -
               *  | 
| 268 | 
            +
               * Controls the maximum number of threads calling Run() concurrently, given
         | 
| 269 | 
            +
               * the number of threads currently assigned to this job and executing Run().
         | 
| 270 | 
            +
               * Run() is only invoked if the number of threads previously running Run() was
         | 
| 271 | 
            +
               * less than the value returned. Since GetMaxConcurrency() is a leaf function,
         | 
| 272 | 
            +
               * it must not call back any JobHandle methods.
         | 
| 240 273 | 
             
               */
         | 
| 241 | 
            -
              virtual size_t GetMaxConcurrency() const = 0;
         | 
| 274 | 
            +
              virtual size_t GetMaxConcurrency(size_t worker_count) const = 0;
         | 
| 242 275 |  | 
| 243 | 
            -
               | 
| 244 | 
            -
             | 
| 245 | 
            -
             | 
| 246 | 
            -
               * must include local work items not visible globaly by other workers.
         | 
| 247 | 
            -
               * TODO(etiennep): Replace the version above by this once custom embedders are
         | 
| 248 | 
            -
               * migrated.
         | 
| 249 | 
            -
               */
         | 
| 250 | 
            -
              size_t GetMaxConcurrency(size_t worker_count) const {
         | 
| 251 | 
            -
                return GetMaxConcurrency();
         | 
| 252 | 
            -
              }
         | 
| 276 | 
            +
              // TODO(1114823): Clean up once all overrides are removed.
         | 
| 277 | 
            +
              V8_DEPRECATED("Use the version that takes |worker_count|.")
         | 
| 278 | 
            +
              virtual size_t GetMaxConcurrency() const { return 0; }
         | 
| 253 279 | 
             
            };
         | 
| 254 280 |  | 
| 255 281 | 
             
            /**
         | 
| @@ -382,7 +408,6 @@ class PageAllocator { | |
| 382 408 | 
             
                kNoAccess,
         | 
| 383 409 | 
             
                kRead,
         | 
| 384 410 | 
             
                kReadWrite,
         | 
| 385 | 
            -
                // TODO(hpayer): Remove this flag. Memory should never be rwx.
         | 
| 386 411 | 
             
                kReadWriteExecute,
         | 
| 387 412 | 
             
                kReadExecute,
         | 
| 388 413 | 
             
                // Set this when reserving memory that will later require kReadWriteExecute
         |