"\n"
"use Symbol;\n"
"\n"
+"$SIG{__WARN__} = sub {\n"
+" my @msg = @_;\n"
+" s/%%/%%%%/g for @msg;\n"
+" print @msg;\n"
+"};\n"
+"\n"
"sub is_static {\n"
" return %d;\n"
"}\n"
"}\n"
"\n"
"sub eval_data {\n"
-" my ($data, $id) = @_;\n"
-" destroy(\"Irssi::Script::$id\");\n"
-"\n"
-" my $package = \"Irssi::Script::$id\";\n"
-" my $eval = qq{package $package; %s sub handler { $data; }};\n"
-" {\n"
-" # hide our variables within this block\n"
-" my ($filename, $package, $data);\n"
-" eval $eval;\n"
-" }\n"
-" die $@ if $@;\n"
-"\n"
-" my $ret;\n"
-" eval { $ret = $package->handler; };\n"
-" die $@ if $@;\n"
-" return $ret;\n"
+" my $ret = eval do {\n"
+" my ($data, $id) = @_;\n"
+" destroy(\"Irssi::Script::$id\");\n"
+" my $code = qq{package Irssi::Script::$id; %s $data};\n"
+" $code\n"
+" };\n"
+" $@ and die $@;\n"
+" $ret\n"
"}\n"
"\n"
"sub eval_file {\n"
" my ($filename, $id) = @_;\n"
"\n"
-" local *FH;\n"
-" open FH, $filename or die \"File not found: $filename\";\n"
-" local($/) = undef;\n"
-" my $data = <FH>;\n"
-" close FH;\n"
-" local($/) = \"\\n\";\n"
+" open my $fh, '<', $filename or die \"Can't open $filename: $!\";\n"
+" my $data = do {local $/; <$fh>};\n"
+" close $fh;\n"
+"\n"
+" $filename =~ s/([\"\\\\])/\\\\$1/g;\n"
+" $filename =~ s/\\n/\\\\n/g;\n"
+"\n"
+" $data = qq{\\n#line 1 \"$filename\"\\n$data};\n"
"\n"
" eval_data($data, $id);\n"
"}\n"