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