@@ -13,6 +13,7 @@ local util = require 'utility'
1313--- @field mode tracer.mode
1414--- @field name string
1515--- @field source parser.object
16+ --- @field variable vm.variable
1617--- @field assigns parser.object[]
1718--- @field assignMap table<parser.object , true>
1819--- @field getMap table<parser.object , true>
@@ -94,10 +95,7 @@ function mt:collectLocal()
9495 local startPos = self .source .start
9596 local finishPos = 0
9697
97- self .assigns [# self .assigns + 1 ] = self .source
98- self .assignMap [self .source ] = true
99-
100- local variable = vm .getVariableInfoByCodeName (self .source , self .name )
98+ local variable = self .variable
10199
102100 assert (variable )
103101
@@ -131,6 +129,10 @@ function mt:collectLocal()
131129 if # self .casts > 0 then
132130 self .fastCalc = false
133131 end
132+
133+ if variable ~= vm .getVariable (self .source ) then
134+ self .fastCalc = false
135+ end
134136end
135137
136138function mt :collectGlobal ()
171173--- @param finish integer
172174--- @return parser.object ?
173175function mt :getLastAssign (start , finish )
174- local assign = self . assigns [ 1 ]
176+ local assign
175177 for _ , obj in ipairs (self .assigns ) do
178+ if obj .type == ' local'
179+ or obj .type == ' self' then
180+ assign = obj
181+ break
182+ end
176183 if obj .start < start then
177184 goto CONTINUE
178185 end
742749function mt :calcNode (source )
743750 if self .getMap [source ] then
744751 local lastAssign = self :getLastAssign (0 , source .finish )
745- assert (lastAssign )
752+ if not lastAssign then
753+ return
754+ end
746755 if self .fastCalc then
747756 self .nodes [source ] = vm .compileNode (lastAssign )
748757 return
783792--- @param mode tracer.mode
784793--- @param source parser.object
785794--- @param name string
795+ --- @param variable vm.variable ?
786796--- @return vm.tracer ?
787- local function createTracer (mode , source , name )
788- local node = vm .compileNode (source )
797+ local function createTracer (mode , source , name , variable )
798+ local node = vm .compileNode (variable or source )
789799 local tracer = node ._tracer
790800 if tracer then
791801 return tracer
@@ -796,6 +806,7 @@ local function createTracer(mode, source, name)
796806 end
797807 tracer = setmetatable ({
798808 source = source ,
809+ variable = variable ,
799810 mode = mode ,
800811 name = name ,
801812 assigns = {},
@@ -806,7 +817,7 @@ local function createTracer(mode, source, name)
806817 casts = {},
807818 nodes = {},
808819 main = main ,
809- uri = guide .getUri (source ),
820+ uri = guide .getUri (main ),
810821 }, mt )
811822 node ._tracer = tracer
812823
822833--- @param source parser.object
823834--- @return vm.node ?
824835function vm .traceNode (source )
825- local mode , base , name
836+ local mode , base , name , variable
826837 if vm .getGlobalNode (source ) then
827838 base = vm .getGlobalBase (source )
828839 if not base then
@@ -831,15 +842,15 @@ function vm.traceNode(source)
831842 mode = ' global'
832843 name = base .global :getCodeName ()
833844 else
834- local variable = vm .getVariable (source )
845+ variable = vm .getVariable (source )
835846 if not variable then
836847 return nil
837848 end
838- base = variable . base
849+ base = variable : getBase ()
839850 name = variable :getCodeName ()
840851 mode = ' local'
841852 end
842- local tracer = createTracer (mode , base , name )
853+ local tracer = createTracer (mode , base , name , variable )
843854 if not tracer then
844855 return nil
845856 end
0 commit comments