diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | array.c | 60 | ||||
-rw-r--r-- | dir.c | 8 | ||||
-rw-r--r-- | eval.c | 9 | ||||
-rw-r--r-- | ext/zlib/zlib.c | 2 | ||||
-rw-r--r-- | file.c | 118 | ||||
-rw-r--r-- | gc.c | 12 | ||||
-rw-r--r-- | hash.c | 4 | ||||
-rw-r--r-- | intern.h | 5 | ||||
-rw-r--r-- | io.c | 80 | ||||
-rw-r--r-- | lib/fileutils.rb | 10 | ||||
-rw-r--r-- | lib/pathname.rb | 2 | ||||
-rw-r--r-- | pack.c | 4 | ||||
-rw-r--r-- | re.c | 2 | ||||
-rw-r--r-- | ruby.h | 1 | ||||
-rw-r--r-- | rubyio.h | 2 | ||||
-rw-r--r-- | struct.c | 2 |
17 files changed, 221 insertions, 110 deletions
@@ -13,6 +13,16 @@ Wed Apr 7 00:24:34 2004 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp> * test/rinda/test_rinda.rb +Tue Apr 6 18:24:18 2004 Yukihiro Matsumoto <matz@ruby-lang.org> + + * file.c (rb_get_path): get path string via "to_path" method if + path object is not a string. [Ruby2] + + * gc.c (rb_gc_call_finalizer_at_exit): do not free threads in the + exit finalizers. + + * io.c (rb_io_reopen): should use rb_io_check_io(). + Tue Apr 6 16:46:09 2004 Tanaka Akira <akr@m17n.org> * configure.in: check the size of time_t. @@ -16,11 +16,13 @@ #include "util.h" #include "st.h" -VALUE rb_cArray; +VALUE rb_cArray, rb_cValues; + static ID id_cmp; #define ARY_DEFAULT_SIZE 16 + void rb_mem_clear(mem, size) register VALUE *mem; @@ -193,17 +195,50 @@ rb_ary_new4(n, elts) } VALUE -rb_assoc_new(car, cdr) - VALUE car, cdr; +#ifdef HAVE_STDARG_PROTOTYPES +rb_values_new(long n, ...) +#else +rb_values_new(n, va_alist) + long n; + va_dcl +#endif { - VALUE ary; + va_list ar; + VALUE val; + long i; - ary = rb_ary_new2(2); - RARRAY(ary)->ptr[0] = car; - RARRAY(ary)->ptr[1] = cdr; - RARRAY(ary)->len = 2; + val = ary_new(rb_cValues, n); + va_init_list(ar, n); + for (i=0; i<n; i++) { + RARRAY(val)->ptr[i] = va_arg(ar, VALUE); + } + va_end(ar); + RARRAY(val)->len = n; - return ary; + return val; +} + +VALUE +rb_values_new2(n, elts) + long n; + const VALUE *elts; +{ + VALUE val; + + val = ary_new(rb_cValues, n); + if (n > 0 && elts) { + MEMCPY(RARRAY(val)->ptr, elts, VALUE, n); + } + RARRAY(val)->len = n; + + return val; +} + +VALUE +rb_assoc_new(car, cdr) + VALUE car, cdr; +{ + return rb_values_new(2, car, cdr); } static VALUE @@ -905,7 +940,6 @@ rb_ary_indexes(argc, argv, ary) VALUE new_ary; long i; - rb_warn("Array#%s is deprecated; use Array#values_at", rb_id2name(rb_frame_last_func())); new_ary = rb_ary_new2(argc); for (i=0; i<argc; i++) { rb_ary_push(new_ary, rb_ary_aref(1, argv+i, ary)); @@ -1696,7 +1730,7 @@ rb_ary_collect_bang(ary) } VALUE -rb_values_at(obj, olen, argc, argv, func) +rb_get_values_at(obj, olen, argc, argv, func) VALUE obj; long olen; int argc; @@ -1749,7 +1783,7 @@ rb_ary_values_at(argc, argv, ary) VALUE *argv; VALUE ary; { - return rb_values_at(ary, RARRAY(ary)->len, argc, argv, rb_ary_entry); + return rb_get_values_at(ary, RARRAY(ary)->len, argc, argv, rb_ary_entry); } /* @@ -3016,4 +3050,6 @@ Init_Array() id_cmp = rb_intern("<=>"); inspect_key = rb_intern("__inspect_key__"); + + rb_cValues = rb_define_class("Values", rb_cArray); } @@ -379,7 +379,7 @@ dir_initialize(dir, dirname) { struct dir_data *dp; - SafeStringValue(dirname); + dirname = rb_get_path(dirname); Data_Get_Struct(dir, struct dir_data, dp); if (dp->dir) closedir(dp->dir); if (dp->path) free(dp->path); @@ -744,7 +744,7 @@ dir_s_chdir(argc, argv, obj) rb_secure(2); if (rb_scan_args(argc, argv, "01", &path) == 1) { - SafeStringValue(path); + path = rb_get_path(path); dist = RSTRING(path)->ptr; } else { @@ -806,8 +806,8 @@ check_dirname(dir) { char *path, *pend; - SafeStringValue(*dir); rb_secure(2); + *dir = rb_get_path(*dir); path = RSTRING(*dir)->ptr; if (path && *(pend = rb_path_end(rb_path_skip_prefix(path)))) { *dir = rb_str_new(path, pend - path); @@ -1439,7 +1439,7 @@ rb_push_glob(str, flags) else ary = rb_ary_new(); - SafeStringValue(str); + str = rb_get_path(str); buf = xmalloc(RSTRING(str)->len + 1); p = RSTRING(str)->ptr; @@ -6385,11 +6385,11 @@ rb_load(fname, wrap) NODE *saved_cref = ruby_cref; TMP_PROTECT; - if (wrap && ruby_safe_level >= 4) { + if (wrap && ruby_safe_level >= 4 && OBJ_TAINTED(fname)) { StringValue(fname); } else { - SafeStringValue(fname); + fname = rb_get_path(fname); } tmp = rb_find_file(fname); if (!tmp) { @@ -6714,10 +6714,7 @@ rb_require_safe(fname, safe) } volatile saved; char *volatile ftptr = 0; - if (OBJ_TAINTED(fname)) { - rb_check_safe_obj(fname); - } - StringValue(fname); + fname = rb_get_path(fname); saved.vmode = scope_vmode; saved.node = ruby_current_node; saved.func = ruby_frame->last_func; diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index db2ba0d296..7aafbbdc77 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -1757,6 +1757,7 @@ gzfile_close(gz, closeflag) int closeflag; { VALUE io = gz->io; + gz->end(gz); gz->io = Qnil; gz->orig_name = Qnil; @@ -2157,6 +2158,7 @@ gzfile_writer_end(gz) gzfile_make_footer(gz); if (ZSTREAM_IS_FINALIZE(&gz->z)) { + if (NIL_P(gz->io)) return; rb_warn("Zlib::GzipWriter object must be closed explicitly."); if (OBJ_IS_FREED(gz->io)) { aborted = 1; @@ -72,6 +72,31 @@ VALUE rb_cFile; VALUE rb_mFileTest; static VALUE rb_cStat; +VALUE +rb_get_path(obj) + VALUE obj; +{ + VALUE tmp; + static ID to_path; + + rb_check_safe_obj(obj); + tmp = rb_check_string_type(obj); + if (!NIL_P(tmp)) goto exit; + + if (!to_path) { + to_path = rb_intern("to_path"); + } + if (rb_respond_to(obj, to_path)) { + obj = rb_funcall(obj, to_path, 0, 0); + } + tmp = rb_str_to_str(obj); + exit: + if (obj != tmp) { + rb_check_safe_obj(tmp); + } + return tmp; +} + static long apply2files(func, vargs, arg) void (*func)(); @@ -82,9 +107,9 @@ apply2files(func, vargs, arg) VALUE path; struct RArray *args = RARRAY(vargs); + rb_secure(4); for (i=0; i<args->len; i++) { - path = args->ptr[i]; - SafeStringValue(path); + path = rb_get_path(args->ptr[i]); (*func)(StringValueCStr(path), arg); } @@ -558,15 +583,15 @@ rb_stat(file, st) { VALUE tmp; + rb_secure(2); tmp = rb_check_convert_type(file, T_FILE, "IO", "to_io"); if (!NIL_P(tmp)) { OpenFile *fptr; - rb_secure(2); GetOpenFile(tmp, fptr); return fstat(fileno(fptr->f), st); } - SafeStringValue(file); + file = rb_get_path(file); return stat(StringValueCStr(file), st); } @@ -587,7 +612,8 @@ rb_file_s_stat(klass, fname) { struct stat st; - SafeStringValue(fname); + rb_secure(4); + fname = rb_get_path(fname); if (rb_stat(fname, &st) < 0) { rb_sys_fail(StringValueCStr(fname)); } @@ -644,7 +670,8 @@ rb_file_s_lstat(klass, fname) #ifdef HAVE_LSTAT struct stat st; - SafeStringValue(fname); + rb_secure(2); + fname = rb_get_path(fname); if (lstat(StringValueCStr(fname), &st) == -1) { rb_sys_fail(RSTRING(fname)->ptr); } @@ -852,7 +879,8 @@ test_l(obj, fname) #ifdef S_ISLNK struct stat st; - SafeStringValue(fname); + rb_secure(2); + fname = rb_get_path(fname); if (lstat(StringValueCStr(fname), &st) < 0) return Qfalse; if (S_ISLNK(st.st_mode)) return Qtrue; #endif @@ -977,7 +1005,8 @@ static VALUE test_r(obj, fname) VALUE obj, fname; { - SafeStringValue(fname); + rb_secure(2); + fname = rb_get_path(fname); if (eaccess(StringValueCStr(fname), R_OK) < 0) return Qfalse; return Qtrue; } @@ -994,7 +1023,8 @@ static VALUE test_R(obj, fname) VALUE obj, fname; { - SafeStringValue(fname); + rb_secure(2); + fname = rb_get_path(fname); if (access(StringValueCStr(fname), R_OK) < 0) return Qfalse; return Qtrue; } @@ -1048,7 +1078,8 @@ static VALUE test_w(obj, fname) VALUE obj, fname; { - SafeStringValue(fname); + rb_secure(2); + fname = rb_get_path(fname); if (eaccess(StringValueCStr(fname), W_OK) < 0) return Qfalse; return Qtrue; } @@ -1065,7 +1096,8 @@ static VALUE test_W(obj, fname) VALUE obj, fname; { - SafeStringValue(fname); + rb_secure(2); + fname = rb_get_path(fname); if (access(StringValueCStr(fname), W_OK) < 0) return Qfalse; return Qtrue; } @@ -1111,7 +1143,8 @@ static VALUE test_x(obj, fname) VALUE obj, fname; { - SafeStringValue(fname); + rb_secure(2); + fname = rb_get_path(fname); if (eaccess(StringValueCStr(fname), X_OK) < 0) return Qfalse; return Qtrue; } @@ -1128,7 +1161,8 @@ static VALUE test_X(obj, fname) VALUE obj, fname; { - SafeStringValue(fname); + rb_secure(2); + fname = rb_get_path(fname); if (access(StringValueCStr(fname), X_OK) < 0) return Qfalse; return Qtrue; } @@ -1255,7 +1289,8 @@ check3rdbyte(fname, mode) { struct stat st; - SafeStringValue(fname); + rb_secure(2); + fname = rb_get_path(fname); if (stat(StringValueCStr(fname), &st) < 0) return Qfalse; if (st.st_mode & mode) return Qtrue; return Qfalse; @@ -1397,7 +1432,8 @@ rb_file_s_ftype(klass, fname) { struct stat st; - SafeStringValue(fname); + rb_secure(2); + fname = rb_get_path(fname); if (lstat(StringValueCStr(fname), &st) == -1) { rb_sys_fail(RSTRING(fname)->ptr); } @@ -1930,8 +1966,9 @@ rb_file_s_link(klass, from, to) VALUE klass, from, to; { #ifdef HAVE_LINK - SafeStringValue(from); - SafeStringValue(to); + rb_secure(2); + from = rb_get_path(from); + to = rb_get_path(to); if (link(StringValueCStr(from), StringValueCStr(to)) < 0) { sys_fail2(from, to); @@ -1960,8 +1997,9 @@ rb_file_s_symlink(klass, from, to) VALUE klass, from, to; { #ifdef HAVE_SYMLINK - SafeStringValue(from); - SafeStringValue(to); + rb_secure(2); + from = rb_get_path(from); + to = rb_get_path(to); if (symlink(StringValueCStr(from), StringValueCStr(to)) < 0) { sys_fail2(from, to); @@ -1994,7 +2032,8 @@ rb_file_s_readlink(klass, path) int rv; VALUE v; - SafeStringValue(path); + rb_secure(2); + path = rb_get_path(path); buf = xmalloc(size); while ((rv = readlink(StringValueCStr(path), buf, size)) == size) { size *= 2; @@ -2058,10 +2097,11 @@ rb_file_s_rename(klass, from, to) VALUE klass, from, to; { const char *src, *dst; - SafeStringValue(from); - SafeStringValue(to); + rb_secure(2); + from = rb_get_path(from); src = StringValueCStr(from); + to = rb_get_path(to); dst = StringValueCStr(to); if (rename(src, dst) < 0) { #if defined __CYGWIN__ @@ -2686,6 +2726,24 @@ rb_file_s_extname(klass, fname) /* * call-seq: + * File.path(path) -> string + * + * Returns the string representation of the path + * + * File.path("/dev/null") #=> "/dev/null" + * File.path(Pathname.new("/tmp")) #=> "/tmp" + * + */ + +static VALUE +rb_file_s_path(klass, fname) + VALUE klass, fname; +{ + return rb_get_path(fname); +} + +/* + * call-seq: * File.split(file_name) => array * * Splits the given string into a directory and a file component and @@ -2810,7 +2868,7 @@ rb_file_s_truncate(klass, path, len) VALUE klass, path, len; { rb_secure(2); - SafeStringValue(path); + path = rb_get_path(path); #ifdef HAVE_TRUNCATE if (truncate(StringValueCStr(path), NUM2OFFT(len)) < 0) @@ -2995,14 +3053,15 @@ test_check(n, argc, argv) { int i; + rb_secure(2); n+=1; if (n != argc) rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", argc, n); for (i=1; i<n; i++) { switch (TYPE(argv[i])) { case T_STRING: default: - SafeStringValue(argv[i]); - break; + argv[i] = rb_get_path(argv[i]); + break; case T_FILE: break; } @@ -3245,8 +3304,8 @@ rb_stat_init(obj, fname) { struct stat st, *nst; - SafeStringValue(fname); - + rb_secure(2); + fname = rb_get_path(fname); if (stat(StringValueCStr(fname), &st) == -1) { rb_sys_fail(RSTRING(fname)->ptr); } @@ -4015,7 +4074,7 @@ rb_find_file_ext(filep, ext) for (i=0;i<RARRAY(rb_load_path)->len;i++) { VALUE str = RARRAY(rb_load_path)->ptr[i]; - SafeStringValue(str); + str = rb_get_path(str); if (RSTRING(str)->len == 0) continue; path = RSTRING(str)->ptr; for (j=0; ext[j]; j++) { @@ -4074,7 +4133,7 @@ rb_find_file(path) tmp = rb_ary_new(); for (i=0;i<RARRAY(rb_load_path)->len;i++) { VALUE str = RARRAY(rb_load_path)->ptr[i]; - SafeStringValue(str); + str = rb_get_path(str); if (RSTRING(str)->len > 0) { rb_ary_push(tmp, str); } @@ -4212,6 +4271,7 @@ Init_File() rb_define_singleton_method(rb_cFile, "basename", rb_file_s_basename, -1); rb_define_singleton_method(rb_cFile, "dirname", rb_file_s_dirname, 1); rb_define_singleton_method(rb_cFile, "extname", rb_file_s_extname, 1); + rb_define_singleton_method(rb_cFile, "path", rb_file_s_path, 1); separator = rb_obj_freeze(rb_str_new2("/")); rb_define_const(rb_cFile, "Separator", separator); @@ -45,7 +45,7 @@ extern unsigned long __libc_ia64_register_backing_store_base; #endif void re_free_registers _((struct re_registers*)); -void rb_io_fptr_finalize _((struct OpenFile*)); +int rb_io_fptr_finalize _((struct OpenFile*)); #if !defined(setjmp) && defined(HAVE__SETJMP) #define setjmp(env) _setjmp(env) @@ -1786,11 +1786,12 @@ rb_gc_call_finalizer_at_exit() } } /* run data object's finalizers */ - for (i = 0; i < heaps_used; i++) { + for (i = heaps_used-1; 0 <= i; i--) { p = heaps[i].slot; pend = p + heaps[i].limit; while (p < pend) { if (BUILTIN_TYPE(p) == T_DATA && - DATA_PTR(p) && RANY(p)->as.data.dfree) { + DATA_PTR(p) && RANY(p)->as.data.dfree && + RANY(p)->as.basic.klass != rb_cThread) { p->as.free.flags = 0; if ((long)RANY(p)->as.data.dfree == -1) { RUBY_CRITICAL(free(DATA_PTR(p))); @@ -1800,8 +1801,9 @@ rb_gc_call_finalizer_at_exit() } } else if (BUILTIN_TYPE(p) == T_FILE) { - p->as.free.flags = 0; - rb_io_fptr_finalize(RANY(p)->as.file.fptr); + if (rb_io_fptr_finalize(RANY(p)->as.file.fptr)) { + p->as.free.flags = 0; + } } p++; } @@ -576,8 +576,6 @@ rb_hash_indexes(argc, argv, hash) VALUE indexes; int i; - rb_warn("Hash#%s is deprecated; use Hash#values_at", - rb_id2name(rb_frame_last_func())); indexes = rb_ary_new2(argc); for (i=0; i<argc; i++) { RARRAY(indexes)->ptr[i] = rb_hash_aref(hash, argv[i]); @@ -2214,8 +2212,6 @@ env_indexes(argc, argv) int i; VALUE indexes = rb_ary_new2(argc); - rb_warn("ENV.%s is deprecated; use ENV.values_at", - rb_id2name(rb_frame_last_func())); for (i=0;i<argc;i++) { VALUE tmp = rb_check_string_type(argv[i]); if (NIL_P(tmp)) { @@ -30,6 +30,8 @@ VALUE rb_ary_new _((void)); VALUE rb_ary_new2 _((long)); VALUE rb_ary_new3 __((long,...)); VALUE rb_ary_new4 _((long, const VALUE *)); +VALUE rb_values_new __((long,...)); +VALUE rb_values_new2 _((long, const VALUE *)); VALUE rb_ary_freeze _((VALUE)); VALUE rb_ary_aref _((int, VALUE*, VALUE)); void rb_ary_store _((VALUE, long, VALUE)); @@ -59,7 +61,7 @@ VALUE rb_ary_cmp _((VALUE, VALUE)); VALUE rb_protect_inspect _((VALUE(*)(ANYARGS),VALUE,VALUE)); VALUE rb_inspecting_p _((VALUE)); VALUE rb_check_array_value _((VALUE)); -VALUE rb_values_at _((VALUE, long, int, VALUE*, VALUE(*) _((VALUE,long)))); +VALUE rb_get_values_at _((VALUE, long, int, VALUE*, VALUE(*) _((VALUE,long)))); /* bignum.c */ VALUE rb_big_clone _((VALUE)); void rb_big_2comp _((VALUE)); @@ -222,6 +224,7 @@ VALUE rb_thread_local_aset _((VALUE, ID, VALUE)); void rb_thread_atfork _((void)); /* file.c */ int eaccess _((const char*, int)); +VALUE rb_get_path _((VALUE)); VALUE rb_file_s_expand_path _((int, VALUE *)); void rb_file_const _((const char*, VALUE)); int rb_find_file_ext _((VALUE*, const char* const*)); @@ -195,6 +195,20 @@ rb_io_check_closed(fptr) static void io_fflush _((FILE *, OpenFile *)); +static VALUE +rb_io_get_io(io) + VALUE io; +{ + return rb_convert_type(io, T_FILE, "IO", "to_io"); +} + +static VALUE +rb_io_check_io(io) + VALUE io; +{ + return rb_check_convert_type(io, T_FILE, "IO", "to_io"); +} + static OpenFile * flush_before_seek(fptr) OpenFile *fptr; @@ -435,15 +449,16 @@ io_write(io, str) OpenFile *fptr; FILE *f; long n; + VALUE tmp; rb_secure(4); - if (TYPE(str) != T_STRING) - str = rb_obj_as_string(str); - - if (TYPE(io) != T_FILE) { + str = rb_obj_as_string(str); + tmp = rb_io_check_io(io); + if (NIL_P(tmp)) { /* port is not IO, call write method for it. */ return rb_funcall(io, id_write, 1, str); } + io = tmp; if (RSTRING(str)->len == 0) return INT2FIX(0); GetOpenFile(io, fptr); @@ -1775,20 +1790,22 @@ rb_io_fptr_cleanup(fptr, noraise) } } -void +int rb_io_fptr_finalize(fptr) OpenFile *fptr; { - if (!fptr) return; - if (fptr->refcnt <= 0 || --fptr->refcnt) return; + if (!fptr) return 0; + if (fptr->refcnt <= 0 || --fptr->refcnt) return 0; if (fptr->path) { free(fptr->path); + fptr->path = 0; } - if (!fptr->f && !fptr->f2) return; - if (fileno(fptr->f) < 3) return; + if (!fptr->f && !fptr->f2) return 0; + if (fileno(fptr->f) < 3) return 0; rb_io_fptr_cleanup(fptr, Qtrue); free(fptr); + return 1; } VALUE @@ -2866,7 +2883,7 @@ rb_open_file(argc, argv, io) int flags, fmode; rb_scan_args(argc, argv, "12", &fname, &vmode, &perm); - SafeStringValue(fname); + fname = rb_get_path(fname); path = RSTRING(fname)->ptr; if (FIXNUM_P(vmode) || !NIL_P(perm)) { @@ -2936,7 +2953,7 @@ rb_io_s_sysopen(argc, argv) int flags, fmode, fd; rb_scan_args(argc, argv, "12", &fname, &vmode, &perm); - SafeStringValue(fname); + fname = rb_get_path(fname); if (NIL_P(vmode)) flags = O_RDONLY; else if (FIXNUM_P(vmode)) flags = FIX2INT(vmode); @@ -3045,10 +3062,12 @@ rb_f_open(argc, argv) return rb_funcall2(argv[0], to_open, argc-1, argv+1); } else { - char *str = StringValuePtr(argv[0]); - - if (str[0] == '|') { - return rb_io_popen(str+1, argc, argv, rb_cIO); + VALUE tmp = rb_check_string_type(argv[0]); + if (!NIL_P(tmp)) { + char *str = StringValuePtr(tmp); + if (str && str[0] == '|') { + return rb_io_popen(str+1, argc, argv, rb_cIO); + } } } } @@ -3067,20 +3086,6 @@ rb_io_open(fname, mode) } } -static VALUE -rb_io_get_io(io) - VALUE io; -{ - return rb_convert_type(io, T_FILE, "IO", "to_io"); -} - -static VALUE -rb_io_check_io(io) - VALUE io; -{ - return rb_check_convert_type(io, T_FILE, "IO", "to_io"); -} - static char* rb_io_mode_string(fptr) OpenFile *fptr; @@ -3210,13 +3215,13 @@ rb_io_reopen(argc, argv, file) rb_secure(4); if (rb_scan_args(argc, argv, "11", &fname, &nmode) == 1) { - if (TYPE(fname) != T_STRING) { /* fname must be IO */ - return io_reopen(file, fname); + VALUE tmp = rb_io_check_io(fname); + if (!NIL_P(tmp)) { + return io_reopen(file, tmp); } } - SafeStringValue(fname); - + fname = rb_get_path(fname); rb_io_taint_check(file); fptr = RFILE(file)->fptr; if (!fptr) { @@ -4864,8 +4869,7 @@ rb_io_s_foreach(argc, argv) struct foreach_arg arg; rb_scan_args(argc, argv, "11", &fname, &arg.sep); - SafeStringValue(fname); - + fname = rb_get_path(fname); if (argc == 1) { arg.sep = rb_default_rs; } @@ -4907,8 +4911,7 @@ rb_io_s_readlines(argc, argv, io) struct foreach_arg arg; rb_scan_args(argc, argv, "11", &fname, &arg.sep); - SafeStringValue(fname); - + fname = rb_get_path(fname); arg.argc = argc - 1; arg.io = rb_io_open(RSTRING(fname)->ptr, "r"); if (NIL_P(arg.io)) return Qnil; @@ -4945,8 +4948,7 @@ rb_io_s_read(argc, argv, io) struct foreach_arg arg; rb_scan_args(argc, argv, "12", &fname, &arg.sep, &offset); - SafeStringValue(fname); - + fname = rb_get_path(fname); arg.argc = argc ? 1 : 0; arg.io = rb_io_open(RSTRING(fname)->ptr, "r"); if (NIL_P(arg.io)) return Qnil; diff --git a/lib/fileutils.rb b/lib/fileutils.rb index b3a1466726..c15478ca1b 100644 --- a/lib/fileutils.rb +++ b/lib/fileutils.rb @@ -717,7 +717,7 @@ module FileUtils end def fu_list(arg) - Array(arg).map {|path| path.to_str } + Array(arg).map {|path| File.path(path) } end def fu_each_src_dest(src, dest) @@ -730,13 +730,15 @@ module FileUtils def fu_each_src_dest0(src, dest) if src.is_a?(Array) src.each do |s| - yield s.to_str, File.join(dest, File.basename(s)) + s = File.path(s) + yield s, File.join(dest, File.basename(s)) end else + src = File.path(src) if File.directory?(dest) - yield src.to_str, File.join(dest, File.basename(src)) + yield src, File.join(dest, File.basename(src)) else - yield src.to_str, dest.to_str + yield src, File.path(dest) end end end diff --git a/lib/pathname.rb b/lib/pathname.rb index c87a6e91ce..43126aca3c 100644 --- a/lib/pathname.rb +++ b/lib/pathname.rb @@ -223,7 +223,7 @@ class Pathname end # to_str is implemented so Pathname objects are usable with File.open, etc. - alias to_str to_s + alias to_path to_s def inspect # :nodoc: "#<#{self.class}:#{@path}>" @@ -868,10 +868,10 @@ pack_pack(ary, fmt) from = NEXTFROM; from = rb_to_int(from); l = num2i32(from); - le = uv_to_utf8(buf, l); - if (TYPE(from) == T_BIGNUM) { + if (l < 0) { rb_raise(rb_eRangeError, "pack(U): value out of range"); } + le = uv_to_utf8(buf, l); rb_str_buf_cat(res, (char*)buf, le); } break; @@ -1233,7 +1233,7 @@ match_values_at(argc, argv, match) VALUE *argv; VALUE match; { - return rb_values_at(match, RMATCH(match)->regs->num_regs, argc, argv, match_entry); + return rb_get_values_at(match, RMATCH(match)->regs->num_regs, argc, argv, match_entry); } @@ -567,6 +567,7 @@ RUBY_EXTERN VALUE rb_mProcess; RUBY_EXTERN VALUE rb_cObject; RUBY_EXTERN VALUE rb_cArray; +RUBY_EXTERN VALUE rb_cValues; RUBY_EXTERN VALUE rb_cBignum; RUBY_EXTERN VALUE rb_cClass; RUBY_EXTERN VALUE rb_cDir; @@ -65,7 +65,7 @@ long rb_io_fwrite _((const char *, long, FILE *)); int rb_io_mode_flags _((const char*)); void rb_io_check_writable _((OpenFile*)); void rb_io_check_readable _((OpenFile*)); -void rb_io_fptr_finalize _((OpenFile*)); +int rb_io_fptr_finalize _((OpenFile*)); void rb_io_synchronized _((OpenFile*)); void rb_io_check_closed _((OpenFile*)); int rb_io_wait_readable _((int)); @@ -701,7 +701,7 @@ rb_struct_values_at(argc, argv, s) VALUE *argv; VALUE s; { - return rb_values_at(s, RSTRUCT(s)->len, argc, argv, struct_entry); + return rb_get_values_at(s, RSTRUCT(s)->len, argc, argv, struct_entry); } /* |