diff --git a/ChangeLog b/ChangeLog index fd6d3600ce..f67b2260d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Tue Apr 8 03:39:26 2008 Nobuyoshi Nakada + + * load.c (rb_provided): check expanded path for relative path + features, loading or loaded features are already expanded in 1.9. + + * variable.c (rb_autoload_load): no needs to check if provided before + rb_require_safe. [ruby-dev:34266] + Mon Apr 7 22:41:21 2008 Tadayoshi Funaba * numeric.c: cancelled recent changes (except to remove rdiv). diff --git a/bootstraptest/test_autoload.rb b/bootstraptest/test_autoload.rb new file mode 100644 index 0000000000..395f1bd7e3 --- /dev/null +++ b/bootstraptest/test_autoload.rb @@ -0,0 +1,25 @@ +assert_equal 'ok', %q{ + open("zzz.rb", "w") {|f| f.puts "class ZZZ; def self.ok;:ok;end;end"} + autoload :ZZZ, "./zzz.rb" + print ZZZ.ok +} + +assert_equal 'ok', %q{ + open("zzz.rb", "w") {|f| f.puts "class ZZZ; def self.ok;:ok;end;end"} + autoload :ZZZ, "./zzz.rb" + require "./zzz.rb" + print ZZZ.ok +} + +assert_equal 'ok', %q{ + open("zzz.rb", "w") {|f| f.puts "class ZZZ; def self.ok;:ok;end;end"} + autoload :ZZZ, "./zzz.rb" + print proc{$SAFE=4; ZZZ.ok}.call +} + +assert_equal 'ok', %q{ + open("zzz.rb", "w") {|f| f.puts "class ZZZ; def self.ok;:ok;end;end"} + autoload :ZZZ, "./zzz.rb" + require "./zzz.rb" + print proc{$SAFE=4; ZZZ.ok}.call +} diff --git a/load.c b/load.c index 1d10589611..a2ffce4e4b 100644 --- a/load.c +++ b/load.c @@ -191,7 +191,13 @@ int rb_provided(const char *feature) { const char *ext = strrchr(feature, '.'); + volatile VALUE fullpath = 0; + if (*feature == '.' && + (feature[1] == '/' || strncmp(feature+1, "./", 2) == 0)) { + fullpath = rb_file_expand_path(rb_str_new2(feature), Qnil); + feature = RSTRING_PTR(fullpath); + } if (ext && !strchr(ext, '/')) { if (IS_RBEXT(ext)) { if (rb_feature_p(feature, ext, Qtrue, Qfalse, 0)) return Qtrue; diff --git a/variable.c b/variable.c index 8f745e5a35..154f0872b0 100644 --- a/variable.c +++ b/variable.c @@ -1374,7 +1374,7 @@ rb_autoload_load(VALUE klass, ID id) VALUE file; NODE *load = autoload_delete(klass, id); - if (!load || !(file = load->nd_lit) || rb_provided(RSTRING_PTR(file))) { + if (!load || !(file = load->nd_lit)) { return Qfalse; } return rb_require_safe(file, load->nd_nth); @@ -1393,7 +1393,7 @@ autoload_file(VALUE mod, ID id) } file = ((NODE *)load)->nd_lit; Check_Type(file, T_STRING); - if (!RSTRING_PTR(file)) { + if (!RSTRING_PTR(file) || !*RSTRING_PTR(file)) { rb_raise(rb_eArgError, "empty file name"); } if (!rb_provided(RSTRING_PTR(file))) { @@ -1433,7 +1433,7 @@ rb_const_get_0(VALUE klass, ID id, int exclude, int recurse) tmp = klass; retry: - while (tmp && !NIL_P(tmp)) { + while (RTEST(tmp)) { while (RCLASS_IV_TBL(tmp) && st_lookup(RCLASS_IV_TBL(tmp),id,&value)) { if (value == Qundef) { if (!RTEST(rb_autoload_load(tmp, id))) break; diff --git a/version.h b/version.h index 022818489a..16664f27b0 100644 --- a/version.h +++ b/version.h @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.9.0" -#define RUBY_RELEASE_DATE "2008-04-07" +#define RUBY_RELEASE_DATE "2008-04-08" #define RUBY_VERSION_CODE 190 -#define RUBY_RELEASE_CODE 20080407 +#define RUBY_RELEASE_CODE 20080408 #define RUBY_PATCHLEVEL 0 #define RUBY_VERSION_MAJOR 1 @@ -9,7 +9,7 @@ #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_YEAR 2008 #define RUBY_RELEASE_MONTH 4 -#define RUBY_RELEASE_DAY 7 +#define RUBY_RELEASE_DAY 8 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[];