Perlito5
view release on metacpan or search on metacpan
lib/Perlito5/JavaScript2/Runtime.pm view on Meta::CPAN
use v5;
package Perlito5::JavaScript2::Runtime;
use Perlito5::Runtime::Sprintf;
sub perl5_to_js {
my ($source, $namespace, $want, $scalar_hints, $hash_hints, $scope_js) = @_;
# say "source: [" . $source . "]";
local $_;
local ${^GLOBAL_PHASE};
local $^H = $scalar_hints;
local %^H = %$hash_hints;
local @Perlito5::BASE_SCOPE = ($scope_js->[0]);
local @Perlito5::SCOPE_STMT;
local $Perlito5::CLOSURE_SCOPE = 0;
local $Perlito5::PKG_NAME = $namespace;
local @Perlito5::UNITCHECK_BLOCK;
# warn "in eval enter\n";
# warn "External scope ", Perlito5::Dumper::Dumper($scope_js);
# warn "BASE_SCOPE ", Perlito5::Dumper::Dumper($Perlito5::BASE_SCOPE);
# warn "SCOPE_STMT ", Perlito5::Dumper::Dumper(\@Perlito5::SCOPE_STMT);
my $match = Perlito5::Grammar::exp_stmts( $source, 0 );
if ( !$match || $match->{to} != length($source) ) {
die "Syntax error in eval near pos ", $match->{to};
}
my $ast = Perlito5::AST::Apply->new(
code => 'do',
arguments => [ Perlito5::AST::Block->new(
stmts => $match->{capture},
) ],
);
# use lexicals from BEGIN scratchpad
$ast = $ast->emit_begin_scratchpad();
# say "ast: [" . ast . "]";
my $js_code = $ast->emit_javascript2(0, $want);
Perlito5::set_global_phase("UNITCHECK");
$_->() while $_ = shift @Perlito5::UNITCHECK_BLOCK;
# warn "in eval BASE_SCOPE exit: ", Perlito5::Dumper::Dumper($Perlito5::BASE_SCOPE);
if ($Perlito5::JavaScript::DEBUG) {
# "-JS DEBUG" switch in the command line
print $js_code, "\n\n";
}
return $js_code;
}
sub eval_ast {
my ($ast) = @_;
my $want = 0;
# use lexicals from BEGIN scratchpad
$ast = $ast->emit_begin_scratchpad();
my $js_code = $ast->emit_javascript2(0, $want);
# say STDERR "js-source: [" . $js_code . "]";
Perlito5::set_global_phase("UNITCHECK");
$_->() while $_ = shift @Perlito5::UNITCHECK_BLOCK;
# warn "in eval BASE_SCOPE exit: ", Perlito5::Dumper::Dumper($Perlito5::BASE_SCOPE);
if ($Perlito5::JavaScript::DEBUG) {
# "-JS DEBUG" switch in the command line
print $js_code, "\n\n";
}
$_ = $js_code;
return JS::inline('eval("(function(){" + p5pkg.main.v__ + "})()")');
}
sub emit_javascript2 {
return <<'EOT';
//
// lib/Perlito5/JavaScript2/Runtime.js
//
// Runtime for "Perlito" Perl5-in-JavaScript2
//
// AUTHORS
//
// Flavio Soibelmann Glock fglock@gmail.com
//
// COPYRIGHT
//
// Copyright 2009, 2010, 2011, 2012 by Flavio Soibelmann Glock and others.
//
// This program is free software; you can redistribute it and/or modify it
// under the same terms as Perl itself.
//
// See http://www.perl.com/perl/misc/Artistic.html
"use strict";
var isNode = typeof require != "undefined";
if (typeof p5pkg !== "object") {
var p5pkg = {};
var p5LOCAL = [];
var universal = function () {};
p5pkg.UNIVERSAL = new universal();
p5pkg.UNIVERSAL._ref_ = "UNIVERSAL";
p5pkg.UNIVERSAL.isa = function (List__) {
var o = List__[0];
var s = List__[1];
var clas;
if (typeof o === "string") {
clas = p5pkg[o];
}
else {
clas = o._class_;
}
if (!clas) {
return false;
}
if (clas._ref_ == s) {
return true;
}
var isa = clas.List_ISA;
if (isa) {
for (var i = 0; i < isa.length; i++) {
if (isa[i] == s) {
( run in 2.295 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )