Anarres-Mud-Driver
view release on metacpan or search on metacpan
lib/Driver/Compiler/Generate.pm view on Meta::CPAN
package Anarres::Mud::Driver::Compiler::Generate;
use strict;
use Carp qw(:DEFAULT cluck);
use Exporter;
use Data::Dumper;
use String::Escape qw(quote printable);
use Anarres::Mud::Driver::Compiler::Type;
use Anarres::Mud::Driver::Compiler::Node qw(@NODETYPES);
use Anarres::Mud::Driver::Compiler::Check qw(:flags);
push(@Anarres::Mud::Driver::Compiler::Node::ISA, __PACKAGE__);
my %ASSERTTABLE = (
IntAssert => '+do { my ($__a) = ((A)); ' .
'die "Not integer at XXX" if ref($__a); ' .
'$__a; }',
StrAssert => '+do { my ($__a) = ((A)); ' .
'die "Not string at XXX" if ref($__a); ' .
'$__a; }',
ArrAssert => '+do { my ($__a) = ((A)); ' .
'die "Not array at XXX" if ref($__a) ne "ARRAY"; '.
'$__a; }',
MapAssert => '+do { my ($__a) = ((A)); ' .
'die "Not mapping at XXX" if ref($__a) ne "HASH"; '.
'$__a; }',
ClsAssert => '+do { my ($__a) = ((A)); ' .
'die "Not closure at XXX" if ref($__a) ne "CODE"; '.
'$__a; }',
ObjAssert => '+do { my ($__a) = ((A)); ' . # XXX Fixme
'die "Not object at XXX" if ref($__a) !~ /::/; ' .
'$__a; }',
);
# If we trap the relevant error messages from Perl and accept that
# we are not going to get an error message on (array + 1) - we
# just get a pointer increment, then we can just do this.
my %ASSERTTABLE_NOOP = (
IntAssert => 'A',
StrAssert => 'A',
ArrAssert => 'A',
MapAssert => 'A',
ClsAssert => 'A',
ObjAssert => 'A',
);
my %OPCODETABLE = (
# Can we tell the difference between strings and ints here?
# DConway says this tells us if it's an int:
# ($s_ref eq "" && defined $s_val && (~$s_val&$s_val) eq 0)
StmtNull => '',
Nil => 'undef',
%ASSERTTABLE_NOOP,
Postinc => '(A)++',
Postdec => '(A)--',
Preinc => '++(A)',
Predec => '--(A)',
Unot => '!(A)',
Tilde => '~(A)',
Plus => '+(A)',
Minus => '-(A)',
( run in 0.894 second using v1.01-cache-2.11-cpan-39bf76dae61 )