37 randomizer->
engine = engine->engine;
50 generate_method = zend_hash_find_ptr(&engine_object->
ce->
function_table, mname);
51 zend_string_release(mname);
54 state->object = engine_object;
55 state->generate_method = generate_method;
74 if (param_engine !=
NULL) {
89 randomizer_common_init(randomizer,
Z_OBJ_P(&engine));
109 total_size += r.
size;
113 }
while (total_size <
sizeof(uint64_t));
119#if DBL_MANT_DIG != 53
120# error "Random_Randomizer::nextFloat(): Requires DBL_MANT_DIG == 53 to work."
122 const double step_size = 1.0 / (1ULL << 53);
142 int bounds_type =
'C' +
sizeof(
"ClosedOpen") - 1;
162 zval *case_name = zend_enum_fetch_case_name(bounds);
168 switch (bounds_type) {
169 case 'C' +
sizeof(
"ClosedOpen") - 1:
176 case 'C' +
sizeof(
"ClosedClosed") - 1:
183 case 'O' +
sizeof(
"OpenClosed") - 1:
190 case 'O' +
sizeof(
"OpenOpen") - 1:
199 zend_value_error(
"The given interval is empty, there are no floats between argument #1 ($min) and argument #2 ($max).");
282 size_t total_size = 0;
288 if (user_length < 1) {
293 size_t length = (size_t)user_length;
294 retval = zend_string_alloc(length, 0);
297 while (total_size + 8 <= length) {
298 result = engine.algo->generate(engine.state);
317#ifdef WORDS_BIGENDIAN
318 uint64_t swapped = ZEND_BYTES_SWAP64(
result.result);
326 while (total_size < length) {
327 result = engine.algo->generate(engine.state);
335 for (
size_t i = 0; i <
result.size; i++) {
338 if (total_size >= length) {
426 size_t total_size = 0;
433 const size_t source_length =
ZSTR_LEN(source);
434 const size_t max_offset = source_length - 1;
436 if (source_length < 1) {
441 if (user_length < 1) {
446 size_t length = (size_t)user_length;
447 retval = zend_string_alloc(length, 0);
449 if (max_offset > 0xff) {
450 while (total_size < length) {
451 uint64_t
offset = engine.algo->range(engine.state, 0, max_offset);
461 uint64_t mask = max_offset;
470 mask *= 0x0101010101010101;
473 while (total_size < length) {
480 uint64_t offsets =
result.result & mask;
481 for (
size_t i = 0; i <
result.size; i++) {
482 uint64_t
offset = offsets & 0xff;
485 if (
offset > max_offset) {
498 if (total_size >= length) {
538 if (zend_hash_num_elements(d) != 1) {
560 randomizer_common_init(randomizer,
Z_OBJ_P(zengine));
PHPAPI const php_random_algo php_random_algo_mt19937
PHPAPI const php_random_algo php_random_algo_user
PHPAPI double php_random_gammasection_closed_closed(php_random_algo_with_state engine, double min, double max)
PHPAPI double php_random_gammasection_open_closed(php_random_algo_with_state engine, double min, double max)
PHPAPI double php_random_gammasection_open_open(php_random_algo_with_state engine, double min, double max)
PHPAPI double php_random_gammasection_closed_open(php_random_algo_with_state engine, double min, double max)
PHPAPI zend_class_entry * random_ce_Random_Engine
#define Z_RANDOM_RANDOMIZER_P(zval)
PHPAPI zend_class_entry * random_ce_Random_Randomizer
PHPAPI void * php_random_status_alloc(const php_random_algo *algo, const bool persistent)
struct _php_random_algo_with_state php_random_algo_with_state
PHPAPI zend_class_entry * random_ce_Random_RandomException
struct _php_random_status_state_mt19937 php_random_status_state_mt19937
PHPAPI zend_class_entry * random_ce_Random_IntervalBoundary
struct _php_random_status_state_user php_random_status_state_user
struct _php_random_engine php_random_engine
PHPAPI zend_class_entry * random_ce_Random_Engine_Secure
#define PHP_RANDOM_RANGE_ATTEMPTS
struct _php_random_randomizer php_random_randomizer
PHPAPI zend_class_entry * random_ce_Random_BrokenRandomEngineError
struct _php_random_result php_random_result
PHPAPI bool php_binary_string_shuffle(php_random_algo_with_state engine, char *str, zend_long len)
PHPAPI bool php_array_data_shuffle(php_random_algo_with_state engine, zval *array)
PHPAPI bool php_array_pick_keys(php_random_algo_with_state engine, zval *input, zend_long num_req, zval *retval, bool silent)
php_random_algo_with_state engine
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
ZEND_API ZEND_COLD void zend_value_error(const char *format,...)
ZEND_API zend_result object_init_ex(zval *arg, zend_class_entry *class_type)
ZEND_API zval * zend_read_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, bool silent, zval *rv)
ZEND_API void zend_update_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zval *value)
ZEND_API ZEND_COLD void zend_argument_must_not_be_empty_error(uint32_t arg_num)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
ZEND_API void object_properties_load(zend_object *object, HashTable *properties)
#define ZEND_PARSE_PARAMETERS_END()
#define ZEND_PARSE_PARAMETERS_NONE()
#define Z_PARAM_STR(dest)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define Z_PARAM_LONG(dest)
#define Z_PARAM_ARRAY_HT(dest)
#define Z_PARAM_OBJ_OF_CLASS(dest, _ce)
#define Z_PARAM_DOUBLE(dest)
#define Z_PARAM_OBJECT_OF_CLASS_OR_NULL(dest, _ce)
#define Z_PARAM_ARRAY(dest)
#define RETVAL_STRINGL(s, l)
#define RETURN_STR_COPY(s)
#define ZEND_INTERNAL_CLASS
ZEND_API ZEND_COLD zend_object * zend_throw_exception(zend_class_entry *exception_ce, const char *message, zend_long code)
union _zend_function zend_function
ZEND_API zval *ZEND_FASTCALL zend_hash_next_index_insert(HashTable *ht, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h)
struct _zend_string zend_string
ZEND_API HashTable * zend_std_get_properties(zend_object *zobj)
#define ZEND_UNREACHABLE()
#define UNEXPECTED(condition)
struct _zend_object zend_object
#define ZSTR_INIT_LITERAL(s, persistent)
#define Z_STRVAL_P(zval_p)
#define Z_ARRVAL_P(zval_p)
struct _zend_array HashTable
#define Z_STRLEN_P(zval_p)
#define Z_OBJCE_P(zval_p)
#define ZVAL_COPY_VALUE(z, v)