forked from rubinius/rubinius
-
Notifications
You must be signed in to change notification settings - Fork 0
/
builtin_class.cpp
91 lines (68 loc) · 2.25 KB
/
builtin_class.cpp
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "vm.hpp"
#include "builtin_class.hpp"
#include "objectmemory.hpp"
namespace rubinius {
Class* Class::create(STATE, Class* super) {
Class* cls = (Class*)state->new_object(G(klass));
SET(cls, name, Qnil);
SET(cls, instance_fields, super->instance_fields);
SET(cls, has_ivars, super->has_ivars);
SET(cls, instance_type, super->instance_type);
SET(cls, superclass, super);
cls->setup(state);
return cls;
}
Module* Module::create(STATE) {
Module* mod = (Module*)state->new_object(G(module));
SET(mod, name, Qnil);
SET(mod, superclass, Qnil);
mod->setup(state);
return mod;
}
void Module::setup(STATE) {
SET(this, constants, LookupTable::create(state));
SET(this, method_table, MethodTable::create(state));
}
void Module::setup(STATE, char* str, Module* under) {
setup(state, state->symbol(str), under);
}
void Module::setup(STATE, SYMBOL name, Module* under) {
if(!under) under = G(object);
SET(this, constants, LookupTable::create(state));
SET(this, method_table, MethodTable::create(state));
SET(this, name, name);
under->set_const(state, name, this);
}
void Module::set_name(STATE, Module* under, SYMBOL name) {
String* cur = under->name->to_str(state);
String* str_name = cur->add(state, "::")->append(state,
name->to_str(state));
SET(this, name, str_name->to_sym(state));
}
void Module::set_const(STATE, OBJECT sym, OBJECT val) {
constants->store(state, sym, val);
}
void Module::set_const(STATE, char* name, OBJECT val) {
constants->store(state, state->symbol(name), val);
}
OBJECT Module::get_const(STATE, SYMBOL sym) {
return constants->fetch(state, sym);
}
OBJECT Module::get_const(STATE, SYMBOL sym, bool* found) {
return constants->fetch(state, sym, found);
}
OBJECT Module::get_const(STATE, char* sym) {
return get_const(state, state->symbol(sym));
}
MetaClass* MetaClass::attach(STATE, OBJECT obj, OBJECT sup) {
MetaClass *meta;
meta = (MetaClass*)state->new_object(G(metaclass));
if(!sup) { sup = obj->klass; }
meta->IsMeta = TRUE;
SET(meta, attached_instance, obj);
meta->setup(state);
SET(meta, superclass, sup);
SET(obj, klass, meta);
return meta;
}
}