* eval.c (block_pass): do not change wrapper information.
* eval.c (rb_yield_0): preserve wrapper information. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1557 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
066cfdc133
commit
604a8f1883
@ -1,3 +1,9 @@
|
|||||||
|
Tue Jul 3 14:56:27 2001 Shugo Maeda <shugo@ruby-lang.org>
|
||||||
|
|
||||||
|
* eval.c (block_pass): do not change wrapper information.
|
||||||
|
|
||||||
|
* eval.c (rb_yield_0): preserve wrapper information.
|
||||||
|
|
||||||
Tue Jul 3 14:49:51 2001 Shugo Maeda <shugo@ruby-lang.org>
|
Tue Jul 3 14:49:51 2001 Shugo Maeda <shugo@ruby-lang.org>
|
||||||
|
|
||||||
* error.c (rb_name_error): raise NameError instead of LoadError.
|
* error.c (rb_name_error): raise NameError instead of LoadError.
|
||||||
|
9
eval.c
9
eval.c
@ -582,6 +582,7 @@ new_blktag()
|
|||||||
_block.vmode = scope_vmode; \
|
_block.vmode = scope_vmode; \
|
||||||
_block.flags = BLOCK_D_SCOPE; \
|
_block.flags = BLOCK_D_SCOPE; \
|
||||||
_block.dyna_vars = ruby_dyna_vars; \
|
_block.dyna_vars = ruby_dyna_vars; \
|
||||||
|
_block.wrapper = ruby_wrapper; \
|
||||||
ruby_block = &_block;
|
ruby_block = &_block;
|
||||||
|
|
||||||
#define POP_BLOCK_TAG(tag) do { \
|
#define POP_BLOCK_TAG(tag) do { \
|
||||||
@ -3605,6 +3606,7 @@ rb_yield_0(val, self, klass, pcall)
|
|||||||
NODE *node;
|
NODE *node;
|
||||||
volatile VALUE result = Qnil;
|
volatile VALUE result = Qnil;
|
||||||
volatile VALUE old_cref;
|
volatile VALUE old_cref;
|
||||||
|
volatile VALUE old_wrapper;
|
||||||
struct BLOCK * volatile block;
|
struct BLOCK * volatile block;
|
||||||
struct SCOPE * volatile old_scope;
|
struct SCOPE * volatile old_scope;
|
||||||
struct FRAME frame;
|
struct FRAME frame;
|
||||||
@ -3623,6 +3625,8 @@ rb_yield_0(val, self, klass, pcall)
|
|||||||
ruby_frame = &(frame);
|
ruby_frame = &(frame);
|
||||||
old_cref = (VALUE)ruby_cref;
|
old_cref = (VALUE)ruby_cref;
|
||||||
ruby_cref = (NODE*)ruby_frame->cbase;
|
ruby_cref = (NODE*)ruby_frame->cbase;
|
||||||
|
old_wrapper = ruby_wrapper;
|
||||||
|
ruby_wrapper = block->wrapper;
|
||||||
old_scope = ruby_scope;
|
old_scope = ruby_scope;
|
||||||
ruby_scope = block->scope;
|
ruby_scope = block->scope;
|
||||||
ruby_block = block->prev;
|
ruby_block = block->prev;
|
||||||
@ -3726,6 +3730,7 @@ rb_yield_0(val, self, klass, pcall)
|
|||||||
ruby_block = block;
|
ruby_block = block;
|
||||||
ruby_frame = ruby_frame->prev;
|
ruby_frame = ruby_frame->prev;
|
||||||
ruby_cref = (NODE*)old_cref;
|
ruby_cref = (NODE*)old_cref;
|
||||||
|
ruby_wrapper = old_wrapper;
|
||||||
if (ruby_scope->flags & SCOPE_DONT_RECYCLE)
|
if (ruby_scope->flags & SCOPE_DONT_RECYCLE)
|
||||||
scope_dup(old_scope);
|
scope_dup(old_scope);
|
||||||
ruby_scope = old_scope;
|
ruby_scope = old_scope;
|
||||||
@ -6515,7 +6520,6 @@ block_pass(self, node)
|
|||||||
int state;
|
int state;
|
||||||
volatile int orphan;
|
volatile int orphan;
|
||||||
volatile int safe = ruby_safe_level;
|
volatile int safe = ruby_safe_level;
|
||||||
volatile VALUE old_wrapper = ruby_wrapper;
|
|
||||||
|
|
||||||
if (NIL_P(block)) {
|
if (NIL_P(block)) {
|
||||||
return rb_eval(self, node->nd_iter);
|
return rb_eval(self, node->nd_iter);
|
||||||
@ -6531,8 +6535,6 @@ block_pass(self, node)
|
|||||||
Data_Get_Struct(block, struct BLOCK, data);
|
Data_Get_Struct(block, struct BLOCK, data);
|
||||||
orphan = blk_orphan(data);
|
orphan = blk_orphan(data);
|
||||||
|
|
||||||
ruby_wrapper = data->wrapper;
|
|
||||||
|
|
||||||
/* PUSH BLOCK from data */
|
/* PUSH BLOCK from data */
|
||||||
old_block = ruby_block;
|
old_block = ruby_block;
|
||||||
_block = *data;
|
_block = *data;
|
||||||
@ -6570,7 +6572,6 @@ block_pass(self, node)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ruby_block = old_block;
|
ruby_block = old_block;
|
||||||
ruby_wrapper = old_wrapper;
|
|
||||||
ruby_safe_level = safe;
|
ruby_safe_level = safe;
|
||||||
|
|
||||||
switch (state) {/* escape from orphan procedure */
|
switch (state) {/* escape from orphan procedure */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user