1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* io.c (rb_io_readlines): avoid calling GetOpenFile() repeatedly.

* io.c (rb_io_each_line): ditto.

* io.c (argf_getline): ditto.

* process.c: should include <time.h> to get proper CLK_TCK.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2049 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2002-02-06 07:30:13 +00:00
parent 6bebc82c03
commit d77119bfe4
5 changed files with 145 additions and 91 deletions

View file

@ -5,6 +5,16 @@ Wed Feb 6 13:28:53 2002 Amos Gouaux <amos+ruby@utdallas.edu>
* lib/net/imap.rb (setquota): unset quota if the second argument * lib/net/imap.rb (setquota): unset quota if the second argument
is nil. is nil.
Wed Feb 6 13:05:11 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* io.c (rb_io_readlines): avoid calling GetOpenFile() repeatedly.
* io.c (rb_io_each_line): ditto.
* io.c (argf_getline): ditto.
* process.c: should include <time.h> to get proper CLK_TCK.
Wed Feb 6 02:10:30 2002 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp> Wed Feb 6 02:10:30 2002 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* io.c (fptr_finalize): ignore EBADF when f and f2 use same * io.c (fptr_finalize): ignore EBADF when f and f2 use same

8
eval.c
View file

@ -4669,10 +4669,12 @@ rb_call(klass, recv, mid, argc, argv, scope)
/* self must be kind of a specified form for private method */ /* self must be kind of a specified form for private method */
if ((noex & NOEX_PROTECTED)) { if ((noex & NOEX_PROTECTED)) {
if (TYPE(klass) == T_ICLASS) { VALUE defined_class = klass;
klass = RBASIC(klass)->klass;
if (TYPE(defined_class) == T_ICLASS) {
defined_class = RBASIC(defined_class)->klass;
} }
if (!rb_obj_is_kind_of(ruby_frame->self, rb_class_real(klass))) if (!rb_obj_is_kind_of(ruby_frame->self, rb_class_real(defined_class)))
return rb_undefined(recv, mid, argc, argv, CSTAT_PROT); return rb_undefined(recv, mid, argc, argv, CSTAT_PROT);
} }
} }

212
io.c
View file

@ -534,7 +534,6 @@ io_fread(ptr, len, f)
switch (errno) { switch (errno) {
case EINTR: case EINTR:
continue; continue;
case EAGAIN: case EAGAIN:
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN #if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
case EWOULDBLOCK: case EWOULDBLOCK:
@ -650,32 +649,78 @@ io_read(argc, argv, io)
} }
static VALUE static VALUE
rb_io_gets_internal(argc, argv, io) rb_io_getline_fast(fptr)
int argc;
VALUE *argv;
VALUE io;
{
OpenFile *fptr; OpenFile *fptr;
{
FILE *f = fptr->f;
VALUE str = Qnil;
int c;
char buf[8192];
char *bp, *bpe = buf + sizeof buf - 3;
int cnt;
int append = 0;
again:
bp = buf;
for (;;) {
READ_CHECK(f);
TRAP_BEG;
c = getc(f);
TRAP_END;
if (c == EOF) {
if (ferror(f)) {
if (errno == EINTR) continue;
rb_sys_fail(fptr->path);
}
break;
}
if ((*bp++ = c) == '\n') break;
if (bp == bpe) break;
}
cnt = bp - buf;
if (c == EOF && !append && cnt == 0) {
str = Qnil;
goto return_gets;
}
if (append)
rb_str_cat(str, buf, cnt);
else
str = rb_str_new(buf, cnt);
if (c != EOF && RSTRING(str)->ptr[RSTRING(str)->len-1] != '\n') {
append = 1;
goto again;
}
return_gets:
if (!NIL_P(str)) {
fptr->lineno++;
lineno = INT2FIX(fptr->lineno);
OBJ_TAINT(str);
}
return str;
}
static VALUE
rb_io_getline(rs, fptr)
VALUE rs;
OpenFile *fptr;
{
FILE *f; FILE *f;
VALUE str = Qnil; VALUE str = Qnil;
int c, newline; int c, newline;
char *rsptr; char *rsptr;
int rslen, rspara = 0; int rslen, rspara = 0;
VALUE rs;
if (argc == 0) {
rs = rb_rs;
}
else {
rb_scan_args(argc, argv, "1", &rs);
}
if (NIL_P(rs)) { if (NIL_P(rs)) {
rsptr = 0; rsptr = 0;
rslen = 0; rslen = 0;
} }
else if (rs == rb_default_rs) { else if (rs == rb_default_rs) {
return rb_io_gets(io); return rb_io_getline_fast(fptr);
} }
else { else {
StringValue(rs); StringValue(rs);
@ -686,17 +731,14 @@ rb_io_gets_internal(argc, argv, io)
rspara = 1; rspara = 1;
} }
else if (rslen == 1 && RSTRING(rs)->ptr[0] == '\n') { else if (rslen == 1 && RSTRING(rs)->ptr[0] == '\n') {
return rb_io_gets(io); return rb_io_getline_fast(fptr);
} }
else { else {
rsptr = RSTRING(rs)->ptr; rsptr = RSTRING(rs)->ptr;
} }
} }
GetOpenFile(io, fptr);
rb_io_check_readable(fptr);
f = fptr->f; f = fptr->f;
if (rspara) { if (rspara) {
do { do {
READ_CHECK(f); READ_CHECK(f);
@ -797,60 +839,10 @@ rb_io_gets(io)
VALUE io; VALUE io;
{ {
OpenFile *fptr; OpenFile *fptr;
FILE *f;
VALUE str = Qnil;
int c;
char buf[8192];
char *bp, *bpe = buf + sizeof buf - 3;
int cnt;
int append = 0;
GetOpenFile(io, fptr); GetOpenFile(io, fptr);
rb_io_check_readable(fptr); rb_io_check_readable(fptr);
f = fptr->f; return rb_io_getline_fast(fptr);
again:
bp = buf;
for (;;) {
READ_CHECK(f);
TRAP_BEG;
c = getc(f);
TRAP_END;
if (c == EOF) {
if (ferror(f)) {
if (errno == EINTR) continue;
rb_sys_fail(fptr->path);
}
break;
}
if ((*bp++ = c) == '\n') break;
if (bp == bpe) break;
}
cnt = bp - buf;
if (c == EOF && !append && cnt == 0) {
str = Qnil;
goto return_gets;
}
if (append)
rb_str_cat(str, buf, cnt);
else
str = rb_str_new(buf, cnt);
if (c != EOF && RSTRING(str)->ptr[RSTRING(str)->len-1] != '\n') {
append = 1;
goto again;
}
return_gets:
if (!NIL_P(str)) {
fptr->lineno++;
lineno = INT2FIX(fptr->lineno);
OBJ_TAINT(str);
}
return str;
} }
static VALUE static VALUE
@ -859,7 +851,18 @@ rb_io_gets_m(argc, argv, io)
VALUE *argv; VALUE *argv;
VALUE io; VALUE io;
{ {
VALUE str = rb_io_gets_internal(argc, argv, io); VALUE rs, str;
OpenFile *fptr;
if (argc == 0) {
rs = rb_rs;
}
else {
rb_scan_args(argc, argv, "1", &rs);
}
GetOpenFile(io, fptr);
rb_io_check_readable(fptr);
str = rb_io_getline(rs, fptr);
if (!NIL_P(str)) { if (!NIL_P(str)) {
rb_lastline_set(str); rb_lastline_set(str);
@ -936,9 +939,19 @@ rb_io_readlines(argc, argv, io)
VALUE io; VALUE io;
{ {
VALUE line, ary; VALUE line, ary;
VALUE rs, str;
OpenFile *fptr;
if (argc == 0) {
rs = rb_rs;
}
else {
rb_scan_args(argc, argv, "1", &rs);
}
GetOpenFile(io, fptr);
rb_io_check_readable(fptr);
ary = rb_ary_new(); ary = rb_ary_new();
while (!NIL_P(line = rb_io_gets_internal(argc, argv, io))) { while (!NIL_P(line = rb_io_getline(rs, fptr))) {
rb_ary_push(ary, line); rb_ary_push(ary, line);
} }
return ary; return ary;
@ -951,8 +964,18 @@ rb_io_each_line(argc, argv, io)
VALUE io; VALUE io;
{ {
VALUE str; VALUE str;
OpenFile *fptr;
VALUE rs;
while (!NIL_P(str = rb_io_gets_internal(argc, argv, io))) { if (argc == 0) {
rs = rb_rs;
}
else {
rb_scan_args(argc, argv, "1", &rs);
}
GetOpenFile(io, fptr);
rb_io_check_readable(fptr);
while (!NIL_P(str = rb_io_getline(rs, fptr))) {
rb_yield(str); rb_yield(str);
} }
return io; return io;
@ -2665,7 +2688,7 @@ any_close(file)
} }
static VALUE static VALUE
rb_f_gets_internal(argc, argv) argf_getline(argc, argv)
int argc; int argc;
VALUE *argv; VALUE *argv;
{ {
@ -2680,7 +2703,18 @@ rb_f_gets_internal(argc, argv)
line = rb_io_gets(current_file); line = rb_io_gets(current_file);
} }
else { else {
line = rb_io_gets_internal(argc, argv, current_file); VALUE rs;
OpenFile *fptr;
if (argc == 0) {
rs = rb_rs;
}
else {
rb_scan_args(argc, argv, "1", &rs);
}
GetOpenFile(current_file, fptr);
rb_io_check_readable(fptr);
line = rb_io_getline(rs, fptr);
} }
if (NIL_P(line) && next_p != -1) { if (NIL_P(line) && next_p != -1) {
any_close(current_file); any_close(current_file);
@ -2698,7 +2732,7 @@ rb_f_gets(argc, argv)
int argc; int argc;
VALUE *argv; VALUE *argv;
{ {
VALUE line = rb_f_gets_internal(argc, argv); VALUE line = argf_getline(argc, argv);
rb_lastline_set(line); rb_lastline_set(line);
return line; return line;
@ -2759,7 +2793,7 @@ rb_f_readlines(argc, argv)
VALUE line, ary; VALUE line, ary;
ary = rb_ary_new(); ary = rb_ary_new();
while (!NIL_P(line = rb_f_gets_internal(argc, argv))) { while (!NIL_P(line = argf_getline(argc, argv))) {
rb_ary_push(ary, line); rb_ary_push(ary, line);
} }
@ -3178,6 +3212,7 @@ struct foreach_arg {
int argc; int argc;
VALUE sep; VALUE sep;
VALUE io; VALUE io;
OpenFile *fptr;
}; };
static VALUE static VALUE
@ -3186,28 +3221,33 @@ io_s_foreach(arg)
{ {
VALUE str; VALUE str;
while (!NIL_P(str = rb_io_gets_internal(arg->argc, &arg->sep, arg->io))) { while (!NIL_P(str = rb_io_getline(arg->sep, arg->fptr))) {
rb_yield(str); rb_yield(str);
} }
return Qnil; return Qnil;
} }
static VALUE static VALUE
rb_io_s_foreach(argc, argv, io) rb_io_s_foreach(argc, argv)
int argc; int argc;
VALUE *argv; VALUE *argv;
VALUE io;
{ {
VALUE fname; VALUE fname, io;
OpenFile *fptr;
struct foreach_arg arg; struct foreach_arg arg;
rb_scan_args(argc, argv, "11", &fname, &arg.sep); rb_scan_args(argc, argv, "11", &fname, &arg.sep);
SafeStringValue(fname); SafeStringValue(fname);
arg.argc = argc - 1; if (argc == 1) {
arg.io = rb_io_open(RSTRING(fname)->ptr, "r"); arg.sep = rb_default_rs;
if (NIL_P(arg.io)) return Qnil; }
return rb_ensure(io_s_foreach, (VALUE)&arg, rb_io_close, arg.io); io = rb_io_open(RSTRING(fname)->ptr, "r");
if (NIL_P(io)) return Qnil;
GetOpenFile(io, fptr);
arg.fptr = fptr;
return rb_ensure(io_s_foreach, (VALUE)&arg, rb_io_close, io);
} }
static VALUE static VALUE
@ -3435,7 +3475,7 @@ argf_each_line(argc, argv)
{ {
VALUE str; VALUE str;
while (RTEST(str = rb_f_gets_internal(argc, argv))) { while (RTEST(str = argf_getline(argc, argv))) {
rb_yield(str); rb_yield(str);
} }
return argf; return argf;

View file

@ -20,6 +20,8 @@
#ifdef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H
#include <unistd.h> #include <unistd.h>
#endif #endif
#include <time.h>
#ifndef NT #ifndef NT
#ifdef HAVE_SYS_TIME_H #ifdef HAVE_SYS_TIME_H
# include <sys/time.h> # include <sys/time.h>

View file

@ -1,4 +1,4 @@
#define RUBY_VERSION "1.7.2" #define RUBY_VERSION "1.7.2"
#define RUBY_RELEASE_DATE "2002-02-05" #define RUBY_RELEASE_DATE "2002-02-06"
#define RUBY_VERSION_CODE 172 #define RUBY_VERSION_CODE 172
#define RUBY_RELEASE_CODE 20020205 #define RUBY_RELEASE_CODE 20020206