diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | eval.c | 59 | ||||
-rw-r--r-- | io.c | 88 | ||||
-rw-r--r-- | lib/cgi.rb | 2 |
4 files changed, 68 insertions, 90 deletions
@@ -1,3 +1,8 @@ +Tue Nov 2 01:20:09 2004 Yukihiro Matsumoto <matz@ruby-lang.org> + + * eval.c (proc_invoke): nail down dyna_var node when Proc object + or continuation is created. [ruby-dev:24671] + Mon Nov 1 13:59:28 2004 WATANABE Hirofumi <eban@ruby-lang.org> * ext/extmk.rb (MANIFEST): do not use anymore, use extconf.rb instead. @@ -9,6 +14,10 @@ Mon Nov 1 13:59:28 2004 WATANABE Hirofumi <eban@ruby-lang.org> * README.EXT, README.EXT.ja: remove MANIFEST stuff. +Mon Nov 1 01:14:52 2004 Yukihiro Matsumoto <matz@ruby-lang.org> + + * io.c (rb_f_open): create copy of popen specifier. [ruby-dev:24656] + Mon Nov 1 00:36:48 2004 WATANABE Hirofumi <eban@ruby-lang.org> * main.c (_stklen): move to gc.c. @@ -412,7 +412,6 @@ rb_get_method_body(klassp, idp, noexp) if (ruby_running) { /* store in cache */ - if (BUILTIN_TYPE(origin) == T_ICLASS) origin = RBASIC(origin)->klass; ent = cache + EXPR1(klass, id); ent->klass = klass; ent->noex = body->nd_noex; @@ -2170,18 +2169,6 @@ arg_defined(self, node, buf, type) return type; } -static VALUE -search_iclass(self, klass) - VALUE self, klass; -{ - VALUE k = CLASS_OF(self); - - while (k && !(BUILTIN_TYPE(k) == T_ICLASS && RBASIC(k)->klass == klass)) { - k = RCLASS(k)->super; - } - return k; -} - static char* is_defined(self, node, buf) VALUE self; @@ -2199,10 +2186,6 @@ is_defined(self, node, buf) if (ruby_frame->orig_func == 0) return 0; else if (ruby_frame->last_class == 0) return 0; val = ruby_frame->last_class; - if (BUILTIN_TYPE(val) == T_MODULE) { - val = search_iclass(self, val); - if (!val) return 0; - } if (rb_method_boundp(RCLASS(val)->super, ruby_frame->orig_func, 0)) { if (nd_type(node) == NODE_SUPER) { return arg_defined(self, node->nd_args, buf, "super"); @@ -5861,20 +5844,6 @@ rb_call_super(argc, argv) self = ruby_frame->self; klass = ruby_frame->last_class; - if (BUILTIN_TYPE(klass) == T_MODULE) { - k = search_iclass(self, klass); - if (!k) { - rb_raise(rb_eTypeError, "%s is not included in %s", - rb_class2name(klass), - rb_class2name(CLASS_OF(self))); - } - if (RCLASS(k)->super == 0) { - rb_name_error(ruby_frame->last_func, - "super: no superclass method `%s'", - rb_id2name(ruby_frame->last_func)); - } - klass = k; - } PUSH_ITER(ruby_iter->iter ? ITER_PRE : ITER_NOT); result = rb_call(RCLASS(klass)->super, self, ruby_frame->orig_func, argc, argv, 3); @@ -6628,7 +6597,21 @@ int rb_provided(feature) const char *feature; { - return rb_feature_p(feature, 0, Qfalse) ? Qtrue : Qfalse; + int i; + char *buf; + + if (rb_feature_p(feature, 0, Qfalse)) + return Qtrue; + if (!loading_tbl) return Qfalse; + if (st_lookup(loading_tbl, (st_data_t)feature, 0)) return Qtrue; + buf = ALLOCA_N(char, strlen(feature)+8); + strcpy(buf, feature); + for (i=0; ; i++) { + if (!loadable_ext[i]) break; + strcpy(buf+strlen(feature), loadable_ext[i]); + if (st_lookup(loading_tbl, (st_data_t)buf, 0)) return Qtrue; + } + return Qfalse; } static void @@ -8099,7 +8082,6 @@ proc_invoke(proc, args, self, klass) int state; volatile int safe = ruby_safe_level; volatile VALUE old_wrapper = ruby_wrapper; - struct RVarmap * volatile old_dvars = ruby_dyna_vars; volatile int pcall, avalue = Qtrue; if (rb_block_given_p() && ruby_frame->last_func) { @@ -8117,6 +8099,7 @@ proc_invoke(proc, args, self, klass) args = RARRAY(args)->ptr[0]; } + PUSH_VARS(); ruby_wrapper = data->wrapper; ruby_dyna_vars = data->dyna_vars; /* PUSH BLOCK from data */ @@ -8141,15 +8124,7 @@ proc_invoke(proc, args, self, klass) POP_ITER(); ruby_block = old_block; ruby_wrapper = old_wrapper; - if (FL_TEST(ruby_dyna_vars, DVAR_DONT_RECYCLE)) { - struct RVarmap *vars; - - for (vars = old_dvars; vars; vars = vars->next) { - if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break; - FL_SET(vars, DVAR_DONT_RECYCLE); - } - } - ruby_dyna_vars = old_dvars; + POP_VARS(); ruby_safe_level = safe; switch (state) { @@ -463,8 +463,10 @@ io_write(io, str) f = GetWriteFile(fptr); rb_str_locktmp(str); + rb_str_locktmp(str); n = rb_io_fwrite(RSTRING(str)->ptr, RSTRING(str)->len, f); rb_str_unlocktmp(str); + rb_str_unlocktmp(str); if (n == -1L) rb_sys_fail(fptr->path); if (fptr->mode & FMODE_SYNC) { io_fflush(f, fptr); @@ -2580,16 +2582,20 @@ rb_io_unbuffered(fptr) rb_io_synchronized(fptr); } +static VALUE pipe_open(VALUE pstr, char *pname, char *mode); + static VALUE -pipe_open(pname, mode) +pipe_open(pstr, pname, mode) + VALUE pstr; char *pname, *mode; { int modef = rb_io_mode_flags(mode); OpenFile *fptr; + if (!pname) pname = StringValuePtr(pstr); #if defined(DJGPP) || defined(__human68k__) || defined(__VMS) FILE *f = popen(pname, mode); - + if (!f) rb_sys_fail(pname); else { VALUE port = io_alloc(rb_cIO); @@ -2728,44 +2734,6 @@ retry: #endif } -static VALUE -rb_io_popen(str, argc, argv, klass) - char *str; - int argc; - VALUE *argv; - VALUE klass; -{ - char *mode; - VALUE pname, pmode, port; - - if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) { - mode = "r"; - } - else if (FIXNUM_P(pmode)) { - mode = rb_io_modenum_mode(FIX2INT(pmode)); - } - else { - mode = rb_io_flags_mode(rb_io_mode_flags(StringValuePtr(pmode))); - } - SafeStringValue(pname); - port = pipe_open(str, mode); - if (NIL_P(port)) { - /* child */ - if (rb_block_given_p()) { - rb_yield(Qnil); - fflush(stdout); - fflush(stderr); - _exit(0); - } - return Qnil; - } - RBASIC(port)->klass = klass; - if (rb_block_given_p()) { - return rb_ensure(rb_yield, port, io_close, port); - } - return port; -} - /* * call-seq: * IO.popen(cmd_string, mode="r" ) => io @@ -2813,12 +2781,35 @@ rb_io_s_popen(argc, argv, klass) VALUE *argv; VALUE klass; { - char *str = 0; + char *mode; + VALUE pname, pmode, port; - if (argc >= 1) { - str = StringValuePtr(argv[0]); + if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) { + mode = "r"; + } + else if (FIXNUM_P(pmode)) { + mode = rb_io_modenum_mode(FIX2INT(pmode)); + } + else { + mode = rb_io_flags_mode(rb_io_mode_flags(StringValuePtr(pmode))); } - return rb_io_popen(str, argc, argv, klass); + SafeStringValue(pname); + port = pipe_open(pname, 0, mode); + if (NIL_P(port)) { + /* child */ + if (rb_block_given_p()) { + rb_yield(Qnil); + fflush(stdout); + fflush(stderr); + _exit(0); + } + return Qnil; + } + RBASIC(port)->klass = klass; + if (rb_block_given_p()) { + return rb_ensure(rb_yield, port, io_close, port); + } + return port; } static VALUE @@ -3010,7 +3001,10 @@ rb_f_open(argc, argv) char *str = StringValuePtr(argv[0]); if (str[0] == '|') { - return rb_io_popen(str+1, argc, argv, rb_cIO); + VALUE tmp = rb_str_new(str+1, RSTRING(tmp)->len-1); + OBJ_INFECT(tmp, argv[0]); + argv[0] = tmp; + return rb_io_s_popen(argc, argv, rb_cIO); } } return rb_io_s_open(argc, argv, rb_cFile); @@ -3021,7 +3015,7 @@ rb_io_open(fname, mode) char *fname, *mode; { if (fname[0] == '|') { - return pipe_open(fname+1, mode); + return pipe_open(0, fname+1, mode); } else { return rb_file_open(fname, mode); @@ -4218,7 +4212,7 @@ rb_f_backquote(obj, str) OpenFile *fptr; SafeStringValue(str); - port = pipe_open(RSTRING(str)->ptr, "r"); + port = pipe_open(str, 0, "r"); if (NIL_P(port)) return rb_str_new(0,0); GetOpenFile(port, fptr); diff --git a/lib/cgi.rb b/lib/cgi.rb index b68ee803ee..0fd0bc7cd4 100644 --- a/lib/cgi.rb +++ b/lib/cgi.rb @@ -1023,7 +1023,7 @@ class CGI content_length -= c.size end - buf = buf.sub(/\A((?:.|\n)*?)(?:#{EOL})?#{boundary}(#{EOL}|#{LF}|--)/n) do + buf = buf.sub(/\A((?:.|\n)*?)(?:[\r\n]{1,2})?#{boundary}([\r\n]{1,2}|--)/n) do body.print $1 if "--" == $2 content_length = -1 |