I added it for a reason, because I was smart. I forgot about it because of life :(
authorDale Weiler <killfieldengine@gmail.com>
Sat, 15 Jun 2013 11:04:08 +0000 (11:04 +0000)
committerDale Weiler <killfieldengine@gmail.com>
Sat, 15 Jun 2013 11:04:08 +0000 (11:04 +0000)
ast.h
parser.c

diff --git a/ast.h b/ast.h
index ebb29a779885ff4f5f0804db2cab26d881ff2470..3df25e859b5ace2093365818ee616cd2de2f257b 100644 (file)
--- a/ast.h
+++ b/ast.h
@@ -231,6 +231,7 @@ 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);
 
 typedef enum ast_binary_ref_s {
+    AST_REF_NONE  = 0,
     AST_REF_LEFT  = 1 << 1,
     AST_REF_RIGHT = 1 << 2,
     AST_REF_ALL   = (AST_REF_LEFT | AST_REF_RIGHT)
index b53dba5ec5b9df6055eebd0789ac07a5d1a4f0b6..7ba3782e3b8d8d445b5667a28b5ddf94fc0b9497 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -1051,6 +1051,19 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy)
             if(CanConstFold(exprs[0], exprs[1])) {
                 out = (ast_expression*)parser_const_float(parser, (float)((qcint)(ConstF(0)) ^ ((qcint)(ConstF(1)))));
             } else {
+                ast_binary *expr = ast_binary_new(
+                    ctx,
+                    INSTR_SUB_F,
+                    (ast_expression*)parser_const_float_neg1(parser),
+                    (ast_expression*)ast_binary_new(
+                        ctx,
+                        INSTR_BITAND,
+                        exprs[0],
+                        exprs[1]
+                    )
+                );
+                expr->refs = AST_REF_NONE;
+                
                 out = (ast_expression*)
                     ast_binary_new(
                         ctx,
@@ -1061,17 +1074,7 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy)
                             exprs[0],
                             exprs[1]
                         ),
-                        (ast_expression*)ast_binary_new(
-                            ctx,
-                            INSTR_SUB_F,
-                            (ast_expression*)parser_const_float_neg1(parser),
-                            (ast_expression*)ast_binary_new(
-                                ctx,
-                                INSTR_BITAND,
-                                exprs[0],
-                                exprs[1]
-                            )
-                        )
+                        (ast_expression*)expr
                     );
             }
             break;
@@ -1201,7 +1204,7 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy)
             } else {
                 ast_binary *eq = ast_binary_new(ctx, INSTR_EQ_F, exprs[0], exprs[1]);
 
-                eq->refs = (ast_binary_ref)false; /* references nothing */
+                eq->refs = AST_REF_NONE;
 
                     /* if (lt) { */
                 out = (ast_expression*)ast_ternary_new(ctx,