12dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers/* 22dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Copyright (C) 2011 The Android Open Source Project 32dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * 42dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 52dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * you may not use this file except in compliance with the License. 62dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * You may obtain a copy of the License at 72dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * 82dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 92dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * 102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Unless required by applicable law or agreed to in writing, software 112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * See the License for the specific language governing permissions and 142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * limitations under the License. 152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers */ 162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_MIRROR_CLASS_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_MIRROR_CLASS_H_ 192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "modifiers.h" 212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "object.h" 222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "primitive.h" 232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers/* 252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * A magic value for refOffsets. Ignore the bits and walk the super 262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * chain when this is the value. 272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * [This is an unlikely "natural" value, since it would be 30 non-ref instance 282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * fields followed by 2 ref instance fields.] 292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers */ 30fb6996fe2b1bb28526751650441d7ac29dcdb4e6Brian Carlstrom#define CLASS_WALK_SUPER 3U 31fb6996fe2b1bb28526751650441d7ac29dcdb4e6Brian Carlstrom#define CLASS_BITS_PER_WORD (sizeof(uint32_t) * 8) 322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#define CLASS_OFFSET_ALIGNMENT 4 33fb6996fe2b1bb28526751650441d7ac29dcdb4e6Brian Carlstrom#define CLASS_HIGH_BIT (1U << (CLASS_BITS_PER_WORD - 1)) 342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers/* 352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Given an offset, return the bit number which would encode that offset. 362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Local use only. 372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers */ 382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#define _CLASS_BIT_NUMBER_FROM_OFFSET(byteOffset) \ 392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers ((unsigned int)(byteOffset) / \ 402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CLASS_OFFSET_ALIGNMENT) 412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers/* 422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Is the given offset too large to be encoded? 432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers */ 442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#define CLASS_CAN_ENCODE_OFFSET(byteOffset) \ 452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers (_CLASS_BIT_NUMBER_FROM_OFFSET(byteOffset) < CLASS_BITS_PER_WORD) 462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers/* 472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Return a single bit, encoding the offset. 482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Undefined if the offset is too large, as defined above. 492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers */ 502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#define CLASS_BIT_FROM_OFFSET(byteOffset) \ 512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers (CLASS_HIGH_BIT >> _CLASS_BIT_NUMBER_FROM_OFFSET(byteOffset)) 522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers/* 532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Return an offset, given a bit number as returned from CLZ. 542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers */ 552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#define CLASS_OFFSET_FROM_CLZ(rshift) \ 562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers MemberOffset((static_cast<int>(rshift) * CLASS_OFFSET_ALIGNMENT)) 572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace art { 592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersstruct ClassClassOffsets; 612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersstruct ClassOffsets; 622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass StringPiece; 632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 66ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromclass ArtField; 672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass ClassLoader; 682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass DexCache; 692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass IfTable; 702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers// Type for the InitializedStaticStorage table. Currently the Class 722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers// provides the static storage. However, this might change to an Array 732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers// to improve image sharing, so we use this type to avoid assumptions 742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers// on the current storage. 752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass MANAGED StaticStorageBase : public Object { 762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}; 772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers// C++ mirror of java.lang.Class 792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass MANAGED Class : public StaticStorageBase { 802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers public: 812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Class Status 822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // 832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // kStatusNotReady: If a Class cannot be found in the class table by 842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // FindClass, it allocates an new one with AllocClass in the 852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // kStatusNotReady and calls LoadClass. Note if it does find a 862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // class, it may not be kStatusResolved and it will try to push it 872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // forward toward kStatusResolved. 882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // 892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // kStatusIdx: LoadClass populates with Class with information from 902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // the DexFile, moving the status to kStatusIdx, indicating that the 912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Class value in super_class_ has not been populated. The new Class 922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // can then be inserted into the classes table. 932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // 942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // kStatusLoaded: After taking a lock on Class, the ClassLinker will 952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // attempt to move a kStatusIdx class forward to kStatusLoaded by 962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // using ResolveClass to initialize the super_class_ and ensuring the 972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // interfaces are resolved. 982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // 992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // kStatusResolved: Still holding the lock on Class, the ClassLinker 1002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // shows linking is complete and fields of the Class populated by making 1012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // it kStatusResolved. Java allows circularities of the form where a super 1022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // class has a field that is of the type of the sub class. We need to be able 1032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // to fully resolve super classes while resolving types for fields. 1042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // 1052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // kStatusRetryVerificationAtRuntime: The verifier sets a class to 1062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // this state if it encounters a soft failure at compile time. This 1072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // often happens when there are unresolved classes in other dex 1082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // files, and this status marks a class as needing to be verified 1092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // again at runtime. 1102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // 1112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // TODO: Explain the other states 1122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers enum Status { 1132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kStatusError = -1, 1142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kStatusNotReady = 0, 1152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kStatusIdx = 1, // Loaded, DEX idx in super_class_type_idx_ and interfaces_type_idx_. 1162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kStatusLoaded = 2, // DEX idx values resolved. 1172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kStatusResolved = 3, // Part of linking. 1182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kStatusVerifying = 4, // In the process of being verified. 1192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kStatusRetryVerificationAtRuntime = 5, // Compile time verification failed, retry at runtime. 1202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kStatusVerifyingAtRuntime = 6, // Retrying verification at runtime. 1212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kStatusVerified = 7, // Logically part of linking; done pre-init. 1222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kStatusInitializing = 8, // Class init in progress. 1232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kStatusInitialized = 9, // Ready to go. 1242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers }; 1252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Status GetStatus() const { 1272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK_EQ(sizeof(Status), sizeof(uint32_t)); 1287dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers return static_cast<Status>(GetField32(OFFSET_OF_OBJECT_MEMBER(Class, status_), true)); 1292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1317dfb28c066159e6cde8181720f0c451a700ef966Ian Rogers void SetStatus(Status new_status, Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 1322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class has failed to link. 1342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsErroneous() const { 1352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetStatus() == kStatusError; 1362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class has been loaded. 1392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsIdxLoaded() const { 1402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetStatus() >= kStatusIdx; 1412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class has been loaded. 1442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsLoaded() const { 1452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetStatus() >= kStatusLoaded; 1462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class has been linked. 1492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsResolved() const { 1502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetStatus() >= kStatusResolved; 1512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class was compile-time verified. 1542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsCompileTimeVerified() const { 1552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetStatus() >= kStatusRetryVerificationAtRuntime; 1562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class has been verified. 1592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsVerified() const { 1602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetStatus() >= kStatusVerified; 1612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class is initializing. 1642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsInitializing() const { 1652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetStatus() >= kStatusInitializing; 1662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class is initialized. 1692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsInitialized() const { 1702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetStatus() == kStatusInitialized; 1712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t GetAccessFlags() const; 1742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetAccessFlags(uint32_t new_access_flags) { 1762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetField32(OFFSET_OF_OBJECT_MEMBER(Class, access_flags_), new_access_flags, false); 1772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class is an interface. 1802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsInterface() const { 1812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (GetAccessFlags() & kAccInterface) != 0; 1822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class is declared public. 1852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPublic() const { 1862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (GetAccessFlags() & kAccPublic) != 0; 1872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class is declared final. 1902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsFinal() const { 1912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (GetAccessFlags() & kAccFinal) != 0; 1922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsFinalizable() const { 1952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (GetAccessFlags() & kAccClassIsFinalizable) != 0; 1962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 1972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 1982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetFinalizable() { 1992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t flags = GetField32(OFFSET_OF_OBJECT_MEMBER(Class, access_flags_), false); 2002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetAccessFlags(flags | kAccClassIsFinalizable); 2012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class is abstract. 2042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsAbstract() const { 2052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (GetAccessFlags() & kAccAbstract) != 0; 2062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class is an annotation. 2092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsAnnotation() const { 2102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (GetAccessFlags() & kAccAnnotation) != 0; 2112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class is synthetic. 2142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsSynthetic() const { 2152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (GetAccessFlags() & kAccSynthetic) != 0; 2162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsReferenceClass() const { 2192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (GetAccessFlags() & kAccClassIsReference) != 0; 2202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsWeakReferenceClass() const { 2232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (GetAccessFlags() & kAccClassIsWeakReference) != 0; 2242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsSoftReferenceClass() const { 2272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (GetAccessFlags() & kAccReferenceFlagsMask) == kAccClassIsReference; 2282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsFinalizerReferenceClass() const { 2312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (GetAccessFlags() & kAccClassIsFinalizerReference) != 0; 2322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPhantomReferenceClass() const { 2352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (GetAccessFlags() & kAccClassIsPhantomReference) != 0; 2362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 23804f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers // Can references of this type be assigned to by things of another type? For non-array types 23904f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers // this is a matter of whether sub-classes may exist - which they can't if the type is final. 24004f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers // For array classes, where all the classes are final due to there being no sub-classes, an 24104f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers // Object[] may be assigned to by a String[] but a String[] may not be assigned to by other 24204f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers // types as the component is final. 24304f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers bool CannotBeAssignedFromOtherTypes() const { 24404f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers if (!IsArrayClass()) { 24504f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers return IsFinal(); 24604f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers } else { 24704f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers Class* component = GetComponentType(); 24804f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers if (component->IsPrimitive()) { 24904f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers return false; 25004f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers } else { 25104f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers return component->CannotBeAssignedFromOtherTypes(); 25204f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers } 25304f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers } 25404f94f4f02093fa0fc58007fd5f4ef4c58f8270aIan Rogers } 2552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers String* GetName() const; // Returns the cached name. 2572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetName(String* name) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // Sets the cached name. 2582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Computes the name, then sets the cached value. 2592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers String* ComputeName() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsProxyClass() const { 2622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Read access flags without using getter as whether something is a proxy can be check in 2632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // any loaded state 2642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // TODO: switch to a check if the super class is java.lang.reflect.Proxy? 2652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t access_flags = GetField32(OFFSET_OF_OBJECT_MEMBER(Class, access_flags_), false); 2662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return (access_flags & kAccClassIsProxy) != 0; 2672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Primitive::Type GetPrimitiveType() const { 2702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK_EQ(sizeof(Primitive::Type), sizeof(int32_t)); 2712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return static_cast<Primitive::Type>( 2722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers GetField32(OFFSET_OF_OBJECT_MEMBER(Class, primitive_type_), false)); 2732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetPrimitiveType(Primitive::Type new_type) { 2762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK_EQ(sizeof(Primitive::Type), sizeof(int32_t)); 2772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetField32(OFFSET_OF_OBJECT_MEMBER(Class, primitive_type_), new_type, false); 2782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if the class is a primitive type. 2812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPrimitive() const { 2822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetPrimitiveType() != Primitive::kPrimNot; 2832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPrimitiveBoolean() const { 2862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetPrimitiveType() == Primitive::kPrimBoolean; 2872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPrimitiveByte() const { 2902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetPrimitiveType() == Primitive::kPrimByte; 2912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPrimitiveChar() const { 2942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetPrimitiveType() == Primitive::kPrimChar; 2952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 2962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 2972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPrimitiveShort() const { 2982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetPrimitiveType() == Primitive::kPrimShort; 2992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPrimitiveInt() const { 3022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetPrimitiveType() == Primitive::kPrimInt; 3032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPrimitiveLong() const { 3062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetPrimitiveType() == Primitive::kPrimLong; 3072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPrimitiveFloat() const { 3102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetPrimitiveType() == Primitive::kPrimFloat; 3112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPrimitiveDouble() const { 3142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetPrimitiveType() == Primitive::kPrimDouble; 3152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPrimitiveVoid() const { 3182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetPrimitiveType() == Primitive::kPrimVoid; 3192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsPrimitiveArray() const { 3222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return IsArrayClass() && GetComponentType()->IsPrimitive(); 3232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Depth of class from java.lang.Object 3262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t Depth() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t depth = 0; 3282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers for (Class* klass = this; klass->GetSuperClass() != NULL; klass = klass->GetSuperClass()) { 3292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers depth++; 3302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return depth; 3322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsArrayClass() const { 3352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetComponentType() != NULL; 3362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsClassClass() const; 3392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsStringClass() const; 3412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsThrowableClass() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 344ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom bool IsArtFieldClass() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 346ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom bool IsArtMethodClass() const; 3472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* GetComponentType() const { 3492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetFieldObject<Class*>(OFFSET_OF_OBJECT_MEMBER(Class, component_type_), false); 3502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetComponentType(Class* new_component_type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(GetComponentType() == NULL); 3542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(new_component_type != NULL); 3552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetFieldObject(OFFSET_OF_OBJECT_MEMBER(Class, component_type_), new_component_type, false); 3562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t GetComponentSize() const { 3592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return Primitive::ComponentSize(GetComponentType()->GetPrimitiveType()); 3602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsObjectClass() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return !IsPrimitive() && GetSuperClass() == NULL; 3642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsInstantiable() const { 36602c42237741b5573f9d790a5a0f17f408dceb543Sameer Abu Asal return (!IsPrimitive() && !IsInterface() && !IsAbstract()) || ((IsAbstract()) && IsArrayClass()); 3672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsObjectArrayClass() const { 3702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetComponentType() != NULL && !GetComponentType()->IsPrimitive(); 3712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Creates a raw object instance but does not invoke the default constructor. 3742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Object* AllocObject(Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsVariableSize() const { 3772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Classes and arrays vary in size, and so the object_size_ field cannot 3782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // be used to get their instance size 3792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return IsClassClass() || IsArrayClass(); 3802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t SizeOf() const { 3832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK_EQ(sizeof(size_t), sizeof(int32_t)); 3842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, class_size_), false); 3852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t GetClassSize() const { 3882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK_EQ(sizeof(size_t), sizeof(uint32_t)); 3892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, class_size_), false); 3902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 3912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetClassSize(size_t new_class_size) 3932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t GetObjectSize() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 3972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetObjectSize(size_t new_object_size) { 3982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(!IsVariableSize()); 3992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK_EQ(sizeof(size_t), sizeof(int32_t)); 4002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return SetField32(OFFSET_OF_OBJECT_MEMBER(Class, object_size_), new_object_size, false); 4012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if this class is in the same packages as that class. 4042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsInSamePackage(const Class* that) const 4052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static bool IsInSamePackage(const StringPiece& descriptor1, const StringPiece& descriptor2); 4082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns true if this class can access that class. 4102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool CanAccess(Class* that) const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 4112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return that->IsPublic() || this->IsInSamePackage(that); 4122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Can this class access a member in the provided class with the provided member access flags? 4152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Note that access to the class isn't checked in case the declaring class is protected and the 4162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // method has been exposed by a public sub-class 4172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool CanAccessMember(Class* access_to, uint32_t member_flags) const 4182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 4192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Classes can access all of their own members 4202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (this == access_to) { 4212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return true; 4222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Public members are trivially accessible 4242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (member_flags & kAccPublic) { 4252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return true; 4262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Private members are trivially not accessible 4282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (member_flags & kAccPrivate) { 4292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return false; 4302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Check for protected access from a sub-class, which may or may not be in the same package. 4322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (member_flags & kAccProtected) { 4332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (this->IsSubClass(access_to)) { 4342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return true; 4352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Allow protected access from other classes in the same package. 4382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return this->IsInSamePackage(access_to); 4392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsSubClass(const Class* klass) const 4422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Can src be assigned to this class? For example, String can be assigned to Object (by an 4452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // upcast), however, an Object cannot be assigned to a String as a potentially exception throwing 4462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // downcast would be necessary. Similarly for interfaces, a class that implements (or an interface 4472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // that extends) another can be assigned to its parent, but not vice-versa. All Classes may assign 4482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // to themselves. Classes for primitive types may not assign to each other. 449fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers inline bool IsAssignableFrom(const Class* src) const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 4502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(src != NULL); 4512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers if (this == src) { 4522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Can always assign to things of the same type. 4532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return true; 4542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else if (IsObjectClass()) { 4552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Can assign any reference to java.lang.Object. 4562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return !src->IsPrimitive(); 4572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else if (IsInterface()) { 4582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return src->Implements(this); 4592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else if (src->IsArrayClass()) { 4602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return IsAssignableFromArray(src); 4612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } else { 4622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return !src->IsInterface() && src->IsSubClass(this); 4632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* GetSuperClass() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetSuperClass(Class *new_super_class) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 4692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // super class is assigned once, except during class linker initialization 4702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* old_super_class = GetFieldObject<Class*>( 4712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers OFFSET_OF_OBJECT_MEMBER(Class, super_class_), false); 4722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(old_super_class == NULL || old_super_class == new_super_class); 4732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(new_super_class != NULL); 4742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetFieldObject(OFFSET_OF_OBJECT_MEMBER(Class, super_class_), new_super_class, false); 4752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool HasSuperClass() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 4782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetSuperClass() != NULL; 4792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static MemberOffset SuperClassOffset() { 4822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return MemberOffset(OFFSETOF_MEMBER(Class, super_class_)); 4832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers ClassLoader* GetClassLoader() const; 4862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetClassLoader(ClassLoader* new_cl) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 4882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static MemberOffset DexCacheOffset() { 4902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return MemberOffset(OFFSETOF_MEMBER(Class, dex_cache_)); 4912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 4922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers enum { 4942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kDumpClassFullDetail = 1, 4952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kDumpClassClassLoader = (1 << 1), 4962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers kDumpClassInitialized = (1 << 2), 4972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers }; 4982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 4992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void DumpClass(std::ostream& os, int flags) const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 5012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DexCache* GetDexCache() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 5032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetDexCache(DexCache* new_dex_cache) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 505ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ObjectArray<ArtMethod>* GetDirectMethods() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 507ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void SetDirectMethods(ObjectArray<ArtMethod>* new_direct_methods) 5082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 510ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* GetDirectMethod(int32_t i) const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 512ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void SetDirectMethod(uint32_t i, ArtMethod* f) // TODO: uint16_t 5132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 5152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns the number of static, private, and constructor methods. 5162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t NumDirectMethods() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 518ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ObjectArray<ArtMethod>* GetVirtualMethods() const 5192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 521ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void SetVirtualMethods(ObjectArray<ArtMethod>* new_virtual_methods) 5222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 5242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns the number of non-inherited virtual methods. 5252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t NumVirtualMethods() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 527ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* GetVirtualMethod(uint32_t i) const 5282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 530ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* GetVirtualMethodDuringLinking(uint32_t i) const 5312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 533ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void SetVirtualMethod(uint32_t i, ArtMethod* f) // TODO: uint16_t 5342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 536ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ObjectArray<ArtMethod>* GetVTable() const; 5372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 538ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ObjectArray<ArtMethod>* GetVTableDuringLinking() const; 5392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 540ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void SetVTable(ObjectArray<ArtMethod>* new_vtable) 5412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 5432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static MemberOffset VTableOffset() { 5442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return OFFSET_OF_OBJECT_MEMBER(Class, vtable_); 5452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 5462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 5472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Given a method implemented by this class but potentially from a super class, return the 5482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // specific implementation method for this class. 549ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindVirtualMethodForVirtual(ArtMethod* method) const 5502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 5522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Given a method implemented by this class' super class, return the specific implementation 5532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // method for this class. 554ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindVirtualMethodForSuper(ArtMethod* method) const 5552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 5572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Given a method implemented by this class, but potentially from a 5582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // super class or interface, return the specific implementation 5592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // method for this class. 560ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindVirtualMethodForInterface(ArtMethod* method) const 5611ffa32f0be7becec4907b26ead353e4b17e1219cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) ALWAYS_INLINE; 5622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 563ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindInterfaceMethod(const StringPiece& name, const StringPiece& descriptor) const 5642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 566ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindInterfaceMethod(const DexCache* dex_cache, uint32_t dex_method_idx) const 5672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 569ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindVirtualMethodForVirtualOrInterface(ArtMethod* method) const 5702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 572ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindDeclaredVirtualMethod(const StringPiece& name, const StringPiece& signature) const 5732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 575ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindDeclaredVirtualMethod(const DexCache* dex_cache, uint32_t dex_method_idx) const 5762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 578ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindVirtualMethod(const StringPiece& name, const StringPiece& descriptor) const 5792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 581ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindVirtualMethod(const DexCache* dex_cache, uint32_t dex_method_idx) const 5822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 584ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindDeclaredDirectMethod(const StringPiece& name, const StringPiece& signature) const 5852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 587ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindDeclaredDirectMethod(const DexCache* dex_cache, uint32_t dex_method_idx) const 5882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 590ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindDirectMethod(const StringPiece& name, const StringPiece& signature) const 5912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 593ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtMethod* FindDirectMethod(const DexCache* dex_cache, uint32_t dex_method_idx) const 5942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 5962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers int32_t GetIfTableCount() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 5972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 5982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers IfTable* GetIfTable() const; 5992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetIfTable(IfTable* new_iftable) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Get instance fields of the class (See also GetSFields). 603ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ObjectArray<ArtField>* GetIFields() const; 6042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 605ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void SetIFields(ObjectArray<ArtField>* new_ifields) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t NumInstanceFields() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 609ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* GetInstanceField(uint32_t i) const // TODO: uint16_t 6102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 612ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void SetInstanceField(uint32_t i, ArtField* f) // TODO: uint16_t 6132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns the number of instance fields containing reference types. 6162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t NumReferenceInstanceFields() const { 6172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsResolved() || IsErroneous()); 6182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK_EQ(sizeof(size_t), sizeof(int32_t)); 6192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, num_reference_instance_fields_), false); 6202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t NumReferenceInstanceFieldsDuringLinking() const { 6232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsLoaded() || IsErroneous()); 6242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK_EQ(sizeof(size_t), sizeof(int32_t)); 6252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, num_reference_instance_fields_), false); 6262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetNumReferenceInstanceFields(size_t new_num) { 6292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK_EQ(sizeof(size_t), sizeof(int32_t)); 6302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetField32(OFFSET_OF_OBJECT_MEMBER(Class, num_reference_instance_fields_), new_num, false); 6312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t GetReferenceInstanceOffsets() const { 6342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsResolved() || IsErroneous()); 6352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, reference_instance_offsets_), false); 6362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetReferenceInstanceOffsets(uint32_t new_reference_offsets) 6392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Beginning of static field data 6422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static MemberOffset FieldsOffset() { 6432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return OFFSET_OF_OBJECT_MEMBER(Class, fields_); 6442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Returns the number of static fields containing reference types. 6472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t NumReferenceStaticFields() const { 6482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsResolved() || IsErroneous()); 6492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK_EQ(sizeof(size_t), sizeof(int32_t)); 6502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, num_reference_static_fields_), false); 6512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t NumReferenceStaticFieldsDuringLinking() const { 6542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsLoaded() || IsErroneous()); 6552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK_EQ(sizeof(size_t), sizeof(int32_t)); 6562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, num_reference_static_fields_), false); 6572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetNumReferenceStaticFields(size_t new_num) { 6602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK_EQ(sizeof(size_t), sizeof(int32_t)); 6612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetField32(OFFSET_OF_OBJECT_MEMBER(Class, num_reference_static_fields_), new_num, false); 6622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Gets the static fields of the class. 665ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ObjectArray<ArtField>* GetSFields() const; 6662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 667ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void SetSFields(ObjectArray<ArtField>* new_sfields) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t NumStaticFields() const; 6702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 671ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* GetStaticField(uint32_t i) const; // TODO: uint16_t 6722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 673ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom void SetStaticField(uint32_t i, ArtField* f); // TODO: uint16_t 6742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t GetReferenceStaticOffsets() const { 6762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, reference_static_offsets_), false); 6772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 6782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetReferenceStaticOffsets(uint32_t new_reference_offsets); 6802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Find a static or instance field using the JLS resolution order 682ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* FindField(const StringPiece& name, const StringPiece& type) 6832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Finds the given instance field in this class or a superclass. 686ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* FindInstanceField(const StringPiece& name, const StringPiece& type) 6872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Finds the given instance field in this class or a superclass, only searches classes that 6902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // have the same dex cache. 691ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* FindInstanceField(const DexCache* dex_cache, uint32_t dex_field_idx) 6922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 694ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* FindDeclaredInstanceField(const StringPiece& name, const StringPiece& type) 6952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 697ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* FindDeclaredInstanceField(const DexCache* dex_cache, uint32_t dex_field_idx) 6982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 6992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Finds the given static field in this class or a superclass. 701ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* FindStaticField(const StringPiece& name, const StringPiece& type) 7022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 7032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Finds the given static field in this class or superclass, only searches classes that 7052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // have the same dex cache. 706ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* FindStaticField(const DexCache* dex_cache, uint32_t dex_field_idx) 7072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 7082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 709ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* FindDeclaredStaticField(const StringPiece& name, const StringPiece& type) 7102dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 7112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 712ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ArtField* FindDeclaredStaticField(const DexCache* dex_cache, uint32_t dex_field_idx) 7132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 7142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers pid_t GetClinitThreadId() const { 7162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(IsIdxLoaded() || IsErroneous()); 7172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, clinit_thread_id_), false); 7182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 7192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetClinitThreadId(pid_t new_clinit_thread_id) { 7212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetField32(OFFSET_OF_OBJECT_MEMBER(Class, clinit_thread_id_), new_clinit_thread_id, false); 7222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 7232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* GetVerifyErrorClass() const { 7252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // DCHECK(IsErroneous()); 7262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetFieldObject<Class*>(OFFSET_OF_OBJECT_MEMBER(Class, verify_error_class_), false); 7272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 7282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 729ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers uint16_t GetDexClassDefIndex() const { 730ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, dex_class_def_idx_), false); 731ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers } 732ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers 733ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers void SetDexClassDefIndex(uint16_t class_def_idx) { 734ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers SetField32(OFFSET_OF_OBJECT_MEMBER(Class, dex_class_def_idx_), class_def_idx, false); 735ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers } 736ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers 7372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint16_t GetDexTypeIndex() const { 7382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetField32(OFFSET_OF_OBJECT_MEMBER(Class, dex_type_idx_), false); 7392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 7402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7412dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetDexTypeIndex(uint16_t type_idx) { 7422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SetField32(OFFSET_OF_OBJECT_MEMBER(Class, dex_type_idx_), type_idx, false); 7432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 7442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static Class* GetJavaLangClass() { 7462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DCHECK(java_lang_Class_ != NULL); 7472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return java_lang_Class_; 7482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers } 7492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Can't call this SetClass or else gets called instead of Object::SetClass in places. 7512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static void SetClassClass(Class* java_lang_Class); 7522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static void ResetClass(); 7532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 754233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz // When class is verified, set the kAccPreverified flag on each method. 755233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz void SetPreverifiedFlagOnAllMethods() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 756233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz 7572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers private: 7582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers void SetVerifyErrorClass(Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 7592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool Implements(const Class* klass) const 7612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 7622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsArrayAssignableFromArray(const Class* klass) const 7632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 7642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers bool IsAssignableFromArray(const Class* klass) const 7652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 7662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // defining class loader, or NULL for the "bootstrap" system loader 7682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers ClassLoader* class_loader_; 7692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // For array classes, the component class object for instanceof/checkcast 7712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // (for String[][][], this will be String[][]). NULL for non-array classes. 7722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* component_type_; 7732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // DexCache of resolved constant pool entries (will be NULL for classes generated by the 7752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // runtime such as arrays and primitive classes). 7762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DexCache* dex_cache_; 7772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // static, private, and <init> methods 779ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ObjectArray<ArtMethod>* direct_methods_; 7802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // instance fields 7822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // 7832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // These describe the layout of the contents of an Object. 7842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Note that only the fields directly declared by this class are 7852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // listed in ifields; fields declared by a superclass are listed in 7862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // the superclass's Class.ifields. 7872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // 7882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // All instance fields that refer to objects are guaranteed to be at 7892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // the beginning of the field list. num_reference_instance_fields_ 7902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // specifies the number of reference fields. 791ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ObjectArray<ArtField>* ifields_; 7922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 7932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // The interface table (iftable_) contains pairs of a interface class and an array of the 7942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // interface methods. There is one pair per interface supported by this class. That means one 7952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // pair for each interface we support directly, indirectly via superclass, or indirectly via a 7962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // superinterface. This will be null if neither we nor our superclass implement any interfaces. 7972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // 7982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Why we need this: given "class Foo implements Face", declare "Face faceObj = new Foo()". 7992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Invoke faceObj.blah(), where "blah" is part of the Face interface. We can't easily use a 8002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // single vtable. 8012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // 8022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // For every interface a concrete class implements, we create an array of the concrete vtable_ 8032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // methods for the methods in the interface. 8042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers IfTable* iftable_; 8052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // descriptor for the class such as "java.lang.Class" or "[C". Lazily initialized by ComputeName 8072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers String* name_; 8082dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Static fields 810ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ObjectArray<ArtField>* sfields_; 8112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // The superclass, or NULL if this is java.lang.Object, an interface or primitive type. 8132dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* super_class_; 8142dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8152dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // If class verify fails, we must return same error on subsequent tries. 8162dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Class* verify_error_class_; 8172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 818ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers // Virtual methods defined in this class; invoked through vtable. 819ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ObjectArray<ArtMethod>* virtual_methods_; 8202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Virtual method table (vtable), for use by "invoke-virtual". The vtable from the superclass is 8222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // copied in, and virtual methods from our class either replace those from the super or are 8232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // appended. For abstract classes, methods may be created in the vtable that aren't in 8242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // virtual_ methods_ for miranda methods. 825ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom ObjectArray<ArtMethod>* vtable_; 8262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 827ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers // Access flags; low 16 bits are defined by VM spec. 8282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t access_flags_; 8292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Total size of the Class instance; used when allocating storage on gc heap. 8312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // See also object_size_. 8322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t class_size_; 8332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 834ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers // Tid used to check for recursive <clinit> invocation. 8352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers pid_t clinit_thread_id_; 8362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 837ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers // ClassDef index in dex file, -1 if no class definition such as an array. 838ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers // TODO: really 16bits 839ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers int32_t dex_class_def_idx_; 840ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers 841ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers // Type index in dex file. 8422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // TODO: really 16bits 843ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers int32_t dex_type_idx_; 8442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 845ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers // Number of instance fields that are object refs. 8462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t num_reference_instance_fields_; 8472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 848ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers // Number of static fields that are object refs, 8492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t num_reference_static_fields_; 8502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Total object size; used when allocating storage on gc heap. 8522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // (For interfaces and abstract classes this will be zero.) 8532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // See also class_size_. 8542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers size_t object_size_; 8552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 856ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers // Primitive type value, or Primitive::kPrimNot (0); set for generated primitive classes. 8572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Primitive::Type primitive_type_; 8582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Bitmap of offsets of ifields. 8602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t reference_instance_offsets_; 8612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Bitmap of offsets of sfields. 8632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t reference_static_offsets_; 8642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 865ee39a10e45a6a0880e8b829525c40d6055818560Ian Rogers // State of class initialization. 8662dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Status status_; 8672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8682dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // TODO: ? 8692dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // initiating class loader list 8702dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // NOTE: for classes with low serialNumber, these are unused, and the 8712dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // values are kept in a table in gDvm. 8722dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // InitiatingLoaderList initiating_loader_list_; 8732dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8742dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // Location of first static field. 8752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t fields_[0]; 8762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers // java.lang.Class 8782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers static Class* java_lang_Class_; 8792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers friend struct art::ClassOffsets; // for verifying offset information 8812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DISALLOW_IMPLICIT_CONSTRUCTORS(Class); 8822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}; 8832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8842dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersstd::ostream& operator<<(std::ostream& os, const Class::Status& rhs); 8852dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8862dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass MANAGED ClassClass : public Class { 8872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers private: 8882dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers int64_t serialVersionUID_; 8892dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers friend struct art::ClassClassOffsets; // for verifying offset information 8902dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers DISALLOW_IMPLICIT_CONSTRUCTORS(ClassClass); 8912dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}; 8922dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 8932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 8942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace art 8952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 896fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_MIRROR_CLASS_H_ 897