static VALUE find_class_path(VALUE klass) { struct fc_result arg; arg.name = 0; arg.path = 0; arg.klass = klass; arg.track = rb_cObject; arg.prev = 0; if (RCLASS_CONST_TBL(rb_cObject)) { st_foreach_safe(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg); } if (arg.path == 0) { st_foreach_safe(rb_class_tbl, fc_i, (st_data_t)&arg); } if (arg.path) { st_data_t tmp = tmp_classpath; if (!RCLASS_IV_TBL(klass)) { RCLASS_IV_TBL(klass) = st_init_numtable(); } st_insert(RCLASS_IV_TBL(klass), (st_data_t)classpath, arg.path); st_delete(RCLASS_IV_TBL(klass), &tmp, 0); return arg.path; } return Qnil; }
static VALUE find_class_path(VALUE klass) { struct fc_result arg; arg.name = 0; arg.path = 0; arg.klass = klass; arg.track = rb_cObject; arg.prev = 0; CFMutableDictionaryRef iv_dict = rb_class_ivar_dict(rb_cObject); if (iv_dict != NULL) { ivar_dict_foreach(iv_dict, fc_i, (VALUE)&arg); } if (arg.path == 0) { st_foreach_safe(rb_class_tbl, fc_i, (st_data_t)&arg); } if (arg.path) { iv_dict = rb_class_ivar_dict_or_create(klass); CFDictionarySetValue(iv_dict, (const void *)id_classpath, (const void *)arg.path); CFDictionaryRemoveValue(iv_dict, (const void *)id_tmp_classpath); return arg.path; } if (!RCLASS_RUBY(klass)) { VALUE name = rb_str_new2(class_getName((Class)klass)); iv_dict = rb_class_ivar_dict_or_create(klass); CFDictionarySetValue(iv_dict, (const void *)id_classpath, (const void *)name); CFDictionaryRemoveValue(iv_dict, (const void *)id_tmp_classpath); return name; } return Qnil; }
static void * imp_rhash_keyEnumerator(void *rcv, SEL sel) { NEWOBJ(keyenum, rb_hash_keyenum_t); keyenum->klass = rb_cRubyHashKeyEnumerator; GC_WB(&keyenum->hash, rcv); VALUE ary = rb_ary_new(); st_foreach_safe(RHASH(rcv)->tbl, keys_i, (st_data_t)ary); GC_WB(&keyenum->keys, ary); keyenum->pos = 0; return keyenum; }