1ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers/* 2ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Copyright (C) 2014 The Android Open Source Project 3ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * 4ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 5ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * you may not use this file except in compliance with the License. 6ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * You may obtain a copy of the License at 7ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * 8ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 9ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * 10ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * Unless required by applicable law or agreed to in writing, software 11ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 12ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * See the License for the specific language governing permissions and 14ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers * limitations under the License. 15ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers */ 16ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 17ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#ifndef ART_RUNTIME_MIRROR_OBJECT_REFERENCE_H_ 18ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#define ART_RUNTIME_MIRROR_OBJECT_REFERENCE_H_ 19ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 20b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers#include "base/mutex.h" // For Locks::mutator_lock_. 21e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchi#include "globals.h" 22ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 23ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersnamespace art { 24ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersnamespace mirror { 25ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 26ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersclass Object; 27ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 28ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers// Classes shared with the managed side of the world need to be packed so that they don't have 29ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers// extra platform specific padding. 30ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#define MANAGED PACKED(4) 31ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 32ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers// Value type representing a reference to a mirror::Object of type MirrorType. 33ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogerstemplate<bool kPoisonReferences, class MirrorType> 34ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersclass MANAGED ObjectReference { 35ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers public: 3690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier MirrorType* AsMirrorPtr() const SHARED_REQUIRES(Locks::mutator_lock_) { 37ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return UnCompress(); 38ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 39ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 4090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void Assign(MirrorType* other) SHARED_REQUIRES(Locks::mutator_lock_) { 41ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers reference_ = Compress(other); 42ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 43ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 44ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers void Clear() { 45ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers reference_ = 0; 46bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier DCHECK(IsNull()); 47bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier } 48bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier 49bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier bool IsNull() const { 50bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier return reference_ == 0; 51ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 52ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 53ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers uint32_t AsVRegValue() const { 54ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return reference_; 55ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 56ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 57ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers protected: 58ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ObjectReference<kPoisonReferences, MirrorType>(MirrorType* mirror_ptr) 5990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) 60ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers : reference_(Compress(mirror_ptr)) { 61ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 62ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 63ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers // Compress reference to its bit representation. 6490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier static uint32_t Compress(MirrorType* mirror_ptr) SHARED_REQUIRES(Locks::mutator_lock_) { 65ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers uintptr_t as_bits = reinterpret_cast<uintptr_t>(mirror_ptr); 66ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return static_cast<uint32_t>(kPoisonReferences ? -as_bits : as_bits); 67ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 68ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 69ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers // Uncompress an encoded reference from its bit representation. 7090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier MirrorType* UnCompress() const SHARED_REQUIRES(Locks::mutator_lock_) { 71ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers uintptr_t as_bits = kPoisonReferences ? -reference_ : reference_; 72ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return reinterpret_cast<MirrorType*>(as_bits); 73ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 74ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 75ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers friend class Object; 76ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 77ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers // The encoded reference to a mirror::Object. 78ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers uint32_t reference_; 79ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers}; 80ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 81ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers// References between objects within the managed heap. 82ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogerstemplate<class MirrorType> 83e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchiclass MANAGED HeapReference : public ObjectReference<kPoisonHeapReferences, MirrorType> { 84ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers public: 85ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers static HeapReference<MirrorType> FromMirrorPtr(MirrorType* mirror_ptr) 8690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 87ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return HeapReference<MirrorType>(mirror_ptr); 88ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 89ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers private: 9090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier HeapReference<MirrorType>(MirrorType* mirror_ptr) SHARED_REQUIRES(Locks::mutator_lock_) 91e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchi : ObjectReference<kPoisonHeapReferences, MirrorType>(mirror_ptr) {} 92ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers}; 93ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 94d3ed9a320a89cb9b91b2361892c043ab7e112717Mathieu Chartier// Standard compressed reference used in the runtime. Used for StackReference and GC roots. 95bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartiertemplate<class MirrorType> 96bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartierclass MANAGED CompressedReference : public mirror::ObjectReference<false, MirrorType> { 97bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier public: 9890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier CompressedReference<MirrorType>() SHARED_REQUIRES(Locks::mutator_lock_) 99bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier : mirror::ObjectReference<false, MirrorType>(nullptr) {} 100bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier 101bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier static CompressedReference<MirrorType> FromMirrorPtr(MirrorType* p) 10290443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_) { 103bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier return CompressedReference<MirrorType>(p); 104bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier } 105bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier 106bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier private: 10790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier CompressedReference<MirrorType>(MirrorType* p) SHARED_REQUIRES(Locks::mutator_lock_) 108bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier : mirror::ObjectReference<false, MirrorType>(p) {} 109bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier}; 110bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier 111ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} // namespace mirror 112ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} // namespace art 113ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 114ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#endif // ART_RUNTIME_MIRROR_OBJECT_REFERENCE_H_ 115