On Jul 10, 2009, at 12:44 PM, Perry Smith wrote:
On Jul 10, 2009, at 1:58 PM, Laurent Sansonetti wrote:
Indeed, raising an exception is very slow for us since we use C++ exceptions, but it's only used in exceptional cases, or in very explicit use cases like returning from a block (the other return statements don't use an exception). Also the new runtime in the upcoming version of Mac OS X seems to be faster.
I'm not sure we are both on the same page yet.
In your examples:
1.times { p 42 }
after the "p 42" there is a return. Perhaps not a return statement but a return. Also, there is no ensure and no way to put an ensure in without a "begin / end" pair.
In this example there is obviously no return statement, so it will be cheap. The block value or the break statement don't use this mechanism.
So, what I'm suggesting is to make:
begin foo return here rescue dog end
be the special case. Not:
1.times { return 18 }
I'm guessing that is what you are doing but I wasn't sure.
What about the following: def foo 1.times { return 42 } p :nok end foo In this case, you need a way to return the current method from the block to not execute the "p :nok" expression. Unwinding the stack is a way to implement this. Now, consider: def foo begin yield ensure p :ok end end def bar foo { return 42 } end p bar Here you don't have a choice, since you need to honor the ensure block. In Ruby, return is semantically similar to an exception in some cases. This is unfortunate :-) Laurent