1fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier/* 2fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * Copyright (C) 2015 The Android Open Source Project 3fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * 4fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 5fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * you may not use this file except in compliance with the License. 6fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * You may obtain a copy of the License at 7fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * 8fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 9fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * 10fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * Unless required by applicable law or agreed to in writing, software 11fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 12fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * See the License for the specific language governing permissions and 14fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier * limitations under the License. 15fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier */ 16fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 17fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier#include "method.h" 18fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 19e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "art_method.h" 20e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "gc_root-inl.h" 21e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "mirror/class-inl.h" 22fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier#include "mirror/object-inl.h" 23fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 24fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartiernamespace art { 25fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartiernamespace mirror { 26fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 27fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu ChartierGcRoot<Class> Method::static_class_; 28fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu ChartierGcRoot<Class> Method::array_class_; 29fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu ChartierGcRoot<Class> Constructor::static_class_; 30fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu ChartierGcRoot<Class> Constructor::array_class_; 31fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 32fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartiervoid Method::SetClass(Class* klass) { 33fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier CHECK(static_class_.IsNull()) << static_class_.Read() << " " << klass; 34fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier CHECK(klass != nullptr); 35fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier static_class_ = GcRoot<Class>(klass); 36fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} 37fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 38fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartiervoid Method::ResetClass() { 39fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier CHECK(!static_class_.IsNull()); 40fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier static_class_ = GcRoot<Class>(nullptr); 41fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} 42fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 43fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartiervoid Method::SetArrayClass(Class* klass) { 44fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier CHECK(array_class_.IsNull()) << array_class_.Read() << " " << klass; 45fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier CHECK(klass != nullptr); 46fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier array_class_ = GcRoot<Class>(klass); 47fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} 48fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 49fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartiervoid Method::ResetArrayClass() { 50fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier CHECK(!array_class_.IsNull()); 51fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier array_class_ = GcRoot<Class>(nullptr); 52fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} 53fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 540866f4ed6338faa4a193b7e819fc7cd72bd7b0aeAndreas Gampetemplate <bool kTransactionActive> 55e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu ChartierMethod* Method::CreateFromArtMethod(Thread* self, ArtMethod* method) { 56fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier DCHECK(!method->IsConstructor()) << PrettyMethod(method); 57fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier auto* ret = down_cast<Method*>(StaticClass()->AllocObject(self)); 58fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier if (LIKELY(ret != nullptr)) { 590866f4ed6338faa4a193b7e819fc7cd72bd7b0aeAndreas Gampe static_cast<AbstractMethod*>(ret)->CreateFromArtMethod<kTransactionActive>(method); 60fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier } 61fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier return ret; 62fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} 63fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 640866f4ed6338faa4a193b7e819fc7cd72bd7b0aeAndreas Gampetemplate Method* Method::CreateFromArtMethod<false>(Thread* self, ArtMethod* method); 650866f4ed6338faa4a193b7e819fc7cd72bd7b0aeAndreas Gampetemplate Method* Method::CreateFromArtMethod<true>(Thread* self, ArtMethod* method); 660866f4ed6338faa4a193b7e819fc7cd72bd7b0aeAndreas Gampe 67fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartiervoid Method::VisitRoots(RootVisitor* visitor) { 68fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier static_class_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); 69fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier array_class_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); 70fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} 71fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 72fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartiervoid Constructor::SetClass(Class* klass) { 73fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier CHECK(static_class_.IsNull()) << static_class_.Read() << " " << klass; 74fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier CHECK(klass != nullptr); 75fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier static_class_ = GcRoot<Class>(klass); 76fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} 77fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 78fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartiervoid Constructor::ResetClass() { 79fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier CHECK(!static_class_.IsNull()); 80fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier static_class_ = GcRoot<Class>(nullptr); 81fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} 82fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 83fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartiervoid Constructor::SetArrayClass(Class* klass) { 84fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier CHECK(array_class_.IsNull()) << array_class_.Read() << " " << klass; 85fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier CHECK(klass != nullptr); 86fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier array_class_ = GcRoot<Class>(klass); 87fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} 88fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 89fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartiervoid Constructor::ResetArrayClass() { 90fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier CHECK(!array_class_.IsNull()); 91fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier array_class_ = GcRoot<Class>(nullptr); 92fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} 93fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 94fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartiervoid Constructor::VisitRoots(RootVisitor* visitor) { 95fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier static_class_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); 96fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier array_class_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass)); 97fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} 98fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 99f72f19fac0016499d33fd75b0463d0128a58a9f4Andreas Gampetemplate <bool kTransactionActive> 100e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu ChartierConstructor* Constructor::CreateFromArtMethod(Thread* self, ArtMethod* method) { 101fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier DCHECK(method->IsConstructor()) << PrettyMethod(method); 102fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier auto* ret = down_cast<Constructor*>(StaticClass()->AllocObject(self)); 103fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier if (LIKELY(ret != nullptr)) { 104f72f19fac0016499d33fd75b0463d0128a58a9f4Andreas Gampe static_cast<AbstractMethod*>(ret)->CreateFromArtMethod<kTransactionActive>(method); 105fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier } 106fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier return ret; 107fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} 108fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier 109f72f19fac0016499d33fd75b0463d0128a58a9f4Andreas Gampetemplate Constructor* Constructor::CreateFromArtMethod<false>(Thread* self, ArtMethod* method); 110f72f19fac0016499d33fd75b0463d0128a58a9f4Andreas Gampetemplate Constructor* Constructor::CreateFromArtMethod<true>(Thread* self, ArtMethod* method); 111f72f19fac0016499d33fd75b0463d0128a58a9f4Andreas Gampe 112fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} // namespace mirror 113fc58af45e342ba9e18bbdf597f205a58ec731658Mathieu Chartier} // namespace art 114