From 5dff3e4f486a96ddde0db35b604db1df373d3363 Mon Sep 17 00:00:00 2001 From: Yuxiao Mao Date: Mon, 24 Nov 2025 14:20:21 +0100 Subject: [PATCH] Fix null safe field access for pt?.sub.x, pt?.call() --- TestHScript.hx | 10 +++++++++- hscript/Parser.hx | 7 ++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/TestHScript.hx b/TestHScript.hx index 6b1749f6..a3fddc7a 100644 --- a/TestHScript.hx +++ b/TestHScript.hx @@ -141,7 +141,10 @@ class TestHScript extends TestCase { } function testNullFieldAccess():Void { - var pt = {x : 10}; + var pt = { + x : 10, + call : function() { return 11; } + }; var vars = { ptnull : null, pt: pt, @@ -149,11 +152,16 @@ class TestHScript extends TestCase { pt2: {pt : pt} } assertScript("ptnull?.x", null, vars); + assertScript("ptnull?.pt.x", null, vars); + assertScript("ptnull?.call()", null, vars); assertScript("pt?.x", 10, vars); + assertScript("pt?.call()", 11, vars); assertScript("pt2null?.pt", null, vars); assertScript("pt2null?.pt?.x", null, vars); + assertScript("pt2null?.pt?.call()", null, vars); assertScript("pt2?.pt", pt, vars); assertScript("pt2?.pt?.x", 10, vars); + assertScript("pt2?.pt?.call()", 11, vars); } function testIsOperator():Void { diff --git a/hscript/Parser.hx b/hscript/Parser.hx index bf539f2e..42ed2b22 100644 --- a/hscript/Parser.hx +++ b/hscript/Parser.hx @@ -865,17 +865,18 @@ class Parser { var field = getIdent(); return parseExprNext(mk(EField(e1,field),pmin(e1))); case TQuestionDot: - var field = getIdent(); var tmp = "__a_" + (uid++); + push(TDot); + var e2 = parseExprNext(mk(EIdent(tmp),pmin(e1),pmax(e1))); var e = mk(EBlock([ mk(EVar(tmp, null, e1), pmin(e1), pmax(e1)), mk(ETernary( mk(EBinop("==", mk(EIdent(tmp),pmin(e1),pmax(e1)), mk(EIdent("null"),pmin(e1),pmax(e1)))), mk(EIdent("null"),pmin(e1),pmax(e1)), - mk(EField(mk(EIdent(tmp),pmin(e1),pmax(e1)),field),pmin(e1)) + e2, )) ]),pmin(e1)); - return parseExprNext(e); + return e; case TPOpen: return parseExprNext(mk(ECall(e1,parseExprList(TPClose)),pmin(e1))); case TBkOpen: