summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--eval.c59
-rw-r--r--io.c88
-rw-r--r--lib/cgi.rb2
4 files changed, 68 insertions, 90 deletions
diff --git a/ChangeLog b/ChangeLog
index 159272cf3a..78637076d8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/eval.c b/eval.c
index be4cb91d65..043f349bbd 100644
--- a/eval.c
+++ b/eval.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) {
diff --git a/io.c b/io.c
index 3a8edcc4c8..7f104f1e8a 100644
--- a/io.c
+++ b/io.c
@@ -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