#include"base/atomic.h" #include"base/casts.h" #include"base/locks.h"// For Locks::mutator_lock_. #include"base/macros.h" #include"heap_poisoning.h" #include"obj_ptr.h" #include"runtime_globals.h"
namespace art HIDDEN { namespace mirror {
class Object;
// Classes shared with the managed side of the world need to be packed so that they don't have // extra platform specific padding. #define MANAGED PACKED(4) #define MIRROR_CLASS(desc) \
static_assert(::art::mirror::IsMirroredDescriptor(desc), \
desc " is not a known mirror class. Please update" \ " IsMirroredDescriptor to include it!")
constexpr bool IsMirroredDescriptor(std::string_view desc) { if (desc[0] != 'L') { // All primitives and arrays are mirrored returntrue;
} // LINT.IfChange #define MIRROR_DESCRIPTORS(vis) \
vis("Ljava/lang/Class;") \
vis("Ljava/lang/ClassLoader;") \
vis("Ljava/lang/DexCache;") \
vis("Ljava/lang/Object;") \
vis("Ljava/lang/StackFrameInfo;") \
vis("Ljava/lang/StackTraceElement;") \
vis("Ljava/lang/String;") \
vis("Ljava/lang/Throwable;") \
vis("Ljava/lang/invoke/ArrayElementVarHandle;") \
vis("Ljava/lang/invoke/ByteArrayViewVarHandle;") \
vis("Ljava/lang/invoke/ByteBufferViewVarHandle;") \
vis("Ljava/lang/invoke/CallSite;") \
vis("Ljava/lang/invoke/FieldVarHandle;") \
vis("Ljava/lang/invoke/StaticFieldVarHandle;") \
vis("Ljava/lang/invoke/MemorySegmentVarHandle;") \
vis("Ljava/lang/invoke/MethodHandle;") \
vis("Ljava/lang/invoke/MethodHandleImpl;") \
vis("Ljava/lang/invoke/MethodHandles$Lookup;") \
vis("Ljava/lang/invoke/MethodType;") \
vis("Ljava/lang/invoke/VarHandle;") \
vis("Ljava/lang/ref/FinalizerReference;") \
vis("Ljava/lang/ref/Reference;") \
vis("Ljava/lang/reflect/AccessibleObject;") \
vis("Ljava/lang/reflect/Constructor;") \
vis("Ljava/lang/reflect/Executable;") \
vis("Ljava/lang/reflect/Field;") \
vis("Ljava/lang/reflect/Method;") \
vis("Ljava/lang/reflect/Proxy;") \
vis("Ldalvik/system/ClassExt;") \
vis("Ldalvik/system/EmulatedStackFrame;") \
vis("Ldalvik/system/VirtualThreadContext;") \
vis("Ldalvik/system/VirtualThreadFrame;") // LINT.ThenChange(/libcore/r8_exclude_classes.txt) // TODO: Once we are C++ 20 we can just have a constexpr array and std::find. // constexpr std::array<std::string_view, 28> kMirrorTypes{ // // Fill in // }; // return std::find(kMirrorTypes.begin(), kMirrorTypes.end(), desc) != kMirrorTypes.end(); #define CHECK_DESCRIPTOR(descriptor) \ if (std::string_view(descriptor) == desc) { \ returntrue; \
}
MIRROR_DESCRIPTORS(CHECK_DESCRIPTOR) #undef CHECK_DESCRIPTOR returnfalse; #undef MIRROR_DESCRIPTORS
}
template<bool kPoisonReferences, class MirrorType> class PtrCompression { public: // Compress reference to its bit representation. static uint32_t Compress(MirrorType* mirror_ptr) {
uint32_t as_bits = reinterpret_cast32<uint32_t>(mirror_ptr); return kPoisonReferences ? -as_bits : as_bits;
}
// Uncompress an encoded reference from its bit representation. static MirrorType* Decompress(uint32_t ref) {
uint32_t as_bits = kPoisonReferences ? -ref : ref; return reinterpret_cast32<MirrorType*>(as_bits);
}
// Convert an ObjPtr to a compressed reference. static uint32_t Compress(ObjPtr<MirrorType> ptr) REQUIRES_SHARED(Locks::mutator_lock_);
};
// Value type representing a reference to a mirror::Object of type MirrorType. template<bool kPoisonReferences, class MirrorType> class MANAGED ObjectReference { private: using Compression = PtrCompression<kPoisonReferences, MirrorType>;
// The encoded reference to a mirror::Object.
uint32_t reference_;
};
// References between objects within the managed heap. // Similar API to ObjectReference, but not a value type. Supports atomic access. template<class MirrorType> class MANAGED HeapReference { private: using Compression = PtrCompression<kPoisonHeapReferences, MirrorType>;
// The encoded reference to a mirror::Object. Atomically updateable.
Atomic<uint32_t> reference_;
};
static_assert(sizeof(mirror::HeapReference<mirror::Object>) == kHeapReferenceSize, "heap reference size does not match");
// Standard compressed reference used in the runtime. Used for StackReference and GC roots. template<class MirrorType> class MANAGED CompressedReference : public mirror::ObjectReference<false, MirrorType> { public:
CompressedReference<MirrorType>()
: mirror::ObjectReference<false, MirrorType>() {}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.