Sidef
view release on metacpan or search on metacpan
lib/Sidef.pm view on Meta::CPAN
script_name => $self->{name} // '-',
($self->{parser_opt} ? (%{$self->{parser_opt}}) : ()),
);
my $ast = $self->{parser}->parse_script(code => \$code);
# Check for optimization
if (defined(my $level = $self->{opt}{O})) {
# Optimize the AST
if ($level >= 1) {
$ast = $self->optimize_ast($ast);
}
# Deparse the AST into code, then parse the code again.
if ($level >= 2) {
my $sidef = Sidef->new(
opt => $self->{opt},
name => $self->{name},
parser_opt => $self->{parser_opt},
);
local $sidef->{opt}{O} = 1;
return $sidef->parse_code($self->compile_ast($ast, 'Sidef'));
}
}
return $ast;
}
sub optimize_ast {
my ($self, $ast) = @_;
my $optimizer = Sidef::Optimizer->new;
scalar {$optimizer->optimize($ast)};
}
sub execute_code {
my ($self, $code) = @_;
$self->execute_perl($self->compile_code($code, 'Perl'));
}
sub execute_perl {
my ($self, $code) = @_;
local $Sidef::PARSER = $self->{parser};
local $Sidef::DEPARSER = $self->{Perl}{deparser};
eval($code);
}
sub get_sidef_config_dir {
my ($self) = @_;
$self->{sidef_config_dir} //= $ENV{SIDEF_CONFIG_DIR}
|| File::Spec->catdir(
$ENV{XDG_CONFIG_DIR}
|| (
$ENV{HOME}
|| $ENV{LOGDIR}
|| (
$^O eq 'MSWin32'
? '\Local Settings\Application Data'
: eval { ((getpwuid($<))[7] || `echo -n ~`) }
)
|| File::Spec->curdir()
),
'.config',
'sidef'
);
if (not -d $self->{sidef_config_dir}) {
require File::Path;
eval { File::Path::make_path($self->{sidef_config_dir}) }
## or warn "[WARNING] Can't create directory <<$self->{sidef_config_dir}>>: $!";
}
return $self->{sidef_config_dir};
}
sub get_sidef_vdir {
my ($self) = @_;
$self->{_sidef_vdir} //= File::Spec->catdir($self->get_sidef_config_dir, "v$VERSION");
}
sub has_dbm_driver {
my ($self) = @_;
if (exists $self->{dbm_driver}) {
return $self->{dbm_driver};
}
if (eval { require DB_File; 1 }) {
return ($self->{dbm_driver} = 'bdbm');
}
if (eval { require GDBM_File; 1 }) {
return ($self->{dbm_driver} = 'gdbm');
}
warn "No supported database driver was found...\n";
warn "Please install DB_File or GDBM_File in order to use this functionality.\n";
return;
}
sub _init_db {
my ($self, $hash, $db_file) = @_;
dbmopen(%$hash, $db_file, 0640);
}
sub _init_time_db {
my ($self, $lang) = @_;
if (not exists $self->{$lang}{_time_hash}) {
$self->{$lang}{_time_hash} = {};
$self->_init_db($self->{$lang}{_time_hash}, $self->{$lang}{time_db});
if (not exists $self->{$lang}{_time_hash}{sanitized}) {
$self->{$lang}{_time_hash}{sanitized} = time;
}
}
}
sub _init_code_db {
( run in 1.593 second using v1.01-cache-2.11-cpan-995e09ba956 )