[perl #87708] $tied / $tied under use integer
authorFather Chrysostomos <sprout@cpan.org>
Wed, 6 Apr 2011 20:12:59 +0000 (13:12 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Wed, 6 Apr 2011 20:12:59 +0000 (13:12 -0700)
This is just part of #87708.

This fixes the / operator under â€˜use integer’ when the same tied sca-
lar is used for both operands and returns two different values. Before
this commit, get-magic would be called only once and the same value
used. In 5.12.x the operands were swapped.

pp.c
t/lib/warnings/9uninit
t/op/tie_fetch_count.t

diff --git a/pp.c b/pp.c
index 9858f91..941cc9d 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -2846,15 +2846,14 @@ PP(pp_i_multiply)
 
 PP(pp_i_divide)
 {
-    IV num;
     dVAR; dSP; dATARGET;
     tryAMAGICbin_MG(div_amg, AMGf_assign);
     {
       dPOPTOPssrl;
-      IV value = SvIV_nomg(right);
+      IV num = SvIV_nomg(left);
+      IV value = left==right ? SvIV(right) : SvIV_nomg(right);
       if (value == 0)
          DIE(aTHX_ "Illegal division by zero");
-      num = SvIV_nomg(left);
 
       /* avoid FPE_INTOVF on some platforms when num is IV_MIN */
       if (value == -1)
index 10f0a7c..a16fd35 100644 (file)
@@ -562,6 +562,7 @@ Use of uninitialized value $m1 in integer subtraction (-) at - line 7.
 Use of uninitialized value $g1 in integer subtraction (-) at - line 7.
 Use of uninitialized value $m1 in integer multiplication (*) at - line 8.
 Use of uninitialized value $g1 in integer multiplication (*) at - line 8.
+Use of uninitialized value $m1 in integer division (/) at - line 9.
 Use of uninitialized value $g1 in integer division (/) at - line 9.
 Use of uninitialized value $m2 in integer division (/) at - line 10.
 Use of uninitialized value $m1 in integer modulus (%) at - line 11.
index 6643941..d6cf9c6 100644 (file)
@@ -231,10 +231,7 @@ bin_test '.' ,  1, 2, 12;
     bin_test '+' ,  1, 2, 3;
 }
 bin_int_test '*' ,  2, 3, 6;
-{
-    local $TODO = $todo ;
-    bin_int_test '/' , 10, 2, 5;
-}
+bin_int_test '/' , 10, 2, 5;
 bin_int_test '%' , 11, 2, 1;
 bin_int_test '+' ,  1, 2, 3;
 bin_int_test '-' , 11, 2, 9;