Merge remote-tracking branch 'origin/ast-and-ir'

This commit is contained in:
Dale Weiler 2012-05-02 17:46:21 -04:00
commit 1ae035c714
2 changed files with 46 additions and 1 deletions

34
ast.c
View file

@ -266,6 +266,8 @@ ast_function* ast_function_new(lex_ctx ctx, const char *name, ast_value *vtype)
self->name = name ? util_strdup(name) : NULL;
MEM_VECTOR_INIT(self, blocks);
self->labelcount = 0;
self->ir_func = NULL;
self->curblock = NULL;
@ -297,6 +299,13 @@ void ast_function_delete(ast_function *self)
mem_d(self);
}
const char* ast_function_label(ast_function *self)
{
size_t id = (self->labelcount++);
sprintf(self->labelbuf, "label%8u", (unsigned int)id);
return self->labelbuf;
}
/*********************************************************************/
/* AST codegen part
* by convention you must never pass NULL to the 'ir_value **out'
@ -517,7 +526,30 @@ bool ast_store_codegen(ast_store *self, ast_function *func, bool lvalue, ir_valu
bool ast_binary_codegen(ast_binary *self, ast_function *func, bool lvalue, ir_value **out)
{
return false;
ast_expression_codegen *cgen;
ir_value *left, *right;
/* In the context of a binary operation, we can disregard
* the lvalue flag.
*/
(void)lvalue;
cgen = self->left->expression.codegen;
/* lvalue! */
if (!(*cgen)((ast_expression*)(self->left), func, false, &left))
return false;
cgen = self->right->expression.codegen;
/* rvalue! */
if (!(*cgen)((ast_expression*)(self->right), func, false, &right))
return false;
*out = ir_block_create_binop(func->curblock, ast_function_label(func),
self->op, left, right);
if (!*out)
return false;
return true;
}
bool ast_entfield_codegen(ast_entfield *self, ast_function *func, bool lvalue, ir_value **out)

13
ast.h
View file

@ -276,11 +276,24 @@ struct ast_function_s
ir_function *ir_func;
ir_block *curblock;
size_t labelcount;
/* in order for thread safety - for the optional
* channel abesed multithreading... keeping a buffer
* here to use in ast_function_label.
*/
char labelbuf[64];
MEM_VECTOR_MAKE(ast_block*, blocks);
};
ast_function* ast_function_new(lex_ctx ctx, const char *name, ast_value *vtype);
/* This will NOT delete the underlying ast_value */
void ast_function_delete(ast_function*);
/* TODO: for better readability in dumps, this should take some kind of
* value prefix...
* For "optimized" builds this can just keep returning "foo"...
* or whatever...
*/
const char* ast_function_label(ast_function*);
MEM_VECTOR_PROTO(ast_function, ast_block*, blocks);