X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ast.h;h=5dee4443825687eb7ebb0ef55e6457bb74bc09b8;hp=004243fd7717fdf4ceea6343b7fe4ba06ae88200;hb=f1fa8f6055953368006a0877d2938f5f2693c012;hpb=2a3e7c1cff95a06b85ca2860735433cc59da64f5 diff --git a/ast.h b/ast.h index 004243f..5dee444 100644 --- 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) ) { \ @@ -131,7 +131,7 @@ typedef struct /* arrays get a member-count */ size_t count; ast_value* *params; - bool variadic; + uint32_t flags; /* The codegen functions should store their output values * so we can call it multiple times without re-evaluating. * Store lvalue and rvalue seperately though. So that @@ -140,6 +140,8 @@ typedef struct ir_value *outl; ir_value *outr; } ast_expression_common; +#define AST_FLAG_VARIADIC (1<<0) +#define AST_FLAG_NORETURN (1<<1) /* Value * @@ -159,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 { @@ -324,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**); @@ -447,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*); @@ -463,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**); @@ -573,7 +585,7 @@ bool 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*); -void ast_block_add_expr(ast_block*, ast_expression*); +bool GMQCC_WARN ast_block_add_expr(ast_block*, ast_expression*); /* Function * @@ -596,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 @@ -626,6 +638,7 @@ void ast_function_delete(ast_function*); const char* ast_function_label(ast_function*, const char *prefix); bool ast_function_codegen(ast_function *self, ir_builder *builder); +bool ast_generate_accessors(ast_value *asvalue, ir_builder *ir); /* Expression union */