| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- /*
- _____ __ ___ __ ____ _ __
- / ___/__ ___ _ ___ / |/ /__ ___ / /_____ __ __/ __/_______(_)__ / /_
- / (_ / _ `/ ' \/ -_) /|_/ / _ \/ _ \/ '_/ -_) // /\ \/ __/ __/ / _ \/ __/
- \___/\_,_/_/_/_/\__/_/ /_/\___/_//_/_/\_\\__/\_, /___/\__/_/ /_/ .__/\__/
- /___/ /_/
-
- See Copyright Notice in gmMachine.h
- */
- #include "gmConfig.h"
- #include "gmByteCode.h"
- #if GM_COMPILE_DEBUG
- void gmByteCodePrint(FILE * a_fp, const void * a_byteCode, int a_byteCodeLength)
- {
- union
- {
- const gmuint32 * instruction32;
- const gmuint8 * instruction;
- };
- instruction = (const gmuint8 *) a_byteCode;
- const gmuint8 * end = instruction + a_byteCodeLength;
- const gmuint8 * start = instruction;
- const char * cp;
- bool opiptr, opf32, opi32;
- while(instruction < end)
- {
- opiptr = false;
- opf32 = false;
- opi32 = false;
- int addr = (int)(instruction - start);
- switch(*instruction)
- {
- case BC_NOP : cp = "nop"; break;
- case BC_LINE : cp = "line"; break;
- case BC_GETDOT : cp = "get dot"; opiptr = true; break;
- case BC_SETDOT : cp = "set dot"; opiptr = true; break;
- case BC_GETIND : cp = "get index"; break;
- case BC_SETIND : cp = "set index"; break;
- case BC_BRA : cp = "bra"; opiptr = true; break;
- case BC_BRZ : cp = "brz"; opiptr = true; break;
- case BC_BRNZ : cp = "brnz"; opiptr = true; break;
- case BC_BRZK : cp = "brzk"; opiptr = true; break;
- case BC_BRNZK : cp = "brnzk"; opiptr = true; break;
- case BC_CALL : cp = "call"; opiptr = true; break;
- case BC_RET : cp = "ret"; break;
- case BC_RETV : cp = "retv"; break;
- case BC_FOREACH : cp = "foreach"; opiptr = true; break;
-
- case BC_POP : cp = "pop"; break;
- case BC_POP2 : cp = "pop2"; break;
- case BC_DUP : cp = "dup"; break;
- case BC_DUP2 : cp = "dup2"; break;
- case BC_SWAP : cp = "swap"; break;
- case BC_PUSHNULL : cp = "push null"; break;
- case BC_PUSHINT : cp = "push int"; opi32 = true; break;
- case BC_PUSHINT0 : cp = "push int 0"; break;
- case BC_PUSHINT1 : cp = "push int 1"; break;
- case BC_PUSHFP : cp = "push fp"; opf32 = true; break;
- case BC_PUSHSTR : cp = "push str"; opiptr = true; break;
- case BC_PUSHTBL : cp = "push tbl"; break;
- case BC_PUSHFN : cp = "push fn"; opiptr = true; break;
- case BC_PUSHTHIS : cp = "push this"; break;
-
- case BC_GETLOCAL : cp = "get local"; opi32 = true; break;
- case BC_SETLOCAL : cp = "set local"; opi32 = true; break;
- case BC_GETGLOBAL : cp = "get global"; opiptr = true; break;
- case BC_SETGLOBAL : cp = "set global"; opiptr = true; break;
- case BC_GETTHIS : cp = "get this"; opiptr = true; break;
- case BC_SETTHIS : cp = "set this"; opiptr = true; break;
-
- case BC_OP_ADD : cp = "add"; break;
- case BC_OP_SUB : cp = "sub"; break;
- case BC_OP_MUL : cp = "mul"; break;
- case BC_OP_DIV : cp = "div"; break;
- case BC_OP_REM : cp = "rem"; break;
- case BC_BIT_OR : cp = "bor"; break;
- case BC_BIT_XOR : cp = "bxor"; break;
- case BC_BIT_AND : cp = "band"; break;
- case BC_BIT_INV : cp = "binv"; break;
- case BC_BIT_SHL : cp = "bshl"; break;
- case BC_BIT_SHR : cp = "bshr"; break;
-
- case BC_OP_NEG : cp = "neg"; break;
- case BC_OP_POS : cp = "pos"; break;
- case BC_OP_NOT : cp = "not"; break;
-
- case BC_OP_LT : cp = "lt"; break;
- case BC_OP_GT : cp = "gt"; break;
- case BC_OP_LTE : cp = "lte"; break;
- case BC_OP_GTE : cp = "gte"; break;
- case BC_OP_EQ : cp = "eq"; break;
- case BC_OP_NEQ : cp = "neq"; break;
- #if GM_USE_FORK
- case BC_FORK : cp = "fork"; opiptr = true; break;
- #endif //GM_USE_FORK
- default : cp = "ERROR"; break;
- }
- ++instruction32;
- if(opf32)
- {
- float fval = *((float *) instruction);
- instruction += sizeof(gmint32);
- fprintf(a_fp, " %04d %s %f" GM_NL, addr, cp, fval);
- }
- if(opi32)
- {
- gmint32 ival = *((gmint32 *) instruction);
- instruction += sizeof(gmint32);
- fprintf(a_fp, " %04d %s %d" GM_NL, addr, cp, ival);
- }
- else if (opiptr)
- {
- gmptr ival = *((gmptr *) instruction);
- instruction += sizeof(gmptr);
- fprintf(a_fp, " %04d %s %lld" GM_NL, addr, cp, (gmint64)ival);
- }
- else
- {
- fprintf(a_fp, " %04d %s" GM_NL, addr, cp);
- }
- }
- }
- #endif // GM_COMPILE_DEBUG
|