Home | History | Annotate | Download | only in mirror
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ART_RUNTIME_MIRROR_ABSTRACT_METHOD_H_
     18 #define ART_RUNTIME_MIRROR_ABSTRACT_METHOD_H_
     19 
     20 #include "accessible_object.h"
     21 #include "gc_root.h"
     22 #include "object.h"
     23 #include "object_callbacks.h"
     24 #include "read_barrier_option.h"
     25 
     26 namespace art {
     27 
     28 struct AbstractMethodOffsets;
     29 class ArtMethod;
     30 
     31 namespace mirror {
     32 
     33 // C++ mirror of java.lang.reflect.AbstractMethod.
     34 class MANAGED AbstractMethod : public AccessibleObject {
     35  public:
     36   // Called from Constructor::CreateFromArtMethod, Method::CreateFromArtMethod.
     37   bool CreateFromArtMethod(ArtMethod* method) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
     38 
     39   ArtMethod* GetArtMethod() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
     40   // Only used by the image writer.
     41   void SetArtMethod(ArtMethod* method) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
     42   mirror::Class* GetDeclaringClass() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
     43 
     44  private:
     45   static MemberOffset ArtMethodOffset() {
     46     return MemberOffset(OFFSETOF_MEMBER(AbstractMethod, art_method_));
     47   }
     48   static MemberOffset DeclaringClassOffset() {
     49     return MemberOffset(OFFSETOF_MEMBER(AbstractMethod, declaring_class_));
     50   }
     51   static MemberOffset DeclaringClassOfOverriddenMethodOffset() {
     52     return MemberOffset(OFFSETOF_MEMBER(AbstractMethod, declaring_class_of_overridden_method_));
     53   }
     54   static MemberOffset AccessFlagsOffset() {
     55     return MemberOffset(OFFSETOF_MEMBER(AbstractMethod, access_flags_));
     56   }
     57   static MemberOffset DexMethodIndexOffset() {
     58     return MemberOffset(OFFSETOF_MEMBER(AbstractMethod, dex_method_index_));
     59   }
     60 
     61   HeapReference<mirror::Class> declaring_class_;
     62   HeapReference<mirror::Class> declaring_class_of_overridden_method_;
     63   uint32_t padding_;
     64   uint64_t art_method_;
     65   uint32_t access_flags_;
     66   uint32_t dex_method_index_;
     67 
     68   friend struct art::AbstractMethodOffsets;  // for verifying offset information
     69   DISALLOW_IMPLICIT_CONSTRUCTORS(AbstractMethod);
     70 };
     71 
     72 }  // namespace mirror
     73 }  // namespace art
     74 
     75 #endif  // ART_RUNTIME_MIRROR_ABSTRACT_METHOD_H_
     76