Merge Irssi 0.8.16-rc1
[silc.git] / apps / irssi / src / perl / irssi-core.pl
index 31fbe484e86dd4d1f6b2b5c8f1867c28a81d595b..38265a80176520378ab334834906d30d64005e23 100644 (file)
@@ -6,42 +6,45 @@
 # %%s : must be second - use Irssi; use Irssi::Irc; etc..
 package Irssi::Core;
 
-use Symbol qw(delete_package);
+use Symbol;
+
+$SIG{__WARN__} = sub {
+  my @msg = @_;
+  s/%%/%%%%/g for @msg;
+  print @msg;
+};
 
 sub is_static {
   return %d;
 }
 
 sub destroy {
-  delete_package($_[0]);
+  eval { $_[0]->UNLOAD() if $_[0]->can('UNLOAD'); };
+  Symbol::delete_package($_[0]);
 }
 
 sub eval_data {
-  my ($data, $id) = @_;
-  destroy("Irssi::Script::$id");
-
-  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 $@;
-
-  eval {$package->handler;};
-  die $@ if $@;
+  my $ret = eval do {
+    my ($data, $id) = @_;
+    destroy("Irssi::Script::$id");
+    my $code = qq{package Irssi::Script::$id; %s $data};
+    $code
+  };
+  $@ 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);
 }