summaryrefslogtreecommitdiff
path: root/libdexfile/dex/class_accessor-inl.h
blob: bcd0a7b66c87096df8ec62212f75e7e9a4acfa30 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ART_LIBDEXFILE_DEX_CLASS_ACCESSOR_INL_H_
#define ART_LIBDEXFILE_DEX_CLASS_ACCESSOR_INL_H_

#include "class_accessor.h"

#include "base/leb128.h"

namespace art {

inline ClassAccessor::ClassAccessor(const DexFile& dex_file, const DexFile::ClassDef& class_def)
    : ClassAccessor(dex_file, dex_file.GetClassData(class_def)) {}

inline ClassAccessor::ClassAccessor(const DexFile& dex_file, const uint8_t* class_data)
    : dex_file_(dex_file),
      ptr_pos_(class_data),
      num_static_fields_(class_data != nullptr ? DecodeUnsignedLeb128(&ptr_pos_) : 0u),
      num_instance_fields_(class_data != nullptr ? DecodeUnsignedLeb128(&ptr_pos_) : 0u),
      num_direct_methods_(class_data != nullptr ? DecodeUnsignedLeb128(&ptr_pos_) : 0u),
      num_virtual_methods_(class_data != nullptr ? DecodeUnsignedLeb128(&ptr_pos_) : 0u) {}

inline const uint8_t* ClassAccessor::Method::Read(const uint8_t* ptr) {
  method_idx_ += DecodeUnsignedLeb128(&ptr);
  access_flags_ = DecodeUnsignedLeb128(&ptr);
  code_off_ = DecodeUnsignedLeb128(&ptr);
  return ptr;
}

inline const uint8_t* ClassAccessor::Field::Read(const uint8_t* ptr) {
  field_idx_ += DecodeUnsignedLeb128(&ptr);
  access_flags_ = DecodeUnsignedLeb128(&ptr);
  return ptr;
}

template <typename StaticFieldVisitor,
          typename InstanceFieldVisitor,
          typename DirectMethodVisitor,
          typename VirtualMethodVisitor>
inline void ClassAccessor::VisitMethodsAndFields(
    const StaticFieldVisitor& static_field_visitor,
    const InstanceFieldVisitor& instance_field_visitor,
    const DirectMethodVisitor& direct_method_visitor,
    const VirtualMethodVisitor& virtual_method_visitor) const {
  const uint8_t* ptr = ptr_pos_;
  for (size_t i = 0; i < num_static_fields_; ++i) {
    Field data;
    ptr = data.Read(ptr);
    static_field_visitor(data);
  }
  for (size_t i = 0; i < num_instance_fields_; ++i) {
    Field data;
    ptr = data.Read(ptr);
    instance_field_visitor(data);
  }
  for (size_t i = 0; i < num_direct_methods_; ++i) {
    Method data;
    ptr = data.Read(ptr);
    direct_method_visitor(data);
  }
  for (size_t i = 0; i < num_virtual_methods_; ++i) {
    Method data;
    ptr = data.Read(ptr);
    virtual_method_visitor(data);
  }
}

template <typename DirectMethodVisitor,
          typename VirtualMethodVisitor>
inline void ClassAccessor::VisitMethods(const DirectMethodVisitor& direct_method_visitor,
                                        const VirtualMethodVisitor& virtual_method_visitor) const {
  VisitMethodsAndFields(VoidFunctor(),
                        VoidFunctor(),
                        direct_method_visitor,
                        virtual_method_visitor);
}

// Visit direct and virtual methods.
template <typename MethodVisitor>
inline void ClassAccessor::VisitMethods(const MethodVisitor& method_visitor) const {
  VisitMethods(method_visitor, method_visitor);
}

inline const DexFile::CodeItem* ClassAccessor::GetCodeItem(const Method& method) const {
  return dex_file_.GetCodeItem(method.GetCodeItemOffset());
}

}  // namespace art

#endif  // ART_LIBDEXFILE_DEX_CLASS_ACCESSOR_INL_H_