From a5b0a0bab5c721e9d0771d840947d7a0625e26d3 Mon Sep 17 00:00:00 2001 From: kramm Date: Tue, 30 Dec 2008 22:33:04 +0000 Subject: [PATCH] dump out global methods --- lib/as3/mklib.c | 140 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 85 insertions(+), 55 deletions(-) diff --git a/lib/as3/mklib.c b/lib/as3/mklib.c index 34356c3..ff9cfbc 100644 --- a/lib/as3/mklib.c +++ b/lib/as3/mklib.c @@ -24,6 +24,7 @@ #include #include "../rfxswf.h" #include "../os.h" +#include "pool.h" #include "files.h" #include "tokenizer.h" #include "parser.tab.h" @@ -83,6 +84,10 @@ static int compare_classes(const void*v1, const void*v2) return strcmp(c1->classname->name, c2->classname->name); } +char* kind2string(int kind) +{ +} + void load_libraries(char*filename, int pass, FILE*fi) { SWF swf; @@ -99,7 +104,6 @@ void load_libraries(char*filename, int pass, FILE*fi) tosort=abc->classes; for(t=0;tclasses->num;t++) {index[t]=t;} qsort(index, abc->classes->num, sizeof(int), compare_classes); - for(t=0;tclasses->num;t++) { abc_class_t*cls = array_getvalue(abc->classes, index[t]); int access = cls->classname->ns->access; @@ -121,11 +125,11 @@ void load_libraries(char*filename, int pass, FILE*fi) } char*id = mkid(package, name); U8 flags = cls->flags; - - if(pass==0) - fprintf(fi, "static class_signature_t %s;\n", id); - else if(pass==1) { - fprintf(fi, "static class_signature_t %s = {0x%02x, 0x%02x, \"%s\", \"%s\"", id, access, flags, package, name); + + if(pass==0) { + fprintf(fi, "static classinfo_t %s;\n", id); + } else if(pass==1) { + fprintf(fi, "static classinfo_t %s = {0x%02x, 0x%02x, \"%s\", \"%s\"", id, access, flags, package, name); if(superid) fprintf(fi, ", &%s, interfaces:{", superid); else @@ -143,61 +147,87 @@ void load_libraries(char*filename, int pass, FILE*fi) trait_list_t*l=cls->traits; fprintf(fi, " dict_put(d, &%s, &%s);\n", id, id); fprintf(fi, " dict_init(&%s.members, %d);\n", id, list_length(l)+1); - int j; - dict_t*d = dict_new(); - for(;l;l=l->next) { - trait_t*trait = l->trait; - if(trait->name->ns->access==ACCESS_PRIVATE) - continue; - char*type="something"; - const char*name = trait->name->name; - if(dict_lookup(d, name)) { - continue; - } else { - dict_put(d, (char*)name, (char*)name); - } - switch(trait->kind) { - case TRAIT_METHOD: type="method";break; - case TRAIT_CONST: type="const";break; - case TRAIT_FUNCTION: type="function";break; - case TRAIT_GETTER: type="member";break; - case TRAIT_SETTER: type="member";break; - case TRAIT_SLOT: type="member";break; - case TRAIT_CLASS: type="subclass";break; - } - fprintf(fi, " dict_put(&%s.members, \"%s\", \"%s\");\n", - id, name, type); + } + + + 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); } - l=cls->static_traits; - for(;l;l=l->next) { - trait_t*trait = l->trait; - if(trait->name->ns->access==ACCESS_PRIVATE) - continue; - char*type="static entity"; - const char*name = trait->name->name; - if(dict_lookup(d, name)) { - continue; - } else { - dict_put(d, (char*)name, (char*)name); - } - switch(trait->kind) { - case TRAIT_METHOD: type="static method";break; - case TRAIT_CONST: type="constant";break; - case TRAIT_FUNCTION: type="static function";break; - case TRAIT_GETTER: type="static variable";break; - case TRAIT_SETTER: type="static variable";break; - case TRAIT_SLOT: type="static variable";break; - case TRAIT_CLASS: type="static subclass";break; - } - fprintf(fi, " dict_put(&%s.members, \"%s\", \"%s\");\n", - id, name, type); + 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; } - dict_destroy(d); } + + dict_destroy(d); if(id) free(id); if(superid) free(superid); } + + for(t=0;tscripts->num;t++) { + abc_script_t*s = array_getvalue(abc->scripts, t); + trait_list_t*l=0; + for(l=s->traits;l;l=l->next) { + trait_t*trait = l->trait; + if(trait->kind == TRAIT_METHOD) { + printf("%s\n", multiname_tostring(trait->name)); + } + } + } + swf_FreeABC(abc); memfile_close(file);tag->data=0; @@ -216,7 +246,7 @@ int main() fprintf(fi, "dict_t* builtin_getclasses()\n"); fprintf(fi, "{\n"); - fprintf(fi, " dict_t*d = dict_new2(&class_signature_type);\n"); + fprintf(fi, " dict_t*d = dict_new2(&classinfo_type);\n"); load_libraries("builtin.abc", 2, fi); load_libraries("playerglobal.abc", 2, fi); fprintf(fi, " return d;\n"); -- 1.7.10.4