Parrot 0.6.3 "Beautiful Parrot" Released | parrotcode.org/ | 5/649/88 new/open/stalled tix | logged in irclog.perlgeek.de/parrot/today
Set by moderator on 26 June 2008.
00:09 AndyA joined
dalek r29216 | jkeenan++ | trunk: 00:23
: [configure] Refactor code from auto::pack::runstep() into _set_format(),
: _pack_test(), _set_packtypes(). Then test these internal subroutines.
diff: www.parrotvm.org/svn/parrot/revision?rev=29216
pmichaud jonathan: (for scrollback reading) As of right now I don't know how far I'll get with signatures/refactorings before tomorrow -- it might be safer to hack on something else if convenient, but I also don't want to block you from getting things done. That's about the best answer I have at the moment. 00:39
bacek_ pmichaud: I did some investigations about #56650. 00:44
Problme is: Parrot_oo_register_class uses ResizableStringArray for class name. But mmd (actually mmd_distance) uses plain string. So it just can't find proper multy sub 00:45
And my parrot's knowledge are not so strong to fix it... 00:46
00:53 ewilhelm joined, ewilhelm left 01:02 Eevee joined
dalek r29217 | jkeenan++ | trunk: 01:04
: Add two tests to complete coverage of all conditions.
diff: www.parrotvm.org/svn/parrot/revision?rev=29217
pmichaud bacek_: mine aren't strong enough to fix it either. I don't know when it'll get fixed.
bacek_ oh... 01:08
01:11 TiMBuS joined
Whiteknight bacek_, did you post a ticket about it? 01:38
I could take a look at it with some more details
bacek_ Whiteknight: rt#56650 01:39
I's pmichaud's original ticket 01:40
Whiteknight oh, okay
bacek_ Whiteknight: poblematic functions is mmd_distance and mmd_cvt_to_types
Whiteknight so we want mmd_distance to be able to take a PMC array with class names, in addition to a simple string? 01:46
pmichaud supposedly it already can 01:47
supposedly I can write :multi(['Foo';'Bar'])
Whiteknight "supposedly"?
pmichaud I haven't tested it directly. Let me do that.
bacek_ Whiteknight: probably we want create RSA and put bare string into it and lookup in case when first lookup failed 01:48
Whiteknight I'm still young and arrogant enough to think I can tackle any problem, so this should be a snap! 01:50
nopaste "pmichaud" at 76.183.97.54 pasted ":multi already works with multi-string keyed types" (24 lines) at nopaste.snit.ch/13539
pmichaud let's try it with an array 01:51
bacek_ pmichaud: if you'll add :multi(_) it will fail...
Whiteknight oh, so then what does the ticket need?
pmichaud bacek_: it works for me
dalek r29218 | jkeenan++ | trunk: 01:52
: Write unit tests for _handle_ncurses_need().
diff: www.parrotvm.org/svn/parrot/revision?rev=29218
nopaste "pmichaud" at 76.183.97.54 pasted "for bacek: works with :multi(_), also" (29 lines) at nopaste.snit.ch/13540
Whiteknight has to look up "manhattan distance" on wikipedia...
pmichaud it even works when a ResizableStringArray is used to create the class 01:53
nopaste "pmichaud" at 76.183.97.54 pasted "using RSA to create the class" (31 lines) at nopaste.snit.ch/13541 01:54
pmichaud it doesn't work when the class is created from a namespace, and _that's_ what the ticket is about
nopaste "bacek" at 211.29.157.151 pasted "Gotcha! Bug #56650" (34 lines) at nopaste.snit.ch/13542
bacek_ pmichaud: indeed
01:55 petdance joined
pmichaud bacek_: the problem isn't the :multi(_), it's the fact that Parrot doesn't correctly map the namespace key used to create the class to the :multi's that refer to the same namespace. 01:55
in nopaste 13542 -- it's not that :multi(_) causes it to fail, it's that it doesn't correctly match either of the other two :multi subs (and it should)
note also that it's probably an error to use newclass on both ['ABC';'Bar'] (the key) and the ['ABC';'Bar'] namespace. 01:56
i.e., it should indicate a duplicate class or something.
Whiteknight so what's the cause of that? The fact that in bacek_'s second example, the namespace was created indirectly? 01:57
pmichaud I think bacek's example isn't robust
a simpler example is:
nopaste "bacek" at 211.29.157.151 pasted "Total screwing of parrot..." (30 lines) at nopaste.snit.ch/13543 01:59
Whiteknight in bacek_'s example, the type of the last argument should still be 'ABC';'Bar'
bacek_ swapping two parts produces 'right/wrong'...
Whiteknight so it should still trigger the class method
pmichaud in bacek's example, the second newclass opcode should throw an exception.
as we already have a ['ABC';'Bar'] class
Whiteknight just a sanity check: classes that are created like that indirectly should be stored in the same lookup list as classes created directly, right? 02:01
nopaste "pmichaud" at 76.183.97.54 pasted "simpler example showing failure" (25 lines) at nopaste.snit.ch/13544
Whiteknight because if it's not throwing an exception, I'm lead to believe Parrot isn't detecting the two namespaces as being equivalen
pmichaud in nopaste 13544, if you change the newclass line to read "$P1 = newclass ['ABC';'Bar']" (instead of using the namespace) then everything works. 02:02
Whiteknight well, that's a confusing example!
nopaste "pmichaud" at 76.183.97.54 pasted "simpler example showing success when using explicit key instead of namespace" (24 lines) at nopaste.snit.ch/13545
pmichaud as I understand it, every class has one associated namespace and vice-versa 02:03
(although it's possible to create a namespace without a corresponding class)
it's not possible to have more than one class for the same namespace
Whiteknight so that gets back to my sanity check question: Why are your two examples returning two different results?
pmichaud I don't know why. I think it's a bug, and that's what I reported in RT#56650 :-) 02:04
I think that the two should probably be equivalent. Either that or we need a clearer explanation of how to use :multi for classes created from namespaces. Or, more generally, I want to know how to create a class in another HLL that can also participate in MMD 02:05
Whiteknight I say that the two cases should absolutely be equivalent
I don't see any benefit to having different behaviours like that
pmichaud I'm not the Parrot architect, so I'm not the one that makes the decisions as to what "should" or "should not" be the case. :-) 02:06
Parrot would look somewhat different if I were that person. :-)
bacek_ newclass ['Abc'] passing Key pmc to Parrot_oo_registrer_class
pmichaud so, all I try to do is report "this doesn't work the way I expect" and "I can't seem to achieve the following result" and hope that a Parrot person will help me out. :-) 02:07
bacek_ newclass $P0 (from namespace) passing just RSA .
and this causes all problems.
pmichaud ...RSA, really?
I thought it would be passing the namespace itself
bacek_ pmichaud: yes
pmichaud line?
bacek_ (gdb) p name->vtable->whoami.strstart
$7 = 0x705e0e "ResizableStringArray" 02:08
Whiteknight it would be a simple matter in the newclass opcode to always convert the input to one type of PMC or the other
Andy Who wants ack plugins?
bacek_ 657\tParrot_oo_register_type(PARROT_INTERP, ARGIN(PMC *name))
Andy YOU want ack plugins!
Whiteknight Andy, you have ack plugins?
davidfetter what about phththpt plugins?
pmichaud bacek: but when I create the class from a RSA, everything works.
bacek_ pmichaud: just a sec
nopaste "pmichaud" at 76.183.97.54 pasted "simpler example showing success when using RSA instead of namespace" (26 lines) at nopaste.snit.ch/13546
02:08 Ademan joined
Andy Hey, we could have plugins that let you ack through tables! 02:09
pmichaud bacek_: it only seems to fail when using a namespace to create the class.
RSA works, key words
*works
bacek_ pmichaud: it converted to Key somehow 02:10
Whiteknight so if it's an RSA or a key, it works as intended, but if it's a string, it doesnt?
pmichaud if it's a RSA or a key, it works as I expect, but if it's a namespace, it doesn't.
bacek_ Whiteknight: no. Parrot_oo_register_class recives Key event you create class from RSA
s/event/even/
Breakpoint 1, Parrot_oo_register_type (interp=0xb122e0, name=0xd5d3c0) at src/oo.c:662 02:11
662\t fail_if_type_exists(interp, name);
(gdb) p name->vtable->whoami.strstart
$8 = 0x705524 "Key"
oops.
Sorry.
Its actually recieve RSA...
Whiteknight is even more confused now 02:12
bacek_ Whiteknight: nopaste.snit.ch/13543... 02:13
pmichaud bacek_: I still claim that example is bogus.
well, except that the first call to 'foo' is an error
bacek_ pmichaud: yes.
We should get 'already registered' exception... 02:14
pmichaud but my example (13544) shows that error already.
(the wrong sub call, not the already registered)
the fact that the second newclass doesn't throw an exception is probably also a bug, but it's not immediately obvious that it's relevant to the bug I filed in #56650
bacek_ thinks always converting Key to RSA is not bad idea.. 02:15
pmichaud I don't think that's an issue either.
(example coming.)
nopaste "pmichaud" at 76.183.97.54 pasted "newclass from identical Key and RSA" (11 lines) at nopaste.snit.ch/13547 02:17
02:17 Coleoid joined
pmichaud okay, that's a bit weird. 02:17
nopaste "bacek" at 211.29.157.151 pasted "Works..." (28 lines) at nopaste.snit.ch/13548
pmichaud sure, I'd expect it to work there, because the class was created from a Key 02:18
my problem is when the class is created from a namespace
Whiteknight well, how does the "class created from a namespace" algorithm work? 02:19
pmichaud I don't know. Them's Parrot guts.
Whiteknight i.e. what is that particular mechanism doing differently?
pmichaud I really don't know how the class registry works (or is supposed to work). If I did, I could probably fix #56550 :-) 02:20
see, for example, RT#43419 02:21
(which is another bug that I haven't figured out what is supposed to happen) 02:22
Whiteknight looks like the magic is happening in src/pmc/class.pmc lines 1083-1092 02:27
1079-1092*
pmichaud personally, I find the fact that Parrot tends to reduce all class references to string lookups quite scary. 02:28
or string comparisons.
Whiteknight it's iterating over the initialization object. for a simple key or a string, that creates a single attribute "Foo;Bar"
but for an array, that creates two separate attributes "Foo" and "Bar"
we could easily improvify that loop to split all strings at ';' 02:29
pmichaud wait, I'm confused
why split strings at ';'? 02:30
Whiteknight to get array-like behavior
pmichaud none of my examples had ';' in the strings passed to the newclass opcode
Whiteknight maybe that's not the separator then. How does a namespace pmc stringify?
pmichaud does it get stringified? 02:31
I figured the namespace pmc is passed as the pmc
Whiteknight okay, rephrased: when I call VTABLE_shift_string on a namespace iterator, what do I get back?
because that's the call that's making the magic happen
pmichaud ahhhh 02:32
I would think that a namespace iterator would iterate over the keys in the namespace
since a namespace is effectively a Hash
that might explain a lot.
note that I mean literally the keys (symbols) in the namespace, not the namespace's name. 02:33
Whiteknight Could the hash iterate in a different order from an RSA?
pmichaud if I do:
set_hll_global ['ABC'], 'foo', $P0
set_hll_global ['ABC'], 'bar', $P1
set_hll_global ['ABC'], 'baz', $P2
and then iterate over the ABC namespace, I'd expect to get back the keys 'foo', 'bar', and 'baz' 02:34
because those are the symbols in the namespace
Whiteknight right
pmichaud whereas if I have a RSA that was created from rsa = split ';', 'ABC'
I'd get only one value back from the iterator -- I'd get 'ABC'
Whiteknight so the namespace isn't treating it's base as one of it's keys? 02:35
pmichaud it may do that... my point simply being that iterating over the ['ABC';'DEF';'GHI'] namespace will not give you 'ABC', 'DEF', and 'GHI'
Whiteknight it wont? what do you get instead? 02:36
pmichaud it will give you any symbols that were stored in the ['ABC';'DEF';'GHI'] namespace.
Whiteknight okay, okay
pmichaud a namespace is a Hash, not a String :-)
a RSA is an array
(an array of strings)
Whiteknight so for the case of a namespace PMC, isntead of iterating over it, we should get it's name string, separate it into an array, and then iterate over the array to instantiate the class?
pmichaud actually, I'm thinking that 'get_name'() on a namespace may already return an array 02:37
Whiteknight haha, this is too much
pmichaud I know it does for a class.
at least, I seem to recall that it does.
but wait wait wait 02:38
Whiteknight either way, I know where the problem is happening, somebody just needs to tell me how to fix it
pmichaud lines 1079 through 1092 are not iterating over a name
Whiteknight they're iterating over the given PMC
pmichaud they're iterating over a hash containing attributes to be used to initialize the class
Whiteknight isn't that the same? 02:39
pmichaud yes, the 'init' PMC is a Hash containing attributes for initializing the class
it's a list of attributes, not the components of the name
Whiteknight which can be a namespace or an RSA
pmichaud I guarantee that the 'init' PMC is a Hash.
Not a namespace nor RSA.
Whiteknight it's never cast to one anywhere in the call chain from the newclass opcode
at least, not that I have seen 02:40
pmichaud src/pmc/class.pmc:502-504 02:42
Whiteknight so are we looking instead at the "initialize_parents_pmc" call at 1123?
502-504 makes the class PMC a hash, but the init PMC is the direct input from the newclass opcode 02:43
pmichaud no.
Whiteknight oh, no. wait. I see what's happening
pmichaud 502-504 creates the 'args' Hash from the stringified version of init_data
and then that 'arg's Hash is passed to init_class_from_hash 02:44
er, 'args' Hash
Whiteknight no, the init function is only called if newclass is passed a null pmc
purl okay, Whiteknight.
pmichaud okay, let me double-check my trace 02:45
Whiteknight newclass calls src/pmc.c:pmc_new_init, which calls the instantiate method, not the init method
pmichaud newclass opcode calls pmc_new_init
Whiteknight right
pmichaud which calls the instantiate VTABLE method (okay, you're right)
Whiteknight oh shoot, i missed the second condition, you're right
pmichaud heh 02:46
Whiteknight it only calls instantiate if typeof(init) is a class pmc
pmichaud we've confused each other
Whiteknight for a namespace/rsa/whatever, we call int
init*
pmichaud right.
and then init builds a hash
and calls init_class_from_hash
Whiteknight right, right
pmichaud however 02:47
oh, never mind... misread on my part
anyway, inside of init_class_from_hash, we see if there's a 'name' key 02:48
there is, (because it was set inside of VTABLE init)
so, we do a lookup (line 186) 02:49
check to see if it's a namespace (line 191)
and get the name of the namespace into name_arg (line 193)
at this point I *think* that name_arg is an array PMC of some sort 02:50
-however-
Whiteknight dunh dunh dunh!
pmichaud _but_ 02:52
I think that in the case of a namespace pmc, name_arg will also include the name of the hll namespace
02:52 Auzon joined
pmichaud whereas with the else part (lines 195-199), name_arg will be treated as relative to the current hll 02:52
Whiteknight we should toss in some diagnostics, and see what, exactly it does contain
pmichaud in other words, if I pass in a namespace like ['ABC';'Foo'], then get_name on that namespace probably returns 'parrot','ABC','Foo' 02:53
and so name_arg ends up with 'parrot','ABC','Foo'
Whiteknight so assuming we were to fix this, would we strip the hll namespace from the namespace object, or prepend the hllnamespace to all other objects? 02:54
pmichaud personally, I think that we should prepend the hllnamespace to all other objects, because of RT#43419 02:55
however, I guarantee that this will have far-reaching effects throughout all of Parrot
Whiteknight do I smell the need for a new branch?
pmichaud because then $P0 = new 'Integer' has to recognize that we mean 'Integer' in the current 'hll' 02:56
where right now 'Integer' is "global" across all HLLs
same is true for get_class
Whiteknight well, then maybe we wouldn't do any prepending for a literal string like that
pmichaud in which case strings would always have to be 'parrot';'Integer' 02:57
or we'd have to keep track of two sets of names, or two types of names
Whiteknight so...unfixable?
pmichaud I don't know. These are are architectural decisions which I'm not the person to be making them.
Whiteknight fair enough 02:58
pmichaud allison and/or jonathan probably need to be making these decisions.
I'm perfectly fine with saying that string arguments to get_class/newclass/subclass continue to work as they always have 02:59
Whiteknight whereas key arguments could get an appended hll namespace to better align their behavior with namespace pmcs
pmichaud yes. Either that or we always require the hll namespace as part of the key, and treat them all relative to the root namesapce 03:00
ii.e., $P0 = new ['parrot';'Integer']
Whiteknight that's an option too: always require an hll namespace in a call to newclass
pmichaud or, the most likely option would be to always use a namespace to reference a class 03:01
thus
$P0 = get_root_namespace ['parrot';'Integer']
$P1 = new $P0
but then when we get to things like :multi(...)
.sub 'foo' :multi(['ABC']) 03:02
I think that we have to treat ['ABC'] as being relative to the current hll namespace
Whiteknight so not an explicit .sub 'foo' :multi(['parrot';'ABC'])?
pmichaud we could do that too, but it breaks a lot of existing :multi code
s/too//
i.e., that'd be a significant architectural change. 03:03
Whiteknight does interp cache the current hll namespace?
pmichaud I think so, yes.
Whiteknight then for multis it would be easy enough to get that value implicitly
pmichaud actually, it caches all namespaces up the call chain, iirc 03:04
because we can do $P0 = getinterp $P1 = $P0['namespace';1] to determine our caller's namespace
I didn't put this in the ticket, but here's the real example I want to get to work 03:06
(typing, then nopasting)
Whiteknight ok
03:08 Auzon joined
nopaste "pmichaud" at 76.183.97.54 pasted "what I really want/need for getclass <namespace>" (25 lines) at nopaste.snit.ch/13549 03:08
pmichaud this the same as #56650, but I added HLL stuff to it.
i.e., I want to be able to have code in one hll namespace create a class that exists and works from another HLL namespace 03:09
03:09 Theory joined
Whiteknight okay, that seems straightforward enough 03:09
pmichaud actually
getting back to your earlier question
02:54 <Whiteknight> so assuming we were to fix this, would we strip the hll namespace from the namespace object, or prepend the hllnamespace to all other objects?
I wonder if stripping the hll namespace will be sufficient to let my examples work 03:10
I know that the hll stuff works if the class is created using a key or resizable PMC array
sorry, ResizableStringArray
Whiteknight but it doesnt work if we create it using a namespace object, at least, not without some modification
pmichaud it only doesn't work if created from a namespace. (But as #56650 demonstrates, it doesn't work even for the case where the namespace is in the same hll as the class creation.) 03:11
so yes, stripping the hll namespace object might not take us any closer to solving #43419, but it at least removes #56650 as a Rakudo and other HLL blocker
Whiteknight hypothetical, what if the class pmc had an additional attribute field reserved for an HLL namespace name 03:12
if provided, it's used, if null, the class is global
pmichaud it shouldn't need that, really
there's no such thing as a "global" class.
every class has a namespace
and so that namespace will have an hll namespace.
Whiteknight well, I'm thinking about the simplicity of $P0 = new 'Integer' and the like
pmichaud even 'Integer' is really ['parrot';'Integer'] 03:13
and I think it's a bit of a mistake for HLLs to assume that 'Integer' would get them to the parrot 'Integer' class.
Whiteknight ok, i didnt realize that
pmichaud there aren't that many languages making use of .HLL yet (for precisely these reasons, I suspect) 03:14
Whiteknight I thought there was a lot of work to make .HLL work as advertised
pmichaud there is. #43419 really concerns me -- I'm a little bugged that it doesn't concern anyone else yet. Or maybe they're all sticking-their-head-in-the-sand like me :-) 03:15
anyway, this has been hugely helpful. If you're able to get the strip-the-hll-namespace-from-the-namespace-name to work that'd be, well, fantastic. 03:16
Whiteknight I've got some tuits tomorrow to throw at it
pmichaud I don't think it would break any existing code -- I doubt anyone else is actually constructing classes from namespaces yet :-)
anyway, I have to run 03:17
Whiteknight okay, talk to you later
pmichaud so I'll see you all later
03:22 teknomunk joined
dalek r29219 | allison++ | pdd25cx: 03:36
: [pdd25cx] Change the scope of handlers, so they're always local to the current
: context.
diff: www.parrotvm.org/svn/parrot/revision?rev=29219
r29220 | cotto++ | trunk: 04:56
: [pmc] Add a freeze/thaw test case. This one passes.
diff: www.parrotvm.org/svn/parrot/revision?rev=29220
cotto_home is there any reason not to implement get_string for fixedbooleanarray such that it returns a string of zeros and ones? 05:06
it definitely makes testing easier 05:22
05:22 Psyche^ joined
dalek r29221 | cotto++ | trunk: 05:35
: [pmc] Added get_string method and freeze/thaw tests. All pass.
diff: www.parrotvm.org/svn/parrot/revision?rev=29221
05:45 Theory joined 06:34 uniejo joined 06:35 UltraDM joined 07:05 jan joined 08:12 iblechbot joined 08:18 TiMBuS joined
dalek r29222 | bernhard++ | trunk: 09:08
: [codingstd] Add spaces after comma.
diff: www.parrotvm.org/svn/parrot/revision?rev=29222
09:33 Ademan joined 09:41 Whiteknight joined
dalek r29223 | fperrad++ | trunk: 09:53
: Fix t/src/extend.t failures.
: r29171 introduces Parrot_vfprintf(), so we need to #include <stdarg.h>
diff: www.parrotvm.org/svn/parrot/revision?rev=29223
jonathan pmichaud: (for scrollback) Just been catching up with some other (non-Rakudo) stuff this morning that I didn't get to last night; going to hack on some non-signatures stuff for now. Ping me when you're about - maybe we can work on parts of it together, or something. 10:32
11:24 ruoso joined 11:29 bacek joined 11:51 barney joined 12:00 Whiteknight joined
dalek r29224 | bernhard++ | trunk: 12:13
: [Pipp] 'make pipp' now correctly depends on 'make build-common'.
diff: www.parrotvm.org/svn/parrot/revision?rev=29224
r29225 | Whiteknight++ | gsoc_pdd09:
: [gsoc_pdd09] update to trunk r29223
diff: www.parrotvm.org/svn/parrot/revision?rev=29225
r29226 | bernhard++ | trunk: 12:51
: [Getopt::Obj] Some beautifications.
diff: www.parrotvm.org/svn/parrot/revision?rev=29226
moritz php? 13:17
purl php is really badly designed or swahili for "child molestor" or Philippine pesos or PHP: Hardly Programming or brought to you by the teletubbies or proof there is no god or xrl.us/t6wx or the little transgender brother of perl or tnx.nl/php or easy or was better when it was a templating system or blamed on Rasmus Lerdorf... or the preferred method of delivering MySQL errors to web browsers
jonathan ...wow! 13:21
moritz purl: php is also the worse-is-better approach taken to to dazzling new depths 13:27
purl i'm sorry, but that's too long, moritz
moritz sad
13:37 paco joined 13:39 jhorwitz joined 13:49 gryphon joined
dalek r29227 | bernhard++ | trunk: 13:52
: [Pipp] Option 'd' is a Hash. Remember the settings from the 'd'-option.
: Implement 'ini_get'. Pass test 4 of the spectests.
diff: www.parrotvm.org/svn/parrot/revision?rev=29227
13:59 davidfetter joined
dalek r29228 | bernhard++ | trunk: 14:17
: [Pipp] Start with ini_set() and with $php_errormsg.
diff: www.parrotvm.org/svn/parrot/revision?rev=29228
14:38 gmansi joined, gryphon joined 14:41 iblechbot joined 14:44 rdice joined 14:48 gmansi joined
pmichaud NotFound: ping 14:59
dalek r29229 | cotto++ | trunk: 15:07
: [codingstd] wrap macro args
diff: www.parrotvm.org/svn/parrot/revision?rev=29229
NotFound pmichaud: pong 15:08
dalek r29230 | cotto++ | trunk:
: [codingstd] wrap macro args in src/jit/sun4/jit_emit.h
diff: www.parrotvm.org/svn/parrot/revision?rev=29230
r29231 | jonathan++ | trunk: 15:09
: [rakudo] First crack at starting to get named enums in place. This sets up a role, a class, and puts instances of it (for the enum values) into the right places. It introduces an Enum base class for all enumerations also. This doesn't let us do a lot useful with them yet, but it's the first step. If this turns out to be a good base to build the rest on, what I'm checking in now will undoubtably get clean-up to eliminate a few bits of inline PIR; for now, it
diff: www.parrotvm.org/svn/parrot/revision?rev=29231
jonathan Overlength commit message dalek fail! 15:10
pmichaud NotFound: (RT #56750) -- it seems to me as though this code is replacing what is currently a constant hash lookup with creation of new gc-able elements for every declaration of an empty string 15:11
Am I reading it wrong?
particle jonathan: that's a bug, for sure, but... can't you use multiple lines in your commit messages? 15:12
pmichaud I typically do:
[rakudo] <summary line>
* more details
cotto_home if I'm going to be making a bunch of changes to wrap macro args, should I commit one file at a time to make bisection easier, or just do them all at once?
particle too
NotFound pmichaud: I looked at const_string code, and it does a hash lookup and creates and populates a new string with a copy of the result.
moritz that's what makes it easier for git users
particle cotto_home: dir at a time might be a good compromise 15:13
jonathan particle: I just write them on the command line, rather than it opening a text editor...
NotFound Just creating the string is short and faster.
cotto_home particle: sounds good
particle jonathan: ah, i use tortoisesvn's utility
pmichaud NotFound: I see that it does the hash lookup, but I don't see that it creates/populates a new string with the copy of the result
NotFound pmichaud: it calls string_make_direct 15:14
pmichaud yes, but only once per constant string
jonathan particle: I think there's some environment variable I could configure...but normally I do small enough commits (deliberately) to not have so much to say. :-)
pmichaud subsequent calls to const_string for the same constant string will re-use the string it created in previous calls 15:15
dalek r29232 | cotto++ | trunk:
: [codingstd] wrap macro args in src/jit/skeleton/jit_emit.h
diff: www.parrotvm.org/svn/parrot/revision?rev=29232
pmichaud (I should say once per constant string value per interpreter)
jonathan++ # working on enum classes 15:16
jonathan: (re: signatures) after yesterday's conversations I'm a little burned out on lexicals, signatures, and the like so I'm taking a bit of a break this morning.
NotFound pmichaud: mmmm... then I don't understand at all how it works.
pmichaud NotFound: interp->const_string_hash is a cache 15:17
jonathan pmichaud: I can only imagine...break++.
pmichaud the first time we call const_string with "" as the buffer argument, the hash lookup fails and so we use string_make_direct to create a new STRING instance, store it in the cache, and return it 15:18
subsequent calls to const_string with "" as the buffer argument will then find the string in the hash and return it directly, without creating a new one
NotFound pmichaud: yes, but returning the string header directly exposes it to external modifications. 15:19
pmichaud ...except it's a constant.
if something is modifying it, that's a bug in the caller.
NotFound pmichaud: that is another problem, the string struct is exposed, and is directly modified from a lot of places. 15:22
pmichaud the string struct is modified for things created using const_string?
NotFound pmichaud: given some recent tickets, I'm almos sure it is.
pmichaud I'm almost certain it isn't. :-P
but pick one and I'll analyze it. I suspect what is happening is that someone is modifying a string register that isn't properly cloned. 15:23
NotFound Probably, but in that case someone is modifying a const string, it isn't? 15:25
pmichaud sure, but the solution is to get them to not modify the constant string, not to fix Parrot so that strings are no longer COW or shared 15:27
NotFound pmichaud: ok, I agree to reject the ticket and keep working in the problems.
15:36 jq joined
pmichaud jonathan: do we need a separate Enum class? I somewhat figured that enums were just roles. 15:39
(I'm asking only for elucidation, not because I think it's necessarily wrong.)
jonathan pmichaud: The way S12 writes it, enums do everything excluding world peace... They can act as a role, but are in fact a kind of class. I'm not 100% sure about the Enum class yet, but it ain't really important and will be easy to be rid of if it's wrong. It is a convenient place to be able to stick some stuff that all enums will implement (though there are other ways to do that) and I figure you'd maybe want to be able to say Bool ~~ Enum and get true. 15:42
It's probably something to get a clarification on.
pmichaud okay 15:43
dalek r29233 | bernhard++ | trunk:
: [codinstd] remove trailing spaces
diff: www.parrotvm.org/svn/parrot/revision?rev=29233
jonathan But we could just switch to inheriting from Any and get the few methods from elsewhere.
pmichaud I often have difficulty with the role/class distinction in general.
jonathan Same. 15:44
pmichaud doesn't the "enum" statement somewhat indicate the base type?
jonathan But S12 says "An enum is a low-level class that can function as a role or property."
It indicates the type of the property.
pmichaud IIRC, TimToady made a statement somewhere that properties are just roles
jonathan Right.
moritz that's because the specs aren't clear about what builtin types are roles and what are classes
jonathan A property is a role with one attribute, pretty much. 15:45
dalek r29234 | julianalbo++ | trunk:
: Clean some unreachable code warnings
diff: www.parrotvm.org/svn/parrot/revision?rev=29234
particle has a feeling that implementation will inform the spec writer here
jonathan particle: I found the enums part of the spec quite wolly, tbh.
particle wolly? 15:46
jonathan *woolly
dalek r29235 | cotto++ | trunk:
: [codingstd] wrap macro args in src/jit/ppc/jit_emit.h
jonathan Is that how you spell it? Maybe it's excessively Britt English. :-)
dalek : now down to 1819 failures of macro arg test
pmichaud but if I have my enum Day <Sun Mon Tue ...> then isn't Day really a subclass of Int ?
dalek diff: www.parrotvm.org/svn/parrot/revision?rev=29235
pmichaud or is that not what is meant by "default type"? 15:47
jonathan I can't see how it could work that way.
Because it's a property too.
A property being of type Int actually means that the attribute in the role defining that property has type Int
pmichaud okay.
jonathan So when you say "$x but True" you're adding an attribute of type bit to $x 15:49
...when we have attributes of type bit, at least. :-) 15:50
NotFound What is the purpose of: if (0 && GC_DEBUG(interp) ) ?
pmichaud is it more precise to say "$x but True" adds an attribute 'bool' of type bit to $x ? 15:51
jonathan Yes.
And also accessor method named bool
Well, the attribute is really called $!bool.
pmichaud so, "our bit enum bool <True False>" creates a role, that role has a "$!bool" attribute and a "bool" accessor 15:53
? 15:54
(and the role's name is 'bool')
moritz lots of bools around here ;) 15:55
jonathan The first statement is true.
The second is not, because while we need a role (so we can compose it into stuff), bool itself is a class (implying what is in the namespae under bool is a class). 15:56
Thus the role, under the current implementation, is anonymous.
And composed into the class bool 15:57
pmichaud namespaces can't have roles?
jonathan The slot can hold a class or a role. 15:58
pmichaud so why does bool itself need to be a class?
jonathan The specification says it is; additionally, the enum values are instances of this class. 15:59
And you can't instantiate a role.
pmichaud S12:1773 says: Note that C<bool> and C<taint> are really role names.
particle jonathan: a class of the same name is automagically created if you try to instantiate a role 16:00
jonathan Hmmm...mabye I've got this the wrong way around and the class should be anonymous and the role has the name. 16:01
particle that's how i see it
jonathan That can probably work too...
pmichaud S12:2037 says 16:02
When the typename happens to be a role, autovivifying it involves
attempting to create a punned class of the same name as the role.
jonathan OK 16:03
Then it likely should be the other way around...good catch.
(And no real hassle to do it that way instead.)
pmichaud yes. The introduction of an Enum class (where the spec doesn't mention one) kinda threw me for a bit. :-) 16:04
jonathan OK, I expect that can disappear.
OK, I'll get those shuffled around.
Thanks for the clarification/feedback. 16:05
dalek r29236 | julianalbo++ | trunk: 16:10
: Clean other unreachable code warning
diff: www.parrotvm.org/svn/parrot/revision?rev=29236
16:15 Theory joined
dalek r29237 | bernhard++ | trunk: 16:22
: [Pipp] add test of backslashes in single quoted strings.
diff: www.parrotvm.org/svn/parrot/revision?rev=29237
16:23 Andy joined
dalek r29238 | bernhard++ | trunk: 16:27
: [Pipp] Use the default variant, PCT, for spec-testing.
diff: www.parrotvm.org/svn/parrot/revision?rev=29238
16:37 gryphon_ joined 17:06 Whiteknight joined 17:13 davidfetter joined
dalek r29239 | chromatic++ | gsoc_pdd09: 17:25
: [Rakudo] Brought Rakudo up to date with latest changes in concurrency branch.
: Now it compiles and passes most of the sanity tests. (It looks like the
: operator precedence parsing bug is responsible for most of the failures.)
diff: www.parrotvm.org/svn/parrot/revision?rev=29239
17:26 apple-gunkies joined
dalek r29240 | Whiteknight++ | gsoc_pdd09: 17:30
: [gsoc_pdd09] update to trunk r29238
diff: www.parrotvm.org/svn/parrot/revision?rev=29240
jonathan Hmm. If you override the invoke v-table method, self doesn't get passed in. 17:36
17:36 AndyA joined, Ademan joined
pmichaud jonathan: correct -- this is a known misfeature 17:39
Whiteknight was working on it last week, iirc.
jonathan Grr. I kinda need that to work. :-S 17:40
Wonder if I should task-steall...
Whiteknight: ping
pmichaud I'm quite certain that Whiteknight would welcome any advice or assistance you can provide. :-)
I'll look for our irc log conversation from last week
jonathan I'm still pondering the best way to do it...
pmichaud looks like we started the discussion at irclog.perlgeek.de/parrot/2008-07-03#i_379876 17:46
jonathan Thanks, reading through it... 17:49
17:49 Eevee joined
jonathan It's easy enough to get us the invocant passed, it's getting the invocant passed _and_ preserving the other arguments that are passed that is tricky. 17:50
pmichaud: Agree with you it's not an IMCC level issue. 17:51
Whiteknight i'm here 17:52
I was working on it, set up branches/vtable_has_self 17:53
but haven't made much progress because I dont understand argument passing
jonathan Whiteknight: For every v-table override other than invoke, we do something like Parrot_run_meth_fromc_args(interp, meth, pmc, meth_name, "P"); 17:54
Note that we invoke the PIR method and pass along "pmc" - the current PMC instance, which becomes the object.
In invoke we don't do that because we want to let the invokee handle the arguments. 17:55
dalek r29241 | chromatic++ | pdd25cx:
: [Rakudo] Updated exception-throwing code to use the most appropriate Parrot
: function (s/real_exception/Parrot_ex_throw_from_c_args/); this time really in
: the pdd25cx branch.
diff: www.parrotvm.org/svn/parrot/revision?rev=29241
jonathan Apart from, this doesn't quite work out, because we don't get a chance to insert the invocant in. 17:56
The invoke vtable method has it, but doesn't put it into the args of the invoked PIR sub.
pmichaud ahhhhh 17:57
and so an invoke vtable method in PIR doesn't have a way to get at the arguments
i.e., we could do $P0(arg1,arg2), but the invoke vtable method doesn't have a way to get at the arguments, because invoke is always invoke_p 17:58
does that sound even close to right?
jonathan No; $P0(arg1,arg2) will invoke the PIR override for invoke with just those two parameters. 17:59
The problem is that it should invoke the PIR override with three parameters: the first parameter should be self, followed by the other two. 18:00
Basically, we need to "splice" another argument into the call.
pmichaud vtable_invoke takes a variable number of aprameters?
are there any other vtable methods that do that?
jonathan vtable_invoke doesn't care about the parameters at all
invoke generally doesn't do anything parameter related
pmichaud right, exactly 18:01
it's always invoke_p
jonathan The get_params opcode in the sub is what starts the paramter getting.
The invoke vtable method in object just passes control on to the PIR override method.
pmichaud let me go by way of analogy
if I override get_boolean in PIR, then I get 'self' and nothing else. period. If I put an extra .param statement in the PIR vtable, it's an argument mismatch. 18:02
because get_boolean doesn't take any arguments.
jonathan No, not quite
There two different types of argument going on here. 18:03
pmichaud yes, exactly
jonathan The C ones, and those that PIR cares bout
So normally, for every other override, there was no set_args before it.
pmichaud there are the arguments to the vtable invocation itself, and then there are the PIR arguments set up by set_args and get_args
jonathan The argumetns were given to C.
So from C, we run the PIR and pass the args the C vtable method received, along with the invocant. 18:04
pmichaud right
but since the C vtable method for invoke doesn't get any arguments...
jonathan In vtable invoke, the C doesn't get any of the args from the PIR. All invoke does, in reality, is changes the program counter to point at the PIR instruction that is the start of the sub.
pmichaud we're saying the same thing.
jonathan Right. 18:05
pmichaud except
I'm saying that if we fix it so that :vtable('invoke') gets the PIR arguments, that's a somewhat substantial departure from how the other :vtable methods work.
because none of the other vtable methods do that.
jonathan There aren't any PIR arguments for other vtable methods. 18:06
pmichaud right.
jonathan But invoke needs to be different in some sense.
Because otherwise, how does it actually get hold of the PIR args?
pmichaud yes, I guess I'm questioning whether we really want it to be different. (And I misspoke earlier -- it's _already_ different, it's just incompatibily different) 18:07
jonathan $P0(x, y) - we'd like the v-table override not just to be able to get hold of the self, but also the x and the y, I guess? 18:08
pmichaud I agree that without doing something like this there's not an easy way to get at the PIR args, short of doing our own .pcc statements.
can we build a new set of PIR arguments from the existing ones?
jonathan Well, the bigger problem is that even invoking the other PIR method would then clobber the arguments of the original call.
You mean with self unshifted onto the start? 18:09
pmichaud yeah
jonathan That's what I think we need to do.
Unfortunately, I don't see a trivial way to do it.
pmichaud I agree.
however, since we expect to be substantially modifying the calling conventions anyway, perhaps we should open a ticket for the new calling conventions and then make this issue a dependency on that 18:10
jonathan I mean, I've got a good idea of one way to do it, which is to fake getting the args as slurpies, then setting up a new call...
pmichaud well, except for the fact that you need :vtable('invoke') today, apparently :-(
jonathan I can hack around the current situation.
It's going to stop me getting one small bit of enums working. 18:11
pmichaud I should probably grab allison's PCC message from the mailing list and turn it into a ticket
so I can attach other tickets that depend on it
particle can you munge and tailcall to avoid a frame?
jonathan Like, they can act as a simple argumentless function.
dalek r29242 | julianalbo++ | trunk:
: Another unreachable warning, codingstd in jit_emit ppc
diff: www.parrotvm.org/svn/parrot/revision?rev=29242
jonathan particle: Going and diddling the signature is one other option. :-)
pmichaud perhaps you could override invoke but get self from the interp ? 18:12
particle is self stored in interp?
pmichaud since it's a sub in this case, yes.
jonathan sub.pmc puts current_object into the context and clear it in the interp.
Whiteknight I tried to splice in a "self" argument, but I dont know how to do that
particle ah. hrmm.
jonathan At the point the sub is invoked.
Whiteknight (sorry about the delay, you guys talk fast and I had to backlog)
pmichaud I thought that the interp always had a reference to the current executing sub 18:13
for vtable invoke, self is the current executing sub
particle interp->current_ctx
pmichaud i.e., in $P0(1,2) self would end up being $P0
oh, wait 18:14
hrm.
jonathan The currently executing sub is the vtable override if the object that $P0 is an...right.
s/if/of/
I wonder if...
Whiteknight NO!
sorry :) 18:15
jonathan attempts great, great evil
Whiteknight .me gets his garlic and cruciifx ready 18:16
particle wonders if Coke is watching 18:24
jonathan OK, it's not so easy as I'd hoped...I think we can runtime-patch the signature, though. 18:28
But what I was going to do will likely get us a memory leak.
Whiteknight I was thinking we could ferret away a self pointer somewhere, like a new field in the interpreter struct for this purpose 18:29
if it's not null, use it as the first parameter, if it is null (as it would be most of the time) use parameters like normal 18:30
jonathan Yeah
Whiteknight a bit of a hack, but it solves our problem
jonathan I'm coming around to that idea too.
Well, maybe we want to have a flag in the signature that says "get the current object from the context and use it as the parameter here".
Whiteknight maybe create an [add|get|_self opcodes to set this field for method and vtable calls
jonathan Nah, I don't think we want to add opcodes. 18:31
Whiteknight true, but how would we set that flag? in the invoke opcode?
jonathan Yeah
Diddle the signature object.
It's still a fair bit of work I think to do that though, or at least to get it stable enough to work reliably. 18:34
Whiteknight So where do we even start? We've got that branch set aside to play in, but this is far outside my realm of expertise 18:35
and I'm certainly willing to do the work if I had some guidance about where/how to do it
jonathan OK
pmichaud Whiteknight: maybe fix my hll namespace problem first? ;-) 18:36
or I can work on that one.
jonathan So we have an arguments signature.
moritz Whiteknight: don't you have a soc project to finish? ;-)
jonathan It can be in the bytecode, or it can ge in the interp structure.
If it's referenced from the bytecode, it needs a lookup in the constants table.
Find it from wherever, then clone it. Then unshift onto it something (see PDD3 for flag values) that indicates it's a PMC, then add another flag to say it should be sourced from the current_object in the context. 18:37
Oh, before you can unshift it, switch it's vtable to be ResizableIntegerArray. As you can't unshift onto a fixed one. 18:38
Then stash that in interp->current_args
dalek r29243 | pmichaud++ | trunk: 18:39
: [rakudo]: spectest-progress.csv update: 94 files, 1679 passing tests
diff: www.parrotvm.org/svn/parrot/revision?rev=29243
jonathan Then hack inter_call.c to recognize this flag in the signature and get the object from the current_object in the context.
And in theory it maybe, just maybe, will work!
pmichaud and in reality it will definitely, definitely, be an ugly hack (no offense) :-) 18:41
Whiteknight I have a lot of projects to work on
moritz Whiteknight: we should clone you ;) 18:42
Whiteknight what I need is a third computer here and two more hands
pmichaud deals ten cards to WhiteKnight. 18:43
Whiteknight checks, no gin rummy
jonathan pmichaud: If you can think of something better... ;-) 18:44
pmichaud my "better" is long-term and involves re-thinking PCC altogether :-) 18:45
jonathan Anyway, I don't have the energy to try that today, nor the motivation..
pmichaud agreed :-)
jonathan I'll work around it for now.
18:45 clunker3 joined
jonathan I really want to get a basically working-ish enums implementation before the end of the day. 18:45
Whiteknight focus on that, I'll monkey around quietly on this vtable invoke nonsense 18:46
pmichaud that would be outstanding
18:47 Ron joined
NotFound Looks like the const_cstring_hash is never marked as live. Is this intentional for some reason? 18:47
dalek r29244 | jhorwitz++ | trunk: 18:48
: add tests for switch statement (WTF?/OMG/OMGWTF)
diff: www.parrotvm.org/svn/parrot/revision?rev=29244
Whiteknight lolcode commit messages are the best 18:49
jhorwitz needs to remember to prefix his commits with [language]
particle slaps the honorable gentleman from King of Prussia 18:51
jhorwitz good show, good show 18:52
dalek r29245 | tene++ | trunk: 18:53
: [lolcode]
: MANIFEST and svn metadata.
diff: www.parrotvm.org/svn/parrot/revision?rev=29245
Tene purl: karma tene
purl tene has karma of 99
Tene That's a nice number. Maybe I should stop here.
particle tene-- 18:54
Tene Crap.
particle :)
Whiteknight he's from KOP?
particle yep, he was born in the mall parking lot. 18:55
Whiteknight well, if you have to be born somewhere...
jhorwitz i used to live in the arcade 18:58
jhorwitz will work for quarters
Whiteknight I'm right down the road from there, we could hang out and have slumber parties and stuff
particle is currently working for a KoP-based client
jhorwitz if by slumber parties you mean go out and drink beer, that works
Whiteknight yeah, i suppose that's the adult version of the same concept 18:59
particle Whiteknight: what uni you at?
Whiteknight Temple, technically
jhorwitz where are you living now?
particle good engineering school 19:00
Whiteknight Malvern
jhorwitz wow.
particle are you closer to vanguard, or lockmart?
jhorwitz right down the road
Whiteknight vanguard
purl vanguard is probably receiving 150k to run the business for the next 3 days
particle worked there 5 years ago 19:01
jhorwitz and then particle abandoned us
19:04 Theory joined 19:06 Theory joined 19:10 cj joined
cj Andy: I was wondering if you IRC'd any more. I guess you just can't stand #perl anymore :) 19:10
dalek r29246 | jonathan++ | trunk: 19:12
: [rakudo] Shuffle enums around a bit so that the role is named and the class anonymous. Get rid of Enum class since it's not spec'd and we can do find without it. Also make instances of the enum class act more value like, so you can say EnumMember to get the underlying value of EnumMember.
diff: www.parrotvm.org/svn/parrot/revision?rev=29246
moritz jonathan: rakudo doesn't seem to parse $stuff but Enum - how do you use roles now? 19:16
jonathan jonathan: but is not implemented yet. 19:17
but it's next on my todo list ;-)
But you can do it with "does"
moritz ok
jonathan I think that does work now.
moritz and I guess that's how you test it right now?
dalek r29247 | Whiteknight++ | gsoc_pdd09: 19:19
: [gsoc_pdd09] Add bad hack around my absurd-pointer-dereferencing problem. Solves one problem but causes/exposes a new problem
diff: www.parrotvm.org/svn/parrot/revision?rev=29247 19:20
jonathan Aye, if it works. ;-)
moritz jonathan: I just added t/spec/S12-enums/as-role.t - one pass, one failure 19:23
jonathan: does the test look sane to you? 19:25
jonathan moritz: Led me nyam my dinner, and I'll get back to you on that in 10-15 mins. :-) 19:27
moritz jonathan: no hurry ;)
jonathan moritz: It doesn't quite work like that. :-) 19:37
.no tests if the current value of the maybe property is set to no. 19:38
dalek r29248 | pmichaud++ | trunk:
: [rakudo]: add 'polar' to Complex and Any (RT #56754, moritz++)
diff: www.parrotvm.org/svn/parrot/revision?rev=29248
19:42 Ademan_ joined
nopaste "jonathan" at 85.216.151.226 pasted "moritz: this seems to be working - is expected output" (10 lines) at nopaste.snit.ch/13551 19:47
moritz jonathan: I'll adopt that into my test, thanks 19:49
Tene So, lolcode's case statments have fallthrough like C's.
According to spec 1.2
Any ideas on how to represent this in PCT?
jonathan moritz: Also, my $x = 42; $x does Maybe(Yes); say $x.No; say $x.Yes; say $x.No; # 0 1 0 19:50
moritz: So runtime mixing in works too. Now for but... :-)
moritz: Also note, there is some issue with does on a string - to do with it being a PMC rather than a PDD15 class, I think. 19:51
Andy Me?
purl it has been said that Andy is the man with the feathered broom or mailto:andy@petdance.com or AIM:petdance or OK cat-xeger is BACK or trying to get Sun Studio 12 installed so I can lint lint lint.
Tene Me? 19:52
purl i think Tene is Stephen Weeks
moritz me?
purl you are, like, right, there are a LOT of things like that
Andy cj: I don't hang out in #perl, but I am in #perl++ and others.
cj ooh, didn't know there was a #perl++
jonathan me? 19:53
purl you are mailto:jnthn@jnthn.net
jonathan How boring!
(but correct)
moritz jonathan: $x does Maybe(1); works. $x does Maybe(yes) doesn't
jonathan Oh? 19:55
moritz too few arguments passed (0) - 1 params expected
current instr.: '_block47' pc 830 (EVAL_17:205)
I'lll submit it as a test in a few moments
jonathan moritz: Hmm? 19:56
enum Maybe <No Yes>;
my $x = 42; $x does Maybe(Yes); say $x.Maybe; say $x.No; say $x.Yes;
1
0
1
dalek r29249 | rblasch++ | trunk:
: [perl #47153] Added PMC_is_null to, well, test if PMC is null.
diff: www.parrotvm.org/svn/parrot/revision?rev=29249
moritz jonathan: ah, I used lower case names
jonathan Ah. 19:57
moritz that could be the differences
particle perl6: enum Maybe <No Yes>; my $x = 42; $x does Maybe(Yes); say $x.Maybe; say $x.No; say $x.Yes;
polyglotbot OUTPUT[Statement not terminated properly at line 1, near "Yes>; my $"␤current instr.: 'parrot;PGE::Util;die' pc 120 (runtime/parrot/library/PGE/Util.pir:82)␤called from Sub 'parrot;Perl6::Grammar;eat_terminator' pc 20609 (src/gen_grammar.pir:2813)␤called from Sub
..'parrot;Perl6::Grammar;statementlist' pc 19622 (src/gen_grammar.pir:2450)␤called fr...
jonathan moritz: Yeah, I think it is. We don't have a class registry yet, so rely on typename rule only detecting uppercase variants. 19:58
It's wrong, but not a bad heuristic...well, often.
19:59 contingencyplan joined
jonathan particle: polyglotbot is probably out of date. 19:59
Tene It is.
particle probably
Tene It's not updating and I don't know why.
Want me to update it now?
particle sure 20:00
can you do that via msg?
Tene Not yet.
particle polyglotbot: control update
Tene That certainly would be nice.
Okay, it's updating, but the rebuild isn't happening, it looks like.
particle polyglotbot: get a hold of yourself! 20:01
Tene building now
dalek r29250 | julianalbo++ | trunk: 20:07
: DOD_registry handling simplified, RT#56678
diff: www.parrotvm.org/svn/parrot/revision?rev=29250
r29251 | moritz++ | trunk: 20:08
: [rakudo] add first enum test to spectest_regression (+9 pass)
diff: www.parrotvm.org/svn/parrot/revision?rev=29251
cotto_work would it be proper for the new PMC_is_null macro to also check if pmc->vtable->base_type is enum_class_Null? 20:09
20:10 donaldh joined
cotto_work s/macro/function/ 20:12
NotFound cotto_work: in that case, it must first check for pmc->vtable
particle recalls ripping out PMC_is_null macros some time ago 20:13
NotFound By the way I don't see the need for the interpreter argument. 20:15
dalek r29252 | Whiteknight++ | gsoc_pdd09:
: [gsoc_pdd09] fixed bounds for the sweep loop. Sweep code was incorrectly assuming index numbers were 1-based instead of 0-based. Fixed one problem, exposed a new segfault somewhere else. chromatic++ for the insight.
diff: www.parrotvm.org/svn/parrot/revision?rev=29252
cotto_work NotFound, cargo cult? 20:16
Whiteknight wikipedia: "Cargo cult"
purl "Cargo cult" is one of Citizen_X's favorite hacker jargon terms
donaldh Does win32 have JIT support? 20:18
cotto_work cargo cult is a style of computer programming that is characterized by the ritual inclusion of code or program structures that serve no real purpose.
purl, cargo cult is a style of computer programming that is characterized by the ritual inclusion of code or program structures that serve no real purpose.
purl ...but cargo cult is programming by putting together bits of code the programmer doesn't really understand. See: en.wikipedia.org/wiki/Cargo_cult_programming...
cotto_work d'oh. step 1: look. step 2: leap. 20:19
NotFound And by other way, I think to maintain the possibility of using NULL as PMCNULL is unusefull, NULL can't throw exceptions when used.
particle donaldh: yes
donaldh: it's one of the few platforms that does have jit 20:20
donaldh hmmm. The jit test is SEGVing on cygwin on Vista.
particle i don't know if cygwin has jit 20:21
Whiteknight yeah cygwin really isn't the same as vanilla Win32
donaldh So by Win32 do you mean Microsoft Visual C or MinGW or does it not matter? 20:22
particle msvc
x86
dalek r29253 | julianalbo++ | trunk: 20:23
: Allow check for nullness of const PMCs
diff: www.parrotvm.org/svn/parrot/revision?rev=29253
donaldh What magic does jit require for it to work?
NotFound donaldh: be able to create chunks of memory with execute permissions, mainly. 20:24
particle see docs/jit.pod
donaldh thanks.
particle and docs/dev/jit_i386.pod, etc
NotFound The PMC_is_null signature disliked my g++ build, fixed. 20:26
Tene pmichaud: do you have plans to fix the \\past thing in --target=past? 20:30
donaldh is it possible to run a single configure step and save the temporary files? 20:33
I've tried using --verbose-step but can't get enough info.
particle what info do you need? the generated .c/.h/.o files?
the output files from the compiler aren't enough? 20:34
.cco .ldo etc
jonathan moritz: I can haz but tests? ;-)
donaldh yep, the generated files.
I think. 20:35
dalek r29254 | jonathan++ | trunk:
: [rakudo] Implement the but operator. To get it resolving enums correctly, we also mark the enum anonymous class with the 'enum' property; we may find a better way later.
diff: www.parrotvm.org/svn/parrot/revision?rev=29254
particle donaldh: you may need to change something in Parrot::Configure::... in order to keep the generated files around
moritz jonathan: S12-enums/basic.t ?
particle kid51 is the best one to ask about that, if you can't find it yourself
probably in cc_build or cc_gen methods
donaldh particle: thanks, I'll take a look.
moritz it doesn't seem to parse 'but Day::Mon' 20:36
jonathan moritz: I fear that is more typename confusion. :-(
"but Mon" should work
moritz oh wait 20:37
forgot to rebuild :/
jonathan Oh!
moritz shuts up
jonathan hopes Day::Mon works
moritz The but operator can only be used with a role or enum value on the right hand side
with 'but Day::Mon' 20:38
and 'invoke() not implemented in class 'Role'' for Day(Mon)
jonathan Oh?
moritz it tries to call Day() with one argument
jonathan enum Maybe <No Yes>;
my $x = 0 but Maybe::Yes; say $x; say $x.Maybe
0
1
moritz oh, I used a Str in this test 20:40
I wrote that before you told me not to
dalek r29255 | rblasch++ | trunk:
: [perl #43438] Align win32/stat.c with generic/stat.c.
: This also makes t/pmc/io.t "stat failed" work on Windows.
jonathan Ah.
dalek diff: www.parrotvm.org/svn/parrot/revision?rev=29255
jonathan Yeah, should add some test to the "does" tests for that and todo them, I guess.
moritz jonathan: and implement .does() 20:41
;)
jonathan Hmm, that'd probably be good to have. ;) 20:42
moritz oh, and my $x = 3 but Day::Mon;
jonathan moritz: Just working the the pseudo-functional form of but now.
moritz reports type '' for $x in error messages
and when I smartmatch against it, it says Method 'ACCEPTS' not found for invocant of class ''
dalek r29256 | tene++ | trunk: 20:43
: [lolcode]
: * Add comparison operators.
diff: www.parrotvm.org/svn/parrot/revision?rev=29256
r29257 | tene++ | trunk:
: [lolcode]
: * Switch support
: * Minor grammar cleanup
diff: www.parrotvm.org/svn/parrot/revision?rev=29257
r29258 | tene++ | trunk:
: SVN props on new lolcode builtins file.
diff: www.parrotvm.org/svn/parrot/revision?rev=29258
jonathan moritz: Smart-match I know isn't done yet.
Hmm...why on earth does it harm the proto-object...
Or our tying to it...
Tene I cheated and made it behave like if/else instead of C's switch.
moritz jonathan: does the 'but' operator create an anonymous type? 20:44
> enum Day <Sun Mon Tue Wed Thu Fri Sat>; my $x = 3 but Day::Mon; say $x.WHAT
Null PMC access in find_method()
purl i heard Null PMC access in find_method() was the bane of Infinoid's existence.
jonathan moritz: but operator does make an anonymous subclass. Well, actually, does does. 20:46
Hmm. The does operator, which but uses, is doing it.
moritz that would explain the empty str as type 20:47
jonathan Aye.
pmichaud Tene: (\\past in --target=past output) no, I didn't have any plans to fix it
jonathan moritz: Will look into exactly what's causing that and fix it.
pmichaud anonymous classes don't have classnames
particle tene: so now you can't use duff's device in lolcode? 20:48
pmichaud anonymous classes don't have (Parrot) classnames
particle how will Whiteknight port his gc?
Whiteknight is that a rhetorical question?
particle you *are* porting the gc to lolcode, right?!?!?!
Whiteknight actually, I was going to port _from_ lolcode into C eventually 20:49
particle I CAN HAS DOD?
dalek r29259 | Whiteknight++ | trunk:
: [src/packfile] update function-level documentation for src/packfile/pf_items.c
diff: www.parrotvm.org/svn/parrot/revision?rev=29259
Infinoid OH HAI I FREED UR BUFFARS
Whiteknight OH NOES! POINTERZ R FAIL 20:50
particle I'M IN YOUR POOL, COMPACTING.
pmichaud I CAN HAS MEMORY PLZ?
jonathan pmichaud: Yes - the issue is that the object loses it's associated with the proto-object.
After a does. 20:51
moritz I'M IN UR STAK EATING UR MEM
particle whee
Whiteknight NO MEMARY: PWN!
Infinoid OHNOES, BUKKIT NOT FOUND
pmichaud if you don't use P6object to create the anonymous subclass, it'll not have an association
jonathan pmichaud: That's...a tiny bit tricky perhaps. :-)
pmichaud I don't know if P6object supports anonymous subclasses yet. But it should.
particle lolcats.com/view/3/ 20:52
jonathan OK.
I'M IN UR CODEZ, FREEING YA STILL-REFERENCED OBJECTS.
pmichaud I'll fix up P6object to allow anonymous subclasses. 20:53
oh!
you could always .register the anonymous subclass, though.
20:53 mire joined
pmichaud p6meta.'register'(anonclass, 'protoobject'=> ... ) 20:54
that's probably cleaner anyway.
Tene pmichaud: any idea how to represent a c-style switch in PAST?
jonathan pmichaud: Aha. And I can do that *after* it comes back from my C op. Great. 20:55
Whiteknight in PIR, are labels first-class objects?
that is, can you store a label in a variable?
pmichaud Tene: I don't think there's a way to do it yet. Perhaps there should be.
Whiteknight If labels are first-class, you can create a jump table using an array pmc. That's how C-switches are usually implemented 20:56
pmichaud labels aren't first class like that, no.
Whiteknight well, there goes that idea
pmichaud afaik there's not really a way to do a branch 20:57
afaik there's not really a way to do a branch to a variable position
_however_
there is a way to do it in the pdd25cx branch, using local_return (/me laughs evilly)
anyway, a jump table assumes somewhat that all of the 'case' targets are constants 20:58
and that may not be true in our typical target language
jonathan moritz: but Maybe(Yes) now works as of latest ci 20:59
moritz YAY INCR jonathan
pmichaud continues to think that p6object is Really Cool. :-)
dalek r29260 | jonathan++ | trunk:
: [rakudo] Make pseudo-functional variant of but operator work.
diff: www.parrotvm.org/svn/parrot/revision?rev=29260
jonathan pmichaud: You probably thought of this, but suppose I do something like for 1..1000000 -> { 0 but Yes } 21:01
Whiteknight pmichaud, he asked about a C-style switch, not a fancy-schmance perl5-style given-when doodad
jonathan And every call to but is registering a new anonymous class (which will get GC'd once the copies of 0 gets collected)
Whiteknight (pardon my technical jargon) 21:02
jonathan p6object will not leak, right?
pmichaud Whiteknight: sure, but I don't know how often C-style switches are used in our target languages
at any rate, the easier way to handle C-style switch is to create an array of Sub pmcs, then invoke the appropriate one 21:03
jonathan (we can in the future I hope optimize it not to create a new one every time is also a good point, of course)
pmichaud jonathan: p6object will leak in that case
I don't know how to avoid it.
21:03 DietCoke joined
particle c-style switch falls through by default 21:03
TimToady since 0 is immutable and roles are immutable, I suspect a single 0 but Yes can be generated and reused
DietCoke Tene: did you add the builtin DIFFRINT but not add it to the grammar?
Tene DietCoke: it matches <identifier>, so doesn't need to be added to the grammar 21:04
DietCoke ... Evil.
hokay.
DietCoke vanishes again. 21:05
21:05 DietCoke left
pmichaud jonathan: I suppose I could properties on the class objects 21:05
instead of a lookup table.
although that's a bit of a pain too. Somehow I have to be able to get from .HOW to the metaobject, which means there's a reference *somewhere* 21:06
jonathan TimToady: Yes, I suspect the same, but it's an optimization, so it probably won't get done all that soon, unless someone gets the urge. :-)
pmichaud sorry, from .HOW to the parrotobject
arrrrgh
TimToady note the change I just checked into S12 after yours 21:09
pmichaud from .HOW to the parrotclass
(too many distractions)
I think it's probably fixable if I use setprop/getprop instead of managing a table.
jonathan pmichaud: Yeah, understand the difficulty. I guess we can leave it about as it is for now.
I guess the abstractions we have will make it cheap to modify in the future, right?
pmichaud yes.
I think it's fixable.
one very annoying thing I've noticed about classes and get_class, though:
(nopaste coming)
nopaste "pmichaud" at 76.183.97.54 pasted "annoying behavior of get_class on PMC objects" (17 lines) at nopaste.snit.ch/13552 21:10
pmichaud TimToady: I'll have to look at the details more closely, but an initial scan doesn't appear to cause me much grief. 21:12
thanks for pointing them out
21:12 cognominal joined
Whiteknight pmichaud: a note about what we talked about yesterday: 21:12
jonathan pmichaud: Let me get the does/but issue fixed, then I'll look at that one.. 21:13
pmichaud I think that get_class creates a new PMCProxy instance each time 21:14
iwbni it created one and then used that forevermore
Whiteknight I've been peppering in a few diagnostic messages in the init function for class.pmc, and I can't find any differences between namespace and key PMCs and how they are handled
pmichaud Whiteknight: what does get_name return from a namespace?
Tene perl6: enum Maybe <No Yes>; my $x = 42; $x does Maybe(Yes); say $x.Maybe; say $x.No; say $x.Yes; 21:15
polyglotbot OUTPUT[1␤0␤1␤]
Whiteknight ['ABC';'Bar'] returns 'Bar'
jonathan pmichaud: I agree it should be doing that.
Whiteknight at least, as far as I can see
pmichaud really? wow
NotFound pmichaud: get_class in default.pmc return a proxy
Even if the pod says that it returns SELF 21:16
Whiteknight I need to double check that I am reading the correct things, but inside the init function, it appears namespace and key pmcs appear to be acting in exactly the same way
pmichaud well, they certainly would iterate differently :-) 21:17
just a sec
nopaste "pmichaud" at 76.183.97.54 pasted "result of get_name on a NameSpace PMC" (15 lines) at nopaste.snit.ch/13553 21:18
Whiteknight I'll have to work on it a bit later and see what I'm doing wrong 21:20
dalek r29261 | jonathan++ | trunk:
: [core] Correct an off-by-one error that could lead to segfaults rather than an exception.
diff: www.parrotvm.org/svn/parrot/revision?rev=29261
pmichaud line 191 is what distinguishes NameSpace from Key
if name_arg is a Key, then it doesn't include a hll namespace element 21:22
but if name_arg is a namespace, then we end up replacing it with something that _does_ have a hll namespace element 21:23
Whiteknight I'll have to double-check. Whatever I was doing to test earlier was obviously not The Right Thing
pmichaud (because Parrot_ns_get_name returns the hll namespace name as the first element of the array) 21:24
personally I would rework that entire logic
here's something to try
(typing)
Whiteknight So at that point, removing the hll namespace would be as easy as shifting the result array from Parrot_ns_get_name?
pmichaud yes, but I"m not a fan of the approach being taken at all anyway. nopaste coming. 21:25
Whiteknight nopaste away
nopaste "pmichaud" at 76.183.97.54 pasted "suggested revision to class.pmc" (29 lines) at nopaste.snit.ch/13554 21:29
pmichaud oops 21:30
need to revise -- just a sec
nopaste "pmichaud" at 76.183.97.54 pasted "suggested revision to class.pmc" (29 lines) at nopaste.snit.ch/13555 21:31
pmichaud I've changed "new_namespace" and "name_arg" to "class_namespace" and "class_arg"
er, "class_name"
dalek r29262 | jonathan++ | trunk:
: [rakudo] Fix does (and thus but) to not lose an object's association with its proto.
diff: www.parrotvm.org/svn/parrot/revision?rev=29262
pmichaud but the key feature is that I've refactored name_arg (now class_name) to *always* come from the namespace for the class 21:32
so, if we're passed in a namespace, we just use it
if we're passed in a key or rsa, then we create the associated namespace if needed, and then use that
either way, class_name always comes from the namespace directly, instead of sometimes from the key/rsa
and we always remove the hll component from the namespace (to preserve existing parrot behavior) 21:34
there may be other instances of name_arg, new_namespace, etc. that need changing -- I just posted enough to get the idea across
Whiteknight yeah, i see what you're doing here 21:35
it's a good start to a patch. I'll work on it, submit it, and steal all the karma
:)
pmichaud you can have the karma :)
the downside to this approach is that we're constructing class_name (a new array) even when we don't need to -- such as when there's an RPA or Key that can already serve in that capacity 21:36
however, creating new classes is a rare enough operation that I think the consistent approach might be better
but feel free to refactor class_name back into the separate branches of the if, in order to avoid the extra Parrot_ns_get_name and VTABLE_shift_pmc calls. 21:37
Whiteknight we might be able to do a short-circuiting refactor later, once we get the general idea to work
but I agree, consistency can be a lot more important for our purposes then small performance gains 21:38
21:41 Theory joined
NotFound Code clarity also counts. 21:43
jonathan pmichaud: I don't think getting get_class to return one PMCProxy would be all that hard. 21:44
As in, creating it and returning the same oen all the time.
pmichaud jonathan: I would think it shouldn't be hard either. I'm kinda curious why it doesn't do that already. 21:45
jonathan When I first did the PMCProxy implementation, I am pretty sure I had them all in a registry somewhere, jsut an array indexed on PMC type ID.
pmichaud ahhhh
we're getting rid of type ID, though
jonathan And it just grabbed it from that.
Right. So Allison ripped that out, and I thought the plan was we'd store the reference to the PMCProxy in the namespace. 21:46
pmichaud that makes sense to me (and is basically what I've been thinking)
jonathan She wanted to create them lazily, however, so I said "OK, feel free" - I didn't realize until you pointed it out just now that this meant created them afresh every time.
I thought it meant "create it once and stash it". 21:47
Creating it every time is expensive for now, and unhelpful to what you're doing also.
pmichaud I discovered it in P6object when trying to create indexes to the parrotclass objets
for PMCProxy I have to index by name instead of address
because every get_class gives me a new PMCProxy instance
jonathan I'm getting quite tired now - and I still should write my report for the day. Can you file an RT ticket, so we don't forget the issue, and I'll try and look into it sometime soonish, if nobody beats me to it? 21:48
pmichaud sure, I'll file a ticket.
great work today -- I'm very happy that enums are working and that roles are coming together as nicely as they are
jonathan I think I might just do one last thing - refactor Bool to make it more enum-like.
pmichaud okay. I've been thinking that it actually belongs as a Perl 6 prelude, though. 21:49
jonathan So that we can do return 0 but True.
I thought this as well, but then I also thought: bool ain't quite as simple as an enum.
Because it also has the special pred and succ.
pmichaud isn't there separate bool and Bool ?
bool is the enum, Bool is a class 21:50
jonathan OK, do they have some relation?
pmichaud I don't know.
but S02 lists both "bool" and Bool
jonathan bool native boolean 21:51
pmichaud and S12 defines bool as our enum *bool <false true>; or somesuch
jonathan our bit enum *bool <False True>;
pmichaud so I think that Bool is the one that defines success/pred on Bool objects, and that "bool" is an enum or native type or whatever 21:52
src/classes/Bool.pmc even implements "False" and "True" that way currently.
i.e., they're distinguished from Bool::False and Bool::True
jonathan OK, but that confuses me because normally if you make an enum Foo <X Y>, then you get symbols Foo::X, Foo::Y and X and Y. 21:53
pmichaud right
so we get bool::False, bool::True, False, and True
none of which are Bool::False nor Bool::True
jonathan Oh!
OK
So Bool::False should be be the same as False.
pmichaud no.
jonathan OK
pmichaud bool::False should be the same as False. 21:54
jonathan :-)
Capitalization craziness.
OK, let me try that.
pmichaud okay. I think you should be able to simply remove lines 30-37 from src/classes/Bool.pir, and then have the 'bool' enum do the rest.
(but leave the rest of Bool.pir alone) 21:55
jonathan Yes
Erm
Where should I put the definition for bool?
We can't have Bool.pir and bool.pir. :-)
pmichaud I'd do builtins/enums.pir for now
jonathan OK.
pmichaud it would also be nice to move Order.pir into enums.pir
since Order.pir is almost strictly an enum 21:56
jonathan Ah, that is an enum too?
pmichaud I think so.
I just implemented it as a class for now to get some spectests passing, and thinking we could move it to an enum when enums were ready
that might even be an easier first attempt than bool (because of the capitalization issues)
jonathan pmichaud: Well, I just wrote enum bool <False True> into the compiler, captured the output PIR and am tidying it up. :-) 22:10
Easier than writing it by hand and forgetting something.
pmichaud heh 22:15
good
I think tonight/tomorrow I'm going to fix our ability to pre-compile .pm files and use them. 22:16
then we can start a Prelude.pm and write builtins in Perl 6
moritz eagerly awaits that
Whiteknight pmichaud++
jonathan pmichaud: Does the enum being called bool, and thus 0 but Ture setting the bool property, not mean that an if statement should be checking the result of the .bool property/method on something? 22:20
moritz IMHO if should call $thing.bool
and the default implementation of .bool is to look at .Num or .Str or some such 22:21
and for user defined classes it's always true by default
oh wait, that means that .bool never has to look at .Str or .Num, because it only needs to be defined in builtin classes 22:22
where it can just be an ordinary method
22:25 kid51 joined
jonathan Hmm. 22:33
Actually switching it over to being an enum causes a couple of spectests breakages, so I'll hold fire on this patch for now. 22:34
pmichaud it's .true, not .bool
jonathan Oh, actually... 22:35
pmichaud: How does that work, if the property being declared is bool?
pmichaud I don't know. I do know that S02 explicitly mentions the ".true" property, not ".bool'
jonathan OK. 22:36
I can hack my implementation of this here to have the property be .true for now
moritz pmichaud: seems inconstent
jonathan But I think we need a spec fix/clarification.
pmichaud don't do .true yet, please
jonathan Oh, you're not already testing that?
pmichaud .true is very well defined in S02, while .bool is very vaguely defined
I agree that "0 but True" is supposed to do something meaningful. 22:37
but I'm not sure that we just blindly start hacking everything else to be .bool, or modifying .true to be different from what S02 says it is.
moritz pmichaud: it's defined that $thing.$type is the general syntax for getting a $type representation of $thing
pmichaud moritz: I'm not saying it's consistent
I'm saying that the spec is very clear about .true, and I'd prefer to favor that at this moment.
moritz it seems logical to implement prefix:<?> in terms of .bool
ok 22:38
pmichaud moritz: I don't disagree. But the spec doesn't say anything about .bool
other than the brief mention in S12
it says a *lot* about .true
jonathan pmichaud: It could also be fixed by changing S12's definition
our bit enum bool <true false>;
Rather than uppercase. 22:39
pmichaud yes, but then 0 but True doesn't work.
cotto_work kdi51++ #random karma
jonathan No, it'd be 0 but true.
pmichaud and 'true' (lowercase) already has a meaning -- it's prefix:true
jonathan Oh, hmm.
OK, then it needs a clarification. :-)
pmichaud please just ask on p6l.
cotto_work kid51++ #random karma, less random spelling
Whiteknight kdi51-- # easy come, easy go 22:41
pmichaud it may be that .true is not the same as prefix:? In vtable terms, it may be that vtable get_boolean is not precisely the same as .true
it could be that it checks .bool first and then .true 22:42
jonathan Yeah
pmichaud anyway, clarification on p6l is warranted here, rather than random guessing into the spec.
jonathan I know this is something for p6l, it's just good to evaluate some of the possibles first.
pmichaud (or even not-so-random guessing :-)
anyway, dinnertime here -- bbl
again, great work.
jonathan Thanks...and converting bool::True and bool::False and True/False to be enum worked out fine. Even if 0 but True doesn't until we get the spec clarification. 22:43
(As in, passes all spectest_regression)
So, will pop that in.
22:45 gryphon_ joined
dalek r29263 | jonathan++ | trunk: 22:51
: [rakudo] Switch True and False over to being real values from the (now existing) bool enumeration, rather than instances of the Bool class.
diff: www.parrotvm.org/svn/parrot/revision?rev=29263
22:54 rhr joined
dalek r29264 | jkeenan++ | trunk: 23:13
: Add some tests for sub _evaluate_cc_run() and _handle_glut().
diff: www.parrotvm.org/svn/parrot/revision?rev=29264
kid51 cotto_work: What about my karma? or my spelling? 23:19
23:22 cotto_work joined
jonathan Today's report: use.perl.org/~JonathanWorthington/journal/36895 23:24
dalek r29265 | jkeenan++ | autojit: 23:25
: Branch was merged into trunk and is no longer needed at HEAD.
diff: www.parrotvm.org/svn/parrot/revision?rev=29265 23:26
r29266 | jkeenan++ | autojit-28732: 23:27
: Branch to which this tag corresponded was merged into trunk and is no longer needed at HEAD.
diff: www.parrotvm.org/svn/parrot/revision?rev=29266
23:33 ruoso joined
dalek r29267 | jkeenan++ | parallel: 23:35
: Creating parallel in svn.perl.org/parrot//branches
diff: www.parrotvm.org/svn/parrot/revision?rev=29267
r29268 | jkeenan++ | parallel-29266:
: Tagging trunk at r29266 so that the parallel can later be synched to it.
diff: www.parrotvm.org/svn/parrot/revision?rev=29268
r29269 | jkeenan++ | parallel: 23:38
: Begin to develop base class for Parrot::Configure.
diff: www.parrotvm.org/svn/parrot/revision?rev=29269
r29270 | Whiteknight++ | gsoc_pdd09: 23:41
: [gsoc_pdd09] remove some unnecessary macros and expose the code underneith. Also, simplify some things that are accounted for elsewhere.
diff: www.parrotvm.org/svn/parrot/revision?rev=29270
23:45 TiMBuS joined