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