X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Fregistry.c;h=5b6d552afe14fa8bfd5ff12d18de032d7aaa68cb;hb=e4687b3aa2aed49fb16ba9e9561344d808750297;hp=4d18680146ec8afa23a7f6569c7fee2c3b55b8a4;hpb=a1dde8db3bde6aa26562dadae696d5d54ef752d2;p=swftools.git diff --git a/lib/as3/registry.c b/lib/as3/registry.c index 4d18680..5b6d552 100644 --- a/lib/as3/registry.c +++ b/lib/as3/registry.c @@ -264,6 +264,9 @@ memberinfo_t* registry_findmember(classinfo_t*cls, const char*ns, const char*nam s = s->superclass; while(s) { + if(s->kind == INFOTYPE_UNRESOLVED) + break; + m = (slotinfo_t*)dict_lookup(&s->members, &tmp); if(m) { return (memberinfo_t*)m; @@ -299,7 +302,8 @@ memberinfo_t* registry_findmember_nsset(classinfo_t*cls, namespace_list_t*ns, co m = registry_findmember(cls, "", name, superclasses); if(m) return m; /* TODO: it maybe would be faster to just store the builtin namespace as "" in - builtins.c */ + builtins.c (update: some members (e.g. XML.length) are present both for + "" and "http:...builtin") */ m = registry_findmember(cls, "http://adobe.com/AS3/2006/builtin", name, superclasses); if(m) return m; return 0; @@ -431,6 +435,16 @@ classinfo_t* registry_getregexpclass() { if(!c) c = (classinfo_t*)registry_safefind("", "RegExp"); return c; } +classinfo_t* registry_getxmlclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "XML"); + return c; +} +classinfo_t* registry_getxmllistclass() { + static classinfo_t*c = 0; + if(!c) c = (classinfo_t*)registry_safefind("", "XMLList"); + return c; +} classinfo_t* registry_getnamespaceclass() { static classinfo_t*c = 0; if(!c) c = (classinfo_t*)registry_safefind("", "Namespace"); @@ -449,6 +463,12 @@ classinfo_t nullclass = { classinfo_t* registry_getnullclass() { return &nullclass; } +classinfo_t voidclass = { + INFOTYPE_CLASS,0,0,ACCESS_PACKAGE, "", "void", 0, 0, 0 +}; +classinfo_t* registry_getvoidclass() { + return &voidclass; +} namespace_t access2namespace(U8 access, char*package) { @@ -461,8 +481,34 @@ namespace_t access2namespace(U8 access, char*package) char* infotypename(slotinfo_t*s) { if(s->kind == INFOTYPE_CLASS) return "class"; - else if(s->kind == INFOTYPE_VAR) return "member"; - else if(s->kind == INFOTYPE_METHOD) return "method"; + else if(s->kind == INFOTYPE_VAR) return "var"; + else if(s->kind == INFOTYPE_METHOD) return "function"; else return "object"; } +void slotinfo_dump(slotinfo_t*s) +{ + if(s->package[0]) { + printf("%s %s.%s", infotypename(s), s->package, s->name); + } else { + printf("%s %s", infotypename(s), s->name); + } + if(s->kind == INFOTYPE_CLASS) { + classinfo_t*c = (classinfo_t*)s; + } + else if(s->kind == INFOTYPE_VAR) { + varinfo_t*v = (varinfo_t*)s; + printf(":%s", v->type?v->type->name:"*"); + if(v->value) + printf("=%s", constant_tostring(v->value)); + if(v->slot) + printf(" (slot:%d)", v->slot); + } + else if(s->kind == INFOTYPE_METHOD) { + methodinfo_t*m = (methodinfo_t*)s; + } + else { + } + printf("\n"); +} +