X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FSub%2FNary.pm;h=ef72c7fa8428d4c44554e8ecab0aceececbf6eec;hb=ae9a21ef5300b492faf20fa5b98340b7783ca098;hp=f789e696c1796665076cec790c2a915da7afb333;hpb=f7ae222ad94ed89e55b76c4eebcbdb38077133c1;p=perl%2Fmodules%2FSub-Nary.git diff --git a/lib/Sub/Nary.pm b/lib/Sub/Nary.pm index f789e69..ef72c7f 100644 --- a/lib/Sub/Nary.pm +++ b/lib/Sub/Nary.pm @@ -426,6 +426,20 @@ sub pp_exit { return $r, undef; } +sub pp_die { + my ($self, $op) = @_; + + my ($r, undef) = $self->inspect_kids($op); + if (defined $r) { + my $c = 1 - count $r; + $r->{die} = $c if $c; + } else { + $r = { die => 1 }; + } + + return $r, undef; +} + sub pp_goto { my ($self, $op) = @_; @@ -503,6 +517,25 @@ sub pp_aassign { $self->inspect($op); } +sub pp_leavetry { + my ($self, $op) = @_; + + my ($r, $l) = $self->inspect_kids($op); + if (defined $r) { + my $d = delete $r->{die}; + return $r, $l if not defined $d; + if (defined $l) { + my $z = delete $l->{0}; + $l = { %$l, 0 => $z }; + $l->{0} += $d; + } else { + $l = { 0 => $d }; + } + } + + return $r, $l; +} + sub pp_leaveloop { my ($self, $op) = @_;