@@ -24,6 +24,7 @@ mt.index = 1
2424--- @field name ? string
2525--- @field tag ? string
2626--- @field copy ? boolean
27+ --- @field new ? boolean
2728--- @field ref1 ? vm.runner.step
2829--- @field ref2 ? vm.runner.step
2930
@@ -48,14 +49,10 @@ function mt:_compileNarrowByFilter(filter, outStep, blockStep)
4849 if filter .op .type == ' not' then
4950 local exp = filter [1 ]
5051 if exp .type == ' getlocal' and exp .node == self .loc then
51- self .steps [# self .steps + 1 ] = {
52- type = ' push' ,
53- copy = true ,
54- pos = filter .finish ,
55- }
5652 self .steps [# self .steps + 1 ] = {
5753 type = ' falsy' ,
5854 pos = filter .finish ,
55+ new = true ,
5956 }
6057 self .steps [# self .steps + 1 ] = {
6158 type = ' truthy' ,
@@ -113,11 +110,6 @@ function mt:_compileNarrowByFilter(filter, outStep, blockStep)
113110 end
114111 if guide .isLiteral (exp ) then
115112 if filter .op .type == ' ==' then
116- self .steps [# self .steps + 1 ] = {
117- type = ' push' ,
118- copy = true ,
119- pos = filter .finish ,
120- }
121113 self .steps [# self .steps + 1 ] = {
122114 type = ' remove' ,
123115 name = exp .type ,
@@ -128,14 +120,10 @@ function mt:_compileNarrowByFilter(filter, outStep, blockStep)
128120 type = ' as' ,
129121 name = exp .type ,
130122 pos = filter .finish ,
123+ new = true ,
131124 }
132125 end
133126 if filter .op .type == ' ~=' then
134- self .steps [# self .steps + 1 ] = {
135- type = ' push' ,
136- copy = true ,
137- pos = filter .finish ,
138- }
139127 self .steps [# self .steps + 1 ] = {
140128 type = ' as' ,
141129 name = exp .type ,
@@ -146,20 +134,17 @@ function mt:_compileNarrowByFilter(filter, outStep, blockStep)
146134 type = ' remove' ,
147135 name = exp .type ,
148136 pos = filter .finish ,
137+ new = true ,
149138 }
150139 end
151140 end
152141 end
153142 else
154143 if filter .type == ' getlocal' and filter .node == self .loc then
155- self .steps [# self .steps + 1 ] = {
156- type = ' push' ,
157- copy = true ,
158- pos = filter .finish ,
159- }
160144 self .steps [# self .steps + 1 ] = {
161145 type = ' truthy' ,
162146 pos = filter .finish ,
147+ new = true ,
163148 }
164149 self .steps [# self .steps + 1 ] = {
165150 type = ' falsy' ,
@@ -331,15 +316,35 @@ function mt:launch(callback)
331316 for _ , step in ipairs (self .steps ) do
332317 local node = step .ref1 and step .ref1 .node or topNode
333318 if step .type == ' truthy' then
319+ if step .new then
320+ node = node :copy ()
321+ topNode = node
322+ end
334323 node :setTruthy ()
335324 elseif step .type == ' falsy' then
325+ if step .new then
326+ node = node :copy ()
327+ topNode = node
328+ end
336329 node :setFalsy ()
337330 elseif step .type == ' as' then
338- node :clear ()
339- node :merge (globalMgr .getGlobal (' type' , step .name ))
331+ if step .new then
332+ topNode = vm .createNode (globalMgr .getGlobal (' type' , step .name ))
333+ else
334+ node :clear ()
335+ node :merge (globalMgr .getGlobal (' type' , step .name ))
336+ end
340337 elseif step .type == ' add' then
338+ if step .new then
339+ node = node :copy ()
340+ topNode = node
341+ end
341342 node :merge (globalMgr .getGlobal (' type' , step .name ))
342343 elseif step .type == ' remove' then
344+ if step .new then
345+ node = node :copy ()
346+ topNode = node
347+ end
343348 node :remove (step .name )
344349 elseif step .type == ' object' then
345350 topNode = callback (step .object , node ) or node
0 commit comments