Feature #17660 ยป 0001-Expose-information-about-which-basic-methods-have-be.patch
| vm.c | ||
|---|---|---|
| 
         return Qnil; 
   | 
||
| 
     } 
   | 
||
| 
     static void 
   | 
||
| 
     check_and_record_bop(ID mid, VALUE klass, VALUE redefines, short bv, short mask) 
   | 
||
| 
     { 
   | 
||
| 
         if (bv & mask) { 
   | 
||
| 
             VALUE redefined_method_ids; 
   | 
||
| 
             if (RTEST(rb_hash_has_key(redefines, klass))) { 
   | 
||
| 
                 redefined_method_ids = rb_hash_aref(redefines, klass); 
   | 
||
| 
             } else { 
   | 
||
| 
                 redefined_method_ids = rb_ary_new(); 
   | 
||
| 
                 rb_hash_aset(redefines, klass, redefined_method_ids); 
   | 
||
| 
             } 
   | 
||
| 
             rb_ary_push(redefined_method_ids, rb_id2sym(mid)); 
   | 
||
| 
         } 
   | 
||
| 
     } 
   | 
||
| 
     static void 
   | 
||
| 
     check_bop(ID mid, enum ruby_basic_operators bop, VALUE redefines) 
   | 
||
| 
     { 
   | 
||
| 
         if (ruby_vm_redefined_flag[bop]) { 
   | 
||
| 
             short bv = ruby_vm_redefined_flag[bop]; 
   | 
||
| 
             check_and_record_bop(mid, rb_cInteger, redefines, bv, INTEGER_REDEFINED_OP_FLAG); 
   | 
||
| 
             check_and_record_bop(mid, rb_cFloat, redefines, bv, FLOAT_REDEFINED_OP_FLAG); 
   | 
||
| 
             check_and_record_bop(mid, rb_cString, redefines, bv, STRING_REDEFINED_OP_FLAG); 
   | 
||
| 
             check_and_record_bop(mid, rb_cArray, redefines, bv, ARRAY_REDEFINED_OP_FLAG); 
   | 
||
| 
             check_and_record_bop(mid, rb_cHash, redefines, bv, HASH_REDEFINED_OP_FLAG); 
   | 
||
| 
             check_and_record_bop(mid, rb_cSymbol, redefines, bv, SYMBOL_REDEFINED_OP_FLAG); 
   | 
||
| 
             check_and_record_bop(mid, rb_cRegexp, redefines, bv, REGEXP_REDEFINED_OP_FLAG); 
   | 
||
| 
             check_and_record_bop(mid, rb_cNilClass, redefines, bv, NIL_REDEFINED_OP_FLAG); 
   | 
||
| 
             check_and_record_bop(mid, rb_cTrueClass, redefines, bv, TRUE_REDEFINED_OP_FLAG); 
   | 
||
| 
             check_and_record_bop(mid, rb_cFalseClass, redefines, bv, FALSE_REDEFINED_OP_FLAG); 
   | 
||
| 
             check_and_record_bop(mid, rb_cProc, redefines, bv, PROC_REDEFINED_OP_FLAG); 
   | 
||
| 
         } 
   | 
||
| 
     } 
   | 
||
| 
     static VALUE 
   | 
||
| 
     vm_redefined_methods(VALUE mod) 
   | 
||
| 
     { 
   | 
||
| 
         VALUE redefines = rb_hash_new(); 
   | 
||
| 
     #define OP(mid_, bop_) (check_bop(id##mid_, BOP_##bop_, redefines)) 
   | 
||
| 
         OP(PLUS, PLUS); 
   | 
||
| 
         OP(MINUS, MINUS); 
   | 
||
| 
         OP(MULT, MULT); 
   | 
||
| 
         OP(DIV, DIV); 
   | 
||
| 
         OP(MOD, MOD); 
   | 
||
| 
         OP(Eq, EQ); 
   | 
||
| 
         OP(Eqq, EQQ); 
   | 
||
| 
         OP(LT, LT); 
   | 
||
| 
         OP(LE, LE); 
   | 
||
| 
         OP(GT, GT); 
   | 
||
| 
         OP(GE, GE); 
   | 
||
| 
         OP(LTLT, LTLT); 
   | 
||
| 
         OP(AREF, AREF); 
   | 
||
| 
         OP(ASET, ASET); 
   | 
||
| 
         OP(Length, LENGTH); 
   | 
||
| 
         OP(Size, SIZE); 
   | 
||
| 
         OP(EmptyP, EMPTY_P); 
   | 
||
| 
         OP(Succ, SUCC); 
   | 
||
| 
         OP(EqTilde, MATCH); 
   | 
||
| 
         OP(Freeze, FREEZE); 
   | 
||
| 
         OP(UMinus, UMINUS); 
   | 
||
| 
         OP(Max, MAX); 
   | 
||
| 
         OP(Min, MIN); 
   | 
||
| 
         OP(Call, CALL); 
   | 
||
| 
         OP(And, AND); 
   | 
||
| 
         OP(Or, OR); 
   | 
||
| 
         OP(NilP, NIL_P); 
   | 
||
| 
     #undef OP 
   | 
||
| 
         return redefines; 
   | 
||
| 
     } 
   | 
||
| 
     void 
   | 
||
| 
     Init_VM(void) 
   | 
||
| 
     { 
   | 
||
| ... | ... | |
| 
         rb_undef_alloc_func(rb_cRubyVM); 
   | 
||
| 
         rb_undef_method(CLASS_OF(rb_cRubyVM), "new"); 
   | 
||
| 
         rb_define_singleton_method(rb_cRubyVM, "stat", vm_stat, -1); 
   | 
||
| 
         rb_define_singleton_method(rb_cRubyVM, "redefined_methods", vm_redefined_methods, 0); 
   | 
||
| 
     #if USE_DEBUG_COUNTER 
   | 
||
| 
         rb_define_singleton_method(rb_cRubyVM, "reset_debug_counters", rb_debug_counter_reset, 0); 
   | 
||
| 
         rb_define_singleton_method(rb_cRubyVM, "show_debug_counters", rb_debug_counter_show, 0); 
   | 
||