diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-03-22 07:26:42 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-03-22 07:26:42 +0000 |
commit | 2bd0c2bf73acd0841619f67e3448573e5b6e3064 (patch) | |
tree | 8d1f8bb30c4092ea1c809a0f7bfe65bb0cd94d66 /eval.c | |
parent | 890521d11783ac21503052e2a5f86c4ddfc6a9d8 (diff) | |
download | ruby-2bd0c2bf73acd0841619f67e3448573e5b6e3064.tar.gz |
* the VMS support patch submitted by Akiyoshi, Masamichi
<Masamichi.Akiyoshi@jp.compaq.com> is merged.
* eval.c (exec_under): changing ruby_class is OK, but should not
alter cbase.
* eval.c (yield_under_i): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2258 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 50 |
1 files changed, 15 insertions, 35 deletions
@@ -87,6 +87,10 @@ struct timeval { #include <signal.h> #include <errno.h> +#if defined(__VMS) +#pragma nostandard +#endif + #ifdef HAVE_SYS_SELECT_H #include <sys/select.h> #endif @@ -3110,7 +3114,7 @@ rb_eval(self, n) body = search_method(ruby_class, node->nd_mid, &origin); if (body){ if (RTEST(ruby_verbose) && ruby_class == origin && body->nd_cnt == 0) { - rb_warning("discarding old %s", rb_id2name(node->nd_mid)); + rb_warning("method redefined; discarding old %s", rb_id2name(node->nd_mid)); } if (node->nd_noex) { /* toplevel */ /* should upgrade to rb_warn() if no super was called inside? */ @@ -5106,9 +5110,9 @@ rb_f_eval(argc, argv, self) /* function to call func under the specified class/module context */ static VALUE -exec_under(func, under, args) +exec_under(func, under, cbase, args) VALUE (*func)(); - VALUE under; + VALUE under, cbase; void *args; { VALUE val; /* OK */ @@ -5123,10 +5127,12 @@ exec_under(func, under, args) ruby_frame->last_class = _frame.prev->last_class; ruby_frame->argc = _frame.prev->argc; ruby_frame->argv = _frame.prev->argv; - if (ruby_cbase != under) { - ruby_frame->cbase = (VALUE)rb_node_newnode(NODE_CREF,under,0,ruby_frame->cbase); + if (cbase) { + if (ruby_cbase != cbase) { + ruby_frame->cbase = (VALUE)rb_node_newnode(NODE_CREF,under,0,ruby_frame->cbase); + } + PUSH_CREF(cbase); } - PUSH_CREF(under); mode = scope_vmode; SCOPE_SET(SCOPE_PUBLIC); @@ -5135,7 +5141,7 @@ exec_under(func, under, args) val = (*func)(args); } POP_TAG(); - POP_CREF(); + if (cbase) POP_CREF(); SCOPE_SET(mode); POP_FRAME(); POP_CLASS(); @@ -5170,39 +5176,13 @@ eval_under(under, self, src, file, line) args[1] = src; args[2] = (VALUE)file; args[3] = (VALUE)line; - return exec_under(eval_under_i, under, args); + return exec_under(eval_under_i, under, under, args); } static VALUE yield_under_i(self) VALUE self; { - if (ruby_block->flags & BLOCK_DYNAMIC) { - struct BLOCK * volatile old_block = ruby_block; - struct BLOCK block; - - /* cbase should be pointed from volatile local variable */ - /* to be protected from GC. */ - VALUE result; - int state; - - /* copy the block to avoid modifying global data. */ - block = *ruby_block; - block.frame.cbase = ruby_frame->cbase; - ruby_block = █ - - PUSH_TAG(PROT_NONE); - if ((state = EXEC_TAG()) == 0) { - result = rb_yield_0(self, self, ruby_class, 0); - } - POP_TAG(); - ruby_block = old_block; - if (state) JUMP_TAG(state); - - return result; - } - /* static block, no need to restore */ - ruby_block->frame.cbase = ruby_frame->cbase; return rb_yield_0(self, self, ruby_class, 0); } @@ -5211,7 +5191,7 @@ static VALUE yield_under(under, self) VALUE under, self; { - return exec_under(yield_under_i, under, self); + return exec_under(yield_under_i, under, 0, self); } static VALUE |