+// ----------------------- assets -------------------------------------
+static void use_asset(asset_bundle_t*a)
+{
+ a->used = 1;
+ asset_bundle_list_t*l = a->dependencies;
+ while(l) {
+ if(!l->asset_bundle->used) {
+ use_asset(l->asset_bundle);
+ }
+ l = l->next;
+ }
+}
+void registry_use(slotinfo_t*s)
+{
+ 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) {
+ use_asset(c->assets);
+ }
+ 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);
+ }
+ }
+ }
+}
+void registry_add_asset(asset_bundle_t*bundle)
+{
+ list_append(assets, bundle);
+}
+asset_bundle_list_t*registry_getassets()
+{
+ return assets;
+}
+// ----------------------- resolving ----------------------------------
+slotinfo_t* registry_resolve(slotinfo_t*_s)
+{
+ if(!_s || _s->kind != INFOTYPE_UNRESOLVED)
+ return _s;
+ unresolvedinfo_t*s = (unresolvedinfo_t*)_s;
+
+ if(s->package)
+ return registry_find(s->package, s->name);
+
+ namespace_list_t*l = s->nsset;
+ while(l) {
+ slotinfo_t* n = registry_find(l->namespace->name, s->name);
+ if(n) return n;
+ l = l->next;
+ }
+ return 0;
+}