Index

Show enters and exits. Hide enters and exits.

00:00:11Defiler#define GUARD(predicate_expression) if( ! (predicate_expression) ) { FAIL(); }
00:00:15dgtizedevan: what does this do: GUARD(HASH_P(msg->recv));
00:00:28dgtizedis it locking the hash?
00:00:31DefilerJust makes sure that the argument is not null/zero
00:00:36agardinerensures that recv is a hash
00:00:36evanit fails the primitive if the receiver of the primitive isn't a hash.
00:00:40dgtizedok
00:00:50evandgtized: go look in cpu_primitives.c
00:00:56evanthose are all defined in there.
00:01:22DefilerMost of the BLAH_P macros are in oop.h, as well
00:01:28dgtizedright, I see that, what I wanted to avoid was just copy pasting what the boilerplate code on the other hash functions was
00:01:33Defilerbut they should be clear without looking at the implementation
00:01:57dgtizedyes, but the last time I looked at primitives the object argument wasn't coming out of msg->recv
00:02:09evanthe argument isn't.
00:02:13evanit's the receiver
00:02:15evannot any arguments.
00:02:24evanthe arguments are still on the stack.
00:03:46GMFlash leaves the room.
00:03:46GMFlash enters the room.
00:03:47dgtizedok, well that's not immediatly clear based on it's usage, since hash_get and hash_set use msg->recv in the place of the hash argument to the C function
00:03:52evanright
00:04:02evanbecause you send those messages to a Hash object.
00:04:09evanthus, the receiver is a hash.
00:04:23evanhash there is the table.
00:04:25Defiler"fail the primitive if the receiver of this message is not a Hash" is the way to read that
00:04:25dgtizedI thought the reciever was the specific hash you were using from the stack?
00:04:42evanit is.
00:04:56dgtizedso msg->recv is grabbing that from the stack how?
00:05:02evanit's not.
00:05:23evanthe receiver had to be removed from the stack to figure out how to dispatch the method
00:05:37evanbefore, with primitives, the receiver was pushed back on the stack before the primitive was run
00:05:43DefilerThe VM has already populated that 'msg' structure for you by the time this code is run
00:05:47evanI elimenated that
00:06:15evanso the primitive get to see a 'struct message' with all the details about sending the message filled in, including the receiver
00:06:28dgtizedok, that's what I didn't follow, I knew there was some magic about the msg structure, where does that occur?
00:06:42evanat the very beginning of the method lookup
00:06:59evanit's filled with initial details in instructions.rb
00:07:05evanand then passed down
00:07:39jero5 leaves the room.
00:08:39dgtizedok, I see it now -- alright, I mean I think I would have been fine by copy pasting, but I wanted to know why I needed those mantra's
00:08:48evanno problem
00:08:57evanthat was reworked to streamline method dispatch
00:09:05evanyou'll see that we have SendSite objects now
00:09:18evanwhich can be specialized with different ways of figuring out how to run a method, based on where it's run from.
00:09:30dgtizedoh this was to take care of / or something?
00:09:43evanwhats / ?
00:09:52DefilerI love it when I update a Linux kernel, and it renames all of my /dev/sd* disks
00:09:54dgtizedfrom mathn or something like that?
00:09:58evanoh
00:09:58evanno
00:10:00evanunrelated.
00:13:51dgtizedok so since rehash modifies the reciever in place
00:13:55evanyep
00:14:02dgtizedcan I do a RET(msg->recv); ?
00:14:08evansure
00:16:12wmoxam leaves the room.
00:19:39mernen enters the room.
00:20:20dgtizedand we only need to add a primtive to primitives.rb right, it propegates everywhere else automatically?
00:20:30agardinerand primitive_names.rb
00:21:14evanwe could actually probably get rid of primitive_names.rb now
00:21:26evanand just use the instance methods list from primitives.rb
00:21:27agardinerthat would be neat
00:21:30evansince order doesn't matter anymore
00:27:09dgtizedugh, alright I think I properly implemented rehash, except I don't think it's going to work since the primitive uses the C routines for find and insert, which means it doesn't respect hash/hash_value differences
00:27:30evansure it will.
00:27:35evanyou only need the details in the table to rehash
00:27:41evanhm
00:27:42evanactually..
00:27:53evanno, thats true.
00:28:00dgtizedthose are stored in the table, but it doesn't respect them
00:28:01evanyou just need to the details already in the table
00:28:02agile enters the room.
00:28:13evanwhat is those
00:28:33dgtizedthe keys, and the hash value are stored in each tuple, it's just not doing object equality on the keys right?
00:29:00evanright
00:29:07evanbut you don't need to do that to rehash.
00:29:15evanyou just need to the hash value to rehash
00:29:18evanand you already have it.
00:29:30dgtizedhmm, alright
00:36:03boyscout1 commit by Mutwin Kraus
00:36:04boyscout * Adding File#truncate improvements from #325 and #326; 1a78da8
00:39:12mutlei'm going to sleep now, bye
00:41:10dgtizedumm whoever just wrote the File#chown spec it doesn't seem to be working on either 1.8 or rubinius
00:42:45mutledgtized: i wrote it and only tested on os x 10.5 where it worked in both ruby and rubinius.
00:42:46dgtizedevan: did that profile of bin/ci require a specific patch or should that work with current HEAD?
00:43:10dgtizedmutle: well it doesn't work on linux
00:43:44dgtizedmutle: because the operation is not permitted in the first place
00:44:07d2dchat leaves the room.
00:44:36dgtizedmutle: you can't do a chown test without sudo on linux, and most people aren't going to have that
00:45:30mutledgtized: what should i do instead? no specs on linux?
00:46:35dgtizedmutle: well you could check to see if you have the permisions to run that spec?
00:47:17dgtizedmutle: I'm really curious how it runs on OSX either, if unless you are running as a superuser?
00:47:42jeremydurham_ enters the room.
00:47:44kofno leaves the room.
00:47:48mutlei am an admin, but not root and i have privs to read /etc/group, so it works fine :)
00:48:13mutlebut you are right. i will add a check tomorrow
00:49:02dgtizedyea, I mean I can run the specs with sudo, and I'm sure it would work, but that doesn't mean it's a good idea
00:49:12mutlebut it would be nice to have the ability to run the spec as a privileged user to ensure everythings working. is there any mechanism in rubinius? or just sudo mspec?
00:50:29dgtizedmutle: I think sudo mspec is your only option, so presumably the spec should be excluded if the user running it lacks root?
00:50:59boyscout1 commit by Charles Comstock
00:51:00boyscout * added hash_rehash primitive so that Hash#set_key_cv can call rehash; 2d7162f
00:53:00mutledgtized: I will do it tomorrow. bye
01:01:58meisdave leaves the room.
01:02:08lstoll enters the room.
01:03:20pauldix enters the room.
01:06:47wmoxam enters the room.
01:10:38imajes enters the room.
01:11:16drbrainhow do we want to support OBJ_INFECT() ?
01:11:58drbrainadd Object#infect(other), or Kernel#infect(dst, src)?
01:15:46drbrainI'm partial to the former
01:17:16dysinger leaves the room.
01:19:40kofno enters the room.
01:20:56dysinger enters the room.
01:24:18evandrbrain: infect is for taint, yes?
01:24:52drbrainyes for taint
01:25:06evanhowever
01:25:11evani don't think we have a scheme yet.
01:26:58drbrainyeah, I'm pretty sure we don't implement $SAFE yet
01:27:06evanwe don't.
01:27:25drbrainI don't know if it would be better to have half-assed taint support, or no taint support
01:27:33drbrainno, the latter would be better
01:27:43evani think so
01:27:46evani'd rather get stuff solid
01:27:53evanthen add taint in after
01:28:46femtowin enters the room.
01:31:56dc_ leaves the room.
01:33:29wycatsdidn't we give up on taint altogether like a few months ago
01:33:33wycatswith a "we're never doing taint"
01:34:04evanno
01:34:11evanwe've never said we wont do something
01:34:12wycatswe did that for freeze for sure
01:34:21wycatsactually, you said we're never doing freeze
01:34:22evani said we wont do it right now.
01:34:30evani think i know what i said.
01:34:32evanthanks though.
01:34:33wycatsshit
01:34:39wycatsbacks away slowly
01:34:53evandon't give if you can't take.
01:35:15enebo leaves the room.
01:35:53defunkt enters the room.
01:37:58wycatsI can give fine, but it didn't seem productive for me to continue the conversation
01:38:19evanwe know you can give
01:38:28evanyou just don't seem to be able to take. :)
01:38:41drbrainalmost nobody uses #taint or #freeze
01:38:58evanthat was our rational for not doing them now
01:39:01drbrainand most of the people using #freeze aren't doing what they think they're doing
01:39:03jero5 enters the room.
01:39:09evandrbrain: very much so.
01:39:34wycatsoh snap
01:39:50wycatsevan: there was absolutely some discussion about whether we would ever implement freeze
01:39:56wycatsit went beyond immediate pragmatics
01:40:06evanthat it did
01:40:09evani recall.
01:40:30meisdave enters the room.
01:40:32serialpinguin enters the room.
01:40:35evanit was that I didn't see a reason to implement it in the near future
01:40:50evanand that since no one uses it correctly, there is good reason to not do it at all
01:40:58evanthats not saying we wont if we find a case.
01:40:59serialpinguin leaves the room.
01:41:04wycatssure
01:41:09evansaying we absolutely wont do something is stupid.
01:41:25wycatsno one said, "we're never doing foo" -- what was said was "it seems likely that we won't do foo, since it seems useless"
01:41:29wycatsI will accept the distinction
01:41:39wycatsapologizes
01:41:43evan:D
01:41:45evanaccepted.
01:41:51wycats:)
01:42:08lopex leaves the room.
01:54:04twshelton enters the room.
01:59:21agile leaves the room.
02:00:44jbarnette leaves the room.
02:06:34dysinger leaves the room.
02:10:28fork enters the room.
02:16:26ttmrichter enters the room.
02:16:53ataiar enters the room.
02:23:16fork_ leaves the room.
02:23:55VVSiz_ enters the room.
02:29:16brixensweet! port of fnmatch just passed all the jruby specs
02:29:22brixenour old fnmatch failed 3 of them
02:29:48brixenactually ruby_test tests in jruby repo
02:29:58brixenI'll try the jruby tests too
02:31:10obvio171 enters the room.
02:31:24brixenagardiner: hey man, thanks for the debugger, sooo useful!
02:35:14vintrepid leaves the room.
02:39:39cored leaves the room.
02:41:20VVSiz leaves the room.
02:43:47Norgg leaves the room.
02:43:47tarcieri leaves the room.
02:43:47matthewd leaves the room.
02:43:47tmpk leaves the room.
02:43:47mass_ leaves the room.
02:43:47maharg leaves the room.
02:43:47crayz_ leaves the room.
02:43:47corundum leaves the room.
02:43:47drbrain leaves the room.
02:43:47fearoffish leaves the room.
02:43:47Ingmar leaves the room.
02:43:48benny leaves the room.
02:43:48shingara leaves the room.
02:43:49benny_ enters the room.
02:43:50tmpk enters the room.
02:43:50mass enters the room.
02:43:52Norgg enters the room.
02:43:55tarcieri enters the room.
02:43:57matthewd enters the room.
02:43:59maharg enters the room.
02:44:01Ingmar enters the room.
02:44:10crayz_ enters the room.
02:44:17drbrain enters the room.
02:44:19benburkert leaves the room.
02:44:30fearoffish enters the room.
02:44:46nicksieger leaves the room.
02:44:48shingara enters the room.
02:45:39benburkert enters the room.
02:47:34_maarten_ leaves the room.
02:47:34smartocci leaves the room.
02:47:34cyndis leaves the room.
02:47:34TheVoice leaves the room.
02:47:34Chrononaut leaves the room.
02:47:34zenspider leaves the room.
02:47:34lenbust leaves the room.
02:47:34flori leaves the room.
02:47:34fearoffish leaves the room.
02:47:34maharg leaves the room.
02:47:34richc leaves the room.
02:47:34rudebwoy leaves the room.
02:47:34wifelette leaves the room.
02:47:34geekounet leaves the room.
02:47:34ko1_away leaves the room.
02:47:34halorgium leaves the room.
02:47:34kevinclark leaves the room.
02:47:34VVSiz_ leaves the room.
02:48:33lenbust enters the room.
02:48:33Chrononaut enters the room.
02:48:33zenspider enters the room.
02:48:33TheVoice enters the room.
02:48:55obvio leaves the room.
02:49:06fearoffish enters the room.
02:49:06maharg enters the room.
02:49:06geekounet enters the room.
02:49:06wifelette enters the room.
02:49:06rudebwoy enters the room.
02:49:06richc enters the room.
02:49:06ko1_away enters the room.
02:49:06halorgium enters the room.
02:49:06kevinclark enters the room.
02:49:51nicksieger enters the room.
02:51:55therealadam leaves the room.
02:52:33VVSiz_ enters the room.
02:52:37flori enters the room.
02:53:32benburkert leaves the room.
02:54:04benburkert enters the room.
02:55:27benburkert enters the room.
02:57:21_mutle enters the room.
03:01:52d2dchat enters the room.
03:05:42mutle leaves the room.
03:11:30agile enters the room.
03:15:38agardinerbrixen: great, glad to hear it!
03:16:35jero5 leaves the room.
03:18:46lstoll_ enters the room.
03:19:04lstoll leaves the room.
03:19:28pauldix leaves the room.
03:21:01rubyconsumer enters the room.
03:22:13MenTaLguY enters the room.
03:22:56agardinerevan: i'm not getting as far as you were running the fusion branch
03:23:34agardinerit seems i've got instruction end addresses that are sometimes less than the start addresses!!
03:24:02smtlaissezfaire enters the room.
03:24:10agardinerdo i need to compile with some flag?
03:26:55wifelette leaves the room.
03:27:22jeremydurham_ enters the room.
03:29:50benburkert_ enters the room.
03:32:12brixenagardiner: two things on my wish list, but maybe I can get to them: 1) print the current source line for every step, 2) don't raise an exception if a br is already set, just ignore it
03:32:17kamal_farizwhat's the fusion branch?
03:32:22brixenagardiner: of course, 3) step into :)
03:32:33brixenkamal_fariz: an experiment evan start with macro ops
03:32:35agardinerbrixen: i'm nearly there with 2) and 3)
03:32:43agardinerand 1) is easy enough to add
03:32:59brixenkamal_fariz: think, taking several ops and squishing all their machine code into one chunk, then caching and running that
03:33:05brixenif I'm not mistaken
03:33:21brixenagardiner: awesome!
03:33:21brixenyou da man
03:33:42brixenagardiner: 1 is really nice for orienting yourself while debugging
03:33:46brixenI kept hitting l
03:33:50kamal_farizsounds cool
03:33:51agardineryeah, definitely
03:34:12kamal_farizautolist and autowatch
03:34:12brixenagardiner: it was sooo nice to be able to change values and continue stepping
03:34:21brixenkamal_fariz: yeah, those too
03:34:59brixenthe post incr operator in C/C++, Java takes some care in translating to ruby
03:35:12agardinerhehe, changing values and continuing sure is great, but i can't take much credit - it's all possible thanks to eval!
03:35:13brixenthe debugger really made finding that oversight easy
03:35:19kamal_farizand can you set breakpoints given a Class#method, or file:line_no
03:35:39agardinerkamal_fariz: Class#method yes
03:35:51agardinerfile:line_no is quite a bit trickier
03:35:59agardinerbut something i plan to add
03:36:01kamal_farizagardiner: sweet .. conditional breakpoints?
03:36:13agardineryep, shouldn't be hard and its on the list
03:36:23agardineryou can kind of do them now
03:36:33agardinerjust do breakpoint if <condition>
03:38:33tongueroo leaves the room.
03:38:36ezmobius leaves the room.
03:38:59Yurik leaves the room.
03:43:11brixenok, we're not at mri yet, but the glob code can use some opts: http://pastie.org/151130
03:43:47drbrainyay!
03:44:17agardinerwow, i think that's the nearest we've been! nice one!
03:45:39brixenwell, all I did was suffer with some java code for a few hours
03:45:45brixenimagine what those guys went through :P
03:46:03benburkert leaves the room.
03:47:10agardinershudders
03:49:01benburkert_ leaves the room.
03:49:18brixencan't wait for rue to check in the sort fixes
03:49:39boyscout1 commit by Brian Ford
03:49:40boyscout * Port of JRuby's File.fnmatch to Ruby (yeah, like writing Java in Ruby).; 1804fda
03:53:51vintrepid enters the room.
03:57:40smtlaissezfaire leaves the room.
04:01:38benburkert enters the room.
04:02:57tmpkagardiner: try compiling it with optimizations off?
04:03:21agardiner-O0?
04:03:22pergesu enters the room.
04:03:25tmpkYeah.
04:03:41agardinerk
04:07:31tmpkToday we had some strange fun at work where MRIs threads were doing something strange.
04:07:57tmpkSo now we have this big THREADS VERBOTEN sign. gg
04:10:54tarcierigood attitude
04:10:58tarcierithreads suck
04:13:22tmpkWell, what it pounded home for me is how shitty the tools are to debug multi-process and multi-threaded apps.
04:14:21MenTaLguYmost often if you're debugging concurrency, you've already lost
04:14:35MenTaLguYalthough some environments like the JVM do have some pretty advanced debugging tools that are useful
04:14:54tmpkOh, I agree. It's just that MRI is unusually opaque.
04:15:17tarcieriprefers pro-active debugging
04:15:39tarcieriActors are relatively easy to unit test :)
04:15:50tarcieriAt least compared to threads
04:16:35MenTaLguYup to a point
04:16:52MenTaLguYtools like message logging become necessary when you're debugging complex arrangements of actors though
04:17:06tarcieriyeah, I really need a central logger in Revactor :/
04:17:07MenTaLguYat least actors provide nice choke points to do that at
04:18:11tarcieriI'm trying to decide if I really want to make it yield whenever a message is sent
04:18:24tarcieriThere's about one reason to do that: it makes what's going on more intuitive from irb :/
04:19:48MenTaLguYif it does there, it might also in other contexts
04:20:17tarcieriI really like the idea that the only "blocking" call is receive
04:21:55tmpkActors in Ruby?
04:22:21tarcieriActors in general... receive is the only call that throws the current Actor into a sleep state
04:22:34tarcieriThe same could be said for processes in a microkernel architecture
04:22:49tarcieriWell, one like Amiga... or DragonflyBSD
04:23:00tmpkOh, I've puttered around a bit with Erlang and MRI, so I have a general idea.
04:23:06tarcieriWhere the only blocking system call gets the next message from the process's message queue
04:23:12tmpkBut Revactor is in Ruby?
04:23:16tarcieriYes
04:23:32tarcieriIt uses Fibers for concurrency
04:24:01tarcieriWhich seems to confuse people who try it out
04:24:27tmpkFibers are coroutines?
04:24:32tarcieriI guess I need to explain it better on the web site
04:24:33tarcieriYeah
04:25:05tmpkI was going to ask why, but I think I get it.
04:25:12tmpkHow's that working out?
04:25:38tarcieriThe main thing I'm using it for right now is a web spider program, and it's working out great for that
04:26:04tmpkTell me a bit about the spider?
04:26:06tarcieriI'm getting 250 documents per second sustained, and that's with a single-threaded program
04:27:01tarcieriIt's a web spider... it crawls links on web pages
04:27:23tarcieriRight now making 128 concurrent requests
04:27:49tmpkDo the coroutines yield if you make a blocking call?
04:27:55tarcieriYep
04:28:04MenTaLguYthey do?
04:28:18tarcieriAs long as it's through the Actor API
04:28:23MenTaLguYwell, a socket blocking call using a Revactor socket, I guess?
04:28:28tarcieriYes
04:29:05tarcieritrunk has an HTTP client which runs on the Actor API
04:29:25tmpk"for building Erlang-like services on top of Actors" <- does this include remote nodes yet?
04:29:29tarcieriresponse = Revactor::HttpClient.get("http://www.google.com")
04:29:38tarcieriNo, but I really, really need to get to that
04:29:42tarcieriLike this weekend probably
04:29:47MenTaLguYit might not really need to be part of Revactor itself
04:30:01tarcieriI'd like to spread my spider application across multiple systems at our colo
04:30:06MenTaLguYsince it can all duck-type, remote actors might be better as a distinct library
04:30:52tarcieriMenTaLguY: well, other Actor implementations may allow for pre-emption, in which case all Actor::TCP gets them is asynchronous reception (i.e. active mode)
04:31:23tarcieriBut still, that's enough to necessitate an Actor::TCP API, imo
04:31:31MenTaLguYI'm not sure I follow
04:31:49tarcieriIn active mode incoming TCP data is delivered as a message
04:32:15tarcieriRather than through an imperative #read call
04:32:26tarcierithat lets you multiplex incoming messages and incoming TCP data
04:32:45tmpkLet me know how things go with that. I'm particularly curious in how process linking might be implemented if you get around to it.
04:32:53MenTaLguYyou mean as a ground to implement a dispatcher for incoming remote messages?
04:32:55tarcieriAnd Revactor::TCP supports active once semantics too
04:33:09tarcieriYeah, but one which can get events from other Actors at the same time
04:33:25tarcieritmpk: It's already implemented
04:33:30MenTaLguYyou shouldn't need to do anything special for that
04:33:32MenTaLguYat all
04:33:39tmpkNice.
04:33:57tarcieritmpk: Each Actor has a system events queue... when it gets an exception in that queue, it raises it unless it's trapping exceptions
04:33:58MenTaLguYthe remote messages should get submitted to the destination actor using << on the receiving end, and it should interleave nicely with whatever else that actor is doing
04:34:02tarcieriErr, trapping exits
04:34:13tarcieriMenTaLguY: that's what happens... in active mode
04:34:37MenTaLguYI just don't see why Revactor needs to have remote actors built in
04:34:45MenTaLguYI think it'd be creating an unnecessary dependency
04:35:01tarcieriMenTaLguY: ohhhh, my bad
04:35:13tarcieriI'm just talking about why Revactor needs Actor::TCP built-in
04:35:35tarcieriAnd why an Actor API for Ruby needs TCP support in general...
04:35:44MenTaLguYwhat about IO generally?
04:35:57tarcieriIt's hard to generalize IO
04:36:09tarcieriSockets and files need different semantics
04:36:48tarcieriFor operations on files to be sane you really need to include an offset with each read/write
04:37:00tarcieriSince other Actors may be operating on other parts of the file
04:37:14tarcieriAnd obviously that doesn't apply to streaming I/O like TCP sockets
04:38:04MenTaLguYdon't you really need separate file handles if you're going to have multiple users of a file in the same process?
04:38:26tarcieriNot with coroutines
04:38:42tarcieriBut with threads... yeah
04:38:55MenTaLguYI don't see that coroutines are any different than threads in that regard
04:38:58tmpkOh, I've puttered around a bit with... MRI <- whoops, meant MPI
04:39:09tmpkAnyway, good evening.
04:39:18tarcieriMenTaLguY: With Revactor and corouttines you really need some sort of round-robin I/O queue
04:39:35tarcieriMenTaLguY: Since any reads/writes to the file will be asynchronous
04:40:26MenTaLguYI still don't see that it's any different than threads
04:40:37tarcieriOne Actor may be doing a gigantic write/read, and unless you have a round-robin I/O queue it will monopolize access to the file
04:40:44MenTaLguYif you've got a bunch of clients thrashing one file descriptor then you're just subverting the OS's IO scheduling and buffering
04:41:09tarcieriMenTaLguY: The whole I/O subsystem of Revactor is driven by asynchronous events
04:41:23MenTaLguYI realize that
04:41:25tarcieriMenTaLguY: But they're not actually doing any reading or writing to the file descriptor directly
04:41:41tarcieriThey're telling the I/O subsystem to do that for them
04:41:46MenTaLguYsure
04:42:06tarcieriSo there's no reason for the I/O subsystem to have more than one open handle per file...
04:42:10MenTaLguYbut you don't want several different actors keeping their own offsets into the same stream
04:42:12MenTaLguYyes there is
04:42:23MenTaLguYyou subvert the OS's IO scheduler and buffering
04:42:26tarcieriIt sets up some I/O operation, and then uses libev to monitor when that operation completes
04:42:44tarcieriI suppose so... you could multiplex I/O operations with multiple handles per file
04:42:47tarcieriI guess that'd be easier
04:42:51hiredman enters the room.
04:42:54tarcieriBut also prone to races...
04:43:23MenTaLguYif races are a concern you need to coordinate through a single actor for that file's IO
04:43:26tarcieriHard to say how I feel about that one...
04:43:36tarcieriWell, that's what I was saying re: the I/O subsystem
04:43:45tarcieriIt can do that coordination
04:44:05femtowin enters the room.
04:44:32MenTaLguYusually races aren't going to be a concern though
04:45:02MenTaLguYunless you're doing very unusual things with files
04:45:04tarcieriyeah, just having redundant file discriptors is probably better from a performance perspective
04:45:26tarcieriI really need multiple inheritence :/
04:45:38MenTaLguYwhy?
04:45:52tarcieriAll the Revactor I/O stuff is subclassed from Rev
04:46:08tarcieriAnd pretty much everything in Rev is subclassed from Rev::Watcher, an abstract base class
04:46:20MenTaLguYdoes Rev::Watcher define any class methods?
04:46:31MenTaLguYif not just make it a module
04:46:35tarcieriI need something which inherits from both Rev::Watcher and something that wraps up all the Actor IO stuff
04:47:03tarcieriIt'd be easier to make the Actor IO stuff a module
04:47:13femtowin enters the room.
04:47:18MenTaLguYRev::Watcher has a specific object representation you rely on then?
04:47:23tarcieri*everything* is subclassed from Rev::Watcher
04:47:29tarcieriYeah, and core behavior... in C
04:47:47femtowin enters the room.
04:47:50MenTaLguYfair enough
04:47:58MenTaLguYhave you considered a to_io-like approach?
04:48:00tarcieriAll of the housekeeping in C for watcher management is implemented in the attach/detach/enable/disable methods of Rev::Watcher
04:48:08MenTaLguYso that everything doesn't have to _be_ a Rev::Watcher, just have one
04:49:10tarcieriHeh, it's kind of hard to describe the reasoning for it, but it all centers around atttach/detach/enable/disable
04:49:30tarcieriAt various levels of the system certain things do funky modifications to those
04:49:43tarcieriSo it's really damn nice when those modifications can easily be wrapped up with super
04:50:10MenTaLguYhm
04:50:53tarcieriTo be fair, some of it is nasty because of it all being a gigant subclass hierarchy
04:50:57tarcieris/gigant/giant/
04:50:58tarcieriurgh
04:51:06tarcieriParticuarly initialization
04:51:18MenTaLguYoften that's a sign that inheritance may be being misused
04:51:30MenTaLguYa really deep hierarchy
04:51:47tarcieriI almost need a TCP socket "factory" that handles DNS lookups :(
04:52:08MenTaLguYthat sounds like a good idea to me
04:52:29drbrainresolv.rb has been good to me
04:52:41tarcieriI need asynchronous DNS resolution
04:52:50femtowin enters the room.
04:52:58drbrainyeah, I used resolv.rb for that
04:53:07tarcieriHmm
04:53:11drbrainI think I had ~ 100 threads resolving DNS
04:53:26tarcieriDoes it hand you a socket and go "wait until this is readable"?
04:53:45tarcieriThat's what I need
04:53:59drbrainno, resolv.rb just handles DNS lookup
04:54:09tarcieriIn addition to timeouts...
04:54:24tarcieriI need DNS lookup that doesn't block... ever
04:54:26drbrainthere's also resolv-replace.rb that replaces IPSocket.getaddress and so-on
04:54:31tarcieriSo I ended up writing it myself :/
04:54:39drbrainso you don't block waiting on libc
04:54:55tarcieriIt's not blocking waiting on libc, it's blocking on Socket#recvfrom
04:56:15tarcieriMy client sends the DNS request, starts a timeout... then I monitor the socket it opened for readability
04:56:37tarcieriWhen it's readable, I Socket#recvfrom_nonblock to get the response
04:58:02tarcieriMy general experience has been that not a lot of stuff is designed to operate that way
04:58:13tarcieriI had to add 4 methods to OpenSSL::SSL::SSLSocket... in C
04:59:01cyndis enters the room.
05:01:50MenTaLguYspawning threads to get "asynchronous" IO operations is terribly expensive on MRI too
05:02:00MenTaLguYreal asynchronous is going to really win heavily
05:02:08MenTaLguYs/MRI/1.9/
05:02:48tarcieriYeah, it's just... harder
05:03:15tarcieriThe only use I see for threads are things which eat up a lot of time but don't ever sleep the thread
05:03:20tarcieriWith Revactor anyway
05:03:28tarcieriThat's the kind of stuff you really need pre-emption for
05:03:35MenTaLguYtotally
05:03:48tarcieriAnd Erlang has it built-in, but gets rid of the headaches of pre-emption with a shared-nothing system
05:03:56tarcieriCan't really do that in Ruby :/
05:03:58dbussink enters the room.
05:04:14MenTaLguYsure you _can_, it's just no better than threads at that point
05:04:22tarcieriYeah, exactly
05:04:49MenTaLguYwell, threaded actors are still probably better than raw threads
05:05:12MenTaLguYif you voluntarily restrict their communication to message-passing
05:05:33MenTaLguYthat's one reason why I've been interested in the actor object protocol, beyond just remote actors
05:05:41tarcieriYeah, you can keep all the heavy I/O stuff in a single thread, and just use other threads for compute-heavy tasks that get pre-empted when I/O events occur
05:05:53MenTaLguYI think it'd be nice to be able to treat a spawned thread as just another actor from the Revactor side of things
05:06:22tarcieriIt's supposed to be that way now!
05:06:24tarcieriJust... buggy
05:06:27tarcieriHeh
05:06:34tarcieriI'll get it fixed before anothe release
05:06:45MenTaLguYwell, that's true
05:07:01tarcieriBut now every thread has an Actor scheduler, and each Actor scheduler has an associated Rev::AsyncWatcher
05:07:03MenTaLguYI'm sorry I haven't had more time to poke at the thread-safety stuff
05:07:19tarcieriThose let threads wake each other up
05:08:14tarcieriSo if you try to send a message to an Actor in a different thread, it adds it to that thread's (mutex-locked) scheduler queue, then wakes up the thread and lets it know there's no events in its queue
05:08:35tarcieriWhen the scheduler gets an async event, it runs through its queue and adds the messages to the mailboxes of its actors
05:08:50tarcieriBut uhh, yeah, buggy...
05:08:57tarcieriI really need to write a spec for it :)
05:09:40tarcieriIt's in the trunk of Rev/Revactor if you want to check it out
05:11:17jeremydurham_ leaves the room.
05:13:06tarcieriMenTaLguY: I'm probably going to do the Revactor remote actor stuff in Revactor to start with...
05:13:23tarcieriIt will depend on Actor::TCP, particularly active mode with active once operation
05:13:41tarcieriI mean, the protocol is just going to be asynchronous Marshal, with {packet, 4} framing in Erlang terms
05:14:15MenTaLguYnods
05:15:28tarcieriSo I could release it as a gem, but it would depend on Actor::TCP
05:15:54wifelette enters the room.
05:16:58MenTaLguYI think it makes the most sense as its own gem
05:17:02MenTaLguYeven with the dependency
05:19:52evanit's the actors!
05:19:58twshelton leaves the room.
05:20:12MenTaLguYAlas, poor Yorick. I knew him, Horatio.
05:21:19evanheh
05:22:03dewd leaves the room.
05:22:30evangives up on scrolling back to see the conversation
05:23:15jeremydurham_ enters the room.
05:23:28evanyou know
05:23:50evana very interesting program would be one that attempts to figure out when a conversation starts and stops on IRC
05:24:53brixenand pulls out interleaved ones, so you can conversations.each { read }
05:25:03evanheh
05:25:14evani mean so that a web-base IRC logger to show you conversations
05:25:25brixenyeah, that would be cool
05:25:34evanit could try and show you a sampling of the conversation as the 'topics'
05:29:00_ADS enters the room.
05:30:07_ADS leaves the room.
05:30:53femtowin enters the room.
05:34:08rueGood morning, gentlemen
05:35:04rueevan: I am going to see if I can switch the Array backend this weekend
05:35:19evanswitch to what?
05:35:23evanquantum blocks?
05:35:27rueI was looking at it, there are lots of minor optimizations but I think a better backend would work
05:35:38evancosmic stitches?
05:35:53evanuniversal containers?
05:36:06rueI was thinking VList-based
05:36:26evanwhats VList?
05:36:28rueI will see if there are any other exciting algos out there
05:36:43evanthere was talk about having it be block based
05:36:52rueYeah, this is a variant
05:36:54ruehttp://en.wikipedia.org/wiki/VList
05:37:02evanallocating a tuple of fixed size each time more storage is needed
05:37:11evanand mapping the index to a [block, slot] pair
05:37:20rueMy experience has been it is a bit better than a 2^k scheme
05:38:22evansays that VLists are immutable
05:39:19DefilerWe can make it sector-based and then build an Array defragger
05:39:20rueNot necessarily, but the array variant is not
05:39:39evanDefiler: lets license the windowsn 95 defragger
05:39:43evanoh actually
05:39:44evanthe DOS one
05:39:47evanjust for the graphics
05:39:57DefilerNorton speeddisk
05:40:15evanwhen someone does
05:40:21evanary[400]
05:40:33evanI want a window to pop up that shows the array being defragged
05:40:38evanso the 400th element can be returned
05:41:48RyanTM leaves the room.
05:42:55femtowin enters the room.
05:45:55srbaker enters the room.
05:48:02Ingmar leaves the room.
05:48:24benburkert leaves the room.
05:48:35ragge enters the room.
05:49:26be9 enters the room.
05:49:36benburkert enters the room.
05:49:49evanrue: go for it.
05:50:12evanrue: it might be useful to write it up as a new class first
05:50:17benburkert leaves the room.
05:50:21evanRArray, perhaps
05:50:32benburkert enters the room.
05:50:35evanthen we can port just the parts we need back into C for the VM to use
05:50:46MenTaLguYthat sounds like a good idea to me
05:51:10evansorta like what I began with Moment
05:52:02femtowin leaves the room.
05:53:14srbaker leaves the room.
05:53:39rueevan: Yeah, ideally we could just implement it relying on Tuple only
05:53:46Ingmar enters the room.
05:54:40rueBut it may or may not be possible. Depending on what the perf looks like, I was actually thinking kind of a Strategy using modules if Array extras just rely on #at() etc. That may or may not be feasible
05:54:53rueadds one more "may or may not" for good measure
05:56:28srbaker enters the room.
05:56:46femtowin enters the room.
05:57:44evanhehe
05:58:01kofno leaves the room.
06:01:35dbussink leaves the room.
06:01:54tmpkMenTaLguY: "actor object protocol"?
06:02:29MenTaLguYyeah, protocol in the Smalltalk sense
06:02:36MenTaLguYa set of standard methods an object implements
06:02:49dbussink enters the room.
06:02:53MenTaLguYobjects implementing the same protocol are interchangable from a duck-typing standpoint
06:03:59agardinerevan: i'm looking at cpu_compile_method... we allocate space there for the old inline cache, but i'm figuring we don't need that whole field any more, correct?
06:04:04tmpkGotcha, thanks.
06:04:25evanagardiner: this is in fusion?
06:04:37agardinernah, i've left that for the moment
06:04:52agardinertrying to get my new step code working
06:05:20agardinerlooks like context#set_iseq is broken, which led me to cpu_compile_method
06:05:48femtowin enters the room.
06:06:47evanagardiner: oh, yeah.
06:06:51evanthat code should be deleted
06:06:56agardinerok will do
06:07:04agardineralso, it seems we might be allocating too much space for the compiled filed...
06:07:31evanmore than it needs then?
06:07:51agardinershouldn't line 420 include a / 4 on the end?
06:08:22agardinerseems to be 4* too much
06:10:06agardinere.g. if the raw bytecode is 20 bytes, we're allocating 20 if not direct-threaded, but 80 if DT is true on 32-bit and 160 on 64-bit
06:10:23agardinershouldn't it be 20 on 32-bit and 40 on 64-bit?
06:11:27evanhm
06:11:48evanwhy did i do that...
06:11:50evanoh
06:11:51evanyeah
06:11:53evanit was for 64 bit
06:11:57evanso that should be
06:12:14evan(BYTEARRAY_SIZE(bc) / sizeof(uint32_t)) * sizeof(uintptr_t)
06:12:45agardineryeah, i guess that's better than " / 4"... :-D
06:12:48evanso on 32bit it comes out the be the same
06:12:53evanand on 64bit, it's 2x
06:12:53agardineryeah
06:13:13evanso, something we should look into to also
06:13:30evanwhen doing the fusion code, i noticed that even short methods had like 20 noops on the end
06:13:45agardinerthis is probably why
06:13:55evanwell
06:13:56evani doubt it
06:14:03evanbecause i was looking at the bytecodes
06:14:07evannot a converted version
06:14:10agardineroh, ok
06:14:20evani think we're just not clamping the size in the compiler
06:14:45agardiner20 seems like an odd numbe
06:14:57agardinerbytearray is allocated in 8-byte chunks, no?
06:15:15agardinerso how do we end up with 20 bytes on the end?
06:16:27evanit probably wasn't exactly 20
06:16:31evanit was just a lot.
06:16:31agardinerspeaking of weird results with fusion, i noticed that the code length for no-op was 33 bytes, but for e.g. push_literal it was 27! how does that work?!?
06:16:42evanoh
06:16:49evanthats the wierdness.
06:17:08evanyou'll notice that the noop bytecode is actually the code for NEXT_OP
06:17:12evani reused it
06:17:15evanit's the code that doesn't work.
06:17:35agardineryeah, i noticed that, but isn't NEXT_OP part of the code for every op?
06:17:41agardineroh, wait!
06:17:47agardinerder, no how could it be!
06:17:50agardiner:-S
06:18:00evanheh
06:18:01evanyeah
06:18:01agardinerwouldn't be able to fuse them if it was!
06:18:04evanexactly
06:18:13agardinerfeels stoopid
06:18:13evanthe ending label is after the code, before the NEXT_OP
06:18:15evan:D
06:18:25evanto see the brokeness
06:18:28evanset a breakpoint on cpu_run
06:18:35evanand continue through the first
06:18:36evanthen do
06:18:49evandisassemble ins_info[0].start ins_info[0].start + 50
06:19:04evanthats the code for 'goto **ip_ptr++'
06:19:18evanbut for some reason, it's putting a jump in BEFORE the jump to the register
06:19:35agardinerlemme switch back to that and try it...
06:20:04rueHrm, the median threshold is really tricky
06:22:38evanok, time to watch project runway
06:22:39evanbbiab.
06:23:20rueHeh
06:24:42dbussink leaves the room.
06:30:22tmpkagardiner: could you put a pastie up of the asm generated if you're working on that?
06:30:50tmpkI'm curious what GCC is actually spitting out.
06:34:33agardinerpastie for tmpk
06:34:48agardinerhmm... no pastie
06:35:29agardinertmpk: here you go http://pastie.org/152002
06:35:37Yurik enters the room.
06:37:30agardinerweird...
06:38:22agardineroh well, go to run
06:38:25agardinerlater all
06:38:27tmpkThat is bizarre.
06:38:32tmpkLater. o/
06:38:38agardiner leaves the room.
06:39:27femtowin enters the room.
06:44:15rueAny objections to a toplevel benchmark/ ?
06:49:00femtowin enters the room.
06:52:04brixenrue: I'd much prefer that
06:52:27ragge leaves the room.
06:52:57brixenrue: I was going to advocate removing test and moving benchmark up once we port any (if any) bfts tests
06:54:05rueOK
06:54:24rueI just have some pretty simple Array bms
06:55:16brixenyeah, I've got a number of them I wanted to add
06:56:07brixenI was thinking combine phoenix, comstock, wycats, into rubinius
06:56:59brixenrue: you could move bfts and mri under spec/test for now
06:57:05brixenwe'll port them
06:57:29brixenmust say, it was some agony using test/unit today working on fnmatch
06:57:49brixenbeautifully descriptive method names :P
06:58:26pd enters the room.
07:02:16TheVoicerue: congrats on the job things. Look forward to seeing what you come up with.
07:07:02rueTheVoice: Thanks! Some cool options
07:07:55jennyw enters the room.
07:20:23pietia enters the room.
07:21:56evanrue: hrm
07:22:01evani moved it to test/ before.
07:22:05evani guess we can move it back.
07:22:16evanit's more organized now
07:22:52maduyb__ enters the room.
07:24:13d2dchat leaves the room.
07:25:06femtowin enters the room.
07:27:11tmpkToo bad agardiner is gone. This is relevant: http://groups.google.com/group/comp.lang.forth/browse_thread/thread/545177ea53944038/d9b3c2588a66a b71?#d9b3c2588a66ab71
07:27:59tmpkThis as well: http://gcc.gnu.org/ml/gcc-prs/2002-09/msg00520.html
07:31:37evantmpk: ha!
07:31:42evanthe 2nd link is EXACTLY the problem we have.
07:31:59evanthe common block reordering
07:32:20evanour fusion is "Piumarta-style interpreter inlining"
07:33:12evaneek
07:33:14pergesu leaves the room.
07:33:14evan2002.
07:33:19evanmaybe if i turn off gcse
07:33:29evanif that works (they indicate it doesn't)
07:35:09evanman.
07:35:14evangcc is so... complicated.
07:39:22brixen"Some of the other things you mention are likely to be viewed by gcc
07:39:22brixenmaintainers as not a bug, in particular the practice of taking code
07:39:22brixenfragments that gcc has generated and copying them elsewhere. I would
07:39:23brixenfind it very hard to defend a patch for that."
07:39:30brixenthat's nice to hear
07:39:38evanwhich link is that?
07:39:49brixenit's the reply below the link above
07:39:55brixenAndrew Haley
07:39:59evanthe first link?
07:40:11brixenthe google link from tmpk
07:40:27brixenyeah, first
07:40:35brixenthey blended together for my eye ;)
07:40:42evangotcha
07:40:44evani see it.
07:40:45evanyeah
07:41:04evanso piumarta inlining is impossible on gcc
07:41:05brixenthey paper is interesting in the first link, you've probably already read it
07:41:40brixenno wonder piumarta calls it horrid C
07:41:45evani haven't
07:41:49evanpreview is openning it now
07:41:58evanit's likely the same idea
07:42:00srbaker leaves the room.
07:42:11evanmacro == superinstructions == fusion
07:42:39srbaker enters the room.
07:42:49brixenok, cool
07:42:53brixenwas just going to ask that
07:42:55evanoh
07:42:56evanit's short
07:42:59evani'm reading it now.
07:43:11evanthis is fairly new
07:43:20brixen06
07:44:22lstoll_ leaves the room.
07:45:57evanha! this is perfect
07:46:03evanthis is EXACTLY the code i implemented.
07:46:17evanand the problems i've been having.
07:46:46tmpkIs this the ertl+06dotnet.ps.gz?
07:46:46srbaker leaves the room.
07:47:19srbaker enters the room.
07:47:37evantmpk: yep
07:48:22srbaker leaves the room.
07:48:25femtowin enters the room.
07:48:28evanha! java VMs have a mode called 'quickening'
07:48:38evanso your code experiences the quickening
07:48:48evanhaving taken the strength of other fallen code
07:48:49evan:)
07:49:00srbaker enters the room.
07:50:21rueThis sounds awful metaphysical
07:50:38rueAlthough it could get White Wolf back in the game
07:50:45rueVM: The Quickening
07:50:50tmpkThere's also an ertlgregg04.pdf floating around out there. I'm not sure if it's also relevant.
07:50:55rueI am going to be a mage anyway
07:51:14drbrainevan: http://www.craigslist.org/about/best/tpa/409930561.html
07:52:05rueHrm, this takes a while to run
07:52:06drbrainsweeet
07:52:12evanHAHAH
07:52:13drbraingo Zlib::Inflate!
07:52:18evandrbrain: thats so awesome.
07:52:23evanbetter than the cemete block guy
07:52:27evancement
07:52:42drbrainI was hoping Wilson posted that, but he did not
07:52:48drbrainsomething must be in the water in Florida
07:53:13evandouble ha!
07:53:27evanthis paper uses the proxy technique to call external functions I used.
07:53:37evanthey store the address of the code in a local
07:53:41evani used a struct of function pointers
07:53:44evansame diff though.
07:55:49ezmobius enters the room.
08:02:12obvio171 leaves the room.
08:03:12boyscout2 commits by Eric Hodel
08:03:13boyscout * Cleanup, move Zlib methods together and sort.; e0ae474
08:03:14boyscout * Common implementation for Zlib::Inflate and Zlib::Deflate.; 4eb58eb
08:04:28drbrainha! look what I did to zlib.rb.in!
08:04:33drbrain472 ++++++++++++++------
08:04:37drbrainyeah!
08:04:44drbrain(I don't know what that means)
08:06:14ezmobiusnice
08:06:59w1rele55 enters the room.
08:07:10evandrbrain: heheh
08:08:51MenTaLguYcool, six more points and you level up
08:09:54drbrainException: comparison of Fixnum with String failed (ArgumentError)
08:10:04drbrainException: No method 'coerce' on an instance of String. (NoMethodError)
08:10:10drbrainwhere does that come from?
08:10:17drbrain$DEBUG=true doesn't print line numbers for exceptions
08:11:03rueFun stuff, two points for whoever can data-mine: http://pastie.org/152020
08:11:21evandrbrain: i've been seeing that myself.
08:11:38evandrbrain: you can add line numbers to the exception debug output
08:11:53drbrainyeah
08:12:53brixenrue: what happened at 60000 numbers?
08:13:03drbrainbut, that would distract me from rubygems
08:13:17brixendrbrain: what code gives you that exception?
08:13:26drbrainbrixen: rubygems
08:13:39drbrainand, a metric ho-jillion of them
08:13:50brixendrbrain: that should come from passing other than fixnum, float, bignum to something that subclasses Numeric
08:13:50ezmobiusthose coerce errors are what i was getting trying to run merb as well
08:14:11jero5 enters the room.
08:14:11drbrainin a second, I will fix $DEBUG's exception printing, and tell you for real
08:14:16drbrainor, several seconds
08:14:21drbrainas rubinius is really slow
08:17:00ruebrixen: I SIGINTed it, #sort_by is still untouched :)
08:17:26thehcdreamer enters the room.
08:17:32drbrainSuccessfully installed rake-0.8.1
08:17:35drbrain!!!!!!
08:17:38rueHurray
08:17:42brixensweet!
08:18:03brixenrue: so, 45000 was using sort, but 60000 was using sort_by?
08:18:23drbrainthen it said "Missing or uninitialized constant: Enable"
08:18:30drbrainI don't know what that's about
08:18:32ezmobiusholy shit yay
08:18:43MenTaLguYdrbrain!!! great!
08:18:55ruebrixen: Oh, I thought you meant the bottom :) I think it might be the pivot currently running
08:19:00drbrainI think it took 5 minutes
08:19:14drbrainmore like 8
08:19:17ruedoes a victory dance
08:20:48drbrainwhat's the best way to get a line number?
08:21:22drbrain... of the caller
08:22:53drbrainok, think I've got it
08:23:07wycatssuccessfully installed rake via rubygems?
08:23:17drbrainwycats: yes
08:23:24wycatsthat is awesome news
08:23:28wycatsI take it zlib is done then?
08:23:36drbrainat least, all the files seem to be in the right spots
08:23:39drbrainhaha, no
08:23:47drbrainzlib just works better than it did last week
08:24:56wycatsnice
08:25:04wycatsany low-hanging fruit?
08:25:32drbrainby the bushel, I am sure
08:26:38wycatsnice
08:26:51drbrainlike, the rest of Zlib::Zstream could be filled out
08:26:56drbrainthose should be easy
08:27:03wycatsis there anything else unimpl'ed that is already specced?
08:27:03wycats:P
08:27:17drbrainno
08:27:35drbrainI generated the specs two weeks ago after fixing up bin/mkspec
08:27:54wycatshow does mkspec work?
08:29:47ruehttp://pastie.org/152024
08:29:55ruePivot selection, a bit more interesting data
08:30:02drbrainyou point it at a class or module, and it figures out what's implemented on it and it's descendent classes/modules and writes out the spec stubs
08:30:42drbrainwhat happened with 60k?
08:31:04drbrainreherasal has an outliner for 125, second at 175
08:32:29drbrainyou should only have to do it once, and check the (nearly empty) files in
08:32:33drbrainthe mkspec
08:34:21MenTaLguY leaves the room.
08:35:45ruedrbrain: Good question
08:36:00rueA bit of a S/N issue gathering info
08:36:21evanwow
08:36:26evanthe gforth guys are PRO.
08:36:32evani'm going to go read the gforth VM source
08:37:36rueIt is looking like 10 and 505 or so are the sweet-ish spots
08:39:31wycatsTamarin is apparently written in forth
08:39:32wycatswho knew
08:43:04drbrainevan: can I move MethodContext#line to bootstrap?
08:44:29evanwhy?
08:44:31evanprobably not
08:44:34evanis the answer
08:44:51drbrainI need the line number for $DEBUG
08:44:55drbrainand raise
08:44:58drbrainso I did:
08:44:59evanno you don't.
08:45:07evanyou just need them once core is loaded.
08:45:09drbrainsender = MethodContext.current.sender.method
08:45:20evanwho cares about them while bootstrap is loading.
08:45:27drbrainwell, something is triggering this early
08:45:47evanyou have to move a number of things to bootstrap to get MethodContext#line in bootstrap
08:46:00evanCompiledMethod#line_from_ip
08:46:13evanthen all the methods line_from_ip uses
08:46:18evanand all the methods they use.
08:46:45drbrainwell, somebody sets it to true, sometime
08:47:02evanreplace it with a real noun
08:47:14drbrainsorry, $DEBUG
08:47:20drbrainlet me poke at this some more
08:48:23evanso
08:48:27evanit's true by default?
08:48:56drbrainno
08:49:56evan<= confused
08:50:27drbrainoh, I typo'd because it is late
08:50:47evanbut ya found it!
08:51:14drbrainok, that's better
08:54:41vintrepid leaves the room.
08:55:58drbrainyay! found one of the coerce things
08:56:20boyscout1 commit by Eric Hodel
08:56:21boyscout * Make debug exception printing print file and line number like MRI.; 2bdd7f6
08:57:35evandrbrain: I thought there was MethodContext#location
08:57:40drbrainshotgun/rubinius -e '$DEBUG = true; Marshal.load(Marshal.dump(Time.now))'
08:57:47evanyour change is fine though.
08:57:54drbrainhey! look at that!
08:57:54evandrbrain: eek, who is doing that?
08:58:19drbrainI'm not sure, my brain is woozy
08:58:27drbrainI had a backtrace, but I cleared it
08:58:32evanheh
08:59:58boyscout1 commit by Eric Hodel
08:59:59boyscout * Hey! Look at that, MethodContext#location, staring me right in the face.; 4adc644
09:00:03evanHAH
09:00:09evan^5's drbrain
09:01:44drbrainhrm
09:02:01langenberg enters the room.
09:02:06drbrainString#unpack has an if repeat == '*'
09:02:12drbrainand that is causing this issue
09:02:32evanug
09:02:37evanthe pack/unpack code is....
09:02:39evangnarly.
09:02:43drbrainrake && shotgun/rubinius -e '$DEBUG = true; 1 == "*"'(
09:02:57drbrainI don't know why that calls #coerce
09:03:46drbrainso the :equal primitive fails
09:03:48evanbecause Fixnum#== does
09:03:52evanyep
09:03:56evanthen it calls super()
09:04:02drbrainyeah
09:04:06evanand the Numeric#== does a coerce
09:04:06brixenyeah, you need to augment math_coerce in Numeric
09:04:24evanNumeric tower of fun!
09:04:44brixendrbrain: or perhaps write compare_coerce
09:04:46drbrainno
09:04:49Arjen_ enters the room.
09:05:04drbrainreturn false unless other.kind_of? Fixnum
09:05:09drbrainbefore super
09:05:11evanbut thats wrong.
09:05:19evan1 == 1.0
09:05:22drbrainwhy?
09:05:27evan# => true
09:05:51drbrainoh, I'm reading MRI wrong
09:06:07evanthe equal primitive only handles other being a Fixnum
09:06:09evanthats why it fails.
09:06:27drbrainwhy are we coercing?
09:06:32drbrainnum_equal doesn't do that
09:06:42evanyeah it does
09:06:45evan1 == "*"
09:06:47evan# => false
09:06:49drbrainwhere?
09:07:01evanwhich code are you looking at?
09:07:01drbrain(in MRI)
09:07:32drbrainFixnum#== is fix_equal
09:07:39drbrainwhich calls num_equal
09:07:58drbrainmaybe I'm not following for enough, since it dispatches to rb_funcall
09:07:58gnufied enters the room.
09:08:02drbrainsorry, it is late
09:08:13langenberg leaves the room.
09:08:23evanwell
09:08:32evannum_equal flips the comparison
09:08:37evanso you call
09:08