summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--file.c11
-rw-r--r--test/ruby/test_file_exhaustive.rb3
3 files changed, 11 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index f9a395ab38..4c8fe86906 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,7 @@
-Wed Jan 25 11:40:26 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Jan 25 13:27:42 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_s_basename): ignore non-ascii extension in
+ different encoding, which cannot match.
* file.c (rmext): no extension to strip if empty string.
diff --git a/file.c b/file.c
index b9309243dd..e5785bd249 100644
--- a/file.c
+++ b/file.c
@@ -3658,8 +3658,10 @@ rb_file_s_basename(int argc, VALUE *argv)
}
}
FilePathStringValue(fname);
- if (!NIL_P(fext)) enc = rb_enc_check(fname, fext);
- else enc = rb_enc_get(fname);
+ if (NIL_P(fext) || !(enc = rb_enc_compatible(fname, fext))) {
+ enc = rb_enc_get(fname);
+ fext = Qnil;
+ }
if ((n = RSTRING_LEN(fname)) == 0 || !*(name = RSTRING_PTR(fname)))
return rb_str_new_shared(fname);
@@ -3669,12 +3671,7 @@ rb_file_s_basename(int argc, VALUE *argv)
f = n;
}
else {
- rb_encoding *fenc = rb_enc_get(fext);
const char *fp;
- if (enc != fenc &&
- rb_enc_str_coderange(fext) != ENC_CODERANGE_7BIT) {
- fext = rb_str_conv_enc(fext, fenc, enc);
- }
fp = StringValueCStr(fext);
if (!(f = rmext(p, f, n, fp, RSTRING_LEN(fext), enc))) {
f = n;
diff --git a/test/ruby/test_file_exhaustive.rb b/test/ruby/test_file_exhaustive.rb
index 260610e572..a19fcd9a65 100644
--- a/test/ruby/test_file_exhaustive.rb
+++ b/test/ruby/test_file_exhaustive.rb
@@ -478,6 +478,9 @@ class TestFileExhaustive < Test::Unit::TestCase
s = "foo\x93_a".force_encoding("cp932")
assert_equal(s, File.basename(s, "_a"))
+
+ s = "\u4032.\u3024"
+ assert_equal(s, File.basename(s, ".\x95\\".force_encoding("cp932")))
end
def test_dirname