From: Wolfgang (Blub) Bumiller Date: Thu, 26 Apr 2012 09:36:46 +0000 (+0200) Subject: Introduce an ast_store rather than splitting ast_binary X-Git-Tag: 0.1-rc1~589 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=1a917a2659cb1c48474ef5302e7d44dda478f952;p=xonotic%2Fgmqcc.git Introduce an ast_store rather than splitting ast_binary --- diff --git a/ast.c b/ast.c index 9d55fed..595dea1 100644 --- a/ast.c +++ b/ast.c @@ -111,36 +111,7 @@ ast_binary* ast_binary_new(lex_ctx_t ctx, int op, ast_value* left, ast_value* right) { ast_instantiate(ast_binary, ctx, ast_binary_delete); - switch (op) { - case INSTR_STORE_F: - case INSTR_STORE_V: - case INSTR_STORE_S: - case INSTR_STORE_ENT: - case INSTR_STORE_FLD: - case INSTR_STORE_FNC: - case INSTR_STOREP_F: - case INSTR_STOREP_V: - case INSTR_STOREP_S: - case INSTR_STOREP_ENT: - case INSTR_STOREP_FLD: - case INSTR_STOREP_FNC: -#if 0 - case INSTR_STORE_I: - case INSTR_STORE_IF: - case INSTR_STORE_FI: - case INSTR_STOREP_I: - case INSTR_STOREP_IF: - case INSTR_STOREP_FI: - case INSTR_STORE_P: - case INSTR_STOREP_P: - case INSTR_STOREP_C: -#endif - ast_expression_init((ast_expression*)self, (ast_expression_codegen*)&ast_bin_store_codegen); - break; - default: - ast_expression_init((ast_expression*)self, (ast_expression_codegen*)&ast_binary_codegen); - break; - } + ast_expression_init((ast_expression*)self, (ast_expression_codegen*)&ast_binary_codegen); self->op = op; self->left = left; @@ -154,6 +125,24 @@ void ast_binary_delete(ast_binary *self) mem_d(self); } +ast_store* ast_store_new(lex_ctx_t ctx, int op, + ast_value *dest, ast_value *source) +{ + ast_instantiate(ast_store, ctx, ast_store_delete); + ast_expression_init((ast_expression*)self, (ast_expression_codegen*)&ast_store_codegen); + + self->op = op; + self->dest = dest; + self->source = source; + + return self; +} + +void ast_store_delete(ast_store *self) +{ + mem_d(self); +} + ast_block* ast_block_new(lex_ctx_t ctx) { ast_instantiate(ast_block, ctx, ast_block_delete); @@ -221,7 +210,7 @@ bool ast_block_codegen(ast_block *self, ast_function *func, ir_value **out) return false; } -bool ast_bin_store_codegen(ast_binary *self, ast_function *func, ir_value **out) +bool ast_store_codegen(ast_store *self, ast_function *func, ir_value **out) { return false; } diff --git a/ast.h b/ast.h index 041bff7..2eab191 100644 --- a/ast.h +++ b/ast.h @@ -37,6 +37,7 @@ typedef struct ast_value_s ast_value; typedef struct ast_function_s ast_function; typedef struct ast_block_s ast_block; typedef struct ast_binary_s ast_binary; +typedef struct ast_store_s ast_store; /* Node interface with common components */ @@ -46,6 +47,10 @@ typedef struct lex_ctx_t context; /* I don't feel comfortable using keywords like 'delete' as names... */ ast_node_delete *destroy; + /* keep: if a node contains this node, 'keep' + * prevents its dtor from destroying this node as well. + */ + bool keep; } ast_node_common; #define ast_delete(x) ( ( (ast_node*)(x) ) -> node.destroy )((ast_node*)(x)) @@ -125,11 +130,26 @@ void ast_binary_delete(ast_binary*); /* hmm, seperate functions? bool ast_block_codegen(ast_block*, ast_function*, ir_value**); */ -/* maybe for this one */ -bool ast_bin_store_codegen(ast_binary*, ast_function*, ir_value**); - bool ast_binary_codegen(ast_binary*, ast_function*, ir_value**); +/* Store + * + * Stores left<-right and returns left. + * Specialized binary expression node + */ +struct ast_store_s +{ + ast_expression_common expression; + int op; + ast_value *dest; + ast_value *source; +}; +ast_store* ast_store_new(lex_ctx_t ctx, int op, + ast_value *d, ast_value *s); +void ast_store_delete(ast_store*); + +bool ast_store_codegen(ast_store*, ast_function*, ir_value**); + /* Blocks * */