1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* enumerator.c (inspect_enumerator): Implement #inspect.

[ruby-dev:37248]-[ruby-dev:37263]



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@20851 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
knu 2008-12-17 12:10:30 +00:00
parent eca3dd75c5
commit 6764400540
3 changed files with 76 additions and 0 deletions

View file

@ -1,3 +1,8 @@
Wed Dec 17 21:02:55 2008 Akinori MUSHA <knu@iDaemons.org>
* enumerator.c (inspect_enumerator): Implement #inspect.
[ruby-dev:37248]-[ruby-dev:37263]
Wed Dec 17 20:06:32 2008 Akinori MUSHA <knu@iDaemons.org>
* lib/date.rb (once): Use Object#object_id instead of Symbol#to_i;

4
NEWS
View file

@ -40,6 +40,10 @@ with all sufficient information, see the ChangeLog file.
Now calls the "rewind" method of the enclosed object if defined.
* Enumerator#inspect
Implemented.
* Hash#default_proc=
New method.

View file

@ -575,6 +575,72 @@ enumerator_rewind(obj)
}
}
static VALUE
inspect_enumerator(obj, dummy, recur)
VALUE obj, dummy;
int recur;
{
struct enumerator *e = enumerator_ptr(obj);
const char *cname = rb_obj_classname(obj);
VALUE eobj, str;
int tainted;
if (recur) {
str = rb_str_buf_new2("#<");
rb_str_buf_cat2(str, cname);
rb_str_buf_cat2(str, ": ...>");
OBJ_TAINT(str);
return str;
}
eobj = e->obj;
tainted = OBJ_TAINTED(eobj);
/* (1..100).each_cons(2) => "#<Enumerator: 1..100:each_cons(2)>" */
str = rb_str_buf_new2("#<");
rb_str_buf_cat2(str, cname);
rb_str_buf_cat2(str, ": ");
rb_str_concat(str, rb_inspect(eobj));
rb_str_buf_cat2(str, ":");
rb_str_buf_cat2(str, rb_id2name(e->meth));
if (e->args) {
int argc = RARRAY_LEN(e->args);
VALUE *argv = RARRAY_PTR(e->args);
rb_str_buf_cat2(str, "(");
while (argc--) {
VALUE arg = *argv++;
rb_str_concat(str, rb_inspect(arg));
rb_str_buf_cat2(str, argc > 0 ? ", " : ")");
if (OBJ_TAINTED(arg)) tainted = Qtrue;
}
}
rb_str_buf_cat2(str, ">");
if (tainted) OBJ_TAINT(str);
return str;
}
/*
* call-seq:
* e.inspect => string
*
* Create a printable version of <i>e</i>.
*/
static VALUE
enumerator_inspect(obj)
VALUE obj;
{
return rb_exec_recursive(inspect_enumerator, obj, 0);
}
/*
* Yielder
*/
@ -836,6 +902,7 @@ Init_Enumerator()
rb_define_method(rb_cEnumerator, "with_object", enumerator_with_object, 1);
rb_define_method(rb_cEnumerator, "next", enumerator_next, 0);
rb_define_method(rb_cEnumerator, "rewind", enumerator_rewind, 0);
rb_define_method(rb_cEnumerator, "inspect", enumerator_inspect, 0);
rb_eStopIteration = rb_define_class("StopIteration", rb_eIndexError);