]> granicus.if.org Git - php/commitdiff
Update bcmath.scale when calling bcscale()
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 21 Oct 2020 15:03:54 +0000 (17:03 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 21 Oct 2020 15:06:48 +0000 (17:06 +0200)
We should keep the value of bcmath.scale and the internal
bc_precision global synchronized.

Probably more important than the ability to retrieve bcmath.scale
via ini_get(), this also makes sure that the set scale does not
leak into the next request, as it currently does.

ext/bcmath/bcmath.c
ext/bcmath/tests/bcscale_variation003.phpt

index f20dda534fd26e37df1891fc3267916cfaa33863..95b820e4c4dfd0b7edcdace3ab1864025e2be414 100644 (file)
@@ -542,7 +542,11 @@ PHP_FUNCTION(bcscale)
                        RETURN_THROWS();
                }
 
-               BCG(bc_precision) = (int) new_scale;
+               zend_string *ini_name = zend_string_init("bcmath.scale", sizeof("bcmath.scale") - 1, 0);
+               zend_string *new_scale_str = zend_long_to_str(new_scale);
+               zend_alter_ini_entry(ini_name, new_scale_str, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
+               zend_string_release(new_scale_str);
+               zend_string_release(ini_name);
        }
 
        RETURN_LONG(old_scale);
index b1c541644c6d819f25e394a1caafc76fb418d847..0812aadab6c734c27844908672c51eaa88de3032 100644 (file)
@@ -6,13 +6,21 @@ bcscale() return value
 bcmath.scale=0
 --FILE--
 <?php
+var_dump((int) ini_get('bcmath.scale'));
 var_dump(bcscale(1));
+var_dump((int) ini_get('bcmath.scale'));
 var_dump(bcscale(4));
+var_dump((int) ini_get('bcmath.scale'));
 var_dump(bcscale());
+var_dump((int) ini_get('bcmath.scale'));
 var_dump(bcscale());
 ?>
 --EXPECT--
 int(0)
+int(0)
+int(1)
 int(1)
 int(4)
 int(4)
+int(4)
+int(4)