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 )