> Luke Palmer <[EMAIL PROTECTED]> wrote: > > Consider this Perl 6 code: > > > sub refinc($var) { > > my $myvar = $var; > > $myvar += 1; > > } > > > If you pass an integer in here, it should do nothing. However, if you > > pass an object with an overloaded += in, it should have the > > side-effect of adding one to that object. It's just a value/reference > > semantics thing. > > AFAIK no. The default is to pass constant references as arguments. So I > would expect this throwing an exception. > When you have: > > sub refinc($var is rw) { > > it should increment the object ref.
That would increment a regular integer too, though. Am I misinterpreting constant reference? That is, is it a reference to a constant or is the reference itself constant? IIRC it's the latter... > > If Perl compiles that code with $var and $myvar as PMCs, and it uses > > C<set> to get $var into $myvar, PerlInt won't work right. And if it > > uses C<clone> to get $var into $myvar, an object won't work right. > > I think the assignment would translate to: > > $P0 = new PerlUndef > assign $P0, $P1 > > Its now up to the set_pmc() vtable to do the right thing for an object > reference. Well, I think the difference is that assign puts the burdon on PerlUndef, while valclone puts the weight on the thing being cloned/assigned. If we don't like type switches, the the clonee is probably a better place to put it. But then, set_pmc() could always call a method on its argument. That means that there has to be an appropriate vtable entry to call, though... like, um, valclone :-) > > There are two ways to solve this: make a PerlRef class (which will > > eventually have to be done anyway) or make a polymorphic assignment > > which lets the PMC decide whether it has value or reference semantics. > > We need both, yes. > > > The included tentative patch implements the latter (namely, > > C<valclone>). > > This is AFAIK what C<assign> does anyway. > > >> PMC* valclone () { > >> PMC* dest = pmc_new(INTERP, SELF->vtable->base_type); > >> memcpy(&dest->cache, &SELF->cache, sizeof(UnionVal)); > >> return dest; > >> } > > I'm not sure, if we need this. I'm not sure either, but I'm also not sure if we don't need it. Which is why I'm taking the time here to explore/discuss it. Luke