xref: /PHP-7.3/UPGRADING.INTERNALS (revision 1c850bfc)
1PHP 7.3 INTERNALS UPGRADE NOTES
2
31. Internal API changes
4  a. array_init() and array_init_size()
5  b. Run-time constant operand addressing
6  c. Array/Object recursion protection
7  d. HASH_FLAG_PERSISTENT
8  e. AST and IS_CONSTANT
9  f. GC_REFCOUNT()
10  g. zend_get_parameters()
11  h. zend_register_persistent_resource()
12  i. RAND_RANGE()
13  j. cast_object() with _IS_NUMBER
14  k. zend_fcall_info_cache.initialized
15  l. php_hrtime_current()
16  m. zend_cpu_supports()
17  n. IS_TYPE_COPYABLE
18  o. IS_UNUSED
19  p. VM instruction operands (FETCH_CLASS, FETCH_CONSTANT, CATCH)
20  q. sapi_cli_single_write()
21  r. php_url
22  s. zend_function.reserved[]
23  t. zif_handler
24  u. GC_G
25  v. php_add[c]slashes
26  w. zend_class_entry.iterator_funcs
27  x. Class declaration opcodes (DECLARE_INHERITED_CLASS ...)
28  y. zend_constant
29  z. HAVE_ST_BLKSIZE and HAVE_ST_RDEV
30  aa. RETSIGTYPE
31  bb. php_setcookie
32
332. Build system changes
34  a. Unix build system changes
35  b. Windows build system changes
36
37
383. Module changes
39
40========================
411. Internal API changes
42========================
43
44  a. array_init() and array_init_size() are not functions anymore.
45     They don't return any values.
46
47  b. In 64-bit builds PHP-7.2 and below used relative run-time constant operand
48     addressing. E.g. opline->op1.constant kept an offset from start of literals
49     table - op_array->literals. To speedup access op_array->literals was cached
50     in execute_data->literals. So the resulting address calculated as
51     EX(literals) + opline->op1.constant.
52
53     Now at run-time literals allocated close to opcodes, and addressed
54     relatively from current opline. This eliminates load of EX(literals) on
55     each constant access as well as EX(literals) initialization on each call.
56
57     As result some related macros were removed (ZEND_EX_USE_LITERALS,
58     EX_LOAD_LITERALS, EX_LITERALS, RT_CONSTANT_EX, EX_CONSTANT) or changed
59     (RT_CONSTANT, ZEND_PASS_TWO_UPDATE_CONSTANT, ZEND_PASS_TWO_UNDO_CONSTANT).
60     This change may affect only some "system" extensions. EX_LITERALS,
61     RT_CONSTANT_EX, EX_CONSTANT should be substituted by RT_CONSTANT, and now
62     use "opline" (instead of "op_array") as first argument.
63
64  c. Protection from recursion during processing circular data structures was
65     refactored. HashTable.nApplyCount and IS_OBJ_APPLY_COUNT are replaced by
66     single flag GC_PROTECTED. Corresponding macros Z_OBJ_APPLY_COUNT,
67     Z_OBJ_INC_APPLY_COUNT, Z_OBJ_DEC_APPLY_COUNT, ZEND_HASH_GET_APPLY_COUNT,
68     ZEND_HASH_INC_APPLY_COUNT, ZEND_HASH_DEC_APPLY_COUNT are replaced with
69     GC_IS_RECURSIVE, GC_PROTECT_RECURSION, GC_UNPROTECT_RECURSION,
70     Z_IS_RECURSIVE, Z_PROTECT_RECURSION, Z_UNPROTECT_RECURSION.
71
72     HASH_FLAG_APPLY_PROTECTION flag and ZEND_HASH_APPLY_PROTECTION() macro
73     are removed. All mutable arrays should use recursion protection.
74     Corresponding checks should be replaced by Z_REFCOUNTED() or
75     !(GC_FLAGS(p) & GC_IMMUTABLE).
76
77  d. HASH_FLAG_PERSISTENT renamed into IS_ARRAY_PERSISTENT and moved into
78     GC_FLAGS (to be consistent with IS_STR_PERSISTENT).
79
80  e. zend_ast_ref structure is changed to use only one allocation.
81     zend_ast_copy() now returns zend_ast_ref (instead of zend_asr).
82     zend_ast_destroy_and_free() is removed. ZVAL_NEW_AST() is replaced
83     by ZVAL_AST().
84
85     IS_CONSTANT type and Z_CONST_FLAGS() are removed. Now constants are always
86     represented using IS_CONSTANT_AST (ZEND_AST_CONSTANT kind). AST node
87     attributes are used instead of constant flags. IS_TYPE_CONSTANT flag is
88     removed, but Z_CONSTANT() macro is kept for compatibility.
89
90  f. GC_REFCOUNT() is turned into inline function and can't be modified direcly.
91     All reference-counting operations should be done through corresponding
92     macros GC_SET_REFCOUNT(), GC_ADDREF() and GC_DELREF().
93
94     GC_REFCOUNT(p)++ should be changed into GC_ADDREF(p),
95     GC_REFCOUNT(p)-- into GC_DELREF(p),
96     GC_REFCOUNT(p) = 1 into GC_SET_REFCOUNT(p, 1).
97
98  g. The zend_get_parameters() and zend_get_parameters_ex() functions were
99     removed. Instead zend_parse_parameters() should be used.
100
101  h. New functions zend_register_persistent_resource() or
102     zend_register_persistent_resource_ex() should beused to register
103     persistent resources, instead of manual insertion into EG(persistent_list).
104
105  i. The RAND_RANGE() macro has been removed. php_mt_rand_range() should be
106     used instead.
107
108  j. The cast_object() object handler now also accepts the _IS_NUMBER type. The
109     handler should return either an integer or float value in this case,
110     whichever is more appropriate.
111
112  k. zend_fcall_info_cache.initialized is removed. zend_fcall_info_cache is
113     initialized if zend_fcall_info_cache.function_handler is set.
114
115  l. php_hrtime_current() delivers the number of nanoseconds since an uncertain
116     point in the past.
117
118  m. zend_cpu_supports() determines if a feature is supported by current cpu.
119     Also serial inline zend_cpu_supports_xxx() are added, which is designed for
120     ifunc resolver function, as resolver function should not depend on any
121     external function.
122
123  n. IS_TYPE_COPYABLE flag is removed. IS_STRING zvals didn't need to be
124     duplication by zval_copy_ctor(), ZVAL_DUP() and SEPARATE_ZVAL*() macros.
125     Interned strings didn't set IS_TYPE_COPYABLE, so they aren't affected at
126     all. Now instead of checking for IS_TYPE_COPYABLE, engine checks for
127     IS_ARRAY type (it may be IS_TYPE_REFCOUNTED or not). All the related
128     macros: Z_COPYABLE..., Z_IMMUTABLE... are kept for compatibility.
129
130  o. IS_UNUSED became zero and can't be used as a bitmask (there were no such
131     usages in PHP sources).
132
133  p. Operands of few VM instructions were changed
134    - FETCH_CLASS     op1<fetch-flags>, op2<name>, result<var>
135    - FETCH_CONSTANT  op1<fetch-flags>, op2<name>, result<tmp>
136    - CATCH           ext<last-flag>, op1<name>, op2<jump_addr>, result<cv>
137
138 q.  sapi_cli_single_write() now returns ssize_t instead of size_t.
139
140 r.  fields of php_url struct change from char * to zend_string *
141
142 s. Special purpose zend_functions marked by ZEND_ACC_CALL_VIA_TRAMPOLINE or
143    ZEND_ACC_FAKE_CLOSURE flags use reserved[0] for internal purpose.
144    Third party extensions must not modify reserved[] fields of these functions.
145
146 t. For internal functions the typedef zif_handler has been introduced.  It is
147    recommended to use this from now on, instead of defining own handler types.
148
149 u. The GC globals (GC_G) are now private. Use the new zend_gc_get_status() to
150    retrieve status information of the GC.
151
152 v. The should_free argument of the php_add[c]slashes functions has been
153    removed.  It is now always the caller's responsibility to free the passed
154    string.
155
156 w. zend_class_entry.iterator_funcs have been replaced by iterator_funcs_ptr.
157    You don't have to set its value, setting parent.funcs in the get_iterator
158    function is enough.
159
160 x. Class declaration opcode formats were changed
161  - DECLARE_INHERITED_CLASS and DECLARE_ANON_INHERITED_CLASS now encode parent
162    class name in second operand directly (as IS_CONST operand). Previously,
163    parent class was fetched by the prior FETCH_CLASS opcode.
164  - ADD_INTERFACE and ADD_TRAIT don't use run-time cache to keep interface or
165    trait. These instructions are executed once, and caching is useless.
166
167 y. zend_constant.flags and zend_constant.module_number are packed into
168    reserved space inside zend_constant.value. They should be accessed using
169    ZEND_CONSTANT_FLAGS(), ZEND_CONSTANT_MODULE_NUMBER() and
170    ZEND_CONSTANT_SET_FLAGS() macros.
171
172 z. HAVE_ST_BLKSIZE must be replaced with HAVE_STRUCT_STAT_ST_BLKSIZE and
173    HAVE_ST_RDEV must be replaced with HAVE_STRUCT_STAT_ST_RDEV.
174
175 aa. RETSIGTYPE has been removed from the generated php_config.h and should be
176    replaced with void.
177
178 bb. php_setcookie() now expects an additional samesite argument, and the
179    url_encode parameter has been moved to the end. The signature is now:
180    int php_setcookie(zend_string *name, zend_string *value, time_t expires,
181                      zend_string *path, zend_string *domain, int secure,
182                      int httponly, zend_string *samesite, int url_encode);
183
184========================
1852. Build system changes
186========================
187
188  a. Unix build system changes
189    - PHP_PROG_LEX, TSRM_CHECK_GCC_ARG, and LIBZEND_CPLUSPLUS_CHECKS Autoconf
190      macros have been removed.
191    - Minimum Autoconf version is 2.68+ for generating the configure script.
192
193  b. Windows build system changes
194    - ZEND_WIN32_FORCE_INLINE doesn't affect C++ anymore. zend_always_inline is
195      still usable in C++, but anything else inlining related is up to
196      compiler.
197    - ZEND_WIN32_KEEP_INLINE was removed, it was only needed for C++
198      convenience and is now default behavior with C++.
199    - New configure option --enable-native-intrinsics accepts a list of the
200      intrinsic optimizations to enable. It affects both the code generation
201      and the explicit optimizations guarded by preprocessor macros.
202    - The configure option --with-codegen-arch accepts only ia32 as a value.
203      Use it, to produce builds suitable for older processors without SSE2 or
204      even SSE support.
205
206========================
2073. Module changes
208========================
209