#include "registry.h"
#include "builtin.h"
-static dict_t*classes=0;
+dict_t*registry_classes=0;
// ----------------------- class signature ------------------------------
c->access = access;
c->package = package;
c->name = name;
- dict_put(classes, c, c);
- dict_init(&c->members,AVERAGE_NUMBER_OF_MEMBERS);
+ dict_put(registry_classes, c, c);
+ dict_init2(&c->members, &slotinfo_type, AVERAGE_NUMBER_OF_MEMBERS);
return c;
}
-methodinfo_t* methodinfo_register_onclass(classinfo_t*cls, U8 access, const char*name)
+methodinfo_t* methodinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name)
{
NEW(methodinfo_t,m);
m->kind = INFOTYPE_METHOD;
m->access = access;
m->name = name;
+ m->package = ns;
m->parent = cls;
- dict_put(&cls->members, name, m);
+ dict_put(&cls->members, m, m);
return m;
}
-varinfo_t* varinfo_register_onclass(classinfo_t*cls, U8 access, const char*name)
+varinfo_t* varinfo_register_onclass(classinfo_t*cls, U8 access, const char*ns, const char*name)
{
NEW(varinfo_t,m);
m->kind = INFOTYPE_SLOT;
m->access = access;
m->name = name;
+ m->package = ns;
m->parent = cls;
- dict_put(&cls->members, name, m);
+ dict_put(&cls->members, m, m);
return m;
}
methodinfo_t* methodinfo_register_global(U8 access, const char*package, const char*name)
m->package = package;
m->name = name;
m->parent = 0;
- dict_put(classes, m, m);
+ dict_put(registry_classes, m, m);
return m;
}
varinfo_t* varinfo_register_global(U8 access, const char*package, const char*name)
m->package = package;
m->name = name;
m->parent = 0;
- dict_put(classes, m, m);
+ dict_put(registry_classes, m, m);
return m;
}
void registry_init()
{
- if(!classes)
- classes = builtin_getclasses();
+ if(!registry_classes)
+ registry_classes = builtin_getclasses();
}
slotinfo_t* registry_find(const char*package, const char*name)
{
- assert(classes);
+ assert(registry_classes);
slotinfo_t tmp;
tmp.package = package;
tmp.name = name;
- slotinfo_t* c = (slotinfo_t*)dict_lookup(classes, &tmp);
+ slotinfo_t* c = (slotinfo_t*)dict_lookup(registry_classes, &tmp);
/*if(c)
printf("%s.%s->%08x (%s.%s)\n", package, name, c, c->package, c->name);*/
return c;
void registry_dump()
{
int t;
- for(t=0;t<classes->hashsize;t++) {
- dictentry_t*e = classes->slots[t];
+ for(t=0;t<registry_classes->hashsize;t++) {
+ dictentry_t*e = registry_classes->slots[t];
while(e) {
slotinfo_t*i = (slotinfo_t*)e->key;
printf("[%s] %s.%s\n", access2str(i->access), i->package, i->name);
}
}
-memberinfo_t* registry_findmember(classinfo_t*cls, const char*name, char recursive)
+memberinfo_t* registry_findmember(classinfo_t*cls, const char*ns, const char*name, char recursive)
{
+ memberinfo_t tmp;
+ tmp.name = name;
+ tmp.package = ns?ns:"";
+
if(!recursive) {
- return (memberinfo_t*)dict_lookup(&cls->members, name);
+ return (memberinfo_t*)dict_lookup(&cls->members, &tmp);
}
/* look at classes directly extended by this class */
slotinfo_t*m = 0;
s = s->superclass;
while(s) {
- m = (slotinfo_t*)dict_lookup(&s->members, name);
+ m = (slotinfo_t*)dict_lookup(&s->members, &tmp);
if(m) {
return (memberinfo_t*)m;
}
while(cls->interfaces[t]) {
classinfo_t*s = cls->interfaces[t];
while(s) {
- m = (slotinfo_t*)dict_lookup(&s->members, name);
+ m = (slotinfo_t*)dict_lookup(&s->members, &tmp);
if(m) {
return (memberinfo_t*)m;
}
t++;
}
return 0;
+}
+memberinfo_t* registry_findmember_nsset(classinfo_t*cls, namespace_list_t*ns, const char*name, char superclasses)
+{
+ while(ns) {
+ memberinfo_t*m = registry_findmember(cls, ns->namespace->name, name, superclasses);
+ if(m) return m;
+ ns = ns->next;
+ }
+ return registry_findmember(cls, "", name, superclasses);
}
+
+
void registry_fill_multiname(multiname_t*m, namespace_t*n, slotinfo_t*c)
{
m->type = QNAME;
c->name = "Class";
else if(f->kind == INFOTYPE_SLOT)
c->name = "Object";
+ else {
+ c->name = "undefined";
+ }
- dict_init(&c->members,1);
+ dict_init2(&c->members, &slotinfo_type, 1);
c->data = f;
dict_put(functionobjects, f, c);
return c;