Show enters and exits. Hide enters and exits.
| 00:34:20 | boyscout | Fixed Proc#binding. - fed4fba - Brian Ford |
| 00:34:20 | boyscout | Put the CI tag in the right file. - a91c70c - Brian Ford |
| 00:41:57 | boyscout | CI: a91c70c success. 2709 files, 10678 examples, 33478 expectations, 0 failures, 0 errors |
| 00:42:07 | evan | yay CI. |
| 00:43:32 | brixen | sweet |
| 04:58:36 | tarcieri | any of you fools around? |
| 05:02:23 | brixen | 'course |
| 05:03:52 | tarcieri | I'm wondering how your compiler handles, like, scopes and stuff |
| 05:03:53 | tarcieri | heh |
| 05:04:15 | slava | hi tarcieri |
| 05:04:19 | tarcieri | like Erlang has two types of scopes, and Reia has... well... many more |
| 05:04:20 | tarcieri | sup slava |
| 05:04:28 | brixen | well, it puts them in little envelopes with stickers of kitties on them |
| 05:04:50 | tarcieri | it was funny, I was at Erlang factory and "Hello Robert" dude (who is a really cool guy by the way) is like "Erlang doesn't have scopes" |
| 05:04:51 | slava | my compiler doesn't mess with scopes at all, its all in the library |
| 05:05:16 | tarcieri | slava: well, what happens when you have a particular string of code you want to evaluate in a particular scope |
| 05:05:34 | tarcieri | brixen: I see, where can I procure kitty stickers to put on my ast fragments |
| 05:05:58 | tarcieri | slava: like, parts of my language behave differently depending on the scope |
| 05:06:02 | slava | string eval always uses the top-level lexical environment |
| 05:06:03 | brixen | tarcieri: hmm, le'see.. |
| 05:06:08 | tarcieri | and that's not just me |
| 05:06:09 | tarcieri | Erlang too |
| 05:06:31 | tarcieri | slava: well I'm having to do shit like rename variables because the output language has single assignment |
| 05:06:47 | tarcieri | and the rules for that vary depending on the scope |
| 05:06:52 | slava | I convert local variables to stack code and the compiler takes stack code as input |
| 05:07:09 | tarcieri | normally I have to respect the outer environment but lambdas and list comprehensions have their own environment |
| 05:07:38 | tarcieri | and in Reia, so do blocks (which are just lambdas) |
| 05:07:54 | tarcieri | or actually, rather |
| 05:08:01 | tarcieri | they enclose the outer environment |
| 05:08:05 | tarcieri | but arguments are special cased |
| 05:08:09 | slava | sounds complicated |
| 05:08:12 | tarcieri | to where they override the outer environment |
| 05:08:20 | tarcieri | well, they're both effectively closures |
| 05:08:24 | slava | anything that compiles to LLVM is single-assignment also |
| 05:08:27 | tarcieri | list comprehensions are just closures that build lists |
| 05:08:32 | slava | so that's not a difficulty at all |
| 05:08:33 | tarcieri | yeah |
| 05:08:39 | tarcieri | this isn't an uncommon problem |
| 05:08:42 | tarcieri | I call it "SSA" |
| 05:08:48 | tarcieri | although it seems to be different from real SSA |
| 05:08:59 | slava | you can't write ssa in erlag |
| 05:09:08 | tarcieri | yeah, it's pseudo-ssa |
| 05:09:22 | slava | how do you convert code like this? |
| 05:09:27 | slava | if(x) { a = 1; } else { a = 2; } |
| 05:09:30 | slava | that's not ssa |
| 05:09:36 | slava | because a is assigned twice |
| 05:09:49 | tarcieri | so how that works |
| 05:09:56 | tarcieri | the if gets converted into a case statement |
| 05:10:01 | tarcieri | in each branch |
| 05:10:08 | tarcieri | the "oldest" a is measured |
| 05:10:15 | tarcieri | and all the branches bind to the "oldest" a |
| 05:10:17 | brixen | tarcieri: http://gist.github.com/127015 |
| 05:10:27 | tarcieri | for whatever their version of a happens to be |
| 05:10:48 | tarcieri | so that at the end of every branch all the same version numbers are bound for all variables |
| 05:10:53 | brixen | tarcieri: we have 2 scopes, static_scope (what you see as push_scope in the bytecode) and variable_scope |
| 05:11:05 | slava | tarcieri: so that's not ssa so you shouldn't call it that to prevent confusion |
| 05:11:13 | tarcieri | brixen: well more specifically, what I suppose I should be asking |
| 05:11:21 | tarcieri | slava: yeah my bad, dunno what else to call it |
| 05:11:50 | tarcieri | brixen: how do you implement module_eval vs class_eval vs eval |
| 05:11:52 | tarcieri | I suppose |
| 05:11:59 | tarcieri | it's really an issue with string eval in different scopes |
| 05:12:11 | slava | why do you want to eval strings in different scopes? there's no legitimate use-case for this |
| 05:12:16 | brixen | well, you can pass eval a binding |
| 05:12:18 | tarcieri | how I treat a string differs depending on the scope |
| 05:12:37 | tarcieri | slava: because it's easier for people to do metalinguistic abstraction with string eval than it is with AST munging |
| 05:12:54 | brixen | tarcieri: kernel/common/eval.rb |
| 05:13:00 | brixen | tarcieri: you have a look at that code |
| 05:13:00 | tarcieri | not everyone can be DING I GET IT |
| 05:13:02 | tarcieri | ok |
| 05:13:21 | tarcieri | slava: people can get "I can write a string that's like a piece of code but I can twiddle with it programatically" |
| 05:13:38 | tarcieri | a lot easier than they can code is data and I need to mapfold some subtrees |
| 05:13:44 | tarcieri | granted immutable state is the huge bitch here |
| 05:14:13 | tarcieri | I just did some AST munging in Ruby and it's like "wow being able to change shit is a lot easier than having to mapfold my subtrees recursively" |
| 05:15:14 | tarcieri | yeah |
| 05:15:15 | tarcieri | damn |
| 05:15:18 | tarcieri | that's the solution a lot |
| 05:15:25 | tarcieri | brixen: heh evan fucking told me that shit before |
| 05:15:36 | tarcieri | use a closure to build the environment |
| 05:15:39 | brixen | tarcieri: you looking at eval.rb? |
| 05:15:40 | tarcieri | durrr |
| 05:15:42 | tarcieri | yes |
| 05:15:45 | brixen | ok |
| 05:15:52 | brixen | neat code huh? |
| 05:16:00 | brixen | well, kinda messy, but neat in ruby |
| 05:16:07 | tarcieri | yes |
| 05:16:14 | tarcieri | all right I totally asked this before and forgot |
| 05:16:17 | tarcieri | heh |
| 05:16:22 | brixen | better than looking through mri eval.c |
| 05:16:26 | brixen | :) |
| 05:16:27 | tarcieri | rofl |
| 05:16:33 | tarcieri | eval.c == bleeding eyes |
| 05:17:16 | tarcieri | my main reaction to eval.c was "okay so I/O was kinda tacked on as an afterthought" |
| 05:17:44 | brixen | hah |
| 05:17:47 | brixen | yeah |
| 05:18:16 | tarcieri | slava gets mad props for being totally obsessive about doing I/O well |
| 05:18:17 | tarcieri | heh |
| 05:18:58 | brixen | slava gets mad props for most things, but don't tell him that, he's still young and it goes to his head :D |
| 05:19:09 | tarcieri | what's lulz is there's yet another discussion of single assignment on erlang-questions |
| 05:19:12 | tarcieri | and yeah |
| 05:19:17 | tarcieri | slava's like younger than me and shit, right? |
| 05:19:31 | brixen | he's a lot younger than me |
| 05:19:33 | brixen | heh |
| 05:19:43 | tarcieri | like I turn 27 in less than a month |
| 05:19:49 | slava | I'm 25 |
| 05:19:56 | tarcieri | yeah crazy |
| 05:20:04 | slava | not that young |
| 05:20:11 | brixen | crazy, you guys are just chil'ren |
| 05:20:16 | tarcieri | yeah |
| 05:20:16 | tarcieri | heh |
| 05:20:42 | tarcieri | I'm going to go hang out with all the crazy Python people again this friday |
| 05:20:54 | tarcieri | and hopefully meet this dude who teaches an awesome compilers class |
| 05:22:57 | tarcieri | and maybe see a demonstration of the new PyPy JIT actually... running code and stuff |
| 05:23:00 | tarcieri | it was pretty crazy |
| 05:23:05 | tarcieri | the dude had a debugger written in Pygame |
| 05:23:18 | tarcieri | for perusing stack traces or something |
| 05:23:21 | tarcieri | it was pretty badass |
| 05:23:40 | brixen | cool |
| 05:23:54 | brixen | does the jit use llvm? |
| 05:24:12 | tarcieri | I think he wrote a JIT generator in Prolog :/ |
| 05:24:18 | brixen | heh |
| 05:24:20 | brixen | interesting |
| 05:24:38 | tarcieri | I asked him specifically about Prolog |
| 05:24:45 | tarcieri | and he told me Prolog was homoiconic |
| 05:24:59 | tarcieri | which I never realized and surprised me and I'm curious if that's actually true |
| 05:25:05 | slava | yeah it is |
| 05:25:15 | slava | you can construct a list and add it to the facts database |
| 05:25:15 | tarcieri | crazy |
| 05:25:22 | slava | and turn facts back into lists |
| 05:25:24 | slava | prolog sucks though |
| 05:25:29 | tarcieri | hehe |
| 05:26:03 | tarcieri | yeah where Ruby got Perl "whale guts" on its shoes (at least as Steve Yegge put it) Erlang got Prolog whale guts plastered all over its body |
| 05:27:46 | tarcieri | man, I started working on some silly Rails app and it has totally distracted me from Reia |
| 05:28:09 | tarcieri | tangible shit that's of valuable to joe average immediately is so much easier to work on than something super duper abstract like a language |
| 05:28:28 | tarcieri | plus it's a project I think I can get done in a few weeks as opposed to another year or two |
| 05:28:59 | brixen | yeah, the slog can be hard |
| 05:29:09 | brixen | immediate satisfaction is a good motivator |
| 05:29:38 | tarcieri | it's just so much fun to code some silly webapp over the weekend and being able to start playing with it in a browser |
| 05:29:42 | tarcieri | and having it do some crazy shit |
| 05:30:02 | slava | its like jerking off -vs- going out to a club and picking up a hot girl |
| 05:30:02 | brixen | doing a bunch of benchmarking of hash impl (which was little coding and lots of waiting and analyzing) reminded me how much I prefer tdd dev |
| 05:30:07 | tarcieri | heh |
| 05:30:22 | tarcieri | brixen: yeah I've been doing TDD exclusively lately at work |
| 05:30:32 | tarcieri | certainly not how I work at home though |
| 05:30:32 | tarcieri | heh |
| 05:30:33 | slava | not enough real men out there, everyone's just jacking off |
| 05:31:05 | slava | I like it how one of the advertised features for OS X 10.6 is "more realiable disk eject" |
| 05:31:07 | tarcieri | slava: I just love being able to automate something where people sit around and bitch about how fucking difficult it is |
| 05:31:08 | slava | like, that's not a feature |
| 05:31:16 | tarcieri | slava: in this case populating the playlist for a radio station |
| 05:32:25 | tarcieri | but my day job is writing a searchable media CMS... this is a lot simpler version of that |
| 05:33:14 | tarcieri | slava: heh the disc eject is fucking buggy |
| 05:39:13 | slava | tarcieri: are you going to add goto to reia? |
| 05:39:14 | slava | php has it |
| 05:39:28 | tarcieri | dude, someone mentioned that like a week ago |
| 05:39:31 | tarcieri | to me |
| 05:39:33 | tarcieri | and I was all lulz |
| 05:39:39 | tarcieri | and today it blew up into a huge meme |
| 05:40:08 | tarcieri | From a purely technical perspective I am not clever enough to come up with a way to even implement goto if I wanted to |
| 05:40:14 | tarcieri | although I have a cool hack for adding "return" |
| 05:43:52 | brixen | tarcieri: with your concurrency, you should implement come_from instead |
| 05:44:10 | brixen | it will unconditionally pull in a thread of execution to the current context |
| 05:45:24 | tarcieri | haha |
| 05:45:35 | tarcieri | dude instance_eval becomes nuts |
| 05:45:52 | tarcieri | you shop off a lambda to go frob another object's precious bodily fluids |
| 05:45:55 | tarcieri | err |
| 05:45:56 | tarcieri | ship off |
| 06:26:27 | evan | tarcieri: does erlang have a 'phi' ? |
| 06:26:41 | evan | LLVM has 2 SSA escapes |
| 06:26:50 | evan | phi and memory |
| 06:28:12 | tarcieri | heh no, I implemented my own gimpy pseudo-phi |
| 06:28:21 | tarcieri | using the method I described to slava |
| 06:28:32 | evan | yeah, you've mentioned it to me before |
| 06:29:09 | tarcieri | I just wanna rewrite my compiler from scratch in Reia, heh |
| 06:29:17 | evan | you should! |
| 06:29:34 | tarcieri | maybe I will once I get this on disk format problem licked |
| 06:30:41 | evan | thats really the only way to do it |
| 06:30:54 | evan | write yourself a simple bootstrap in disk format |
| 06:31:21 | tarcieri | yeah, not even close to where I'm worried about trying to bootstrap |
| 06:31:26 | tarcieri | but that's how the Erlang compiler works |
| 06:33:54 | slava | hi evan |
| 06:34:14 | evan | admiral slava! |
| 06:34:23 | evan | it's fun title day |
| 06:34:48 | evan | we've got admiral slava and president tarcieri |
| 06:34:56 | evan | lets change that to |
| 06:35:00 | tarcieri | lol |
| 06:35:01 | evan | el presidente tarcieri |
| 06:35:03 | evan | thats more fun |
| 06:35:10 | tarcieri | how about el jefe |
| 06:35:16 | evan | sure! |
| 08:17:15 | brixen | just realized that none of the papers that looked at cache consequences of hash algos used a language that has a compacting gc |
| 08:17:55 | brixen | the tuple of entries and the entries would possibly end up packed together anyway |
| 08:25:13 | evan | true |
| 08:25:43 | evan | brixen: I thought of something, we should check out what GNU Classpath's HashMap uses |
| 08:25:51 | evan | it's a pretty battle tested hash |
| 08:25:59 | evan | and the semnatics would transfer directly to ruby |
| 08:29:38 | brixen | ah good idea |
| 08:29:57 | brixen | I've just been fixing up our chained bucket a bit |
| 08:30:03 | evan | yeah, thats fine |
| 08:30:06 | brixen | it's such a sweetly simple algo |
| 08:30:06 | evan | i'm sure we'll stick with that |
| 08:30:18 | evan | pretty sure HashMap does the same |
| 08:30:26 | brixen | btw, compiling with RBX_LLVM=1 doesn't turn on anything, right? |
| 08:30:30 | evan | it might have a few little nuggets |
| 08:30:39 | evan | that just makes LLVM compiled in |
| 08:30:43 | brixen | ok |
| 08:30:45 | evan | you still have to use -Xjit.enabled |
| 08:30:48 | evan | to turn the JIT on |
| 08:30:56 | evan | I'm thinking about changing that soon though |
| 08:31:07 | evan | and turning the jit on by default |
| 08:31:25 | brixen | ok |
| 08:31:58 | brixen | I ran the hash benches without llvm linked and got 9m20s, then 9m15s with it linked in |
| 08:32:02 | brixen | so I was wondering |
| 08:32:21 | brixen | didn't want to wait another 10min to see if it was a random fluctuation :) |
| 08:32:30 | evan | sounds like it |
| 08:33:32 | brixen | what do you think of using a LookupTable instead of Hash in ISeq? |
| 08:33:42 | evan | fine by me |
| 08:34:19 | brixen | Rubinius::InstructionSet::OpCode#stack_produced is the top caller of Hash#[] in starting up the AR tests |
| 08:34:32 | evan | really? zoinks. |
| 08:34:38 | brixen | sec.. |
| 08:34:57 | evan | that code should be refactored a little |
| 08:35:01 | brixen | http://gist.github.com/127074 |
| 08:35:04 | evan | to not require so many lookups |
| 08:35:12 | brixen | yeah, I was thinking that |
| 08:35:23 | brixen | the profiler graph output is actually really useful |
| 08:35:24 | evan | eek. |
| 08:35:31 | evan | yay |
| 08:35:49 | brixen | I was thinking about what you said about Strongtalk looking up the call path for the method that calls a hot method |
| 08:36:01 | evan | yep |
| 08:36:01 | brixen | makes a lot of sense looking at that profiler graph |
| 08:36:06 | evan | exactly |
| 08:36:22 | evan | the profile graph shows you basically what it would try and collapse |
| 08:36:27 | brixen | yeah |
| 08:36:54 | brixen | so, wycats suggested a __hash_match__ method or something like that |
| 08:37:05 | evan | for? |
| 08:37:07 | brixen | the thing is, we use equal? now |
| 08:37:15 | brixen | but that is not how MRI does it |
| 08:37:24 | brixen | and it actually makes it slower for String keys |
| 08:37:37 | brixen | because they are unlikely to be equal? |
| 08:37:49 | brixen | so then it does the hash compare and eql? call |
| 08:37:54 | brixen | so 3 calls instead of 2 |
| 08:38:12 | brixen | but for symbol, hash would be equal and it would still have to do the eql? call |
| 08:38:21 | evan | sure |
| 08:38:22 | brixen | so 2 calls instead of one (equal?) |
| 08:38:24 | evan | this is the smalltalk way |
| 08:38:31 | evan | you establish a protocol |
| 08:38:43 | evan | that is satisfied by sprinkling methods around the hiearchy |
| 08:38:48 | evan | to achieve the desired effect |
| 08:38:53 | brixen | so if Object has __hash_match__ that return hash == other.hash and key eql? other.key |
| 08:39:20 | brixen | and Symbol has __hash_match__ do self.equal? other, that should work, right? |
| 08:39:20 | evan | and Immediate has alias __hash_match__ equal? |
| 08:39:25 | brixen | yeah |
| 08:39:27 | brixen | right |
| 08:39:31 | brixen | on Immediate |
| 08:39:31 | evan | sure |
| 08:39:35 | evan | yep |
| 08:39:35 | brixen | ok |
| 08:39:50 | evan | so, this is what i mean by system methods |
| 08:39:55 | evan | __hash_match__ would be a system method |
| 08:40:31 | evan | it would be tagged as system and not show up by default, to tell people "don't mess with this, we need it to make your codes work yo" |
| 08:40:43 | brixen | yeah, makes sense |
| 08:41:22 | evan | anyway, yeah, thats a fine way to do |
| 08:41:24 | evan | thats OO! |
| 08:41:26 | brixen | I guess just having the tag so the method doesn't show up under normal reflection makes a lot of sense |
| 08:41:57 | brixen | yeah, imagine that, writing OO code in a lang that boasts everything is an object! |
| 08:42:04 | evan | :D |
| 08:44:46 | brixen | the specs using indirection for the Hash class makes it soo easy to write a new Hash class |
| 08:44:51 | brixen | I'm lovin it |
| 08:44:51 | evan | :D |
| 08:44:54 | evan | yeah, great idea. |
| 08:46:01 | evan | i'm trying to coax JITd blocks into work |
| 08:46:03 | evan | working |
| 08:46:24 | brixen | sweet |
| 08:48:02 | evan | oh oh oh |
| 08:48:04 | evan | maybe i gots it! |
| 08:49:11 | evan | well, got it past where I was |
| 08:49:12 | evan | thats good. |
| 08:49:15 | evan | got it to crash |
| 08:49:18 | evan | thats.. ok. |
| 08:49:42 | brixen | heh, small victories |
| 08:49:57 | brixen | will win you a war (I hope) |
| 08:49:58 | evan | oof. i blew SOMETHING up. |
| 08:50:10 | evan | was getting all . |
| 08:50:13 | evan | now ALL E |
| 08:50:28 | evan | i'm running the specs to test this. |
| 08:50:42 | evan | so i'm past the first 20 initial bugs |
| 08:50:46 | brixen | nice |
| 08:51:48 | evan | weird. |
| 08:51:58 | evan | and strange |
| 08:52:07 | evan | man, i get really get this damn thing to blow up so WEIRD ways. |
| 08:53:13 | evan | oh oh. |
| 08:53:28 | evan | brixen: bin/mspec injects all the files to run into mspec running in rbx |
| 08:53:30 | evan | right? |
| 08:53:36 | evan | where does it do the "injection" |
| 08:53:43 | brixen | sec.. |
| 08:54:11 | brixen | mspec/lib/mspec/utils/script.rb |
| 08:55:27 | brixen | mspec/lib/mspec/commands/mspec-ci.rb makes the call to #files with pattern |
| 08:55:45 | brixen | and then calls MSpec.register_files @files |
| 08:56:09 | evan | where does the file list come from |
| 08:56:11 | brixen | the #files method is defined in utils/script.rb |
| 08:56:16 | evan | thats what i need to know |
| 08:56:27 | brixen | well, it parses the cmd line to get it |
| 08:56:42 | evan | the rbx command line |
| 08:56:45 | brixen | see mspec/lib/mspec/commands/mspec-ci.rb # 63 |
| 08:56:47 | evan | i need to know where that is set |
| 08:56:53 | evan | where does MRI call rbx |
| 08:56:59 | brixen | oh that |
| 08:57:23 | brixen | see mspec/lib/mspec/commands/mspec.rb at the bottom |
| 08:57:26 | brixen | #run |
| 08:58:35 | evan | does it pass it a -e or something? |
| 08:58:44 | evan | i can't see it doing that directly in #run here |
| 08:58:49 | brixen | nope |
| 08:59:07 | brixen | just bin/rbx -v <options> patterns |
| 08:59:21 | brixen | put a p *orgv in there |
| 08:59:49 | evan | hrm. |
| 08:59:56 | evan | where does it get the list of files then? |
| 09:00:44 | brixen | eg http://gist.github.com/127083 |
| 09:01:13 | brixen | so, mspec/lib/mspec/utils/script.rb #files will turn core/hash into a list of actual files |
| 09:02:07 | evan | so the list is calculated in rbx |
| 09:02:08 | evan | not MRI |
| 09:02:13 | brixen | right |
| 09:02:16 | evan | ok |
| 09:02:19 | evan | thats what i had wrong |
| 09:02:43 | brixen | mspec script just packages up the args and passes them on |
| 09:02:44 | brixen | basically |
| 09:03:03 | evan | why is the mspec script there then? |
| 09:03:07 | evan | why not run it all in rbx? |
| 09:03:08 | brixen | mspec-ci mspec-run do all the work in the target exe |
| 09:03:25 | brixen | to run various targets |
| 09:04:03 | evan | ok |
| 09:04:09 | brixen | the idea is that an impl may have very simple abilities, mspec could just pass a file list |
| 09:04:24 | brixen | but the mspec-run mspec-ci are pretty sophisticated now |
| 09:08:46 | evan | hm |
| 09:10:53 | evan | oh oh |
| 09:11:04 | evan | I NEED to turn off the mspec striping |
| 09:11:13 | evan | it's confounding my debugging |
| 09:11:16 | evan | stripping of backtraces |
| 09:11:20 | evan | where is that? |
| 09:11:56 | brixen | -d |
| 09:12:04 | evan | bin/mspec -d |
| 09:12:06 | brixen | yeah |
| 09:12:10 | evan | or bin/mspec ci -d |
| 09:12:15 | brixen | oh yeah 2nd |
| 09:12:18 | evan | k |
| 09:12:23 | brixen | I haven't fixed that yet :) |
| 09:28:29 | evan | yay |
| 09:28:31 | evan | fixed it. |
| 09:29:33 | brixen | sweet |
| 09:29:38 | brixen | what was it? |
| 09:29:53 | evan | nested blocks were broken |
| 09:30:14 | evan | so a block's parent wasn't pointing to the enclosing block, but the method's scope |
| 09:30:27 | evan | so when it did 'push_local_depth 1, 0' |
| 09:30:32 | evan | it was getting the wrong slot 0 |
| 09:30:53 | brixen | ahh |
| 09:39:45 | evan | ok, bed time. |
| 09:39:46 | evan | nite |
| 09:40:55 | brixen | nite! |
| 14:13:07 | yakischloba | is there a way with the current ffi api to attach to special functions like fooFunction<<<x,y>>>(arg1,arg2) ? i dont really know anything about how this is implemented or how it is different than a normal function in c |
| 17:57:51 | evan | morning. |
| 18:01:01 | brixen | morning |
| 19:20:48 | ddub | waves |
| 19:22:29 | brixen | sup ddub |
| 19:48:56 | brixen | evan: what do you make of commit 43e2dbc5 ? |
| 19:49:19 | brixen | do you think real code exposed that? |
| 19:58:40 | evan | if there is no spec, then no. |
| 19:58:56 | brixen | k |
| 20:30:31 | boyscout | Conditionalize some debugging code - dadf3c6 - Evan Phoenix |
| 20:30:31 | boyscout | Add ability to JIT blocks - 1191e13 - Evan Phoenix |
| 20:30:55 | brixen | w00t! |
| 20:31:11 | brixen | I shall be testing your ability shortly |
| 20:31:37 | brixen | although I just removed a layer of blocks from Hash |
| 20:31:49 | brixen | still, should be interesting |
| 20:32:08 | evan | yep |
| 20:39:08 | boyscout | CI: 1191e13 success. 2709 files, 10678 examples, 33478 expectations, 0 failures, 0 errors |
| 20:39:39 | brixen | 'atta boyscout |
| 20:39:48 | evan | hah |
| 20:39:55 | evan | ok, lunch time. |
| 20:40:02 | brixen | k, me too |
| 21:08:40 | radarek | what is a proper way to build rubinius with JIT support? |
| 21:08:52 | radarek | export RBX_LLVM="1" && rake ? |
| 21:09:51 | evan | no need for the export |
| 21:09:52 | brixen | radarek: just RBX_LLVM=1 rake works, but you can export it too |
| 21:09:52 | evan | just |
| 21:09:55 | evan | RBX_LLVM=1 rake |
| 21:09:59 | brixen | jinx |
| 21:10:21 | evan | heh |
| 21:11:18 | radarek | thanks |
| 21:11:38 | radarek | it doesn't compile |
| 21:11:40 | radarek | http://pastie.org/507704 |
| 21:11:48 | radarek | my OS is ubuntu 64 bit |
| 21:12:12 | evan | you need LLVM from svn |
| 21:12:20 | evan | sorry |
| 21:14:13 | radarek | ok, I'll try with llvm from svn |
| 21:30:05 | evan | a gprof run on linux, sans JIT |
| 21:30:16 | evan | has interpreter infrastructure taking up 48.55% of the time |
| 21:30:19 | evan | thats good. |
| 21:31:03 | brixen | cool |
| 21:31:18 | evan | LookupTable::find_entry took 6.4% |
| 21:31:19 | brixen | have a breakdown of the rest? |
| 21:31:26 | brixen | hm |
| 21:31:36 | evan | thats method lookup |
| 21:31:42 | brixen | ah ok |
| 21:31:46 | evan | i'm really thinking about changing MethodTable to not be a LookupTable |
| 21:31:59 | evan | and have it be a cuckoo hash |
| 21:32:22 | evan | that can only map a symbol to an Executable |
| 21:33:21 | brixen | might be just as good in a linear probe hash |
| 21:33:50 | brixen | the hash function being random enough is the key |
| 21:33:58 | evan | right |
| 21:34:54 | brixen | although, cuckoo might work really well here |
| 21:35:01 | brixen | especially with a simpler match function |
| 21:35:08 | evan | right |
| 21:35:10 | brixen | ie just == on the key |
| 21:35:23 | evan | a MethodTable is pretty stable |
| 21:35:34 | brixen | yeah |
| 21:35:53 | brixen | the thing is, you want to hit the entry with only h1() and not have to do h2() |
| 21:36:50 | brixen | probably won't get faster than h2(x) = h1(x) + 1 |
| 21:37:03 | brixen | since you've already calc'd h1(x) |
| 21:37:32 | radarek | I did checkout llvm from svn to vm/external_libs/llvm; run rake and after couple of minutes I got: |
| 21:37:34 | radarek | Don't know how to build task 'vm/external_libs/llvm/include/llvm/ADT/iterator' |
| 21:37:41 | radarek | any ideas? |
| 21:37:43 | brixen | if you rehash when h2(x) fails to find a slot on insert, you may get slightly larger tables, but should be fast on lookup |
| 21:38:23 | evan | radarek: umm.. |
| 21:38:31 | evan | radarek: try doing ./configure && make in just llvm |
| 21:38:47 | radarek | ok |
| 21:39:23 | evan | GH is being slow |
| 21:39:29 | evan | but I just pushed doc/vm/prof* |
| 21:39:36 | evan | which are the results from gprof |
| 21:39:40 | evan | if you wanna see them |
| 21:39:44 | brixen | cool |
| 21:40:27 | boyscout | Add gprof results - de9956d - Evan Phoenix |
| 21:43:03 | boyscout | CI: de9956d success. 2709 files, 10678 examples, 33478 expectations, 0 failures, 0 errors |
| 22:06:19 | radarek | guys, what about http://pastie.org/507773 ? |
| 22:07:58 | brixen | hm |
| 22:08:30 | brixen | why is that running during build |
| 22:12:25 | radarek | brixen: it's run by /home/radarek/opt/src/rubinius/rakelib/extensions.rake:27:in `compile_extension' |
| 22:14:50 | brixen | radarek: yeah, but dunno why it appears to be running llvm |
| 22:15:08 | brixen | radarek: evan will have to take a look |
| 22:15:41 | radarek | brixen: right, it's strange because it's called by compile_extension 'lib/ext/readline' :) |