Changeset 439 for EcnlProtoTool/trunk/mruby-2.1.1/src/class.c
- Timestamp:
- Jul 9, 2020, 8:51:43 AM (4 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-2.1.1
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-2.1.1/src/class.c
r331 r439 8 8 #include <mruby.h> 9 9 #include <mruby/array.h> 10 #include <mruby/hash.h> 10 11 #include <mruby/class.h> 11 12 #include <mruby/numeric.h> … … 16 17 #include <mruby/data.h> 17 18 #include <mruby/istruct.h> 18 19 KHASH_DEFINE(mt, mrb_sym, struct RProc*, TRUE, kh_int_hash_func, kh_int_hash_equal) 19 #include <mruby/opcode.h> 20 21 KHASH_DEFINE(mt, mrb_sym, mrb_method_t, TRUE, kh_int_hash_func, kh_int_hash_equal) 20 22 21 23 void … … 28 30 for (k = kh_begin(h); k != kh_end(h); k++) { 29 31 if (kh_exist(h, k)) { 30 struct RProc *m = kh_value(h, k); 31 if (m) { 32 mrb_gc_mark(mrb, (struct RBasic*)m); 32 mrb_method_t m = kh_value(h, k); 33 34 if (MRB_METHOD_PROC_P(m)) { 35 struct RProc *p = MRB_METHOD_PROC(m); 36 mrb_gc_mark(mrb, (struct RBasic*)p); 33 37 } 34 38 } … … 51 55 } 52 56 53 static void 54 name_class(mrb_state *mrb, struct RClass *c, mrb_sym name) 55 { 56 mrb_obj_iv_set(mrb, (struct RObject*)c, 57 mrb_intern_lit(mrb, "__classid__"), mrb_symbol_value(name)); 57 void 58 mrb_class_name_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb_sym id) 59 { 60 mrb_value name; 61 mrb_sym nsym = mrb_intern_lit(mrb, "__classname__"); 62 63 if (mrb_obj_iv_defined(mrb, (struct RObject*)c, nsym)) return; 64 if (outer == NULL || outer == mrb->object_class) { 65 name = mrb_symbol_value(id); 66 } 67 else { 68 name = mrb_class_path(mrb, outer); 69 if (mrb_nil_p(name)) { /* unnamed outer class */ 70 if (outer != mrb->object_class && outer != c) { 71 mrb_obj_iv_set_force(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"), 72 mrb_obj_value(outer)); 73 } 74 return; 75 } 76 else { 77 mrb_int len; 78 const char *n = mrb_sym_name_len(mrb, id, &len); 79 80 mrb_str_cat_lit(mrb, name, "::"); 81 mrb_str_cat(mrb, name, n, len); 82 } 83 } 84 mrb_obj_iv_set_force(mrb, (struct RObject*)c, nsym, name); 85 } 86 87 mrb_bool 88 mrb_const_name_p(mrb_state *mrb, const char *name, mrb_int len) 89 { 90 return len > 0 && ISUPPER(name[0]) && mrb_ident_p(name+1, len-1); 58 91 } 59 92 … … 61 94 setup_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb_sym id) 62 95 { 63 name_class(mrb, c, id);96 mrb_class_name_class(mrb, outer, c, id); 64 97 mrb_obj_iv_set(mrb, (struct RObject*)outer, id, mrb_obj_value(c)); 65 if (outer != mrb->object_class) {66 mrb_obj_iv_set(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"),67 mrb_obj_value(outer));68 }69 98 } 70 99 … … 78 107 if (o->c->tt == MRB_TT_SCLASS) return; 79 108 sc = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_SCLASS, mrb->class_class); 109 sc->flags |= MRB_FL_CLASS_IS_INHERITED; 80 110 sc->mt = kh_init(mt, mrb); 81 111 sc->iv = 0; … … 104 134 mrb_field_write_barrier(mrb, (struct RBasic*)sc, (struct RBasic*)o); 105 135 mrb_obj_iv_set(mrb, (struct RObject*)sc, mrb_intern_lit(mrb, "__attached__"), mrb_obj_value(o)); 106 } 107 108 static struct RClass * 136 sc->flags |= o->flags & MRB_FL_OBJ_IS_FROZEN; 137 } 138 139 static mrb_value 140 class_name_str(mrb_state *mrb, struct RClass* c) 141 { 142 mrb_value path = mrb_class_path(mrb, c); 143 if (mrb_nil_p(path)) { 144 path = c->tt == MRB_TT_MODULE ? mrb_str_new_lit(mrb, "#<Module:") : 145 mrb_str_new_lit(mrb, "#<Class:"); 146 mrb_str_cat_str(mrb, path, mrb_ptr_to_str(mrb, c)); 147 mrb_str_cat_lit(mrb, path, ">"); 148 } 149 return path; 150 } 151 152 static struct RClass* 109 153 class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id) 110 154 { … … 115 159 } 116 160 117 static struct RClass 161 static struct RClass* 118 162 module_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id) 119 163 { … … 137 181 } 138 182 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 183 static void 161 184 check_if_class_or_module(mrb_state *mrb, mrb_value obj) 162 185 { 163 186 if (!class_ptr_p(obj)) { 164 mrb_raisef(mrb, E_TYPE_ERROR, "% S is not a class/module", mrb_inspect(mrb, obj));187 mrb_raisef(mrb, E_TYPE_ERROR, "%!v is not a class/module", obj); 165 188 } 166 189 } … … 192 215 } 193 216 194 MRB_APIstruct RClass*217 struct RClass* 195 218 mrb_vm_define_module(mrb_state *mrb, mrb_value outer, mrb_sym id) 196 219 { … … 199 222 mrb_value old = mrb_const_get(mrb, outer, id); 200 223 201 if ( mrb_type(old) != MRB_TT_MODULE) {202 mrb_raisef(mrb, E_TYPE_ERROR, "% S is not a module", mrb_inspect(mrb, old));224 if (!mrb_module_p(old)) { 225 mrb_raisef(mrb, E_TYPE_ERROR, "%!v is not a module", old); 203 226 } 204 227 return mrb_class_ptr(old); … … 233 256 MRB_CLASS_ORIGIN(c); 234 257 if (super && mrb_class_real(c->super) != super) { 235 mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for Class %S (%S not %S)", 236 mrb_sym2str(mrb, name), 237 mrb_obj_value(c->super), mrb_obj_value(super)); 258 mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for Class %n (%C not %C)", 259 name, c->super, super); 238 260 } 239 261 return c; … … 250 272 { 251 273 if (!super) { 252 mrb_warn(mrb, "no super class for '% S', Object assumed", mrb_sym2str(mrb, name));274 mrb_warn(mrb, "no super class for '%n', Object assumed", name); 253 275 } 254 276 return define_class(mrb, name, super, mrb->object_class); … … 261 283 } 262 284 263 static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value cv); 285 static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value); 286 #ifdef MRB_METHOD_CACHE 287 static void mc_clear_all(mrb_state *mrb); 288 static void mc_clear_by_id(mrb_state *mrb, struct RClass*, mrb_sym); 289 #else 290 #define mc_clear_all(mrb) 291 #define mc_clear_by_id(mrb,c,s) 292 #endif 264 293 265 294 static void … … 271 300 if (!super) 272 301 super = mrb->object_class; 302 super->flags |= MRB_FL_CLASS_IS_INHERITED; 273 303 s = mrb_obj_value(super); 304 mrb_mc_clear_by_class(mrb, klass); 274 305 mid = mrb_intern_lit(mrb, "inherited"); 275 306 if (!mrb_func_basic_p(mrb, s, mid, mrb_bob_init)) { 276 307 mrb_value c = mrb_obj_value(klass); 277 mrb_funcall_argv(mrb, mrb_obj_value(super), mid, 1, &c);278 } 279 } 280 281 MRB_APIstruct RClass*308 mrb_funcall_argv(mrb, s, mid, 1, &c); 309 } 310 } 311 312 struct RClass* 282 313 mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id) 283 314 { … … 286 317 287 318 if (!mrb_nil_p(super)) { 288 if (mrb_type(super) != MRB_TT_CLASS) { 289 mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)", 290 mrb_inspect(mrb, super)); 319 if (!mrb_class_p(super)) { 320 mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%!v given)", super); 291 321 } 292 322 s = mrb_class_ptr(super); … … 299 329 mrb_value old = mrb_const_get(mrb, outer, id); 300 330 301 if ( mrb_type(old) != MRB_TT_CLASS) {302 mrb_raisef(mrb, E_TYPE_ERROR, "% S is not a class", mrb_inspect(mrb, old));331 if (!mrb_class_p(old)) { 332 mrb_raisef(mrb, E_TYPE_ERROR, "%!v is not a class", old); 303 333 } 304 334 c = mrb_class_ptr(old); … … 306 336 /* check super class */ 307 337 if (mrb_class_real(c->super) != s) { 308 mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for class % S", old);338 mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for class %v", old); 309 339 } 310 340 } … … 337 367 } 338 368 339 MRB_API struct RClass 369 MRB_API struct RClass* 340 370 mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name) 341 371 { … … 343 373 } 344 374 345 MRB_API struct RClass 375 MRB_API struct RClass* 346 376 mrb_class_get(mrb_state *mrb, const char *name) 347 377 { … … 349 379 } 350 380 351 MRB_API struct RClass 381 MRB_API struct RClass* 352 382 mrb_exc_get(mrb_state *mrb, const char *name) 353 383 { … … 356 386 mrb_intern_cstr(mrb, name)); 357 387 358 if ( mrb_type(c) != MRB_TT_CLASS) {388 if (!mrb_class_p(c)) { 359 389 mrb_raise(mrb, mrb->eException_class, "exception corrupted"); 360 390 } … … 369 399 } 370 400 371 MRB_API struct RClass 401 MRB_API struct RClass* 372 402 mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name) 373 403 { … … 375 405 } 376 406 377 MRB_API struct RClass 407 MRB_API struct RClass* 378 408 mrb_module_get(mrb_state *mrb, const char *name) 379 409 { … … 384 414 * Defines a class under the namespace of \a outer. 385 415 * \param outer a class which contains the new class. 386 * \param idname of the new class416 * \param name name of the new class 387 417 * \param super a class from which the new class will derive. 388 418 * NULL means \c Object class. … … 397 427 * \a super, the function just returns the defined class. 398 428 */ 399 MRB_API struct RClass 429 MRB_API struct RClass* 400 430 mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super) 401 431 { … … 405 435 #if 0 406 436 if (!super) { 407 mrb_warn(mrb, "no super class for '%S::%S', Object assumed", 408 mrb_obj_value(outer), mrb_sym2str(mrb, id)); 437 mrb_warn(mrb, "no super class for '%C::%n', Object assumed", outer, id); 409 438 } 410 439 #endif … … 415 444 416 445 MRB_API void 417 mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p)446 mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_method_t m) 418 447 { 419 448 khash_t(mt) *h; … … 422 451 h = c->mt; 423 452 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 } 453 mrb_check_frozen(mrb, c); 430 454 if (!h) h = c->mt = kh_init(mt, mrb); 431 455 k = kh_put(mt, mrb, h, mid); 432 kh_value(h, k) = p; 433 if (p) { 456 kh_value(h, k) = m; 457 if (MRB_METHOD_PROC_P(m) && !MRB_METHOD_UNDEF_P(m)) { 458 struct RProc *p = MRB_METHOD_PROC(m); 459 460 p->flags |= MRB_PROC_SCOPE; 434 461 p->c = NULL; 435 mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p); 436 } 462 mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)p); 463 if (!MRB_PROC_ENV_P(p)) { 464 MRB_PROC_SET_TARGET_CLASS(p, c); 465 } 466 } 467 mc_clear_by_id(mrb, c, mid); 437 468 } 438 469 … … 440 471 mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec) 441 472 { 442 struct RProc *p;473 mrb_method_t m; 443 474 int ai = mrb_gc_arena_save(mrb); 444 475 445 p = mrb_proc_new_cfunc(mrb, func); 446 p->target_class = c; 447 mrb_define_method_raw(mrb, c, mid, p); 476 MRB_METHOD_FROM_FUNC(m, func); 477 if (aspec == MRB_ARGS_NONE()) { 478 MRB_METHOD_NOARG_SET(m); 479 } 480 mrb_define_method_raw(mrb, c, mid, m); 448 481 mrb_gc_arena_restore(mrb, ai); 449 482 } … … 459 492 mrb_notimplement(mrb_state *mrb) 460 493 { 461 const char *str;462 mrb_int len;463 494 mrb_callinfo *ci = mrb->c->ci; 464 495 465 496 if (ci->mid) { 466 str = mrb_sym2name_len(mrb, ci->mid, &len); 467 mrb_raisef(mrb, E_NOTIMP_ERROR, 468 "%S() function is unimplemented on this machine", 469 mrb_str_new_static(mrb, str, (size_t)len)); 497 mrb_raisef(mrb, E_NOTIMP_ERROR, "%n() function is unimplemented on this machine", ci->mid); 470 498 } 471 499 } … … 481 509 482 510 static mrb_value 483 check_type(mrb_state *mrb, mrb_value val, enum mrb_vtype t, const char *c, const char *m)484 {485 mrb_value tmp;486 487 tmp = mrb_check_convert_type(mrb, val, t, c, m);488 if (mrb_nil_p(tmp)) {489 mrb_raisef(mrb, E_TYPE_ERROR, "expected %S", mrb_str_new_cstr(mrb, c));490 }491 return tmp;492 }493 494 static mrb_value495 to_str(mrb_state *mrb, mrb_value val)496 {497 return check_type(mrb, val, MRB_TT_STRING, "String", "to_str");498 }499 500 static mrb_value501 511 to_ary(mrb_state *mrb, mrb_value val) 502 512 { 503 return check_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary"); 513 mrb_check_type(mrb, val, MRB_TT_ARRAY); 514 return val; 504 515 } 505 516 … … 507 518 to_hash(mrb_state *mrb, mrb_value val) 508 519 { 509 return check_type(mrb, val, MRB_TT_HASH, "Hash", "to_hash"); 510 } 511 512 static mrb_sym 513 to_sym(mrb_state *mrb, mrb_value ss) 514 { 515 if (mrb_type(ss) == MRB_TT_SYMBOL) { 516 return mrb_symbol(ss); 517 } 518 else if (mrb_string_p(ss)) { 519 return mrb_intern_str(mrb, to_str(mrb, ss)); 520 } 521 else { 522 mrb_value obj = mrb_funcall(mrb, ss, "inspect", 0); 523 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", obj); 524 /* not reached */ 525 return 0; 526 } 527 } 520 mrb_check_type(mrb, val, MRB_TT_HASH); 521 return val; 522 } 523 524 #define to_sym(mrb, ss) mrb_obj_to_sym(mrb, ss) 525 526 MRB_API mrb_int 527 mrb_get_argc(mrb_state *mrb) 528 { 529 mrb_int argc = mrb->c->ci->argc; 530 531 if (argc < 0) { 532 struct RArray *a = mrb_ary_ptr(mrb->c->stack[1]); 533 534 argc = ARY_LEN(a); 535 } 536 return argc; 537 } 538 539 MRB_API mrb_value* 540 mrb_get_argv(mrb_state *mrb) 541 { 542 mrb_int argc = mrb->c->ci->argc; 543 mrb_value *array_argv = mrb->c->stack + 1; 544 if (argc < 0) { 545 struct RArray *a = mrb_ary_ptr(*array_argv); 546 547 array_argv = ARY_PTR(a); 548 } 549 return array_argv; 550 } 551 552 void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self); 528 553 529 554 /* … … 539 564 ---------------------------------------------------------------------------------------------- 540 565 o: Object [mrb_value] 541 C: class/module [mrb_value]566 C: Class/Module [mrb_value] 542 567 S: String [mrb_value] when ! follows, the value may be nil 543 568 A: Array [mrb_value] when ! follows, the value may be nil … … 546 571 z: String [char*] NUL terminated string; z! gives NULL for nil 547 572 a: Array [mrb_value*,mrb_int] Receive two arguments; a! gives (NULL,0) for nil 548 f: Float [mrb_float] 549 i: Integer [mrb_int] 550 b: Boolean [mrb_bool] 551 n: Symbol [mrb_sym] 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*] 554 &: Block [mrb_value] 555 *: rest argument [mrb_value*,mrb_int] Receive the rest of the arguments as an array. 556 |: optional Next argument of '|' and later are optional. 557 ?: optional given [mrb_bool] true if preceding argument (optional) is given. 573 f: Fixnum/Float [mrb_float] 574 i: Fixnum/Float [mrb_int] 575 b: boolean [mrb_bool] 576 n: String/Symbol [mrb_sym] 577 d: data [void*,mrb_data_type const] 2nd argument will be used to check data type so it won't be modified; when ! follows, the value may be nil 578 I: inline struct [void*] 579 &: block [mrb_value] &! raises exception if no block given 580 *: rest argument [mrb_value*,mrb_int] The rest of the arguments as an array; *! avoid copy of the stack 581 |: optional Following arguments are optional 582 ?: optional given [mrb_bool] true if preceding argument (optional) is given 583 ':': keyword args [mrb_kwargs const] Get keyword arguments 558 584 */ 559 585 MRB_API mrb_int 560 586 mrb_get_args(mrb_state *mrb, const char *format, ...) 561 587 { 588 const char *fmt = format; 562 589 char c; 563 int i = 0;590 mrb_int i = 0; 564 591 va_list ap; 565 int argc = mrb->c->ci->argc;566 int arg_i = 0;567 mrb_bool ar ray_argv;592 mrb_int argc = mrb->c->ci->argc; 593 mrb_value *array_argv = mrb->c->stack+1; 594 mrb_bool argv_on_stack = argc >= 0; 568 595 mrb_bool opt = FALSE; 596 mrb_bool opt_skip = TRUE; 569 597 mrb_bool given = TRUE; 570 598 mrb_value kdict; 599 mrb_bool reqkarg = FALSE; 600 mrb_int needargc = 0; 601 602 if (!argv_on_stack) { 603 struct RArray *a = mrb_ary_ptr(*array_argv); 604 array_argv = ARY_PTR(a); 605 argc = ARY_LEN(a); 606 } 571 607 va_start(ap, format); 572 if (argc < 0) { 573 struct RArray *a = mrb_ary_ptr(mrb->c->stack[1]); 574 575 argc = a->len; 576 array_argv = TRUE; 608 609 #define ARGV array_argv 610 611 while ((c = *fmt++)) { 612 switch (c) { 613 case '|': 614 opt = TRUE; 615 break; 616 case '*': 617 opt_skip = FALSE; 618 if (!reqkarg) reqkarg = strchr(fmt, ':') ? TRUE : FALSE; 619 goto check_exit; 620 case '!': 621 break; 622 case ':': 623 reqkarg = TRUE; 624 /* fall through */ 625 case '&': case '?': 626 if (opt) opt_skip = FALSE; 627 break; 628 default: 629 if (!opt) needargc ++; 630 break; 631 } 632 } 633 634 check_exit: 635 if (reqkarg && argc > needargc && mrb_hash_p(kdict = ARGV[argc - 1])) { 636 mrb_hash_check_kdict(mrb, kdict); 637 argc --; 577 638 } 578 639 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 640 kdict = mrb_nil_value(); 641 } 642 643 opt = FALSE; 644 i = 0; 585 645 while ((c = *format++)) { 646 mrb_value *argv = ARGV; 647 mrb_bool altmode; 648 586 649 switch (c) { 587 case '|': case '*': case '&': case '?': 650 case '|': case '*': case '&': case '?': case ':': 588 651 break; 589 652 default: … … 599 662 } 600 663 664 if (*format == '!') { 665 format ++; 666 altmode = TRUE; 667 } 668 else { 669 altmode = FALSE; 670 } 671 601 672 switch (c) { 602 673 case 'o': … … 606 677 p = va_arg(ap, mrb_value*); 607 678 if (i < argc) { 608 *p = ARGV[arg_i++]; 609 i++; 679 *p = argv[i++]; 610 680 } 611 681 } … … 619 689 mrb_value ss; 620 690 621 ss = ARGV[arg_i++];691 ss = argv[i++]; 622 692 if (!class_ptr_p(ss)) { 623 mrb_raisef(mrb, E_TYPE_ERROR, "% Sis not class/module", ss);693 mrb_raisef(mrb, E_TYPE_ERROR, "%v is not class/module", ss); 624 694 } 625 695 *p = ss; 626 i++;627 696 } 628 697 } … … 633 702 634 703 p = va_arg(ap, mrb_value*); 635 if (*format == '!') { 636 format++; 637 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 638 *p = ARGV[arg_i++]; 639 i++; 640 break; 704 if (i < argc) { 705 *p = argv[i++]; 706 if (!(altmode && mrb_nil_p(*p))) { 707 mrb_to_str(mrb, *p); 641 708 } 642 }643 if (i < argc) {644 *p = to_str(mrb, ARGV[arg_i++]);645 i++;646 709 } 647 710 } … … 652 715 653 716 p = va_arg(ap, mrb_value*); 654 if (*format == '!') { 655 format++; 656 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 657 *p = ARGV[arg_i++]; 658 i++; 659 break; 717 if (i < argc) { 718 *p = argv[i++]; 719 if (!(altmode && mrb_nil_p(*p))) { 720 *p = to_ary(mrb, *p); 660 721 } 661 }662 if (i < argc) {663 *p = to_ary(mrb, ARGV[arg_i++]);664 i++;665 722 } 666 723 } … … 671 728 672 729 p = va_arg(ap, mrb_value*); 673 if (*format == '!') { 674 format++; 675 if (i < argc && mrb_nil_p(ARGV[arg_i])) { 676 *p = ARGV[arg_i++]; 677 i++; 678 break; 730 if (i < argc) { 731 *p = argv[i++]; 732 if (!(altmode && mrb_nil_p(*p))) { 733 *p = to_hash(mrb, *p); 679 734 } 680 }681 if (i < argc) {682 *p = to_hash(mrb, ARGV[arg_i++]);683 i++;684 735 } 685 736 } … … 693 744 ps = va_arg(ap, char**); 694 745 pl = va_arg(ap, mrb_int*); 695 if ( *format == '!') {696 format++;697 if ( i < argc && mrb_nil_p(ARGV[arg_i])) {746 if (i < argc) { 747 ss = argv[i++]; 748 if (altmode && mrb_nil_p(ss)) { 698 749 *ps = NULL; 699 750 *pl = 0; 700 i++; arg_i++;701 break;702 751 } 703 } 704 if (i < argc) { 705 ss = to_str(mrb, ARGV[arg_i++]); 706 *ps = RSTRING_PTR(ss); 707 *pl = RSTRING_LEN(ss); 708 i++; 752 else { 753 mrb_to_str(mrb, ss); 754 *ps = RSTRING_PTR(ss); 755 *pl = RSTRING_LEN(ss); 756 } 709 757 } 710 758 } … … 716 764 717 765 ps = va_arg(ap, const char**); 718 if ( *format == '!') {719 format++;720 if ( i < argc && mrb_nil_p(ARGV[arg_i])) {766 if (i < argc) { 767 ss = argv[i++]; 768 if (altmode && mrb_nil_p(ss)) { 721 769 *ps = NULL; 722 i++; arg_i++;723 break;724 770 } 725 } 726 if (i < argc) { 727 ss = to_str(mrb, ARGV[arg_i++]); 728 *ps = mrb_string_value_cstr(mrb, &ss); 729 i++; 771 else { 772 mrb_to_str(mrb, ss); 773 *ps = RSTRING_CSTR(mrb, ss); 774 } 730 775 } 731 776 } … … 740 785 pb = va_arg(ap, mrb_value**); 741 786 pl = va_arg(ap, mrb_int*); 742 if ( *format == '!') {743 format++;744 if ( i < argc && mrb_nil_p(ARGV[arg_i])) {787 if (i < argc) { 788 aa = argv[i++]; 789 if (altmode && mrb_nil_p(aa)) { 745 790 *pb = 0; 746 791 *pl = 0; 747 i++; arg_i++;748 break;749 792 } 750 } 751 if (i < argc) { 752 aa = to_ary(mrb, ARGV[arg_i++]); 753 a = mrb_ary_ptr(aa); 754 *pb = a->ptr; 755 *pl = a->len; 756 i++; 793 else { 794 aa = to_ary(mrb, aa); 795 a = mrb_ary_ptr(aa); 796 *pb = ARY_PTR(a); 797 *pl = ARY_LEN(a); 798 } 757 799 } 758 800 } … … 765 807 p = va_arg(ap, void**); 766 808 if (i < argc) { 767 ss = ARGV[arg_i];768 if ( mrb_type(ss) != MRB_TT_ISTRUCT)809 ss = argv[i++]; 810 if (!mrb_istruct_p(ss)) 769 811 { 770 mrb_raisef(mrb, E_TYPE_ERROR, "% Sis not inline struct", ss);812 mrb_raisef(mrb, E_TYPE_ERROR, "%v is not inline struct", ss); 771 813 } 772 814 *p = mrb_istruct_ptr(ss); 773 arg_i++; 774 i++; 775 } 776 } 777 break; 815 } 816 } 817 break; 818 #ifndef MRB_WITHOUT_FLOAT 778 819 case 'f': 779 820 { … … 782 823 p = va_arg(ap, mrb_float*); 783 824 if (i < argc) { 784 *p = mrb_to_flo(mrb, ARGV[arg_i]); 785 arg_i++; 786 i++; 787 } 788 } 789 break; 825 *p = mrb_to_flo(mrb, argv[i++]); 826 } 827 } 828 break; 829 #endif 790 830 case 'i': 791 831 { … … 794 834 p = va_arg(ap, mrb_int*); 795 835 if (i < argc) { 796 switch (mrb_type(ARGV[arg_i])) { 797 case MRB_TT_FIXNUM: 798 *p = mrb_fixnum(ARGV[arg_i]); 799 break; 800 case MRB_TT_FLOAT: 801 { 802 mrb_float f = mrb_float(ARGV[arg_i]); 803 804 if (!FIXABLE_FLOAT(f)) { 805 mrb_raise(mrb, E_RANGE_ERROR, "float too big for int"); 806 } 807 *p = (mrb_int)f; 808 } 809 break; 810 case MRB_TT_STRING: 811 mrb_raise(mrb, E_TYPE_ERROR, "no implicit conversion of String into Integer"); 812 break; 813 default: 814 *p = mrb_fixnum(mrb_Integer(mrb, ARGV[arg_i])); 815 break; 816 } 817 arg_i++; 818 i++; 836 *p = mrb_fixnum(mrb_to_int(mrb, argv[i++])); 819 837 } 820 838 } … … 825 843 826 844 if (i < argc) { 827 mrb_value b = ARGV[arg_i++];845 mrb_value b = argv[i++]; 828 846 *boolp = mrb_test(b); 829 i++;830 847 } 831 848 } … … 839 856 mrb_value ss; 840 857 841 ss = ARGV[arg_i++];858 ss = argv[i++]; 842 859 *symp = to_sym(mrb, ss); 843 i++;844 860 } 845 861 } … … 852 868 datap = va_arg(ap, void**); 853 869 type = va_arg(ap, struct mrb_data_type const*); 854 if ( *format == '!') {855 format++;856 if ( i < argc && mrb_nil_p(ARGV[arg_i])) {870 if (i < argc) { 871 mrb_value dd = argv[i++]; 872 if (altmode && mrb_nil_p(dd)) { 857 873 *datap = 0; 858 i++; arg_i++;859 break;860 874 } 861 } 862 if (i < argc) { 863 *datap = mrb_data_get_ptr(mrb, ARGV[arg_i++], type); 864 ++i; 875 else { 876 *datap = mrb_data_get_ptr(mrb, dd, type); 877 } 865 878 } 866 879 } … … 878 891 bp = mrb->c->stack + mrb->c->ci->argc + 1; 879 892 } 893 if (altmode && mrb_nil_p(*bp)) { 894 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); 895 } 880 896 *p = *bp; 881 897 } 882 898 break; 883 899 case '|': 900 if (opt_skip && i == argc) goto finish; 884 901 opt = TRUE; 885 902 break; … … 897 914 mrb_value **var; 898 915 mrb_int *pl; 916 mrb_bool nocopy = (altmode || !argv_on_stack) ? TRUE : FALSE; 899 917 900 918 var = va_arg(ap, mrb_value**); … … 903 921 *pl = argc-i; 904 922 if (*pl > 0) { 905 *var = ARGV + arg_i; 923 if (nocopy) { 924 *var = argv+i; 925 } 926 else { 927 mrb_value args = mrb_ary_new_from_values(mrb, *pl, argv+i); 928 RARRAY(args)->c = NULL; 929 *var = RARRAY_PTR(args); 930 } 906 931 } 907 932 i = argc; 908 arg_i += *pl;909 933 } 910 934 else { … … 914 938 } 915 939 break; 940 941 case ':': 942 { 943 mrb_value ksrc = mrb_hash_p(kdict) ? mrb_hash_dup(mrb, kdict) : mrb_hash_new(mrb); 944 const mrb_kwargs *kwargs = va_arg(ap, const mrb_kwargs*); 945 mrb_value *rest; 946 947 if (kwargs == NULL) { 948 rest = NULL; 949 } 950 else { 951 uint32_t kwnum = kwargs->num; 952 uint32_t required = kwargs->required; 953 const char *const *kname = kwargs->table; 954 mrb_value *values = kwargs->values; 955 uint32_t j; 956 const uint32_t keyword_max = 40; 957 958 if (kwnum > keyword_max || required > kwnum) { 959 mrb_raise(mrb, E_ARGUMENT_ERROR, "keyword number is too large"); 960 } 961 962 for (j = required; j > 0; j --, kname ++, values ++) { 963 mrb_value k = mrb_symbol_value(mrb_intern_cstr(mrb, *kname)); 964 if (!mrb_hash_key_p(mrb, ksrc, k)) { 965 mrb_raisef(mrb, E_ARGUMENT_ERROR, "missing keyword: %s", *kname); 966 } 967 *values = mrb_hash_delete_key(mrb, ksrc, k); 968 mrb_gc_protect(mrb, *values); 969 } 970 971 for (j = kwnum - required; j > 0; j --, kname ++, values ++) { 972 mrb_value k = mrb_symbol_value(mrb_intern_cstr(mrb, *kname)); 973 if (mrb_hash_key_p(mrb, ksrc, k)) { 974 *values = mrb_hash_delete_key(mrb, ksrc, k); 975 mrb_gc_protect(mrb, *values); 976 } 977 else { 978 *values = mrb_undef_value(); 979 } 980 } 981 982 rest = kwargs->rest; 983 } 984 985 if (rest) { 986 *rest = ksrc; 987 } 988 else if (!mrb_hash_empty_p(mrb, ksrc)) { 989 ksrc = mrb_hash_keys(mrb, ksrc); 990 ksrc = RARRAY_PTR(ksrc)[0]; 991 mrb_raisef(mrb, E_ARGUMENT_ERROR, "unknown keyword: %v", ksrc); 992 } 993 } 994 break; 995 916 996 default: 917 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid argument specifier % S", mrb_str_new(mrb, &c, 1));997 mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid argument specifier %c", c); 918 998 break; 919 999 } … … 925 1005 mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); 926 1006 } 1007 1008 finish: 927 1009 va_end(ap); 928 1010 return i; … … 983 1065 int superclass_seen = 0; 984 1066 985 if (m->flags & MRB_FL AG_IS_PREPENDED)1067 if (m->flags & MRB_FL_CLASS_IS_PREPENDED) 986 1068 goto skip; 987 1069 … … 990 1072 991 1073 p = c->super; 992 while (p) {1074 while (p) { 993 1075 if (p->tt == MRB_TT_ICLASS) { 994 1076 if (p->mt == m->mt) { … … 1006 1088 1007 1089 ic = include_class_new(mrb, m, ins_pos->super); 1090 m->flags |= MRB_FL_CLASS_IS_INHERITED; 1008 1091 ins_pos->super = ic; 1009 mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ins_pos->super); 1092 mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ic); 1093 mrb_mc_clear_by_class(mrb, ins_pos); 1010 1094 ins_pos = ic; 1011 1095 skip: 1012 1096 m = m->super; 1013 1097 } 1098 mc_clear_all(mrb); 1014 1099 return 0; 1015 1100 } … … 1018 1103 mrb_include_module(mrb_state *mrb, struct RClass *c, struct RClass *m) 1019 1104 { 1020 int changed = include_module_at(mrb, c, find_origin(c), m, 1);1021 if ( changed< 0) {1105 mrb_check_frozen(mrb, c); 1106 if (include_module_at(mrb, c, find_origin(c), m, 1) < 0) { 1022 1107 mrb_raise(mrb, E_ARGUMENT_ERROR, "cyclic include detected"); 1023 1108 } … … 1030 1115 int changed = 0; 1031 1116 1032 if (!(c->flags & MRB_FLAG_IS_PREPENDED)) { 1117 mrb_check_frozen(mrb, c); 1118 if (!(c->flags & MRB_FL_CLASS_IS_PREPENDED)) { 1033 1119 origin = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, c); 1034 origin->flags |= MRB_FL AG_IS_ORIGIN;1120 origin->flags |= MRB_FL_CLASS_IS_ORIGIN | MRB_FL_CLASS_IS_INHERITED; 1035 1121 origin->super = c->super; 1036 1122 c->super = origin; … … 1038 1124 c->mt = kh_init(mt, mrb); 1039 1125 mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)origin); 1040 c->flags |= MRB_FL AG_IS_PREPENDED;1126 c->flags |= MRB_FL_CLASS_IS_PREPENDED; 1041 1127 } 1042 1128 changed = include_module_at(mrb, c, c, m, 0); … … 1115 1201 mrb_ary_push(mrb, result, mrb_obj_value(c->c)); 1116 1202 } 1117 else if (!(c->flags & MRB_FL AG_IS_PREPENDED)) {1203 else if (!(c->flags & MRB_FL_CLASS_IS_PREPENDED)) { 1118 1204 mrb_ary_push(mrb, result, mrb_obj_value(c)); 1119 1205 } … … 1133 1219 mrb_include_module(mrb, mrb_class_ptr(mrb_singleton_class(mrb, obj)), mrb_class_ptr(mod)); 1134 1220 return mod; 1135 }1136 1137 static mrb_value1138 mrb_mod_included_modules(mrb_state *mrb, mrb_value self)1139 {1140 mrb_value result;1141 struct RClass *c = mrb_class_ptr(self);1142 struct RClass *origin = c;1143 1144 MRB_CLASS_ORIGIN(origin);1145 result = mrb_ary_new(mrb);1146 while (c) {1147 if (c != origin && c->tt == MRB_TT_ICLASS) {1148 if (c->c->tt == MRB_TT_MODULE) {1149 mrb_ary_push(mrb, result, mrb_obj_value(c->c));1150 }1151 }1152 c = c->super;1153 }1154 1155 return result;1156 1221 } 1157 1222 … … 1167 1232 } 1168 1233 return mod; 1169 }1170 1171 mrb_value mrb_class_instance_method_list(mrb_state*, mrb_bool, struct RClass*, int);1172 1173 /* 15.2.2.4.33 */1174 /*1175 * call-seq:1176 * mod.instance_methods(include_super=true) -> array1177 *1178 * Returns an array containing the names of the public and protected instance1179 * methods in the receiver. For a module, these are the public and protected methods;1180 * for a class, they are the instance (not singleton) methods. With no1181 * argument, or with an argument that is <code>false</code>, the1182 * instance methods in <i>mod</i> are returned, otherwise the methods1183 * in <i>mod</i> and <i>mod</i>'s superclasses are returned.1184 *1185 * module A1186 * def method1() end1187 * end1188 * class B1189 * def method2() end1190 * end1191 * class C < B1192 * def method3() end1193 * end1194 *1195 * A.instance_methods #=> [:method1]1196 * B.instance_methods(false) #=> [:method2]1197 * C.instance_methods(false) #=> [:method3]1198 * C.instance_methods(true).length #=> 431199 */1200 1201 static mrb_value1202 mrb_mod_instance_methods(mrb_state *mrb, mrb_value mod)1203 {1204 struct RClass *c = mrb_class_ptr(mod);1205 mrb_bool recur = TRUE;1206 mrb_get_args(mrb, "|b", &recur);1207 return mrb_class_instance_method_list(mrb, recur, c, 0);1208 1234 } 1209 1235 … … 1233 1259 case MRB_TT_SYMBOL: 1234 1260 case MRB_TT_FIXNUM: 1261 #ifndef MRB_WITHOUT_FLOAT 1235 1262 case MRB_TT_FLOAT: 1263 #endif 1236 1264 mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton"); 1237 1265 return mrb_nil_value(); /* not reached */ … … 1264 1292 } 1265 1293 1266 MRB_API struct RProc* 1294 #ifdef MRB_METHOD_CACHE 1295 static void 1296 mc_clear_all(mrb_state *mrb) 1297 { 1298 struct mrb_cache_entry *mc = mrb->cache; 1299 int i; 1300 1301 for (i=0; i<MRB_METHOD_CACHE_SIZE; i++) { 1302 mc[i].c = 0; 1303 } 1304 } 1305 1306 void 1307 mrb_mc_clear_by_class(mrb_state *mrb, struct RClass *c) 1308 { 1309 struct mrb_cache_entry *mc = mrb->cache; 1310 int i; 1311 1312 if (c->flags & MRB_FL_CLASS_IS_INHERITED) { 1313 mc_clear_all(mrb); 1314 c->flags &= ~MRB_FL_CLASS_IS_INHERITED; 1315 return; 1316 } 1317 for (i=0; i<MRB_METHOD_CACHE_SIZE; i++) { 1318 if (mc[i].c == c) mc[i].c = 0; 1319 } 1320 } 1321 1322 static void 1323 mc_clear_by_id(mrb_state *mrb, struct RClass *c, mrb_sym mid) 1324 { 1325 struct mrb_cache_entry *mc = mrb->cache; 1326 int i; 1327 1328 if (c->flags & MRB_FL_CLASS_IS_INHERITED) { 1329 mc_clear_all(mrb); 1330 c->flags &= ~MRB_FL_CLASS_IS_INHERITED; 1331 return; 1332 } 1333 for (i=0; i<MRB_METHOD_CACHE_SIZE; i++) { 1334 if (mc[i].c == c || mc[i].mid == mid) 1335 mc[i].c = 0; 1336 } 1337 } 1338 #endif 1339 1340 MRB_API mrb_method_t 1267 1341 mrb_method_search_vm(mrb_state *mrb, struct RClass **cp, mrb_sym mid) 1268 1342 { 1269 1343 khiter_t k; 1270 struct RProc *m;1344 mrb_method_t m; 1271 1345 struct RClass *c = *cp; 1346 #ifdef MRB_METHOD_CACHE 1347 struct RClass *oc = c; 1348 int h = kh_int_hash_func(mrb, ((intptr_t)oc) ^ mid) & (MRB_METHOD_CACHE_SIZE-1); 1349 struct mrb_cache_entry *mc = &mrb->cache[h]; 1350 1351 if (mc->c == c && mc->mid == mid) { 1352 *cp = mc->c0; 1353 return mc->m; 1354 } 1355 #endif 1272 1356 1273 1357 while (c) { … … 1278 1362 if (k != kh_end(h)) { 1279 1363 m = kh_value(h, k); 1280 if ( !m) break;1364 if (MRB_METHOD_UNDEF_P(m)) break; 1281 1365 *cp = c; 1366 #ifdef MRB_METHOD_CACHE 1367 mc->c = oc; 1368 mc->c0 = c; 1369 mc->mid = mid; 1370 mc->m = m; 1371 #endif 1282 1372 return m; 1283 1373 } … … 1285 1375 c = c->super; 1286 1376 } 1287 return NULL; /* no method */ 1288 } 1289 1290 MRB_API struct RProc* 1377 MRB_METHOD_FROM_PROC(m, NULL); 1378 return m; /* no method */ 1379 } 1380 1381 MRB_API mrb_method_t 1291 1382 mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid) 1292 1383 { 1293 struct RProc *m;1384 mrb_method_t m; 1294 1385 1295 1386 m = mrb_method_search_vm(mrb, &c, mid); 1296 if (!m) { 1297 mrb_value inspect = mrb_funcall(mrb, mrb_obj_value(c), "inspect", 0); 1298 if (mrb_string_p(inspect) && RSTRING_LEN(inspect) > 64) { 1299 inspect = mrb_any_to_s(mrb, mrb_obj_value(c)); 1300 } 1301 mrb_name_error(mrb, mid, "undefined method '%S' for class %S", 1302 mrb_sym2str(mrb, mid), inspect); 1387 if (MRB_METHOD_UNDEF_P(m)) { 1388 mrb_name_error(mrb, mid, "undefined method '%n' for class %C", mid, c); 1303 1389 } 1304 1390 return m; 1305 1391 } 1306 1392 1307 static mrb_value 1308 attr_reader(mrb_state *mrb, mrb_value obj) 1309 { 1310 mrb_value name = mrb_proc_cfunc_env_get(mrb, 0); 1311 return mrb_iv_get(mrb, obj, to_sym(mrb, name)); 1312 } 1313 1314 static mrb_value 1315 mrb_mod_attr_reader(mrb_state *mrb, mrb_value mod) 1393 #define ONSTACK_ALLOC_MAX 32 1394 1395 static mrb_sym 1396 prepare_name_common(mrb_state *mrb, mrb_sym sym, const char *prefix, const char *suffix) 1397 { 1398 char onstack[ONSTACK_ALLOC_MAX]; 1399 mrb_int sym_len; 1400 const char *sym_str = mrb_sym_name_len(mrb, sym, &sym_len); 1401 size_t prefix_len = prefix ? strlen(prefix) : 0; 1402 size_t suffix_len = suffix ? strlen(suffix) : 0; 1403 size_t name_len = sym_len + prefix_len + suffix_len; 1404 char *buf = name_len > sizeof(onstack) ? (char *)mrb_alloca(mrb, name_len) : onstack; 1405 char *p = buf; 1406 1407 if (prefix_len > 0) { 1408 memcpy(p, prefix, prefix_len); 1409 p += prefix_len; 1410 } 1411 1412 memcpy(p, sym_str, sym_len); 1413 p += sym_len; 1414 1415 if (suffix_len > 0) { 1416 memcpy(p, suffix, suffix_len); 1417 p += suffix_len; 1418 } 1419 1420 return mrb_intern(mrb, buf, name_len); 1421 } 1422 1423 static mrb_value 1424 prepare_ivar_name(mrb_state *mrb, mrb_sym sym) 1425 { 1426 sym = prepare_name_common(mrb, sym, "@", NULL); 1427 mrb_iv_name_sym_check(mrb, sym); 1428 return mrb_symbol_value(sym); 1429 } 1430 1431 static mrb_sym 1432 prepare_writer_name(mrb_state *mrb, mrb_sym sym) 1433 { 1434 return prepare_name_common(mrb, sym, NULL, "="); 1435 } 1436 1437 static mrb_value 1438 mod_attr_define(mrb_state *mrb, mrb_value mod, mrb_value (*accessor)(mrb_state *, mrb_value), mrb_sym (*access_name)(mrb_state *, mrb_sym)) 1316 1439 { 1317 1440 struct RClass *c = mrb_class_ptr(mod); … … 1323 1446 ai = mrb_gc_arena_save(mrb); 1324 1447 for (i=0; i<argc; i++) { 1325 mrb_value name, str; 1326 mrb_sym method, sym; 1448 mrb_value name; 1449 mrb_sym method; 1450 struct RProc *p; 1451 mrb_method_t m; 1327 1452 1328 1453 method = to_sym(mrb, argv[i]); 1329 name = mrb_sym2str(mrb, method); 1330 str = mrb_str_buf_new(mrb, RSTRING_LEN(name)+1); 1331 mrb_str_cat_lit(mrb, str, "@"); 1332 mrb_str_cat_str(mrb, str, name); 1333 sym = mrb_intern_str(mrb, str); 1334 mrb_iv_check(mrb, sym); 1335 name = mrb_symbol_value(sym); 1336 mrb_define_method_raw(mrb, c, method, 1337 mrb_proc_new_cfunc_with_env(mrb, attr_reader, 1, &name)); 1454 name = prepare_ivar_name(mrb, method); 1455 if (access_name) { 1456 method = access_name(mrb, method); 1457 } 1458 1459 p = mrb_proc_new_cfunc_with_env(mrb, accessor, 1, &name); 1460 MRB_METHOD_FROM_PROC(m, p); 1461 mrb_define_method_raw(mrb, c, method, m); 1338 1462 mrb_gc_arena_restore(mrb, ai); 1339 1463 } 1340 1464 return mrb_nil_value(); 1465 } 1466 1467 static mrb_value 1468 attr_reader(mrb_state *mrb, mrb_value obj) 1469 { 1470 mrb_value name = mrb_proc_cfunc_env_get(mrb, 0); 1471 return mrb_iv_get(mrb, obj, to_sym(mrb, name)); 1472 } 1473 1474 static mrb_value 1475 mrb_mod_attr_reader(mrb_state *mrb, mrb_value mod) 1476 { 1477 return mod_attr_define(mrb, mod, attr_reader, NULL); 1341 1478 } 1342 1479 … … 1355 1492 mrb_mod_attr_writer(mrb_state *mrb, mrb_value mod) 1356 1493 { 1357 struct RClass *c = mrb_class_ptr(mod); 1358 mrb_value *argv; 1359 mrb_int argc, i; 1360 int ai; 1361 1362 mrb_get_args(mrb, "*", &argv, &argc); 1363 ai = mrb_gc_arena_save(mrb); 1364 for (i=0; i<argc; i++) { 1365 mrb_value name, str, attr; 1366 mrb_sym method, sym; 1367 1368 method = to_sym(mrb, argv[i]); 1369 1370 /* prepare iv name (@name) */ 1371 name = mrb_sym2str(mrb, method); 1372 str = mrb_str_buf_new(mrb, RSTRING_LEN(name)+1); 1373 mrb_str_cat_lit(mrb, str, "@"); 1374 mrb_str_cat_str(mrb, str, name); 1375 sym = mrb_intern_str(mrb, str); 1376 mrb_iv_check(mrb, sym); 1377 attr = mrb_symbol_value(sym); 1378 1379 /* prepare method name (name=) */ 1380 str = mrb_str_buf_new(mrb, RSTRING_LEN(str)); 1381 mrb_str_cat_str(mrb, str, name); 1382 mrb_str_cat_lit(mrb, str, "="); 1383 method = mrb_intern_str(mrb, str); 1384 1385 mrb_define_method_raw(mrb, c, method, 1386 mrb_proc_new_cfunc_with_env(mrb, attr_writer, 1, &attr)); 1387 mrb_gc_arena_restore(mrb, ai); 1388 } 1389 return mrb_nil_value(); 1494 return mod_attr_define(mrb, mod, attr_writer, prepare_writer_name); 1390 1495 } 1391 1496 … … 1402 1507 if (ttype == 0) ttype = MRB_TT_OBJECT; 1403 1508 if (ttype <= MRB_TT_CPTR) { 1404 mrb_raisef(mrb, E_TYPE_ERROR, "can't create instance of % S", cv);1509 mrb_raisef(mrb, E_TYPE_ERROR, "can't create instance of %v", cv); 1405 1510 } 1406 1511 o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c); … … 1420 1525 */ 1421 1526 1422 MRB_APImrb_value1527 mrb_value 1423 1528 mrb_instance_new(mrb_state *mrb, mrb_value cv) 1424 1529 { … … 1426 1531 mrb_value *argv; 1427 1532 mrb_int argc; 1428 1429 mrb_get_args(mrb, "*&", &argv, &argc, &blk); 1533 mrb_sym init; 1534 1535 mrb_get_args(mrb, "*!&", &argv, &argc, &blk); 1430 1536 obj = mrb_instance_alloc(mrb, cv); 1431 mrb_funcall_with_block(mrb, obj, mrb_intern_lit(mrb, "initialize"), argc, argv, blk); 1432 1537 init = mrb_intern_lit(mrb, "initialize"); 1538 if (!mrb_func_basic_p(mrb, obj, init, mrb_bob_init)) { 1539 mrb_funcall_with_block(mrb, obj, init, argc, argv, blk); 1540 } 1433 1541 return obj; 1434 1542 } … … 1474 1582 new_class = mrb_obj_value(mrb_class_new(mrb, mrb_class_ptr(super))); 1475 1583 mid = mrb_intern_lit(mrb, "initialize"); 1476 if (!mrb_func_basic_p(mrb, new_class, mid, mrb_bob_init)) { 1584 if (mrb_func_basic_p(mrb, new_class, mid, mrb_class_initialize)) { 1585 mrb_class_initialize(mrb, new_class); 1586 } 1587 else { 1477 1588 mrb_funcall_with_block(mrb, new_class, mid, n, &super, blk); 1478 1589 } … … 1559 1670 mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid) 1560 1671 { 1561 khiter_t k; 1562 1563 while (c) { 1564 khash_t(mt) *h = c->mt; 1565 1566 if (h) { 1567 k = kh_get(mt, mrb, h, mid); 1568 if (k != kh_end(h)) { 1569 if (kh_value(h, k)) { 1570 return TRUE; /* method exists */ 1571 } 1572 else { 1573 return FALSE; /* undefined method */ 1574 } 1575 } 1576 } 1577 c = c->super; 1578 } 1579 return FALSE; /* no method */ 1672 mrb_method_t m; 1673 1674 m = mrb_method_search_vm(mrb, &c, mid); 1675 if (MRB_METHOD_UNDEF_P(m)) { 1676 return FALSE; 1677 } 1678 return TRUE; 1580 1679 } 1581 1680 … … 1590 1689 { 1591 1690 mrb_value path; 1592 const char *name; 1593 mrb_sym classpath = mrb_intern_lit(mrb, "__classpath__"); 1594 1595 path = mrb_obj_iv_get(mrb, (struct RObject*)c, classpath); 1691 mrb_sym nsym = mrb_intern_lit(mrb, "__classname__"); 1692 1693 path = mrb_obj_iv_get(mrb, (struct RObject*)c, nsym); 1596 1694 if (mrb_nil_p(path)) { 1597 struct RClass *outer = mrb_class_outer_module(mrb, c); 1598 mrb_sym sym = mrb_class_sym(mrb, c, outer); 1599 mrb_int len; 1600 1601 if (sym == 0) { 1602 return mrb_nil_value(); 1603 } 1604 else if (outer && outer != c && outer != mrb->object_class) { 1605 mrb_value base = mrb_class_path(mrb, outer); 1606 path = mrb_str_buf_new(mrb, 0); 1607 if (mrb_nil_p(base)) { 1608 mrb_str_cat_lit(mrb, path, "#<Class:"); 1609 mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, outer)); 1610 mrb_str_cat_lit(mrb, path, ">"); 1611 } 1612 else { 1613 mrb_str_concat(mrb, path, base); 1614 } 1615 mrb_str_cat_lit(mrb, path, "::"); 1616 name = mrb_sym2name_len(mrb, sym, &len); 1617 mrb_str_cat(mrb, path, name, len); 1618 } 1619 else { 1620 name = mrb_sym2name_len(mrb, sym, &len); 1621 path = mrb_str_new(mrb, name, len); 1622 } 1623 if (!MRB_FROZEN_P(c)) { 1624 mrb_obj_iv_set(mrb, (struct RObject*)c, classpath, path); 1625 } 1695 /* no name (yet) */ 1696 return mrb_class_find_path(mrb, c); 1697 } 1698 else if (mrb_symbol_p(path)) { 1699 /* toplevel class/module */ 1700 return mrb_sym_str(mrb, mrb_symbol(path)); 1626 1701 } 1627 1702 return mrb_str_dup(mrb, path); 1628 1703 } 1629 1704 1630 MRB_API struct RClass 1705 MRB_API struct RClass* 1631 1706 mrb_class_real(struct RClass* cl) 1632 1707 { 1633 if (cl == 0) 1634 return NULL; 1708 if (cl == 0) return NULL; 1635 1709 while ((cl->tt == MRB_TT_SCLASS) || (cl->tt == MRB_TT_ICLASS)) { 1636 1710 cl = cl->super; 1711 if (cl == 0) return NULL; 1637 1712 } 1638 1713 return cl; … … 1642 1717 mrb_class_name(mrb_state *mrb, struct RClass* c) 1643 1718 { 1644 mrb_value path = mrb_class_path(mrb, c); 1645 if (mrb_nil_p(path)) { 1646 path = mrb_str_new_lit(mrb, "#<Class:"); 1647 mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, c)); 1648 mrb_str_cat_lit(mrb, path, ">"); 1649 } 1650 return RSTRING_PTR(path); 1719 mrb_value name = class_name_str(mrb, c); 1720 return RSTRING_PTR(name); 1651 1721 } 1652 1722 … … 1667 1737 { 1668 1738 if (super->tt != MRB_TT_CLASS) { 1669 mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (% S given)", mrb_obj_value(super));1739 mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%C given)", super); 1670 1740 } 1671 1741 if (super->tt == MRB_TT_SCLASS) { … … 1734 1804 mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b) 1735 1805 { 1736 struct RProc *m = mrb_method_search(mrb, c, b); 1737 1806 mrb_method_t m = mrb_method_search(mrb, c, b); 1807 1808 if (!MRB_METHOD_CFUNC_P(m)) { 1809 struct RProc *p = MRB_METHOD_PROC(m); 1810 1811 if (MRB_PROC_ENV_P(p)) { 1812 MRB_PROC_ENV(p)->mid = b; 1813 } 1814 else { 1815 struct RClass *tc = MRB_PROC_TARGET_CLASS(p); 1816 struct REnv *e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, NULL); 1817 1818 e->mid = b; 1819 if (tc) { 1820 e->c = tc; 1821 mrb_field_write_barrier(mrb, (struct RBasic*)e, (struct RBasic*)tc); 1822 } 1823 p->e.env = e; 1824 p->flags |= MRB_PROC_ENVSET; 1825 } 1826 } 1738 1827 mrb_define_method_raw(mrb, c, a, m); 1739 1828 } … … 1741 1830 /*! 1742 1831 * Defines an alias of a method. 1832 * \param mrb the mruby state 1743 1833 * \param klass the class which the original method belongs to 1744 1834 * \param name1 a new name for the method … … 1760 1850 */ 1761 1851 1762 staticmrb_value1852 mrb_value 1763 1853 mrb_mod_to_s(mrb_state *mrb, mrb_value klass) 1764 1854 { 1765 mrb_value str; 1766 1767 if (mrb_type(klass) == MRB_TT_SCLASS) { 1855 1856 if (mrb_sclass_p(klass)) { 1768 1857 mrb_value v = mrb_iv_get(mrb, klass, mrb_intern_lit(mrb, "__attached__")); 1769 1770 str = mrb_str_new_lit(mrb, "#<Class:"); 1858 mrb_value str = mrb_str_new_lit(mrb, "#<Class:"); 1771 1859 1772 1860 if (class_ptr_p(v)) { … … 1779 1867 } 1780 1868 else { 1781 struct RClass *c; 1782 mrb_value path; 1783 1784 str = mrb_str_buf_new(mrb, 32); 1785 c = mrb_class_ptr(klass); 1786 path = mrb_class_path(mrb, c); 1787 1788 if (mrb_nil_p(path)) { 1789 switch (mrb_type(klass)) { 1790 case MRB_TT_CLASS: 1791 mrb_str_cat_lit(mrb, str, "#<Class:"); 1792 break; 1793 1794 case MRB_TT_MODULE: 1795 mrb_str_cat_lit(mrb, str, "#<Module:"); 1796 break; 1797 1798 default: 1799 /* Shouldn't be happened? */ 1800 mrb_str_cat_lit(mrb, str, "#<??????:"); 1801 break; 1802 } 1803 mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, c)); 1804 return mrb_str_cat_lit(mrb, str, ">"); 1805 } 1806 else { 1807 return path; 1808 } 1869 return class_name_str(mrb, mrb_class_ptr(klass)); 1809 1870 } 1810 1871 } … … 1818 1879 mrb_get_args(mrb, "nn", &new_name, &old_name); 1819 1880 mrb_alias_method(mrb, c, new_name, old_name); 1820 return m rb_nil_value();1881 return mod; 1821 1882 } 1822 1883 … … 1824 1885 undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) 1825 1886 { 1887 mrb_method_t m; 1888 1889 MRB_METHOD_FROM_PROC(m, NULL); 1890 mrb_define_method_raw(mrb, c, a, m); 1891 } 1892 1893 void 1894 mrb_undef_method_id(mrb_state *mrb, struct RClass *c, mrb_sym a) 1895 { 1826 1896 if (!mrb_obj_respond_to(mrb, c, a)) { 1827 mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c)); 1828 } 1829 else { 1830 mrb_define_method_raw(mrb, c, a, NULL); 1831 } 1897 mrb_name_error(mrb, a, "undefined method '%n' for class '%C'", a, c); 1898 } 1899 undef_method(mrb, c, a); 1832 1900 } 1833 1901 … … 1853 1921 mrb_get_args(mrb, "*", &argv, &argc); 1854 1922 while (argc--) { 1855 undef_method(mrb, c, to_sym(mrb, *argv));1923 mrb_undef_method_id(mrb, c, to_sym(mrb, *argv)); 1856 1924 argv++; 1857 1925 } … … 1859 1927 } 1860 1928 1861 static mrb_value1862 mod_define_method(mrb_state *mrb, mrb_value self)1863 {1864 struct RClass *c = mrb_class_ptr(self);1865 struct RProc *p;1866 mrb_sym mid;1867 mrb_value proc = mrb_undef_value();1868 mrb_value blk;1869 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 }1882 if (mrb_nil_p(blk)) {1883 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");1884 }1885 p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);1886 mrb_proc_copy(p, mrb_proc_ptr(blk));1887 p->flags |= MRB_PROC_STRICT;1888 mrb_define_method_raw(mrb, c, mid, p);1889 return mrb_symbol_value(mid);1890 }1891 1892 1929 static void 1893 check_cv_name_str(mrb_state *mrb, mrb_value str) 1894 { 1895 const char *s = RSTRING_PTR(str); 1896 mrb_int len = RSTRING_LEN(str); 1897 1898 if (len < 3 || !(s[0] == '@' && s[1] == '@')) { 1899 mrb_name_error(mrb, mrb_intern_str(mrb, str), "'%S' is not allowed as a class variable name", str); 1900 } 1901 } 1902 1903 static void 1904 check_cv_name_sym(mrb_state *mrb, mrb_sym id) 1905 { 1906 check_cv_name_str(mrb, mrb_sym2str(mrb, id)); 1907 } 1908 1909 /* 15.2.2.4.16 */ 1910 /* 1911 * call-seq: 1912 * obj.class_variable_defined?(symbol) -> true or false 1913 * 1914 * Returns <code>true</code> if the given class variable is defined 1915 * in <i>obj</i>. 1916 * 1917 * class Fred 1918 * @@foo = 99 1919 * end 1920 * Fred.class_variable_defined?(:@@foo) #=> true 1921 * Fred.class_variable_defined?(:@@bar) #=> false 1922 */ 1923 1924 static mrb_value 1925 mrb_mod_cvar_defined(mrb_state *mrb, mrb_value mod) 1930 check_const_name_sym(mrb_state *mrb, mrb_sym id) 1931 { 1932 mrb_int len; 1933 const char *name = mrb_sym_name_len(mrb, id, &len); 1934 if (!mrb_const_name_p(mrb, name, len)) { 1935 mrb_name_error(mrb, id, "wrong constant name %n", id); 1936 } 1937 } 1938 1939 static mrb_value 1940 mrb_mod_const_defined(mrb_state *mrb, mrb_value mod) 1926 1941 { 1927 1942 mrb_sym id; 1943 mrb_bool inherit = TRUE; 1944 1945 mrb_get_args(mrb, "n|b", &id, &inherit); 1946 check_const_name_sym(mrb, id); 1947 if (inherit) { 1948 return mrb_bool_value(mrb_const_defined(mrb, mod, id)); 1949 } 1950 return mrb_bool_value(mrb_const_defined_at(mrb, mod, id)); 1951 } 1952 1953 static mrb_value 1954 mrb_const_get_sym(mrb_state *mrb, mrb_value mod, mrb_sym id) 1955 { 1956 check_const_name_sym(mrb, id); 1957 return mrb_const_get(mrb, mod, id); 1958 } 1959 1960 static mrb_value 1961 mrb_mod_const_get(mrb_state *mrb, mrb_value mod) 1962 { 1963 mrb_value path; 1964 mrb_sym id; 1965 char *ptr; 1966 mrb_int off, end, len; 1967 1968 mrb_get_args(mrb, "o", &path); 1969 1970 if (mrb_symbol_p(path)) { 1971 /* const get with symbol */ 1972 id = mrb_symbol(path); 1973 return mrb_const_get_sym(mrb, mod, id); 1974 } 1975 1976 /* const get with class path string */ 1977 path = mrb_ensure_string_type(mrb, path); 1978 ptr = RSTRING_PTR(path); 1979 len = RSTRING_LEN(path); 1980 off = 0; 1981 1982 while (off < len) { 1983 end = mrb_str_index_lit(mrb, path, "::", off); 1984 end = (end == -1) ? len : end; 1985 id = mrb_intern(mrb, ptr+off, end-off); 1986 mod = mrb_const_get_sym(mrb, mod, id); 1987 if (end == len) 1988 off = end; 1989 else { 1990 off = end + 2; 1991 if (off == len) { /* trailing "::" */ 1992 mrb_name_error(mrb, id, "wrong constant name '%v'", path); 1993 } 1994 } 1995 } 1996 1997 return mod; 1998 } 1999 2000 static mrb_value 2001 mrb_mod_const_set(mrb_state *mrb, mrb_value mod) 2002 { 2003 mrb_sym id; 2004 mrb_value value; 2005 2006 mrb_get_args(mrb, "no", &id, &value); 2007 check_const_name_sym(mrb, id); 2008 mrb_const_set(mrb, mod, id, value); 2009 return value; 2010 } 2011 2012 static mrb_value 2013 mrb_mod_remove_const(mrb_state *mrb, mrb_value mod) 2014 { 2015 mrb_sym id; 2016 mrb_value val; 1928 2017 1929 2018 mrb_get_args(mrb, "n", &id); 1930 check_cv_name_sym(mrb, id); 1931 return mrb_bool_value(mrb_cv_defined(mrb, mod, id)); 1932 } 1933 1934 /* 15.2.2.4.17 */ 1935 /* 1936 * call-seq: 1937 * mod.class_variable_get(symbol) -> obj 1938 * 1939 * Returns the value of the given class variable (or throws a 1940 * <code>NameError</code> exception). The <code>@@</code> part of the 1941 * variable name should be included for regular class variables 1942 * 1943 * class Fred 1944 * @@foo = 99 1945 * end 1946 * Fred.class_variable_get(:@@foo) #=> 99 1947 */ 1948 1949 static mrb_value 1950 mrb_mod_cvar_get(mrb_state *mrb, mrb_value mod) 1951 { 1952 mrb_sym id; 1953 1954 mrb_get_args(mrb, "n", &id); 1955 check_cv_name_sym(mrb, id); 1956 return mrb_cv_get(mrb, mod, id); 1957 } 1958 1959 /* 15.2.2.4.18 */ 1960 /* 1961 * call-seq: 1962 * obj.class_variable_set(symbol, obj) -> obj 1963 * 1964 * Sets the class variable names by <i>symbol</i> to 1965 * <i>object</i>. 1966 * 1967 * class Fred 1968 * @@foo = 99 1969 * def foo 1970 * @@foo 1971 * end 1972 * end 1973 * Fred.class_variable_set(:@@foo, 101) #=> 101 1974 * Fred.new.foo #=> 101 1975 */ 1976 1977 static mrb_value 1978 mrb_mod_cvar_set(mrb_state *mrb, mrb_value mod) 1979 { 1980 mrb_value value; 1981 mrb_sym id; 1982 1983 mrb_get_args(mrb, "no", &id, &value); 1984 check_cv_name_sym(mrb, id); 1985 mrb_cv_set(mrb, mod, id, value); 1986 return value; 1987 } 1988 1989 /* 15.2.2.4.39 */ 1990 /* 1991 * call-seq: 1992 * remove_class_variable(sym) -> obj 1993 * 1994 * Removes the definition of the <i>sym</i>, returning that 1995 * constant's value. 1996 * 1997 * class Dummy 1998 * @@var = 99 1999 * puts @@var 2000 * p class_variables 2001 * remove_class_variable(:@@var) 2002 * p class_variables 2003 * end 2004 * 2005 * <em>produces:</em> 2006 * 2007 * 99 2008 * [:@@var] 2009 * [] 2010 */ 2011 2012 static mrb_value 2013 mrb_mod_remove_cvar(mrb_state *mrb, mrb_value mod) 2014 { 2015 mrb_value val; 2016 mrb_sym id; 2017 2018 mrb_get_args(mrb, "n", &id); 2019 check_cv_name_sym(mrb, id); 2020 2019 check_const_name_sym(mrb, id); 2021 2020 val = mrb_iv_remove(mrb, mod, id); 2022 if (!mrb_undef_p(val)) return val; 2023 2024 if (mrb_cv_defined(mrb, mod, id)) { 2025 mrb_name_error(mrb, id, "cannot remove %S for %S", 2026 mrb_sym2str(mrb, id), mod); 2027 } 2028 2029 mrb_name_error(mrb, id, "class variable %S not defined for %S", 2030 mrb_sym2str(mrb, id), mod); 2031 2032 /* not reached */ 2033 return mrb_nil_value(); 2021 if (mrb_undef_p(val)) { 2022 mrb_name_error(mrb, id, "constant %n not defined", id); 2023 } 2024 return val; 2025 } 2026 2027 static mrb_value 2028 mrb_mod_const_missing(mrb_state *mrb, mrb_value mod) 2029 { 2030 mrb_sym sym; 2031 2032 mrb_get_args(mrb, "n", &sym); 2033 2034 if (mrb_class_real(mrb_class_ptr(mod)) != mrb->object_class) { 2035 mrb_name_error(mrb, sym, "uninitialized constant %v::%n", mod, sym); 2036 } 2037 else { 2038 mrb_name_error(mrb, sym, "uninitialized constant %n", sym); 2039 } 2040 /* not reached */ 2041 return mrb_nil_value(); 2034 2042 } 2035 2043 … … 2070 2078 } 2071 2079 2072 static void 2073 remove_method(mrb_state *mrb, mrb_value mod, mrb_sym mid) 2074 { 2075 struct RClass *c = mrb_class_ptr(mod); 2076 khash_t(mt) *h = find_origin(c)->mt; 2077 khiter_t k; 2078 2079 if (h) { 2080 k = kh_get(mt, mrb, h, mid); 2081 if (k != kh_end(h)) { 2082 kh_del(mt, mrb, h, k); 2083 mrb_funcall(mrb, mod, "method_removed", 1, mrb_symbol_value(mid)); 2084 return; 2085 } 2086 } 2087 2088 mrb_name_error(mrb, mid, "method '%S' not defined in %S", 2089 mrb_sym2str(mrb, mid), mod); 2090 } 2091 2092 /* 15.2.2.4.41 */ 2093 /* 2094 * call-seq: 2095 * remove_method(symbol) -> self 2096 * 2097 * Removes the method identified by _symbol_ from the current 2098 * class. For an example, see <code>Module.undef_method</code>. 2099 */ 2100 2101 static mrb_value 2102 mrb_mod_remove_method(mrb_state *mrb, mrb_value mod) 2103 { 2104 mrb_int argc; 2105 mrb_value *argv; 2106 2107 mrb_get_args(mrb, "*", &argv, &argc); 2108 while (argc--) { 2109 remove_method(mrb, mod, to_sym(mrb, *argv)); 2110 argv++; 2111 } 2112 return mod; 2113 } 2114 2115 2116 2117 static void 2118 check_const_name_str(mrb_state *mrb, mrb_value str) 2119 { 2120 if (RSTRING_LEN(str) < 1 || !ISUPPER(*RSTRING_PTR(str))) { 2121 mrb_name_error(mrb, mrb_intern_str(mrb, str), "wrong constant name %S", str); 2122 } 2123 } 2124 2125 static void 2126 check_const_name_sym(mrb_state *mrb, mrb_sym id) 2127 { 2128 check_const_name_str(mrb, mrb_sym2str(mrb, id)); 2129 } 2130 2131 static mrb_value 2132 const_defined(mrb_state *mrb, mrb_value mod, mrb_sym id, mrb_bool inherit) 2133 { 2134 if (inherit) { 2135 return mrb_bool_value(mrb_const_defined(mrb, mod, id)); 2136 } 2137 return mrb_bool_value(mrb_const_defined_at(mrb, mod, id)); 2138 } 2139 2140 static mrb_value 2141 mrb_mod_const_defined(mrb_state *mrb, mrb_value mod) 2142 { 2143 mrb_sym id; 2144 mrb_bool inherit = TRUE; 2145 2146 mrb_get_args(mrb, "n|b", &id, &inherit); 2147 check_const_name_sym(mrb, id); 2148 return const_defined(mrb, mod, id, inherit); 2149 } 2150 2151 static mrb_value 2152 mrb_mod_const_get(mrb_state *mrb, mrb_value mod) 2153 { 2154 mrb_sym id; 2155 2156 mrb_get_args(mrb, "n", &id); 2157 check_const_name_sym(mrb, id); 2158 return mrb_const_get(mrb, mod, id); 2159 } 2160 2161 static mrb_value 2162 mrb_mod_const_set(mrb_state *mrb, mrb_value mod) 2163 { 2164 mrb_sym id; 2165 mrb_value value; 2166 2167 mrb_get_args(mrb, "no", &id, &value); 2168 check_const_name_sym(mrb, id); 2169 mrb_const_set(mrb, mod, id, value); 2170 return value; 2171 } 2172 2173 static mrb_value 2174 mrb_mod_remove_const(mrb_state *mrb, mrb_value mod) 2175 { 2176 mrb_sym id; 2177 mrb_value val; 2178 2179 mrb_get_args(mrb, "n", &id); 2180 check_const_name_sym(mrb, id); 2181 val = mrb_iv_remove(mrb, mod, id); 2182 if (mrb_undef_p(val)) { 2183 mrb_name_error(mrb, id, "constant %S not defined", mrb_sym2str(mrb, id)); 2184 } 2185 return val; 2186 } 2187 2188 static mrb_value 2189 mrb_mod_const_missing(mrb_state *mrb, mrb_value mod) 2190 { 2191 mrb_sym sym; 2192 2193 mrb_get_args(mrb, "n", &sym); 2194 2195 if (mrb_class_real(mrb_class_ptr(mod)) != mrb->object_class) { 2196 mrb_name_error(mrb, sym, "uninitialized constant %S::%S", 2197 mod, 2198 mrb_sym2str(mrb, sym)); 2199 } 2200 else { 2201 mrb_name_error(mrb, sym, "uninitialized constant %S", 2202 mrb_sym2str(mrb, sym)); 2203 } 2204 /* not reached */ 2205 return mrb_nil_value(); 2206 } 2207 2208 static mrb_value 2209 mrb_mod_s_constants(mrb_state *mrb, mrb_value mod) 2210 { 2211 mrb_raise(mrb, E_NOTIMP_ERROR, "Module.constants not implemented"); 2212 return mrb_nil_value(); /* not reached */ 2080 static mrb_value 2081 mod_define_method(mrb_state *mrb, mrb_value self) 2082 { 2083 struct RClass *c = mrb_class_ptr(self); 2084 struct RProc *p; 2085 mrb_method_t m; 2086 mrb_sym mid; 2087 mrb_value proc = mrb_undef_value(); 2088 mrb_value blk; 2089 2090 mrb_get_args(mrb, "n|o&", &mid, &proc, &blk); 2091 switch (mrb_type(proc)) { 2092 case MRB_TT_PROC: 2093 blk = proc; 2094 break; 2095 case MRB_TT_UNDEF: 2096 /* ignored */ 2097 break; 2098 default: 2099 mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %T (expected Proc)", proc); 2100 break; 2101 } 2102 if (mrb_nil_p(blk)) { 2103 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given"); 2104 } 2105 p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class); 2106 mrb_proc_copy(p, mrb_proc_ptr(blk)); 2107 p->flags |= MRB_PROC_STRICT; 2108 MRB_METHOD_FROM_PROC(m, p); 2109 mrb_define_method_raw(mrb, c, mid, m); 2110 return mrb_symbol_value(mid); 2111 } 2112 2113 static mrb_value 2114 top_define_method(mrb_state *mrb, mrb_value self) 2115 { 2116 return mod_define_method(mrb, mrb_obj_value(mrb->object_class)); 2213 2117 } 2214 2118 … … 2225 2129 } 2226 2130 2227 MRB_API mrb_value 2131 static mrb_value 2132 mrb_mod_dup(mrb_state *mrb, mrb_value self) 2133 { 2134 mrb_value mod = mrb_obj_clone(mrb, self); 2135 MRB_UNSET_FROZEN_FLAG(mrb_obj_ptr(mod)); 2136 return mod; 2137 } 2138 2139 static mrb_value 2228 2140 mrb_mod_module_function(mrb_state *mrb, mrb_value mod) 2229 2141 { … … 2231 2143 mrb_int argc, i; 2232 2144 mrb_sym mid; 2233 struct RProc *method_rproc;2145 mrb_method_t m; 2234 2146 struct RClass *rclass; 2235 2147 int ai; … … 2251 2163 mid = mrb_symbol(argv[i]); 2252 2164 rclass = mrb_class_ptr(mod); 2253 m ethod_rproc= mrb_method_search(mrb, rclass, mid);2165 m = mrb_method_search(mrb, rclass, mid); 2254 2166 2255 2167 prepare_singleton_class(mrb, (struct RBasic*)rclass); 2256 2168 ai = mrb_gc_arena_save(mrb); 2257 mrb_define_method_raw(mrb, rclass->c, mid, m ethod_rproc);2169 mrb_define_method_raw(mrb, rclass->c, mid, m); 2258 2170 mrb_gc_arena_restore(mrb, ai); 2259 2171 } … … 2266 2178 /* implementation of instance_eval */ 2267 2179 mrb_value mrb_obj_instance_eval(mrb_state*, mrb_value); 2180 2181 static mrb_value 2182 inspect_main(mrb_state *mrb, mrb_value mod) 2183 { 2184 return mrb_str_new_lit(mrb, "main"); 2185 } 2186 2187 static const mrb_code new_iseq[] = { 2188 OP_ENTER, 0x0, 0x10, 0x1, /* OP_ENTER 0:0:1:0:0:0:1 */ 2189 OP_LOADSELF, 0x3, /* OP_LOADSELF R3 */ 2190 OP_SEND, 0x3, 0x0, 0x0, /* OP_SEND R3 :allocate 0 */ 2191 OP_MOVE, 0x0, 0x3, /* OP_MOVE R0 R3 */ 2192 OP_MOVE, 0x4, 0x1, /* OP_MOVE R4 R1 */ 2193 OP_MOVE, 0x5, 0x2, /* OP_MOVE R5 R2 */ 2194 OP_SENDVB, 0x3, 0x1, /* OP_SENDVB R4 :initialize */ 2195 OP_RETURN, 0x0 /* OP_RETURN R0 */ 2196 }; 2197 2198 static void 2199 init_class_new(mrb_state *mrb, struct RClass *cls) 2200 { 2201 struct RProc *p; 2202 mrb_method_t m; 2203 mrb_irep *new_irep = (mrb_irep*)mrb_malloc(mrb, sizeof(mrb_irep)); 2204 static const mrb_irep mrb_irep_zero = { 0 }; 2205 2206 *new_irep = mrb_irep_zero; 2207 new_irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*2); 2208 new_irep->syms[0] = mrb_intern_lit(mrb, "allocate"); 2209 new_irep->syms[1] = mrb_intern_lit(mrb, "initialize"); 2210 new_irep->slen = 2; 2211 new_irep->flags = MRB_ISEQ_NO_FREE; 2212 new_irep->iseq = new_iseq; 2213 new_irep->ilen = sizeof(new_iseq); 2214 new_irep->nregs = 6; 2215 new_irep->nlocals = 3; 2216 p = mrb_proc_new(mrb, new_irep); 2217 MRB_METHOD_FROM_PROC(m, p); 2218 mrb_define_method_raw(mrb, cls, mrb_intern_lit(mrb, "new"), m); 2219 } 2268 2220 2269 2221 void … … 2289 2241 /* name basic classes */ 2290 2242 mrb_define_const(mrb, bob, "BasicObject", mrb_obj_value(bob)); 2291 mrb_define_const(mrb, obj, "BasicObject", mrb_obj_value(bob));2292 2243 mrb_define_const(mrb, obj, "Object", mrb_obj_value(obj)); 2293 2244 mrb_define_const(mrb, obj, "Module", mrb_obj_value(mod)); … … 2295 2246 2296 2247 /* name each classes */ 2297 name_class(mrb, bob, mrb_intern_lit(mrb, "BasicObject"));2298 name_class(mrb, obj, mrb_intern_lit(mrb, "Object"));/* 15.2.1 */2299 name_class(mrb, mod, mrb_intern_lit(mrb, "Module"));/* 15.2.2 */2300 name_class(mrb, cls, mrb_intern_lit(mrb, "Class"));/* 15.2.3 */2248 mrb_class_name_class(mrb, NULL, bob, mrb_intern_lit(mrb, "BasicObject")); 2249 mrb_class_name_class(mrb, NULL, obj, mrb_intern_lit(mrb, "Object")); /* 15.2.1 */ 2250 mrb_class_name_class(mrb, NULL, mod, mrb_intern_lit(mrb, "Module")); /* 15.2.2 */ 2251 mrb_class_name_class(mrb, NULL, cls, mrb_intern_lit(mrb, "Class")); /* 15.2.3 */ 2301 2252 2302 2253 mrb->proc_class = mrb_define_class(mrb, "Proc", mrb->object_class); /* 15.2.17 */ … … 2308 2259 mrb_define_method(mrb, bob, "==", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.1 */ 2309 2260 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 */ 2313 2314 mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, MRB_ARGS_OPT(1)); 2261 mrb_define_method(mrb, bob, "__id__", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.4 */ 2262 mrb_define_method(mrb, bob, "__send__", mrb_f_send, MRB_ARGS_REQ(1)|MRB_ARGS_REST()|MRB_ARGS_BLOCK()); /* 15.3.1.3.5 */ 2263 mrb_define_method(mrb, bob, "equal?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.11 */ 2264 mrb_define_method(mrb, bob, "instance_eval", mrb_obj_instance_eval, MRB_ARGS_OPT(1)|MRB_ARGS_BLOCK()); /* 15.3.1.3.18 */ 2265 2266 mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, MRB_ARGS_OPT(1)|MRB_ARGS_BLOCK()); 2267 mrb_define_method(mrb, cls, "allocate", mrb_instance_alloc, MRB_ARGS_NONE()); 2315 2268 mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, MRB_ARGS_NONE()); /* 15.2.3.3.4 */ 2316 mrb_define_method(mrb, cls, "new", mrb_instance_new, MRB_ARGS_ANY()); /* 15.2.3.3.3 */2317 2269 mrb_define_method(mrb, cls, "initialize", mrb_class_initialize, MRB_ARGS_OPT(1)); /* 15.2.3.3.1 */ 2318 2270 mrb_define_method(mrb, cls, "inherited", mrb_bob_init, MRB_ARGS_REQ(1)); 2319 2271 2272 init_class_new(mrb, cls); 2273 2320 2274 MRB_SET_INSTANCE_TT(mod, MRB_TT_MODULE); 2321 mrb_define_method(mrb, mod, "class_variable_defined?", mrb_mod_cvar_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.16 */2322 mrb_define_method(mrb, mod, "class_variable_get", mrb_mod_cvar_get, MRB_ARGS_REQ(1)); /* 15.2.2.4.17 */2323 mrb_define_method(mrb, mod, "class_variable_set", mrb_mod_cvar_set, MRB_ARGS_REQ(2)); /* 15.2.2.4.18 */2324 2275 mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, MRB_ARGS_REQ(1)); /* 15.2.2.4.25 */ 2325 2276 mrb_define_method(mrb, mod, "extended", mrb_bob_init, MRB_ARGS_REQ(1)); /* 15.2.2.4.26 */ … … 2330 2281 mrb_define_method(mrb, mod, "class_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.15 */ 2331 2282 mrb_define_method(mrb, mod, "included", mrb_bob_init, MRB_ARGS_REQ(1)); /* 15.2.2.4.29 */ 2332 mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, MRB_ARGS_NONE()); /* 15.2.2.4.30 */2333 2283 mrb_define_method(mrb, mod, "initialize", mrb_mod_initialize, MRB_ARGS_NONE()); /* 15.2.2.4.31 */ 2334 mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, MRB_ARGS_ANY()); /* 15.2.2.4.33 */2335 mrb_define_method(mrb, mod, "method_defined?", mrb_mod_method_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */2336 2284 mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.35 */ 2337 2285 mrb_define_method(mrb, mod, "module_function", mrb_mod_module_function, MRB_ARGS_ANY()); … … 2339 2287 mrb_define_method(mrb, mod, "protected", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.37 */ 2340 2288 mrb_define_method(mrb, mod, "public", mrb_mod_dummy_visibility, MRB_ARGS_ANY()); /* 15.2.2.4.38 */ 2341 mrb_define_method(mrb, mod, "remove_class_variable", mrb_mod_remove_cvar, MRB_ARGS_REQ(1)); /* 15.2.2.4.39 */2342 mrb_define_method(mrb, mod, "remove_method", mrb_mod_remove_method, MRB_ARGS_ANY()); /* 15.2.2.4.41 */2343 mrb_define_method(mrb, mod, "method_removed", mrb_bob_init, MRB_ARGS_REQ(1));2344 2289 mrb_define_method(mrb, mod, "attr_reader", mrb_mod_attr_reader, MRB_ARGS_ANY()); /* 15.2.2.4.13 */ 2345 2290 mrb_define_method(mrb, mod, "attr_writer", mrb_mod_attr_writer, MRB_ARGS_ANY()); /* 15.2.2.4.14 */ … … 2352 2297 mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, MRB_ARGS_REQ(1)); /* 15.2.2.4.21 */ 2353 2298 mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, MRB_ARGS_REQ(2)); /* 15.2.2.4.23 */ 2354 mrb_define_method(mrb, mod, "constants", mrb_mod_constants, MRB_ARGS_OPT(1)); /* 15.2.2.4.24 */2355 2299 mrb_define_method(mrb, mod, "remove_const", mrb_mod_remove_const, MRB_ARGS_REQ(1)); /* 15.2.2.4.40 */ 2356 2300 mrb_define_method(mrb, mod, "const_missing", mrb_mod_const_missing, MRB_ARGS_REQ(1)); 2301 mrb_define_method(mrb, mod, "method_defined?", mrb_mod_method_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */ 2357 2302 mrb_define_method(mrb, mod, "define_method", mod_define_method, MRB_ARGS_ARG(1,1)); 2358 mrb_define_method(mrb, mod, "class_variables", mrb_mod_class_variables, MRB_ARGS_NONE()); /* 15.2.2.4.19 */ 2359 mrb_define_method(mrb, mod, "===", mrb_mod_eqq, MRB_ARGS_REQ(1)); 2360 mrb_define_class_method(mrb, mod, "constants", mrb_mod_s_constants, MRB_ARGS_ANY()); /* 15.2.2.3.1 */ 2303 mrb_define_method(mrb, mod, "===", mrb_mod_eqq, MRB_ARGS_REQ(1)); /* 15.2.2.4.7 */ 2304 mrb_define_method(mrb, mod, "dup", mrb_mod_dup, MRB_ARGS_NONE()); 2361 2305 2362 2306 mrb_undef_method(mrb, cls, "append_features"); 2307 mrb_undef_method(mrb, cls, "prepend_features"); 2363 2308 mrb_undef_method(mrb, cls, "extend_object"); 2364 } 2309 mrb_undef_method(mrb, cls, "module_function"); 2310 2311 mrb->top_self = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb->object_class); 2312 mrb_define_singleton_method(mrb, mrb->top_self, "inspect", inspect_main, MRB_ARGS_NONE()); 2313 mrb_define_singleton_method(mrb, mrb->top_self, "to_s", inspect_main, MRB_ARGS_NONE()); 2314 mrb_define_singleton_method(mrb, mrb->top_self, "define_method", top_define_method, MRB_ARGS_ARG(1,1)); 2315 }
Note:
See TracChangeset
for help on using the changeset viewer.