%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
// Copyright 2018 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_COMMON_PTR_COMPR_INL_H_ #define V8_COMMON_PTR_COMPR_INL_H_ #include "include/v8-internal.h" #include "src/common/ptr-compr.h" #include "src/execution/isolate.h" #include "src/execution/local-isolate-inl.h" namespace v8 { namespace internal { #ifdef V8_COMPRESS_POINTERS PtrComprCageBase::PtrComprCageBase(const Isolate* isolate) : address_(isolate->cage_base()) {} PtrComprCageBase::PtrComprCageBase(const LocalIsolate* isolate) : address_(isolate->cage_base()) {} Address PtrComprCageBase::address() const { Address ret = address_; ret = reinterpret_cast<Address>(V8_ASSUME_ALIGNED( reinterpret_cast<void*>(ret), kPtrComprCageBaseAlignment)); return ret; } // Compresses full-pointer representation of a tagged value to on-heap // representation. V8_INLINE Tagged_t CompressTagged(Address tagged) { return static_cast<Tagged_t>(static_cast<uint32_t>(tagged)); } V8_INLINE constexpr Address GetPtrComprCageBaseAddress(Address on_heap_addr) { return RoundDown<kPtrComprCageBaseAlignment>(on_heap_addr); } V8_INLINE Address GetPtrComprCageBaseAddress(PtrComprCageBase cage_base) { return cage_base.address(); } V8_INLINE constexpr PtrComprCageBase GetPtrComprCageBaseFromOnHeapAddress( Address address) { return PtrComprCageBase(GetPtrComprCageBaseAddress(address)); } // Decompresses smi value. V8_INLINE Address DecompressTaggedSigned(Tagged_t raw_value) { // For runtime code the upper 32-bits of the Smi value do not matter. return static_cast<Address>(raw_value); } // Decompresses weak or strong heap object pointer or forwarding pointer, // preserving both weak- and smi- tags. template <typename TOnHeapAddress> V8_INLINE Address DecompressTaggedPointer(TOnHeapAddress on_heap_addr, Tagged_t raw_value) { return GetPtrComprCageBaseAddress(on_heap_addr) + static_cast<Address>(raw_value); } // Decompresses any tagged value, preserving both weak- and smi- tags. template <typename TOnHeapAddress> V8_INLINE Address DecompressTaggedAny(TOnHeapAddress on_heap_addr, Tagged_t raw_value) { return DecompressTaggedPointer(on_heap_addr, raw_value); } STATIC_ASSERT(kPtrComprCageReservationSize == Internals::kPtrComprCageReservationSize); STATIC_ASSERT(kPtrComprCageBaseAlignment == Internals::kPtrComprCageBaseAlignment); #else V8_INLINE Tagged_t CompressTagged(Address tagged) { UNREACHABLE(); } V8_INLINE constexpr PtrComprCageBase GetPtrComprCageBaseFromOnHeapAddress( Address address) { return PtrComprCageBase(); } V8_INLINE Address DecompressTaggedSigned(Tagged_t raw_value) { UNREACHABLE(); } template <typename TOnHeapAddress> V8_INLINE Address DecompressTaggedPointer(TOnHeapAddress on_heap_addr, Tagged_t raw_value) { UNREACHABLE(); } template <typename TOnHeapAddress> V8_INLINE Address DecompressTaggedAny(TOnHeapAddress on_heap_addr, Tagged_t raw_value) { UNREACHABLE(); } #endif // V8_COMPRESS_POINTERS inline PtrComprCageBase GetPtrComprCageBase(HeapObject object) { return GetPtrComprCageBaseFromOnHeapAddress(object.ptr()); } } // namespace internal } // namespace v8 #endif // V8_COMMON_PTR_COMPR_INL_H_