Home | History | Annotate | Download | only in jinja2

Lines Matching refs:frame

106         # frames or because they are special for the frame)
138 class Frame(object):
145 # a toplevel frame is the root + soft frames such as if conditions.
148 # the root frame is basically just the outermost frame, so no if
158 # this for example affects {% filter %} or {% macro %}. If a frame
169 # the parent of this frame
211 """Return an inner frame."""
212 return Frame(self.eval_ctx, self)
215 """Return a soft frame. A soft frame may not be modified as
216 standalone thing as it shares the resources with the frame it
217 was created of, but it's not a rootlevel frame any longer.
251 declared. This is different from the frame visitor as it will
272 """A visitor for `Frame.inspect`."""
430 def buffer(self, frame):
431 """Enable buffering for the frame from that point onwards."""
432 frame.buffer = self.temporary_identifier()
433 self.writeline('%s = []' % frame.buffer)
435 def return_buffer_contents(self, frame):
436 """Return the buffer contents of the frame."""
437 if frame.eval_ctx.volatile:
440 self.writeline('return Markup(concat(%s))' % frame.buffer)
444 self.writeline('return concat(%s)' % frame.buffer)
446 elif frame.eval_ctx.autoescape:
447 self.writeline('return Markup(concat(%s))' % frame.buffer)
449 self.writeline('return concat(%s)' % frame.buffer)
459 def start_write(self, frame, node=None):
460 """Yield or write into the frame buffer."""
461 if frame.buffer is None:
464 self.writeline('%s.append(' % frame.buffer, node)
466 def end_write(self, frame):
468 if frame.buffer is not None:
471 def simple_write(self, s, frame, node=None):
473 self.start_write(frame, node)
475 self.end_write(frame)
477 def blockvisit(self, nodes, frame):
478 """Visit a list of nodes as block in a frame. If the current frame
482 if frame.buffer is None:
488 self.visit(node, frame)
519 def signature(self, node, frame, extra_kwargs=None):
536 self.visit(arg, frame)
541 self.visit(kwarg, frame)
547 self.visit(node.dyn_args, frame)
556 self.visit(kwarg.value, frame)
563 self.visit(node.dyn_kwargs, frame)
570 self.visit(node.dyn_kwargs, frame)
572 def pull_locals(self, frame):
574 for name in frame.identifiers.undeclared:
590 def unoptimize_scope(self, frame):
591 """Disable Python optimizations for the frame."""
596 if frame.identifiers.declared:
599 ', '.join('l_' + name for name in frame.identifiers.declared)
602 def push_scope(self, frame, extra_vars=()):
610 `extra_vars` is passed to `Frame.find_shadowed`.
613 for name in frame.find_shadowed(extra_vars):
617 for name in frame.identifiers.declared_locally:
624 def pop_scope(self, aliases, frame):
629 for name in frame.identifiers.declared_locally:
638 def function_scoping(self, node, frame, children=None,
646 error message. Additionally the frame passed is modified so
649 This will return the modified frame.
655 func_frame = frame.inner()
675 # remove variables from a closure from the frame's undeclared
707 def macro_body(self, node, frame, children=None):
709 frame = self.function_scoping(node, frame, children)
711 frame.require_output_check = False
712 args = frame.arguments
718 # leaking into a new python frame and might be used both unassigned
720 if 'loop' in frame.identifiers.declared:
724 self.buffer(frame)
725 self.pull_locals(frame)
726 self.blockvisit(node.body, frame)
727 self.return_buffer_contents(frame)
729 return frame
731 def macro_def(self, node, frame):
740 self.visit(arg, frame)
743 bool(frame.accesses_kwargs),
744 bool(frame.accesses_varargs),
745 bool(frame.accesses_caller)
757 def visit_Template(self, node, frame=None):
758 assert frame is None, 'no root frame allowed'
800 frame = Frame(eval_ctx)
801 frame.inspect(node.body)
802 frame.toplevel = frame.rootlevel = True
803 frame.require_output_check = have_extends and not self.has_known_extends
808 frame.identifiers.add_special('self')
810 self.pull_locals(frame)
812 self.blockvisit(node.body, frame)
829 block_frame = Frame(eval_ctx)
856 def visit_Block(self, node, frame):
859 if frame.toplevel:
872 self.simple_write('event', frame)
875 def visit_Extends(self, node, frame):
877 if not frame.toplevel:
904 self.visit(node.template, frame)
916 if frame.rootlevel:
922 def visit_Include(self, node, frame):
925 self.unoptimize_scope(frame)
940 self.visit(node.template, frame)
959 self.simple_write('event', frame)
965 def visit_Import(self, node, frame):
968 self.unoptimize_scope(frame)
970 if frame.toplevel:
973 self.visit(node.template, frame)
979 if frame.toplevel and not node.target.startswith('_'):
981 frame.assigned_names.add(node.target)
983 def visit_FromImport(self, node, frame):
987 self.visit(node.template, frame)
1014 if frame.toplevel:
1018 frame.assigned_names.add(alias)
1036 def visit_For(self, node, frame):
1037 # when calculating the nodes for the inner frame we have to exclude
1041 loop_frame = self.function_scoping(node, frame, children,
1044 loop_frame = frame.inner()
1099 # "outer frame".
1156 self.start_write(frame, node)
1158 self.visit(node.iter, frame)
1160 self.end_write(frame)
1162 def visit_If(self, node, frame):
1163 if_frame = frame.soft()
1176 def visit_Macro(self, node, frame):
1177 macro_frame = self.macro_body(node, frame)
1179 if frame.toplevel:
1185 frame.assigned_names.add(node.name)
1187 def visit_CallBlock(self, node, frame):
1189 call_frame = self.macro_body(node, frame, children)
1192 self.start_write(frame, node)
1194 self.end_write(frame)
1196 def visit_FilterBlock(self, node, frame):
1197 filter_frame = frame.inner()
1203 self.start_write(frame, node)
1205 self.end_write(frame)
1208 def visit_ExprStmt(self, node, frame):
1210 self.visit(node.node, frame)
1212 def visit_Output(self, node, frame):
1215 if self.has_known_extends and frame.require_output_check:
1223 # if we are inside a frame that requires output checking, we do so
1225 if frame.require_output_check:
1235 const = child.as_const(frame.eval_ctx)
1239 # the frame can't be volatile here, becaus otherwise the
1243 if frame.eval_ctx.autoescape:
1260 if len(body) < 3 or frame.buffer is not None:
1261 if frame.buffer is not None:
1264 self.writeline('%s.append(' % frame.buffer)
1266 self.writeline('%s.extend((' % frame.buffer)
1271 if frame.buffer is None:
1276 if frame.buffer is None:
1281 if frame.eval_ctx.volatile:
1284 elif frame.eval_ctx.autoescape:
1291 self.visit(item, frame)
1293 if frame.buffer is not None:
1295 if frame.buffer is not None:
1317 if frame.eval_ctx.volatile:
1321 elif frame.eval_ctx.autoescape:
1327 self.visit(argument, frame)
1335 def visit_Assign(self, node, frame):
1338 # the current template's context. We create a copy of the frame
1341 if frame.toplevel:
1342 assignment_frame = frame.copy()
1345 assignment_frame = frame
1348 self.visit(node.node, frame)
1351 if frame.toplevel:
1374 def visit_Name(self, node, frame):
1375 if node.ctx == 'store' and frame.toplevel:
1376 frame.toplevel_assignments.add(node.name)
1378 frame.assigned_names.add(node.name)
1380 def visit_Const(self, node, frame):
1387 def visit_TemplateData(self, node, frame):
1389 self.write(repr(node.as_const(frame.eval_ctx)))
1394 def visit_Tuple(self, node, frame):
1400 self.visit(item, frame)
1403 def visit_List(self, node, frame):
1408 self.visit(item, frame)
1411 def visit_Dict(self, node, frame):
1416 self.visit(item.key, frame)
1418 self.visit(item.value, frame)
1422 def visitor(self, node, frame):
1426 self.visit(node.left, frame)
1428 self.visit(node.right, frame)
1431 self.visit(node.left, frame)
1433 self.visit(node.right, frame)
1438 def visitor(self, node, frame):
1442 self.visit(node.node, frame)
1445 self.visit(node.node, frame)
1463 def visit_Concat(self, node, frame):
1464 if frame.eval_ctx.volatile:
1467 elif frame.eval_ctx.autoescape:
1473 self.visit(arg, frame)
1477 def visit_Compare(self, node, frame):
1478 self.visit(node.expr, frame)
1480 self.visit(op, frame)
1482 def visit_Operand(self, node, frame):
1484 self.visit(node.expr, frame)
1486 def visit_Getattr(self, node, frame):
1488 self.visit(node.node, frame)
1491 def visit_Getitem(self, node, frame):
1494 self.visit(node.node, frame)
1496 self.visit(node.arg, frame)
1500 self.visit(node.node, frame)
1502 self.visit(node.arg, frame)
1505 def visit_Slice(self, node, frame):
1507 self.visit(node.start, frame)
1510 self.visit(node.stop, frame)
1513 self.visit(node.step, frame)
1515 def visit_Filter(self, node, frame):
1530 self.visit(node.node, frame)
1531 elif frame.eval_ctx.volatile:
1534 (frame.buffer, frame.buffer))
1535 elif frame.eval_ctx.autoescape:
1536 self.write('Markup(concat(%s))' % frame.buffer)
1538 self.write('concat(%s)' % frame.buffer)
1539 self.signature(node, frame)
1542 def visit_Test(self, node, frame):
1546 self.visit(node.node, frame)
1547 self.signature(node, frame)
1550 def visit_CondExpr(self, node, frame):
1553 return self.visit(node.expr2, frame)
1559 self.visit(node.expr1, frame)
1561 self.visit(node.test, frame)
1566 def visit_Call(self, node, frame, forward_caller=False):
1571 self.visit(node.node, frame)
1573 self.signature(node, frame, extra_kwargs)
1576 def visit_Keyword(self, node, frame):
1578 self.visit(node.value, frame)
1582 def visit_MarkSafe(self, node, frame):
1584 self.visit(node.expr, frame)
1587 def visit_MarkSafeIfAutoescape(self, node, frame):
1589 self.visit(node.expr, frame)
1592 def visit_EnvironmentAttribute(self, node, frame):
1595 def visit_ExtensionAttribute(self, node, frame):
1598 def visit_ImportedName(self, node, frame):
1601 def visit_InternalName(self, node, frame):
1604 def visit_ContextReference(self, node, frame):
1607 def visit_Continue(self, node, frame):
1610 def visit_Break(self, node, frame):
1613 def visit_Scope(self, node, frame):
1614 scope_frame = frame.inner()
1621 def visit_EvalContextModifier(self, node, frame):
1624 self.visit(keyword.value, frame)
1626 val = keyword.value.as_const(frame.eval_ctx)
1628 frame.eval_ctx.volatile = True
1630 setattr(frame.eval_ctx, keyword.key, val)
1632 def visit_ScopedEvalContextModifier(self, node, frame):
1634 safed_ctx = frame.eval_ctx.save()
1636 self.visit_EvalContextModifier(node, frame)
1638 self.visit(child, frame)
1639 frame.eval_ctx.revert(safed_ctx)