summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--bootstraptest/test_autoload.rb25
-rw-r--r--load.c6
-rw-r--r--variable.c6
-rw-r--r--version.h6
5 files changed, 45 insertions, 6 deletions
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 <nobu@ruby-lang.org>
+
+ * 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 <tadf@dotrb.org>
* 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[];