-
- trait_list_t*l=0;
- char is_static = 0;
- dict_t*d = dict_new();
- l = cls->traits;
- while(l) {
- trait_t*trait = l->trait;
- if(trait->name->ns->access==ACCESS_PRIVATE)
- goto cont;
- const char*name = trait->name->name;
- char id2[1024];
- sprintf(id2, "%s_%s", id, name);
- char*retvalue = 0;
-
- if(dict_lookup(d, name)) {
- goto cont;
- } else {
- dict_put(d, (char*)name, (char*)name);
- }
- char*type="0";
- switch(trait->kind) {
- case TRAIT_METHOD: {
- multiname_t*ret = trait->method->return_type;
- if(!ret)
- retvalue = 0;
- else
- retvalue = mkid(ret->ns->name, ret->name);
- if(ret && !strcmp(ret->name, "void"))
- retvalue = 0;
- } //fallthrough
- case TRAIT_FUNCTION:
- type = "MEMBER_METHOD";
- break;
- case TRAIT_CONST:
- case TRAIT_GETTER:
- case TRAIT_SETTER:
- case TRAIT_SLOT:
- type = "MEMBER_SLOT";
- break;
- default:
- fprintf(stderr, "Unknown trait type %d\n", trait->kind);
- }
- if(pass==0) {
- fprintf(fi, "static memberinfo_t %s;\n", id2);
- } if(pass==1) {
- fprintf(fi, "static memberinfo_t %s = {%s, \"%s\"", id2, type, name);
- if(!retvalue)
- fprintf(fi, ", 0");
- else
- fprintf(fi, ", &%s", retvalue);
- fprintf(fi, "};\n");
- } else if(pass==2) {
- fprintf(fi, " dict_put(&%s.members, \"%s\", &%s);\n", id, name, id2);
- }
-cont:
- l = l->next;
- if(!l && !is_static) {
- l = cls->static_traits;
- is_static = 1;
+ 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));
+ fprintf(fi, "0"); // value TODO
+ 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;