diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 2fd9a8c86397e..487a2ac147e00 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -37,6 +37,8 @@ PHP 8.3 INTERNALS UPGRADE NOTES * The return types of the following functions have been changed from `bool` to `zend_result`: - zend_fiber_init_context() +* The fast_add_function() has been removed, use add_function() that will + call the static inline add_function_fast() instead. ======================== 2. Build system changes diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index acb7fb0c0a038..c90cca8a648fe 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -707,28 +707,6 @@ overflow: ZEND_ATTRIBUTE_COLD_LABEL #endif } -static zend_always_inline zend_result fast_add_function(zval *result, zval *op1, zval *op2) -{ - if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) { - if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) { - fast_long_add_function(result, op1, op2); - return SUCCESS; - } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) { - ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2)); - return SUCCESS; - } - } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) { - if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) { - ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2)); - return SUCCESS; - } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) { - ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2))); - return SUCCESS; - } - } - return add_function(result, op1, op2); -} - static zend_always_inline void fast_long_sub_function(zval *result, zval *op1, zval *op2) { #if ZEND_USE_ASM_ARITHMETIC && defined(__i386__) && !(4 == __GNUC__ && 8 == __GNUC_MINOR__) diff --git a/ext/standard/array.c b/ext/standard/array.c index 88d2335c0afb9..dc0d434d1883e 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -5915,65 +5915,70 @@ PHP_FUNCTION(array_rand) } /* }}} */ -/* {{{ Returns the sum of the array entries */ -PHP_FUNCTION(array_sum) +/* Wrapper for array_sum and array_product */ +static void php_array_binop(INTERNAL_FUNCTION_PARAMETERS, const char *op_name, binary_op_type op, zend_long initial) { - zval *input, - *entry, - entry_n; + HashTable *input; + zval *entry; ZEND_PARSE_PARAMETERS_START(1, 1) - Z_PARAM_ARRAY(input) + Z_PARAM_ARRAY_HT(input) ZEND_PARSE_PARAMETERS_END(); - ZVAL_LONG(return_value, 0); + if (zend_hash_num_elements(input) == 0) { + RETURN_LONG(initial); + } + + ZVAL_LONG(return_value, initial); + ZEND_HASH_FOREACH_VAL(input, entry) { + /* For objects we try to cast them to a numeric type */ + if (Z_TYPE_P(entry) == IS_OBJECT) { + zval dst; + zend_result status = Z_OBJ_HT_P(entry)->cast_object(Z_OBJ_P(entry), &dst, _IS_NUMBER); - ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(input), entry) { - if (Z_TYPE_P(entry) == IS_ARRAY || Z_TYPE_P(entry) == IS_OBJECT) { + /* Do not type error for BC */ + if (status == FAILURE || (Z_TYPE(dst) != IS_LONG && Z_TYPE(dst) != IS_DOUBLE)) { + php_error_docref(NULL, E_WARNING, "%s is not supported on type %s", + op_name, zend_zval_type_name(entry)); + continue; + } + op(return_value, return_value, &dst); continue; } - ZVAL_COPY(&entry_n, entry); - convert_scalar_to_number(&entry_n); - fast_add_function(return_value, return_value, &entry_n); + + zend_result status = op(return_value, return_value, entry); + if (status == FAILURE) { + ZEND_ASSERT(EG(exception)); + zend_clear_exception(); + /* BC resources: previously resources were cast to int */ + if (Z_TYPE_P(entry) == IS_RESOURCE) { + zval tmp; + ZVAL_LONG(&tmp, Z_RES_HANDLE_P(entry)); + op(return_value, return_value, &tmp); + } + /* BC non numeric strings: previously were cast to 0 */ + else if (Z_TYPE_P(entry) == IS_STRING) { + zval tmp; + ZVAL_LONG(&tmp, 0); + op(return_value, return_value, &tmp); + } + php_error_docref(NULL, E_WARNING, "%s is not supported on type %s", + op_name, zend_zval_type_name(entry)); + } } ZEND_HASH_FOREACH_END(); } + +/* {{{ Returns the sum of the array entries */ +PHP_FUNCTION(array_sum) +{ + php_array_binop(INTERNAL_FUNCTION_PARAM_PASSTHRU, "Addition", add_function, 0); +} /* }}} */ /* {{{ Returns the product of the array entries */ PHP_FUNCTION(array_product) { - zval *input, - *entry, - entry_n; - double dval; - - ZEND_PARSE_PARAMETERS_START(1, 1) - Z_PARAM_ARRAY(input) - ZEND_PARSE_PARAMETERS_END(); - - ZVAL_LONG(return_value, 1); - if (!zend_hash_num_elements(Z_ARRVAL_P(input))) { - return; - } - - ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(input), entry) { - if (Z_TYPE_P(entry) == IS_ARRAY || Z_TYPE_P(entry) == IS_OBJECT) { - continue; - } - ZVAL_COPY(&entry_n, entry); - convert_scalar_to_number(&entry_n); - - if (Z_TYPE(entry_n) == IS_LONG && Z_TYPE_P(return_value) == IS_LONG) { - dval = (double)Z_LVAL_P(return_value) * (double)Z_LVAL(entry_n); - if ( (double)ZEND_LONG_MIN <= dval && dval <= (double)ZEND_LONG_MAX ) { - Z_LVAL_P(return_value) *= Z_LVAL(entry_n); - continue; - } - } - convert_to_double(return_value); - convert_to_double(&entry_n); - Z_DVAL_P(return_value) *= Z_DVAL(entry_n); - } ZEND_HASH_FOREACH_END(); + php_array_binop(INTERNAL_FUNCTION_PARAM_PASSTHRU, "Multiplication", mul_function, 1); } /* }}} */ diff --git a/ext/standard/tests/array/003.phpt b/ext/standard/tests/array/003.phpt index 2cea8034bb10c..27d9cad4eb3b7 100644 --- a/ext/standard/tests/array/003.phpt +++ b/ext/standard/tests/array/003.phpt @@ -8,27 +8,27 @@ require(__DIR__ . '/data.inc'); function cmp ($a, $b) { is_array ($a) - and $a = array_sum ($a); + and $a = count($a); is_array ($b) - and $b = array_sum ($b); + and $b = count($b); return strcmp ($a, $b); } -echo " -- Testing uasort() -- \n"; +echo "-- Testing uasort() --\n"; uasort ($data, 'cmp'); var_dump ($data); -echo "\n -- Testing uksort() -- \n"; +echo "\n-- Testing uksort() --\n"; uksort ($data, 'cmp'); var_dump ($data); -echo "\n -- Testing usort() -- \n"; +echo "\n-- Testing usort() --\n"; usort ($data, 'cmp'); var_dump ($data); ?> --EXPECT-- --- Testing uasort() -- +-- Testing uasort() -- array(8) { [16777216]=> float(-0.3333333333333333) @@ -53,7 +53,7 @@ array(8) { string(4) "test" } - -- Testing uksort() -- +-- Testing uksort() -- array(8) { [-1000]=> array(2) { @@ -78,7 +78,7 @@ array(8) { int(27) } - -- Testing usort() -- +-- Testing usort() -- array(8) { [0]=> float(-0.3333333333333333) diff --git a/ext/standard/tests/array/array_product_empty_array.phpt b/ext/standard/tests/array/array_product_empty_array.phpt new file mode 100644 index 0000000000000..714030d15103a --- /dev/null +++ b/ext/standard/tests/array/array_product_empty_array.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test array_product() function with empty array +--FILE-- + $carry * $value, 1)); +?> +--EXPECT-- +array_product() version: +int(1) +array_reduce() version: +int(1) diff --git a/ext/standard/tests/array/array_product_objects_operation_no_cast.phpt b/ext/standard/tests/array/array_product_objects_operation_no_cast.phpt new file mode 100644 index 0000000000000..7f4af3759f03e --- /dev/null +++ b/ext/standard/tests/array/array_product_objects_operation_no_cast.phpt @@ -0,0 +1,28 @@ +--TEST-- +Test array_product() function with objects that implement addition but not castable to numeric type +--EXTENSIONS-- +zend_test +--FILE-- + $carry * $value, 1)); +?> +--EXPECTF-- +array_product() version: + +Warning: array_product(): Multiplication is not supported on type DoOperationNoCast in %s on line %d + +Warning: array_product(): Multiplication is not supported on type DoOperationNoCast in %s on line %d + +Warning: array_product(): Multiplication is not supported on type DoOperationNoCast in %s on line %d +int(1) +array_reduce() version: +object(DoOperationNoCast)#5 (1) { + ["val":"DoOperationNoCast":private]=> + int(1500) +} diff --git a/ext/standard/tests/array/array_product_variation1.phpt b/ext/standard/tests/array/array_product_variation1.phpt index c27d872a85f36..330479f4ef8bf 100644 --- a/ext/standard/tests/array/array_product_variation1.phpt +++ b/ext/standard/tests/array/array_product_variation1.phpt @@ -7,20 +7,18 @@ echo "*** Testing array_product() : variation - using non numeric values ***\n"; class A { static function help() { echo "hello\n"; } } -$fp = fopen(__FILE__, "r"); $types = array("boolean (true)" => true, "boolean (false)" => false, "string" => "hello", "numeric string" => "12", - "resource" => $fp, "object" => new A(), "null" => null, + "resource" => STDERR, "object" => new A(), "null" => null, "array" => array(3,2)); foreach ($types as $desc => $type) { - echo $desc . "\n"; - var_dump(array_product(array($type))); + echo $desc, "\n"; + var_dump(array_product([1, $type])); echo "\n"; } -fclose($fp); ?> --EXPECTF-- *** Testing array_product() : variation - using non numeric values *** @@ -31,20 +29,28 @@ boolean (false) int(0) string + +Warning: array_product(): Multiplication is not supported on type string in %s on line %d int(0) numeric string int(12) resource -int(%d) + +Warning: array_product(): Multiplication is not supported on type resource in %s on line %d +int(3) object + +Warning: array_product(): Multiplication is not supported on type A in %s on line %d int(1) null int(0) array + +Warning: array_product(): Multiplication is not supported on type array in %s on line %d int(1) diff --git a/ext/standard/tests/array/array_product_variation5.phpt b/ext/standard/tests/array/array_product_variation5.phpt new file mode 100644 index 0000000000000..525b6a52bd14a --- /dev/null +++ b/ext/standard/tests/array/array_product_variation5.phpt @@ -0,0 +1,23 @@ +--TEST-- +Test array_product() function: resources in array +--FILE-- + $carry * $value, 1)); +} catch (TypeError $e) { + echo $e->getMessage(); +} +?> +--EXPECTF-- +array_product() version: + +Warning: array_product(): Multiplication is not supported on type resource in %s on line %d +int(30) +array_reduce() version: +Unsupported operand types: int * resource diff --git a/ext/standard/tests/array/array_product_variation6.phpt b/ext/standard/tests/array/array_product_variation6.phpt new file mode 100644 index 0000000000000..6526197ce52ec --- /dev/null +++ b/ext/standard/tests/array/array_product_variation6.phpt @@ -0,0 +1,22 @@ +--TEST-- +Test array_product() function with objects castable to numeric type +--EXTENSIONS-- +gmp +--FILE-- + $carry * $value, 1)); +?> +--EXPECT-- +array_product() version: +int(150) +array_reduce() version: +object(GMP)#5 (1) { + ["num"]=> + string(3) "150" +} diff --git a/ext/standard/tests/array/array_sum_empty_array.phpt b/ext/standard/tests/array/array_sum_empty_array.phpt new file mode 100644 index 0000000000000..17c80ce43472d --- /dev/null +++ b/ext/standard/tests/array/array_sum_empty_array.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test array_sum() function with empty array +--FILE-- + $carry + $value, 0)); +?> +--EXPECT-- +array_sum() version: +int(0) +array_reduce() version: +int(0) diff --git a/ext/standard/tests/array/array_sum_objects_operation_no_cast.phpt b/ext/standard/tests/array/array_sum_objects_operation_no_cast.phpt new file mode 100644 index 0000000000000..d89b44ae0b6b7 --- /dev/null +++ b/ext/standard/tests/array/array_sum_objects_operation_no_cast.phpt @@ -0,0 +1,26 @@ +--TEST-- +Test array_sum() function with objects that implement addition but not castable to numeric type +--EXTENSIONS-- +zend_test +--FILE-- + $carry + $value, 0)); +?> +--EXPECTF-- +array_sum() version: + +Warning: array_sum(): Addition is not supported on type DoOperationNoCast in %s on line %d + +Warning: array_sum(): Addition is not supported on type DoOperationNoCast in %s on line %d +int(0) +array_reduce() version: +object(DoOperationNoCast)#5 (1) { + ["val":"DoOperationNoCast":private]=> + int(31) +} diff --git a/ext/standard/tests/array/array_sum_objects_operation_no_cast_FFI.phpt b/ext/standard/tests/array/array_sum_objects_operation_no_cast_FFI.phpt new file mode 100644 index 0000000000000..a19e34f0b170a --- /dev/null +++ b/ext/standard/tests/array/array_sum_objects_operation_no_cast_FFI.phpt @@ -0,0 +1,29 @@ +--TEST-- +Test array_sum() function with objects that implement addition but not castable to numeric type +--EXTENSIONS-- +ffi +--FILE-- + $carry + $value, 0)); +?> +--EXPECTF-- +array_sum() version: + +Warning: array_sum(): Addition is not supported on type FFI\CData in %s on line %d +int(1) +array_reduce() version: +object(FFI\CData:int32_t*)#4 (1) { + [0]=> + int(25) +} diff --git a/ext/standard/tests/array/array_sum_variation7.phpt b/ext/standard/tests/array/array_sum_variation7.phpt index 9e716485f4e91..181a172e3087a 100644 --- a/ext/standard/tests/array/array_sum_variation7.phpt +++ b/ext/standard/tests/array/array_sum_variation7.phpt @@ -9,11 +9,6 @@ Test array_sum() function : usage variations - 'input' array with unexpected val echo "*** Testing array_sum() : array with unexpected entries ***\n"; -// empty array -$input = array(); -echo "-- empty array --\n"; -var_dump( array_sum($input) ); - // string array $input = array('Apple', 'Banana', 'Carrot', 'Mango', 'Orange'); echo "-- array with string values --\n"; @@ -62,20 +57,48 @@ echo "-- array with mixed values --\n"; var_dump( array_sum($input) ); echo "Done" ?> ---EXPECT-- +--EXPECTF-- *** Testing array_sum() : array with unexpected entries *** --- empty array -- -int(0) -- array with string values -- + +Warning: array_sum(): Addition is not supported on type string in %s on line %d + +Warning: array_sum(): Addition is not supported on type string in %s on line %d + +Warning: array_sum(): Addition is not supported on type string in %s on line %d + +Warning: array_sum(): Addition is not supported on type string in %s on line %d + +Warning: array_sum(): Addition is not supported on type string in %s on line %d int(0) -- array with bool values -- int(3) -- array with null values -- int(0) -- array with subarrays -- + +Warning: array_sum(): Addition is not supported on type array in %s on line %d + +Warning: array_sum(): Addition is not supported on type array in %s on line %d + +Warning: array_sum(): Addition is not supported on type array in %s on line %d int(0) -- array with object values -- + +Warning: array_sum(): Addition is not supported on type MyClass in %s on line %d + +Warning: array_sum(): Addition is not supported on type MyClass in %s on line %d + +Warning: array_sum(): Addition is not supported on type MyClass in %s on line %d + +Warning: array_sum(): Addition is not supported on type MyClass in %s on line %d int(0) -- array with mixed values -- + +Warning: array_sum(): Addition is not supported on type string in %s on line %d + +Warning: array_sum(): Addition is not supported on type string in %s on line %d + +Warning: array_sum(): Addition is not supported on type array in %s on line %d float(14) Done diff --git a/ext/standard/tests/array/array_sum_variation8.phpt b/ext/standard/tests/array/array_sum_variation8.phpt new file mode 100644 index 0000000000000..017b1b8b44b1d --- /dev/null +++ b/ext/standard/tests/array/array_sum_variation8.phpt @@ -0,0 +1,23 @@ +--TEST-- +Test array_sum() function: resources in array +--FILE-- + $carry + $value, 0)); +} catch (TypeError $e) { + echo $e->getMessage(); +} +?> +--EXPECTF-- +array_sum() version: + +Warning: array_sum(): Addition is not supported on type resource in %s on line %d +int(13) +array_reduce() version: +Unsupported operand types: int + resource diff --git a/ext/standard/tests/array/array_sum_variation9.phpt b/ext/standard/tests/array/array_sum_variation9.phpt new file mode 100644 index 0000000000000..61af56b2a5f81 --- /dev/null +++ b/ext/standard/tests/array/array_sum_variation9.phpt @@ -0,0 +1,22 @@ +--TEST-- +Test array_sum() function with objects castable to numeric type +--EXTENSIONS-- +gmp +--FILE-- + $carry + $value, 0)); +?> +--EXPECT-- +array_sum() version: +int(31) +array_reduce() version: +object(GMP)#5 (1) { + ["num"]=> + string(2) "31" +} diff --git a/ext/standard/tests/array/bug35014.phpt b/ext/standard/tests/array/bug35014.phpt index f1f407081f52d..3935657f7a796 100644 --- a/ext/standard/tests/array/bug35014.phpt +++ b/ext/standard/tests/array/bug35014.phpt @@ -5,7 +5,6 @@ Bug #35014 (array_product() always returns 0) (32bit) --FILE-- --EXPECT-- -int(1) int(0) int(3) int(9) diff --git a/ext/standard/tests/array/bug35014_64bit.phpt b/ext/standard/tests/array/bug35014_64bit.phpt index 40d656d83509e..29fa9e187ac73 100644 --- a/ext/standard/tests/array/bug35014_64bit.phpt +++ b/ext/standard/tests/array/bug35014_64bit.phpt @@ -7,7 +7,6 @@ precision=14 --FILE-- --EXPECT-- -int(1) int(0) int(3) int(9) diff --git a/ext/standard/tests/array/bug48484.phpt b/ext/standard/tests/array/bug48484.phpt deleted file mode 100644 index 5688c0cad8beb..0000000000000 --- a/ext/standard/tests/array/bug48484.phpt +++ /dev/null @@ -1,8 +0,0 @@ ---TEST-- -Bug 48484 (array_product() always returns 0 for an empty array) ---FILE-- - ---EXPECT-- -int(1) diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index 7c7b1d3c6500f..66d9bffe57ccb 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -717,6 +717,110 @@ static ZEND_METHOD(ZendTestForbidDynamicCall, callStatic) zend_forbid_dynamic_call(); } +/* donc refers to DoOperationNoCast */ +static zend_class_entry *donc_ce; +static zend_object_handlers donc_object_handlers; + +static zend_object* donc_object_create_ex(zend_class_entry* ce, zend_long l) { + zend_object *obj = zend_objects_new(ce); + object_properties_init(obj, ce); + obj->handlers = &donc_object_handlers; + ZVAL_LONG(OBJ_PROP_NUM(obj, 0), l); + return obj; +} +static zend_object *donc_object_create(zend_class_entry *ce) /* {{{ */ +{ + return donc_object_create_ex(ce, 0); +} +/* }}} */ + +static inline void donc_create(zval *target, zend_long l) /* {{{ */ +{ + ZVAL_OBJ(target, donc_object_create_ex(donc_ce, l)); +} + +#define IS_DONC(zval) \ + (Z_TYPE_P(zval) == IS_OBJECT && instanceof_function(Z_OBJCE_P(zval), donc_ce)) + +static void donc_add(zval *result, zval *op1, zval *op2) +{ + zend_long val_1; + zend_long val_2; + if (IS_DONC(op1)) { + val_1 = Z_LVAL_P(OBJ_PROP_NUM(Z_OBJ_P(op1), 0)); + } else { + val_1 = zval_get_long(op1); + } + if (IS_DONC(op2)) { + val_2 = Z_LVAL_P(OBJ_PROP_NUM(Z_OBJ_P(op2), 0)); + } else { + val_2 = zval_get_long(op2); + } + + donc_create(result, val_1 + val_2); +} +static void donc_mul(zval *result, zval *op1, zval *op2) +{ + zend_long val_1; + zend_long val_2; + if (IS_DONC(op1)) { + val_1 = Z_LVAL_P(OBJ_PROP_NUM(Z_OBJ_P(op1), 0)); + } else { + val_1 = zval_get_long(op1); + } + if (IS_DONC(op2)) { + val_2 = Z_LVAL_P(OBJ_PROP_NUM(Z_OBJ_P(op2), 0)); + } else { + val_2 = zval_get_long(op2); + } + + donc_create(result, val_1 * val_2); +} + +static zend_result donc_do_operation(zend_uchar opcode, zval *result, zval *op1, zval *op2) +{ + zval op1_copy; + zend_result status; + + if (result == op1) { + ZVAL_COPY_VALUE(&op1_copy, op1); + op1 = &op1_copy; + } + + switch (opcode) { + case ZEND_ADD: + donc_add(result, op1, op2); + if (UNEXPECTED(EG(exception))) { status = FAILURE; } + status = SUCCESS; + break; + case ZEND_MUL: + donc_mul(result, op1, op2); + if (UNEXPECTED(EG(exception))) { status = FAILURE; } + status = SUCCESS; + break; + default: + status = FAILURE; + break; + } + + if (status == SUCCESS && op1 == &op1_copy) { + zval_ptr_dtor(op1); + } + + return status; +} + +PHP_METHOD(DoOperationNoCast, __construct) +{ + zend_long l; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(l) + ZEND_PARSE_PARAMETERS_END(); + + ZVAL_LONG(OBJ_PROP_NUM(Z_OBJ_P(ZEND_THIS), 0), l); +} + PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("zend_test.replace_zend_execute_ex", "0", PHP_INI_SYSTEM, OnUpdateBool, replace_zend_execute_ex, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_BOOLEAN("zend_test.register_passes", "0", PHP_INI_SYSTEM, OnUpdateBool, register_passes, zend_zend_test_globals, zend_test_globals) @@ -778,6 +882,12 @@ PHP_MINIT_FUNCTION(zend_test) zend_test_string_enum = register_class_ZendTestStringEnum(); zend_test_int_enum = register_class_ZendTestIntEnum(); + /* DoOperationNoCast class */ + donc_ce = register_class_DoOperationNoCast(); + donc_ce->create_object = donc_object_create; + memcpy(&donc_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); + donc_object_handlers.do_operation = donc_do_operation; + zend_register_functions(NULL, ext_function_legacy, NULL, EG(current_module)->type); // Loading via dl() not supported with the observer API diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php index 9058db36d75fd..83b1e4de334e3 100644 --- a/ext/zend_test/test.stub.php +++ b/ext/zend_test/test.stub.php @@ -117,6 +117,11 @@ enum ZendTestIntEnum: int { case Baz = -1; } + final class DoOperationNoCast { + private int $val; + public function __construct(int $val) {} + } + function zend_test_array_return(): array {} function zend_test_nullable_array_return(): null|array {} diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index 4d0ff2a4e810c..800db7ee9783a 100644 --- a/ext/zend_test/test_arginfo.h +++ b/ext/zend_test/test_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 3e2308593cea5289709dcfb1c9ee598de945d2e2 */ + * Stub hash: 947056bfe52d586b8a4969e3022f84e83b677e0e */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -160,6 +160,10 @@ ZEND_END_ARG_INFO() #define arginfo_class_ZendTestForbidDynamicCall_callStatic arginfo_zend_test_void_return +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_DoOperationNoCast___construct, 0, 0, 1) + ZEND_ARG_TYPE_INFO(0, val, IS_LONG, 0) +ZEND_END_ARG_INFO() + #if (PHP_VERSION_ID >= 80100) ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_ZendTestNS_Foo_method, 0, 0, IS_LONG, 0) #else @@ -223,6 +227,7 @@ static ZEND_METHOD(ZendTestClassWithMethodWithParameterAttribute, override); static ZEND_METHOD(ZendTestChildClassWithMethodWithParameterAttribute, override); static ZEND_METHOD(ZendTestForbidDynamicCall, call); static ZEND_METHOD(ZendTestForbidDynamicCall, callStatic); +static ZEND_METHOD(DoOperationNoCast, __construct); static ZEND_METHOD(ZendTestNS_Foo, method); static ZEND_METHOD(ZendTestNS_UnlikelyCompileError, method); static ZEND_METHOD(ZendTestNS2_Foo, method); @@ -353,6 +358,12 @@ static const zend_function_entry class_ZendTestIntEnum_methods[] = { }; +static const zend_function_entry class_DoOperationNoCast_methods[] = { + ZEND_ME(DoOperationNoCast, __construct, arginfo_class_DoOperationNoCast___construct, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + + static const zend_function_entry class_ZendTestNS_Foo_methods[] = { ZEND_ME(ZendTestNS_Foo, method, arginfo_class_ZendTestNS_Foo_method, ZEND_ACC_PUBLIC) ZEND_FE_END @@ -695,6 +706,23 @@ static zend_class_entry *register_class_ZendTestIntEnum(void) } #endif +static zend_class_entry *register_class_DoOperationNoCast(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "DoOperationNoCast", class_DoOperationNoCast_methods); + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL; + + zval property_val_default_value; + ZVAL_UNDEF(&property_val_default_value); + zend_string *property_val_name = zend_string_init("val", sizeof("val") - 1, 1); + zend_declare_typed_property(class_entry, property_val_name, &property_val_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)); + zend_string_release(property_val_name); + + return class_entry; +} + static zend_class_entry *register_class_ZendTestNS_Foo(void) { zend_class_entry ce, *class_entry; diff --git a/ext/zend_test/tests/do_operation_not_cast.phpt b/ext/zend_test/tests/do_operation_not_cast.phpt new file mode 100644 index 0000000000000..fbab03c01a841 --- /dev/null +++ b/ext/zend_test/tests/do_operation_not_cast.phpt @@ -0,0 +1,23 @@ +--TEST-- +Test DoOperationNotCast dummy class +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECT-- +object(DoOperationNoCast)#3 (1) { + ["val":"DoOperationNoCast":private]=> + int(31) +} +object(DoOperationNoCast)#3 (1) { + ["val":"DoOperationNoCast":private]=> + int(150) +}