forked from macournoyer/tinyrb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
class.c
61 lines (51 loc) · 1.38 KB
/
class.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "tr.h"
#include "internal.h"
/* class */
OBJ TrClass_new(VM, OBJ name, OBJ super) {
TrClass *c = TR_INIT_OBJ(Class);
c->name = name;
c->super = super;
c->methods = kh_init(OBJ);
return (OBJ)c;
}
OBJ TrClass_allocate(VM, OBJ self) {
TrObject *o = TR_INIT_OBJ(Object);
o->class = self;
return (OBJ)o;
}
OBJ TrClass_lookup(VM, OBJ self, OBJ name) {
TrClass *c = TR_CCLASS(self);
khiter_t k = kh_get(OBJ, c->methods, name);
if (k != kh_end(c->methods)) return kh_value(c->methods, k);
if (c->super) return TrClass_lookup(vm, c->super, name);
return TR_NIL;
}
OBJ TrClass_add_method(VM, OBJ self, OBJ name, OBJ method) {
TrClass *c = TR_CCLASS(self);
int ret;
khiter_t k = kh_put(OBJ, c->methods, name, &ret);
if (!ret) kh_del(OBJ, c->methods, k);
kh_value(c->methods, k) = method;
return method;
}
OBJ TrClass_name(VM, OBJ self) {
return TR_CCLASS(self)->name;
}
OBJ TrClass_superclass(VM, OBJ self) {
return TR_CCLASS(self)->super;
}
void TrClass_init(VM) {
OBJ c = TR_INIT_CLASS(Class, Object);
tr_def(c, "name", TrClass_name, 0);
tr_def(c, "to_s", TrClass_name, 0);
tr_def(c, "superclass", TrClass_superclass, 0);
tr_def(c, "allocate", TrClass_allocate, 0);
}
/* method */
OBJ TrMethod_new(VM, TrFunc *func, OBJ data, int arity) {
TrMethod *m = TR_INIT_OBJ(Method);
m->func = func;
m->data = data;
m->arity = arity;
return (OBJ)m;
}