From 13ebb30f0091eba244dc8b38ca8e3edf3b83a962 Mon Sep 17 00:00:00 2001 From: Yura Lazarev Date: Sun, 14 Jun 2026 10:32:46 +0200 Subject: [PATCH 1/2] fix: forward tenth argument in runEffectFn10 runEffectFn10 bound ten curried parameters a..j but only forwarded nine to the underlying function, silently dropping j (luacheck: unused argument j). Forward j so all ten declared arguments reach fn. Closes Unisay/purescript-lua-effect#1 --- src/Effect/Uncurried.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Effect/Uncurried.lua b/src/Effect/Uncurried.lua index 11de067..01acec5 100644 --- a/src/Effect/Uncurried.lua +++ b/src/Effect/Uncurried.lua @@ -196,7 +196,7 @@ return { return function(i) return function(j) return function() - return fn(a, b, c, d, e, f, g, h, i) + return fn(a, b, c, d, e, f, g, h, i, j) end end end From 04eb45af94eaf964c03de83ca37eeb8d82ddb4f8 Mon Sep 17 00:00:00 2001 From: Yura Lazarev Date: Sun, 14 Jun 2026 13:04:52 +0200 Subject: [PATCH 2/2] test: regression guard for runEffectFn10 forwarding all ten args --- scripts/test | 6 ++++++ test/regression/uncurried.lua | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100755 scripts/test create mode 100644 test/regression/uncurried.lua diff --git a/scripts/test b/scripts/test new file mode 100755 index 0000000..4fc9525 --- /dev/null +++ b/scripts/test @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "Running regression tests..." + +lua test/regression/uncurried.lua diff --git a/test/regression/uncurried.lua b/test/regression/uncurried.lua new file mode 100644 index 0000000..3e0eb09 --- /dev/null +++ b/test/regression/uncurried.lua @@ -0,0 +1,25 @@ +-- Regression guard: runEffectFn10 must forward all ten arguments. +-- +-- The FFI bound ten curried parameters a..j but called the underlying +-- function with only nine (a..i), silently dropping j. This loads the +-- FFI table directly and checks that every argument reaches `fn`. + +local M = assert(dofile("src/Effect/Uncurried.lua")) + +local seen +local recorder = function(...) + seen = { ... } + return nil +end + +-- runEffectFn10(fn)(a)(b)...(j)() applies fn to all ten arguments. +M.runEffectFn10(recorder)(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)() + +assert(seen ~= nil, "fn was never called") +assert(#seen == 10, "expected 10 forwarded arguments, got " .. #seen) +for k = 1, 10 do + assert(seen[k] == k, + "argument #" .. k .. " not forwarded (got " .. tostring(seen[k]) .. ")") +end + +print("OK runEffectFn10 forwards all ten arguments")