Changeset 439 for EcnlProtoTool/trunk/mruby-2.1.1/src/kernel.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/kernel.c
r331 r439 15 15 #include <mruby/istruct.h> 16 16 17 typedef enum {18 NOEX_PUBLIC = 0x00,19 NOEX_NOSUPER = 0x01,20 NOEX_PRIVATE = 0x02,21 NOEX_PROTECTED = 0x04,22 NOEX_MASK = 0x06,23 NOEX_BASIC = 0x08,24 NOEX_UNDEF = NOEX_NOSUPER,25 NOEX_MODFUNC = 0x12,26 NOEX_SUPER = 0x20,27 NOEX_VCALL = 0x40,28 NOEX_RESPONDS = 0x8029 } mrb_method_flag_t;30 31 17 MRB_API mrb_bool 32 18 mrb_func_basic_p(mrb_state *mrb, mrb_value obj, mrb_sym mid, mrb_func_t func) 33 19 { 34 struct RProc *me = mrb_method_search(mrb, mrb_class(mrb, obj), mid); 35 if (MRB_PROC_CFUNC_P(me) && (me->body.func == func)) 20 struct RClass *c = mrb_class(mrb, obj); 21 mrb_method_t m = mrb_method_search_vm(mrb, &c, mid); 22 struct RProc *p; 23 24 if (MRB_METHOD_UNDEF_P(m)) return FALSE; 25 if (MRB_METHOD_FUNC_P(m)) 26 return MRB_METHOD_FUNC(m) == func; 27 p = MRB_METHOD_PROC(m); 28 if (MRB_PROC_CFUNC_P(p) && (MRB_PROC_CFUNC(p) == func)) 36 29 return TRUE; 37 30 return FALSE; … … 61 54 mrb_obj_inspect(mrb_state *mrb, mrb_value obj) 62 55 { 63 if ( (mrb_type(obj) == MRB_TT_OBJECT) && mrb_obj_basic_to_s_p(mrb, obj)) {56 if (mrb_object_p(obj) && mrb_obj_basic_to_s_p(mrb, obj)) { 64 57 return mrb_obj_iv_inspect(mrb, mrb_obj_ptr(obj)); 65 58 } … … 135 128 mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self) 136 129 { 137 mrb_callinfo *ci = mrb->c->ci; 130 mrb_callinfo *ci = &mrb->c->ci[-1]; 131 mrb_callinfo *cibase = mrb->c->cibase; 138 132 mrb_value *bp; 139 140 bp = ci->stackent + 1; 141 ci--;142 if (ci <= mrb->c->cibase) {133 struct RProc *p; 134 135 if (ci <= cibase) { 136 /* toplevel does not have block */ 143 137 return mrb_false_value(); 144 138 } 145 /* block_given? called within block; check upper scope */ 146 if (ci->proc->env) { 147 struct REnv *e = ci->proc->env; 148 149 while (e->c) { 150 e = (struct REnv*)e->c; 151 } 139 p = ci->proc; 140 /* search method/class/module proc */ 141 while (p) { 142 if (MRB_PROC_SCOPE_P(p)) break; 143 p = p->upper; 144 } 145 if (p == NULL) return mrb_false_value(); 146 /* search ci corresponding to proc */ 147 while (cibase < ci) { 148 if (ci->proc == p) break; 149 ci--; 150 } 151 if (ci == cibase) { 152 return mrb_false_value(); 153 } 154 else if (ci->env) { 155 struct REnv *e = ci->env; 156 int bidx; 157 152 158 /* top-level does not have block slot (always false) */ 153 159 if (e->stack == mrb->c->stbase) 154 160 return mrb_false_value(); 155 if (e->stack && e->cioff < 0) { 156 /* use saved block arg position */ 157 bp = &e->stack[-e->cioff]; 158 ci = 0; /* no callinfo available */ 161 /* use saved block arg position */ 162 bidx = MRB_ENV_BIDX(e); 163 /* bidx may be useless (e.g. define_method) */ 164 if (bidx >= MRB_ENV_STACK_LEN(e)) 165 return mrb_false_value(); 166 bp = &e->stack[bidx]; 167 } 168 else { 169 bp = ci[1].stackent+1; 170 if (ci->argc >= 0) { 171 bp += ci->argc; 159 172 } 160 173 else { 161 ci = e->cxt.c->cibase + e->cioff; 162 bp = ci[1].stackent + 1; 163 } 164 } 165 if (ci && ci->argc > 0) { 166 bp += ci->argc; 174 bp++; 175 } 167 176 } 168 177 if (mrb_nil_p(*bp)) … … 231 240 /* if the origin is not the same as the class, then the origin and 232 241 the current class need to be copied */ 233 if (sc->flags & MRB_FL AG_IS_PREPENDED) {242 if (sc->flags & MRB_FL_CLASS_IS_PREPENDED) { 234 243 struct RClass *c0 = sc->super; 235 244 struct RClass *c1 = dc; 236 245 237 246 /* copy prepended iclasses */ 238 while (!(c0->flags & MRB_FL AG_IS_ORIGIN)) {247 while (!(c0->flags & MRB_FL_CLASS_IS_ORIGIN)) { 239 248 c1->super = mrb_class_ptr(mrb_obj_dup(mrb, mrb_obj_value(c0))); 240 249 c1 = c1->super; … … 242 251 } 243 252 c1->super = mrb_class_ptr(mrb_obj_dup(mrb, mrb_obj_value(c0))); 244 c1->super->flags |= MRB_FL AG_IS_ORIGIN;253 c1->super->flags |= MRB_FL_CLASS_IS_ORIGIN; 245 254 } 246 255 if (sc->mt) { … … 258 267 { 259 268 switch (mrb_type(obj)) { 269 case MRB_TT_ICLASS: 270 copy_class(mrb, dest, obj); 271 return; 260 272 case MRB_TT_CLASS: 261 273 case MRB_TT_MODULE: 262 274 copy_class(mrb, dest, obj); 263 /* fall through */ 275 mrb_iv_copy(mrb, dest, obj); 276 mrb_iv_remove(mrb, dest, mrb_intern_lit(mrb, "__classname__")); 277 break; 264 278 case MRB_TT_OBJECT: 265 279 case MRB_TT_SCLASS: … … 312 326 313 327 if (mrb_immediate_p(self)) { 314 mrb_raisef(mrb, E_TYPE_ERROR, "can't clone % S", self);315 } 316 if (mrb_ type(self) == MRB_TT_SCLASS) {328 mrb_raisef(mrb, E_TYPE_ERROR, "can't clone %v", self); 329 } 330 if (mrb_sclass_p(self)) { 317 331 mrb_raise(mrb, E_TYPE_ERROR, "can't clone singleton class"); 318 332 } 319 333 p = (struct RObject*)mrb_obj_alloc(mrb, mrb_type(self), mrb_obj_class(mrb, self)); 320 334 p->c = mrb_singleton_class_clone(mrb, self); 335 mrb_field_write_barrier(mrb, (struct RBasic*)p, (struct RBasic*)p->c); 321 336 clone = mrb_obj_value(p); 322 337 init_copy(mrb, clone, self); 338 p->flags |= mrb_obj_ptr(self)->flags & MRB_FL_OBJ_IS_FROZEN; 323 339 324 340 return clone; … … 351 367 352 368 if (mrb_immediate_p(obj)) { 353 mrb_raisef(mrb, E_TYPE_ERROR, "can't dup % S", obj);354 } 355 if (mrb_ type(obj) == MRB_TT_SCLASS) {369 mrb_raisef(mrb, E_TYPE_ERROR, "can't dup %v", obj); 370 } 371 if (mrb_sclass_p(obj)) { 356 372 mrb_raise(mrb, E_TYPE_ERROR, "can't dup singleton class"); 357 373 } … … 369 385 370 386 if (argc == 0) { 371 mrb_ raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (at least 1)");387 mrb_argnum_error(mrb, argc, 1, -1); 372 388 } 373 389 for (i = 0; i < argc; i++) { … … 411 427 mrb_value *argv; 412 428 mrb_int argc; 413 mrb_value args;414 429 415 430 mrb_get_args(mrb, "*", &argv, &argc); 416 args = mrb_ary_new_from_values(mrb, argc, argv);417 argv = (mrb_value*)RARRAY_PTR(args);418 431 return mrb_obj_extend(mrb, argc, argv, self); 419 432 } 420 433 421 staticmrb_value434 MRB_API mrb_value 422 435 mrb_obj_freeze(mrb_state *mrb, mrb_value self) 423 436 { 424 struct RBasic *b; 425 426 switch (mrb_type(self)) { 427 case MRB_TT_FALSE: 428 case MRB_TT_TRUE: 429 case MRB_TT_FIXNUM: 430 case MRB_TT_SYMBOL: 431 case MRB_TT_FLOAT: 432 return self; 433 default: 434 break; 435 } 436 437 b = mrb_basic_ptr(self); 438 if (!MRB_FROZEN_P(b)) { 439 MRB_SET_FROZEN_FLAG(b); 437 if (!mrb_immediate_p(self)) { 438 struct RBasic *b = mrb_basic_ptr(self); 439 if (!mrb_frozen_p(b)) { 440 MRB_SET_FROZEN_FLAG(b); 441 if (b->c->tt == MRB_TT_SCLASS) MRB_SET_FROZEN_FLAG(b->c); 442 } 440 443 } 441 444 return self; … … 445 448 mrb_obj_frozen(mrb_state *mrb, mrb_value self) 446 449 { 447 struct RBasic *b; 448 449 switch (mrb_type(self)) { 450 case MRB_TT_FALSE: 451 case MRB_TT_TRUE: 452 case MRB_TT_FIXNUM: 453 case MRB_TT_SYMBOL: 454 case MRB_TT_FLOAT: 455 return mrb_true_value(); 456 default: 457 break; 458 } 459 460 b = mrb_basic_ptr(self); 461 if (!MRB_FROZEN_P(b)) { 462 return mrb_false_value(); 463 } 464 return mrb_true_value(); 450 return mrb_bool_value(mrb_immediate_p(self) || mrb_frozen_p(mrb_basic_ptr(self))); 465 451 } 466 452 … … 476 462 * <code>Fixnum</code> will be truncated before being used. 477 463 */ 478 MRB_APImrb_value464 static mrb_value 479 465 mrb_obj_hash(mrb_state *mrb, mrb_value self) 480 466 { … … 520 506 521 507 return mrb_bool_value(mrb_obj_is_instance_of(mrb, self, mrb_class_ptr(arg))); 522 }523 524 /* 15.3.1.3.20 */525 /*526 * call-seq:527 * obj.instance_variable_defined?(symbol) -> true or false528 *529 * Returns <code>true</code> if the given instance variable is530 * defined in <i>obj</i>.531 *532 * class Fred533 * def initialize(p1, p2)534 * @a, @b = p1, p2535 * end536 * end537 * fred = Fred.new('cat', 99)538 * fred.instance_variable_defined?(:@a) #=> true539 * fred.instance_variable_defined?("@b") #=> true540 * fred.instance_variable_defined?("@c") #=> false541 */542 static mrb_value543 mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self)544 {545 mrb_sym sym;546 547 mrb_get_args(mrb, "n", &sym);548 mrb_iv_check(mrb, sym);549 return mrb_bool_value(mrb_iv_defined(mrb, self, sym));550 }551 552 /* 15.3.1.3.21 */553 /*554 * call-seq:555 * obj.instance_variable_get(symbol) -> obj556 *557 * Returns the value of the given instance variable, or nil if the558 * instance variable is not set. The <code>@</code> part of the559 * variable name should be included for regular instance560 * variables. Throws a <code>NameError</code> exception if the561 * supplied symbol is not valid as an instance variable name.562 *563 * class Fred564 * def initialize(p1, p2)565 * @a, @b = p1, p2566 * end567 * end568 * fred = Fred.new('cat', 99)569 * fred.instance_variable_get(:@a) #=> "cat"570 * fred.instance_variable_get("@b") #=> 99571 */572 static mrb_value573 mrb_obj_ivar_get(mrb_state *mrb, mrb_value self)574 {575 mrb_sym iv_name;576 577 mrb_get_args(mrb, "n", &iv_name);578 mrb_iv_check(mrb, iv_name);579 return mrb_iv_get(mrb, self, iv_name);580 }581 582 /* 15.3.1.3.22 */583 /*584 * call-seq:585 * obj.instance_variable_set(symbol, obj) -> obj586 *587 * Sets the instance variable names by <i>symbol</i> to588 * <i>object</i>, thereby frustrating the efforts of the class's589 * author to attempt to provide proper encapsulation. The variable590 * did not have to exist prior to this call.591 *592 * class Fred593 * def initialize(p1, p2)594 * @a, @b = p1, p2595 * end596 * end597 * fred = Fred.new('cat', 99)598 * fred.instance_variable_set(:@a, 'dog') #=> "dog"599 * fred.instance_variable_set(:@c, 'cat') #=> "cat"600 * fred.inspect #=> "#<Fred:0x401b3da8 @a=\"dog\", @b=99, @c=\"cat\">"601 */602 static mrb_value603 mrb_obj_ivar_set(mrb_state *mrb, mrb_value self)604 {605 mrb_sym iv_name;606 mrb_value val;607 608 mrb_get_args(mrb, "no", &iv_name, &val);609 mrb_iv_check(mrb, iv_name);610 mrb_iv_set(mrb, self, iv_name, val);611 return val;612 508 } 613 509 … … 652 548 KHASH_DEFINE(st, mrb_sym, char, FALSE, kh_int_hash_func, kh_int_hash_equal) 653 549 654 static void655 method_entry_loop(mrb_state *mrb, struct RClass* klass, khash_t(st)* set)656 {657 khint_t i;658 659 khash_t(mt) *h = klass->mt;660 if (!h) return;661 for (i=0;i<kh_end(h);i++) {662 if (kh_exist(h, i) && kh_value(h, i)) {663 kh_put(st, mrb, set, kh_key(h, i));664 }665 }666 }667 668 mrb_value669 mrb_class_instance_method_list(mrb_state *mrb, mrb_bool recur, struct RClass* klass, int obj)670 {671 khint_t i;672 mrb_value ary;673 mrb_bool prepended = FALSE;674 struct RClass* oldklass;675 khash_t(st)* set = kh_init(st, mrb);676 677 if (!recur && (klass->flags & MRB_FLAG_IS_PREPENDED)) {678 MRB_CLASS_ORIGIN(klass);679 prepended = TRUE;680 }681 682 oldklass = 0;683 while (klass && (klass != oldklass)) {684 method_entry_loop(mrb, klass, set);685 if ((klass->tt == MRB_TT_ICLASS && !prepended) ||686 (klass->tt == MRB_TT_SCLASS)) {687 }688 else {689 if (!recur) break;690 }691 oldklass = klass;692 klass = klass->super;693 }694 695 ary = mrb_ary_new(mrb);696 for (i=0;i<kh_end(set);i++) {697 if (kh_exist(set, i)) {698 mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(set, i)));699 }700 }701 kh_destroy(st, mrb, set);702 703 return ary;704 }705 706 static mrb_value707 mrb_obj_singleton_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj)708 {709 khint_t i;710 mrb_value ary;711 struct RClass* klass;712 khash_t(st)* set = kh_init(st, mrb);713 714 klass = mrb_class(mrb, obj);715 716 if (klass && (klass->tt == MRB_TT_SCLASS)) {717 method_entry_loop(mrb, klass, set);718 klass = klass->super;719 }720 if (recur) {721 while (klass && ((klass->tt == MRB_TT_SCLASS) || (klass->tt == MRB_TT_ICLASS))) {722 method_entry_loop(mrb, klass, set);723 klass = klass->super;724 }725 }726 727 ary = mrb_ary_new(mrb);728 for (i=0;i<kh_end(set);i++) {729 if (kh_exist(set, i)) {730 mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(set, i)));731 }732 }733 kh_destroy(st, mrb, set);734 735 return ary;736 }737 738 static mrb_value739 mrb_obj_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj, mrb_method_flag_t flag)740 {741 return mrb_class_instance_method_list(mrb, recur, mrb_class(mrb, obj), 0);742 }743 /* 15.3.1.3.31 */744 /*745 * call-seq:746 * obj.methods -> array747 *748 * Returns a list of the names of methods publicly accessible in749 * <i>obj</i>. This will include all the methods accessible in750 * <i>obj</i>'s ancestors.751 *752 * class Klass753 * def kMethod()754 * end755 * end756 * k = Klass.new757 * k.methods[0..9] #=> [:kMethod, :respond_to?, :nil?, :is_a?,758 * # :class, :instance_variable_set,759 * # :methods, :extend, :__send__, :instance_eval]760 * k.methods.length #=> 42761 */762 static mrb_value763 mrb_obj_methods_m(mrb_state *mrb, mrb_value self)764 {765 mrb_bool recur = TRUE;766 mrb_get_args(mrb, "|b", &recur);767 return mrb_obj_methods(mrb, recur, self, (mrb_method_flag_t)0); /* everything but private */768 }769 770 550 /* 15.3.1.3.32 */ 771 551 /* … … 780 560 { 781 561 return mrb_false_value(); 782 }783 784 /* 15.3.1.3.36 */785 /*786 * call-seq:787 * obj.private_methods(all=true) -> array788 *789 * Returns the list of private methods accessible to <i>obj</i>. If790 * the <i>all</i> parameter is set to <code>false</code>, only those methods791 * in the receiver will be listed.792 */793 static mrb_value794 mrb_obj_private_methods(mrb_state *mrb, mrb_value self)795 {796 mrb_bool recur = TRUE;797 mrb_get_args(mrb, "|b", &recur);798 return mrb_obj_methods(mrb, recur, self, NOEX_PRIVATE); /* private attribute not define */799 }800 801 /* 15.3.1.3.37 */802 /*803 * call-seq:804 * obj.protected_methods(all=true) -> array805 *806 * Returns the list of protected methods accessible to <i>obj</i>. If807 * the <i>all</i> parameter is set to <code>false</code>, only those methods808 * in the receiver will be listed.809 */810 static mrb_value811 mrb_obj_protected_methods(mrb_state *mrb, mrb_value self)812 {813 mrb_bool recur = TRUE;814 mrb_get_args(mrb, "|b", &recur);815 return mrb_obj_methods(mrb, recur, self, NOEX_PROTECTED); /* protected attribute not define */816 }817 818 /* 15.3.1.3.38 */819 /*820 * call-seq:821 * obj.public_methods(all=true) -> array822 *823 * Returns the list of public methods accessible to <i>obj</i>. If824 * the <i>all</i> parameter is set to <code>false</code>, only those methods825 * in the receiver will be listed.826 */827 static mrb_value828 mrb_obj_public_methods(mrb_state *mrb, mrb_value self)829 {830 mrb_bool recur = TRUE;831 mrb_get_args(mrb, "|b", &recur);832 return mrb_obj_methods(mrb, recur, self, NOEX_PUBLIC); /* public attribute not define */833 562 } 834 563 … … 858 587 { 859 588 mrb_value a[2], exc; 860 int argc;589 mrb_int argc; 861 590 862 591 … … 910 639 911 640 mrb_get_args(mrb, "n", &sym); 912 mrb_iv_ check(mrb, sym);641 mrb_iv_name_sym_check(mrb, sym); 913 642 val = mrb_iv_remove(mrb, self, sym); 914 643 if (mrb_undef_p(val)) { 915 mrb_name_error(mrb, sym, "instance variable % S not defined", mrb_sym2str(mrb, sym));644 mrb_name_error(mrb, sym, "instance variable %n not defined", sym); 916 645 } 917 646 return val; … … 921 650 mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args) 922 651 { 923 mrb_sym inspect; 924 mrb_value repr; 925 926 inspect = mrb_intern_lit(mrb, "inspect"); 927 if (mrb->c->ci > mrb->c->cibase && mrb->c->ci[-1].mid == inspect) { 928 /* method missing in inspect; avoid recursion */ 929 repr = mrb_any_to_s(mrb, self); 930 } 931 else if (mrb_respond_to(mrb, self, inspect) && mrb->c->ci - mrb->c->cibase < 16) { 932 repr = mrb_funcall_argv(mrb, self, inspect, 0, 0); 933 if (mrb_string_p(repr) && RSTRING_LEN(repr) > 64) { 934 repr = mrb_any_to_s(mrb, self); 935 } 936 } 937 else { 938 repr = mrb_any_to_s(mrb, self); 939 } 940 941 mrb_no_method_error(mrb, name, args, "undefined method '%S' for %S", 942 mrb_sym2str(mrb, name), repr); 652 mrb_no_method_error(mrb, name, args, "undefined method '%n'", name); 943 653 } 944 654 … … 976 686 * r.mm #=> 2000 977 687 */ 978 #ifdef MRB_DEFAULT_METHOD_MISSING979 688 static mrb_value 980 689 mrb_obj_missing(mrb_state *mrb, mrb_value mod) … … 984 693 mrb_int alen; 985 694 986 mrb_get_args(mrb, "n* ", &name, &a, &alen);695 mrb_get_args(mrb, "n*!", &name, &a, &alen); 987 696 mrb_method_missing(mrb, name, mod, mrb_ary_new_from_values(mrb, alen, a)); 988 697 /* not reached */ 989 698 return mrb_nil_value(); 990 699 } 991 #endif992 700 993 701 static inline mrb_bool … … 996 704 return mrb_respond_to(mrb, obj, id); 997 705 } 706 998 707 /* 15.3.1.3.43 */ 999 708 /* … … 1015 724 obj_respond_to(mrb_state *mrb, mrb_value self) 1016 725 { 1017 mrb_value mid;1018 726 mrb_sym id, rtm_id; 1019 mrb_bool priv = FALSE, respond_to_p = TRUE; 1020 1021 mrb_get_args(mrb, "o|b", &mid, &priv); 1022 1023 if (mrb_symbol_p(mid)) { 1024 id = mrb_symbol(mid); 1025 } 1026 else { 1027 mrb_value tmp; 1028 if (mrb_string_p(mid)) { 1029 tmp = mrb_check_intern_str(mrb, mid); 1030 } 1031 else { 1032 tmp = mrb_check_string_type(mrb, mid); 1033 if (mrb_nil_p(tmp)) { 1034 tmp = mrb_inspect(mrb, mid); 1035 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp); 1036 } 1037 tmp = mrb_check_intern_str(mrb, tmp); 1038 } 1039 if (mrb_nil_p(tmp)) { 1040 respond_to_p = FALSE; 1041 } 1042 else { 1043 id = mrb_symbol(tmp); 1044 } 1045 } 1046 1047 if (respond_to_p) { 1048 respond_to_p = basic_obj_respond_to(mrb, self, id, !priv); 1049 } 1050 727 mrb_bool priv = FALSE, respond_to_p; 728 729 mrb_get_args(mrb, "n|b", &id, &priv); 730 respond_to_p = basic_obj_respond_to(mrb, self, id, !priv); 1051 731 if (!respond_to_p) { 1052 732 rtm_id = mrb_intern_lit(mrb, "respond_to_missing?"); 1053 733 if (basic_obj_respond_to(mrb, self, rtm_id, !priv)) { 1054 734 mrb_value args[2], v; 1055 args[0] = m id;735 args[0] = mrb_symbol_value(id); 1056 736 args[1] = mrb_bool_value(priv); 1057 737 v = mrb_funcall_argv(mrb, self, rtm_id, 2, args); … … 1060 740 } 1061 741 return mrb_bool_value(respond_to_p); 1062 }1063 1064 /* 15.3.1.3.45 */1065 /*1066 * call-seq:1067 * obj.singleton_methods(all=true) -> array1068 *1069 * Returns an array of the names of singleton methods for <i>obj</i>.1070 * If the optional <i>all</i> parameter is true, the list will include1071 * methods in modules included in <i>obj</i>.1072 * Only public and protected singleton methods are returned.1073 *1074 * module Other1075 * def three() end1076 * end1077 *1078 * class Single1079 * def Single.four() end1080 * end1081 *1082 * a = Single.new1083 *1084 * def a.one()1085 * end1086 *1087 * class << a1088 * include Other1089 * def two()1090 * end1091 * end1092 *1093 * Single.singleton_methods #=> [:four]1094 * a.singleton_methods(false) #=> [:two, :one]1095 * a.singleton_methods #=> [:two, :one, :three]1096 */1097 static mrb_value1098 mrb_obj_singleton_methods_m(mrb_state *mrb, mrb_value self)1099 {1100 mrb_bool recur = TRUE;1101 mrb_get_args(mrb, "|b", &recur);1102 return mrb_obj_singleton_methods(mrb, recur, self);1103 }1104 1105 static mrb_value1106 mod_define_singleton_method(mrb_state *mrb, mrb_value self)1107 {1108 struct RProc *p;1109 mrb_sym mid;1110 mrb_value blk = mrb_nil_value();1111 1112 mrb_get_args(mrb, "n&", &mid, &blk);1113 if (mrb_nil_p(blk)) {1114 mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");1115 }1116 p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);1117 mrb_proc_copy(p, mrb_proc_ptr(blk));1118 p->flags |= MRB_PROC_STRICT;1119 mrb_define_method_raw(mrb, mrb_class_ptr(mrb_singleton_class(mrb, self)), mid, p);1120 return mrb_symbol_value(mid);1121 742 } 1122 743 … … 1138 759 } 1139 760 1140 static mrb_value1141 mrb_local_variables(mrb_state *mrb, mrb_value self)1142 {1143 struct RProc *proc;1144 mrb_value vars;1145 struct mrb_irep *irep;1146 size_t i;1147 1148 proc = mrb->c->ci[-1].proc;1149 1150 if (MRB_PROC_CFUNC_P(proc)) {1151 return mrb_ary_new(mrb);1152 }1153 1154 irep = proc->body.irep;1155 if (!irep->lv) {1156 return mrb_ary_new(mrb);1157 }1158 vars = mrb_hash_new(mrb);1159 for (i = 0; i + 1 < irep->nlocals; ++i) {1160 if (irep->lv[i].name) {1161 mrb_hash_set(mrb, vars, mrb_symbol_value(irep->lv[i].name), mrb_true_value());1162 }1163 }1164 if (proc->env) {1165 struct REnv *e = proc->env;1166 1167 while (e) {1168 if (MRB_ENV_STACK_SHARED_P(e) &&1169 !MRB_PROC_CFUNC_P(e->cxt.c->cibase[e->cioff].proc)) {1170 irep = e->cxt.c->cibase[e->cioff].proc->body.irep;1171 if (irep->lv) {1172 for (i = 0; i + 1 < irep->nlocals; ++i) {1173 if (irep->lv[i].name) {1174 mrb_hash_set(mrb, vars, mrb_symbol_value(irep->lv[i].name), mrb_true_value());1175 }1176 }1177 }1178 }1179 e = (struct REnv*)e->c;1180 }1181 }1182 1183 return mrb_hash_keys(mrb, vars);1184 }1185 1186 761 mrb_value mrb_obj_equal_m(mrb_state *mrb, mrb_value); 762 1187 763 void 1188 764 mrb_init_kernel(mrb_state *mrb) … … 1192 768 mrb->kernel_module = krn = mrb_define_module(mrb, "Kernel"); /* 15.3.1 */ 1193 769 mrb_define_class_method(mrb, krn, "block_given?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.2.2 */ 1194 mrb_define_class_method(mrb, krn, "global_variables", mrb_f_global_variables, MRB_ARGS_NONE()); /* 15.3.1.2.4 */1195 770 mrb_define_class_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.2.5 */ 1196 mrb_define_class_method(mrb, krn, "local_variables", mrb_local_variables, MRB_ARGS_NONE()); /* 15.3.1.2.7 */1197 771 ; /* 15.3.1.2.11 */ 1198 772 mrb_define_class_method(mrb, krn, "raise", mrb_f_raise, MRB_ARGS_OPT(2)); /* 15.3.1.2.12 */ 1199 773 1200 mrb_define_method(mrb, krn, "singleton_class", mrb_singleton_class, MRB_ARGS_NONE());1201 774 1202 775 mrb_define_method(mrb, krn, "===", mrb_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.2 */ … … 1206 779 mrb_define_method(mrb, krn, "dup", mrb_obj_dup, MRB_ARGS_NONE()); /* 15.3.1.3.9 */ 1207 780 mrb_define_method(mrb, krn, "eql?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.10 */ 1208 mrb_define_method(mrb, krn, "equal?", mrb_obj_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.11 */1209 781 mrb_define_method(mrb, krn, "extend", mrb_obj_extend_m, MRB_ARGS_ANY()); /* 15.3.1.3.13 */ 1210 782 mrb_define_method(mrb, krn, "freeze", mrb_obj_freeze, MRB_ARGS_NONE()); 1211 783 mrb_define_method(mrb, krn, "frozen?", mrb_obj_frozen, MRB_ARGS_NONE()); 1212 mrb_define_method(mrb, krn, "global_variables", mrb_f_global_variables, MRB_ARGS_NONE()); /* 15.3.1.3.14 */1213 784 mrb_define_method(mrb, krn, "hash", mrb_obj_hash, MRB_ARGS_NONE()); /* 15.3.1.3.15 */ 1214 785 mrb_define_method(mrb, krn, "initialize_copy", mrb_obj_init_copy, MRB_ARGS_REQ(1)); /* 15.3.1.3.16 */ 1215 786 mrb_define_method(mrb, krn, "inspect", mrb_obj_inspect, MRB_ARGS_NONE()); /* 15.3.1.3.17 */ 1216 787 mrb_define_method(mrb, krn, "instance_of?", obj_is_instance_of, MRB_ARGS_REQ(1)); /* 15.3.1.3.19 */ 1217 mrb_define_method(mrb, krn, "instance_variable_defined?", mrb_obj_ivar_defined, MRB_ARGS_REQ(1)); /* 15.3.1.3.20 */ 1218 mrb_define_method(mrb, krn, "instance_variable_get", mrb_obj_ivar_get, MRB_ARGS_REQ(1)); /* 15.3.1.3.21 */ 1219 mrb_define_method(mrb, krn, "instance_variable_set", mrb_obj_ivar_set, MRB_ARGS_REQ(2)); /* 15.3.1.3.22 */ 1220 mrb_define_method(mrb, krn, "instance_variables", mrb_obj_instance_variables, MRB_ARGS_NONE()); /* 15.3.1.3.23 */ 788 1221 789 mrb_define_method(mrb, krn, "is_a?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.24 */ 1222 790 mrb_define_method(mrb, krn, "iterator?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.25 */ 1223 791 mrb_define_method(mrb, krn, "kind_of?", mrb_obj_is_kind_of_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.26 */ 1224 mrb_define_method(mrb, krn, "local_variables", mrb_local_variables, MRB_ARGS_NONE()); /* 15.3.1.3.28 */1225 #ifdef MRB_DEFAULT_METHOD_MISSING1226 792 mrb_define_method(mrb, krn, "method_missing", mrb_obj_missing, MRB_ARGS_ANY()); /* 15.3.1.3.30 */ 1227 #endif1228 mrb_define_method(mrb, krn, "methods", mrb_obj_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.31 */1229 793 mrb_define_method(mrb, krn, "nil?", mrb_false, MRB_ARGS_NONE()); /* 15.3.1.3.32 */ 1230 794 mrb_define_method(mrb, krn, "object_id", mrb_obj_id_m, MRB_ARGS_NONE()); /* 15.3.1.3.33 */ 1231 mrb_define_method(mrb, krn, "private_methods", mrb_obj_private_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.36 */1232 mrb_define_method(mrb, krn, "protected_methods", mrb_obj_protected_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.37 */1233 mrb_define_method(mrb, krn, "public_methods", mrb_obj_public_methods, MRB_ARGS_OPT(1)); /* 15.3.1.3.38 */1234 795 mrb_define_method(mrb, krn, "raise", mrb_f_raise, MRB_ARGS_ANY()); /* 15.3.1.3.40 */ 1235 796 mrb_define_method(mrb, krn, "remove_instance_variable", mrb_obj_remove_instance_variable,MRB_ARGS_REQ(1)); /* 15.3.1.3.41 */ 1236 mrb_define_method(mrb, krn, "respond_to?", obj_respond_to, MRB_ARGS_ANY()); /* 15.3.1.3.43 */ 1237 mrb_define_method(mrb, krn, "send", mrb_f_send, MRB_ARGS_ANY()); /* 15.3.1.3.44 */ 1238 mrb_define_method(mrb, krn, "singleton_methods", mrb_obj_singleton_methods_m, MRB_ARGS_OPT(1)); /* 15.3.1.3.45 */ 1239 mrb_define_method(mrb, krn, "define_singleton_method", mod_define_singleton_method, MRB_ARGS_ANY()); 797 mrb_define_method(mrb, krn, "respond_to?", obj_respond_to, MRB_ARGS_ARG(1,1)); /* 15.3.1.3.43 */ 1240 798 mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, MRB_ARGS_NONE()); /* 15.3.1.3.46 */ 1241 799 mrb_define_method(mrb, krn, "__case_eqq", mrb_obj_ceqq, MRB_ARGS_REQ(1)); /* internal */ 800 mrb_define_method(mrb, krn, "__to_int", mrb_to_int, MRB_ARGS_NONE()); /* internal */ 801 mrb_define_method(mrb, krn, "__to_str", mrb_to_str, MRB_ARGS_NONE()); /* internal */ 1242 802 1243 803 mrb_include_module(mrb, mrb->object_class, mrb->kernel_module); 1244 mrb_alias_method(mrb, mrb->module_class, mrb_intern_lit(mrb, "dup"), mrb_intern_lit(mrb, "clone")); 1245 } 804 }
Note:
See TracChangeset
for help on using the changeset viewer.