mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-07 08:21:59 +00:00
Rewrite emit_ivars to use emit_structure.
The old code was broken anyway :) (it was segfaulting).
This commit is contained in:
parent
acb3c0da11
commit
f721144ca5
1 changed files with 62 additions and 37 deletions
|
@ -412,56 +412,81 @@ begin_category (category_t *category)
|
||||||
va ("%s_%s", class->name, category->name)));
|
va ("%s_%s", class->name, category->name)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int count;
|
||||||
|
symbol_t *ivars;
|
||||||
|
dstring_t *encoding;
|
||||||
|
} ivar_data_t;
|
||||||
|
|
||||||
|
static void
|
||||||
|
emit_ivar_count (def_t *def, void *data, int index)
|
||||||
|
{
|
||||||
|
ivar_data_t *ivar_data = (ivar_data_t *) data;
|
||||||
|
|
||||||
|
if (def->type != &type_integer)
|
||||||
|
internal_error (0, "%s: expected integer def", __FUNCTION__);
|
||||||
|
D_INT (def) = ivar_data->count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
emit_ivar_list_item (def_t *def, void *data, int index)
|
||||||
|
{
|
||||||
|
ivar_data_t *ivar_data = (ivar_data_t *) data;
|
||||||
|
symbol_t *ivar_sym;
|
||||||
|
pr_ivar_t *ivar;
|
||||||
|
defspace_t *space;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
//FIXME the type is dynamic, so need a way to pass it before it cn be
|
||||||
|
//checked
|
||||||
|
if (def->type != &XXX)
|
||||||
|
internal_error (0, "%s: expected XXX def",
|
||||||
|
__FUNCTION__);
|
||||||
|
#endif
|
||||||
|
if (index < 0 || index >= ivar_data->count)
|
||||||
|
internal_error (0, "%s: out of bounds index: %d %d",
|
||||||
|
__FUNCTION__, index, ivar_data->count);
|
||||||
|
|
||||||
|
for (ivar_sym = ivar_data->ivars; ivar_sym; ivar_sym = ivar_sym->next) {
|
||||||
|
if (ivar_sym->sy_type != sy_var)
|
||||||
|
continue;
|
||||||
|
if (!index--)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ivar = D_POINTER (pr_ivar_t, def);
|
||||||
|
space = def->space;
|
||||||
|
dstring_clearstr (ivar_data->encoding);
|
||||||
|
|
||||||
|
EMIT_STRING (space, ivar->ivar_name, ivar_sym->name);
|
||||||
|
encode_type (ivar_data->encoding, ivar_sym->type);
|
||||||
|
EMIT_STRING (space, ivar->ivar_type, ivar_data->encoding->str);
|
||||||
|
ivar->ivar_offset = ivar_sym->s.offset;
|
||||||
|
}
|
||||||
|
|
||||||
static def_t *
|
static def_t *
|
||||||
emit_ivars (symtab_t *ivars, const char *name)
|
emit_ivars (symtab_t *ivars, const char *name)
|
||||||
{
|
{
|
||||||
//FIXME use emit_struct
|
|
||||||
static struct_def_t ivar_list_struct[] = {
|
static struct_def_t ivar_list_struct[] = {
|
||||||
{"ivar_count", &type_integer},
|
{"ivar_count", &type_integer, emit_ivar_count},
|
||||||
{"ivar_list", 0}, // type filled in at runtime
|
{"ivar_list", 0, emit_ivar_list_item},
|
||||||
{0, 0}
|
{0, 0}
|
||||||
};
|
};
|
||||||
dstring_t *encoding = dstring_newstr ();
|
ivar_data_t ivar_data = {0, 0};
|
||||||
symbol_t *sym;
|
|
||||||
symbol_t *s;
|
symbol_t *s;
|
||||||
def_t *def;
|
def_t *def;
|
||||||
defspace_t *space;
|
|
||||||
int count;
|
|
||||||
int i;
|
|
||||||
type_t new;
|
|
||||||
type_t *type;
|
|
||||||
pr_ivar_list_t *pr_ivar_list;
|
|
||||||
|
|
||||||
|
ivar_data.encoding = dstring_newstr ();
|
||||||
|
ivar_data.ivars = ivars->symbols;
|
||||||
for (s = ivars->symbols; s; s = s->next)
|
for (s = ivars->symbols; s; s = s->next)
|
||||||
if (s->sy_type == sy_var)
|
if (s->sy_type == sy_var)
|
||||||
count++;
|
ivar_data.count++;
|
||||||
ivar_list_struct[1].type = array_type (&type_ivar, count);
|
ivar_list_struct[1].type = array_type (&type_ivar, ivar_data.count);
|
||||||
make_structure (0, 's', ivar_list_struct, &new);
|
|
||||||
type = find_type (&new);
|
|
||||||
|
|
||||||
sym = make_symbol (va ("_OBJ_INSTANCE_VARIABLES_%s", name), type,
|
def = emit_structure (va ("_OBJ_INSTANCE_VARIABLES_%s", name), 's',
|
||||||
pr.far_data, st_global);
|
ivar_list_struct, 0, &ivar_data, st_static);
|
||||||
def = sym->s.def;
|
|
||||||
space = def->space;
|
|
||||||
if (def->initialized)
|
|
||||||
goto done;
|
|
||||||
def->initialized = def->constant = def->nosave = 1;
|
|
||||||
|
|
||||||
pr_ivar_list = &D_STRUCT (pr_ivar_list_t, def);
|
dstring_delete (ivar_data.encoding);
|
||||||
pr_ivar_list->ivar_count = count;
|
|
||||||
for (i = 0, s = ivars->symbols; s; s = s->next) {
|
|
||||||
if (s->sy_type != sy_var)
|
|
||||||
continue;
|
|
||||||
encode_type (encoding, s->type);
|
|
||||||
EMIT_STRING (space, pr_ivar_list->ivar_list[i].ivar_name, s->name);
|
|
||||||
EMIT_STRING (space, pr_ivar_list->ivar_list[i].ivar_type,
|
|
||||||
encoding->str);
|
|
||||||
pr_ivar_list->ivar_list[i].ivar_offset = s->s.offset;
|
|
||||||
dstring_clearstr (encoding);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
done:
|
|
||||||
dstring_delete (encoding);
|
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue