Ejemplo n.º 1
0
 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();
 }
Ejemplo n.º 2
0
        /*
        ** 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;
                }
            }
        }
Ejemplo n.º 3
0
 public CodeCode_m_struct(CodeCode parent)
 {
     this.parent_ = parent;
 }