ast_value *cp = ast_value_new(self->expression.node.context, self->name, self->expression.vtype);
if (self->expression.next) {
cp->expression.next = ast_type_copy(self->expression.node.context, self->expression.next);
- if (!cp->expression.next) {
- ast_value_delete(cp);
- return NULL;
- }
}
fromex = &self->expression;
selfex = &cp->expression;
selfex->flags = fromex->flags;
for (i = 0; i < vec_size(fromex->params); ++i) {
ast_value *v = ast_value_copy(fromex->params[i]);
- if (!v) {
- ast_value_delete(cp);
- return NULL;
- }
vec_push(selfex->params, v);
}
return cp;
}
-bool ast_type_adopt_impl(ast_expression *self, const ast_expression *other)
+void ast_type_adopt_impl(ast_expression *self, const ast_expression *other)
{
size_t i;
const ast_expression_common *fromex;
self->expression.vtype = other->expression.vtype;
if (other->expression.next) {
self->expression.next = (ast_expression*)ast_type_copy(ast_ctx(self), other->expression.next);
- if (!self->expression.next)
- return false;
}
fromex = &other->expression;
selfex = &self->expression;
selfex->flags = fromex->flags;
for (i = 0; i < vec_size(fromex->params); ++i) {
ast_value *v = ast_value_copy(fromex->params[i]);
- if (!v)
- return false;
vec_push(selfex->params, v);
}
- return true;
}
static ast_expression* ast_shallow_type(lex_ctx ctx, int vtype)
selfex->vtype = fromex->vtype;
if (fromex->next)
- {
selfex->next = ast_type_copy(ctx, fromex->next);
- if (!selfex->next) {
- ast_expression_delete_full(self);
- return NULL;
- }
- }
else
selfex->next = NULL;
selfex->flags = fromex->flags;
for (i = 0; i < vec_size(fromex->params); ++i) {
ast_value *v = ast_value_copy(fromex->params[i]);
- if (!v) {
- ast_expression_delete_full(self);
- return NULL;
- }
vec_push(selfex->params, v);
}
self->keep_dest = false;
- if (!ast_type_adopt(self, left)) {
- ast_delete(self);
- return NULL;
- }
-
+ ast_type_adopt(self, left);
return self;
}
ast_propagate_effects(self, entity);
ast_propagate_effects(self, field);
- if (!ast_type_adopt(self, outtype)) {
- ast_entfield_delete(self);
- return NULL;
- }
-
+ ast_type_adopt(self, outtype);
return self;
}
ast_propagate_effects(self, array);
ast_propagate_effects(self, index);
- if (!ast_type_adopt(self, outtype)) {
- ast_array_index_delete(self);
- return NULL;
- }
+ ast_type_adopt(self, outtype);
if (array->expression.vtype == TYPE_FIELD && outtype->expression.vtype == TYPE_ARRAY) {
if (self->expression.vtype != TYPE_ARRAY) {
compile_error(ast_ctx(self), "array_index node on type");
if (ontrue->expression.vtype == TYPE_NIL)
exprtype = onfalse;
- if (!ast_type_adopt(self, exprtype)) {
- ast_ternary_delete(self);
- return NULL;
- }
+ ast_type_adopt(self, exprtype);
return self;
}
self->dest = dest;
self->source = source;
- if (!ast_type_adopt(self, dest)) {
- ast_delete(self);
- return NULL;
- }
+ ast_type_adopt(self, dest);
return self;
}
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;
- }
+ ast_type_adopt(self, e);
return true;
}
mem_d(self);
}
-bool ast_block_set_type(ast_block *self, ast_expression *from)
+void ast_block_set_type(ast_block *self, ast_expression *from)
{
if (self->expression.next)
ast_delete(self->expression.next);
- if (!ast_type_adopt(self, from))
- return false;
- return true;
+ ast_type_adopt(self, from);
}
ast_function* ast_function_new(lex_ctx ctx, const char *name, ast_value *vtype)
bool ast_compare_type(ast_expression *a, ast_expression *b);
ast_expression* ast_type_copy(lex_ctx ctx, const ast_expression *ex);
#define ast_type_adopt(a, b) ast_type_adopt_impl((ast_expression*)(a), (ast_expression*)(b))
-bool ast_type_adopt_impl(ast_expression *self, const ast_expression *other);
+void ast_type_adopt_impl(ast_expression *self, const ast_expression *other);
void ast_type_to_string(ast_expression *e, char *buf, size_t bufsize);
/* Binary
};
ast_block* ast_block_new(lex_ctx ctx);
void ast_block_delete(ast_block*);
-bool ast_block_set_type(ast_block*, ast_expression *from);
+void ast_block_set_type(ast_block*, ast_expression *from);
bool ast_block_codegen(ast_block*, ast_function*, bool lvalue, ir_value**);
void ast_block_collect(ast_block*, ast_expression*);
return false;
}
}
- if (!ast_block_set_type(blocks[0], exprs[1]))
- return false;
+ ast_block_set_type(blocks[0], exprs[1]);
vec_push(sy->out, syblock(ctx, blocks[0]));
return true;
ast_expression *functype = fld_think->expression.next;
thinkfunc = ast_value_new(parser_ctx(parser), parser_tokval(parser), functype->expression.vtype);
- if (!thinkfunc || !ast_type_adopt(thinkfunc, functype)) {
+ if (!thinkfunc) { /* || !ast_type_adopt(thinkfunc, functype)*/
ast_unref(framenum);
parseerror(parser, "failed to create implicit prototype for `%s`", parser_tokval(parser));
return false;
}
+ ast_type_adopt(thinkfunc, functype);
if (!parser_next(parser)) {
ast_unref(framenum);