From 301056e6c8b4e44322556b668915fa709dfd20ef Mon Sep 17 00:00:00 2001 From: kljnepk <275753263+kljnepk@users.noreply.github.com> Date: Mon, 13 Apr 2026 23:42:43 +0200 Subject: [PATCH 1/7] Update compiler.py Handle buffered include without context --- src/jinja2/compiler.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/jinja2/compiler.py b/src/jinja2/compiler.py index a4ff6a1b1..1f48e91ad 100644 --- a/src/jinja2/compiler.py +++ b/src/jinja2/compiler.py @@ -1092,7 +1092,11 @@ def loop_body() -> None: ) loop_body() else: - self.writeline("yield from template._get_default_module()._body_stream") + if frame.buffer is None: + self.writeline("yield from template._get_default_module()._body_stream") + else: + self.writeline("for event in template._get_default_module()._body_stream:") + loop_body() if node.ignore_missing: self.outdent() From a35473d76bef6f7af3706da25acfe42052bea537 Mon Sep 17 00:00:00 2001 From: kljnepk <275753263+kljnepk@users.noreply.github.com> Date: Mon, 13 Apr 2026 23:54:34 +0200 Subject: [PATCH 2/7] Update test_imports.py Add regression test for macro include --- tests/test_imports.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/test_imports.py b/tests/test_imports.py index b59fb49dd..7e61da464 100644 --- a/tests/test_imports.py +++ b/tests/test_imports.py @@ -195,6 +195,18 @@ def test_unoptimized_scopes(self, test_env): ) assert t.render().strip() == "(FOO)" + def test_include_without_context_inside_macro(self, test_env): + test_env.loader.mapping["included"] = "foo" + t = test_env.from_string( + """ + {%- macro foo() %} + {%- include "included" without context %} + {%- endmacro %} + {{- foo() -}} + """ + ) + assert t.render() == "foo" + def test_import_from_with_context(self): env = Environment( loader=DictLoader({"a": "{% macro x() %}{{ foobar }}{% endmacro %}"}) From 0db276e07d204adb8078dc3cfb261dff98f335a0 Mon Sep 17 00:00:00 2001 From: kljnepk <275753263+kljnepk@users.noreply.github.com> Date: Tue, 14 Apr 2026 00:59:42 +0200 Subject: [PATCH 3/7] Fix indentation in include buffering path --- src/jinja2/compiler.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/jinja2/compiler.py b/src/jinja2/compiler.py index 1f48e91ad..ce62b0886 100644 --- a/src/jinja2/compiler.py +++ b/src/jinja2/compiler.py @@ -1085,16 +1085,16 @@ def loop_body() -> None: self.writeline( f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" ) - elif self.environment.is_async: + elif self.environment.is_async: self.writeline( "for event in (await template._get_default_module_async())" "._body_stream:" ) loop_body() else: - if frame.buffer is None: + if frame.buffer is None: self.writeline("yield from template._get_default_module()._body_stream") - else: + else: self.writeline("for event in template._get_default_module()._body_stream:") loop_body() From 57b001ecaf92d294c5d9b3ac366753778ce4d62f Mon Sep 17 00:00:00 2001 From: kljnepk <275753263+kljnepk@users.noreply.github.com> Date: Tue, 14 Apr 2026 01:59:53 +0200 Subject: [PATCH 4/7] Rewrite include buffering block cleanly --- src/jinja2/compiler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jinja2/compiler.py b/src/jinja2/compiler.py index ce62b0886..783591ac2 100644 --- a/src/jinja2/compiler.py +++ b/src/jinja2/compiler.py @@ -1085,7 +1085,7 @@ def loop_body() -> None: self.writeline( f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" ) - elif self.environment.is_async: + elif self.environment.is_async: self.writeline( "for event in (await template._get_default_module_async())" "._body_stream:" @@ -1093,7 +1093,7 @@ def loop_body() -> None: loop_body() else: if frame.buffer is None: - self.writeline("yield from template._get_default_module()._body_stream") + self.writeline("yeld from template._get_default_module()._body_stream") else: self.writeline("for event in template._get_default_module()._body_stream:") loop_body() From 7efdbb9105ab20daefae0ca926155cbf4d7cb962 Mon Sep 17 00:00:00 2001 From: kljnepk <275753263+kljnepk@users.noreply.github.com> Date: Tue, 14 Apr 2026 02:25:45 +0200 Subject: [PATCH 5/7] Fix yield typo in include path --- src/jinja2/compiler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jinja2/compiler.py b/src/jinja2/compiler.py index 783591ac2..f7437f686 100644 --- a/src/jinja2/compiler.py +++ b/src/jinja2/compiler.py @@ -1093,7 +1093,7 @@ def loop_body() -> None: loop_body() else: if frame.buffer is None: - self.writeline("yeld from template._get_default_module()._body_stream") + self.writeline("yield from template._get_default_module()._body_stream") else: self.writeline("for event in template._get_default_module()._body_stream:") loop_body() From 52bec69f132d725fb14c5303009691f4f8c6197c Mon Sep 17 00:00:00 2001 From: kljnepk <275753263+kljnepk@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:33:07 +0200 Subject: [PATCH 6/7] Retype compiler block without hidden chars --- src/jinja2/compiler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jinja2/compiler.py b/src/jinja2/compiler.py index f7437f686..03c306828 100644 --- a/src/jinja2/compiler.py +++ b/src/jinja2/compiler.py @@ -1095,7 +1095,7 @@ def loop_body() -> None: if frame.buffer is None: self.writeline("yield from template._get_default_module()._body_stream") else: - self.writeline("for event in template._get_default_module()._body_stream:") + self.writeline ("for event in template._get_default_module()._body_stream:") loop_body() if node.ignore_missing: From 88d7e7bef85a8e3c3eb2ee2365f8df02bc8df132 Mon Sep 17 00:00:00 2001 From: kljnepk <275753263+kljnepk@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:45:16 +0200 Subject: [PATCH 7/7] Remove stray space in compiler call --- src/jinja2/compiler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jinja2/compiler.py b/src/jinja2/compiler.py index 03c306828..f7437f686 100644 --- a/src/jinja2/compiler.py +++ b/src/jinja2/compiler.py @@ -1095,7 +1095,7 @@ def loop_body() -> None: if frame.buffer is None: self.writeline("yield from template._get_default_module()._body_stream") else: - self.writeline ("for event in template._get_default_module()._body_stream:") + self.writeline("for event in template._get_default_module()._body_stream:") loop_body() if node.ignore_missing: