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