+void write_slotinfo(FILE*fi, slotinfo_t*s, char*id, char*prefix)
+{
+ if(s->kind == INFOTYPE_SLOT) {
+ varinfo_t*v = (varinfo_t*)s;
+ if(v->value) {
+ write_constant(fi, v->value, id, prefix);
+ }
+ }
+ fprintf(fi, "%s", prefix);
+ fprintf(fi, "static %s %s = {", mktype(s), id);
+ fprintf(fi, "0x%02x, 0x%02x, 0x%02x, 0x%02x, ", s->kind, s->subtype, s->flags, s->access);
+ if(s->package)
+ fprintf(fi, "\"%s\", ", s->package);
+ else
+ fprintf(fi, "0, ");
+
+ if(s->name)
+ fprintf(fi, "\"%s\", ", s->name);
+ else
+ fprintf(fi, "0, ");
+
+ fprintf(fi, "%d, ", s->slot);
+
+ if(s->kind == INFOTYPE_CLASS) {
+ classinfo_t*c = (classinfo_t*)s;
+ fprintf(fi, "%s, ", mkptr(c->superclass));
+ fprintf(fi, "interfaces: {");
+ int t;
+ for(t=0;c->interfaces[t];t++) {
+ fprintf(fi, "%s", mkptr(c->interfaces[t]));
+ fprintf(fi, ", ");
+ }
+ fprintf(fi, "0}};\n");
+ }
+ if(s->kind == INFOTYPE_METHOD) {
+ methodinfo_t*m = (methodinfo_t*)s;
+ fprintf(fi, "%s, ", mkptr(m->return_type));
+ fprintf(fi, "%s, ", mkptr(m->parent));
+ fprintf(fi, "0"); // params TODO
+ fprintf(fi, "};\n");
+ }
+ if(s->kind == INFOTYPE_SLOT) {
+ varinfo_t*m = (varinfo_t*)s;
+ fprintf(fi, "%s, ", mkptr(m->type));
+ fprintf(fi, "%s, ", mkptr(m->parent));
+ if(!m->value) fprintf(fi, "0");
+ else fprintf(fi, "&%s_constant", id);
+ fprintf(fi, "};\n");
+ }
+
+ if(s->kind == INFOTYPE_CLASS) {
+ classinfo_t*c = (classinfo_t*)s;
+ dict_t*d = &c->members;
+ int t;
+ for(t=0;t<d->hashsize;t++) {
+ dictentry_t*l = d->slots[t];
+ while(l) {
+ slotinfo_t*s2 = (slotinfo_t*)l->data;
+ write_slotinfo(fi, s2, mkid2(id,s2->name), prefix);
+ l = l->next;
+ }
+ }
+ }