On Tue, May 22, 2007 at 01:25:33PM +0100, Nicholas Clark wrote:
> 
> And how often does the type of a PMC change, such that its internal 
> data layout changes? In Perl 5 this morphing happens everywhere, 
> but in Parrot?

Actually, until/unless we have a "scalar container" or "reference"
PMC of some sort, it appears to occur a lot.  The example I 
keep coming back to is something like (Perl 6):

   my @a = (1, 2, 3);
   my $b := @a[2];

   @a[2] = foo();

In PIR this becomes something like (simplified):

   ##  my @a = (1, 2, 3);
   $P1 = '_buildlist'(1, 2, 3)     # create a list
   .lex '@a', $P1                  # bind as @a

   ##  my $b := @a[2];
   find_lex $P2, '@a'              # look up @a
   set $P3, $P2[2]                 # get reference to @a[2]
   .lex '$b', $P3                  # bind as $b

   ##  @a[2] = foo();
   $P4 = 'foo'()                   # $P4 could be any type
   find_lex $P5, '@a'              # look up @a
   set $P6, $P5[2]                 # get reference to @a[2]
   assign $P6, $P4                 # $P6 (Integer) has to morph 
                                   #   to whatever type $P4 is

If we try to use a set opcode instead, as in:

   ##  @a[2] = foo();
   $P4 = 'foo'()                   # $P4 could be any type
   find_lex $P5, '@a'              # look up @a
   set $P5[2], $P4                 # set @a[2] to $P4

then we end up losing the binding between $b and @a[2] that
was established earlier ($b still refers to the Integer).  

Pm

Reply via email to