Evaluation of AVHVs in scalar context
Gisle Aas [Mon, 6 Jul 1998 21:41:14 +0000 (23:41 +0200)]
Message-ID: <m33ecedaxx.fsf@furu.g.aas.no>

p4raw-id: //depot/perl@1358

pp_hot.c
t/op/avhv.t

index 8e3bf70..d825e64 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -544,7 +544,8 @@ PP(pp_rv2hv)
     }
     else {
        dTARGET;
-       /* This bit is OK even when hv is really an AV */
+       if (SvTYPE(hv) == SVt_PVAV)
+           hv = avhv_keys((AV*)hv);
        if (HvFILL(hv))
            sv_setpvf(TARG, "%ld/%ld",
                      (long)HvFILL(hv), (long)HvMAX(hv) + 1);
index e01201e..272d222 100755 (executable)
@@ -17,7 +17,7 @@ sub STORESIZE { $#{$_[0]} = $_[1]+1 }
 
 package main;
 
-print "1..6\n";
+print "1..10\n";
 
 $sch = {
     'abc' => 1,
@@ -78,3 +78,21 @@ if ($a->{'abc'} eq 'ABC') {print "ok 5\n";} else {print "not ok 5\n";}
 my $slice = join('', 'x',@$a{'abc','def'},'x');
 print "not " if $slice ne 'xABCx';
 print "ok 6\n";
+
+# evaluation in scalar context
+my $avhv = [{}];
+print "not " if %$avhv;
+print "ok 7\n";
+
+push @$avhv, "a";
+print "not " if %$avhv;
+print "ok 8\n";
+
+$avhv = [];
+eval { $a = %$avhv };
+print "not " unless $@ and $@ =~ /^Can't coerce array into hash/;
+print "ok 9\n";
+
+$avhv = [{foo=>1, bar=>2}];
+print "not " unless %$avhv =~ m,^\d+/\d+,;
+print "ok 10\n";