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);
}
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)) {
out = (ast_expression*)ast_ternary_new(ctx, exprs[0], exprs[1], exprs[2]);
break;
- case opid3('<', '=', '>'): /* -1, 0, or 1 */
+ case opid3('<','=','>'): /* -1, 0, or 1 */
if (NotSameType(TYPE_FLOAT)) {
ast_type_to_string(exprs[0], ty1, sizeof(ty1));
ast_type_to_string(exprs[1], ty2, sizeof(ty2));
else if (ConstF(0) > ConstF(1))
out = (ast_expression*)parser_const_float_1(parser);
} else {
+ ast_binary *eq = ast_binary_new(ctx, INSTR_EQ_F, exprs[0], exprs[1]);
+
+ eq->refs = false; /* references nothing */
+
/* if (lt) { */
out = (ast_expression*)ast_ternary_new(ctx,
(ast_expression*)ast_binary_new(ctx, INSTR_LT, exprs[0], exprs[1]),
-
/* out = -1 */
(ast_expression*)parser_const_float_neg1(parser),
-
/* } else { */
/* if (eq) { */
- (ast_expression*)ast_ternary_new(ctx,
- (ast_expression*)ast_binary_new(ctx, INSTR_EQ_F, exprs[0], exprs[1]),
-
+ (ast_expression*)ast_ternary_new(ctx, (ast_expression*)eq,
/* out = 0 */
(ast_expression*)parser_const_float_0(parser),
-
/* } else { */
-
/* out = 1 */
(ast_expression*)parser_const_float_1(parser)
/* } */