public static void get_code(CodeCode code, BytePtr pc) { code.m.c1 = (Byte)pc[0]; pc.inc(); code.m.c2 = (Byte)pc[0]; pc.inc(); code.m.c3 = (Byte)pc[0]; pc.inc(); code.m.c4 = (Byte)pc[0]; pc.inc(); }
/* ** Execute the given opcode, until a RET. Parameters are between ** [stack+base,top). Returns n such that the the results are between ** [stack+n,top). */ private static StkId lua_execute(BytePtr pc, StkId @base) { //pc = new BytePtr(pc); lua_checkstack(STACKGAP + MAX_TEMPS + @base); while (true) { #if MY_DEBUG //printf(">>> %d,", ObjectRef.minus(top, stack)); #endif OpCode opcode; opcode = (OpCode)pc[0]; pc.inc(); switch (opcode) { case OpCode.PUSHNIL: tag(top.get(), lua_Type.LUA_T_NIL); top.inc(); break; case OpCode.PUSH0: case OpCode.PUSH1: case OpCode.PUSH2: tag(top.get(), lua_Type.LUA_T_NUMBER); nvalue(top.get(), opcode - OpCode.PUSH0); top.inc(); break; case OpCode.PUSHBYTE: tag(top.get(), lua_Type.LUA_T_NUMBER); nvalue(top.get(), pc[0]); top.inc(); pc.inc(); break; case OpCode.PUSHWORD: { CodeWord code = new CodeWord(); get_word(code, pc); tag(top.get(), lua_Type.LUA_T_NUMBER); nvalue(top.get(), code.w); top.inc(); } break; case OpCode.PUSHFLOAT: { CodeFloat code = new CodeFloat(); get_float(code, pc); tag(top.get(), lua_Type.LUA_T_NUMBER); nvalue(top.get(), code.f); top.inc(); } break; case OpCode.PUSHSTRING: { CodeWord code = new CodeWord(); get_word(code, pc); tag(top.get(), lua_Type.LUA_T_STRING); tsvalue(top.get(), lua_constant[code.w]); top.inc(); } break; case OpCode.PUSHFUNCTION: { CodeCode code = new CodeCode(); get_code(code, pc); tag(top.get(), lua_Type.LUA_T_FUNCTION); bvalue(top.get(), new BytePtr(code.b, 0)); top.inc(); } break; case OpCode.PUSHLOCAL0: case OpCode.PUSHLOCAL1: case OpCode.PUSHLOCAL2: case OpCode.PUSHLOCAL3: case OpCode.PUSHLOCAL4: case OpCode.PUSHLOCAL5: case OpCode.PUSHLOCAL6: case OpCode.PUSHLOCAL7: case OpCode.PUSHLOCAL8: case OpCode.PUSHLOCAL9: top.get().set(stack[(@base) + (int)(opcode - OpCode.PUSHLOCAL0)]); top.inc(); break; case OpCode.PUSHLOCAL: top.get().set(stack[(@base) + pc[0]]); top.inc(); pc.inc(); break; case OpCode.PUSHGLOBAL: { CodeWord code = new CodeWord(); get_word(code, pc); top.get().set(s_object(code.w)); top.inc(); } break; case OpCode.PUSHINDEXED: pushsubscript(); break; case OpCode.PUSHSELF: { Object_ receiver = top.get(-1); CodeWord code = new CodeWord(); get_word(code, pc); tag(top.get(), lua_Type.LUA_T_STRING); tsvalue(top.get(), lua_constant[code.w]); top.inc(); pushsubscript(); top.get().set(receiver); top.inc(); break; } case OpCode.STORELOCAL0: case OpCode.STORELOCAL1: case OpCode.STORELOCAL2: case OpCode.STORELOCAL3: case OpCode.STORELOCAL4: case OpCode.STORELOCAL5: case OpCode.STORELOCAL6: case OpCode.STORELOCAL7: case OpCode.STORELOCAL8: case OpCode.STORELOCAL9: top.dec(); stack[(@base) + (int)(opcode - OpCode.STORELOCAL0)].set(top.get()); break; case OpCode.STORELOCAL: top.dec(); stack[(@base) + pc[0]].set(top.get()); pc.inc(); break; case OpCode.STOREGLOBAL: { CodeWord code = new CodeWord(); get_word(code, pc); top.dec(); s_object(code.w, top.get(0)); } break; case OpCode.STOREINDEXED0: storesubscript(); break; case OpCode.STOREINDEXED: { int n = pc[0]; pc.inc(); if (tag(top.get(-3 - n)) != lua_Type.LUA_T_ARRAY) { top.get(+1).set(top.get(-1)); top.get().set(top.get(-2 - n)); top.get(-1).set(top.get(-3 - n)); top.add(2); do_call(luaI_fallBacks[FB_SETTABLE].function, ObjectRef.minus(top, stack) - 3, 0, ObjectRef.minus(top, stack) - 3); } else { Object_ h = lua_hashdefine(avalue(top.get(-3 - n)), top.get(-2 - n)); h.set(top.get(-1)); top.dec(); } } break; case OpCode.STORELIST0: case OpCode.STORELIST: { int m, n; Object_ arr; if (opcode == OpCode.STORELIST0) { m = 0; } else { m = pc[0] * FIELDS_PER_FLUSH; pc.inc(); } n = pc[0]; pc.inc(); arr = top.get(-n - 1); while (n != 0) { tag(top.get(), lua_Type.LUA_T_NUMBER); nvalue(top.get(), n + m); lua_hashdefine(avalue(arr), top.get()).set(top.get(-1)); top.dec(); n--; } } break; case OpCode.STORERECORD: { int n = pc[0]; pc.inc(); Object_ arr = top.get(-n - 1); while (n != 0) { CodeWord code = new CodeWord(); get_word(code, pc); tag(top.get(), lua_Type.LUA_T_STRING); tsvalue(top.get(), lua_constant[code.w]); lua_hashdefine(avalue(arr), top.get()).set(top.get(-1)); top.dec(); n--; } } break; case OpCode.ADJUST0: adjust_top(@base); break; case OpCode.ADJUST: adjust_top(@base + pc[0]); pc.inc(); break; case OpCode.CREATEARRAY: { CodeWord size = new CodeWord(); get_word(size, pc); avalue(top.get(), lua_createarray(size.w)); tag(top.get(), lua_Type.LUA_T_ARRAY); top.inc(); } break; case OpCode.EQOP: { int res = lua_equalObj(top.get(-2), top.get(-1)); top.dec(); tag(top.get(-1), res != 0 ? lua_Type.LUA_T_NUMBER : lua_Type.LUA_T_NIL); nvalue(top.get(-1), 1); } break; case OpCode.LTOP: comparison(lua_Type.LUA_T_NUMBER, lua_Type.LUA_T_NIL, lua_Type.LUA_T_NIL, "lt"); break; case OpCode.LEOP: comparison(lua_Type.LUA_T_NUMBER, lua_Type.LUA_T_NUMBER, lua_Type.LUA_T_NIL, "le"); break; case OpCode.GTOP: comparison(lua_Type.LUA_T_NIL, lua_Type.LUA_T_NIL, lua_Type.LUA_T_NUMBER, "gt"); break; case OpCode.GEOP: comparison(lua_Type.LUA_T_NIL, lua_Type.LUA_T_NUMBER, lua_Type.LUA_T_NUMBER, "ge"); break; case OpCode.ADDOP: { Object_ l = top.get(-2); Object_ r = top.get(-1); if (tonumber(r) || tonumber(l)) { call_arith("add"); } else { nvalue(l, nvalue(l) + nvalue(r)); top.dec(); } } break; case OpCode.SUBOP: { Object_ l = top.get(-2); Object_ r = top.get(-1); if (tonumber(r) || tonumber(l)) { call_arith("sub"); } else { nvalue(l, nvalue(l) - nvalue(r)); top.dec(); } } break; case OpCode.MULTOP: { Object_ l = top.get(-2); Object_ r = top.get(-1); if (tonumber(r) || tonumber(l)) { call_arith("mul"); } else { nvalue(l, nvalue(l) * nvalue(r)); top.dec(); } } break; case OpCode.DIVOP: { Object_ l = top.get(-2); Object_ r = top.get(-1); if (tonumber(r) || tonumber(l)) { call_arith("div"); } else { nvalue(l, nvalue(l) / nvalue(r)); top.dec(); } } break; case OpCode.POWOP: call_arith("pow"); break; case OpCode.CONCOP: { Object_ l = top.get(-2); Object_ r = top.get(-1); if (tostring(r) || tostring(l)) { do_call(luaI_fallBacks[FB_CONCAT].function, ObjectRef.minus(top, stack) - 2, 1, ObjectRef.minus(top, stack) - 2); } else { tsvalue(l, lua_createstring(lua_strconc(svalue(l), svalue(r)))); top.dec(); } } break; case OpCode.MINUSOP: if (tonumber(top.get(-1))) { tag(top.get(), lua_Type.LUA_T_NIL); top.inc(); call_arith("unm"); } else { nvalue(top.get(-1), -nvalue(top.get(-1))); } break; case OpCode.NOTOP: tag(top.get(-1), (tag(top.get(-1)) == lua_Type.LUA_T_NIL) ? lua_Type.LUA_T_NUMBER : lua_Type.LUA_T_NIL); nvalue(top.get(-1), 1); break; case OpCode.ONTJMP: { CodeWord code = new CodeWord(); get_word(code, pc); if (tag(top.get(-1)) != lua_Type.LUA_T_NIL) { pc += code.w; } } break; case OpCode.ONFJMP: { CodeWord code = new CodeWord(); get_word(code, pc); if (tag(top.get(-1)) == lua_Type.LUA_T_NIL) { pc += code.w; } } break; case OpCode.JMP: { CodeWord code = new CodeWord(); get_word(code, pc); pc += code.w; } break; case OpCode.UPJMP: { CodeWord code = new CodeWord(); get_word(code, pc); pc -= code.w; } break; case OpCode.IFFJMP: { CodeWord code = new CodeWord(); get_word(code, pc); top.dec(); if (tag(top.get()) == lua_Type.LUA_T_NIL) { pc += code.w; } } break; case OpCode.IFFUPJMP: { CodeWord code = new CodeWord(); get_word(code, pc); top.dec(); if (tag(top.get()) == lua_Type.LUA_T_NIL) { pc -= code.w; } } break; case OpCode.POP: top.dec(); break; case OpCode.CALLFUNC: { int nParams = pc[0]; pc.inc(); int nResults = pc[0]; pc.inc(); Object_ func = top.get(-1 - nParams); /* function is below parameters */ StkId newBase = ObjectRef.minus(top, stack) - nParams; do_call(func, newBase, nResults, newBase - 1); } break; case OpCode.RETCODE0: return(@base); case OpCode.RETCODE: return(@base + pc[0]); case OpCode.SETFUNCTION: { CodeCode file = new CodeCode(); CodeWord func = new CodeWord(); get_code(file, pc); get_word(func, pc); lua_pushfunction(new CharPtr(file.b), func.w); } break; case OpCode.SETLINE: { CodeWord code = new CodeWord(); get_word(code, pc); lua_debugline = code.w; } break; case OpCode.RESET: lua_popfunction(); break; default: lua_error("internal error - opcode doesn't match"); break; } } }
public CodeCode_m_struct(CodeCode parent) { this.parent_ = parent; }