[#34909] Kernel#evalの第2引数 — KURODA Hiraku <hiraku@...>
こんにちは、黒田ひらくと申します。
[#34911] erb still treats $KCODE — "Yusuke ENDOH" <mame@...>
遠藤です。
咳といいます。
まつもと ゆきひろです
永井@知能.九工大です.
[#34923] open() and encodings — "NARUSE, Yui" <naruse@...>
成瀬です。
まつもと ゆきひろです
成瀬です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
永井@知能.九工大です.
こんにちは、なかむら(う)です。
In article <4847146F.4020103@airemix.jp>,
永井@知能.九工大です.
成瀬です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
[#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@...>
成瀬です。
In message <485000F3.2010302@airemix.jp>
[#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 <matz@ruby-lang.org>:
> 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 <mame@tsg.ne.jp>