From dce256cf4051b595c9cc25363738d46b948e10ef Mon Sep 17 00:00:00 2001 From: Xuan Son Nguyen Date: Fri, 2 Jan 2026 11:50:48 +0100 Subject: [PATCH] fix crash on macro kwargs --- common/jinja/jinja-vm.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/common/jinja/jinja-vm.cpp b/common/jinja/jinja-vm.cpp index 4df50c5132..076e041ef4 100644 --- a/common/jinja/jinja-vm.cpp +++ b/common/jinja/jinja-vm.cpp @@ -565,9 +565,20 @@ value macro_statement::execute_impl(context & ctx) { // bind parameters for (size_t i = 0; i < expected_count; ++i) { if (i < input_count) { - std::string param_name = cast_stmt(this->args[i])->val; - JJ_DEBUG(" Binding parameter '%s' to argument of type %s", param_name.c_str(), args.args[i]->type().c_str()); - macro_ctx.set_val(param_name, args.args[i]); + if (is_stmt(this->args[i])) { + // normal parameter + std::string param_name = cast_stmt(this->args[i])->val; + JJ_DEBUG(" Binding parameter '%s' to argument of type %s", param_name.c_str(), args.args[i]->type().c_str()); + macro_ctx.set_val(param_name, args.args[i]); + } else if (is_stmt(this->args[i])) { + // default argument used as normal parameter + auto kwarg = cast_stmt(this->args[i]); + std::string param_name = cast_stmt(kwarg->key)->val; + JJ_DEBUG(" Binding parameter '%s' to argument of type %s", param_name.c_str(), args.args[i]->type().c_str()); + macro_ctx.set_val(param_name, args.args[i]); + } else { + throw std::runtime_error("Invalid parameter type in macro '" + name + "'"); + } } else { auto & default_arg = this->args[i]; if (is_stmt(default_arg)) {