self->expression.params = NULL;
self->expression.count = 0;
self->expression.flags = 0;
+ self->expression.varparam = NULL;
}
static void ast_expression_delete(ast_expression *self)
self->getter = NULL;
self->desc = NULL;
+ self->argcounter = NULL;
+
return self;
}
{
if (self->name)
mem_d((void*)self->name);
+ if (self->argcounter)
+ mem_d((void*)self->argcounter);
if (self->hasvalue) {
switch (self->expression.vtype)
{
bool ast_call_check_types(ast_call *self)
{
+ char texp[1024];
+ char tgot[1024];
size_t i;
bool retval = true;
const ast_expression *func = self->func;
for (i = 0; i < count; ++i) {
if (!ast_compare_type(self->params[i], (ast_expression*)(func->expression.params[i])))
{
- char texp[1024];
- char tgot[1024];
ast_type_to_string(self->params[i], tgot, sizeof(tgot));
ast_type_to_string((ast_expression*)func->expression.params[i], texp, sizeof(texp));
compile_error(ast_ctx(self), "invalid type for parameter %u in function call: expected %s, got %s",
retval = false;
}
}
+ count = vec_size(self->params);
+ if (count > vec_size(func->expression.params) && func->expression.varparam) {
+ for (; i < count; ++i) {
+ if (!ast_compare_type(self->params[i], func->expression.varparam))
+ {
+ ast_type_to_string(self->params[i], tgot, sizeof(tgot));
+ ast_type_to_string(func->expression.varparam, texp, sizeof(texp));
+ compile_error(ast_ctx(self), "invalid type for parameter %u in function call: expected %s, got %s",
+ (unsigned int)(i+1), texp, tgot);
+ /* we don't immediately return */
+ retval = false;
+ }
+ }
+ }
return retval;
}
vtype->hasvalue = true;
vtype->constval.vfunc = self;
+ self->varargs = NULL;
+
return self;
}
vec_free(self->blocks);
vec_free(self->breakblocks);
vec_free(self->continueblocks);
+ if (self->varargs)
+ ast_delete(self->varargs);
mem_d(self);
}
func->flags |= IR_FLAG_HAS_ARRAYS;
- if (param) {
+ if (param && !(self->expression.flags & AST_FLAG_IS_VARARG)) {
compile_error(ast_ctx(self), "array-parameters are not supported");
return false;
}
}
}
+ if (self->varargs) {
+ if (!ast_local_codegen(self->varargs, self->ir_func, true))
+ return false;
+ }
+
if (self->builtin) {
irf->builtin = self->builtin;
return true;