+ if(pass==0 || pass==1 || pass==3) {
+ int t;
+
+#define IS_PUBLIC_MEMBER(trait) ((trait)->kind != TRAIT_CLASS)
+
+ /* count public functions */
+ int num_methods=0;
+ for(t=0;t<abc->scripts->num;t++) {
+ trait_list_t*l = ((abc_script_t*)array_getvalue(abc->scripts, t))->traits;
+ for(;l;l=l->next) {
+ num_methods += IS_PUBLIC_MEMBER(l->trait);
+ }
+ }
+ trait_t**traits = (trait_t**)malloc(num_methods*sizeof(trait_t*));
+ num_methods=0;
+ for(t=0;t<abc->scripts->num;t++) {
+ trait_list_t*l = ((abc_script_t*)array_getvalue(abc->scripts, t))->traits;
+ for(;l;l=l->next) {
+ if(IS_PUBLIC_MEMBER(l->trait)) {
+ traits[num_methods++] = l->trait;
+ }
+ }
+ }
+ qsort(traits, num_methods, sizeof(trait_t*), compare_traits);
+ const char*last_package = "-xxx-";
+ for(t=0;t<num_methods;t++) {
+ trait_t*trait = traits[t];
+ if(IS_PUBLIC_MEMBER(trait)) {
+ const char*package = trait->name->ns->name;
+ const char*name = trait->name->name;
+ char*pid = mkpid(package);
+ char*id2 = mkid2(trait->name);
+ int flags = FLAG_STATIC|access2flags(trait->name);
+ NEW(memberinfo_t,m);
+ char np = 0;
+ int clsflags = FLAG_STATIC | FLAG_METHOD;
+ if(pass==0) {
+ fprintf(fi, "static memberinfo_t %s;\n", id2);
+ fprintf(fi, "static classinfo_t %s_class;\n", id2);
+ } else if(pass==1) {
+ write_member_info(fi, 0, id2, name, flags, trait);
+ fprintf(fi, "static classinfo_t %s_class = {0x%02x, 0x%02x, \"%s\", \"%s\", &%s, 0, members:{0}};\n",
+ id2,
+ trait->name->ns->access, clsflags,
+ package, name,
+ id2);
+ } else if(pass==3) {
+ /*if(np) {
+ fprintf(fi, " dict_init(%s.classes, 1); //not used yet\n", pid);
+ fprintf(fi, " dict_init(%s.functions, 1);\n", pid);
+ }
+ fprintf(fi, " dict_put(&%s.functions, \"%s\", &%s);\n", pid, name, id2);*/
+ fprintf(fi, " dict_put(d, &%s_class, &%s_class);\n", id2, id2);
+ }
+ } else if(trait->kind == TRAIT_CLASS) {
+ // ignore classes, these are treated above
+ } else {
+ printf("%02x %s\n", trait->kind, multiname_tostring(trait->name));
+ }
+ }
+ }