3030#include "php_bcmath.h"
3131#include "libbcmath/src/bcmath.h"
3232
33+ ZEND_DECLARE_MODULE_GLOBALS (bcmath );
34+
3335function_entry bcmath_functions [] = {
3436 PHP_FE (bcadd , NULL )
3537 PHP_FE (bcsub , NULL )
@@ -47,7 +49,11 @@ zend_module_entry bcmath_module_entry = {
4749 STANDARD_MODULE_HEADER ,
4850 "bcmath" ,
4951 bcmath_functions ,
52+ #if ZTS
53+ PHP_MODULE_STARTUP_N (bcmath ),
54+ #else
5055 NULL ,
56+ #endif
5157 NULL ,
5258 PHP_RINIT (bcmath ),
5359 PHP_RSHUTDOWN (bcmath ),
@@ -64,32 +70,22 @@ ZEND_GET_MODULE(bcmath)
6470static long bc_precision ;
6571#endif
6672
67- /* Storage used for special numbers. */
68- extern bc_num _zero_ ;
69- extern bc_num _one_ ;
70- extern bc_num _two_ ;
71-
72-
73- /* Make a copy of a number! Just increments the reference count! */
74- bc_num copy_num (bc_num num )
73+ #if ZTS
74+ PHP_MODULE_STARTUP_D (bcmath )
7575{
76- num -> n_refs ++ ;
77- return num ;
78- }
76+ zend_bcmath_globals * bcmath_globals ;
7977
80-
81- /* Initialize a number NUM by making it a copy of zero. */
82- void init_num (bc_num * num )
83- {
84- * num = copy_num (_zero_ );
78+ ts_allocate_id (& bcmath_globals_id , sizeof (zend_bcmath_globals ), NULL , NULL );
79+ bcmath_globals = ts_resource (bcmath_globals_id );
80+ return SUCCESS ;
8581}
86-
82+ #endif
8783
8884PHP_RSHUTDOWN_FUNCTION (bcmath )
8985{
90- bc_free_num (& _zero_ );
91- bc_free_num (& _one_ );
92- bc_free_num (& _two_ );
86+ bc_free_num (& BCG ( _zero_ ) );
87+ bc_free_num (& BCG ( _one_ ) );
88+ bc_free_num (& BCG ( _two_ ) );
9389
9490 return SUCCESS ;
9591}
@@ -101,7 +97,7 @@ PHP_RINIT_FUNCTION(bcmath)
10197 bc_precision = 0 ;
10298 }
10399
104- bc_init_numbers ();
100+ bc_init_numbers (TSRMLS_C );
105101
106102 return SUCCESS ;
107103}
@@ -141,11 +137,11 @@ PHP_FUNCTION(bcadd)
141137 }
142138 convert_to_string_ex (left );
143139 convert_to_string_ex (right );
144- bc_init_num (& first );
145- bc_init_num (& second );
146- bc_init_num (& result );
147- bc_str2num (& first , Z_STRVAL_PP (left ), scale );
148- bc_str2num (& second , Z_STRVAL_PP (right ), scale );
140+ bc_init_num (& first TSRMLS_CC );
141+ bc_init_num (& second TSRMLS_CC );
142+ bc_init_num (& result TSRMLS_CC );
143+ bc_str2num (& first , Z_STRVAL_PP (left ), scale TSRMLS_CC );
144+ bc_str2num (& second , Z_STRVAL_PP (right ), scale TSRMLS_CC );
149145 bc_add (first , second , & result , scale );
150146 Z_STRVAL_P (return_value ) = bc_num2str (result );
151147 Z_STRLEN_P (return_value ) = strlen (Z_STRVAL_P (return_value ));
@@ -184,11 +180,11 @@ PHP_FUNCTION(bcsub)
184180 }
185181 convert_to_string_ex (left );
186182 convert_to_string_ex (right );
187- bc_init_num (& first );
188- bc_init_num (& second );
189- bc_init_num (& result );
190- bc_str2num (& first , Z_STRVAL_PP (left ), scale );
191- bc_str2num (& second , Z_STRVAL_PP (right ), scale );
183+ bc_init_num (& first TSRMLS_CC );
184+ bc_init_num (& second TSRMLS_CC );
185+ bc_init_num (& result TSRMLS_CC );
186+ bc_str2num (& first , Z_STRVAL_PP (left ), scale TSRMLS_CC );
187+ bc_str2num (& second , Z_STRVAL_PP (right ), scale TSRMLS_CC );
192188 bc_sub (first , second , & result , scale );
193189 Z_STRVAL_P (return_value ) = bc_num2str (result );
194190 Z_STRLEN_P (return_value ) = strlen (Z_STRVAL_P (return_value ));
@@ -227,12 +223,12 @@ PHP_FUNCTION(bcmul)
227223 }
228224 convert_to_string_ex (left );
229225 convert_to_string_ex (right );
230- bc_init_num (& first );
231- bc_init_num (& second );
232- bc_init_num (& result );
233- bc_str2num (& first , Z_STRVAL_PP (left ), scale );
234- bc_str2num (& second , Z_STRVAL_PP (right ), scale );
235- bc_multiply (first , second , & result , scale );
226+ bc_init_num (& first TSRMLS_CC );
227+ bc_init_num (& second TSRMLS_CC );
228+ bc_init_num (& result TSRMLS_CC );
229+ bc_str2num (& first , Z_STRVAL_PP (left ), scale TSRMLS_CC );
230+ bc_str2num (& second , Z_STRVAL_PP (right ), scale TSRMLS_CC );
231+ bc_multiply (first , second , & result , scale TSRMLS_CC );
236232 Z_STRVAL_P (return_value ) = bc_num2str (result );
237233 Z_STRLEN_P (return_value ) = strlen (Z_STRVAL_P (return_value ));
238234 Z_TYPE_P (return_value ) = IS_STRING ;
@@ -270,12 +266,12 @@ PHP_FUNCTION(bcdiv)
270266 }
271267 convert_to_string_ex (left );
272268 convert_to_string_ex (right );
273- bc_init_num (& first );
274- bc_init_num (& second );
275- bc_init_num (& result );
276- bc_str2num (& first , Z_STRVAL_PP (left ), scale );
277- bc_str2num (& second , Z_STRVAL_PP (right ), scale );
278- switch (bc_divide (first , second , & result , scale )) {
269+ bc_init_num (& first TSRMLS_CC );
270+ bc_init_num (& second TSRMLS_CC );
271+ bc_init_num (& result TSRMLS_CC );
272+ bc_str2num (& first , Z_STRVAL_PP (left ), scale TSRMLS_CC );
273+ bc_str2num (& second , Z_STRVAL_PP (right ), scale TSRMLS_CC );
274+ switch (bc_divide (first , second , & result , scale TSRMLS_CC )) {
279275 case 0 : /* OK */
280276 Z_STRVAL_P (return_value ) = bc_num2str (result );
281277 Z_STRLEN_P (return_value ) = strlen (Z_STRVAL_P (return_value ));
@@ -311,12 +307,12 @@ PHP_FUNCTION(bcmod)
311307 }
312308 convert_to_string_ex (left );
313309 convert_to_string_ex (right );
314- bc_init_num (& first );
315- bc_init_num (& second );
316- bc_init_num (& result );
317- bc_str2num (& first , Z_STRVAL_PP (left ), 0 );
318- bc_str2num (& second , Z_STRVAL_PP (right ), 0 );
319- switch (bc_modulo (first , second , & result , 0 )) {
310+ bc_init_num (& first TSRMLS_CC );
311+ bc_init_num (& second TSRMLS_CC );
312+ bc_init_num (& result TSRMLS_CC );
313+ bc_str2num (& first , Z_STRVAL_PP (left ), 0 TSRMLS_CC );
314+ bc_str2num (& second , Z_STRVAL_PP (right ), 0 TSRMLS_CC );
315+ switch (bc_modulo (first , second , & result , 0 TSRMLS_CC )) {
320316 case 0 :
321317 Z_STRVAL_P (return_value ) = bc_num2str (result );
322318 Z_STRLEN_P (return_value ) = strlen (Z_STRVAL_P (return_value ));
@@ -360,12 +356,12 @@ PHP_FUNCTION(bcpow)
360356 }
361357 convert_to_string_ex (left );
362358 convert_to_string_ex (right );
363- bc_init_num (& first );
364- bc_init_num (& second );
365- bc_init_num (& result );
366- bc_str2num (& first , Z_STRVAL_PP (left ), scale );
367- bc_str2num (& second , Z_STRVAL_PP (right ), scale );
368- bc_raise (first , second , & result , scale );
359+ bc_init_num (& first TSRMLS_CC );
360+ bc_init_num (& second TSRMLS_CC );
361+ bc_init_num (& result TSRMLS_CC );
362+ bc_str2num (& first , Z_STRVAL_PP (left ), scale TSRMLS_CC );
363+ bc_str2num (& second , Z_STRVAL_PP (right ), scale TSRMLS_CC );
364+ bc_raise (first , second , & result , scale TSRMLS_CC );
369365 Z_STRVAL_P (return_value ) = bc_num2str (result );
370366 Z_STRLEN_P (return_value ) = strlen (Z_STRVAL_P (return_value ));
371367 Z_TYPE_P (return_value ) = IS_STRING ;
@@ -402,9 +398,9 @@ PHP_FUNCTION(bcsqrt)
402398 break ;
403399 }
404400 convert_to_string_ex (left );
405- bc_init_num (& result );
406- bc_str2num (& result , Z_STRVAL_PP (left ), scale );
407- if (bc_sqrt (& result , scale ) != 0 ) {
401+ bc_init_num (& result TSRMLS_CC );
402+ bc_str2num (& result , Z_STRVAL_PP (left ), scale TSRMLS_CC );
403+ if (bc_sqrt (& result , scale TSRMLS_CC ) != 0 ) {
408404 Z_STRVAL_P (return_value ) = bc_num2str (result );
409405 Z_STRLEN_P (return_value ) = strlen (Z_STRVAL_P (return_value ));
410406 Z_TYPE_P (return_value ) = IS_STRING ;
@@ -444,11 +440,11 @@ PHP_FUNCTION(bccomp)
444440
445441 convert_to_string_ex (left );
446442 convert_to_string_ex (right );
447- bc_init_num (& first );
448- bc_init_num (& second );
443+ bc_init_num (& first TSRMLS_CC );
444+ bc_init_num (& second TSRMLS_CC );
449445
450- bc_str2num (& first , Z_STRVAL_PP (left ), scale );
451- bc_str2num (& second , Z_STRVAL_PP (right ), scale );
446+ bc_str2num (& first , Z_STRVAL_PP (left ), scale TSRMLS_CC );
447+ bc_str2num (& second , Z_STRVAL_PP (right ), scale TSRMLS_CC );
452448 Z_LVAL_P (return_value ) = bc_compare (first , second );
453449 Z_TYPE_P (return_value ) = IS_LONG ;
454450
0 commit comments