141
144
return ST_CONTINUE;
148
clone_const(ID key, const rb_const_entry_t *ce, st_table *tbl)
150
rb_const_entry_t *nce = ALLOC(rb_const_entry_t);
152
st_insert(tbl, key, (st_data_t)nce);
157
clone_const_i(st_data_t key, st_data_t value, st_data_t data)
159
return clone_const((ID)key, (const rb_const_entry_t *)value, (st_table *)data);
146
164
rb_mod_init_copy(VALUE clone, VALUE orig)
153
171
RCLASS_SUPER(clone) = RCLASS_SUPER(orig);
154
172
if (RCLASS_IV_TBL(orig)) {
157
175
if (RCLASS_IV_TBL(clone)) {
158
176
st_free_table(RCLASS_IV_TBL(clone));
160
178
RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(orig));
161
179
CONST_ID(id, "__classpath__");
162
st_delete(RCLASS_IV_TBL(clone), (st_data_t*)&id, 0);
180
st_delete(RCLASS_IV_TBL(clone), &id, 0);
163
181
CONST_ID(id, "__classid__");
164
st_delete(RCLASS_IV_TBL(clone), (st_data_t*)&id, 0);
182
st_delete(RCLASS_IV_TBL(clone), &id, 0);
184
if (RCLASS_CONST_TBL(orig)) {
185
if (RCLASS_CONST_TBL(clone)) {
186
rb_free_const_table(RCLASS_CONST_TBL(clone));
188
RCLASS_CONST_TBL(clone) = st_init_numtable();
189
st_foreach(RCLASS_CONST_TBL(orig), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
166
191
if (RCLASS_M_TBL(orig)) {
167
192
struct clone_method_data data;
169
194
if (RCLASS_M_TBL(clone)) {
170
extern void rb_free_m_table(st_table *tbl);
171
195
rb_free_m_table(RCLASS_M_TBL(clone));
173
197
data.tbl = RCLASS_M_TBL(clone) = st_init_numtable();
206
230
struct clone_method_data data;
207
231
/* copy singleton(unnamed) class */
208
VALUE clone = class_alloc(RBASIC(klass)->flags, 0);
232
VALUE clone = class_alloc((RBASIC(klass)->flags & ~(FL_MARK)), 0);
210
234
if (BUILTIN_TYPE(obj) == T_CLASS) {
211
235
RBASIC(clone)->klass = (VALUE)clone;
218
242
if (RCLASS_IV_TBL(klass)) {
219
243
RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(klass));
245
if (RCLASS_CONST_TBL(klass)) {
246
RCLASS_CONST_TBL(clone) = st_init_numtable();
247
st_foreach(RCLASS_CONST_TBL(klass), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone));
221
249
RCLASS_M_TBL(clone) = st_init_numtable();
222
250
data.tbl = RCLASS_M_TBL(clone);
223
251
data.klass = (VALUE)clone;
264
292
* @note this macro creates a new eigenclass if necessary.
266
294
#define ENSURE_EIGENCLASS(klass) \
267
(rb_ivar_get(METACLASS_OF(klass), id_attached) == klass ? METACLASS_OF(klass) : make_metaclass(klass))
295
(rb_ivar_get(METACLASS_OF(klass), id_attached) == (klass) ? METACLASS_OF(klass) : make_metaclass(klass))
347
375
rb_cModule = boot_defclass("Module", rb_cObject);
348
376
rb_cClass = boot_defclass("Class", rb_cModule);
378
rb_const_set(rb_cObject, rb_intern("BasicObject"), rb_cBasicObject);
350
379
RBASIC(rb_cClass)->klass
351
380
= RBASIC(rb_cModule)->klass
352
381
= RBASIC(rb_cObject)->klass
609
638
if (!RCLASS_IV_TBL(module)) {
610
639
RCLASS_IV_TBL(module) = st_init_numtable();
641
if (!RCLASS_CONST_TBL(module)) {
642
RCLASS_CONST_TBL(module) = st_init_numtable();
612
644
RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
645
RCLASS_CONST_TBL(klass) = RCLASS_CONST_TBL(module);
613
646
RCLASS_M_TBL(klass) = RCLASS_M_TBL(module);
614
647
RCLASS_SUPER(klass) = super;
615
648
if (TYPE(module) == T_ICLASS) {
796
ins_methods_i(ID name, long type, VALUE ary)
798
return ins_methods_push(name, type, ary, -1); /* everything but private */
802
ins_methods_prot_i(ID name, long type, VALUE ary)
804
return ins_methods_push(name, type, ary, NOEX_PROTECTED);
808
ins_methods_priv_i(ID name, long type, VALUE ary)
810
return ins_methods_push(name, type, ary, NOEX_PRIVATE);
814
ins_methods_pub_i(ID name, long type, VALUE ary)
816
return ins_methods_push(name, type, ary, NOEX_PUBLIC);
820
method_entry(ID key, const rb_method_entry_t *me, st_table *list)
830
ins_methods_i(st_data_t name, st_data_t type, st_data_t ary)
832
return ins_methods_push((ID)name, (long)type, (VALUE)ary, -1); /* everything but private */
836
ins_methods_prot_i(st_data_t name, st_data_t type, st_data_t ary)
838
return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PROTECTED);
842
ins_methods_priv_i(st_data_t name, st_data_t type, st_data_t ary)
844
return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PRIVATE);
848
ins_methods_pub_i(st_data_t name, st_data_t type, st_data_t ary)
850
return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PUBLIC);
854
method_entry_i(st_data_t key, st_data_t value, st_data_t data)
856
const rb_method_entry_t *me = (const rb_method_entry_t *)value;
857
st_table *list = (st_table *)data;
824
if (key == ID_ALLOCATOR) {
860
if ((ID)key == ID_ALLOCATOR) {
825
861
return ST_CONTINUE;
841
class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (ID, long, VALUE))
877
class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (st_data_t, st_data_t, st_data_t))
856
892
list = st_init_numtable();
857
893
for (; mod; mod = RCLASS_SUPER(mod)) {
858
st_foreach(RCLASS_M_TBL(mod), method_entry, (st_data_t)list);
894
st_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)list);
859
895
if (BUILTIN_TYPE(mod) == T_ICLASS) continue;
860
896
if (obj && FL_TEST(mod, FL_SINGLETON)) continue;
861
897
if (!recur) break;
958
994
* obj.methods -> array
960
* Returns a list of the names of methods publicly accessible in
996
* Returns a list of the names of public and protected methods of
961
997
* <i>obj</i>. This will include all the methods accessible in
962
998
* <i>obj</i>'s ancestors.
1001
* def klass_method()
969
* k.methods[0..9] #=> [:kMethod, :freeze, :nil?, :is_a?,
970
* # :class, :instance_variable_set,
971
* # :methods, :extend, :__send__, :instance_eval]
972
* k.methods.length #=> 42
1005
* k.methods[0..9] #=> [:klass_method, :nil?, :===,
1007
* # :hash, :<=>, :class, :singleton_class]
1008
* k.methods.length #=> 57
1087
1123
klass = CLASS_OF(obj);
1088
1124
list = st_init_numtable();
1089
1125
if (klass && FL_TEST(klass, FL_SINGLETON)) {
1090
st_foreach(RCLASS_M_TBL(klass), method_entry, (st_data_t)list);
1126
st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
1091
1127
klass = RCLASS_SUPER(klass);
1093
1129
if (RTEST(recur)) {
1094
1130
while (klass && (FL_TEST(klass, FL_SINGLETON) || TYPE(klass) == T_ICLASS)) {
1095
st_foreach(RCLASS_M_TBL(klass), method_entry, (st_data_t)list);
1131
st_foreach(RCLASS_M_TBL(klass), method_entry_i, (st_data_t)list);
1096
1132
klass = RCLASS_SUPER(klass);
1226
1262
SPECIAL_SINGLETON(Qnil, rb_cNilClass);
1227
1263
SPECIAL_SINGLETON(Qfalse, rb_cFalseClass);
1228
1264
SPECIAL_SINGLETON(Qtrue, rb_cTrueClass);
1229
rb_bug("unknown immediate %ld", obj);
1265
rb_bug("unknown immediate %p", (void *)obj);
1232
1268
if (FL_TEST(RBASIC(obj)->klass, FL_SINGLETON) &&
1379
1415
const char *p = fmt;
1382
int f_var = 0, f_block = 0;
1418
int f_var = 0, f_hash = 0, f_block = 0;
1383
1419
int n_lead = 0, n_opt = 0, n_trail = 0, n_mand;
1386
1423
if (ISDIGIT(*p)) {
1387
1424
n_lead = *p - '0';
1420
1461
va_start(vargs, fmt);
1463
/* capture an option hash - phase 1: pop */
1464
if (f_hash && n_mand < argc) {
1465
VALUE last = argv[argc - 1];
1468
/* nil is taken as an empty option hash only if it is not
1469
ambiguous; i.e. '*' is not specified and arguments are
1470
given more than sufficient */
1471
if (!f_var && n_mand + n_opt < argc)
1475
hash = rb_check_convert_type(last, T_HASH, "Hash", "to_hash");
1422
1480
/* capture leading mandatory arguments */
1423
1481
for (i = n_lead; i-- > 0; ) {
1424
1482
var = va_arg(vargs, VALUE *);
1455
1513
if (var) *var = argv[argi];
1516
/* capture an option hash - phase 2: assignment */
1518
var = va_arg(vargs, VALUE *);
1519
if (var) *var = hash;
1458
1521
/* capture iterator block */
1460
1523
var = va_arg(vargs, VALUE *);