X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FSub-Nary.git;a=blobdiff_plain;f=lib%2FSub%2FNary.pm;h=14b882285723a2e3d20bbb7472c8502df1166d8a;hp=8af7cd6671c8662ca7e09e3ea02fb6933ab9a814;hb=3b10ab9a7a01f579892a98a1ffc53202d6adc8d6;hpb=002535b0100121f92a04638a58e2d34add019275 diff --git a/lib/Sub/Nary.pm b/lib/Sub/Nary.pm index 8af7cd6..14b8822 100644 --- a/lib/Sub/Nary.pm +++ b/lib/Sub/Nary.pm @@ -484,21 +484,30 @@ sub pp_leaveloop { $op = $op->first; my ($r1, $l1); - if (name($op) eq 'enteriter') { + my $for; + if (name($op) eq 'enteriter') { # for loop ? + $for = 1; ($r1, $l1) = $self->inspect($op); - return $r1, $l1 if $r1 and zero $l1; + return $r1, $l1 if defined $r1 and zero $l1; } $op = $op->sibling; - my $r; + my ($r2, $l2); if (name($op->first) eq 'and') { - ($r, my $l) = ($self->inspect($op->first->first))[0]; - return $r, $l if $r and zero $l; - $r = ($self->inspect($op->first->first->sibling))[0]; + ($r2, $l2) = $self->inspect($op->first->first); + return $r2, $l2 if defined $r2 and zero $l2; + my $c = count $l2; + return { list => 1 }, undef if !$for and defined $r2; + my ($r3, $l3) = $self->inspect($op->first->first->sibling); + return { list => 1 }, undef if defined $r3 and defined $l3; + $r2 = add $r2, scale $c, $r3; } else { - $r = ($self->inspect($op))[0]; + ($r2, $l2) = $self->inspect($op); + return { list => 1 }, undef if defined $r2 and defined $l2; } + my $r = (defined $r1) ? add $r1, scale +(1 - count $r1), $r2 + : $r2; my $c = 1 - count $r; diag "& leaveloop $c" if $DEBUG; return $r, $c ? { 0 => $c } : undef;