@@ -265,19 +265,39 @@ def install0(genv)
265265 class ForNode < Node
266266 def initialize ( raw_node , lenv )
267267 super ( raw_node , lenv )
268- # XXX: tentative implementation
269- # raw_node.index
268+ @index = AST . create_target_node ( raw_node . index , lenv )
270269 @expr = AST . create_node ( raw_node . collection , lenv )
271270 @body = raw_node . statements ? AST . create_node ( raw_node . statements , lenv ) : DummyNilNode . new ( TypeProf ::CodeRange . new ( code_range . last , code_range . last ) , lenv )
272271 end
273272
274- attr_reader :expr , :body
273+ attr_reader :index , : expr, :body
275274
276- def subnodes = { expr :, body : }
275+ def subnodes = { index : , expr :, body : }
277276
278277 def install0 ( genv )
279278 @expr . install ( genv )
279+
280+ vars = [ ]
281+ @index . modified_vars ( @lenv . locals . keys , vars )
282+ @body . modified_vars ( @lenv . locals . keys , vars )
283+ vars . uniq!
284+
285+ old_vtxs = { }
286+ vars . each do |var |
287+ vtx = @lenv . get_var ( var )
288+ nvtx = vtx . new_vertex ( genv , self )
289+ old_vtxs [ var ] = nvtx
290+ @lenv . set_var ( var , nvtx )
291+ end
292+
293+ @index . install ( genv )
280294 @body . install ( genv )
295+
296+ vars . each do |var |
297+ @changes . add_edge ( genv , @lenv . get_var ( var ) , old_vtxs [ var ] )
298+ @lenv . set_var ( var , old_vtxs [ var ] )
299+ end
300+
281301 Source . new ( genv . nil_type )
282302 end
283303 end
0 commit comments