From: nobu.nakada@... Date: 2002-03-16T18:36:07+09:00 Subject: [ruby-dev:16425] Re: Enumerable#inject(Re: しぶらぐっ議事録。) なかだです。 At Sat, 16 Mar 2002 18:13:11 +0900, Koji Arai wrote: > うぉ、すごく無節操なサブジェクト。もいちど dev へ すいません。 > In message "[ruby-list:34449] Re: [ruby-dev:16423] Re: Re:Enumerable#inject(Re: しぶらぐっ議事録。)" > on 16 Mar 2002 14:48:03 +0900, > nobu.nakada@nifty.ne.jp wrote: > > なかだです。 > > > 細かいことですが、このほうがいいのではないかと。 > > > > + rb_iterate(rb_each, obj, inject_i, (VALUE)memo); > > + n = memo->u1.value; > > + > > + rb_gc_force_recycle((VALUE)memo); > > return n; > > } > > そうしてない箇所は enum.c にはすでにありますが、それも変更? enum_find(),enum_all(),enum_any(),enum_min(),enum_max()ですね。 一方enum_index()やeval.cはrecycleする前に値を取り出してます。後 者のほうがいいような気がするんですが。五ヶ所だけだし。 > 現状問題はないが、後で修正するときに間にコードを書いてしまっ > たりすることを危惧しているとか? というか、開放した後にアクセスするコードって、なんか不安をかき たてられませんか。気にしすぎ? Index: enum.c =================================================================== RCS file: /cvs/ruby/src/ruby/enum.c,v retrieving revision 1.22 diff -u -2 -p -r1.22 enum.c --- enum.c 2002/03/11 08:02:02 1.22 +++ enum.c 2002/03/16 09:35:20 @@ -86,6 +86,7 @@ enum_find(argc, argv, obj) rb_iterate(rb_each, obj, find_i, (VALUE)memo); if (memo->u2.value) { + VALUE result = memo->u1.value; rb_gc_force_recycle((VALUE)memo); - return memo->u1.value; + return result; } rb_gc_force_recycle((VALUE)memo); @@ -262,10 +263,12 @@ enum_all(obj) VALUE obj; { + VALUE result; NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0); memo->u1.value = Qtrue; rb_iterate(rb_each, obj, all_i, (VALUE)memo); + result = memo->u1.value; rb_gc_force_recycle((VALUE)memo); - return memo->u1.value; + return result; } @@ -286,10 +289,12 @@ enum_any(obj) VALUE obj; { + VALUE result; NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0); memo->u1.value = Qfalse; rb_iterate(rb_each, obj, any_i, (VALUE)memo); + result = memo->u1.value; rb_gc_force_recycle((VALUE)memo); - return memo->u1.value; + return result; } @@ -332,9 +337,11 @@ enum_min(obj) VALUE obj; { + VALUE result; NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0); rb_iterate(rb_each, obj, rb_block_given_p()?min_ii:min_i, (VALUE)memo); + result = memo->u1.value; rb_gc_force_recycle((VALUE)memo); - return memo->u1.value; + return result; } @@ -377,9 +384,11 @@ enum_max(obj) VALUE obj; { + VALUE result; NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0); rb_iterate(rb_each, obj, rb_block_given_p()?max_ii:max_i, (VALUE)memo); + result = memo->u1.value; rb_gc_force_recycle((VALUE)memo); - return memo->u1.value; + return result; } @@ -401,5 +410,4 @@ enum_member(obj, val) { VALUE result; - NODE *memo = rb_node_newnode(NODE_MEMO, val, Qfalse, 0); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦