dex_instruction_visitor.h revision d84f49c0d682c9f657d22fc6974c9fa4320aa396
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
612eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#include "src/dex_instruction.h"
712eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#include "src/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()) {
2112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#define INSTRUCTION_CASE(cname, value)             \
2212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro        case Instruction::cname: {                 \
2312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro          derived->Do_ ## cname(inst);             \
2412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro          break;                                   \
2512eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro        }
26d84f49c0d682c9f657d22fc6974c9fa4320aa396Carl Shapiro#include "src/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.
4012eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro#define INSTRUCTION_VISITOR(cname, value) \
4112eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  void Do_ ## cname(Instruction* inst) {  \
4212eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    T* derived = static_cast<T*>(this);   \
4312eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro    derived->Do_Default(inst);            \
4412eb78e651f13f2c1f0c2c922048a5a213253adfCarl Shapiro  };
45d84f49c0d682c9f657d22fc6974c9fa4320aa396Carl Shapiro#include "src/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