1daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier/*
2daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier * Copyright (C) 2015 The Android Open Source Project
3daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier *
4daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License");
5daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier * you may not use this file except in compliance with the License.
6daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier * You may obtain a copy of the License at
7daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier *
8daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier *      http://www.apache.org/licenses/LICENSE-2.0
9daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier *
10daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier * Unless required by applicable law or agreed to in writing, software
11daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS,
12daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier * See the License for the specific language governing permissions and
14daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier * limitations under the License.
15daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier */
16daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier
17daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier#include "field-inl.h"
18daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier
19e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "class-inl.h"
20daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier#include "dex_cache-inl.h"
21daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier#include "object_array-inl.h"
22daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier#include "object-inl.h"
23daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier
24daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartiernamespace art {
25daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartiernamespace mirror {
26daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier
27daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu ChartierGcRoot<Class> Field::static_class_;
28daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu ChartierGcRoot<Class> Field::array_class_;
29daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier
30daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartiervoid Field::SetClass(Class* klass) {
31daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier  CHECK(static_class_.IsNull()) << static_class_.Read() << " " << klass;
32daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier  CHECK(klass != nullptr);
33daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier  static_class_ = GcRoot<Class>(klass);
34daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier}
35daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier
36daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartiervoid Field::ResetClass() {
37daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier  CHECK(!static_class_.IsNull());
38daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier  static_class_ = GcRoot<Class>(nullptr);
39daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier}
40daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier
41daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartiervoid Field::SetArrayClass(Class* klass) {
42daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier  CHECK(array_class_.IsNull()) << array_class_.Read() << " " << klass;
43daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier  CHECK(klass != nullptr);
44daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier  array_class_ = GcRoot<Class>(klass);
45daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier}
46daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier
47daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartiervoid Field::ResetArrayClass() {
48daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier  CHECK(!array_class_.IsNull());
49daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier  array_class_ = GcRoot<Class>(nullptr);
50daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier}
51daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier
52bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartiervoid Field::VisitRoots(RootVisitor* visitor) {
53bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier  static_class_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass));
54bb87e0f1a52de656bc77cb01cb887e51a0e5198bMathieu Chartier  array_class_.VisitRootIfNonNull(visitor, RootInfo(kRootStickyClass));
55daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier}
56daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier
57daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu ChartierArtField* Field::GetArtField() {
582debd8032a9e44910bb7e39ca5d142a4fc237c05Hiroshi Yamauchi  mirror::Class* declaring_class = GetDeclaringClass();
593a0909248e04b22c3981cbf617bc2502ed5b6380Nicolas Geoffray  if (UNLIKELY(declaring_class->IsProxyClass())) {
602debd8032a9e44910bb7e39ca5d142a4fc237c05Hiroshi Yamauchi    DCHECK(IsStatic());
612debd8032a9e44910bb7e39ca5d142a4fc237c05Hiroshi Yamauchi    DCHECK_EQ(declaring_class->NumStaticFields(), 2U);
622debd8032a9e44910bb7e39ca5d142a4fc237c05Hiroshi Yamauchi    // 0 == Class[] interfaces; 1 == Class[][] throws;
632debd8032a9e44910bb7e39ca5d142a4fc237c05Hiroshi Yamauchi    if (GetDexFieldIndex() == 0) {
6454d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier      return &declaring_class->GetSFieldsPtr()->At(0);
652debd8032a9e44910bb7e39ca5d142a4fc237c05Hiroshi Yamauchi    } else {
662debd8032a9e44910bb7e39ca5d142a4fc237c05Hiroshi Yamauchi      DCHECK_EQ(GetDexFieldIndex(), 1U);
6754d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier      return &declaring_class->GetSFieldsPtr()->At(1);
682debd8032a9e44910bb7e39ca5d142a4fc237c05Hiroshi Yamauchi    }
692debd8032a9e44910bb7e39ca5d142a4fc237c05Hiroshi Yamauchi  }
702debd8032a9e44910bb7e39ca5d142a4fc237c05Hiroshi Yamauchi  mirror::DexCache* const dex_cache = declaring_class->GetDexCache();
71c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartier  ArtField* const art_field = dex_cache->GetResolvedField(GetDexFieldIndex(), sizeof(void*));
72daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier  CHECK(art_field != nullptr);
73679b1cf291f364dcc3a142f53a07b0ad15c01e9aHiroshi Yamauchi  CHECK_EQ(declaring_class, art_field->GetDeclaringClass());
74daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier  return art_field;
75daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier}
76daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier
77daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier}  // namespace mirror
78daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier}  // namespace art
79