Show enters and exits. Hide enters and exits.
| 08:02:46 | dbussink | evan: ping? |
| 08:17:15 | halorgium | dbussink: got it "fixed" :P |
| 15:42:32 | jerryontwitter | running my cucumber tests on rubinius takes nearly twice as long as it did on 1.8.7-p249 - I am guessing this is a "me" problem. Are there configurations I can tune to pick up that pace? |
| 15:45:10 | cremes | jerryontwitter: i suggest opening a github issue and marking it as a performance problem |
| 15:45:37 | cremes | include the output from running it with these options: -Xint=1 and -Xprofile=1 |
| 15:45:55 | sbryant | Is this from a recent checkout of rubinius/ |
| 15:46:23 | jerryontwitter | 1.0.1 - should I try it with HEAD? |
| 15:47:01 | jerryontwitter | before I submit an issue, I bet I should... |
| 15:47:14 | sbryant | Yeah. |
| 16:08:44 | brixen | morning |
| 16:08:57 | brixen | jerryontwitter: we know there are some perf issues with rspec |
| 16:09:32 | brixen | jerryontwitter: it would be excellent if you could take some core functionality in your app and benchmark that too |
| 16:09:56 | jerryontwitter | Will do that as well. |
| 16:10:00 | brixen | jerryontwitter: for profiles, just do -Xprofile, which runs rbx in interpreter mode only |
| 16:10:19 | brixen | jerryontwitter: sweet, thanks for looking at it |
| 16:13:30 | jerryontwitter | I am guessing I have some more reading to do - I am getting a "Error: signal SIGSEGV" when I try to install rails |
| 16:13:42 | jerryontwitter | using rbx-head |
| 16:15:33 | brixen | hrm, that should not happen |
| 16:15:43 | brixen | what version? |
| 16:16:19 | brixen | jerryontwitter: when did you last pull/build? |
| 16:16:38 | jerryontwitter | rails 2.3.8 - I have a jumbled gem setup - I am guessing it is related to an MRI sqlite3 library being linked |
| 16:16:55 | brixen | that would be a problem |
| 16:16:58 | jerryontwitter | perhaps through my passenger install? |
| 16:17:01 | brixen | are you using rvm with gemsets? |
| 16:17:06 | jerryontwitter | yep. |
| 16:17:33 | brixen | so, I believe wayneeseguin fixed this, but you cannot use MRI ext gems with rbx |
| 16:17:36 | jerryontwitter | rvm - but installing separate gems for each ruby |
| 16:17:40 | brixen | but, rbx should reject those on load now |
| 16:17:46 | evan | you're probably on an old version of rvm that had gemsets totally broken for native extensions |
| 16:18:16 | brixen | yeah, so 2 things, update rvm, and use rbx-head |
| 16:18:35 | brixen | problem is, if you have rbx-head installed in rvm, I don't know how to tell rvm to do a clean build |
| 16:18:38 | jerryontwitter | will do - updating rvm now |
| 16:19:03 | brixen | you could cd to the .rvm rbx dir and run rake clean |
| 16:19:25 | brixen | but wayne probably has a command for that too |
| 16:35:00 | evan | I wonder how hard it would be to put perl6 on top of Rubinius... |
| 16:36:11 | brixen | heh |
| 16:36:22 | brixen | I thought about trying that |
| 16:36:50 | brixen | but I couldn't think of a good project name :P |
| 16:37:01 | brixen | suggested Toe but I got very disapproving looks |
| 16:38:41 | brixen | anyway, a lot of Perl should map quite easily, like this pack/unpack insanity |
| 16:39:22 | evan | Toe seems good |
| 16:39:27 | brixen | hah |
| 16:39:46 | evan | or Humps |
| 16:40:28 | brixen | sure |
| 16:40:33 | brixen | Lumps |
| 16:40:58 | brixen | you know, in honor of all the pain Perl has caused me in Ruby |
| 16:41:44 | evan | hah |
| 16:42:11 | evan | the motto can be "Taking your lumps." |
| 16:42:19 | brixen | heh, nice |
| 16:42:33 | jerryontwitter | hmm, got rvm 0.1.41, tried "rvm install rbx-head --reconfigure" and still got the same result, then tried "rvm remove rbx-head" and now reinstalling |
| 16:42:54 | brixen | jerryontwitter: what platform are you on? |
| 16:43:12 | jerryontwitter | mac os 10.6.3 |
| 16:45:37 | evan | ug. really 1.9? really? "It now passes more than 99% of RubySpecs" |
| 16:45:42 | brixen | crap, I have a segfault too |
| 16:45:51 | evan | brixen: backtrace? |
| 16:46:08 | brixen | evan: yes, with the caveat that we don't really know what 99% of rubyspec means :/ |
| 16:46:11 | brixen | sec.. |
| 16:46:49 | brixen | http://gist.github.com/472701 |
| 16:47:47 | evan | can you try under gdb and see if you still get it? |
| 16:48:18 | evan | pretty sure it's capi handle related. |
| 16:48:37 | brixen | yeah, building debug |
| 16:48:52 | evan | no no |
| 16:48:55 | evan | any backtrace |
| 16:48:56 | evan | damn |
| 16:48:59 | evan | you might not get it now. |
| 16:49:08 | evan | next time, try to get an optimized backtrace first. |
| 16:49:15 | evan | then move to debug. |
| 16:49:33 | brixen | I can get an optimized one |
| 16:50:32 | brixen | why would the gdb bt be different than the one from the segv? |
| 16:55:15 | brixen | ok, it's sporadic, for one |
| 16:56:31 | brixen | http://gist.github.com/472701 |
| 16:57:34 | evan | yeah, i figured it was sporadic |
| 16:57:47 | evan | thats why trying to get it optimized is better at first |
| 16:57:48 | brixen | so, Data object... |
| 16:57:50 | evan | less change |
| 16:57:57 | brixen | this is optimized |
| 16:57:59 | evan | yeah, it's Data/handle/finalizer related. |
| 16:59:06 | evan | well, maybe/maybe not finalizer |
| 16:59:08 | brixen | obj is #<YAML::Syck::Parser:0x22663f8> |
| 16:59:29 | brixen | I figured syck would come to haunt us |
| 17:00:36 | evan | damnit! |
| 17:00:42 | evan | :( :( :( |
| 17:00:48 | evan | it's the samet hing I was working on before |
| 17:00:52 | evan | that I thought I fixed. |
| 17:00:59 | evan | finalizer wise. |
| 17:01:12 | evan | I have a hunch |
| 17:02:24 | evan | ah ah ah |
| 17:02:25 | evan | yes |
| 17:02:27 | evan | i know what it is. |
| 17:02:33 | evan | my 3am fix wasn't enough |
| 17:02:36 | evan | SURPRISE! |
| 17:03:09 | sbryant | is surprised. |
| 17:03:14 | sbryant | Shocked and elated. |
| 17:03:27 | evan | gives sbryant an icecream cone to calm him down |
| 17:03:51 | sbryant | hah |
| 17:04:48 | evan | anyone else need an icecream cone? |
| 17:06:15 | jerryontwitter | morbidly obese people always like icecream cones - I'll take 2. |
| 17:06:43 | sbryant | evan: Anyway I can get some froyo instead? |
| 17:06:49 | sbryant | It's a texture thing. |
| 17:09:29 | evan | sbryant: if it will calm you down, sure. |
| 17:09:44 | evan | abby and I almost had yogurtland twice this weekend. |
| 17:15:02 | sbryant | Nice. |
| 17:55:16 | evan | brixen: fix incoming. |
| 17:55:21 | boyscout | Invalidate handles for finalized objects properly - 9fc6ae3 - Evan Phoenix |
| 17:58:58 | brixen | pulls |
| 17:59:14 | evan | the issue was that I did free_data() on the Data handle |
| 17:59:45 | evan | but the next time through, the code tried to check the handles and ended up using an empty RData |
| 18:00:17 | evan | I need to add a little more code to help prevent that usage |
| 18:00:18 | evan | doing that now. |
| 18:02:27 | dbussink | evan: btw, why is that specialization code in kernel/delta/struct.rb? performance reasons? |
| 18:02:34 | evan | yes |
| 18:02:44 | evan | it's about 20x faster than using Struct#initialize directly. |
| 18:03:46 | dbussink | ah ok, was wondering, since removing it kept all specs passing :) |
| 18:03:52 | dbussink | but that explains then |
| 18:04:35 | evan | well yeah. |
| 18:04:41 | evan | that was the other fix |
| 18:04:42 | brixen | hmm |
| 18:04:43 | boyscout | CI: rubinius: 9fc6ae3 successful: 3481 files, 14071 examples, 41804 expectations, 0 failures, 0 errors |
| 18:04:46 | evan | it's entirely performance related. |
| 18:05:01 | brixen | ponders whether this is a build issue |
| 18:05:06 | brixen | evan: http://gist.github.com/472825 |
| 18:05:49 | evan | oh cool. |
| 18:05:53 | evan | try a rake clean |
| 18:05:58 | evan | see if it is still there. |
| 18:06:04 | evan | thats why I added some extra code. |
| 18:06:04 | evan | :) |
| 18:06:35 | dbussink | i have it too :) |
| 18:06:47 | evan | well now, that was easy. |
| 18:06:47 | evan | :) |
| 18:12:16 | evan | weird that i'm not getting it.. |
| 18:12:32 | brixen | well hooray for kernel panics |
| 18:12:40 | brixen | I wonder if I need to run disk defrag... |
| 18:12:45 | evan | ah haha |
| 18:12:48 | brixen | heh |
| 18:12:49 | evan | got it! |
| 18:12:55 | evan | you guys probably have ~/.gemrc files |
| 18:12:56 | evan | don't you |
| 18:12:59 | brixen | yes |
| 18:13:01 | evan | bingo. |
| 18:13:02 | evan | :D |
| 18:13:04 | evan | i'm on it. |
| 18:13:20 | dbussink | evan: https://gist.github.com/dab0ab84823a00e6b5e5 |
| 18:13:27 | evan | dbussink: i got it here :) |
| 18:13:46 | dbussink | and yes, i have a gemrc |
| 18:13:52 | evan | figures :) |
| 18:17:44 | dbussink | actually collecting these objects does expose a bunch of issues :P |
| 18:18:31 | evan | yep! |
| 18:18:33 | evan | thats good though. |
| 18:18:40 | evan | we're getting good exercise out of the GC now. |
| 18:18:48 | evan | I just forgot to do some homework :) |
| 18:28:54 | dbussink | evan: easy issue or something nasty? |
| 18:29:02 | evan | *shrug* |
| 18:29:03 | evan | looking now. |
| 18:45:02 | dbussink | evan: what would be the best way to fix http://github.com/evanphx/rubinius/issues#issue/403 |
| 18:45:11 | dbussink | add a method to test whether an object has a metaclass? |
| 18:45:42 | evan | we have that |
| 18:45:48 | evan | obj.kind_of? ImmediateValue |
| 18:46:06 | dbussink | well, true, false and nil do give back a metaclass |
| 18:46:11 | dbussink | which is the class itself |
| 18:46:18 | evan | :/ |
| 18:46:36 | dbussink | only ones where it gives an error is for symbols and fixnums |
| 18:46:58 | evan | i'm checking what MRI does |
| 18:47:47 | dbussink | class << true; end doesn't blow up |
| 18:47:51 | dbussink | but class < 1; end does |
| 18:49:46 | evan | ok |
| 18:49:53 | evan | so, MRI uses rb_class_of |
| 18:50:01 | evan | which for the immediates |
| 18:50:08 | evan | return the normal class |
| 18:50:13 | evan | 1 => Fixnum, :blah => Symbol |
| 18:50:14 | evan | etc. |
| 18:50:20 | evan | and for references, returns the metaclass |
| 18:54:52 | dbussink | yeah, but there's still a difference between fixnum and symbol and true, false and nil :/ |
| 18:55:17 | evan | well, no. |
| 18:55:28 | evan | there isn't as for as Kernel#methods is considered. |
| 18:55:34 | dbussink | that's true yeah |
| 18:55:38 | dbussink | but there is for metaclasses |
| 18:55:44 | dbussink | which is what Kernel#methods uses now |
| 18:55:54 | evan | our method to get the metaclass raises a TypeError because other things expect that |
| 18:56:16 | evan | we should go ahead and special case the code for Fixnum, Symbol for now. |
| 18:56:41 | evan | we also need to do "grep CLASS_OF *.c" in MRI |
| 18:56:52 | evan | and check out all the places that this behavior exists |
| 18:57:05 | evan | ie, where is class_of(1) => Fixnum allowed |
| 18:58:41 | dbussink | evan: special case the code in Kernel#methods you mean? |
| 18:58:47 | evan | yes |
| 19:05:28 | cremes | matz is the man... he's pushing for evan's gem patch to be added to 1.9.2 |
| 19:08:17 | brixen | heh, yeah |
| 19:09:58 | goyox86 | matz said: "Don't be bureaucratic" :] |
| 19:12:53 | dbussink | let's hope this doesn't end up to be another disaster.. |
| 19:16:00 | evan | yes, lets hope. |
| 19:16:20 | evan | i'm being a good semaritan by helping |
| 19:16:26 | evan | if 1.9.2 is a total fuck up |
| 19:16:34 | evan | the ruby brand will be dealt some serious damage. |
| 19:20:28 | sbryant | ya? |
| 19:23:48 | cremes | time to fork! |
| 19:32:52 | boyscout | Quick fix for Data/handle/finalizer assert failure - 8f3eba0 - Evan Phoenix |
| 19:32:56 | brixen | cremes: no, bad cremes |
| 19:33:55 | evan | brixen / dbussink: that should fix your assert |
| 19:34:02 | evan | I need to ponder a better fix. |
| 19:34:08 | brixen | k |
| 19:34:14 | evan | which i'll be doing at lunch. |
| 19:36:10 | dbussink | evan: yay, it runs now again |
| 19:37:18 | evan | cool. |
| 19:41:15 | boyscout | CI: rubinius: 8f3eba0 successful: 3481 files, 14071 examples, 41804 expectations, 0 failures, 0 errors |
| 19:43:34 | dbussink | evan: did you already look at that nice exit exception issue in 395? :P |
| 19:57:03 | cremes | heh heh heh... |
| 20:08:57 | cremes | i haven't heard anything lately about maglev; are they still working on that or did the acquisition kill that project? |
| 20:09:47 | Defiler | http://github.com/MagLev/maglev |
| 20:10:08 | Defiler | http://twitter.com/maglev |
| 20:10:21 | Defiler | http://groups.google.com/group/maglev-discussion |
| 20:10:31 | cremes | heh... |
| 20:10:54 | Defiler | Looks like it is still active, just no website updates since March |
| 20:11:22 | cremes | i'm gonna join their channel... |
| 20:14:37 | cremes | brixen: how's pack/unpack progressing? no updates on rapa for a few days... |
| 20:14:38 | brixen | cremes: yes... |
| 20:14:42 | brixen | oh |
| 20:14:47 | brixen | I'm working on specs |
| 20:14:57 | cremes | damn those specs |
| 20:14:58 | brixen | then I'll implement some more |
| 20:15:17 | cremes | are the specs too tied to the current implementation or something? |
| 20:15:19 | brixen | I'm checking an a 64bit le platform now |
| 20:15:31 | brixen | I wish I had a 64bit be platform to check on |
| 20:15:46 | brixen | the specs are just pretty terrible |
| 20:16:02 | cremes | does EY have an old G5 sitting around somewhere? that can do 64-bit be |
| 20:16:18 | brixen | dunno |
| 20:16:28 | cremes | or ask seydar to donate his old PPC box... |
| 20:16:39 | cremes | or was that a g4...? can't remember |
| 20:17:08 | brixen | I think that was like an iBook or something |
| 20:17:29 | cremes | anyway, i imagine the pack/unpack specs are pretty much just doing output checking, right? |
| 20:17:46 | brixen | um yeah |
| 20:17:47 | cremes | that is, [1,2,3].pack('some chars').should == 'expected' |
| 20:17:48 | brixen | :) |
| 20:17:54 | brixen | pretty much |
| 20:18:42 | cremes | i promise to take a look at implementing the directives that mongodb uses for packing/unpacking BSON stuff |
| 20:18:54 | cremes | i'm eager to see how rbx performs after this gets some love |
| 20:18:55 | brixen | which ones does it use? |
| 20:19:07 | brixen | I'm giving priority to the ones Rails uses |
| 20:19:24 | brixen | Q H M m U C n |
| 20:19:28 | cremes | don't know off hand but i will check |
| 20:21:22 | cremes | V, E, U, C, N, G, c |
| 20:21:34 | cremes | some overlap there |
| 20:21:49 | brixen | ok |
| 20:22:15 | cremes | you tackle rails and i'll try to tackle some of these others |
| 20:22:26 | cremes | maybe i'll take a whack tonight... |
| 20:38:39 | matschaffer | so what's the new hotness for 'Rubinius::VM::debugger' ? |
| 20:39:31 | brixen | matschaffer: http://gist.github.com/450160 |
| 20:39:39 | brixen | you can set a br and c |
| 20:39:45 | brixen | but no stepping or nexting yet |
| 20:40:51 | matschaffer | brixen: any docs on it anywhere? |
| 20:41:24 | brixen | not yet, sorry |
| 20:44:26 | matschaffer | s'cool |
| 20:44:31 | matschaffer | that explains why I couldn't google it :) |
| 20:45:53 | brixen | it's on the short list for 1.1 |
| 20:50:53 | matschaffer | sweet! |
| 20:51:13 | matschaffer | I'm sure you hear this all the time, but I love the stack traces |
| 20:51:52 | evan | :D |
| 20:52:01 | evan | we love hearing it :) |
| 20:52:49 | matschaffer | even more than the coloring, centering them on the at was a great call |
| 20:52:53 | matschaffer | sooooo much easier to scan |
| 20:54:07 | evan | yeah |
| 20:54:20 | evan | that code really evolved quickly |
| 20:54:24 | evan | because we debug a lot of ruby. |
| 20:54:39 | evan | and I found that the at centering made a huge difference visually |
| 21:01:09 | dbussink | evan: only downside is that it mangles it some if you have deeper gem paths |
| 21:01:18 | dbussink | and want to select a path across multiple lines to open |
| 21:01:24 | dbussink | but that's me using it :p |
| 21:01:41 | evan | well, i've played with different ideas to deal with that. |
| 21:01:52 | evan | we could turn off the code that breaks up the path |
| 21:02:05 | evan | then it wraps and discrupts, visually, the next line. |
| 21:02:09 | evan | disrupts, rather. |
| 21:02:17 | evan | i'm not happy with the current solution |
| 21:02:24 | evan | so i'm open to suggestions |
| 21:03:44 | dbussink | haven't come up with a good solution either |
| 21:03:51 | dbussink | it's a tricky thing |
| 21:09:09 | evan | yep. |
| 21:36:07 | evan | i'm going to simplify the finalizers for now |
| 21:36:15 | evan | which should solve this problem better. |
| 21:37:01 | slava | hi evan |
| 21:37:04 | slava | what's changing with finalizers? |
| 21:37:07 | evan | hey slava! |
| 21:37:14 | evan | i have question to ask you about write barriers |
| 21:37:21 | slava | shoot |
| 21:37:25 | evan | changing when C finalizers are run |
| 21:37:35 | evan | to eliminate an edge case |
| 21:37:46 | evan | you have tagged fixnums |
| 21:37:53 | evan | so when you store a tagged fixnum into an object |
| 21:38:00 | evan | to you mark the card of the object? |
| 21:38:09 | evan | ie, are cards market for all writes |
| 21:38:13 | slava | yeah |
| 21:38:17 | evan | or only writes there whe value written is a reference? |
| 21:38:26 | evan | s/market/marked/ |
| 21:38:32 | evan | so all writes |
| 21:38:33 | evan | ? |
| 21:38:33 | slava | although I've never measured if the overhead of a conditional branch in writes is lower than the overhead of unnecessarily scanning cards where fixnums were stored into |
| 21:38:37 | slava | so YMMV |
| 21:38:42 | evan | ok, cool. |
| 21:38:43 | evan | just curious |
| 21:38:49 | evan | hey did I see you're going to work for GOOOOGLE? |
| 21:38:53 | slava | if I can statically determine that the thing being stored is a fixnum, I omit the write barrier |
| 21:39:03 | slava | also if I can statically determine that the object is freshly allocated |
| 21:39:12 | slava | evan: maybe :) |
| 21:39:43 | evan | maybe eh? |
| 21:39:46 | evan | :) |
| 21:40:15 | brixen | slava: do you have a 64bit be machine I could have an acct on? |
| 21:40:16 | slava | I don't comment on twitter rumors :) |
| 21:40:20 | slava | brixen: x86-64? |
| 21:40:32 | brixen | slava: big endian |
| 21:40:48 | slava | brixen: I sold my g5, sorry |
| 21:40:54 | brixen | no worries |
| 21:40:57 | slava | you could ask erg in #concatenative, he has one |
| 21:40:57 | brixen | just asking around :) |
| 21:41:01 | brixen | ah ok |
| 21:41:08 | evan | slava: cool, no comment necessary. I didn't know it was a rumor. |
| 21:41:08 | slava | he'll give you an account for sure |
| 21:41:19 | brixen | ok |
| 21:41:19 | slava | evan: well, yeah, I'll be working there |
| 21:41:59 | brixen | slava: are you going to work on dalvik? |
| 21:42:17 | slava | brixen: my guess is as good as yours |
| 21:42:23 | brixen | heh |
| 21:42:34 | brixen | well, I know where I'd assign you |
| 21:42:43 | slava | not web frontend stuff I hope :) |
| 21:42:47 | brixen | but I'm sure google could give a X what I think :) |
| 21:42:54 | brixen | heh, no way man |
| 21:43:57 | evan | slava: when do you start? will you be in the bay area? |
| 21:44:04 | slava | evan: august, yes |
| 21:44:26 | evan | cool! |
| 21:44:50 | slava | evan: are you changing your write barrier? |
| 21:44:59 | evan | pondering them |
| 21:45:19 | evan | trying to figure out what I can do without a contigious heap |
| 21:45:33 | slava | you can have a card array that covers teh entire address space |
| 21:45:34 | evan | I might do an experiment with write buffers |
| 21:45:43 | slava | only scan the cards corresponding to allocated heap chunks |
| 21:45:48 | slava | the other pages won't even be committed |
| 21:45:59 | evan | hm, thats a good point. |
| 21:46:05 | slava | let's see |
| 21:46:32 | slava | on 32-bit, if you have 256 byte cards, with one byte per card, that's a 16mb card array |
| 21:46:49 | slava | that's not bad at all, especially since most of it won't be wired |
| 21:47:00 | evan | with write buffers, i'd bump store the address of each written to object |
| 21:47:03 | slava | on 64-bit, your address space is actually 48 bits big |
| 21:47:19 | evan | if it's full, put the buffer into a queue, get a new buffer |
| 21:47:36 | slava | or better yet, if its full, call a routine which marks those cards |
| 21:47:37 | evan | a background thread then emptys the buffer and keeps a remember set up to date |
| 21:47:39 | slava | and empties the buffer |
| 21:48:04 | evan | that would be one conditional |
| 21:48:08 | evan | to check if there is buffer space |
| 21:48:08 | slava | another option is hardware write barriers using memory protection, like sbcl |
| 21:48:22 | evan | everything I read about them talks about how slow they are |
| 21:48:33 | slava | what if you use a guard page to detect when the write buffer is full? |
| 21:48:48 | slava | then you have one protection fault for every N stores |
| 21:49:03 | evan | thats possible |
| 21:49:09 | slava | so many possibilities, so little time, eh? |
| 21:49:12 | evan | but i don't know which would be faster |
| 21:49:18 | evan | deal with the page fault as a signal etc, etc |
| 21:49:22 | evan | or the rare conditional |
| 21:50:27 | evan | i'm guessing the conditional would be faster actually |
| 21:50:35 | evan | because the guard page would require me to put a guard page on the end of every buffer |
| 21:50:40 | evan | of which there would be N of |
| 21:50:49 | evan | because a buffer would be put into a queue and a new one grabbed |
| 21:51:05 | evan | anyway, just brain storming. |
| 21:52:10 | slava | getting a buffer from the queue still involves conditionals |
| 21:52:25 | slava | also, it will be a well-predicted branch since in most cases the buffer will not be full |
| 21:53:25 | evan | yes |
| 21:53:29 | evan | but that code would be done rarely |
| 21:53:35 | evan | say, once every 1024 writes |
| 21:53:52 | evan | so that it's the slow case is fine |
| 21:54:01 | evan | yes, the well predicted case is what i want to optimize |
| 21:54:12 | evan | heck, it could be 32k |
| 21:54:53 | evan | on GC, i'd have to wait for the queues to be emptied |
| 21:55:07 | evan | so i'd need enough buffer space for writes between GCs |
| 22:35:06 | boyscout | Run C finalizers right away, rather than queueing - 40b9978 - Evan Phoenix |
| 22:45:32 | boyscout | CI: rubinius: 40b9978 successful: 3481 files, 14071 examples, 41804 expectations, 0 failures, 0 errors |