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;
|
||||
|
||||
$SIG{__WARN__} = sub {
|
||||
my @msg = @_;
|
||||
s/%/%%/g for @msg;
|
||||
print @msg;
|
||||
};
|
||||
|
||||
sub is_static {
|
||||
return %d;
|
||||
}
|
||||
@ -18,37 +24,27 @@ sub destroy {
|
||||
}
|
||||
|
||||
sub eval_data {
|
||||
my ($data, $id) = @_;
|
||||
destroy("Irssi::Script::$id");
|
||||
|
||||
$SIG{__WARN__} = sub {
|
||||
Irssi::print("Warning in script $id:");
|
||||
print $_[0];
|
||||
my $ret = eval do {
|
||||
my ($data, $id) = @_;
|
||||
destroy("Irssi::Script::$id");
|
||||
my $code = qq{package Irssi::Script::$id; %s $data};
|
||||
$code
|
||||
};
|
||||
my $package = "Irssi::Script::$id";
|
||||
my $eval = qq{package $package; %s sub handler { $data; }};
|
||||
{
|
||||
# hide our variables within this block
|
||||
my ($filename, $package, $data);
|
||||
eval $eval;
|
||||
}
|
||||
die $@ if $@;
|
||||
|
||||
my $ret;
|
||||
eval { $ret = $package->handler; };
|
||||
die $@ if $@;
|
||||
return $ret;
|
||||
$@ and die $@;
|
||||
$ret
|
||||
}
|
||||
|
||||
sub eval_file {
|
||||
my ($filename, $id) = @_;
|
||||
|
||||
local *FH;
|
||||
open FH, $filename or die "File not found: $filename";
|
||||
local($/) = undef;
|
||||
my $data = <FH>;
|
||||
close FH;
|
||||
local($/) = "\n";
|
||||
open my $fh, '<', $filename or die "Can't open $filename: $!";
|
||||
my $data = do {local $/; <$fh>};
|
||||
close $fh;
|
||||
|
||||
$filename =~ s/(["\\])/\\$1/g;
|
||||
$filename =~ s/\n/\\n/g;
|
||||
|
||||
$data = qq{\n#line 1 "$filename"\n$data};
|
||||
|
||||
eval_data($data, $id);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user