// Copyright 2024 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 INCLUDE_V8_SANDBOX_H_ #define INCLUDE_V8_SANDBOX_H_ #include <cstdint> #include "v8-internal.h" // NOLINT(build/include_directory) #include "v8config.h" // NOLINT(build/include_directory) namespace v8 { /** * A pointer tag used for wrapping and unwrapping `CppHeap` pointers as used * with JS API wrapper objects that rely on `v8::Object::Wrap()` and * `v8::Object::Unwrap()`. * * The CppHeapPointers use a range-based type checking scheme, where on access * to a pointer, the actual type of the pointer is checked to be within a * specified range of types. This allows supporting type hierarchies, where a * type check for a supertype must succeed for any subtype. * * The tag is currently in practice limited to 15 bits since it needs to fit * together with a marking bit into the unused parts of a pointer (the top 16 * bits). */ enum class CppHeapPointerTag : uint16_t { … }; // Convenience struct to represent tag ranges. This is used for type checks // against supertypes, which cover a range of types (their subtypes). // Both the lower- and the upper bound are inclusive. In other words, this // struct represents the range [lower_bound, upper_bound]. struct CppHeapPointerTagRange { … }; constexpr CppHeapPointerTagRange kAnyCppHeapPointer( CppHeapPointerTag::kFirstTag, CppHeapPointerTag::kLastTag); class SandboxHardwareSupport { … }; namespace internal { #ifdef V8_COMPRESS_POINTERS V8_INLINE static Address* GetCppHeapPointerTableBase(v8::Isolate* isolate) { … } #endif // V8_COMPRESS_POINTERS template <typename T> V8_INLINE static T* ReadCppHeapPointerField(v8::Isolate* isolate, Address heap_object_ptr, int offset, CppHeapPointerTagRange tag_range) { … } } // namespace internal } // namespace v8 #endif // INCLUDE_V8_SANDBOX_H_