dex_instruction_visitor.h revision 744ad05e473be49033d38f30aab63891ca4ee5c3
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:
1412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  void Visit(uint16_t* code, size_t size) {
1512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    T* derived = static_cast<T*>(this);
1612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    byte* ptr = reinterpret_cast<byte*>(code);
1712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    byte* end = ptr + size;
1812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    while (ptr != end) {
1912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro      Instruction* inst = Instruction::At(ptr);
2012eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro      switch (inst->Opcode()) {
21e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#define INSTRUCTION_CASE(o, cname, p, f, r, i, a)  \
2212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro        case Instruction::cname: {                 \
2312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro          derived->Do_ ## cname(inst);             \
2412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro          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      }
3312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro      ptr += inst->Size();
34a7ab79d0afdee2c450f5c517d101d8db980a632ebuzbee      CHECK_LE(ptr, end);
3512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    }
3612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  }
3712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
3812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro private:
3912eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  // Specific handlers for each instruction.
40e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro#define INSTRUCTION_VISITOR(o, cname, p, f, r, i, a)    \
41e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro  void Do_ ## cname(Instruction* inst) {                \
42e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro    T* derived = static_cast<T*>(this);                 \
43e4c1ce498f7933b91696caa4a527e6556128a8e2Carl Shapiro    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.
5112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  void Do_Default(Instruction* inst) {
5212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    return;
5312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  }
5412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro};
5512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
5612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro}  // namespace art
5712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro
5812eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#endif  // ART_SRC_DEX_INSTRUCTION_VISITOR_H_
59