summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-08-13 10:31:33 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-08-13 10:31:33 +0000
commitc791dc1345ad8ebe7b707e8922b42a7a43c53b89 (patch)
tree020162add6282afc465081d6675dec75e4c33443 /eval.c
parent855f1ff1323e7eca763b34cc9f7b850dddaa1c0c (diff)
* eval.c (POP_BLOCK): turn on BLOCK_LEFT flag when leaving block.
* eval.c (proc_invoke): unpack return/break destination when block is already left. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4379 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/eval.c b/eval.c
index 2317c8bf95..a03c676068 100644
--- a/eval.c
+++ b/eval.c
@@ -632,6 +632,7 @@ struct BLOCK {
#define BLOCK_DYNAMIC 2
#define BLOCK_ORPHAN 4
#define BLOCK_LAMBDA 8
+#define BLOCK_LEFT 16
static struct BLOCK *ruby_block;
@@ -666,12 +667,13 @@ new_blktag()
_block.block_obj = 0; \
ruby_block = &_block
-#define POP_BLOCK() \
+#define POP_BLOCK() \
if (_block.tag->flags & (BLOCK_DYNAMIC)) \
_block.tag->flags |= BLOCK_ORPHAN; \
else if (!(_block.scope->flags & SCOPE_DONT_RECYCLE)) \
rb_gc_force_recycle((VALUE)_block.tag); \
- ruby_block = _block.prev; \
+ ruby_block = _block.prev; \
+ _block.tag->flags |= BLOCK_LEFT; \
} while (0)
struct RVarmap *ruby_dyna_vars;
@@ -7023,6 +7025,7 @@ proc_invoke(proc, args, self, klass)
if (klass) _block.frame.last_class = klass;
ruby_block = &_block;
+ again:
PUSH_ITER(ITER_CUR);
ruby_frame->iter = ITER_CUR;
PUSH_TAG(PROT_NONE);
@@ -7035,7 +7038,9 @@ proc_invoke(proc, args, self, klass)
POP_ITER();
incoming_state = state;
- if (orphan || ruby_block->tag->dst == state) {
+ if (orphan || pcall ||
+ ((ruby_block->tag->flags & BLOCK_LEFT) &&
+ ruby_block->tag->dst == state)) {
state &= TAG_MASK;
}
ruby_block = old_block;
@@ -8499,7 +8504,7 @@ intersect_fds(src, dst, max)
if (FD_ISSET(i, src)) {
/* Wake up only one thread per fd. */
FD_CLR(i, src);
- ++n;
+ n++;
}
else {
FD_CLR(i, dst);