diff --git a/enumerator.c b/enumerator.c index a996566b7b..791cdfc36d 100644 --- a/enumerator.c +++ b/enumerator.c @@ -1140,6 +1140,35 @@ enumerator_size(VALUE obj) return e->size; } +static VALUE +enumerator_receiver(VALUE obj) +{ + struct enumerator *e; + VALUE eobj; + TypedData_Get_Struct(obj, struct enumerator, &enumerator_data_type, e); + eobj = rb_attr_get(obj, id_receiver); + if (NIL_P(eobj)) { + eobj = e->obj; + } + return eobj; +} + +static VALUE +enumerator_method_name(VALUE obj) +{ + struct enumerator *e; + TypedData_Get_Struct(obj, struct enumerator, &enumerator_data_type, e); + return ID2SYM(e->meth); +} + +static VALUE +enumerator_arguments(VALUE obj) +{ + struct enumerator *e; + TypedData_Get_Struct(obj, struct enumerator, &enumerator_data_type, e); + return e->args; +} + /* * Yielder */ @@ -2357,6 +2386,9 @@ InitVM_Enumerator(void) rb_define_method(rb_cEnumerator, "rewind", enumerator_rewind, 0); rb_define_method(rb_cEnumerator, "inspect", enumerator_inspect, 0); rb_define_method(rb_cEnumerator, "size", enumerator_size, 0); + rb_define_method(rb_cEnumerator, "receiver", enumerator_receiver, 0); + rb_define_method(rb_cEnumerator, "method_name", enumerator_method_name, 0); + rb_define_method(rb_cEnumerator, "arguments", enumerator_arguments, 0); /* Lazy */ rb_cLazy = rb_define_class_under(rb_cEnumerator, "Lazy", rb_cEnumerator);