X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ast.h;h=b93de575c19e03c4e9d8e4560e63a27e571d43bf;hb=87ff481abffb79150974b4d460c3bd96c3399be2;hp=93c105faec64412c3664b2b45aded5bf7f70f5ef;hpb=a60d0182db75e7b32e4efe5384a3b5dd4b7cc0ff;p=xonotic%2Fgmqcc.git diff --git a/ast.h b/ast.h index 93c105f..b93de57 100644 --- a/ast.h +++ b/ast.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * Wolfgang Bumiller * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -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) ) { \ @@ -132,6 +132,10 @@ typedef struct size_t count; ast_value* *params; uint32_t flags; + /* void foo(string...) gets varparam set as a restriction + * for variadic parameters + */ + ast_expression *varparam; /* 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 @@ -142,6 +146,12 @@ typedef struct } ast_expression_common; #define AST_FLAG_VARIADIC (1<<0) #define AST_FLAG_NORETURN (1<<1) +#define AST_FLAG_INLINE (1<<2) +#define AST_FLAG_INITIALIZED (1<<3) +#define AST_FLAG_DEPRECATED (1<<4) +#define AST_FLAG_INCLUDE_DEF (1<<5) +#define AST_FLAG_VARARG_COUNT (1<<6) +#define AST_FLAG_TYPE_MASK (AST_FLAG_VARIADIC | AST_FLAG_NORETURN) /* Value * @@ -155,6 +165,7 @@ struct ast_value_s ast_expression_common expression; const char *name; + const char *desc; /* int vtype; @@ -323,6 +334,7 @@ struct ast_member_s ast_expression *owner; unsigned int field; const char *name; + bool rvalue; }; ast_member* ast_member_new(lex_ctx ctx, ast_expression *owner, unsigned int field, const char *name); void ast_member_delete(ast_member*); @@ -519,9 +531,11 @@ struct ast_label_s const char *name; ir_block *irblock; ast_goto **gotos; + /* means it has not yet been defined */ + bool undefined; }; -ast_label* ast_label_new(lex_ctx ctx, const char *name); +ast_label* ast_label_new(lex_ctx ctx, const char *name, bool undefined); void ast_label_delete(ast_label*); void ast_label_register_goto(ast_label*, ast_goto*);