* variable.c (find_class_path): no retry when preferred is given.
* variable.c (classname): if classid is set try it to find full
  qualified class path, and then try arbitrary class path.  try
  tmp_classpath at last even if enclosing namespace is anonymous.
  fix r36574.  [ruby-core:42865][Bug #6078]
* variable.c (rb_set_class_path_string, rb_set_class_path): set
  tmp_classpath instead of classpath if the name is not permanent.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36577 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2012-07-30 12:00:56 +00:00
Родитель e652ecfac7
Коммит 0e15934d7f
3 изменённых файлов: 33 добавлений и 15 удалений

Просмотреть файл

@ -1,3 +1,15 @@
Mon Jul 30 21:00:53 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* variable.c (find_class_path): no retry when preferred is given.
* variable.c (classname): if classid is set try it to find full
qualified class path, and then try arbitrary class path. try
tmp_classpath at last even if enclosing namespace is anonymous.
fix r36574. [ruby-core:42865][Bug #6078]
* variable.c (rb_set_class_path_string, rb_set_class_path): set
tmp_classpath instead of classpath if the name is not permanent.
Mon Jul 30 14:24:20 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* variable.c: store anonymous class path in tmp_classpath but not in

Просмотреть файл

@ -372,12 +372,16 @@ class TestModule < Test::Unit::TestCase
assert_equal([:N], m.constants)
m.module_eval("module O end")
assert_equal([:N, :O], m.constants)
m.module_eval("class C end")
assert_equal([:N, :O, :C], m.constants)
assert_nil(m::N.name)
assert_match(/\A(?:#<Module:.*>::)?O\z/, m::O.name)
assert_match(/\A#<Module:.*>::O\z/, m::O.name)
assert_match(/\A#<Class:.*>::O\z/, m::C.name)
self.class.const_set(:M, m)
prefix = self.class.name + "::M::"
assert_equal(prefix+"N", m.const_get(:N).name)
assert_equal(prefix+"O", m.const_get(:O).name)
assert_equal(prefix+"C", m.const_get(:C).name)
end
def test_private_class_method

Просмотреть файл

@ -115,7 +115,6 @@ find_class_path(VALUE klass, ID preferred)
{
struct fc_result arg;
find:
arg.preferred = preferred;
arg.name = 0;
arg.path = 0;
@ -137,10 +136,6 @@ find_class_path(VALUE klass, ID preferred)
st_delete(RCLASS_IV_TBL(klass), &tmp, 0);
return arg.path;
}
if (preferred) {
preferred = 0;
goto find;
}
return Qnil;
}
@ -153,12 +148,17 @@ classname(VALUE klass)
if (!klass) klass = rb_cObject;
if (RCLASS_IV_TBL(klass)) {
if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classpath, &n)) {
if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classid, &n)) {
return find_class_path(klass, (ID)0);
if (st_lookup(RCLASS_IV_TBL(klass), (st_data_t)classid, &n)) {
path = find_class_path(klass, SYM2ID(n));
}
path = find_class_path(klass, SYM2ID(n));
if (NIL_P(path)) {
path = rb_str_dup(rb_id2str(SYM2ID((VALUE)n)));
path = find_class_path(klass, (ID)0);
}
if (NIL_P(path)) {
if (!st_lookup(RCLASS_IV_TBL(klass), (st_data_t)tmp_classpath, &n)) {
return Qnil;
}
path = rb_str_dup((VALUE)n);
OBJ_FREEZE(path);
return path;
}
@ -240,6 +240,7 @@ void
rb_set_class_path_string(VALUE klass, VALUE under, VALUE name)
{
VALUE str;
ID pathid = classpath;
if (under == rb_cObject) {
str = rb_str_new_frozen(name);
@ -250,28 +251,29 @@ rb_set_class_path_string(VALUE klass, VALUE under, VALUE name)
rb_str_cat2(str, "::");
rb_str_append(str, name);
OBJ_FREEZE(str);
if (!permanent) return;
if (!permanent) pathid = tmp_classpath;
}
rb_ivar_set(klass, classpath, str);
rb_ivar_set(klass, pathid, str);
}
void
rb_set_class_path(VALUE klass, VALUE under, const char *name)
{
VALUE str;
int permanent = 1;
ID pathid = classpath;
if (under == rb_cObject) {
str = rb_str_new2(name);
}
else {
int permanent;
str = rb_str_dup(rb_tmp_class_path(under, &permanent));
rb_str_cat2(str, "::");
rb_str_cat2(str, name);
if (!permanent) pathid = tmp_classpath;
}
OBJ_FREEZE(str);
if (!permanent) return;
rb_ivar_set(klass, classpath, str);
rb_ivar_set(klass, pathid, str);
}
VALUE