xlat_exp_insert_tail(unary->call.args, node);
xlat_flags_merge(&unary->flags, &unary->call.args->flags);
- unary->flags.can_purify = unary->call.func->flags.pure && unary->call.args->flags.pure;
+ unary->flags.can_purify = (unary->call.func->flags.pure && unary->call.args->flags.pure) | unary->call.args->flags.can_purify;
/*
* Don't add it to head->flags, that will be done when it's actually inserted.
fr_assert(xlat_exp_head(node->call.args) != NULL);
- node->flags.can_purify = node->call.func->flags.pure && node->call.args->flags.pure;
+ node->flags.can_purify = (node->call.func->flags.pure && node->call.args->flags.pure) | node->call.args->flags.can_purify;
lhs = node;
goto redo;
break;
case XLAT_FUNC:
+ if (!node->flags.pure && node->flags.can_purify) {
+ if (xlat_purify_list(node->call.args, request) < 0) return -1;
+ break;
+ }
+
+ fr_assert(node->flags.pure);
+
fr_value_box_list_init(&list);
if (unlang_xlat_push_node(node->call.args, &success, &list, request, node) < 0) {
return -1;
* If the function is pure, AND it's arguments are pure,
* then remember that we need to call a pure function.
*/
- node->flags.can_purify = func->flags.pure && args->flags.pure;
+ node->flags.can_purify = (func->flags.pure && args->flags.pure) | args->flags.can_purify;
return node;
}
if (node->type == XLAT_FUNC) {
if (xlat_validate_function_args(node) < 0) goto error;
- node->flags.can_purify = node->call.func->flags.pure && node->call.args->flags.pure;
+ node->flags.can_purify = (node->call.func->flags.pure && node->call.args->flags.pure) | node->call.args->flags.can_purify;
}
if (!fr_sbuff_next_if_char(in, ')')) {
node->flags = node->call.func->flags;
xlat_flags_merge(&node->flags, &node->call.args->flags);
- node->flags.can_purify = node->call.func->flags.pure && node->call.args->flags.pure;
+ node->flags.can_purify = (node->call.func->flags.pure && node->call.args->flags.pure) | node->call.args->flags.can_purify;
break;
/*
*/
xlat_flags_merge(&node->flags, &node->call.args->flags);
- node->flags.can_purify = node->call.func->flags.pure && node->call.args->flags.pure;
+ node->flags.can_purify = (node->call.func->flags.pure && node->call.args->flags.pure) | node->call.args->flags.can_purify;
/*
* Add the freshly resolved function