Show enters and exits. Hide enters and exits.

00:22:13rueHum hum
00:31:12defn52goes to get dinner
00:51:35hookET enters the room.
01:30:24cabo enters the room.
01:37:13zedas leaves the room.
01:44:34bricolage_ leaves the room.
02:19:45hookET leaves the room.
02:55:02boyscoutcabo * [656] /rubinius/trunk (kernel/bootstrap/context.rb lib/bytecode/compiler.rb) Temporary fix for #40 until evan figures out the permanent fix.
02:56:41maeevan ??
02:56:48maeyou want side effects with -e?
03:01:36caboCould someone please check in new .rbas? Mine are too tainted by debug output and I don't want to have another huhu event.
03:01:53tlockney leaves the room.
03:01:54caboOh, and you HAVE TO REMOVE ALL .rbc due to the compiler change.
03:02:29caboCompiler changes are not currently considered by the build process.
03:02:55caboanybody awake?
03:03:47rueThere is nobody here but us dust bunnies
03:05:56maei'll do it cabo
03:06:12caboOops, my fix also made Rubinius 20 % faster.
03:06:32boyscouthurdlea * [657] /rubinius/trunk (kernel/core/regexp.rb runtime/core.rba spec/core/matchdata_spec.rb) * Added MatchData#values_at
03:06:32boyscout* Fixed implementation of MatchData#select
03:06:32boyscout* Updated specs for MatchData#values_at, select
03:07:19maefind . -iname *.rbc -print0 | xargs -0 rm -f
03:09:59rueInteresting change
03:11:03boyscoutmae * [658] /rubinius/trunk (5 files) new rba's for cabo -- and updated reports
03:16:35maeanyone know why evan cussed about the side effect change to -e
03:17:53rueEw dunno
03:23:05caboit was a change
03:23:12caboand it surprised me, too
03:23:18caboI was starting to hunt the bug
03:23:27cabothat mysteriously suppressed the output
03:24:16rueHm. shotgun/rubinius -dc -dl -e '[[1,2]].each {|a, b| p a, b}'
03:24:26rueIs partially addressed by that change too
03:25:34rueWell, it changes the output I should say
03:26:47ruePreviously it printed 2, Tuple... whereas now it is [1, 2], nil
03:28:09hurdleahi, I just svn up and I have a broken build
03:28:25ruehurdlea, did you get 657 also?
03:28:32hurdleaI am getting => No method 'to_sym' on an instance of Tuple. (NoMethodError)
03:28:38rueAnd remove all .rbc?
03:29:53hurdlearue: I have deleted rbc's and rebuilding now
03:37:57hurdleaHmm, still have a problem
03:39:26rueWhy do we have lib/bytecode and native/bytecode again?
03:42:43rueThat is weird
03:43:28ruehurdlea, Regexp#quote is not in the repo yet?
03:44:14rueOh, nevermind, it is aliased
03:50:40brixenhurdlea: fwiw, I have r658, deleted all rbc and did build:rubinius and I don't get an error on [[1,2]].each {|a, b| p a, b} => [1, 2]\n nil
03:51:22rueSame here
03:51:36rueI am not sure how you are getting to Regexp.quote anyway actually
03:53:45rueHa, another flag. DEBUG_ASSEMBLER
03:53:51boyscoutmae * [659] /rubinius/trunk (bin/reports/compare.rb reports/completeness.html) made completeness report grok bootstrap for system errors -- cabo can we make those ruby or do they have to be c?
03:55:15maeits looking promising :)
03:56:07hurdleaok, I'll try a fresh checkout
03:57:11hurdlea leaves the room.
03:58:06maecan we turn this sexp into sugar for meta instance
04:00:18rueDo what?
04:00:47cabomae: they have to be c
04:03:26blinkDoes rubinius still require gcc4 to compile? ;/
04:08:38maein the compiler how do i get the meta class
04:08:44mae add "push self" is current instance
04:38:12nutrimatt enters the room.
04:39:59rueHm. GDB is not too useful in stepping through the ruby parts, eh? :/
04:49:42maeso um
04:58:23maei need help
04:58:29maewho is compiler expert
04:59:55maei'm trying to make @@x = 1 the same as self.class.instance_eval { @x = 1 }
05:02:17rueIt has been decided, breaking compatibility and all?
05:04:21maewell it will not really break compatibility
05:04:25maeit will work pretty much the same
05:05:20rueBut it does. @@ are shared in a hierarchy
05:05:55maeif Class === self then its (class << self; self; end).instance_eval
05:06:25maeif its != Class then its self.class.instance_Eval
05:06:39maeit would be shared in a hierarchy
05:07:13chris2 enters the room.
05:07:29rueThen that would break compatibility with @. Unless those two behave differently in which case the two are not the same
05:07:43maebasically the same behavior can be emulated
05:07:46maeyeah i don't mean exactly
05:07:52maewell in some ways mri class vars suck
05:07:54rueBut Ruby has different semantics for @@ and @
05:09:15ruechris2, morning. Early one for you, eh?
05:10:04ruemae, basically you would always have to detect whether a superclass defines that class variable and change it THERE
05:11:02maeis the hierarchy useful for anything really
05:11:13rueNot really, but that is beside the point :)
05:11:57maethey are a wart
05:12:05maei think they should be annihilated
05:12:18rueThis would not be extra functionality which is easier to pass through, it would be a change
05:12:24ruechris2, pretty early
05:12:40chris2usually, i have to wake up at 6.30am...
05:14:08maerue: yeah i think it needs more discussion
05:14:11maei wish we could get matz in here
05:16:27defn52 leaves the room.
05:17:02rueI think they are being changed for 1.9 actually
05:21:49rueOK, autovivification of labels is messing me up
05:23:54maei don't understand why we need class vars
05:24:43rueIf 1.8 compatibility is needed then class variables are needed
05:25:12maerue: class variables are pretty useless, those that use them can spend very little time to refactor them into class instance vars
05:25:52rueWell, I would argue otherwise unless we target 1.9
05:26:30maerue: i'll bet you that if we just made @@ behave like instance variables most stuff would still work fine
05:26:43maetheres not many people that depend on the crazy behavior of class vars
05:27:05rueTalk to evan and see what he says. I certainly would not miss class variables but compatibility breakage is always bad
05:27:33maerue: why don't we just do the instance "hack" and put a big DEPRECATION notice in big letter s:)
05:27:37maeas long as it behaves the same
05:27:49maethat way we don't have to pollute the vm
05:39:50maerue: class vars are crazy and useless:
05:40:02maeif anyone is writing code that depends on this behavior they should be shot
05:40:44rueYou can give all the arguments you want but it is still 1.8 behaviour
05:41:03maerue: it doesn't matter, find me one project that depends on that behavior that means anything
05:41:38maewe're also breaking compatibility with defined? to just return true/false rather than strings
05:41:52maebecause its totally never used and pretty much worthless
05:42:13rueYes, it does matter. It is just a question of breaking compatibility and I am the wrong person to talk about that
05:42:27rues/talk/talk to/
05:42:59maerue: we're not breaking "important" compatibility
05:43:26maemost people use class vars as a glorified constant
05:43:45maeor global var for that matter
05:43:52rueI am not going to argue further, it is not my decision.
05:44:09maesalutes rue
05:44:12maebedtime for me
06:20:05rueHm. A method call always has an array to hold arguments
06:31:30rueI am manually stepping through a program. Oh joy of joys
06:57:31mitsuhiko leaves the room.
08:19:30jadams_ enters the room.
08:20:51jadams leaves the room.
08:52:31jadams_ leaves the room.
09:08:35caboWas Tuple#each broken all the time or did I break it in 657?
09:35:04caboOh, the compiler breaks that one. Bytecode::MethodDescription#encode_literals
09:35:28paterue, still here?
09:38:12caboOops, OMSIZE Heisenbug.
09:39:19pate leaves the room.
09:47:28caboIt all comes back to this MRI gem:
09:47:44caboIt seems I cannot work on this without a serious course in MRI splatology.
09:51:21boyscoutcabo * [660] /rubinius/trunk/shotgun/lib/rubinius.c (Fix an indento.)
09:57:27boyscoutcabo * [661] /rubinius/trunk/shotgun/lib/object_memory.c Fix stylo; remove OMSize diagnostic so specs can be run reasonably with RUBINIUS_OMSIZE set.
10:06:17lopex enters the room.
10:31:55hookET enters the room.
10:46:39tlockney enters the room.
10:56:35hookET leaves the room.
11:00:12chris2 leaves the room.
11:00:12lopex leaves the room.
11:00:12evanfarrar leaves the room.
11:00:13nutrimatt leaves the room.
11:00:13cabo leaves the room.
11:00:13headius leaves the room.
11:00:13wnight leaves the room.
11:06:28rue enters the room.
11:10:16cabo leaves the room.
11:14:46boyscoutcabo * [662] /rubinius/trunk (7 files) Start work on String#[]=
11:14:46boyscoutIn the process, fix CHARACTERS "lameness"
11:18:58mae enters the room.
12:47:08zedas enters the room.
12:58:26nicksieger enters the room.
13:26:27maei got my PhD in splatology from IRC U
13:35:46maehi nick
13:37:20tlockney leaves the room.
13:47:57maeevan JOO bastard
14:05:05cabo`mae: So can you explain to me, pretty please?
14:12:59chris2 leaves the room.
14:14:27jadams leaves the room.
14:18:39maewasn't mine
14:20:41cabo`` enters the room.
14:20:54maecabo``: wasn't mine
14:21:01cabo` leaves the room.
14:23:30wnight leaves the room.
14:38:50wagonee enters the room.
14:41:07nutrimatt leaves the room.
14:56:55maetime for me to do some hw
15:28:59maehow do i test something is an object in a primitive
15:40:32cabo``mae: Everything is an object.
15:40:46cabo``Do you mean non-immediate? REFERENCE_P
15:40:53maeah ok
15:41:16cabo``rubinius.h makes really good reading.
15:41:23cabo``Too bad it's off in include/
15:41:50maewhen primitives are getting built which header files are included
15:42:01maeSTRING_P is defined in string.c
15:43:54mae#define TRUE 1
15:43:56maewhy do we have this
15:44:00maec99 defines a bool type
15:52:51maea FIXNUM is not a reference right?
16:01:29defn52 enters the room.
16:04:47maehey def
16:16:18boyscoutmae * [663] /rubinius/trunk (runtime/compiler.rba shotgun/lib/cpu_primitives.c shotgun/lib/primitives.rb) primitives cleanup any experienced people please look at FIXME's
16:24:33ruecabo``, the pastie seems correct to me. What is the problem there?
16:27:34maecan anyone explain create_pipe in primitives.rb to me
16:27:47defn52_ enters the room.
16:28:35cabo``rue: The problem is I don't understand it :-)
16:28:39defn52 leaves the room.
16:30:23cabo``mae: STRING_P is defined in cpu_primitives.c:56:#define STRING_P(obj) (RISA(obj, string))
16:31:06cabo``The problem is that the predicate only makes sense in a specific state, as that's where the globals live, and you can only find out whether something is a string by comparing its klass with the global String
16:31:46cabo``mae: I don't think it would be wise to limit ourselves to C99
16:31:56cabo``And yes, FIXNUM is not a reference.
16:36:41cabo``as are the other immediates: SYMBOL and the four specials (nil/fals/true/undef)
16:36:47cabo``everything else is a reference
16:37:12cabo``rue: Maybe you want to write this up in your IRC summary, so that at some point it goes into the Wiki...
16:38:59rueAbout the references and such, sure
16:39:39ruecabo``, oh and throw in a paired Array instead of a Hash for extra hilarity
16:41:17ruecabo``, but otherwise it is very simple. The actual value passed in is an Array (basically pairs) in all cases. The first two automatically splat it like normal multiassignment. The *o just gathers all arguments into an Array--and the only argument is an Array pair
16:41:21maecabo why is Qundef -- 6L
16:41:28maei would think it would be 8L if your trying to do bits
16:41:54boyscoutmae * [664] /rubinius/trunk (runtime/compiler.rba shotgun/lib/cpu_primitives.c shotgun/lib/primitives.rb) more code cleanup -- test it!
16:42:20ruecabo``, the difference between #each and #select is that #select /uses/ #each through Enumerable and has already unpacked the Array when it sends it to your block
16:42:27cabo``mae: The only important things:
16:42:40cabo``The four specials are < 10 (see REFERENCE_P)
16:42:48cabo``and they are even (see FIXNUM_P)
16:43:09cabo``rue: OK, it had to be something like this
16:43:41cabo``but how do we get the same behavior in rubinius?
16:44:22cabo``(BTW, I just compiled Rubinius with a completely different object representation, just to make sure the code is actually representation-oblivious)
16:44:42cabo``state.h and symbol.c need to be fixed just a bit, the rest already is
16:44:59cabo``running a few more tests, though
16:59:21cabo``rue: Thanks, I'm starting to build a mental model...
17:02:29ruecabo``, added a couple at the bottom
17:04:24cabo``rue: Apparently, we need more code at the place where a block accepts its arguments.
17:04:37rueFew more for good measure
17:05:41cabo``This is insane.
17:05:45rueSo: A) multiple parameters are always treated as separate B) Arrays will always use multiple assignment semantics when the block argument list allows that
17:06:14rueAnd C) if the object responds to #to_ary and multiple assignment is in play, #to_ary gets called
17:06:53defn52blocks are fun :)
17:06:54cabo``Yeah, so my hack to turn a single block parameter into an masgn is not it
17:07:16cabo``The logic to call to_ary is gated on the masgn
17:08:09cabo``But still, turning "yield 1, 2" with |a| into [1,2] requires moving a tuple
17:08:15rueActually, let us revise B to say only if the Array is the only argument
17:08:18cabo``So half of the patch is useful.
17:08:27cabo``rue: Yes.
17:09:20defn52i also thnk splat needs to be considered on the calling side
17:09:30defn52yielding side, i mean
17:09:46rueThat would be normal method call semantics as far as I understand though
17:10:05defn52i think it currently breaks the compiler though
17:10:34rueWell that is certainly possible
17:11:23defn52it only breaks yields
17:11:26defn52not regular function calls
17:11:36defn52this might be a result of the masgn hack though
17:11:53defn52shotgun/rubinius -e 'def test(a,b); p a; end; a = [1,2]; test(*a)'
17:11:54cabo``That is at the receiving end.
17:12:09defn52shotgun/rubinius -e 'def test; a = [1,2]; yield *a; end; test {|a| p a}'
17:12:43defn52shotgun/rubinius -e 'def test; a = [1,2]; yield *[1,2]; end; test {|a| p a}'
17:12:44rueBut yield itself has no special processing for its arguments, just the receiving block
17:12:59cabo``The masgn hack is not capable of breaking process_yield :-)
17:13:07defn52ok...i was just speculating
17:13:21cabo``You have to compare process_yield with process_call
17:13:27defn52ah ok
17:13:32ruecabo``, there is no simple way to step through execution of the Ruby parts of the compiler is there?
17:14:03cabo``You can run your favorite Ruby debugger on rcc
17:14:06zedas leaves the room.
17:14:28rueOh, rcc will do it? See, I still have no idea which parts are current and which not :/
17:14:37rueThat is what I used last night
17:15:08cabo``Looks great, but what is it? :-)
17:15:35cabo``I mean, what is the Ruby code that got you into this
17:15:44rueThe compilation process of [[1,2]].each {|a, b| p a, b}
17:16:57rueThen I spent too much time with trying to figure out the label translation because I did not see translate_labels and the label hash was autovivifying. Also it was 6am at that point
17:17:15cabo``OK, labels actually work fine.
17:17:36rueSo today I was going to look at encoding since I did finally figure out the assembly
17:17:58cabo``Good. Any questions about the encoding?
17:19:57rueNot yet, I did not look at the code though the actual encoding was a bit puzzling. For example -> push_int ([55]) encoded as: "\a\000\000\0007"
17:20:20cabo``'7' = 0x37 = 55
17:20:44cabo``You always have one bytecode, followed by one or two 4-byte MSB first integers.
17:21:05cabo``So each instruction is 1, 5 or 9 bytes.
17:21:16cabo``Pretty boring :-)
17:21:33cabo``The opcode gates whether there are 0, 1, or 2 parameters.
17:21:35rueOh! I for some reason read the string as already being hex which it obviously is not
17:23:58cabo``It looks like you are now the resident code generation expert ;-)
17:26:40rueHm. Does rcc use any obsolete parts?
17:26:50cabo``Like rcompile
17:27:24cabo``It's essentially rcompile + pretty print
17:30:33rueWell, that might be useful. I will dig around the code some more.. then the flipside of the coin is of course the interpreter
17:31:10cabo``You cannot do much work at BlockEnvironment#call
17:31:24cabo``because you don't know whether the block has one or multiple parameters
17:31:44rueOh yes and reading up on the contexts
17:32:37cabo``So either you do all the work in the generated code (which I would prefer), or you have to insert some information into the BlockEnvironments create_block creates
17:33:56tlockney enters the room.
17:35:36nutrimatt enters the room.
17:36:18rueThe sexp seems odd
17:37:00rue|a, b| is [:masgn, [:array, [:lasgn, :a, 2], [:lasgn, :b, 3]], nil, nil]
17:37:23cabo``Is means we have an assignment, but not the rhs
17:37:24rue|a, *b| is [:masgn, [:array, [:lasgn, :a, 2]], [:lasgn, :b, 3], nil]
17:37:42cabo``Aha, so [2] is the splat.
17:37:54cabo``Sounds reasonable looking at process_masgn
17:38:32rueRight so the second lasgn gets shifted to the third position
17:38:59cabo``[1] is the array of normal parameters.
17:39:02cabo``[2] is the splat.
17:39:21rueAnd splat does a cast_array
17:40:10cabo``I have to look up that insn
17:40:59rueHowever, I suppose that does not solve our problem yet because it depends on what is actually passed in
17:41:09cabo``It makes an array if the TOS is a tuple, otherwise it makes a single-array element if it is not
17:41:46cabo``single-element array, that is
17:42:19rueI am still confused by tuples as sad as that is
17:42:56rueWell, more about where they are getting generated and all that
17:43:18cabo``Tuples are to arrays what bytearrays are to strings
17:44:39cabo``Tuples have any number of fields, each of which carries an object
17:44:56cabo``arrays have essential two fields: a size (@total) and a tuple (@tuple)
17:45:03cabo``so a tuple is a "naked" array
17:45:21cabo``It can't grow, as arrays can (be replacing their tuple)
17:49:24rueOK.. so the lasgn maps out to an unshift_tuple, set var, pop
17:50:11cabo``(in an masgn:) yes
17:53:16lopex leaves the room.
17:53:54lopex enters the room.
17:56:05boyscoutcabo * [665] /rubinius/trunk (include/rubinius.h shotgun/lib/state.h shotgun/lib/symbol.c) Move as much of the representation-dependent constants into rubinius.h
17:56:05boyscoutas possible The fact that the main code is representation agnostic can
17:56:05boyscoutbe tested by setting ALTERNATIVE_REPRESENTATION to 1 in rubinius.h
17:56:05boyscout(but please don't check it in that way...).
17:56:25cabo``Fewer mystic constants in the code...
17:56:34cabo``But still a long way to go.
17:57:27cabo``In file included from cpu_primitives.c:71:
17:57:27cabo``system_primitives.gen: In function ‘cpu_perform_system_primitive’:
17:57:27cabo``system_primitives.gen:1505: warning: implicit declaration of function ‘regexp_options’
17:57:38cabo``Who was that? :-)
17:57:40rueOh. Is the current_op byte-based?
17:58:05rueIn the assembler
17:58:37cabo``I haven't really studied the assembler, but I would think so.
17:59:22rueBecause some operations increment it by 5 or 10 etc. and obviously the labels like 85 and 55 and so on. Have to look into that
17:59:42cabo``5 = 1+4.
17:59:46cabo``Where is 10???
18:00:42rueLine 337
18:00:51cabo``Oh, right, but that's just 2 ops
18:01:49rueSo 1+4 is one op plus what, the data? Or something completely different
18:02:10cabo``an immediate integer argument, 4 bytes, MSB first
18:02:22cabo``insns are 1, 1+4 or 1+4+4
18:02:27cabo``hence 1, 5, 9
18:02:37rueRight, so it is incrementing the current_op by the byte count there
18:02:45rueI think
18:02:49cabo``Yes, indeed.
18:02:58cabo``It needs to keep track to fill in the labels.
18:03:10rueSo the labels are just byte offsets
18:03:19cabo``Yes. From the start of the meth
18:05:15rueSo where would be the best place for the logic for the block masgn? The masgn is obviously given to us in the sexp so that is half the struggle. Then we need to identify whether we are being passed a single Array as an argument?
18:05:42cabo``yes, and that can only happen dynamically
18:05:48cabo``so we have to generate code to do that
18:08:15cabo``I think I'll have to call it a day, c u tomorrow
18:08:40rueYep, bye!
18:08:54cabo``Good night :-)
18:19:37zedas enters the room.
18:28:36nutrimatt leaves the room.
18:31:47cabo`` leaves the room.
18:48:41rueAway for a bitty
18:48:52nicksieger leaves the room.
18:52:19jadams enters the room.
19:10:06srbaker_ enters the room.
19:10:18srbaker_ leaves the room.
19:11:53srbaker leaves the room.
19:12:51srbaker enters the room.
19:14:31srbaker leaves the room.
19:14:45srbaker enters the room.
19:28:05defn52_ leaves the room.
19:57:53maewhy is the 1L needed
19:58:22maehwhats wrong with (0L<<SYMBOL_SHIFT)
20:01:20lopex leaves the room.
20:04:35rue1L != 1
20:04:50maeshouldn't this work
20:04:50mae shotgun/rubinius -e "Ruby.asm('push 1; push 1;'); Ruby.primitive(:compare);"
20:06:35rueIt seems likely that that misses something crucial
20:06:49rueWhat does the asm from 1 <=> 1 look like?
20:07:51maehow do i find out
20:08:29rueWhat does compare correspond to?
20:08:38rueDEBUG_ASSEMBLER=y and -dc
20:09:58maepush 1
20:09:58maepush 1
20:09:58maesend <=> 1
20:11:14mae"#line 1\npush 1\npush 1\nsend <=> 1\nret\n"
20:15:32maerue: i have a need to invoke the primitive directly
20:19:50maewhere do primitives get called
20:20:06maei mean in the bytecode
20:20:07maehow rather
20:26:23rueWhy do you need to call it directly?
20:28:33maeis cpu_instructions.c deprecated by instructions.c?
20:28:45maerue: i'm going to create a why to unit test the behavior of the primitives
20:28:53maeso the primitives behavior is defined better
20:28:57maeand tested better
20:30:56maecompare is 4
20:34:30maeDEBUG_ASSEMBLER=y shotgun/rubinius -dc -e "Ruby.asm 'push 1\npush 1\npush 4\nsend_primitive'"
20:39:37maewhats the different between native/bytecode and lib/bytecode
20:43:46maeDEBUG_ASSEMBLER=y shotgun/rubinius -dc -e "Ruby.asm 'push 1\npush 1\nsend_primitive :compare'"
20:50:26zedas leaves the room.
20:50:39ruenative/bytecode only has one file. Never found out why those are split
20:51:55maewhat am i doing wrong
20:52:13mae No method 'strip' on an instance of Fixnum. (NoMethodError)
20:55:45hurdlea enters the room.
21:11:17nicksieger enters the room.
21:11:33zedas enters the room.
21:14:27maehey zed
21:21:45defn52_ enters the room.
21:30:21maeOH DUH
21:30:26maethe compiler is borked
21:35:24maei'll fix it
21:38:52boyscoutmae * [666] /rubinius/trunk (lib/bytecode/compiler.rb runtime/compiler.rba shotgun/lib/cpu_primitives.c) def ivars; Ruby.asm "push self\npush 0\nfetch_field"; end
21:38:52boyscoutnow compiles on rubinius (rather than having to use rcompile)
21:38:52boyscoutfixed primitive error message to be more helpful
21:58:13rueThink there was a Ruby.primitive too
21:58:52maewhat i really need to be able to do is manipulate with asm
21:59:02maeso i can change context without writing tons of boilerplate ruby
22:00:22maeit seems asm doesn't work in the compiler ?
22:02:26maeNo method 'asm' on an instance of Module. (NoMethodError)
22:02:32maei thought this was a compiler directive
22:05:26maei wish evan was around
22:28:59hookET enters the room.
22:43:10boyscoutmae * [667] /rubinius/trunk (lib/bytecode/compiler.rb runtime/compiler.rba) fixed regression -- should be best of both worlds now
22:46:27hurdlea leaves the room.
22:50:08defn52_ leaves the room.
22:50:19rueHm, I wonder if the second parameter to str is used anywhere
22:50:58maewtf is that for
22:52:56rueWhy are you trying to isolate the primitives?
22:53:52maeto test them
22:53:56maelike i said before
22:58:25defn52_ enters the room.
23:00:12jadams leaves the room.
23:17:55rueBut is it necessary to test them outside the user-reachable methods?
23:25:03maerue: if i want to automate it then i have to be able to modify the context easy
23:25:15maeso its either this (small amount of code) or i have to generate all kinds of class structures etc
23:25:40maeprimitives only know that they have to process some stuff sitting on the stack
23:34:40hookET leaves the room.
23:46:02maemessing with rubinius asm is fun :)
23:52:08maei just thought of a problem :\