mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-23 12:22:26 +00:00
Adding from astcodegen.c
This commit is contained in:
parent
e9b581adfb
commit
6236a0c464
1 changed files with 74 additions and 0 deletions
74
ast.c
74
ast.c
|
@ -153,3 +153,77 @@ void ast_function_delete(ast_function *self)
|
|||
MEM_VECTOR_CLEAR(self, blocks);
|
||||
mem_d(self);
|
||||
}
|
||||
|
||||
/*********************************************************************/
|
||||
/* AST codegen aprt
|
||||
*/
|
||||
|
||||
static qbool ast_value_gen_global(ir_builder *ir, ast_value *self, ir_value **out)
|
||||
{
|
||||
ir_value *v;
|
||||
*out = NULL;
|
||||
|
||||
/* Generate functions */
|
||||
if (self->vtype == qc_function && self->has_constval)
|
||||
{
|
||||
/* Without has_constval it would be invalid... function pointers actually have
|
||||
* type qc_pointer and next with type qc_function
|
||||
*/
|
||||
ast_function *func = self->cvalue.vfunc;
|
||||
(void)func;
|
||||
if (!ast_function_codegen(func, ir))
|
||||
return ifalse;
|
||||
|
||||
/* Here we do return NULL anyway */
|
||||
return itrue;
|
||||
}
|
||||
else if (self->vtype == qc_function && !self->has_constval) {
|
||||
fprintf(stderr,
|
||||
"!v->has_constval <- qc_function body missing - FIXME: remove when implementing prototypes\n");
|
||||
fprintf(stderr, "Value: %s\n", self->_name);
|
||||
abort();
|
||||
}
|
||||
|
||||
v = ir_builder_create_global(ir, self->_name, self->vtype);
|
||||
self->ir_v = v;
|
||||
|
||||
*out = v;
|
||||
return itrue;
|
||||
}
|
||||
|
||||
qbool ast_value_codegen(ast_value *self, ast_function *func, ir_value **out)
|
||||
{
|
||||
if (!func)
|
||||
return ast_value_gen_global(parser.ir, self, out);
|
||||
return ifalse;
|
||||
}
|
||||
|
||||
qbool ast_function_codegen(ast_function *self, ir_builder *builder)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < self->blocks_count; ++i)
|
||||
{
|
||||
ast_expression *expr;
|
||||
ir_value *out;
|
||||
|
||||
expr = (ast_expression*)self->blocks[i];
|
||||
|
||||
if (!(expr->expression.codegen)(expr, self, &out))
|
||||
{
|
||||
/* there was an error while building this expression... */
|
||||
return ifalse;
|
||||
}
|
||||
(void)out;
|
||||
}
|
||||
return itrue;
|
||||
}
|
||||
|
||||
qbool ast_block_codegen(ast_block *self, ir_function *func, ir_value **out)
|
||||
{
|
||||
return ifalse;
|
||||
}
|
||||
|
||||
qbool ast_bin_store_codegen(ast_binary *self, ir_function *func, ir_value **out)
|
||||
{
|
||||
return ifalse;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue