@@ -98,6 +98,30 @@ mrb_cmp_m(mrb_state *mrb, mrb_value self)
|
98 | 98 | return mrb_nil_value(); |
99 | 99 | } |
100 | 100 | |
| 101 | +static mrb_bool |
| 102 | +inspect_recursive_p(mrb_state *mrb, mrb_value obj, int n) |
| 103 | +{ |
| 104 | +for (mrb_callinfo *ci=&mrb->c->ci[-1-n]; ci>=mrb->c->cibase; ci--) { |
| 105 | +if (ci->mid == MRB_SYM(inspect) && |
| 106 | +mrb_obj_eq(mrb, obj, ci->stack[0])) { |
| 107 | +return TRUE; |
| 108 | + } |
| 109 | + } |
| 110 | +return FALSE; |
| 111 | +} |
| 112 | + |
| 113 | +mrb_bool |
| 114 | +mrb_inspect_recursive_p(mrb_state *mrb, mrb_value obj) |
| 115 | +{ |
| 116 | +return inspect_recursive_p(mrb, obj, 0); |
| 117 | +} |
| 118 | + |
| 119 | +static mrb_value |
| 120 | +mrb_obj_inspect_recursive_p(mrb_state *mrb, mrb_value obj) |
| 121 | +{ |
| 122 | +return mrb_bool_value(inspect_recursive_p(mrb, obj, 1)); |
| 123 | +} |
| 124 | + |
101 | 125 | /* 15.3.1.3.3 */ |
102 | 126 | /* 15.3.1.3.33 */ |
103 | 127 | /* |
@@ -571,6 +595,7 @@ mrb_init_kernel(mrb_state *mrb)
|
571 | 595 | mrb_define_method(mrb, krn, "__to_int", mrb_ensure_int_type, MRB_ARGS_NONE()); /* internal */ |
572 | 596 | mrb_define_method(mrb, krn, "__ENCODING__", mrb_encoding, MRB_ARGS_NONE()); |
573 | 597 | mrb_define_method(mrb, krn, "respond_to_missing?", mrb_false, MRB_ARGS_ARG(1,1)); |
| 598 | +mrb_define_method(mrb, krn, "__inspect_recursive?", mrb_obj_inspect_recursive_p, MRB_ARGS_NONE()); |
574 | 599 | |
575 | 600 | mrb_include_module(mrb, mrb->object_class, mrb->kernel_module); |
576 | 601 | } |