use strict;
use Scalar::Util 'weaken';
### Fields
sub get_runtime { shift->{runtime} }
sub pointer {
my $self = shift;
if (@_) {
$self->{pointer} = $_[0];
return $self;
}
else {
return $self->{pointer};
}
}
sub boot_env {
my $self = shift;
if (@_) {
$self->{boot_env} = $_[0];
return $self;
}
else {
return $self->{boot_env};
}
}
sub get_formatted_error_messages {
my ($self, $fh) = @_;
my $formatted_error_messages = [];
my $error_messages = $self->get_error_messages;
for my $error_message (@$error_messages) {
push @$formatted_error_messages, "[Compilation Error]$error_message\n";
}
return $formatted_error_messages;
}
sub new {
my $class = shift;
my $self = {@_};
bless $self, $class;
my $boot_env = SPVM::Builder::Native::Env->new;
$self->boot_env($boot_env);
$self->create_native_compiler;
my $runtime = $self->get_runtime;
$runtime->{compiler} = $self;
weaken $runtime->{compiler};
return $self;
}
sub compile_with_exit {
my ($self, $class_name, $file, $line) = @_;
$self->set_start_file($file);
$self->set_start_line($line);
eval { $self->compile($class_name); };
if ($@) {
Carp::confess(join("\n", @{$self->get_formatted_error_messages}));
}
}
sub compile_anon_class_with_exit {
my ($self, $source, $file, $line) = @_;
$self->set_start_file($file);
$self->set_start_line($line);
my $anon_class_name;
eval { $anon_class_name = $self->compile_anon_class($source); };
if ($@) {
Carp::confess(join("\n", @{$self->get_formatted_error_messages}));
}
return $anon_class_name;
}
1;
=head1 Name
SPVM::Builder::Native::Compiler - Compiler Native APIs
=head1 Copyright & License
Copyright (c) 2023 Yuki Kimoto
MIT License