imagick icon indicating copy to clipboard operation
imagick copied to clipboard

Fixed compatibility with PHP 8.2+

Open mikhainin opened this issue 1 year ago • 4 comments

It looks like 8.2 does not accept "tentative" void type

mikhainin avatar Nov 13 '23 13:11 mikhainin

When PHP8.2 built with --enable-debug --enable-debug-assertions, the test ./tests/292_index_iterator.phpt fails with:

php: /build/php.git/Zend/zend_execute_API.c:974: zend_call_function: Assertion `!(call->func->common.fn_flags & (1 << 13)) || zend_verify_internal_return_type(call->func, fci->retval)' failed.
(gdb) bt
#0  0x00007fe217a3dacf in raise () from /lib64/libc.so.6
#1  0x00007fe217a10ea5 in abort () from /lib64/libc.so.6
#2  0x00007fe217a10d79 in __assert_fail_base.cold.0 () from /lib64/libc.so.6
#3  0x00007fe217a36426 in __assert_fail () from /lib64/libc.so.6
#4  0x00000000008651e9 in zend_call_function (fci=0x7ffe14fcc770, fci_cache=0x7ffe14fcc750) at /build/php.git/Zend/zend_execute_API.c:973
#5  0x0000000000865502 in zend_call_known_function (fn=0x1a63070, object=0x1ac0308, called_scope=0x1a433e0, retval_ptr=0x0, param_count=0, params=0x0, named_params=0x0)
    at /build/php.git/Zend/zend_execute_API.c:1044
#6  0x000000000093d802 in zend_call_known_instance_method (fn=0x1a63070, object=0x1ac0308, retval_ptr=0x0, param_count=0, params=0x0) at /build/php.git/Zend/zend_API.h:753
#7  0x000000000093d83c in zend_call_known_instance_method_with_0_params (fn=0x1a63070, object=0x1ac0308, retval_ptr=0x0) at /build/php.git/Zend/zend_API.h:759
#8  0x000000000093e397 in zend_user_it_rewind (_iter=0x1b078c0) at /build/php.git/Zend/zend_interfaces.c:180
#9  0x00000000008bb00e in zend_fe_reset_iterator (array_ptr=0x7fe21a863090, by_ref=0) at /build/php.git/Zend/zend_execute.c:4843
#10 0x000000000091438f in ZEND_FE_RESET_R_SPEC_CV_HANDLER () at /build/php.git/Zend/zend_vm_execute.h:39090
#11 0x00000000009368f6 in execute_ex (ex=0x7fe21a863030) at /build/php.git/Zend/zend_vm_execute.h:59428
#12 0x00000000009378b7 in zend_execute (op_array=0x1ac0cb0, return_value=0x0) at /build/php.git/Zend/zend_vm_execute.h:60425
#13 0x000000000087f113 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /build/php.git/Zend/zend.c:2029
#14 0x00000000007d7ac8 in php_execute_script (primary_file=0x7ffe14fce0f0) at /build/php.git/main/main.c:2557
#15 0x00000000009f0997 in do_cli (argc=82, argv=0x19021c0) at /build/php.git/sapi/cli/php_cli.c:964
#16 0x00000000009f1640 in main (argc=82, argv=0x19021c0) at /build/php.git/sapi/cli/php_cli.c:1337
(gdb) f 6
#6  0x000000000093d802 in zend_call_known_instance_method (fn=0x1a63070, object=0x1ac0308, retval_ptr=0x0, param_count=0, params=0x0) at /build/php.git/Zend/zend_API.h:753
753	/build/php.git/Zend/zend_API.h: No such file or directory.
(gdb) p fn
$1 = (zend_function *) 0x1a63070
(gdb) p *fn
$2 = {type = 1 '\001', quick_arg_flags = 1, common = {type = 1 '\001', arg_flags = "\000\000", fn_flags = 8193, function_name = 0x197d0d0, scope = 0x1a433e0, prototype = 0x1997220, num_args = 0, 
    required_num_args = 0, arg_info = 0x1a63120, attributes = 0x0, T = 0, run_time_cache__ptr = 0x4471}, op_array = {type = 1 '\001', arg_flags = "\000\000", fn_flags = 8193, function_name = 0x197d0d0, 
    scope = 0x1a433e0, prototype = 0x1997220, num_args = 0, required_num_args = 0, arg_info = 0x1a63120, attributes = 0x0, T = 0, run_time_cache__ptr = 0x4471, cache_size = 389504679, last_var = 32738, 
    last = 391866336, opcodes = 0x0, static_variables_ptr__ptr = 0x0, static_variables = 0x0, vars = 0x0, refcount = 0x0, last_live_range = 0, last_try_catch = 0, live_range = 0x31, try_catch_array = 0x0, 
    filename = 0x0, line_start = 536887296, line_end = 0, doc_comment = 0x0, last_literal = 0, num_dynamic_func_defs = 0, literals = 0x91, dynamic_func_defs = 0x200100000001, reserved = {0x1997130, 0x1a433e0, 
      0x1997160, 0x0, 0x1a631e0, 0x0}}, internal_function = {type = 1 '\001', arg_flags = "\000\000", fn_flags = 8193, function_name = 0x197d0d0, scope = 0x1a433e0, prototype = 0x1997220, num_args = 0, 
    required_num_args = 0, arg_info = 0x1a63120, attributes = 0x0, T = 0, run_time_cache__ptr = 0x4471, handler = 0x7fe217375ea7 <zim_Imagick_setFirstIterator>, module = 0x7fe2175b67e0 <imagick_module_entry>, 
    reserved = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}}

It looks like the "tentative" return type doesn't work in this case. I thought, that it would be easier just to define the method that corresponds the interface

mikhainin avatar Nov 13 '23 13:11 mikhainin

It may be worth adding 8.2 and 8.3 in the test runner...

mikhainin avatar Nov 13 '23 13:11 mikhainin

@mikhainin have you tried PR #616 ?

remicollet avatar Nov 23 '23 09:11 remicollet

Actually, no. I'm afraid I didn't see that one

mikhainin avatar Nov 23 '23 10:11 mikhainin

I think this is not needed after merging #616 ?

I will add PHP 8.2 to the test runner.

Danack avatar Jul 01 '24 17:07 Danack