Skip to content

Commit b22008f

Browse files
authored
Fix null safe field access for pt?.sub.x, pt?.call() (#154)
1 parent 546d6fa commit b22008f

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

TestHScript.hx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,19 +141,27 @@ class TestHScript extends TestCase {
141141
}
142142

143143
function testNullFieldAccess():Void {
144-
var pt = {x : 10};
144+
var pt = {
145+
x : 10,
146+
call : function() { return 11; }
147+
};
145148
var vars = {
146149
ptnull : null,
147150
pt: pt,
148151
pt2null : {pt : null},
149152
pt2: {pt : pt}
150153
}
151154
assertScript("ptnull?.x", null, vars);
155+
assertScript("ptnull?.pt.x", null, vars);
156+
assertScript("ptnull?.call()", null, vars);
152157
assertScript("pt?.x", 10, vars);
158+
assertScript("pt?.call()", 11, vars);
153159
assertScript("pt2null?.pt", null, vars);
154160
assertScript("pt2null?.pt?.x", null, vars);
161+
assertScript("pt2null?.pt?.call()", null, vars);
155162
assertScript("pt2?.pt", pt, vars);
156163
assertScript("pt2?.pt?.x", 10, vars);
164+
assertScript("pt2?.pt?.call()", 11, vars);
157165
}
158166

159167
function testIsOperator():Void {

hscript/Parser.hx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -865,17 +865,18 @@ class Parser {
865865
var field = getIdent();
866866
return parseExprNext(mk(EField(e1,field),pmin(e1)));
867867
case TQuestionDot:
868-
var field = getIdent();
869868
var tmp = "__a_" + (uid++);
869+
push(TDot);
870+
var e2 = parseExprNext(mk(EIdent(tmp),pmin(e1),pmax(e1)));
870871
var e = mk(EBlock([
871872
mk(EVar(tmp, null, e1), pmin(e1), pmax(e1)),
872873
mk(ETernary(
873874
mk(EBinop("==", mk(EIdent(tmp),pmin(e1),pmax(e1)), mk(EIdent("null"),pmin(e1),pmax(e1)))),
874875
mk(EIdent("null"),pmin(e1),pmax(e1)),
875-
mk(EField(mk(EIdent(tmp),pmin(e1),pmax(e1)),field),pmin(e1))
876+
e2,
876877
))
877878
]),pmin(e1));
878-
return parseExprNext(e);
879+
return e;
879880
case TPOpen:
880881
return parseExprNext(mk(ECall(e1,parseExprList(TPClose)),pmin(e1)));
881882
case TBkOpen:

0 commit comments

Comments
 (0)