mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* rubyio.h (struct OpenFile): add error raise flag to finalizer.
* io.c (Init_IO): define $/, $-0, and $\ as string-only variables. * string.c (rb_str_split_m): does not generate empty string if there's no match in the receiver. * io.c (fptr_finalize): should raise error on EBADF for readable IOs as well. * file.c (rb_stat): use rb_check_convert_type() to retrieve IO. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3679 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
0b4c9491ec
commit
f34f20ebc5
6 changed files with 42 additions and 23 deletions
17
ChangeLog
17
ChangeLog
|
@ -1,3 +1,16 @@
|
||||||
|
Mon Apr 14 03:22:33 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* rubyio.h (struct OpenFile): add error raise flag to finalizer.
|
||||||
|
|
||||||
|
* io.c (Init_IO): define $/, $-0, and $\ as string-only
|
||||||
|
variables.
|
||||||
|
|
||||||
|
* string.c (rb_str_split_m): does not generate empty string if
|
||||||
|
there's no match in the receiver.
|
||||||
|
|
||||||
|
* io.c (fptr_finalize): should raise error on EBADF for readable
|
||||||
|
IOs as well.
|
||||||
|
|
||||||
Mon Apr 14 15:54:18 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
|
Mon Apr 14 15:54:18 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
|
||||||
|
|
||||||
* bignum.c (rb_cstr_to_inum, rb_big2str): allow 2-36 as radix.
|
* bignum.c (rb_cstr_to_inum, rb_big2str): allow 2-36 as radix.
|
||||||
|
@ -22,6 +35,10 @@ Sat Apr 12 20:59:40 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
|
||||||
* misc/ruby-mode.el (ruby-forward-sexp, ruby-backward-sexp):
|
* misc/ruby-mode.el (ruby-forward-sexp, ruby-backward-sexp):
|
||||||
support special char literal, and negative arguments.
|
support special char literal, and negative arguments.
|
||||||
|
|
||||||
|
Sat Apr 12 17:52:47 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* file.c (rb_stat): use rb_check_convert_type() to retrieve IO.
|
||||||
|
|
||||||
Fri Apr 11 19:00:14 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
|
Fri Apr 11 19:00:14 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
|
||||||
|
|
||||||
* win32/win32.c (rb_w32_stat): check arguments. [ruby-dev:20007]
|
* win32/win32.c (rb_w32_stat): check arguments. [ruby-dev:20007]
|
||||||
|
|
7
file.c
7
file.c
|
@ -346,11 +346,14 @@ rb_stat(file, st)
|
||||||
VALUE file;
|
VALUE file;
|
||||||
struct stat *st;
|
struct stat *st;
|
||||||
{
|
{
|
||||||
if (TYPE(file) == T_FILE) {
|
VALUE tmp;
|
||||||
|
|
||||||
|
tmp = rb_check_convert_type(file, T_FILE, "IO", "to_io");
|
||||||
|
if (!NIL_P(tmp)) {
|
||||||
OpenFile *fptr;
|
OpenFile *fptr;
|
||||||
|
|
||||||
rb_secure(2);
|
rb_secure(2);
|
||||||
GetOpenFile(file, fptr);
|
GetOpenFile(tmp, fptr);
|
||||||
return fstat(fileno(fptr->f), st);
|
return fstat(fileno(fptr->f), st);
|
||||||
}
|
}
|
||||||
SafeStringValue(file);
|
SafeStringValue(file);
|
||||||
|
|
31
io.c
31
io.c
|
@ -1318,9 +1318,9 @@ rb_io_isatty(io)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fptr_finalize(fptr, fin)
|
fptr_finalize(fptr, noraise)
|
||||||
OpenFile *fptr;
|
OpenFile *fptr;
|
||||||
int fin;
|
int noraise;
|
||||||
{
|
{
|
||||||
int n1 = 0, n2 = 0, e = 0, f1, f2 = -1;
|
int n1 = 0, n2 = 0, e = 0, f1, f2 = -1;
|
||||||
|
|
||||||
|
@ -1341,28 +1341,26 @@ fptr_finalize(fptr, fin)
|
||||||
if (!rb_io_wait_writable(f1)) break;
|
if (!rb_io_wait_writable(f1)) break;
|
||||||
}
|
}
|
||||||
fptr->f = 0;
|
fptr->f = 0;
|
||||||
if (n1 < 0 && errno == EBADF) {
|
if (n1 < 0 && errno == EBADF && f1 == f2) {
|
||||||
if (f1 == f2 || !(fptr->mode & FMODE_WBUF)) {
|
|
||||||
n1 = 0;
|
n1 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
if (!noraise && (n1 < 0 || n2 < 0)) {
|
||||||
if (!fin && (n1 < 0 || n2 < 0)) {
|
|
||||||
if (n1 == 0) errno = e;
|
if (n1 == 0) errno = e;
|
||||||
rb_sys_fail(fptr->path);
|
rb_sys_fail(fptr->path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_io_fptr_cleanup(fptr, fin)
|
rb_io_fptr_cleanup(fptr, noraise)
|
||||||
OpenFile *fptr;
|
OpenFile *fptr;
|
||||||
int fin;
|
int noraise;
|
||||||
{
|
{
|
||||||
if (fptr->finalize) {
|
if (fptr->finalize) {
|
||||||
(*fptr->finalize)(fptr);
|
(*fptr->finalize)(fptr, noraise);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fptr_finalize(fptr, fin);
|
fptr_finalize(fptr, noraise);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fptr->path) {
|
if (fptr->path) {
|
||||||
|
@ -1937,11 +1935,12 @@ pipe_atexit _((void))
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void pipe_finalize _((OpenFile *fptr));
|
static void pipe_finalize _((OpenFile *fptr,int));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pipe_finalize(fptr)
|
pipe_finalize(fptr, noraise)
|
||||||
OpenFile *fptr;
|
OpenFile *fptr;
|
||||||
|
int noraise;
|
||||||
{
|
{
|
||||||
#if !defined (__CYGWIN__) && !defined(_WIN32)
|
#if !defined (__CYGWIN__) && !defined(_WIN32)
|
||||||
extern VALUE rb_last_status;
|
extern VALUE rb_last_status;
|
||||||
|
@ -1958,7 +1957,7 @@ pipe_finalize(fptr)
|
||||||
#endif
|
#endif
|
||||||
rb_last_status = INT2FIX(status);
|
rb_last_status = INT2FIX(status);
|
||||||
#else
|
#else
|
||||||
fptr_finalize(fptr, Qtrue);
|
fptr_finalize(fptr, noraise);
|
||||||
#endif
|
#endif
|
||||||
pipe_del_fptr(fptr);
|
pipe_del_fptr(fptr);
|
||||||
}
|
}
|
||||||
|
@ -3988,9 +3987,9 @@ Init_IO()
|
||||||
rb_output_rs = Qnil;
|
rb_output_rs = Qnil;
|
||||||
rb_global_variable(&rb_default_rs);
|
rb_global_variable(&rb_default_rs);
|
||||||
OBJ_FREEZE(rb_default_rs); /* avoid modifying RS_default */
|
OBJ_FREEZE(rb_default_rs); /* avoid modifying RS_default */
|
||||||
rb_define_variable("$/", &rb_rs);
|
rb_define_hooked_variable("$/", &rb_rs, 0, rb_str_setter);
|
||||||
rb_define_variable("$-0", &rb_rs);
|
rb_define_hooked_variable("$-0", &rb_rs, 0, rb_str_setter);
|
||||||
rb_define_variable("$\\", &rb_output_rs);
|
rb_define_hooked_variable("$\\", &rb_output_rs, 0, rb_str_setter);
|
||||||
|
|
||||||
rb_define_hooked_variable("$.", &lineno, 0, lineno_setter);
|
rb_define_hooked_variable("$.", &lineno, 0, lineno_setter);
|
||||||
rb_define_virtual_variable("$_", rb_lastline_get, rb_lastline_set);
|
rb_define_virtual_variable("$_", rb_lastline_get, rb_lastline_set);
|
||||||
|
|
|
@ -93,11 +93,11 @@ static VALUE
|
||||||
coerce_rescue(x)
|
coerce_rescue(x)
|
||||||
VALUE *x;
|
VALUE *x;
|
||||||
{
|
{
|
||||||
volatile VALUE v;
|
volatile VALUE v = rb_inspect(x[1]);
|
||||||
|
|
||||||
rb_raise(rb_eTypeError, "%s can't be coerced into %s",
|
rb_raise(rb_eTypeError, "%s can't be coerced into %s",
|
||||||
rb_special_const_p(x[1])?
|
rb_special_const_p(x[1])?
|
||||||
RSTRING(v = rb_inspect(x[1]))->ptr:
|
RSTRING(v)->ptr:
|
||||||
rb_obj_classname(x[1]),
|
rb_obj_classname(x[1]),
|
||||||
rb_obj_classname(x[0]));
|
rb_obj_classname(x[0]));
|
||||||
return Qnil; /* dummy */
|
return Qnil; /* dummy */
|
||||||
|
|
2
rubyio.h
2
rubyio.h
|
@ -23,7 +23,7 @@ typedef struct OpenFile {
|
||||||
int pid; /* child's pid (for pipes) */
|
int pid; /* child's pid (for pipes) */
|
||||||
int lineno; /* number of lines read */
|
int lineno; /* number of lines read */
|
||||||
char *path; /* pathname for file */
|
char *path; /* pathname for file */
|
||||||
void (*finalize) _((struct OpenFile*)); /* finalize proc */
|
void (*finalize) _((struct OpenFile*,int)); /* finalize proc */
|
||||||
} OpenFile;
|
} OpenFile;
|
||||||
|
|
||||||
#define FMODE_READABLE 1
|
#define FMODE_READABLE 1
|
||||||
|
|
2
string.c
2
string.c
|
@ -2613,7 +2613,7 @@ rb_str_split_m(argc, argv, str)
|
||||||
if (!NIL_P(limit) && lim <= ++i) break;
|
if (!NIL_P(limit) && lim <= ++i) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!NIL_P(limit) || RSTRING(str)->len > beg || lim < 0) {
|
if (RSTRING(str)->len > 0 && (!NIL_P(limit) || RSTRING(str)->len > beg || lim < 0)) {
|
||||||
if (RSTRING(str)->len == beg)
|
if (RSTRING(str)->len == beg)
|
||||||
tmp = rb_str_new5(str, 0, 0);
|
tmp = rb_str_new5(str, 0, 0);
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue