1
0
Fork 0
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:
matz 2004-11-01 23:53:50 +00:00
parent 7e1850fd5d
commit 9c56a298e8
4 changed files with 68 additions and 90 deletions

View file

@ -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
View file

@ -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
View file

@ -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);

View file

@ -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