package PIL::PVar; use warnings; use strict; sub fixup { die unless keys %{ $_[0] } == 1; die if ref(my $name = $_[0]->{pVarName}); local $_; # XXX hacks? if($name eq "&return") { PIL::fail("Can't return outside a subroutine!") unless grep { $_ >= PIL::SUBROUTINE } @PIL::IN_SUBLIKES; return bless { pVarName => PIL::RawJS->new("PIL2JS.generic_return(subreturncc)"), origName => "&return", } => "PIL::PVar"; } elsif($name eq "&?CALLER_CONTINUATION") { PIL::fail("There's no &?CALLER_CONTINUATION outside a subroutine!") unless grep { $_ >= PIL::SUBROUTINE } @PIL::IN_SUBLIKES; return bless { pVarName => PIL::RawJS->new("PIL2JS.generic_return(subreturncc)"), origName => "&?CALLER_CONTINUATION", } => "PIL::PVar"; } elsif($name eq "&yield") { PIL::fail("Can't yield outside a coroutine!") unless grep { $_ == PIL::SUBCOROUTINE } @PIL::IN_SUBLIKES; return bless { pVarName => PIL::RawJS->new("PIL2JS.generic_return(coroyieldcc)"), origName => "&yield", } => "PIL::PVar"; # XXX evil hack -- %FooPackage::EXPORTS gets not declared (my, our) in # -CPIL1. Work around this by emitting %PIL2JS::EXPORTS_DUMMY_VARIABLE. } elsif($name =~ /^%.*EXPORTS$/) { return bless { pVarName => '%PIL2JS::EXPORTS_DUMMY_VARIABLE', origName => $_[0]->{pVarName}, } => "PIL::PVar"; } else { return bless { pVarName => PIL::lookup_var($_[0]->{pVarName}), origName => $_[0]->{pVarName}, } => "PIL::PVar"; } } sub as_js { my $self = shift; if(ref $self->{pVarName}) { ($self->{pVarName}{CC} and die) or $self->{pVarName}{CC} = $self->{CC} if $self->{CC}; return $self->{pVarName}->as_js; } else { # Hack? Fully qualified variables don't need a declaration, but JavaScript # needs one. my $name = $self->{pVarName}; if($name =~ /::/ and $name !~ /\b(CALLER|OUTER|\*?JS)::/) { $PIL::UNDECLARED_VARS{$name}++; } my $jsvar = PIL::name_mangle $name; if($self->{CC}) { return $self->{CC}->as_js . "($jsvar)"; } else { return $jsvar; } } } sub unwrap { $_[0] } 1;