ast_side_effects(self) = true;
- self->params = NULL;
- self->func = funcexpr;
+ self->params = NULL;
+ self->func = funcexpr;
+ self->va_count = NULL;
ast_type_adopt(self, funcexpr->expression.next);
if (self->func)
ast_unref(self->func);
+ if (self->va_count)
+ ast_unref(self->va_count);
+
ast_expression_delete((ast_expression*)self);
mem_d(self);
}
vec_push(params, param);
}
+ /* varargs counter */
+ if (self->va_count) {
+ ir_value *va_count;
+ ir_builder *builder = func->curblock->owner->owner;
+ cgen = self->va_count->expression.codegen;
+ if (!(*cgen)((ast_expression*)(self->va_count), func, false, &va_count))
+ return false;
+ if (!ir_block_create_store_op(func->curblock, ast_ctx(self), INSTR_STORE_F,
+ ir_builder_get_va_count(builder), va_count))
+ {
+ return false;
+ }
+ }
+
callinstr = ir_block_create_call(func->curblock, ast_ctx(self),
ast_function_label(func, "call"),
funval, !!(self->func->expression.flags & AST_FLAG_NORETURN));