Index

Show enters and exits. Hide enters and exits.

00:02:47octopod leaves the room.
00:03:09lopex leaves the room.
00:03:58chris2 leaves the room.
00:04:05pauldix enters the room.
00:04:43enebo leaves the room.
00:06:00crafterm enters the room.
00:12:33mutle leaves the room.
00:19:35cored enters the room.
00:32:21wifelette leaves the room.
00:35:04wmoxam leaves the room.
00:37:50brixenkamal_fariz: what ruby version and os are you on?
00:38:22brixenkamal_fariz: the Module#instance_method specs are failing for me on leopard, 1.8.6, patch 111
00:43:01pauldix leaves the room.
00:54:30hurdlea enters the room.
00:54:36zenspiderbrixen: is there a way to add a note to an exclude?
00:55:35wifelette enters the room.
00:56:34radarek leaves the room.
00:56:50defunkt enters the room.
00:57:02hurdlea leaves the room.
01:00:58hornbeck leaves the room.
01:01:08hornbeck enters the room.
01:02:41jessop leaves the room.
01:05:39brixenzenspider: not yet
01:05:59bburcham leaves the room.
01:06:41zenspiderbrixen: I've been poking at the excludes and found some that while they pass, they destabilize the system as a whole, it'd be nice to add that note to the exclude file
01:12:31obvio171 enters the room.
01:16:03evanso
01:16:05evanin MRI
01:16:14evanfork() causes all Thread's to die except for the current one
01:16:50tarcieriwhoa
01:16:58evandid people know that?
01:17:03evani've always wondered
01:17:16tarcierithat certainly simplifies forking + mvm
01:17:17tarcieriheh
01:17:18zenspidernever knew that
01:19:03evan it makes sense for what most people expect fork to do
01:19:11drbrainevan: I knew that, but forgot
01:19:18Defilersame
01:19:18evani have to figure out a mild workaround for rubinius
01:19:22pauldix enters the room.
01:19:25evanbecause signal handlers inherit
01:19:29evanbut THreads don't
01:19:37evanand rubinius uses Threads to handle signals.
01:19:41tarcierievan: did libev reconcile the problems with forking + event loops?
01:19:44obvio_ leaves the room.
01:20:04evani'm not sure.
01:20:17evanshoe didn't document the failure he was seeing
01:20:20evanso i don't know.
01:21:10evanthere is still an issue with fork/threads/channels
01:21:16evanbut i've worked around it for the moment.
01:21:44zenspiderso, should I be trying to figure out these destabilization problems? Or are we content with excluding the specs for now and moving on?
01:22:24evansomeone has to figure them out eventually
01:22:32evani'd love for someone to take the lead on at least one of them
01:22:38brixenzenspider: tracking those can be very frustrating, as they are not typically the POF
01:22:42evanor at the very least
01:23:17evanshow me how to get a list of all of them
01:23:21evanso I can try and bang them out.
01:23:23brixenafaik, #callcc is the biggest problem
01:23:29brixenit runs fine in isolation
01:23:32brixenthe specs that is
01:23:41boyscout2 commits by Evan Phoenix
01:23:42boyscout * More fixes to get signals/channels running properly; 173068d
01:23:43boyscout * The zombie pit. Fixes a bunch of thread and GC problems; baedb2e
01:23:51brixenzenspider: Module would be much more productive
01:23:53evandrbrain: there ya go.
01:23:56brixenand affect more code
01:24:03zenspiderbrixen: yeah. I fucked with those too
01:24:05drbrainyay
01:24:18evanthe destabilization causes VM sigbus
01:24:19evanyes?
01:24:23zenspiderI found a number of them taht ran fine in isolation but failed when run via bin/ci
01:24:28zenspiderI fixed Symbol#all_symbols for that
01:24:33evanbecause those last 2 commits fixed some NASTY task GC problems
01:24:37drbrainevan: now, get the guy illegally parked in front of my driveway towed
01:24:42drbrainso I can park my car
01:24:45brixenevan: iirc, just remove the callcc excludes and run bin/ci
01:26:01evanzenspider: failed being VM sigbus?
01:26:13evanor the spec reports failure
01:27:17evanok, abby and I are at a coffee shop, we're going to head home now.
01:27:17Defilerhttp://rafb.net/p/yhNFDl42.txt
01:27:23zenspidersigbus, mostly
01:27:27DefilerDoes that give us any idea of what really caused the fault?
01:27:34DefilerI think it's a coincidence, but I could be wrong
01:27:43evanif it's callcc related
01:27:50evanthere is a distinct posibility it's fixed now.
01:28:03evanthe cpu_task (ie, Task class) was a VERY bad GC citizen.
01:28:15brixenevan: I'll run them right quick
01:28:18evanit was hiding pointers from the write barrier
01:28:31zenspiderevan: ok. I think that is the main problem I'm having here atm... but I've not fully isolated yet
01:28:37zenspiderBAD BAD Task class!
01:28:45evanvery bad!
01:28:48evanmy fault too.
01:28:50evanoh well.
01:29:03evanif someone else wants to look
01:29:14evananytime data is written to a task object (ie, cpu_task struct)
01:29:22evanthe cpu_task_run_wb function has to be called.
01:29:37evanhaving someone else do a quick audit would help
01:29:52evanfor ref
01:30:04evana Task object is tagged as storing bytes
01:30:17evanand it's body is a 'struct cpu_task'
01:30:43agardinerevan: presumably you mean any object data is written to the task? setting flags on the struct doesn't require this check does it?
01:31:10evanagardiner: you alteration of the contents of the body of a Task
01:31:31evanstruct cpu_task *t = (struct cpu_task*)BYTES_OF(task_object);
01:31:37evant->main = something_else;
01:31:41evananything like that.
01:31:48olabini leaves the room.
01:31:51evanyou can wait to run the cpu_task_run_wb until after a bunch of them have been done
01:32:17agardineri am looking at the change to yield to the debugger on a context change...
01:32:24evanyou don't have to run it after every write to the struct (though, i'm going to revise that code to use redirect code so the write barier is always run right away)
01:32:29evanok,
01:32:33evanwe're off.
01:32:34evanbbiab.
01:32:44agardineri was thinking about using task->flags to set a bit
01:33:02rubuildiusEvan Phoenix: 173068d91; 4446 examples, 16792 expectations, 0 failures, 0 errors
01:35:06nicksieger enters the room.
01:35:30zenspideranyone know why attr_writer uses __symbol_lookup__ instead of to_sym?
01:36:45tmorninizenspider: I worked on attr and friends. Let me take a look
01:37:27agardineri'm guessing, but i'd say it's because to_sym may not be defined in bootstrap...
01:37:52zenspiderit is now, so I'll move over to it
01:39:04zenspiderargh... I think this is one of those that passes in isolation but fails in combination... poopy
01:40:00djwhitt leaves the room.
01:40:16tmorninizenspider: Oh, I see, you're working in bootstrap. I never touched those, other than moving them from object to module, per brixen.
01:40:29tmorniniSorry, make that class to module.
01:40:30vintrepid_ enters the room.
01:41:08drbraindyld: lazy symbol binding failed: Symbol not found: _ev_default_loop
01:41:15drbraintrying distclean :(
01:41:27zenspideryeah. I think I got that too
01:43:33drbrainyay!
01:44:00drbrainI wish the Rakefile was properly plumbed into external_libs
01:44:39crafterm_away leaves the room.
01:44:56defunkt leaves the room.
01:45:03vintrepid leaves the room.
01:45:18zenspiderhrm... I don't understand respond_to?'s implementation... :(
01:47:06pauldix leaves the room.
01:47:22zenspiderman I have fucking around in bootstrap... it is fragile and I keep messing it up
01:47:25brixenit seems like the callcc issue might be fixed. I've run bin/ci -C, bin/ci -C -fs, bin/ci -fs, and bin/ci with 1 sigbus out of 6 runs
01:47:44brixenthat sigbus might have just been one of the random ones I see now and then
01:48:35zenspideryou see random ones?
01:48:39brixenI'll unexclude #callcc specs and push, we can revert if it's causing problems
01:48:54brixenzenspider: yeah, but I probably run bin/ci about 100x more than anyone else
01:49:08zenspiderbrixen: I'm already in there if you want to ignore
01:49:24zenspiderI would like autotest to work again. :(
01:49:31zenspiderotherwise, I'd beat you. :P
01:49:42brixenI pastied you a fix
01:49:53brixenif it would run without asking for rspec, I'd work on it
01:50:37brixenzenspider: you will unexclude #callcc then?
01:50:47zenspiderall you have to do is write a discovery routine and autotest subclass
01:51:06zenspiderI don't have the fix, or something else broke
01:52:49brixenwell, pastie.caboo.se is unavailable, so I don't have it either
01:53:12brixenall I did was update the directories for the specs and e.g. compiler
01:53:19zenspidergetting it to work with new systems is actually really easy. I did a lot of work with chelimsky to make it very flexible
01:54:28zenspiderwell... I also see the all-exclude.txt thing I added which is dead now
01:54:35zenspiderwha do you mean about the compiler?
01:54:40zenspiderwhat
01:55:24boyscout2 commits by Brian Ford
01:55:25boyscout * Removed use of `pwd -P` as at least ubuntu bin/pwd doesn't support it.; d36b3f6
01:55:26boyscout * Unexclude Kernel#callcc specs as Evan's recent commits seems to fix it.; 6d7a829
01:55:59brixenzenspider: paths need to be updated for the spec move to spec/ruby/1.8
01:56:10brixenand at the time I updated it, we had compiler[12]
01:56:31brixenpoint is, it basically just needs paths updated, unless you want to change stuff
01:56:42zenspiderbrixen: you're talking about the add_mapping section, yes?
01:56:49zenspiderthat doesn't matter
01:57:11brixenheh, that's why you should fix it, what do I know ;)
01:57:37zenspiderthe problem is that autotest used to respect the excludes, and now it doesn't, making using autotest unreasonable as a number of the excludes cause the system to die
01:57:54brixenwell, they've just moved
01:58:15brixenbut your find command will still find them
01:58:17brixenactually
01:58:50brixenmaybe because you named it all-exclude.txt~ ?
01:59:12tmorniniHey guys. Did rake distclean get broken recently?
01:59:28zenspiderbrixen: so?
01:59:30brixentmornini: I don't think so, what are you seeing?
01:59:43zenspidertmornini: just got a "YAY" from drbrain wrt it
02:00:16tmorninibrixen: Well, it was breaking on shotgun, but now it seems OK. weird.
02:00:21boyscout3 commits by Eric Hodel
02:00:22boyscout * Use C versions of getsockname(2) and getpeername(2).; c8b1636
02:00:23boyscout * File::Stat#inode is really named File::Stat#ino.; 1a11d09
02:00:24boyscout * Make ffi_getsockname only wrap getsockname(2); 7238595
02:00:37brixentmornini: yeah, sometimes it fails with something about task clean
02:00:49tmorniniOK.
02:00:52tmorniniNever seen that before.
02:01:11brixentmornini: I saw it once, but I can't reproduce it
02:01:30tmorniniOK, I'll try to isolate if it comes around again
02:01:45tmorniniI didn't know Rubinius has a zombie pit!
02:01:56tmorniniI'm happy, because every project of this size should have one.
02:02:24tmorniniI was going to add it to the project plan, but looks like Evan beat me too it. :-)
02:02:55tmorniniCommand failed with status (2): [cd shotgun; make distclean...]
02:03:18tmornini /Users/tmornini/Desktop/rbx/rakefile:452
02:03:30zenspiderbrixen: all-excludes.txt~ was supported via spec/mini_rspec.rb, which is apparently now gone and the equivalent functionality gone afaik... so I'm not sure _how_ to fix this in the new system
02:04:57zenspideris kinda afraid to git:pull
02:06:12drbraintmornini: I'm having no problems with a fresh pull
02:06:17drbrainboyscout: sup?
02:06:17boyscoutof course not
02:06:38drbrainboyscout: oh, I didn't see you there
02:07:09brixenzenspider: I have no idea what you're talking about, mSpec uses exactly the same mechanism to enable or exclude specs
02:07:20brixeneven the command options to bin/mspec are the same
02:07:37tmorninidrbrain: OK, thx
02:07:49tmorniniI think it might be the zombie pit
02:08:04zenspiderbrixen: git show 092e0081c26eeda2ca6561eb19123b468965c84a | head -100
02:08:05tmornini leaves the room.
02:08:09zenspidercrap
02:08:16zenspiderthat head isn't big enough
02:08:31zenspider125 is fine
02:10:26brixenzenspider: bin/mspec -h ;)
02:10:45brixeneverything in that commit is available as a command line option
02:11:02zenspiderbrixen: yes. that's great. that really doesn't help, does it?
02:11:12brixenand it already outputs "started" and finished in blah seconds by default
02:11:26brixenwhat doesn't help?
02:12:00brixenbin/mspec -x spec/data/critical.txt -x all-excludes.txt~ -f d
02:12:06zenspider*sigh* nevermind.
02:12:39brixenzenspider: point me to some docs so I can understand this and I'll fix it
02:13:40rubuildiusEric Hodel: c8b1636e4; 4453 examples, 16802 expectations, 0 failures, 0 errors
02:13:41rubuildiusBrian Ford: d36b3f65f; 4453 examples, 16802 expectations, 0 failures, 0 errors
02:15:42istarex enters the room.
02:17:58coutI really need to fix my nick highlighting.
02:23:03dodecaphonic leaves the room.
02:23:17djwhitt enters the room.
02:23:39jbarnette leaves the room.
02:23:39_mutle leaves the room.
02:23:50VVSiz_ enters the room.
02:26:21rueEvening
02:27:30brixenevening rue
02:27:44brixenrue: can you check the Module#instance_method specs on whatever ruby you have, please
02:28:01slava leaves the room.
02:28:24rue#instance_method or +s?
02:28:45brixenjust instance_method
02:28:55rue2/5/0/0
02:29:08brixenI'm getting 2 failures
02:29:09rueA couple hours behind though if something just changed
02:29:58brixenrue: what ruby version?
02:30:27VVSiz leaves the room.
02:30:43obvio171_ enters the room.
02:33:26brixenrue: Module#instance_method returns an UnboundMethod representing the instance method with the given name
02:33:41mutle enters the room.
02:34:07brixenrue: fails for me on ruby 1.8.6 p111 (leopard), 1.8.6 p36 ubuntu 32bit, and 1.8.5 p2 gentoo 64bit
02:41:56warren_s leaves the room.
02:43:03skaar enters the room.
02:47:38obvio leaves the room.
02:52:38turtletime enters the room.
02:52:45_mutle enters the room.
02:53:30kofno enters the room.
02:55:38brixendrbrain: why does rubygems change the visibility of Kernel#require from private?
02:55:56drbrainbecause it's redefined
02:56:21brixenwaits for the rest of the story ;)
02:56:29cored leaves the room.
02:56:33drbrainthere is no rest
02:57:04brixendoes it not work as a private method after redefinition?
02:57:14drbrainI have no idea
02:57:19brixencould it not be marked module_function, private, etc?
02:57:21brixenok
02:57:34drbrainit could, nobody's complained
02:57:58brixenyeah, I just ran into it in the specs
02:58:06brixenrunning with rspec vs mspec
02:58:09istarex leaves the room.
02:58:25headiusevening
02:58:38brixenevening
02:59:07headiussomeday I hope to climb out of IO hell
02:59:21headiusshould have some buffered IO specs reasonably soon though
02:59:35brixensweet
03:00:08mutle leaves the room.
03:00:27headiusI don't suppose either of you know whether sockets can be full-duplex buffered
03:00:49headiusour current socket impl has bidir buffers, which seems to conflict with FILE only having a single buffer in C
03:01:38brixenhmm, such low level implementation details
03:02:04headiusyeah
03:02:05headiuslibc low
03:02:06brixenI wish, to elaborate on rue's vision Socket < File < BufferedIO < IO
03:02:12headiusbut I'm implementing buffered IO
03:02:35brixenyeah
03:02:42ezmobius leaves the room.
03:02:50smartocci_ leaves the room.
03:02:54headiusimplementing libc semantics by hand...wheee
03:03:16brixenheh, as if there existed such a thing as "libc" :P
03:03:25headiusso I have a single-buffered impl in one hand and a bidir buffered impl in the other
03:03:30headiusand I need to reconcile the two
03:03:30brixenI've got 17 spec failures for core on ubuntu, 4 on leopard
03:03:36brixenI think they both use libc
03:04:01brixenof course, different patch levels
03:04:03headiusI think single is correct because MRI wraps whatever fd in a FILE
03:04:10headiussocket or otherwise
03:04:10brixenyep
03:04:20brixenwell, not sure about socket, but yes for fd
03:04:27headiussocket is just another fd
03:05:30brixenio.c is one of the most awful pieces of ruby, I think
03:06:10headiusunfortunately I have grown to understand it
03:10:24manverujust wondering, anybody working on the IPAddr issue already? :)
03:12:04drbrainmanveru: ?
03:12:51manverui think IPSocket::getaddress was the problem
03:13:22emphatic leaves the room.
03:13:24drbrainmanveru: I #addr and #peeraddr work as of about an hour ago
03:13:39manveruoh
03:14:03manveruso 2 down, 2 left?
03:14:18drbrain?
03:14:43mad_phoenix leaves the room.
03:15:12manveruwell, my grep shows that addr and peeraddr are two methods of 4 on IPSocket, left are #recvfrom and ::getaddress
03:15:23drbrainah
03:15:52drbrainI don't see a getaddress on the socket classes in ri...
03:16:03boyscout1 commit by Brian Ford
03:16:04manverustdlib/ext/socket/socket.c: rb_define_singleton_method(rb_cIPSocket, "getaddress", ip_s_getaddress, 1);
03:16:04boyscout * Protect String#% specs from segfaulting on linux (ubuntu gutsy).; c09b3da
03:16:11drbrainweird
03:16:24manveruri is weird
03:16:36drbraingetaddress should be easy to implement with the C code already there
03:16:49manveruwith that IPAddr should pass as well
03:17:02manveruand open-uri proxy handling
03:17:40manverui don't know C so i haven't attacked it
03:17:51contextIPAddr doesnt have a getaddress on 1.8.6
03:18:05manveruno
03:18:19manverubut it uses it
03:18:28drbrainIPSocket does
03:18:28contexto
03:18:49context:/ yeah srry, confusin myself
03:19:04manveruheh, usually i'm the confused one :)
03:19:34vintrepid_ leaves the room.
03:19:40manverusometimes the code in stdlib makes me wanna cry...
03:20:34manveruhttp://p.ramaze.net/268
03:20:39contextmanveru: mmm feel lucky, you dont have to look at hte java stdlib all day
03:21:07contextmanveru: WOW !
03:21:25d2dchat__ leaves the room.
03:22:05contextmanveru: serious? that could be done in 1-2 regex's
03:22:05manveruthat is IPAddr#to_s
03:22:05manveruwell, part of it
03:22:11ko1_away0 enters the room.
03:23:06manverusometimes i suspect genetic coding would produce better looking stuff...
03:24:31contexthaha
03:26:31rueheadius: Looks good, but the comparison to the rdoc is striking
03:26:52rueheadius: Should we seek clarity from ruby-core?
03:27:23headiuson which points do you think we need more clarity?
03:27:44headiusit's a pretty detailed rundown of the current algorithm for each
03:27:55headiusof course we want to distill out real specifiable behavior
03:28:04rubuildiusBrian Ford: c09b3da39; 4451 examples, 16798 expectations, 0 failures, 0 errors
03:28:36boyscout1 commit by Brian Ford
03:28:37boyscout * Explicitly run /bin/sh to get around limited /bin/pwd on linux.; 05a180e
03:28:50MenTaLguY enters the room.
03:29:49rueheadius: Oh yeah, yours is an excellent summary of what happens right now
03:30:14MenTaLguYtarcieri: around?
03:30:21headiusI don't claim to understand the pipe stuff all that well yet
03:30:25headiusblack box for the moment
03:30:35tarcierihey
03:30:37headiusbut the flushing semantics and fileno handling I think I get
03:30:48rueBut it is a lot more than what the docs promise, possibly some completely unnecessary stuff (as in no-one relies on it)
03:30:51headiusI wish fileno/fd handling were also a black box to Ruby, but it doesn't appear to be
03:31:07headiusIO.new and such
03:31:27ko1_away leaves the room.
03:31:44rueHeh, I was going to ask ko1 if he had planned an IO cleanup
03:31:56boyscout1 commit by Brian Ford
03:31:57boyscout * Exclude Kernel#require is private spec when running with RSpec.; 14c811a
03:32:22headiusI'd be surprised
03:32:27headiusI wouldn't want to touch that code
03:32:34tarcieriMenTaLguY: did you see I released revactor?
03:32:51headiusJRuby has an OpenFile and FILE impl now though...trying to map impl a bit more closely
03:32:55headiusrefactoring can follow
03:33:02brixenrue: do you get any Marshal#dump failures on whatever ruby you have?
03:33:25rueheadius: I was looking at eigenclass and looks like just additional API stuff
03:33:29headiusyou guys could drop to FILE and fd and f* functions of course...is that the plan right now?
03:33:36ruebrixen: Sec
03:33:56rueheadius: I think the plan would be "sane IO" but not sure how that will pan out
03:34:01headiushah
03:34:18headiusyeah, if you find a way I'd gladly help fill it out
03:34:20brixenheadius: right now, buffered IO on read is done without using FILE
03:34:24rueI have a strong tendency to do the least possible on this
03:34:29brixenheadius: evan just added it recently
03:34:30headiusI've essentially been gutting JRuby IO right now
03:34:38headiushow's it buffering?
03:34:53brixenheadius: heh, it's ruby code man :P
03:35:02brixenle'me look right quick
03:35:03headiusseems like a lot of extra effort...most of what i'm working on is duplicating libc behavior
03:35:11brixenI know is uses channels and fill_from
03:35:13headiusif I could just use FILE you can bet I would
03:35:41MenTaLguYtarcieri: yeah, congratulations
03:35:55crafterm enters the room.
03:36:08brixenheadius: IO::Buffer kernel/core/io.rb
03:36:24MenTaLguYtarcieri: I've been thinking more about remote actors
03:36:43tarcieriMenTaLguY: on other VMs in the same environment, or on remote hosts?
03:36:51MenTaLguYand/or
03:36:59MenTaLguYplus possibly other coexisting actor implementations
03:37:11ruebrixen: Does bin/mspec take excludes into account?
03:37:16vruz enters the room.
03:37:20brixenrue: not unless you tell it to
03:37:22tarcieriMenTaLguY: yeah, I've been talking to the guy who wrote rbridge
03:37:23brixen-x <file>
03:37:34tarcieriMenTaLguY: about Ruby Actors talking to Erlang Actors
03:37:39ruebrixen: Cool, I think I may have just run into an old file or something
03:37:56MenTaLguYtarcieri: it occurred to me that as long as we have a standard object protocol for things like linking and message sending, we should be able to duck-type any actor implementation in
03:38:17MenTaLguYtarcieri: ah, cool, the erlectricity guy contacted me a while back about the concurrent actors stuff, but nothing ever really came of it :/
03:38:18rueevan: Around? dbussink and I were trying to figure out how to raise exceptions from regexp_new() last night
03:38:33tarcieriMenTaLguY: my plan was to implement DRb on top of (Rev)actor::TCP, and use that as the basis of a distributed Actor protocol
03:38:36rueMenTaLguY: CORBA actors :)
03:38:57headiusbrixen: ok
03:39:01tarcieriMenTaLguY: but for VM-to-VM communication it isn't needed, since evan's message queues largely accomplish the same thing
03:39:22agardinertarcieri: congrats on Revactor
03:39:30tarcieriagardiner: yeah thanks
03:39:31MenTaLguYtarcieri: yes, I think DRb over-Revactor::TCP is a good start, although long-term we will want something lighter-weight (marhsal's representation is extremely heavyweight)
03:39:58tarcieriMenTaLguY: yeah, I'm trying to keep everything as simple as possible for the time being
03:40:08MenTaLguYnods
03:40:20agardinerthe web site provids an excellent write-up of actors etc
03:40:35agardinermakes me want to use them!
03:40:37tarcieriMenTaLguY: but the next two things on my slate are getting linked processes going (and supervisors) then DRb
03:40:41MenTaLguYpart of what got me thinking about this was I was considering whether to drop actors from the omnibus library, when I realized that you and I are really going for somewhat different things in our use of threads/fibers
03:40:46tarcieriagardiner: heh, thanks
03:41:04tarcieriMenTaLguY: oh yeah?
03:41:11tarcieriI mean, Fibers prevent preemption
03:41:14tongueroo leaves the room.
03:41:15MenTaLguYbut then I realized that as long as the actors duck-type the same for linking and message sending, it shouldn't matter, we should be interoperable
03:41:19tarcieriThat's the biggest difference
03:41:22tarcieriYeah, for sure
03:41:43MenTaLguYso since you've got linking on the brain right now, let's see if we can work out the protocol for that
03:41:46MenTaLguYand I guess object sending too
03:41:48tarcieriThe biggest difference is blocking calls will hang Revactor so it's important you use "Actor-safe" stuff for everything, which kind of sucks, but has performance benefits
03:42:08MenTaLguYthat's fine; it's internal to the actor isn't it?
03:42:19MenTaLguYthe parts where they interface are external to the actor
03:42:30MenTaLguYand asynchronous
03:42:48MenTaLguYare you using << for message sending, OOC?
03:42:48tarcieriYeah, I mean, ultimately the whole goal is to give you a synchronous imperative interface on top of an asynchronous API
03:42:57tarcieriYes, << is aliased to #send
03:42:58MenTaLguYI've not taken a close look at Revactor's implementation yet
03:43:08MenTaLguYok, cool
03:43:26tarcieriI don't particularly like redefining #send, but it's not like it's a big problem... most stuff uses __send__ and such anyway
03:43:31MenTaLguYlet's use #<< as the "standard" message sending thing for the actor object protocol
03:43:37tarcieriYes
03:43:40tarcieriThat's what I've been doing
03:43:41rubuildiusBrian Ford: 14c811ada; 4451 examples, 16798 expectations, 0 failures, 0 errors
03:43:42rubuildiusBrian Ford: 05a180e00; 4451 examples, 16798 expectations, 0 failures, 0 errors
03:43:47MenTaLguYokay, next up
03:43:48MenTaLguYlinking
03:44:08tarcieriMenTaLguY: heh, some guy suggested an alternative to the Case gem
03:44:13MenTaLguYI saw that
03:44:18tarcieriAlthough his stuff isn't released as a Gem at all
03:44:20tarcieriSo...
03:44:23MenTaLguYI think it might be a little overkill
03:44:33MenTaLguYone of the reasons I'm trying to exploit #=== is performance
03:44:38tarcieriI don't need anything you haven't already implemented
03:45:08MenTaLguY(well, aside from being sort of what Ruby normally does for matching)
03:45:21tarcieriI haven't run into a need for Case.guard yet, even, but I wanted to make sure something like that was available just in case, heh
03:45:26jtoy enters the room.
03:45:43MenTaLguYI've been thinking about Case::Any (without brackets) as a universal wildcard
03:45:49MenTaLguYI realized that not everything descends from Object
03:45:59MenTaLguY(BasicObject anyone?)
03:46:08rightondev leaves the room.
03:46:08tarcieriYeah, originally I had something like Revactor::ANY_OBJECT
03:46:14tarcieribut got rid of that
03:51:24rightondev enters the room.
03:54:36MenTaLguYWill it cause any problems for you if I pull case.rb from Rubinius for the moment?
03:54:46MenTaLguYI think the implementation of case is still fairly in flux
03:54:50tmornini enters the room.
03:54:53tarcieriNope
03:55:13MenTaLguYokay, co ol
03:55:19tarcieriIn order to get something like Revactor on top of Rubinius I need nested loops
03:55:29tarcieriLike uhh, libev nested event loops
03:55:36MenTaLguYelaborate?
03:55:57boyscout1 commit by MenTaLguY
03:55:58boyscout * remove case.rb for now; the gem will do for most people; 6f5308c
03:55:59tarcieriStateful sets of descriptors I can enable and disable monitoring on
03:56:09MenTaLguYI see
03:56:21tarcierilibev originally supported nested event loops
03:56:29tarcieriSo you could add one loop to the other
03:56:43MenTaLguYnods
03:56:47tarcieriI think the author may have removed that feature because it couldn't be done reliably in a cross-platform manner
03:57:01tarcieriI'll have to find out
03:57:13MenTaLguYhm, it seems like it should be doable
03:57:28tarcieriiirc he was having trouble with kqueue
03:57:29MenTaLguYthe nesting stuff shouldn't have any platform-specific elements
03:57:45MenTaLguYunless he's trying to do it at too low a level of abstraction
03:58:01MenTaLguYso, wait, if libev removed them what are you doing for Revactor?
03:58:22tarcieriIn Ruby 1.9 I have a thread-specific event loop
03:58:23GMFlash leaves the room.
03:58:32GMFlash enters the room.
03:58:52tarcieriBut, more than that, I have a #run_once method on the event loop
03:59:11tarcieriSo all the event-processing callbacks can get called in a single batch
03:59:24tarcieriThen the Actor loop switches back to processing Actor mailboxes
03:59:31tarcieriAnd then back to waiting for events with libev
03:59:58tarcieriEach thread runs as a single event loop
04:02:06MenTaLguYhm
04:02:16MenTaLguYso, back to linking
04:02:21tarcieriyeah
04:02:23MenTaLguYI think we basically need three things
04:02:35tarcieria big thing is a serializable exception object
04:02:39tarcierithat'd be super-handy
04:02:51MenTaLguYwell, yeah, although I think that's a nicety
04:03:14tarcieriyou could return the exception as a string :/
04:03:22MenTaLguYyes, or some other form
04:03:23nicksieger leaves the room.
04:03:32MenTaLguYit doesn't really matter for the basic protocol I don't think
04:03:36tarcieriyeah
04:03:45tarcieriall you really need is a reason message of some sort
04:03:47headius leaves the room.
04:03:54MenTaLguYyeah
04:03:55nicksieger enters the room.
04:04:15MenTaLguYwell, plus maybe a symbol for a program-interpreted code
04:04:17headius enters the room.
04:04:21MenTaLguYif not an exception type
04:04:41MenTaLguYso, here's what I'm thinking
04:05:00tarcieriFor Revactor I'm probably just going to use exceptions
04:05:07MenTaLguYnods
04:05:13MenTaLguYsimilarly in Concurrent
04:06:20MenTaLguYso, I think besides messages there are three other asynchronous signals actors can send to one another
04:06:51MenTaLguY"link" (register the supplied actor as a linked actor), "unlink" (unregister the supplied actor as a linked actor), and "exit" (an actor exit notification)
04:07:19tarcieriyeah
04:07:23MenTaLguYI'm thinking that actors could have corresponding #notify_link, #notify_unlink, and #notify_exit methods
04:07:39tarcieriI've been using on_* for that stuff in Rev
04:07:58MenTaLguYon_* sounds like event handlers though
04:08:04rubuildiusMenTaLguY: 6f5308c79; 4451 examples, 16798 expectations, 0 failures, 0 errors
04:08:12mdmurray leaves the room.
04:08:21tarcieriIsn't that what you had in mind?
04:08:37MenTaLguYI'm thinking of an external inter-actor interface
04:08:41sudoer enters the room.
04:09:02tarcieriokay, so when would those be called?
04:09:15MenTaLguYso, Concurrent::Actors::Actor#link might look like:
04:09:15MenTaLguYdef link(actor)
04:09:15MenTaLguY actor.notify_link(self)
04:09:15MenTaLguY notify_link(actor)
04:09:15MenTaLguYend
04:09:31tarcieriokay
04:09:41tarcieriso just that as a generic wrapper for sending the messages
04:09:52MenTaLguYyes
04:09:54tarcieriSure
04:10:05MenTaLguYunlink would work the same way basically
04:10:07djwhitt leaves the room.
04:10:37MenTaLguYwhen an actor dies it would be responsible for walking its own list of linked actors and calling notify_exit on them
04:10:55MenTaLguYnotify_exit takes two arguments, the exited actor and some sort of exception/error object
04:11:03tarcieri"reason"
04:11:05tarcieriok
04:11:48MenTaLguYnil for a normal/successful exit
04:12:01tarcierisounds good
04:12:03MenTaLguYhm, I think that may be all the protocol we need; can you think of anything else?
04:12:12tarcierithe #trap interface
04:12:18tarcieribut yeah
04:12:20tarcierimessage-wise
04:12:22tarcierithat's fine
04:12:34MenTaLguY#trap's internal to the actor implementation though, I think different actor implementations may want to do different things
04:12:47MenTaLguYalso I haven't been able to find an interface for trap-like functionality that I'm happy with yet :)
04:12:50tarcieriI assume you're thinking [:link, actor], [:unlink, actor], and [:exit, actor, reason] ?
04:13:02tarcieriwhere those messages could be tuples
04:13:20MenTaLguYactually link/unlink and exit signals need to be out-of-band with respect to messages
04:13:30tarcierioh right
04:13:47MenTaLguYan exit signal to a non-trapping actor needs to terminate that actor even if it has messages waiting
04:13:54tarcieriThey need to be "system" messages
04:14:00MenTaLguYyeah
04:14:37MenTaLguYif the actor is trapping an exit then it is responsible for submitting an appropriate message into its own mailbox
04:15:12MenTaLguYI'm not sure the form of that message needs to be standardized between actor implementations
04:15:57rueI have a feeling I will somehow learn this concurrency stuff through osmosis
04:16:07tarcieriWell, if an Actor is trapping exit shouldn't it be delivered a message in a standard form?
04:16:16tarcieriNot necessarily through its standard mailbox, but through Actor.reeive
04:16:47tarcieriThere should be a standard pattern you can match for exit messages
04:16:53tarcieriThat's all that's really important, imo
04:17:05tarcierierr
04:17:06MenTaLguYyes
04:17:07tarcieriActor.receive
04:17:29MenTaLguYI am saying that trapped exit notifications should be available as messages via Actor.receive
04:17:47jtoy leaves the room.
04:17:51MenTaLguYbut those messages will always be produced by the local actor for itself, not by the remote actor sending the notification
04:18:09tarcierido you want an overridable method to do that?
04:18:25MenTaLguYso the standard form need only be standard to the particular actor implementation
04:18:30MenTaLguYer, huh?
04:18:35tarcieriI don't follow
04:19:06MenTaLguYI don't follow either :/
04:19:49tarcieriheh
04:19:51tarcieribasically
04:20:01tarcieriwhat's your equivalent to {'EXIT', Pid, Reason}
04:20:32MenTaLguYActors::ActorExit[actor, reason] I think. been a while since I looked
04:20:43MenTaLguYbut those are never passed between actors directly, are they?
04:20:50ruebrixen: Marshal#load 64/64/13/1, Marshal#dump 80/89/2/0
04:20:51tarcieriit doesn't matter
04:21:01tarcieriyou still have to match against it with Mailbox::Filter
04:21:14ruebrixen: One minor float error on MRI in #dump
04:21:15tarcierito multiplex the reception of other types of messages with exit events
04:21:25tarcieriif you so desire
04:21:29MenTaLguYyes
04:21:36MenTaLguYbut that's trivial
04:21:41tarcierigranted it will generally be wrapped up in supervisors, but supervisors still have to get other types of messages
04:21:49MenTaLguYit doesn't need to be specified as part of the inter-actor protocol
04:21:49tarcieriwell, it should still be standard across different Actor implementations
04:21:56MenTaLguYI don't see why it has to be
04:21:56tarcierinot inter-Actor
04:22:08tarcieriJust what the actor that's trapping exit receives
04:22:10tarcierishould be standard
04:22:20MenTaLguYshrugs
04:22:21MenTaLguYwhy?
04:22:22tarcieri[:exit, actor, reason]
04:22:24tarcierifine?
04:22:24tarcieriheh
04:22:45tarcieribecause Actors that are trapping exit need to specify a filter for processing exit messages
04:22:56MenTaLguYsure
04:23:01tarcieriand that filter should be standard
04:23:04MenTaLguYbut people are going to be writing for specific actor implementations
04:23:05tarcieriso the message needs to be standard
04:23:18tarcieriyou don't have to
04:23:21tarcieriheh
04:23:30tarcieriI dunno, I'd just like it to be as standard as possible
04:23:40tarcieriMy goal is to write stuff for Revactor then move it all onto Rubinius
04:24:13MenTaLguYwell, portability between those two implementations is important certainly
04:24:20MenTaLguYso that's a reason
04:24:36tarcieriI mean, you're not planning on doing anything other than [:exit, actor, reason] right?
04:24:37tarcieriheh
04:24:48MenTaLguY[:exit, actor, reason] is fine as far as I'm concerned
04:24:52tarciericool
04:25:09MenTaLguYI may do something different in the Omnibus implementation, but I'll follow your lead in the Rubinius built-in thingy
04:25:15tarciericool
04:25:54MenTaLguYevan: how would you feel about making Rubinius' Array#=== structural?
04:26:22tarcierior at least with Tuple
04:26:31MenTaLguYwell, [:exit, actor, reason] is an Array though
04:26:41tarcieriurgh
04:26:45tarcieriyeah that decision is a bitch
04:26:55MenTaLguYif we did Array#=== we should certainly do Tuple#=== too though
04:26:55tarcieriI'm using Tuples for everything atm :/
04:28:04MenTaLguYit would be nice if Tuples implemented Enumerable
04:28:05tarcieriCase matches either with Case[] though, right?
04:28:18MenTaLguYjust Arrays
04:28:39MenTaLguYI went back and forth on that a lot, but there would be portability problems between Rubinius and MRI otherwise
04:28:42tarcieriI guess becuase I implement Tuple as a subclass of Array it's fine
04:28:49MenTaLguYyeah
04:28:53MenTaLguYand there is Case::Tuple[]
04:28:57MenTaLguYif you are on Rubinius
04:29:08tarcieriHmmm, heh
04:29:28MenTaLguYor more generally if Case is loaded when there is a ::Tuple defined
04:29:39tarcieriYeah, that's what I'm doing
04:29:51MenTaLguYshould get Case::Tuple in that case too then
04:30:37MenTaLguYalso I'm considering adding a case/core which adds structural #=== to Array, Struct and Tuple (when applicable)
04:30:47MenTaLguYI mean, the top-level ones, not just the Case versions
04:30:48tarcierithat'd definitely be the way to go
04:30:59tarcieriyeah
04:31:00MenTaLguYso require 'case/core' if you want to live dangerously :)
04:31:06tarcierinice
04:31:17tarcieriit's not like people use Array#=== for anything else really
04:31:29tarcieriat least, in such a way that redefining it in that way would break it
04:31:38MenTaLguYyeah
04:33:44evanMenTaLguY: we can't change the behavior of Array#===
04:33:48evansorry.
04:34:09MenTaLguYwhy not?
04:34:18tarcieriwhat if it's 99.9% backwards compatible?
04:34:20MenTaLguYyou're doing more dangerous stuff like making loop a keyword
04:34:37MenTaLguYunless you've changed your mind about that
04:34:39evannot really.
04:34:56evanthe loop API is braindead.
04:35:00tarcierievan: what would break is if someonce compared [:foo, Object, Object] === [:foo, :bar, :baz] and expected it to be false
04:35:04evanand if we find a conflict, i'll change it back.
04:35:23evanbut Array#=== needs to have the same behavior as MRIs
04:35:27MenTaLguY[:foo, Object, Object] === [:foo, Object, Object] would still work
04:35:29evanthe current loop optimization does.
04:35:42evan(have the same behavior)
04:35:54MenTaLguYnot if it takes precedence over a private method named "loop" (does it?)
04:36:08evanit does
04:36:17evanbut it has the same behavior as the Kernel one
04:36:26evanand if someone writes a loop method that we conflict with
04:36:28evanwe'll remove it
04:36:34MenTaLguYI have, actually ...
04:36:34tarcierievan: the change vs MRI would be certain cases involving arrays with constants or regexes in them would be true
04:36:40evanit was a fun test
04:36:44evanMenTaLguY: then it's out.
04:37:07brixenjero5: you around?
04:37:43jero5brixen: yeah
04:37:58brixenjero5: what os and version of ruby?
04:38:40brixenjero5: I'm getting a failure on Marshal#dump at line 457 of the spec on leopard 1.8.6 p111
04:41:49tarcierievan: in the end how is that really any different from massign?
04:42:05evanhow is what different?
04:42:27tarcierievan: do you think there are a lot of real world cases were people depend on Array#=== with constants and/or regexes in it to not match against other arrays?
04:42:28jero5brixen: 1.8.6 p111, unbuntu gutsy. let me pull the latest rbx version and see if i get the error too
04:42:31TheVoiceevening to you all
04:42:32tarcieris/were/where/
04:42:37rueevan: Raising errors from functions accessed through primitives when you have the chance to lay out the plan? (regexp_new is not passed cpu)
04:42:41evantarcieri: the problem is I don't want to find out.
04:42:45tarcieriheh
04:42:51evanrue: not allowed.
04:42:58evanrue: you may not raise an exception in a primitive.
04:43:10brixenjero5: it's mri that concerns me, not rbx
04:43:12tarcierievan: I suppose, I just can't possibly conceive of a real world example where someone would actually be relying on the behavior that changes
04:43:29tarcierievan: But, that aside, could you do it for Tuple#=== ?
04:43:31brixenjero5: I'm still on p36 on ubuntu, I'm going to install p111 tomorrow
04:43:38evanrue: a primitive may fail, then the code that declares the primitive raises an exception
04:43:50evantarcieri: Tuple#=== sure
04:43:56tarcierievan: awesome
04:44:04rueevan: Hm, I have some bad news for you.. :) grep -Rn 'cpu_raise' shotgun/lib/primitives.rb | wc -l => 8
04:44:05evanwe don't have to worry about API compatibility with Tuple
04:44:09MenTaLguYwhile we're on the subject of Tuple, what about having Tuple implement Enumerable?
04:44:28evanrue: then someone has to be hanged.
04:44:54MenTaLguYyay git-blame
04:44:58evanrue: every single one of those has to be removed.
04:44:59rueevan: But I remember that part now, we just fail and then the method body gets executed
04:45:09evanNEVER raise an exception in a primitive.
04:45:11evanNEVER.
04:45:36evanlooks like agardiner
04:45:41evanand whoever worked on IO.
04:46:11evanthe only valid one is in thread_raise
04:46:37evanI might have done a couple of those because I was being lazy
04:46:37jero5brixen: i get no errors under mri. does it need a patch level guard or something?
04:46:39evanbut i should not have.
04:47:02brixenevan: the one in task_raise?
04:47:37brixenjero5: that's what is so odd, this is p111 on leopard :(
04:47:47evanthat one is ok
04:47:53evanthough task_raise isn't used anymore.
04:47:54brixenbegins to hate mri with a passion
04:48:02brixenevan: ok, just checkin
04:49:41rueevan: What would be the recommended way of getting the "exception" up from the C? Do the FALSE and bind a regexp_last_onig_error() or similar?
04:49:48agardinerevan: i copied the cpu_raise in task_get_stack_value from one of the other primitives...
04:49:52agardinerhow should that be handled?
04:50:59evanthe primitive should fail
04:51:08agardinerhow do i get it to fail?
04:51:08evanand an exception raise
04:51:28rueOr wait, can you use the stack with FALSE?
04:51:32evanreturn FALSE
04:51:33evanis ok.
04:51:52evando NOT pass things on the stack.
04:51:55evanit will not work.
04:52:13rueWOuld seem like.. OK
04:53:40brixenok, this is what I'm thinking: mri stable is 1.8.6 p111, I think the spec *have* to use this version
04:53:53brixenall this shit with platforms is enough trouble, without the version crap on top of it
04:54:07brixenall objections should be raised now ;)
04:54:15MenTaLguYthe patchlevel stuff for 1.8.6 has been kind of insane :/
04:54:29brixenyeah, tell me about it :)
04:54:44MenTaLguYit wouldn't be so bad if all of the release download stuff was consistently updated to recent patchlevels
04:55:11brixenMenTaLguY: yeah, that is such a pain, distros that package really old versions of ruby
04:55:20MenTaLguYno, I mean ruby-lang.org downloads
04:55:30MenTaLguYdepending on which file you get it may not be p111
04:55:32MenTaLguYat least, last I looked
04:55:37brixenyikes, are you serious?
04:55:38MenTaLguYI bitched about it a while back on the mailing list
04:55:42tarcieriMenTaLguY: have you thought about making Case::Tuple match Arrays with === and Case.[] use Case::Tuple if available?
04:55:49MenTaLguYmaybe it was for an earlier patchlevel
04:56:04MenTaLguYTony: I might consider it
04:56:19tarcierithat'd eliminate the whole Array/Tuple distinction nicely, I think
04:56:45tarcieriI mean
04:56:57tarcieriIf Tuple#=== compared the way Case::Tuple does now
04:56:58MenTaLguYbrixen: the catalyst was someone complaining about problems with builtin fastthread that had been fixed in p110 I think
04:57:14tarcieriCase.[] could just call Tuple.[]
04:57:36brixenMenTaLguY: ok, thanks
04:57:38MenTaLguYbrixen: turned out they were using p63 or something like that and that was the latest version available from the particular file they downloaded
04:57:51brixenok
04:57:53MenTaLguYmaybe it's been fixed since I bitched about it
04:57:59brixenI hope so :/
04:58:01MenTaLguYI haven't looked
04:58:06evanbrixen: any chance you could have radient deployed tonight?
04:58:11brixenwell, this will only affect folks writing specs
04:58:27MenTaLguYtarcieri: well, Case::Tuple#=== and Tuple#=== should certainly always do the same thing
04:58:33MenTaLguYif you are using case/core
04:58:38brixenevan: hmm, I was working on a bit of a change to the theme, the white on black needs to go
04:58:45brixenevan: can it wait till tomorrow?
04:58:56evanbrixen: why theme are you changing it to?
04:59:10tarcieriMenTaLguY: sounds like evan was cool with Tuple#=== doing the Case thing in Rubinius core...
04:59:22brixenpretty much the same for the logo (i.e. black background) with the page a lighter gray and the sides a darker grey
04:59:29brixenevan: the readability right now sucks really bad
04:59:34tarcieriMenTaLguY: and I'd certainly implement the same behavior...
04:59:41evanbrixen: ok. tomorrow is fine.
04:59:43brixenevan: and it's really limited for adding more info regions
04:59:54MenTaLguYtarcieri: right now case/core won't nuke an existing Tuple#=== if one is defined on Tuple
04:59:56evanbrixen: remember, up and ugly is better than down and pretty.
05:00:03brixenevan: ok, yeah, gotcha
05:00:08tarcieriMenTaLguY: ok
05:00:14evaneven something dead simple
05:00:14brixenevan: you can update info right now, if you want
05:00:17evantheme wise
05:00:24MenTaLguYI need to start writing more code on paper
05:00:28brixenevan: or did you want something changed with the structure?
05:00:31tarcieriMenTaLguY: so sounds like Case::Tuple isn't really needed then
05:00:46MenTaLguYtarcieri: hmm, good point!
05:00:53evanbrixen: i want to get a solution we want to move forward with in place
05:01:00evanbrixen: since we don't like the current setup
05:01:05jbarnette enters the room.
05:01:13evani want to get the system we want in place
05:01:16brixenevan: yep, I've got a git repo with it imported, need to work on the theme
05:01:17evanthen we can pretty it up and add content.
05:01:24brixenevan: I can have it up tomorrow
05:01:57evanok
05:02:14evaneven just changing the colors on the default theme is fine.
05:02:17evanhonestly.
05:02:23brixenyeah, it's not a big change
05:02:35brixenbut it will help readability a lot
05:02:41evanno problem.
05:02:50rueevan: Oh.. one more. The coercion issue with #kind_of?
05:03:02evanwhich?
05:03:04evani'm unaware.
05:03:16rueevan: #265
05:03:53rueevan: Basically Rake::FileList overrides #kind_of?(Array) == true which means coerce_to does not call #to_ary on it
05:04:26rueevan: Which will end up ugly particularly with stuff that uses @total and @tuple etc.
05:04:32evanrue: lets alias kind_of? to __kind_of__
05:04:41evanand use it in the low level, system methods.
05:05:11rueevan: Generally workable, what about delegation though?
05:05:42rueRake::FileList is fscking awful there, though, so it might be better to just fix it
05:05:43evanin what way?
05:06:22evani don't see a problem with __kind_o__
05:06:26evan__kind_of__
05:06:31rueIt will delegate __kind__of_P__ to its internal Array too
05:06:38evanplease indicate the problem.
05:06:51agardinerwow... bin/ci is faster!
05:06:59evanrue: still don't see the problem.
05:07:04agardinerfirst time i've seen < 60s!
05:07:40rueevan: Well, I am trying to figure out whether this is something we need to do or something whoever exploits kind_of? needs to fix
05:08:04evanrue: huh?
05:08:17evani still don't see why making Type.coerce_to using __kind_of__ is a problem.
05:08:25evanthat is a better solution than the attached patch
05:08:31evani need to eat
05:08:33evanbbiab.
05:09:48tongueroo enters the room.
05:09:57rueevan: In this case FL will fake kind_of?, it will also delegate __kind_of__. So even if Type.coerce_to uses __kind_of__, it still will not call #to_ary. So, if we break encapsulation accessing it anywhere in code where it should have been coerced, it will break
05:10:21rueI do not want to revisit this later
05:11:16d2dchat enters the room.
05:12:38rueErm ~~so I was trying to figure out whether A) kind_of?(Whatever) == true means exactly that and library author needs to fix or B) should we go defensive and #equal? ancestors or whatever
05:14:01tarcieriMenTaLguY: you still around?
05:14:03MenTaLguYyeah
05:14:08brynary enters the room.
05:14:16tarcieriMenTaLguY: why do you need a reciprocal relationship for linked actors?
05:14:17tarciericl
05:14:19tarcierigeh
05:14:55tarcierishouldn't any Actor interpret any exit message sent to the system mailbox as a reason to exit?
05:15:51MenTaLguYTony: well, if we're following Erlang it should be reciprocal
05:16:13MenTaLguYas far as linking goes
05:16:18tarcierioh right, it's not a digraph, it's a graph
05:16:19tarcierimy bad
05:16:26MenTaLguYlink_notify just does half the link though
05:16:36tarcierierr, #notify_link?
05:16:38tarcieriheh
05:16:39MenTaLguYsince each of the two participants is responsible for their own link table
05:16:41MenTaLguYer, yeah
05:16:43MenTaLguYnotify_link
05:17:06MenTaLguYas far as exit messages sent to the system mailbox, could you elaborate?
05:17:24tarcieriwell, here's the problem I forsee now
05:18:05tarcieriif you follow Erlang ! semantics, sending a message to a process that has already exited it doesn't raise any error... what about linking to a process that's exited?
05:18:07tarcieritests...
05:18:26MenTaLguYlinking to an exited process will error if it is a local actor
05:18:31MenTaLguYit will fail silently for a remote actor
05:18:33MenTaLguYIIRC
05:18:54tarcieriyeah, it certainly fails in the local case...
05:18:56MenTaLguYIMO linking to a dead actor should be an error whenever it is possible to do so
05:19:01tarcieriyeah
05:19:18d2dchat leaves the room.
05:19:21tarcieriI have Actor#dead? by the way...
05:19:33rueI hate it when that happens on IMDB
05:19:41tarcieriheh
05:20:01MenTaLguYtarcieri: Yeah, I'm relying on #notify_link to raise an exception if the actor is dead
05:20:26tarcieriI also have ActorError for Actor-related exceptions
05:20:31MenTaLguYtarcieri: hence the "local" notify_link was done after the remote one in my implementation of Actor#link given above
05:20:41MenTaLguYas do I, I think
05:20:45tarcieriCool
05:20:57MenTaLguYit's not the _same_ ActorError though I guess
05:21:01tarcieriwell, I'll make Actor#notify_link raise that if you attempt ot link to a dead Actor...
05:21:06MenTaLguYI'm not sure if that's an issue
05:21:08MenTaLguYyet
05:21:24sudoer leaves the room.
05:21:27MenTaLguYyes, do that for now
05:21:37MenTaLguYactually I think I have a DeadActorError subclass
05:21:46MenTaLguY(it's been so long since I've looked at the omnibus actor stuff :/)
05:21:50tarcieriheh
05:22:08tarcierido you raise an error if you send a message to a dead actor?
05:22:27tarcieriI don't
05:22:33MenTaLguYI don't think I do either
05:22:44tarcieriit just goes into a black hole
05:23:04MenTaLguYI think in mine it still gets enqueued, that's probably not desirable
05:23:10MenTaLguYsince the queue will never get emptied
05:23:25MenTaLguY(not that the distinction is visible to user code)
05:23:39MenTaLguYI should blackhole the mailbox on actor death
05:23:46tarcierimy Actor#<< checks if the recipient is dead and just returns if it is
05:23:54MenTaLguYI think that's as it should be
05:24:32MenTaLguYI'm starting to wonder if we should have a gem which provides the basic actor protocol stuff
05:24:37MenTaLguYbasic exception classes and things
05:24:39MenTaLguYthat we can all use
05:24:46tarcierisure
05:24:51MenTaLguYit would be nice if everyone had the same ActorError
05:24:56tarcieriyeah
05:25:08tarcierimine's class ActorError < StandardError; end
05:26:28MenTaLguYokay, I just released case-0.4 with the changes we discussed
05:26:33MenTaLguYincluding adding case/core
05:26:35tarciericool
05:28:06tarcierihmm, guess I'll hope that the dispatching of system messages doesn't kill an Actor before it's able to process the link message
05:28:35MenTaLguYdon't worry about it for now
05:28:49MenTaLguYjust make sure that notify_unlink and notify_exit can't kill the caller :)
05:28:54tarcieriheh
05:28:59tarcieriyeah that too
05:29:15tarcierianothe reason why sending messages to dead actors should silently fail
05:29:33dewd enters the room.
05:29:34tarcieriit all comes down to cases where you'd have to handle errors during error handling
05:29:42tarcieriand that just gets stupid
05:29:53jtoy enters the room.
05:30:02tarcieriif you're trying to notify another actor an error occured and that actor is dead, give up
05:30:15MenTaLguYI'm pretty chuffed about the prospect of having a standard actor object protocol
05:30:21tarcieriyeah
05:30:23tarcierithat'd be sweet
05:30:28MenTaLguYI was trying to make the omnibus stuff totally general, but it really messed up the library IMO
05:30:37tarcieriespecially if it could be implemented on top of DRb
05:30:39MenTaLguYa lot of the complexity you commented on was from that
05:30:45MenTaLguYand it's not needed really
05:31:01MenTaLguYwe can just have different libraries implementing the same object protocol for different uses
05:31:11tarcieriyeah
05:31:24MenTaLguYoh, by protocol I mean in the Smalltalk sense
05:31:30tarcieriI mean, I'm going to start moving my peer-to-peer thingy to Revactor tonight
05:31:32MenTaLguYakin to Java interfaces
05:31:37tarcieriand I want to run that on top of Ruby 1.9 now
05:31:47tarcieribut umm, down the road Rubinius is certainly my target
05:31:53MenTaLguYnods
05:33:22MenTaLguYargh, what's the -S equivalent for shotgun?
05:33:28MenTaLguYI'm suddenly drawing a mental blank
05:33:52boyscout1 commit by Adam Gardiner
05:33:52boyscout * Fix Task#get_stack_value to not raise exception from primitive; 41f07f0
05:34:53MenTaLguYnever mind
05:36:35MenTaLguYtarcieri: thanks for picking up the actor stuff btw, I think I would have let it rot for quite some time otherwise
05:37:12MenTaLguYnow I don't feel so guilty :)
05:38:02boyscout2 commits by MenTaLguY
05:38:03boyscout * rebuild stable with Tuple#===; 73b4264
05:38:04boyscout * structural Tuple#===; e23c72b
05:40:19tmornini leaves the room.
05:40:32tarcieriMenTaLguY: heh, well hopefully I can actually build some useful stuff on top of it
05:41:55jtoy leaves the room.
05:44:06rueAargh this damn splatting and unsplatting is driving me nuts
05:45:54MenTaLguYtarcieri: hm, so do you have any other actor errors besides dead actors?
05:46:14MenTaLguYtarcieri: it seems in Concurrent, I only had DeadActorError rather than a general ActorError
05:48:21squeegy leaves the room.
05:48:44tarcieriyeah, but you probably have it implemented so you don't encounter them
05:48:49rubuildiusMenTaLguY: 73b4264b6; 4451 examples, 16651 expectations, 71 failures, 2 errors; http://rafb.net/p/PEZnZP95.html
05:48:49rubuildiusAdam Gardiner: 41f07f025; 4451 examples, 16798 expectations, 0 failures, 0 errors
05:49:02kofno leaves the room.
05:49:14tarcieriI raise ActorError if Actor.current is called outside "Actor world" :/
05:49:28MenTaLguYI see
05:49:45MenTaLguYlet's just define DeadActorError in the protocol then
05:49:53tarcieriok
05:50:12tarcierias a subclass of ActorError?
05:50:22tarcierior do you not have an ActorError...
05:50:26MenTaLguYdunno, we'd need to include ActorError in the protocol then too
05:50:30MenTaLguYno, I don't actually at the moment
05:50:34tarcieriok
05:50:53MenTaLguYI think I'll need to sleep on the exceptions-in-the-protocol thing
05:50:59tarcieriheh
05:51:21MenTaLguYsomething else I'm pondering is to have an (entirely abstract) module which an actor class can include to assert that it implements the protocol
05:51:21tarcieriyeah, I mean, it's already a problem for Rubinius
05:51:44MenTaLguYnot really, I can do whatever to accomodate Rubinius
05:52:06tarcieriwell, right now at least you can't serialize/unserialize an exception across VMs
05:53:29MenTaLguYthat actually raises a general question
05:53:43MenTaLguYin terms of sending inter-VM messages, if you send something that doesn't serialize, who gets the resulting exception?
05:53:54ruebrixen: Hm, semantics of #platform are a bit weird
05:54:26drbrainMenTaLguY: in DRb, if it can't be serialized, the sender gets the error
05:54:39drbrainand if it can't be unserialized, the reciever gets the error
05:54:42tarcierithat'd make the most sense
05:54:46drbrainI don't know if you have the latter issue
05:54:50tarcieriyes
05:54:54tarcieridefinitely
05:55:38drbrainso, it would be up to the application to define what needs to happen when those things happen
05:55:56d2dchat enters the room.
05:56:03MenTaLguYyeah, the main thing is I guess the receive loop needs to be prepared for stuff that doesn't unserialize
05:56:17tarcieriyeah
05:56:35tarcieriin the inter-VM actor stuff I implemented, it'd actually be the thread reading messages off the inter-VM message queue
05:57:05tarcieriI have no idea how evan handles that...
05:58:30unagi-san leaves the room.
05:58:32tarcierii.e. what happens when a VM receives a mesasge it can't unserialize
05:59:04MenTaLguYI guess ideally the message should be ignored
05:59:14MenTaLguYkilling the VM is probably the other option :P
06:00:16tarcierihaha
06:00:49tarcieriyeah, or at least the Actor that was the intended recipient
06:01:17tarcierithat'd probably be the way to go about it
06:07:11dbussink enters the room.
06:07:47ezmobius enters the room.
06:07:58tongueroo_ enters the room.
06:08:53drbrainyou may want to be able to tell the sender "WTF are you doing?"
06:09:01defunkt enters the room.
06:09:07drbrainor, you may want to load something so you can handle the message
06:10:51tarcieriit'd be great to have ActiveSupport-style const_missing
06:10:52agardinerevan: i'm going to update README_DEVELOPERS to include that primitives should not raise exceptions
06:11:11tarcierithat'd be closer to what Erlang does
06:11:20jtoy enters the room.
06:11:21agardinerbut what is the rationale?
06:11:38drbrainI don't think you need it const_missing at the protocol level
06:11:51tarcieriwell, initially bootstrapping a remote VM, but that can just be done with requires
06:12:58dbussinkagardiner: hmmm, i did just that for fixing regexp
06:13:05drbrainI've never done dynamic loading with DRb, but I have found notification of missing classes useful for debugging
06:13:12MenTaLguYif you can't unserialize the message, you don't know which actor to give it to, I don't think?
06:13:18dbussinkagardiner: or was that the reason for reconsidering?
06:13:33MenTaLguYif you did, it might make sense to give the recipient a special message which contained the unserialized message, I dunno
06:13:35agardineryeah, it exists in a number of primitives, but evan wasn't happy...
06:13:37tarcieriMenTaLguY: well, my inter-VM protocol relied on Tuple, Fixnum, and Symbol
06:13:57tarcieriMenTaLguY: but yeah, I suppose the serialization would gib before you could even get that
06:14:01dbussinkagardiner: ah ok, but what is the way to go to pass an error then?
06:14:25drbrainI'm not sure how many features the actor protocol has compared to DRb protocol
06:14:28dbussinkagardiner: i already had to do something dirty to fix regexp new, because i wanted to extract the error message from onigurama
06:14:50tarcieridrbrain: linking is probably the biggest...
06:15:03agardinerreturn FALSE from the primitive, and raise the exception from Ruby-land in the code immediately following the Ruby.primitive
06:15:20agardineri don't know how you are supposed to pass the error message though...
06:16:09drbrainagardiner: if you need to pass an error message, perhaps the primitive protocol needs to be expanded
06:17:07emphatic enters the room.
06:17:10dbussinkagardiner: but we'll need a way of passing an error message in that case, like drbrain says
06:17:18agardineri agree
06:17:31MenTaLguYprimitives can put arbitrary stuff on the stack right?
06:17:50MenTaLguYseems like users of those primitives can expect an error message on the stack if the result was failure
06:18:04agardineryes, but then the Ruby code following the Ruby.primitive is not executed
06:18:17dbussinkcould return the exception instead of false, maybe that's the way to go
06:18:56agardineri think we need evan to suggest how this should work - i don't know the reasoning for why exceptions should not be raise from the C side
06:19:48tarcieridefinitely need evan to explain handling of non-unserializable messages between VMs
06:19:59agardinerdbussink: you must return FALSE to have the Ruby code executed following the primitive, and if you do return FALSE, you cannot use the stack
06:20:12tarcieriperhaps that could raise an error on the sending VM's side
06:20:55ruePhew.
06:21:51ruePrimitives cannot currently use the stack if they return FALSE
06:22:12rueAh, tarcieri beat me to it
06:22:28agardinerrue: do you know why primitives are not supposed to use cpu_raise*?
06:22:36tim_w enters the room.
06:23:03dbussinkrue agreed in my current implementation of the regexp error handling, so i guess not ;)
06:23:19ruedbussink, agardiner: My suggestion has always been that primitives use normal exception handling semantics instead of the current unintuitive execute-rest-if-fail
06:23:46ruePresumably some technical detail
06:23:49tongueroo leaves the room.
06:25:34agardinerpresumably... be nice to know what it is though, since i got a rap over the knuckles for doing it! :-S
06:26:06rueI never got more than 'no' so I dunno
06:26:16rueHe should be back from boar hunting or wherever soonish
06:27:08boyscout3 commits by Adam Gardiner
06:27:09boyscout * Add support for setting a context iseq directly; 7c4cbfa
06:27:10boyscout * Make cpu_compile_method reuse compiled byte_array; d3990cb
06:27:11boyscout * Fixed set_debugging to allow channels to be cleared; 60ce6ac
06:28:52dbussinkbut i'm off to work, will read up on this discussion later :)
06:30:08headiustarcieri: I can't imagine something that can be serialized but not deserialized would ever be useful, so that sounds like a bug
06:30:28MenTaLguYheadius: well, it all depends on which classes exist at the sending and receiving ends, and how they're defined
06:30:40tarcieriyeah, exactly
06:30:41MenTaLguYheadius: if both ends don't match you won't necessarily be able to deserialize
06:30:43dbussink leaves the room.
06:30:59headiusI mean data that can't ever deserialize...like it's just not catching that it shouldn't be able to serialize
06:31:20headiusobviously if you can't reconstitute the type on the other side it can't deserialize, but that's an application issue
06:31:26tarcieriwhat if you serialize an object whose class is defined in the local VM but not in the remote one?
06:31:44tarcieriparticularly if the remote VM has just been booted and is effectively a blank slate
06:31:53headiusnothing you can do
06:32:03headiusyou need to negotiate known types ahead of time
06:32:05tarcieriin the inter-VM message queue case
06:32:12tarcieriyou can raise an exception in the sender
06:32:34tarcieriwhich can be done entirely with messaging
06:33:01drbrainheadius: have you ever used DRb?
06:33:05headiusthe client has to listen on another message queue then
06:33:08headiusdrb isn't async
06:33:10drbrainheadius: you don't need to negotiate anything
06:33:23headiusdrb is a synchronous RPC call
06:33:31headiuser, RPC.
06:33:34MenTaLguYsure
06:33:49MenTaLguYbut we're talking about an asynchronous message thing built on Marshal
06:33:54tarcieriyeah
06:33:55MenTaLguYa lot of the same considerations apply
06:33:57tarcieriwhat'd really be useful
06:33:59headiusyes
06:34:10headiusdon't serialize stuff that might not exist on the other side
06:34:28headiusthat's why most message queueing systems only allow sending integral types
06:34:30headiusstrings, numbers, maybe lists
06:34:33drbrainI don't see how that's useful
06:34:40tarcieriyeah
06:34:53tarcieriI've wanted a restricted subset of objects for messaging
06:35:07headiusthat's the way this generally gets solved
06:35:22headiusif you want to be able to dump more complex objects you need to do the footwork yourself
06:35:27agardiner leaves the room.
06:35:40tarcierifor now I had VMActor.spawn accept symbols
06:35:57tarcieriWhich effectively feigned the apply() that Erlang's call to a remote node does
06:36:09drbrainif we've got a high-level language, why limit ourselves to such low-level communication?
06:36:26headiusdrbrain: high level communication is built on low-level communication
06:36:41tarcieridrbrain: to avoid precisely these sorts of errors
06:36:43evandrbrain: what happens to DRb when you send an object of a class that the remote side doesn't have?
06:36:48rueHah, I really need to work on these description strings
06:37:01rueheadius: http://pastie.org/141779 bottom is the more interesting part to you
06:37:07headiusyou can certainly build a more robust protocol on top of an async message system
06:37:11drbrainI will double-check
06:37:21tarcierievan: what happens with the inter-VM message queues if the recipient VM can't unserialize the message?
06:37:35headiusbut I'd strongly advise against trying to make the message queue try to do all that for you...build on something simple
06:37:37evancan't happen.
06:37:51evantarcieri: because the sender will get an error
06:37:55tarcieriawesome
06:38:10headiusso it's not async then?
06:38:11tarcieriokay, one less headache to worry about
06:38:12rubuildiusAdam Gardiner: 7c4cbfaf1; 4451 examples, 16651 expectations, 71 failures, 2 errors; http://rafb.net/p/MPyyBi84.html
06:38:27evanheadius: completely async.
06:38:39headiushow can it be completely async and still give an error responds from the sender
06:38:46evanbut because it goes through the VM, ie, using one serialization/unserialization mechanism
06:38:57headiusthat's not async, it's waiting for a result
06:39:05rueUh-oh, that is not good
06:39:16d2dchat leaves the room.
06:39:16evannothing is waiting.
06:39:29rueLike super-not good
06:39:30headiusthat means every message send will wait for the target VM to respond
06:39:41evanheadius: you aren't listening to what i'm saying at all.
06:39:46headiuswell, explain it
06:39:47evani have no clue what you're saying.
06:40:07headiusif the caller tries to serialize an object type that doesn't exist on the target, what happens
06:40:08evanthe sender gives the VM a message
06:40:10evanit returns
06:40:16evanat some time in the future
06:40:24evanthe receiver asks the VM for the message
06:40:26evanand gets it.
06:40:32headiusso it's two async pipes
06:40:41headiusthat's synchronous
06:40:45evanomg.
06:40:51headiusyou ask for the result
06:41:10tarcieriit's only synchronous if the sender blocks waiting for a response
06:41:26tarcieriI think what headius is asking is how does the sender know the recipient can successfully unserialize the message
06:41:41evanbecause the mechanism only supports the basic types currently.
06:42:12MenTaLguYthat's all you needed to say, evan :)
06:42:14mediogre enters the room.
06:42:43tim_w leaves the room.
06:43:28evanatm.
06:43:30evanit's a hack.
06:43:31tarcierithat's certainly fine for now
06:44:03drbraindamn you IPv6
06:44:25evandrbrain: get IPv4 to give it a talking to.
06:46:04headiusheh
06:46:06evanso, we're still having a problem with LongReturnException
06:46:07evanright?
06:46:07headiuswell there you go
06:46:13headiusintegral types
06:47:27headiusmy only point was that if it's asynchronous, you can't know you've send something that can't be received until sometime later
06:47:49MenTaLguYI ... don't think anyone was arguing with that
06:48:00tarcierithe problem is how to deal with that
06:48:01rueI was
06:48:11headiusevan said the sender would get an error
06:48:17headiusit would not...unless it explicitly asked for a result
06:48:31tarcierithe sender gets an error because the sender can only serialize what the recipient can receive
06:48:32headius...or if only integral types could be serialized in the first place
06:48:35evanit gets a serialization error.
06:48:46evanthat has nothing to do with the receiver getting the message
06:48:50tarcieriif the sender can serialize something ther recipient can't receive that will have to be dealt with in the future
06:48:59headiusbecause it's limited to integral types, like I suggested above
06:49:03headiusthat's perfectly fine
06:49:12tarcierithat's definitely the best way to deal with it
06:49:14headiustarcieri: exactly
06:49:30tarcieris/best/most foolproof/
06:49:42headiusso composite types would require more footwork to deal with in an async system, since you would be able to toss stuff on the queue that the receiver might not be able to handle
06:50:11tarcierithe problem with dealing with errors in an async system is there's nothing on the receiver's side that could really handle the error without knowledge of the sender
06:50:33MenTaLguYif we've pushed the problem out to the actor protocol, I'm not sure there's really a huge problem
06:51:00MenTaLguYan un-deserializable message is just one that the receiver isn't filtering for (and will never filter for)
06:51:02headiusthat's fine too...something on top of the queue that negotiates or makes guarantees about available types on either side
06:51:04tarcieriyeah, so long as the message could unserialize to the point you knew the sending actor
06:51:15tarcierithen you could just send an error back to it
06:51:24MenTaLguYso you could safely discard an un-deserializable message
06:51:33evanif you want to support any object
06:51:35headiustarcieri: most message queueing systems I've used can be used such that they will deliver a partial envelope if they can't deliver the whole message
06:51:43tarcieriheadius: yeah
06:51:46evanyou just add a layer on top of the current mechanism
06:51:49rueHEAD is pretty broken here, anyone else check?
06:51:50tarcieriperhaps the solution is a placeholder for unserializable objects
06:51:54ruerubuildius agrees.
06:51:55evanto describe the object in some capacity
06:51:56tarcierierr
06:52:03tarcierinon-unserializable
06:52:08headiusevan: sure, serialize a marshaled dump as a string for example
06:52:08MenTaLguYrue: trying to make sure it's not my fault
06:52:09tarcieriwhatever the proper terminology is there
06:52:10tarcierigarbage
06:52:28headiusyou can do plenty with just integral types
06:52:34tarcieriyes
06:52:47sudoer enters the room.
06:54:16turtletime leaves the room.
06:54:16jtoy leaves the room.
06:54:24drbrainevan: you get a DRb::DRbUnknown object
06:54:32tarcieriyeah
06:54:34tarcierithat makes sense
06:54:35drbrain#<DRb::DRbUnknown:0x1d2630 @buf="\004\bo:\006X\000", @name="X">
06:54:55evandrbrain: gotcha
06:55:05tarcieriif you got that on the other side, then the thread that waits for inter-VM messages could see if the message object couldn't be unserialized
06:55:12evandrb has the concept of intergral types
06:55:20evanthat it layers it's data stream on top of
06:57:19MenTaLguYrue: hm, ci passes for me except for the setpriority spec
06:57:31jbarnette leaves the room.
06:59:14headiusperhaps the build machine choked
07:00:13MenTaLguYtarcieri: released case-0.4 btw, if I forgot to mention earlier
07:00:21tarcieriyeah, I saw, cool
07:01:12rueMenTaLguY: Might be the iseq thing
07:03:31MenTaLguYtarcieri: hm, I just had a perverse idea
07:03:49tarcieriWhat's that?
07:03:59MenTaLguYtarcieri: use omnibus actors (which are per-thread) to communicate between revactor "silos"
07:04:06MenTaLguYor something
07:04:14MenTaLguYactually I see a lot of flaws with the idea
07:04:21tarcierithing about Ruby 1.9 is native threads don't win you jack
07:04:25tarcieribesides high speed I/O :)
07:04:36tarcierithere's the Global VM Lock
07:04:54tarcieriabout the only good that comes of it is doing blocking system calls
07:05:08MenTaLguYthreads still are pre-emptively scheduled however
07:05:24MenTaLguYso you have to think about thread-safety a bit more
07:05:27tarcieriyeah, true enough, but they can only switch when Ruby decides to
07:05:44MenTaLguYrevactor actors aren't actually safe to communicate cross-thread, are they?
07:06:02tarcierinot right now
07:06:14tarcierithe whole thing isn't thread-safe at all
07:06:23MenTaLguYI was thinking maybe using per-thread actors as intermediaries, rather than taking the performance hit to make revactor actors safe for direct cross-thread communication
07:06:32tarcieriyeah definitely
07:06:37headiusthread safe would be slick
07:06:38jtoy enters the room.
07:06:40tarcierithat's certainly what should be done with Rubinius and inter-VM queues
07:07:04tarcieriit's what should've been done with the Erlang SMP scheduler but they have the weight of 100klocs of C code to deal with
07:07:06MenTaLguYI guess pretty much you have a layer of actors for each layer of the scheduling hierarchy
07:07:18headiuscould be done with native threads in JRuby as well, yes?
07:07:39sudoer leaves the room.
07:07:52MenTaLguYheadius: Omnibus actors cover the JRuby case pretty well I think
07:07:57tarcieriJRuby could use a thread pool and Actors would work across mutliple CPU cores per default
07:08:01MenTaLguYheadius: we don't really have a layer lower than Thread there
07:08:23tarcierithat's what Scala does
07:08:35MenTaLguYScala's design actually has some problems
07:08:45MenTaLguYaside from the whole explicit continuations thing
07:09:12MenTaLguYit depends on a heuristic for determining inactive actors that can fail catastrophically under high load
07:09:46MenTaLguY(mainly, if an actor doesn't check in every so often, it's assumed to be blocking, and more threads are spun up)
07:10:07MenTaLguY(but if the actor isn't responding because the system is heavily loaded, spinning up more threads just creates a nasty feedback loop...)
07:10:32MenTaLguYI don't think it's been a huge problem in practice, but those kinds of things keep me up at night :P
07:11:25loincloth enters the room.
07:12:03tarcieriRe/cl
07:12:05tarcierigeh
07:12:28tarcieriI really like the idea of the underlying concurrency primitive that Actors are based on having a purely user context
07:12:30headius leaves the room.
07:12:32MenTaLguYanyway, the JVM is eventually going to have to add support for something like Fibers, although there are a lot of subtle issues that would need to be addressed
07:12:41tarcieriyeah
07:13:01headius enters the room.
07:13:13MenTaLguYI might eventually look into getting into the JSR process for that actually
07:13:19tim_w enters the room.
07:13:25MenTaLguYbut I'm going to need to think about it for another 9 months or so at least
07:13:34MenTaLguYbefore I even have a good idea
07:13:54tarcieriheh
07:14:08MenTaLguYI'm really not kidding, the issues around fibers are a lot harder than I thought
07:14:22MenTaLguYbeen thinking it through heavily since the last Fiber conversation on ruby-core
07:14:45tarcierifor the most part any time I ask about Fibers on ruby-core I receive no response
07:14:47MenTaLguYfibers are nearly what we want, but actually not quite what we want I think
07:14:52tarcierithe only responses I think I've seen were from you
07:14:52tarcieriheh
07:15:12MenTaLguYoh, yes
07:15:12tarcieriyeah, if Fibers were serializable or something
07:15:14tarcierithat'd be awesome
07:15:17MenTaLguYmaybe not the last conversation
07:15:23MenTaLguYbut the last conversation where matz chimed in
07:15:31MenTaLguYwhich was some months ago
07:15:40headius leaves the room.
07:15:42MenTaLguYI mean, last conversation about fibers where matz chimed in
07:15:55MenTaLguYwell, serializable fibers is a whole other thing
07:15:58ezmobius_ enters the room.
07:16:04MenTaLguYI think maybe that'd be the wrong level of abstraction
07:16:07headius enters the room.
07:16:18MenTaLguYthe fiber-like solution does need to be migratable across hardware threads, though
07:16:24tarcieriI think the Erlang SMP scheduler is the wrong level of abstraction
07:16:24MenTaLguYwhich is where an awful lot of subtle issues start to come in
07:16:31tarcieriyes, migration across hardware threads is the important point
07:17:23MenTaLguYthe most basic issue is that, if you migrate a fiber from one thread to another, you have to have a policy in place that the VM can use to determine which fiber to make active instead in the original thread
07:17:32tarcieriin the end you want: a shared heap per CPU, used for message passing (and in Ruby's case much much more), but the ability to load balance Actors across CPUs
07:18:07MenTaLguYand setting up a generally-useful policy framework for fiber scheduling is Hard
07:18:18tarcieriwithout any global locks (beyond the trivial sort used for VM ID lookup)
07:18:22MenTaLguYand then there's the whole thread-local thing we got into
07:18:27tarcieriyeah
07:18:29tarcierithat's a clusterfuck
07:18:49MenTaLguYwhich has sort of convinced me that fibers, as such, are the wrong way to expose the functionality
07:18:53tarcierimaking Threads and Actors play nicely is just... aggrivating
07:19:07tarcierithey're trying to do the same thing in the end
07:19:13MenTaLguYthreads and fibers; actors aren't a big deal per se
07:19:14tarcieriand that's what makes it hard
07:20:04MenTaLguYyes
07:20:38MenTaLguYanyway, when I think I have a rough idea of how something fiber-like could be reasonably done on the JVM I'll blog about it
07:20:52tarciericool
07:21:03headiusman, IO's a pain
07:21:21MenTaLguYI think it might involve something like inside-out fibers
07:21:29headiusboth to spec and to implement
07:21:35MenTaLguYwhere an additional abstraction is introduced to represent hardware threads, onto which one or more Java threads can be mapped
07:21:48MenTaLguYby default we get the existing one hardware thread to one java thread arrangement
07:22:15MenTaLguYbut multiple java threads can be manually "scheduled" on the same hardware thread
07:22:17MenTaLguYsomething along those lines
07:22:32tarcieriso an M:N threading model
07:22:42MenTaLguYnot as that term is normally understood
07:23:00tarcieriwith thread affinity?
07:23:05tarcierior rather, cpu affinity
07:23:20MenTaLguYfor multiple java threads on a single hardware thread, they should not be scheduled pre-emptively with respect to one another
07:23:29tarcieriyeah
07:23:30MenTaLguYthat way lies madness; you basically just end up fighting the OS scheduler's heuristics
07:23:44MenTaLguYand yeah, you may as well add an API for CPU affinity with this
07:23:54MenTaLguYthough that introduces some more issues like memory locality and so forth
07:24:10tarcierithe thing I like about Revactor is it provides some of the same guarantees as having multiple heaps and immutable state
07:24:11MenTaLguYso if we're talking JSR CPU affinity should probably be a separate one
07:24:48tarcierilike any sequence of operations you perform is effectively atomic unless you make a call that calls Actor.receive underneath
07:25:10MenTaLguYthat's a little orthogonal to not having shared state
07:25:38tarcieriat least you're guaranteed the shared state isn't being mutated except between Actor.receive calls
07:25:40MenTaLguYit's really just having very strong serialization guarantees
07:26:39evanI wonder where the JVM puts locks to keep objects from being internally corrupt
07:26:58MenTaLguYit doesn't
07:27:05evanie, if you don't use a Mutex, the JVM doesn't crash because of contention
07:27:30MenTaLguYgenerally speaking it's all memory barriers
07:27:46MenTaLguYat least in terms of programmer-visible Java objects
07:28:00evanhow do the memory barriers make it work?
07:28:13tongueroo_ leaves the room.
07:28:15evanif you write to an object you don't own, you take a global lock or something?
07:28:18evanor a thread lock
07:28:23MenTaLguYno, not at all
07:28:42MenTaLguYI was thinking memory barriers for things like the initialization of final properties
07:28:48MenTaLguYotherwise it doesn't
07:28:51MenTaLguYgenerally speaking
07:29:15MenTaLguYthe bytecode verifier makes sure that you can't do something that would harm the VM
07:29:20evanif 2 threads write to an object at the same time, how does it keep from getting a corrupt object?
07:29:42MenTaLguYit doesn't
07:29:49MenTaLguYand your program may well crash
07:29:53evanso the JVM crashes?
07:29:54MenTaLguYalthough the VM shouldn't
07:29:56MenTaLguYno
07:29:57evanbecause the object is corrupt
07:30:28MenTaLguYthe VM can't crash because of that though
07:30:37MenTaLguY(assuming no bugs in the VM...)
07:31:16evanhow come?
07:31:46MenTaLguYbecause user code can't touch VM internals?
07:31:50headiusclass and object metadata is made safe
07:31:57MenTaLguYall user code can do is screw itself up
07:31:59headiusbut object fields and whatnot are just normal in-memory data
07:32:20headiusthe worse you'd get is an exception
07:32:31evanso, say, setting a field in an object is an atomic operation?
07:32:35headiusnope
07:32:45MenTaLguYnot atomic in the normal concurrency sense
07:32:49headiusand long fields, for example, require two operations
07:32:55headiustwo 32-bit slots
07:32:59MenTaLguYbut there's no possible operation that will result in an invalid reference
07:33:03evanhow do you not get corrupt objects then?
07:33:10MenTaLguYyou do end up with corrupt objects
07:33:17MenTaLguYjust nothing that violates VM invariants
07:33:21headiusyou don't end up with objects corrupted as far as the VM is concerned
07:33:34evanhm. ok.
07:33:53MenTaLguYall the VM needs to ensure is that whatever you do you can't do something to an object that results in a reference property pointing to an invalid object
07:34:20evantrue, true.
07:34:21evanhm...
07:34:21MenTaLguYwhich is generally pretty easy as references are word-sized and word-sized stores are "atomic" inasmuch as the have "all-or-nothing" visibility to particula reads
07:34:23headiusan in general it's impossible to get such an object in bytecode
07:34:29evanwell, that's good news
07:34:41evanbecause that means, when the time comes, it will be easier to get native thread support into rubinius
07:34:48headiusplus there's a verification phase that guarantees you're not shoving an int into a reference or something
07:35:02headiusthat's part of the startup hit, it verifies bytecode on startup
07:35:03evansince it should be easy to keep that invariant as well
07:35:09tongueroo enters the room.
07:35:10headiusto guarantee it can't do illegal things
07:35:12evansince, like java, we'd field based at the base.
07:35:25evaner. we're field based.
07:36:45headiuswhere you may have more trouble is areas the JVM disallows things Ruby allows
07:36:56headiuslike calling instance methods during object construction
07:37:04MenTaLguYyes
07:37:14MenTaLguYwell, the JVM doesn't disallow that strictly
07:37:23MenTaLguYit's just, how you say... strongly discouraged
07:37:23evanbytecode verification is mainly making sure that indexes into the constant array are ok
07:37:27evanyes?
07:37:27headiusthe verifier doesn't allow it
07:37:29headiusit will catch it
07:37:42headiusor the javac compiler, I forget which
07:37:56MenTaLguYheadius: hm, I think you can still "escape" a reference to the object from its constructor though
07:38:04MenTaLguYheadius: at which point some bets are off
07:38:06headiusevan: that and a lot more
07:38:19MenTaLguYheadius: still nothing that can crash a VM, but you can get final fields with inconsistent values
07:38:40MenTaLguYevan: the verifier basically does a "proof-of-safety"
07:38:47headiusremember it's also verifying types are as expected, stack depths are consistent for all paths through a method, explicitly scoped variables are controlled
07:39:14headiusverifier also does some early footwork to determine where frame boundaries are necessary
07:39:28headiuslike for entering try/catch sections and such
07:39:44MenTaLguYheadius: the "escape" issue was why I asked about whether initialize was called from the Java constructor or not (if it had been, we'd have a major issue since it is fairly common practice in Ruby to assign references to self from intiialize)
07:40:39MenTaLguYRubinius has things easier in some ways
07:40:57MenTaLguYthan it might
07:41:02evanyeah
07:41:05MenTaLguYsince in Ruby, everything is an object reference
07:41:15MenTaLguYso you don't have quite the same concerns about validity
07:41:23headiusinitialize definitely isn't called from Java constructor
07:41:29headiusinitialize is more akin to allocate
07:41:30evanmore dynamic means less verification.
07:41:31headiuser
07:41:54MenTaLguYheadius: yes, you had answered my question at the time :)
07:41:58headiusI mean constructor is more akin to allocator
07:41:59headiusok
07:42:19headius leaves the room.
07:42:26MenTaLguYanyway, the main thing is you just need to disallow anything that could create an object reference from "whole cloth"
07:42:35MenTaLguYwithout checking in with the GC first
07:42:39headius enters the room.
07:43:02MenTaLguY(well, ideally it should not allow creating an object reference from "whole cloth" altogether, but then there's id2ref...)
07:43:03evanthats pretty easy
07:43:30evanSET_FIELD right now compiled into the same as setting a word in a struct
07:43:36evanthen calling the write barrier function
07:43:44headiusmore dynamic also means less information
07:44:07MenTaLguYa lot of the security proofs the JVM doesn won't be possible for Rubinius
07:44:17emphatic leaves the room.
07:44:38emphatic enters the room.
07:44:43MenTaLguYyeah, you probably don't actually want a write barrier for every SET_FIELD though
07:44:46MenTaLguYnot good for performance
07:45:07headiusyou can always look at the hotspot source
07:45:09MenTaLguYas long as your writes are word-sized and you're writing valid, aligned, values, you should be okay
07:45:10evanthe problem is knowing when you don't need it.
07:45:26headiusit's extensive, but it's very clean C++
07:45:32headiusextensively commented
07:45:42pkondzior enters the room.
07:45:45MenTaLguYwell, basically if you want decent performance you will need to have barriers only when requested
07:45:56MenTaLguYand a decent memory model
07:45:58evanopenjdk made my eyes bleed.
07:47:05MenTaLguYfor the JVM, declaring a field volatile is how you get read/write barriers for it
07:47:25MenTaLguYthere are pros/cons to doing that versus having explicitly requested read/write barriers for individual operations instead
07:47:35evanthe write barrier is for keeping the GC sane.
07:47:42evani don't see how you could not run it all the time.
07:48:03MenTaLguYah, well, quiescing threads so that the GC sees a sane picture is a whole other matter
07:48:13headiusthat gets into the black arts
07:48:17MenTaLguYthe JVM runs things a lot looser generally
07:48:31MenTaLguYthings are put into "safe points" only when the GC needs to inspect
07:49:03MenTaLguYotherwise it's a party in a can
07:49:50MenTaLguYand yes, as charlie says, there are some dark arts involved
07:50:53headiusI met the JVM guys behind the concurrent mark-sweep collector
07:51:09headiusmost of them have long white beards and wild eyes
07:52:09headiusentertaining guys though...when I described various complications I was having with the JVM memory model, they started suggesting C++ code I could write to fix it
07:52:47MenTaLguYevan: for your own purposes, probably you want to look at something simpler to start -- a stop-the-world collector which stops all but the collecting thread at safe points
07:52:52headiusstop the world m/s would be more than fine
07:53:19tarcieriwith MVM stop-the-world is just stop-the-VM too :)
07:53:24headiusor finding a way to reuse someone else's black arts
07:53:40headiustarcieri: not if the heap is allocated in chunks
07:53:42MenTaLguYonce all the threads are stopped at safe points, they will have flushed all their writes, so the GC can see a consistent picture
07:53:44headiusthey can collect independently
07:53:54MenTaLguYheadius: I think that's what he meant?
07:54:00headiusoh ok :)
07:54:06tarcieriheh
07:54:36tarcieriErlang
07:54:37tarcierigeh
07:54:50tarcieriErlang's garbage collector has a problem if you enable the SMP scheduler and the shared heap
07:54:55headiusok, I need to get these jruby changes committed
07:54:58tarcierigarbage collecting the shared heap does stop the world
07:55:06headiusI think I'm starting to climb out of IO hell now
07:55:14MenTaLguYwell hopefully we can do better here
07:55:16tarcieris/shared heap/hybrid heap/
07:55:28tarcieriyeah
07:55:30headiustomorrow I start reading through each IO method I haven't already studied and rewriting our versions
07:55:47headiusI will continue writing up textual specs and try to put some specs together soon
07:56:02_emphatic enters the room.
07:56:26emphatic leaves the room.
07:57:29headiusIO is going to be a serious pain to spec out completely
07:57:36MenTaLguYtarcieri: thinking about it more, I definitely think having per-thread actors for communicating between different revactor threads is the way to go; limit fiber-based actors to only communicate with other actors in their thread (including the local thread-based actor)
07:57:47MenTaLguYtarcieri: and the per-thread actors can communicate with one another
07:58:14headiusrue: does mspec report guarded specs as failures yet?
07:58:27MenTaLguYtarcieri: you may be able to hide that behind the scenes as far as having inter-thread fiber-actor messages routed through thread-actors
07:58:53tarcieriMenTaLguY: I just want Actors running on multiple VMs that can communicate over high-speed message queues
07:59:01rueheadius: No, almost done though
07:59:12headiusok
07:59:12rueAs you can see the spec wording needed some work
07:59:25headiussure
07:59:37headiusthe rest of IO is going to be pretty harsh
08:00:15tarcieriMenTaLguY: you can start up a set of registered services on each VM, multicall the service on each VM, and reduce the response
08:01:23tarcieriI think you're pretty much SOL in Ruby without MVM
08:02:08tarcieriJRuby could do a thread pool like Scala, but that's pretty much it (and suffers from whatever problems you mentioned, apparently)
08:02:28headiusJRuby has had MVM for quite a while
08:02:31headiusMVM doesn't solve anything though
08:02:50headiussame issues apply...if a VM goes away into la-la land, it's pretty hard to get it back
08:02:55tarcieriat least in the case of Rubinius, it solves having a (nearly) lock-free way to scale across CPUs
08:03:00crafterm leaves the room.
08:03:28tarcierithe whole N times faster on N CPUs schtick
08:03:33headiussame logic will work in JRuby then
08:03:42tarcieriyeah
08:03:46headiusrequire 'jruby'; ruby = org.jruby.Ruby.new_instance
08:03:48headiusthat's about it
08:03:57tarcierican you send messages between VMs?
08:04:04tarcieriin a quasi-sane way?
08:04:17tarcierilike avoiding the network stack if at all possible
08:04:32headiusthere's nothing explicit right now...but you can do anything you could do from Java code
08:04:47headiusit's just another object
08:04:47gnufied leaves the room.
08:05:02gnufied enters the room.
08:05:20tongueroo leaves the room.
08:05:22tarcieriwell, I hardly remember Java anymore but I don't think you have anything better than TCP sockets to go with
08:05:36headiusthey can share threads also...i.e. if you call from one VM to another with the same thread, it will know which VM's objects it's manipulating for any given call
08:05:44headiuslike I say, they're just objects
08:05:54tarcieriVMs can share objects?
08:05:57headiusyou want to implement a message queue, construct one and they can both use it
08:06:00MenTaLguYthreads can share VMs
08:06:06tarcieri*boggle*
08:06:08headiusand VMs can share threads
08:06:09pkondzior leaves the room.
08:06:29tarcieriI find that concept strangely unsettling
08:06:35headiusnot at all
08:06:40tarcieriIf you say so
08:06:41tarcieriHeh
08:06:44tarcieriI'd have to try it out
08:06:45pkondzior enters the room.
08:06:50contextheadius: its just like watching two people drive a car at high scpeeds
08:06:50boyscout1 commit by Evan Phoenix
08:06:51boyscout * Fix double free(); 3ce36dd
08:06:54context.. amusing ..
08:06:55context;)
08:07:01headiuscontext: not quite
08:07:38tarcieriJava used to be such a strong advocate of immutable state
08:07:41tarcieriWhat happened? :/
08:07:44headiusfor what you're doing you'd just want to spin it up in another thread and hook it up to whatever message passing logic you like
08:08:14headiusimagine it like this...if in rubinius anything written in C you could call directly from Ruby
08:08:16headiusthat's JRuby
08:08:31headiusso obviously there's nothing you can't do
08:08:35MenTaLguYput another way, a thread can only be "in" one VM at a time, by nature
08:08:35tarcieriyeah, that part's definitely cool
08:08:35headiusand a lot you shouldn't
08:08:55headiusMenTaLguY: yeah, that's more clear
08:08:58MenTaLguYeven if it is shared by multiple VMs (in terms of being "bound" and having a java.lang.Thread identies in each of them)
08:09:00tarcieriMenTaLguY: do you explicitly send it to another thread, or is that magic?
08:09:13tarcieris/thread/VM/
08:10:04MenTaLguYyou don't send it from outside
08:10:16MenTaLguYit has an object representing the other VM which it calls a method on to "enter"
08:10:20MenTaLguYvery loosely speaking
08:11:01headiusyes
08:11:02MenTaLguYfrom that stack frame in, stuff is happening in that other VM
08:11:04headiusit's just another object
08:11:22MenTaLguYnot too different from the way the JRuby VM is embedded in the Java one as an object, which was the example Charlie was working up to
08:11:26tarcieriMenTaLguY: so in the linking API...
08:11:32tarcieriActor#trap_exit= ?
08:12:18MenTaLguYtarcieri: I guess. I think that's what I did in Concurrent
08:12:33tarciericool
08:12:50TheVoice leaves the room.
08:13:10MenTaLguYthere are actually some subtle issues with that which I haven't worked out yet though
08:13:12evanwtf.
08:13:17MenTaLguYrace conditions about the arrival of exit messages
08:13:22evananyone seeing CI failures?
08:13:46MenTaLguYevan: buildbot's been seeing them on and off, but I've not been able to replicate them locally, and I don't think the buildbot's been reporting them consistently :/
08:13:53evank
08:13:54drbrainI got a sigbus...
08:14:31MenTaLguYtarcieri: thinking back, before I got distracted with other things, trap_exit was the last thing I was working on, I think
08:14:35drbrain... and it was a fluke
08:15:08MenTaLguYtarcieri: generally speaking it's not actually safe to do anything with trap_exit while you're linked to another actor
08:15:35MenTaLguYsince you don't know when an exit signal might come in and kill you (or not kill you, if killing was what you wanted)
08:16:01MenTaLguYtarcieri: so I was looking for a variation on exit trapping that wasn't so prone to races
08:16:17tarcieriMenTaLguY: well, I do, since I know I won't do any message processing until the next call to Actor.receive...
08:16:53tarcieriThe whole coroutine approach gets rid of a lot of those sort of conditions
08:16:56MenTaLguYit's not so much the message processing as other actors sending
08:17:06MenTaLguYbut yes, I think I understand why Erlang did that
08:17:09tarcieriNo other Actor can send while the current process is running
08:17:14MenTaLguYthey started out with the coroutine thing
08:17:15tarcieris/process/Actor/
08:17:30MenTaLguYyeah, I guess it is fine for what you're doing
08:17:39tarcieriyeah, but they can safely preempt due to segmented heaps and immutable state
08:17:57MenTaLguYwell, actually they still don't escape the problem completely
08:18:09MenTaLguYnot sharing mutable state isn't ultimate protection against races
08:18:12evanshit
08:18:14rubuildiusEvan Phoenix: 3ce36ddbe; 4451 examples, 16651 expectations, 71 failures, 2 errors; http://rafb.net/p/7bh0s647.html
08:18:16evani'm seeing lots of CI failures.
08:18:19evanand so is rubuildius
08:18:22evansweet.
08:18:23evan:P
08:18:33jbarnette enters the room.
08:18:35MenTaLguYwell, if you're seeing them then you can replicate them and see what's going on :/
08:18:42MenTaLguYI've not been having much luck
08:21:20rueYes, HEAD broke sometime in the last 5 hours. I am pretty sure it is the iseq change but I have not gotten around to looking into it.
08:21:34MenTaLguYlet me make sure I've got a clean build
08:21:40rueI am going to bed.
08:22:19MenTaLguYwhat's weird is stuff like:
08:22:19MenTaLguY(12:48:48 AM) rubuildius: MenTaLguY: 73b4264b6; 4451 examples, 16651 expectations, 71 failures, 2 errors; http://rafb.net/p/PEZnZP95.html
08:22:19MenTaLguY(12:48:49 AM) rubuildius: Adam Gardiner: 41f07f025; 4451 examples, 16798 expectations, 0 failures, 0 errors
08:22:22thehcdreamer enters the room.
08:22:24MenTaLguYand then the next commit failed again
08:23:09rueevan: Need to figure out the correct way to pass the "exceptions" up from primitives unless you have a plan in place.
08:23:41rueevan: Also, if you can briefly summarise why it is bad/not possible to directly raise from primitives for posterity, it would be helpful
08:23:44rueNight.
08:27:04MenTaLguY'night
08:27:59evanMenTaLguY: it was you
08:28:04evanyou updated stable.
08:28:07MenTaLguYahhh
08:28:12MenTaLguYun-'night
08:28:20evanit's fine.
08:28:31evani need to figure out why the new stables are blowing things up
08:28:35evanit's because of LongReturnError
08:28:53MenTaLguYhm
08:29:17MenTaLguYWish it were more consistent
08:29:22MenTaLguYci passed for me again :/
08:29:47MenTaLguYI'll let you work it out then
08:30:20MenTaLguYas long as it wasn't my Tuple#=== core change which is the reason I rebuilt stable I'll go get some sleep
08:30:58MenTaLguY'night
08:31:34pkondzior leaves the room.
08:35:48evanwe need better guidelines on when to update stable
08:35:54evanmentalguy did it for exactly the wrong reazon.
08:35:57evanreason
08:37:00octopod enters the room.
08:39:23obvio_ enters the room.
08:39:46obvio171 leaves the room.
08:41:07jessop enters the room.
08:42:03shingararubinius can work with windows or not now ?
08:42:08evannot currently, no.
08:42:11evaneventually it will
08:42:17evanbut we've had no windows people help out yet.
08:42:26shingaraI understand
08:42:46shingaraI don't know windows too, I use only with my job :(
08:43:14ezmobius leaves the room.
08:43:26evanah
08:45:09zimbatm enters the room.
08:47:02evanbingo.
08:47:06evanfound the LRE problem.
08:48:13drbrainLRE?
08:48:18evanLongReturnException
08:48:36evanthe reason kernel is being running badly when compiled with stable.
08:50:27drbrainhttp://flickr.com/photos/drbrain/2211092461/
08:50:30drbrainbunny!
08:50:31zimbatmhi ppl !
08:50:34ragge leaves the room.
08:50:57evandrbrain: dinner!
08:51:21drbrainmaybe for one
08:53:00drbrainhttp://flickr.com/photos/drbrain/2211073559/
08:53:05drbrainmore bunny!
08:53:33drbrainalso, bunny stew pot: http://flickr.com/photos/drbrain/2211859170/
08:54:04evandrbrain: where was that?
08:54:21drbrainArches National Park
08:54:37evannice
08:54:39evanarches rocks.
08:55:08drbrainif you go, you must, must, must do the firey furnace tour
08:57:13drbrainfiery
08:57:15tarcieriheh
08:57:19tarcierithat's a fun place to get lost
08:57:21evani've been a few times.
08:57:23drbrainhttp://www.nps.gov/arch/planyourvisit/programs.htm
08:59:52drbraintarcieri: next time I'm going to get lost back there for sure
09:01:58drbrainI need to see if I can make better iPhoto tools
09:03:14obvio_ leaves the room.
09:04:35evanbollocks. how to fix this....
09:05:07evanLRE's are terminating too early
09:05:10evanheadius: you around?
09:05:22headiusjust barely
09:05:27evanok
09:05:30evanreal fast
09:05:35headiusvisions of file descriptors dancing in my head
09:05:49evantwo { return 1 }
09:06:18evaner.
09:06:35headiustwo!
09:06:46evanok
09:06:52evaneql? calls each_with_index with a block.
09:06:56evanand does a return in that block
09:07:03evanwhich should cause eql? to return
09:07:09headiusok
09:07:12evaneach_with_index calls each with a block
09:07:17evancalling yield inside it
09:07:34evanso the blocks are nested.
09:07:42headiusI see where you're going
09:07:57headiushow do you make it bubble out to the right height?
09:08:05evanthe return gets caught by each, rather than by each_with_index
09:08:07evanyes
09:08:22headiusit's easy...store the target method context in the jump
09:08:29headiuscompare it at each step
09:08:44evanthe name of the method?
09:08:49headiusI don't know how you would do that in Ruby code, but that's how it's done in JRuby
09:08:50drbrainmore like catch/throw
09:08:58evanok.
09:09:02evanwhat a bother.
09:09:06headiusactually, we store a reference to the method itself
09:09:22headiusor rather, the activation
09:09:29headiusbut that's not necessary
09:09:37headiuseach activation just needs a unique target
09:09:50evanactually
09:09:52evanthe context is easier.
09:10:08headiusyes
09:10:16evanlet me think....
09:10:20headiusthe block will execute inside the method's context, right? so just get the context and use that as the target
09:10:28evanyeah
09:10:38evani think i'll need a push_home_context instruction
09:10:47evani'll do it with methods for now.
09:11:10evani KNEW my implementation was too easy.
09:11:11evan:)
09:11:18headiusheheh
09:11:28headiuswell, at least it's not hard to repair this way
09:11:48evanyep.
09:11:48headiusruby does something similar I believe since iternode wraps calls
09:11:59headiusiter evaluation checks whether it's supposed to come back "here" or not
09:12:05evanaah
09:12:10evani was looking at that code
09:12:12jbarnette leaves the room.
09:12:15evanperhaps thats what I was seeing
09:12:19evani didn't grok it
09:12:19headiusright
09:12:49headiuswe just ditched that by having the target on the frame
09:12:56headiusbefore we had to visit returns and such to have them point at the right containing iter
09:12:56Arjen_ enters the room.
09:13:08headiusI think MRI does something similar still
09:13:46headiusit's still on my to-do list to actually use the frame as the jump target
09:13:52headiusartificial target right now
09:14:37evansweet.
09:14:40evani can do this all in ruby
09:14:47evanno compiler changes
09:14:58evanjust change LongReturnException.=== to check the target
09:15:05evanand save the target when I create one
09:15:27headiuseventually to be something lower-level I hope
09:15:40headiusthat's going to be super expensive for blocks passed deep into a call chain
09:16:43headiusin jruby the target gets checked only in calls that have blocks, since those are the only ones that could reasonable generate a return jump targeted at the current method
09:17:08evancourse
09:17:11headiustry { call } catch (ReturnJump rj) { if rj.getTarget == context.currentFrame() ... }
09:17:12evanthats what happens now for rubinius
09:17:20evanthe only time this is run is if a call has a block attached.
09:17:28headiusok
09:17:43crafterm enters the room.
09:17:51headiusfor us it's also a reference comparison too...so hopefully you can eliminate the === check at some point
09:18:22evanhm.
09:18:29evani could use the equal and kind_of instructions.
09:18:32headiusthe slowest part for us is the Java exception-handling logic
09:19:10headiustime for me to go though
09:19:25evanlaters
09:19:59jessop leaves the room.
09:24:13headius leaves the room.
09:24:28jessop enters the room.
09:33:11ezmobius leaves the room.
09:37:06jessop leaves the room.
09:44:13hornbeck leaves the room.
09:46:19boyscout1 commit by Jeremy Roach
09:46:20boyscout * implement more of Marshal.load; 7b4ef13
09:54:02ragge enters the room.
09:56:06Fullmoon enters the room.
09:57:00dodecaphonic enters the room.
09:58:17rubuildiusJeremy Roach: 7b4ef1344; 4464 examples, 16665 expectations, 71 failures, 2 errors; http://rafb.net/p/vLsNeF74.html
10:03:04loincloth leaves the room.
10:04:37VVSiz leaves the room.
10:05:31zimbatmwhere do these failures come from ?
10:08:32boyscout1 commit by Jonas Pfenniger
10:08:33boyscout * new Module#name benchmark.; 91e4b80
10:08:34dodecaphonic leaves the room.
10:09:07headius enters the room.
10:11:27_emphatic leaves the room.
10:12:39emphatic enters the room.
10:13:39jtoy leaves the room.
10:14:43zimbatm73b4264b62be7484d3ed8efe58081d605ba7c598 seems to be the culprit
10:18:06rubuildiusJonas Pfenniger: 91e4b8063; 4465 examples, 16675 expectations, 67 failures, 2 errors; http://rafb.net/p/lf7qWO70.html
10:21:56VVSiz enters the room.
10:25:51zimbatmare there some good tricks to debug a "field of non-reference" ?
10:31:15headius leaves the room.
10:44:28wycats leaves the room.
10:51:30crafterm leaves the room.
10:54:27pkondzior enters the room.
11:36:28agardiner enters the room.
11:41:20scoopr leaves the room.
11:52:30boyscout1 commit by Adam Gardiner
11:52:31boyscout * Fix implicit declaration warning for module_set_const; ce1e2ab
11:57:50kofno enters the room.
12:03:06rubuildiusAdam Gardiner: ce1e2ab89; 4465 examples, 16675 expectations, 67 failures, 2 errors; http://rafb.net/p/dq1xdu65.html
12:09:35emphatic leaves the room.
12:23:00ragge leaves the room.
12:30:53radarek enters the room.
12:38:50agardiner leaves the room.
12:50:01ctennis enters the room.
13:06:56scoopr enters the room.
13:29:23gnufied leaves the room.
13:29:58skaar leaves the room.
13:32:56ragge enters the room.
13:34:28mad_phoenix enters the room.
13:37:14smartocci enters the room.
13:41:31octopod leaves the room.
13:45:20mad_phoenix leaves the room.
13:47:23crafterm enters the room.
13:48:46turtletime enters the room.
13:49:20pd leaves the room.
13:50:52Arjen_ leaves the room.
13:57:41jtoy enters the room.
14:05:46brainopia enters the room.
14:15:19dysinger leaves the room.
14:21:21Arjen_ enters the room.
14:24:47mad_phoenix enters the room.
14:32:41djwhitt enters the room.
14:33:24skaar enters the room.
14:39:46moofbong enters the room.
14:45:28wmoxam enters the room.
14:47:59Arjen_ leaves the room.
14:49:03crafterm leaves the room.
14:56:17ttmrichter enters the room.
15:00:53mad_phoenix leaves the room.
15:02:07mad_phoenix enters the room.
15:02:43Arjen_ enters the room.
15:06:24pate enters the room.
15:17:03twshelton leaves the room.
15:19:43brainopia_ enters the room.
15:22:44binary42 enters the room.
15:24:41_mutle leaves the room.
15:25:47moofbong leaves the room.
15:30:35RyanTM leaves the room.
15:30:48RyanTM_ enters the room.
15:32:20brainopia leaves the room.
15:32:22shafire enters the room.
15:33:46mutle enters the room.
15:37:16daikini enters the room.
15:39:09d2dchat enters the room.
15:41:02nicksieger_ enters the room.
15:42:41nro leaves the room.
15:45:46enebo enters the room.
15:49:01nicksieger leaves the room.
15:54:57moofbong enters the room.
15:58:27GMFlash leaves the room.
15:58:32GMFlash enters the room.
16:03:49pauldix enters the room.
16:09:40dean-ero leaves the room.
16:09:40rue leaves the room.
16:12:47rue enters the room.
16:12:47dean-ero enters the room.
16:13:30brynary_ enters the room.
16:15:25shafire leaves the room.
16:16:07octopod enters the room.
16:26:54headius enters the room.
16:31:09Arjen_ leaves the room.
16:32:41brynary leaves the room.
16:39:17turtletime leaves the room.
16:39:37Arjen_ enters the room.
16:44:34Arjen_ leaves the room.
16:49:07tizianobis enters the room.
16:49:21ragge leaves the room.
16:49:33enebo leaves the room.
16:51:21dbussink enters the room.
16:51:28crayz_ leaves the room.
16:52:46Arjen_ enters the room.
16:53:11tongueroo enters the room.
16:54:18crayz_ enters the room.
16:54:19tongueroo leaves the room.
16:54:37tongueroo enters the room.
16:57:43jtoy leaves the room.
16:58:25jtoy enters the room.
17:00:48tongueroo leaves the room.
17:02:14nro enters the room.
17:02:48tongueroo enters the room.
17:04:08chris2 enters the room.
17:04:08chris2 leaves the room.
17:09:26thehcdreamer leaves the room.
17:09:43pkondzior leaves the room.
17:11:06sudoer enters the room.
17:11:13mad_phoenixis anybody else getting build failures? im getting "dyld: lazy symbol binding failed: Symbol not found: _ev_default_loop"
17:11:18jtoy leaves the room.
17:16:00tizianobis leaves the room.
17:16:42zimbatmmad_phoenix, there are a lot of spec errors and failures since yesterday but the build should work
17:16:59zimbatmtry running `rake distclean` or `rake rebuild`
17:18:56chris2 enters the room.
17:21:13lopex enters the room.
17:25:27mdmurray enters the room.
17:25:57jeremydurham enters the room.
17:31:25joachimm enters the room.
17:32:59jbarnette enters the room.
17:33:36sudoer leaves the room.
17:34:12jtoy enters the room.
17:37:25turtletime enters the room.
17:37:41RyanTM_ leaves the room.
17:37:53RyanTM__ enters the room.
17:39:32joachimm_ leaves the room.
17:43:42mad_phoenixzimbatm: thanks, that worked. kinda seems like the rake tasks for building/cleaning are a bit of a moving target at this point ;)
17:46:29kofno_ enters the room.
17:46:38kofno leaves the room.
17:50:29essoepp enters the room.
17:52:22dgtizedalright so who broke the build?
17:52:36djwhittdon't know
17:52:38dgtizedor at least drastically increased the number of bin/ci errors
17:52:40djwhittI was wondering the same thing
17:52:40Defilerrubuildius needs more finger-pointing
17:53:01Defiler7c4cbfaf1 appears to be the first one that had failures
17:53:11Defilerwait, no. 73b4264b6
17:53:21benny"It was you, commit 73b42... who did all this!"
17:54:02DefilerYeah, 73b4264b6 was a replacement of the stable runtime archives
17:54:05DefilerWhich is risky at best
17:54:32dodecaphonic enters the room.
17:55:17dgtizedhmm, should we just revert the archives?
17:57:07DefilerSeemingly, yeah
17:57:13RyanTM__ leaves the room.
17:57:53RyanTM__ enters the room.
17:57:58boyscout1 commit by Wilson Bilkovich
17:57:59boyscout * Revert "rebuild stable with Tuple#==="; 9074bc1
18:04:33probablycorey enters the room.
18:04:43tarcieriTuple#=== eh?
18:07:20rueMorning
18:08:24rubuildiusWilson Bilkovich: 9074bc1ce; 4465 examples, 16821 expectations, 0 failures, 0 errors
18:10:31dgtizedexcellent
18:11:26VVSiza question about String#to_f recently added spec... it verifies that "-".to_f --> -0.0
18:11:39VVSizJRuby doesn't do that, MRI 1.9 doesn't do that either
18:12:33VVSizand "-" is not really a number indeed :)
18:12:34tarcieriheh negative zero
18:12:38jeremydurhamMRI seems to
18:12:49Arjen_ leaves the room.
18:13:05jeremydurham"-".to_f => -0.01 ... ruby -v => ruby 1.8.6
18:13:12VVSizjeremydurham: only for MRI 1.8.6, bun *not* for MRI 1.9
18:13:13jeremydurhamer .. -0.0 .. you get the idea :)
18:13:40jeremydurhamso it should be wrapped as being 1.8 and rubinius only. non jruby, non 1.9?
18:13:47rueNo
18:14:02VVSizso the rule it seeems that if the value is not understood, then 0.0 is returned. "-" is not understood by Jruby, MRI 1.9
18:14:04rue"-".to_f.class.should == Float
18:14:15rueThat is it
18:14:54probablycorey leaves the room.
18:14:59jeremydurhamIt seems pointless either way. You've seen actually code that does "-".to_f? :)
18:15:36probablycorey enters the room.
18:16:45rueI have seen code that does str.to_f, yes
18:17:54jeremydurhambut didn't you just paste "-".to_f.class.should == Float ... doesn't that say, "-" to_f should be a float, not that any string to f should be a float?
18:19:06jeremydurhamsorry, just being a pain :)
18:19:08VVSizthe actual spec is a bit more complicated: (1.0 / "-".to_f).to_s.should == "-Infinity"
18:19:42rueWhat does IEEE say?
18:20:09ruejeremydurham: If "-".to_f is undefined, it should be specced as such
18:20:59VVSizwell, to me "-" is not a number at all. and to_f should just return 0.0, if the value is not understood
18:21:20brixenwhere are you seeing "-".to_f => -0.0 in rbx?
18:21:28brixenI'm a few behind head, but I get 0.0
18:21:37rueVVSiz: If the value is not understood, it should fail
18:22:03VVSizrue: not in this case. this is from ruby-doc: If there is not a valid number at the start of str, 0.0 is returned.
18:22:19VVSiz"This method never raises an exception."
18:22:26brixenyeah
18:23:00jeremydurhamso, mri returns -0.0, rubinius and jruby return 0.0, which seems to be the same as what the docs suggest. What does 1.9 return?
18:23:21VVSizMRI 1.9 return 0.0
18:23:32rueHm, interesting. "If there is no valid number at the START"
18:23:32jeremydurhamso, where's the problem? :)
18:23:43VVSizI"m not sure about rubinius though. It *was* returning 0.0, but maybe it was changed lately
18:24:25VVSizjeremydurham: problem is in the spec that fails on JRuby, MRI 1.9 and possibly rubinius (but passes on MRI 1.8.6)
18:24:26dbussinkdid evan already come up with a good solution on how to prevent the throwing exceptions in primitives?
18:26:03jeremydurhamVVSiz: so it sounds like that spec should be mri only or removed, and "corrected". It sounds like a bug in MRI 1.8.6; even the docs contradict it.
18:26:34jeremydurhamoh, well, I guess unless you are one of those people who considers - a number ;)
18:26:41VVSizagree. :)
18:26:46evanmorning.
18:27:08brixen"-".to_f == 0.0 => true
18:27:10brixenthat works for me
18:27:13brixenchange the spec to that
18:27:26brixen*works in 1.8.6 p111
18:27:31VVSizOK
18:28:30rueMorning
18:29:14tongueroo_ enters the room.
18:29:18ruedbussink: Dunno, let us find out
18:29:21rueevan: *nudge*
18:29:56evanomg.
18:30:02evanso not happy about the Module#name diff.
18:31:05rueA benchmark?
18:31:06boyscout1 commit by Vladimir Sizikov
18:31:07boyscout * Corrected String#to_f spec.; ef5f448
18:31:15evanthe one that removed the full name calculation from the VM
18:31:21evani see absolutely no reason for that.
18:31:36evani really don't like the whole idea of calculating the name like this at access time.
18:31:46dbussinki know it started with fixing some failing specs
18:31:51probablycorey leaves the room.
18:31:55dbussinkbut you should ask zimbatm about that
18:32:32evanwhy did headius commit it?
18:32:36evandid he do the work?
18:32:42joachimm_ enters the room.
18:33:17rueIt is some git weirdness if you are looking at the ticket
18:33:47rueI did not read the patch but it should be possible to do at assignment, not access
18:34:07probablycorey enters the room.
18:34:10evani'm looking in git
18:34:14evanand charles was the committer.
18:34:20evandid he commit a patch from lighthouse?
18:34:23dbussinkzimbatm: you there?
18:34:39evanno matter.
18:34:43evanafter I get LRE fixed
18:34:49evani'm going to mildly revert it.
18:34:53headiusI didn't commit anything
18:35:06evanhttp://git.rubini.us/?p=code;a=commitdiff;h=7cd9fce4908aaeea9a35e273a3f15ed7ee7aa783;hp=7b4ef13448 12faa76018ab41cc7fba97a3af8448
18:35:06dbussinkevan: but any suggestions on how we're gonna handle the exception throwing issue
18:35:10wycats enters the room.
18:35:11evanis someone masquerading as you?
18:35:15headiusnope
18:35:17rueAdmit it, it is your secret identity, headius
18:35:20evandbussink: it's almost fixed.
18:35:23headiuswasn't me
18:35:37evanso someone committed it as your name?
18:35:43rueTo the zimbatmcave!
18:35:45headiusbeats me
18:35:52tongueroo leaves the room.
18:35:52dbussinkevan: http://rubinius.lighthouseapp.com/projects/5089/tickets/116-fixes-to-module-name-module-const_set# ticket-116-10
18:36:24dbussinkapparently his git-format-patch was doing strange things
18:36:33evanwhy the fuck is he committing patchs from other people.
18:36:52evananyway
18:37:11evani'm not happy with the solution outlined by him.
18:37:36jtoy leaves the room.
18:37:40VVSizbut it's a nice trick to commit as headius!
18:37:48headiuseveryone wants to beme
18:38:18headiusvery peculiar git feature
18:38:38evani know why git has that feature
18:38:47evanbut people are supposed to be adding Signed-Off-By
18:38:54evanplus, you didn't write the patch in the first place
18:38:58jtoy enters the room.
18:39:06headiusso you can commit as someone else?
18:39:22headiusI didn't have anything to do with the patch, no idea how my name got on it
18:39:30dbussinkyeah, if you use for example git-am
18:39:34evanwe need to find out how he generated those patches
18:39:43evanthey all say from Charles Nutter in them.
18:39:47headiussweet
18:39:52headiusCSotW!
18:40:06evanthis is not a CS you want your name attached to
18:40:11headiushah
18:40:18headiusso it's not about volume?
18:40:27evanno
18:40:32evanit's about peer nominations.
18:40:32headiusdarn
18:40:43VVSiz:)
18:40:44headiusheh, I'll never get one then :)
18:41:00dbussinkgoes hiding because of introducing a exception raise in primitives :P
18:41:08VVSizanother really funny spec: "Module#instance_method raises a TypeError if the given name is not a string/symbol"
18:41:27VVSizguess what it verifies... it verifies that the method actually raises ArgumentError
18:41:32headiusawesome
18:41:45VVSizand it fails on MRI 1.8.6, MRI 1.9, JRuby, Rubinius :)
18:42:08VVSizwell, not Rubinius :)
18:43:03rubuildiusVladimir Sizikov: ef5f4489c; 4465 examples, 16821 expectations, 0 failures, 0 errors
18:43:41evanheadius: so, i saw that Java adds cause to exceptions
18:43:44evanwhich is another exception
18:43:52evani'm thinking highly about adding that to rubinius
18:44:04evanand write a small gem that adds the behavior for MRI
18:44:44headiusyeah, that was added officially in Java 1.4 or so I think
18:44:45daikini leaves the room.
18:44:52evanyeah
18:44:55headiuseveryone ended up implementing their own exceptions to do it anyway
18:45:01evanyeah
18:45:04evanit's pretty nice
18:45:08probablycorey_ enters the room.
18:45:18evanand I run into that need pretty often which something moderately complicated
18:45:21ruebrixen, headius: I need a better term. Say, with #platform_is :version, "if current matches and target does not.."
18:45:23headiusdefault output also automatically walks cause until == null
18:45:23evanthat i need to normalize an exception
18:45:31rueSpecifically the "current"
18:45:57headiushost
18:48:20evanI've thought of 2 new ways to do LRE properly
18:48:20rueMm, yeah, it works.. then "platform" to specifically mean the OS/hardware side
18:48:47headiusyeah
18:48:50joachimm leaves the room.
18:48:50evanheadius: 1) rather than using the context to figure out the depth, create the exception before you do the call and put it in a temp local
18:49:00evanheadius: then compare against it directly to figure out depth
18:49:19evanand 2) only generate the rescue code if you see a return in the block attached
18:49:32evanotherwise let it travel through without checking
18:50:13zimbatmevan, dbussink , I have 5 min
18:50:30evanzimbatm: 1) why do all your patches say they are from Charles Nutter
18:50:32zimbatmsorry for that headius patch, I did a git-revert and it too headius' name
18:50:32headius1) sounds fine...for illustration I have a field on our frame called jumpTarget...same sort of thing
18:50:35evanhow have you been generating them.
18:50:46probablycorey leaves the room.
18:50:51evanzimbatm: please don't do that from now on then.
18:51:03evanit is very confusing.
18:51:12evan2) i'm not sold on the solution
18:51:12zimbatmevan, 1) sorry, it won't happen again, I know
18:51:20evanwhy did you remove all the name calculation code in the VM?
18:51:43headius2) also fine, though you need to remember stupid eval
18:51:57zimbatmevan, 2) actually I have another proposition. Instead of calculating @name on access, write the full path, and add a primitive for const_set to avoid duplication
18:52:07headiusfoo { eval 'return' }...edge case I know
18:52:21evanhm. thats a bother.
18:52:23Defilerheadius: Haha.. what even appens there?
18:52:24zimbatmevan, I just centralized and it seemed to be ok
18:52:26headiusimagine a larger piece of eval logic based on dynamic locals
18:52:41headiusit's not totally unlikely to see something like that
18:52:53headiusDefiler: it returns like a bare return would
18:53:00jero5VVSiz: i disagree that your last commit is a correction. :) "-".to_f == 0.0 and "-".to_f == -0.0, these both evaluate to true
18:53:02evanzimbatm: i don't like that either.
18:53:05Defilernice
18:53:10headiusruby -e "def foo; yield; puts 'here'; end; def bar; foo { eval 'return' }; end; bar" => nothing outputs
18:53:11evani'm not really a fan of the whole solution
18:53:17evantrying to calculate name on access.
18:53:30evani think we need to do something totally different.
18:53:34jeremydurhamjero5: 0.0 == -0.0 => true ?
18:53:37evanthe current way seems like a terrible hack.
18:53:56headiuscalculating on access could potentially be un-threadsafe too
18:54:09headiusI haven't seen the patch
18:54:09jero5jeremydurham: yes
18:54:09VVSizjero5: right, but (1.0/ "-".to_f) would evaluate to "Infinity" on some impls, and "-Infinity" on others.
18:54:16zimbatmevan, I was not sure either but my code got acked.. I'm still not really familiar with shotgun
18:54:32evanthen you should not be doing those fixes.
18:54:37evanif you're not comfortable.
18:55:11zimbatm..
18:56:02evanwell
18:56:06evanlets move on.
18:56:07enebo enters the room.
18:56:37evani'd like all the parts that touched shotgun revert
18:56:39evanreverted
18:56:47evaneither you can or I can
18:56:47zimbatmevan, I agree with you, next time I'll ask for your review for shotgun changes
18:57:02zimbatmI must go in 2 min.
18:57:06evani'll do it then.
18:57:10zimbatmthx
18:57:50zimbatmI'll try to come up with a better solution tomorrow and I'll submit it to you
18:57:56evanok.
18:58:19jero5VVSiz: would a platform guard fix it, or is it just that the same version of mri has different behavior on different platforms?
18:58:21zimbatmthx, sorry again
18:58:26evanno problem
18:58:28evanlive and learn.
18:58:40zimbatmcu
18:58:40boyscout1 commit by Vladimir Sizikov
18:58:41boyscout * Corrected Module#instance_method spec, it was failing on MRI/1.8/1.9/JRuby.; c1d5923
18:59:41VVSizjero5: the behavior is not properly specified anywhere, different impls behave differently, so there is on point in placing this into the "specs" then
19:00:14mad_phoenix leaves the room.
19:00:21VVSizhmm, expect one CI failure after my last commit. rbx behavior is incorrect.
19:02:09probablycorey_ leaves the room.
19:02:24mad_phoenix enters the room.
19:02:34ruebrixen, headius: http://pastie.org/141991 bottom part has the new logic. Does it look sane?
19:03:39probablycorey enters the room.
19:03:42ruebrixen: It does also have :version => '> 1.8.5' etc. support although we probably will not need it much
19:04:06headiuslooks good to me
19:04:51rueSo the platform-specific stuff should not be considered a failure since those are (hopefully) legit differences
19:06:05headiusyeah
19:06:08headiusgood to differentiate
19:06:18headiusdirect compliance failures are what most people want to know about anyway
19:06:21enebo_ enters the room.
19:06:57yipstar enters the room.
19:07:19enebo_ leaves the room.
19:08:05rubuildiusVladimir Sizikov: c1d59239d; 4465 examples, 16821 expectations, 1 failure, 0 errors; http://rafb.net/p/lekx5h72.html
19:09:32headiuska-ping!
19:09:34rueheadius: Oh, I had one remaining TODO there. #deviates_on should probably fail if neither matches
19:10:43pd enters the room.
19:10:59rueheadius: But the balancing concern was whether we want to report just in relation to the current host or overall
19:11:29headiusso are you trying to make it so you can pretend to run for a specific platform?
19:12:35headiuswhat do you mean "if neither matches"
19:12:35rueIt is possible to do, yeah. MSpec just uses constants and rbconfig to determine the 'host' and those can be overridded (which is how I wrote the specs)
19:13:06headiuswell, but the target impl isn't going to care about that
19:13:07rueSay you run on JRuby, and encounter deviates_on(:some_other_impl) do ... end
19:13:22headiuson unix JRuby's going to act like JRuby all the time
19:13:26rueShould that fail always or just when on some_other_impl
19:13:49headiusoh, so you want to be able to selectively turn those things on to see how they actually differ, yes?
19:14:03headiusso run on MRI with rubinius guards enabled to see what's actually differing
19:14:06rueheadius: Sure, there is nothing we can do about how the system *actually* works. Prentending only goes so far
19:14:28jtoy leaves the room.
19:14:33headiusthat I get
19:15:06rueYou could do a 'rbx test' when running on MRI but it would probably barf in some of the specs. But the guards would work according to whatever they are told the host is
19:16:02rueHowever, if you just run plain JRuby, identifying as such, and encounter that #deviates_on, I am not quite sure if that should be reported or not
19:17:01headiusunder normal exection I think deviates on (other platform) should just be ignored
19:17:09zimbatm leaves the room.
19:17:43headiusI could see there would be two other modes of execution: 1) strict compliance, where deviates_on not matching will be a failure, and pretending, where deviates_on (specific impl we're pretending to run) would actually run
19:17:55headiuser, 2) pretending...
19:18:47rueRight, so by default we would go more from the approach of how this platform complies rather than how the specs generally comply
19:19:00headiusyes
19:19:16headiusthat will be by far the most interesting scenario
19:19:40rueAlright
19:20:04rueSpecTargetFailures strike sort of a middle ground
19:20:49rueFor example if our target is :ruby, then saying not_compliant_on :ruby do .. end is a target failure (as opposed to a compliance failure)
19:22:10headiusok, I think :)
19:22:21thehcdreamer enters the room.
19:22:24pauldix leaves the room.
19:22:24probablycorey leaves the room.
19:23:11enebo leaves the room.
19:23:19rueThe logic was a pain :P
19:23:25brixenrue: I don't want any ">< ..." etc
19:23:37brixenrue: 1. we're only spec'ing the current stable version of ruby
19:23:48brixenrue: 2. those are too easy to abuse and mask stuff
19:24:09probablycorey enters the room.
19:24:52rueI do not think they are useful for us, no
19:26:19brixenrue: it's kind of a bitch because so far no one from ruby core will work with us on the specs
19:26:48brixenrue: so essentially this is the situation, they change behavior, we spec it, and we conform or deviate
19:27:01brixenbut either way, there is only one official ruby behavior: the most recent stable release
19:27:17headiusI think we need to allow for multiple descriptions for each spec
19:27:38brixenENOPARSE
19:27:42headiusit :english => "foo", :japanese => "bar", :turkish => "yahoo" do
19:27:43headius:)
19:27:56brixenof course, my bloodsugar is at bottom
19:28:00brixenlunch, bbiab
19:28:22Defilerit :english => "foo", :日本語 => "blah"
19:28:31evanha!
19:28:32DefilerIf we want to get 'serious' about it, headius. Heh
19:28:34evanjapanese symbol.
19:28:35evannice.
19:28:44headiusheheh
19:28:52evanheadius: so, pre-allocating the exception, then comparing against it works nicely
19:28:58brixendescribe Headius do it "should make sense" do fail end; end
19:30:43Fullmoon leaves the room.
19:31:11headiusevan: excellent
19:31:22headiusof course you're paying the cost to allocate even if it's never used
19:31:26evanyep
19:31:30evanright now, thats fine.
19:32:19ruebrixen: There is a lot of work to be done in the specs
19:33:19headiusno doubt
19:33:23headiusonly 804 lines of IO specs
19:33:34evansweet, this code works quite well.
19:33:40evanonly 1 error in ci
19:33:55evanand it's for Dir.mkdir
19:34:00evanfor the mkdir spec
19:34:05evananyone seen that?
19:34:15rueheadius: Instead of #deviates_on :ruby, #target_bug, #bug_in_target or #bug_in :ruby ?
19:34:53brixenrue: #bug_in
19:34:57headiusyeah
19:35:00rueMaybe even #target_bug "ruby-core:13456" or something
19:35:01headiusor bug_on
19:35:01evanah, it's from a spec blow up.
19:35:06evaner. system.
19:35:12brixenrue: if it's really a bug, but then, why are we spec'ing bugs in other impls?
19:35:31brixenheadius: bug_off :P
19:35:31TheVoice enters the room.
19:35:32rueRight, that is why the other two
19:35:50rueBy definition, so to speak, only the target can have a bug
19:35:51brixenrue: explain, why not just #bug ?
19:35:53rueThe rest deviate
19:36:10brixenrue: i.e why does target matter?
19:36:23headiusbrixen: it's consistent with every other guard
19:36:33brixenheadius: target doesn't matter
19:36:34headiusdeviates_on, fails_on
19:36:42brixenheadius: target doesn't matter :P
19:37:02brixenwe're not adding specs for bugs on other impls
19:37:07rueJust bug_in do ... end does not make sense
19:37:15thehcdreamer leaves the room.
19:37:17brixenbug do ... end
19:37:28brixeninclude a comment to the ruby-talk post or whatever
19:37:38headiuswell that wasn't my idea...I was just suggesting a name
19:38:15brixenrue: so, #bug will be ignored unless target is :ruby?
19:38:23rueJust #bug may be ambiguous
19:38:44brixenit shouldn't be
19:38:54brixenthere's only one ruby standard, only that can have a bug
19:38:57rueIn normal mode #bug runs unless platform == target
19:39:20brixenunless platform == :ruby
19:39:36brixenthere's only two cases, ruby and everything else
19:39:42brixengiven those two, when does #bug run?
19:40:08rueTarget == :ruby18
19:40:15joachimm$seen allan
19:40:21rueActually, it should probably not run at all
19:40:22brixenjoachimm_: no ;)
19:40:28brixenrue: yeah
19:40:41rueNo guarantee that the other implementations have fixed it I guess
19:40:51probablycorey leaves the room.
19:40:59rueAlternatively it would require bug do; fails_on :rbx do; ...
19:42:12brixenrue: actually, I'm missing something..
19:42:29brixenwhat specs are being guarded with #bug? 1. specs that pass ruby, or 2. specs that fail?
19:42:37pkondzior enters the room.
19:42:39probablycorey enters the room.
19:43:06brixenrue: IOW, do the specs describe the correct behavior, or the behavior we think is a bug?
19:43:07rueSpecs that fail on target due to a (reasonably) confirmed incorrect implementation
19:43:12rueCorrect behaviour
19:43:19brixenok
19:43:53brixenso, #bug does not run on :ruby18 but does run on everything else
19:44:54rueAdditionally exclude if needed, sure
19:45:12rueActually I think the report string should probably be required
19:45:49brixenbug "ruby-core:1313435 this is silly" do ... end ?
19:45:55brixenthat seems ok to me
19:46:26evanhey
19:46:33evanare those supposed to test that we HAVE the bug
19:46:35evanor that we don't
19:46:38evanthat confuses me.
19:46:52rueSee? #target_bug :)
19:46:54mad_phoenix leaves the room.
19:46:55brixenthe specs should describe the correct behaviore
19:46:59brixennonono
19:47:07brixenthere is only one target that matters for bug
19:47:09brixenruby
19:47:13rueevan: That means there is a bug in MRI
19:47:18rueYes, that is correct.
19:47:19brixenthe guard will not run the spec on ruby
19:47:25rue#target_bug. Target is MRI
19:47:33brixenspecs should always describe the "correct" behaviore
19:47:35evanHAHAHAHAH
19:47:35evanhttp://www.flickr.com/photos/stutefish/959364633/
19:47:38rue#bug. What bug? Where?
19:47:44brixenwith the allowance that we can deviate
19:48:00evanso
19:48:03evanif there is a test for a bug
19:48:07drbrainevan: omg, hahaha
19:48:07evanMRI should fail that test?
19:48:09evanor pass it?
19:48:10mad_phoenix enters the room.
19:48:11evandrbrain: SO AWESOME
19:48:14evandrbrain: thats at comiccon
19:48:23evanshane, abby, and I are so going this year
19:48:25drbrainyes
19:48:29evan(again)
19:48:31brixenevan: MRI will fail if it exhibits the bug, pass otherwise
19:48:37evanbrixen: ok
19:48:47evani found one that tested that we HAD the bug
19:48:57rueYeah
19:49:04brixenyeah, there's a lot of crap in there right now
19:49:09rueGoing through the specs is going to take more time than I thought
19:49:16brixenfirst thing I'm doing is making everything 1.8.6p111 correct
19:49:17mad_phoenix leaves the room.
19:49:32rueI think I will just make sure that CI runs clean and push this so everyone can work on the cleanup
19:49:41brixenrue: that's fine
19:50:17brixenI wonder if we'd get a c&d from this "RubySpec: The Standard" ;)
19:50:29rueHeh
19:50:35brixennow with even more insurance
19:51:02ruebrixen: Oh! Right now, per an earlier discussion, the guards are only allowed around #it blocks, not inside or other arbitrary locations
19:51:10brixenRubySpec: The Standard You Can Rely On
19:51:21rueReady To Lead
19:51:31rueTotally No Terrorist Attacks
19:51:31brixenrue: *highly* discourage inside #it
19:51:37evanRubySpec: When You Need to Know What The Fuck It Should Do
19:51:37brixenunless it's to save a life or something
19:52:05rubyconsumer enters the room.
19:52:40brixenrue: guards might be reasonable around #describe too
19:52:58ruebrixen: It is easier to just fail. What about #describe or #before/#after? It seems the latter would imply that the spec needs to go in spec/!ruby
19:53:02rueYeah
19:53:13brixenbut not inside #it, #before, etc
19:53:20brixenthere's too much sloppy stuff in there
19:53:22Fullmoon enters the room.
19:53:38brixenand most of the guards in #before are on File stuff for windows
19:53:48ruetarget_bug "ruby-core:11575" do ... end
19:53:57brixenrue: please, #bug
19:54:04boyscout1 commit by Vladimir Sizikov
19:54:05boyscout * Corrected Module#instance_method failing spec. It was failing on all impls.; f453121
19:55:57VVSizhmmm, in Module specs, MRI 1.9 fails about FORTY specs
19:56:23ruebrixen: I do not understand the logic here. #target_bug is by no means ambiguous and it parses easier visually due to the length. I agree with #bug_in :ruby because that could imply #bug_in :rbx too
19:56:52brixenrue: target is a totally ambigous word in that context
19:56:59brixenplease, just #bug
19:57:01brixenpretty please
19:57:10kevinclarkwith sugar and sexps on top
19:57:23brixen#standard_bug makes more sense than #target_bugh
19:57:26dbussinkVVSiz: there are some known bugs in module eval at least
19:57:34dbussinkVVSiz: in mri 1.9 that is
19:57:35brixenyou don't even know the target until you run the specs with something
19:57:36Arjen_ enters the room.
19:57:49VVSizdbussink: oh
19:57:54brixenVVSiz: those failures are because of breakage? or change in behavior?
19:58:16rueYou always know the target.
19:58:22brixennot when reading the specs
19:58:27rueTarget is the spec target
19:58:33rueOK, #ruby_bug ?
19:58:34brixenwhat?
19:58:42VVSizbrixen: I don't really know. MRI 1.8.6 passes about all of them (depending on patchlevel), but MRI 1.9 seems to be failing a lot. maybe, jut the MRI behavior changed
19:58:58rueTarget is what the specs are written against. The specs /target/ X.
19:59:03brixenVVSiz: ok, I hope there's not that much behavior change, but who knows
19:59:14brixenrue: no, target is what runs the specs
19:59:20rueNo, that is the host
19:59:23brixenhuh?
19:59:26brixen-t target ?
19:59:31brixenwhy did I name it that?
19:59:43rueI have no idea
19:59:50brixenthere is no host/target anymore
19:59:56brixentarget is the impl running the specs
20:00:01brixen#ruby_bug if you insist
20:00:30brixentarget was the impl running the specs even under the host/target config
20:01:50rueThat is a completely different situation
20:02:04rueWhich does not even exist anymore
20:02:22brixenrue: the point is, target is and always has been the specific impl running the specs
20:02:33brixenuse #ruby_bug unless you disagree with that
20:02:38mad_phoenix_ enters the room.
20:03:07rubuildiusVladimir Sizikov: f453121dd; 4465 examples, 16821 expectations, 1 failure, 0 errors; http://rafb.net/p/N8MAr823.html
20:04:04ruebrixen: #ruby_bug it is
20:04:26rueBut you are saying that target is the host
20:04:40brixenrue: no, I'm not
20:04:48brixenhost was the impl that would pass the specs to the target
20:04:59brixenthe target would run them and pass the result back
20:05:07brixenthat's where the word target came from
20:05:20brixenwe could not host rspec, so we used mri to do it
20:05:42dbussinkhmm, other people who get a sigbus error here?
20:05:52ruedbussink: HEAD?
20:06:07dbussinkyeah
20:06:20dbussinkdid a clean build
20:06:30dbussink0x128f2c Numeric#==+0 in kernel/core/numeric.rb:111
20:06:36evancrap
20:06:39evani've seen that too
20:06:49evando a 'rake distclean'
20:06:50evanthen build
20:06:58evani haven't figured out what it is yet.
20:07:21dbussinkalready did that
20:07:28evanis in consistent?
20:07:34evanit consistent.
20:07:48dbussinknope, it fails at different points during a ./bin/ci run
20:08:36dbussinkhad it twice, both in numeric, but not on the same line
20:08:54dbussinki'll test this some more and do a debug build and gdb run
20:09:47brixendbussink: run it with bin/ci -C -fs
20:10:01octopod leaves the room.
20:10:10brixendbussink: sometimes issues that implicate the gc will fail differently with all those extra object created with -fs
20:11:22binary42 leaves the room.
20:12:01dbussinkyeah, now a sigbus in a completely different place
20:14:30brixendbussink: exclude the Kernel#callcc specs and see if it goes away
20:14:54brixendbussink: easiest way to do that quickly is put Kernel#callcc in spec/data/critical.txt
20:17:43enebo enters the room.
20:19:39dbussinkbrixen: seems to fix it, running bin/ci a couple of times to make a better judgement on this
20:26:12boyscout1 commit by Evan Phoenix
20:26:13boyscout * Fix LongReturnException to be terminated in the correct place; 996f9f4
20:26:21evanwhy am I getting ci failures for instance_method
20:26:22evan?
20:26:25evanare others getting that?
20:28:40DefilerLet me fetch and see
20:29:48DefilerArgh, I have to distclean again. That is getting irritating
20:30:36dbussinkevan: getting the same failure
20:31:07dbussinkExpected TypeError but got ArgumentError
20:31:07evanlooks like someone committed this but didn't make rubinius pass it.
20:31:11evanor rather, change it.
20:31:49dbussinklooks like VVSiz is to blame :
20:31:50dbussink:P
20:31:57smtlaissezfaire enters the room.
20:32:09VVSizsure
20:32:17VVSizthe spec was wrong, I corrected it
20:32:19brixenevan: that's a broken spec
20:32:28emphatic enters the room.
20:32:29brixenyeah, we implemented the wrong behavior
20:32:36boyscout1 commit by Evan Phoenix
20:32:37boyscout * Fix to_sym conversion; 280b074
20:32:38brixenit *was* broken
20:32:39evannot any more!
20:32:44brixenhehe
20:32:49VVSiz:)
20:33:13evantoo much of our code does a bunch of tests to raise exceptions
20:33:23evanwe should be asking for forgiveness more
20:33:33evani just changed the code to call to_sym in a begin/rescue
20:33:38evanand just raise TypeError if it fails.
20:33:42VVSizjust to check: my understanding is that when I commit/change specs, I don't exclude failures immediately, so that people would have a chance to look at them and act appropriatly (quick fix, discussion, spanking)
20:33:59brixenVVSiz: nah, exclude them
20:34:13DefilerI vote exclude them and open a ticket, if you aren't fixing it yourself before you push
20:34:18brixenideal is specs that fail with code that makes them pass
20:34:41VVSiz:)
20:34:57ezmobius enters the room.
20:34:58evanbtw
20:35:01evanwe can build stables again
20:35:04VVSizok then, will try to exclude them.
20:35:05evanLRE is all fixed up
20:35:15brixenevan: sweet, thanks
20:35:53VVSizbrixen: but somebody would have to constantly monitor the exclusions.
20:36:14brixenVVSiz: well, I'll be monitoring commits that add them ;)
20:36:22VVSiz:)
20:37:34evanwhere is zenspider's rake task to print out the excludes?
20:37:37evandid it get deletede?
20:38:40bburcham enters the room.
20:38:48dgtizedI think it's just todo, but it's not documented or something
20:39:25brixenrake todo
20:39:44evani'm going to do a little cleanup of the Rakefile
20:39:54evanmoving our utility classes and functions to a rakelib/ file
20:40:02evanso that Rakefile contains just tasks mainly
20:41:14pauldix enters the room.
20:45:00pauldix leaves the room.
20:45:00rubuildiusEvan Phoenix: 280b07495; 4465 examples, 16821 expectations, 0 failures, 0 errors
20:45:03rubuildiusEvan Phoenix: 996f9f4e5; 4465 examples, 16821 expectations, 1 failure, 0 errors; http://rafb.net/p/kXD9bE91.html
20:45:19evanrubuildius is out of order.
20:45:25evan280b was the later commit
20:45:26brixenheh, race condition
20:46:57pkondzior leaves the room.
20:47:27pkondzior enters the room.
20:47:46kofno_ leaves the room.
20:48:00jessop enters the room.
20:48:52VVSizguys, can somebody explain what this spec tests really:
20:48:53VVSizhttp://pastie.caboo.se/142065
20:49:01boyscout1 commit by Evan Phoenix
20:49:02boyscout * Cleanup / reorganize Rakefile; a8bdc6b
20:49:16evanVVSiz: test that
20:49:19evanm = Module.new
20:49:21evanBlah = m
20:49:23VVSizit fails for MRI 1.8.6 (latest trunk), MRI 1.9, JRuby. and the behavior is kind of weird, and I'd even say non-deterministic
20:49:24evanp m.name
20:49:29evan# => "Blah"
20:51:17evani'm not thrilled about that code.
20:51:58VVSizweird, in most cases that p returns nil, but in MRI 1.9 returns "Blah". but in all cases it prints "Blah" anyways.
20:52:26brixenthat's one of the weirdest specs I've seen
20:52:36brixenand looks like some accident of implementation
20:52:40evanVVSiz: works for me in 1.8
20:52:42evanin irb.
20:52:50evandoing exactly my steps from above.
20:53:04VVSizI'd say all 1.8.6-level implementations behave as you, evan, listed above.
20:53:12brixenevan: Blah = m at least has some sense
20:53:26VVSizbut for the spec in the question, they behave differently
20:53:33brixenModuleSpecs.const_set(:Y, m)
20:53:38brixen?
20:53:42VVSizI'd say the spec is not really a spec in this case.
20:53:44brixenwhat behavior is that really?
20:54:25mutle leaves the room.
20:54:40evanok, lunch time.
20:55:29VVSizand the weirdest part is that sometimes MRI behaves one way for a while, and sometimes switches and behaves another way (10 times passing the spec, 5 times failing, 20 times passing...) man, I'm going INSANE
20:55:51kofno enters the room.
20:55:53brixenVVSiz: yeah, I keep getting a failure on that spec randomly
20:56:15VVSizoh, good!
20:56:17mutle enters the room.
20:56:31brixenVVSiz: if it were m = Module.new; Blah = m; p m.name
20:56:35brixenthat would be ok, I think
20:56:51brixenthis behavior with #const_set seems like some accident of implementation
20:57:02VVSizagree
20:57:08brixenlet's see some code that depends on that so we can make an example of someone ;)
20:57:42evanheadius and I have talked about this behavior
20:57:47evanfor the bottom one
20:57:53jtoy enters the room.
20:57:56evanwhere it picks up Y
20:58:00VVSizthat spec was part of HUUUGE commit: 970ede321d31ec75dd578866c683defe768fa356
20:58:03jtoy leaves the room.
20:58:07evanthat behavior is a 'quirk'
20:58:10evanand is gone in 1.9
20:58:14brixenevan: excellent
20:58:23evanwe will not be implementing it
20:58:44VVSizwell, you are already
20:58:47brixenevan: but the m = Module.new; Blah = m; m.name => "Blah"
20:58:48VVSizwith that huge patch
20:58:55brixenevan: that one we do? or don't?
20:59:06rubuildiusEvan Phoenix: a8bdc6b71; 4465 examples, 16821 expectations, 0 failures, 0 errors
20:59:35kofno leaves the room.
21:00:05brixenVVSiz: looks like he accidentally checked in a autoconf changeset
21:00:12evanzambatiz implemented it
21:00:16brixenwe should probably revert that and reapply with just the relevant code
21:00:18evanbut i highly dislike it.
21:00:24turtletime leaves the room.
21:00:25evanand his commit should be reverted.
21:00:36VVSizagree again
21:00:57evanhttp://git.rubini.us/?p=code;a=commitdiff;h=7cd9fce4908aaeea9a35e273a3f15ed7ee7aa783
21:01:05evanthats his commit for our implementation of it
21:01:32brixenhears all chanting in unison: revert revert revert
21:02:12emphatic leaves the room.
21:02:23evanlunch!
21:02:31VVSizand the problematic specs implemented here: http://git.rubini.us/?p=code;a=commitdiff;h=970ede321d31ec75dd578866c683defe768fa356
21:02:56VVSizbut that configure patch looks scary :)
21:03:08VVSizimplemented -> added
21:03:17brixenVVSiz: care to do the honors? ;)
21:03:44dbussinkhe already reverted the configure patch if i recall correctly
21:03:52VVSizplease, be my guest. I might've missed some nuances...
21:04:24brixenVVSiz: got to head to class in 10, someone will do it
21:04:29RyanTM__ leaves the room.
21:04:55RyanTM enters the room.
21:05:26VVSizdbussink: yeah, good! :)
21:06:55boyscout1 commit by Vladimir Sizikov
21:06:56boyscout * Revert "Module#name memoization work."; cc0e45c
21:07:47jessop leaves the room.
21:10:19essoepp leaves the room.
21:10:28boyscout1 commit by Vladimir Sizikov
21:10:29boyscout * Revert "Completed MRI's Module#name spec with corner case."; 68ae0b5
21:21:21drbrainevan: shotgun/rubinius -rtempfile -e 'p Tempfile.new("tempfile_test").class'
21:21:35drbrainshould report 'Tempfile', reports 'File'
21:21:35drbrainideas?
21:21:37drbrain(this is for OpenURI
21:22:52dbussinkhmm, probably because of the delegate stuff
21:23:42drbraindbussink: I've gotten that far
21:25:07rubuildiusVladimir Sizikov: 68ae0b5ac; 4463 examples, 16804 expectations, 0 failures, 0 errors
21:25:07rubuildiusVladimir Sizikov: cc0e45cab; 4464 examples, 16812 expectations, 0 failures, 0 errors
21:28:08drbraingreat, __FILE__ != $0 when it should
21:28:48evanyeah
21:28:49evani know.
21:28:58evani was going to work on that today
21:29:25drbrainwell, at least delegates crappy little tests pass
21:30:08evandrbrain: seems like Tempfile.new("aoeu").class should report File
21:30:17evansince it delegates class to the File object
21:30:52drbrainfrom reading DelegateClass's implementation, I don't think so
21:31:00drbrainhrm, maybe it does something special
21:31:20drbrainhrm...
21:31:27evanwhy not?
21:31:31evanit sets up a proxy for class
21:31:37evanto call @_dc_obj.class
21:31:48evanoh
21:31:52evanmaybe we have class on Object
21:31:56evanbut it's on Kernel in MRI
21:32:02evanso the subtraction isn't working.
21:32:07drbrainthat's what I was thinking
21:32:30evanMRI has so many methods in the wrong place.
21:33:25dean-ero leaves the room.
21:33:53drbrainyeah, that's it :(
21:34:08essoepp enters the room.
21:34:31evandrbrain: well, i guess we need to rearrange so we match MRI exactly
21:34:41evanfor methods on Kerner and Object
21:35:01drbrainhrm, well, that doesn't actually fix my problem
21:37:19drbraindd if=/dev/zero of=~/Sites/zeros bs=1024 count=11
21:37:19pauldix enters the room.
21:37:27drbrainhttp://rafb.net/p/AlPqkU33.html
21:37:39drbrainI'm seeing #<Class:0x40099>(File)#status= (method_missing) at (eval):2
21:37:54drbrainand I think the DelegateClass is getting in my way, since I'm going through one of the delegated methods
21:39:06drbrainhrm, #extend?
21:40:04drbrainyeah
21:40:10pate leaves the room.
21:40:22agardiner enters the room.
21:40:50agardinermorning
21:41:22djwhitt enters the room.
21:41:31solarcemornin mate, how are things down south?
21:42:07agardinerbeautiful day. how 'bout up north? :-)
21:42:27solarcetis a cold day here in la
21:43:10solarcea fine day for me to rage at dell support
21:43:28agardinergood luck with that!
21:45:00drbrainevan: since we have so many more methods, there need to be many more excludes
21:45:16drbrainor, visibility needs to be changed
21:45:47evanwe need to be marking a lot more things private than we currently are
21:46:09drbrainadding this:
21:46:23drbrain methods -= %w[class extend kind_of? respond_to? nil? object_id metaclass __verify_metaclass__ instance_exec]
21:46:27drbrainfixes #extend
21:47:46headius leaves the room.
21:47:47dean-ero enters the room.
21:51:39evank
21:52:19drbraindoes Object have any instance methods?
21:52:23drbrain(in MRI)?
21:52:28drbrainother than #initialize?
21:52:30evancheck
21:52:32evanin irb.
21:52:40drbrainI'm seeing none
21:52:47dodecaphonic_ enters the room.
21:53:04evani see a ton
21:53:12evan41 to be exact.
21:53:21drbrainObject.public_instance_methods(false)
21:53:27dodecaphonic_ leaves the room.
21:53:45drbrainthey're all from Kernel
21:53:52yipstar leaves the room.
21:53:55evanah
21:53:59evanthen there is your answer.
21:54:01evanwhich is so dumb.
21:54:06evanbut thats MRI
21:54:07drbrainagreed
21:54:38dean-ero enters the room.
21:57:30jessop enters the room.
21:57:50agardinerevan: need to pin you down... :-)
21:58:17agardinerwhat is the reason we should not raise exceptions from a primitive? I want to put it into README_DEVELOPERS...
21:58:58evanit's bad form.
21:59:22unagi-san enters the room.
21:59:22evanit breaks encapsulation barriers
21:59:46dewd leaves the room.
22:00:13dbussinkmaybe we should add some pointers on how to do it properly?
22:00:34agardineri'm not sure i follow... take dbussink's regexp.new problem
22:00:35turtletime enters the room.
22:01:00agardinerto get the error message back without raising an exception requires some other way of passing back the error message
22:01:37dbussinkwell, i don't like the current solution either
22:01:53dbussinkbut i don't know of any other solution that is currently possible
22:03:10emphatic enters the room.
22:03:41evanhm
22:04:55agardineri'm not sure i agree that it breaks encapsulation either... why is it better for me to just raise an ArgumentError from the code following the primitive, rather than in the primitive itself? i'm now raising a range exception in Ruby land, but the check for the range is in C...
22:05:19agardiner(i'm talking about the task_get_stack_value prim now, btw) :-)
22:08:09rubyconsumer leaves the room.
22:08:15evanI might be ok raising an exception from primitives
22:08:25evanbecause it does seem like it simplifies some cases
22:08:39evanbut if we do
22:08:54evanthen there should be a RAISE() macro that does the right thing
22:09:02evanwhich should preserve the proper semantics.
22:09:21dbussinkthat's definitely true, constructing the exception by hand is ugly
22:11:06evanRAISE("RangeError", "you're way way way out of range");
22:11:08evansomething like that.
22:11:29agardineryeah, that looks much nicer
22:12:40evani'd be ok with that solution.
22:14:19ragge enters the room.
22:15:14agardinerhmm - looks like there are a number of different usages
22:15:39evanit should use rbs_const_get everytime
22:15:46evanrather than accessing state->global
22:15:49evanthat simplifies the case.
22:15:54agardinereg raise_from_errno
22:16:04zenspiderhere it comes
22:16:12boyscout7 commits by Ryan Davis
22:16:13boyscout * Removed a lot of passing specs from the excludes; 2bf52de
22:16:14boyscout * Removed __old_send__; 00d6230
22:16:15boyscout * Module should be using #to_sym, not #__symbol_lookup__; 8575b03
22:16:16boyscout * Fixed Symbol::all_symbols; b0e5a9b
22:16:17boyscout * Added extra exceptions and removed all-exclude.txt~ generator since that mspec functi ...; 4d5a52d
22:16:18boyscout ...
22:16:23evanagardiner: so, perhaps 2 macros
22:16:27zenspider...?!?
22:16:30evanzenspider: CI pasess properly, right?
22:16:34zenspiderscrew you boyscout!
22:16:38zenspideraye
22:16:42evanit always truncates at 5
22:17:02zenspiderunlike drbrain, I always pull and rerun bin/ci before I commit. :P
22:17:12agardinerevan: should these macros be only for use in primitives?
22:17:23evanagardiner: yes.
22:17:26zenspider228 excluded specs to go
22:17:38agardinerk - i'll knock something up and run it by you
22:18:09evank
22:18:22dbussinkevan: do you have a suggestion for passing an error message from a deeper level? like with regexp_new?
22:18:40dbussinkor just keep the current way of abusing the returned object?
22:19:28evani don't like the current way.
22:19:35evanpassing up a String
22:19:44dbussinkme neither, but any other suggestion?
22:20:14evanbetter is pass down a &err
22:20:17evanand check it on return
22:20:38evanC error condition style
22:20:59dbussinkah ok, are there any existing structures for this?
22:21:11dbussinkbecause i can imagine it could be useful in other places too
22:21:37evani don't think we have needed it yet
22:21:43evanso no, no existing ones in our code base.
22:23:32evani need to add to README-DEVELOPERS that people should use to_sym
22:23:34evannot intern.
22:24:28zenspiderI still don't understand why #intern doesn't exist on Symbol... dumb
22:24:44evanme neither, but it's a good reason to not use it.
22:26:26djwhitthmm... is the git server having trouble?
22:26:39evannot that I know of.
22:26:45zenspideryeah. makes me sad tho... intern is from my smalltalky days
22:26:48djwhittah, could just be my connection never mind
22:29:17rubuildiusRyan Davis: 2bf52de43; 4467 examples, 16815 expectations, 1 failure, 0 errors; http://rafb.net/p/PNgMyj25.html
22:29:23drbrainevan: how should I handle bootstrapping if I can't include Kernel in Object?
22:30:07pkondzior leaves the room.
22:30:18evandrbrain: not sure what ya mean.
22:30:50drbrainso, I move kind_of? from kernel/bootstrap/object.rb to kernel/bootstrap/kernel.rb
22:31:01drbrainbut, Object.include Kernel happens in kernel/core/kernel.rb
22:31:14evanbugger
22:31:21drbrainso, kind_of? doesn't exist yet
22:31:23evanwe're going to have to completely reorganize bootstrap.
22:33:22evanwhich is why it's stupid those methods aren't on Object.
22:33:34drbrainI'll keep fighting it
22:33:39evanyou wont get it.
22:33:58zenspiderno faith...
22:34:01zenspiderhaha
22:34:04agardinerdbussink: how do i trigger a regexp error in the primitive to make it raise the exception?
22:34:10zenspideryeah! screw you drbrain! :P
22:34:27evanthe simplest is gonig to be just have the VM create Kernel and include it in Object
22:34:30evanbefore bootstrap even runs.
22:34:35dbussinkagardiner: throw in something like $[^, it's in the specs too
22:38:05VVSizheh: p o.methods.sort -- in new specs for attr_writer :)
22:38:39zenspiderVVSiz: are you working on attr_writer?
22:39:15evanzenspider: he's a jruby guy, he doesn't write rubinius code.
22:39:17evanonly specs.
22:39:18chris2 leaves the room.
22:39:37zenspiderheh. ok... I'll keep poking then
22:39:46evanso
22:39:49evanbin/mspec spec/core
22:39:54evanand it should be destablized?
22:40:09evanwierd.
22:40:11evanyep
22:40:17evanit exits really early
22:40:20zenspideroops. I committed some debugging output. I'll have that fixed in a sec
22:40:36evanoh, wrong core.
22:40:41evanwhy do we just still have
22:40:42evanspec/core
22:40:42evan?
22:40:59zenspideras compared to? ruby/1.8 ?
22:41:04evanyeah
22:41:15zenspiderno clue
22:41:38evanrunning
22:41:44evanbin/mspec spec/ruby/1.8/core
22:41:51evani get a bunch of failures
22:41:55evanbut no destabilization
22:42:05zenspider*nod*
22:42:09boyscout1 commit by Vladimir Sizikov
22:42:10boyscout * Removed debugging stdout from one spec.; 811cbe8
22:42:14evanwhere is the attr_writer destablization?
22:42:30evanoh fired.
22:42:37evansomeone used defined?() in specs.
22:42:49zenspiderI didn't say there was destabilization with attr_writer... just failure.
22:42:59evanwho did this...
22:43:01zenspiderI think you fixed all the destabilization issues yesterday
22:43:06evanah, ok.
22:43:08dean-ero_ enters the room.
22:43:10drbrain what's wrong with defined?
22:43:13zenspiderdoh. VVSiz beat me to the commit
22:43:21VVSizhehehheeh :)
22:43:32evan it "File::RDONLY" do
22:43:32evan defined?(File::RDONLY).should == "constant"
22:43:32evan end
22:43:39evanthats stupid.
22:43:51evanand doesn't work on rubinius
22:43:51dean-ero leaves the room.
22:43:58evanbecause we don't support returning strings from defined?
22:44:53drbrainah, yeah, agreed
22:45:44zenspiderevan: we don't?
22:45:53zenspiderany reason not to?
22:46:03retnuH_ enters the room.
22:46:03evanwe're lazy fucks.
22:46:08retnuH leaves the room.
22:46:17squeegy enters the room.
22:46:25evanfeel free to implement it
22:46:29evanit is 100% in the compiler
22:46:38evanbecause you have to have the full sexp to figure it out.
22:46:59bburcham leaves the room.
22:47:27zenspideryeah... :(
22:47:45zenspideris still highly tempted to nuke the parser
22:47:53evanin favor of what?
22:48:19evani'm not a big fan of setting us back 6 months
22:48:26enebo leaves the room.
22:48:28zenspiderwe've discussed this
22:48:39enebo enters the room.
22:48:42evanrefresh my memory.
22:48:43zenspider6 months?
22:49:05drbrainruby_parser...
22:49:12evani thought it sucked
22:49:17evanthats from zenspider's own mouth.
22:49:29zenspiderit does
22:49:44zenspiderso does the current setup. just in different ways
22:49:53evani think the current setup sucks less.
22:50:01evanthen EVERYONE dealing with a broken parser.
22:50:12zenspider???
22:50:18zenspiderwhat is broken about the parser?
22:50:24evanyou said it sucks.
22:50:29evanthat to me means it's borken.
22:50:32drbrainsucks != broken
22:50:48zenspidernot in the slightest
22:51:21evanthen please integrate it.
22:51:32evanthere are only to methods
22:51:35evans/to/two/
22:51:43evanwe should be able to have both at first
22:51:48evanthen just remove using the old one.
22:52:02evanintroduces zenspider's mouth to money
22:53:02agardinerevan: re primitive exceptions, task_raise and thread_raise both call cpu_raise_exception; do you want a macro for these two as well for consistency?
22:53:13evanno
22:53:19evanleave those alone.
22:53:19enebozenspider: I had some weird mac irc issue so I missed the start of this...is your top down parser working well enough that you want to merge and use in rubinius?
22:53:32agardinerok
22:54:15rubuildiusVladimir Sizikov: 811cbe8ef; 4467 examples, 16815 expectations, 1 failure, 0 errors; http://rafb.net/p/IU5VsB46.html
22:54:31eneboactually anyone listening could probably answer that question :)
22:54:32zenspiderevan: you can stop being a jackass now... All I said was I was highly tempted.
22:54:46evanok.
22:54:47zenspiderenebo: want, yes... need/should, probably not.
22:54:49evani'll stop.
22:55:03zenspiderenebo: what irc client do you use?
22:55:18enebozenspider: I am just interested because the IDE people would really like a top-down parser for better error reporting
22:55:27zenspiderI switched to emacs' erc (on my mac) and LOVE it compared to the other clients available on osx
22:55:38eneboI am using Adium...for some reason no text was displaying in all but on window
22:55:39zenspiderenebo: it is not there yet for position info
22:55:55zenspideradium for irc?
22:56:08eneboerr...sorry
22:56:13eneboColloquy
22:56:32eneboYeah grafting position info into port of MRI parser was painful
22:56:42eneboI am hoping it will be easier for you
22:56:53zenspiderevan: I'm looking into remove_method not raising NameError and found Module#__find_method. There is also Object#__find_method__... clue me?
22:57:05zenspiderenebo: it will be, once I switch the lexer over and clean up stuff
22:57:12enebocool
22:57:12zenspiderit is #3 on my todo list
22:57:47zenspiderevan: I think the Object#__find_method__ can go / merge with the Module one. or vice versa
22:57:51evannope
22:58:06evanModule#__find_method (bad name btw) finds an instance method
22:58:15evanit should probably be removed with looking in the method_table
22:58:24evanObject#__find_method__ hooks into the VM method lookup logic
22:58:40evanto find an implementation of a method for an object, given a name.
22:58:56zenspiderright... I'm not seeing where they are incompatible yet
22:59:13evanModule#__find_method looks in it's own instance method table
22:59:25evanObject#__find_method__ looks in other people's instance method tables
22:59:34evanthey look different places.
23:00:09zenspiderexported_cpu_find_method vs cpu_locate_method_on...
23:00:45evanyes, similar, but different starting points
23:01:00evanif you call __find_method__ on a Module
23:01:09evanit will look for methods that that object responds to
23:01:17evannot methods that instances of it respond to
23:02:52dbussink leaves the room.
23:03:45boyscout2 commits by Evan Phoenix
23:03:46boyscout * Update Proc excludes; f45030d
23:03:47boyscout * Add Proc#==; 7f932fb
23:03:54zenspiderack. I'm lost
23:04:48DefilerWhat should Module#__find_method__ be named?
23:04:59evanwrong one.
23:05:00DefilerI was confused about what it did, prior to your explanation a moment ago
23:05:18evanModule#__find_method should be Module#lookup_instance_method
23:05:44zenspiderhrm... so undef_method and remove_method both call instance_method just to get the NameError code. instance_method isn't raising tho and it goes down 5ish levels
23:05:57evanack.
23:05:58crafterm enters the room.
23:05:58zenspiderno double underscore on the front?
23:06:06evandoesn't really matter.
23:06:14evaneither underscores on both sides
23:06:16evanor not at all.
23:06:18zenspiderI do like the convention
23:06:22zenspiderk
23:06:26pauldix leaves the room.
23:09:28emphatic leaves the room.
23:11:51turtletime leaves the room.
23:12:00evanzenspider: are you in the module excludes?
23:12:01probablycorey leaves the room.
23:14:13rubuildiusEvan Phoenix: f45030d33; 4470 examples, 16824 expectations, 1 failure, 0 errors; http://rafb.net/p/0rCpKI25.html
23:15:01pd leaves the room.
23:17:24turtletime enters the room.
23:18:21zenspiderevan: excludes and specs currently, yes
23:18:31evank
23:19:22zenspiderevan: what's up?
23:19:32evanjust wanted to know where you were
23:19:38zenspiderwhat is fails_on :rubinius for?
23:19:40evani was going to tackled a few myself.
23:19:52evana spec we know we don't pass
23:20:01wycats leaves the room.
23:20:02evanand we didn't know how to make pass for now
23:20:04evani think.
23:20:10evannot sure why we have that AND excludes.
23:20:13zenspiderI'm wondering why remove_method's instance_method isn't raising NameError when instance_method specs pass
23:20:23wycats enters the room.
23:20:30zenspiderI just added some specs for instance_method to verify that it was broken and they pass. :(
23:21:06evanhm. does write reset eof?
23:21:22zenspideryeah. that's what I'm confused by
23:22:11zenspiderok. ok... I misunderstood the spec...
23:22:16zenspiderit is wrong
23:25:43crafterm leaves the room.
23:26:42zenspiderevan: is @method_table flattened?
23:26:52zenspiderI need to check for method existance for current level only
23:26:59evanflattened how?
23:27:14evanit's only the methods for that Module
23:28:23zenspiderok. would you mind me digging in there for the existance check? or should I be using one of those __find_methods?
23:28:46evanwe have it already
23:28:51evanlook at
23:28:56evanfind_method_in_hierarchy
23:29:00zenspiderit looks like Module#__find_method looks up heirarchy
23:29:02evanyou can of course look directly in a method_table
23:29:15evancm = method_table[:name]
23:29:34zenspider"for current level only"
23:29:41zenspiderok. I'll look in method table
23:30:11agardinerevan: do you want to review the primitive exception macros before i push?
23:30:27evanif they pass ci
23:30:28evango ahead.
23:30:46agardinerstrange - they passed ci before i pulled and rebased...
23:30:56agardineranyone else seeing ci failures on HEAD?
23:31:27evannot currently
23:31:28evanno.
23:31:29agardinerlooks related to intern/to_sym, and Proc#==
23:33:23evanwhat are they?
23:33:59agardinerjust trying clean && build
23:34:43zenspider*sigh*
23:35:00agardineryeah, that seems to have fixed it
23:35:11zenspiderso... that fails_on :rubinius thing? it means the block doesn't run at all... instead of running and rescuing or something
23:35:17evanyep
23:35:21zenspider2 of the specs pass after removing those blocks
23:35:36Arjen_ leaves the room.
23:35:49boyscout1 commit by Adam Gardiner
23:35:50boyscout * Added RAISE and RAISE_FROM_ERRNO macros; f3230b6
23:36:59turtletime leaves the room.
23:37:08boyscout2 commits by Evan Phoenix
23:37:09boyscout * Fix up sysread and syswrite, disable testing for warnings on rubinius; 62d93ac
23:37:10boyscout * Remove stale binding excludes; a482b17
23:37:45evanok, now to work on __FILE__
23:38:10zenspiderwhat's wrong with it?
23:38:21zenspiderI eyeballed it the other day and it looked ok
23:38:24evanit reports the path to the file when compiled
23:38:26evannot when run
23:38:53evancd lib; rbx compile test.rb; cd ..; rbx lib/test.rb # => "test.rb"
23:39:03evanit breaks the
23:39:08evan$0 == __FILE__
23:39:13evanidiom in a few places
23:39:23evanand we've hit it already in a few places
23:39:25evanas a gotcha
23:39:35zenspiderouch. right...
23:39:41zenspiderI missed that part. :)
23:39:44evan:)
23:39:51evani'm going to disable the parser from doing it
23:39:52moofbong leaves the room.
23:40:02evanand just fill it in from runtime info entirely
23:42:02zenspideruh oh
23:42:16zenspiderI've got a 'plosion on the latest pull
23:42:27evaneh?
23:42:33zenspidersigbus
23:42:37zenspidersec
23:42:58zenspiderhttp://rafb.net/p/5jI6EZ27.html
23:43:01zenspider
23:43:22evanhrm
23:43:23evanthats new.
23:43:32zenspideryour last build had a failure, but it at least finished
23:44:15evanthe failure was the process specs
23:44:17evanAGAIN.
23:44:56zenspideryeah. they seem evil
23:45:03zenspidershould I push anyhow?
23:45:09evanprobably fine
23:45:10evanyeah.
23:45:35zenspiderok. I seem to have gotten farther
23:46:52boyscout2 commits by Ryan Davis
23:46:53boyscout * removed remove_method_excludes.txt; c055a59
23:46:54boyscout * Clarified undef/remove specs a bit.; 08cb274
23:46:59eventualbuddha enters the room.
23:47:07dodecaphonic_ enters the room.
23:47:27turtletime enters the room.
23:48:50zenspiderhuh... I don't think that has one of my commits... checking
23:49:15rubuildiusEvan Phoenix: 62d93ac79; 4473 examples, 16827 expectations, 1 failure, 0 errors; http://rafb.net/p/lZXiNM99.html
23:55:36Defilersweeet
23:55:36Defilerhttp://rafb.net/p/xCzFbN60.html
23:55:53evannice
23:55:54DefilerThat has gotten a lot faster in the last month
23:56:20zenspiderand yet, the number of specs is rocketing
23:56:32DefilerEverybody wins
23:56:45zenspiderI've been running `rake todo` and pounding on what I can
23:56:57zenspiderI suggest you guys do too... it is a nice way to look at it
23:57:08evanzenspider: i think i'll do a little every day
23:57:13evanin addition to the new work i need to do
23:57:15evanlike __FILE__, etc.
23:57:30defunkt enters the room.
23:58:54zenspideris anyone addressing the rdoc issue?
23:59:07evannot at present
23:59:08pauldix enters the room.
23:59:12evanat least, i'm not aware of it.
23:59:16rubuildiusRyan Davis: c055a5981; 4479 examples, 16835 expectations, 1 failure, 0 errors; http://rafb.net/p/HS46rG40.html
23:59:48zenspiderI wouldn't have to ask half the q's I do if there were rdoc on the new methods