summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--bootstraptest/test_class.rb6
-rw-r--r--variable.c23
3 files changed, 26 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 8bfd11c67a..9451d7b85c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri May 15 15:15:12 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * variable.c (rb_autoload_load): checks if iv_tbl is valid.
+ [ruby-dev:38456]
+
Fri May 15 11:17:48 2009 NAKAMURA Usaku <usa@ruby-lang.org>
* win32/setup.mak (-version-): now version.h includes
diff --git a/bootstraptest/test_class.rb b/bootstraptest/test_class.rb
index ad2844106f..a7f6d4df47 100644
--- a/bootstraptest/test_class.rb
+++ b/bootstraptest/test_class.rb
@@ -144,3 +144,9 @@ assert_equal '3', %q{
}
$i
}
+
+assert_match /::C\z/, %q{
+ c = nil
+ Module.new{|m| c = class m::C; name; end}
+ c
+}, '[ruby-dev:38456]'
diff --git a/variable.c b/variable.c
index f2acd13d42..c622229094 100644
--- a/variable.c
+++ b/variable.c
@@ -1432,11 +1432,23 @@ autoload_node(VALUE mod, ID id, int noload)
return 0;
}
+static NODE *
+autoload_node_ptr(VALUE mod, ID id)
+{
+ struct st_table *tbl = RCLASS_IV_TBL(mod);
+ st_data_t val;
+
+ if (!tbl || !st_lookup(tbl, id, &val) || val != Qundef) {
+ return 0;
+ }
+ return autoload_node(mod, id, 0);
+}
+
VALUE
rb_autoload_load(VALUE klass, ID id)
{
VALUE file;
- NODE *load = autoload_node(klass, id, 0);
+ NODE *load = autoload_node_ptr(klass, id);
if (!load) return Qfalse;
file = load->nd_lit;
@@ -1446,15 +1458,10 @@ rb_autoload_load(VALUE klass, ID id)
VALUE
rb_autoload_p(VALUE mod, ID id)
{
- struct st_table *tbl = RCLASS_IV_TBL(mod);
- st_data_t val;
- NODE *load;
VALUE file;
+ NODE *load = autoload_node_ptr(mod, id);
- if (!tbl || !st_lookup(tbl, id, &val) || val != Qundef) {
- return Qnil;
- }
- load = autoload_node(mod, id, 0);
+ if (!load) return Qnil;
return load && (file = load->nd_lit) ? file : Qnil;
}