mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* eval.c (proc_invoke): nail down dyna_var node when Proc object
or continuation is created. [ruby-dev:24671] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7175 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7e1850fd5d
commit
9c56a298e8
4 changed files with 68 additions and 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.
|
||||
|
|
59
eval.c
59
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) {
|
||||
|
|
88
io.c
88
io.c
|
@ -462,9 +462,11 @@ io_write(io, str)
|
|||
rb_io_check_writable(fptr);
|
||||
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";
|
||||
}
|
||||
return rb_io_popen(str, argc, argv, klass);
|
||||
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(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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue