[perl #48355] Handling of RAWDATA broken badly in Attribute::Handlers in perl 5.10...
authorSascha Blank <unknown>
Sat, 8 Dec 2007 03:47:46 +0000 (19:47 -0800)
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>
Sat, 8 Dec 2007 23:28:41 +0000 (23:28 +0000)
From: Sascha Blank (via RT) <perlbug-followup@perl.org>
Message-ID: <rt-3.6.HEAD-28750-1197114466-1411.48355-75-0@perl.org>

p4raw-id: //depot/perl@32598

lib/Attribute/Handlers.pm
t/op/attrhand.t

index e035a14..6c7b3f5 100644 (file)
@@ -190,9 +190,14 @@ sub _apply_handler_AH_ {
        my $sym = findsym($pkg, $ref);
        $sym ||= $type eq 'CODE' ? 'ANON' : 'LEXICAL';
        no warnings;
-       my $evaled = !$raw && eval("package $pkg; no warnings; no strict;
-                                   local \$SIG{__WARN__}=sub{die}; [$data]");
-       $data = $evaled unless $@;
+       if (!$raw && defined($data)) {
+           if ($data ne '') {
+               my $evaled = eval("package $pkg; no warnings; no strict;
+                                  local \$SIG{__WARN__}=sub{die}; [$data]");
+               $data = $evaled unless $@;
+           }
+           else { $data = undef }
+       }
        $pkg->$handler($sym,
                       (ref $sym eq 'GLOB' ? *{$sym}{ref $ref}||$ref : $ref),
                       $attr,
index fb8069f..8b11ac4 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     require './test.pl';
 }
 
-plan tests => 1;
+plan tests => 4;
 
 # test for bug #38475: parsing errors with multiline attributes
 
@@ -22,6 +22,26 @@ sub WrongAttr :ATTR(CODE,RAWDATA) {
     ::ok(0);
 }
 
+sub CheckData :ATTR(RAWDATA) {
+    # check that the $data element contains the given attribute parameters.
+
+    if ($_[4] eq "12, 14") {
+        ::ok(1)
+    }
+    else {
+        ::ok(0)
+    }
+}
+
+sub CheckEmptyValue :ATTR() {
+    if (not defined $_[4]) {
+        ::ok(1)
+    }
+    else {
+        ::ok(0)
+    }
+}
+
 package Deer;
 use base 'Antler';
 
@@ -35,3 +55,8 @@ sub something : TypeCheck(
 }
 
 something();
+
+sub c :CheckData(12, 14) {};
+
+sub d1 :CheckEmptyValue() {};
+sub d2 :CheckEmptyValue {};