diff --git a/ext/random/php_random.h b/ext/random/php_random.h index bc55a3defcc7c..cef60244fdc70 100644 --- a/ext/random/php_random.h +++ b/ext/random/php_random.h @@ -154,6 +154,8 @@ PHPAPI void php_random_status_free(void *status, const bool persistent); PHPAPI php_random_engine *php_random_engine_common_init(zend_class_entry *ce, zend_object_handlers *handlers, const php_random_algo *algo); PHPAPI void php_random_engine_common_free_object(zend_object *object); PHPAPI zend_object *php_random_engine_common_clone_object(zend_object *object); +PHPAPI void *php_random_engine_common_init_cloneable_object_handlers(zend_object_handlers *handlers); +PHPAPI void *php_random_engine_common_init_non_cloneable_object_handlers(zend_object_handlers *handlers); PHPAPI uint32_t php_random_range32(php_random_algo_with_state engine, uint32_t umax); PHPAPI uint64_t php_random_range64(php_random_algo_with_state engine, uint64_t umax); PHPAPI zend_long php_random_range(php_random_algo_with_state engine, zend_long min, zend_long max); diff --git a/ext/random/random.c b/ext/random/random.c index 46a6c4fd44f2c..c36d1f8af98d1 100644 --- a/ext/random/random.c +++ b/ext/random/random.c @@ -71,10 +71,9 @@ PHPAPI zend_class_entry *random_ce_Random_RandomError; PHPAPI zend_class_entry *random_ce_Random_BrokenRandomEngineError; PHPAPI zend_class_entry *random_ce_Random_RandomException; -static zend_object_handlers random_engine_mt19937_object_handlers; -static zend_object_handlers random_engine_pcgoneseq128xslrr64_object_handlers; -static zend_object_handlers random_engine_xoshiro256starstar_object_handlers; -static zend_object_handlers random_engine_secure_object_handlers; +static zend_object_handlers random_engine_cloneable_object_handlers; +static zend_object_handlers random_engine_non_cloneable_object_handlers; + static zend_object_handlers random_randomizer_object_handlers; PHPAPI 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 static zend_object *php_random_engine_mt19937_new(zend_class_entry *ce) { - return &php_random_engine_common_init(ce, &random_engine_mt19937_object_handlers, &php_random_algo_mt19937)->std; + return &php_random_engine_common_init(ce, &random_engine_cloneable_object_handlers, &php_random_algo_mt19937)->std; } static zend_object *php_random_engine_pcgoneseq128xslrr64_new(zend_class_entry *ce) { - return &php_random_engine_common_init(ce, &random_engine_pcgoneseq128xslrr64_object_handlers, &php_random_algo_pcgoneseq128xslrr64)->std; + return &php_random_engine_common_init(ce, &random_engine_cloneable_object_handlers, &php_random_algo_pcgoneseq128xslrr64)->std; } static zend_object *php_random_engine_xoshiro256starstar_new(zend_class_entry *ce) { - return &php_random_engine_common_init(ce, &random_engine_xoshiro256starstar_object_handlers, &php_random_algo_xoshiro256starstar)->std; + return &php_random_engine_common_init(ce, &random_engine_cloneable_object_handlers, &php_random_algo_xoshiro256starstar)->std; } static zend_object *php_random_engine_secure_new(zend_class_entry *ce) { - return &php_random_engine_common_init(ce, &random_engine_secure_object_handlers, &php_random_algo_secure)->std; + return &php_random_engine_common_init(ce, &random_engine_non_cloneable_object_handlers, &php_random_algo_secure)->std; } static 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) return &new_engine->std; } +PHPAPI void *php_random_engine_common_init_cloneable_object_handlers(zend_object_handlers *handlers) +{ + memcpy(handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); + handlers->offset = XtOffsetOf(php_random_engine, std); + handlers->free_obj = php_random_engine_common_free_object; + handlers->clone_obj = php_random_engine_common_clone_object; + + return handlers; +} + +PHPAPI void *php_random_engine_common_init_non_cloneable_object_handlers(zend_object_handlers *handlers) +{ + php_random_engine_common_init_cloneable_object_handlers(handlers); + handlers->clone_obj = NULL; + + return handlers; +} + /* {{{ php_random_range */ PHPAPI zend_long php_random_range(php_random_algo_with_state engine, zend_long min, zend_long max) { @@ -728,6 +745,9 @@ static PHP_GINIT_FUNCTION(random) /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(random) { + php_random_engine_common_init_cloneable_object_handlers(&random_engine_cloneable_object_handlers); + php_random_engine_common_init_non_cloneable_object_handlers(&random_engine_non_cloneable_object_handlers); + /* Random\Engine */ random_ce_Random_Engine = register_class_Random_Engine(); @@ -746,34 +766,18 @@ PHP_MINIT_FUNCTION(random) /* Random\Engine\Mt19937 */ random_ce_Random_Engine_Mt19937 = register_class_Random_Engine_Mt19937(random_ce_Random_Engine); random_ce_Random_Engine_Mt19937->create_object = php_random_engine_mt19937_new; - memcpy(&random_engine_mt19937_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); - random_engine_mt19937_object_handlers.offset = XtOffsetOf(php_random_engine, std); - random_engine_mt19937_object_handlers.free_obj = php_random_engine_common_free_object; - random_engine_mt19937_object_handlers.clone_obj = php_random_engine_common_clone_object; /* Random\Engine\PcgOnseq128XslRr64 */ random_ce_Random_Engine_PcgOneseq128XslRr64 = register_class_Random_Engine_PcgOneseq128XslRr64(random_ce_Random_Engine); random_ce_Random_Engine_PcgOneseq128XslRr64->create_object = php_random_engine_pcgoneseq128xslrr64_new; - memcpy(&random_engine_pcgoneseq128xslrr64_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); - random_engine_pcgoneseq128xslrr64_object_handlers.offset = XtOffsetOf(php_random_engine, std); - random_engine_pcgoneseq128xslrr64_object_handlers.free_obj = php_random_engine_common_free_object; - random_engine_pcgoneseq128xslrr64_object_handlers.clone_obj = php_random_engine_common_clone_object; /* Random\Engine\Xoshiro256StarStar */ random_ce_Random_Engine_Xoshiro256StarStar = register_class_Random_Engine_Xoshiro256StarStar(random_ce_Random_Engine); random_ce_Random_Engine_Xoshiro256StarStar->create_object = php_random_engine_xoshiro256starstar_new; - memcpy(&random_engine_xoshiro256starstar_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); - random_engine_xoshiro256starstar_object_handlers.offset = XtOffsetOf(php_random_engine, std); - random_engine_xoshiro256starstar_object_handlers.free_obj = php_random_engine_common_free_object; - random_engine_xoshiro256starstar_object_handlers.clone_obj = php_random_engine_common_clone_object; /* Random\Engine\Secure */ random_ce_Random_Engine_Secure = register_class_Random_Engine_Secure(random_ce_Random_CryptoSafeEngine); random_ce_Random_Engine_Secure->create_object = php_random_engine_secure_new; - memcpy(&random_engine_secure_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); - random_engine_secure_object_handlers.offset = XtOffsetOf(php_random_engine, std); - random_engine_secure_object_handlers.free_obj = php_random_engine_common_free_object; - random_engine_secure_object_handlers.clone_obj = NULL; /* Random\Randomizer */ random_ce_Random_Randomizer = register_class_Random_Randomizer();