1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_COMPILER_OPTIMIZING_HANDLE_CACHE_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_COMPILER_OPTIMIZING_HANDLE_CACHE_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 21*795d594fSAndroid Build Coastguard Worker #include "class_root.h" 22*795d594fSAndroid Build Coastguard Worker #include "reference_type_info.h" 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker class VariableSizedHandleScope; 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker class HandleCache { 29*795d594fSAndroid Build Coastguard Worker public: HandleCache(VariableSizedHandleScope * handles)30*795d594fSAndroid Build Coastguard Worker explicit HandleCache(VariableSizedHandleScope* handles) : handles_(handles) { } 31*795d594fSAndroid Build Coastguard Worker GetHandles()32*795d594fSAndroid Build Coastguard Worker VariableSizedHandleScope* GetHandles() { return handles_; } 33*795d594fSAndroid Build Coastguard Worker 34*795d594fSAndroid Build Coastguard Worker template <typename T> 35*795d594fSAndroid Build Coastguard Worker MutableHandle<T> NewHandle(T* object) REQUIRES_SHARED(Locks::mutator_lock_); 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker template <typename T> 38*795d594fSAndroid Build Coastguard Worker MutableHandle<T> NewHandle(ObjPtr<T> object) REQUIRES_SHARED(Locks::mutator_lock_); 39*795d594fSAndroid Build Coastguard Worker GetObjectClassHandle()40*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle GetObjectClassHandle() { 41*795d594fSAndroid Build Coastguard Worker return GetRootHandle(ClassRoot::kJavaLangObject, &object_class_handle_); 42*795d594fSAndroid Build Coastguard Worker } 43*795d594fSAndroid Build Coastguard Worker GetClassClassHandle()44*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle GetClassClassHandle() { 45*795d594fSAndroid Build Coastguard Worker return GetRootHandle(ClassRoot::kJavaLangClass, &class_class_handle_); 46*795d594fSAndroid Build Coastguard Worker } 47*795d594fSAndroid Build Coastguard Worker GetMethodHandleClassHandle()48*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle GetMethodHandleClassHandle() { 49*795d594fSAndroid Build Coastguard Worker return GetRootHandle(ClassRoot::kJavaLangInvokeMethodHandleImpl, &method_handle_class_handle_); 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker GetMethodTypeClassHandle()52*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle GetMethodTypeClassHandle() { 53*795d594fSAndroid Build Coastguard Worker return GetRootHandle(ClassRoot::kJavaLangInvokeMethodType, &method_type_class_handle_); 54*795d594fSAndroid Build Coastguard Worker } 55*795d594fSAndroid Build Coastguard Worker GetStringClassHandle()56*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle GetStringClassHandle() { 57*795d594fSAndroid Build Coastguard Worker return GetRootHandle(ClassRoot::kJavaLangString, &string_class_handle_); 58*795d594fSAndroid Build Coastguard Worker } 59*795d594fSAndroid Build Coastguard Worker GetThrowableClassHandle()60*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle GetThrowableClassHandle() { 61*795d594fSAndroid Build Coastguard Worker return GetRootHandle(ClassRoot::kJavaLangThrowable, &throwable_class_handle_); 62*795d594fSAndroid Build Coastguard Worker } 63*795d594fSAndroid Build Coastguard Worker 64*795d594fSAndroid Build Coastguard Worker private: GetRootHandle(ClassRoot class_root,ReferenceTypeInfo::TypeHandle * cache)65*795d594fSAndroid Build Coastguard Worker inline ReferenceTypeInfo::TypeHandle GetRootHandle(ClassRoot class_root, 66*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle* cache) { 67*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(!ReferenceTypeInfo::IsValidHandle(*cache))) { 68*795d594fSAndroid Build Coastguard Worker *cache = CreateRootHandle(handles_, class_root); 69*795d594fSAndroid Build Coastguard Worker } 70*795d594fSAndroid Build Coastguard Worker return *cache; 71*795d594fSAndroid Build Coastguard Worker } 72*795d594fSAndroid Build Coastguard Worker 73*795d594fSAndroid Build Coastguard Worker static ReferenceTypeInfo::TypeHandle CreateRootHandle(VariableSizedHandleScope* handles, 74*795d594fSAndroid Build Coastguard Worker ClassRoot class_root); 75*795d594fSAndroid Build Coastguard Worker 76*795d594fSAndroid Build Coastguard Worker VariableSizedHandleScope* handles_; 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle object_class_handle_; 79*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle class_class_handle_; 80*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle method_handle_class_handle_; 81*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle method_type_class_handle_; 82*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle string_class_handle_; 83*795d594fSAndroid Build Coastguard Worker ReferenceTypeInfo::TypeHandle throwable_class_handle_; 84*795d594fSAndroid Build Coastguard Worker }; 85*795d594fSAndroid Build Coastguard Worker 86*795d594fSAndroid Build Coastguard Worker } // namespace art 87*795d594fSAndroid Build Coastguard Worker 88*795d594fSAndroid Build Coastguard Worker #endif // ART_COMPILER_OPTIMIZING_HANDLE_CACHE_H_ 89*795d594fSAndroid Build Coastguard Worker 90