Index

Show enters and exits. Hide enters and exits.

00:36:07boyscoutRefactoring BlockEnvironment using the interpreter - ceee888 - Evan Phoenix
00:37:00evanok, now I have a place to put a JIT'd block.
00:43:45boyscoutCI: ceee888 success. 2682 files, 10322 examples, 32867 expectations, 0 failures, 0 errors
00:44:25evanwe need to be careful about not getting a commit thats 6666666!
00:44:48lopexwhy ?
00:44:49tarcierihahaha
00:44:54evanlopex_: just being silly.
00:45:08tarcieriloves funny git hashes
00:45:22evanceee888 is pretty eird.
00:45:23evanweird.
00:47:13lopexevan: just being acerbic :D
00:47:28ddubcan't wait for cafebad
00:47:44lopexjust looked up that word in a dict
00:47:53ddubor maybe dedbeef ?
00:48:27lopexmaybe it was meant to be weee ?
00:48:45lopexweee666
00:49:17rueevan: Do const pointers have significance for LLVM?
00:50:09slavaconst pointers can potentially improve alias analysis so I'd use them where possible in generated code, in any case
00:51:12rueHalf the codebase should essentially be const, sure :)
00:51:41slavaare you talking about const in your C++ code?
00:51:53slavaI'm pretty sure code generators ignore that, because of const_cast hindering any analysis
00:53:10rueHe added a couple * const, I was wondering if there was a particular significance
00:55:24rueevan: And on the style front, might we consider dropping the opening brace to the next line for those long argument lists? The double-indent just looks like the first line of the body got indented wrong to me, but that might just be me.
00:56:16evanwhich?
00:56:49evanrue: no LLVM doesn't use const
00:57:00evani added those just to be clear to the user
00:57:25rueE.g. vm/builtin/block_environment.cpp:120
00:57:45evanyou want to put the { on the next line?
00:58:28rueYeps
01:00:01evanwhen the definition spans multiple lines, i think thats ok.
01:00:14evanbut when it's all on one line, the { should stay on that line
01:00:43rueOkaydoke * 2
01:08:52headiushey, I haven't looked at your profiling stuff, but is it in ruby or C++?
01:09:39evanthe data generator is wired into the VM at the C++ level.
01:10:05headiusI see
01:10:17headiusI thinking I could add that and have the ruby part just work for jruby as well
01:10:19evanbrixen most of the analyzer in ruby though
01:10:29evanbriken wrote, rather.
01:10:38headiusI get it
01:10:47slavahi headius
01:10:52headiusslava: hello there
01:11:00slavaheadius: IIRC you were looking into adding some dataflow optimizations to JRuby
01:11:05headiusyes
01:11:14headiuspost javaone, but it will be part of new compiler work
01:11:42rueAlong with the pool
01:12:51headiusevan: got a pointer to where this is in the vm? I don't see an obvious "profiler.cpp"
01:13:34headiusmaybe instruments
01:14:13evanyep.
01:14:20ruevm/instruments
01:14:23headiuslot more cpp than I expected
01:14:32rueAnd the Ruby side goes lib -> lib -> kernel
01:14:58evanheadius: thats because it's not just firing a giant stream of data
01:15:09evanit builds a few trees in C++
01:15:15evanfor the ruby to make sense of
01:16:18headiusyeah, I see
01:16:31headiushmm well that's too bad, looks like the bulk of the logic is in cpp
01:18:30evandepends
01:18:36evanon what you see as the bulk of the logic
01:18:47evanthere is considerable logic in C++, yes.
01:19:02slavarubinius has too much logic in C++ in general :)
01:19:26evanslava: perhaps.
01:19:39headiuswell, I was hoping the C++ just did callbacks to ruby when an event boundary was crossed or just gathered raw data and then tossed that over
01:20:00evanit's not just rb_event_hook
01:20:02evanno.
01:20:17headiusmaybe I'll see if I can get zenprofile to work then
01:20:26headiusit has some C in it but it's all event-hook based, which we have
01:20:48evanyou guys have no profiler now?
01:21:12headiuswell, there's a few half-assed options for profiling ruby
01:21:29headiustons for profiling everything, of course, but that's too much noise for rubyists
01:21:42headiustwould be like having a profile include all your C++ code as well
01:22:02evansure
01:22:03headiusand the library functions your C++ code calls
01:22:14evanetc, etc, etc.
01:22:14headiuswe need something that's just ruby
01:22:15evanyep.
01:22:38rue`profile_data.reject {|line| line =~ javaish }`
01:22:48rueProblem solved :)
01:24:09boyscoutAdded Hash benchmarks. - 60a6e89 - Brian Ford
01:24:09boyscoutRework prototype Cuckoo Hash to pass specs. - b6f3796 - Brian Ford
01:25:32ddubcuckoo hash?
01:26:29boyscoutCI: b6f3796 success. 2682 files, 10322 examples, 32867 expectations, 0 failures, 0 errors
01:26:36rueddub: It is like a hash
01:27:49headiusrue: except that profiling every java function tends to skew results just a tad
01:27:57headiusinstrumenting everything slows execution down 1000%
01:28:05headiusor more
01:28:27headiusbrixen: how's the cuckoo looking now?
01:29:40rueWell, technically, slowing _everything_ down 1000% is not "skewing"
01:29:46evanheadius: what Java profiler do you use?
01:30:46evani might call it deawesoming
01:30:55evan(slowing everyting down 1000%)
01:32:06brixenheadius: it's got bad hash functions atm that behave very poorly ~20% of the time, but even with that it is currently benching on par with the chained bucket we have
01:32:57brixenyou can see the hash benches I just committed
01:33:34brixenrake -q bench:dir DIR=benchmark/rubinius/hash VM='rbx -r cuckoo' HASH_CLASS=Rubinius::Cuckoo
01:35:04brixenheadius: the benches are based on data from http://gist.github.com/113844
01:35:43dduboh interesting algorithm
01:36:15evani wonder if I can just make this a better Fixnum#hash...
01:36:20evanheadius: what do you use for Fixnum#hash
01:36:20evan?
01:37:02ddubwonders what alternatives would exist for Fixnum#hash and why they would be chosen
01:37:37evanbask in the glory of integer hash functions: http://burtleburtle.net/bob/hash/integer.html
01:37:40ddubI'd probably favor an implementation that returns itself.
01:37:54ddubbasks in the ugly green glory
01:38:03evanyou'd think so
01:38:12evanbut thats nearly the worst hash function possible for a Fixnum
01:38:14evanit terms out.
01:38:17evanturns out.
01:38:45ddubwhat do you use for the second hashing function in a cuckoo hash?
01:38:47ddubhash + 1?
01:39:25evan(key_hash ^ 0xaaebc93)
01:39:29evanI COMPLETELY made that up
01:39:32evanon the spot
01:39:37evanat 4am on an airplane
01:39:59evanafter 2 glasses of red wine
01:40:03slavathe second hash function should be key_hash >> log2(size of hash)
01:40:16evanslava: so all 0?
01:40:17evan:/
01:40:28ddubor 1
01:40:42slavano, you want one set of bits for the first hashcode and another set of bits for the second
01:41:23ddubI guess evan's makes more sense than mine, as rebuilding the hash will change the secondary values more
01:41:24evanactually, thats not a terrible idea.
01:41:45evanbut that assumes that the initial hashcode distributes over 32bits
01:41:52evanwhich is an invalid assumption
01:41:52evan:D
01:41:56ddubif you had a bunch of values that hashed close the first time, they would continue to hash close after the table was rebuilt, while that big xor, once you modded things, would probably prevent that
01:42:22ddubevan: use integer hashing on the returned hashcode! :D
01:42:39evana good idea
01:42:42slavaevan: then you can make your hashcode better first, and take the high and low bits
01:42:48evanneed a decent way to get an initial hash then.
01:42:55slavacuckoo hashes are sort of a pain, because they're not general purpose
01:43:06slavawhat you really want is for the user to be able to provide their own hash functions
01:43:12evanit all comes down to having at least ONE way to get a properly distributed hashcode
01:43:23slavathat's the problem, its impossible in the general case
01:43:33rueslava: (And users who can provide their own hash functions:)
01:43:36rueBYOHF
01:44:03slavabooyaaa
01:44:09slavausers? who needs those
01:44:21ddubI sense Object#hash2 coming
01:45:55ddubI have implemented a hash function before where items are basically put in the first free spot in an array after their index
01:45:57slavaddub: that's not a bad idea
01:46:20slavaddub: that's an open addressing hashtable, and its superior to bucket chaining in almost all respects
01:46:30slavayou guys should implement that instad of cuckoo hashing
01:46:53evanirb(main):001:0> 1.hash
01:46:53evan=> 881230262
01:46:53evanirb(main):002:0> 2.hash
01:46:53evan=> 577222732
01:46:54ddubthe advantage of cuckoo hashing is a faster lookup on conflict
01:46:56evanbooya
01:47:40rue`class Fixnum; def hash(); puts "Use an Array, you lazy bum"; end; end`
01:49:06evanslava: we may
01:49:10evanslava: we're sort of playing
01:49:22evanie, we might use cuckoo hash for MethodTables
01:49:51slavayour general-purpose hash should be open addressing, not chaining
01:50:38rue+ 1 % size?
01:50:47evanhow open?
01:50:48evanjust 1?
01:51:08slavayeah
01:51:27evanwe'll give that a shot
01:51:28evanok,
01:51:30evancavs game on
01:51:32evango cavs!
01:51:42evanbbiab
01:51:48ddubI love how mri's fixnum#hash is basically (intptr_t)obj;
01:52:03slavadoesn't mri have tagged fixnums?
01:52:07slavaor are they heap-allocated?
01:52:17brixentagged
01:52:17ddubtagged
01:52:35ddubso 1 hashes to 3, 2 to 5, 3 to 7, etc.
01:52:40slavaok
01:53:13brixengood stuff http://www.cs.sunysb.edu/~algorith/implement/LEDA/implement.shtml
01:53:51evanok
01:53:52evannm
01:53:53evanBACK
01:53:55evancommercial
01:53:59evanok
01:54:05evanone spec failure on the new Fixnum#hash
01:54:07slavaddub: 0 is the one true fixnum tag(tm)
01:55:22ddubI think symbols hash the same way, but somehow via their location in the symbol table
01:55:35ddubso :class.hash has a way lower number than :madeupsymbol.hash
01:56:29dduband they seem to increment by 80 when you make up newer values, at least within irb
01:56:32evanyeah, it does.
01:57:01ddubif only I could look at the MRI source code. but I'm hindered by my lack of interest
01:57:04ddub:)
01:57:37evani'm happy to be your MRI source proxy :D
01:57:43dduboh, re: compiler earlier, I was looking at what I could do with c++ generation in bison.
01:58:20evancool
01:58:25ddubit seems limited though; for example, it looked like it was requiring iostreams, and it looked like you couldn't control the namespace fully
01:58:48ddubalso, that they had made improvements in 2.4, while leopard ships with 2.3
01:59:45ddubbut yeah, I was looking at a way to make the parser one class with a public interface and self-contained parser state
01:59:50evanbrixen: check out line 48 in core/hash/rehash_spec.rb
01:59:51ddub(2.3 vs. 2.4 of bison)
02:01:48brixenevan: um...
02:02:05brixenwhy is that a spec?
02:02:08evanthat spec is dependent on Fixnum#hash
02:02:18evanit's failing because I changed Fixnum#hash to not just return itself
02:02:25brixenyeah, no idea why that is something to spec
02:02:43brixenthere's a Hash spec that #shift return elts in the same order as #to_a
02:02:48brixenwhich should also go
02:03:51evanyeah, i don't see what it's really spec'ing
02:04:00brixenme neither
02:04:15brixenI'm pulling in rubyspec for Hash and I'll remove those
02:04:20evan10-4
02:04:28evani'll hold on off on this commit until i see your update
02:13:07boyscoutFixed a couple nonsense Hash specs. - 2d762d6 - Brian Ford
02:16:48boyscoutCI: 2d762d6 success. 2682 files, 10321 examples, 32866 expectations, 0 failures, 0 errors
02:19:49evanI wonder if I should modify Symbol#hash to use the mix function too...
02:22:51brixenprobably
03:04:08yakischlobaevan, rue: i wrote up a #read_array_of_string for ruby-ffi. This makes it much faster. Is such a method viable for other FFI implementations (or even this one?)
03:04:30yakischlobaerr. *get*_array_of_string
03:25:09evanyakischloba: whats it look like?
03:25:28yakischlobawell. it does have to assume that the strings are null terminated.
03:26:05yakischlobapls dont laugh if it sucks :)
03:26:07yakischlobahttp://pastie.org/private/t02xtphjrxcdcwx7fq
03:28:45evanno, thats fine
03:28:49evanthast a common enough pattern
03:29:13yakischlobado you think it was previously absent just because no one had needed it?
03:29:18evanlikely
03:30:40yakischlobafor my test with 5000 iterations of the query with a large result, using that method took me from 112 seconds down to 77 (with mysql gem at 59)
03:34:34headiusevan: (int)(value ^ value >>> 32)
03:37:15slavathat's a bad hash functions
03:41:16headiusit's what MRI does
03:41:42yakischlobaevan: i am submitting to ruby-ffi. i take it you will include it in rubinius ffi at some point then?
03:42:44headiusactually I'm not sure where we got this hash from
03:44:56headiusyakischloba: cool
03:45:09yakischlobaheadius: will you also support this?
03:45:33headiuswell, since wayne does our ffi, I'm sure it will be in a release real soon after it's in ruby-ffi
03:45:48headiusespecially if it has a good use case and much better perf
03:45:53yakischlobaoh, i did not know that
03:46:18yakischlobawell i just sent an email to that ML so we shall see soon.
03:46:18headiusyeah, he did ours first and then did ruby-ffi
03:46:35yakischlobai see
03:46:35headiuswell ours first after rbx came up with the FFI APIs that is
03:48:30yakischlobaso rbx and wayne are basically who decide what the APIs are to be?
03:54:51headiusI think anyone using ffi helps make that decision
03:55:01evanwe're open
03:55:03headiusruby-ffi seems to be the best place to discuss changes though
03:55:07evanwayne has run away with the API
03:55:09headiussince it's the most widely-used ffi now
03:55:10evanso they're not in sync
03:55:25evanand we need to get the rubinius API back in sync
03:55:42yakischlobaheh
03:55:50yakischlobaneed to get more people using FFI :p
03:55:55headiustruly
03:57:06yakischlobaand half of what I should have said is: "need more documentation"
03:58:55headiusahh documentation
03:59:18yakischlobai just said to someone else in another channel after htey said "ffi has enum stuff?"
03:59:36yakischlobayes ffi has all kinds of shit you would never dream of by looking at the doc/example on the website
04:00:48yakischlobai think a lot of people look at it and say "ok great, how do i write something that isnt fibonacci"
04:06:01headiusI'd like to see more use of the swig generator
04:06:09headiuswe could probably get a lot of libraries wired up really quickly
04:06:13headiushave you played with it at all?
04:06:20headiusI got it to work for something really simple
04:06:20evanno one knows how to use it
04:06:33evani don't know that there is any info on it
04:06:37headiuswell, you have to know how to use swig first off, which took some bootstrapping
04:06:42yakischlobano. i barely even know what swig is. i have avoided it since i decided (without knowing anything about it) that it was icky
04:06:43headiusthere's a readme and some examples in it
04:06:59slavaswig is useful for binding to C++ libraries
04:07:33headiusthe swig generator doesn't even need swig at runtime, it just uses it to generate ffi bindings
04:08:44yakischlobais the result clean?
04:08:57yakischlobacan you go in and understand wtf it means and edit it? ;)
04:09:20headiusyeah, it's pretty good
04:09:28headiuscheck it out and run some examples, it's not bad
04:09:39headiusI was over-ambitious at first, trying to generate bindings for all of libc for example
04:09:46yakischloba:)
04:13:35headiusthat andrea fellow was able to generate a full set of opengl bindings though, so I presume it works
04:25:46slavaI don't think opengl bindings can be generated automatically
04:26:00slavaat least not for gl extensions, because you call those through a function pointer
04:26:05slavaif you want enough gl to run glxgears, sure you can use swig though :)
04:33:42headiusevan: is the jit hooked up by default yet, or still needs to be turned on?
04:33:58headiusor rather, does it get compiled
04:34:16evanit's not running based on method usage
04:34:24yakischlobahey what is a good palce to read about VM stuff for noobs?
04:34:32evanonly explicitly by calling Rubinius.jit or Rubinius.jit_soon
04:34:48headiusjit_soon punts it to the jit thread I presume
04:34:54evanyep
04:35:00headiuswhich is still GILed or not?
04:35:06evannope
04:35:09headiusok
04:35:16evanruns in parallel
04:35:19headiusthat's why you made the symbol change I suppose
04:35:23evanyep
04:36:04headiusokeedoke
04:36:59headiusis that the only thread-related fix you had to make for it?
04:39:45yakischlobaanyone? :)
04:41:45headiusyakischloba: I just guess at it
04:41:56headiusI'm sure these guys have some resources though
04:42:19yakischlobaheadius: i mean for serious noobs, ie i barely know what a VM does
04:43:30headiuswell, it really just handles allocating/collecting data structures and executing instructions at a level higher than the native CPU
04:43:47headiusthere's more to it obviously, but I think you probably already know more than you think
04:44:13headiusit's a program that runs programs :)
04:44:16yakischlobaso higher level than the CPU but lower level than C for instance ya?
04:44:31headiuswell, depends if you mean C as a language or C as what it compiles to
04:44:57yakischlobawhat it compiles to. but that is also something i do not understand
04:45:19headiusimagine taking an instruction set like x86 ASM and just writing a program with fake registers and fake memory that walks those instructions
04:45:33headiusthat's all there is to it really
04:45:58headiusrubinius, yarv, jvm all have their own instruction sets and their own sets of "primitives" to allocate objects and interact with the OS
04:46:49yakischlobaso the point of the VM is to create an instruction set abstraction that is closely coupled to the CPU no matter what it may be?
04:47:28yakischlobaso the rest of everything can use the VM instruction which will use whatever CPU instruction it happens to be running on and not have to think about it?
04:48:07evanno
04:48:17evanthe idea is an instruction set thats NOT close to a CPU
04:48:23evanthat is ideal for the work you want to do
04:48:53headiusright
04:49:13yakischlobayes, i believe i said it wrong
04:49:16headiusyou certainly can make it be similar to a CPU or even identical to the CPU, but usually they're more coarse-grained and higher-level
04:50:29yakischlobahmm
04:50:57yakischlobaso no reading resources? i have made a meager attempt or two at google but 'virtual machine' is polluted with other shit
04:51:27headiusthe wikipedia article is a nice intro
04:51:30yakischlobai suppose most of it is just understanding how the normal machine works eh
04:51:54headiuswhat we're talking about are process virtual machines, not system virtual machines like vmware or virtualbox
04:52:14yakischlobayes i am aware of this. that is what i was referring to when i said google was polluted.
04:52:25headiushah
04:52:26headiusok :)
04:53:02yakischloba:)
04:59:50yakischlobanight
05:00:36headiusnite nite
05:00:46headiusevan: is there any way to make it jit everything at startup?
05:01:04evannope
05:01:13evanmight be interesting to add such a thing.
05:02:33brixenevan: you going to push the hash change?
05:02:40evanyeah
05:02:46evani played with moving it up
05:02:56evanso all immediates are mixed as their hash
05:02:58evanie
05:03:08evanirb(main):003:0> :foo.hash
05:03:08evan=> 326135087
05:03:08evanirb(main):004:0> :Blah.hash
05:03:08evan=> 116859376
05:03:19evangot 2 spec failures
05:03:37evanit looks like they depend on each_pair/each yield order
05:04:01brixenwhich specs?
05:04:22evanHash#each_pair processes all pairs, yielding two arguments: key and value
05:04:23evanand
05:04:29evanHash#each yields one argument
05:06:11brixen#each_pair spec assumes hash ordering
05:06:43brixenboth those specs do
05:07:00evanyou going to fix them, or should I?
05:07:11brixeneither way
05:07:13brixenwant me to?
05:07:23evani can
05:07:27brixenk
05:07:30evanjust want to be sure we both don't
05:07:31evan:D
05:07:38brixenok
05:08:05brixenI'm working on a linear probing hash
05:08:43evanrad.
05:09:18brixenthe only reason I think it may perform better than cuckoo is because x + 1 will be faster than and h2()
05:09:30brixenunless h2(x) = x + 1 of course :)
05:09:40evantrue true
05:09:57brixenthe Pagh did his dissertation on hashing
05:10:13brixenI haven't read it yet, just rereading the cuckoo hashing paper
05:11:00evanwell, easy to combine the 2 a little
05:11:16evancheck idx and idx + 1
05:11:21evanthen switch to table 2
05:11:35brixenhm
05:15:03boyscoutMinor commenting and style fix - d2b5bcb - Evan Phoenix
05:15:03boyscoutFix specs that were dependent on Hash#each ordering - ebe7665 - Evan Phoenix
05:15:03boyscoutUse a proper integer mix to hash immediates - ff47c96 - Evan Phoenix
05:15:03boyscoutUse Fixnum#hash on the original hash value for table 2 - 1ef0d03 - Evan Phoenix
05:15:21evanwoo
05:15:38evanall immediates have a much better #hash now
05:15:56brixensweet
05:16:08evancuckoo uses key_hash.hash for table 2 now.
05:16:13evanoh, you can see the commit message
05:16:14evan:D
05:19:24evanok, well, off to do a bit of work
05:19:36brixenok
05:21:30boyscoutCI: 1ef0d03 success. 2682 files, 10321 examples, 32866 expectations, 0 failures, 0 errors
06:23:18balinthey, I'd like to contribute to rubinius and as a first step wanted to run some (ruby)specs
06:24:05balintwhen I do ./bin/mspec I get this, though:
06:24:28balint... /lib/mspec/commands/mspec.rb:153:in `exec': No such file or directory - bin/rbx (Errno::ENOENT)
06:27:56ddubare you interested in working on the specs, or work on rubinius proper?
06:37:18balintddub: rather on rubinius proper
06:37:54balintbut I'd like to get acquainted with rubinius first so that I have a wild guess of how it works :)
06:41:22brixenbalint: so, you cloned rubinius and typed rake?
06:42:18balintbrixen: after cloning, I typed 'rake spec' then it ran the compilation and showed some options to run diff. spec suites
06:42:36balintI chose to run ./bin/mspec :core
06:43:12balintbrixen: now running rake ...
06:44:03brixenyeah, you need to build first ;)
06:44:33brixenyou should have a read of /doc/getting_started.txt
06:44:55brixensome of the /doc files are dated, but that one should be good
06:47:48balintbrixen: thank you. somehow that useful file skipped my attention
06:50:33brixenbalint: heh, n/p
06:50:53brixenit's always a challenge to know what to name it
06:51:02brixenthere's README too
06:51:19brixenbut kidding aside, if we can make it easier to get started, let us know
06:53:51balintbrixen: yes, the getting_started.txt file is referenced from the README and that's where I started, I just somehow skipped that paragraph :)
06:54:18boyscoutUpdate compiler location in README. - 11294ce - Brian Ford
06:54:53brixenah, actually good to hear
06:55:05brixenI never know if folks read the README
06:55:27balintok, so when I now run ./bin/mspec core, I get "1128 files, 5760 examples, 18986 expectations, 230 failures, 196 errors", I guess this is ok and this is one of the many possibilities one can help with Rubinius, is that right?
06:55:46brixenyeah, that command runs all the specs
06:56:05brixenbin/mspec ci will run only the specs known to pass
06:56:24brixenso, the errors you see are definitely places that need fixing
06:57:30brixenone note about the specs, we're not currently implementing #freeze/#frozen?
06:57:33boyscoutCI: 11294ce success. 2682 files, 10321 examples, 32864 expectations, 1 failure, 0 errors
06:57:42balintbrixen: ok
06:57:49brixenmost of those should be tagged so you could do bin/mspec -G frozen to omit them
06:58:32brixenwe really need to get the CI bot to report spec failures as a failure :)
06:58:51brixenbut that 1 failure is a random one
06:59:06balintI go this from ./bin/mspec ci : 1502 files, 7375 examples, 23839 expectations, 0 failures, 0 errors
07:01:07brixenyeah, looks right
07:01:30brixenso, bin/mspec ci runs the files in :ci_files in spec/default.mspec
07:01:42brixenrake will run bin/mspec ci -B full
07:01:53brixenwhich runs all the passing specs in core and standard lib
07:02:12brixenthat's the :ci_files in spec/full.mspec
07:02:32balintbrixen: ok, so boyscout ran the full ci suite that's why there were more test cases
07:03:25brixenyeah, it just runs the default 'rake'
07:07:17brixenbbiab.. (running benchmarks)
08:40:54headiushmm
08:41:39headiuswhat "Bench" do these hash benchmarks depend upon?
08:45:42brixenheadius: benchmark/utils/bench.rb
08:45:53headiusyeah I found that now...trying to figure out how to run these though
08:45:55brixenit's the same as what was merged into RBS
08:46:10brixenI'll give you the command, sec..
08:46:23brixeneg rake -q bench:dir DIR=benchmark/rubinius/hash VM='rbx -r cuckoo' HASH_CLASS=Rubinius::Cuckoo
08:46:33headiuswow, long command line
08:46:44brixenthe command line is your friend :)
08:46:49headiusnot that one
08:46:50headius:)
08:47:19evanbrixen: you should rerun those stats on cuckoo with the new hash code in
08:47:44brixenjitting just a couple methods, like the key_index, gives a 2-10% improvement
08:47:49brixenevan: already did
08:47:57headiusthey still don't seem to run
08:47:57headiusstatus: "NoMethodError undefined method `const_lookup' for main:Object"
08:47:59brixenlook at sheet3 of that spreadsheet
08:48:05evanmm
08:48:07evani think i closed it :/
08:48:22evanone sec
08:48:56brixenevan: so, the hash changes are very good for removing those pathological cases
08:49:11brixenlet's see if I can gist this file...
08:49:55evancool.
08:50:20evani'm happy that thus far, having a real hash code hasn't broken anything
08:50:46brixenheadius: you have to define that method, look in kernel/delta/kernel.rb
08:52:01headiusthis was with rbx though
08:52:07headiuswell VM='rbx ....'
08:52:28headiuswhat is this method?
08:52:43headiusjust breaking up ::?
08:54:03headiushmmm
08:54:12headiusit seems to write blank results to the yaml now
08:54:14headiusstrange
08:57:11brixenheadius: ah with rbx?
08:57:14brixenthat's odd
08:57:27brixenno issues for me, even ran it with some jitted methods
08:59:32headiushmm
08:59:43headiusseems like it may be something odd running rake under jruby for this
09:00:02brixenhm, I can give you a non rake cmd
09:00:08brixenit will be longer :)
09:00:21headiusI'm curious why it didn't work with jruby though
09:00:28brixenyeah, that is odd
09:00:34headiusgrr, ^C not working in rbx?
09:00:39brixenin rake
09:00:59brixenI don't have issues with ^C in rbx by itself
09:03:16brixenheadius: actually, that nomethoderror is from mri I believe
09:03:24brixenit wasn't exec'ing rbx
09:03:51headiusyeah probably
09:04:15headiusperhaps bench.rb should define this method if it doesn't exist, since it's not in any other impl?
09:04:30headiusdid those rbs guys ever merge your stuff in? I lost track of all that
09:04:38brixenyeah they did
09:05:04headiuswell, that's positive
09:05:56headiusok, I managed to get results with rbx and jruby
09:06:06headiustook some path twiddling, but it worked
09:06:08headiusweird
09:06:48headiusone more lazy question: is there a way through the rake command to bump up iterations? some of these don't even register
09:06:59brixenyeah
09:07:20brixenuse ITERATIONS=n
09:07:22headiusok
09:07:45brixenactually, that's not what you want
09:07:47brixenI think
09:07:52headiusdidn't sound like it
09:08:00headiuslike make the benchmarks run longer per iteration
09:08:02brixenthat's how many trials are run
09:08:05brixenyeah
09:08:12headiusI phrased it wrong
09:08:20brixenyou need to modify the iteration counts in setup.rb
09:08:28brixenbenchmark/rubinius/hash/setup.rb
09:08:29headiusmmm ok
09:09:48headiusyeahm bm_create in the hash stuff...for all but the 20k version it's under 0.01, so sensitive to noise
09:10:09brixenyeah
09:10:20brixenI sigstop firefox to run the benchmarks :)
09:11:31brixenbut with bm_create, I get consistent numbers in the 0.00003 range
09:12:07headiusyeah, not really useful
09:20:23headiusbm_proportional_get_set_delete
09:20:28headiusshould that take a long time?
09:24:45headiusbrixen: looks like everything ran ok, thank you
09:25:02brixenahh cool
09:25:09brixenyeah, that bench takes a while
09:28:32headiusyeah, definitely does
10:50:12rueHey, neat, someone on #ruby-lang posted http://github.com/sophsec/udis86-ffi/blob/master/lib/udis86/ud.rb
11:57:52daddyhi
11:59:06daddyI try to compile and install rubinius from git. I've got the following error during the install 'Building extension lib/ext/readline
11:59:06daddyAn exception has occurred:
11:59:06daddy Unable to find a script 'compile' to run (LoadError)
11:59:06daddyBacktrace:
11:59:06daddy Object#__script__ at kernel/loader.rb:269
11:59:07daddyrake aborted!
11:59:11daddyCommand failed with status (1): [./bin/rbx compile -p -I/usr/local/src/rub...]
11:59:23daddyhow can I resolve this?
12:00:22dbussinkwhat command are you running?
12:00:43dbussinkeasiest way to get tests running is to git clone and then just run rake with no other arguments
12:00:43daddydbussink: rake install
12:01:03dbussinkah, advise was to not install atm
12:01:09dbussinkjust run stuff from the clone
12:01:34daddydbussink: thank you i'am trying..
12:02:30dbussinkdaddy: if you run just rake, it compiles and runs the tests
12:02:37daddydbussink: I've got: Winettou rubinius # bin/rbx -v
12:02:37daddyRuntime exception: Unable to load /usr/local/lib/rubinius/0.11/runtime/platform.conf, it is missing
12:02:54daddydbussink: Ok i try recompile the wole
12:02:57daddywhole
12:03:00dbussinkdaddy: what does just running "rake" give you?
12:03:48daddydbussink: no, that was with the previous compiled rubinius. it ts compiling now
12:04:42daddydbussink: Running 726 tests..... Runtime exception: Unable to load /usr/local/lib/rubinius/0.11/runtime/platform.conf, it is missing
12:04:53daddybut test was OK
12:04:55dbussinkhmm, weird
12:05:05dbussinkif you run rake clean first and then rake?
12:05:25dbussinkyou should nuke the install in /usr/local too btw
12:05:30daddydbussink: ok clean and recompile
12:05:49daddydbussink: how can I do that?
12:06:35dbussinkdaddy: just remove the rubinius directory in /usr/local/lib and check whether you don't have anything in /usr/local/bin either
12:07:11daddydbussink: OK I try
12:21:20daddydbussink: 82 files, 10338 examples, 32880 expectations, 28 failures, 0 errors
12:22:01daddydbussink: bin/rbx -v
12:22:02daddyrubinius 0.11.0-dev (ruby 1.8.6) (11294cedf 12/31/2009) [i686-pc-linux-gnu]
12:22:52dbussinkdaddy: hmm, what kind of failures are you getting?
12:23:13daddydbussink: like this:
12:23:15daddy27)
12:23:16daddyFileTest.writable? returns true if named file is writable by the effective user id of the process, otherwise false FAILED
12:23:16daddyExpected true
12:23:16daddy to equal false
12:23:16daddy #<Object:0x1f7de>.__script__ {} at spec/frozen/shared/file/writable.rb:11
12:23:18daddy Kernel(Object)#instance_eval at kernel/common/eval.rb:117
12:23:24dbussinkdaddy: could you use something like gist/
12:23:24dbussink?
12:23:46dbussinkdaddy: are you running this as a regular user or as root?
12:23:57daddydbussink: as root
12:24:11dbussinkdaddy: ah ok, that explains the failures then
12:24:33daddydbussink: should I do this as a regular user?
12:24:44daddyI mean recompile
12:24:54dbussinkdaddy: well, for the specs to pass you should yeah, there's no need to run stuff as root
12:25:59daddydbussink: Ok I see. There is an other problem with gems. I want to install gems by 'bin/rbx gem install' but I've got error: make: *** No rule to make target `/usr/local/src/rubinius/vm/capi/config.h', needed by `tmailscanner.o'. Stop.
12:26:20dbussinkdaddy: and if you do ./bin/rbx -S gem install some_gem
12:26:33daddydbussink: I'am trying..
12:26:37dbussinkwhat gem is it?
12:26:56daddyit is my own, but it depends on tmail
12:27:09dbussinki'll try installing tmail here
12:27:19daddydbussink: OK
12:27:29daddydbussink: same result.
12:27:40dbussinkdaddy: ah, yeah, i see it too, tmail seems to fail
12:28:36daddydbussink: can I do anything to solve this?
12:29:45dbussinkhmm, looks rubinius doesn't provide a config.h
12:31:17dbussinkdaddy: tmail doesn't work on 1.9 either
12:31:31daddydbussink: yeah, I know ... :-(
12:31:41daddydbussink: tmail is a problematic stuff...
12:34:11dbussinkdaddy: what depends on it then?
12:34:25daddydbussink: do you mean on my stuff?
12:34:39dbussinkdaddy: why you need tmail and can't use something else
12:34:53dbussinkalthough we should get tmail working too
12:35:18daddydbussink: it is an SMTP proxy program and examine and manipulate rwa SMTP mails (attachments and so on)
12:35:32daddyraw
12:38:13daddydbussink: can we provide a config.h for tmail ?
12:40:31dbussinkdaddy: seems like there is more stuff missing
12:40:38dbussinkno re.h
12:41:13jaribdaddy: tmail works without the c extension though
12:41:30daddydbussink: there is re.h but at wrong place...
12:41:34jaribtry setting NORUBYEXT=true when installing the gem
12:41:39daddyI've made a symlink by hand..
12:42:28dbussinkdaddy: to which re.h?
12:42:37dbussinkbecause rubinius doesn't have any
12:43:00daddydbussink: yes, of course in the ruby's include dir
12:43:17daddywhen I've tried it with 'simple' ruby.
12:43:30daddyThis is the first time with rubinius for me
12:43:52dbussinkdaddy: well, combining rubinius and ruby provided headers is very likely not going to work
12:44:20dbussinkre.h probably provides methods rubinius doens't even have yet in the c extension api
12:45:38daddydbussink: how can I install tmail without C ?
12:46:18dbussinkdaddy: you can try jarib's suggestion
12:46:47dbussinkdaddy: you can also create an issue on github explaining the stuff that is missing from the c api
12:47:39daddydbussink: there is no warning when I compile rubinius as a regular user.... till now
12:48:25dbussinkdaddy: why would there be? compiling stuff doesn't require writing anything into system directories
12:48:51daddydbussink: I'm registrating myself on github...
12:49:17daddydbussink: I mean there were lot of warnings when I did it as root
12:50:55rueExtensions should only use ruby.h
12:52:07dbussinkrue: yeah, too bad there's a whole bunch out there that don't adhere to that principle
12:52:15rueScrew'm
12:52:45dbussinkrue: well, could provide some additional empty headers to prevent errors, but i dunno what people use from those other headers
12:56:36daddydbussink: tmail installed successfully with 'NORUBYEXT=true'
12:58:52daddydbussink: but mysql gem failed: http://pastie.org/485230
13:00:06dbussinkdaddy: ah, well, i know that rb_exc_raise is still missing and i guess those others too
13:00:20dbussinkyou can best create a list with all missing stuff so it can be added
13:00:32dbussinkthe c api is far from being complete and needs a bunch of work
13:01:09daddydbussink: Oh , it's OK
17:20:08brixendbussink: I'll get an the capi stuff asapi, promise
17:22:11brixenheh, crucial bit of cuckoo hashing... the maxloop value
17:22:17brixencompare...
17:22:26brixen[8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536]
17:22:33brixen[3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15]
17:34:02evanmorning
17:34:15evanheheh
17:34:15evanyeah
17:34:31evancuckoo has few moving parts
17:34:34evanbut they all matter a lot.
17:36:04brixenyeah, so that is the maxloop calculation when r >= (1+epsilon)*n and maxloop is (3 * log(r) / log(1 + epsilon)).ceil
17:36:33brixenI'm doing a table for capacity <= 2 ** 16 and above that it will calculate it
17:36:53brixenwhere n above is our capacity
17:39:49evanrad.
17:46:17brixenoops had an error in my formula, but with epsilon = 1 and r as above, these are the values
17:46:20brixen[12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51]
17:46:38brixenas epsilon -> 0 the max_loop -> infinity
17:46:45brixenI guess we'll play with some values
17:47:58evancoolness.
17:55:25brixenhm, we don't really need a table, this is a regular sequence
17:55:38brixenjust a base and increment when we enlarge will do it
17:59:26evanright
18:25:55evanso, interestly
18:25:56evankoichi said 1.9 will never have a JIT
18:26:38chadwhat does "1.9" mean exactly?
18:26:46chadi know that's a strange question :)
18:26:51chad(and oh hello)
18:26:57brixenchad: not as strange as you think
18:27:04brixenI ask myself that all the time
18:27:25brixenevan: why is that?
18:27:27chadi wonder if 1.9 will remain the stable path as long as 1.8 did
18:27:28evanchad: i take it to mean (oh HI!) all the code in /trunk
18:27:42evanchad: i'm still surprised 1.9 is the "stable" path.
18:27:50chadyea
18:28:10chadi don't have a good feel for what their thinking is on how temporary 1.9 is
18:28:12chadvs. a stepping stone to 2
18:28:29evani think they've made a big blunder
18:28:43evansuddenly deciding "oh 1.9.1 means stable"
18:28:50evanie, the version numbers are more screwed up.
18:29:30chadyea
18:29:37chadi guess they just weren'tyet done with version 2
18:29:43chadbut wanted to release something people could use
18:30:38chadi wonder if koichi's JIT statement applies to 2.0 as well
18:31:13evani'm trying to find where he said this...
18:32:09evanhttp://blog.grayproductions.net/articles/the_ruby_vm_episode_v
18:32:31evanvery last paragraph
18:33:08chadyea
18:33:18chadthat seems to imply it's not just 1.9
18:33:25chadbut something he generally believes to be true about ruby
18:33:33evanyep
18:33:53evanlike "we'll never do a JIT"
18:34:02evani'm not sure his AOT compiler experiment is going to work out
18:34:04evanpersonally
18:35:42evanhis statement about adding pragmas is interesting.
18:36:30brixenI wonder 1. what is his def if JIT and 2. what he bases his opinion on
18:36:49evanme too
18:36:52brixenjitting just a few rather small methods was an easy 10% increase on those hash benches
18:37:00brixenand that was no inlining
18:37:02evani wish, in general, there was more communication from those guys
18:37:09evanright
18:37:09brixenwhich should make #insert quite a bit faster
18:37:16chadi guess his idling here doesn't imply that he'll read this :)
18:37:25evansometimes he does
18:37:33chadare you guys not doing the ruby implementors meetings anymore?
18:37:42evanthey fell off, yes.
18:37:49evanwe should back into having them.
18:38:23evana discussion about why ko1 feels that a JIT isn't possible isn't the kind of discussion we'd have in those meetings though
18:38:31evanthey were more about edge case discussion
18:38:59chadah
18:40:29evanchad: so why have you graced us with your presence?
18:40:32evangot some free time?
18:40:40chadkinda
18:40:51chadi've been cutting back on extra work in an effort to kill burnout
18:41:10chadand now that the burnout is dying i'm finding myself interested in playing with technology again :)
18:41:25chadalso i just felt like saying hi
18:41:35evanwell yay for us!
18:41:39chadheh
18:41:47evanwe're still using your Regexp#to_s impl
18:41:52chadyay me!
18:42:03chadi wonder if it ever got fixed in jruby
18:42:11chadheadius asked me to do it there and i got swamped
18:42:18chadknowing them im sure it got fixed
18:42:31evanah
18:42:38evanyeah, lopex probably did it.
18:43:04chadmy memory is so bad that i had forgotten i even did that until you mentioned it
18:43:25evanhehe
18:43:36evanwell, it was a personal sprint
18:43:41evanyou left japan with it done
18:43:47evanthat whole trip is a bit of a blur anyway :D
18:43:53chadyea
18:44:03chadand directly after that trip i started making lots of changes in general
18:44:09evani'm going be in matsue in septemember it looks like
18:44:21chadoh?
18:44:22evanseptember too
18:44:24chadheh
18:44:36evanyeah, there is a ruby conference they're putting on
18:44:38chadworking with matz?
18:44:46evanthats about ruby adoption
18:44:49evanand such.
18:44:50chadinteresting
18:44:56evani'm surprised ruby central isn't involved....
18:44:58evan:/
18:45:08chadagain, communication between the continents
18:45:14evanyeah
18:45:17evangotta send a boat over.
18:45:34chadi had intended to go to ruby kaigi this year
18:45:37evana steamliner at that, just to get the point across </japanese-history>
18:45:51chadbut then i instituted the "I don't do anything I dont' have to do" program to avoid burnout
18:45:56evangood plan
18:46:04evani hear your training for a triathalon
18:46:06evanthats awesome!
18:46:08evanwhen is it?
18:46:17chadhaven't decided which one yet
18:46:30chadbut i want to try to do a sprint one toward the end of the summer
18:46:41chadand kelly and i will do one together at the beginning of the season next year
18:46:53chadexcited and afraid :)
18:47:02evani'm sure!
18:47:06evani'd be the same
18:47:23evanyou're starting to get me motivated to start working out
18:47:28chadrock on!!
18:47:29chad;)
18:48:00evani'd love to have my endurance up before ski season
18:48:34chadour trainer works with a lot of people who are seeing her for that reason
18:48:35evandropping a few lbs would be nice too, but, ironically, i'm at my "ideal weight" for my height
18:48:38evanso what do I know.
18:48:55chadi was going to say, i dno't think you have weight to lose
18:49:17evani'd have to be doing weight transferance
18:49:34chadthat's where i'm at
18:49:57chadi'm always disrupting your peaceful channel changing the topic from deep technical stuff to random crap
18:49:58chad:)
18:50:01chadapologies
18:50:01evani found out there is a golds gym not 2 blocks away
18:50:07evannah
18:50:08headiuschad: fix which thing in jruby?
18:50:09evanit's 10:50
18:50:13evanthis is the mid morning lul anyway.
18:50:16chadRegexp#to_s
18:50:45chadi'm quite sure it's fixed, charlie :)
18:50:58headiusheheh, I sure hope so
18:51:05headiusonly bugs we get these days are painful ones
18:51:45evanchad found ours was broken because of people doing
18:51:52evan/#{another_regex}/
18:52:56chadi learned a lot about the string representation of regex when I did that. Was fun.
18:53:25evanthaht ya did
18:53:40evanwell, i'm sure we can rustle up some more like that for ya
18:53:42evan:D
18:53:45headiusahh I remember now
18:53:50chadsure :)
18:53:53chadi was about to say
18:54:00chadplease send me low hanging fruit
18:54:00chadheh
18:54:23chadi think i might play around with the reia implementation a bit. saw tony talk about it last night and it was really interesting.
18:54:23evanchad: go run your favorite library on rubinius
18:54:33chadhey i said "give"
18:54:34evanyou'll likely find some fruit
18:55:12evanit's easy!
18:55:14evanjust run some tests
18:56:03chadas a matter of curiosity
18:56:06chadwhile we have headius here
18:56:16chadwould you guys be interested in doing an implementors conference?
18:56:25chadsomething really small and focused
18:57:02evancourse!
18:57:04chadwe've (ruby central) talked about sponsoring something like that in the past and the discussion about 1.9 rminded me of it
18:57:18chadis hawaii a good place to hold it? :)
18:57:31chadtoo bad jackson hole is so hard to get to
18:57:31evanhawaii is a good answer to most questions
18:57:36evanwell
18:57:39headiussounds good to me...there's enough implementations for a whole conf now
18:57:48chadyea that's what i was thinking
18:57:49evani'm on the inside in jackson hole
18:58:01evanmy parents live there
18:58:07chadnot just the main implementors but the communities around those cores
18:58:11evanand my mom has held a writers conference there
18:58:14chadevan, yea, that's why i mentioned it
18:58:19chadand it's awesome
18:58:27evanthat it is.
18:58:38evanironicly, hawaii is probably easier and cheaper to get to!
18:58:43chadyea
18:58:48chadeasy for the japanese people too
18:58:49evansilly wyoming.
19:00:11chadyou think a couple of days would make a good implementor conference length?
19:00:17chadwow my english is awesome
19:00:37evani'd say at least 2 full days
19:00:48chadso maybe start on an evening
19:00:50chadthen have 2 full days
19:01:00evansure
19:01:07evanit would be important to have an agenda
19:01:17evansince all the implementers are workaholics
19:01:24evanwe'd just go off into our corners and hack
19:01:31chad:)
19:01:49chadi'll bring this up with the other ruby central people
19:01:56evancoolness
19:02:03chadand get back to you guys if it looks like we're interested in starting to plan it
19:02:17chadif so we'd work with you guys on what would make sense in terms of the flow, etc.
19:02:23chadas opposed to just running a normal conference
19:02:23evansure
19:02:33evani'd love it.
19:02:51chadi would love to sit and learn during such a conference
19:03:03chad...quietly
19:03:10evan:D
19:03:18evancall it a summit
19:03:24evanrather than conference
19:03:34evanthat conveys the right scope
19:03:35evani think.
19:03:40chadyea that's what we were calling it when we were talking about it
19:03:51chadthough i think extending it slightly beyond the core implementors would be cool
19:04:05chadso rather than, say 10 people there
19:04:11chadmore like 40 or 50
19:04:47dbussinkif only it were in europe :P
19:04:50evangotcha
19:04:50evanok
19:04:51evansure
19:05:06yakischlobaget more people involved :p
19:06:04evanwe're trying!
19:07:20dgtizedevan: how come Object#hash does the type dispatching for String/Bignum/Float instead of having a method for each type?
19:07:51evana WONDERFUL question
19:08:01evani was pondering that myself last night
19:08:05evani'm pretty sure we can remove that
19:08:14evanthat was when we had Hash internally
19:08:20evanand used it early on in the boot process
19:08:23brixenyakischloba: re your question about virtual machines, this is a good book http://tinyurl.com/virtual-machines
19:08:31dgtizedthe only thing I could think of, is that technically hash send_sites all point to the same place
19:08:51yakischlobabrixen: cool, thank you
19:08:51brixenyakischloba: also, have a look at doc/reading_list.txt
19:08:54evandgtized: whats "hash send_sites" ?
19:08:57yakischlobabrixen: doh ;)
19:08:59brixenyakischloba: it's a small collection
19:09:10chadgoes to the gym. later guys.
19:09:17brixensee ya chad
19:09:20evanchad: later!
19:10:26dgtizedevan: I guess I just meant that any send_sites for a call to a hash will be the same, I guess that doesn't make a difference though
19:11:33evan....
19:11:39evani still don't follow.
19:11:57dgtizednever mind, I think I spoke to soon and it didn't make sense, sorry
19:12:03evanno prob.
19:12:43dgtizedsecond question though, is concerning hashing of strings in general
19:12:53evansure
19:13:49dgtized["a","b","c"].map {|x| x.hash} => [97, 98, 99]
19:14:03dgtizedthat's kind of a shitty hash distribution
19:14:04evanin rbx?
19:14:06dgtizedyes
19:14:09evanwow
19:14:11evanit's busted
19:14:12evancompletely.
19:14:28evanyes
19:14:31evanthats completely wrong.
19:14:32evanone sec.
19:14:52dgtizedin mri it's [100,101,102] :) so we aren't that bad
19:15:08evanit should be a fully distributed 32bit hash value though.
19:15:13dgtizedyea
19:15:23tilman28 bit i think :p
19:15:31evanWHAT
19:15:31evanTHE
19:15:32evanFUCK
19:15:34tilmanto make sure it's a fixnum (on 32 bit arches anyway)
19:15:36evanwho the fuck changed our hash algo
19:15:37evancompletely
19:15:46evanthey removed the really decent hash algo
19:15:50evanand put a crappy one in
19:15:59evanpulls out git blame
19:16:36evanit was you tilman!
19:16:43evanwhat is with this terrible hash function
19:16:56tilmanwtf?
19:17:00tilmanevan: bs
19:17:06tilmani just shuffled the code around
19:17:21tilmanfwiw, i have a local branch that swaps the retarded fnv for hsieh's hash function
19:17:37evanok
19:17:38evanwell
19:17:40evanfuck me.
19:17:41evanit was I.
19:17:48evani guess i thought it was a more... robust.
19:18:00evani don't get why you refactored it.
19:18:05evanbut it is the same algo.
19:18:35tilmani forget why i did that. the preceding/following commit probably explains it though
19:18:38evantilman: whats wrong with fnv?
19:19:00evanyour commit says to allow for passing a NULL terminated string
19:19:20lypanovwibbles
19:19:50tilmanevan: you just called our hash terrible and now you're asking me what's wrong with it?
19:20:03lypanovtilmaaaaaannnnnnnnnnnn
19:20:09evansorry!
19:20:11tilmanhello lypanov
19:20:12evani over reacted.
19:20:23evani thought that FNV had a better distribution for small strings
19:20:24tilmandon't shoot innocent bystanders
19:20:25evani forgot.
19:20:39evani was just curious why you refactored it.
19:20:45evanbut i see why now.
19:20:54tilmani'd have to read the commit log ;>
19:21:06evani did.
19:21:13evanagain, sorry.
19:21:21headiushey, when you have 900 committers, who can fault ya for losing track
19:21:35dgtized["aa","ab","ac"].map {|x| x.hash} => [16816340, 16816343, 16816342]
19:21:52dgtizedthat's not very distributed either
19:22:02evanno
19:22:05evani think somethings wrong...
19:22:51headiusjruby's matches ruby, and is also not particularly distributed for that input
19:22:58headius[6562050, 6562051, 6562052]
19:23:04evanouch.
19:23:11evanthats just summing them
19:23:16brixendoesn't python use fnv?
19:24:01evani'm going to make a couple of tweaks
19:24:20evanour fnv is a little busted
19:24:24tilmanrelated question: can we drop the 28 bit clamp for hash_str on x86_64, or do we need to generate the same hash values for the same strings on any platform?
19:24:28evanwe're using 0 as the offset basis
19:24:38evantilman: we can
19:24:40evani'm going to fix that now
19:24:46evanby clamping it to FIXNUM_MAX
19:24:53evanso it will adjust based on pointer size
19:25:08headiusit's not just summing them
19:25:15headiusit sums, shifts, sums, shifts
19:25:48headiushttp://gist.github.com/115617
19:27:37headiusbut the last characters are only off by bits
19:28:24dgtized>>> [hash(x) for x in "a","b","c","aa","ab","ac"]
19:28:24dgtized[-468864544, -340864157, -212863774, -1549758592, -1549758589, -1549758590]
19:29:27dgtizedso whatever python is using is distributed nicely for single chars but isn't so distributed for the two char case
19:30:56evani dislike negative hash values.
19:31:36dgtizedI agree, but I'm just pointing out that there distribution appears to suck for 2 char case as well
19:31:48evanok, with my change
19:31:49evanirb(main):004:0> ("a".."e").to_a.map { |c| c.hash }
19:31:49evan=> [604776751, 655109606, 638331985, 554443888, 537666275]
19:31:52headiuswhat's wrong with negative hash values?
19:32:13evanthere is a minor variant of FNV that works better for short sequences
19:32:23evanthat just changes the order of operations
19:32:58evanit appears to give us a bit better 32bit distribution
19:33:13evanand still work fine for longer sequences
19:33:18evanheadius: they look funny :)
19:33:23dgtizedheadius: because they make more sense as unsigned values? They are technically array offsets
19:33:44dgtizedwell ish
19:36:17headiusdgtized: bits is bits
19:36:44headiusthat they're being represented as a signed integer is not the hash value's fault
19:37:22evantrue enough.
19:38:52evanit's almost like hash values should be their own knid of object
19:39:01evanand #inspect prints them out in binary.
19:39:13brixenthat'd be cool
19:39:22brixensave me a lot of to_s(2) :)
19:39:27evanhehe
19:39:40evanall this changing hash functions is sussing out a lot of specs
19:39:46evanfound another thats dependent on hash ordering
19:39:47evan:D
19:39:52brixencool
19:40:01brixenI'm surprised jruby didn't find them all
19:40:12evanme too
19:40:21evanwell headius said they use the same hash algo as MRI for a few things
19:40:29brixenahh ok
19:40:31headiusmost things
19:40:36evanthis new one is when the Array is full of Strings
19:40:48headiusand since most of the specs don't care about insertion order it probably just happened to match
19:40:56evanyep
19:41:11headiusI need to pull updated specs now, to make sure we weren't implementing something broken :)
19:41:55dgtizedso I have a third hash question concerning the cuckoo hash
19:42:38evanluislavena: hola!
19:42:47luislavenaevan: hey!
19:42:49evandgtized: just pushed the String#hash fix
19:42:53evannot sure why boyscout didn't say so.
19:43:09dgtizedmy understanding is that part of the performance gain we hope from is that we will increase the cache hits by avoiding the bucket based linked lists
19:43:53dgtizedhowever, if we still store each entry as a seperate object, when we push them all into the tuple, we lose the linear memory ordering property, because they are all indirect objects
19:44:11evandgtized: thats a property of cuckoo hash, yes, but we need to restructure things a little to really start to see that
19:44:23evanwe still have a tuple that contains references to Entry objects
19:44:28evanto get the cache line improvements
19:44:34evanwe need to remove the Entry objects
19:44:34dgtizedI wonder if we can increase hash performance by storing the data as [key,hash_key,value,key,hash_key,value,key,hash_key,value,key,hash_key,value,key,hash_key,value,key, hash_key,value]
19:44:39dgtizedyea
19:44:39evanso all the data is stored directly in the Tuple
19:44:54headiusI hope you didn't type all that
19:44:57evanhah
19:45:08evanthats odd.
19:45:14evanmy commit didn't show up on github...
19:45:45brixenevan: it's there
19:45:56brixengithub is just slow displaying it
19:46:37evanok
19:46:43evani think they're having caching issues
19:46:44evanit's http://github.com/evanphx/rubinius/commit/d0aac4e9a665f7a87ad4fe9ca2cc52754fe382a6
19:46:50dgtizedif we store them all flat in the tuple, will setting the hash_key value to nil work as a tombstone for deleted values?
19:46:52evanfor those that want to look
19:47:13luislavenaevan: how jit-llvm is coming?
19:47:14brixendgtized: the trade off is a bunch more operations for inserts and moves
19:47:15evandgtized: yeah, that should work
19:47:18evanluislavena: good!
19:47:22evanabout to push some more work on it
19:47:25brixendgtized: like 3x
19:47:45evanthis is where value types would be nice
19:47:52brixendgtized: you need to show that cache performance is the issue
19:48:03brixenbased on what I'm seeing, # of ops is the issue
19:48:03luislavenaoff-topic question...
19:48:28luislavenais the capi a Rubinius only api or is MRI compatbile one?
19:48:44evanluislavena: it's MRIs API
19:48:45dgtizedbrixen: ah, that's probably because the interpreter overhead is more then we can stand to gain back by cache hits
19:48:48evanwe didn't invent a new one
19:49:00brixendgtized: it may already be in the cache
19:49:00evanit's glues MRIs C API to rubinius internals
19:49:14brixenjust because an object isn't contiguous doesn't mean it's not in the cache
19:49:18luislavenaevan: so that replaces subtend, which was C only, and now everything is C++ ?
19:49:26evancorrect.
19:50:14luislavenaevan: cool.
19:51:00dgtizedbrixen: if it's being overshadowed by the overhead from the interpreter it doesn't matter if it's in the cache or not
19:51:59evanby having them all in one contigious line of memory
19:52:05evanthe idea is your forcing a cache line to be used
19:52:13evanbut thats assuming a lot about the MMU
19:52:16boyscoutSwitch to using FNV-1a for better small string distribution - d0aac4e - Evan Phoenix
19:52:16boyscoutFix spec dependent on Hash ordering - 6ce096c - Evan Phoenix
19:52:38dgtizedevan: but if how much do we clobber that every time we go back to the opcode loop?
19:53:09evanwe're just as likely to do that to the cache line that contains the whole tuple
19:53:22evanyou can't assume much of anything about how your code is going to effect the cache lines
19:53:29evanunless you get out a monitor and check it out
19:54:23evanas for how the interpreter effects i'd
19:54:37evanmy super unscientific assumption would be the interpreter blows up cache lines constantly
19:55:10dgtizedI can think of one nice effect that we could do if it's stored in triplet in the tuple -- we could try moving the hash back into c++, but still have valid code to read it from interpreted land
19:55:18evanno no.
19:55:21evanwe're not doing that.
19:56:24dgtizedto ensure deeper turtles, dependency ordering, or some other reasons?
19:56:48evanall of the above
19:57:34evanone being, we should make the system fast enough that moving something like that into C++ gives us no benefit
19:57:40evanwe're getting close to that.
19:57:59evansince the Hash table is really bound by the performance of #hash
19:58:38dgtizedis it? I thought it was bound up in [] and []= suggesting it was the insert timing, not cost of #hash -- that said maybe I misread brixen's tables
19:58:53evansure, but moving that into C++ gives us nothing
19:59:12evanbecause we'd have to have a bunch of primitive boundaries to get to a [] written in C++
19:59:50evani'm pretty "meh" about moving large data structures into C++
19:59:55evanit complicates a lot of things
19:59:59evanand it's a kludge.
20:01:13dgtizedI guess I hadn't thought of how many equals and hash calls are made inside the insert function so it would keep jumping back into interpreted code
20:01:24evanyep
20:01:51evanbetter would be to teach the JIT about this code scenario
20:02:00evanlike I did with Array#each
20:02:05boyscoutCI: 6ce096c success. 2682 files, 10321 examples, 32866 expectations, 0 failures, 0 errors
20:02:18evanbrixen: I pushed more JIT fixes
20:02:27evanbrixen: Iterator#next compiles fine now.
20:03:37brixenevan: saweeeet
20:04:11boyscoutFix how the JIT calculates which BasicBlock to use - 2ca52ab - Evan Phoenix
20:05:29dgtizedevan: did you already push the code for dealing with Array#each?
20:05:34evanyep
20:05:43evantry the bm_array_each.rb with --fast
20:05:43evanie
20:05:53evanbin/rbx --fast benchmark/rubinius/bm_array_each.rb
20:05:58dgtizedand what's the recompile to enable --fast first?
20:06:07dgtizedor does --fast just work these days?
20:06:19evanyou need to have run rake with RBX_LLVM=1
20:06:24evanto link in LLVM
20:06:26dgtizedk
20:08:18dgtizedand just check out llvm into vm/external_libs/llvm?
20:09:34evanyes.
20:11:16boyscoutCI: 2ca52ab success. 2682 files, 10321 examples, 32866 expectations, 0 failures, 0 errors
20:31:52rueHola
20:32:02ruedgtized: Or symlink it
20:32:08dgtizedyuck, llvm HEAD fails to compile
20:32:41rueIf it is the __STDC, just build again
20:33:40dgtizedhttp://gist.github.com/115673
20:34:07dgtizedI'm trying it again with the default 2.5 release
20:34:15evanno
20:34:19evanyou have to use SVN HEAD
20:34:59ruedgtized: r72106 is OK for me, which revision do you have?
20:35:14rueAnd wtf `svn log --limit 1` takes like 10 seconds
20:35:18dgtized72220
20:35:37brixenllvm commit log makes for some amusing reading
20:37:56luislavenawonders why rubinius repo is sooo huge
20:38:15brixenis there a well-maintained public git-svn of llvm?
20:38:27brixensvn just sucks so bad
20:38:27evannot that I know of.
20:38:42rueCould set one up
20:38:54rueThough I shudder to consider the initial import
20:40:30evanyeah
20:40:31evanme too.
20:40:40evanif you do
20:40:44evandon't do full history
20:40:52evando it relative to the current HEAD
20:40:53rueinstalls git-svn
20:41:18dgtizedcouldn't you do it relative to say release 2.4?
20:41:31dgtizedallowing for a recent revert or two?
20:41:44evansure
20:52:02tilmanbrixen: there's a mirror on repo.cz, but i don't know how up to date it is
20:54:36rueLooks about 24h behind
20:54:43ruehttp://repo.or.cz/w?p=llvm.git;a=summary
20:55:00brixentilman: sweet
20:55:56brixengitweb is so retro
20:55:57evanmy patch is in there
20:56:05evanso we're free to use that
20:56:09rueHah. "Test commit"
20:59:34rueThey only have a bit over 100k objects.
21:07:55boyscoutPlaying with building up another optimization pass set - 7b809fa - Evan Phoenix
21:08:26rue*Jaws music* For compiling from the git repo
21:10:32evanhah
21:10:33rueHm. The OOo website is good.
21:10:41evanlet me know how it goes
21:10:46evanwe could maybe use that as a submodule
21:11:03evansince, for once, we'd actually be using a submodule for the purpose they're designed for :D
21:11:13rueHeh
21:13:38boyscoutCI: 7b809fa success. 2682 files, 10321 examples, 32866 expectations, 0 failures, 0 errors
21:14:49evanah sweet.
21:14:57evani can have LLVM, when it detects invalid IR
21:15:08evanjust print out a message and indicate as such.
21:15:11evanand not abort
21:15:20evanwhich means I can turn on the hotspot jit
21:15:32evanand not worry about it aborting the problem because it's not yet working perfectly
21:16:28lypanovevan
21:16:36evanlypanov
21:16:53lypanovdid you get around to dumping bitcode for the intrinsics?
21:17:02lypanovas in
21:17:28lypanovare the rubinious opcodes now intrinsics
21:17:41lypanovand are you compiling said c into llvm bitcode?
21:18:39evani did that before
21:18:47evanit was a bit of a pain
21:19:03evanthis time, i did it more logically
21:19:18evanie, i decided which opcodes should be functions and which ones not
21:19:25evanand coded them myself
21:19:30evanthe ones that are functions are implemented in C
21:19:35evanand called out to
21:19:39evanbut not all of them
21:19:41evansince last time
21:19:52evanthe thing that was taking a huge amount of time was the inliner
21:20:09evannow the IR is much cleaner
21:20:20evanbut i know which opcodes are common and which are rare
21:20:23evanso i can make the decision once
21:21:49dgtizedrue: did you get git llvm to compile, and is so what version of gcc are you using?
21:29:59evanlypanov: make sense?
21:30:16dgtizedevan: when was your patch to llvm committed?
21:30:35evanhttp://repo.or.cz/w/llvm.git?a=commit;h=6841c1aafe655bc77643107716f46d5951df8626
21:32:00dgtizedalright I will try compiling from that
21:33:22lypanovevan: sorry. mega distraction. will read shortly
21:34:23evanno prob
21:36:24boyscoutManually verify each Function and report if it's broken - 0566724 - Evan Phoenix
21:37:21dgtizedevan: are you depeneding on rake to compile LLVM or configuring and making it by hand?
21:37:42evaneither is fine.
21:37:48evanrake will do it if it must
21:38:10dgtizedwell it's not compiling for me, including from the revision your patch was accepted for
21:38:26dgtizedconsistantly get this build error: http://gist.github.com/115673
21:38:47evanok, one sec
21:38:49evanwhat gcc version?
21:38:56dgtized4.3.3
21:39:32evani'm asking the llvm guys
21:40:01dgtizedk, thank you -- do they have an irc channel or just a dev email list?
21:41:05evanirc on oftc.net
21:41:54boyscoutCI: 0566724 success. 2682 files, 10321 examples, 32866 expectations, 0 failures, 0 errors
21:42:12evandgtized: they're going to take a look
21:45:08dgtizedthanks again
21:48:25evanno prob
22:06:45brixendgtized: this is a quite good paper http://www.siam.org/meetings/alenex05/papers/13gheileman.pdf
22:06:50brixensee the conclusions
22:09:09dgtizedbrixen: fair enough
22:11:02brixendgtized: it really comes down to the key distribution more than anything else
22:11:23brixenif it's the normal distribution, you are golden just throwing darts at a wall
22:11:43brixenif not, your careful algorithm falls down all around itself
22:13:35brixendgtized: I'm looking at this now http://crpit.com/confpapers/CRPITV91Askitis.pdf
22:15:39headiusso perhaps I'll show my ignorance here, but what exactly is wrong with those sequential strings having sequential hashcodes
22:15:50headiusthey'll end up in different buckets in just about every distribution
22:16:51dgtizedcan you re-explain how you get 3x operations by flattening the structure into the Tuple, from my mind even though you save multiple accesses into the Tuple, you pay for it by 3 accesses into the Struct + 1 for getting the struct from the Tuple
22:17:30headiusdgtized: I think the problem there is not having the buckets reference a separate structure
22:17:49headiusso if you have hash collisions or need to grow the hash (which you may have to do more often) you're reallocating and redistributing more stuff
22:17:57luislavenaevan: is just me or simple rake -T just fires the entire build process?
22:18:19luislavenathinks a dependency issue smell over there.
22:18:28luislavenaevan: talking about rubinius itself.
22:21:01brixenluislavena: what do you mean by entire build process?
22:21:35luislavenabrixen: rake -T fires the compilation of the vm, which fires the compilation of the externals...
22:21:47luislavenabrixen: while only should list the task I have available.
22:21:49brixenfrom a fresh clone ?
22:21:57brixenit only lists tasks for me
22:22:50luislavenabrixen: yes, fresh clone.
22:23:07brixenyeah, probably some dep messed up
22:23:11brixenbuild once ;)
22:23:22luislavenabrixen: guess have no choice ;-)
22:23:39brixenluislavena: replacing rake is the next task on my list
22:23:51luislavenabrixen: with what?
22:23:55brixenTap
22:23:57luislavenabrixen: I think rake is not the problem.
22:24:12luislavenabrixen: hmn, I have my doubts..
22:24:22brixenluislavena: sure, you can always work around rake
22:24:30brixenbut I'm tired of working around it
22:24:34luislavenabrixen: tap sounds good to pipe "task" but not file based dependency.
22:24:44brixenit's got both
22:25:23luislavenabrixen: yes, I know, but in comparison aren't so powerful.
22:25:35luislavenabrixen: I guess I'm sooo used to rake and the way it works :D
22:25:38evanthe deps are a mess.
22:25:41evanagain.
22:25:53luislavenaevan: you need a dep cleaner ;-)
22:26:06luislavenaevan: there is a tool that graphs the build tree.
22:26:16brixenluislavena: when all you have is rake, everything looks like a dep ;)
22:26:24evanluislavena: yeah, ryan wrote it AND he did most of our deps
22:26:27evanso meh.
22:27:07brixenluislavena: but, your build will be done by the time your done complaining ;)
22:27:11luislavenaevan: there is also drake, which is like make -j :D
22:27:15brixenand you only build a fresh clone once
22:27:21luislavenabrixen: ;)
22:27:29evanluislavena: yeah, drbrain couldn't get our deps sorted out to use drake reliably
22:27:52luislavenaevan: I cannot promise but been peeking some workarounds in a local branch.
22:28:04luislavenaevan: peeking/hacking.
22:28:17evansure
22:28:22luislavenaevan: got quite used to rake so do proper chaining feels natural now.
22:28:52brixenluislavena: show me "proper chaining" for rake clean build and I'll change my mind
22:29:10brixenwithout a bunch of gross Task.invokes
22:29:29luislavenabrixen: CLEAN.include ;-)
22:29:42luislavenabrixen: you need to know what are your artifacts, of course.
22:30:23luislavenahave a quick question, is the libtommath makefile generated by you guys, or is part of the original lib?
22:30:24brixenluislavena: also, could you add decent task docs and command line args
22:30:31brixenohh, now you have Tap :)
22:30:48luislavenabecause need to change the "a.out" to just "-o a" so I can run it on windows.
22:30:49evanluislavena: it's part of the original lib.
22:31:00evango for it
22:32:53luislavenabrixen: maybe I need to give another opportunity to Tap.
22:33:15luislavenabrixen: wonder why any of you guys went with Thor :P
22:33:58brixenI haven't scientifically evaluated the difference
22:34:12evanThor isn't really a build tool.
22:34:14evanas I recall.
22:42:48luislavenaevan: well, people used it in so many weird ways :P
22:44:22lypanovevan: tonight is just not my night. acceptance blew up also. i'll get back to you another time on the topic
22:44:54evanno problem
22:44:56evani'll still be here.
22:45:23lypanov:)
22:45:27lypanovspeak to you soon
22:45:29slavahi evan
22:45:45evanso, i guess their is an laruby group meeting tonight
22:45:54evanbut damned if i can find any details about it
22:46:08rueevan: I can probably get you info, sec
22:46:45evanthey don't seem to put the info anywhere
22:53:29headiusevan: just ran into an interesting case
22:53:38headiuswe added super call site caching in 1.3
22:53:39evanoh?
22:53:51headiusbut there's one special case that screws it up
22:54:06evanwhats that?
22:54:27headius[:name1, :name2].each do |name|; define_method name do; super; end; end
22:54:39headiussomeone was doing that in a real app
22:54:54headiusthe problem is that there's only one super call site, right? but it's got multiple names that super through it
22:55:07headiusin all other cases it's ok to not have to re-check the previously cached name
22:55:11evanwow.
22:55:14headiusthis one case has to check the name too
22:55:14evanfire.
22:55:16evanfired.
22:55:23headiusyeah, pretty gross
22:55:30rueevan: Looks like the ATTi offices in Glendale, confirming
22:55:38headiusI'm pretty sure this is the only way this can happen
22:55:47headiusany other block would have a single containing method to super
22:56:33evanheadius: what about duping the block body
22:56:35evanfor define method
22:56:38headiusthat was my first thought
22:56:38evanto create 2 sendsites
22:56:52headiusthe problem is that I may already have compiled it
22:56:57slavaI think in the future dynamic language designers will go for a stricter compile time/run time separation to ensure to avoid things like this
22:57:03headiusdefine_method is just stuffing that block into something else
22:57:18evantrue
22:57:47headiusI'll probably just do a string identity check since we intern all method names
22:58:04headiusworst case would be if there's a method name somewhere that didn't get interned (very unlikely) and kept failing identity check
22:58:04luislavenastupid question: llvm download: binaries or svn/tarball and then configure make?
22:58:15headiusat which point it would be no slower than before 1.3
22:58:43evanluislavena: has to be svn
22:58:59evanheadius: well
22:59:03luislavenaevan: cool, but I need to manually make then, since is looking for Release, right?
22:59:04evansince you're going to be checking
22:59:17evanseems like you could spin that as an inline cache for Object#send too
22:59:39evanRelease don't matter
22:59:40evanbut yes
22:59:45headiuswe have a send cache for literals, but I haven't gone the next step
22:59:58headiuswe also have a respond_to? site that's like a two-level cache with name check
23:00:08headiusso this isn't unprecedented
23:00:15headiusI just didn't consider the case of a super site handling two names
23:00:30evanyeah
23:00:34evanseriously.
23:00:37rueluislavena: Or git!
23:00:43headiusit's definitely weird
23:00:50headiusand no existing tests or specs caught it
23:00:52headiussigh
23:01:00luislavenarue: isn't out of sync the git version?
23:01:31rueluislavena: The one from repo.cz is a day behind, so it works too
23:01:37rueJust built actually
23:01:53luislavenarue: yikes, in the middle of the checkout.
23:02:15rueIt will take a bit longer for SVN :)
23:10:48headiusshould just do a GH mirror under evanphx
23:12:01evani'm not that mean to the GH guys :D
23:12:01luislavenarue: already compiling, so not bad :)
23:12:17sandalanyone got a moment to verify a bug for me?
23:12:27evansandal: sure
23:12:33sandalhttp://bit.ly/K9hDL
23:13:00sandalevan: I finally got off my ass and decided to play with rubinius :)
23:13:07sandalthanks to you and others for a very cool project
23:13:17evan:D
23:13:18sandalall Prawn's examples run perfectly!
23:13:38evanum
23:13:47evani have no clue why your code would run
23:13:50evanoh
23:13:54evanyou want to make name writable?
23:14:11evanin rubinius, the name of a class is stored as a @name ivar
23:14:11sandaltest/spec depends on this
23:14:16evanthat has to be a symbol
23:14:17sandaland it works on Ruby 1.8.6 MRI
23:14:21evanright
23:14:28evanbecause MRI doesn't store the name of a class in ivars
23:14:32evanwe do.
23:14:40sandalso this is just an incompatibility then?
23:14:59sandalI see.
23:15:28evan@name is a slot style ivar
23:15:35evanwith a fixed type (Symbol)
23:15:40evanthats why you get this error.
23:15:48evani guess we could change what the slot is called...
23:15:52sandalI could probably make a patch that works to test/spec that works around this issue for Rubinius
23:15:52rueCould write a conversion wrapper, of course
23:16:48sandalI'm not sure how often people are going to run into this, it seems a little scary to me to change name anyway
23:16:50evansandal: thats certainly one solution
23:16:54evanyeah
23:16:58sandalBut... it does break compatibility with MRI
23:17:00evanwhat is test/spec expecting to do?
23:17:10evanwell, we've got lots more stuff like this
23:17:13sandalmy guess is that this is for describe blocks
23:17:18evanso we're going to run into this.
23:17:21evanbut why is it on Class?
23:17:25evanthats the problem.
23:17:37sandalactually, check my spec
23:17:41sandalit doesn't need to be on class
23:17:48sandalIt just needs to be on 'a class'
23:17:57evansame thing
23:18:00sandalwhich is what test-spec is actually doing
23:18:05sandalwell... anonymous clases
23:18:09evanthe receiver is a Class object
23:18:12sandalsubclasses of Test::Unit::TestCase
23:18:13evanan instance of Class
23:18:23sandalthink of it like this
23:18:35sandalfoo = Class.new(Test::Unit::TestCase)
23:18:50sandalfoo.name = "My Test Case"
23:19:00evansure i get it
23:19:09evanso test/spec picked, imho, a bad method name
23:19:16evanand we happen to conflict with it.
23:19:17sandalI think so too.
23:20:17sandalSo actually, I think that Rubinius has a better behavior here
23:20:17sandalI just didn't know how religiously you wanted to be compatible with MRI
23:20:17sandal(totally new here :)
23:20:17evanwell, there are 2 ways around this
23:20:24evanwe do
23:20:33evanbut we have to push back in certain places
23:20:37evanotherwise we'll get painted into a corner.
23:21:00sandaltrue, it's not necessarily best to duplicate design mistakes
23:21:24rueI like you :D
23:21:33evan:D
23:21:44evansandal: perhaps you should push back on test/spec, have them change it to .description
23:21:48evanor something
23:21:53evanyou'd be doing us a favor if you did.
23:21:56sandalyeah, I'll give that a try.
23:22:02evanthanks!
23:22:09evanbtw, i totally meant to reply to your email
23:22:13evanbut it slipped my mind.
23:22:25sandalIt's not too important to me, just that if I can get my tests to pass in Prawn
23:22:35sandalthat makes Rubinius the current leader of the GoRuCo Prawntest
23:22:41evanwooo
23:22:50sandalMacRuby also gets 100% examples to run
23:23:12headiusPrawntest?
23:23:14sandalbut does not seem to like RubyGems much
23:23:14sandalor something
23:23:25headiusI think all prawn tests run green in jruby master now
23:23:31headiusthere was one last bug to fix that I pushed last night
23:23:35sandalhahah headius you're losing the Prawntest, BTW
23:23:35sandalI'll be sending you bug reports too
23:23:41ruesandal: MacRuby development version?
23:23:44sandalOh, really?
23:23:45sandalAwesome
23:23:46headiusyes
23:23:52sandalrue: 0.4
23:24:08sandalheadius: I gotta try that out then
23:24:35rueAh, OK! I figured the experimental branch is probably not at that stage yet
23:24:36sandalwas it the issue with pack/unpack or something like that?
23:24:36sandalOkay, so basically... I'm giving a talk that's about two different things at GoRuCo
23:24:47sandalThe different Ruby language versions, and the different implementations
23:25:00sandalI want to leave the science to you guys ( headius, evan , etc)
23:25:06sandalso I just tried to get Prawn working :)
23:25:17ruesandal: You *must* flip a coin on stage in that case :P
23:25:18evan:)
23:25:28sandalIt was a way to get familiar with the basics for each project.
23:25:36evansandal: well, if you need anything from me, let me know.
23:25:46headiusthat was just based on gem install prawn and then rake test from the gem dir
23:25:51headiuswhat was it failing?
23:25:57sandalevan: would you accept a patch to getting started that just lets people know that running rbx without any args == irb ?
23:25:58headiusI think there was one "unexpected nil" failure left or something
23:26:26sandalheadius: I didn't try running the tests for JRuby yet.
23:26:35sandalThe examples fail because of some array index out of bounds
23:26:37evansandal: certainly
23:26:41headiusoh, how is it that we're "losing" the test then?
23:26:46headiusit looks ok to me
23:27:00sandalBecause any example involving TTF didn't run :)
23:27:07headiushmm
23:27:15sandalexamples != unit test
23:27:16headiusis that newer than the current released gem?
23:27:30headiuswell, if prawn doesn't have tests that actually exercise things that's not my fault ;)
23:27:33sandalno, just run rake examples on 0.4.1
23:27:37sandalI can pastie you
23:27:44headiussure
23:27:54headiusI could have the fixes in 1.3.0RC2 if they're not extensive
23:27:56sandalThey do, that's what the nil failure was about
23:28:09sandalbut let me pull down JRuby from edge before wasting time
23:28:45headiussure
23:28:56sandalFWIW (and to all the alt. implementer's credit) I have never tried to run Prawn on anything other than MRI and ko1's Ruby 1.9 until yesterday
23:28:59headiusthere's dist builds here: http://jruby.headius.com:8080/hudson
23:29:10sandalthe fact that it all pretty much just 'works' is awesome
23:30:12evanyeah
23:30:24evani'm super jazzed it's working as well as it has for you
23:30:25evanyay!
23:30:59sandalheadius: if I just pull from master on github mirror will I get the changes?
23:31:11sandalOr should I be looking elsewhere?
23:31:44headiusthe github mirror should be fine
23:31:51headiusit's only about 5 minutes behind at any given time
23:32:04headiuswe're pushing out RC2 monday, so there's a window for fixes
23:32:34headiusgit://github.com/sandal/prawn.git yes?
23:33:25sandalyep
23:33:48sandalbut I've been testing against 0.4.1 to avoid my edge nastiness from skewing results
23:33:59sandalso just unpacking the latest gem would work
23:34:26sandal(Though AFAIK, the latest in master should work, just a pita to get set up)
23:34:38headiusahh ok
23:35:21headiusI know test should be fine, trying examples
23:35:37headiusRunning Examples
23:35:37headiusRan in 21.387 s
23:35:39headiusis that right?
23:35:54rueis tempted to push LLVM to github
23:36:07sandalheadius: yeah, sounds like you are getting something that works
23:36:16headiusrue: do
23:36:17sandalyou would have seen a bunch of ArrayIndexOutOfBounds errors
23:36:25sandalcheck something like output/utf8.pdf
23:36:31sandalif that's there, it worked
23:36:49headiusit's there and looks good...bunch of greek characters?
23:37:08sandalyup
23:37:18headiusgreat, no worries then
23:37:21sandalbuilding jruby now to test on my end
23:37:31sandalis that going to create a working bin/jruby for me?
23:37:36headiusyep
23:37:49headiusthat's all there is to it
23:38:07headiusthe fixes for all this should be in last night's build too, if you have any trouble building
23:38:31sandalman both Rubinius and JRuby have been making my lap warm for the last day. And I don't mean that in a good way.
23:38:44sandaldamn MBP gets hot when it compiles
23:38:50slavathe new unibody ones aren't so bad
23:38:57headiusheheh
23:38:59headiusat least you don't have to build the JDK
23:39:07sandaltrue
23:39:10slava<troll>JDK is bad for the environment!</troll>
23:39:29brixenslava: yeah, the new mbp's are so nice
23:39:55sandalit'd be nice if jruby, kvm, mri, and rubinius all supported a standard command line layout for sub commands.
23:40:03sandalI really like bits and pieces of each of them
23:40:16brixenrbx is the best of course :)
23:40:19sandalI sort of like the idea of moving everything inside one command
23:40:33sandalinstead of having 500 executables with different prefixes
23:40:44sandalthen it'd also allow something like
23:40:48sandal<my interpreter of choice> gem install ...
23:40:50headiuswe do things like MRI
23:40:54brixensandal: the ironruby guys started some command line specs :)
23:41:01evansandal: both rubinius and jruby support using -S to use "internal" versions
23:41:03headiusthe -S thing is only to avoid calling MRI's versions
23:41:12sandaloh, neat
23:41:16headiusif you put jruby's bin first in path you can just do "rake" or "gem" or whatever
23:41:26headiusmost people don't want to do that
23:41:40sandalOkay, -S makes sense then
23:41:58sandalIt's mainly that right now I like 100 different Rubies installed :)
23:42:06headiuswe go back and forth on the debate about whether they should all be "jgem" and "jrake" and "jspec"
23:42:18headiusgem install --format-executables is your friend
23:42:20sandalWhen I use MacRuby I keep thinking of McDonalds
23:42:28sandalwhich isn't a good thing
23:42:30headiushaven't quite been willing to pull the trigger on making that default
23:42:35sandalA macrake sounds pretty disgusting
23:42:40headiuseww
23:43:10headiusmacgod
23:46:21sandalheadius: how recently was that patch applied?
23:46:33headiusdays
23:46:35sandalhaving the same problem here with the new build on master
23:46:40headiusreally?
23:46:42headiushmm
23:46:45sandallatest commit on jruby master is may 03rd, i think
23:46:55headiusoh, you grabbed my jruby I bet
23:46:59headiusget jruby/jruby
23:47:17sandalah, yep, that's the problem
23:47:20headiusdeleting
23:47:26headiusI thought I had nuked that already
23:47:35sandalGithub sprawl FTL
23:47:40headiustotally
23:48:27sandalthis stuff is way too much fun. I'm afraid that I'm going to end up getting sucked into this whole implementing Ruby thing
23:48:40sandaljust when I thought I could relax and take a break from open source for a while
23:48:57headiusheheh
23:50:10luislavenasandal: you can never escape of open source...
23:50:20luislavenasandal: it suck you in...
23:50:28luislavenasandal: and never let you go.
23:50:34sandalluislavena: hahaha, good point
23:50:45sandalThe only way to escape is to unplug completely
23:51:06luislavenasandal: yes, stop coding, stop using software, just start doing pottery...
23:51:20luislavenasandal: been thinking on that for a while...
23:52:41headiusheh, 135 commits since may 3
23:52:48headiusno wonder it failed
23:54:07sandalheadius: how far along is Ruby 1.9 support for JRuby?
23:54:16sandalevan: Is there plans for 1.9 support in Rubinius?
23:54:18headiuskinda stuck around 90%ish
23:54:30headiushopefully to be finished up in 1.4 this summer
23:55:02slavawasn't 1.9 a preview release for 2.0, or something?
23:55:11sandalslava: well... :)
23:55:14headiusit's a stable preview!
23:55:18luislavenaevan: how do I know if rbx built with LLVM support? rake RBX_LLVM and everything is ok (after a clean)
23:55:19sandal1.9.0 was originally supposed to be that
23:55:24headiusa final beta
23:55:29sandalbut 1.9.1 is considered stable
23:55:39evanluislavena: rake RBX_LLVM=1
23:55:46evansandal: haha
23:55:48evan:/
23:55:52luislavenaevan: there is no info in the rbx -v ?
23:55:59evanluislavena: about what?
23:56:04evanif it was compiled with LLVM?
23:56:05evannot atm.
23:56:15luislavenaevan: about LLVM being linked/included/used.
23:56:27luislavenasandal: 1.9.1 is the stable version of the 2.0 preview :D
23:56:27sandalso is MacRuby the only alternative implementation that's Ruby 1.9 compatible right now?
23:56:29evannot currently, no.
23:56:36evansandal: thats even debatable
23:56:43evanbecause they've gutting so much
23:56:43sandalevan: true :)
23:56:49headiusmacruby isn't 1.9 compatible
23:56:58sandalI was just really happy that they released 1.9.1 before my book prints
23:56:59headiusmainly because nobody knows what 1.9 compatible is
23:57:07sandalBut it's based on 1.9, right?
23:57:18headiusyeah, and then they took out all the 1.9 core classes and replaced them with objc
23:57:28evanit's not based on 1.9 anymore
23:57:30headiusso I think largely they had to start over on compat in many cases
23:57:33sandalYeah, that's simultaniously awesome and scary
23:57:33evanthey happen to still use their parser
23:57:38evanbut thats about it.
23:57:45sandalthey're moving to LLVM, right?
23:57:49evanyep.
23:57:53evanfor execution.
23:57:58sandalbut MacRuby 0.4 is YARV based?
23:58:05evanexecution, yes.
23:58:09evanbut even in 0.4
23:58:23evanthey've gutted and rewrite a large portion of the core classes
23:58:42sandalinteresting.
23:59:15sandalokay, then, let me back up. A more pessimistic way of putting it is that MacRuby is the only one of the major implementations NOT targeting Ruby 1.8
23:59:28evansure
23:59:39headiusthat is true
23:59:49evanthey're also the one thats devating the most
23:59:53evandeviating