dex_instruction_visitor.h revision ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29
112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro// Copyright 2011 Google Inc. All Rights Reserved.
212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#ifndef ART_SRC_DEX_INSTRUCTION_VISITOR_H_
412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#define ART_SRC_DEX_INSTRUCTION_VISITOR_H_
512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
6578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction.h"
7578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "macros.h"
812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapironamespace art {
1012eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
1112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapirotemplate<typename T>
1212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiroclass DexInstructionVisitor {
1312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro public:
14ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao  void Visit(const uint16_t* code, size_t size) {
1512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    T* derived = static_cast<T*>(this);
16ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao    const byte* ptr = reinterpret_cast<const byte*>(code);
17ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao    const byte* end = ptr + size;
1812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    while (ptr != end) {
19ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao      const Instruction* inst = Instruction::At(ptr);
2012eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro      switch (inst->Opcode()) {
21ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_CASE(o, cname, p, f, r, i, a, v)  \
22ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao        case Instruction::cname: {                    \
23ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao          derived->Do_ ## cname(inst);                \
24ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao          break;                                      \
2512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro        }
26578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h"
2712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro        DEX_INSTRUCTION_LIST(INSTRUCTION_CASE)
28d84f49c0d682c9f657d22fc6974c9fa4320aa396Carl Shapiro#undef DEX_INSTRUCTION_LIST
2912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#undef INSTRUCTION_CASE
3012eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro        default:
3112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro          CHECK(true);
3212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro      }
33ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao      ptr += inst->Size() * sizeof(uint16_t);
34a7ab79d0afdee2c450f5c517d101d8db980a632ebuzbee      CHECK_LE(ptr, end);
3512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    }
3612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  }
3712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
3812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro private:
3912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  // Specific handlers for each instruction.
40ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao#define INSTRUCTION_VISITOR(o, cname, p, f, r, i, a, v)    \
41ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao  void Do_ ## cname(const Instruction* inst) {             \
42ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao    T* derived = static_cast<T*>(this);                    \
43ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao    derived->Do_Default(inst);                             \
44744ad05e473be49033d38f30aab63891ca4ee5c3Carl Shapiro  }
45578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_instruction_list.h"
46d84f49c0d682c9f657d22fc6974c9fa4320aa396Carl Shapiro  DEX_INSTRUCTION_LIST(INSTRUCTION_VISITOR)
47d84f49c0d682c9f657d22fc6974c9fa4320aa396Carl Shapiro#undef DEX_INSTRUCTION_LIST
4812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#undef INSTRUCTION_VISITOR
4912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
5012eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  // The default instruction handler.
51ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao  void Do_Default(const Instruction* inst) {
5212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    return;
5312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  }
5412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro};
5512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
56ba5ebb944b7c5c6a1b754b6dd47eed96f39aea29jeffhao
5712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro}  // namespace art
5812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
5912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#endif  // ART_SRC_DEX_INSTRUCTION_VISITOR_H_
60