From b87f7ed7f4f4e9df269e4c57e380b1b5e2554f8a Mon Sep 17 00:00:00 2001 From: Roxy Light Date: Fri, 20 Dec 2024 17:13:13 -0800 Subject: [PATCH] Fix parsing issues with `or` operator --- internal/luacode/code.go | 4 ++-- internal/luacode/parser.go | 2 +- internal/luacode/testdata/TailCall/input.lua | 7 +++++++ internal/luacode/testdata/TailCall/luac.out | Bin 0 -> 236 bytes 4 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 internal/luacode/testdata/TailCall/input.lua create mode 100644 internal/luacode/testdata/TailCall/luac.out diff --git a/internal/luacode/code.go b/internal/luacode/code.go index 63a79d0..b8252d7 100644 --- a/internal/luacode/code.go +++ b/internal/luacode/code.go @@ -485,7 +485,7 @@ func (p *parser) codePostfix(fs *funcState, operator binaryOperator, e1, e2 expr } return e2, nil case binaryOperatorOr: - if e1.t != noJump { + if e1.f != noJump { return voidExpression(), errors.New("internal error: codePostfix: list should have been closed by codeInfix") } var err error @@ -1105,7 +1105,7 @@ func (p *parser) toRegister(fs *funcState, e expressionDescriptor, reg registerI if err := fs.patchList(e.f, final, reg, positionLoadFalse); err != nil { return e, err } - if err := fs.patchList(e.f, final, reg, positionLoadTrue); err != nil { + if err := fs.patchList(e.t, final, reg, positionLoadTrue); err != nil { return e, err } } diff --git a/internal/luacode/parser.go b/internal/luacode/parser.go index f6d92da..6acc88e 100644 --- a/internal/luacode/parser.go +++ b/internal/luacode/parser.go @@ -205,7 +205,7 @@ func (p *parser) enterBlock(fs *funcState, isLoop bool) *blockControl { // closeFunction finalizes a [funcState] so that its [Prototype] is usable. // -// Equivalent to `open_func` in upstream Lua. +// Equivalent to `close_func` in upstream Lua. func (p *parser) closeFunction(fs *funcState) error { p.codeReturn(fs, p.numVariablesInStack(fs), 0) if err := p.leaveBlock(fs); err != nil { diff --git a/internal/luacode/testdata/TailCall/input.lua b/internal/luacode/testdata/TailCall/input.lua new file mode 100644 index 0000000..f5e86f3 --- /dev/null +++ b/internal/luacode/testdata/TailCall/input.lua @@ -0,0 +1,7 @@ +local function factorial(n, acc) + acc = acc or 1 + if n == 0 then return acc end + return factorial(n - 1, acc * n) +end + +return factorial(3) diff --git a/internal/luacode/testdata/TailCall/luac.out b/internal/luacode/testdata/TailCall/luac.out new file mode 100644 index 0000000000000000000000000000000000000000..ca023aa329070fd34368bd4cfd2fb491997bac72 GIT binary patch literal 236 zcmYjKPYVH25TAL-Qa%8#4o>#!qLgqEDYSnSsV>09p$kz?h+Vy9Pz*KZV%z%lgFNvOj z1&GLZR`?L*!E#sxuxt+sQt?e3Rq