package PIL::P5Macro::JS; use warnings; use strict; sub new { my ($class, $name, $body) = @_; return bless { body => $body, name => $name } => $class; } # XXX! TOTAL HACK!!! # This is needed because perl5 seems to leak memory in the if-case below. my $CORRECT_BEHAVIOUR = $ENV{PIL2JS_MACROS_CORRECT_BEHAVIOUR}; sub as_js { my ($self, @args) = @_; local $_; if($CORRECT_BEHAVIOUR) { my $jsname = PIL::name_mangle($self->{name}); my @jsargs = map { "__args[$_]" } 0..$#args; return <{CC}; var __args = [ @{[ join ",\n", map { PIL::add_indent 1, $_ } @args ]} ]; if($jsname.FETCH().is_still_our_pil2js_compiletime_macro) { @{[ PIL::add_indent 1, $self->{body}->("__cc", @jsargs) ]} } else { $jsname.FETCH()([PIL2JS.Context.ItemAny, @{[ join ", ", @jsargs ]}, __cc]); } EOF } else { return $self->{body}->($self->{CC}, @args); } } 1;