else
self->expression.vtype = left->expression.vtype;
+ /* references all */
+ self->refs = AST_REF_ALL;
+
return self;
}
void ast_binary_delete(ast_binary *self)
{
- ast_unref(self->left);
- ast_unref(self->right);
+ if (self->refs & AST_REF_LEFT) ast_unref(self->left);
+ if (self->refs & AST_REF_RIGHT) ast_unref(self->right);
+
ast_expression_delete((ast_expression*)self);
mem_d(self);
}
v = ir_function_create_local(func, self->name, vtype, param);
if (!v) {
- compile_error(ast_ctx(self), "ir_function_create_local failed");
+ compile_error(ast_ctx(self), "internal error: ir_function_create_local failed");
return false;
}
v->context = ast_ctx(self);
snprintf(name + namelen, 16, "[%u]", (unsigned int)ai);
self->ir_values[ai] = ir_function_create_local(func, name, vtype, param);
if (!self->ir_values[ai]) {
- compile_error(ast_ctx(self), "ir_builder_create_global failed on `%s`", name);
+ compile_error(ast_ctx(self), "internal_error: ir_builder_create_global failed on `%s`", name);
return false;
}
self->ir_values[ai]->context = ast_ctx(self);
irf = self->ir_func;
if (!irf) {
- compile_error(ast_ctx(self), "ast_function's related ast_value was not generated yet");
+ compile_error(ast_ctx(self), "internal error: ast_function's related ast_value was not generated yet");
return false;
}
if (!lvalue && self->expression.outr) {
*out = self->expression.outr;
+ return true;
}
if (lvalue && self->expression.outl) {
*out = self->expression.outl;
+ return true;
}
if (!ast_istype(self->array, ast_value)) {