Show enters and exits. Hide enters and exits.
| 00:00:01 | boyscout | 1 commit by Christopher Thompson |
| 00:00:02 | boyscout | * Handle EXIT when trapping "signals".; 7f25a2a |
| 00:00:08 | evan | nexcastellan: that was easy! :D |
| 00:00:25 | nexcastellan | Easy once I figured out what the heck was going on. :) |
| 00:03:16 | agardiner | brixen: i'm still getting up to speed on the new spec organisation... |
| 00:03:33 | agardiner | i'm getting a problem pulling into spec/ruby... |
| 00:04:17 | loincloth enters the room. | |
| 00:04:52 | qwert666 leaves the room. | |
| 00:05:26 | rue | agardiner: Are you using the tasks or going directly? |
| 00:05:35 | agardiner | going directly |
| 00:05:51 | agardiner | im getting merge conflicts when i attempt to pull |
| 00:07:00 | rue | Does status show untracked or uncommitted changes? |
| 00:07:35 | agardiner | nope, shows working directory clean |
| 00:07:52 | agardiner | git config shows the rubyspec/rubyspec repository |
| 00:08:50 | rubuildius_amd64 | Christopher Thompson: 7f25a2ae7; 2377 files, 7772 examples, 26839 expectations, 1 failure, 1 error; http://rafb.net/p/AFqqV799.html |
| 00:09:13 | jtoy enters the room. | |
| 00:11:53 | rue | Cannot reproduce that in my current state |
| 00:14:46 | agardiner | something is definitely wacky |
| 00:15:16 | agardiner | git log on spec/ruby master shows the last commit as 2nd June |
| 00:15:43 | agardiner | but head appears to reference the last commit on the rbx main repo?! |
| 00:16:17 | rubuildius_ppc | Christopher Thompson: 7f25a2ae7; 2377 files, 7771 examples, 26860 expectations, 0 failures, 0 errors |
| 00:16:57 | agardiner | ah, think i'll wrestle with this another time... |
| 00:17:11 | agardiner | evan: a quick question and then i'm off to bed |
| 00:17:18 | evan | sure |
| 00:17:44 | agardiner | i've been futzing around playing with a PIC in shotgun |
| 00:18:19 | agardiner | its a real hack, but i'm stuck on something |
| 00:19:20 | agardiner | basically, for now i'm just trying to switch the SendSite data1, data2, and data3 objects to tuples when a new receiver class is encountered |
| 00:20:14 | agardiner | what i'm seeing is that i can stash different receivers in the tuple, but they appear to then go stale |
| 00:20:15 | evan | ok. |
| 00:20:18 | heycarsten leaves the room. | |
| 00:20:36 | agardiner | does the gc check the object refs in SendSite? |
| 00:20:39 | evan | well, you have to validate the cache when you pull something out. |
| 00:20:42 | evan | oh wait |
| 00:20:46 | evan | what kind of stale? |
| 00:21:05 | agardiner | i can put a receiver class into the tuple, and printf the name of the class |
| 00:21:30 | agardiner | but the next time i get to the same point in the tuple, i get a sigbus trying to print the name |
| 00:21:43 | evan | hrm |
| 00:21:49 | evan | the GC should be seeing those fields |
| 00:21:52 | evan | if not, we have to fix that. |
| 00:22:07 | evan | but if it weren't seeing them, i'd think we'd have had this problem long ago. |
| 00:22:16 | agardiner | that's what i thought... |
| 00:22:29 | evan | could you paste up a diff of what you've done? |
| 00:22:33 | evan | perhaps there is a clue in there. |
| 00:22:43 | agardiner | i'm using the write barrier when i add the tuples... |
| 00:24:29 | evan | you shouldn't have to explicitely call the write barrie. |
| 00:24:43 | thehcdreamer leaves the room. | |
| 00:24:50 | agardiner | you do for SendSite, cause its a hybrid beasty |
| 00:25:36 | evan | you need to use SET_STRUCT_FIELD |
| 00:25:38 | agardiner | SET_STRUCT_FIELD |
| 00:25:44 | evan | :) |
| 00:25:45 | agardiner | zing |
| 00:25:52 | evan | well, pastie the diff |
| 00:25:55 | evan | let me take a look |
| 00:26:09 | agardiner | i'd really rather not... its a mess! :-) |
| 00:26:25 | evan | heh |
| 00:26:25 | evan | ok. |
| 00:27:06 | agardiner | so, for now, i'm right in understanding that i need to use SET_STRUCT_FIELD when i switch data1 etc to be Tuple instances |
| 00:27:22 | evan | yeah |
| 00:27:23 | evan | you are. |
| 00:27:32 | agardiner | but i just use tuple_set to save the receiver class instances into the tuple |
| 00:27:39 | evan | thats correct. |
| 00:28:05 | agardiner | ok, well i'll look at this again with fresh eyes (and more confidence) later |
| 00:28:16 | agardiner | thanks for the sanity check |
| 00:28:55 | Maledictus leaves the room. | |
| 00:29:06 | agardiner | later folks o/ |
| 00:29:27 | agardiner leaves the room. | |
| 00:32:01 | loincloth leaves the room. | |
| 00:35:14 | seydar enters the room. | |
| 00:36:15 | seydar | bug time |
| 00:36:36 | seydar | `find /dev -type l` is returning a supposed link, but nothing i do can find it |
| 00:37:00 | seydar | this is a problem, because the two link tests in rubinius are failing for me (TIger/PPC) |
| 00:37:40 | seydar | however... i guess this isn't really a rubinius bug, but a bug in the method ("algorithm") used to find the links |
| 00:37:58 | seydar | any words of wisdom of a beautiful friday night? |
| 00:40:39 | rue | Find out where Tiger puts links :) |
| 00:42:11 | seydar | but... the find /dev -type l command returns a location BUT the location *isnt* actually there! |
| 00:42:12 | evan | seydar: ln -s $HOME /tmp/blah; find /tmp -type l |
| 00:42:48 | seydar | should I bother trying to find a better way to test symlinks or should i just accept it as an OS bug in this specific case. |
| 00:42:50 | seydar | ? |
| 00:44:50 | evan | probably need a better way. |
| 00:45:39 | seydar | im on it, sir! |
| 00:46:24 | evan | :) |
| 00:46:42 | loincloth enters the room. | |
| 00:47:33 | headius | evan: IO threading question for ya |
| 00:47:46 | headius | I'm trying to get some blocking ops to be more "responsive" as in MRI |
| 00:48:02 | evan | which blocking ops? |
| 00:48:12 | headius | trying to parse rb_thread_schedule's select logic at the moment |
| 00:48:17 | headius | in this case, TCPServer.accept |
| 00:48:23 | evan | headius: RUN! |
| 00:48:40 | headius | yeah I know...every time I look at this code I get an enormous headache in my eye |
| 00:48:58 | evan | i've been through it a number of times over the years |
| 00:49:01 | evan | so i'm pretty sure i've got it |
| 00:49:04 | evan | what you looking at? |
| 00:49:24 | headius | well the problem I'm running into is that for accept we do a full-on infinite select with Java NIO |
| 00:49:26 | evan | accept registers a read wait on the fd in question |
| 00:49:40 | headius | closing the socket under select doesn't appear to wake it in this API |
| 00:49:56 | evan | in NIO it doesn't? |
| 00:50:11 | evan | does it maybe report the fd in the error fd list? |
| 00:50:15 | headius | does not appear to...still trying to confirm if there might be a race, but seems that way |
| 00:50:19 | headius | hmm that could be |
| 00:50:25 | headius | this code may only be checking the read list |
| 00:50:34 | headius | and saying "hey, I'm not in the read list, so let's try again" |
| 00:50:41 | headius | I'll check that |
| 00:50:46 | headius | but also, confirm this for me |
| 00:51:08 | headius | MRI basically does a select...but it's not an infinite select, right? it's polling? |
| 00:51:36 | Fobax | it polls so that it can do a different thread if there's nothign to read |
| 00:52:08 | Fobax | Read/write ops are one of the ways for MRI to do a thread context switch |
| 00:52:12 | evan | headius: it's not infinite, no. |
| 00:52:17 | evan | select() isn't the root of all work. |
| 00:52:25 | evan | it just goes into there when there is nothing to do |
| 00:52:59 | evan | when a Thread is pre-empted |
| 00:53:01 | headius | Fobax: yeah, I get that...I'm just trying to figure out what it does with fds that aren't ready |
| 00:53:05 | evan | it goes through select in poll mode |
| 00:53:14 | evan | trying to detect if any Threads are now runable |
| 00:53:20 | evan | if there are no runable threads |
| 00:53:25 | evan | it goes into a blocking select |
| 00:53:28 | headius | on everything |
| 00:53:29 | headius | ok |
| 00:53:38 | evan | if there are Threads waiting on events, yes |
| 00:53:42 | headius | I'm trying to figure out the best way to map that to real threads |
| 00:53:47 | evan | it goes into a blocking select. |
| 00:54:05 | headius | select in C and select in NIO are a little different, which also complicates it a touch |
| 00:54:06 | evan | if you have, say 2 threads waiting on IO, and 3rd that did 'sleep 5' |
| 00:54:16 | evan | it will end up passing 5 to select() as the sleep timeout |
| 00:54:25 | evan | so it can wake up, see if anything is ready to go |
| 00:54:27 | evan | and run them. |
| 00:54:42 | headius | so along with the fd and wait event it has a "remaining timeout" value |
| 00:54:53 | evan | right |
| 00:54:58 | evan | thats because if you have 2 threads |
| 00:54:58 | Fobax | In real threads, why wouldn't each thread go into a blocking select on each thread for the fds that that thread is waiting on? Does it make sense to try to join the different selects? |
| 00:54:59 | evan | one did |
| 00:55:00 | evan | sleep 5 |
| 00:55:02 | evan | and one did |
| 00:55:04 | evan | sleep 2 |
| 00:55:10 | evan | it does the min() on that |
| 00:55:14 | evan | and passes it to select |
| 00:55:35 | headius | Fobax: well I'm assuming that either I'm doing something wrong with NIO select or I'm missing some crucial detail....right now they do go into a normal blocking select, but it doesn't appear to be waking up when I expect it to |
| 00:55:46 | headius | evan: ok, I see that now |
| 00:55:49 | Fobax | ah, ok |
| 00:59:58 | jtoy leaves the room. | |
| 01:05:15 | seydar | so evan, are you doing any compiler infrastructure redesign in the c++ version? |
| 01:07:55 | evan | no |
| 01:08:01 | evan | since the compiler lives in ruby |
| 01:08:06 | seydar | dammit |
| 01:08:10 | evan | there are a couple of simplications |
| 01:08:17 | seydar | are you doing any VM redesign? |
| 01:08:20 | evan | like InstructionSequence is an array of symbols now |
| 01:08:27 | evan | lots. |
| 01:08:50 | seydar | sweet. if you have some time, would you mind telling what changes you are making? |
| 01:08:59 | seydar | or is there a page somewhere that already has this info? |
| 01:09:06 | evan | there isn't yet, no. |
| 01:09:08 | evan | well... |
| 01:09:16 | fbuilesv leaves the room. | |
| 01:09:17 | evan | it's being ported to C++ |
| 01:09:22 | evan | so the structure is object based now. |
| 01:09:47 | seydar | this just cleans up the flow of things, right? |
| 01:10:00 | evan | yeah |
| 01:10:09 | evan | working on integrating LLVM now. |
| 01:10:26 | evan | so that all execution will be done in machine code. |
| 01:10:32 | evan | managed machine code. |
| 01:10:41 | seydar | so before i ask more about llvm, how are objects currently stored? |
| 01:11:02 | evan | you mean, how does the GC work? |
| 01:12:32 | seydar | um, maybe? |
| 01:12:49 | evan | objects are stored in memory. |
| 01:12:52 | seydar | my compilers course doesn't come until spring '09, so i only know what seems obvious |
| 01:12:59 | evan | they have a header |
| 01:13:00 | seydar | are objects just structs in memory? |
| 01:13:05 | evan | they have a structure |
| 01:13:05 | seydar | (dont answer that) |
| 01:13:28 | evan | the header can be represented as a C struct yes |
| 01:13:33 | evan | struct header { |
| 01:13:34 | seydar | Is there someplace in the code that I can read to see this structure in either the C or C++ code? |
| 01:13:36 | evan | uint32_t flags; |
| 01:13:42 | evan | uint32_t field_count; |
| 01:13:45 | evan | OBJECT klass; |
| 01:13:46 | evan | } |
| 01:14:12 | evan | field_count indicates how many OBJECT's are located in memory after the header |
| 01:14:18 | evan | so objects are variable size. |
| 01:14:37 | seydar | whats the smallest they can be? |
| 01:14:46 | evan | just the header |
| 01:14:48 | evan | so field_count = 0 |
| 01:14:57 | evan | that would be a Tuple with a size of 0 |
| 01:15:08 | evan | everything else has at least 1 |
| 01:15:15 | seydar | sweet. what do you mean by "how many OBJECT's are located in memory"? |
| 01:15:43 | evan | did I say that? |
| 01:15:56 | jbarnette leaves the room. | |
| 01:16:14 | evan | i didn't say many in there. |
| 01:16:40 | evan | reask your question |
| 01:16:41 | seydar | evan: field_count indicates how many OBJECT's are located in memory after the header |
| 01:16:47 | evan | oh |
| 01:16:48 | evan | that. |
| 01:16:54 | seydar | I dont get what the field count really is |
| 01:17:09 | evan | say that the header starts at address 0x12 |
| 01:17:24 | evan | and takes up 12 bytes. |
| 01:17:48 | evan | er. not 0x12, just 12. |
| 01:18:00 | evan | anyway, the header ends at address 24 then |
| 01:18:14 | evan | rather, 24 is the first byte after the header |
| 01:18:40 | seydar | gotcha |
| 01:18:40 | evan | so, starting at 24, there is an array of pointers |
| 01:18:49 | evan | the size of that array is field_count |
| 01:19:04 | seydar | ooh. sweetsauce |
| 01:19:25 | seydar | and the methods are accessed via the VM, and not through a pointer from the object |
| 01:19:40 | seydar | variables are accessed from the array after the header |
| 01:19:44 | seydar | did i get that right? |
| 01:19:52 | evan | yeah, thats sort of right. |
| 01:20:11 | seydar | what am i missing? |
| 01:20:13 | evan | the slots (whats what we call the positions in the array) aren't normally accessed directly |
| 01:20:18 | evan | we build on them to create the ruby semantics. |
| 01:20:41 | seydar | hm. ok. |
| 01:20:45 | evan | so, for instance, slot 0 normally contains a pointer to a LookupTable |
| 01:20:56 | evan | and the ivars for that object are stored in the LookupTable |
| 01:21:19 | seydar | ok, so they're pointers to VM objects, not other objects that were created ("ruby" objects?) |
| 01:21:35 | seydar | i get it! |
| 01:21:42 | seydar | thats an interesting design. |
| 01:21:52 | evan | they're all ruby objects |
| 01:21:53 | evan | and yes |
| 01:21:56 | seydar | was there any change to that from the C to the C++ implementaion? |
| 01:22:05 | evan | you always just contain pointers to other objects |
| 01:22:12 | evan | no |
| 01:22:16 | evan | thats all the same |
| 01:22:33 | evan | there are 2 special cases |
| 01:22:47 | evan | which make it possible to actually build a system out of this |
| 01:23:06 | evan | 1) an object can have a flag set in it's header, which indicates that the array is of char's not pointers. |
| 01:23:14 | evan | and thus the object can now just store raw data. |
| 01:23:30 | seydar | before you move on |
| 01:23:33 | evan | thats how ByteArray works. |
| 01:23:41 | seydar | why is that part important? |
| 01:23:51 | evan | otherwise, how do you represent a String? |
| 01:24:02 | seydar | hm. you're right |
| 01:24:07 | seydar | im dumb. sorry bout that |
| 01:24:10 | evan | no prob. |
| 01:24:18 | evan | the other special case is immediates |
| 01:24:27 | evan | ie, Fixnum |
| 01:24:36 | evan | so, for the number 0 |
| 01:24:45 | evan | ruby says that is a Fixnum object of value 0 |
| 01:25:01 | evan | well, if everytime there was a 0, we had to allocate an object in memory, that would suck |
| 01:25:13 | evan | we'd end up using 12 + 4 bytes everytime, just to show a 0 |
| 01:25:38 | seydar | so are rubinius' and MRI's numbers all singleton? |
| 01:25:41 | evan | so we use a technique that Smalltalk used, back in the day. |
| 01:26:00 | evan | basically, these days, if you look at a pointer, it's always word aligned |
| 01:26:06 | evan | meaning the bottom 2 bits are always 0 |
| 01:26:29 | seydar | as they should be. x86 is a bitch because of its weirditude |
| 01:26:34 | tarcieri | occasionally pointers aren't word aligned |
| 01:26:35 | seydar | (imho) |
| 01:26:41 | tarcieri | beam.smp(68809,0xb022c000) malloc: *** error for object 0x60b500: Non-aligned pointer being freed (2) |
| 01:26:42 | tarcieri | :( |
| 01:26:50 | evan | in rubinius, the are always word aligned |
| 01:26:53 | evan | no other way. |
| 01:27:03 | tarcieri | I think they're always SUPPOSED to be aligned in BEAM too |
| 01:27:04 | tarcieri | but... heh |
| 01:27:13 | evan | so what we do is overload what a pointer can mean |
| 01:27:23 | evan | so if the bottom 2 bits are 0, it's an address in memory |
| 01:27:32 | seydar | nice. THAT is pretty fucking brilliant |
| 01:27:37 | tarcieri | it's a cool hack |
| 01:27:39 | evan | but if the bits are, say 01, that means that the other 30 bits are actually the value itself. |
| 01:27:46 | evan | so 0 is actually just |
| 01:28:03 | evan | 00000000000000000000000000000001 |
| 01:28:03 | seydar | 0------01? |
| 01:28:09 | evan | 1 is |
| 01:28:12 | evan | 00000000000000000000000000000101 |
| 01:28:15 | evan | etc. |
| 01:28:28 | seydar | sweet. |
| 01:28:40 | seydar | i really wish i could play with the compiler outside of C |
| 01:28:41 | evan | so they act like singletons |
| 01:28:50 | evan | seydar: the rubinius one? |
| 01:29:35 | seydar | yea |
| 01:29:40 | evan | it's all in Ruby. |
| 01:29:42 | seydar | wia |
| 01:29:44 | seydar | wait |
| 01:29:47 | seydar | i meant the VM |
| 01:29:50 | evan | it doesn't get into this stuff though, because it's at a higher level. |
| 01:29:55 | evan | ah. |
| 01:30:01 | seydar | i need to be smacked every time i mix them up |
| 01:30:13 | evan | so, anyway |
| 01:30:23 | evan | small numbers act like singletons |
| 01:30:30 | evan | because they actually have no storage |
| 01:30:34 | evan | they can't be changed in anyway |
| 01:30:59 | evan | which is fine |
| 01:31:05 | evan | because thats how people think about numbers anyway |
| 01:31:07 | evan | if you could do |
| 01:31:09 | evan | 0 << 3 |
| 01:31:12 | evan | and change the value of 0 |
| 01:31:16 | evan | MY MIND WOULD MELT. |
| 01:31:23 | tarcieri | TypeError: no virtual class for Fixnum |
| 01:31:24 | tarcieri | :( |
| 01:31:26 | seydar | hehe |
| 01:31:45 | Fobax | Can't you do stuff like def 1.foo; puts "asdf"; end; ? |
| 01:31:56 | tarcieri | no |
| 01:31:58 | tarcieri | TypeError: no virtual class for Fixnum |
| 01:32:15 | evan | you can put ivars on numbers though |
| 01:32:22 | evan | but they act like you'd think |
| 01:32:28 | evan | they appear on 1 everywhere |
| 01:32:43 | evan | because every 1 that ever exists is the same object. |
| 01:32:59 | seydar | Fobax: ruby parser won't let you do def 1.foo |
| 01:33:03 | evan | this, btw, is probably the biggest mind fuck for new people into VM design. |
| 01:33:12 | seydar | evan: what is? |
| 01:33:19 | evan | how immediates work |
| 01:33:24 | evan | and what they mean, etc. |
| 01:33:29 | seydar | that was the coolest trick ever |
| 01:33:47 | Fobax | seydar: I hadn't tested that example, but I have seen an example that does something similar. Maybe it was to put ivars on numbers |
| 01:33:51 | evan | send Dan Ingles a thank you card. |
| 01:34:08 | seydar | next time your in new england, i'm going to find you and ask you soooo many questions |
| 01:34:18 | seydar | i'll follow you around and take notes |
| 01:34:22 | evan | hehe |
| 01:34:28 | evan | hm, i wonder when that will be... |
| 01:34:30 | evan | where in NE are you? |
| 01:34:36 | seydar | NH/VT |
| 01:34:49 | seydar | but no one ever comes to NH. |
| 01:34:56 | seydar | so NY or boston is the best i can hope for |
| 01:35:19 | seydar | UNLESS you encourage headius to finish his master's at dartmouth, and then you visit him |
| 01:35:38 | evan | headius was doing a masters at dartmouth? |
| 01:36:16 | seydar | no. |
| 01:36:20 | seydar | but he should finish his there |
| 01:36:54 | headius | I debate going back to school sometimes |
| 01:37:12 | headius | that's about as far as it gets |
| 01:37:13 | ShayArnett enters the room. | |
| 01:37:16 | evan | headius: i didn't know you started a masters at dartmouth |
| 01:37:20 | seydar | he didn't! |
| 01:37:21 | headius | if I went back it would be for math or something |
| 01:37:26 | evan | i'm confused. |
| 01:37:28 | headius | heheh |
| 01:37:29 | seydar | he started one someone else |
| 01:37:31 | evan | but thats ok. |
| 01:37:35 | evan | it's friday. |
| 01:37:47 | seydar | you guys have the entire night ahead |
| 01:38:07 | anteaya__ enters the room. | |
| 01:38:24 | seydar | evan: how are methods stored, and what happens when you call a method? |
| 01:38:27 | tarcieri | heh, headius is working on an NIO reactor for JRuby? |
| 01:38:46 | tarcieri | not that I'm a big fan of EventMachine, but there is... EventMachine |
| 01:38:54 | evan | seydar: the written text for a file is converted into a sexp |
| 01:39:01 | evan | then the sexp is converted into CompiledMethod objects |
| 01:39:04 | evan | which the VM knows how to execute |
| 01:39:26 | evan | cm = Compile.compile_string "1 + 1" |
| 01:39:28 | evan | puts cm.decode |
| 01:39:29 | evan | do that. |
| 01:39:44 | headius | tarcieri: this will probably be something less than a full reactor |
| 01:39:53 | headius | it's not really necessary for anything other than threading logic for blocking IO |
| 01:40:05 | tarcieri | oh |
| 01:40:08 | tarcieri | well I just e-mailed you |
| 01:40:08 | tarcieri | heh |
| 01:40:09 | tarcieri | whatever |
| 01:40:46 | headius | I'm game to try anything :) but my primary goal is to get thread lifecycle to better match MRI even with blocking IO in the mix |
| 01:41:05 | tarcieri | yeah if you want something more low level implementing it yourself probably isn't a bad idea |
| 01:41:50 | tarcieri | there's also MINA, although I don't know how that'd interoperate with JRuby :/ |
| 01:42:22 | seydar | evan: i meant how are they stored in memory and how do they relate to their objects? |
| 01:42:34 | headius | yeah I know about MINA too...I'll probably try to poll available options, so any suggestions are helpful |
| 01:42:47 | headius | I don't want to add in a whole library if I can avoid it, but looking at code will help |
| 01:43:07 | evan | seydar: they're normal objects. |
| 01:43:16 | evan | exactly like everything else. |
| 01:43:35 | seydar | what happens when I call 1.foo? |
| 01:43:53 | evan | the class of 1 is found (Fixnum) |
| 01:44:02 | evan | then :foo is looked for in Fixnum.method_table |
| 01:44:09 | evan | if not there, look in Object.method_table |
| 01:44:43 | evan | when found, the VM creates a MethodContext object to hold the state of running |
| 01:45:09 | anteaya_ leaves the room. | |
| 01:45:31 | evan | all the details of how it executes a CompiledMethod under a MethodContext is too long for IRC. |
| 01:45:41 | evan | and thats something thats changing between C and C++ |
| 01:46:15 | atduskgreg leaves the room. | |
| 01:46:26 | Judofyr leaves the room. | |
| 01:47:06 | seydar | so the lookup time for methods is O(n), where n is the number of tables it has to go through? |
| 01:47:07 | evan | in C++, the CompiledMethod object is used to create an LLVM Function |
| 01:47:16 | evan | seydar: naively, yes. |
| 01:47:22 | evan | but you put a cache on the front of that |
| 01:47:28 | evan | so you don't have to look in the tables everytime |
| 01:47:38 | seydar | so it boils down to O(1)...? |
| 01:47:43 | evan | that is the subject of a very large amount of research. |
| 01:47:58 | seydar | oh well |
| 01:48:04 | evan | PIC (Polymorphic Inline Cache) being cutting edge |
| 01:48:10 | evan | if you want to read more, google that. |
| 01:48:23 | seydar | its like everything i ever learned in any CS courses is becoming useful all of a sudden |
| 01:48:32 | evan | hehe |
| 01:48:39 | seydar | evan: so tell me more about how you plan to incorporate LLVM |
| 01:48:41 | evan | i had the same feeling when I started Rubinius |
| 01:48:48 | evan | "Hey! These books are useful again!" |
| 01:48:52 | seydar | you're just using it as a JIT, right? |
| 01:48:56 | evan | yep. |
| 01:49:08 | seydar | what are you able to jit in any given method? |
| 01:49:14 | evan | a CompiledMethod has, inside it, an InstructionSequence object |
| 01:49:27 | evan | that is the bytecode |
| 01:49:35 | seydar | Rubinius bytecode? |
| 01:49:44 | evan | it's the control flow what the text said to do |
| 01:49:48 | evan | yes, Rubinius bytecode. |
| 01:50:07 | ezmobius leaves the room. | |
| 01:50:11 | evan | the phase 1 of using LLVM (what i'm doing now) |
| 01:50:28 | seydar | and how are you linking that to LLVM? |
| 01:50:29 | evan | takes an InstructionSeqence, and writes an LLVM Function that does the same work |
| 01:50:30 | rue | Be back |
| 01:50:45 | evan | LLVM makes this pretty easy |
| 01:50:55 | evan | one of the opcodes is the pop instruction |
| 01:51:02 | evan | which just removes whatever is on the top of the stack. |
| 01:51:05 | seydar | so what is stopping you from doing the JIT part AOT, making it AOT? |
| 01:51:22 | evan | in this phase1 approach? nothing. |
| 01:51:33 | evan | could do full AOT. |
| 01:51:38 | seydar | so why would you ever want to move beyond phase1? |
| 01:51:46 | evan | better performance |
| 01:52:00 | evan | if phase1 rocks so much ass, maybe we wont have to! |
| 01:52:00 | seydar | whats beyond phase1? |
| 01:52:01 | evan | :) |
| 01:52:16 | evan | things like trace trees, hot spot optimization, etc. |
| 01:52:24 | seydar | algebraic |
| 01:52:39 | seydar | sweetsauce |
| 01:52:57 | seydar | rubinius will soon have (maybe) AOT compilation, or soon a good chunk of it! |
| 01:53:12 | jtoy enters the room. | |
| 01:53:17 | seydar | ok i gotta sink me teeth into this |
| 01:53:20 | seydar | i gotta |
| 01:53:48 | seydar | where can i get the c++ book? |
| 01:54:18 | seydar | s/book/code |
| 01:55:07 | evan | it's in the cpp branch |
| 01:55:13 | evan | i haven't committed any of the LLVM stuff yet |
| 01:55:17 | evan | still playing with it. |
| 01:56:25 | seydar | and... any advice before i jump head first in c++? |
| 01:56:55 | evan | have fun! |
| 01:57:21 | seydar | sweet. |
| 01:57:33 | seydar | "im going to go kill myself, any advice?" "have fun!" |
| 01:57:42 | sudoer enters the room. | |
| 02:00:51 | tarcieri | that's how I interpreted that exchange |
| 02:01:12 | evan | :D |
| 02:02:32 | seydar | how do i clone the c++ branch? |
| 02:03:13 | evan | git branch cpp origin/cpp |
| 02:03:15 | evan | git checkout cpp |
| 02:03:31 | evan | that creates a local cpp branch that is hooked up to the remote one |
| 02:03:43 | dctanner_ leaves the room. | |
| 02:04:06 | anteaya leaves the room. | |
| 02:04:14 | seydar | how do i update it? |
| 02:04:26 | evan | git pull |
| 02:04:30 | evan | when you have it checked out |
| 02:04:37 | seydar | ok now im really confused |
| 02:04:39 | seydar | i did that |
| 02:05:06 | seydar | but the directory tree looks the same, and i have no clue what effect anything i do will have |
| 02:05:30 | evan | oh |
| 02:05:31 | evan | ls vm/ |
| 02:05:32 | seydar | wait |
| 02:05:34 | seydar | ah |
| 02:05:35 | seydar | yea |
| 02:05:35 | evan | thats where the C++ code is. |
| 02:05:43 | seydar | man, git is interesting |
| 02:06:47 | seydar | is there someway to test vm/ ? |
| 02:07:07 | evan | sure |
| 02:07:09 | evan | cd vm |
| 02:07:11 | evan | rake |
| 02:07:18 | evan | compiles and runs the vm tests. |
| 02:07:42 | lopex leaves the room. | |
| 02:07:44 | rue leaves the room. | |
| 02:08:41 | seydar | hm. yes. it needs parse_tree |
| 02:08:56 | seydar | whose installation has baffled me the whole two times i've tried installing it |
| 02:09:25 | evan | yes, thats true. |
| 02:09:32 | evan | gem install ParseTree |
| 02:09:41 | seydar | whoa. it cant be that simple |
| 02:09:48 | seydar | doesn't it require a bunch of other stuff? |
| 02:09:48 | evan | it better be. |
| 02:09:55 | evan | gem will install the other stuff. |
| 02:10:15 | seydar | but like. a copy of the ruby source and more jazz than the 1920s? |
| 02:10:24 | anteaya enters the room. | |
| 02:10:36 | evan | shouldn't no. |
| 02:11:46 | seydar | whats the fusion-experiment branch? |
| 02:12:10 | evan | any old experiment |
| 02:12:14 | evan | er. |
| 02:12:14 | evan | an |
| 02:15:07 | headius | this next shootout is going to be a boondoggle |
| 02:15:12 | seydar | why? |
| 02:15:25 | evan | headius: yeah, i'm getting that impression. |
| 02:15:43 | headius | especially given antonio's rah-rah for maglev recently |
| 02:15:54 | seydar | what the hell is a boondoggle?! |
| 02:15:59 | evan | it's going to be comparing apples to VMs |
| 02:16:07 | evan | er. |
| 02:16:09 | jtoy leaves the room. | |
| 02:16:10 | evan | VWs |
| 02:16:12 | headius | heheh |
| 02:16:22 | seydar | VW as is visual works? |
| 02:16:41 | seydar | i take it you two are a little sore over maglev? |
| 02:16:55 | evan | VW as in Volkswagon. |
| 02:17:03 | evan | ie, a useless comparison. |
| 02:17:05 | michaellatta_ enters the room. | |
| 02:17:11 | evan | seydar: not sore, no. |
| 02:17:15 | seydar | the apple analogy made more sense |
| 02:17:29 | seydar | clearly you two are a little ____ over maglev |
| 02:17:36 | seydar | the question is what is ____ |
| 02:17:41 | MenTaLguY enters the room. | |
| 02:17:42 | evan | i'm pensive. |
| 02:17:48 | MenTaLguY | howdy |
| 02:17:50 | evan | MenTaLguY: evening. |
| 02:17:54 | tarcieri | sup MenTaLguY |
| 02:18:11 | seydar | hej MenTaLguY |
| 02:18:12 | tarcieri | would like to know a little more about Maglev |
| 02:18:19 | atduskgreg enters the room. | |
| 02:18:22 | tarcieri | Tasks/Channels are a really nice abstraction... wonder what Maglev does |
| 02:18:35 | evan | tarcieri: i'm sure they use the Smalltalk stuff |
| 02:18:42 | evan | which, last I looked, was a mess. |
| 02:18:43 | tarcieri | doesn't know what that is |
| 02:18:56 | seydar | i spoke with an old employ of gemstone the other week |
| 02:18:59 | evan | not a mess, just really simplistic. |
| 02:19:05 | brixen | tarcieri: ah, I actually have been wondering what you thought of maglev |
| 02:19:16 | evan | Smalltalk 80, blue book style, barely had IO. |
| 02:19:20 | tarcieri | brixen: I need to actually look at it |
| 02:19:20 | brixen | tarcieri: particularly, a giant share everything state machine vs actors |
| 02:19:52 | tarcieri | evan: heh, so slightly better than Algol? :) |
| 02:20:02 | seydar | well the idea behind gemstone isn't that there's some crazy restriction. its that they just extend memory to be "memory" |
| 02:20:08 | brixen | tarcieri: I'm just curious what you think of multiple vm's with a single object store and what implications there are for an actor implementation on top of that |
| 02:20:25 | seydar | as of mid 1990s, at least |
| 02:20:28 | MenTaLguY | there aren't any special obstacles to implementing actors atop that |
| 02:20:40 | brixen | MenTaLguY: ah, good to know |
| 02:20:48 | evan | MenTaLguY: well, communication seems like it would be poll only |
| 02:20:56 | MenTaLguY | (actually it makes some things easier, though I don't know about efficiency) |
| 02:20:57 | evan | unless you build some signalling |
| 02:21:04 | headius | I don't know much about it but it seems like one design hassle would be having to be really conscious of what you make globally-reachable |
| 02:21:08 | MenTaLguY | well, yes, you do need a basic signalling infrasructure |
| 02:21:11 | evan | i don't think they have any signalling. |
| 02:21:29 | evan | ok boys and seydar |
| 02:21:33 | evan | i'm off to dinner and such |
| 02:21:43 | tarcieri | needs to go home |
| 02:21:46 | seydar | adios evan |
| 02:22:04 | seydar | tarcieri: sweet work on revactor, btw. i dont think i ever really got a chance to thank you |
| 02:22:09 | headius | hmmm |
| 02:22:19 | headius | anyone know how gemstone handles fixnums? |
| 02:22:20 | tarcieri | seydar: oh, thanks... it's certainly treating us well :) |
| 02:22:41 | headius | I implemented fib in raw Java using our fixnum type and it's no faster than running normal code with fastest settings in JRuby |
| 02:22:50 | headius | even with dynamic dispatch removed |
| 02:22:59 | seydar | thats good news for jruby |
| 02:23:04 | tarcieri | it's absurd how much data you can push through a Ruby process while still having a crazy API on top of it implementing all the control logic |
| 02:23:05 | headius | so in order to make it faster it would have to treat them as primitives somewhere |
| 02:23:26 | tarcieri | but re: MagLev, I haven't looked at Gemstone/S or whatever but I really doubt they have a nice kernel poll mechanism |
| 02:23:47 | seydar | maglev holds most of its power in its interpreter, which is magical and underlooked |
| 02:24:12 | tarcieri | yeah, I'm talking specifically about I/O |
| 02:24:20 | headius | well, perhaps "neverlooked" since only a few elite members of the Ruby community have even gotten hold of maglev |
| 02:24:26 | tarcieri | yeah heh |
| 02:24:26 | headius | so maybe you mean gemstone/s |
| 02:24:34 | seydar | headius: from what i've gleaned, they only have made a few changes to the bytecode part |
| 02:24:48 | seydar | yea, gemstone/s and maglev, atm im using both interchangeably |
| 02:24:49 | tarcieri | yeah, I heard they just added a few instructions to support Ruby |
| 02:24:50 | tarcieri | which is cool |
| 02:25:08 | headius | it will be cool if we find out which ones :) |
| 02:25:16 | seydar | i want to try to get magma into ruby, and then hook that up somewhere |
| 02:25:41 | seydar | headius: why not take a VM and then just adjust it to fit ruby? it could take some work, but its doable |
| 02:25:55 | headius | openjdk is just waiting to be manipulated that way |
| 02:26:07 | brixen | tarcieri: so, do you think a single object store with multiple vm's will continue to scale on a chip like this? http://www.tilera.com/ |
| 02:26:17 | tarcieri | heh, the Tilera is awesome |
| 02:26:32 | tarcieri | brixen: central anything will fail to scale well on multi-core processors |
| 02:26:44 | brixen | tarcieri: yeah, that's what I'm wondering about |
| 02:26:48 | headius | I heard one person theorize that they probably added a bytecode for dealing with Ruby's instance vars |
| 02:26:50 | tarcieri | brixen: the BEAM SMP scheduler is completely decentralized |
| 02:27:03 | headius | maybe they did, maybe not |
| 02:27:12 | tarcieri | there's no global locks (unless you use it with the hybrid heap, but they're trying to fix that) |
| 02:27:23 | brixen | tarcieri: also, is vmactor intended to be implemented across distributed vm's or only the mvm stuff? |
| 02:27:36 | tarcieri | brixen: right now it only supports MVM |
| 02:27:45 | brixen | but eventually? |
| 02:27:59 | tarcieri | yes, eventually it will need to be made compatible with a multi-node model |
| 02:28:07 | brixen | ok |
| 02:28:15 | brixen | tarcieri: you've seen, I'm assuming? http://www.slideshare.net/ballona/actors-a-unifying-pattern-for-scalable-concurrency-c4-2006/ |
| 02:28:32 | tarcieri | don't think so |
| 02:28:43 | tarcieri | the title is certainly my take on the matter though |
| 02:28:43 | tarcieri | heh |
| 02:28:57 | brixen | in particular, slides 37-42 |
| 02:29:08 | tarcieri | Personally I feel that "nodes" should map to N CPU cores |
| 02:29:10 | brixen | trying to see this in rubinius |
| 02:29:20 | seydar | headius: how would gemstone/s avoid the penalty from constantly adding objects to the database? |
| 02:29:31 | brixen | tarcieri: that talk is by the creator of Io |
| 02:29:36 | tarcieri | aah |
| 02:29:39 | tarcieri | Io is a nifty language |
| 02:29:49 | brixen | dunno if the talk is available, but the slides are provocative :) |
| 02:30:02 | headius | seydar: the only official word is that only globally-accessible state is entered into the cache |
| 02:30:07 | brixen | seydar: through levels of caches, I believe |
| 02:30:09 | tarcieri | brixen: I'm having trouble inferring from those slides what he has in mind |
| 02:30:18 | brixen | tarcieri: heh, ditto |
| 02:30:19 | headius | so local objects not accessible outside a call stack don't propagate |
| 02:30:26 | brixen | tarcieri: hence, my Q about vmactors |
| 02:30:36 | seydar | brixen: but... the write speed! |
| 02:30:42 | tarcieri | brixen: however considerable optimization work has gone into optimizing multi-core systems as a single logical node |
| 02:31:00 | headius | what I find very confusing is what if I do $proc = proc {} |
| 02:31:00 | tarcieri | brixen: things like cache coherency across multiple CPUs / CPU cores |
| 02:31:35 | headius | that essentially gives global access to local state...so they'd either have to break procs that go into object cache or do something else with them |
| 02:31:47 | brixen | tarcieri: ahh |
| 02:31:49 | tarcieri | brixen: however the only way to really use that optimally is a shared nothing language... that lets you use shared memory as a high speed data bus while still eliminating global locks, and exposing all the cores to the programmer in a single VM |
| 02:32:30 | headius | stuff like def foo(&b); eval 'puts a', b; end; a = 1; foo { } is going to be a problem if they don't implement procs and bindings right |
| 02:32:48 | tarcieri | that means that garbage collection can happen at the level of your shared-nothing concurrency primitive, and if it's needed before the garbage collection completes you just roll back |
| 02:33:05 | brixen | tarcieri: ahh, interesting |
| 02:33:06 | tarcieri | there's no "stop the world" condition |
| 02:33:09 | seydar | headius: why would $proc = proc {} raise Hell.new? |
| 02:33:32 | tarcieri | anywho, now I really need to go home |
| 02:33:32 | tarcieri | heh |
| 02:33:39 | brixen | tarcieri: thanks! |
| 02:33:45 | tarcieri | np |
| 02:33:47 | tarcieri | -> gone |
| 02:33:59 | michaellatta leaves the room. | |
| 02:34:43 | headius | seydar: because maglev is claimed to propagate any global state across VMs |
| 02:34:50 | brixen | headius: do we have specs for that? |
| 02:34:55 | brixen | the def foo(&b)...? |
| 02:35:01 | headius | which would mean you have a proc, with access to local variables in the containing scope, that's now propagated to other systems with different call stacks and locals |
| 02:35:07 | headius | brixen: yes |
| 02:35:12 | seydar | headius: im guessing that that means that its available to other VMs... |
| 02:35:12 | brixen | sweet |
| 02:35:23 | seydar | so why would saving a proc break shit? |
| 02:35:24 | brixen | headius: now, if only they'd talk about running them :) |
| 02:35:57 | headius | seydar: because it means propagating things that aren't normally global |
| 02:36:12 | headius | you might end up with stuff from all over the call stack in global state as a result |
| 02:36:22 | headius | and if there's no way to call back, you can't update containing scopes |
| 02:36:28 | seydar | oh, because a proc carries with it a certain original binding! |
| 02:36:31 | headius | right |
| 02:36:37 | seydar | yea, i missed that |
| 02:36:46 | seydar | whats the difference between lambda, proc, and Proc.new? |
| 02:36:48 | headius | propagating a binding is going to be super problematic...so much so I don't think they'll be able to do it |
| 02:37:06 | headius | seydar: arity checking |
| 02:37:20 | headius | in 1.8 lambda and proc are both lambdas and enforce arity |
| 02:37:32 | headius | in 1.9 only lambda and -> {} are lambdas |
| 02:38:23 | seydar | alrighty |
| 02:38:34 | seydar | makes sense |
| 02:38:50 | seydar | but now i gotta quitter la classe |
| 02:39:02 | MenTaLguY | yay stabby blocks |
| 02:39:04 | seydar | and as they say in esperantistan, gxis |
| 02:39:18 | seydar leaves the room. | |
| 02:45:33 | VVSiz_ enters the room. | |
| 02:52:14 | brixen | headius: just started reading this, looks interesting: http://www.iam.unibe.ch/~scg/cgi-bin/scgbib.cgi/abstract=yes?Denk08b |
| 02:53:51 | VVSiz leaves the room. | |
| 02:54:16 | headius | interesting |
| 02:54:26 | headius | the meta-hook problem |
| 02:55:28 | brixen | yeah, very recent paper |
| 03:07:33 | Fullmoon enters the room. | |
| 03:09:59 | cschneid_ leaves the room. | |
| 03:13:29 | Fullmoon leaves the room. | |
| 03:33:59 | obvio171 enters the room. | |
| 03:49:06 | Fullmoon enters the room. | |
| 03:54:38 | mitchellvriley enters the room. | |
| 04:16:05 | atduskgreg leaves the room. | |
| 04:23:11 | yugui enters the room. | |
| 04:25:42 | mitchellvriley leaves the room. | |
| 04:26:35 | obvio enters the room. | |
| 04:27:06 | obvio171 leaves the room. | |
| 04:33:33 | blakewatters enters the room. | |
| 04:41:15 | wycats leaves the room. | |
| 04:46:42 | benny leaves the room. | |
| 04:49:44 | be9 enters the room. | |
| 04:59:34 | blakewatters leaves the room. | |
| 05:02:56 | Fullmoon leaves the room. | |
| 05:11:36 | shame enters the room. | |
| 05:11:59 | wycats enters the room. | |
| 05:16:25 | dalee leaves the room. | |
| 05:21:51 | anteaya leaves the room. | |
| 05:23:02 | headius leaves the room. | |
| 05:24:03 | headius enters the room. | |
| 05:32:36 | rue enters the room. | |
| 05:34:11 | rue | There are no words for how much Hulk rocked |
| 05:43:37 | Fullmoon enters the room. | |
| 05:57:13 | scoopr | oh really? |
| 06:06:48 | headius_ enters the room. | |
| 06:06:48 | headius leaves the room. | |
| 06:07:23 | rue | Yep, pure excellence |
| 06:08:39 | rue leaves the room. | |
| 06:08:54 | rue enters the room. | |
| 06:10:13 | wyhaines leaves the room. | |
| 06:12:50 | Fullmoon leaves the room. | |
| 06:15:09 | dysinger leaves the room. | |
| 06:16:20 | ShayArnett leaves the room. | |
| 06:27:24 | wyhaines enters the room. | |
| 06:29:04 | michaellatta_ leaves the room. | |
| 06:29:23 | lstoll enters the room. | |
| 06:29:36 | michaellatta enters the room. | |
| 06:43:31 | lstoll leaves the room. | |
| 06:43:48 | headius leaves the room. | |
| 06:43:59 | lstoll enters the room. | |
| 06:43:59 | headius enters the room. | |
| 07:07:19 | wycats | drbrain: does ParseTree install seamlessly on Windows? |
| 07:07:42 | drbrain | wycats: Luis built a package, so it should |
| 07:09:34 | wycats | w00t |
| 07:19:59 | blakewatters enters the room. | |
| 07:20:18 | lstoll leaves the room. | |
| 07:21:18 | headius | what does it use to build on windows? |
| 07:21:49 | lstoll enters the room. | |
| 07:26:31 | wycats | headius: http://pastie.org/214939 |
| 07:26:32 | wycats | heh |
| 07:27:04 | headius | yeah |
| 07:27:24 | headius | what about it? |
| 07:27:35 | headius | oh wait |
| 07:27:44 | headius | gah, that's a bug |
| 07:29:26 | headius | rubinius does it wrong too |
| 07:29:35 | headius | though I'm not 100% up to date |
| 07:29:48 | wycats | that's MRI |
| 07:29:51 | wycats | not JRuby |
| 07:29:57 | headius | yeah I know |
| 07:30:00 | headius | it's a bug |
| 07:30:02 | wycats | the weird is the p local_variables |
| 07:30:03 | wycats | aha |
| 07:30:10 | headius | local_variables shouldn't show variables you can't reference |
| 07:30:12 | wycats | if MRI does it and rbx does it I would say rbx does it "right" |
| 07:30:23 | wycats | for some definition of right |
| 07:30:25 | headius | 1.9 and jruby do it the other way |
| 07:30:33 | wycats | that comes up a few times |
| 07:30:35 | headius | so we're coming to you from the future...the future of being right |
| 07:30:47 | wycats | JRuby does that ;) |
| 07:30:54 | wycats | I have mixed feelings about that |
| 07:31:50 | headius | heh |
| 07:31:54 | headius | rubinius is wrong for others too |
| 07:32:17 | evan | ew. |
| 07:32:19 | evan | thats dumb. |
| 07:32:28 | wycats | evan: apparently it's dumb and we do it |
| 07:32:29 | wycats | ;) |
| 07:32:34 | headius | def test; 1.times { x = 1 }; p local_variables; p x; end; test |
| 07:32:53 | headius | rubinius shows x there too |
| 07:32:56 | headius | and something called @lre |
| 07:33:04 | wycats | @lre ftw |
| 07:33:04 | evan | oops |
| 07:33:08 | evan | it shouldn't show @lre |
| 07:33:14 | evan | thats an internal local. |
| 07:33:15 | headius | ruby does not show anything there |
| 07:33:21 | headius | backref? |
| 07:33:22 | wycats | evan: internal locals ... hehe |
| 07:33:26 | evan | no |
| 07:33:39 | evan | used to unwind return and break in a block to the right position |
| 07:33:56 | headius | btw, I asked about local_variables behavior at one point and matz said 1.9 is correct |
| 07:34:03 | evan | nice. |
| 07:34:10 | evan | does 1.9 show x? |
| 07:34:14 | wycats | "I asked Matz and he said JRuby was right... so there" |
| 07:34:16 | evan | i find it funny a little that we do. |
| 07:34:16 | headius | it does not, in either case |
| 07:34:21 | evan | that rubinius does |
| 07:34:24 | headius | yeah, you would have had to add it |
| 07:34:32 | wycats | evan: there's possibly a spec |
| 07:35:02 | evan | thats quite strange. |
| 07:35:34 | evan | someone must have made Kernel#local_variables look into the subscopes |
| 07:35:35 | evan | which is wrong. |
| 07:35:42 | evan | because x isn't in the local_names of the CM for test. |
| 07:35:48 | headius | it doesn't go down another level btw |
| 07:35:56 | headius | def test; 1.times { x = 1; 1.times { y = 1 } }; p local_variables; p x; end; test |
| 07:35:59 | evan | yeah, let me check #local_variables |
| 07:36:09 | headius | still only shows @lre and x |
| 07:36:18 | evan | thats.. odd. |
| 07:36:31 | blakewatters leaves the room. | |
| 07:36:48 | headius | wycats: just be happy you don't have to implement local_variables to only show variables that have been assigned once |
| 07:37:00 | wycats | haha |
| 07:37:07 | headius | that's how it used to work, maybe still does in mri |
| 07:37:23 | headius | yep, still does |
| 07:37:29 | evan | huh. where is it getting x from in the first case... |
| 07:37:39 | headius | wait. no |
| 07:37:39 | evan | thats definitely a compiler bug |
| 07:37:45 | headius | not on this version anyway |
| 07:37:58 | headius | if false; x = 1; end still shows up x in normal local_variables |
| 07:37:58 | evan | i think it must be pulling x out because it sees it referenced outside |
| 07:38:10 | wycats | stuff like this is so gorgeous: ctx = MethodContext.current.sender |
| 07:38:11 | evan | which is an old behavior |
| 07:38:13 | evan | that I removed. |
| 07:38:15 | wycats | in def local_variables |
| 07:38:47 | evan | ah, yep. |
| 07:38:51 | evan | you know what |
| 07:39:00 | evan | i'll bet that the code that calculates #local_names is wrong. |
| 07:39:02 | evan | let me check. |
| 07:39:50 | evan | yep. |
| 07:39:54 | evan | it's putting them all in |
| 07:39:58 | evan | without checking the depth. |
| 07:40:00 | evan | thats the bug. |
| 07:40:03 | headius | fyi, it does need to walk *up* though |
| 07:40:09 | evan | it's just in the reporting |
| 07:40:10 | evan | yeah |
| 07:40:11 | evan | it does that |
| 07:40:13 | headius | ok |
| 07:40:18 | evan | if you call #local_variables in a block. |
| 07:40:19 | headius | then over child scopes? |
| 07:40:22 | evan | yep |
| 07:40:27 | evan | this just a simple compiler bug |
| 07:40:32 | evan | it's just recording too many locals |
| 07:40:39 | evan | in the #local_names slot of the CM |
| 07:40:55 | evan | the LocalScope in the compiler can see all locals |
| 07:40:59 | evan | regardless of depth |
| 07:41:13 | evan | and this code should have only put things at depth = 0 in the Tuple |
| 07:41:15 | headius | why not just store only the names from that context |
| 07:41:16 | evan | put it put everything. |
| 07:41:23 | headius | they're not used for anything else but local_variables |
| 07:41:26 | evan | thats what it's supposed to do |
| 07:41:31 | evan | it's just overzealous |
| 07:41:32 | headius | ahh ok |
| 08:07:59 | Fullmoon enters the room. | |
| 08:23:17 | Fullmoon leaves the room. | |
| 08:24:00 | Fullmoon enters the room. | |
| 08:37:06 | lstoll leaves the room. | |
| 08:46:55 | MenTaLguY leaves the room. | |
| 08:47:48 | radarek enters the room. | |
| 08:50:08 | TheVoice leaves the room. | |
| 08:51:03 | headius_ enters the room. | |
| 08:51:31 | Judofyr enters the room. | |
| 08:53:05 | lstoll enters the room. | |
| 08:57:15 | Fullmoon leaves the room. | |
| 08:59:20 | headius leaves the room. | |
| 09:02:28 | qwert666 enters the room. | |
| 09:09:41 | thehcdreamer enters the room. | |
| 09:09:58 | headius enters the room. | |
| 09:11:31 | headius_ leaves the room. | |
| 09:11:32 | headius leaves the room. | |
| 09:11:51 | headius enters the room. | |
| 09:12:23 | headius leaves the room. | |
| 09:13:35 | headius_ enters the room. | |
| 09:13:42 | headius_ leaves the room. | |
| 09:15:26 | chenkai enters the room. | |
| 09:18:37 | Maledictus enters the room. | |
| 09:20:10 | qwert666 leaves the room. | |
| 09:38:18 | robertpostill enters the room. | |
| 09:40:05 | robin_dewd enters the room. | |
| 09:42:45 | Yurik leaves the room. | |
| 09:43:31 | Yurik enters the room. | |
| 09:52:43 | headius enters the room. | |
| 09:53:25 | msimbartl enters the room. | |
| 09:55:50 | zenspider | yay! http://rafb.net/p/7OiQRa84.html |
| 09:57:05 | scoopr | mass testing rbx? |
| 09:57:28 | zenspider | that's just mri right now... pre-filtering for rbx |
| 09:57:35 | scoopr | ah, right |
| 09:57:43 | zenspider | so I've got 261 test/unit based gems I can use |
| 09:57:51 | zenspider | and 15 spec based gems |
| 09:58:09 | scoopr | does that include rails? :P |
| 09:58:12 | Fullmoon enters the room. | |
| 09:58:29 | zenspider | hrm... I should actually go back and check that number for non-zero number of tests. :) |
| 09:58:35 | zenspider | I'm positive rails failed |
| 10:00:24 | zenspider | crap |
| 10:00:31 | zenspider | yeah... stupid developers |
| 10:00:48 | zenspider | make that 218 test/unit and 13 rspec gems |
| 10:01:25 | headius leaves the room. | |
| 10:03:11 | krisps leaves the room. | |
| 10:10:46 | Fobax leaves the room. | |
| 10:43:00 | sudoer leaves the room. | |
| 10:51:01 | msimbartl leaves the room. | |
| 11:06:13 | Ski1 enters the room. | |
| 11:06:38 | NoKarma enters the room. | |
| 11:12:44 | bitsweat leaves the room. | |
| 11:34:21 | michalw enters the room. | |
| 11:34:27 | krisps enters the room. | |
| 11:45:05 | yipstar leaves the room. | |
| 12:00:45 | qwert666 enters the room. | |
| 12:03:04 | EugZol enters the room. | |
| 12:19:39 | jero5 enters the room. | |
| 12:32:30 | EugZol leaves the room. | |
| 12:32:54 | chris2 enters the room. | |
| 12:37:28 | chenkai leaves the room. | |
| 12:42:55 | lopex enters the room. | |
| 12:48:06 | Judofyr leaves the room. | |
| 12:48:52 | thehcdreamer leaves the room. | |
| 12:49:16 | Judofyr enters the room. | |
| 12:51:32 | michalw leaves the room. | |
| 12:56:25 | thehcdreamer enters the room. | |
| 13:13:54 | lstoll leaves the room. | |
| 13:19:01 | robertpostill leaves the room. | |
| 13:19:17 | robertpostill enters the room. | |
| 13:38:58 | lstoll enters the room. | |
| 13:41:48 | qrush enters the room. | |
| 13:42:05 | qrush | If anyone's awake |
| 13:42:19 | qrush | i'm looking into rubinius, i'm trying to understand what exactly it does. |
| 13:42:37 | qrush | I guess i dont understand the whole VM thing. |
| 13:56:20 | rue | You may need to be more (or less) specific |
| 13:56:44 | qrush | heh, it's ok. i'm looking around for an oss project to contribute to and rubinius was suggested |
| 13:56:58 | qrush | I'm dabbled with ruby and heard this project |
| 13:57:08 | qrush | but i really dont have any experience using it or the technology behind it. |
| 13:57:22 | rue | The short summary is that Rubinius just runs your Ruby programs |
| 13:59:34 | rue | The fun bits are that we are implementing as much of the language as possible in Ruby rather than C and that rather than using the interpreter approach that Ruby 1.8 takes, we use a bytecode virtual machine |
| 14:00:29 | qrush | http://www.reddit.com/info/6nc1h/comments/ |
| 14:00:38 | qrush | some context ;) |
| 14:00:40 | rue | I.e., your programs are translated into a sequence of simple(r) instructions or operations that the virtual machine can perform |
| 14:00:46 | qrush | so like the JVM. |
| 14:01:57 | rue | Yeah, same basic principle. In reality it will naturally be more like one of the Smalltalk or Self VMs than a Java VM but they all employ the same basic strategy |
| 14:02:18 | Yurik leaves the room. | |
| 14:04:27 | qrush | Sounds neat. Is there a list somewhere of companies or even projects that use rubinius? |
| 14:05:37 | gnufied enters the room. | |
| 14:10:20 | qrush | sits back and watches the rubyconf keynote. |
| 14:11:10 | Judofyr leaves the room. | |
| 14:14:05 | krisps leaves the room. | |
| 14:20:24 | dbussink | qrush: well, with rubinius you don't really need to fully understand the intricate details of the vm, there is a lot of stuff that can be done what is simpler or easier to understand |
| 14:22:08 | qrush | alright. i do like ruby, and i have pretty much zero experience with c/c++ |
| 14:22:57 | dbussink | qrush: you can do a lot of things without touching the c/c++ stuff |
| 14:28:30 | qrush | I guess my only experience with ruby though is with rails. i need to play a bit with it first |
| 14:28:57 | Fullmoon leaves the room. | |
| 14:29:29 | dbussink | qrush: did you clone the repository already? and ran some specs? |
| 14:29:51 | lopex leaves the room. | |
| 14:29:54 | dctanner enters the room. | |
| 14:29:56 | qrush | Not yet. i've got this though http://adam.blog.heroku.com/past/2008/6/12/quickstart_to_hacking_rubinius/ |
| 14:30:48 | qrush | after the keynote is over i will. i've got a little rails based app i can port over to just straight ruby with relative ease, and i'll look into the bugs from there. |
| 14:31:54 | dbussink | qrush: cool! |
| 14:32:15 | dbussink | qrush: that page is not completely up to date though |
| 14:32:30 | dbussink | instead of running ./shotgun/rubinius it's ./bin/rbx these days |
| 14:32:39 | qrush | What. it's barely a week old. |
| 14:32:54 | dbussink | that change is even younger ;) |
| 14:33:25 | dbussink | we're still a moving target, so stuff gets outdated pretty quick |
| 14:34:14 | thehcdreamer leaves the room. | |
| 14:35:01 | dbussink | qrush: it's also in the first comment btw |
| 14:36:17 | qrush | I also need to pick up git |
| 14:37:01 | qrush | I've got it installed but not really sure about how to use it. i've got experience with svn/cvs mostly, and i've been reading about it, but no real experience using it yet. |
| 14:44:43 | dbussink | ah, well, a good first step is to forget everything you know about svn / cvs ;) |
| 14:45:52 | dbussink | qrush: http://rubinius.lighthouseapp.com/projects/5089/using-git |
| 14:46:39 | qrush | Thanks. |
| 15:05:38 | michalw enters the room. | |
| 15:16:30 | Yurik enters the room. | |
| 15:18:58 | wyhaines leaves the room. | |
| 15:20:04 | rue | What is this bin/rbx? When I was young, we had to type 18 characters with upslope /'s both ways! |
| 15:20:51 | qrush | i'm curious as to why it's not /rbs |
| 15:21:10 | qrush | not sure where the 'x' comes from :P |
| 15:31:07 | robertpostill leaves the room. | |
| 15:31:20 | michalw leaves the room. | |
| 15:32:35 | fbuilesv enters the room. | |
| 15:35:07 | dbussink | the x is for the coolness factor ;) |
| 15:37:42 | fbuilesv enters the room. | |
| 15:37:51 | fbuilesv enters the room. | |
| 15:38:18 | lstoll leaves the room. | |
| 15:43:45 | Fullmoon enters the room. | |
| 15:43:46 | qrush | heh |
| 15:46:45 | dctanner leaves the room. | |
| 15:54:41 | moofbong enters the room. | |
| 16:06:01 | dysinger enters the room. | |
| 16:11:42 | Yurik leaves the room. | |
| 16:19:31 | wvdschel leaves the room. | |
| 16:29:18 | yugui leaves the room. | |
| 16:34:26 | thehcdreamer enters the room. | |
| 16:55:55 | Rich_Morin__ enters the room. | |
| 16:56:41 | Rich_Morin | Is there a pretty-printer for sexp's? |
| 17:17:07 | brainopia enters the room. | |
| 17:29:44 | rue | Rich_Morin__: Yeah, look at the files in lib/compiler and lib/bin |
| 17:31:14 | chris2 leaves the room. | |
| 17:42:49 | blakewatters enters the room. | |
| 17:54:08 | be9 leaves the room. | |
| 18:14:31 | brainopia leaves the room. | |
| 18:15:10 | brainopia enters the room. | |
| 18:15:19 | brainopia leaves the room. | |
| 18:15:57 | brainopia enters the room. | |
| 18:19:56 | thehcdreamer leaves the room. | |
| 18:20:43 | brainopia leaves the room. | |
| 18:21:15 | brainopia enters the room. | |
| 18:21:20 | brainopia leaves the room. | |
| 18:21:43 | enebo enters the room. | |
| 18:22:46 | atduskgreg enters the room. | |
| 18:23:07 | thehcdreamer enters the room. | |
| 18:24:34 | blakewatters leaves the room. | |
| 18:26:20 | Jzalae leaves the room. | |
| 18:37:46 | Fullmoon_ enters the room. | |
| 18:45:54 | thehcdreamer leaves the room. | |
| 18:45:57 | qrush | i must say, git is a lot better than svn when it comes to file transfer. at least it lets you know the progress |
| 18:48:49 | brainopia enters the room. | |
| 18:55:45 | Fullmoon leaves the room. | |
| 18:57:36 | headius enters the room. | |
| 19:03:30 | chris2 enters the room. | |
| 19:05:39 | chris2 leaves the room. | |
| 19:07:15 | qrush | i suck at unix. |
| 19:07:21 | qrush | so i've got rubinius installed |
| 19:07:31 | qrush | i want to create a symlink for rbx |
| 19:07:45 | qrush | i tried sudo ln -s bin/rbx /usr/bin/rb |
| 19:08:15 | qrush | am i missing something here? :/ |
| 19:09:13 | qrush | alright, got it. ln wants the full path. |
| 19:16:52 | thehcdreamer enters the room. | |
| 19:23:07 | enebo leaves the room. | |
| 19:23:42 | enebo enters the room. | |
| 19:25:17 | michalw enters the room. | |
| 19:55:36 | thehcdreamer leaves the room. | |
| 19:56:14 | enebo__ enters the room. | |
| 19:57:40 | enebo leaves the room. | |
| 20:00:09 | zachad enters the room. | |
| 20:02:36 | yipstar enters the room. | |
| 20:05:35 | zachad enters the room. | |
| 20:07:33 | zachad leaves the room. | |
| 20:10:48 | thehcdreamer enters the room. | |
| 20:11:21 | enebo_ enters the room. | |
| 20:14:06 | Yurik enters the room. | |
| 20:14:36 | enebo__ leaves the room. | |
| 20:25:14 | headius leaves the room. | |
| 20:26:38 | atduskgreg leaves the room. | |
| 20:29:19 | ezmobius enters the room. | |
| 20:30:43 | obvio171 leaves the room. | |
| 20:34:27 | shame leaves the room. | |
| 20:34:52 | enebo_ leaves the room. | |
| 20:35:38 | shame enters the room. | |
| 20:36:05 | shame leaves the room. | |
| 20:42:23 | shame enters the room. | |
| 20:47:51 | evan | HA! NestedVM is so cute. |
| 20:48:12 | enebo enters the room. | |
| 20:50:51 | dbussink | evan: nestedvm? |
| 20:51:49 | evan | look it up |
| 20:52:06 | evan | it's a JVM application that translates MIPS assembly to .java and .class files |
| 20:52:13 | dbussink | ah, cool! |
| 20:52:18 | evan | probably the coolest part is that it's really straightforward |
| 20:52:25 | dbussink | elegance of mips to the win :) |
| 20:52:27 | evan | if you look at the presentation .pdf |
| 20:52:29 | evan | you'll laugh. |
| 20:52:38 | evan | when they show you the MIPS, then the .java code |
| 20:53:38 | evan | yeah, doing it on MIPS is the key |
| 20:53:40 | headius_ enters the room. | |
| 20:53:42 | evan | since MIPS is so nice and clean. |
| 20:53:49 |