Odd break behavior?

Run the code snippet below:

class A
def outer
inner do
break
end
end

def inner
while true
yield
end
puts “Should never appear”
end
end

[‘something’].each do
A.new.outer
puts “1”
end

A.new.outer
puts “2”

Then comment out the something each block and rerun it. The first
run will look like:
1
2

The second run will look like:
Should never appear
2

For consistencies sake, I would have expected the first run to look
like:
1
Should never appear
2

By virtue of previously calling outer in a block the second call to
outer
now has different behavior (even though to me they look totally
unrelated).
Can someone explain why this is?

-Tom

Hi,

In message “Re: Odd break behavior?”
on Sun, 19 Feb 2006 01:40:48 +0900, Thomas E Enebo [email protected]
writes:

| Run the code snippet below:

It seems to be a bug. Thank you for finding it. It’s too complex to
fix it in a minute.

						matz.

On Sun, 19 Feb 2006, Yukihiro M. defenestrated me:

In message “Re: Odd break behavior?”
on Sun, 19 Feb 2006 01:40:48 +0900, Thomas E Enebo [email protected] writes:

| Run the code snippet below:

It seems to be a bug. Thank you for finding it. It’s too complex to
fix it in a minute.

I am trying to determine the proper behavior to fix break in jruby.
Was what I expected the proper behavior?

-Tom

“Y” == Yukihiro M. [email protected] writes:

Y> It seems to be a bug. Thank you for finding it. It’s too complex to
Y> fix it in a minute.

moulon% diff -u eval.c~ eval.c
— eval.c~ 2005-12-20 14:41:47.000000000 +0100
+++ eval.c 2006-02-18 18:46:29.000000000 +0100
@@ -752,7 +752,7 @@
#define BLOCK_LAMBDA 2

static struct BLOCK *ruby_block;
-static unsigned long block_unique = 0;
+static unsigned long block_unique = 1;

#define PUSH_BLOCK(v,b) do {
struct BLOCK _block;
moulon%

no ?

Guy Decoux

Hi,

In message “Re: Odd break behavior?”
on Sun, 19 Feb 2006 02:14:37 +0900, Thomas E Enebo [email protected]
writes:

| I am trying to determine the proper behavior to fix break in jruby.
|Was what I expected the proper behavior?

“break” should always terminate the lexically innermost loop or block.
In this case, invocation of “inner” should have been terminated. A
bug cause termination of while loop (the closest loop in dynamic call
graph) in the definition of “inner” erroneously.

						matz.

Hi,

In message “Re: Odd break behavior?”
on Sun, 19 Feb 2006 03:02:04 +0900, ts [email protected]
writes:

|-static unsigned long block_unique = 0;
|+static unsigned long block_unique = 1;

| no ?

Yes! You must be a genius. Thank you.

						matz.