From fbd8179429ab8955fb4b9ee0cd32d932740a3720 Mon Sep 17 00:00:00 2001 From: Frotty Date: Wed, 2 Sep 2026 10:38:38 +0200 Subject: [PATCH] Fix tuple member array index capture --- .../imtranslation/UsedVariables.java | 4 ++- .../tests/LuaBackendAuditTests.java | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/UsedVariables.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/UsedVariables.java index 4895b705a..618e24e32 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/UsedVariables.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/UsedVariables.java @@ -66,7 +66,9 @@ private void handleLExprReads(ImLExpr expr) { if (expr instanceof ImVarAccess) { // Write only, skip } else if (expr instanceof ImMemberAccess) { - ((ImMemberAccess) expr).getReceiver().accept(this); + ImMemberAccess memberAccess = (ImMemberAccess) expr; + memberAccess.getReceiver().accept(this); + memberAccess.getIndexes().accept(this); } else if (expr instanceof ImVarArrayAccess) { ((ImVarArrayAccess) expr).getIndexes().accept(this); } else if (expr instanceof ImTupleSelection) { diff --git a/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/LuaBackendAuditTests.java b/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/LuaBackendAuditTests.java index 2044833a1..7d0a3a15d 100644 --- a/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/LuaBackendAuditTests.java +++ b/de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/LuaBackendAuditTests.java @@ -199,6 +199,33 @@ public void tuplesAreScalarizedWithoutLuaAllocations() throws IOException { assertFalse("tuple arrays must be split into scalar arrays", compiled.contains("__wurst_arrIndex(")); } + @Test + public void tupleMemberArrayAssignmentCapturesIndex() throws IOException { + test().testLua(true).luaOnly(false).executeProg().lines( + "package Test", + "native testSuccess()", + "tuple pair(int first, int second)", + "constant SIZE = 10", + "class Container", + " pair array[SIZE] values", + " int used", + " function add(pair value)", + " values[used] = value", + " used++", + "init", + " let container = new Container()", + " container.add(pair(1, 2))", + " if container.used == 1 and container.values[0] == pair(1, 2)", + " testSuccess()" + ); + + String compiled = compiledLua("tupleMemberArrayAssignmentCapturesIndex"); + assertTrue("tuple member-array index must be captured into a declared Lua local", + compiled.contains("local tuple_lvalue_index = 0")); + assertTrue("tuple member-array index capture must survive dead-store elimination", + compiled.contains("tuple_lvalue_index = Container_used_storage[this]")); + } + @Test public void optimizedTupleCommonPathIsOnlyScalarCode() { String compiled = compileOptimizedLua(