X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ast.h;h=a7d131c1ae3c558807e48b28bff93d5766f031cb;hb=0988b731b753d8246bd143bd7e71919a0ea254ef;hp=f1ca3c8d7d6c33c48e9de6ce2a11ad10c83a4f5b;hpb=ec2ff09eff11104ba0d5d4fea0bb04bd2f017f4c;p=xonotic%2Fgmqcc.git diff --git a/ast.h b/ast.h index f1ca3c8..a7d131c 100644 --- a/ast.h +++ b/ast.h @@ -52,27 +52,27 @@ typedef struct ast_label_s ast_label; typedef struct ast_goto_s ast_goto; enum { - TYPE_ast_node, - TYPE_ast_expression, - TYPE_ast_value, - TYPE_ast_function, - TYPE_ast_block, - TYPE_ast_binary, - TYPE_ast_store, - TYPE_ast_binstore, - TYPE_ast_entfield, - TYPE_ast_ifthen, - TYPE_ast_ternary, - TYPE_ast_loop, - TYPE_ast_call, - TYPE_ast_unary, - TYPE_ast_return, - TYPE_ast_member, - TYPE_ast_array_index, - TYPE_ast_breakcont, - TYPE_ast_switch, - TYPE_ast_label, - TYPE_ast_goto + TYPE_ast_node, /* 0 */ + TYPE_ast_expression, /* 1 */ + TYPE_ast_value, /* 2 */ + TYPE_ast_function, /* 3 */ + TYPE_ast_block, /* 4 */ + TYPE_ast_binary, /* 5 */ + TYPE_ast_store, /* 6 */ + TYPE_ast_binstore, /* 7 */ + TYPE_ast_entfield, /* 8 */ + TYPE_ast_ifthen, /* 9 */ + TYPE_ast_ternary, /* 10 */ + TYPE_ast_loop, /* 11 */ + TYPE_ast_call, /* 12 */ + TYPE_ast_unary, /* 13 */ + TYPE_ast_return, /* 14 */ + TYPE_ast_member, /* 15 */ + TYPE_ast_array_index, /* 16 */ + TYPE_ast_breakcont, /* 17 */ + TYPE_ast_switch, /* 18 */ + TYPE_ast_label, /* 19 */ + TYPE_ast_goto /* 20 */ }; #define ast_istype(x, t) ( ((ast_node_common*)x)->nodetype == (TYPE_##t) ) @@ -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,8 @@ struct ast_value_s ast_value *next; */ - bool constant; + bool cvq; /* const/var qualifier */ + bool isfield; /* this declares a field */ bool hasvalue; union { double vfloat; @@ -168,6 +171,7 @@ struct ast_value_s const char *vstring; int ventity; ast_function *vfunc; + ast_value *vfield; } constval; /* usecount for the parser */ @@ -445,11 +449,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*); @@ -571,7 +583,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 * @@ -624,6 +636,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 */