From george.marrows at ntlworld.com Mon Apr 4 16:35:25 2005 From: george.marrows at ntlworld.com (George Marrows) Date: Mon Apr 4 17:27:54 2005 Subject: [Yarv-devel] Some tests for test_jump.rb Message-ID: <4251A50D.5050402@ntlworld.com> Hi son-shi :) Nice work with getting the go-ahead for Rite, and for all implementing all the stack caching and instruction unification cleverness. Anyway, I finally got round to submitting some YARV patches, as initially promised last October. For my first batch, I'd like to offer some additional tests for test_jump.rb - see attachment. They're some old tests I've cannabalised from my defunct ByteCodeRuby project. Unfortunately 8 of the tests fail - see dump at the end. The ones that fail with ' is not true', I've had to skip because they cause errors like the following test_exception_overrides_break(TestJump): <*YARV eval*>:9: [BUG] thread_backtrace: unkown instruction (-172128) ruby 1.9.0 (2005-03-04) [i686-linux] on my box (Mandrake Linux 8.1 x86) Hope they're of some use - do you want any more tests like this? I've got lots going free (~600)! -- George [georgem@triptych yarv-0.2.0]$ testrb-yarv test/test_jump.rb --verbose Loaded suite test_jump.rb Started test_(TestJump): . test_break(TestJump): . test_break_ensure_interaction1(TestJump): . test_break_ensure_interaction2(TestJump): F test_break_in_block_runs_ensure(TestJump): F test_break_overrides_exception(TestJump): E test_break_through_2_ensures(TestJump): F test_complex_jump(TestJump): . test_ensure_break_ensure(TestJump): F test_ensure_exception(TestJump): F test_ensure_normal_flow(TestJump): . test_exception_and_break(TestJump): . test_exception_overrides_break(TestJump): F test_next(TestJump): . test_next_in_block_runs_ensure(TestJump): F test_next_with_val(TestJump): . test_redo(TestJump): . test_retry(TestJump): . test_return(TestJump): . test_return2(TestJump): . test_return_from(TestJump): . test_return_from_method_runs_ensure(TestJump): . test_(YarvTestBase): . Finished in 0.483567 seconds. 1) Failure: test_break_ensure_interaction2(TestJump) [./test/yarvtest.rb:29:in `ae' ./test/yarvtest.rb:52:in `ae_flow' ./test/test_jump.rb:287:in `test_break_ensure_interaction2']: <[1, 2, 3, 5, 6, 7]> expected but was <[1, 2, 3, 7]>. 2) Failure: test_break_in_block_runs_ensure(TestJump) [./test/test_jump.rb:236]: is not true. 3) Error: test_break_overrides_exception(TestJump): SyntaxError: false <*YARV eval*>:9: can't put break <*YARV eval*>:9:in `initialize' 4) Failure: test_break_through_2_ensures(TestJump) [./test/test_jump.rb:291]: is not true. 5) Failure: test_ensure_break_ensure(TestJump) [./test/test_jump.rb:305]: is not true. 6) Failure: test_ensure_exception(TestJump) [./test/test_jump.rb:227]: is not true. 7) Failure: test_exception_overrides_break(TestJump) [./test/test_jump.rb:331]: is not true. 8) Failure: test_next_in_block_runs_ensure(TestJump) [./test/yarvtest.rb:29:in `ae' ./test/yarvtest.rb:52:in `ae_flow' ./test/test_jump.rb:253:in `test_next_in_block_runs_ensure']: <[1, 2, 3, 5, 2, 3, 5, 7]> expected but was <[1, 2, 3, 2, 3, 7]>. 23 tests, 22 assertions, 7 failures, 1 errors -------------- next part -------------- --- yarv-0.2.0.orig/test/test_jump.rb Thu Mar 31 20:52:34 2005 +++ yarv-0.2.0/test/test_jump.rb Mon Apr 4 20:55:37 2005 @@ -215,6 +215,129 @@ m } end + + def test_ensure_normal_flow + ae_flow %{ + begin + ensure + end } + end + + def test_ensure_exception + assert false + ae_flow %{ + begin + raise StandardError + ensure + end } + end + + def test_break_in_block_runs_ensure + assert false + ae_flow %{ + [1,2].each do + begin + break + ensure + end + end } + end + + def test_next_in_block_runs_ensure + ae_flow %{ + [1,2].each do + begin + next + ensure + end + end } + end + + def test_return_from_method_runs_ensure + ae_flow %{ + o = "test" + def o.test(a) + return a + ensure + end + o.test(123) } + end + + def test_break_ensure_interaction1 + # make sure that any 'break state' set up in the VM is cleared by + # the time of the ensure + ae_flow %{ + [1,2].each do + break + end + begin + ensure + end } + end + + def test_break_ensure_interaction2 + + # ditto, different arrangement + ae_flow %{ + begin + [1,2].each do + break + end + ensure + end } + end + + def test_break_through_2_ensures + assert false + ae_flow %{ + [1,2].each do + begin + begin + break + ensure + end + ensure + end + end } + end + + def test_ensure_break_ensure + assert false + # break through an ensure; run 2nd normally + ae_flow %{ + begin + [1,2].each do + begin + break + ensure + end + end + ensure + end } + end + + def test_break_overrides_exception + ae_flow %{ + [1,2].each do + begin + raise StandardError + ensure + break + end + end } + end + + def test_exception_overrides_break + assert false + ae_flow %{ + [1,2].each do + begin + break + ensure + raise StandardError + end + end } + end end --- yarv-0.2.0.orig/test/yarvtest.rb Thu Mar 31 20:52:34 2005 +++ yarv-0.2.0/test/yarvtest.rb Mon Apr 4 20:52:56 2005 @@ -20,12 +20,38 @@ # puts YARVUtil.parse(str, $0, 0).disasm ruby = YARVUtil.eval_in_wrap(str) +# puts str +# puts "Ruby => #{ruby.inspect}" yield if block_given? yarv = YARVUtil.eval(str) yield if block_given? - +# puts "Yarv => #{yarv.inspect}" assert_equal(ruby, yarv) end + + def ae_flow(src, for_value=true) + # Tracks flow through the code + # A test like + # begin + # ensure + # end + # gets transformed into + # a = [] + # begin + # begin; a << 1 + # ensure; a << 2 + # end; a << 3 + # rescue Exception + # a << 99 + # end + # a + # before being run. This tracks control flow through the code. + + cnt = 0 + src = src.gsub(/(\n|$)/) { "; a << #{cnt+=1}\n" } + ae("a = []; begin; #{src}; rescue Exception; a << 99; end; a") + end + def test_ end From george.marrows at ntlworld.com Tue Apr 5 16:58:44 2005 From: george.marrows at ntlworld.com (George Marrows) Date: Tue Apr 5 17:49:16 2005 Subject: [Yarv-devel] expandarray and opcode questions Message-ID: <4252FC04.3060804@ntlworld.com> Hi. 1. Can you explain the expandarray opcode a bit more please? The arguments to expandarray are num, flag. num seems to control how many elements to take from an array. -- what does it mean if num is negative? -- what does flag do? I've think I've found a couple of multiple assignment bugs - I'd like to try fixing them myself, but I need to understand expandarray first. 2. Can you explain the optimized opcodes a bit - I don't understand their names. getlocal_OP_1 -- I assume this getlocal with idx set to be 1. OP = 'operand'? getdynamic_OP__WC__0 -- what does 'WC' mean? getlocal_SC_xx_ax, _ax_ab, _bx_ba etc -- what is SC? 'stack cache'? -- what are xx, ax, ab, bx, ba etc?? Thanks for your help! -- George From ko1 at atdot.net Tue Apr 5 19:17:58 2005 From: ko1 at atdot.net (SASADA Koichi) Date: Tue Apr 5 19:12:41 2005 Subject: [Yarv-devel] expandarray and opcode questions In-Reply-To: (Your message of "Tue, 05 Apr 2005 21:58:44 +0100") <4252FC04.3060804@ntlworld.com> References: <4252FC04.3060804@ntlworld.com> Message-ID: <20050406081758.389fa9a%ko1@atdot.net> George Marrows wrote : [ [Yarv-devel] expandarray and opcode questions ] at Tue, 05 Apr 2005 21:58:44 +0100 Hi, > 1. Can you explain the expandarray opcode a bit more please? The > arguments to expandarray are num, flag. num seems to control how many > elements to take from an array. Right. > -- what does it mean if num is negative? I can't remember, but is cause when processing massign. > -- what does flag do? If flag is true, rest values packed as array. example: a, *b = [1, 2, 3] p [a, b] #=> [1, [2, 3]] > 2. Can you explain the optimized opcodes a bit - I don't understand > their names. > > getlocal_OP_1 > -- I assume this getlocal with idx set to be 1. OP = 'operand'? Yes. getlocal_OP_1 means "getlocal with operand 1". > > getdynamic_OP__WC__0 > -- what does 'WC' mean? Wild card. getdynamic_OP__WC__0 means that: getdynamic instruction with operand 1 is unknown (given as instruction operand) operand 2 is 0 If you have more suitable code, please teach me :) > > getlocal_SC_xx_ax, _ax_ab, _bx_ba etc > -- what is SC? 'stack cache'? Exactly. > -- what are xx, ax, ab, bx, ba etc?? Stack caching (SC) caches stack top. YARV's SC support 2 level (2 stack top values) stack caching. SC_?1_?2 means stack caching state. before instruction dispatched and after that. 1. A, B and X X means stack top is not cached. A means stack top is cached by register A. B means stack top is cached by register B. 2. XX, AX, BX, AB and BA XX means stack top is not cached. AX means stack top is cached by register A. BX means stack top is cached by register B. AB means stack top is cached by register B. stack 2nd value is cached by regsiter A. BA means stack top is cached by register A. stack 2nd value is cached by regsiter B. 3. example getlocal instruction doesn't pop any stack value and push 1 value (local variable). So any value is not cached (state XX), stack cache state after dispatch this instruction will be AX. getlocal_SC_xx_ax means that. In general, we can't determine stack caching state before dispatch the instruction, so YARV creates all instructions states for every instructions. examle: nop_SC_xx_xx, nop_SC_ax_ax, nop_SC_bx_bx, nop_SC_ab_ab, nop_SC_ab_ab (no state change) Regards, -- // SASADA Koichi at atdot dot net // From ko1 at atdot.net Tue Apr 5 19:23:33 2005 From: ko1 at atdot.net (SASADA Koichi) Date: Tue Apr 5 19:18:15 2005 Subject: [Yarv-devel] Some tests for test_jump.rb In-Reply-To: (Your message of "Mon, 04 Apr 2005 21:35:25 +0100") <4251A50D.5050402@ntlworld.com> References: <4251A50D.5050402@ntlworld.com> Message-ID: <20050406082333.38f1899%ko1@atdot.net> George Marrows wrote : [ [Yarv-devel] Some tests for test_jump.rb ] at Mon, 04 Apr 2005 21:35:25 +0100 Hi, > Hi son-shi :) April fool was gone :) > Anyway, I finally got round to submitting some YARV patches, as > initially promised last October. For my first batch, I'd like to offer > some additional tests for test_jump.rb - see attachment. They're some > old tests I've cannabalised from my defunct ByteCodeRuby project. Thank you. > Unfortunately 8 of the tests fail - see dump at the end. The ones that > fail with ' is not true', I've had to skip because they cause > errors like the following OK. I'll debug. > test_exception_overrides_break(TestJump): <*YARV eval*>:9: [BUG] > thread_backtrace: unkown instruction (-172128) > ruby 1.9.0 (2005-03-04) [i686-linux] This means stack trace bugs... > Hope they're of some use - do you want any more tests like this? I've > got lots going free (~600)! I hope that. Thanks, -- // SASADA Koichi at atdot dot net // From ko1 at atdot.net Tue Apr 5 19:26:22 2005 From: ko1 at atdot.net (SASADA Koichi) Date: Tue Apr 5 19:21:04 2005 Subject: [Yarv-devel] translation of node_scope In-Reply-To: (Your message of "Wed, 16 Mar 2005 14:12:25 +1100") References: <27a1a7019e053d74c80e51ac20d6b17d@segment7.net> <42345859.2040107@atdot.net> Message-ID: <20050406082622.391aa02%ko1@atdot.net> jm wrote : [ Re: [Yarv-devel] translation of node_scope ] at Wed, 16 Mar 2005 14:12:25 +1100 Hi, Sorry for my late response. I'll try to debug this problem. But this problem seems difficult to solve (because of program size include C extension). -- // SASADA Koichi at atdot dot net // -- original message -- > Sorry about the delay. Here's a cut down version of the script which > exhibits the same bug. > > == disasm: =================================== > local scope table (size: 1, argc: 1) > > 0000 getlocal_OP_2_SC_xx_ax ( > 23) > 0001 putobject_OP_INT2FIX_O_1_C__SC_ax_ab > 0002 opt_plus_SC_ab_ax > 0003 dup_SC_ax_ab > 0004 setlocal_OP_2_SC_ab_ax > 0005 end_SC_ax_ax 2 > ------------------------------------------------------------------------ > ----- > /home/jeffm/yarv//lib/ruby/site_ruby/1.9/i686-linux/Vflow.so: [BUG] > unknown type 0x22 (0x12 given) > ruby 1.9.0 (2005-02-01) [i686-linux] > > Aborted > > You'll need to install vflow which can be found at > http://ghostgun.com/software/vflow/ and have a valid flow file. > Although, it doesn't seem to be getting that far. > > > > Jeff. > > > On 14/03/2005, at 9:23 AM, jm wrote: > >> >> On 14/03/2005, at 2:12 AM, SASADA Koichi wrote: >> >>>> Hopefully that makes sense as I'm running out the door as I write >>>> this. >>> >>> Can I get your script which cause [BUG] on YARV? >> >> >> I'll write a smaller version that may be more managable (ie I'll >> remove all the database stuff). >> >> J. >> From ko1 at atdot.net Tue Apr 5 19:42:46 2005 From: ko1 at atdot.net (SASADA Koichi) Date: Tue Apr 5 19:37:28 2005 Subject: [Yarv-devel] expandarray and opcode questions In-Reply-To: <20050406081758.389fa9a%ko1@atdot.net> References: <4252FC04.3060804@ntlworld.com> <20050406081758.389fa9a%ko1@atdot.net> Message-ID: <42532276.20700@atdot.net> Hi, > I can't remember, but is cause when processing massign. I remember that. a, *b = 1, 2, *[3, 4, 5] p [a, b] Regards, -- // SASADA Koichi at atdot dot net // From jeffm at ghostgun.com Thu Apr 7 00:11:31 2005 From: jeffm at ghostgun.com (jm) Date: Thu Apr 7 00:05:30 2005 Subject: [Yarv-devel] translation of node_scope In-Reply-To: <20050406082622.391aa02%ko1@atdot.net> References: <27a1a7019e053d74c80e51ac20d6b17d@segment7.net> <42345859.2040107@atdot.net> <20050406082622.391aa02%ko1@atdot.net> Message-ID: Has this problem shown up in other c based extensions? I'm just thinking writing a smaller extension that causes the same problem may make it easier. Assuming the writing one is trivial. Not much I can do to help speed things up unfortunately. Jeff. On 06/04/2005, at 9:26 AM, SASADA Koichi wrote: > jm wrote : > [ Re: [Yarv-devel] translation of node_scope ] > at Wed, 16 Mar 2005 14:12:25 +1100 > > Hi, > Sorry for my late response. > > I'll try to debug this problem. But this problem seems > difficult to solve (because of program size include C extension). > > -- > // SASADA Koichi at atdot dot net > // > > -- original message > -- >> Sorry about the delay. Here's a cut down version of the script which >> exhibits the same bug. >> >> == disasm: >> =================================== >> local scope table (size: 1, argc: 1) >> >> 0000 getlocal_OP_2_SC_xx_ax >> ( >> 23) >> 0001 putobject_OP_INT2FIX_O_1_C__SC_ax_ab >> 0002 opt_plus_SC_ab_ax >> 0003 dup_SC_ax_ab >> 0004 setlocal_OP_2_SC_ab_ax >> 0005 end_SC_ax_ax 2 >> ---------------------------------------------------------------------- >> -- >> ----- >> /home/jeffm/yarv//lib/ruby/site_ruby/1.9/i686-linux/Vflow.so: [BUG] >> unknown type 0x22 (0x12 given) >> ruby 1.9.0 (2005-02-01) [i686-linux] >> >> Aborted >> >> You'll need to install vflow which can be found at >> http://ghostgun.com/software/vflow/ and have a valid flow file. >> Although, it doesn't seem to be getting that far. >> > >> >> >> Jeff. >> >> >> On 14/03/2005, at 9:23 AM, jm wrote: >> >>> >>> On 14/03/2005, at 2:12 AM, SASADA Koichi wrote: >>> >>>>> Hopefully that makes sense as I'm running out the door as I write >>>>> this. >>>> >>>> Can I get your script which cause [BUG] on YARV? >>> >>> >>> I'll write a smaller version that may be more managable (ie I'll >>> remove all the database stuff). >>> >>> J. >>> > > From danny at amelang.net Tue Apr 26 19:56:08 2005 From: danny at amelang.net (Daniel Amelang) Date: Tue Apr 26 19:50:02 2005 Subject: [Yarv-devel] Patch failed Message-ID: <426ED518.3020800@amelang.net> Hi everyone, 'patch' failed when I tried to apply evalc.patch (`patch < evalc.patch`). Got this: (Stripping trailing CRs from patch.) patching file eval.c Hunk #5 succeeded at 4639 (offset 135 lines). Hunk #6 succeeded at 5012 (offset 125 lines). Hunk #7 succeeded at 5033 (offset 125 lines). Hunk #8 succeeded at 5258 (offset 125 lines). Hunk #9 succeeded at 5704 (offset 128 lines). Hunk #10 succeeded at 5794 (offset 129 lines). Hunk #11 FAILED at 6102. Hunk #12 succeeded at 6121 (offset 131 lines). Hunk #13 succeeded at 6132 with fuzz 2 (offset 131 lines). Hunk #14 FAILED at 6724. Hunk #15 succeeded at 6746 with fuzz 2 (offset 134 lines). Hunk #16 succeeded at 7880 (offset 142 lines). 2 out of 16 hunks FAILED -- saving rejects to file eval.c.rej I download ruby via cvsup (since anon CVS is down). Here's my supfile in case it matters (it probably does) *default base=/home/danny/Downloads/ruby/ruby-yarv/sup *default compress delete use-rel-suffix *default release=cvs *default host=cvs.ruby-lang.org *default prefix=/home/danny/Downloads/ruby/ruby-yarv/ *default tag=. ruby date=2005.04.03.06.00.00 and I did a `cvsup src-supfile` to run it. Seemed to work fine. I made sure that the ruby version was at least 1.9, and yup, found the line '#define RUBY_VERSION "1.9.0"' in version.h Anyway, please let me know what I'm doing wrong. Thanks Dan From jeremy at bitsweat.net Tue Apr 26 20:02:51 2005 From: jeremy at bitsweat.net (Jeremy Kemper) Date: Tue Apr 26 19:56:54 2005 Subject: [Yarv-devel] Patch failed In-Reply-To: <426ED518.3020800@amelang.net> References: <426ED518.3020800@amelang.net> Message-ID: <426ED6AB.4020908@bitsweat.net> Daniel Amelang wrote: > 'patch' failed when I tried to apply evalc.patch (`patch < > evalc.patch`). Got this: [...] > Anyway, please let me know what I'm doing wrong. Hi, http://www.atdot.net/yarv/#i-2-1-1 quote: YARV 0.2.0 is not work on current Ruby HEAD version. Please use ruby sources before "Fri Mar 4 06:47:43 2005 UTC (4 hours ago) by matz" change. Hope that works, jeremy From danny at amelang.net Tue Apr 26 20:43:41 2005 From: danny at amelang.net (Daniel Amelang) Date: Tue Apr 26 20:37:36 2005 Subject: [Yarv-devel] Patch failed In-Reply-To: <426ED6AB.4020908@bitsweat.net> References: <426ED518.3020800@amelang.net> <426ED6AB.4020908@bitsweat.net> Message-ID: <426EE03D.5090805@amelang.net> Hi Jeremy, > YARV 0.2.0 is not work on current Ruby HEAD version. Please use ruby > sources before "Fri Mar 4 06:47:43 2005 UTC (4 hours ago) by matz" > change. > > Which is why I added this to my cvsup file originally: ruby date=2005.04.03.06.00.00 but it still doesn't work. Ok, found it :p I switched the 4 and the 3 in my supfile tag: ruby date=2005.04.03.06.00.00 should be ruby date=2005.03.04.06.00.00 Dyslexia uskcs Thanks guys, Dan From danny at amelang.net Wed Apr 27 00:20:14 2005 From: danny at amelang.net (Daniel Amelang) Date: Wed Apr 27 00:14:08 2005 Subject: [Yarv-devel] Speedup Message-ID: <426F12FE.2040306@amelang.net> I just ran YARV with a bioinformatics program that I'm working on that's pretty intense computation-wise. Here are my times: $ time ruby score.rb data/1AAR_diubiquitin.pdb data/1CTX_cobratoxin.pdb real 0m1.454s user 0m1.248s sys 0m0.011s $ time ruby19 -rite score.rb data/1AAR_diubiquitin.pdb data/1CTX_cobratoxin.pdb real 0m1.152s user 0m0.926s sys 0m0.015s A little speedup :) How much more do you think YARV will get us in the future? Dan From ko1 at atdot.net Wed Apr 27 03:00:51 2005 From: ko1 at atdot.net (SASADA Koichi) Date: Wed Apr 27 02:55:06 2005 Subject: [Yarv-devel] Speedup In-Reply-To: (Your message of "Tue, 26 Apr 2005 22:20:14 -0600") <426F12FE.2040306@amelang.net> References: <426F12FE.2040306@amelang.net> Message-ID: <20050427160051.36c6b059%ko1@atdot.net> Daniel Amelang wrote : [ [Yarv-devel] Speedup ] at Tue, 26 Apr 2005 22:20:14 -0600 Hi, > I just ran YARV with a bioinformatics program that I'm working on that's > pretty intense computation-wise. Here are my times: Do you use floating point number operation in your program? YARV (or Ruby) works slow with it. -- // SASADA Koichi at atdot dot net // From danny at amelang.net Wed Apr 27 03:04:13 2005 From: danny at amelang.net (Daniel Amelang) Date: Wed Apr 27 02:58:07 2005 Subject: [Yarv-devel] Speedup In-Reply-To: <20050427160051.36c6b059%ko1@atdot.net> References: <426F12FE.2040306@amelang.net> <20050427160051.36c6b059%ko1@atdot.net> Message-ID: <426F396D.6040905@amelang.net> >Do you use floating point number operation in your program? >YARV (or Ruby) works slow with it. > > Yes, I do many floating point operations. Is it even possible to optimize further in my case? Dan From ko1 at atdot.net Wed Apr 27 03:14:03 2005 From: ko1 at atdot.net (SASADA Koichi) Date: Wed Apr 27 03:08:18 2005 Subject: [Yarv-devel] Speedup In-Reply-To: (Your message of "Wed, 27 Apr 2005 01:04:13 -0600") <426F396D.6040905@amelang.net> References: <426F12FE.2040306@amelang.net> <20050427160051.36c6b059%ko1@atdot.net> <426F396D.6040905@amelang.net> Message-ID: <20050427161403.36d2c500%ko1@atdot.net> Daniel Amelang wrote : [ Re: [Yarv-devel] Speedup ] at Wed, 27 Apr 2005 01:04:13 -0600 Hi, > Yes, I do many floating point operations. Is it even possible to > optimize further in my case? OK. I'll optimize it. Could you teach me the characteristics of your program? (example: many "add" and no "div", some "mult", ...) -- // SASADA Koichi at atdot dot net // From danny at amelang.net Wed Apr 27 04:00:47 2005 From: danny at amelang.net (Daniel Amelang) Date: Wed Apr 27 03:54:43 2005 Subject: [Yarv-devel] Speedup In-Reply-To: <20050427161403.36d2c500%ko1@atdot.net> References: <426F12FE.2040306@amelang.net> <20050427160051.36c6b059%ko1@atdot.net> <426F396D.6040905@amelang.net> <20050427161403.36d2c500%ko1@atdot.net> Message-ID: <426F46AF.2040201@amelang.net> I've attached a zip file with the program (just the beginning of it; I've just started, really). It's called riposuc and it does structural comparision of proteins. If you want input data files for the program, I can send those too. There are three files: bsearch.rb for performing a binary search on sorted arrays riposuc.rb is the module that does most of the work. Actually, most of the work is just in the score_against method of the RIPOSUC::Protein class. score.rb is the 'driver' that is invoked from the command line It's about 200 lines total, so it should be easy to get an idea of what it's doing. About your question, I do quite a bit of float comparisons, Math.sqrt and **2. I know I can do x*x instead of x**2, but I haven't really reached that level of optimization yet. The code is already pretty messy already with ugly speed optimizations. Dan -------------- next part -------------- A non-text attachment was scrubbed... Name: riposuc.zip Type: application/zip Size: 2419 bytes Desc: not available Url : http://rubyforge.org/pipermail/yarv-devel/attachments/20050427/c393d1a5/riposuc.zip