• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 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_DEX_INSTRUCTION_VISITOR_H_
18 #define ART_RUNTIME_DEX_INSTRUCTION_VISITOR_H_
19 
20 #include "base/macros.h"
21 #include "dex_instruction.h"
22 
23 namespace art {
24 
25 template<typename T>
26 class DexInstructionVisitor {
27  public:
Visit(const uint16_t * code,size_t size_in_bytes)28   void Visit(const uint16_t* code, size_t size_in_bytes) {
29     T* derived = static_cast<T*>(this);
30     size_t size_in_code_units = size_in_bytes / sizeof(uint16_t);
31     size_t i = 0;
32     while (i < size_in_code_units) {
33       const Instruction* inst = Instruction::At(&code[i]);
34       switch (inst->Opcode()) {
35 #define INSTRUCTION_CASE(o, cname, p, f, r, i, a, v)  \
36         case Instruction::cname: {                    \
37           derived->Do_ ## cname(inst);                \
38           break;                                      \
39         }
40 #include "dex_instruction_list.h"
41         DEX_INSTRUCTION_LIST(INSTRUCTION_CASE)
42 #undef DEX_INSTRUCTION_LIST
43 #undef INSTRUCTION_CASE
44         default:
45           CHECK(false);
46       }
47       i += inst->SizeInCodeUnits();
48     }
49   }
50 
51  private:
52   // Specific handlers for each instruction.
53 #define INSTRUCTION_VISITOR(o, cname, p, f, r, i, a, v)    \
54   void Do_ ## cname(const Instruction* inst) {             \
55     T* derived = static_cast<T*>(this);                    \
56     derived->Do_Default(inst);                             \
57   }
58 #include "dex_instruction_list.h"
DEX_INSTRUCTION_LIST(INSTRUCTION_VISITOR)59   DEX_INSTRUCTION_LIST(INSTRUCTION_VISITOR)
60 #undef DEX_INSTRUCTION_LIST
61 #undef INSTRUCTION_VISITOR
62 
63   // The default instruction handler.
64   void Do_Default(const Instruction*) {
65     return;
66   }
67 };
68 
69 
70 }  // namespace art
71 
72 #endif  // ART_RUNTIME_DEX_INSTRUCTION_VISITOR_H_
73