Following code generates non-deterministic compiled output.
from jinja2 import loaders
from jinja2.environment import Environment
env = Environment(loader=loaders.DictLoader({"foo": """
{% import "bar" as bar with context %}
{% import "baz" as baz with context %}
"""}))
env.compile_templates('archive', zip=None, ignore_errors=False)
from __future__ import generator_stop
from jinja2.runtime import LoopContext, Macro, Markup, Namespace, TemplateNotFound, TemplateReference, TemplateRuntimeError, Undefined, concat, escape, identity, internalcode, markup_join, missing, str_join
name = 'foo'
def root(context, missing=missing):
resolve = context.resolve_or_missing
undefined = environment.undefined
cond_expr_undefined = Undefined
if 0: yield None
l_0_bar = l_0_baz = missing
pass
yield '\n'
- l_0_bar = context.vars['bar'] = environment.get_template('bar', 'foo').make_module(context.get_all(), True, {'bar': l_0_bar, 'baz': l_0_baz})
+ l_0_bar = context.vars['bar'] = environment.get_template('bar', 'foo').make_module(context.get_all(), True, {'baz': l_0_baz, 'bar': l_0_bar})
context.exported_vars.discard('bar')
yield '\n'
- l_0_baz = context.vars['baz'] = environment.get_template('baz', 'foo').make_module(context.get_all(), True, {'bar': l_0_bar, 'baz': l_0_baz})
+ l_0_baz = context.vars['baz'] = environment.get_template('baz', 'foo').make_module(context.get_all(), True, {'baz': l_0_baz, 'bar': l_0_bar})
context.exported_vars.discard('baz')
blocks = {}
debug_info = '2=13&3=16'
Chromium uses jinja2 for code generator during build, and this breaks Reproducible builds when we are switching to python3.
Some more context is in https://crbug.com/1194274
Environment:
- Python version:
Python 3.9.2
- Jinja version:
3.0.1
Following code generates non-deterministic compiled output.
from __future__ import generator_stop from jinja2.runtime import LoopContext, Macro, Markup, Namespace, TemplateNotFound, TemplateReference, TemplateRuntimeError, Undefined, concat, escape, identity, internalcode, markup_join, missing, str_join name = 'foo' def root(context, missing=missing): resolve = context.resolve_or_missing undefined = environment.undefined cond_expr_undefined = Undefined if 0: yield None l_0_bar = l_0_baz = missing pass yield '\n' - l_0_bar = context.vars['bar'] = environment.get_template('bar', 'foo').make_module(context.get_all(), True, {'bar': l_0_bar, 'baz': l_0_baz}) + l_0_bar = context.vars['bar'] = environment.get_template('bar', 'foo').make_module(context.get_all(), True, {'baz': l_0_baz, 'bar': l_0_bar}) context.exported_vars.discard('bar') yield '\n' - l_0_baz = context.vars['baz'] = environment.get_template('baz', 'foo').make_module(context.get_all(), True, {'bar': l_0_bar, 'baz': l_0_baz}) + l_0_baz = context.vars['baz'] = environment.get_template('baz', 'foo').make_module(context.get_all(), True, {'baz': l_0_baz, 'bar': l_0_bar}) context.exported_vars.discard('baz') blocks = {} debug_info = '2=13&3=16'Chromium uses jinja2 for code generator during build, and this breaks Reproducible builds when we are switching to python3.
Some more context is in https://crbug.com/1194274
Environment:
Python 3.9.23.0.1