aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2020-11-13 22:08:17 +0100
committerLibravatar Dirkjan Ochtman <dirkjan@ochtman.nl>2020-11-13 22:13:13 +0100
commit403a0b028d02ec72a637ed4a7bdda223ab5966f7 (patch)
treed00ae603c73c853a41db5bd636da6e038c2c0619
parentf23162a2080a3fb3fe2b8ba7eba4d61da5737dfe (diff)
downloadaskama-403a0b028d02ec72a637ed4a7bdda223ab5966f7.tar.gz
askama-403a0b028d02ec72a637ed4a7bdda223ab5966f7.tar.bz2
askama-403a0b028d02ec72a637ed4a7bdda223ab5966f7.zip
Correctly scope macro argument name bindings (fixes #382)
-rw-r--r--askama_shared/src/generator.rs15
1 files changed, 12 insertions, 3 deletions
diff --git a/askama_shared/src/generator.rs b/askama_shared/src/generator.rs
index cbf0d1a..a37ca7c 100644
--- a/askama_shared/src/generator.rs
+++ b/askama_shared/src/generator.rs
@@ -708,14 +708,23 @@ impl<'a, S: std::hash::BuildHasher> Generator<'a, S> {
buf.writeln("{")?;
self.prepare_ws(def.ws1);
+ let mut names = Buffer::new(0);
+ let mut values = Buffer::new(0);
for (i, arg) in def.args.iter().enumerate() {
- let expr_code = self.visit_expr_root(args.get(i).ok_or_else(|| {
+ if i > 0 {
+ names.write(", ");
+ values.write(", ");
+ }
+ names.write(arg);
+
+ values.write("&");
+ values.write(&self.visit_expr_root(args.get(i).ok_or_else(|| {
CompileError::String(format!("macro '{}' takes more than {} arguments", name, i))
- })?)?;
- buf.writeln(&format!("let {} = &{};", arg, expr_code))?;
+ })?)?);
self.locals.insert(arg);
}
+ buf.writeln(&format!("let ({}) = ({});", names.buf, values.buf))?;
let mut size_hint = self.handle(own_ctx, &def.nodes, buf, AstLevel::Nested)?;
self.flush_ws(def.ws2);