Changeset 331 for EcnlProtoTool/trunk/mruby-1.3.0/src/class.c
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-1.3.0
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-1.3.0/src/class.c
r321 r331 6 6 7 7 #include <stdarg.h> 8 #include "mruby.h" 9 #include "mruby/array.h" 10 #include "mruby/class.h" 11 #include "mruby/numeric.h" 12 #include "mruby/proc.h" 13 #include "mruby/string.h" 14 #include "mruby/variable.h" 15 #include "mruby/error.h" 16 #include "mruby/data.h" 8 #include <mruby.h> 9 #include <mruby/array.h> 10 #include <mruby/class.h> 11 #include <mruby/numeric.h> 12 #include <mruby/proc.h> 13 #include <mruby/string.h> 14 #include <mruby/variable.h> 15 #include <mruby/error.h> 16 #include <mruby/data.h> 17 #include <mruby/istruct.h> 17 18 18 19 KHASH_DEFINE(mt, mrb_sym, struct RProc*, TRUE, kh_int_hash_func, kh_int_hash_equal) … … 97 98 else { 98 99 sc->super = o->c; 100 prepare_singleton_class(mrb, (struct RBasic*)sc); 99 101 } 100 102 o->c = sc; … … 122 124 } 123 125 124 MRB_API struct RClass* 125 mrb_class_outer_module(mrb_state *mrb, struct RClass *c) 126 { 127 mrb_value outer; 128 129 outer = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__")); 130 if (mrb_nil_p(outer)) return NULL; 131 return mrb_class_ptr(outer); 132 } 133 134 static void 135 check_if_class_or_module(mrb_state *mrb, mrb_value obj) 126 static mrb_bool 127 class_ptr_p(mrb_value obj) 136 128 { 137 129 switch (mrb_type(obj)) { … … 139 131 case MRB_TT_SCLASS: 140 132 case MRB_TT_MODULE: 141 return ;133 return TRUE; 142 134 default: 135 return FALSE; 136 } 137 } 138 139 MRB_API struct RClass* 140 mrb_class_outer_module(mrb_state *mrb, struct RClass *c) 141 { 142 mrb_value outer; 143 struct RClass *cls; 144 145 outer = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__")); 146 if (mrb_nil_p(outer)) return NULL; 147 cls = mrb_class_ptr(outer); 148 if (cls->tt == MRB_TT_SCLASS) 149 { 150 mrb_value klass; 151 klass = mrb_obj_iv_get(mrb, (struct RObject *)cls, 152 mrb_intern_lit(mrb, "__attached__")); 153 if (class_ptr_p(klass)) { 154 cls = mrb_class_ptr(klass); 155 } 156 } 157 return cls; 158 } 159 160 static void 161 check_if_class_or_module(mrb_state *mrb, mrb_value obj) 162 { 163 if (!class_ptr_p(obj)) { 143 164 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class/module", mrb_inspect(mrb, obj)); 144 165 } … … 175 196 { 176 197 check_if_class_or_module(mrb, outer); 198 if (mrb_const_defined_at(mrb, outer, id)) { 199 mrb_value old = mrb_const_get(mrb, outer, id); 200 201 if (mrb_type(old) != MRB_TT_MODULE) { 202 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a module", mrb_inspect(mrb, old)); 203 } 204 return mrb_class_ptr(old); 205 } 177 206 return define_module(mrb, id, mrb_class_ptr(outer)); 178 207 } … … 232 261 } 233 262 263 static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value cv); 264 234 265 static void 235 266 mrb_class_inherited(mrb_state *mrb, struct RClass *super, struct RClass *klass) 236 267 { 268 mrb_value s; 269 mrb_sym mid; 270 237 271 if (!super) 238 272 super = mrb->object_class; 239 mrb_funcall(mrb, mrb_obj_value(super), "inherited", 1, mrb_obj_value(klass)); 273 s = mrb_obj_value(super); 274 mid = mrb_intern_lit(mrb, "inherited"); 275 if (!mrb_func_basic_p(mrb, s, mid, mrb_bob_init)) { 276 mrb_value c = mrb_obj_value(klass); 277 mrb_funcall_argv(mrb, mrb_obj_value(super), mid, 1, &c); 278 } 240 279 } 241 280 … … 248 287 if (!mrb_nil_p(super)) { 249 288 if (mrb_type(super) != MRB_TT_CLASS) { 250 mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)", super); 289 mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)", 290 mrb_inspect(mrb, super)); 251 291 } 252 292 s = mrb_class_ptr(super); … … 256 296 } 257 297 check_if_class_or_module(mrb, outer); 298 if (mrb_const_defined_at(mrb, outer, id)) { 299 mrb_value old = mrb_const_get(mrb, outer, id); 300 301 if (mrb_type(old) != MRB_TT_CLASS) { 302 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class", mrb_inspect(mrb, old)); 303 } 304 c = mrb_class_ptr(old); 305 if (s) { 306 /* check super class */ 307 if (mrb_class_real(c->super) != s) { 308 mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for class %S", old); 309 } 310 } 311 return c; 312 } 258 313 c = define_class(mrb, id, s, mrb_class_ptr(outer)); 259 314 mrb_class_inherited(mrb, mrb_class_real(c->super), c); … … 272 327 } 273 328 329 MRB_API mrb_bool 330 mrb_class_defined_under(mrb_state *mrb, struct RClass *outer, const char *name) 331 { 332 mrb_value sym = mrb_check_intern_cstr(mrb, name); 333 if (mrb_nil_p(sym)) { 334 return FALSE; 335 } 336 return mrb_const_defined_at(mrb, mrb_obj_value(outer), mrb_symbol(sym)); 337 } 338 274 339 MRB_API struct RClass * 275 340 mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name) … … 282 347 { 283 348 return mrb_class_get_under(mrb, mrb->object_class, name); 349 } 350 351 MRB_API struct RClass * 352 mrb_exc_get(mrb_state *mrb, const char *name) 353 { 354 struct RClass *exc, *e; 355 mrb_value c = mrb_const_get(mrb, mrb_obj_value(mrb->object_class), 356 mrb_intern_cstr(mrb, name)); 357 358 if (mrb_type(c) != MRB_TT_CLASS) { 359 mrb_raise(mrb, mrb->eException_class, "exception corrupted"); 360 } 361 exc = e = mrb_class_ptr(c); 362 363 while (e) { 364 if (e == mrb->eException_class) 365 return exc; 366 e = e->super; 367 } 368 return mrb->eException_class; 284 369 } 285 370 … … 337 422 h = c->mt; 338 423 424 if (MRB_FROZEN_P(c)) { 425 if (c->tt == MRB_TT_MODULE) 426 mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen module"); 427 else 428 mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen class"); 429 } 339 430 if (!h) h = c->mt = kh_init(mt, mrb); 340 431 k = kh_put(mt, mrb, h, mid); 341 432 kh_value(h, k) = p; 342 433 if (p) { 434 p->c = NULL; 343 435 mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p); 344 436 } … … 430 522 mrb_value obj = mrb_funcall(mrb, ss, "inspect", 0); 431 523 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", obj); 524 /* not reached */ 525 return 0; 432 526 } 433 527 } … … 457 551 n: Symbol [mrb_sym] 458 552 d: Data [void*,mrb_data_type const] 2nd argument will be used to check data type so it won't be modified 553 I: Inline struct [void*] 459 554 &: Block [mrb_value] 460 555 *: rest argument [mrb_value*,mrb_int] Receive the rest of the arguments as an array. … … 467 562 char c; 468 563 int i = 0; 469 mrb_value *sp = mrb->c->stack + 1;470 564 va_list ap; 471 565 int argc = mrb->c->ci->argc; 566 int arg_i = 0; 567 mrb_bool array_argv; 472 568 mrb_bool opt = FALSE; 473 569 mrb_bool given = TRUE; … … 478 574 479 575 argc = a->len; 480 sp = a->ptr; 481 } 576 array_argv = TRUE; 577 } 578 else { 579 array_argv = FALSE; 580 } 581 582 #define ARGV \ 583 (array_argv ? mrb_ary_ptr(mrb->c->stack[1])->ptr : (mrb->c->stack + 1)) 584 482 585 while ((c = *format++)) { 483 586 switch (c) { … … 503 606 p = va_arg(ap, mrb_value*); 504 607 if (i < argc) { 505 *p = *sp++;608 *p = ARGV[arg_i++]; 506 609 i++; 507 610 } … … 516 619 mrb_value ss; 517 620 518 ss = *sp++; 519 switch (mrb_type(ss)) { 520 case MRB_TT_CLASS: 521 case MRB_TT_MODULE: 522 case MRB_TT_SCLASS: 523 break; 524 default: 621 ss = ARGV[arg_i++]; 622 if (!class_ptr_p(ss)) { 525 623 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not class/module", ss); 526 break;527 624 } 528 625 *p = ss; … … 538 635 if (*format == '!') { 539 636 format++; 540 if (i < argc && mrb_nil_p( *sp)) {541 *p = *sp++;637 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 638 *p = ARGV[arg_i++]; 542 639 i++; 543 640 break; … … 545 642 } 546 643 if (i < argc) { 547 *p = to_str(mrb, *sp++);644 *p = to_str(mrb, ARGV[arg_i++]); 548 645 i++; 549 646 } … … 557 654 if (*format == '!') { 558 655 format++; 559 if (i < argc && mrb_nil_p( *sp)) {560 *p = *sp++;656 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 657 *p = ARGV[arg_i++]; 561 658 i++; 562 659 break; … … 564 661 } 565 662 if (i < argc) { 566 *p = to_ary(mrb, *sp++);663 *p = to_ary(mrb, ARGV[arg_i++]); 567 664 i++; 568 665 } … … 576 673 if (*format == '!') { 577 674 format++; 578 if (i < argc && mrb_nil_p( *sp)) {579 *p = *sp++;675 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 676 *p = ARGV[arg_i++]; 580 677 i++; 581 678 break; … … 583 680 } 584 681 if (i < argc) { 585 *p = to_hash(mrb, *sp++);682 *p = to_hash(mrb, ARGV[arg_i++]); 586 683 i++; 587 684 } … … 598 695 if (*format == '!') { 599 696 format++; 600 if (i < argc && mrb_nil_p( *sp)) {697 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 601 698 *ps = NULL; 602 699 *pl = 0; 603 i++; 700 i++; arg_i++; 604 701 break; 605 702 } 606 703 } 607 704 if (i < argc) { 608 ss = to_str(mrb, *sp++);705 ss = to_str(mrb, ARGV[arg_i++]); 609 706 *ps = RSTRING_PTR(ss); 610 707 *pl = RSTRING_LEN(ss); … … 621 718 if (*format == '!') { 622 719 format++; 623 if (i < argc && mrb_nil_p( *sp)) {720 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 624 721 *ps = NULL; 625 i++; sp++;722 i++; arg_i++; 626 723 break; 627 724 } 628 725 } 629 726 if (i < argc) { 630 ss = to_str(mrb, *sp++);727 ss = to_str(mrb, ARGV[arg_i++]); 631 728 *ps = mrb_string_value_cstr(mrb, &ss); 632 729 i++; … … 645 742 if (*format == '!') { 646 743 format++; 647 if (i < argc && mrb_nil_p( *sp)) {744 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 648 745 *pb = 0; 649 746 *pl = 0; 650 i++; sp++;747 i++; arg_i++; 651 748 break; 652 749 } 653 750 } 654 751 if (i < argc) { 655 aa = to_ary(mrb, *sp++);752 aa = to_ary(mrb, ARGV[arg_i++]); 656 753 a = mrb_ary_ptr(aa); 657 754 *pb = a->ptr; … … 661 758 } 662 759 break; 760 case 'I': 761 { 762 void* *p; 763 mrb_value ss; 764 765 p = va_arg(ap, void**); 766 if (i < argc) { 767 ss = ARGV[arg_i]; 768 if (mrb_type(ss) != MRB_TT_ISTRUCT) 769 { 770 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not inline struct", ss); 771 } 772 *p = mrb_istruct_ptr(ss); 773 arg_i++; 774 i++; 775 } 776 } 777 break; 663 778 case 'f': 664 779 { … … 667 782 p = va_arg(ap, mrb_float*); 668 783 if (i < argc) { 669 *p = mrb_to_flo(mrb, *sp);670 sp++;784 *p = mrb_to_flo(mrb, ARGV[arg_i]); 785 arg_i++; 671 786 i++; 672 787 } … … 679 794 p = va_arg(ap, mrb_int*); 680 795 if (i < argc) { 681 switch (mrb_type( *sp)) {796 switch (mrb_type(ARGV[arg_i])) { 682 797 case MRB_TT_FIXNUM: 683 *p = mrb_fixnum( *sp);798 *p = mrb_fixnum(ARGV[arg_i]); 684 799 break; 685 800 case MRB_TT_FLOAT: 686 801 { 687 mrb_float f = mrb_float( *sp);688 689 if (!FIXABLE (f)) {802 mrb_float f = mrb_float(ARGV[arg_i]); 803 804 if (!FIXABLE_FLOAT(f)) { 690 805 mrb_raise(mrb, E_RANGE_ERROR, "float too big for int"); 691 806 } … … 697 812 break; 698 813 default: 699 *p = mrb_fixnum(mrb_Integer(mrb, *sp));814 *p = mrb_fixnum(mrb_Integer(mrb, ARGV[arg_i])); 700 815 break; 701 816 } 702 sp++;817 arg_i++; 703 818 i++; 704 819 } … … 710 825 711 826 if (i < argc) { 712 mrb_value b = *sp++;827 mrb_value b = ARGV[arg_i++]; 713 828 *boolp = mrb_test(b); 714 829 i++; … … 724 839 mrb_value ss; 725 840 726 ss = *sp++;841 ss = ARGV[arg_i++]; 727 842 *symp = to_sym(mrb, ss); 728 843 i++; … … 739 854 if (*format == '!') { 740 855 format++; 741 if (i < argc && mrb_nil_p( *sp)) {856 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 742 857 *datap = 0; 743 i++; sp++;858 i++; arg_i++; 744 859 break; 745 860 } 746 861 } 747 862 if (i < argc) { 748 *datap = mrb_data_get_ptr(mrb, *sp++, type);863 *datap = mrb_data_get_ptr(mrb, ARGV[arg_i++], type); 749 864 ++i; 750 865 } … … 788 903 *pl = argc-i; 789 904 if (*pl > 0) { 790 *var = sp;905 *var = ARGV + arg_i; 791 906 } 792 907 i = argc; 793 sp+= *pl;908 arg_i += *pl; 794 909 } 795 910 else { … … 804 919 } 805 920 } 921 922 #undef ARGV 923 806 924 if (!c && argc > i) { 807 925 mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); … … 831 949 boot_initmod(mrb_state *mrb, struct RClass *mod) 832 950 { 833 mod->mt = kh_init(mt, mrb); 951 if (!mod->mt) { 952 mod->mt = kh_init(mt, mrb); 953 } 834 954 } 835 955 … … 847 967 if (m->tt == MRB_TT_ICLASS) { 848 968 ic->c = m->c; 849 } else { 969 } 970 else { 850 971 ic->c = m; 851 972 } … … 873 994 if (p->mt == m->mt) { 874 995 if (!superclass_seen) { 875 ins_pos = p; / / move insert point996 ins_pos = p; /* move insert point */ 876 997 } 877 998 goto skip; … … 937 1058 938 1059 static mrb_value 939 mrb_mod_prepend(mrb_state *mrb, mrb_value klass)940 {941 mrb_value *argv;942 mrb_int argc, i;943 944 mrb_get_args(mrb, "*", &argv, &argc);945 for (i=0; i<argc; i++) {946 mrb_check_type(mrb, argv[i], MRB_TT_MODULE);947 }948 while (argc--) {949 mrb_funcall(mrb, argv[argc], "prepend_features", 1, klass);950 mrb_funcall(mrb, argv[argc], "prepended", 1, klass);951 }952 953 return klass;954 }955 956 static mrb_value957 1060 mrb_mod_append_features(mrb_state *mrb, mrb_value mod) 958 1061 { … … 963 1066 mrb_include_module(mrb, mrb_class_ptr(klass), mrb_class_ptr(mod)); 964 1067 return mod; 965 }966 967 static mrb_value968 mrb_mod_include(mrb_state *mrb, mrb_value klass)969 {970 mrb_value *argv;971 mrb_int argc, i;972 973 mrb_get_args(mrb, "*", &argv, &argc);974 for (i=0; i<argc; i++) {975 mrb_check_type(mrb, argv[i], MRB_TT_MODULE);976 }977 while (argc--) {978 mrb_funcall(mrb, argv[argc], "append_features", 1, klass);979 mrb_funcall(mrb, argv[argc], "included", 1, klass);980 }981 982 return klass;983 1068 } 984 1069 … … 1076 1161 mrb_value b; 1077 1162 struct RClass *m = mrb_class_ptr(mod); 1078 boot_initmod(mrb, m); / / bootstrap a newly initialized module1163 boot_initmod(mrb, m); /* bootstrap a newly initialized module */ 1079 1164 mrb_get_args(mrb, "|&", &b); 1080 1165 if (!mrb_nil_p(b)) { … … 1156 1241 obj = mrb_basic_ptr(v); 1157 1242 prepare_singleton_class(mrb, obj); 1158 if (mrb->c && mrb->c->ci && mrb->c->ci->target_class) {1159 mrb_obj_iv_set(mrb, (struct RObject*)obj->c, mrb_intern_lit(mrb, "__outer__"),1160 mrb_obj_value(mrb->c->ci->target_class));1161 }1162 1243 return mrb_obj_value(obj->c); 1163 1244 } … … 1320 1401 1321 1402 if (ttype == 0) ttype = MRB_TT_OBJECT; 1403 if (ttype <= MRB_TT_CPTR) { 1404 mrb_raisef(mrb, E_TYPE_ERROR, "can't create instance of %S", cv); 1405 } 1322 1406 o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c); 1323 1407 return mrb_obj_value(o); … … 1354 1438 { 1355 1439 mrb_value obj; 1440 mrb_sym mid; 1356 1441 1357 1442 obj = mrb_instance_alloc(mrb, mrb_obj_value(c)); 1358 mrb_funcall_argv(mrb, obj, mrb_intern_lit(mrb, "initialize"), argc, argv); 1359 1443 mid = mrb_intern_lit(mrb, "initialize"); 1444 if (!mrb_func_basic_p(mrb, obj, mid, mrb_bob_init)) { 1445 mrb_funcall_argv(mrb, obj, mid, argc, argv); 1446 } 1360 1447 return obj; 1361 1448 } … … 1379 1466 mrb_value super, blk; 1380 1467 mrb_value new_class; 1468 mrb_sym mid; 1381 1469 1382 1470 n = mrb_get_args(mrb, "|C&", &super, &blk); … … 1385 1473 } 1386 1474 new_class = mrb_obj_value(mrb_class_new(mrb, mrb_class_ptr(super))); 1387 mrb_funcall_with_block(mrb, new_class, mrb_intern_lit(mrb, "initialize"), n, &super, blk); 1475 mid = mrb_intern_lit(mrb, "initialize"); 1476 if (!mrb_func_basic_p(mrb, new_class, mid, mrb_bob_init)) { 1477 mrb_funcall_with_block(mrb, new_class, mid, n, &super, blk); 1478 } 1388 1479 mrb_class_inherited(mrb, mrb_class_ptr(super), mrb_class_ptr(new_class)); 1389 1480 return new_class; … … 1416 1507 } 1417 1508 1418 void 1419 mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args) 1420 { 1421 mrb_sym inspect; 1422 mrb_value repr; 1423 1424 inspect = mrb_intern_lit(mrb, "inspect"); 1425 if (mrb->c->ci > mrb->c->cibase && mrb->c->ci[-1].mid == inspect) { 1426 /* method missing in inspect; avoid recursion */ 1427 repr = mrb_any_to_s(mrb, self); 1428 } 1429 else if (mrb_respond_to(mrb, self, inspect) && mrb->c->ci - mrb->c->cibase < 64) { 1430 repr = mrb_funcall_argv(mrb, self, inspect, 0, 0); 1431 if (mrb_string_p(repr) && RSTRING_LEN(repr) > 64) { 1432 repr = mrb_any_to_s(mrb, self); 1433 } 1434 } 1435 else { 1436 repr = mrb_any_to_s(mrb, self); 1437 } 1438 1439 mrb_no_method_error(mrb, name, args, "undefined method '%S' for %S", 1440 mrb_sym2str(mrb, name), repr); 1441 } 1442 1443 /* 15.3.1.3.30 */ 1509 /* 15.3.1.3.1 */ 1510 /* 15.3.1.3.10 */ 1511 /* 15.3.1.3.11 */ 1444 1512 /* 1445 1513 * call-seq: 1446 * obj.method_missing(symbol [, *args] ) -> result 1447 * 1448 * Invoked by Ruby when <i>obj</i> is sent a message it cannot handle. 1449 * <i>symbol</i> is the symbol for the method called, and <i>args</i> 1450 * are any arguments that were passed to it. By default, the interpreter 1451 * raises an error when this method is called. However, it is possible 1452 * to override the method to provide more dynamic behavior. 1453 * If it is decided that a particular method should not be handled, then 1454 * <i>super</i> should be called, so that ancestors can pick up the 1455 * missing method. 1456 * The example below creates 1457 * a class <code>Roman</code>, which responds to methods with names 1458 * consisting of roman numerals, returning the corresponding integer 1459 * values. 1460 * 1461 * class Roman 1462 * def romanToInt(str) 1463 * # ... 1464 * end 1465 * def method_missing(methId) 1466 * str = methId.id2name 1467 * romanToInt(str) 1468 * end 1469 * end 1470 * 1471 * r = Roman.new 1472 * r.iv #=> 4 1473 * r.xxiii #=> 23 1474 * r.mm #=> 2000 1514 * obj == other -> true or false 1515 * obj.equal?(other) -> true or false 1516 * obj.eql?(other) -> true or false 1517 * 1518 * Equality---At the <code>Object</code> level, <code>==</code> returns 1519 * <code>true</code> only if <i>obj</i> and <i>other</i> are the 1520 * same object. Typically, this method is overridden in descendant 1521 * classes to provide class-specific meaning. 1522 * 1523 * Unlike <code>==</code>, the <code>equal?</code> method should never be 1524 * overridden by subclasses: it is used to determine object identity 1525 * (that is, <code>a.equal?(b)</code> iff <code>a</code> is the same 1526 * object as <code>b</code>). 1527 * 1528 * The <code>eql?</code> method returns <code>true</code> if 1529 * <i>obj</i> and <i>anObject</i> have the same value. Used by 1530 * <code>Hash</code> to test members for equality. For objects of 1531 * class <code>Object</code>, <code>eql?</code> is synonymous with 1532 * <code>==</code>. Subclasses normally continue this tradition, but 1533 * there are exceptions. <code>Numeric</code> types, for example, 1534 * perform type conversion across <code>==</code>, but not across 1535 * <code>eql?</code>, so: 1536 * 1537 * 1 == 1.0 #=> true 1538 * 1.eql? 1.0 #=> false 1475 1539 */ 1476 static mrb_value 1477 mrb_bob_missing(mrb_state *mrb, mrb_value mod) 1478 { 1479 mrb_sym name; 1480 mrb_value *a; 1481 mrb_int alen; 1482 1483 mrb_get_args(mrb, "n*", &name, &a, &alen); 1484 mrb_method_missing(mrb, name, mod, mrb_ary_new_from_values(mrb, alen, a)); 1485 /* not reached */ 1486 return mrb_nil_value(); 1540 mrb_value 1541 mrb_obj_equal_m(mrb_state *mrb, mrb_value self) 1542 { 1543 mrb_value arg; 1544 1545 mrb_get_args(mrb, "o", &arg); 1546 return mrb_bool_value(mrb_obj_equal(mrb, self, arg)); 1547 } 1548 1549 static mrb_value 1550 mrb_obj_not_equal_m(mrb_state *mrb, mrb_value self) 1551 { 1552 mrb_value arg; 1553 1554 mrb_get_args(mrb, "o", &arg); 1555 return mrb_bool_value(!mrb_equal(mrb, self, arg)); 1487 1556 } 1488 1557 … … 1533 1602 return mrb_nil_value(); 1534 1603 } 1535 else if (outer && outer != mrb->object_class) {1604 else if (outer && outer != c && outer != mrb->object_class) { 1536 1605 mrb_value base = mrb_class_path(mrb, outer); 1537 1606 path = mrb_str_buf_new(mrb, 0); … … 1552 1621 path = mrb_str_new(mrb, name, len); 1553 1622 } 1554 mrb_obj_iv_set(mrb, (struct RObject*)c, classpath, path); 1555 } 1556 return path; 1623 if (!MRB_FROZEN_P(c)) { 1624 mrb_obj_iv_set(mrb, (struct RObject*)c, classpath, path); 1625 } 1626 } 1627 return mrb_str_dup(mrb, path); 1557 1628 } 1558 1629 … … 1699 1770 str = mrb_str_new_lit(mrb, "#<Class:"); 1700 1771 1701 switch (mrb_type(v)) { 1702 case MRB_TT_CLASS: 1703 case MRB_TT_MODULE: 1704 case MRB_TT_SCLASS: 1705 mrb_str_cat_str(mrb, str, mrb_inspect(mrb, v)); 1706 break; 1707 default: 1708 mrb_str_cat_str(mrb, str, mrb_any_to_s(mrb, v)); 1709 break; 1772 if (class_ptr_p(v)) { 1773 mrb_str_cat_str(mrb, str, mrb_inspect(mrb, v)); 1774 } 1775 else { 1776 mrb_str_cat_str(mrb, str, mrb_any_to_s(mrb, v)); 1710 1777 } 1711 1778 return mrb_str_cat_lit(mrb, str, ">"); … … 1786 1853 mrb_get_args(mrb, "*", &argv, &argc); 1787 1854 while (argc--) { 1788 undef_method(mrb, c, mrb_symbol(*argv));1855 undef_method(mrb, c, to_sym(mrb, *argv)); 1789 1856 argv++; 1790 1857 } … … 1798 1865 struct RProc *p; 1799 1866 mrb_sym mid; 1867 mrb_value proc = mrb_undef_value(); 1800 1868 mrb_value blk; 1801 1869 1802 mrb_get_args(mrb, "n&", &mid, &blk); 1870 mrb_get_args(mrb, "n|o&", &mid, &proc, &blk); 1871 switch (mrb_type(proc)) { 1872 case MRB_TT_PROC: 1873 blk = proc; 1874 break; 1875 case MRB_TT_UNDEF: 1876 /* ignored */ 1877 break; 1878 default: 1879 mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected Proc)", mrb_obj_value(mrb_obj_class(mrb, proc))); 1880 break; 1881 } 1803 1882 if (mrb_nil_p(blk)) { 1804 1883 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); … … 2028 2107 mrb_get_args(mrb, "*", &argv, &argc); 2029 2108 while (argc--) { 2030 remove_method(mrb, mod, mrb_symbol(*argv));2109 remove_method(mrb, mod, to_sym(mrb, *argv)); 2031 2110 argv++; 2032 2111 } … … 2159 2238 2160 2239 mrb_get_args(mrb, "*", &argv, &argc); 2161 if (argc == 0) {2240 if (argc == 0) { 2162 2241 /* set MODFUNC SCOPE if implemented */ 2163 2242 return mod; … … 2182 2261 return mod; 2183 2262 } 2263 2264 /* implementation of __id__ */ 2265 mrb_value mrb_obj_id_m(mrb_state *mrb, mrb_value self); 2266 /* implementation of instance_eval */ 2267 mrb_value mrb_obj_instance_eval(mrb_state*, mrb_value); 2184 2268 2185 2269 void … … 2222 2306 mrb_define_method(mrb, bob, "initialize", mrb_bob_init, MRB_ARGS_NONE()); 2223 2307 mrb_define_method(mrb, bob, "!", mrb_bob_not, MRB_ARGS_NONE()); 2224 mrb_define_method(mrb, bob, "method_missing", mrb_bob_missing, MRB_ARGS_ANY()); /* 15.3.1.3.30 */ 2308 mrb_define_method(mrb, bob, "==", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.1 */ 2309 mrb_define_method(mrb, bob, "!=", mrb_obj_not_equal_m, MRB_ARGS_REQ(1)); 2310 mrb_define_method(mrb, bob, "__id__", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.3 */ 2311 mrb_define_method(mrb, bob, "__send__", mrb_f_send, MRB_ARGS_ANY()); /* 15.3.1.3.4 */ 2312 mrb_define_method(mrb, bob, "instance_eval", mrb_obj_instance_eval, MRB_ARGS_ANY()); /* 15.3.1.3.18 */ 2225 2313 2226 2314 mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, MRB_ARGS_OPT(1)); … … 2236 2324 mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, MRB_ARGS_REQ(1)); /* 15.2.2.4.25 */ 2237 2325 mrb_define_method(mrb, mod, "extended", mrb_bob_init, MRB_ARGS_REQ(1)); /* 15.2.2.4.26 */ 2238 mrb_define_method(mrb, mod, "prepend", mrb_mod_prepend, MRB_ARGS_ANY());2239 2326 mrb_define_method(mrb, mod, "prepended", mrb_bob_init, MRB_ARGS_REQ(1)); 2240 2327 mrb_define_method(mrb, mod, "prepend_features", mrb_mod_prepend_features, MRB_ARGS_REQ(1)); 2241 mrb_define_method(mrb, mod, "include", mrb_mod_include, MRB_ARGS_ANY()); /* 15.2.2.4.27 */2242 2328 mrb_define_method(mrb, mod, "include?", mrb_mod_include_p, MRB_ARGS_REQ(1)); /* 15.2.2.4.28 */ 2243 2329 mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, MRB_ARGS_REQ(1)); /* 15.2.2.4.10 */ … … 2269 2355 mrb_define_method(mrb, mod, "remove_const", mrb_mod_remove_const, MRB_ARGS_REQ(1)); /* 15.2.2.4.40 */ 2270 2356 mrb_define_method(mrb, mod, "const_missing", mrb_mod_const_missing, MRB_ARGS_REQ(1)); 2271 mrb_define_method(mrb, mod, "define_method", mod_define_method, MRB_ARGS_ REQ(1));2357 mrb_define_method(mrb, mod, "define_method", mod_define_method, MRB_ARGS_ARG(1,1)); 2272 2358 mrb_define_method(mrb, mod, "class_variables", mrb_mod_class_variables, MRB_ARGS_NONE()); /* 15.2.2.4.19 */ 2273 2359 mrb_define_method(mrb, mod, "===", mrb_mod_eqq, MRB_ARGS_REQ(1));
Note:
See TracChangeset
for help on using the changeset viewer.