MCPcopy Create free account
hub / github.com/nodejs/node / visit_For

Method visit_For

deps/v8/third_party/jinja2/compiler.py:1157–1294  ·  view source on GitHub ↗
(self, node: nodes.For, frame: Frame)

Source from the content-addressed store, hash-verified

1155 )
1156
1157 def visit_For(self, node: nodes.For, frame: Frame) -> None:
1158 loop_frame = frame.inner()
1159 loop_frame.loop_frame = True
1160 test_frame = frame.inner()
1161 else_frame = frame.inner()
1162
1163 # try to figure out if we have an extended loop. An extended loop
1164 # is necessary if the loop is in recursive mode if the special loop
1165 # variable is accessed in the body if the body is a scoped block.
1166 extended_loop = (
1167 node.recursive
1168 or "loop"
1169 in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",))
1170 or any(block.scoped for block in node.find_all(nodes.Block))
1171 )
1172
1173 loop_ref = None
1174 if extended_loop:
1175 loop_ref = loop_frame.symbols.declare_parameter("loop")
1176
1177 loop_frame.symbols.analyze_node(node, for_branch="body")
1178 if node.else_:
1179 else_frame.symbols.analyze_node(node, for_branch="else")
1180
1181 if node.test:
1182 loop_filter_func = self.temporary_identifier()
1183 test_frame.symbols.analyze_node(node, for_branch="test")
1184 self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test)
1185 self.indent()
1186 self.enter_frame(test_frame)
1187 self.writeline(self.choose_async("async for ", "for "))
1188 self.visit(node.target, loop_frame)
1189 self.write(" in ")
1190 self.write(self.choose_async("auto_aiter(fiter)", "fiter"))
1191 self.write(":")
1192 self.indent()
1193 self.writeline("if ", node.test)
1194 self.visit(node.test, test_frame)
1195 self.write(":")
1196 self.indent()
1197 self.writeline("yield ")
1198 self.visit(node.target, loop_frame)
1199 self.outdent(3)
1200 self.leave_frame(test_frame, with_python_scope=True)
1201
1202 # if we don't have an recursive loop we have to find the shadowed
1203 # variables at that point. Because loops can be nested but the loop
1204 # variable is a special one we have to enforce aliasing for it.
1205 if node.recursive:
1206 self.writeline(
1207 f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node
1208 )
1209 self.indent()
1210 self.buffer(loop_frame)
1211
1212 # Use the same buffer for the else frame
1213 else_frame.buffer = loop_frame.buffer
1214

Callers

nothing calls this directly

Calls 15

temporary_identifierMethod · 0.95
writelineMethod · 0.95
funcMethod · 0.95
indentMethod · 0.95
enter_frameMethod · 0.95
choose_asyncMethod · 0.95
writeMethod · 0.95
outdentMethod · 0.95
leave_frameMethod · 0.95
bufferMethod · 0.95
failMethod · 0.95
blockvisitMethod · 0.95

Tested by

no test coverage detected