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