[#43465] GVL改善案 — KOSAKI Motohiro <kosaki.motohiro@...>
小崎です
[#43467] [Q] thread->interrupt_flag が適切に排他制御されていないように見える — KOSAKI Motohiro <kosaki.motohiro@...>
kosakiです
ささだです.
> ささだです.
ささだです.
> ささだです.
自己解決しました
ささだです.
>> ということは危ないのは RUBY_VM_SET_INTERRUPT() がロストしたときに、タイムアウトなしの
>>> ということは危ないのは RUBY_VM_SET_INTERRUPT() がロストしたときに、タイムアウトなしの
[#43468] Re: [ruby-changes:19438] Ruby:r31478 (trunk): * test/date/*.rb: use skip /w messages. — KOSAKI Motohiro <kosaki.motohiro@...>
2011/5/8 tadf <ko1@atdot.net>:
> 表示したい場合を除いてはskipよりもreturnを使うようお願いしています。
>> 表示したい場合を除いてはskipよりもreturnを使うようお願いしています。
[#43476] [Ruby 1.9 - Feature #4653][Open] [PATCH 1/1] new method Enumerable#rude_map — Shyouhei Urabe <shyouhei@...>
遠藤です。
(05/08/2011 11:21 PM), Yusuke ENDOH wrote:
遠藤です。
卜部です。
At Mon, 9 May 2011 16:35:31 +0900,
遠藤です。
[#43493] [Ruby 1.9 - Feature #4657][Open] add option to hide skip messages on unit/test — Shota Fukumori <sorah@...>
> -q, --hide-skipでskipメッセージが表示されなくなります。
(05/09/2011 06:31 PM), Shota Fukumori wrote:
> (05/09/2011 06:31 PM), Shota Fukumori wrote:
2011/5/9 KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>:
> 2011/5/9 KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>:
[#43502] draft schedule of Ruby 1.9.3 — "Yuki Sonoda (Yugui)" <yugui@...>
-----BEGIN PGP SIGNED MESSAGE-----
Hi
Hello,
(ruby-coreはずしました)
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
[#43549] RubyKaigi2011に'CRuby'コミッタの皆さまを招待いたします(締切:2011-06-15) — Kakutani Shintaro <shintaro.kakutani@...>
'CRuby'コミッタの皆さまへ
[#43554] [Ruby 1.9 - Bug #4696][Assigned] thread.c#lock_func() が spurious wakeup unsafe — Motohiro KOSAKI <kosaki.motohiro@...>
[#43606] [Ruby 1.9 - Bug #4808][Open] thread_wait_for() eats 100% of CPU power — Hidetoshi Nagai <nagai@...>
> いつからかは把握できていませんが (少なくとも 1.9.2p0 では発生しません),
[ruby-dev:43551] yieldされたlambdaからのreturn/breakの動きについて
辻本です。
lambdaとprocは、return/breakの動きと引数の数のチェックの動きに違いがありますが、
ブロックとして渡したlambdaをyieldで呼び出すとreturn/breakがproc相当になります
(引数チェックはlambda相当のままです)。これは意図された挙動でしょうか。
# ruby -v : ruby 1.9.3dev (2011-05-14 trunk 31568) [x86_64-linux]
def f
g(&->{return 0}) # breakについても同様
1
end
def g
yield
end
p f #=> 0
なお、vm_invoke_blockで無条件にBLOCKフレームを積んでいるのが原因なので、
ブロックの種類に応じてLAMBDAフレームを積むようにすれば上記のコードで1が返るようになります。
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 3398b95..4f98b08 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -930,15 +930,17 @@ vm_invoke_block(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_num_t num, rb_n
if (BUILTIN_TYPE(iseq) != T_NODE) {
int opt_pc;
const int arg_size = iseq->arg_size;
+ int is_lambda = block_proc_is_lambda(block->proc);
VALUE * const rsp = GET_SP() - argc;
SET_SP(rsp);
CHECK_STACK_OVERFLOW(GET_CFP(), iseq->stack_max);
opt_pc = vm_yield_setup_args(th, iseq, argc, rsp, 0,
- block_proc_is_lambda(block->proc));
+ is_lambda);
vm_push_frame(th, iseq,
- VM_FRAME_MAGIC_BLOCK, block->self, (VALUE) block->dfp,
+ is_lambda ? VM_FRAME_MAGIC_LAMBDA : VM_FRAME_MAGIC_BLOCK,
+ block->self, (VALUE) block->dfp,
iseq->iseq_encoded + opt_pc, rsp + arg_size, block->lfp,
iseq->local_size - arg_size);
diff --git a/bootstraptest/test_proc.rb b/bootstraptest/test_proc.rb
index 28a2377..c3ed8e3 100644
--- a/bootstraptest/test_proc.rb
+++ b/bootstraptest/test_proc.rb
@@ -429,3 +429,22 @@ assert_equal 'ok', %q{
raise "ok"
}
+assert_equal 'ok', %q{
+ def m
+ yield
+ :ok
+ end
+ m(&lambda{
+ return :ng
+ })
+}
+
+assert_equal 'ok', %q{
+ def m
+ yield
+ :ok
+ end
+ m(&lambda{
+ break :ng
+ })
+}
--
Kazuki Tsujimoto