X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Fregistry.c;h=5fd76cc6d182f898f75a22db39f930660ddb694e;hb=818ac2906f7eb845c097ef8362a9c1f231978f44;hp=8330a6e247208f2a2f171914aa33083570679ca6;hpb=d016fb9a0dd752b541a45830ec55516ada425944;p=swftools.git diff --git a/lib/as3/registry.c b/lib/as3/registry.c index 8330a6e..5fd76cc 100644 --- a/lib/as3/registry.c +++ b/lib/as3/registry.c @@ -114,9 +114,14 @@ static void resolve_on_class(slotinfo_t*_cls) { classinfo_t*cls = (classinfo_t*)_cls; cls->superclass = (classinfo_t*)registry_resolve((slotinfo_t*)cls->superclass); + DICT_ITERATE_DATA(&cls->members,slotinfo_t*,m) { - resolve_on_slot(m); + resolve_on_slot(m); } + DICT_ITERATE_DATA(&cls->static_members,slotinfo_t*,m2) { + resolve_on_slot(m2); + } + int t=0; while(cls->interfaces[t]) { cls->interfaces[t] = (classinfo_t*)registry_resolve((slotinfo_t*)cls->interfaces[t]); @@ -152,11 +157,12 @@ classinfo_t* classinfo_register(int access, const char*package, const char*name, c->name = name; dict_put(registry_classes, c, c); dict_init2(&c->members, &memberinfo_type, AVERAGE_NUMBER_OF_MEMBERS); + dict_init2(&c->static_members, &memberinfo_type, AVERAGE_NUMBER_OF_MEMBERS); schedule_for_resolve((slotinfo_t*)c); return c; } -methodinfo_t* methodinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name) +methodinfo_t* methodinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name, char is_static) { NEW(methodinfo_t,m); m->kind = INFOTYPE_METHOD; @@ -164,10 +170,13 @@ methodinfo_t* methodinfo_register_onclass(classinfo_t*cls, U8 access, const char m->name = name; m->package = ns; m->parent = cls; - dict_put(&cls->members, m, m); + if(!is_static) + dict_put(&cls->members, m, m); + else + dict_put(&cls->static_members, m, m); return m; } -varinfo_t* varinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name) +varinfo_t* varinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name, char is_static) { NEW(varinfo_t,m); m->kind = INFOTYPE_VAR; @@ -175,7 +184,10 @@ varinfo_t* varinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, c m->name = name; m->package = ns; m->parent = cls; - dict_put(&cls->members, m, m); + if(!is_static) + dict_put(&cls->members, m, m); + else + dict_put(&cls->static_members, m, m); return m; } methodinfo_t* methodinfo_register_global(U8 access, const char*package, const char*name) @@ -247,14 +259,17 @@ void registry_dump() } } -memberinfo_t* registry_findmember(classinfo_t*cls, const char*ns, const char*name, char recursive) +memberinfo_t* registry_findmember(classinfo_t*cls, const char*ns, const char*name, char recursive, char is_static) { memberinfo_t tmp; tmp.name = name; tmp.package = ns?ns:""; if(!recursive) { - return (memberinfo_t*)dict_lookup(&cls->members, &tmp); + if(!is_static) + return (memberinfo_t*)dict_lookup(&cls->members, &tmp); + else + return (memberinfo_t*)dict_lookup(&cls->static_members, &tmp); } /* look at classes directly extended by this class */ slotinfo_t*m = 0; @@ -267,10 +282,13 @@ memberinfo_t* registry_findmember(classinfo_t*cls, const char*ns, const char*nam if(s->kind == INFOTYPE_UNRESOLVED) break; - m = (slotinfo_t*)dict_lookup(&s->members, &tmp); - if(m) { - return (memberinfo_t*)m; - } + if(!is_static) { + m = (slotinfo_t*)dict_lookup(&s->members, &tmp); + if(m) return (memberinfo_t*)m; + } + m = (slotinfo_t*)dict_lookup(&s->static_members, &tmp); + if(m) return (memberinfo_t*)m; + s = s->superclass; } /* look at interfaces, and parent interfaces */ @@ -279,10 +297,13 @@ memberinfo_t* registry_findmember(classinfo_t*cls, const char*ns, const char*nam classinfo_t*s = cls->interfaces[t]; if(s->kind != INFOTYPE_UNRESOLVED) { while(s) { - m = (slotinfo_t*)dict_lookup(&s->members, &tmp); - if(m) { - return (memberinfo_t*)m; - } + if(!is_static) { + m = (slotinfo_t*)dict_lookup(&s->members, &tmp); + if(m) return (memberinfo_t*)m; + } + m = (slotinfo_t*)dict_lookup(&s->static_members, &tmp); + if(m) return (memberinfo_t*)m; + s = s->superclass; } } @@ -291,20 +312,20 @@ memberinfo_t* registry_findmember(classinfo_t*cls, const char*ns, const char*nam return 0; } -memberinfo_t* registry_findmember_nsset(classinfo_t*cls, namespace_list_t*ns, const char*name, char superclasses) +memberinfo_t* registry_findmember_nsset(classinfo_t*cls, namespace_list_t*ns, const char*name, char superclasses, char is_static) { memberinfo_t*m = 0; while(ns) { - m = registry_findmember(cls, ns->namespace->name, name, superclasses); + m = registry_findmember(cls, ns->namespace->name, name, superclasses, is_static); if(m) return m; ns = ns->next; } - m = registry_findmember(cls, "", name, superclasses); + m = registry_findmember(cls, "", name, superclasses, is_static); if(m) return m; /* TODO: it maybe would be faster to just store the builtin namespace as "" in 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); + m = registry_findmember(cls, "http://adobe.com/AS3/2006/builtin", name, superclasses, is_static); if(m) return m; return 0; } @@ -358,6 +379,7 @@ classinfo_t* slotinfo_asclass(slotinfo_t*f) { } dict_init2(&c->members, &memberinfo_type, 1); + dict_init2(&c->static_members, &memberinfo_type, 1); c->data = f; dict_put(functionobjects, f, c); return c;