X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fas3%2Fregistry.c;h=05d275ed4448d3f271a755646e36723620cfcb0a;hp=4b6b66c139480d4549b5f0ed46751a74d49bb15a;hb=b0dd28e6cbbab28a953f48bf3fe084a0b62fab63;hpb=9ed9a87914fc9a590967d46de404e0f6290b7bb2 diff --git a/lib/as3/registry.c b/lib/as3/registry.c index 4b6b66c..05d275e 100644 --- a/lib/as3/registry.c +++ b/lib/as3/registry.c @@ -75,18 +75,31 @@ type_t memberinfo_type = { // ----------------------- assets ------------------------------------- void registry_use(slotinfo_t*s) { - if(s->kind == INFOTYPE_CLASS) { - classinfo_t*c=(classinfo_t*)s; - if(c->assets) c->assets->used = 1; - } else if(s->kind == INFOTYPE_METHOD) { - methodinfo_t*m=(methodinfo_t*)s; - if(m->parent) { - registry_use((slotinfo_t*)m->parent); - } - } else if(s->kind == INFOTYPE_VAR) { - varinfo_t*v=(varinfo_t*)s; - if(v->parent) { - registry_use((slotinfo_t*)v->parent); + if(!s) return; + if(!(s->flags&FLAG_USED)) { + s->flags |= FLAG_USED; + if(s->kind == INFOTYPE_CLASS) { + classinfo_t*c=(classinfo_t*)s; + if(c->assets) c->assets->used = 1; + int t=0; + while(c->interfaces[t]) { + registry_use((slotinfo_t*)c->interfaces[t]); + t++; + } + while(c->superclass) { + c = c->superclass; + registry_use((slotinfo_t*)c); + } + } else if(s->kind == INFOTYPE_METHOD) { + methodinfo_t*m=(methodinfo_t*)s; + if(m->parent) { + registry_use((slotinfo_t*)m->parent); + } + } else if(s->kind == INFOTYPE_VAR) { + varinfo_t*v=(varinfo_t*)s; + if(v->parent) { + registry_use((slotinfo_t*)v->parent); + } } } }