forked from PsychoticNinja/irssi
Clean up script loading in general.
Don't leak local variables to eval'd code. Set filename/line number to get better error messages from perl. Use three-arg open and lexical filehandles to avoid surprises. Include error reason in message for unopenable scripts. Don't wrap script code in sub handler { } - this avoids spurious warnings and should at least allow __END__ to work properly. Patch by Lukas Mai. git-svn-id: file:///var/www/svn.irssi.org/SVN/irssi/trunk@4961 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
7982a86420
commit
0327b7d5dc
@ -8,6 +8,12 @@ package Irssi::Core;
|
|||||||
|
|
||||||
use Symbol;
|
use Symbol;
|
||||||
|
|
||||||
|
$SIG{__WARN__} = sub {
|
||||||
|
my @msg = @_;
|
||||||
|
s/%/%%/g for @msg;
|
||||||
|
print @msg;
|
||||||
|
};
|
||||||
|
|
||||||
sub is_static {
|
sub is_static {
|
||||||
return %d;
|
return %d;
|
||||||
}
|
}
|
||||||
@ -18,37 +24,27 @@ sub destroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub eval_data {
|
sub eval_data {
|
||||||
|
my $ret = eval do {
|
||||||
my ($data, $id) = @_;
|
my ($data, $id) = @_;
|
||||||
destroy("Irssi::Script::$id");
|
destroy("Irssi::Script::$id");
|
||||||
|
my $code = qq{package Irssi::Script::$id; %s $data};
|
||||||
$SIG{__WARN__} = sub {
|
$code
|
||||||
Irssi::print("Warning in script $id:");
|
|
||||||
print $_[0];
|
|
||||||
};
|
};
|
||||||
my $package = "Irssi::Script::$id";
|
$@ and die $@;
|
||||||
my $eval = qq{package $package; %s sub handler { $data; }};
|
$ret
|
||||||
{
|
|
||||||
# hide our variables within this block
|
|
||||||
my ($filename, $package, $data);
|
|
||||||
eval $eval;
|
|
||||||
}
|
|
||||||
die $@ if $@;
|
|
||||||
|
|
||||||
my $ret;
|
|
||||||
eval { $ret = $package->handler; };
|
|
||||||
die $@ if $@;
|
|
||||||
return $ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sub eval_file {
|
sub eval_file {
|
||||||
my ($filename, $id) = @_;
|
my ($filename, $id) = @_;
|
||||||
|
|
||||||
local *FH;
|
open my $fh, '<', $filename or die "Can't open $filename: $!";
|
||||||
open FH, $filename or die "File not found: $filename";
|
my $data = do {local $/; <$fh>};
|
||||||
local($/) = undef;
|
close $fh;
|
||||||
my $data = <FH>;
|
|
||||||
close FH;
|
$filename =~ s/(["\\])/\\$1/g;
|
||||||
local($/) = "\n";
|
$filename =~ s/\n/\\n/g;
|
||||||
|
|
||||||
|
$data = qq{\n#line 1 "$filename"\n$data};
|
||||||
|
|
||||||
eval_data($data, $id);
|
eval_data($data, $id);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user