There was a bug that came as the result of an early optimization done
within ID tracking that caused loading parameters to fail in a very
specific and rare edge case. That edge case only occurred when the
parameter was being set within all 3 standard branches of an if block,
since the optimization would assume that the parameter was never being
referenced and was only ever being set. This would cause the variable to
be set to undefined.
The fix for this was to remove the optimization and still continue to
load in the parameter even if it is set in all 3 branches.
This fixes a bug that existed because namespaces within `{% set %}`
were treated as a special case. This special case had the side-effect
of bypassing the code which allows for tuples to be assigned to.
The solution was to make tuple handling (and by extension, primary token
handling) aware of namespaces so that namespace tokens can be handled
appropriately. This is handled in a backwards-compatible way which
ensures that we do not try to parse namespace tokens when we otherwise
would be expecting to parse out name tokens with attributes.
Namespace instance checks are moved earlier, and deduplicated, so that
all checks are done before the assignment. Otherwise, the check could be
emitted in the middle of the tuple.
This fixes a regression in commit 60293416db that
changed the `__hash__` implementation of Node from the default pointer
hash, to a hash based on the node fields.
Since these fields contains list objects, they are not hashable, making
every call to `Node.__hash__` fail.
This breaks some third-party usage such as in `django-compressor`
(See: https://github.com/django-compressor/django-compressor/issues/1060)
This changed reverts the hash method back to using `object.__hash__` as
the hash implementation.
Fixes https://github.com/pallets/jinja/issues/1526
Before:
File ".../broken.html", line 2, in <module>
{{ fail() }}
File ".../test_debug.py", line 32, in <lambda>
tmpl.render(fail=lambda: 1 / 0)
ZeroDivisionError: division by zero
After:
File ".../broken.html", line 2, in <module>
{{ fail() }}
^^^^^^^^^^^^
File ".../test_debug.py", line 32, in <lambda>
tmpl.render(fail=lambda: 1 / 0)
~~^~~
ZeroDivisionError: division by zero