diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-04-07 02:51:05 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-04-07 02:51:05 +0000 |
commit | 4ded52b623ebd1b3de12db82f8b54cc156c1fd28 (patch) | |
tree | 7b44f5fa6aa0e5c49b2928d43f00ccc71c97a07f /io.c | |
parent | 43db576e61cc70fc7d8280183b71985e5ab18651 (diff) | |
download | ruby-4ded52b623ebd1b3de12db82f8b54cc156c1fd28.tar.gz |
* 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().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6114 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 80 |
1 files changed, 41 insertions, 39 deletions
@@ -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; |