@@ -16,7 +16,7 @@ mt.index = 1
1616--- @field _hasSorted boolean
1717
1818--- @class vm.runner.step
19- --- @field type ' truly' | ' falsy' | ' add' | ' remove' | ' object' | ' save' | ' load' | ' merge'
19+ --- @field type ' truly' | ' falsy' | ' as ' | ' add' | ' remove' | ' object' | ' save' | ' load' | ' merge'
2020--- @field pos integer
2121--- @field order ? integer
2222--- @field node ? vm.node
@@ -39,9 +39,13 @@ function mt:_compileNarrowByFilter(filter, pos)
3939 return
4040 end
4141 if filter .type == ' unary' then
42- if filter .op and filter .op .type == ' not' then
42+ if not filter .op
43+ or not filter [1 ] then
44+ return
45+ end
46+ if filter .op .type == ' not' then
4347 local exp = filter [1 ]
44- if exp and exp .type == ' getlocal' and exp .node == self .loc then
48+ if exp .type == ' getlocal' and exp .node == self .loc then
4549 self .steps [# self .steps + 1 ] = {
4650 type = ' truly' ,
4751 pos = pos ,
@@ -55,6 +59,59 @@ function mt:_compileNarrowByFilter(filter, pos)
5559 end
5660 end
5761 elseif filter .type == ' binary' then
62+ if not filter .op
63+ or not filter [1 ]
64+ or not filter [2 ] then
65+ return
66+ end
67+ if filter .op .type == ' and' then
68+ self :_compileNarrowByFilter (filter [1 ], pos )
69+ self :_compileNarrowByFilter (filter [2 ], pos )
70+ end
71+ if filter .op .type == ' =='
72+ or filter .op .type == ' ~=' then
73+ local loc , exp
74+ for i = 1 , 2 do
75+ loc = filter [i ]
76+ if loc .type == ' getlocal' and loc .node == self .loc then
77+ exp = filter [i % 2 + 1 ]
78+ break
79+ end
80+ end
81+ if not loc then
82+ return
83+ end
84+ if exp .type == ' nil' then
85+ if filter .op .type == ' ==' then
86+ self .steps [# self .steps + 1 ] = {
87+ type = ' remove' ,
88+ name = ' nil' ,
89+ pos = pos ,
90+ order = 2 ,
91+ }
92+ self .steps [# self .steps + 1 ] = {
93+ type = ' as' ,
94+ name = ' nil' ,
95+ pos = pos ,
96+ order = 4 ,
97+ }
98+ end
99+ if filter .op .type == ' ~=' then
100+ self .steps [# self .steps + 1 ] = {
101+ type = ' as' ,
102+ name = ' nil' ,
103+ pos = pos ,
104+ order = 2 ,
105+ }
106+ self .steps [# self .steps + 1 ] = {
107+ type = ' remove' ,
108+ name = ' nil' ,
109+ pos = pos ,
110+ order = 4 ,
111+ }
112+ end
113+ end
114+ end
58115 else
59116 if filter .type == ' getlocal' and filter .node == self .loc then
60117 self .steps [# self .steps + 1 ] = {
@@ -193,6 +250,8 @@ function mt:launch(callback)
193250 node :setTruly ()
194251 elseif step .type == ' falsy' then
195252 node :setFalsy ()
253+ elseif step .type == ' as' then
254+ node = vm .createNode (globalMgr .getGlobal (' type' , step .name ))
196255 elseif step .type == ' add' then
197256 node :merge (globalMgr .getGlobal (' type' , step .name ))
198257 elseif step .type == ' remove' then
0 commit comments