Skip to content

Commit 70ef769

Browse files
committed
ext-random: use unified object handlers
1 parent d9eb378 commit 70ef769

File tree

2 files changed

+30
-24
lines changed

2 files changed

+30
-24
lines changed

ext/random/php_random.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ PHPAPI void php_random_status_free(void *status, const bool persistent);
154154
PHPAPI php_random_engine *php_random_engine_common_init(zend_class_entry *ce, zend_object_handlers *handlers, const php_random_algo *algo);
155155
PHPAPI void php_random_engine_common_free_object(zend_object *object);
156156
PHPAPI zend_object *php_random_engine_common_clone_object(zend_object *object);
157+
PHPAPI void *php_random_engine_common_init_cloneable_object_handlers(zend_object_handlers *handlers);
158+
PHPAPI void *php_random_engine_common_init_non_cloneable_object_handlers(zend_object_handlers *handlers);
157159
PHPAPI uint32_t php_random_range32(php_random_algo_with_state engine, uint32_t umax);
158160
PHPAPI uint64_t php_random_range64(php_random_algo_with_state engine, uint64_t umax);
159161
PHPAPI zend_long php_random_range(php_random_algo_with_state engine, zend_long min, zend_long max);

ext/random/random.c

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,9 @@ PHPAPI zend_class_entry *random_ce_Random_RandomError;
7171
PHPAPI zend_class_entry *random_ce_Random_BrokenRandomEngineError;
7272
PHPAPI 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+
7877
static zend_object_handlers random_randomizer_object_handlers;
7978

8079
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
197196

198197
static 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

203202
static 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

208207
static 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

213212
static 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

218217
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)
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 */
293310
PHPAPI 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 */
729746
PHP_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

Comments
 (0)