12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License.
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License.
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */
1612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_DEX_INSTRUCTION_VISITOR_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_DEX_INSTRUCTION_VISITOR_H_
1912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
20761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h"
21578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction.h"
2212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
2312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapironamespace art {
2412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
2512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapirotemplate<typename T>
2612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiroclass DexInstructionVisitor {
2712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro public:
28d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  void Visit(const uint16_t* code, size_t size_in_bytes) {
2912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    T* derived = static_cast<T*>(this);
30d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers    size_t size_in_code_units = size_in_bytes / sizeof(uint16_t);
31d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers    size_t i = 0;
32d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers    while (i < size_in_code_units) {
33d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers      const Instruction* inst = Instruction::At(&code[i]);
3412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro      switch (inst->Opcode()) {
35ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_CASE(o, cname, p, f, r, i, a, v)  \
36ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao        case Instruction::cname: {                    \
37ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao          derived->Do_ ## cname(inst);                \
38ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao          break;                                      \
3912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro        }
40578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h"
4112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro        DEX_INSTRUCTION_LIST(INSTRUCTION_CASE)
42d84f49c0d682c9f657d22fc6974c9fa4320aa396Carl Shapiro#undef DEX_INSTRUCTION_LIST
4312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#undef INSTRUCTION_CASE
4412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro        default:
45f5a7a476e7ea63e094ff0f011dccc170607e6f6bElliott Hughes          CHECK(false);
4612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro      }
47d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers      i += inst->SizeInCodeUnits();
4812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    }
4912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  }
5012eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
5112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro private:
5212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  // Specific handlers for each instruction.
53ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_VISITOR(o, cname, p, f, r, i, a, v)    \
54ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao  void Do_ ## cname(const Instruction* inst) {             \
55ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao    T* derived = static_cast<T*>(this);                    \
56ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao    derived->Do_Default(inst);                             \
57744ad05e473be49033d38f30aab63891ca4ee5c3Carl Shapiro  }
58578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h"
59d84f49c0d682c9f657d22fc6974c9fa4320aa396Carl Shapiro  DEX_INSTRUCTION_LIST(INSTRUCTION_VISITOR)
60d84f49c0d682c9f657d22fc6974c9fa4320aa396Carl Shapiro#undef DEX_INSTRUCTION_LIST
6112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#undef INSTRUCTION_VISITOR
6212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
6312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  // The default instruction handler.
641b09b094a85e03f6ef5f687f58bb91c433273ba1Ian Rogers  void Do_Default(const Instruction*) {
6512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    return;
6612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  }
6712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro};
6812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
69ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao
7012eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro}  // namespace art
7112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
72fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_DEX_INSTRUCTION_VISITOR_H_
73