[#41431] [ruby-trunk - Bug #5694][Open] Proc#arity doesn't take optional arguments into account. — Marc-Andre Lafortune <ruby-core@...>

27 messages 2011/12/01
[#41442] [ruby-trunk - Bug #5694] Proc#arity doesn't take optional arguments into account. — Thomas Sawyer <transfire@...> 2011/12/01

[#41443] Re: [ruby-trunk - Bug #5694] Proc#arity doesn't take optional arguments into account. — Yehuda Katz <wycats@...> 2011/12/01

Maybe we can add a new arity_range method that does this?

[#41496] [ruby-trunk - Bug #5714][Open] Unexpected error of STDIN#read with non-ascii input on Windows XP — Heesob Park <phasis@...>

22 messages 2011/12/06

[#41511] [ruby-trunk - Bug #5719][Open] Hash::[] can't handle 100000+ args — Nick Quaranto <nick@...>

13 messages 2011/12/07

[#41557] [ruby-trunk - Bug #5730][Open] Optinal block parameters assigns wrong — Yukihiro Matsumoto <matz@...>

14 messages 2011/12/08

[#41586] [ruby-trunk - Feature #5741][Open] Secure Erasure of Passwords — Martin Bosslet <Martin.Bosslet@...>

17 messages 2011/12/10

[#41672] [ruby-trunk - Feature #5767][Open] Cache expanded_load_path to reduce startup time — Yura Sokolov <funny.falcon@...>

13 messages 2011/12/15

[#41681] Documentation of the language itself (syntax, meanings, etc) — Rodrigo Rosenfeld Rosas <rr.rosas@...>

Since Ruby is built on top of simple concepts, most of the documentation

23 messages 2011/12/15
[#41683] Re: Documentation of the language itself (syntax, meanings, etc) — Gary Wright <gwtmp01@...> 2011/12/15

[#41686] Re: Documentation of the language itself (syntax, meanings, etc) — Rodrigo Rosenfeld Rosas <rr.rosas@...> 2011/12/16

Em 15-12-2011 19:23, Gary Wright escreveu:

[#41717] Feature : optional argument in File.join — Michel Demazure <michel@...>

In Windows, when using File.join, one often ends with a path containing

13 messages 2011/12/19
[#41719] Re: Feature : optional argument in File.join — Luis Lavena <luislavena@...> 2011/12/19

On Mon, Dec 19, 2011 at 6:09 AM, Michel Demazure <michel@demazure.com> wrot=

[#41720] Re: Feature : optional argument in File.join — Michel Demazure <michel@...> 2011/12/19

Luis Lavena wrote in post #1037331:

[#41728] [ruby-trunk - Feature #5781][Open] Query attributes (attribute methods ending in `?` mark) — Thomas Sawyer <transfire@...>

15 messages 2011/12/19

[#41799] Best way to separate implementation specific code? — Luis Lavena <luislavena@...>

Hello,

15 messages 2011/12/24
[#41800] Re: Best way to separate implementation specific code? — KOSAKI Motohiro <kosaki.motohiro@...> 2011/12/24

2011/12/24 Luis Lavena <luislavena@gmail.com>:

[#41811] Re: Best way to separate implementation specific code? — "U.Nakamura" <usa@...> 2011/12/26

Hello,

[#41817] Re: Best way to separate implementation specific code? — Luis Lavena <luislavena@...> 2011/12/26

On Sun, Dec 25, 2011 at 10:51 PM, U.Nakamura <usa@garbagecollect.jp> wrote:

[#41812] [ruby-trunk - Feature #5809][Open] Benchmark#bm: remove the label_width parameter — Benoit Daloze <redmine@...>

11 messages 2011/12/26

[ruby-core:41788] Re: Breaking while loading

From: Satoshi Shiba <shiba@...>
Date: 2011-12-23 06:17:57 UTC
List: ruby-core #41788
Hi

I can't judge whether this is a bug for Ruby runtime or not.
However, I can show reasons why LocalJumpError has occurred.

Reasons why LocalJumpError has occurred are consisting of followings.

1:"break" in proc objects cause LocalJumpError.
2:In your example, $block in A#enum is a proc object
   and $block in A#enum causes "break".

In your example, A#each supposes that &block is a given block to 
Enumerable#take_while. But &block is not a given block to 
Enumerable#take_while.

In your example, &block is "take_while_i" which is internal C function 
of Enumerable#take_while. "take_while_i" is following C function.

/*----------------------------------------------------------*/
static VALUE
take_while_i(VALUE i, VALUE *ary, int argc, VALUE *argv)
{
     if (!RTEST(enum_yield(argc, argv))) rb_iter_break();
     rb_ary_push(*ary, enum_values_pack(argc, argv));
     return Qnil;
}
/*----------------------------------------------------------*/

"take_while_i" consists of following steps.

1: Invokes given block
    (in your example, given block is {|i| i < 3}).
2: Checks a return value of given block.
3: If a return value of given block is "false or nil",
    breaks iteration using "rb_iter_break".
4: If a return value of given block is not "false and nil",
    continues iteration.

$block.call(3) calls "take_while_i", and "take_while_i" calls {|i| i < 
3}. When "i" is 3, {|i| i < 3} returns "false". So, "take_while_i" calls 
"rb_iter_break" to stop iteration. Moreover, "rb_iter_break" throws 
LocalJumpError, because "break" in proc objects cause LocalJumpError.

Nikolai Weibull wrote:
> Hi!
> 
> Here’s a problem that I’m not surprised hasn’t come up before.
> Breaking an iteration from inside a load raises LocalJumpError.
> 
> Is this a bug?
> 
> If not, how do I work around it?
> 
> b.rb:
> $block.call 1
> $block.call 2
> $block.call 3
> 
> class A
>   include Enumerable
> 
>   def each(&block)
>     $block = block
>     load 'b.rb', true
>     self
>   end
> end
> 
> p A.new.take_while{ |i| i < 3 }
> 
> % ruby -v
> ruby 1.9.3p0 (2011-10-30 revision 33569) [x86_64-darwin10.8.0]
> % ruby -w a.rb
> a.rb:22:in `load': unexpected break (LocalJumpError)
>         from a.rb:22:in `each'
>         from a.rb:27:in `take_while'
>         from a.rb:27:in `<main>'
> 
> 
> 
> 

In This Thread