Skip to content

Commit 163da75

Browse files
committed
cleanup
1 parent 411048c commit 163da75

File tree

1 file changed

+27
-22
lines changed

1 file changed

+27
-22
lines changed

script/vm/runner.lua

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)