PageRenderTime 29ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/src/class.c

https://github.com/v8ruby/mruby
C | 1432 lines | 1120 code | 176 blank | 136 comment | 150 complexity | 151d5e3b0829fdfc84735d1ee16ad613 MD5 | raw file
  1. /*
  2. ** class.c - Class class
  3. **
  4. ** See Copyright Notice in mruby.h
  5. */
  6. #include "mruby.h"
  7. #include <stdarg.h>
  8. #include <stdio.h>
  9. #include "mruby/class.h"
  10. #include "mruby/proc.h"
  11. #include "mruby/string.h"
  12. #include "mruby/numeric.h"
  13. #include "mruby/variable.h"
  14. #include "mruby/array.h"
  15. #include "error.h"
  16. KHASH_DEFINE(mt, mrb_sym, struct RProc*, 1, kh_int_hash_func, kh_int_hash_equal);
  17. typedef struct fc_result {
  18. mrb_sym name;
  19. struct RClass * klass;
  20. mrb_value path;
  21. struct RClass * track;
  22. struct fc_result *prev;
  23. } fcresult_t;
  24. void
  25. mrb_gc_mark_mt(mrb_state *mrb, struct RClass *c)
  26. {
  27. khiter_t k;
  28. khash_t(mt) *h = c->mt;
  29. if (!h) return;
  30. for (k = kh_begin(h); k != kh_end(h); k++) {
  31. if (kh_exist(h, k)){
  32. struct RProc *m = kh_value(h, k);
  33. if (m) {
  34. mrb_gc_mark(mrb, (struct RBasic*)m);
  35. }
  36. }
  37. }
  38. }
  39. size_t
  40. mrb_gc_mark_mt_size(mrb_state *mrb, struct RClass *c)
  41. {
  42. khash_t(mt) *h = c->mt;
  43. if (!h) return 0;
  44. return kh_size(h);
  45. }
  46. void
  47. mrb_gc_free_mt(mrb_state *mrb, struct RClass *c)
  48. {
  49. kh_destroy(mt, c->mt);
  50. }
  51. void
  52. mrb_name_class(mrb_state *mrb, struct RClass *c, mrb_sym name)
  53. {
  54. mrb_obj_iv_set(mrb, (struct RObject*)c,
  55. mrb_intern(mrb, "__classid__"), mrb_symbol_value(name));
  56. }
  57. static void
  58. make_metaclass(mrb_state *mrb, struct RClass *c)
  59. {
  60. struct RClass *sc;
  61. if (c->c->tt == MRB_TT_SCLASS) {
  62. return;
  63. }
  64. sc = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_SCLASS, mrb->class_class);
  65. sc->mt = 0;
  66. if (!c->super) {
  67. sc->super = mrb->class_class;
  68. }
  69. else {
  70. sc->super = c->super->c;
  71. }
  72. c->c = sc;
  73. mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)sc);
  74. mrb_field_write_barrier(mrb, (struct RBasic*)sc, (struct RBasic*)sc->super);
  75. }
  76. struct RClass*
  77. mrb_define_module_id(mrb_state *mrb, mrb_sym name)
  78. {
  79. struct RClass *m = mrb_module_new(mrb);
  80. mrb_obj_iv_set(mrb, (struct RObject*)mrb->object_class,
  81. name, mrb_obj_value(m));
  82. mrb_name_class(mrb, m, name);
  83. return m;
  84. }
  85. struct RClass*
  86. mrb_define_module(mrb_state *mrb, const char *name)
  87. {
  88. return mrb_define_module_id(mrb, mrb_intern(mrb, name));
  89. }
  90. static void
  91. setup_class(mrb_state *mrb, mrb_value outer, struct RClass *c, mrb_sym id)
  92. {
  93. mrb_name_class(mrb, c, id);
  94. mrb_const_set(mrb, outer, id, mrb_obj_value(c));
  95. mrb_obj_iv_set(mrb, (struct RObject*)c,
  96. mrb_intern(mrb, "__outer__"), outer);
  97. }
  98. struct RClass*
  99. mrb_class_outer_module(mrb_state *mrb, struct RClass *c)
  100. {
  101. mrb_value outer;
  102. outer = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern(mrb, "__outer__"));
  103. if (mrb_nil_p(outer)) return 0;
  104. return mrb_class_ptr(outer);
  105. }
  106. struct RClass*
  107. mrb_vm_define_module(mrb_state *mrb, mrb_value outer, mrb_sym id)
  108. {
  109. struct RClass *c;
  110. mrb_value v;
  111. if (mrb_const_defined(mrb, outer, id)) {
  112. v = mrb_const_get(mrb, outer, id);
  113. c = mrb_class_ptr(v);
  114. }
  115. else {
  116. c = mrb_module_new(mrb);
  117. setup_class(mrb, outer, c, id);
  118. }
  119. return c;
  120. }
  121. struct RClass*
  122. mrb_define_class_id(mrb_state *mrb, mrb_sym name, struct RClass *super)
  123. {
  124. struct RClass *c = mrb_class_new(mrb, super);
  125. mrb_obj_iv_set(mrb, (struct RObject*)mrb->object_class,
  126. name, mrb_obj_value(c));
  127. mrb_name_class(mrb, c, name);
  128. return c;
  129. }
  130. struct RClass*
  131. mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super)
  132. {
  133. struct RClass *c;
  134. c = mrb_define_class_id(mrb, mrb_intern(mrb, name), super);
  135. return c;
  136. }
  137. struct RClass*
  138. mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id)
  139. {
  140. struct RClass *c, *s;
  141. if (mrb_const_defined(mrb, outer, id)) {
  142. mrb_value v = mrb_const_get(mrb, outer, id);
  143. mrb_check_type(mrb, v, MRB_TT_CLASS);
  144. c = mrb_class_ptr(v);
  145. if (!mrb_nil_p(super)) {
  146. if (mrb_type(super) != MRB_TT_CLASS) {
  147. mrb_raise(mrb, E_TYPE_ERROR, "superclass must be a Class (%s given)", mrb_obj_classname(mrb, super));
  148. }
  149. if (!c->super || mrb_class_ptr(super) != mrb_class_real(c->super)) {
  150. mrb_raise(mrb, E_TYPE_ERROR, "superclass mismatch for class %s", mrb_sym2name(mrb, id));
  151. }
  152. }
  153. return c;
  154. }
  155. if (!mrb_nil_p(super)) {
  156. if (mrb_type(super) != MRB_TT_CLASS) {
  157. mrb_raise(mrb, E_TYPE_ERROR, "superclass must be a Class (%s given)", mrb_obj_classname(mrb, super));
  158. }
  159. s = mrb_class_ptr(super);
  160. }
  161. else {
  162. s = mrb->object_class;
  163. }
  164. c = mrb_class_new(mrb, s);
  165. setup_class(mrb, outer, c, id);
  166. mrb_funcall(mrb, mrb_obj_value(s), "inherited", 1, mrb_obj_value(c));
  167. return c;
  168. }
  169. static struct RClass *
  170. class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id)
  171. {
  172. mrb_value c = mrb_const_get(mrb, mrb_obj_value(klass), id);
  173. if (mrb_type(c) != MRB_TT_MODULE && mrb_type(c) != MRB_TT_CLASS) {
  174. mrb_raise(mrb, E_TYPE_ERROR, "%s is not a class/module", mrb_sym2name(mrb, id));
  175. }
  176. return mrb_class_ptr(c);
  177. }
  178. struct RClass *
  179. mrb_class_get(mrb_state *mrb, const char *name)
  180. {
  181. return class_from_sym(mrb, mrb->object_class, mrb_intern(mrb, name));
  182. }
  183. /*!
  184. * Defines a class under the namespace of \a outer.
  185. * \param outer a class which contains the new class.
  186. * \param id name of the new class
  187. * \param super a class from which the new class will derive.
  188. * NULL means \c Object class.
  189. * \return the created class
  190. * \throw TypeError if the constant name \a name is already taken but
  191. * the constant is not a \c Class.
  192. * \throw NameError if the class is already defined but the class can not
  193. * be reopened because its superclass is not \a super.
  194. * \post top-level constant named \a name refers the returned class.
  195. *
  196. * \note if a class named \a name is already defined and its superclass is
  197. * \a super, the function just returns the defined class.
  198. */
  199. struct RClass *
  200. mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super)
  201. {
  202. struct RClass * c;
  203. mrb_sym id = mrb_intern(mrb, name);
  204. if (mrb_const_defined_at(mrb, outer, id)) {
  205. c = class_from_sym(mrb, outer, id);
  206. if (mrb_class_real(c->super) != super) {
  207. mrb_name_error(mrb, id, "%s is already defined", mrb_sym2name(mrb, id));
  208. }
  209. return c;
  210. }
  211. if (!super) {
  212. mrb_warn("no super class for `%s::%s', Object assumed",
  213. mrb_obj_classname(mrb, mrb_obj_value(outer)), mrb_sym2name(mrb, id));
  214. }
  215. c = mrb_class_new(mrb, super);
  216. setup_class(mrb, mrb_obj_value(outer), c, id);
  217. return c;
  218. }
  219. struct RClass *
  220. mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name)
  221. {
  222. struct RClass * c;
  223. mrb_sym id = mrb_intern(mrb, name);
  224. if (mrb_const_defined_at(mrb, outer, id)) {
  225. c = class_from_sym(mrb, outer, id);
  226. return c;
  227. }
  228. c = mrb_module_new(mrb);
  229. setup_class(mrb, mrb_obj_value(outer), c, id);
  230. return c;
  231. }
  232. void
  233. mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p)
  234. {
  235. khash_t(mt) *h = c->mt;
  236. khiter_t k;
  237. if (!h) h = c->mt = kh_init(mt, mrb);
  238. k = kh_put(mt, h, mid);
  239. kh_value(h, k) = p;
  240. }
  241. void
  242. mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, int aspec)
  243. {
  244. struct RProc *p;
  245. p = mrb_proc_new_cfunc(mrb, func);
  246. p->target_class = c;
  247. mrb_define_method_raw(mrb, c, mid, p);
  248. }
  249. void
  250. mrb_define_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, int aspec)
  251. {
  252. mrb_define_method_id(mrb, c, mrb_intern(mrb, name), func, aspec);
  253. }
  254. void
  255. mrb_define_method_vm(mrb_state *mrb, struct RClass *c, mrb_sym name, mrb_value body)
  256. {
  257. khash_t(mt) *h = c->mt;
  258. khiter_t k;
  259. struct RProc *p;
  260. if (!h) h = c->mt = kh_init(mt, mrb);
  261. k = kh_put(mt, h, name);
  262. p = mrb_proc_ptr(body);
  263. kh_value(h, k) = p;
  264. }
  265. static mrb_value
  266. check_type(mrb_state *mrb, mrb_value val, enum mrb_vtype t, const char *c, const char *m)
  267. {
  268. mrb_value tmp;
  269. tmp = mrb_check_convert_type(mrb, val, t, c, m);
  270. if (mrb_nil_p(tmp)) {
  271. mrb_raise(mrb, E_TYPE_ERROR, "expected %s", c);
  272. }
  273. return tmp;
  274. }
  275. static mrb_value
  276. to_str(mrb_state *mrb, mrb_value val)
  277. {
  278. return check_type(mrb, val, MRB_TT_STRING, "String", "to_str");
  279. }
  280. static mrb_value
  281. to_ary(mrb_state *mrb, mrb_value val)
  282. {
  283. return check_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary");
  284. }
  285. static mrb_value
  286. to_hash(mrb_state *mrb, mrb_value val)
  287. {
  288. return check_type(mrb, val, MRB_TT_HASH, "Hash", "to_hash");
  289. }
  290. /*
  291. retrieve arguments from mrb_state.
  292. mrb_get_args(mrb, format, ...)
  293. returns number of arguments parsed.
  294. fortmat specifiers:
  295. o: Object [mrb_value]
  296. S: String [mrb_value]
  297. A: Array [mrb_value]
  298. H: Hash [mrb_value]
  299. s: String [char*,int]
  300. z: String [char*]
  301. a: Array [mrb_value*,int]
  302. f: Float [mrb_float]
  303. i: Integer [mrb_int]
  304. n: Symbol [mrb_sym]
  305. &: Block [mrb_value]
  306. *: rest argument [mrb_value*,int]
  307. |: optional
  308. */
  309. int
  310. mrb_get_args(mrb_state *mrb, const char *format, ...)
  311. {
  312. char c;
  313. int i = 0;
  314. mrb_value *sp = mrb->stack + 1;
  315. va_list ap;
  316. int argc = mrb->ci->argc;
  317. int opt = 0;
  318. va_start(ap, format);
  319. if (argc < 0) {
  320. struct RArray *a = mrb_ary_ptr(mrb->stack[1]);
  321. argc = a->len;
  322. sp = a->ptr;
  323. }
  324. while ((c = *format++)) {
  325. switch (c) {
  326. case '|': case '*': case '&':
  327. break;
  328. default:
  329. if (argc <= i && !opt) {
  330. mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
  331. }
  332. }
  333. switch (c) {
  334. case 'o':
  335. {
  336. mrb_value *p;
  337. p = va_arg(ap, mrb_value*);
  338. if (i < argc) {
  339. *p = *sp++;
  340. i++;
  341. }
  342. }
  343. break;
  344. case 'S':
  345. {
  346. mrb_value *p;
  347. p = va_arg(ap, mrb_value*);
  348. if (i < argc) {
  349. *p = to_str(mrb, *sp++);
  350. i++;
  351. }
  352. }
  353. break;
  354. case 'A':
  355. {
  356. mrb_value *p;
  357. p = va_arg(ap, mrb_value*);
  358. if (i < argc) {
  359. *p = to_ary(mrb, *sp++);
  360. i++;
  361. }
  362. }
  363. break;
  364. case 'H':
  365. {
  366. mrb_value *p;
  367. p = va_arg(ap, mrb_value*);
  368. if (i < argc) {
  369. *p = to_hash(mrb, *sp++);
  370. i++;
  371. }
  372. }
  373. break;
  374. case 's':
  375. {
  376. mrb_value ss;
  377. struct RString *s;
  378. char **ps = 0;
  379. int *pl = 0;
  380. ps = va_arg(ap, char**);
  381. pl = va_arg(ap, int*);
  382. if (i < argc) {
  383. ss = to_str(mrb, *sp++);
  384. s = mrb_str_ptr(ss);
  385. *ps = s->ptr;
  386. *pl = s->len;
  387. i++;
  388. }
  389. }
  390. break;
  391. case 'z':
  392. {
  393. mrb_value ss;
  394. struct RString *s;
  395. char **ps;
  396. ps = va_arg(ap, char**);
  397. if (i < argc) {
  398. ss = to_str(mrb, *sp++);
  399. s = mrb_str_ptr(ss);
  400. if (strlen(s->ptr) != s->len) {
  401. mrb_raise(mrb, E_ARGUMENT_ERROR, "String contains NUL");
  402. }
  403. *ps = s->ptr;
  404. i++;
  405. }
  406. }
  407. break;
  408. case 'a':
  409. {
  410. mrb_value aa;
  411. struct RArray *a;
  412. mrb_value **pb;
  413. int *pl;
  414. pb = va_arg(ap, mrb_value**);
  415. pl = va_arg(ap, int*);
  416. if (i < argc) {
  417. aa = to_ary(mrb, *sp++);
  418. a = mrb_ary_ptr(aa);
  419. *pb = a->ptr;
  420. *pl = a->len;
  421. i++;
  422. }
  423. }
  424. break;
  425. case 'f':
  426. {
  427. mrb_float *p;
  428. p = va_arg(ap, mrb_float*);
  429. if (i < argc) {
  430. switch (mrb_type(*sp)) {
  431. case MRB_TT_FLOAT:
  432. *p = mrb_float(*sp);
  433. break;
  434. case MRB_TT_FIXNUM:
  435. *p = (mrb_float)mrb_fixnum(*sp);
  436. break;
  437. case MRB_TT_FALSE:
  438. *p = 0.0;
  439. break;
  440. default:
  441. {
  442. mrb_value tmp;
  443. tmp = mrb_convert_type(mrb, *sp, MRB_TT_FLOAT, "Float", "to_f");
  444. *p = mrb_float(tmp);
  445. }
  446. break;
  447. }
  448. sp++;
  449. i++;
  450. }
  451. }
  452. break;
  453. case 'i':
  454. {
  455. mrb_int *p;
  456. p = va_arg(ap, mrb_int*);
  457. if (i < argc) {
  458. switch (mrb_type(*sp)) {
  459. case MRB_TT_FIXNUM:
  460. *p = mrb_fixnum(*sp);
  461. break;
  462. case MRB_TT_FLOAT:
  463. {
  464. mrb_float f = mrb_float(*sp);
  465. if (!FIXABLE(f)) {
  466. mrb_raise(mrb, E_RANGE_ERROR, "float too big for int");
  467. }
  468. *p = (mrb_int)f;
  469. }
  470. break;
  471. case MRB_TT_FALSE:
  472. *p = 0;
  473. break;
  474. default:
  475. {
  476. mrb_value tmp;
  477. tmp = mrb_convert_type(mrb, *sp, MRB_TT_FIXNUM, "Integer", "to_int");
  478. *p = mrb_fixnum(tmp);
  479. }
  480. break;
  481. }
  482. sp++;
  483. i++;
  484. }
  485. }
  486. break;
  487. case 'n':
  488. {
  489. mrb_sym *symp;
  490. symp = va_arg(ap, mrb_sym*);
  491. if (i < argc) {
  492. mrb_value ss;
  493. ss = *sp++;
  494. if (mrb_type(ss) == MRB_TT_SYMBOL) {
  495. *symp = mrb_symbol(ss);
  496. }
  497. else {
  498. *symp = mrb_intern_str(mrb, to_str(mrb, ss));
  499. }
  500. i++;
  501. }
  502. }
  503. break;
  504. case '&':
  505. {
  506. mrb_value *p, *bp;
  507. p = va_arg(ap, mrb_value*);
  508. if (mrb->ci->argc < 0) {
  509. bp = mrb->stack + 2;
  510. }
  511. else {
  512. bp = mrb->stack + mrb->ci->argc + 1;
  513. }
  514. *p = *bp;
  515. }
  516. break;
  517. case '|':
  518. opt = 1;
  519. break;
  520. case '*':
  521. {
  522. mrb_value **var;
  523. int *pl;
  524. var = va_arg(ap, mrb_value**);
  525. pl = va_arg(ap, int*);
  526. if (argc > i) {
  527. *pl = argc-i;
  528. if (*pl > 0) {
  529. *var = sp;
  530. i = argc;
  531. }
  532. i = argc;
  533. sp += *pl;
  534. }
  535. else {
  536. *pl = 0;
  537. *var = NULL;
  538. }
  539. }
  540. break;
  541. default:
  542. mrb_raise(mrb, E_ARGUMENT_ERROR, "invalide argument specifier %c", c);
  543. break;
  544. }
  545. }
  546. if (!c && argc > i) {
  547. mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
  548. }
  549. va_end(ap);
  550. return i;
  551. }
  552. static struct RClass*
  553. boot_defclass(mrb_state *mrb, struct RClass *super)
  554. {
  555. struct RClass *c;
  556. c = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_CLASS, mrb->class_class);
  557. c->super = super ? super : mrb->object_class;
  558. mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)super);
  559. c->mt = kh_init(mt, mrb);
  560. return c;
  561. }
  562. void
  563. mrb_include_module(mrb_state *mrb, struct RClass *c, struct RClass *m)
  564. {
  565. struct RClass *ins_pos;
  566. ins_pos = c;
  567. while (m) {
  568. struct RClass *p = c, *ic;
  569. int superclass_seen = 0;
  570. while(p) {
  571. if (c != p && p->tt == MRB_TT_CLASS) {
  572. superclass_seen = 1;
  573. }
  574. else if (p->mt == m->mt){
  575. if (p->tt == MRB_TT_ICLASS && !superclass_seen) {
  576. ins_pos = p;
  577. }
  578. goto skip;
  579. }
  580. p = p->super;
  581. }
  582. ic = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, mrb->class_class);
  583. if (m->tt == MRB_TT_ICLASS) {
  584. ic->c = m->c;
  585. }
  586. else {
  587. ic->c = m;
  588. }
  589. ic->mt = m->mt;
  590. ic->iv = m->iv;
  591. ic->super = ins_pos->super;
  592. ins_pos->super = ic;
  593. mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ic);
  594. ins_pos = ic;
  595. skip:
  596. m = m->super;
  597. }
  598. }
  599. static mrb_value
  600. mrb_mod_append_features(mrb_state *mrb, mrb_value mod)
  601. {
  602. mrb_value klass;
  603. mrb_check_type(mrb, mod, MRB_TT_MODULE);
  604. mrb_get_args(mrb, "o", &klass);
  605. mrb_include_module(mrb, mrb_class_ptr(klass), mrb_class_ptr(mod));
  606. return mod;
  607. }
  608. static mrb_value
  609. mrb_mod_include(mrb_state *mrb, mrb_value klass)
  610. {
  611. mrb_value *argv;
  612. int argc, i;
  613. mrb_get_args(mrb, "*", &argv, &argc);
  614. for (i=0; i<argc; i++) {
  615. mrb_check_type(mrb, argv[i], MRB_TT_MODULE);
  616. }
  617. while (argc--) {
  618. mrb_funcall(mrb, argv[argc], "append_features", 1, klass);
  619. mrb_funcall(mrb, argv[argc], "included", 1, klass);
  620. }
  621. return klass;
  622. }
  623. static mrb_value
  624. mrb_mod_ancestors(mrb_state *mrb, mrb_value self)
  625. {
  626. mrb_value result;
  627. struct RClass *c = mrb_class_ptr(self);
  628. result = mrb_ary_new(mrb);
  629. while (c) {
  630. if (c->tt == MRB_TT_ICLASS) {
  631. mrb_ary_push(mrb, result, mrb_obj_value(c->c));
  632. }
  633. else {
  634. mrb_ary_push(mrb, result, mrb_obj_value(c));
  635. }
  636. c = c->super;
  637. }
  638. return result;
  639. }
  640. static mrb_value
  641. mrb_mod_extend_object(mrb_state *mrb, mrb_value mod)
  642. {
  643. mrb_value obj;
  644. mrb_check_type(mrb, mod, MRB_TT_MODULE);
  645. mrb_get_args(mrb, "o", &obj);
  646. mrb_include_module(mrb, mrb_class_ptr(mrb_singleton_class(mrb, obj)), mrb_class_ptr(mod));
  647. return mod;
  648. }
  649. static mrb_value
  650. mrb_mod_included_modules(mrb_state *mrb, mrb_value self)
  651. {
  652. mrb_value result;
  653. struct RClass *c = mrb_class_ptr(self);
  654. result = mrb_ary_new(mrb);
  655. while (c) {
  656. if (c->tt == MRB_TT_ICLASS) {
  657. mrb_ary_push(mrb, result, mrb_obj_value(c->c));
  658. }
  659. c = c->super;
  660. }
  661. return result;
  662. }
  663. static struct RClass *
  664. mrb_singleton_class_ptr(mrb_state *mrb, struct RClass *c)
  665. {
  666. struct RClass *sc;
  667. if (c->tt == MRB_TT_SCLASS) {
  668. return c;
  669. }
  670. sc = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_SCLASS, mrb->class_class);
  671. sc->mt = 0;
  672. sc->super = c;
  673. mrb_field_write_barrier(mrb, (struct RBasic*)sc, (struct RBasic*)c);
  674. return sc;
  675. }
  676. mrb_value
  677. mrb_singleton_class(mrb_state *mrb, mrb_value v)
  678. {
  679. struct RBasic *obj;
  680. switch (mrb_type(v)) {
  681. case MRB_TT_FALSE:
  682. if (mrb_nil_p(v))
  683. return mrb_obj_value(mrb->nil_class);
  684. return mrb_obj_value(mrb->false_class);
  685. case MRB_TT_TRUE:
  686. return mrb_obj_value(mrb->true_class);
  687. case MRB_TT_SYMBOL:
  688. case MRB_TT_FIXNUM:
  689. case MRB_TT_FLOAT:
  690. mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton");
  691. return mrb_nil_value(); /* not reached */
  692. default:
  693. break;
  694. }
  695. obj = mrb_object(v);
  696. obj->c = mrb_singleton_class_ptr(mrb, obj->c);
  697. return mrb_obj_value(obj->c);
  698. }
  699. void
  700. mrb_define_singleton_method(mrb_state *mrb, struct RObject *o, const char *name, mrb_func_t func, int aspec)
  701. {
  702. o->c = mrb_singleton_class_ptr(mrb, o->c);
  703. mrb_define_method_id(mrb, o->c, mrb_intern(mrb, name), func, aspec);
  704. }
  705. void
  706. mrb_define_class_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, int aspec)
  707. {
  708. mrb_define_singleton_method(mrb, (struct RObject*)c, name, func, aspec);
  709. }
  710. void
  711. mrb_define_module_function(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, int aspec)
  712. {
  713. mrb_define_class_method(mrb, c, name, func, aspec);
  714. mrb_define_method(mrb, c, name, func, aspec);
  715. }
  716. struct RProc*
  717. mrb_method_search_vm(mrb_state *mrb, struct RClass **cp, mrb_sym mid)
  718. {
  719. khiter_t k;
  720. struct RProc *m;
  721. struct RClass *c = *cp;
  722. while (c) {
  723. khash_t(mt) *h = c->mt;
  724. if (h) {
  725. k = kh_get(mt, h, mid);
  726. if (k != kh_end(h)) {
  727. m = kh_value(h, k);
  728. if (!m) break;
  729. *cp = c;
  730. return m;
  731. }
  732. }
  733. c = c->super;
  734. }
  735. return 0; /* no method */
  736. }
  737. struct RProc*
  738. mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid)
  739. {
  740. struct RProc *m;
  741. m = mrb_method_search_vm(mrb, &c, mid);
  742. if (!m) {
  743. mrb_raise(mrb, E_NOMETHOD_ERROR, "no method named %s\n", mrb_sym2name(mrb, mid));
  744. }
  745. return m;
  746. }
  747. void
  748. mrb_obj_call_init(mrb_state *mrb, mrb_value obj, int argc, mrb_value *argv)
  749. {
  750. mrb_funcall_argv(mrb, obj, mrb->init_sym, argc, argv);
  751. }
  752. /*
  753. * call-seq:
  754. * class.new(args, ...) -> obj
  755. *
  756. * Calls <code>allocate</code> to create a new object of
  757. * <i>class</i>'s class, then invokes that object's
  758. * <code>initialize</code> method, passing it <i>args</i>.
  759. * This is the method that ends up getting called whenever
  760. * an object is constructed using .new.
  761. *
  762. */
  763. mrb_value
  764. mrb_class_new_instance(mrb_state *mrb, int argc, mrb_value *argv, struct RClass * klass)
  765. {
  766. mrb_value obj;
  767. struct RClass * c = (struct RClass*)mrb_obj_alloc(mrb, klass->tt, klass);
  768. c->super = klass;
  769. obj = mrb_obj_value(c);
  770. mrb_obj_call_init(mrb, obj, argc, argv);
  771. return obj;
  772. }
  773. mrb_value
  774. mrb_class_new_instance_m(mrb_state *mrb, mrb_value klass)
  775. {
  776. mrb_value *argv;
  777. mrb_value blk;
  778. struct RClass *k = mrb_class_ptr(klass);
  779. struct RClass *c;
  780. int argc;
  781. mrb_value obj;
  782. mrb_get_args(mrb, "*&", &argv, &argc, &blk);
  783. c = (struct RClass*)mrb_obj_alloc(mrb, k->tt, k);
  784. c->super = k;
  785. obj = mrb_obj_value(c);
  786. mrb_funcall_with_block(mrb, obj, mrb->init_sym, argc, argv, blk);
  787. return obj;
  788. }
  789. mrb_value
  790. mrb_instance_new(mrb_state *mrb, mrb_value cv)
  791. {
  792. struct RClass *c = mrb_class_ptr(cv);
  793. struct RObject *o;
  794. enum mrb_vtype ttype = MRB_INSTANCE_TT(c);
  795. mrb_value obj, blk;
  796. mrb_value *argv;
  797. int argc;
  798. if (ttype == 0) ttype = MRB_TT_OBJECT;
  799. o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c);
  800. obj = mrb_obj_value(o);
  801. mrb_get_args(mrb, "*&", &argv, &argc, &blk);
  802. mrb_funcall_with_block(mrb, obj, mrb->init_sym, argc, argv, blk);
  803. return obj;
  804. }
  805. mrb_value
  806. mrb_class_new_class(mrb_state *mrb, mrb_value cv)
  807. {
  808. mrb_value super;
  809. struct RClass *new_class;
  810. if (mrb_get_args(mrb, "|o", &super) == 0) {
  811. super = mrb_obj_value(mrb->object_class);
  812. }
  813. new_class = mrb_class_new(mrb, mrb_class_ptr(super));
  814. return mrb_obj_value(new_class);
  815. }
  816. mrb_value
  817. mrb_class_superclass(mrb_state *mrb, mrb_value klass)
  818. {
  819. struct RClass *c;
  820. mrb_value superclass;
  821. c = mrb_class_ptr(klass);
  822. if (c->super)
  823. superclass = mrb_obj_value(mrb_class_real(c->super));
  824. else
  825. superclass = mrb_nil_value();
  826. return superclass;
  827. }
  828. static mrb_value
  829. mrb_bob_init(mrb_state *mrb, mrb_value cv)
  830. {
  831. return mrb_nil_value();
  832. }
  833. static mrb_value
  834. mrb_bob_not(mrb_state *mrb, mrb_value cv)
  835. {
  836. if (mrb_test(cv))
  837. return mrb_false_value();
  838. return mrb_true_value();
  839. }
  840. /* 15.3.1.3.30 */
  841. /*
  842. * call-seq:
  843. * obj.method_missing(symbol [, *args] ) -> result
  844. *
  845. * Invoked by Ruby when <i>obj</i> is sent a message it cannot handle.
  846. * <i>symbol</i> is the symbol for the method called, and <i>args</i>
  847. * are any arguments that were passed to it. By default, the interpreter
  848. * raises an error when this method is called. However, it is possible
  849. * to override the method to provide more dynamic behavior.
  850. * If it is decided that a particular method should not be handled, then
  851. * <i>super</i> should be called, so that ancestors can pick up the
  852. * missing method.
  853. * The example below creates
  854. * a class <code>Roman</code>, which responds to methods with names
  855. * consisting of roman numerals, returning the corresponding integer
  856. * values.
  857. *
  858. * class Roman
  859. * def romanToInt(str)
  860. * # ...
  861. * end
  862. * def method_missing(methId)
  863. * str = methId.id2name
  864. * romanToInt(str)
  865. * end
  866. * end
  867. *
  868. * r = Roman.new
  869. * r.iv #=> 4
  870. * r.xxiii #=> 23
  871. * r.mm #=> 2000
  872. */
  873. static mrb_value
  874. mrb_bob_missing(mrb_state *mrb, mrb_value mod)
  875. {
  876. mrb_value name, *a;
  877. int alen;
  878. mrb_get_args(mrb, "o*", &name, &a, &alen);
  879. if (!SYMBOL_P(name)) {
  880. mrb_raise(mrb, E_TYPE_ERROR, "name should be a symbol");
  881. }
  882. mrb_raise(mrb, E_NOMETHOD_ERROR, "no method named %s", mrb_sym2name(mrb, mrb_symbol(name)));
  883. /* not reached */
  884. return mrb_nil_value();
  885. }
  886. int
  887. mrb_obj_respond_to(struct RClass* c, mrb_sym mid)
  888. {
  889. khiter_t k;
  890. while (c) {
  891. khash_t(mt) *h = c->mt;
  892. if (h) {
  893. k = kh_get(mt, h, mid);
  894. if (k != kh_end(h)) {
  895. if (kh_value(h, k)) {
  896. return TRUE; /* method exists */
  897. }
  898. else {
  899. return FALSE; /* undefined method */
  900. }
  901. }
  902. }
  903. c = c->super;
  904. }
  905. return FALSE; /* no method */
  906. }
  907. int
  908. mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid)
  909. {
  910. return mrb_obj_respond_to(mrb_class(mrb, obj), mid);
  911. }
  912. mrb_value
  913. mrb_class_path(mrb_state *mrb, struct RClass *c)
  914. {
  915. mrb_value path;
  916. const char *name;
  917. int len;
  918. path = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern(mrb, "__classpath__"));
  919. if (mrb_nil_p(path)) {
  920. struct RClass *outer = mrb_class_outer_module(mrb, c);
  921. mrb_sym sym = mrb_class_sym(mrb, c, outer);
  922. if (sym == 0) {
  923. return mrb_nil_value();
  924. }
  925. else if (outer && outer != mrb->object_class) {
  926. mrb_value base = mrb_class_path(mrb, outer);
  927. path = mrb_str_plus(mrb, base, mrb_str_new(mrb, "::", 2));
  928. name = mrb_sym2name_len(mrb, sym, &len);
  929. mrb_str_concat(mrb, path, mrb_str_new(mrb, name, len));
  930. }
  931. else {
  932. name = mrb_sym2name_len(mrb, sym, &len);
  933. path = mrb_str_new(mrb, name, len);
  934. }
  935. mrb_obj_iv_set(mrb, (struct RObject*)c, mrb_intern(mrb, "__classpath__"), path);
  936. }
  937. return path;
  938. }
  939. struct RClass *
  940. mrb_class_real(struct RClass* cl)
  941. {
  942. while ((cl->tt == MRB_TT_SCLASS) || (cl->tt == MRB_TT_ICLASS)) {
  943. cl = cl->super;
  944. }
  945. return cl;
  946. }
  947. const char*
  948. mrb_class_name(mrb_state *mrb, struct RClass* c)
  949. {
  950. mrb_value path = mrb_class_path(mrb, c);
  951. if (mrb_nil_p(path)) return 0;
  952. return mrb_str_ptr(path)->ptr;
  953. }
  954. const char*
  955. mrb_obj_classname(mrb_state *mrb, mrb_value obj)
  956. {
  957. return mrb_class_name(mrb, mrb_obj_class(mrb, obj));
  958. }
  959. /*!
  960. * Ensures a class can be derived from super.
  961. *
  962. * \param super a reference to an object.
  963. * \exception TypeError if \a super is not a Class or \a super is a singleton class.
  964. */
  965. void
  966. mrb_check_inheritable(mrb_state *mrb, struct RClass *super)
  967. {
  968. if (super->tt != MRB_TT_CLASS) {
  969. mrb_raise(mrb, E_TYPE_ERROR, "superclass must be a Class (%s given)",
  970. mrb_obj_classname(mrb, mrb_obj_value(super)));
  971. }
  972. if (super->tt == MRB_TT_SCLASS) {
  973. mrb_raise(mrb, E_TYPE_ERROR, "can't make subclass of singleton class");
  974. }
  975. if (super == mrb->class_class) {
  976. mrb_raise(mrb, E_TYPE_ERROR, "can't make subclass of Class");
  977. }
  978. }
  979. /*!
  980. * Creates a new class.
  981. * \param super a class from which the new class derives.
  982. * \exception TypeError \a super is not inheritable.
  983. * \exception TypeError \a super is the Class class.
  984. */
  985. struct RClass *
  986. mrb_class_new(mrb_state *mrb, struct RClass *super)
  987. {
  988. struct RClass *c;
  989. if (super) {
  990. mrb_check_inheritable(mrb, super);
  991. }
  992. c = boot_defclass(mrb, super);
  993. if (super){
  994. MRB_SET_INSTANCE_TT(c, MRB_INSTANCE_TT(super));
  995. }
  996. make_metaclass(mrb, c);
  997. return c;
  998. }
  999. /*!
  1000. * Creates a new module.
  1001. */
  1002. struct RClass *
  1003. mrb_module_new(mrb_state *mrb)
  1004. {
  1005. struct RClass *m = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_MODULE, mrb->module_class);
  1006. m->mt = kh_init(mt, mrb);
  1007. return m;
  1008. }
  1009. /*
  1010. * call-seq:
  1011. * obj.class => class
  1012. *
  1013. * Returns the class of <i>obj</i>, now preferred over
  1014. * <code>Object#type</code>, as an object's type in Ruby is only
  1015. * loosely tied to that object's class. This method must always be
  1016. * called with an explicit receiver, as <code>class</code> is also a
  1017. * reserved word in Ruby.
  1018. *
  1019. * 1.class #=> Fixnum
  1020. * self.class #=> Object
  1021. */
  1022. struct RClass*
  1023. mrb_obj_class(mrb_state *mrb, mrb_value obj)
  1024. {
  1025. return mrb_class_real(mrb_class(mrb, obj));
  1026. }
  1027. void
  1028. mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b)
  1029. {
  1030. struct RProc *m = mrb_method_search(mrb, c, b);
  1031. mrb_define_method_vm(mrb, c, a, mrb_obj_value(m));
  1032. }
  1033. /*!
  1034. * Defines an alias of a method.
  1035. * \param klass the class which the original method belongs to
  1036. * \param name1 a new name for the method
  1037. * \param name2 the original name of the method
  1038. */
  1039. void
  1040. mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const char *name2)
  1041. {
  1042. mrb_alias_method(mrb, klass, mrb_intern(mrb, name1), mrb_intern(mrb, name2));
  1043. }
  1044. /*
  1045. * call-seq:
  1046. * mod.to_s -> string
  1047. *
  1048. * Return a string representing this module or class. For basic
  1049. * classes and modules, this is the name. For singletons, we
  1050. * show information on the thing we're attached to as well.
  1051. */
  1052. static mrb_value
  1053. mrb_mod_to_s(mrb_state *mrb, mrb_value klass)
  1054. {
  1055. if (mrb_type(klass) == MRB_TT_SCLASS) {
  1056. mrb_value s = mrb_str_new(mrb, "#<", 2);
  1057. mrb_value v = mrb_iv_get(mrb, klass, mrb_intern(mrb, "__attached__"));
  1058. mrb_str_cat2(mrb, s, "Class:");
  1059. switch (mrb_type(v)) {
  1060. case MRB_TT_CLASS:
  1061. case MRB_TT_MODULE:
  1062. mrb_str_append(mrb, s, mrb_inspect(mrb, v));
  1063. break;
  1064. default:
  1065. mrb_str_append(mrb, s, mrb_any_to_s(mrb, v));
  1066. break;
  1067. }
  1068. mrb_str_cat2(mrb, s, ">");
  1069. return s;
  1070. }
  1071. else {
  1072. struct RClass *c = mrb_class_ptr(klass);
  1073. const char *cn = mrb_class_name(mrb, c);
  1074. if (!cn) {
  1075. char buf[256];
  1076. int n = 0;
  1077. switch (mrb_type(klass)) {
  1078. case MRB_TT_CLASS:
  1079. n = snprintf(buf, sizeof(buf), "#<Class:%p>", c);
  1080. break;
  1081. case MRB_TT_MODULE:
  1082. n = snprintf(buf, sizeof(buf), "#<Module:%p>", c);
  1083. break;
  1084. default:
  1085. break;
  1086. }
  1087. return mrb_str_dup(mrb, mrb_str_new(mrb, buf, n));
  1088. }
  1089. else {
  1090. return mrb_str_dup(mrb, mrb_str_new_cstr(mrb, cn));
  1091. }
  1092. }
  1093. }
  1094. mrb_value
  1095. mrb_mod_alias(mrb_state *mrb, mrb_value mod)
  1096. {
  1097. struct RClass *c = mrb_class_ptr(mod);
  1098. mrb_value new_value, old_value;
  1099. mrb_get_args(mrb, "oo", &new_value, &old_value);
  1100. mrb_alias_method(mrb, c, mrb_symbol(new_value), mrb_symbol(old_value));
  1101. return mrb_nil_value();
  1102. }
  1103. static void
  1104. undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a)
  1105. {
  1106. mrb_value m;
  1107. MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0);
  1108. mrb_define_method_vm(mrb, c, a, m);
  1109. }
  1110. void
  1111. mrb_undef_method(mrb_state *mrb, struct RClass *c, const char *name)
  1112. {
  1113. undef_method(mrb, c, mrb_intern(mrb, name));
  1114. }
  1115. void
  1116. mrb_undef_class_method(mrb_state *mrb, struct RClass *c, const char *name)
  1117. {
  1118. mrb_undef_method(mrb, mrb_class_ptr(mrb_singleton_class(mrb, mrb_obj_value(c))), name);
  1119. }
  1120. mrb_value
  1121. mrb_mod_undef(mrb_state *mrb, mrb_value mod)
  1122. {
  1123. struct RClass *c = mrb_class_ptr(mod);
  1124. int argc;
  1125. mrb_value *argv;
  1126. mrb_get_args(mrb, "*", &argv, &argc);
  1127. while (argc--) {
  1128. undef_method(mrb, c, mrb_symbol(*argv));
  1129. argv++;
  1130. }
  1131. return mrb_nil_value();
  1132. }
  1133. static mrb_value
  1134. mod_define_method(mrb_state *mrb, mrb_value self)
  1135. {
  1136. struct RClass *c = mrb_class_ptr(self);
  1137. struct RProc *p;
  1138. mrb_sym mid;
  1139. mrb_value blk;
  1140. mrb_get_args(mrb, "n&", &mid, &blk);
  1141. if (mrb_nil_p(blk)) {
  1142. mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
  1143. }
  1144. p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
  1145. mrb_proc_copy(p, mrb_proc_ptr(blk));
  1146. mrb_define_method_raw(mrb, c, mid, p);
  1147. return blk;
  1148. }
  1149. static mrb_sym
  1150. mrb_sym_value(mrb_state *mrb, mrb_value val)
  1151. {
  1152. if(mrb_type(val) == MRB_TT_STRING) {
  1153. return mrb_intern_str(mrb, val);
  1154. }
  1155. else if(mrb_type(val) != MRB_TT_SYMBOL) {
  1156. mrb_value obj = mrb_funcall(mrb, val, "inspect", 0);
  1157. mrb_raise(mrb, E_TYPE_ERROR, "%s is not a symbol",
  1158. mrb_string_value_ptr(mrb, obj));
  1159. }
  1160. return mrb_symbol(val);
  1161. }
  1162. mrb_value
  1163. mrb_mod_const_defined(mrb_state *mrb, mrb_value mod)
  1164. {
  1165. mrb_value sym;
  1166. mrb_get_args(mrb, "o", &sym);
  1167. if(mrb_const_defined(mrb, mod, mrb_sym_value(mrb, sym))) {
  1168. return mrb_true_value();
  1169. }
  1170. return mrb_false_value();
  1171. }
  1172. mrb_value
  1173. mrb_mod_const_get(mrb_state *mrb, mrb_value mod)
  1174. {
  1175. mrb_value sym;
  1176. mrb_get_args(mrb, "o", &sym);
  1177. return mrb_const_get(mrb, mod, mrb_sym_value(mrb, sym));
  1178. }
  1179. mrb_value
  1180. mrb_mod_const_set(mrb_state *mrb, mrb_value mod)
  1181. {
  1182. mrb_value sym, value;
  1183. mrb_get_args(mrb, "oo", &sym, &value);
  1184. mrb_const_set(mrb, mod, mrb_sym_value(mrb, sym), value);
  1185. return value;
  1186. }
  1187. static mrb_value
  1188. mrb_mod_eqq(mrb_state *mrb, mrb_value mod)
  1189. {
  1190. mrb_value obj;
  1191. mrb_get_args(mrb, "o", &obj);
  1192. if (!mrb_obj_is_kind_of(mrb, obj, mrb_class_ptr(mod)))
  1193. return mrb_false_value();
  1194. return mrb_true_value();
  1195. }
  1196. void
  1197. mrb_init_class(mrb_state *mrb)
  1198. {
  1199. struct RClass *bob; /* BasicObject */
  1200. struct RClass *obj; /* Object */
  1201. struct RClass *mod; /* Module */
  1202. struct RClass *cls; /* Class */
  1203. //struct RClass *krn; /* Kernel */
  1204. /* boot class hierarchy */
  1205. bob = boot_defclass(mrb, 0);
  1206. obj = boot_defclass(mrb, bob); mrb->object_class = obj;
  1207. mod = boot_defclass(mrb, obj); mrb->module_class = mod;/* obj -> mod */
  1208. cls = boot_defclass(mrb, mod); mrb->class_class = cls; /* obj -> cls */
  1209. /* fix-up loose ends */
  1210. bob->c = obj->c = mod->c = cls->c = cls;
  1211. make_metaclass(mrb, bob);
  1212. make_metaclass(mrb, obj);
  1213. make_metaclass(mrb, mod);
  1214. make_metaclass(mrb, cls);
  1215. /* name basic classes */
  1216. mrb_define_const(mrb, obj, "BasicObject", mrb_obj_value(bob));
  1217. mrb_define_const(mrb, obj, "Object", mrb_obj_value(obj));
  1218. mrb_define_const(mrb, obj, "Module", mrb_obj_value(mod));
  1219. mrb_define_const(mrb, obj, "Class", mrb_obj_value(cls));
  1220. /* name each classes */
  1221. mrb_name_class(mrb, bob, mrb_intern(mrb, "BasicObject"));
  1222. mrb_name_class(mrb, obj, mrb_intern(mrb, "Object"));
  1223. mrb_name_class(mrb, mod, mrb_intern(mrb, "Module"));
  1224. mrb_name_class(mrb, cls, mrb_intern(mrb, "Class"));
  1225. mrb_undef_method(mrb, mod, "new");
  1226. MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS);
  1227. mrb_define_method(mrb, bob, "initialize", mrb_bob_init, ARGS_NONE());
  1228. mrb_define_method(mrb, bob, "!", mrb_bob_not, ARGS_NONE());
  1229. mrb_define_method(mrb, bob, "method_missing", mrb_bob_missing, ARGS_ANY()); /* 15.3.1.3.30 */
  1230. mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, ARGS_ANY());
  1231. mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, ARGS_NONE()); /* 15.2.3.3.4 */
  1232. mrb_define_method(mrb, cls, "new", mrb_instance_new, ARGS_ANY()); /* 15.2.3.3.3 */
  1233. mrb_define_method(mrb, cls, "inherited", mrb_bob_init, ARGS_REQ(1));
  1234. mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, ARGS_REQ(1)); /* 15.2.2.4.25 */
  1235. mrb_define_method(mrb, mod, "extended", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.26 */
  1236. mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_ANY()); /* 15.2.2.4.27 */
  1237. mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, ARGS_REQ(1)); /* 15.2.2.4.10 */
  1238. mrb_define_method(mrb, mod, "included", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.29 */
  1239. mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, ARGS_NONE()); /* 15.2.2.4.30 */
  1240. mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, ARGS_NONE());
  1241. mrb_define_method(mrb, mod, "inspect", mrb_mod_to_s, ARGS_NONE());
  1242. mrb_define_method(mrb, mod, "alias_method", mrb_mod_alias, ARGS_ANY()); /* 15.2.2.4.8 */
  1243. mrb_define_method(mrb, mod, "ancestors", mrb_mod_ancestors, ARGS_NONE()); /* 15.2.2.4.9 */
  1244. mrb_define_method(mrb, mod, "undef_method", mrb_mod_undef, ARGS_ANY()); /* 15.2.2.4.41 */
  1245. mrb_define_method(mrb, mod, "const_defined?", mrb_mod_const_defined, ARGS_REQ(1)); /* 15.2.2.4.20 */
  1246. mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, ARGS_REQ(1)); /* 15.2.2.4.21 */
  1247. mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, ARGS_REQ(2)); /* 15.2.2.4.23 */
  1248. mrb_define_method(mrb, mod, "define_method", mod_define_method, ARGS_REQ(1));
  1249. mrb_define_method(mrb, mod, "===", mrb_mod_eqq, ARGS_REQ(1));
  1250. mrb_undef_method(mrb, cls, "append_features");
  1251. mrb_undef_method(mrb, cls, "extend_object");
  1252. }