self->ir_func = NULL;
self->curblock = NULL;
- self->breakblocks = NULL;
- self->continueblocks = NULL;
-
vtype->hasvalue = true;
vtype->constval.vfunc = self;
self->argc = NULL;
self->fixedparams = NULL;
self->return_value = NULL;
-
- self->static_names = NULL;
self->static_count = 0;
return self;
void ast_function_delete(ast_function *self)
{
- size_t i;
if (self->name)
mem_d((void*)self->name);
if (self->vtype) {
*/
ast_unref(self->vtype);
}
- for (i = 0; i < vec_size(self->static_names); ++i)
- mem_d(self->static_names[i]);
- vec_free(self->static_names);
+ for (auto &it : self->static_names)
+ mem_d(it);
for (auto &it : self->blocks)
ast_delete(it);
- vec_free(self->breakblocks);
- vec_free(self->continueblocks);
if (self->varargs)
ast_delete(self->varargs);
if (self->argc)
/* enter */
func->curblock = bbody;
- vec_push(func->breakblocks, bbreak);
+ func->breakblocks.push_back(bbreak);
if (bcontinue)
- vec_push(func->continueblocks, bcontinue);
+ func->continueblocks.push_back(bcontinue);
else
- vec_push(func->continueblocks, bbody);
+ func->continueblocks.push_back(bbody);
/* generate */
if (self->body) {
}
end_bbody = func->curblock;
- vec_pop(func->breakblocks);
- vec_pop(func->continueblocks);
+ func->breakblocks.pop_back();
+ func->continueblocks.pop_back();
}
/* post-loop-condition */
self->expression.outr = (ir_value*)1;
if (self->is_continue)
- target = func->continueblocks[vec_size(func->continueblocks)-1-self->levels];
+ target = func->continueblocks[func->continueblocks.size()-1-self->levels];
else
- target = func->breakblocks[vec_size(func->breakblocks)-1-self->levels];
+ target = func->breakblocks[func->breakblocks.size()-1-self->levels];
if (!target) {
compile_error(ast_ctx(self), "%s is lacking a target block", (self->is_continue ? "continue" : "break"));
return false;
/* setup the break block */
- vec_push(func->breakblocks, bout);
+ func->breakblocks.push_back(bout);
/* Now create all cases */
for (auto &it : self->cases) {
func->curblock = bout;
/* restore the break block */
- vec_pop(func->breakblocks);
+ func->breakblocks.pop_back();
/* Move 'bout' to the end, it's nicer */
vec_remove(func->ir_func->blocks, bout_id, 1);
bool ast_call_codegen(ast_call *self, ast_function *func, bool lvalue, ir_value **out)
{
ast_expression_codegen *cgen;
- ir_value **params;
- ir_instr *callinstr;
- size_t i;
+ std::vector<ir_value*> params;
+ ir_instr *callinstr;
ir_value *funval = NULL;
if (!funval)
return false;
- params = NULL;
-
/* parameters */
for (auto &it : self->params) {
ir_value *param;
cgen = it->codegen;
if (!(*cgen)(it, func, false, ¶m))
- goto error;
+ return false;
if (!param)
- goto error;
- vec_push(params, param);
+ return false;
+ params.push_back(param);
}
/* varargs counter */
ast_function_label(func, "call"),
funval, !!(self->func->flags & AST_FLAG_NORETURN));
if (!callinstr)
- goto error;
+ return false;
- for (i = 0; i < vec_size(params); ++i) {
- ir_call_param(callinstr, params[i]);
- }
+ for (auto &it : params)
+ ir_call_param(callinstr, it);
*out = ir_call_value(callinstr);
self->expression.outr = *out;
codegen_output_type(self, *out);
- vec_free(params);
return true;
-error:
- vec_free(params);
- return false;
}