Support in the AST for TYPE_FIELD globals which are no actual fields

This commit is contained in:
Wolfgang (Blub) Bumiller 2012-11-10 12:15:59 +01:00
parent fe05d5afd9
commit 52daf02444
3 changed files with 8 additions and 8 deletions

4
ast.c
View file

@ -877,7 +877,7 @@ bool ast_value_codegen(ast_value *self, ast_function *func, bool lvalue, ir_valu
return true;
}
bool ast_global_codegen(ast_value *self, ir_builder *ir)
bool ast_global_codegen(ast_value *self, ir_builder *ir, bool isfield)
{
ir_value *v = NULL;
if (self->isconst && self->expression.vtype == TYPE_FUNCTION)
@ -894,7 +894,7 @@ bool ast_global_codegen(ast_value *self, ir_builder *ir)
return true;
}
if (self->expression.vtype == TYPE_FIELD) {
if (isfield && self->expression.vtype == TYPE_FIELD) {
v = ir_builder_create_field(ir, self->name, self->expression.next->expression.vtype);
if (!v)
return false;

2
ast.h
View file

@ -171,7 +171,7 @@ bool ast_value_set_name(ast_value*, const char *name);
bool ast_value_codegen(ast_value*, ast_function*, bool lvalue, ir_value**);
bool ast_local_codegen(ast_value *self, ir_function *func, bool isparam);
bool ast_global_codegen(ast_value *self, ir_builder *ir);
bool ast_global_codegen(ast_value *self, ir_builder *ir, bool isfield);
bool GMQCC_WARN ast_value_params_add(ast_value*, ast_value*);

View file

@ -2994,7 +2994,7 @@ bool parser_finish(const char *output)
field = (ast_value*)parser->fields[i].var;
isconst = field->isconst;
field->isconst = false;
if (!ast_global_codegen((ast_value*)field, ir)) {
if (!ast_global_codegen((ast_value*)field, ir, true)) {
printf("failed to generate field %s\n", field->name);
ir_builder_delete(ir);
return false;
@ -3025,28 +3025,28 @@ bool parser_finish(const char *output)
"unused global: `%s`", asvalue->name);
}
}
if (!ast_global_codegen(asvalue, ir)) {
if (!ast_global_codegen(asvalue, ir, false)) {
printf("failed to generate global %s\n", parser->globals[i].name);
ir_builder_delete(ir);
return false;
}
}
for (i = 0; i < parser->imm_float_count; ++i) {
if (!ast_global_codegen(parser->imm_float[i], ir)) {
if (!ast_global_codegen(parser->imm_float[i], ir, false)) {
printf("failed to generate global %s\n", parser->imm_float[i]->name);
ir_builder_delete(ir);
return false;
}
}
for (i = 0; i < parser->imm_string_count; ++i) {
if (!ast_global_codegen(parser->imm_string[i], ir)) {
if (!ast_global_codegen(parser->imm_string[i], ir, false)) {
printf("failed to generate global %s\n", parser->imm_string[i]->name);
ir_builder_delete(ir);
return false;
}
}
for (i = 0; i < parser->imm_vector_count; ++i) {
if (!ast_global_codegen(parser->imm_vector[i], ir)) {
if (!ast_global_codegen(parser->imm_vector[i], ir, false)) {
printf("failed to generate global %s\n", parser->imm_vector[i]->name);
ir_builder_delete(ir);
return false;