self->keep_dest = false;
- self->expression.vtype = left->expression.vtype;
- if (left->expression.next) {
- self->expression.next = ast_type_copy(ctx, left);
- if (!self->expression.next) {
- ast_delete(self);
- return NULL;
- }
+ if (!ast_type_adopt(self, left)) {
+ ast_delete(self);
+ return NULL;
}
- else
- self->expression.next = NULL;
return self;
}
self->params = NULL;
self->func = funcexpr;
-/*
- self->expression.vtype = funcexpr->expression.next->expression.vtype;
- if (funcexpr->expression.next->expression.next)
- self->expression.next = ast_type_copy(ctx, funcexpr->expression.next->expression.next);
-*/
ast_type_adopt(self, funcexpr->expression.next);
return self;
self->dest = dest;
self->source = source;
- self->expression.vtype = dest->expression.vtype;
- if (dest->expression.next) {
- self->expression.next = ast_type_copy(ctx, dest);
- if (!self->expression.next) {
- ast_delete(self);
- return NULL;
- }
+ if (!ast_type_adopt(self, dest)) {
+ ast_delete(self);
+ return NULL;
}
- else
- self->expression.next = NULL;
return self;
}
return self;
}
-void ast_block_add_expr(ast_block *self, ast_expression *e)
+bool ast_block_add_expr(ast_block *self, ast_expression *e)
{
ast_propagate_effects(self, e);
vec_push(self->exprs, e);
+ if (self->expression.next) {
+ ast_delete(self->expression.next);
+ self->expression.next = NULL;
+ }
+ if (!ast_type_adopt(self, e)) {
+ compile_error(ast_ctx(self), "internal error: failed to adopt type");
+ return false;
+ }
+ return true;
}
void ast_block_collect(ast_block *self, ast_expression *expr)
{
if (self->expression.next)
ast_delete(self->expression.next);
- self->expression.vtype = from->expression.vtype;
- if (from->expression.next) {
- self->expression.next = ast_type_copy(self->expression.node.context, from->expression.next);
- if (!self->expression.next)
- return false;
- }
- else
- self->expression.next = NULL;
+ if (!ast_type_adopt(self, from))
+ return false;
return true;
}
size_t len;
char *from;
- if (!opts_dump && !opts_dumpfin)
+ if (!opts.dump && !opts.dumpfin)
return NULL;
id = (self->labelcount++);
}
/* we are lame now - considering the way QC works we won't tolerate arrays > 1024 elements */
- if (!array->expression.count || array->expression.count > opts_max_array_size)
+ if (!array->expression.count || array->expression.count > opts.max_array_size)
compile_error(ast_ctx(self), "Invalid array of size %lu", (unsigned long)array->expression.count);
elemtype = &array->expression.next->expression;
return false;
}
v->context = ast_ctx(self);
+ v->unique_life = true;
array->ir_v = self->ir_v = v;
namelen = strlen(self->name);
return false;
}
array->ir_values[ai]->context = ast_ctx(self);
+ array->ir_values[ai]->unique_life = true;
}
mem_d(name);
}
int vtype = elemtype->vtype;
/* same as with field arrays */
- if (!self->expression.count || self->expression.count > opts_max_array_size)
+ if (!self->expression.count || self->expression.count > opts.max_array_size)
compile_error(ast_ctx(self), "Invalid array of size %lu", (unsigned long)self->expression.count);
v = ir_builder_create_global(ir, self->name, vtype);
return false;
}
v->context = ast_ctx(self);
+ v->unique_life = true;
namelen = strlen(self->name);
name = (char*)mem_a(namelen + 16);
return false;
}
self->ir_values[ai]->context = ast_ctx(self);
+ self->ir_values[ai]->unique_life = true;
}
mem_d(name);
}
}
/* we are lame now - considering the way QC works we won't tolerate arrays > 1024 elements */
- if (!self->expression.count || self->expression.count > opts_max_array_size) {
+ if (!self->expression.count || self->expression.count > opts.max_array_size) {
compile_error(ast_ctx(self), "Invalid array of size %lu", (unsigned long)self->expression.count);
}
return false;
}
v->context = ast_ctx(self);
+ v->unique_life = true;
namelen = strlen(self->name);
name = (char*)mem_a(namelen + 16);
return false;
}
self->ir_values[ai]->context = ast_ctx(self);
+ self->ir_values[ai]->unique_life = true;
}
}
else
}
}
- options_set(opts_warn, WARN_USED_UNINITIALIZED, false);
+ options_set(opts.warn, WARN_USED_UNINITIALIZED, false);
if (self->setter) {
if (!ast_global_codegen (self->setter, ir, false) ||
!ast_function_codegen(self->setter->constval.vfunc, ir) ||
!ir_function_finalize(self->setter->constval.vfunc->ir_func))
{
compile_error(ast_ctx(self), "internal error: failed to generate setter for `%s`", self->name);
- options_set(opts_warn, WARN_USED_UNINITIALIZED, warn);
+ options_set(opts.warn, WARN_USED_UNINITIALIZED, warn);
return false;
}
}
!ir_function_finalize(self->getter->constval.vfunc->ir_func))
{
compile_error(ast_ctx(self), "internal error: failed to generate getter for `%s`", self->name);
- options_set(opts_warn, WARN_USED_UNINITIALIZED, warn);
+ options_set(opts.warn, WARN_USED_UNINITIALIZED, warn);
return false;
}
}
for (i = 0; i < self->expression.count; ++i) {
vec_free(self->ir_values[i]->life);
}
- options_set(opts_warn, WARN_USED_UNINITIALIZED, warn);
+ options_set(opts.warn, WARN_USED_UNINITIALIZED, warn);
return true;
}
for (i = 0; i < vec_size(self->locals); ++i)
{
if (!ast_local_codegen(self->locals[i], func->ir_func, false)) {
- if (opts_debug)
+ if (opts.debug)
compile_error(ast_ctx(self), "failed to generate local `%s`", self->locals[i]->name);
return false;
}
self->expression.outr = ir_phi_value(phi);
*out = self->expression.outr;
+ codegen_output_type(self, *out);
+
return true;
}