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); | ||