* object.c (rb_obj_inspect): print instance variables only when
Object#to_s is not overridden. [ruby-core:24425] * class.c (rb_obj_basic_to_s_p): new function. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25428 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b20521ddc5
commit
7eac66b9c6
@ -1,3 +1,10 @@
|
|||||||
|
Thu Oct 22 04:54:41 2009 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* object.c (rb_obj_inspect): print instance variables only when
|
||||||
|
Object#to_s is not overridden. [ruby-core:24425]
|
||||||
|
|
||||||
|
* class.c (rb_obj_basic_to_s_p): new function.
|
||||||
|
|
||||||
Wed Oct 21 19:32:52 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Wed Oct 21 19:32:52 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* object.c (rb_obj_inspect): fixed rdoc about the case that to_s
|
* object.c (rb_obj_inspect): fixed rdoc about the case that to_s
|
||||||
|
10
class.c
10
class.c
@ -1257,6 +1257,16 @@ rb_define_attr(VALUE klass, const char *name, int read, int write)
|
|||||||
rb_attr(klass, rb_intern(name), read, write, FALSE);
|
rb_attr(klass, rb_intern(name), read, write, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
rb_obj_basic_to_s_p(obj)
|
||||||
|
{
|
||||||
|
const rb_method_entry_t *me = rb_method_entry(CLASS_OF(obj), rb_intern("to_s"));
|
||||||
|
if (me && me->def && me->def->type == VM_METHOD_TYPE_CFUNC &&
|
||||||
|
me->def->body.cfunc.func == rb_any_to_s)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
|
8
object.c
8
object.c
@ -369,16 +369,19 @@ inspect_obj(VALUE obj, VALUE str, int recur)
|
|||||||
* Returns a string containing a human-readable representation of
|
* Returns a string containing a human-readable representation of
|
||||||
* <i>obj</i>. If not overridden and no instance variables, uses the
|
* <i>obj</i>. If not overridden and no instance variables, uses the
|
||||||
* <code>to_s</code> method to generate the string.
|
* <code>to_s</code> method to generate the string.
|
||||||
|
* <i>obj</i>. If not overridden, uses the <code>to_s</code> method to
|
||||||
|
* generate the string.
|
||||||
*
|
*
|
||||||
* [ 1, 2, 3..4, 'five' ].inspect #=> "[1, 2, 3..4, \"five\"]"
|
* [ 1, 2, 3..4, 'five' ].inspect #=> "[1, 2, 3..4, \"five\"]"
|
||||||
* Time.new.inspect #=> "2008-03-08 19:43:39 +0900"
|
* Time.new.inspect #=> "2008-03-08 19:43:39 +0900"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
extern int rb_obj_basic_to_s_p(VALUE);
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
rb_obj_inspect(VALUE obj)
|
rb_obj_inspect(VALUE obj)
|
||||||
{
|
{
|
||||||
|
if (TYPE(obj) == T_OBJECT && rb_obj_basic_to_s_p(obj)) {
|
||||||
if (TYPE(obj) == T_OBJECT) {
|
|
||||||
int has_ivar = 0;
|
int has_ivar = 0;
|
||||||
VALUE *ptr = ROBJECT_IVPTR(obj);
|
VALUE *ptr = ROBJECT_IVPTR(obj);
|
||||||
long len = ROBJECT_NUMIV(obj);
|
long len = ROBJECT_NUMIV(obj);
|
||||||
@ -398,6 +401,7 @@ rb_obj_inspect(VALUE obj)
|
|||||||
str = rb_sprintf("-<%s:%p", c, (void*)obj);
|
str = rb_sprintf("-<%s:%p", c, (void*)obj);
|
||||||
return rb_exec_recursive(inspect_obj, obj, str);
|
return rb_exec_recursive(inspect_obj, obj, str);
|
||||||
}
|
}
|
||||||
|
return rb_any_to_s(obj);
|
||||||
}
|
}
|
||||||
return rb_funcall(obj, rb_intern("to_s"), 0, 0);
|
return rb_funcall(obj, rb_intern("to_s"), 0, 0);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user