Browse Source
Prepare UPGRADING(.INTERNALS) for PHP 7.4
Prepare UPGRADING(.INTERNALS) for PHP 7.4
We also add this as task to README.RELEASE_PROCESS, so that it's not overlooked next time.pull/2760/merge
3 changed files with 5 additions and 667 deletions
@ -1,201 +1,25 @@ |
|||||
PHP 7.3 INTERNALS UPGRADE NOTES |
|
||||
|
PHP 7.4 INTERNALS UPGRADE NOTES |
||||
|
|
||||
1. Internal API changes |
1. Internal API changes |
||||
a. array_init() and array_init_size() |
|
||||
b. Run-time constant operand addressing |
|
||||
c. Array/Object recursion protection |
|
||||
d. HASH_FLAG_PERSISTENT |
|
||||
e. AST and IS_CONSTANT |
|
||||
f. GC_REFCOUNT() |
|
||||
g. zend_get_parameters() |
|
||||
h. zend_register_persistent_resource() |
|
||||
i. RAND_RANGE() |
|
||||
j. cast_object() with _IS_NUMBER |
|
||||
k. zend_fcall_info_cache.initialized |
|
||||
l. php_hrtime_current() |
|
||||
m. zend_cpu_supports() |
|
||||
n. IS_TYPE_COPYABLE |
|
||||
o. IS_UNUSED |
|
||||
p. VM instruction operands (FETCH_CLASS, FETCH_CONSTANT, CATCH) |
|
||||
q. sapi_cli_single_write() |
|
||||
r. php_url |
|
||||
s. zend_function.reserved[] |
|
||||
t. zif_handler |
|
||||
u. GC_G |
|
||||
v. php_add[c]slashes |
|
||||
w. zend_class_entry.iterator_funcs |
|
||||
x. Class declaration opcodes (DECLARE_INHERITED_CLASS ...) |
|
||||
y. zend_constant |
|
||||
z. HAVE_ST_BLKSIZE and HAVE_ST_RDEV |
|
||||
aa. RETSIGTYPE |
|
||||
|
|
||||
2. Build system changes |
2. Build system changes |
||||
a. Unix build system changes |
a. Unix build system changes |
||||
b. Windows build system changes |
b. Windows build system changes |
||||
|
|
||||
|
|
||||
3. Module changes |
3. Module changes |
||||
|
|
||||
======================== |
======================== |
||||
1. Internal API changes |
1. Internal API changes |
||||
======================== |
======================== |
||||
|
|
||||
a. array_init() and array_init_size() are not functions anymore. |
|
||||
They don't return any values. |
|
||||
|
|
||||
b. In 64-bit builds PHP-7.2 and below used relative run-time constant operand |
|
||||
addressing. E.g. opline->op1.constant kept an offset from start of literals |
|
||||
table - op_array->literals. To speedup access op_array->literals was cached |
|
||||
in execute_data->literals. So the resulting address calculated as |
|
||||
EX(literals) + opline->op1.constant. |
|
||||
|
|
||||
Now at run-time literals allocated close to opcodes, and addressed |
|
||||
relatively from current opline. This eliminates load of EX(literals) on |
|
||||
each constant access as well as EX(literals) initialization on each call. |
|
||||
|
|
||||
As result some related macros were removed (ZEND_EX_USE_LITERALS, |
|
||||
EX_LOAD_LITERALS, EX_LITERALS, RT_CONSTANT_EX, EX_CONSTANT) or changed |
|
||||
(RT_CONSTANT, ZEND_PASS_TWO_UPDATE_CONSTANT, ZEND_PASS_TWO_UNDO_CONSTANT). |
|
||||
This change may affect only some "system" extensions. EX_LITERALS, |
|
||||
RT_CONSTANT_EX, EX_CONSTANT should be substituted by RT_CONSTANT, and now |
|
||||
use "opline" (instead of "op_array") as first argument. |
|
||||
|
|
||||
c. Protection from recursion during processing circular data structures was |
|
||||
refactored. HashTable.nApplyCount and IS_OBJ_APPLY_COUNT are replaced by |
|
||||
single flag GC_PROTECTED. Corresponding macros Z_OBJ_APPLY_COUNT, |
|
||||
Z_OBJ_INC_APPLY_COUNT, Z_OBJ_DEC_APPLY_COUNT, ZEND_HASH_GET_APPLY_COUNT, |
|
||||
ZEND_HASH_INC_APPLY_COUNT, ZEND_HASH_DEC_APPLY_COUNT are replaced with |
|
||||
GC_IS_RECURSIVE, GC_PROTECT_RECURSION, GC_UNPROTECT_RECURSION, |
|
||||
Z_IS_RECURSIVE, Z_PROTECT_RECURSION, Z_UNPROTECT_RECURSION. |
|
||||
|
|
||||
HASH_FLAG_APPLY_PROTECTION flag and ZEND_HASH_APPLY_PROTECTION() macro |
|
||||
are removed. All mutable arrays should use recursion protection. |
|
||||
Corresponding checks should be replaced by Z_REFCOUNTED() or |
|
||||
!(GC_GLAGS(p) & GC_IMMUTABLE). |
|
||||
|
|
||||
d. HASH_FLAG_PERSISTENT renamed into IS_ARRAY_PERSISTENT and moved into |
|
||||
GC_FLAGS (to be consistent with IS_STR_PERSISTENT). |
|
||||
|
|
||||
e. zend_ast_ref structure is changed to use only one allocation. |
|
||||
zend_ast_copy() now returns zend_ast_ref (instead of zend_asr). |
|
||||
zend_ast_destroy_and_free() is removed. ZVAL_NEW_AST() is replaced |
|
||||
by ZVAL_AST(). |
|
||||
|
|
||||
IS_CONSTANT type and Z_CONST_FLAGS() are removed. Now constants are always |
|
||||
represented using IS_CONSTANT_AST (ZEND_AST_CONSTANT kind). AST node |
|
||||
attributes are used instead of constant flags. IS_TYPE_CONSTANT flag is |
|
||||
removed, but Z_CONSTANT() macro is kept for compatibility. |
|
||||
|
|
||||
f. GC_REFCOUNT() is turned into inline function and can't be modified direcly. |
|
||||
All reference-counting operations should be done through corresponding |
|
||||
macros GC_SET_REFCOUNT(), GC_ADDREF() and GC_DELREF(). |
|
||||
|
|
||||
GC_REFCOUNT(p)++ should be changed into GC_ADDREF(p), |
|
||||
GC_REFCOUNT(p)-- into GC_DELREF(p), |
|
||||
GC_REFCOUNT(p) = 1 into GC_SET_REFCOUNT(p, 1). |
|
||||
|
|
||||
g. The zend_get_parameters() and zend_get_parameters_ex() functions were |
|
||||
removed. Instead zend_parse_parameters() should be used. |
|
||||
|
|
||||
h. New functions zend_register_persistent_resource() or |
|
||||
zend_register_persistent_resource_ex() should beused to register |
|
||||
persistent resources, instead of manual insertion into EG(persistent_list). |
|
||||
|
|
||||
i. The RAND_RANGE() macro has been removed. php_mt_rand_range() should be |
|
||||
used instead. |
|
||||
|
|
||||
j. The cast_object() object handler now also accepts the _IS_NUMBER type. The |
|
||||
handler should return either an integer or float value in this case, |
|
||||
whichever is more appropriate. |
|
||||
|
|
||||
k. zend_fcall_info_cache.initialized is removed. zend_fcall_info_cache is |
|
||||
initialized if zend_fcall_info_cache.function_handler is set. |
|
||||
|
|
||||
l. php_hrtime_current() delivers the number of nanoseconds since an uncertain |
|
||||
point in the past. |
|
||||
|
|
||||
m. zend_cpu_supports() determines if a feature is supported by current cpu. |
|
||||
Also serial inline zend_cpu_supports_xxx() are added, which is designed for |
|
||||
ifunc resolver function, as resolver function should not depend on any |
|
||||
external function. |
|
||||
|
|
||||
n. IS_TYPE_COPYABLE flag is removed. IS_STRING zvals didn't need to be |
|
||||
duplication by zval_copy_ctor(), ZVAL_DUP() and SEPARATE_ZVAL*() macros. |
|
||||
Interned strings didn't set IS_TYPE_COPYALE, so they aren't affected at |
|
||||
all. Now instead of checking for IS_TYPE_COPYABLE, engine checks for |
|
||||
IS_ARRAY type (it may be IS_TYPE_REFCOUNTED or not). All the related |
|
||||
macros: Z_COPYABLE..., Z_IMMUTABLE... are kept for compatibility. |
|
||||
|
|
||||
o. IS_UNUSED became zero and can't be used as a bitmask (there were no such |
|
||||
usages in PHP sources). |
|
||||
|
|
||||
p. Operands of few VM instructions were changed |
|
||||
- FETCH_CLASS op1<fetch-flags>, op2<name>, result<var> |
|
||||
- FETCH_CONSTANT op1<fetch-flags>, op2<name>, result<tmp> |
|
||||
- CATCH ext<last-flag>, op1<name>, op2<jump_addr>, result<cv> |
|
||||
|
|
||||
q. sapi_cli_single_write() now returns ssize_t instead of size_t. |
|
||||
|
|
||||
r. fields of php_url struct change from char * to zend_string * |
|
||||
|
|
||||
s. Special purpose zend_functions marked by ZEND_ACC_CALL_VIA_TRAMPOLINE or |
|
||||
ZEND_ACC_FAKE_CLOSURE flags use reserved[0] for internal purpose. |
|
||||
Third party extensions must not modify reserved[] fields of these functions. |
|
||||
|
|
||||
t. For internal functions the typedef zif_handler has been introduced. It is |
|
||||
recommended to use this from now on, instead of defining own handler types. |
|
||||
|
|
||||
u. The GC globals (GC_G) are now private. Use the new zend_gc_get_status() to |
|
||||
retrieve status information of the GC. |
|
||||
|
|
||||
v. The should_free argument of the php_add[c]slashes functions has been |
|
||||
removed. It is now always the caller's responsibility to free the passed |
|
||||
string. |
|
||||
|
|
||||
w. zend_class_entry.iterator_funcs have been replaced by iterator_funcs_ptr. |
|
||||
You don't have to set its value, setting parent.funcs in the get_iterator |
|
||||
function is enough. |
|
||||
|
|
||||
x. Class declaration opcode formats were changed |
|
||||
- DECLARE_INHERITED_CLASS and DECLARE_ANON_INHERITED_CLASS now encode parent |
|
||||
class name in second operand directly (as IS_CONST operand). Previously, |
|
||||
parent class was fetched by the prior FETCH_CLASS opcode. |
|
||||
- ADD_INTERFACE and ADD_TRAIT don't use run-time cache to keep interface or |
|
||||
trait. These instructions are executed once, and caching is useless. |
|
||||
|
|
||||
y. zend_constant.flags and zend_constant.module_number are packed into |
|
||||
reserved space inside zend_constant.value. They should be accessed using |
|
||||
ZEND_CONTANT_FLAGS(), ZEND_CONSTANTS_MODULE_NUMBER() and |
|
||||
ZEND_CONTANT_SET_FLAGS() macros. |
|
||||
|
|
||||
z. HAVE_ST_BLKSIZE must be replaced with HAVE_STRUCT_STAT_ST_BLKSIZE and |
|
||||
HAVE_ST_RDEV must be replaced with HAVE_STRUCT_STAT_ST_RDEV. |
|
||||
|
|
||||
aa. RETSIGTYPE has been removed from the generated php_config.h and should be |
|
||||
replaced with void. |
|
||||
|
|
||||
======================== |
======================== |
||||
2. Build system changes |
2. Build system changes |
||||
======================== |
======================== |
||||
|
|
||||
a. Unix build system changes |
a. Unix build system changes |
||||
- PHP_PROG_LEX, TSRM_CHECK_GCC_ARG, and LIBZEND_CPLUSPLUS_CHECKS Autoconf |
|
||||
macros have been removed. |
|
||||
|
|
||||
b. Windows build system changes |
b. Windows build system changes |
||||
- ZEND_WIN32_FORCE_INLINE doesn't affect C++ anymore. zend_always_inline is |
|
||||
still usable in C++, but anything else inlining related is up to |
|
||||
compiler. |
|
||||
- ZEND_WIN32_KEEP_INLINE was removed, it was only needed for C++ |
|
||||
convenience and is now default behavior with C++. |
|
||||
- New configure option --enable-native-intrinsics accepts a list of the |
|
||||
intrinsic optimizations to enable. It affects both the code generation |
|
||||
and the explicit optimizations guarded by preprocessor macros. |
|
||||
- The configure option --with-codegen-arch accepts only ia32 as a value. |
|
||||
Use it, to produce builds suitable for older processors without SSE2 or |
|
||||
even SSE support. |
|
||||
|
|
||||
======================== |
======================== |
||||
3. Module changes |
3. Module changes |
||||
======================== |
======================== |
||||
|
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue