Introduce an ast_store rather than splitting ast_binary

This commit is contained in:
Wolfgang (Blub) Bumiller 2012-04-26 11:36:46 +02:00
parent 06bdc46864
commit 1a917a2659
2 changed files with 43 additions and 34 deletions

51
ast.c
View file

@ -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;
}

26
ast.h
View file

@ -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
*
*/