From 78848009609b4e1059a48a2cb60844f9db9459ab Mon Sep 17 00:00:00 2001 From: minerobber Date: Sat, 10 Jan 2026 18:05:54 -0500 Subject: [PATCH 1/5] test moonscript on lua 5.5 --- .github/workflows/spec.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/spec.yml b/.github/workflows/spec.yml index 91707d8..0218e0d 100644 --- a/.github/workflows/spec.yml +++ b/.github/workflows/spec.yml @@ -7,7 +7,7 @@ jobs: strategy: fail-fast: false matrix: - luaVersion: ["5.1", "5.2", "5.3", "5.4", "luajit", "luajit-openresty"] + luaVersion: ["5.1", "5.2", "5.3", "5.4", "5.5", "luajit", "luajit-openresty"] runs-on: ubuntu-latest @@ -19,6 +19,8 @@ jobs: luaVersion: ${{ matrix.luaVersion }} - uses: leafo/gh-actions-luarocks@master + with: + luarocksVersion: "3.13.0" - name: build run: | From e7e331e866797f3bea4e9566d67fb4dc0376b144 Mon Sep 17 00:00:00 2001 From: minerobber Date: Sat, 10 Jan 2026 18:07:56 -0500 Subject: [PATCH 2/5] Add workflow_dispatch trigger to spec.yml [skip ci] --- .github/workflows/spec.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/spec.yml b/.github/workflows/spec.yml index 0218e0d..49b6a18 100644 --- a/.github/workflows/spec.yml +++ b/.github/workflows/spec.yml @@ -1,6 +1,6 @@ name: "spec" -on: [push, pull_request] +on: [push, pull_request, workflow_dispatch] jobs: test: From 90745d331fbc3836f78b0788a0a5da07415e8744 Mon Sep 17 00:00:00 2001 From: minerobber Date: Sat, 10 Jan 2026 18:14:44 -0500 Subject: [PATCH 3/5] 5.5.0, not 5.5 --- .github/workflows/spec.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/spec.yml b/.github/workflows/spec.yml index 49b6a18..c02a5bd 100644 --- a/.github/workflows/spec.yml +++ b/.github/workflows/spec.yml @@ -7,7 +7,7 @@ jobs: strategy: fail-fast: false matrix: - luaVersion: ["5.1", "5.2", "5.3", "5.4", "5.5", "luajit", "luajit-openresty"] + luaVersion: ["5.1", "5.2", "5.3", "5.4", "5.5.0", "luajit", "luajit-openresty"] runs-on: ubuntu-latest From 1e3768ccf9bca03a1765363b9c036588853796e6 Mon Sep 17 00:00:00 2001 From: MineRobber9000 Date: Sat, 10 Jan 2026 19:37:20 -0500 Subject: [PATCH 4/5] Comment out argparse dependency A temporary measure, until argparse gets updated to support 5.5. --- moonscript-dev-1.rockspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moonscript-dev-1.rockspec b/moonscript-dev-1.rockspec index b094bfa..df9b064 100644 --- a/moonscript-dev-1.rockspec +++ b/moonscript-dev-1.rockspec @@ -16,7 +16,7 @@ description = { dependencies = { "lua >= 5.1", "lpeg >= 0.10, ~= 0.11", - "argparse >= 0.7", +-- "argparse >= 0.7", "luafilesystem >= 1.5" } From 9f9b78158a04d8436428fe9ad36089d73dc9f3ac Mon Sep 17 00:00:00 2001 From: MineRobber9000 Date: Sat, 10 Jan 2026 19:51:10 -0500 Subject: [PATCH 5/5] Fix incompatibilities with Lua 5.5. Basically, in a few places moonscript will do: ``` tbl = {"foo", nil, "bar", "baz"} ``` And expect `#tbl` to be `4`. While this was never guaranteed behavior in Lua (the reference manual states that *any* table border can be returned in this case), under PUC-Rio Lua <5.5 (and LuaJIT, which presumably emulates the behavior of PUC-Rio Lua 5.1), it would work correctly. However, with the update to 5.5, this has now broken. As a result, some things that worked under previous versions no longer do. I've made changes in 3 places to fix this: - Added `moon.len`, a function which returns the largest integer key in a table - Fixed the `unpack` call in `moonscript.transform.class` to unpack indices 2 to 4, instead of leaving the last index as `#node` - Fixed the `moon.type` test in `spec.moon_spec` to use `moon.len`. --- moon/init.lua | 16 +++++++++++++--- moon/init.moon | 11 ++++++++++- moonscript/transform/class.lua | 2 +- moonscript/transform/class.moon | 2 +- spec/moon_spec.moon | 4 +++- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/moon/init.lua b/moon/init.lua index 52ead55..0e12acd 100644 --- a/moon/init.lua +++ b/moon/init.lua @@ -7,7 +7,7 @@ do local _obj_0 = require("moonscript.util") getfenv, setfenv, dump = _obj_0.getfenv, _obj_0.setfenv, _obj_0.dump end -local p, is_object, type, debug, run_with_scope, bind_methods, defaultbl, extend, copy, mixin, mixin_object, mixin_table, fold +local p, is_object, type, debug, run_with_scope, bind_methods, defaultbl, extend, copy, mixin, mixin_object, mixin_table, fold, len p = function(o, ...) print(dump(o)) if select("#", ...) > 0 then @@ -149,7 +149,7 @@ mixin_table = function(self, tbl, keys) end end fold = function(items, fn) - local len = #items + len = #items if len > 1 then local accum = fn(items[1], items[2]) for i = 3, len do @@ -160,6 +160,15 @@ fold = function(items, fn) return items[1] end end +len = function(tbl) + local largest = 0 + for key, val in pairs(tbl) do + if type(key) == "number" and key > largest then + largest = key + end + end + return largest +end return { dump = dump, p = p, @@ -174,5 +183,6 @@ return { mixin = mixin, mixin_object = mixin_object, mixin_table = mixin_table, - fold = fold + fold = fold, + len = len } diff --git a/moon/init.moon b/moon/init.moon index 57325ee..92fba20 100644 --- a/moon/init.moon +++ b/moon/init.moon @@ -129,7 +129,16 @@ fold = (items, fn)-> else items[1] +-- gets largest integer key of tbl +len = (tbl)-> + largest = 0 + for key, val in pairs tbl + if type(key) == "number" and key > largest + largest = key + largest + { :dump, :p, :is_object, :type, :debug, :run_with_scope, :bind_methods, - :defaultbl, :extend, :copy, :mixin, :mixin_object, :mixin_table, :fold + :defaultbl, :extend, :copy, :mixin, :mixin_object, :mixin_table, :fold, + :len } diff --git a/moonscript/transform/class.lua b/moonscript/transform/class.lua index 74f93c5..fc20d3f 100644 --- a/moonscript/transform/class.lua +++ b/moonscript/transform/class.lua @@ -106,7 +106,7 @@ super_scope = function(value, t, key) } end return function(self, node, ret, parent_assign) - local name, parent_val, body = unpack(node, 2) + local name, parent_val, body = unpack(node, 2, 4) if parent_val == "" then parent_val = nil end diff --git a/moonscript/transform/class.moon b/moonscript/transform/class.moon index 7451375..92296f8 100644 --- a/moonscript/transform/class.moon +++ b/moonscript/transform/class.moon @@ -76,7 +76,7 @@ super_scope = (value, t, key) -> } (node, ret, parent_assign) => - name, parent_val, body = unpack node, 2 + name, parent_val, body = unpack node, 2, 4 parent_val = nil if parent_val == "" parent_cls_name = NameProxy "parent" diff --git a/spec/moon_spec.moon b/spec/moon_spec.moon index 773e53c..eb71351 100644 --- a/spec/moon_spec.moon +++ b/spec/moon_spec.moon @@ -15,7 +15,9 @@ describe "moon", -> Test, Test!, 1, true, nil, "hello" } - types = [moon.type t for t in *things] + types = {} + for i=1, moon.len things + types[i] = moon.type things[i] assert.same types, { Test, Test, "number", "boolean", "nil", "string" } it "should get upvalue", ->