X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ast.h;h=a08c4c0d4072d5df8bd61cacaff8fd971c59b704;hb=904196e9bb6818e5080de6ced1833f3d207242fc;hp=d0ce67a02aba7846dd0ce31fb6049cdae7e2edc7;hpb=c3460c1654bb3b28b35c7e5b9b6bf81668ec062a;p=xonotic%2Fgmqcc.git diff --git a/ast.h b/ast.h index d0ce67a..a08c4c0 100644 --- a/ast.h +++ b/ast.h @@ -40,6 +40,7 @@ typedef struct ast_entfield_s ast_entfield; typedef struct ast_ifthen_s ast_ifthen; typedef struct ast_ternary_s ast_ternary; typedef struct ast_loop_s ast_loop; +typedef struct ast_call_s ast_call; /* Node interface with common components */ @@ -284,6 +285,29 @@ void ast_loop_delete(ast_loop*); bool ast_loop_codegen(ast_loop*, ast_function*, bool lvalue, ir_value**); +/* CALL node + * + * Contains an ast_expression as target, rather than an ast_function/value. + * Since it's how QC works, every ast_function has an ast_value + * associated anyway - in other words, the VM contains function + * pointers for every function anyway. Thus, this node will call + * expression. + * Additionally it contains a list of ast_expressions as parameters. + * Since calls can return values, an ast_call is also an ast_expression. + */ +struct ast_call_s +{ + ast_expression_common expression; + ast_expression *func; + MEM_VECTOR_MAKE(ast_expression*, params); +}; +ast_call* ast_call_new(lex_ctx ctx, + ast_expression *funcexpr); +void ast_call_delete(ast_call*); +bool ast_call_codegen(ast_call*, ast_function*, bool lvalue, ir_value**); + +MEM_VECTOR_PROTO(ast_call, ast_expression*, params); + /* Blocks * */ @@ -319,6 +343,8 @@ struct ast_function_s ast_value *vtype; const char *name; + int builtin; + ir_function *ir_func; ir_block *curblock; ir_block *breakblock; @@ -332,6 +358,7 @@ struct ast_function_s char labelbuf[64]; MEM_VECTOR_MAKE(ast_block*, blocks); + MEM_VECTOR_MAKE(ast_value*, params); }; ast_function* ast_function_new(lex_ctx ctx, const char *name, ast_value *vtype); /* This will NOT delete the underlying ast_value */ @@ -342,6 +369,7 @@ void ast_function_delete(ast_function*); const char* ast_function_label(ast_function*, const char *prefix); MEM_VECTOR_PROTO(ast_function, ast_block*, blocks); +MEM_VECTOR_PROTO(ast_function, ast_value*, params); bool ast_function_codegen(ast_function *self, ir_builder *builder);