summaryrefslogtreecommitdiff
path: root/UPGRADING.INTERNALS
diff options
context:
space:
mode:
Diffstat (limited to 'UPGRADING.INTERNALS')
-rw-r--r--UPGRADING.INTERNALS508
1 files changed, 66 insertions, 442 deletions
diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS
index c15cbef3b1..d22c88fcf3 100644
--- a/UPGRADING.INTERNALS
+++ b/UPGRADING.INTERNALS
@@ -1,461 +1,85 @@
-PHP 8.0 INTERNALS UPGRADE NOTES
+PHP 8.1 INTERNALS UPGRADE NOTES
1. Internal API changes
- a. Object Handlers API
- b. ZEND_OVERLOADED_FUNCTION and corresponding call_method() object handler
- c. TSRM changes
- d. get() and set() object handlers
- e. zend_parse_parameters 'L' specifier
- f. Arginfo argument types
- g. zend_free_op type and should_free argument of zend_get_zval_ptr()
- h. zend_value_error()
- i. get_closure() object handler
- j. compare_objects() and compare() object handlers
- k. The 'I' length modifier
- l. Some VM instructions switched to IS_TMP_VAR result instead of IS_VAR
- m. All internal functions must have arginfo
- n. zend_hash_sort compare function and zend_hash_sort signature change
- o. cast_object() object handler is now required
- p. ARG_COUNT() macro removed
- q. GC_COLLECTABLE flag
- r. Cannot implement Traversable only
- s. zend_fcall_info no_separation flag removed
- t. Signature changes
- u. Error Notification callbacks to replace zend_error_cb overwrite use-cases
- v. Removed Zend APIs
- w. Renamed Zend APIs
- x. ZEND_EXT_NOP no longer emitted
+ a. Removed Zend APIs
+ b. Zend Stream API
2. Build system changes
- a. Abstract
- b. Unix build system changes
- c. Windows build system changes
3. Module changes
+ a. ext/hash
========================
1. Internal API changes
========================
-
- a. The Object Handlers API was changed to receive zend_object* instead of
- zval* and zend_string* instead of zval* for property names. See also
- section t for other similar changes.
-
- b. ZEND_OVERLOADED_FUNCTION and corresponding call_method() object handler
- were removed. ZEND_INTERNAL_FUNCTION with ZEND_ACC_CALL_VIA_HANDLER and
- defined "handler" callback should be used instead. This "handler" callback
- should also take care about function cleanup. See ext/zend_test/test.c
- for example.
-
- c. The following things have been removed from TSRM:
- - TSRMLS_DC
- - TSRMLS_D
- - TSRMLS_CC
- - TSRMLS_C
- - TSRMLS_FETCH
- - TSRMLS_FETCH_FROM_CTX
- - TSRMLS_SET_CTX
- - tsrm_new_interpreter_context
- - tsrm_set_interpreter_context
- - tsrm_free_interpreter_context
- - support for GNUPTH, SGI ST, and BETHREADS
-
- d. The get() and set() object handlers have been removed. The get() handler
- can generally be replaced with cast_object(). Some uses of set() may be
- replaced by do_operation(). If set() was used to overload direct
- assignments using "=", then this is no longer supported and the
- functionality should be provided in some other way (for example, as
- modification of an object property).
-
- e. The zend_parse_parameters 'L' specifier and the Z_PARAM_STRICT_LONG()
- family of macros have been removed. Use 'l' and Z_PARAM_LONG() instead,
- which, despite the confusing name, actually have stricter input validation.
-
- f. Arginfo argument types for internal functions are no longer checked.
- Instead type checks should be performed using the zend_parse_parameters()
- or ZEND_PARSE_PARAMETERS_*() APIs.
-
- g. The zend_free_op type and the "should_free" and "type" arguments of
- zend_get_zval_ptr() were removed. It's possible to get the old
- "should_free" value using the following code:
-
- zval *ret = zend_get_zval_ptr(
- opline, opline->op1_type, &opline->op1, execute_data);
- zval *should_free = (op_type & (IS_TMP_VAR|IS_VAR)) ? ret : NULL;
-
- h. Added the zend_value_error() function, which is intended to be used
- to raise ValueError when inappropriate argument values are passed
- to functions.
-
- i. get_closure() object handlers now accept an additional zend_bool parameter
- `check_only`. If it is true, the handler is called to check whether the
- object is callable; in this case the handler should not throw an exception.
-
- j. compare_objects() handler was removed. Extensions should use compare() object
- handler instead and check if both arguments are objects and have the same
- compare handler, using ZEND_COMPARE_OBJECTS_FALLBACK() macro.
-
- k. The 'I' length modifier, used to denote 32 and 64bit integer from the custom
- snprintf and spprintf implementations has been removed.
- Use the ZEND_LONG_FMT, ZEND_ULONG_FMT and ZEND_XLONG_FMT macros defined in
- php-src/Zend/zend_long.h
-
- The 'v' format from the custom snprintf and spprintf implementations has
- been removed. Use the standard 's' format instead.
-
- l. Some VM instructions switched to IS_TMP_VAR result instead of IS_VAR.
- Actually, all assignments (ZEND_ASSIGN, ZEND_ASSIGN_DIM, ZEND_ASSIGN_OBJ,
- ZEND_ASSIGN_STATIC_PROP), all compound assignments (ZEND_ASSIGN_OP,
- ZEND_ASSIGN_DIM_OP, ZEND_ASSIGN_OBJ_OP, ZEND_ASSIGN_STATIC_PROP_OP) and all
- pre increments/decrements (ZEND_PRE_INC, ZEND_PRE_DEC, ZEND_PRE_INC_OBJ
- ZEND_PRE_DEC_OBJ, ZEND_PRE_INC_STATIC_PROP ZEND_PRE_DEC_STATIC_PROP).
-
- m. All internal functions and methods are now required to specify arginfo
- information, otherwise warnings will be thrown on startup.
-
- n. The zend_hash_sort and zend_hash_minmax APIs now accept a comparison
- function with the following signature:
-
- typedef int (*bucket_compare_func_t)(Bucket *a, Bucket *b);
-
- Previously compare_func_t was used, which accepted void pointers.
- Furthermore, the return type of zend_hash_sort and zend_ts_hash_sort has
- been changed from int to void; these functions always succeed.
-
- o. The cast_object() handler is now required, i.e. must be non-null. You can
- indicate that casting is not supported by always returning FAILURE.
-
- p. The ARG_COUNT() macro has been removed use ZEND_NUM_ARGS() instead.
-
- q. GC_COLLECTABLE flag was inverted into GC_NOT_COLLECTABLE.
- Assignments to GC_TYPE_INFO() might need to be changed to properly
- set the value of the GC_NOT_COLLECTABLE flag.
-
- r. Just for for userland classes, it is no longer allowed to implement only
- the Traversable interface. Instead, it is necessary to implement either
- Iterator or IteratorAggregate. You can do the latter by implementing
- zend_ce_aggregate and providing the following method implementation:
-
- ZEND_METHOD(MyClass, getIterator) {
- ZEND_PARSE_PARAMETERS_NONE();
- zend_create_internal_iterator_zval(return_value, ZEND_THIS);
- }
-
- s. The zend_fcall_info no_separation flag has been removed, and separation is
- never allowed. If you wish to pass (or allow passing) arguments by
- reference, explicitly create those arguments as references using
- ZEND_MAKE_REF. This removal also affects call_user_function_ex(), which
- should be replaced by call_user_function().
-
- t. The following ZEND_API function have changed signature:
- 1. Void in Zend Engine 4.0:
- - add_assoc_*()
- - add_index_*()
- - add_property_*()
- - object_init()
- - zend_declare_class_constant*()
- - zend_declare_property*()
- - zend_startup_modules()
- - zend_wrong_parameters_none_error()
- - zend_fcall_info_argp()
- - zend_fcall_info_argv()
- - zend_fcall_info_argn()
- - zend_startup()
- - zend_set_memory_limit()
- - pass_two()
- - zend_startup_constants()
- - zend_shutdown_constants()
- - zend_startup_extensions_mechanism()
- - zend_startup_extensions()
- - zend_register_extension()
- - highlight_string()
- - zend_ini_startup()
- - zend_ini_shutdown()
- - zend_ini_global_shutdown()
- - zend_ini_deactivate()
- - zend_copy_ini_directives()
- - zend_prepare_string_for_scanning()
- - zend_init_rsrc_list()
- - zend_list_close()
- - zend_signal()
- - zend_sigaction()
- - zend_stack_init()
- - zend_stack_del_top()
- - zend_stack_destroy()
- 2. Argument int to uint32_t in Zend Engine 4.0:
- - _zend_get_parameters_array_ex()
- - zend_copy_parameters_array()
- - zend_fcall_info_args_save()
- - zend_fcall_info_args_restore()
- - zend_fcall_info_argp()
- - zend_fcall_info_argv()
- - zend_fcall_info_argn()
- - zend_wrong_parameter*()
- - zend_wrong_callback_error()
- - zend_parse_arg_class()
- 3. Argument int to bool in Zend Engine 4.0:
- - add_next_index_bool()
- - zend_register_class_alias_ex()
- - add_assoc_bool_ex()
- - add_index_bool()
- - zend_fcall_info_args_clear()
- - zend_set_local_var()
- - zend_set_local_var_str()
- - zend_parse_arg_*()
- - shutdown_memory_manager()
- - zend_memory_usage()
- - zend_memory_peak_usage()
- - zend_mm_shutdown()
- - zend_eval_string*()
- - zend_set_timeout()
- - _zend_hash_append_ex()
- - _zend_hash_append_ptr_ex()
- - zend_alter_ini_entry_ex()
- - (*zend_encoding_list_parser) typedef
- - zend_multibyte_parse_encoding_list()
- - zend_safe_address()
- - zend_string_tolower_ex()
- - zend_string_alloc()
- - zend_string_safe_alloc()
- - zend_string_init()
- - zend_string_dup()
- - zend_string_realloc()
- - zend_string_extend()
- - zend_string_truncate()
- - zend_string_safe_realloc()
- - zend_string_release_ex()
- - zend_ts_hash_merge()
- - zend_ts_hash_sort()
- 4. Argument int to size_t in Zend Engine 4.0:
- - zend_set_hash_symbol()
- 5. Argument zval* to zend_object* in Zend Engine 4.0:
- - zend_read_property()
- - zend_update_property()
- - zend_unset_property()
- - zend_call_method()
- - zend_objects_clone_obj()
- - zend_get_closure_method_def()
- - zend_throw_exception_hook()
- - zend_throw_exception_internal()
- - zend_get_exception_base()
- 6. Argument zval* to zend_long in Zend Engine 4.0:
- - _php_math_longtobase()
- 7. Return type from int to zend_result in Zend Engine 4.0:
- - (*stream_open_function) in _zend_utility_functions
- - (*zend_post_startup_cb)
- - (*zend_preload_autoload)
- - zend_execute_scripts()
- - zend_post_startup()
- - _zend_get_parameters_array_ex()
- - zend_copy_parameters_array()
- - zend_parse_parameters()
- - zend_parse_parameters_ex()
- - zend_parse_method_parameters()
- - zend_parse_method_parameters_ex()
- - zend_parse_method_parameters()
- - zend_register_functions()
- - zend_startup_module()
- - zend_startup_module_ex()
- - zend_register_class_alias_ex()
- - zend_disable_function()
- - zend_disable_class()
- - zend_update_class_constants()
- - zend_update_static_property*()
- - object_init_ex()
- - object_and_properties_init()
- - add_index_zval()
- - add_next_index_long_*()
- - array_set_zval_key()
- - _call_user_function_impl()
- - zend_fcall_info_*()
- - zend_call_function()
- - zend_set_hash_symbol()
- - zend_delete_global_variable()
- - zend_set_local_var()
- - zend_set_local_var_str()
- - zend_forbid_dynamic_call()
- - zend_get_default_from_internal_arg_info()
- - zend_try_assign_typed_ref*()
- - zend_ast_evaluate()
- - zend_startup_builtin_functions()
- - do_bind_function()
- - do_bind_class()
- - zend_unmangle_property_name_ex()
- - zend_register_auto_global()
- - zend_register_constant()
- - zend_exception_error()
- - zend_eval_string*()
- - zend_undefined_offset_write()
- - zend_undefined_index_write()
- - zval_update_constant(_ex)()
- - zend_load_extension()
- - zend_load_extension_handle()
- - zend_hash_del(_ind)()
- - zend_hash_str_del(_ind)()
- - zend_hash_index_del()
- - zend_hash_move_forward_ex()
- - zend_hash_move_backward_ex()
- - zend_hash_get_current_key_ex()
- - zend_hash_get_current_key_type_ex()
- - zend_symtable_del(_ind)()
- - zend_symtable_str_del(_ind)()
- - highlight_file()
- - zend_do_link_class()
- - zend_alter_ini_entry*()
- - zend_restore_ini_entry()
- - zend_ini_register_displayer()
- - zend_ini_open_file_for_scanning()
- - zend_ini_prepare_string_for_scanning()
- - zend_user_it_valid()
- - zend_create_internal_iterator_zval()
- - zend_multibyte_set_filter()
- - zend_lex_tstring()
- - _zend_module_entry module_startup_func, module_shutdown_func,
- request_startup_func, request_shutdown_func, and post_deactivate_func function pointers
- - (*zend_encoding_list_parser) typedef
- - (*zend_encoding_internal_encoding_setter) typedef
- - zend_multibyte_set_functions()
- - zend_multibyte_set_script_encoding_by_string()
- - add_function()
- - sub_function()
- - mul_function()
- - pow_function()
- - div_function()
- - mod_function()
- - boolean_xor_function()
- - boolean_not_function()
- - bitwise_not_function()
- - bitwise_or_function()
- - bitwise_and_function()
- - bitwise_xor_function()
- - shift_left_function()
- - shift_right_function()
- - concat_function()
- - is_equal_function(
- - is_identical_function()
- - is_not_identical_function()
- - is_not_equal_function()
- - is_smaller_function()
- - is_smaller_or_equal_function(zv
- - increment_function()
- - decrement_function()
- - zend_stream_open()
- - zend_stream_fixup()
- - zend_ts_hash_del()
- - zend_ts_hash_index_del()
- 8. Return type from int to bool in Zend Engine 4.0:
- - zend_make_printable_zval()
- - zend_parse_arg_*()
- - is_zend_mm()
- - is_zend_ptr()
- - zend_mm_is_custom_heap()
- - (*zend_mm_chunk_truncate_t)
- - (*zend_mm_chunk_extend_t)
- - zend_bitset_empty()
- - zend_is_smart_branch()
- - zend_check_arg_send_type()
- - zend_verify_const_access()
- - zend_gdb_register_code()
- - zend_gdb_present()
- - _zend_handle_numeric_str(_ex)()
- - zend_hash_exists_ind()
- - zend_hash_str_exists_ind()
- - zend_symtable_exists(_ind)()
- - zend_symtable_str_exists()
- - (*zend_encoding_lexer_compatibility_checker)
- - zend_object_is_true()
- - i_zend_is_true()
- - zendi_smart_streq()
- - zend_stack_is_empty()
- - zend_ts_hash_exists()
- - zend_ts_hash_index_exists()
- 9. Argument void to const char* in Zend Engine 4.0:
- - zend_get_op_array_extension_handle()
- 10. Argument zend_extension to const char* in Zend Engine 4.0:
- - zend_get_resource_handle()
- 11. Argument const char * to HMODULE in Zend Engine 4.0:
- - php_win32_image_compatible()
- 12. const char * argument dropped in Zend Engine 4.0:
- - php_win32_crt_compatible()
-
- u. Instead of overwriting zend_error_cb extensions with debugging, monitoring
- use-cases catching Errors/Exceptions are strongly encouraged to use
- the new error observer API instead.
-
- Error observering callbacks are guaranteed to be called regardless of
- the users error_reporting setting or userland error handler return values.
-
- Register observer callbacks during MINIT of an extension:
-
- void my_error_observer_cb(int type,
- const char *error_filename,
- uint32_t error_lineno,
- zend_string *message) {
- }
- zend_observer_error_register(my_error_observer_cb);
-
- v. The following APIs have been removed from the Zend Engine:
- - zend_ts_hash_init_ex(), drop the last argument and use zend_ts_hash_init() instead
- - zend_hash_init_ex(), drop the last argument and use zend_hash_init() instead
- - zval_internal_dtor(), use zval_internal_ptr_dtor() instead
- - zval_dtor_func(), use rc_dtor_func() instead
- - zval_ptr_dtor_wrapper(), use zval_ptr_dtor() instead
- - zval_internal_ptr_dtor_wrapper(), use zval_internal_ptr_dtor() instead
-
- w. The following APIs have been renamed:
- - _zend_ts_hash_init() to zend_ts_hash_init()
-
- x. In COMPILE_EXTENDED_STMT mode, a ZEND_EXT_NOP opcode will no longer be
- generated at the start of a function. Use the new observer APIs or hook
- into zend_execute_ex instead.
+ a. The following APIs have been removed from the Zend Engine:
+ - The spl_ce_Aggregate, spl_ce_ArrayAccess, spl_ce_Countable, spl_ce_Iterator, spl_ce_Serializable,
+ spl_ce_Stringable, spl_ce_Traversable alias class entries have been removed in favor of zend_ce_aggregate,
+ zend_ce_arrayaccess, zend_ce_countable, zend_ce_iterator, zend_ce_serializable, zend_ce_stringable,
+ zend_ce_traversable.
+ b. Zend Stream API has been changed to use "zend_string*" instead of "char*"
+ - zend_file_handle.filename now is zend_string*
+ - zend_file_handle.free_filename is removed. Now zend_file_handle.filename is always released.
+ - added zend_file_handle.primary_script flag. SAPIs should set it for main executed script.
+ - added zend_file_handle.in_list flag, which is set when a file_handle is added into CG(open_files)
+ - added zend_stream_init_filename_ex() function, that takes filename as zend_string*
+ - the "filename" parameter of functons zend_stream_open(), php_stream_open_for_zend_ex() and
+ callback zend_stream_open_function() has been removed (it's now passed as a "filename" field of the
+ file_handle parameter)
+ - in zend_fopen() and zend_resolve_path() callbacks filename now passed as zend_string*
+ - file_handles should be destroyed by zend_destroy_file_handle() function (usually in the same function
+ the same function where they were created by zend_stream_init_*()). Previously there were two different
+ destructors zend_destroy_file_handle() and zend_file_handle_dtor().
+ - zend_ini_scanner_globals.filename now is zend_string*
========================
2. Build system changes
========================
- a. Abstract
- 1. Symbol HAVE_HASH_EXT is removed and is no longer defined. It should be
- considered to have hash extension always available since PHP 7.4.
-
- 2. Symbol HAVE_PCRE is removed and is no longer defined. It should be
- considered to have pcre extension always available since PHP 7.4.
-
- 3. Symbol HAVE_LOCALE_H has been removed and is no longer defined.
-
- 4. --disable-inline-optimization (which actually disabled all compiler
- optimizations) has been removed. If you wish to build PHP on a host
- with extremely constrained memory, and compilation fails with an "out
- of memory" message, add "-O0" to CFLAGS.
-
- 5. build system and provider are displayed in phpinfo from environment:
- - PHP_BUILD_SYSTEM (default is same as PHP_UNAME)
- - PHP_BUILD_PROVIDER (no default)
-
- b. Unix build system changes
-
- 1. --enable-maintainer-zts is renamed --enable-zts for parity with Windows
- and as recognition that ZTS is not a "maintainer" or experimental
- feature.
-
- 2. The PHP_CHECK_GCC_ARG() m4 macro has been removed in favor of
- AX_CHECK_COMPILE_FLAG().
-
- 3. The 6th argument of PHP_ADD_SOURCES_X has been removed.
-
- 4. The 'special-flags' (3rd) argument of PHP_ADD_SOURCES_X are
- now appended instead of prepended to previous compiler flags.
- This means compiler flags passed to PHP_NEW_EXTENSION and PHP_ADD_SOURCES
- are now appended, this allows to disable compiler flags set by Zend/Zend.m4
- (e.g. disable certain compiler flags enabled by -Wextra)
-
- c. Windows build system changes
-
- - The configuration option --enable-crt-debug has been removed. The VC
- debug heap can now be enabled for debug builds by setting the environment
- variable PHP_WIN32_DEBUG_HEAP to a non-negative number before PHP process
- startup.
-
========================
3. Module changes
========================
+ a. ext/hash
+ - The init signatures are extended with an additional `HashTable*`
+ argument. The passed HT is to contain the algorithm specific
+ configuration. If an algorithm doesn't make use of any additional
+ configuration, the argument is to be marked with ZEND_ATTRIBUTE_UNUSED.
+
+ b. ext/pdo
+ - The "preparer" callback now accepts a zend_string* instead of
+ char* + size_t pair the query string. Similarly, the query_string and
+ active_query_string members of pdo_stmt_t are now zend_string*.
+ - The way in which drivers provide results has changed: Previously,
+ the "describer" callback populated the "pdo_type" member in the
+ pdo_column_data structure, and the "get_col" callback then had to return
+ pointers to data of appropriate type.
+
+ In PHP 8.1, the "describer" callback no longer determines the pdo_type
+ (and this member has been removed from pdo_column_data). Instead, the
+ "get_col" callback accepts a zval pointer that may be populated with a
+ value of arbitrary type. This gives drivers more flexibility in
+ determining result types (e.g. based on whether a specific integer fits
+ the PHP integer type) and avoid awkward juggling of temporary buffers.
+
+ As the "describer" no longer determines pdo_type, the "get_column_meta"
+ function is now responsible for providing this information for use by
+ getColumnMeta(). The type provided here does not need to match the type
+ returned by get_col (in fact no corresponding type might exist, e.g. for
+ floats). It should be the closest logical equivalent for the column type.
+ - The transaction, set_attribute, and preparer handler's return type
+ has been formalized to bool instead of int.
+ - The check_liveness handler's return type has been formalized to zend_return
+ instead of int.
+ - The closer, and fetch_error handlers have been voidified.
+ - The quoter handler now returns the quoted string as zend_string* instead
+ of returning a boolean, and the quoted string as a pair of out params.
+ Similarly the unquoted string is now a zend_string* instead of a pair of
+ char* and size_t length.
+ - The doer handler now accepts a zend_string* instead of char* + size_t
+ pair for the SQL statement.
+ - The last_id handler now returns a zend_string* instead of returning a
+ char* and the length as an out param, and accepts a zend_string* instead
+ of char* for the optional sequence/table name.
+ - The php_pdo_str_tolower_dup() PDO_API has been removed use zend_str_tolower_dup()
+ or zend_string_tolower_ex().