Lines Matching full:frame
36 def new_func(self, node, frame, **kwargs): argument
37 # Only optimize if the frame is not volatile
38 if self.optimized and not frame.eval_ctx.volatile:
39 new_node = self.optimizer.visit(node, frame.eval_ctx)
41 return self.visit(new_node, frame)
42 return f(self, node, frame, **kwargs)
99 class Frame: class
106 # a toplevel frame is the root + soft frames such as if conditions.
109 # the root frame is basically just the outermost frame, so no if
119 # this for example affects {% filter %} or {% macro %}. If a frame
127 # the parent of this frame
141 """Return an inner frame."""
143 return Frame(self.eval_ctx, level=self.symbols.level + 1)
144 return Frame(self.eval_ctx, self)
147 """Return a soft frame. A soft frame may not be modified as
148 standalone thing as it shares the resources with the frame it
149 was created of, but it's not a rootlevel frame any longer.
185 declared. This is different from the frame visitor as it will
290 def buffer(self, frame): argument
291 """Enable buffering for the frame from that point onwards."""
292 frame.buffer = self.temporary_identifier()
293 self.writeline(f"{frame.buffer} = []")
295 def return_buffer_contents(self, frame, force_unescaped=False): argument
296 """Return the buffer contents of the frame."""
298 if frame.eval_ctx.volatile:
301 self.writeline(f"return Markup(concat({frame.buffer}))")
305 self.writeline(f"return concat({frame.buffer})")
308 elif frame.eval_ctx.autoescape:
309 self.writeline(f"return Markup(concat({frame.buffer}))")
311 self.writeline(f"return concat({frame.buffer})")
321 def start_write(self, frame, node=None): argument
322 """Yield or write into the frame buffer."""
323 if frame.buffer is None:
326 self.writeline(f"{frame.buffer}.append(", node)
328 def end_write(self, frame): argument
330 if frame.buffer is not None:
333 def simple_write(self, s, frame, node=None): argument
335 self.start_write(frame, node)
337 self.end_write(frame)
339 def blockvisit(self, nodes, frame): argument
340 """Visit a list of nodes as block in a frame. If the current frame
346 self.visit(node, frame)
376 def signature(self, node, frame, extra_kwargs=None): argument
393 self.visit(arg, frame)
398 self.visit(kwarg, frame)
404 self.visit(node.dyn_args, frame)
413 self.visit(kwarg.value, frame)
420 self.visit(node.dyn_kwargs, frame)
427 self.visit(node.dyn_kwargs, frame)
441 def enter_frame(self, frame): argument
443 for target, (action, param) in frame.symbols.loads.items():
457 def leave_frame(self, frame, with_python_scope=False): argument
460 for target in frame.symbols.loads:
470 def macro_body(self, node, frame): argument
472 frame = frame.inner()
473 frame.symbols.analyze_node(node)
484 args.append(frame.symbols.ref(arg.name))
506 args.append(frame.symbols.declare_parameter("caller"))
509 args.append(frame.symbols.declare_parameter("kwargs"))
512 args.append(frame.symbols.declare_parameter("varargs"))
516 frame.require_output_check = False
517 frame.symbols.analyze_node(node)
521 self.buffer(frame)
522 self.enter_frame(frame)
524 self.push_parameter_definitions(frame)
526 ref = frame.symbols.ref(arg.name)
538 self.visit(default, frame)
543 self.blockvisit(node.body, frame)
544 self.return_buffer_contents(frame, force_unescaped=True)
545 self.leave_frame(frame, with_python_scope=True)
548 return frame, macro_ref
550 def macro_def(self, macro_ref, frame): argument
569 def dump_local_context(self, frame): argument
572 for name, target in frame.symbols.dump_stores().items()
588 def push_parameter_definitions(self, frame): argument
589 """Pushes all parameter targets from the given frame into a local
595 self._param_def_block.append(frame.symbols.dump_param_targets())
623 def derive_context(self, frame): argument
624 return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})"
636 def pop_assign_tracking(self, frame): argument
641 if not frame.toplevel or not vars:
646 ref = frame.symbols.ref(name)
653 ref = frame.symbols.ref(name)
665 def visit_Template(self, node, frame=None): argument
666 assert frame is None, "no root frame allowed"
716 frame = Frame(eval_ctx)
718 ref = frame.symbols.declare_parameter("self")
720 frame.symbols.analyze_node(node)
721 frame.toplevel = frame.rootlevel = True
722 frame.require_output_check = have_extends and not self.has_known_extends
725 self.enter_frame(frame)
727 self.blockvisit(node.body, frame)
728 self.leave_frame(frame, with_python_scope=True)
758 # It's important that we do not make this frame a child of the
761 block_frame = Frame(eval_ctx)
782 def visit_Block(self, node, frame): argument
785 if frame.toplevel:
796 context = self.derive_context(frame)
800 if not self.environment.is_async and frame.buffer is None:
810 self.simple_write("event", frame)
815 def visit_Extends(self, node, frame): argument
817 if not frame.toplevel:
842 self.visit(node.template, frame)
852 if frame.rootlevel:
858 def visit_Include(self, node, frame): argument
874 self.visit(node.template, frame)
891 f" {self.dump_local_context(frame)})):"
904 self.simple_write("event", frame)
910 def visit_Import(self, node, frame): argument
912 self.writeline(f"{frame.symbols.ref(node.target)} = ", node)
913 if frame.toplevel:
918 self.visit(node.template, frame)
923 f"{func}(context.get_all(), True, {self.dump_local_context(frame)})"
929 if frame.toplevel and not node.target.startswith("_"):
932 def visit_FromImport(self, node, frame): argument
937 self.visit(node.template, frame)
942 f"{func}(context.get_all(), True, {self.dump_local_context(frame)})"
957 f"{frame.symbols.ref(alias)} ="
960 self.writeline(f"if {frame.symbols.ref(alias)} is missing:")
968 f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})"
971 if frame.toplevel:
979 self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}")
982 f"{name!r}: {frame.symbols.ref(name)}" for name in var_names
994 def visit_For(self, node, frame): argument
995 loop_frame = frame.inner()
996 test_frame = frame.inner()
997 else_frame = frame.inner()
1045 # Use the same buffer for the else frame
1079 self.visit(node.iter, frame)
1114 self.start_write(frame, node)
1120 self.visit(node.iter, frame)
1124 self.end_write(frame)
1126 def visit_If(self, node, frame): argument
1127 if_frame = frame.soft()
1147 def visit_Macro(self, node, frame): argument
1148 macro_frame, macro_ref = self.macro_body(node, frame)
1150 if frame.toplevel:
1154 self.write(f"{frame.symbols.ref(node.name)} = ")
1157 def visit_CallBlock(self, node, frame): argument
1158 call_frame, macro_ref = self.macro_body(node, frame)
1161 self.start_write(frame, node)
1162 self.visit_Call(node.call, frame, forward_caller=True)
1163 self.end_write(frame)
1165 def visit_FilterBlock(self, node, frame): argument
1166 filter_frame = frame.inner()
1171 self.start_write(frame, node)
1173 self.end_write(frame)
1176 def visit_With(self, node, frame): argument
1177 with_frame = frame.inner()
1184 self.visit(expr, frame)
1188 def visit_ExprStmt(self, node, frame): argument
1190 self.visit(node.node, frame)
1247 def _output_child_to_const(self, node, frame, finalize): argument
1255 const = node.as_const(frame.eval_ctx)
1257 if frame.eval_ctx.autoescape:
1266 def _output_child_pre(self, node, frame, finalize): argument
1270 if frame.eval_ctx.volatile:
1272 elif frame.eval_ctx.autoescape:
1280 def _output_child_post(self, node, frame, finalize): argument
1289 def visit_Output(self, node, frame): argument
1291 if frame.require_output_check:
1317 const = self._output_child_to_const(child, frame, finalize)
1330 if frame.buffer is not None:
1332 self.writeline(f"{frame.buffer}.append(")
1334 self.writeline(f"{frame.buffer}.extend((")
1343 if frame.buffer is None:
1348 if frame.buffer is None:
1354 self._output_child_pre(item, frame, finalize)
1355 self.visit(item, frame)
1356 self._output_child_post(item, frame, finalize)
1358 if frame.buffer is not None:
1361 if frame.buffer is not None:
1365 if frame.require_output_check:
1368 def visit_Assign(self, node, frame): argument
1371 self.visit(node.target, frame)
1373 self.visit(node.node, frame)
1374 self.pop_assign_tracking(frame)
1376 def visit_AssignBlock(self, node, frame): argument
1378 block_frame = frame.inner()
1388 self.visit(node.target, frame)
1395 self.pop_assign_tracking(frame)
1400 def visit_Name(self, node, frame): argument
1401 if node.ctx == "store" and frame.toplevel:
1404 ref = frame.symbols.ref(node.name)
1410 load = frame.symbols.find_load(ref)
1423 def visit_NSRef(self, node, frame): argument
1427 ref = frame.symbols.ref(node.name)
1437 def visit_Const(self, node, frame): argument
1438 val = node.as_const(frame.eval_ctx)
1444 def visit_TemplateData(self, node, frame): argument
1446 self.write(repr(node.as_const(frame.eval_ctx)))
1452 def visit_Tuple(self, node, frame): argument
1458 self.visit(item, frame)
1461 def visit_List(self, node, frame): argument
1466 self.visit(item, frame)
1469 def visit_Dict(self, node, frame): argument
1474 self.visit(item.key, frame)
1476 self.visit(item.value, frame)
1481 def visitor(self, node, frame): argument
1487 self.visit(node.left, frame)
1489 self.visit(node.right, frame)
1492 self.visit(node.left, frame)
1494 self.visit(node.right, frame)
1501 def visitor(self, node, frame): argument
1507 self.visit(node.node, frame)
1510 self.visit(node.node, frame)
1530 def visit_Concat(self, node, frame): argument
1531 if frame.eval_ctx.volatile:
1533 elif frame.eval_ctx.autoescape:
1539 self.visit(arg, frame)
1544 def visit_Compare(self, node, frame): argument
1546 self.visit(node.expr, frame)
1548 self.visit(op, frame)
1551 def visit_Operand(self, node, frame): argument
1553 self.visit(node.expr, frame)
1556 def visit_Getattr(self, node, frame): argument
1561 self.visit(node.node, frame)
1568 def visit_Getitem(self, node, frame): argument
1571 self.visit(node.node, frame)
1573 self.visit(node.arg, frame)
1580 self.visit(node.node, frame)
1582 self.visit(node.arg, frame)
1588 def visit_Slice(self, node, frame): argument
1590 self.visit(node.start, frame)
1593 self.visit(node.stop, frame)
1596 self.visit(node.step, frame)
1599 def visit_Filter(self, node, frame): argument
1616 self.visit(node.node, frame)
1617 elif frame.eval_ctx.volatile:
1619 f"(Markup(concat({frame.buffer}))"
1620 f" if context.eval_ctx.autoescape else concat({frame.buffer}))"
1622 elif frame.eval_ctx.autoescape:
1623 self.write(f"Markup(concat({frame.buffer}))")
1625 self.write(f"concat({frame.buffer})")
1626 self.signature(node, frame)
1632 def visit_Test(self, node, frame): argument
1636 self.visit(node.node, frame)
1637 self.signature(node, frame)
1641 def visit_CondExpr(self, node, frame): argument
1644 return self.visit(node.expr2, frame)
1652 self.visit(node.expr1, frame)
1654 self.visit(node.test, frame)
1660 def visit_Call(self, node, frame, forward_caller=False): argument
1667 self.visit(node.node, frame)
1669 self.signature(node, frame, extra_kwargs)
1674 def visit_Keyword(self, node, frame): argument
1676 self.visit(node.value, frame)
1680 def visit_MarkSafe(self, node, frame): argument
1682 self.visit(node.expr, frame)
1685 def visit_MarkSafeIfAutoescape(self, node, frame): argument
1687 self.visit(node.expr, frame)
1690 def visit_EnvironmentAttribute(self, node, frame): argument
1693 def visit_ExtensionAttribute(self, node, frame): argument
1696 def visit_ImportedName(self, node, frame): argument
1699 def visit_InternalName(self, node, frame): argument
1702 def visit_ContextReference(self, node, frame): argument
1705 def visit_DerivedContextReference(self, node, frame): argument
1706 self.write(self.derive_context(frame))
1708 def visit_Continue(self, node, frame): argument
1711 def visit_Break(self, node, frame): argument
1714 def visit_Scope(self, node, frame): argument
1715 scope_frame = frame.inner()
1721 def visit_OverlayScope(self, node, frame): argument
1723 self.writeline(f"{ctx} = {self.derive_context(frame)}")
1725 self.visit(node.context, frame)
1728 scope_frame = frame.inner(isolated=True)
1735 def visit_EvalContextModifier(self, node, frame): argument
1738 self.visit(keyword.value, frame)
1740 val = keyword.value.as_const(frame.eval_ctx)
1742 frame.eval_ctx.volatile = True
1744 setattr(frame.eval_ctx, keyword.key, val)
1746 def visit_ScopedEvalContextModifier(self, node, frame): argument
1748 saved_ctx = frame.eval_ctx.save()
1750 self.visit_EvalContextModifier(node, frame)
1752 self.visit(child, frame)
1753 frame.eval_ctx.revert(saved_ctx)