]> git.vpit.fr Git - perl/modules/Variable-Magic.git/commitdiff
Correctly propagate exceptions from _wizard()
authorVincent Pit <vince@profvince.com>
Fri, 24 Sep 2010 18:00:03 +0000 (20:00 +0200)
committerVincent Pit <vince@profvince.com>
Fri, 24 Sep 2010 18:00:03 +0000 (20:00 +0200)
lib/Variable/Magic.pm
t/18-opinfo.t

index 5c049322588e47cd50db032e14a8a01083420c68..19badb0e5ab9eaf109cf1f15cbd03d31726efe9f 100644 (file)
@@ -300,18 +300,26 @@ sub wizard {
  }
 
  my %opts = @_;
+
  my @keys = qw/data op_info get set len clear free/;
  push @keys, 'copy'  if MGf_COPY;
  push @keys, 'dup'   if MGf_DUP;
  push @keys, 'local' if MGf_LOCAL;
  push @keys, qw/fetch store exists delete copy_key/ if VMG_UVAR;
- my $ret = eval { _wizard(map $opts{$_}, @keys) };
- if (my $err = $@) {
+
+ my ($wiz, $err);
+ {
+  local $@;
+  $wiz = eval { _wizard(map $opts{$_}, @keys) };
+  $err = $@;
+ }
+ if ($err) {
   $err =~ s/\sat\s+.*?\n//;
   require Carp;
   Carp::croak($err);
  }
- return $ret;
+
+ return $wiz;
 }
 
 =head2 C<cast>
index c9398cc38799e4946259ca330b101e9da9cb4a63..6cf87680ad31fe2912f988e0936b3e2d4b79afd5 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 17 * (3 + 4) + 5;
+use Test::More tests => 17 * (3 + 4) + 5 + 1;
 
 use Config qw/%Config/;
 
@@ -106,3 +106,13 @@ for (@tests) {
  eval { dispell $c, $wiz };
  is $@, '', "get dispell with out of bounds op_info doesn't croak";
 }
+
+{
+ local $@;
+ my $wiz = eval {
+  local $SIG{__WARN__} = sub { die @_ };
+  wizard op_info => "hlagh";
+ };
+ like $@, qr/^Argument "hlagh" isn't numeric in subroutine entry at \Q$0\E/,
+      'wizard(op_info => "text") throws numeric warnings';
+}