if (!t) {
char name[256];
- snprintf(name, sizeof(name) - 1, "anonymous_%d", ast->nb_structs);
+ snprintf(name, sizeof(name) - 1, "anon_type_%d", ast->nb_structs);
t = scf_type_alloc(w, name, SCF_STRUCT + ast->nb_structs, 0);
if (!t)
return SCF_DFA_ERROR;
+
+ t->node.anon_flag = 1;
}
if (!t->scope)
return SCF_DFA_NEXT_WORD;
}
+static int _class_flat_anon_var(scf_type_t* s)
+{
+ scf_type_t* t;
+ scf_variable_t* v;
+ scf_variable_t* v2;
+ int i;
+ int j;
+
+ for (i = 0; i < s->scope->vars->size; ) {
+ v = s->scope->vars->data[i];
+
+ if (!v->anon_flag) {
+ i++;
+ continue;
+ }
+
+ t = scf_scope_find_type_type(s->scope, v->type);
+ assert(t);
+
+ int offset = v->offset;
+
+ assert(0 == scf_vector_del(s->scope->vars, v));
+ scf_variable_free(v);
+ v = NULL;
+
+ if (t->scope->vars->size <= 0)
+ continue;
+
+ for (j = 0; j < t->scope->vars->size; j++) {
+ v2 = t->scope->vars->data[j];
+
+ assert(!v2->anon_flag);
+
+ v2->offset += offset;
+ }
+
+ int n = s->scope->vars->size;
+
+ int ret = scf_vector_cat(s->scope->vars, t->scope->vars);
+ if (ret < 0) {
+ scf_loge("\n");
+ return ret;
+ }
+
+ for (j = n - 1; j >= i; j--)
+ s->scope->vars->data[j + t->scope->vars->size] = s->scope->vars->data[j];
+
+ for (j = 0; j < t->scope->vars->size; j++)
+ s->scope->vars->data[i + j] = t->scope->vars->data[j];
+
+ scf_loge("i: %d, s->size: %d, t->size: %d\n", i, s->scope->vars->size, t->scope->vars->size);
+
+ n = t->scope->vars->size;
+ i += n;
+
+ scf_vector_free(t->scope->vars);
+ t->scope->vars = NULL;
+ }
+
+ return 0;
+}
+
static int _class_calculate_size(scf_dfa_t* dfa, scf_type_t* s)
{
scf_variable_t* v;
scf_stack_t* s = d->module_datas[dfa_module_class.index];
dfa_class_data_t* cd = scf_stack_top(s);
scf_lex_word_t* w;
+ scf_variable_t* v;
assert(cd);
else
ret = _union_calculate_size(dfa, cd->current_type);
+ if (ret < 0)
+ return SCF_DFA_ERROR;
+
+ ret = _class_flat_anon_var(cd->current_type);
if (ret < 0) {
scf_loge("\n");
return SCF_DFA_ERROR;
}
dfa->ops->push_word(dfa, w);
+
+ } else if (SCF_LEX_WORD_SEMICOLON == w->type
+ && s->size > 1
+ && cd->current_type->node.anon_flag) {
+
+ char name[256];
+ int len = snprintf(name, sizeof(name) - 1, "anon_var_%d", w->line);
+
+ v = scf_variable_alloc(w, cd->current_type);
+ if (!v)
+ return -ENOMEM;
+
+ ret = scf_string_copy_cstr_len(v->w->text, name, len);
+ if (ret < 0) {
+ scf_variable_free(v);
+ return ret;
+ }
+
+ v->anon_flag = 1;
+ v->member_flag = 1;
+
+ scf_scope_push_var(ast->current_block->scope, v);
}
return SCF_DFA_NEXT_WORD;