From c735ac67a0c84fd8b6fc692a57f1cd0327097a04 Mon Sep 17 00:00:00 2001 From: UnlegitDqrk Date: Mon, 2 Mar 2026 14:37:27 +0100 Subject: [PATCH] Fixed issue: #68 --- .../java/org/luaj/vm2/ast/NameResolver.class | Bin 0 -> 4556 bytes .../java/org/luaj/vm2/ast/NameResolver.java | 12 ++++++++- .../org/luaj/vm2/compiler/LuaParserTests.java | 25 ++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 jse/src/main/java/org/luaj/vm2/ast/NameResolver.class diff --git a/jse/src/main/java/org/luaj/vm2/ast/NameResolver.class b/jse/src/main/java/org/luaj/vm2/ast/NameResolver.class new file mode 100644 index 0000000000000000000000000000000000000000..ae329b113b6ad6c152b705de6b94c2db775a5311 GIT binary patch literal 4556 zcmaJ^>0eaW8Gg=i@y@_S&}3Y}1veN`61N&rTyR4XjaU>Dl`CA}>M(E+jP?uFq$?oZDZSXZLItlHgh_EMFm@HI7eJQU;KMi53keQ}1DaZSUXuRX71gYFY z1!j;+zXU{KdL9H?xURZY+|05tTigWu;(flC63nqM7xNVE?n=cvl5RZK?088x*4+?K z#b{GChOj`OR4Gi&fwGx88{(Z0N$evQ7NSO>%#9s!I+8n_WKX=a#ff&&$o?P}D;OT{ zBxLtkxED*9zfPyijWG$eRZU0ie!Dhm$GU4f|8^;oMg zK21UE6CSH24;-x}IS63Apx&UcAdgrM5)FT&M1PaQto+EEQ@u{Y?bsYogs>4S#m83h z(Wo%*c0RH?+QWA7&~#f5Tb$UahwW&#uoJsjbP^+v=}u=Zm2{)EO|F;J(b;XG1$z`q zZ;lSd@A5O9l~2c|RWR?p1LiCWjk!&dx}WWv6O~OT`sPZ&xk{oQv~U0iS>K6t>&vU% zPM4E#Vjax!vOF$<5=EliXp@#it*cZwg`oA3<(pSg`_lh?g+>Pg{{zI zd$#Af-LYOLmh{AWzlGyC!A9@Z(?DTjZl4SNhlT!0c4r>?WBHK3h(9XgkL8b+7GJMn z=xCk76DB@n;lon2xz#d8oPE!PdBu1VPnmey!bk8?veJWTv|MG1xeqhB+;SR4^y3yj zflu(;nRhB2A{F;S((lgdhNu~t+touAfXK5 zEIw!A^A^4!BxdIr(j@cax_-6;jJng1!-5Pwn`DwB8BX$6mAWy6j^Hcd^bQGI_(ok0flS z>*;g|yPsHiQ}+B4Jqx+B`CIQX{M5qF1W?HJQhk1$jD~n8!&TbEeUW4Ou#?y$J08`U z^^;O;#Zud**$YlPa=LiEjT|9fm;iNOz5_St!gJz30kkYbu6#W9aws1)N9qE zmUt@B;cRvV*#vo!IanT{ z+_21eH9FnKjn;d*k65rbwLvgbl9^4^mixAjp+MVOCbq;>+Yl;^_F+`|hUfEP^#Drb-NZ#B zsNE}`mS#K!bO0-v1Tg3Z7SYRM5~;;3+=B>~@MO1ZlT?+v@1xt`}=m6`=Jig)IPDd zZv+nvygHBKW__{f^^0^+$5?Eo@pMWf>3ONUL=g))}o zH1x15T_*Ghk8(%xIHGuw*Ds-$dvXk~AdcT~eFuFyeoIk&9gEaDbsd%b|2_<*b}LEl zIGydYia!V_wemd_UWcjP^9R-yKgSRHojRX@FI+>h#Q8!x&fm|BmXXY8c_j-xomdYh z�wHF}eL5E617O6B?L-Kxr8pf}bSxAQN=2-ym~XNZBfy99fvDp?1y&T|fWHx|yhZ z>LjD|2*>zIf`2qyHzBE;DU63y+ixk!uS1_!4V}pxF4LouoL(gdHndnCyRn=i_$R2z z&lO+u0QF?BjZysJj+zl%9l%r>w4A{;L-;Y57Z9vrH(#r{paIBkm4tDH^ V;q$*4a-Mt}f9L%m@Be|&{{b;2HsSyP literal 0 HcmV?d00001 diff --git a/jse/src/main/java/org/luaj/vm2/ast/NameResolver.java b/jse/src/main/java/org/luaj/vm2/ast/NameResolver.java index 73ea1ede..2c3f7df9 100644 --- a/jse/src/main/java/org/luaj/vm2/ast/NameResolver.java +++ b/jse/src/main/java/org/luaj/vm2/ast/NameResolver.java @@ -21,6 +21,7 @@ import org.luaj.vm2.ast.Stat.NumericFor; public class NameResolver extends Visitor { private NameScope scope = null; + private boolean injectMethodSelf; private void pushScope() { scope = new NameScope(scope); @@ -43,6 +44,9 @@ public class NameResolver extends Visitor { pushScope(); scope.functionNestingCount++; body.scope = scope; + if (injectMethodSelf) { + scope.define("self"); + } super.visit(body); popScope(); } @@ -76,7 +80,13 @@ public class NameResolver extends Visitor { public void visit(FuncDef stat) { stat.name.name.variable = resolveNameReference(stat.name.name); stat.name.name.variable.hasassignments = true; - super.visit(stat); + boolean previousInjectMethodSelf = injectMethodSelf; + injectMethodSelf = stat.name.method != null; + try { + super.visit(stat); + } finally { + injectMethodSelf = previousInjectMethodSelf; + } } public void visit(Assign stat) { diff --git a/jse/src/test/java/org/luaj/vm2/compiler/LuaParserTests.java b/jse/src/test/java/org/luaj/vm2/compiler/LuaParserTests.java index e09483a9..ecd863e5 100644 --- a/jse/src/test/java/org/luaj/vm2/compiler/LuaParserTests.java +++ b/jse/src/test/java/org/luaj/vm2/compiler/LuaParserTests.java @@ -1,5 +1,10 @@ package org.luaj.vm2.compiler; +import org.luaj.vm2.ast.Chunk; +import org.luaj.vm2.ast.Exp; +import org.luaj.vm2.ast.NameResolver; +import org.luaj.vm2.ast.Stat; +import org.luaj.vm2.ast.Variable; import org.luaj.vm2.LuaValue; import org.luaj.vm2.compiler.CompilerUnitTests; import org.luaj.vm2.parser.LuaParser; @@ -37,4 +42,24 @@ public class LuaParserTests extends CompilerUnitTests { fail(e.getMessage()); } } + + public void testMethodDefinitionInjectsHiddenSelf() { + try { + Reader r = new StringReader("function t:f() return self end"); + LuaParser parser = new LuaParser(r); + Chunk chunk = parser.Chunk(); + new NameResolver().visit(chunk); + + Stat.FuncDef stat = (Stat.FuncDef) chunk.block.stats.get(0); + Variable self = stat.body.scope.namedVariables.get("self"); + assertNotNull(self); + assertTrue(self.isLocal()); + + Stat.Return ret = (Stat.Return) stat.body.block.stats.get(0); + Exp.NameExp selfRef = (Exp.NameExp) ret.values.get(0); + assertSame(self, selfRef.name.variable); + } catch (Exception e) { + fail(e.getMessage()); + } + } }