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