我的Lua 5.1实现中OPCODE TFORLOOP有问题,不正常工作。

huangapple go评论62阅读模式
英文:

My Lua 5.1 Implementation of the OPCODE TFORLOOP is not working correctly

问题

I am working on a Lua 5.1 VM inside of Lua 5.1. Most Opcodes work fine but my TFORLOOP does not work. I get this error:
Bad Argument #1 to '?' (table expected, got function)

Here is my implementation of TFORLOOP:

[33] = function(INSTRUCTION) --TFORLOOP
    local offset = INSTRUCTION.a + 3
    local result = {stack[INSTRUCTION.a](stack[INSTRUCTION.a], stack[INSTRUCTION.a + 1], stack[INSTRUCTION.a + 2])}
    for i = 1, INSTRUCTION.c do
        stack[offset + i - 1] = result[i]
    end

    if result[1] ~= nil then
        stack[INSTRUCTION.a + 1] = result[1]
    else
        if result[2] ~= nil then
            stack[INSTRUCTION.a + 1] = result[2]
        else
            pc = pc + 1
        end
    end
end

And I parse these instructions:

{a=0,op=5,Bx=0,}
{a=1,op=10,c=0,b=10,}
{a=2,op=1,Bx=1,}
{a=3,op=1,Bx=2,}
{a=4,op=1,Bx=3,}
{a=5,op=1,Bx=4,}
{a=6,op=1,Bx=5,}
{a=7,op=1,Bx=6,}
{a=8,op=1,Bx=7,}
{a=9,op=1,Bx=8,}
{a=10,op=1,Bx=9,}
{a=11,op=1,Bx=10,}
{a=1,op=34,c=1,b=10,}
{a=0,op=28,c=4,b=2,}
{a=0,op=22,sBx=3,}
{a=5,op=5,Bx=11,}
{a=6,op=0,c=0,b=4,}
{a=5,op=28,c=1,b=2,}
{a=0,op=33,c=2,b=0,}
{a=0,op=22,sBx=-5,}
{a=0,op=30,c=0,b=1,}

Constants:

pairs
print
10
9
8
7
6
5
4
3
2
1

Thanks!

To help me understand why my TFORLOOP OPCODE is not working and maybe fix it

英文:

I am working on a Lua 5.1 VM inside of Lua 5.1. Most Opcodes work fine but my TFORLOOP does not work. I get this error:
Bad Argument #1 to '?' (table expected, got function)

Here is my implementation of TFORLOOP:

        [33] = function(INSTRUCTION) --TFORLOOP
            local offset = INSTRUCTION.a + 3
            local result = {stack[INSTRUCTION.a](stack[INSTRUCTION.a], stack[INSTRUCTION.a + 1], stack[INSTRUCTION.a + 2])}
            for i = 1, INSTRUCTION.c do
                stack[offset + i - 1] = result[i]
            end
        
            if result[1] ~= nil then
                stack[INSTRUCTION.a + 1] = result[1]
            else
                if result[2] ~= nil then
                    stack[INSTRUCTION.a + 1] = result[2]
                else
                    pc = pc + 1
                end
            end
        end,

And I parse these instructions:

{a=0,op=5,Bx=0,}
{a=1,op=10,c=0,b=10,}
{a=2,op=1,Bx=1,}
{a=3,op=1,Bx=2,}
{a=4,op=1,Bx=3,}
{a=5,op=1,Bx=4,}
{a=6,op=1,Bx=5,}
{a=7,op=1,Bx=6,}
{a=8,op=1,Bx=7,}
{a=9,op=1,Bx=8,}
{a=10,op=1,Bx=9,}
{a=11,op=1,Bx=10,}
{a=1,op=34,c=1,b=10,}
{a=0,op=28,c=4,b=2,}
{a=0,op=22,sBx=3,}
{a=5,op=5,Bx=11,}
{a=6,op=0,c=0,b=4,}
{a=5,op=28,c=1,b=2,}
{a=0,op=33,c=2,b=0,}
{a=0,op=22,sBx=-5,}
{a=0,op=30,c=0,b=1,}

Constants:

pairs
print
10
9
8
7
6
5
4
3
2
1

Thanks!

To help me understand why my TFORLOOP OPCODE is not working and maybe fix it

答案1

得分: 0

TFORLOOP 必须计算 R(A)(R(A+1), R(A+2))
你正在计算 R(A)(R(A), R(A+1), R(A+2)) 替代

英文:

TFORLOOP must calculate R(A)(R(A+1), R(A+2))
You are calculating R(A)(R(A), R(A+1), R(A+2)) instead

huangapple
  • 本文由 发表于 2023年4月19日 23:32:37
  • 转载请务必保留本文链接:https://go.coder-hub.com/76056357.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定