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:
Emanuele Giaquinta 2008-12-09 21:42:51 +00:00 committed by exg
parent 7982a86420
commit 0327b7d5dc

View File

@ -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);
} }