@@ -71,10 +71,9 @@ PHPAPI zend_class_entry *random_ce_Random_RandomError;
7171PHPAPI zend_class_entry * random_ce_Random_BrokenRandomEngineError ;
7272PHPAPI zend_class_entry * random_ce_Random_RandomException ;
7373
74- static zend_object_handlers random_engine_mt19937_object_handlers ;
75- static zend_object_handlers random_engine_pcgoneseq128xslrr64_object_handlers ;
76- static zend_object_handlers random_engine_xoshiro256starstar_object_handlers ;
77- static zend_object_handlers random_engine_secure_object_handlers ;
74+ static zend_object_handlers random_engine_cloneable_object_handlers ;
75+ static zend_object_handlers random_engine_non_cloneable_object_handlers ;
76+
7877static zend_object_handlers random_randomizer_object_handlers ;
7978
8079PHPAPI uint32_t php_random_range32 (php_random_algo_with_state engine , uint32_t umax )
@@ -197,22 +196,22 @@ PHPAPI uint64_t php_random_range64(php_random_algo_with_state engine, uint64_t u
197196
198197static zend_object * php_random_engine_mt19937_new (zend_class_entry * ce )
199198{
200- return & php_random_engine_common_init (ce , & random_engine_mt19937_object_handlers , & php_random_algo_mt19937 )-> std ;
199+ return & php_random_engine_common_init (ce , & random_engine_cloneable_object_handlers , & php_random_algo_mt19937 )-> std ;
201200}
202201
203202static zend_object * php_random_engine_pcgoneseq128xslrr64_new (zend_class_entry * ce )
204203{
205- return & php_random_engine_common_init (ce , & random_engine_pcgoneseq128xslrr64_object_handlers , & php_random_algo_pcgoneseq128xslrr64 )-> std ;
204+ return & php_random_engine_common_init (ce , & random_engine_cloneable_object_handlers , & php_random_algo_pcgoneseq128xslrr64 )-> std ;
206205}
207206
208207static zend_object * php_random_engine_xoshiro256starstar_new (zend_class_entry * ce )
209208{
210- return & php_random_engine_common_init (ce , & random_engine_xoshiro256starstar_object_handlers , & php_random_algo_xoshiro256starstar )-> std ;
209+ return & php_random_engine_common_init (ce , & random_engine_cloneable_object_handlers , & php_random_algo_xoshiro256starstar )-> std ;
211210}
212211
213212static zend_object * php_random_engine_secure_new (zend_class_entry * ce )
214213{
215- return & php_random_engine_common_init (ce , & random_engine_secure_object_handlers , & php_random_algo_secure )-> std ;
214+ return & php_random_engine_common_init (ce , & random_engine_non_cloneable_object_handlers , & php_random_algo_secure )-> std ;
216215}
217216
218217static zend_object * php_random_randomizer_new (zend_class_entry * ce )
@@ -289,6 +288,24 @@ PHPAPI zend_object *php_random_engine_common_clone_object(zend_object *object)
289288 return & new_engine -> std ;
290289}
291290
291+ PHPAPI void * php_random_engine_common_init_cloneable_object_handlers (zend_object_handlers * handlers )
292+ {
293+ memcpy (handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
294+ handlers -> offset = XtOffsetOf (php_random_engine , std );
295+ handlers -> free_obj = php_random_engine_common_free_object ;
296+ handlers -> clone_obj = php_random_engine_common_clone_object ;
297+
298+ return handlers ;
299+ }
300+
301+ PHPAPI void * php_random_engine_common_init_non_cloneable_object_handlers (zend_object_handlers * handlers )
302+ {
303+ php_random_engine_common_init_cloneable_object_handlers (handlers );
304+ handlers -> clone_obj = NULL ;
305+
306+ return handlers ;
307+ }
308+
292309/* {{{ php_random_range */
293310PHPAPI zend_long php_random_range (php_random_algo_with_state engine , zend_long min , zend_long max )
294311{
@@ -728,6 +745,9 @@ static PHP_GINIT_FUNCTION(random)
728745/* {{{ PHP_MINIT_FUNCTION */
729746PHP_MINIT_FUNCTION (random )
730747{
748+ php_random_engine_common_init_cloneable_object_handlers (& random_engine_cloneable_object_handlers );
749+ php_random_engine_common_init_non_cloneable_object_handlers (& random_engine_non_cloneable_object_handlers );
750+
731751 /* Random\Engine */
732752 random_ce_Random_Engine = register_class_Random_Engine ();
733753
@@ -746,34 +766,18 @@ PHP_MINIT_FUNCTION(random)
746766 /* Random\Engine\Mt19937 */
747767 random_ce_Random_Engine_Mt19937 = register_class_Random_Engine_Mt19937 (random_ce_Random_Engine );
748768 random_ce_Random_Engine_Mt19937 -> create_object = php_random_engine_mt19937_new ;
749- memcpy (& random_engine_mt19937_object_handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
750- random_engine_mt19937_object_handlers .offset = XtOffsetOf (php_random_engine , std );
751- random_engine_mt19937_object_handlers .free_obj = php_random_engine_common_free_object ;
752- random_engine_mt19937_object_handlers .clone_obj = php_random_engine_common_clone_object ;
753769
754770 /* Random\Engine\PcgOnseq128XslRr64 */
755771 random_ce_Random_Engine_PcgOneseq128XslRr64 = register_class_Random_Engine_PcgOneseq128XslRr64 (random_ce_Random_Engine );
756772 random_ce_Random_Engine_PcgOneseq128XslRr64 -> create_object = php_random_engine_pcgoneseq128xslrr64_new ;
757- memcpy (& random_engine_pcgoneseq128xslrr64_object_handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
758- random_engine_pcgoneseq128xslrr64_object_handlers .offset = XtOffsetOf (php_random_engine , std );
759- random_engine_pcgoneseq128xslrr64_object_handlers .free_obj = php_random_engine_common_free_object ;
760- random_engine_pcgoneseq128xslrr64_object_handlers .clone_obj = php_random_engine_common_clone_object ;
761773
762774 /* Random\Engine\Xoshiro256StarStar */
763775 random_ce_Random_Engine_Xoshiro256StarStar = register_class_Random_Engine_Xoshiro256StarStar (random_ce_Random_Engine );
764776 random_ce_Random_Engine_Xoshiro256StarStar -> create_object = php_random_engine_xoshiro256starstar_new ;
765- memcpy (& random_engine_xoshiro256starstar_object_handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
766- random_engine_xoshiro256starstar_object_handlers .offset = XtOffsetOf (php_random_engine , std );
767- random_engine_xoshiro256starstar_object_handlers .free_obj = php_random_engine_common_free_object ;
768- random_engine_xoshiro256starstar_object_handlers .clone_obj = php_random_engine_common_clone_object ;
769777
770778 /* Random\Engine\Secure */
771779 random_ce_Random_Engine_Secure = register_class_Random_Engine_Secure (random_ce_Random_CryptoSafeEngine );
772780 random_ce_Random_Engine_Secure -> create_object = php_random_engine_secure_new ;
773- memcpy (& random_engine_secure_object_handlers , zend_get_std_object_handlers (), sizeof (zend_object_handlers ));
774- random_engine_secure_object_handlers .offset = XtOffsetOf (php_random_engine , std );
775- random_engine_secure_object_handlers .free_obj = php_random_engine_common_free_object ;
776- random_engine_secure_object_handlers .clone_obj = NULL ;
777781
778782 /* Random\Randomizer */
779783 random_ce_Random_Randomizer = register_class_Random_Randomizer ();
0 commit comments