dvander@172: /* vim: set ts=4 sw=4 tw=99 et: dvander@172: * dvander@0: * Copyright (C) 2012 David Anderson dvander@0: * dvander@172: * This file is part of SourcePawn. dvander@0: * dvander@172: * SourcePawn is free software: you can redistribute it and/or modify it under dvander@0: * the terms of the GNU General Public License as published by the Free dvander@0: * Software Foundation, either version 3 of the License, or (at your option) dvander@0: * any later version. dvander@0: * dvander@172: * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY dvander@0: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@0: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@0: * dvander@0: * You should have received a copy of the GNU General Public License along with dvander@172: * SourcePawn. If not, see http://www.gnu.org/licenses/. dvander@0: */ dvander@0: #ifndef _include_opcodes_h_ dvander@0: #define _include_opcodes_h_ dvander@0: dvander@0: #include dvander@0: #include dvander@0: dvander@59: namespace ke { dvander@195: dvander@195: struct SourcePosition dvander@195: { dvander@195: int line; dvander@195: int col; dvander@195: dvander@195: SourcePosition() dvander@195: : line(-1), dvander@195: col(-1) dvander@195: { dvander@195: } dvander@195: dvander@195: SourcePosition(unsigned line, unsigned col) dvander@195: : line(line), dvander@195: col(col) dvander@195: { dvander@195: } dvander@195: }; dvander@0: dvander@0: enum Opcode dvander@0: { dvander@195: #define OPDEF(name, text, length, uses, defs) \ dvander@195: name, dvander@0: #include "Opcodes.tbl" dvander@0: #undef OPDEF dvander@0: OPCODES_TOTAL dvander@0: }; dvander@0: dvander@195: #define OPDEF(name, text, length, uses, defs) \ dvander@0: static const unsigned name##_LENGTH = length; dvander@0: #include "Opcodes.tbl" dvander@0: #undef OPDEF dvander@0: dvander@0: struct OpInfo dvander@0: { dvander@0: const char *name; dvander@0: int length; dvander@0: int nuses; dvander@0: int ndefs; dvander@0: }; dvander@0: dvander@0: typedef unsigned char bytecode; dvander@0: dvander@0: extern OpInfo OpcodeInfo[]; dvander@0: dvander@172: static const unsigned MAX_TABLESWITCH_ENTRIES = 256; dvander@172: dvander@172: static inline unsigned dvander@172: TableSwitchEntries(int low, int high) dvander@172: { dvander@172: return unsigned(high - low) + 1; dvander@172: } dvander@172: dvander@0: static inline int dvander@0: READ_INT32(bytecode *pc) dvander@0: { dvander@0: return *reinterpret_cast(pc + 1); dvander@0: } dvander@0: static inline unsigned dvander@0: READ_UINT32(bytecode *pc) dvander@0: { dvander@0: return *reinterpret_cast(pc + 1); dvander@0: } dvander@4: static inline float dvander@4: READ_FLOAT(bytecode *pc) dvander@4: { dvander@4: return *reinterpret_cast(pc + 1); dvander@4: } dvander@0: dvander@172: static inline int dvander@172: READ_TABLESWITCH_LOW(bytecode *pc) dvander@172: { dvander@172: return READ_INT32(pc); dvander@172: } dvander@172: dvander@172: static inline int dvander@172: READ_TABLESWITCH_HIGH(bytecode *pc) dvander@172: { dvander@172: return READ_INT32(pc + sizeof(int)); dvander@172: } dvander@172: dvander@0: class Code; dvander@0: dvander@0: void Disassemble(Code *code, FILE *fp); dvander@0: dvander@0: } dvander@0: dvander@0: #endif // _include_opcodes_h_