]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - ast.h
So why doesn't any popular compiler complain about this
[xonotic/gmqcc.git] / ast.h
diff --git a/ast.h b/ast.h
index 95b8962ddab15724979ba111db0e94368117b329..5dee4443825687eb7ebb0ef55e6457bb74bc09b8 100644 (file)
--- a/ast.h
+++ b/ast.h
@@ -95,7 +95,7 @@ typedef struct
     bool             side_effects;
 } ast_node_common;
 
-#define ast_delete(x) ( ( (ast_node*)(x) ) -> node.destroy )((ast_node*)(x))
+#define ast_delete(x) (*( ((ast_node*)(x))->node.destroy ))((ast_node*)(x))
 #define ast_unref(x) do                     \
 {                                           \
     if (! (((ast_node*)(x))->node.keep) ) { \
@@ -161,7 +161,7 @@ struct ast_value_s
     ast_value  *next;
     */
 
-    bool cvq;     /* const/var qualifier */
+    int  cvq;     /* const/var qualifier */
     bool isfield; /* this declares a field */
     bool hasvalue;
     union {
@@ -326,6 +326,7 @@ struct ast_member_s
 };
 ast_member* ast_member_new(lex_ctx ctx, ast_expression *owner, unsigned int field, const char *name);
 void ast_member_delete(ast_member*);
+bool ast_member_set_name(ast_member*, const char *name);
 
 bool ast_member_codegen(ast_member*, ast_function*, bool lvalue, ir_value**);
 
@@ -449,11 +450,19 @@ struct ast_loop_s
     ast_expression *postcond;
     ast_expression *increment;
     ast_expression *body;
+    /* For now we allow a seperate flag on whether or not the condition
+     * is supposed to be true or false.
+     * That way, the parser can generate a 'while not(!x)' for `while(x)`
+     * if desired, which is useful for the new -f{true,false}-empty-strings
+     * flag.
+     */
+    bool pre_not;
+    bool post_not;
 };
 ast_loop* ast_loop_new(lex_ctx ctx,
                        ast_expression *initexpr,
-                       ast_expression *precond,
-                       ast_expression *postcond,
+                       ast_expression *precond, bool pre_not,
+                       ast_expression *postcond, bool post_not,
                        ast_expression *increment,
                        ast_expression *body);
 void ast_loop_delete(ast_loop*);
@@ -465,9 +474,10 @@ bool ast_loop_codegen(ast_loop*, ast_function*, bool lvalue, ir_value**);
 struct ast_breakcont_s
 {
     ast_expression_common expression;
-    bool is_continue;
+    bool         is_continue;
+    unsigned int levels;
 };
-ast_breakcont* ast_breakcont_new(lex_ctx ctx, bool iscont);
+ast_breakcont* ast_breakcont_new(lex_ctx ctx, bool iscont, unsigned int levels);
 void ast_breakcont_delete(ast_breakcont*);
 
 bool ast_breakcont_codegen(ast_breakcont*, ast_function*, bool lvalue, ir_value**);
@@ -598,8 +608,8 @@ struct ast_function_s
 
     ir_function *ir_func;
     ir_block    *curblock;
-    ir_block    *breakblock;
-    ir_block    *continueblock;
+    ir_block    **breakblocks;
+    ir_block    **continueblocks;
 
 #if 0
     /* In order for early-out logic not to go over