* class.c, error.c, eval.c, intern.h, object.c, variable.c:

do not set path if it is a singleton class.  [ruby-dev:22588]
  (backport from 1.9)


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6635 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ocean 2004-07-15 11:42:51 +00:00
parent 61817f40af
commit 99a04c1adf
7 changed files with 37 additions and 21 deletions

View file

@ -1,3 +1,12 @@
Thu Jul 15 20:29:15 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
* class.c, error.c, eval.c, intern.h, object.c, variable.c:
do not set path if it is a singleton class. [ruby-dev:22588]
(backport from 1.9)
variable.c (rb_set_class_path): do not set path if it is a singleton
> class. [ruby-dev:22588]
Thu Jul 15 10:15:04 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp> Thu Jul 15 10:15:04 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* ext/tk/, ext/tcltklib/: bug fix * ext/tk/, ext/tcltklib/: bug fix

24
class.c
View file

@ -175,7 +175,6 @@ rb_define_class_id(id, super)
if (!super) super = rb_cObject; if (!super) super = rb_cObject;
klass = rb_class_new(super); klass = rb_class_new(super);
rb_name_class(klass, id);
rb_make_metaclass(klass, RBASIC(super)->klass); rb_make_metaclass(klass, RBASIC(super)->klass);
return klass; return klass;
@ -226,6 +225,7 @@ rb_define_class(name, super)
} }
klass = rb_define_class_id(id, super); klass = rb_define_class_id(id, super);
st_add_direct(rb_class_tbl, id, klass); st_add_direct(rb_class_tbl, id, klass);
rb_name_class(klass, id);
rb_const_set(rb_cObject, id, klass); rb_const_set(rb_cObject, id, klass);
rb_class_inherited(super, klass); rb_class_inherited(super, klass);
@ -630,7 +630,7 @@ class_instance_method_list(argc, argv, mod, func)
/* /*
* call-seq: * call-seq:
* mod.instance_methods(include_super=false) => array * mod.instance_methods(include_super=true) => array
* *
* Returns an array containing the names of public instance methods in * Returns an array containing the names of public instance methods in
* the receiver. For a module, these are the public methods; for a * the receiver. For a module, these are the public methods; for a
@ -650,8 +650,8 @@ class_instance_method_list(argc, argv, mod, func)
* end * end
* *
* A.instance_methods #=> ["method1"] * A.instance_methods #=> ["method1"]
* B.instance_methods #=> ["method2"] * B.instance_methods(false) #=> ["method2"]
* C.instance_methods #=> ["method3"] * C.instance_methods(false) #=> ["method3"]
* C.instance_methods(true).length #=> 43 * C.instance_methods(true).length #=> 43
*/ */
@ -666,7 +666,7 @@ rb_class_instance_methods(argc, argv, mod)
/* /*
* call-seq: * call-seq:
* mod.protected_instance_methods(include_super=false) => array * mod.protected_instance_methods(include_super=true) => array
* *
* Returns a list of the protected instance methods defined in * Returns a list of the protected instance methods defined in
* <i>mod</i>. If the optional parameter is not <code>false</code>, the * <i>mod</i>. If the optional parameter is not <code>false</code>, the
@ -684,7 +684,7 @@ rb_class_protected_instance_methods(argc, argv, mod)
/* /*
* call-seq: * call-seq:
* mod.private_instance_methods(include_super=false) => array * mod.private_instance_methods(include_super=true) => array
* *
* Returns a list of the private instance methods defined in * Returns a list of the private instance methods defined in
* <i>mod</i>. If the optional parameter is not <code>false</code>, the * <i>mod</i>. If the optional parameter is not <code>false</code>, the
@ -710,7 +710,7 @@ rb_class_private_instance_methods(argc, argv, mod)
/* /*
* call-seq: * call-seq:
* mod.public_instance_methods(include_super=false) => array * mod.public_instance_methods(include_super=true) => array
* *
* Returns a list of the public instance methods defined in <i>mod</i>. * Returns a list of the public instance methods defined in <i>mod</i>.
* If the optional parameter is not <code>false</code>, the methods of * If the optional parameter is not <code>false</code>, the methods of
@ -728,7 +728,7 @@ rb_class_public_instance_methods(argc, argv, mod)
/* /*
* call-seq: * call-seq:
* obj.singleton_methods(all=false) => array * obj.singleton_methods(all=true) => array
* *
* Returns an array of the names of singleton methods for <i>obj</i>. * Returns an array of the names of singleton methods for <i>obj</i>.
* If the optional <i>all</i> parameter is true, the list will include * If the optional <i>all</i> parameter is true, the list will include
@ -745,17 +745,17 @@ rb_class_public_instance_methods(argc, argv, mod)
* a = Single.new * a = Single.new
* *
* def a.one() * def a.one()
* end
* *
* class << a * class << a
* end
* include Other * include Other
* def two() * def two()
* end
* end * end
* *
* end
* Single.singleton_methods #=> ["four"] * Single.singleton_methods #=> ["four"]
* a.singleton_methods #=> ["two", "one"] * a.singleton_methods(false) #=> ["two", "one"]
* a.singleton_methods(true) #=> ["two", "one", "three"] * a.singleton_methods #=> ["two", "one", "three"]
*/ */
VALUE VALUE

View file

@ -400,7 +400,7 @@ exc_to_s(exc)
{ {
VALUE mesg = rb_attr_get(exc, rb_intern("mesg")); VALUE mesg = rb_attr_get(exc, rb_intern("mesg"));
if (NIL_P(mesg)) return rb_class_path(CLASS_OF(exc)); if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));
if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg); if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg);
return mesg; return mesg;
} }
@ -439,11 +439,11 @@ exc_inspect(exc)
klass = CLASS_OF(exc); klass = CLASS_OF(exc);
exc = rb_obj_as_string(exc); exc = rb_obj_as_string(exc);
if (RSTRING(exc)->len == 0) { if (RSTRING(exc)->len == 0) {
return rb_str_dup(rb_class_path(klass)); return rb_str_dup(rb_class_name(klass));
} }
str = rb_str_buf_new2("#<"); str = rb_str_buf_new2("#<");
klass = rb_class_path(klass); klass = rb_class_name(klass);
rb_str_buf_append(str, klass); rb_str_buf_append(str, klass);
rb_str_buf_cat(str, ": ", 2); rb_str_buf_cat(str, ": ", 2);
rb_str_buf_append(str, exc); rb_str_buf_append(str, exc);
@ -645,7 +645,7 @@ name_err_to_s(exc)
{ {
VALUE mesg = rb_attr_get(exc, rb_intern("mesg")), str = mesg; VALUE mesg = rb_attr_get(exc, rb_intern("mesg")), str = mesg;
if (NIL_P(mesg)) return rb_class_path(CLASS_OF(exc)); if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));
StringValue(str); StringValue(str);
if (str != mesg) { if (str != mesg) {
rb_iv_set(exc, "mesg", mesg = str); rb_iv_set(exc, "mesg", mesg = str);

2
eval.c
View file

@ -1142,7 +1142,7 @@ error_print()
else { else {
VALUE epath; VALUE epath;
epath = rb_class_path(eclass); epath = rb_class_name(eclass);
if (elen == 0) { if (elen == 0) {
warn_print(": "); warn_print(": ");
warn_print2(RSTRING(epath)->ptr, RSTRING(epath)->len); warn_print2(RSTRING(epath)->ptr, RSTRING(epath)->len);

View file

@ -437,6 +437,7 @@ VALUE rb_class_path _((VALUE));
void rb_set_class_path _((VALUE, VALUE, const char*)); void rb_set_class_path _((VALUE, VALUE, const char*));
VALUE rb_path2class _((const char*)); VALUE rb_path2class _((const char*));
void rb_name_class _((VALUE, ID)); void rb_name_class _((VALUE, ID));
VALUE rb_class_name _((VALUE));
void rb_autoload _((VALUE, ID, const char*)); void rb_autoload _((VALUE, ID, const char*));
void rb_autoload_load _((VALUE, ID)); void rb_autoload_load _((VALUE, ID));
VALUE rb_autoload_p _((VALUE, ID)); VALUE rb_autoload_p _((VALUE, ID));

View file

@ -1236,7 +1236,7 @@ rb_mod_to_s(klass)
return s; return s;
} }
return rb_str_dup(rb_class_path(klass)); return rb_str_dup(rb_class_name(klass));
} }
/* /*

View file

@ -146,7 +146,6 @@ classname(klass)
{ {
VALUE path = Qnil; VALUE path = Qnil;
klass = rb_class_real(klass);
if (!klass) klass = rb_cObject; if (!klass) klass = rb_cObject;
if (ROBJECT(klass)->iv_tbl) { if (ROBJECT(klass)->iv_tbl) {
if (!st_lookup(ROBJECT(klass)->iv_tbl, classpath, &path)) { if (!st_lookup(ROBJECT(klass)->iv_tbl, classpath, &path)) {
@ -281,11 +280,18 @@ rb_name_class(klass, id)
rb_iv_set(klass, "__classid__", ID2SYM(id)); rb_iv_set(klass, "__classid__", ID2SYM(id));
} }
VALUE
rb_class_name(klass)
VALUE klass;
{
return rb_class_path(rb_class_real(klass));
}
char * char *
rb_class2name(klass) rb_class2name(klass)
VALUE klass; VALUE klass;
{ {
return RSTRING(rb_class_path(klass))->ptr; return RSTRING(rb_class_name(klass))->ptr;
} }
char * char *
@ -1193,7 +1199,7 @@ uninitialized_constant(klass, id)
{ {
if (klass && klass != rb_cObject) if (klass && klass != rb_cObject)
rb_name_error(id, "uninitialized constant %s::%s", rb_name_error(id, "uninitialized constant %s::%s",
RSTRING(rb_class_path(klass))->ptr, rb_class2name(klass),
rb_id2name(id)); rb_id2name(id));
else { else {
rb_name_error(id, "uninitialized constant %s", rb_id2name(id)); rb_name_error(id, "uninitialized constant %s", rb_id2name(id));