[#34909] Kernel#evalの第2引数 — KURODA Hiraku <hiraku@...>
こんにちは、黒田ひらくと申します。
[#34911] erb still treats $KCODE — "Yusuke ENDOH" <mame@...>
遠藤です。
咳といいます。
まつもと ゆきひろです
永井@知能.九工大です.
[#34923] open() and encodings — "NARUSE, Yui" <naruse@...>
成瀬です。
まつもと ゆきひろです
成瀬です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
永井@知能.九工大です.
こんにちは、なかむら(う)です。
In article <[email protected]>,
永井@知能.九工大です.
成瀬です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
[#34938] Ruby1.8.7 で Rails2.0.2 が動かない — okkez <okkez000@...>
okkez です。
[#34979] [Bug:ruby 1.9] cannot open file with big mode value — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#34990] [Bug:1.9] Rational("355/113") clear $& — Tanaka Akira <akr@...>
以下のように、Rational("355/113") とすると $& が nil になり
> 以下のように、Rational("355/113") とすると $& が nil になり
ワナベと申します。
[#34997] Re: [ruby-changes:5517] Ruby:r17021 (trunk): * vm_insnhelper.c, vm.c, proc.c (proc_call): allow call method with — SASADA Koichi <ko1@...>
ささだです.
まつもと ゆきひろです
ささだです.
まつもと ゆきひろです
ささだです.
まつもと ゆきひろです
遠藤です。
まつもと ゆきひろです
遠藤です。
まつもと ゆきひろです
遠藤です。
ささだです.
ささだです.
まつもと ゆきひろです
ささだです.
[#35016] リリースプラン:1.9.0-2 — SASADA Koichi <ko1@...>
ささだです.
ささだです.
[#35020] Ruby 1.8.7-p17 has been released — "Akinori MUSHA" <knu@...>
Ruby 1.8.7-p17 をリリースしました。
pegacorn です。
[#35034] Array#shuffle! returns nil ? — okkez <okkez000@...>
okkez です。
[#35044] deadlock detection for 1.9 — "Yusuke ENDOH" <mame@...>
遠藤です。
こんばんは sheepman です。
まつもと ゆきひろです
[#35054] SSE2版 strlen — "NARUSE, Yui" <naruse@...>
成瀬です。
[#35056] Wide Finder performance — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
ささだです.
[#35074] [Bug:1.9] irb fg — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
[#35108] Re: [ruby-list:44988] Re: 各ブランチの計画 — Urabe Shyouhei <shyouhei@...>
卜部です。
こんにちは、なかむら(う)です。
[#35131] /\p{Hiragana}/s may dump core when sizeof(int) differs from sizeof(long) — "Yusuke ENDOH" <mame@...>
遠藤です。
[#35133] [BUG] class variable — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
ささだです.
まつもと ゆきひろです
ささだです.
まつもと ゆきひろです
[#35141] Etc::Passwd, Etc::Group というクラスは存在しない — okkez <okkez000@...>
okkez です。
[#35148] [Feature:trunk] IO#binmode? — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#35152] PATCH for MySQL/Ruby — Nobuyoshi Nakada <nobu@...>
なかだです。
[#35158] Etc.passwd{} のなかでのEtc.getpwnamの呼び出しがループします。 — "Yutaka Kanemoto" <kinpoco@...>
金本と申します。
[#35165] return from proc — SASADA Koichi <ko1@...>
ささだです.
[#35194] IncompatibleEncodingError — Kouhei Sutou <kou@...>
須藤です。
成瀬です。
須藤です。
[#35200] Win32 Unicode console output — Tietew <tietew@...>
Tietew です。
成瀬です。
artonです。
成瀬です。
成瀬です。
こんにちは、なかむら(う)です。
[#35226] [PATCH] freeze required_paths in gem_prelude.rb — "Keita Yamaguchi" <keita.yamaguchi@...>
山口と申します。
遠藤です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
[#35227] [Bug:trunk] Re: [ruby-cvs:24798] Ruby:r17573 (trunk): * parse.y (primary): make functional-style not operator to act — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
[#35247] Re: [ruby-list:45128] Re: Ruby 1.9.0/1.8.7/1.8.6/1.8.5 new releases (Security Fix) — Urabe Shyouhei <shyouhei@...>
卜部です。-devに振ります。ひょっとしてこんなパッチでSEGVのほうはおさまっ
まつもと ゆきひろです
前田です。
まつもと ゆきひろです
前田です。
卜部です。
[#35272] some insns should be method? — SASADA Koichi <ko1@...>
ささだです.
[#35273] $SAFEの今後 — Urabe Shyouhei <shyouhei@...>
〜これまでのあらすじ〜
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
卜部です。
まつもと ゆきひろです
前田です。
山口と申します。
[#35274] [Feature:trunk] test-coverage measurement — "Yusuke ENDOH" <mame@...>
遠藤です。
まつもと ゆきひろです
[#35278] [BUG] test_win32ole_event.rb in trunk — Masaki Suketa <masaki.suketa@...>
助田です。
こんにちは、なかむら(う)です。
artonです。
助田です。
artonです
助田です。
[ruby-dev:35019] Re: [ruby-changes:5517] Ruby:r17021 (trunk): * vm_insnhelper.c, vm.c, proc.c (proc_call): allow call method with
遠藤です。 2008/06/09 18:22 Yukihiro Matsumoto <[email protected]>: > rb_block_call_funcにはブロック引数があるかどうかの情報は含ま > れていないような気がするんですが、それはrb_block_call_funcそ > のものを今後拡張すると言う意味でしょうか。 そういう意味です。 > その辺がクリアになれば(若干のCレベルでの非互換性が発生します > が)、変更してもかまわないような気がして来ました。 試しにやってみました。 http://www.atdot.net/sp/view/97572k やたらでかいですが、ほとんどは blockptr を受け取る仮引数の 追加と、rb_block_call_func と型が異なる引数のキャストです。 ところで。 このパッチを書いた後に気づいたのですが、Ruby では以下の C の コードで bar() が 101 を返すことを仮定しているのでしょうか。 int foo(int i) { return i + 100; } int bar() { int (*func)(); func = foo; return func(1, 2); /* 引数の数が異なる */ } これはたぶん C の仕様としては保証されなさそうなのですが、 Ruby のソースコード中にはこれを仮定したコードが多数含まれて います。 enumerator.c の each_slice_i(VALUE val, VALUE *memo) とか。 でもこういうコードが実際いろんな環境で動いているわけで、 わりと仮定していい性質なんでしょうか。よくわかりません。 もしこの性質を今後も仮定するなら、rb_block_call でブロックを 呼び出すときに最後にブロックを持たせるだけで、互換性を保証? しつつ、問題が解決できそうです。 以下は Proc#curry だけやってみたパッチです。 $ ./ruby -e ' c = proc {|x, y, &b| x + y + b.call }.curry c = c.call(1) { 100 } #=> warning: given block not used r = c.call(2) { 200 } p r #=> 203 ' Index: include/ruby/ruby.h =================================================================== --- include/ruby/ruby.h (revision 17060) +++ include/ruby/ruby.h (working copy) @@ -824,6 +824,8 @@ PRINTF_ARGS(void rb_warn(const char*, ...), 1, 2); PRINTF_ARGS(void rb_compile_warn(const char *, int, const char*, ...), 3, 4); +typedef struct rb_block_struct *rb_blockptr; + typedef VALUE rb_block_call_func(VALUE, VALUE, int, VALUE*); VALUE rb_each(VALUE); Index: vm_core.h =================================================================== --- vm_core.h (revision 17060) +++ vm_core.h (working copy) @@ -345,7 +345,7 @@ VALUE prof_time_chld; /* cfp[13] */ } rb_control_frame_t; -typedef struct { +typedef struct rb_block_struct { VALUE self; /* share with method frame if it's only block */ VALUE *lfp; /* share with method frame if it's only block */ VALUE *dfp; /* share with method frame if it's only block */ Index: proc.c =================================================================== --- proc.c (revision 17060) +++ proc.c (working copy) @@ -490,7 +490,7 @@ rb_block_t *blockptr = 0; GetProcPtr(procval, proc); - if (BUILTIN_TYPE(proc->block.iseq) != T_NODE && + if (BUILTIN_TYPE(proc->block.iseq) == T_NODE || proc->block.iseq->arg_block != -1) { if (rb_block_given_p()) { @@ -506,15 +506,21 @@ argc, argv, blockptr); } -VALUE -rb_proc_call(VALUE self, VALUE args) +static VALUE +rb_proc_call_with_block(VALUE self, VALUE args, rb_blockptr blockptr) { rb_proc_t *proc; GetProcPtr(self, proc); return vm_invoke_proc(GET_THREAD(), proc, proc->block.self, - RARRAY_LEN(args), RARRAY_PTR(args), 0); + RARRAY_LEN(args), RARRAY_PTR(args), blockptr); } +VALUE +rb_proc_call(VALUE self, VALUE args) +{ + return rb_proc_call_with_block(self, args, 0); +} + /* * call-seq: * prc.arity -> fixnum @@ -1584,7 +1590,7 @@ return bindval; } -static VALUE curry(VALUE dummy, VALUE args, int argc, VALUE *argv); +static VALUE curry(VALUE dummy, VALUE args, int argc, VALUE *argv, rb_blockptr blockptr); static VALUE make_curry_proc(VALUE proc, VALUE passed, VALUE arity) @@ -1600,7 +1606,7 @@ } static VALUE -curry(VALUE dummy, VALUE args, int argc, VALUE *argv) +curry(VALUE dummy, VALUE args, int argc, VALUE *argv, rb_blockptr blockptr) { VALUE proc, passed, arity; proc = RARRAY_PTR(args)[0]; @@ -1610,10 +1616,13 @@ passed = rb_ary_plus(passed, rb_ary_new4(argc, argv)); rb_ary_freeze(passed); if(RARRAY_LEN(passed) < FIX2INT(arity)) { + if (blockptr) { + rb_warn("given block not used"); + } arity = make_curry_proc(proc, passed, arity); return arity; } - arity = rb_proc_call(proc, passed); + arity = rb_proc_call_with_block(proc, passed, blockptr); return arity; } Index: vm.c =================================================================== --- vm.c (revision 17060) +++ vm.c (working copy) @@ -448,7 +448,7 @@ return vm_eval_body(th); } else { - return vm_yield_with_cfunc(th, block, self, argc, argv); + return vm_yield_with_cfunc(th, block, self, argc, argv, blockptr); } } Index: vm_insnhelper.c =================================================================== --- vm_insnhelper.c (revision 17060) +++ vm_insnhelper.c (working copy) @@ -651,7 +651,8 @@ static inline VALUE vm_yield_with_cfunc(rb_thread_t *th, const rb_block_t *block, - VALUE self, int argc, const VALUE *argv) + VALUE self, int argc, const VALUE *argv, + const rb_block_t *blockptr) { NODE *ifunc = (NODE *) block->iseq; VALUE val; @@ -672,7 +673,7 @@ self, (VALUE)block->dfp, 0, th->cfp->sp, block->lfp, 1); - val = (*ifunc->nd_cfnc) (arg, ifunc->nd_tval, argc, argv); + val = (*ifunc->nd_cfnc) (arg, ifunc->nd_tval, argc, argv, blockptr); th->cfp++; return val; @@ -831,7 +832,7 @@ return Qundef; } else { - VALUE val = vm_yield_with_cfunc(th, block, block->self, argc, STACK_ADDR_FROM_TOP(argc)); + VALUE val = vm_yield_with_cfunc(th, block, block->self, argc, STACK_ADDR_FROM_TOP(argc), 0); POPN(argc); /* TODO: should put before C/yield? */ return val; } -- Yusuke ENDOH <[email protected]>