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: 36ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers MirrorType* AsMirrorPtr() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 37ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return UnCompress(); 38ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 39ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 40ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers void Assign(MirrorType* other) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 41ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers reference_ = Compress(other); 42ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 43ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 44ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers void Clear() { 45ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers reference_ = 0; 46ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 47ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 48ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers uint32_t AsVRegValue() const { 49ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return reference_; 50ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 51ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 52ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers protected: 53ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers ObjectReference<kPoisonReferences, MirrorType>(MirrorType* mirror_ptr) 54ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) 55ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers : reference_(Compress(mirror_ptr)) { 56ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 57ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 58ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers // Compress reference to its bit representation. 59ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers static uint32_t Compress(MirrorType* mirror_ptr) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 60ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers uintptr_t as_bits = reinterpret_cast<uintptr_t>(mirror_ptr); 61ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return static_cast<uint32_t>(kPoisonReferences ? -as_bits : as_bits); 62ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 63ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 64ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers // Uncompress an encoded reference from its bit representation. 65ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers MirrorType* UnCompress() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 66ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers uintptr_t as_bits = kPoisonReferences ? -reference_ : reference_; 67ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return reinterpret_cast<MirrorType*>(as_bits); 68ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 69ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 70ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers friend class Object; 71ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 72ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers // The encoded reference to a mirror::Object. 73ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers uint32_t reference_; 74ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers}; 75ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 76ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers// References between objects within the managed heap. 77ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogerstemplate<class MirrorType> 78e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchiclass MANAGED HeapReference : public ObjectReference<kPoisonHeapReferences, MirrorType> { 79ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers public: 80ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers static HeapReference<MirrorType> FromMirrorPtr(MirrorType* mirror_ptr) 81ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 82ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return HeapReference<MirrorType>(mirror_ptr); 83ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 84ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers private: 85ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers HeapReference<MirrorType>(MirrorType* mirror_ptr) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) 86e63a745f26fec5a5b4162fc83f6e88a1f696c30cHiroshi Yamauchi : ObjectReference<kPoisonHeapReferences, MirrorType>(mirror_ptr) {} 87ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers}; 88ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 89ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} // namespace mirror 90ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} // namespace art 91ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 92ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers#endif // ART_RUNTIME_MIRROR_OBJECT_REFERENCE_H_ 93