[mapguide-commits] r10139 - in branches/4.0/MgDev/Oem/php: . build include/TSRM include/Zend include/Zend/Optimizer include/ext include/ext/date include/ext/date/lib include/ext/dom include/ext/gd include/ext/gmp include/ext/iconv include/ext/json include/ext/libxml include/ext/mbstring include/ext/mbstring/libmbfl/mbfl include/ext/mysqli include/ext/mysqlnd include/ext/pcre include/ext/pcre/pcre2lib include/ext/pdo include/ext/random include/ext/session include/ext/sockets include/ext/sodium include/ext/spl include/ext/standard include/ext/xml include/main include/main/streams include/win32 lib script

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Mon May 5 05:41:14 PDT 2025


Author: jng
Date: 2025-05-05 05:41:13 -0700 (Mon, 05 May 2025)
New Revision: 10139

Added:
   branches/4.0/MgDev/Oem/php/include/Zend/zend_atomic.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_call_stack.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_constants_arginfo.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_hrtime.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_max_execution_timer.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_mmap.h
   branches/4.0/MgDev/Oem/php/include/ext/random/
   branches/4.0/MgDev/Oem/php/include/ext/random/php_random.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/file_arginfo.h
   branches/4.0/MgDev/Oem/php/include/main/main_arginfo.h
   branches/4.0/MgDev/Oem/php/include/main/php_ini_builder.h
   branches/4.0/MgDev/Oem/php/include/main/php_odbc_utils.h
   branches/4.0/MgDev/Oem/php/include/main/streams/userspace_arginfo.h
   branches/4.0/MgDev/Oem/php/lib/php_zip.lib
Removed:
   branches/4.0/MgDev/Oem/php/include/ext/standard/hrtime.h
   branches/4.0/MgDev/Oem/php/include/main/php_stdint.h
Modified:
   branches/4.0/MgDev/Oem/php/PROVENANCE.TXT
   branches/4.0/MgDev/Oem/php/build/default.manifest
   branches/4.0/MgDev/Oem/php/build/gen_stub.php
   branches/4.0/MgDev/Oem/php/build/template.rc
   branches/4.0/MgDev/Oem/php/include/TSRM/TSRM.h
   branches/4.0/MgDev/Oem/php/include/TSRM/tsrm_win32.h
   branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_call_graph.h
   branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_cfg.h
   branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_dump.h
   branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_func_info.h
   branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_inference.h
   branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_optimizer.h
   branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_ssa.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_API.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_alloc.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_ast.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_attributes.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_attributes_arginfo.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_bitset.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_builtin_functions_arginfo.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_compile.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_cpuinfo.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_enum.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_exceptions_arginfo.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_execute.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_extensions.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_fibers.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_gc.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_generators.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_globals.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_hash.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_inheritance.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_ini.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_ini_parser.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_ini_scanner.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_ini_scanner_defs.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_interfaces.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_iterators.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_list.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_llist.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_long.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_map_ptr.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_modules.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_multibyte.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_multiply.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_object_handlers.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_objects_API.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_observer.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_operators.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_portability.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_ptr_stack.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_smart_str.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_smart_str_public.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_stack.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_stream.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_string.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_strtod_int.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_type_info.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_types.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_virtual_cwd.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_vm.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_def.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_execute.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_handlers.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_opcodes.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_trace_handlers.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_trace_map.h
   branches/4.0/MgDev/Oem/php/include/Zend/zend_weakrefs.h
   branches/4.0/MgDev/Oem/php/include/ext/date/lib/timelib.h
   branches/4.0/MgDev/Oem/php/include/ext/date/lib/timelib_config.h
   branches/4.0/MgDev/Oem/php/include/ext/date/php_date.h
   branches/4.0/MgDev/Oem/php/include/ext/dom/xml_common.h
   branches/4.0/MgDev/Oem/php/include/ext/gd/gd_arginfo.h
   branches/4.0/MgDev/Oem/php/include/ext/gd/php_gd.h
   branches/4.0/MgDev/Oem/php/include/ext/gmp/php_gmp_int.h
   branches/4.0/MgDev/Oem/php/include/ext/iconv/iconv_arginfo.h
   branches/4.0/MgDev/Oem/php/include/ext/iconv/php_iconv.h
   branches/4.0/MgDev/Oem/php/include/ext/json/php_json.h
   branches/4.0/MgDev/Oem/php/include/ext/json/php_json_parser.h
   branches/4.0/MgDev/Oem/php/include/ext/libxml/php_libxml.h
   branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/eaw_table.h
   branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfilter.h
   branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_consts.h
   branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_convert.h
   branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h
   branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_language.h
   branches/4.0/MgDev/Oem/php/include/ext/mbstring/mbstring.h
   branches/4.0/MgDev/Oem/php/include/ext/mbstring/php_mbregex.h
   branches/4.0/MgDev/Oem/php/include/ext/mysqli/php_mysqli_structs.h
   branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/config-win.h
   branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd.h
   branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd_charset.h
   branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd_portability.h
   branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd_structs.h
   branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2.h
   branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_internal.h
   branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_intmodedep.h
   branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_jit_neon_inc.h
   branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_jit_simd_inc.h
   branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_ucp.h
   branches/4.0/MgDev/Oem/php/include/ext/pcre/php_pcre.h
   branches/4.0/MgDev/Oem/php/include/ext/pdo/php_pdo.h
   branches/4.0/MgDev/Oem/php/include/ext/pdo/php_pdo_driver.h
   branches/4.0/MgDev/Oem/php/include/ext/session/php_session.h
   branches/4.0/MgDev/Oem/php/include/ext/sockets/php_sockets.h
   branches/4.0/MgDev/Oem/php/include/ext/sodium/php_libsodium.h
   branches/4.0/MgDev/Oem/php/include/ext/spl/spl_array.h
   branches/4.0/MgDev/Oem/php/include/ext/spl/spl_directory.h
   branches/4.0/MgDev/Oem/php/include/ext/spl/spl_dllist.h
   branches/4.0/MgDev/Oem/php/include/ext/spl/spl_functions.h
   branches/4.0/MgDev/Oem/php/include/ext/spl/spl_heap.h
   branches/4.0/MgDev/Oem/php/include/ext/spl/spl_iterators.h
   branches/4.0/MgDev/Oem/php/include/ext/spl/spl_observer.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/base64.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/basic_functions.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/basic_functions_arginfo.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/credits_ext.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/crypt_freesec.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/file.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/flock_compat.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/html.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_array.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_assert.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_crypt.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_dir.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_dns.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_ext_syslog.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_http.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_image.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_lcg.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_mail.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_math.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_mt_rand.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_password.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_rand.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_random.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_standard.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/php_string.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/proc_open.h
   branches/4.0/MgDev/Oem/php/include/ext/standard/user_filters_arginfo.h
   branches/4.0/MgDev/Oem/php/include/ext/xml/php_xml.h
   branches/4.0/MgDev/Oem/php/include/ext/xml/xml_arginfo.h
   branches/4.0/MgDev/Oem/php/include/main/SAPI.h
   branches/4.0/MgDev/Oem/php/include/main/config.w32.h
   branches/4.0/MgDev/Oem/php/include/main/php.h
   branches/4.0/MgDev/Oem/php/include/main/php_globals.h
   branches/4.0/MgDev/Oem/php/include/main/php_main.h
   branches/4.0/MgDev/Oem/php/include/main/php_network.h
   branches/4.0/MgDev/Oem/php/include/main/php_output.h
   branches/4.0/MgDev/Oem/php/include/main/php_streams.h
   branches/4.0/MgDev/Oem/php/include/main/php_ticks.h
   branches/4.0/MgDev/Oem/php/include/main/php_variables.h
   branches/4.0/MgDev/Oem/php/include/main/php_version.h
   branches/4.0/MgDev/Oem/php/include/main/rfc1867.h
   branches/4.0/MgDev/Oem/php/include/main/streams/php_stream_context.h
   branches/4.0/MgDev/Oem/php/include/main/streams/php_stream_plain_wrapper.h
   branches/4.0/MgDev/Oem/php/include/main/streams/php_streams_int.h
   branches/4.0/MgDev/Oem/php/include/win32/readdir.h
   branches/4.0/MgDev/Oem/php/lib/php8.lib
   branches/4.0/MgDev/Oem/php/lib/php_bz2.lib
   branches/4.0/MgDev/Oem/php/lib/php_com_dotnet.lib
   branches/4.0/MgDev/Oem/php/lib/php_curl.lib
   branches/4.0/MgDev/Oem/php/lib/php_dba.lib
   branches/4.0/MgDev/Oem/php/lib/php_dl_test.lib
   branches/4.0/MgDev/Oem/php/lib/php_enchant.lib
   branches/4.0/MgDev/Oem/php/lib/php_exif.lib
   branches/4.0/MgDev/Oem/php/lib/php_ffi.lib
   branches/4.0/MgDev/Oem/php/lib/php_fileinfo.lib
   branches/4.0/MgDev/Oem/php/lib/php_ftp.lib
   branches/4.0/MgDev/Oem/php/lib/php_gd.lib
   branches/4.0/MgDev/Oem/php/lib/php_gettext.lib
   branches/4.0/MgDev/Oem/php/lib/php_gmp.lib
   branches/4.0/MgDev/Oem/php/lib/php_imap.lib
   branches/4.0/MgDev/Oem/php/lib/php_intl.lib
   branches/4.0/MgDev/Oem/php/lib/php_ldap.lib
   branches/4.0/MgDev/Oem/php/lib/php_mbstring.lib
   branches/4.0/MgDev/Oem/php/lib/php_mysqli.lib
   branches/4.0/MgDev/Oem/php/lib/php_oci8_19.lib
   branches/4.0/MgDev/Oem/php/lib/php_odbc.lib
   branches/4.0/MgDev/Oem/php/lib/php_opcache.lib
   branches/4.0/MgDev/Oem/php/lib/php_openssl.lib
   branches/4.0/MgDev/Oem/php/lib/php_pdo_firebird.lib
   branches/4.0/MgDev/Oem/php/lib/php_pdo_mysql.lib
   branches/4.0/MgDev/Oem/php/lib/php_pdo_oci.lib
   branches/4.0/MgDev/Oem/php/lib/php_pdo_odbc.lib
   branches/4.0/MgDev/Oem/php/lib/php_pdo_pgsql.lib
   branches/4.0/MgDev/Oem/php/lib/php_pdo_sqlite.lib
   branches/4.0/MgDev/Oem/php/lib/php_pgsql.lib
   branches/4.0/MgDev/Oem/php/lib/php_shmop.lib
   branches/4.0/MgDev/Oem/php/lib/php_snmp.lib
   branches/4.0/MgDev/Oem/php/lib/php_soap.lib
   branches/4.0/MgDev/Oem/php/lib/php_sockets.lib
   branches/4.0/MgDev/Oem/php/lib/php_sodium.lib
   branches/4.0/MgDev/Oem/php/lib/php_sqlite3.lib
   branches/4.0/MgDev/Oem/php/lib/php_sysvshm.lib
   branches/4.0/MgDev/Oem/php/lib/php_tidy.lib
   branches/4.0/MgDev/Oem/php/lib/php_xsl.lib
   branches/4.0/MgDev/Oem/php/lib/php_zend_test.lib
   branches/4.0/MgDev/Oem/php/script/Makefile.phpize
   branches/4.0/MgDev/Oem/php/script/config.w32.phpize.in
   branches/4.0/MgDev/Oem/php/script/confutils.js
   branches/4.0/MgDev/Oem/php/script/ext_deps.js
   branches/4.0/MgDev/Oem/php/script/phpize.js
   branches/4.0/MgDev/Oem/php/script/run-tests.php
Log:
#2885: Update PHP windows dev package to 8.3.20 and re-apply patches as described in CHANGES.txt

Modified: branches/4.0/MgDev/Oem/php/PROVENANCE.TXT
===================================================================
--- branches/4.0/MgDev/Oem/php/PROVENANCE.TXT	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/PROVENANCE.TXT	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,6 +1,6 @@
-The contents of this directory originate from the PHP 8.1.11 development package SDK with key headers patched for ACE compatbility.
+The contents of this directory originate from the PHP 8.3.20 development package SDK with key headers patched for ACE compatbility.
 
-https://windows.php.net/downloads/releases/php-devel-pack-8.1.17-nts-Win32-vs16-x64.zip
-sha256: e6211c41df519f54be6488e0d71edac67d8ce7b1340dcb9ccf84bae54e955e0a
+https://windows.php.net/downloads/releases/php-devel-pack-8.3.20-nts-Win32-vs16-x64.zip
+sha256: db1ed03b76c5f7e7a2f08ca7904e3184a9f278813f510fa9869e68e2453c40e3
 
 Refer to CHANGES.TXT for details on what was patched
\ No newline at end of file

Modified: branches/4.0/MgDev/Oem/php/build/default.manifest
===================================================================
--- branches/4.0/MgDev/Oem/php/build/default.manifest	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/build/default.manifest	2025-05-05 12:41:13 UTC (rev 10139)
@@ -9,13 +9,11 @@
     </trustInfo>
     <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
-           <!-- Windows 7 -->
-           <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
            <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
-           <!-- Windows 10 -->
+           <!-- Windows 10 and Windows 11 -->
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
        </application>
    </compatibility>

Modified: branches/4.0/MgDev/Oem/php/build/gen_stub.php
===================================================================
--- branches/4.0/MgDev/Oem/php/build/gen_stub.php	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/build/gen_stub.php	2025-05-05 12:41:13 UTC (rev 10139)
@@ -4,6 +4,7 @@
 use PhpParser\Comment\Doc as DocComment;
 use PhpParser\ConstExprEvaluator;
 use PhpParser\Node;
+use PhpParser\Node\AttributeGroup;
 use PhpParser\Node\Expr;
 use PhpParser\Node\Name;
 use PhpParser\Node\Stmt;
@@ -15,7 +16,15 @@
 use PhpParser\PrettyPrinterAbstract;
 
 error_reporting(E_ALL);
+ini_set("precision", "-1");
 
+const PHP_70_VERSION_ID = 70000;
+const PHP_80_VERSION_ID = 80000;
+const PHP_81_VERSION_ID = 80100;
+const PHP_82_VERSION_ID = 80200;
+const PHP_83_VERSION_ID = 80300;
+const ALL_PHP_VERSION_IDS = [PHP_70_VERSION_ID, PHP_80_VERSION_ID, PHP_81_VERSION_ID, PHP_82_VERSION_ID, PHP_83_VERSION_ID];
+
 /**
  * @return FileInfo[]
  */
@@ -45,42 +54,84 @@
     return $fileInfos;
 }
 
-function processStubFile(string $stubFile, Context $context): ?FileInfo {
+function processStubFile(string $stubFile, Context $context, bool $includeOnly = false): ?FileInfo {
     try {
         if (!file_exists($stubFile)) {
             throw new Exception("File $stubFile does not exist");
         }
 
-        $arginfoFile = str_replace('.stub.php', '_arginfo.h', $stubFile);
-        $legacyFile = str_replace('.stub.php', '_legacy_arginfo.h', $stubFile);
+        if (!$includeOnly) {
+            $stubFilenameWithoutExtension = str_replace(".stub.php", "", $stubFile);
+            $arginfoFile = "{$stubFilenameWithoutExtension}_arginfo.h";
+            $legacyFile = "{$stubFilenameWithoutExtension}_legacy_arginfo.h";
 
-        $stubCode = file_get_contents($stubFile);
-        $stubHash = computeStubHash($stubCode);
-        $oldStubHash = extractStubHash($arginfoFile);
-        if ($stubHash === $oldStubHash && !$context->forceParse) {
-            /* Stub file did not change, do not regenerate. */
-            return null;
+            $stubCode = file_get_contents($stubFile);
+            $stubHash = computeStubHash($stubCode);
+            $oldStubHash = extractStubHash($arginfoFile);
+            if ($stubHash === $oldStubHash && !$context->forceParse) {
+                /* Stub file did not change, do not regenerate. */
+                return null;
+            }
         }
 
-        initPhpParser();
-        $fileInfo = parseStubFile($stubCode);
+        if (!$fileInfo = $context->parsedFiles[$stubFile] ?? null) {
+            initPhpParser();
+            $fileInfo = parseStubFile($stubCode ?? file_get_contents($stubFile));
+            $context->parsedFiles[$stubFile] = $fileInfo;
 
-        $arginfoCode = generateArgInfoCode($fileInfo, $stubHash);
+            foreach ($fileInfo->dependencies as $dependency) {
+                // TODO add header search path for extensions?
+                $prefixes = [dirname($stubFile) . "/", dirname(__DIR__) . "/"];
+                foreach ($prefixes as $prefix) {
+                    $depFile = $prefix . $dependency;
+                    if (file_exists($depFile)) {
+                        break;
+                    }
+                    $depFile = null;
+                }
+                if (!$depFile) {
+                    throw new Exception("File $stubFile includes a file $dependency which does not exist");
+                }
+                processStubFile($depFile, $context, true);
+            }
+
+            $constInfos = $fileInfo->getAllConstInfos();
+            $context->allConstInfos = array_merge($context->allConstInfos, $constInfos);
+        }
+
+        if ($includeOnly) {
+            return $fileInfo;
+        }
+
+        $arginfoCode = generateArgInfoCode(
+            basename($stubFilenameWithoutExtension),
+            $fileInfo,
+            $context->allConstInfos,
+            $stubHash
+        );
         if (($context->forceRegeneration || $stubHash !== $oldStubHash) && file_put_contents($arginfoFile, $arginfoCode)) {
             echo "Saved $arginfoFile\n";
         }
 
-        if ($fileInfo->generateLegacyArginfo) {
+        if ($fileInfo->generateLegacyArginfoForPhpVersionId !== null && $fileInfo->generateLegacyArginfoForPhpVersionId < PHP_80_VERSION_ID) {
             $legacyFileInfo = clone $fileInfo;
 
             foreach ($legacyFileInfo->getAllFuncInfos() as $funcInfo) {
                 $funcInfo->discardInfoForOldPhpVersions();
             }
+            foreach ($legacyFileInfo->getAllConstInfos() as $constInfo) {
+                $constInfo->discardInfoForOldPhpVersions();
+            }
             foreach ($legacyFileInfo->getAllPropertyInfos() as $propertyInfo) {
                 $propertyInfo->discardInfoForOldPhpVersions();
             }
 
-            $arginfoCode = generateArgInfoCode($legacyFileInfo, $stubHash);
+            $arginfoCode = generateArgInfoCode(
+                basename($stubFilenameWithoutExtension),
+                $legacyFileInfo,
+                $context->allConstInfos,
+                $stubHash
+            );
             if (($context->forceRegeneration || $stubHash !== $oldStubHash) && file_put_contents($legacyFile, $arginfoCode)) {
                 echo "Saved $legacyFile\n";
             }
@@ -111,19 +162,18 @@
 }
 
 class Context {
-    /** @var bool */
-    public $forceParse = false;
-    /** @var bool */
-    public $forceRegeneration = false;
+    public bool $forceParse = false;
+    public bool $forceRegeneration = false;
+    /** @var iterable<ConstInfo> */
+    public iterable $allConstInfos = [];
+    /** @var FileInfo[] */
+    public array $parsedFiles = [];
 }
 
 class ArrayType extends SimpleType {
-    /** @var Type */
-    public $keyType;
+    public Type $keyType;
+    public Type $valueType;
 
-    /** @var Type */
-    public $valueType;
-
     public static function createGenericArray(): self
     {
         return new ArrayType(Type::fromString("int|string"), Type::fromString("mixed|ref"));
@@ -160,10 +210,8 @@
 }
 
 class SimpleType {
-    /** @var string */
-    public $name;
-    /** @var bool */
-    public $isBuiltin;
+    public string $name;
+    public bool $isBuiltin;
 
     public static function fromNode(Node $node): SimpleType {
         if ($node instanceof Node\Name) {
@@ -203,7 +251,6 @@
             case "float":
             case "string":
             case "callable":
-            case "iterable":
             case "object":
             case "resource":
             case "mixed":
@@ -215,6 +262,8 @@
                 return ArrayType::createGenericArray();
             case "self":
                 throw new Exception('The exact class name must be used instead of "self"');
+            case "iterable":
+                throw new Exception('This should not happen');
         }
 
         $matches = [];
@@ -224,7 +273,7 @@
         }
 
         $matches = [];
-        $isArray = preg_match("/array\s*<\s*([A-Za-z0-9_-|]+)?(\s*,\s*)?([A-Za-z0-9_-|]+)?\s*>/i", $typeString, $matches);
+        $isArray = preg_match("/array\s*<\s*([A-Za-z0-9_|-]+)?(\s*,\s*)?([A-Za-z0-9_|-]+)?\s*>/i", $typeString, $matches);
         if ($isArray) {
             if (empty($matches[1]) || empty($matches[3])) {
                 throw new Exception("array<> type hint must have both a key and a value");
@@ -236,11 +285,66 @@
         return new SimpleType($typeString, false);
     }
 
+    /**
+     * @param mixed $value
+     */
+    public static function fromValue($value): SimpleType
+    {
+        switch (gettype($value)) {
+            case "NULL":
+                return SimpleType::null();
+            case "boolean":
+                return SimpleType::bool();
+            case "integer":
+                return SimpleType::int();
+            case "double":
+                return SimpleType::float();
+            case "string":
+                return SimpleType::string();
+            case "array":
+                return SimpleType::array();
+            case "object":
+                return SimpleType::object();
+            default:
+                throw new Exception("Type \"" . gettype($value) . "\" cannot be inferred based on value");
+        }
+    }
+
     public static function null(): SimpleType
     {
         return new SimpleType("null", true);
     }
 
+    public static function bool(): SimpleType
+    {
+        return new SimpleType("bool", true);
+    }
+
+    public static function int(): SimpleType
+    {
+        return new SimpleType("int", true);
+    }
+
+    public static function float(): SimpleType
+    {
+        return new SimpleType("float", true);
+    }
+
+    public static function string(): SimpleType
+    {
+        return new SimpleType("string", true);
+    }
+
+    public static function array(): SimpleType
+    {
+        return new SimpleType("array", true);
+    }
+
+    public static function object(): SimpleType
+    {
+        return new SimpleType("object", true);
+    }
+
     public static function void(): SimpleType
     {
         return new SimpleType("void", true);
@@ -259,6 +363,26 @@
         return $this->isBuiltin && $this->name === 'null';
     }
 
+    public function isBool(): bool {
+        return $this->isBuiltin && $this->name === 'bool';
+    }
+
+    public function isInt(): bool {
+        return $this->isBuiltin && $this->name === 'int';
+    }
+
+    public function isFloat(): bool {
+        return $this->isBuiltin && $this->name === 'float';
+    }
+
+    public function isString(): bool {
+        return $this->isBuiltin && $this->name === 'string';
+    }
+
+    public function isArray(): bool {
+        return $this->isBuiltin && $this->name === 'array';
+    }
+
     public function toTypeCode(): string {
         assert($this->isBuiltin);
         switch ($this->name) {
@@ -278,8 +402,6 @@
                 return "IS_VOID";
             case "callable":
                 return "IS_CALLABLE";
-            case "iterable":
-                return "IS_ITERABLE";
             case "mixed":
                 return "IS_MIXED";
             case "static":
@@ -286,6 +408,12 @@
                 return "IS_STATIC";
             case "never":
                 return "IS_NEVER";
+            case "null":
+                return "IS_NULL";
+            case "false":
+                return "IS_FALSE";
+            case "true":
+                return "IS_TRUE";
             default:
                 throw new Exception("Not implemented: $this->name");
         }
@@ -299,6 +427,8 @@
                 return "MAY_BE_NULL";
             case "false":
                 return "MAY_BE_FALSE";
+            case "true":
+                return "MAY_BE_TRUE";
             case "bool":
                 return "MAY_BE_BOOL";
             case "int":
@@ -313,8 +443,6 @@
                 return "MAY_BE_OBJECT";
             case "callable":
                 return "MAY_BE_CALLABLE";
-            case "iterable":
-                return "MAY_BE_ITERABLE";
             case "mixed":
                 return "MAY_BE_ANY";
             case "void":
@@ -351,6 +479,8 @@
                 return "MAY_BE_ARRAY_OF_NULL";
             case "false":
                 return "MAY_BE_ARRAY_OF_FALSE";
+            case "true":
+                return "MAY_BE_ARRAY_OF_TRUE";
             case "bool":
                 return "MAY_BE_ARRAY_OF_FALSE|MAY_BE_ARRAY_OF_TRUE";
             case "int":
@@ -380,8 +510,6 @@
         }
 
         switch ($this->name) {
-            case "true":
-                return "MAY_BE_TRUE";
             case "resource":
                 return "MAY_BE_RESOURCE";
             case "callable":
@@ -396,11 +524,15 @@
     }
 
     public function toEscapedName(): string {
-        return str_replace('\\', '\\\\', $this->name);
+        // Escape backslashes, and also encode \u, \U, and \N to avoid compilation errors in generated macros
+        return str_replace(
+            ['\\', '\\u', '\\U', '\\N'],
+            ['\\\\', '\\\\165', '\\\\125', '\\\\116'],
+            $this->name
+        );
     }
 
     public function toVarEscapedName(): string {
-        $name = str_replace('_', '__', $this->name);
         return str_replace('\\', '_', $this->name);
     }
 
@@ -411,23 +543,40 @@
 
 class Type {
     /** @var SimpleType[] */
-    public $types;
+    public array $types;
+    public bool $isIntersection;
 
     public static function fromNode(Node $node): Type {
-        if ($node instanceof Node\UnionType) {
-            return new Type(array_map(['SimpleType', 'fromNode'], $node->types));
+        if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) {
+            $nestedTypeObjects = array_map(['Type', 'fromNode'], $node->types);
+            $types = [];
+            foreach ($nestedTypeObjects as $typeObject) {
+                array_push($types, ...$typeObject->types);
+            }
+            return new Type($types, ($node instanceof Node\IntersectionType));
         }
 
         if ($node instanceof Node\NullableType) {
             return new Type(
                 [
-                    SimpleType::fromNode($node->type),
+                    ...Type::fromNode($node->type)->types,
                     SimpleType::null(),
-                ]
+                ],
+                false
             );
         }
 
-        return new Type([SimpleType::fromNode($node)]);
+        if ($node instanceof Node\Identifier && $node->toLowerString() === "iterable") {
+            return new Type(
+                [
+                    SimpleType::fromString("Traversable"),
+                    ArrayType::createGenericArray(),
+                ],
+                false
+            );
+        }
+
+        return new Type([SimpleType::fromNode($node)], false);
     }
 
     public static function fromString(string $typeString): self {
@@ -435,6 +584,7 @@
         $simpleTypes = [];
         $simpleTypeOffset = 0;
         $inArray = false;
+        $isIntersection = false;
 
         $typeStringLength = strlen($typeString);
         for ($i = 0; $i < $typeStringLength; $i++) {
@@ -454,7 +604,8 @@
                 continue;
             }
 
-            if ($char === "|") {
+            if ($char === "|" || $char === "&") {
+                $isIntersection = ($char === "&");
                 $simpleTypeName = trim(substr($typeString, $simpleTypeOffset, $i - $simpleTypeOffset));
 
                 $simpleTypes[] = SimpleType::fromString($simpleTypeName);
@@ -463,14 +614,15 @@
             }
         }
 
-        return new Type($simpleTypes);
+        return new Type($simpleTypes, $isIntersection);
     }
 
     /**
      * @param SimpleType[] $types
      */
-    private function __construct(array $types) {
+    private function __construct(array $types, bool $isIntersection) {
         $this->types = $types;
+        $this->isIntersection = $isIntersection;
     }
 
     public function isScalar(): bool {
@@ -495,17 +647,24 @@
 
     public function getWithoutNull(): Type {
         return new Type(
-            array_filter(
-                $this->types,
-                function(SimpleType $type) {
-                    return !$type->isNull();
-                }
-            )
+            array_values(
+                array_filter(
+                    $this->types,
+                    function(SimpleType $type) {
+                        return !$type->isNull();
+                    }
+                )
+            ),
+            false
         );
     }
 
     public function tryToSimpleType(): ?SimpleType {
         $withoutNull = $this->getWithoutNull();
+        /* type has only null */
+        if (count($withoutNull->types) === 0) {
+            return $this->types[0];
+        }
         if (count($withoutNull->types) === 1) {
             return $withoutNull->types[0];
         }
@@ -529,6 +688,7 @@
         $optimizerTypes = [];
 
         foreach ($this->types as $type) {
+            // TODO Support for toOptimizerMask for intersection
             $optimizerTypes[] = $type->toOptimizerTypeMask();
         }
 
@@ -557,8 +717,9 @@
 
     public function getTypeForDoc(DOMDocument $doc): DOMElement {
         if (count($this->types) > 1) {
+            $typeSort = $this->isIntersection ? "intersection" : "union";
             $typeElement = $doc->createElement('type');
-            $typeElement->setAttribute("class", "union");
+            $typeElement->setAttribute("class", $typeSort);
 
             foreach ($this->types as $type) {
                 $unionTypeElement = $doc->createElement('type', $type->name);
@@ -566,11 +727,7 @@
             }
         } else {
             $type = $this->types[0];
-            if ($type->isBuiltin && strtolower($type->name) === "true") {
-                $name = "bool";
-            } else {
-                $name = $type->name;
-            }
+            $name = $type->name;
 
             $typeElement = $doc->createElement('type', $name);
         }
@@ -601,7 +758,8 @@
             return 'mixed';
         }
 
-        return implode('|', array_map(
+        $char = $this->isIntersection ? '&' : '|';
+        return implode($char, array_map(
             function ($type) { return $type->name; },
             $this->types)
         );
@@ -610,10 +768,9 @@
 
 class ArginfoType {
     /** @var SimpleType[] $classTypes */
-    public $classTypes;
-
+    public array $classTypes;
     /** @var SimpleType[] $builtinTypes */
-    private $builtinTypes;
+    private array $builtinTypes;
 
     /**
      * @param SimpleType[] $classTypes
@@ -649,25 +806,33 @@
     const SEND_BY_REF = 1;
     const SEND_PREFER_REF = 2;
 
-    /** @var string */
-    public $name;
-    /** @var int */
-    public $sendBy;
-    /** @var bool */
-    public $isVariadic;
-    /** @var Type|null */
-    public $type;
-    /** @var Type|null */
-    public $phpDocType;
-    /** @var string|null */
-    public $defaultValue;
+    public string $name;
+    public int $sendBy;
+    public bool $isVariadic;
+    public ?Type $type;
+    public ?Type $phpDocType;
+    public ?string $defaultValue;
+    /** @var AttributeInfo[] */
+    public array $attributes;
 
-    public function __construct(string $name, int $sendBy, bool $isVariadic, ?Type $type, ?Type $phpDocType, ?string $defaultValue) {
+    /**
+     * @param AttributeInfo[] $attributes
+     */
+    public function __construct(
+        string $name,
+        int $sendBy,
+        bool $isVariadic,
+        ?Type $type,
+        ?Type $phpDocType,
+        ?string $defaultValue,
+        array $attributes
+    ) {
         $this->name = $name;
         $this->sendBy = $sendBy;
         $this->isVariadic = $isVariadic;
         $this->setTypes($type, $phpDocType);
         $this->defaultValue = $defaultValue;
+        $this->attributes = $attributes;
     }
 
     public function equals(ArgInfo $other): bool {
@@ -733,21 +898,101 @@
 
     private function setTypes(?Type $type, ?Type $phpDocType): void
     {
-        if ($phpDocType !== null && Type::equals($type, $phpDocType)) {
-            throw new Exception('PHPDoc param type "' . $phpDocType->__toString() . '" is unnecessary');
-        }
-
         $this->type = $type;
         $this->phpDocType = $phpDocType;
     }
 }
 
-class PropertyName {
-    /** @var Name */
-    public $class;
-    /** @var string */
-    public $property;
+interface VariableLikeName {
+    public function __toString(): string;
+    public function getDeclarationName(): string;
+}
 
+interface ConstOrClassConstName extends VariableLikeName {
+    public function equals(ConstOrClassConstName $const): bool;
+    public function isClassConst(): bool;
+    public function isUnknown(): bool;
+}
+
+abstract class AbstractConstName implements ConstOrClassConstName
+{
+    public function equals(ConstOrClassConstName $const): bool
+    {
+        return $this->__toString() === $const->__toString();
+    }
+
+    public function isUnknown(): bool
+    {
+        return strtolower($this->__toString()) === "unknown";
+    }
+}
+
+class ConstName extends AbstractConstName {
+    public string $const;
+
+    public function __construct(?Name $namespace, string $const)
+    {
+        if ($namespace && ($namespace = $namespace->slice(0, -1))) {
+            $const = $namespace->toString() . '\\' . $const;
+        }
+        $this->const = $const;
+    }
+
+    public function isClassConst(): bool
+    {
+        return false;
+    }
+
+    public function isUnknown(): bool
+    {
+        $name = $this->__toString();
+        if (($pos = strrpos($name, '\\')) !== false) {
+            $name = substr($name, $pos + 1);
+        }
+        return strtolower($name) === "unknown";
+    }
+
+    public function __toString(): string
+    {
+        return $this->const;
+    }
+
+    public function getDeclarationName(): string
+    {
+        return $this->name->toString();
+    }
+}
+
+class ClassConstName extends AbstractConstName {
+    public Name $class;
+    public string $const;
+
+    public function __construct(Name $class, string $const)
+    {
+        $this->class = $class;
+        $this->const = $const;
+    }
+
+    public function isClassConst(): bool
+    {
+        return true;
+    }
+
+    public function __toString(): string
+    {
+        return $this->class->toString() . "::" . $this->const;
+    }
+
+    public function getDeclarationName(): string
+    {
+        return $this->const;
+    }
+}
+
+class PropertyName implements VariableLikeName {
+    public Name $class;
+    public string $property;
+
     public function __construct(Name $class, string $property)
     {
         $this->class = $class;
@@ -754,10 +999,15 @@
         $this->property = $property;
     }
 
-    public function __toString()
+    public function __toString(): string
     {
         return $this->class->toString() . "::$" . $this->property;
     }
+
+    public function getDeclarationName(): string
+    {
+         return $this->property;
+    }
 }
 
 interface FunctionOrMethodName {
@@ -764,6 +1014,7 @@
     public function getDeclaration(): string;
     public function getArgInfoName(): string;
     public function getMethodSynopsisFilename(): string;
+    public function getNameForAttributes(): string;
     public function __toString(): string;
     public function isMethod(): bool;
     public function isConstructor(): bool;
@@ -771,8 +1022,7 @@
 }
 
 class FunctionName implements FunctionOrMethodName {
-    /** @var Name */
-    private $name;
+    private Name $name;
 
     public function __construct(Name $name) {
         $this->name = $name;
@@ -793,6 +1043,10 @@
     }
 
     public function getDeclarationName(): string {
+        return implode('_', $this->name->getParts());
+    }
+
+    public function getFunctionName(): string {
         return $this->name->getLast();
     }
 
@@ -801,14 +1055,18 @@
     }
 
     public function getArgInfoName(): string {
-        $underscoreName = implode('_', $this->name->parts);
+        $underscoreName = implode('_', $this->name->getParts());
         return "arginfo_$underscoreName";
     }
 
     public function getMethodSynopsisFilename(): string {
-        return implode('_', $this->name->parts);
+        return implode('_', $this->name->getParts());
     }
 
+    public function getNameForAttributes(): string {
+        return strtolower($this->name->toString());
+    }
+
     public function __toString(): string {
         return $this->name->toString();
     }
@@ -827,10 +1085,8 @@
 }
 
 class MethodName implements FunctionOrMethodName {
-    /** @var Name */
-    private $className;
-    /** @var string */
-    public $methodName;
+    public Name $className;
+    public string $methodName;
 
     public function __construct(Name $className, string $methodName) {
         $this->className = $className;
@@ -838,7 +1094,7 @@
     }
 
     public function getDeclarationClassName(): string {
-        return implode('_', $this->className->parts);
+        return implode('_', $this->className->getParts());
     }
 
     public function getDeclaration(): string {
@@ -853,6 +1109,10 @@
         return $this->getDeclarationClassName() . "_{$this->methodName}";
     }
 
+    public function getNameForAttributes(): string {
+        return strtolower($this->methodName);
+    }
+
     public function __toString(): string {
         return "$this->className::$this->methodName";
     }
@@ -881,16 +1141,11 @@
         self::REFCOUNT_N,
     ];
 
-    /** @var bool */
-    public $byRef;
-    /** @var Type|null */
-    public $type;
-    /** @var Type|null */
-    public $phpDocType;
-    /** @var bool */
-    public $tentativeReturnType;
-    /** @var string */
-    public $refcount;
+    public bool $byRef;
+    public ?Type $type;
+    public ?Type $phpDocType;
+    public bool $tentativeReturnType;
+    public string $refcount;
 
     public function __construct(bool $byRef, ?Type $type, ?Type $phpDocType, bool $tentativeReturnType, ?string $refcount) {
         $this->byRef = $byRef;
@@ -910,10 +1165,6 @@
 
     private function setTypes(?Type $type, ?Type $phpDocType, bool $tentativeReturnType): void
     {
-        if ($phpDocType !== null && Type::equals($type, $phpDocType)) {
-            throw new Exception('PHPDoc return type "' . $phpDocType->__toString() . '" is unnecessary');
-        }
-
         $this->type = $type;
         $this->phpDocType = $phpDocType;
         $this->tentativeReturnType = $tentativeReturnType;
@@ -946,30 +1197,25 @@
 }
 
 class FuncInfo {
-    /** @var FunctionOrMethodName */
-    public $name;
-    /** @var int */
-    public $classFlags;
-    /** @var int */
-    public $flags;
-    /** @var string|null */
-    public $aliasType;
-    /** @var FunctionName|null */
-    public $alias;
-    /** @var bool */
-    public $isDeprecated;
-    /** @var bool */
-    public $verify;
+    public FunctionOrMethodName $name;
+    public int $classFlags;
+    public int $flags;
+    public ?string $aliasType;
+    public ?FunctionOrMethodName $alias;
+    public bool $isDeprecated;
+    public bool $supportsCompileTimeEval;
+    public bool $verify;
     /** @var ArgInfo[] */
-    public $args;
-    /** @var ReturnInfo */
-    public $return;
-    /** @var int */
-    public $numRequiredArgs;
-    /** @var string|null */
-    public $cond;
+    public array $args;
+    public ReturnInfo $return;
+    public int $numRequiredArgs;
+    public ?string $cond;
+    public bool $isUndocumentable;
+    /** @var AttributeInfo[] */
+    public array $attributes;
 
     /**
+     * @param AttributeInfo[] $attributes
      * @param ArgInfo[] $args
      */
     public function __construct(
@@ -979,11 +1225,14 @@
         ?string $aliasType,
         ?FunctionOrMethodName $alias,
         bool $isDeprecated,
+        bool $supportsCompileTimeEval,
         bool $verify,
         array $args,
         ReturnInfo $return,
         int $numRequiredArgs,
-        ?string $cond
+        ?string $cond,
+        bool $isUndocumentable,
+        array $attributes
     ) {
         $this->name = $name;
         $this->classFlags = $classFlags;
@@ -991,11 +1240,14 @@
         $this->aliasType = $aliasType;
         $this->alias = $alias;
         $this->isDeprecated = $isDeprecated;
+        $this->supportsCompileTimeEval = $supportsCompileTimeEval;
         $this->verify = $verify;
         $this->args = $args;
         $this->return = $return;
         $this->numRequiredArgs = $numRequiredArgs;
         $this->cond = $cond;
+        $this->isUndocumentable = $isUndocumentable;
+        $this->attributes = $attributes;
     }
 
     public function isMethod(): bool
@@ -1128,35 +1380,42 @@
             }
         } else if ($this->name instanceof FunctionName) {
             $namespace = $this->name->getNamespace();
-            $declarationName = $this->name->getDeclarationName();
+            $functionName = $this->name->getFunctionName();
+            $declarationName = $this->alias ? $this->alias->getNonNamespacedName() : $this->name->getDeclarationName();
 
-            if ($this->alias && $this->isDeprecated) {
+            if ($namespace) {
+                // Namespaced functions are always declared as aliases to avoid name conflicts when two functions with
+                // the same name exist in separate namespaces
+                $macro = $this->isDeprecated ? 'ZEND_NS_DEP_FALIAS' : 'ZEND_NS_FALIAS';
+
+                // Render A\B as "A\\B" in C strings for namespaces
                 return sprintf(
-                    "\tZEND_DEP_FALIAS(%s, %s, %s)\n",
-                    $declarationName, $this->alias->getNonNamespacedName(), $this->getArgInfoName()
+                    "\t%s(\"%s\", %s, %s, %s)\n",
+                    $macro, addslashes($namespace), $this->name->getFunctionName(), $declarationName, $this->getArgInfoName()
                 );
             }
 
             if ($this->alias) {
+                $macro = $this->isDeprecated ? 'ZEND_DEP_FALIAS' : 'ZEND_FALIAS';
+
                 return sprintf(
-                    "\tZEND_FALIAS(%s, %s, %s)\n",
-                    $declarationName, $this->alias->getNonNamespacedName(), $this->getArgInfoName()
+                    "\t%s(%s, %s, %s)\n",
+                    $macro, $functionName, $declarationName, $this->getArgInfoName()
                 );
             }
 
-            if ($this->isDeprecated) {
-                return sprintf(
-                    "\tZEND_DEP_FE(%s, %s)\n", $declarationName, $this->getArgInfoName());
+            switch (true) {
+                case $this->isDeprecated:
+                    $macro = 'ZEND_DEP_FE';
+                    break;
+                case $this->supportsCompileTimeEval:
+                    $macro = 'ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE';
+                    break;
+                default:
+                    $macro = 'ZEND_FE';
             }
 
-            if ($namespace) {
-                // Render A\B as "A\\B" in C strings for namespaces
-                return sprintf(
-                    "\tZEND_NS_FE(\"%s\", %s, %s)\n",
-                    addslashes($namespace), $declarationName, $this->getArgInfoName());
-            } else {
-                return sprintf("\tZEND_FE(%s, %s)\n", $declarationName, $this->getArgInfoName());
-            }
+            return sprintf("\t%s(%s, %s)\n", $macro, $functionName, $this->getArgInfoName());
         } else {
             throw new Error("Cannot happen");
         }
@@ -1180,14 +1439,16 @@
             return null;
         }
 
-        return "    F" . $this->return->refcount . '("' . $this->name->__toString() . '", ' . $type->toOptimizerTypeMask() . "),\n";
+        return "\tF" . $this->return->refcount . '("' . $this->name->__toString() . '", ' . $type->toOptimizerTypeMask() . "),\n";
     }
 
     public function discardInfoForOldPhpVersions(): void {
+        $this->attributes = [];
         $this->return->type = null;
         foreach ($this->args as $arg) {
             $arg->type = null;
             $arg->defaultValue = null;
+            $arg->attributes = [];
         }
     }
 
@@ -1258,14 +1519,10 @@
 
         $methodSynopsis = $doc->createElement($synopsisType);
 
-        $aliasedFunc = $this->aliasType === "alias" && isset($funcMap[$this->alias->__toString()]) ? $funcMap[$this->alias->__toString()] : null;
-        $aliasFunc = $aliasMap[$this->name->__toString()] ?? null;
-
-        if (($this->aliasType === "alias" && $aliasedFunc !== null && $aliasedFunc->isMethod() !== $this->isMethod()) ||
-            ($aliasFunc !== null && $aliasFunc->isMethod() !== $this->isMethod())
-        ) {
+        if ($this->isMethod()) {
+            assert($this->name instanceof MethodName);
             $role = $doc->createAttribute("role");
-            $role->value = $this->isMethod() ? "oop" : "procedural";
+            $role->value = addslashes($this->name->className->__toString());
             $methodSynopsis->appendChild($role);
         }
 
@@ -1336,112 +1593,268 @@
     }
 }
 
-function initializeZval(string $zvalName, $value): string
+class EvaluatedValue
 {
-    $code = "\tzval $zvalName;\n";
+    /** @var mixed */
+    public $value;
+    public SimpleType $type;
+    public Expr $expr;
+    public bool $isUnknownConstValue;
+    /** @var ConstInfo[] */
+    public array $originatingConsts;
 
-    switch (gettype($value)) {
-        case "NULL":
-            $code .= "\tZVAL_NULL(&$zvalName);\n";
-            break;
+    /**
+     * @param iterable<ConstInfo> $allConstInfos
+     */
+    public static function createFromExpression(Expr $expr, ?SimpleType $constType, ?string $cConstName, iterable $allConstInfos): EvaluatedValue
+    {
+        // This visitor replaces the PHP constants by C constants. It allows direct expansion of the compiled constants, e.g. later in the pretty printer.
+        $visitor = new class($allConstInfos) extends PhpParser\NodeVisitorAbstract
+        {
+            /** @var iterable<ConstInfo> */
+            public array $visitedConstants = [];
+            /** @var iterable<ConstInfo> */
+            public iterable $allConstInfos;
 
-        case "boolean":
-            $code .= "\tZVAL_BOOL(&$zvalName, " . ((int) $value) . ");\n";
-            break;
+            /** @param iterable<ConstInfo> $allConstInfos */
+            public function __construct(iterable $allConstInfos)
+            {
+                $this->allConstInfos = $allConstInfos;
+            }
 
-        case "integer":
-            $code .= "\tZVAL_LONG(&$zvalName, $value);\n";
-            break;
+            /** @return Node|null */
+            public function enterNode(Node $expr)
+            {
+                if (!$expr instanceof Expr\ConstFetch && !$expr instanceof Expr\ClassConstFetch) {
+                    return null;
+                }
 
-        case "double":
-            $code .= "\tZVAL_DOUBLE(&$zvalName, $value);\n";
-            break;
+                if ($expr instanceof Expr\ClassConstFetch) {
+                    $originatingConstName = new ClassConstName($expr->class, $expr->name->toString());
+                } else {
+                    $originatingConstName = new ConstName($expr->name->getAttribute('namespacedName'), $expr->name->toString());
+                }
 
-        case "string":
-            if ($value === "") {
+                if ($originatingConstName->isUnknown()) {
+                    return null;
+                }
+
+                foreach ($this->allConstInfos as $const) {
+                    if ($originatingConstName->equals($const->name)) {
+                        $this->visitedConstants[] = $const;
+                        return $const->getValue($this->allConstInfos)->expr;
+                    }
+                }
+            }
+        };
+
+        $nodeTraverser = new PhpParser\NodeTraverser;
+        $nodeTraverser->addVisitor($visitor);
+        $expr = $nodeTraverser->traverse([$expr])[0];
+
+        $isUnknownConstValue = false;
+
+        $evaluator = new ConstExprEvaluator(
+            static function (Expr $expr) use ($allConstInfos, &$isUnknownConstValue) {
+                // $expr is a ConstFetch with a name of a C macro here
+                if (!$expr instanceof Expr\ConstFetch) {
+                    throw new Exception($this->getVariableTypeName() . " " . $this->name->__toString() . " has an unsupported value");
+                }
+
+                $constName = $expr->name->__toString();
+                if (strtolower($constName) === "unknown") {
+                    $isUnknownConstValue = true;
+                    return null;
+                }
+
+                foreach ($allConstInfos as $const) {
+                    if ($constName != $const->cValue) {
+                        continue;
+                    }
+
+                    $constType = ($const->phpDocType ?? $const->type)->tryToSimpleType();
+                    if ($constType) {
+                        if ($constType->isBool()) {
+                            return true;
+                        } elseif ($constType->isInt()) {
+                            return 1;
+                        } elseif ($constType->isFloat()) {
+                            return M_PI;
+                        } elseif ($constType->isString()) {
+                            return $const->name;
+                        } elseif ($constType->isArray()) {
+                            return [];
+                        }
+                    }
+
+                    return null;
+                }
+
+                throw new Exception("Constant " . $constName . " cannot be found");
+            }
+        );
+
+        $result = $evaluator->evaluateDirectly($expr);
+
+        return new EvaluatedValue(
+            $result, // note: we are generally not interested in the actual value of $result, unless it's a bare value, without constants
+            $constType ?? SimpleType::fromValue($result),
+            $cConstName === null ? $expr : new Expr\ConstFetch(new Node\Name($cConstName)),
+            $visitor->visitedConstants,
+            $isUnknownConstValue
+        );
+    }
+
+    public static function null(): EvaluatedValue
+    {
+        return new self(null, SimpleType::null(), new Expr\ConstFetch(new Node\Name('null')), [], false);
+    }
+
+    /**
+     * @param mixed $value
+     * @param ConstInfo[] $originatingConsts
+     */
+    private function __construct($value, SimpleType $type, Expr $expr, array $originatingConsts, bool $isUnknownConstValue)
+    {
+        $this->value = $value;
+        $this->type = $type;
+        $this->expr = $expr;
+        $this->originatingConsts = $originatingConsts;
+        $this->isUnknownConstValue = $isUnknownConstValue;
+    }
+
+    public function initializeZval(string $zvalName): string
+    {
+        $cExpr = $this->getCExpr();
+
+        $code = "\tzval $zvalName;\n";
+
+        if ($this->type->isNull()) {
+            $code .= "\tZVAL_NULL(&$zvalName);\n";
+        } elseif ($this->type->isBool()) {
+            if ($cExpr == 'true') {
+                $code .= "\tZVAL_TRUE(&$zvalName);\n";
+            } elseif ($cExpr == 'false') {
+                $code .= "\tZVAL_FALSE(&$zvalName);\n";
+            } else {
+                $code .= "\tZVAL_BOOL(&$zvalName, $cExpr);\n";
+            }
+        } elseif ($this->type->isInt()) {
+            $code .= "\tZVAL_LONG(&$zvalName, $cExpr);\n";
+        } elseif ($this->type->isFloat()) {
+            $code .= "\tZVAL_DOUBLE(&$zvalName, $cExpr);\n";
+        } elseif ($this->type->isString()) {
+            if ($cExpr === '""') {
                 $code .= "\tZVAL_EMPTY_STRING(&$zvalName);\n";
             } else {
-                $strValue = addslashes($value);
-                $code .= "\tzend_string *{$zvalName}_str = zend_string_init(\"$strValue\", sizeof(\"$strValue\") - 1, 1);\n";
+                $code .= "\tzend_string *{$zvalName}_str = zend_string_init($cExpr, strlen($cExpr), 1);\n";
                 $code .= "\tZVAL_STR(&$zvalName, {$zvalName}_str);\n";
             }
-            break;
-
-        case "array":
-            if (empty($value)) {
+        } elseif ($this->type->isArray()) {
+            if ($cExpr == '[]') {
                 $code .= "\tZVAL_EMPTY_ARRAY(&$zvalName);\n";
             } else {
                 throw new Exception("Unimplemented default value");
             }
-            break;
+        } else {
+            throw new Exception("Invalid default value: " . print_r($this->value, true) . ", type: " . print_r($this->type, true));
+        }
 
-        default:
-            throw new Exception("Invalid default value");
+        return $code;
     }
 
-    return $code;
+    public function getCExpr(): ?string
+    {
+        // $this->expr has all its PHP constants replaced by C constants
+        $prettyPrinter = new Standard;
+        $expr = $prettyPrinter->prettyPrintExpr($this->expr);
+        // PHP single-quote to C double-quote string
+        if ($this->type->isString()) {
+            $expr = preg_replace("/(^'|'$)/", '"', $expr);
+        }
+        return $expr[0] == '"' ? $expr : preg_replace('(\bnull\b)', 'NULL', str_replace('\\', '', $expr));
+    }
 }
 
-class PropertyInfo
+abstract class VariableLike
 {
-    /** @var PropertyName */
-    public $name;
-    /** @var int */
-    public $flags;
-    /** @var Type|null */
-    public $type;
-    /** @var Type|null */
-    public $phpDocType;
-    /** @var Expr|null */
-    public $defaultValue;
-    /** @var string|null */
-    public $defaultValueString;
-    /** @var bool */
-    public $isDocReadonly;
-    /** @var string|null */
-    public $link;
+    public int $flags;
+    public ?Type $type;
+    public ?Type $phpDocType;
+    public ?string $link;
+    public ?int $phpVersionIdMinimumCompatibility;
+    /** @var AttributeInfo[] */
+    public array $attributes;
 
+    /**
+     * @var AttributeInfo[] $attributes
+     */
     public function __construct(
-        PropertyName $name,
         int $flags,
         ?Type $type,
         ?Type $phpDocType,
-        ?Expr $defaultValue,
-        ?string $defaultValueString,
-        bool $isDocReadonly,
-        ?string $link
+        ?string $link,
+        ?int $phpVersionIdMinimumCompatibility,
+        array $attributes
     ) {
-        $this->name = $name;
         $this->flags = $flags;
         $this->type = $type;
         $this->phpDocType = $phpDocType;
-        $this->defaultValue = $defaultValue;
-        $this->defaultValueString = $defaultValueString;
-        $this->isDocReadonly = $isDocReadonly;
         $this->link = $link;
+        $this->phpVersionIdMinimumCompatibility = $phpVersionIdMinimumCompatibility;
+        $this->attributes = $attributes;
     }
 
-    public function discardInfoForOldPhpVersions(): void {
-        $this->type = null;
-    }
+    abstract protected function getVariableTypeCode(): string;
 
-    public function getDeclaration(): string {
-        $code = "\n";
+    abstract protected function getVariableTypeName(): string;
 
-        $propertyName = $this->name->property;
+    abstract protected function getFieldSynopsisDefaultLinkend(): string;
 
-        $defaultValueConstant = false;
-        if ($this->defaultValue === null) {
-            $defaultValue = null;
-        } else {
-            $defaultValue = $this->evaluateDefaultValue($defaultValueConstant);
+    abstract protected function getFieldSynopsisName(): string;
+
+    /**
+     * @param iterable<ConstInfo> $allConstInfos
+     */
+    abstract protected function getFieldSynopsisValueString(iterable $allConstInfos): ?string;
+
+    abstract public function discardInfoForOldPhpVersions(): void;
+
+    protected function addTypeToFieldSynopsis(DOMDocument $doc, DOMElement $fieldsynopsisElement): void
+    {
+        $type = $this->phpDocType ?? $this->type;
+
+        if ($type) {
+            $fieldsynopsisElement->appendChild(new DOMText("\n     "));
+            $fieldsynopsisElement->appendChild($type->getTypeForDoc($doc));
         }
+    }
 
-        if ($defaultValueConstant) {
-            echo "Skipping code generation for property $this->name, because it has a constant default value\n";
-            return "";
+    /**
+     * @return array<int, string[]>
+     */
+    protected function getFlagsByPhpVersion(): array
+    {
+        $flags = "ZEND_ACC_PUBLIC";
+        if ($this->flags & Class_::MODIFIER_PROTECTED) {
+            $flags = "ZEND_ACC_PROTECTED";
+        } elseif ($this->flags & Class_::MODIFIER_PRIVATE) {
+            $flags = "ZEND_ACC_PRIVATE";
         }
 
+        return [
+            PHP_70_VERSION_ID => [$flags],
+            PHP_80_VERSION_ID => [$flags],
+            PHP_81_VERSION_ID => [$flags],
+            PHP_82_VERSION_ID => [$flags],
+            PHP_83_VERSION_ID => [$flags],
+        ];
+    }
+
+    protected function getTypeCode(string $variableLikeName, string &$code): string
+    {
+        $variableLikeType = $this->getVariableTypeName();
+
         $typeCode = "";
         if ($this->type) {
             $arginfoType = $this->type->toArginfoType();
@@ -1450,78 +1863,78 @@
                     foreach ($arginfoType->classTypes as $classType) {
                         $escapedClassName = $classType->toEscapedName();
                         $varEscapedClassName = $classType->toVarEscapedName();
-                        $code .= "\tzend_string *property_{$propertyName}_class_{$varEscapedClassName} = zend_string_init(\"{$escapedClassName}\", sizeof(\"{$escapedClassName}\") - 1, 1);\n";
+                        $code .= "\tzend_string *{$variableLikeType}_{$variableLikeName}_class_{$varEscapedClassName} = zend_string_init(\"{$escapedClassName}\", sizeof(\"{$escapedClassName}\") - 1, 1);\n";
                     }
 
                     $classTypeCount = count($arginfoType->classTypes);
-                    $code .= "\tzend_type_list *property_{$propertyName}_type_list = malloc(ZEND_TYPE_LIST_SIZE($classTypeCount));\n";
-                    $code .= "\tproperty_{$propertyName}_type_list->num_types = $classTypeCount;\n";
+                    $code .= "\tzend_type_list *{$variableLikeType}_{$variableLikeName}_type_list = malloc(ZEND_TYPE_LIST_SIZE($classTypeCount));\n";
+                    $code .= "\t{$variableLikeType}_{$variableLikeName}_type_list->num_types = $classTypeCount;\n";
 
                     foreach ($arginfoType->classTypes as $k => $classType) {
                         $escapedClassName = $classType->toEscapedName();
-                        $code .= "\tproperty_{$propertyName}_type_list->types[$k] = (zend_type) ZEND_TYPE_INIT_CLASS(property_{$propertyName}_class_{$escapedClassName}, 0, 0);\n";
+                        $code .= "\t{$variableLikeType}_{$variableLikeName}_type_list->types[$k] = (zend_type) ZEND_TYPE_INIT_CLASS({$variableLikeType}_{$variableLikeName}_class_{$escapedClassName}, 0, 0);\n";
                     }
 
                     $typeMaskCode = $this->type->toArginfoType()->toTypeMask();
 
-                    $code .= "\tzend_type property_{$propertyName}_type = ZEND_TYPE_INIT_UNION(property_{$propertyName}_type_list, $typeMaskCode);\n";
-                    $typeCode = "property_{$propertyName}_type";
+                    if ($this->type->isIntersection) {
+                        $code .= "\tzend_type {$variableLikeType}_{$variableLikeName}_type = ZEND_TYPE_INIT_INTERSECTION({$variableLikeType}_{$variableLikeName}_type_list, $typeMaskCode);\n";
+                    } else {
+                        $code .= "\tzend_type {$variableLikeType}_{$variableLikeName}_type = ZEND_TYPE_INIT_UNION({$variableLikeType}_{$variableLikeName}_type_list, $typeMaskCode);\n";
+                    }
+                    $typeCode = "{$variableLikeType}_{$variableLikeName}_type";
                 } else {
                     $escapedClassName = $arginfoType->classTypes[0]->toEscapedName();
                     $varEscapedClassName = $arginfoType->classTypes[0]->toVarEscapedName();
-                    $code .= "\tzend_string *property_{$propertyName}_class_{$varEscapedClassName} = zend_string_init(\"{$escapedClassName}\", sizeof(\"${escapedClassName}\")-1, 1);\n";
+                    $code .= "\tzend_string *{$variableLikeType}_{$variableLikeName}_class_{$varEscapedClassName} = zend_string_init(\"{$escapedClassName}\", sizeof(\"{$escapedClassName}\")-1, 1);\n";
 
-                    $typeCode = "(zend_type) ZEND_TYPE_INIT_CLASS(property_{$propertyName}_class_{$varEscapedClassName}, 0, " . $arginfoType->toTypeMask() . ")";
+                    $typeCode = "(zend_type) ZEND_TYPE_INIT_CLASS({$variableLikeType}_{$variableLikeName}_class_{$varEscapedClassName}, 0, " . $arginfoType->toTypeMask() . ")";
                 }
             } else {
                 $typeCode = "(zend_type) ZEND_TYPE_INIT_MASK(" . $arginfoType->toTypeMask() . ")";
             }
-        }
-
-        $zvalName = "property_{$this->name->property}_default_value";
-        if ($this->defaultValue === null && $this->type !== null) {
-            $code .= "\tzval $zvalName;\n\tZVAL_UNDEF(&$zvalName);\n";
         } else {
-            $code .= initializeZval($zvalName, $defaultValue);
+            $typeCode = "(zend_type) ZEND_TYPE_INIT_NONE(0)";
         }
 
-        $code .= "\tzend_string *property_{$propertyName}_name = zend_string_init(\"$propertyName\", sizeof(\"$propertyName\") - 1, 1);\n";
-        $nameCode = "property_{$propertyName}_name";
+        return $typeCode;
+    }
 
-        if ($this->type !== null) {
-            $code .= "\tzend_declare_typed_property(class_entry, $nameCode, &$zvalName, " . $this->getFlagsAsString() . ", NULL, $typeCode);\n";
+    /**
+     * @param iterable<ConstInfo> $allConstInfos
+     */
+    public function getFieldSynopsisElement(DOMDocument $doc, iterable $allConstInfos): DOMElement
+    {
+        $fieldsynopsisElement = $doc->createElement("fieldsynopsis");
+
+        $this->addModifiersToFieldSynopsis($doc, $fieldsynopsisElement);
+
+        $this->addTypeToFieldSynopsis($doc, $fieldsynopsisElement);
+
+        $varnameElement = $doc->createElement("varname", $this->getFieldSynopsisName());
+        if ($this->link) {
+            $varnameElement->setAttribute("linkend", $this->link);
         } else {
-            $code .= "\tzend_declare_property_ex(class_entry, $nameCode, &$zvalName, " . $this->getFlagsAsString() . ", NULL);\n";
+            $varnameElement->setAttribute("linkend", $this->getFieldSynopsisDefaultLinkend());
         }
-        $code .= "\tzend_string_release(property_{$propertyName}_name);\n";
 
-        return $code;
-    }
+        $fieldsynopsisElement->appendChild(new DOMText("\n     "));
+        $fieldsynopsisElement->appendChild($varnameElement);
 
-    private function getFlagsAsString(): string
-    {
-        $flags = "ZEND_ACC_PUBLIC";
-        if ($this->flags & Class_::MODIFIER_PROTECTED) {
-            $flags = "ZEND_ACC_PROTECTED";
-        } elseif ($this->flags & Class_::MODIFIER_PRIVATE) {
-            $flags = "ZEND_ACC_PRIVATE";
+        $valueString = $this->getFieldSynopsisValueString($allConstInfos);
+        if ($valueString) {
+            $fieldsynopsisElement->appendChild(new DOMText("\n     "));
+            $initializerElement = $doc->createElement("initializer",  $valueString);
+            $fieldsynopsisElement->appendChild($initializerElement);
         }
 
-        if ($this->flags & Class_::MODIFIER_STATIC) {
-            $flags .= "|ZEND_ACC_STATIC";
-        }
+        $fieldsynopsisElement->appendChild(new DOMText("\n    "));
 
-        if ($this->flags & Class_::MODIFIER_READONLY) {
-            $flags .= "|ZEND_ACC_READONLY";
-        }
-
-        return $flags;
+        return $fieldsynopsisElement;
     }
 
-    public function getFieldSynopsisElement(DOMDocument $doc): DOMElement
+    protected function addModifiersToFieldSynopsis(DOMDocument $doc, DOMElement $fieldsynopsisElement): void
     {
-        $fieldsynopsisElement = $doc->createElement("fieldsynopsis");
-
         if ($this->flags & Class_::MODIFIER_PUBLIC) {
             $fieldsynopsisElement->appendChild(new DOMText("\n     "));
             $fieldsynopsisElement->appendChild($doc->createElement("modifier", "public"));
@@ -1532,68 +1945,481 @@
             $fieldsynopsisElement->appendChild(new DOMText("\n     "));
             $fieldsynopsisElement->appendChild($doc->createElement("modifier", "private"));
         }
+    }
 
-        if ($this->flags & Class_::MODIFIER_STATIC) {
-            $fieldsynopsisElement->appendChild(new DOMText("\n     "));
-            $fieldsynopsisElement->appendChild($doc->createElement("modifier", "static"));
-        } elseif ($this->flags & Class_::MODIFIER_READONLY || $this->isDocReadonly) {
-            $fieldsynopsisElement->appendChild(new DOMText("\n     "));
-            $fieldsynopsisElement->appendChild($doc->createElement("modifier", "readonly"));
+    /**
+     * @param array<int, string[]> $flags
+     * @return array<int, string[]>
+     */
+    protected function addFlagForVersionsAbove(array $flags, string $flag, int $minimumVersionId): array
+    {
+        $write = false;
+
+        foreach ($flags as $version => $versionFlags) {
+            if ($version === $minimumVersionId || $write === true) {
+                $flags[$version][] = $flag;
+                $write = true;
+            }
         }
 
-        $fieldsynopsisElement->appendChild(new DOMText("\n     "));
-        $fieldsynopsisElement->appendChild($this->getFieldSynopsisType()->getTypeForDoc($doc));
+        return $flags;
+    }
+}
 
+class ConstInfo extends VariableLike
+{
+    public ConstOrClassConstName $name;
+    public Expr $value;
+    public bool $isDeprecated;
+    public ?string $valueString;
+    public ?string $cond;
+    public ?string $cValue;
+
+    /**
+     * @var AttributeInfo[] $attributes
+     */
+    public function __construct(
+        ConstOrClassConstName $name,
+        int $flags,
+        Expr $value,
+        ?string $valueString,
+        ?Type $type,
+        ?Type $phpDocType,
+        bool $isDeprecated,
+        ?string $cond,
+        ?string $cValue,
+        ?string $link,
+        ?int $phpVersionIdMinimumCompatibility,
+        array $attributes
+    ) {
+        $this->name = $name;
+        $this->value = $value;
+        $this->valueString = $valueString;
+        $this->isDeprecated = $isDeprecated;
+        $this->cond = $cond;
+        $this->cValue = $cValue;
+        parent::__construct($flags, $type, $phpDocType, $link, $phpVersionIdMinimumCompatibility, $attributes);
+    }
+
+    /**
+     * @param iterable<ConstInfo> $allConstInfos
+     */
+    public function getValue(iterable $allConstInfos): EvaluatedValue
+    {
+        return EvaluatedValue::createFromExpression(
+            $this->value,
+            ($this->phpDocType ?? $this->type)->tryToSimpleType(),
+            $this->cValue,
+            $allConstInfos
+        );
+    }
+
+    protected function getVariableTypeName(): string
+    {
+        return "constant";
+    }
+
+    protected function getVariableTypeCode(): string
+    {
+        return "const";
+    }
+
+    protected function getFieldSynopsisDefaultLinkend(): string
+    {
         $className = str_replace(["\\", "_"], ["-", "-"], $this->name->class->toLowerString());
-        $varnameElement = $doc->createElement("varname", $this->name->property);
-        if ($this->link) {
-            $varnameElement->setAttribute("linkend", $this->link);
-        } else {
-            $varnameElement->setAttribute("linkend", "$className.props." . strtolower(str_replace("_", "-", $this->name->property)));
+
+        return "$className.constants." . strtolower(str_replace("_", "-", $this->name->getDeclarationName()));
+    }
+
+    protected function getFieldSynopsisName(): string
+    {
+        return $this->name->__toString();
+    }
+
+    /**
+     * @param iterable<ConstInfo> $allConstInfos
+     */
+    protected function getFieldSynopsisValueString(iterable $allConstInfos): ?string
+    {
+        $value = EvaluatedValue::createFromExpression($this->value, null, $this->cValue, $allConstInfos);
+        if ($value->isUnknownConstValue) {
+            return null;
         }
-        $fieldsynopsisElement->appendChild(new DOMText("\n     "));
-        $fieldsynopsisElement->appendChild($varnameElement);
 
-        if ($this->defaultValueString) {
-            $fieldsynopsisElement->appendChild(new DOMText("\n     "));
-            $initializerElement = $doc->createElement("initializer",  $this->defaultValueString);
-            $fieldsynopsisElement->appendChild($initializerElement);
+        if ($value->originatingConsts) {
+            return implode("\n", array_map(function (ConstInfo $const) use ($allConstInfos) {
+                return $const->getFieldSynopsisValueString($allConstInfos);
+            }, $value->originatingConsts));
         }
 
-        $fieldsynopsisElement->appendChild(new DOMText("\n    "));
+        return $this->valueString;
+    }
 
-        return $fieldsynopsisElement;
+    public function discardInfoForOldPhpVersions(): void {
+        $this->type = null;
+        $this->flags &= ~Class_::MODIFIER_FINAL;
+        $this->isDeprecated = false;
+        $this->attributes = [];
     }
 
-    private function getFieldSynopsisType(): Type {
-        if ($this->phpDocType) {
-            return $this->phpDocType;
+    /**
+     * @param iterable<ConstInfo> $allConstInfos
+     */
+    public function getDeclaration(iterable $allConstInfos): string
+    {
+        $simpleType = ($this->phpDocType ?? $this->type)->tryToSimpleType();
+        if ($simpleType && $simpleType->name === "mixed") {
+            $simpleType = null;
         }
 
+        $value = EvaluatedValue::createFromExpression($this->value, $simpleType, $this->cValue, $allConstInfos);
+        if ($value->isUnknownConstValue && ($simpleType === null || !$simpleType->isBuiltin)) {
+            throw new Exception("Constant " . $this->name->__toString() . " must have a built-in PHPDoc type as the type couldn't be inferred from its value");
+        }
+
+        // i.e. const NAME = UNKNOWN;, without the annotation
+        if ($value->isUnknownConstValue && $this->cValue === null && $value->expr instanceof Expr\ConstFetch && $value->expr->name->__toString() === "UNKNOWN") {
+            throw new Exception("Constant " . $this->name->__toString() . " must have a @cvalue annotation");
+        }
+
+        $code = "";
+
+        if ($this->cond) {
+            $code .= "#if {$this->cond}\n";
+        }
+
+        if ($this->name->isClassConst()) {
+            $code .= $this->getClassConstDeclaration($value, $allConstInfos);
+        } else {
+            $code .= $this->getGlobalConstDeclaration($value, $allConstInfos);
+        }
+        $code .= $this->getValueAssertion($value);
+
+        if ($this->cond) {
+            $code .= "#endif\n";
+        }
+
+        return $code;
+    }
+
+    /**
+     * @param iterable<ConstInfo> $allConstInfos
+     */
+    private function getGlobalConstDeclaration(EvaluatedValue $value, iterable $allConstInfos): string
+    {
+        $constName = str_replace('\\', '\\\\', $this->name->__toString());
+        $constValue = $value->value;
+        $cExpr = $value->getCExpr();
+
+        $flags = "CONST_PERSISTENT";
+        if ($this->phpVersionIdMinimumCompatibility !== null && $this->phpVersionIdMinimumCompatibility < 80000) {
+            $flags .= " | CONST_CS";
+        }
+
+        if ($this->isDeprecated) {
+            $flags .= " | CONST_DEPRECATED";
+        }
+        if ($value->type->isNull()) {
+            return "\tREGISTER_NULL_CONSTANT(\"$constName\", $flags);\n";
+        }
+
+        if ($value->type->isBool()) {
+            return "\tREGISTER_BOOL_CONSTANT(\"$constName\", " . ($cExpr ?: ($constValue ? "true" : "false")) . ", $flags);\n";
+        }
+
+        if ($value->type->isInt()) {
+            return "\tREGISTER_LONG_CONSTANT(\"$constName\", " . ($cExpr ?: (int) $constValue) . ", $flags);\n";
+        }
+
+        if ($value->type->isFloat()) {
+            return "\tREGISTER_DOUBLE_CONSTANT(\"$constName\", " . ($cExpr ?: (float) $constValue) . ", $flags);\n";
+        }
+
+        if ($value->type->isString()) {
+            return "\tREGISTER_STRING_CONSTANT(\"$constName\", " . ($cExpr ?: '"' . addslashes($constValue) . '"') . ", $flags);\n";
+        }
+
+        throw new Exception("Unimplemented constant type");}
+
+    /**
+     * @param iterable<ConstInfo> $allConstInfos
+     */
+    private function getClassConstDeclaration(EvaluatedValue $value, iterable $allConstInfos): string
+    {
+        $constName = $this->name->getDeclarationName();
+
+        $zvalCode = $value->initializeZval("const_{$constName}_value", $allConstInfos);
+
+        $code = "\n" . $zvalCode;
+
+        $code .= "\tzend_string *const_{$constName}_name = zend_string_init_interned(\"$constName\", sizeof(\"$constName\") - 1, 1);\n";
+        $nameCode = "const_{$constName}_name";
+
+        $php83MinimumCompatibility = $this->phpVersionIdMinimumCompatibility === null || $this->phpVersionIdMinimumCompatibility >= PHP_83_VERSION_ID;
+
+        if ($this->type && !$php83MinimumCompatibility) {
+            $code .= "#if (PHP_VERSION_ID >= " . PHP_83_VERSION_ID . ")\n";
+        }
+
         if ($this->type) {
-            return $this->type;
+            $typeCode = $this->getTypeCode($constName, $code);
+
+            if (!empty($this->attributes)) {
+                $template = "\tzend_class_constant *const_" . $this->name->getDeclarationName() . " = ";
+            } else {
+                $template = "\t";
+            }
+            $template .= "zend_declare_typed_class_constant(class_entry, $nameCode, &const_{$constName}_value, %s, NULL, $typeCode);\n";
+
+            $flagsCode = generateVersionDependentFlagCode(
+                $template,
+                $this->getFlagsByPhpVersion(),
+                $this->phpVersionIdMinimumCompatibility
+            );
+            $code .= implode("", $flagsCode);
         }
 
-        throw new Exception("A property must have a type");
+        if ($this->type && !$php83MinimumCompatibility) {
+            $code .= "#else\n";
+        }
+
+        if (!$this->type || !$php83MinimumCompatibility) {
+            if (!empty($this->attributes)) {
+                $template = "\tzend_class_constant *const_" . $this->name->getDeclarationName() . " = ";
+            } else {
+                $template = "\t";
+            }
+            $template .= "zend_declare_class_constant_ex(class_entry, $nameCode, &const_{$constName}_value, %s, NULL);\n";
+            $flagsCode = generateVersionDependentFlagCode(
+                $template,
+                $this->getFlagsByPhpVersion(),
+                $this->phpVersionIdMinimumCompatibility
+            );
+            $code .= implode("", $flagsCode);
+        }
+
+        if ($this->type && !$php83MinimumCompatibility) {
+            $code .= "#endif\n";
+        }
+
+        $code .= "\tzend_string_release(const_{$constName}_name);\n";
+
+        return $code;
     }
 
-    /** @return mixed */
-    private function evaluateDefaultValue(bool &$defaultValueConstant)
+    private function getValueAssertion(EvaluatedValue $value): string
     {
-        $evaluator = new ConstExprEvaluator(
-            function (Expr $expr) use (&$defaultValueConstant) {
-                if ($expr instanceof Expr\ConstFetch) {
-                    $defaultValueConstant = true;
-                    return null;
-                }
+        if ($value->isUnknownConstValue || $value->originatingConsts || $this->cValue === null) {
+            return "";
+        }
 
-                throw new Exception("Property $this->name has an unsupported default value");
+        $cExpr = $value->getCExpr();
+        $constValue = $value->value;
+
+        if ($value->type->isNull()) {
+            return "\tZEND_ASSERT($cExpr == NULL);\n";
+        }
+
+        if ($value->type->isBool()) {
+            $cValue = $constValue ? "true" : "false";
+            return "\tZEND_ASSERT($cExpr == $cValue);\n";
+        }
+
+        if ($value->type->isInt()) {
+            $cValue = (int) $constValue;
+            return "\tZEND_ASSERT($cExpr == $cValue);\n";
+        }
+
+        if ($value->type->isFloat()) {
+            $cValue = (float) $constValue;
+            return "\tZEND_ASSERT($cExpr == $cValue);\n";
+        }
+
+        if ($value->type->isString()) {
+            $cValue = '"' . addslashes($constValue) . '"';
+            return "\tZEND_ASSERT(strcmp($cExpr, $cValue) == 0);\n";
+        }
+
+        throw new Exception("Unimplemented constant type");
+    }
+
+    /**
+     * @return array<int, string[]>
+     */
+    protected function getFlagsByPhpVersion(): array
+    {
+        $flags = parent::getFlagsByPhpVersion();
+
+        if ($this->isDeprecated) {
+            $flags = $this->addFlagForVersionsAbove($flags, "ZEND_ACC_DEPRECATED", PHP_80_VERSION_ID);
+        }
+
+        if ($this->flags & Class_::MODIFIER_FINAL) {
+            $flags = $this->addFlagForVersionsAbove($flags, "ZEND_ACC_FINAL", PHP_81_VERSION_ID);
+        }
+
+        return $flags;
+    }
+
+    protected function addModifiersToFieldSynopsis(DOMDocument $doc, DOMElement $fieldsynopsisElement): void
+    {
+        parent::addModifiersToFieldSynopsis($doc, $fieldsynopsisElement);
+
+        if ($this->flags & Class_::MODIFIER_FINAL) {
+            $fieldsynopsisElement->appendChild(new DOMText("\n     "));
+            $fieldsynopsisElement->appendChild($doc->createElement("modifier", "final"));
+        }
+
+        $fieldsynopsisElement->appendChild(new DOMText("\n     "));
+        $fieldsynopsisElement->appendChild($doc->createElement("modifier", "const"));
+    }
+}
+
+class PropertyInfo extends VariableLike
+{
+    public PropertyName $name;
+    public ?Expr $defaultValue;
+    public ?string $defaultValueString;
+    public bool $isDocReadonly;
+
+    /**
+     * @var AttributeInfo[] $attributes
+     */
+    public function __construct(
+        PropertyName $name,
+        int $flags,
+        ?Type $type,
+        ?Type $phpDocType,
+        ?Expr $defaultValue,
+        ?string $defaultValueString,
+        bool $isDocReadonly,
+        ?string $link,
+        ?int $phpVersionIdMinimumCompatibility,
+        array $attributes
+    ) {
+        $this->name = $name;
+        $this->defaultValue = $defaultValue;
+        $this->defaultValueString = $defaultValueString;
+        $this->isDocReadonly = $isDocReadonly;
+        parent::__construct($flags, $type, $phpDocType, $link, $phpVersionIdMinimumCompatibility, $attributes);
+    }
+
+    protected function getVariableTypeCode(): string
+    {
+        return "property";
+    }
+
+    protected function getVariableTypeName(): string
+    {
+        return "property";
+    }
+
+    protected function getFieldSynopsisDefaultLinkend(): string
+    {
+        $className = str_replace(["\\", "_"], ["-", "-"], $this->name->class->toLowerString());
+
+        return "$className.props." . strtolower(str_replace("_", "-", $this->name->getDeclarationName()));
+    }
+
+    protected function getFieldSynopsisName(): string
+    {
+        return $this->name->getDeclarationName();
+    }
+
+    /**
+     * @param iterable<ConstInfo> $allConstInfos
+     */
+    protected function getFieldSynopsisValueString(iterable $allConstInfos): ?string
+    {
+        return $this->defaultValueString;
+    }
+
+    public function discardInfoForOldPhpVersions(): void {
+        $this->type = null;
+        $this->flags &= ~Class_::MODIFIER_READONLY;
+        $this->attributes = [];
+    }
+
+    /**
+     * @param iterable<ConstInfo> $allConstInfos
+     */
+    public function getDeclaration(iterable $allConstInfos): string {
+        $code = "\n";
+
+        $propertyName = $this->name->getDeclarationName();
+
+        if ($this->defaultValue === null) {
+            $defaultValue = EvaluatedValue::null();
+        } else {
+            $defaultValue = EvaluatedValue::createFromExpression($this->defaultValue, null, null, $allConstInfos);
+            if ($defaultValue->isUnknownConstValue || ($defaultValue->originatingConsts && $defaultValue->getCExpr() === null)) {
+                echo "Skipping code generation for property $this->name, because it has an unknown constant default value\n";
+                return "";
             }
+        }
+
+        $zvalName = "property_{$propertyName}_default_value";
+        if ($this->defaultValue === null && $this->type !== null) {
+            $code .= "\tzval $zvalName;\n\tZVAL_UNDEF(&$zvalName);\n";
+        } else {
+            $code .= $defaultValue->initializeZval($zvalName);
+        }
+
+        $code .= "\tzend_string *property_{$propertyName}_name = zend_string_init(\"$propertyName\", sizeof(\"$propertyName\") - 1, 1);\n";
+        $nameCode = "property_{$propertyName}_name";
+        $typeCode = $this->getTypeCode($propertyName, $code);
+
+        if (!empty($this->attributes)) {
+            $template = "\tzend_property_info *property_" . $this->name->getDeclarationName() . " = ";
+        } else {
+            $template = "\t";
+        }
+        $template .= "zend_declare_typed_property(class_entry, $nameCode, &$zvalName, %s, NULL, $typeCode);\n";
+        $flagsCode = generateVersionDependentFlagCode(
+            $template,
+            $this->getFlagsByPhpVersion(),
+            $this->phpVersionIdMinimumCompatibility
         );
+        $code .= implode("", $flagsCode);
 
-        return $evaluator->evaluateDirectly($this->defaultValue);
+        $code .= "\tzend_string_release(property_{$propertyName}_name);\n";
+
+        return $code;
     }
 
+    /**
+     * @return array<int, string[]>
+     */
+    protected function getFlagsByPhpVersion(): array
+    {
+        $flags = parent::getFlagsByPhpVersion();
+
+        if ($this->flags & Class_::MODIFIER_STATIC) {
+            $flags = $this->addFlagForVersionsAbove($flags, "ZEND_ACC_STATIC", PHP_70_VERSION_ID);
+        }
+
+        if ($this->flags & Class_::MODIFIER_READONLY) {
+            $flags = $this->addFlagForVersionsAbove($flags, "ZEND_ACC_READONLY", PHP_81_VERSION_ID);
+        }
+
+        return $flags;
+    }
+
+    protected function addModifiersToFieldSynopsis(DOMDocument $doc, DOMElement $fieldsynopsisElement): void
+    {
+        parent::addModifiersToFieldSynopsis($doc, $fieldsynopsisElement);
+
+        if ($this->flags & Class_::MODIFIER_STATIC) {
+            $fieldsynopsisElement->appendChild(new DOMText("\n     "));
+            $fieldsynopsisElement->appendChild($doc->createElement("modifier", "static"));
+        }
+
+        if ($this->flags & Class_::MODIFIER_READONLY || $this->isDocReadonly) {
+            $fieldsynopsisElement->appendChild(new DOMText("\n     "));
+            $fieldsynopsisElement->appendChild($doc->createElement("modifier", "readonly"));
+        }
+    }
+
     public function __clone()
     {
         if ($this->type) {
@@ -1603,10 +2429,8 @@
 }
 
 class EnumCaseInfo {
-    /** @var string */
-    public $name;
-    /** @var Expr|null */
-    public $value;
+    public string $name;
+    public ?Expr $value;
 
     public function __construct(string $name, ?Expr $value) {
         $this->name = $name;
@@ -1613,53 +2437,99 @@
         $this->value = $value;
     }
 
-    public function getDeclaration(): string {
+    /**
+     * @param iterable<ConstInfo> $allConstInfos
+     */
+    public function getDeclaration(iterable $allConstInfos): string {
         $escapedName = addslashes($this->name);
         if ($this->value === null) {
             $code = "\n\tzend_enum_add_case_cstr(class_entry, \"$escapedName\", NULL);\n";
         } else {
-            $evaluator = new ConstExprEvaluator(function (Expr $expr) {
-                throw new Exception("Enum case $this->name has an unsupported value");
-            });
+            $value = EvaluatedValue::createFromExpression($this->value, null, null, $allConstInfos);
+
             $zvalName = "enum_case_{$escapedName}_value";
-            $code = "\n" . initializeZval($zvalName, $evaluator->evaluateDirectly($this->value));
+            $code = "\n" . $value->initializeZval($zvalName);
             $code .= "\tzend_enum_add_case_cstr(class_entry, \"$escapedName\", &$zvalName);\n";
         }
+
         return $code;
     }
 }
 
+class AttributeInfo {
+    public string $class;
+    /** @var \PhpParser\Node\Arg[] */
+    public array $args;
+
+    /** @param \PhpParser\Node\Arg[] $args */
+    public function __construct(string $class, array $args) {
+        $this->class = $class;
+        $this->args = $args;
+    }
+
+    /** @param iterable<ConstInfo> $allConstInfos */
+    public function generateCode(string $invocation, string $nameSuffix, iterable $allConstInfos, ?int $phpVersionIdMinimumCompatibility): string {
+        $php82MinimumCompatibility = $phpVersionIdMinimumCompatibility === null || $phpVersionIdMinimumCompatibility >= PHP_82_VERSION_ID;
+        /* see ZEND_KNOWN_STRINGS in Zend/strings.h */
+        $knowns = [];
+        if ($php82MinimumCompatibility) {
+            $knowns["SensitiveParameter"] = "ZEND_STR_SENSITIVEPARAMETER";
+        }
+
+        $code = "\n";
+        $escapedAttributeName = strtr($this->class, '\\', '_');
+        if (isset($knowns[$escapedAttributeName])) {
+            $code .= "\t" . ($this->args ? "zend_attribute *attribute_{$escapedAttributeName}_$nameSuffix = " : "") . "$invocation, ZSTR_KNOWN({$knowns[$escapedAttributeName]}), " . count($this->args) . ");\n";
+        } else {
+            $code .= "\tzend_string *attribute_name_{$escapedAttributeName}_$nameSuffix = zend_string_init_interned(\"" . addcslashes($this->class, "\\") . "\", sizeof(\"" . addcslashes($this->class, "\\") . "\") - 1, 1);\n";
+            $code .= "\t" . ($this->args ? "zend_attribute *attribute_{$escapedAttributeName}_$nameSuffix = " : "") . "$invocation, attribute_name_{$escapedAttributeName}_$nameSuffix, " . count($this->args) . ");\n";
+            $code .= "\tzend_string_release(attribute_name_{$escapedAttributeName}_$nameSuffix);\n";
+        }
+        foreach ($this->args as $i => $arg) {
+            $value = EvaluatedValue::createFromExpression($arg->value, null, null, $allConstInfos);
+            $zvalName = "attribute_{$escapedAttributeName}_{$nameSuffix}_arg$i";
+            $code .= $value->initializeZval($zvalName);
+            $code .= "\tZVAL_COPY_VALUE(&attribute_{$escapedAttributeName}_{$nameSuffix}->args[$i].value, &$zvalName);\n";
+            if ($arg->name) {
+                $code .= "\tattribute_{$escapedAttributeName}_{$nameSuffix}->args[$i].name = zend_string_init(\"{$arg->name->name}\", sizeof(\"{$arg->name->name}\") - 1, 1);\n";
+            }
+        }
+        return $code;
+    }
+}
+
 class ClassInfo {
-    /** @var Name */
-    public $name;
-    /** @var int */
-    public $flags;
-    /** @var string */
-    public $type;
-    /** @var string|null */
-    public $alias;
-    /** @var SimpleType|null */
-    public $enumBackingType;
-    /** @var bool */
-    public $isDeprecated;
-    /** @var bool */
-    public $isStrictProperties;
-    /** @var bool */
-    public $isNotSerializable;
+    public Name $name;
+    public int $flags;
+    public string $type;
+    public ?string $alias;
+    public ?SimpleType $enumBackingType;
+    public bool $isDeprecated;
+    public bool $isStrictProperties;
+    /** @var AttributeInfo[] */
+    public array $attributes;
+    public bool $isNotSerializable;
     /** @var Name[] */
-    public $extends;
+    public array $extends;
     /** @var Name[] */
-    public $implements;
+    public array $implements;
+    /** @var ConstInfo[] */
+    public array $constInfos;
     /** @var PropertyInfo[] */
-    public $propertyInfos;
+    public array $propertyInfos;
     /** @var FuncInfo[] */
-    public $funcInfos;
+    public array $funcInfos;
     /** @var EnumCaseInfo[] */
-    public $enumCaseInfos;
+    public array $enumCaseInfos;
+    public ?string $cond;
+    public ?int $phpVersionIdMinimumCompatibility;
+    public bool $isUndocumentable;
 
     /**
+     * @param AttributeInfo[] $attributes
      * @param Name[] $extends
      * @param Name[] $implements
+     * @param ConstInfo[] $constInfos
      * @param PropertyInfo[] $propertyInfos
      * @param FuncInfo[] $funcInfos
      * @param EnumCaseInfo[] $enumCaseInfos
@@ -1672,12 +2542,17 @@
         ?SimpleType $enumBackingType,
         bool $isDeprecated,
         bool $isStrictProperties,
+        array $attributes,
         bool $isNotSerializable,
         array $extends,
         array $implements,
+        array $constInfos,
         array $propertyInfos,
         array $funcInfos,
-        array $enumCaseInfos
+        array $enumCaseInfos,
+        ?string $cond,
+        ?int $minimumPhpVersionIdCompatibility,
+        bool $isUndocumentable
     ) {
         $this->name = $name;
         $this->flags = $flags;
@@ -1686,30 +2561,51 @@
         $this->enumBackingType = $enumBackingType;
         $this->isDeprecated = $isDeprecated;
         $this->isStrictProperties = $isStrictProperties;
+        $this->attributes = $attributes;
         $this->isNotSerializable = $isNotSerializable;
         $this->extends = $extends;
         $this->implements = $implements;
+        $this->constInfos = $constInfos;
         $this->propertyInfos = $propertyInfos;
         $this->funcInfos = $funcInfos;
         $this->enumCaseInfos = $enumCaseInfos;
+        $this->cond = $cond;
+        $this->phpVersionIdMinimumCompatibility = $minimumPhpVersionIdCompatibility;
+        $this->isUndocumentable = $isUndocumentable;
     }
 
-    public function getRegistration(): string
+    /**
+     * @param ConstInfo[] $allConstInfos
+     */
+    public function getRegistration(iterable $allConstInfos): string
     {
         $params = [];
         foreach ($this->extends as $extends) {
-            $params[] = "zend_class_entry *class_entry_" . implode("_", $extends->parts);
+            $params[] = "zend_class_entry *class_entry_" . implode("_", $extends->getParts());
         }
         foreach ($this->implements as $implements) {
-            $params[] = "zend_class_entry *class_entry_" . implode("_", $implements->parts);
+            $params[] = "zend_class_entry *class_entry_" . implode("_", $implements->getParts());
         }
 
-        $escapedName = implode("_", $this->name->parts);
+        $escapedName = implode("_", $this->name->getParts());
 
-        $code = "static zend_class_entry *register_class_$escapedName(" . (empty($params) ? "void" : implode(", ", $params)) . ")\n";
+        $code = '';
 
+        $php80MinimumCompatibility = $this->phpVersionIdMinimumCompatibility === null || $this->phpVersionIdMinimumCompatibility >= PHP_80_VERSION_ID;
+        $php81MinimumCompatibility = $this->phpVersionIdMinimumCompatibility === null || $this->phpVersionIdMinimumCompatibility >= PHP_81_VERSION_ID;
+
+        if ($this->type === "enum" && !$php81MinimumCompatibility) {
+            $code .= "#if (PHP_VERSION_ID >= " . PHP_81_VERSION_ID . ")\n";
+        }
+
+        if ($this->cond) {
+            $code .= "#if {$this->cond}\n";
+        }
+
+        $code .= "static zend_class_entry *register_class_$escapedName(" . (empty($params) ? "void" : implode(", ", $params)) . ")\n";
+
         $code .= "{\n";
-        if ($this->type == "enum") {
+        if ($this->type === "enum") {
             $name = addslashes((string) $this->name);
             $backingType = $this->enumBackingType
                 ? $this->enumBackingType->toTypeCode() : "IS_UNDEF";
@@ -1716,7 +2612,7 @@
             $code .= "\tzend_class_entry *class_entry = zend_register_internal_enum(\"$name\", $backingType, class_{$escapedName}_methods);\n";
         } else {
             $code .= "\tzend_class_entry ce, *class_entry;\n\n";
-            if (count($this->name->parts) > 1) {
+            if (count($this->name->getParts()) > 1) {
                 $className = $this->name->getLast();
                 $namespace = addslashes((string) $this->name->slice(0, -1));
 
@@ -1732,13 +2628,12 @@
             }
         }
 
-        if ($this->getFlagsAsString()) {
-            $code .= "\tclass_entry->ce_flags |= " . $this->getFlagsAsString() . ";\n";
-        }
+        $flagCodes = generateVersionDependentFlagCode("\tclass_entry->ce_flags |= %s;\n", $this->getFlagsByPhpVersion(), $this->phpVersionIdMinimumCompatibility);
+        $code .= implode("", $flagCodes);
 
         $implements = array_map(
             function (Name $item) {
-                return "class_entry_" . implode("_", $item->parts);
+                return "class_entry_" . implode("_", $item->getParts());
             },
             $this->type === "interface" ? $this->extends : $this->implements
         );
@@ -1751,60 +2646,157 @@
             $code .= "\tzend_register_class_alias(\"" . str_replace("\\", "\\\\", $this->alias) . "\", class_entry);\n";
         }
 
+        foreach ($this->constInfos as $const) {
+            $code .= $const->getDeclaration($allConstInfos);
+        }
+
         foreach ($this->enumCaseInfos as $enumCase) {
-            $code .= $enumCase->getDeclaration();
+            $code .= $enumCase->getDeclaration($allConstInfos);
         }
 
         foreach ($this->propertyInfos as $property) {
-            $code .= $property->getDeclaration();
+            $code .= $property->getDeclaration($allConstInfos);
         }
 
+        if (!empty($this->attributes)) {
+            if (!$php80MinimumCompatibility) {
+                $code .= "\n#if (PHP_VERSION_ID >= " . PHP_80_VERSION_ID . ")";
+            }
+
+            foreach ($this->attributes as $key => $attribute) {
+                $code .= $attribute->generateCode(
+                    "zend_add_class_attribute(class_entry",
+                    "class_{$escapedName}_$key",
+                    $allConstInfos,
+                    $this->phpVersionIdMinimumCompatibility
+                );
+            }
+
+            if (!$php80MinimumCompatibility) {
+                $code .= "#endif\n";
+            }
+        }
+
+        if ($attributeInitializationCode = generateConstantAttributeInitialization($this->constInfos, $allConstInfos, $this->phpVersionIdMinimumCompatibility, $this->cond)) {
+            if (!$php80MinimumCompatibility) {
+                $code .= "#if (PHP_VERSION_ID >= " . PHP_80_VERSION_ID . ")";
+            }
+
+            $code .= "\n" . $attributeInitializationCode;
+
+            if (!$php80MinimumCompatibility) {
+                $code .= "#endif\n";
+            }
+        }
+
+        if ($attributeInitializationCode = generatePropertyAttributeInitialization($this->propertyInfos, $allConstInfos, $this->phpVersionIdMinimumCompatibility)) {
+            if (!$php80MinimumCompatibility) {
+                $code .= "#if (PHP_VERSION_ID >= " . PHP_80_VERSION_ID . ")";
+            }
+
+            $code .= "\n" . $attributeInitializationCode;
+
+            if (!$php80MinimumCompatibility) {
+                $code .= "#endif\n";
+            }
+        }
+
+        if ($attributeInitializationCode = generateFunctionAttributeInitialization($this->funcInfos, $allConstInfos, $this->phpVersionIdMinimumCompatibility, $this->cond)) {
+            if (!$php80MinimumCompatibility) {
+                $code .= "#if (PHP_VERSION_ID >= " . PHP_80_VERSION_ID . ")\n";
+            }
+
+            $code .= "\n" . $attributeInitializationCode;
+
+            if (!$php80MinimumCompatibility) {
+                $code .= "#endif\n";
+            }
+        }
+
         $code .= "\n\treturn class_entry;\n";
 
         $code .= "}\n";
 
+        if ($this->cond) {
+            $code .= "#endif\n";
+        }
+
+        if ($this->type === "enum" && !$php81MinimumCompatibility) {
+            $code .= "#endif\n";
+        }
+
         return $code;
     }
 
-    private function getFlagsAsString(): string
+    /**
+     * @return array<int, string[]>
+     */
+    private function getFlagsByPhpVersion(): array
     {
-        $flags = [];
+        $php70Flags = [];
 
         if ($this->type === "trait") {
-            $flags[] = "ZEND_ACC_TRAIT";
+            $php70Flags[] = "ZEND_ACC_TRAIT";
         }
 
         if ($this->flags & Class_::MODIFIER_FINAL) {
-            $flags[] = "ZEND_ACC_FINAL";
+            $php70Flags[] = "ZEND_ACC_FINAL";
         }
 
         if ($this->flags & Class_::MODIFIER_ABSTRACT) {
-            $flags[] = "ZEND_ACC_ABSTRACT";
+            $php70Flags[] = "ZEND_ACC_ABSTRACT";
         }
 
         if ($this->isDeprecated) {
-            $flags[] = "ZEND_ACC_DEPRECATED";
+            $php70Flags[] = "ZEND_ACC_DEPRECATED";
         }
 
+        $php80Flags = $php70Flags;
+
         if ($this->isStrictProperties) {
-            $flags[] = "ZEND_ACC_NO_DYNAMIC_PROPERTIES";
+            $php80Flags[] = "ZEND_ACC_NO_DYNAMIC_PROPERTIES";
         }
 
+        $php81Flags = $php80Flags;
+
         if ($this->isNotSerializable) {
-            $flags[] = "ZEND_ACC_NOT_SERIALIZABLE";
+            $php81Flags[] = "ZEND_ACC_NOT_SERIALIZABLE";
         }
 
-        return implode("|", $flags);
+        $php82Flags = $php81Flags;
+
+        if ($this->flags & Class_::MODIFIER_READONLY) {
+            $php82Flags[] = "ZEND_ACC_READONLY_CLASS";
+        }
+
+        foreach ($this->attributes as $attr) {
+            if ($attr->class === "AllowDynamicProperties") {
+                $php82Flags[] = "ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES";
+                break;
+            }
+        }
+
+        $php83Flags = $php82Flags;
+
+        return [
+            PHP_70_VERSION_ID => $php70Flags,
+            PHP_80_VERSION_ID => $php80Flags,
+            PHP_81_VERSION_ID => $php81Flags,
+            PHP_82_VERSION_ID => $php82Flags,
+            PHP_83_VERSION_ID => $php83Flags,
+        ];
     }
 
     /**
      * @param array<string, ClassInfo> $classMap
+     * @param iterable<ConstInfo> $allConstInfos
+     * @param iterable<ConstInfo> $allConstInfo
      */
-    public function getClassSynopsisDocument(array $classMap): ?string {
+    public function getClassSynopsisDocument(array $classMap, iterable $allConstInfos): ?string {
 
         $doc = new DOMDocument();
         $doc->formatOutput = true;
-        $classSynopsis = $this->getClassSynopsisElement($doc, $classMap);
+        $classSynopsis = $this->getClassSynopsisElement($doc, $classMap, $allConstInfos);
         if (!$classSynopsis) {
             return null;
         }
@@ -1815,30 +2807,22 @@
     }
 
     /**
-     * @param ClassInfo[] $classMap
+     * @param array<string, ClassInfo> $classMap
+     * @param iterable<ConstInfo> $allConstInfos
      */
-    public function getClassSynopsisElement(DOMDocument $doc, array $classMap): ?DOMElement {
+    public function getClassSynopsisElement(DOMDocument $doc, array $classMap, iterable $allConstInfos): ?DOMElement {
 
         $classSynopsis = $doc->createElement("classsynopsis");
-        $classSynopsis->appendChild(new DOMText("\n    "));
+        $classSynopsis->setAttribute("class", $this->type === "interface" ? "interface" : "class");
 
-        $ooElement = self::createOoElement($doc, $this, true, false, false, 4);
+        $exceptionOverride = $this->type === "class" && $this->isException($classMap) ? "exception" : null;
+        $ooElement = self::createOoElement($doc, $this, $exceptionOverride, true, null, 4);
         if (!$ooElement) {
             return null;
         }
+        $classSynopsis->appendChild(new DOMText("\n    "));
         $classSynopsis->appendChild($ooElement);
-        $classSynopsis->appendChild(new DOMText("\n\n    "));
 
-        $classSynopsisInfo = $doc->createElement("classsynopsisinfo");
-        $classSynopsisInfo->appendChild(new DOMText("\n     "));
-        $ooElement = self::createOoElement($doc, $this, false, true, false, 5);
-        if (!$ooElement) {
-            return null;
-        }
-        $classSynopsisInfo->appendChild($ooElement);
-
-        $classSynopsis->appendChild($classSynopsisInfo);
-
         foreach ($this->extends as $k => $parent) {
             $parentInfo = $classMap[$parent->toString()] ?? null;
             if ($parentInfo === null) {
@@ -1848,72 +2832,90 @@
             $ooElement = self::createOoElement(
                 $doc,
                 $parentInfo,
-                $this->type === "interface",
+                null,
                 false,
-                $k === 0,
-                5
+                $k === 0 ? "extends" : null,
+                4
             );
             if (!$ooElement) {
                 return null;
             }
 
-            $classSynopsisInfo->appendChild(new DOMText("\n\n     "));
-            $classSynopsisInfo->appendChild($ooElement);
+            $classSynopsis->appendChild(new DOMText("\n\n    "));
+            $classSynopsis->appendChild($ooElement);
         }
 
-        foreach ($this->implements as $interface) {
+        foreach ($this->implements as $k => $interface) {
             $interfaceInfo = $classMap[$interface->toString()] ?? null;
             if (!$interfaceInfo) {
                 throw new Exception("Missing implemented interface " . $interface->toString());
             }
 
-            $ooElement = self::createOoElement($doc, $interfaceInfo, false, false, false, 5);
+            $ooElement = self::createOoElement($doc, $interfaceInfo, null, false, $k === 0 ? "implements" : null, 4);
             if (!$ooElement) {
                 return null;
             }
-            $classSynopsisInfo->appendChild(new DOMText("\n\n     "));
-            $classSynopsisInfo->appendChild($ooElement);
+            $classSynopsis->appendChild(new DOMText("\n\n    "));
+            $classSynopsis->appendChild($ooElement);
         }
-        $classSynopsisInfo->appendChild(new DOMText("\n    "));
 
-        /** @var Name[] $parentsWithInheritedProperties */
+        /** @var array<string, Name> $parentsWithInheritedConstants */
+        $parentsWithInheritedConstants = [];
+        /** @var array<string, Name> $parentsWithInheritedProperties */
         $parentsWithInheritedProperties = [];
-        /** @var Name[] $parentsWithInheritedMethods */
+        /** @var array<int, array{name: Name, types: int[]}> $parentsWithInheritedMethods */
         $parentsWithInheritedMethods = [];
 
-        $this->collectInheritedMembers($parentsWithInheritedProperties, $parentsWithInheritedMethods, $classMap);
+        $this->collectInheritedMembers(
+            $parentsWithInheritedConstants,
+            $parentsWithInheritedProperties,
+            $parentsWithInheritedMethods,
+            $this->hasConstructor(),
+            $classMap
+        );
 
-        if (!empty($this->propertyInfos)) {
+        $this->appendInheritedMemberSectionToClassSynopsis(
+            $doc,
+            $classSynopsis,
+            $parentsWithInheritedConstants,
+            "&Constants;",
+            "&InheritedConstants;"
+        );
+
+        if (!empty($this->constInfos)) {
             $classSynopsis->appendChild(new DOMText("\n\n    "));
-            $classSynopsisInfo = $doc->createElement("classsynopsisinfo", "&Properties;");
+            $classSynopsisInfo = $doc->createElement("classsynopsisinfo", "&Constants;");
             $classSynopsisInfo->setAttribute("role", "comment");
             $classSynopsis->appendChild($classSynopsisInfo);
 
-            foreach ($this->propertyInfos as $propertyInfo) {
+            foreach ($this->constInfos as $constInfo) {
                 $classSynopsis->appendChild(new DOMText("\n    "));
-                $fieldSynopsisElement = $propertyInfo->getFieldSynopsisElement($doc);
+                $fieldSynopsisElement = $constInfo->getFieldSynopsisElement($doc, $allConstInfos);
                 $classSynopsis->appendChild($fieldSynopsisElement);
             }
         }
 
-        if (!empty($parentsWithInheritedProperties)) {
+        if (!empty($this->propertyInfos)) {
             $classSynopsis->appendChild(new DOMText("\n\n    "));
-            $classSynopsisInfo = $doc->createElement("classsynopsisinfo", "&InheritedProperties;");
+            $classSynopsisInfo = $doc->createElement("classsynopsisinfo", "&Properties;");
             $classSynopsisInfo->setAttribute("role", "comment");
             $classSynopsis->appendChild($classSynopsisInfo);
 
-            foreach ($parentsWithInheritedProperties as $parent) {
+            foreach ($this->propertyInfos as $propertyInfo) {
                 $classSynopsis->appendChild(new DOMText("\n    "));
-                $parentReference = self::getClassSynopsisReference($parent);
-
-                $includeElement = $this->createIncludeElement(
-                    $doc,
-                    "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('$parentReference')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='&Properties;']]))"
-                );
-                $classSynopsis->appendChild($includeElement);
+                $fieldSynopsisElement = $propertyInfo->getFieldSynopsisElement($doc, $allConstInfos);
+                $classSynopsis->appendChild($fieldSynopsisElement);
             }
         }
 
+        $this->appendInheritedMemberSectionToClassSynopsis(
+            $doc,
+            $classSynopsis,
+            $parentsWithInheritedProperties,
+            "&Properties;",
+            "&InheritedProperties;"
+        );
+
         if (!empty($this->funcInfos)) {
             $classSynopsis->appendChild(new DOMText("\n\n    "));
             $classSynopsisInfo = $doc->createElement("classsynopsisinfo", "&Methods;");
@@ -1921,12 +2923,13 @@
             $classSynopsis->appendChild($classSynopsisInfo);
 
             $classReference = self::getClassSynopsisReference($this->name);
+            $escapedName = addslashes($this->name->__toString());
 
             if ($this->hasConstructor()) {
                 $classSynopsis->appendChild(new DOMText("\n    "));
                 $includeElement = $this->createIncludeElement(
                     $doc,
-                    "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('$classReference')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[not(@role='procedural')])"
+                    "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('$classReference')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[@role='$escapedName'])"
                 );
                 $classSynopsis->appendChild($includeElement);
             }
@@ -1935,7 +2938,7 @@
                 $classSynopsis->appendChild(new DOMText("\n    "));
                 $includeElement = $this->createIncludeElement(
                     $doc,
-                    "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('$classReference')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[not(@role='procedural')])"
+                    "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('$classReference')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[@role='$escapedName'])"
                 );
                 $classSynopsis->appendChild($includeElement);
             }
@@ -1944,7 +2947,7 @@
                 $classSynopsis->appendChild(new DOMText("\n    "));
                 $includeElement = $this->createIncludeElement(
                     $doc,
-                    "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('$classReference')/db:refentry/db:refsect1[@role='description']/descendant::db:destructorsynopsis[not(@role='procedural')])"
+                    "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('$classReference')/db:refentry/db:refsect1[@role='description']/descendant::db:destructorsynopsis[@role='$escapedName'])"
                 );
                 $classSynopsis->appendChild($includeElement);
             }
@@ -1957,13 +2960,21 @@
             $classSynopsis->appendChild($classSynopsisInfo);
 
             foreach ($parentsWithInheritedMethods as $parent) {
-                $classSynopsis->appendChild(new DOMText("\n    "));
-                $parentReference = self::getClassSynopsisReference($parent);
-                $includeElement = $this->createIncludeElement(
-                    $doc,
-                    "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('$parentReference')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[not(@role='procedural')])"
-                );
-                $classSynopsis->appendChild($includeElement);
+                $parentName = $parent["name"];
+                $parentMethodsynopsisTypes = $parent["types"];
+
+                $parentReference = self::getClassSynopsisReference($parentName);
+                $escapedParentName = addslashes($parentName->__toString());
+
+                foreach ($parentMethodsynopsisTypes as $parentMethodsynopsisType) {
+                    $classSynopsis->appendChild(new DOMText("\n    "));
+                    $includeElement = $this->createIncludeElement(
+                        $doc,
+                        "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('$parentReference')/db:refentry/db:refsect1[@role='description']/descendant::db:{$parentMethodsynopsisType}[@role='$escapedParentName'])"
+                    );
+
+                    $classSynopsis->appendChild($includeElement);
+                }
             }
         }
 
@@ -1975,9 +2986,9 @@
     private static function createOoElement(
         DOMDocument $doc,
         ClassInfo $classInfo,
-        bool $overrideToClass,
+        ?string $typeOverride,
         bool $withModifiers,
-        bool $isExtends,
+        ?string $modifierOverride,
         int $indentationLevel
     ): ?DOMElement {
         $indentation = str_repeat(" ", $indentationLevel);
@@ -1987,12 +2998,12 @@
             return null;
         }
 
-        $type = $overrideToClass ? "class" : $classInfo->type;
+        $type = $typeOverride !== null ? $typeOverride : $classInfo->type;
 
         $ooElement = $doc->createElement("oo$type");
         $ooElement->appendChild(new DOMText("\n$indentation "));
-        if ($isExtends) {
-            $ooElement->appendChild($doc->createElement('modifier', 'extends'));
+        if ($modifierOverride !== null) {
+            $ooElement->appendChild($doc->createElement('modifier', $modifierOverride));
             $ooElement->appendChild(new DOMText("\n$indentation "));
         } elseif ($withModifiers) {
             if ($classInfo->flags & Class_::MODIFIER_FINAL) {
@@ -2003,6 +3014,10 @@
                 $ooElement->appendChild($doc->createElement('modifier', 'abstract'));
                 $ooElement->appendChild(new DOMText("\n$indentation "));
             }
+            if ($classInfo->flags & Class_::MODIFIER_READONLY) {
+                $ooElement->appendChild($doc->createElement('modifier', 'readonly'));
+                $ooElement->appendChild(new DOMText("\n$indentation "));
+            }
         }
 
         $nameElement = $doc->createElement("{$type}name", $classInfo->name->toString());
@@ -2013,7 +3028,7 @@
     }
 
     public static function getClassSynopsisFilename(Name $name): string {
-        return strtolower(str_replace("_", "-", implode('-', $name->parts)));
+        return strtolower(str_replace("_", "-", implode('-', $name->getParts())));
     }
 
     public static function getClassSynopsisReference(Name $name): string {
@@ -2021,30 +3036,115 @@
     }
 
     /**
-     * @param Name[] $parentsWithInheritedProperties
-     * @param Name[] $parentsWithInheritedMethods
+     * @param array<string, Name> $parentsWithInheritedConstants
+     * @param array<string, Name> $parentsWithInheritedProperties
+     * @param array<string, array{name: Name, types: int[]}> $parentsWithInheritedMethods
      * @param array<string, ClassInfo> $classMap
      */
-    private function collectInheritedMembers(array &$parentsWithInheritedProperties, array &$parentsWithInheritedMethods, array $classMap): void
-    {
+    private function collectInheritedMembers(
+        array &$parentsWithInheritedConstants,
+        array &$parentsWithInheritedProperties,
+        array &$parentsWithInheritedMethods,
+        bool $hasConstructor,
+        array $classMap
+    ): void {
         foreach ($this->extends as $parent) {
             $parentInfo = $classMap[$parent->toString()] ?? null;
+            $parentName = $parent->toString();
+
             if (!$parentInfo) {
-                throw new Exception("Missing parent class " . $parent->toString());
+                throw new Exception("Missing parent class $parentName");
             }
 
-            if (!empty($parentInfo->propertyInfos) && !isset($parentsWithInheritedProperties[$parent->toString()])) {
-                $parentsWithInheritedProperties[$parent->toString()] = $parent;
+            if (!empty($parentInfo->constInfos) && !isset($parentsWithInheritedConstants[$parentName])) {
+                $parentsWithInheritedConstants[] = $parent;
             }
 
-            if (!isset($parentsWithInheritedMethods[$parent->toString()]) && $parentInfo->hasMethods()) {
-                $parentsWithInheritedMethods[$parent->toString()] = $parent;
+            if (!empty($parentInfo->propertyInfos) && !isset($parentsWithInheritedProperties[$parentName])) {
+                $parentsWithInheritedProperties[$parentName] = $parent;
             }
 
-            $parentInfo->collectInheritedMembers($parentsWithInheritedProperties, $parentsWithInheritedMethods, $classMap);
+            if (!$hasConstructor && $parentInfo->hasNonPrivateConstructor()) {
+                $parentsWithInheritedMethods[$parentName]["name"] = $parent;
+                $parentsWithInheritedMethods[$parentName]["types"][] = "constructorsynopsis";
+            }
+
+            if ($parentInfo->hasMethods()) {
+                $parentsWithInheritedMethods[$parentName]["name"] = $parent;
+                $parentsWithInheritedMethods[$parentName]["types"][] = "methodsynopsis";
+            }
+
+            if ($parentInfo->hasDestructor()) {
+                $parentsWithInheritedMethods[$parentName]["name"] = $parent;
+                $parentsWithInheritedMethods[$parentName]["types"][] = "destructorsynopsis";
+            }
+
+            $parentInfo->collectInheritedMembers(
+                $parentsWithInheritedConstants,
+                $parentsWithInheritedProperties,
+                $parentsWithInheritedMethods,
+                $hasConstructor,
+                $classMap
+            );
         }
+
+        foreach ($this->implements as $parent) {
+            $parentInfo = $classMap[$parent->toString()] ?? null;
+            if (!$parentInfo) {
+                throw new Exception("Missing parent interface " . $parent->toString());
+            }
+
+            if (!empty($parentInfo->constInfos) && !isset($parentsWithInheritedConstants[$parent->toString()])) {
+                $parentsWithInheritedConstants[$parent->toString()] = $parent;
+            }
+
+            $unusedParentsWithInheritedProperties = [];
+            $unusedParentsWithInheritedMethods = [];
+
+            $parentInfo->collectInheritedMembers(
+                $parentsWithInheritedConstants,
+                $unusedParentsWithInheritedProperties,
+                $unusedParentsWithInheritedMethods,
+                $hasConstructor,
+                $classMap
+            );
+        }
     }
 
+    /** @param array<string, ClassInfo> $classMap */
+    private function isException(array $classMap): bool
+    {
+        if ($this->name->toString() === "Throwable") {
+            return true;
+        }
+
+        foreach ($this->extends as $parentName) {
+            $parent = $classMap[$parentName->toString()] ?? null;
+            if ($parent === null) {
+                throw new Exception("Missing parent class " . $parentName->toString());
+            }
+
+            if ($parent->isException($classMap)) {
+                return true;
+            }
+        }
+
+        if ($this->type === "class") {
+            foreach ($this->implements as $interfaceName) {
+                $interface = $classMap[$interfaceName->toString()] ?? null;
+                if ($interface === null) {
+                    throw new Exception("Missing implemented interface " . $interfaceName->toString());
+                }
+
+                if ($interface->isException($classMap)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
     private function hasConstructor(): bool
     {
         foreach ($this->funcInfos as $funcInfo) {
@@ -2056,6 +3156,17 @@
         return false;
     }
 
+    private function hasNonPrivateConstructor(): bool
+    {
+        foreach ($this->funcInfos as $funcInfo) {
+            if ($funcInfo->name->isConstructor() && !($funcInfo->flags & Class_::MODIFIER_PRIVATE)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     private function hasDestructor(): bool
     {
         foreach ($this->funcInfos as $funcInfo) {
@@ -2102,21 +3213,48 @@
             $this->funcInfos[$key] = clone $funcInfo;
         }
     }
+
+    /**
+     * @param Name[] $parents
+     */
+    private function appendInheritedMemberSectionToClassSynopsis(DOMDocument $doc, DOMElement $classSynopsis, array $parents, string $label, string $inheritedLabel): void
+    {
+        if (empty($parents)) {
+            return;
+        }
+
+        $classSynopsis->appendChild(new DOMText("\n\n    "));
+        $classSynopsisInfo = $doc->createElement("classsynopsisinfo", "$inheritedLabel");
+        $classSynopsisInfo->setAttribute("role", "comment");
+        $classSynopsis->appendChild($classSynopsisInfo);
+
+        foreach ($parents as $parent) {
+            $classSynopsis->appendChild(new DOMText("\n    "));
+            $parentReference = self::getClassSynopsisReference($parent);
+
+            $includeElement = $this->createIncludeElement(
+                $doc,
+                "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('$parentReference')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='$label']]))"
+            );
+            $classSynopsis->appendChild($includeElement);
+        }
+    }
 }
 
 class FileInfo {
+    /** @var string[] */
+    public array $dependencies = [];
+    /** @var ConstInfo[] */
+    public array $constInfos = [];
     /** @var FuncInfo[] */
-    public $funcInfos = [];
+    public array $funcInfos = [];
     /** @var ClassInfo[] */
-    public $classInfos = [];
-    /** @var bool */
-    public $generateFunctionEntries = false;
-    /** @var string */
-    public $declarationPrefix = "";
-    /** @var bool */
-    public $generateLegacyArginfo = false;
-    /** @var bool */
-    public $generateClassEntries = false;
+    public array $classInfos = [];
+    public bool $generateFunctionEntries = false;
+    public string $declarationPrefix = "";
+    public ?int $generateLegacyArginfoForPhpVersionId = null;
+    public bool $generateClassEntries = false;
+    public bool $isUndocumentable = false;
 
     /**
      * @return iterable<FuncInfo>
@@ -2129,6 +3267,19 @@
     }
 
     /**
+     * @return iterable<ConstInfo>
+     */
+    public function getAllConstInfos(): iterable {
+        $result = $this->constInfos;
+
+        foreach ($this->classInfos as $classInfo) {
+            $result = array_merge($result, $classInfo->constInfos);
+        }
+
+        return $result;
+    }
+
+    /**
      * @return iterable<PropertyInfo>
      */
     public function getAllPropertyInfos(): iterable {
@@ -2150,10 +3301,8 @@
 }
 
 class DocCommentTag {
-    /** @var string */
-    public $name;
-    /** @var string|null */
-    public $value;
+    public string $name;
+    public ?string $value;
 
     public function __construct(string $name, ?string $value) {
         $this->name = $name;
@@ -2174,7 +3323,7 @@
         $matches = [];
 
         if ($this->name === "param") {
-            preg_match('/^\s*([\w\|\\\\\[\]<>, ]+)\s*\$\w+.*$/', $value, $matches);
+            preg_match('/^\s*([\w\|\\\\\[\]<>, ]+)\s*(?:[{(]|\$\w+).*$/', $value, $matches);
         } elseif ($this->name === "return" || $this->name === "var") {
             preg_match('/^\s*([\w\|\\\\\[\]<>, ]+)/', $value, $matches);
         }
@@ -2195,16 +3344,17 @@
         $matches = [];
 
         if ($this->name === "param") {
-            preg_match('/^\s*[\w\|\\\\\[\]]+\s*\$(\w+).*$/', $value, $matches);
+            // Allow for parsing extended types like callable(string):mixed in docblocks
+            preg_match('/^\s*(?<type>[\w\|\\\\]+(?<parens>\((?<inparens>(?:(?&parens)|[^(){}[\]]*+))++\)|\{(?&inparens)\}|\[(?&inparens)\])*+(?::(?&type))?)\s*\$(?<name>\w+).*$/', $value, $matches);
         } elseif ($this->name === "prefer-ref") {
-            preg_match('/^\s*\$(\w+).*$/', $value, $matches);
+            preg_match('/^\s*\$(?<name>\w+).*$/', $value, $matches);
         }
 
-        if (!isset($matches[1])) {
+        if (!isset($matches["name"])) {
             throw new Exception("@$this->name doesn't contain a variable name or has an invalid format \"$value\"");
         }
 
-        return $matches[1];
+        return $matches["name"];
     }
 }
 
@@ -2228,7 +3378,8 @@
     int $classFlags,
     int $flags,
     Node\FunctionLike $func,
-    ?string $cond
+    ?string $cond,
+    bool $isUndocumentable
 ): FuncInfo {
     try {
         $comment = $func->getDocComment();
@@ -2236,6 +3387,7 @@
         $aliasType = null;
         $alias = null;
         $isDeprecated = false;
+        $supportsCompileTimeEval = false;
         $verify = true;
         $docReturnType = null;
         $tentativeReturnType = false;
@@ -2245,32 +3397,57 @@
         if ($comment) {
             $tags = parseDocComment($comment);
             foreach ($tags as $tag) {
-                if ($tag->name === 'prefer-ref') {
-                    $varName = $tag->getVariableName();
-                    if (!isset($paramMeta[$varName])) {
-                        $paramMeta[$varName] = [];
-                    }
-                    $paramMeta[$varName]['preferRef'] = true;
-                } else if ($tag->name === 'alias' || $tag->name === 'implementation-alias') {
-                    $aliasType = $tag->name;
-                    $aliasParts = explode("::", $tag->getValue());
-                    if (count($aliasParts) === 1) {
-                        $alias = new FunctionName(new Name($aliasParts[0]));
-                    } else {
-                        $alias = new MethodName(new Name($aliasParts[0]), $aliasParts[1]);
-                    }
-                } else if ($tag->name === 'deprecated') {
-                    $isDeprecated = true;
-                } else if ($tag->name === 'no-verify') {
-                    $verify = false;
-                } else if ($tag->name === 'tentative-return-type') {
-                    $tentativeReturnType = true;
-                } else if ($tag->name === 'return') {
-                    $docReturnType = $tag->getType();
-                } else if ($tag->name === 'param') {
-                    $docParamTypes[$tag->getVariableName()] = $tag->getType();
-                } else if ($tag->name === 'refcount') {
-                    $refcount = $tag->getValue();
+                switch ($tag->name) {
+                    case 'alias':
+                    case 'implementation-alias':
+                        $aliasType = $tag->name;
+                        $aliasParts = explode("::", $tag->getValue());
+                        if (count($aliasParts) === 1) {
+                            $alias = new FunctionName(new Name($aliasParts[0]));
+                        } else {
+                            $alias = new MethodName(new Name($aliasParts[0]), $aliasParts[1]);
+                        }
+                        break;
+
+                    case 'deprecated':
+                        $isDeprecated = true;
+                        break;
+
+                    case 'no-verify':
+                        $verify = false;
+                        break;
+
+                    case 'tentative-return-type':
+                        $tentativeReturnType = true;
+                        break;
+
+                    case 'return':
+                        $docReturnType = $tag->getType();
+                        break;
+
+                    case 'param':
+                        $docParamTypes[$tag->getVariableName()] = $tag->getType();
+                        break;
+
+                    case 'refcount':
+                        $refcount = $tag->getValue();
+                        break;
+
+                    case 'compile-time-eval':
+                        $supportsCompileTimeEval = true;
+                        break;
+
+                    case 'prefer-ref':
+                        $varName = $tag->getVariableName();
+                        if (!isset($paramMeta[$varName])) {
+                            $paramMeta[$varName] = [];
+                        }
+                        $paramMeta[$varName][$tag->name] = true;
+                        break;
+
+                    case 'undocumentable':
+                        $isUndocumentable = true;
+                        break;
                 }
             }
         }
@@ -2281,7 +3458,7 @@
         $foundVariadic = false;
         foreach ($func->getParams() as $i => $param) {
             $varName = $param->var->name;
-            $preferRef = !empty($paramMeta[$varName]['preferRef']);
+            $preferRef = !empty($paramMeta[$varName]['prefer-ref']);
             unset($paramMeta[$varName]);
 
             if (isset($varNameSet[$varName])) {
@@ -2328,7 +3505,8 @@
                 $param->variadic,
                 $type,
                 isset($docParamTypes[$varName]) ? Type::fromString($docParamTypes[$varName]) : null,
-                $param->default ? $prettyPrinter->prettyPrintExpr($param->default) : null
+                $param->default ? $prettyPrinter->prettyPrintExpr($param->default) : null,
+                createAttributes($param->attrGroups)
             );
             if (!$param->default && !$param->variadic) {
                 $numRequiredArgs = $i + 1;
@@ -2359,11 +3537,14 @@
             $aliasType,
             $alias,
             $isDeprecated,
+            $supportsCompileTimeEval,
             $verify,
             $args,
             $return,
             $numRequiredArgs,
-            $cond
+            $cond,
+            $isUndocumentable,
+            createAttributes($func->attrGroups)
         );
     } catch (Exception $e) {
         throw new Exception($name . "(): " .$e->getMessage());
@@ -2370,6 +3551,62 @@
     }
 }
 
+/**
+ * @param array<int, array<int, AttributeGroup> $attributes
+ */
+function parseConstLike(
+    PrettyPrinterAbstract $prettyPrinter,
+    ConstOrClassConstName $name,
+    Node\Const_ $const,
+    int $flags,
+    ?Node $type,
+    ?DocComment $docComment,
+    ?string $cond,
+    ?int $phpVersionIdMinimumCompatibility,
+    array $attributes
+): ConstInfo {
+    $phpDocType = null;
+    $deprecated = false;
+    $cValue = null;
+    $link = null;
+    if ($docComment) {
+        $tags = parseDocComment($docComment);
+        foreach ($tags as $tag) {
+            if ($tag->name === 'var') {
+                $phpDocType = $tag->getType();
+            } elseif ($tag->name === 'deprecated') {
+                $deprecated = true;
+            } elseif ($tag->name === 'cvalue') {
+                $cValue = $tag->value;
+            } elseif ($tag->name === 'link') {
+                $link = $tag->value;
+            }
+        }
+    }
+
+    if ($type === null && $phpDocType === null) {
+        throw new Exception("Missing type for constant " . $name->__toString());
+    }
+
+    return new ConstInfo(
+        $name,
+        $flags,
+        $const->value,
+        $prettyPrinter->prettyPrintExpr($const->value),
+        $type ? Type::fromNode($type) : null,
+        $phpDocType ? Type::fromString($phpDocType) : null,
+        $deprecated,
+        $cond,
+        $cValue,
+        $link,
+        $phpVersionIdMinimumCompatibility,
+        $attributes
+    );
+}
+
+/**
+ * @param array<int, array<int, AttributeGroup> $attributes
+ */
 function parseProperty(
     Name $class,
     int $flags,
@@ -2376,7 +3613,9 @@
     Stmt\PropertyProperty $property,
     ?Node $type,
     ?DocComment $comment,
-    PrettyPrinterAbstract $prettyPrinter
+    PrettyPrinterAbstract $prettyPrinter,
+    ?int $phpVersionIdMinimumCompatibility,
+    array $attributes
 ): PropertyInfo {
     $phpDocType = null;
     $isDocReadonly = false;
@@ -2419,17 +3658,28 @@
         $property->default,
         $property->default ? $prettyPrinter->prettyPrintExpr($property->default) : null,
         $isDocReadonly,
-        $link
+        $link,
+        $phpVersionIdMinimumCompatibility,
+        $attributes
     );
 }
 
 /**
+ * @param ConstInfo[] $consts
  * @param PropertyInfo[] $properties
  * @param FuncInfo[] $methods
  * @param EnumCaseInfo[] $enumCases
  */
 function parseClass(
-    Name $name, Stmt\ClassLike $class, array $properties, array $methods, array $enumCases
+    Name $name,
+    Stmt\ClassLike $class,
+    array $consts,
+    array $properties,
+    array $methods,
+    array $enumCases,
+    ?string $cond,
+    ?int $minimumPhpVersionIdCompatibility,
+    bool $isUndocumentable
 ): ClassInfo {
     $flags = $class instanceof Class_ ? $class->flags : 0;
     $comment = $class->getDocComment();
@@ -2437,6 +3687,8 @@
     $isDeprecated = false;
     $isStrictProperties = false;
     $isNotSerializable = false;
+    $allowsDynamicProperties = false;
+    $attributes = [];
 
     if ($comment) {
         $tags = parseDocComment($comment);
@@ -2449,10 +3701,25 @@
                 $isStrictProperties = true;
             } else if ($tag->name === 'not-serializable') {
                 $isNotSerializable = true;
+            } else if ($tag->name === 'undocumentable') {
+                $isUndocumentable = true;
             }
         }
     }
 
+    $attributes = createAttributes($class->attrGroups);
+    foreach ($attributes as $attribute) {
+        switch ($attribute->class) {
+            case 'AllowDynamicProperties':
+                $allowsDynamicProperties = true;
+                break 2;
+        }
+    }
+
+    if ($isStrictProperties && $allowsDynamicProperties) {
+        throw new Exception("A class may not have '@strict-properties' and '#[\\AllowDynamicProperties]' at the same time.");
+    }
+
     $extends = [];
     $implements = [];
 
@@ -2474,6 +3741,12 @@
         throw new Exception("Unknown class kind " . get_class($class));
     }
 
+    if ($isUndocumentable) {
+        foreach ($methods as $method) {
+            $method->isUndocumentable = true;
+        }
+    }
+
     return new ClassInfo(
         $name,
         $flags,
@@ -2483,15 +3756,36 @@
             ? SimpleType::fromNode($class->scalarType) : null,
         $isDeprecated,
         $isStrictProperties,
+        $attributes,
         $isNotSerializable,
         $extends,
         $implements,
+        $consts,
         $properties,
         $methods,
-        $enumCases
+        $enumCases,
+        $cond,
+        $minimumPhpVersionIdCompatibility,
+        $isUndocumentable
     );
 }
 
+/**
+ * @param array<int, array<int, AttributeGroup>> $attributeGroups
+ * @return Attribute[]
+ */
+function createAttributes(array $attributeGroups): array {
+    $attributes = [];
+
+    foreach ($attributeGroups as $attrGroup) {
+        foreach ($attrGroup->attrs as $attr) {
+            $attributes[] = new AttributeInfo($attr->name->toString(), $attr->args);
+        }
+    }
+
+    return $attributes;
+}
+
 function handlePreprocessorConditions(array &$conds, Stmt $stmt): ?string {
     foreach ($stmt->getComments() as $comment) {
         $text = trim($comment->getText());
@@ -2540,6 +3834,8 @@
 function handleStatements(FileInfo $fileInfo, array $stmts, PrettyPrinterAbstract $prettyPrinter) {
     $conds = [];
     foreach ($stmts as $stmt) {
+        $cond = handlePreprocessorConditions($conds, $stmt);
+
         if ($stmt instanceof Stmt\Nop) {
             continue;
         }
@@ -2549,7 +3845,23 @@
             continue;
         }
 
-        $cond = handlePreprocessorConditions($conds, $stmt);
+        if ($stmt instanceof Stmt\Const_) {
+            foreach ($stmt->consts as $const) {
+                $fileInfo->constInfos[] = parseConstLike(
+                    $prettyPrinter,
+                    new ConstName($const->namespacedName, $const->name->toString()),
+                    $const,
+                    0,
+                    null,
+                    $stmt->getDocComment(),
+                    $cond,
+                    $fileInfo->generateLegacyArginfoForPhpVersionId,
+                    []
+                );
+            }
+            continue;
+        }
+
         if ($stmt instanceof Stmt\Function_) {
             $fileInfo->funcInfos[] = parseFunctionLike(
                 $prettyPrinter,
@@ -2557,7 +3869,8 @@
                 0,
                 0,
                 $stmt,
-                $cond
+                $cond,
+                $fileInfo->isUndocumentable
             );
             continue;
         }
@@ -2564,6 +3877,7 @@
 
         if ($stmt instanceof Stmt\ClassLike) {
             $className = $stmt->namespacedName;
+            $constInfos = [];
             $propertyInfos = [];
             $methodInfos = [];
             $enumCaseInfos = [];
@@ -2576,7 +3890,21 @@
                 $classFlags = $stmt instanceof Class_ ? $stmt->flags : 0;
                 $abstractFlag = $stmt instanceof Stmt\Interface_ ? Class_::MODIFIER_ABSTRACT : 0;
 
-                if ($classStmt instanceof Stmt\Property) {
+                if ($classStmt instanceof Stmt\ClassConst) {
+                    foreach ($classStmt->consts as $const) {
+                        $constInfos[] = parseConstLike(
+                            $prettyPrinter,
+                            new ClassConstName($className, $const->name->toString()),
+                            $const,
+                            $classStmt->flags,
+                            $classStmt->type,
+                            $classStmt->getDocComment(),
+                            $cond,
+                            $fileInfo->generateLegacyArginfoForPhpVersionId,
+                            createAttributes($classStmt->attrGroups)
+                        );
+                    }
+                } else if ($classStmt instanceof Stmt\Property) {
                     if (!($classStmt->flags & Class_::VISIBILITY_MODIFIER_MASK)) {
                         throw new Exception("Visibility modifier is required");
                     }
@@ -2587,7 +3915,9 @@
                             $property,
                             $classStmt->type,
                             $classStmt->getDocComment(),
-                            $prettyPrinter
+                            $prettyPrinter,
+                            $fileInfo->generateLegacyArginfoForPhpVersionId,
+                            createAttributes($classStmt->attrGroups)
                         );
                     }
                 } else if ($classStmt instanceof Stmt\ClassMethod) {
@@ -2600,7 +3930,8 @@
                         $classFlags,
                         $classStmt->flags | $abstractFlag,
                         $classStmt,
-                        $cond
+                        $cond,
+                        $fileInfo->isUndocumentable
                     );
                 } else if ($classStmt instanceof Stmt\EnumCase) {
                     $enumCaseInfos[] = new EnumCaseInfo(
@@ -2611,12 +3942,24 @@
             }
 
             $fileInfo->classInfos[] = parseClass(
-                $className, $stmt, $propertyInfos, $methodInfos, $enumCaseInfos);
+                $className, $stmt, $constInfos, $propertyInfos, $methodInfos, $enumCaseInfos, $cond, $fileInfo->generateLegacyArginfoForPhpVersionId, $fileInfo->isUndocumentable
+            );
             continue;
         }
 
+        if ($stmt instanceof Stmt\Expression) {
+            $expr = $stmt->expr;
+            if ($expr instanceof Expr\Include_) {
+                $fileInfo->dependencies[] = (string)EvaluatedValue::createFromExpression($expr->expr, null, null, [])->value;
+                continue;
+            }
+        }
+
         throw new Exception("Unexpected node {$stmt->getType()}");
     }
+    if (!empty($conds)) {
+        throw new Exception("Unterminated preprocessor conditions");
+    }
 }
 
 function parseStubFile(string $code): FileInfo {
@@ -2625,8 +3968,8 @@
     $nodeTraverser = new PhpParser\NodeTraverser;
     $nodeTraverser->addVisitor(new PhpParser\NodeVisitor\NameResolver);
     $prettyPrinter = new class extends Standard {
-        protected function pName_FullyQualified(Name\FullyQualified $node) {
-            return implode('\\', $node->parts);
+        protected function pName_FullyQualified(Name\FullyQualified $node): string {
+            return implode('\\', $node->getParts());
         }
     };
 
@@ -2642,10 +3985,20 @@
                 $fileInfo->generateFunctionEntries = true;
                 $fileInfo->declarationPrefix = $tag->value ? $tag->value . " " : "";
             } else if ($tag->name === 'generate-legacy-arginfo') {
-                $fileInfo->generateLegacyArginfo = true;
+                if ($tag->value && !in_array((int) $tag->value, ALL_PHP_VERSION_IDS, true)) {
+                    throw new Exception(
+                        "Legacy PHP version must be one of: \"" . PHP_70_VERSION_ID . "\" (PHP 7.0), \"" . PHP_80_VERSION_ID . "\" (PHP 8.0), " .
+                        "\"" . PHP_81_VERSION_ID . "\" (PHP 8.1), \"" . PHP_82_VERSION_ID . "\" (PHP 8.2), \"" . PHP_83_VERSION_ID . "\" (PHP 8.3), " .
+                        "\"" . $tag->value . "\" provided"
+                    );
+                }
+
+                $fileInfo->generateLegacyArginfoForPhpVersionId = $tag->value ? (int) $tag->value : PHP_70_VERSION_ID;
             } else if ($tag->name === 'generate-class-entries') {
                 $fileInfo->generateClassEntries = true;
                 $fileInfo->declarationPrefix = $tag->value ? $tag->value . " " : "";
+            } else if ($tag->name === 'undocumentable') {
+                $fileInfo->isUndocumentable = true;
             }
         }
     }
@@ -2659,12 +4012,16 @@
     return $fileInfo;
 }
 
-function funcInfoToCode(FuncInfo $funcInfo): string {
+function funcInfoToCode(FileInfo $fileInfo, FuncInfo $funcInfo): string {
     $code = '';
     $returnType = $funcInfo->return->type;
     $isTentativeReturnType = $funcInfo->return->tentativeReturnType;
+    $php81MinimumCompatibility = $fileInfo->generateLegacyArginfoForPhpVersionId === null || $fileInfo->generateLegacyArginfoForPhpVersionId >= PHP_81_VERSION_ID;
 
     if ($returnType !== null) {
+        if ($isTentativeReturnType && !$php81MinimumCompatibility) {
+            $code .= "#if (PHP_VERSION_ID >= " . PHP_81_VERSION_ID . ")\n";
+        }
         if (null !== $simpleReturnType = $returnType->tryToSimpleType()) {
             if ($simpleReturnType->isBuiltin) {
                 $code .= sprintf(
@@ -2703,6 +4060,12 @@
                 );
             }
         }
+        if ($isTentativeReturnType && !$php81MinimumCompatibility) {
+            $code .= sprintf(
+                "#else\nZEND_BEGIN_ARG_INFO_EX(%s, 0, %d, %d)\n#endif\n",
+                $funcInfo->getArgInfoName(), $funcInfo->return->byRef, $funcInfo->numRequiredArgs
+            );
+        }
     } else {
         $code .= sprintf(
             "ZEND_BEGIN_ARG_INFO_EX(%s, 0, %d, %d)\n",
@@ -2735,10 +4098,10 @@
                 $arginfoType = $argType->toArginfoType();
                 if ($arginfoType->hasClassType()) {
                     $code .= sprintf(
-                        "\tZEND_%s_OBJ_TYPE_MASK(%s, %s, %s, %s, %s)\n",
+                        "\tZEND_%s_OBJ_TYPE_MASK(%s, %s, %s, %s%s)\n",
                         $argKind, $argInfo->getSendByString(), $argInfo->name,
                         $arginfoType->toClassTypeString(), $arginfoType->toTypeMask(),
-                        $argInfo->getDefaultValueAsArginfoString()
+                        !$argInfo->isVariadic ? ", " . $argInfo->getDefaultValueAsArginfoString() : ""
                     );
                 } else {
                     $code .= sprintf(
@@ -2772,35 +4135,50 @@
     return null;
 }
 
-/** @param iterable<FuncInfo> $funcInfos */
+/**
+ * @template T
+ * @param iterable<T> $infos
+ * @param Closure(T): string|null $codeGenerator
+ * @param ?string $parentCond
+ */
 function generateCodeWithConditions(
-        iterable $funcInfos, string $separator, Closure $codeGenerator): string {
+    iterable $infos, string $separator, Closure $codeGenerator, ?string $parentCond = null): string {
     $code = "";
-    foreach ($funcInfos as $funcInfo) {
-        $funcCode = $codeGenerator($funcInfo);
-        if ($funcCode === null) {
+    foreach ($infos as $info) {
+        $infoCode = $codeGenerator($info);
+        if ($infoCode === null) {
             continue;
         }
 
         $code .= $separator;
-        if ($funcInfo->cond) {
-            $code .= "#if {$funcInfo->cond}\n";
-            $code .= $funcCode;
+        if ($info->cond && $info->cond !== $parentCond) {
+            $code .= "#if {$info->cond}\n";
+            $code .= $infoCode;
             $code .= "#endif\n";
         } else {
-            $code .= $funcCode;
+            $code .= $infoCode;
         }
     }
+
     return $code;
 }
 
-function generateArgInfoCode(FileInfo $fileInfo, string $stubHash): string {
+/**
+ * @param iterable<ConstInfo> $allConstInfos
+ */
+function generateArgInfoCode(
+    string $stubFilenameWithoutExtension,
+    FileInfo $fileInfo,
+    iterable $allConstInfos,
+    string $stubHash
+): string {
     $code = "/* This is a generated file, edit the .stub.php file instead.\n"
           . " * Stub hash: $stubHash */\n";
+
     $generatedFuncInfos = [];
     $code .= generateCodeWithConditions(
         $fileInfo->getAllFuncInfos(), "\n",
-        function (FuncInfo $funcInfo) use(&$generatedFuncInfos) {
+        static function (FuncInfo $funcInfo) use (&$generatedFuncInfos, $fileInfo) {
             /* If there already is an equivalent arginfo structure, only emit a #define */
             if ($generatedFuncInfo = findEquivalentFuncInfo($generatedFuncInfos, $funcInfo)) {
                 $code = sprintf(
@@ -2808,7 +4186,7 @@
                     $funcInfo->getArgInfoName(), $generatedFuncInfo->getArgInfoName()
                 );
             } else {
-                $code = funcInfoToCode($funcInfo);
+                $code = funcInfoToCode($fileInfo, $funcInfo);
             }
 
             $generatedFuncInfos[] = $funcInfo;
@@ -2822,7 +4200,7 @@
         $generatedFunctionDeclarations = [];
         $code .= generateCodeWithConditions(
             $fileInfo->getAllFuncInfos(), "",
-            function (FuncInfo $funcInfo) use($fileInfo, &$generatedFunctionDeclarations) {
+            static function (FuncInfo $funcInfo) use ($fileInfo, &$generatedFunctionDeclarations) {
                 $key = $funcInfo->getDeclarationKey();
                 if (isset($generatedFunctionDeclarations[$key])) {
                     return null;
@@ -2838,22 +4216,49 @@
         }
 
         foreach ($fileInfo->classInfos as $classInfo) {
-            $code .= generateFunctionEntries($classInfo->name, $classInfo->funcInfos);
+            $code .= generateFunctionEntries($classInfo->name, $classInfo->funcInfos, $classInfo->cond);
         }
     }
 
+    $php80MinimumCompatibility = $fileInfo->generateLegacyArginfoForPhpVersionId === null || $fileInfo->generateLegacyArginfoForPhpVersionId >= PHP_80_VERSION_ID;
+
     if ($fileInfo->generateClassEntries) {
-        $code .= generateClassEntryCode($fileInfo);
+        if ($attributeInitializationCode = generateFunctionAttributeInitialization($fileInfo->funcInfos, $allConstInfos, $fileInfo->generateLegacyArginfoForPhpVersionId, null)) {
+            if (!$php80MinimumCompatibility) {
+                $attributeInitializationCode = "\n#if (PHP_VERSION_ID >= " . PHP_80_VERSION_ID . ")" . $attributeInitializationCode . "#endif\n";
+            }
+        }
+
+        if ($attributeInitializationCode !== "" || !empty($fileInfo->constInfos)) {
+            $code .= "\nstatic void register_{$stubFilenameWithoutExtension}_symbols(int module_number)\n";
+            $code .= "{\n";
+
+            foreach ($fileInfo->constInfos as $constInfo) {
+                $code .= $constInfo->getDeclaration($allConstInfos);
+            }
+
+            if (!empty($attributeInitializationCode !== "" && $fileInfo->constInfos)) {
+                $code .= "\n";
+            }
+
+            $code .= $attributeInitializationCode;
+            $code .= "}\n";
+        }
+
+        $code .= generateClassEntryCode($fileInfo, $allConstInfos);
     }
 
     return $code;
 }
 
-function generateClassEntryCode(FileInfo $fileInfo): string {
+/**
+ * @param iterable<ConstInfo> $allConstInfos
+ */
+function generateClassEntryCode(FileInfo $fileInfo, iterable $allConstInfos): string {
     $code = "";
 
     foreach ($fileInfo->classInfos as $class) {
-        $code .= "\n" . $class->getRegistration();
+        $code .= "\n" . $class->getRegistration($allConstInfos);
     }
 
     return $code;
@@ -2860,33 +4265,136 @@
 }
 
 /** @param FuncInfo[] $funcInfos */
-function generateFunctionEntries(?Name $className, array $funcInfos): string {
-    $code = "";
+function generateFunctionEntries(?Name $className, array $funcInfos, ?string $cond = null): string {
+    $code = "\n\n";
 
+    if ($cond) {
+        $code .= "#if {$cond}\n";
+    }
+
     $functionEntryName = "ext_functions";
     if ($className) {
-        $underscoreName = implode("_", $className->parts);
+        $underscoreName = implode("_", $className->getParts());
         $functionEntryName = "class_{$underscoreName}_methods";
     }
 
-    $code .= "\n\nstatic const zend_function_entry {$functionEntryName}[] = {\n";
-    $code .= generateCodeWithConditions($funcInfos, "", function (FuncInfo $funcInfo) {
+    $code .= "static const zend_function_entry {$functionEntryName}[] = {\n";
+    $code .= generateCodeWithConditions($funcInfos, "", static function (FuncInfo $funcInfo) {
         return $funcInfo->getFunctionEntry();
-    });
+    }, $cond);
     $code .= "\tZEND_FE_END\n";
     $code .= "};\n";
 
+    if ($cond) {
+        $code .= "#endif\n";
+    }
+
     return $code;
 }
 
-/** @param FuncInfo<string, FuncInfo> $funcInfos */
-function generateOptimizerInfo(array $funcInfos): string {
+/**
+ * @param iterable<FuncInfo> $funcInfos
+ */
+function generateFunctionAttributeInitialization(iterable $funcInfos, iterable $allConstInfos, ?int $phpVersionIdMinimumCompatibility, ?string $parentCond = null): string {
+    return generateCodeWithConditions(
+        $funcInfos,
+        "",
+        static function (FuncInfo $funcInfo) use ($allConstInfos, $phpVersionIdMinimumCompatibility) {
+            $code = null;
 
+            if ($funcInfo->name instanceof MethodName) {
+                $functionTable = "&class_entry->function_table";
+            } else {
+                $functionTable = "CG(function_table)";
+            }
+
+            foreach ($funcInfo->attributes as $key => $attribute) {
+                $code .= $attribute->generateCode(
+                    "zend_add_function_attribute(zend_hash_str_find_ptr($functionTable, \"" . $funcInfo->name->getNameForAttributes() . "\", sizeof(\"" . $funcInfo->name->getNameForAttributes() . "\") - 1)",
+                    "func_" . $funcInfo->name->getNameForAttributes() . "_$key",
+                    $allConstInfos,
+                    $phpVersionIdMinimumCompatibility
+                );
+            }
+
+            foreach ($funcInfo->args as $index => $arg) {
+                foreach ($arg->attributes as $key => $attribute) {
+                    $code .= $attribute->generateCode(
+                        "zend_add_parameter_attribute(zend_hash_str_find_ptr($functionTable, \"" . $funcInfo->name->getNameForAttributes() . "\", sizeof(\"" . $funcInfo->name->getNameForAttributes() . "\") - 1), $index",
+                        "func_{$funcInfo->name->getNameForAttributes()}_arg{$index}_$key",
+                        $allConstInfos,
+                        $phpVersionIdMinimumCompatibility
+                    );
+                }
+            }
+
+            return $code;
+        },
+        $parentCond
+    );
+}
+
+/**
+ * @param iterable<ConstInfo> $constInfos
+ */
+function generateConstantAttributeInitialization(
+    iterable $constInfos,
+    iterable $allConstInfos,
+    ?int $phpVersionIdMinimumCompatibility,
+    ?string $parentCond = null
+): string {
+    return generateCodeWithConditions(
+        $constInfos,
+        "",
+        static function (ConstInfo $constInfo) use ($allConstInfos, $phpVersionIdMinimumCompatibility) {
+            $code = null;
+
+            foreach ($constInfo->attributes as $key => $attribute) {
+                $code .= $attribute->generateCode(
+                    "zend_add_class_constant_attribute(class_entry, const_" . $constInfo->name->getDeclarationName(),
+                    "const_" . $constInfo->name->getDeclarationName() . "_$key",
+                    $allConstInfos,
+                    $phpVersionIdMinimumCompatibility
+                );
+            }
+
+            return $code;
+        },
+        $parentCond
+    );
+}
+
+/**
+ * @param iterable<PropertyInfo> $propertyInfos
+ */
+function generatePropertyAttributeInitialization(
+    iterable $propertyInfos,
+    iterable $allConstInfos,
+    ?int $phpVersionIdMinimumCompatibility
+): string {
+    $code = "";
+    foreach ($propertyInfos as $propertyInfo) {
+        foreach ($propertyInfo->attributes as $key => $attribute) {
+            $code .= $attribute->generateCode(
+                "zend_add_property_attribute(class_entry, property_" . $propertyInfo->name->getDeclarationName(),
+                "property_" . $propertyInfo->name->getDeclarationName() . "_" . $key,
+                $allConstInfos,
+                $phpVersionIdMinimumCompatibility
+            );
+        }
+    }
+
+    return $code;
+}
+
+/** @param array<string, FuncInfo> $funcMap */
+function generateOptimizerInfo(array $funcMap): string {
+
     $code = "/* This is a generated file, edit the .stub.php files instead. */\n\n";
 
     $code .= "static const func_info_t func_infos[] = {\n";
 
-    $code .= generateCodeWithConditions($funcInfos, "", function (FuncInfo $funcInfo) {
+    $code .= generateCodeWithConditions($funcMap, "", static function (FuncInfo $funcInfo) {
         return $funcInfo->getOptimizerInfo();
     });
 
@@ -2896,14 +4404,96 @@
 }
 
 /**
- * @param ClassInfo[] $classMap
+ * @param array<int, string[]> $flagsByPhpVersions
+ * @return string[]
+ */
+function generateVersionDependentFlagCode(string $codeTemplate, array $flagsByPhpVersions, ?int $phpVersionIdMinimumCompatibility): array
+{
+    $phpVersions = ALL_PHP_VERSION_IDS;
+    sort($phpVersions);
+    $currentPhpVersion = end($phpVersions);
+
+    // No version compatibility is needed
+    if ($phpVersionIdMinimumCompatibility === null) {
+        if (empty($flagsByPhpVersions[$currentPhpVersion])) {
+            return [];
+        }
+
+        return [sprintf($codeTemplate, implode("|", $flagsByPhpVersions[$currentPhpVersion]))];
+    }
+
+    // Remove flags which depend on a PHP version below the minimally supported one
+    ksort($flagsByPhpVersions);
+    $index = array_search($phpVersionIdMinimumCompatibility, array_keys($flagsByPhpVersions));
+    if ($index === false) {
+        throw new Exception("Missing version dependent flags for PHP version ID \"$phpVersionIdMinimumCompatibility\"");
+    }
+    $flagsByPhpVersions = array_slice($flagsByPhpVersions, $index, null, true);
+
+    // Remove empty version-specific flags
+    $flagsByPhpVersions = array_filter(
+        $flagsByPhpVersions,
+        static function (array $value): bool {
+            return !empty($value);
+    });
+
+    // There are no version-specific flags
+    if (empty($flagsByPhpVersions)) {
+        return [];
+    }
+
+    // Remove version-specific flags which don't differ from the previous one
+    $previousVersionId = null;
+    foreach ($flagsByPhpVersions as $versionId => $versionFlags) {
+        if ($previousVersionId !== null && $flagsByPhpVersions[$previousVersionId] === $versionFlags) {
+            unset($flagsByPhpVersions[$versionId]);
+        } else {
+            $previousVersionId = $versionId;
+        }
+    }
+
+    $flagCount = count($flagsByPhpVersions);
+
+    // Do not add a condition unnecessarily when the only version is the same as the minimally supported one
+    if ($flagCount === 1) {
+        reset($flagsByPhpVersions);
+        $firstVersion = key($flagsByPhpVersions);
+        if ($firstVersion === $phpVersionIdMinimumCompatibility) {
+            return [sprintf($codeTemplate, implode("|", reset($flagsByPhpVersions)))];
+        }
+    }
+
+    // Add the necessary conditions around the code using the version-specific flags
+    $result = [];
+    $i = 0;
+    foreach (array_reverse($flagsByPhpVersions, true) as $version => $versionFlags) {
+        $code = "";
+
+        $if = $i === 0 ? "#if" : "#elif";
+        $endif = $i === $flagCount - 1 ? "#endif\n" : "";
+
+        $code .= "$if (PHP_VERSION_ID >= $version)\n";
+
+        $code .= sprintf($codeTemplate, implode("|", $versionFlags));
+        $code .= $endif;
+
+        $result[] = $code;
+        $i++;
+    }
+
+    return $result;
+}
+
+/**
+ * @param array<string, ClassInfo> $classMap
+ * @param iterable<ConstInfo> $allConstInfos
  * @return array<string, string>
  */
-function generateClassSynopses(array $classMap): array {
+function generateClassSynopses(array $classMap, iterable $allConstInfos): array {
     $result = [];
 
     foreach ($classMap as $classInfo) {
-        $classSynopsis = $classInfo->getClassSynopsisDocument($classMap);
+        $classSynopsis = $classInfo->getClassSynopsisDocument($classMap, $allConstInfos);
         if ($classSynopsis !== null) {
             $result[ClassInfo::getClassSynopsisFilename($classInfo->name) . ".xml"] = $classSynopsis;
         }
@@ -2913,11 +4503,14 @@
 }
 
 /**
- * @param ClassInfo[] $classMap
+ * @param array<string, ClassInfo> $classMap
+ * $param iterable<ConstInfo> $allConstInfos
  * @return array<string, string>
  */
-function replaceClassSynopses(string $targetDirectory, array $classMap): array
+function replaceClassSynopses(string $targetDirectory, array $classMap, iterable $allConstInfos, bool $isVerify): array
 {
+    $existingClassSynopses = [];
+
     $classSynopses = [];
 
     $it = new RecursiveIteratorIterator(
@@ -2962,21 +4555,24 @@
                 continue;
             }
 
-            $firstChild = $classSynopsis->firstElementChild;
-            if ($firstChild === null) {
+            $child = $classSynopsis->firstElementChild;
+            if ($child === null) {
                 continue;
             }
-            $firstChild = $firstChild->firstElementChild;
-            if ($firstChild === null) {
+            $child = $child->lastElementChild;
+            if ($child === null) {
                 continue;
             }
-            $className = $firstChild->textContent;
+            $className = $child->textContent;
             if (!isset($classMap[$className])) {
                 continue;
             }
+
+            $existingClassSynopses[$className] = $className;
+
             $classInfo = $classMap[$className];
 
-            $newClassSynopsis = $classInfo->getClassSynopsisElement($doc, $classMap);
+            $newClassSynopsis = $classInfo->getClassSynopsisElement($doc, $classMap, $allConstInfos);
             if ($newClassSynopsis === null) {
                 continue;
             }
@@ -2994,10 +4590,11 @@
             $replacedXml = preg_replace(
                 [
                     "/REPLACED-ENTITY-([A-Za-z0-9._{}%-]+?;)/",
-                    "/<phpdoc:(classref|exceptionref)\s+xmlns:phpdoc=\"([a-z0-9.:\/]+)\"\s+xmlns=\"([a-z0-9.:\/]+)\"\s+xml:id=\"([a-z0-9._-]+)\"\s*>/i",
-                    "/<phpdoc:(classref|exceptionref)\s+xmlns:phpdoc=\"([a-z0-9.:\/]+)\"\s+xmlns=\"([a-z0-9.:\/]+)\"\s+xmlns:xi=\"([a-z0-9.:\/]+)\"\s+xml:id=\"([a-z0-9._-]+)\"\s*>/i",
-                    "/<phpdoc:(classref|exceptionref)\s+xmlns:phpdoc=\"([a-z0-9.:\/]+)\"\s+xmlns=\"([a-z0-9.:\/]+)\"\s+xmlns:xlink=\"([a-z0-9.:\/]+)\"\s+xmlns:xi=\"([a-z0-9.:\/]+)\"\s+xml:id=\"([a-z0-9._-]+)\"\s*>/i",
-                    "/<phpdoc:(classref|exceptionref)\s+xmlns=\"([a-z0-9.:\/]+)\"\s+xmlns:xlink=\"([a-z0-9.:\/]+)\"\s+xmlns:xi=\"([a-z0-9.:\/]+)\"\s+xmlns:phpdoc=\"([a-z0-9.:\/]+)\"\s+xml:id=\"([a-z0-9._-]+)\"\s*>/i",
+                    '/<phpdoc:(classref|exceptionref)\s+xmlns:phpdoc=\"([^"]+)"\s+xmlns="([^"]+)"\s+xml:id="([^"]+)"\s*>/i',
+                    '/<phpdoc:(classref|exceptionref)\s+xmlns:phpdoc=\"([^"]+)"\s+xmlns="([^"]+)"\s+xmlns:xi="([^"]+)"\s+xml:id="([^"]+)"\s*>/i',
+                    '/<phpdoc:(classref|exceptionref)\s+xmlns:phpdoc=\"([^"]+)"\s+xmlns="([^"]+)"\s+xmlns:xlink="([^"]+)"\s+xmlns:xi="([^"]+)"\s+xml:id="([^"]+)"\s*>/i',
+                    '/<phpdoc:(classref|exceptionref)\s+xmlns:phpdoc=\"([^"]+)"\s+xmlns:xlink="([^"]+)"\s+xmlns:xi="([^"]+)"\s+xmlns="([^"]+)"\s+xml:id="([^"]+)"\s*>/i',
+                    '/<phpdoc:(classref|exceptionref)\s+xmlns=\"([^"]+)\"\s+xmlns:xlink="([^"]+)"\s+xmlns:xi="([^"]+)"\s+xmlns:phpdoc="([^"]+)"\s+xml:id="([^"]+)"\s*>/i',
                 ],
                 [
                     "&$1",
@@ -3004,6 +4601,7 @@
                     "<phpdoc:$1 xml:id=\"$4\" xmlns:phpdoc=\"$2\" xmlns=\"$3\">",
                     "<phpdoc:$1 xml:id=\"$5\" xmlns:phpdoc=\"$2\" xmlns=\"$3\" xmlns:xi=\"$4\">",
                     "<phpdoc:$1 xml:id=\"$6\" xmlns:phpdoc=\"$2\" xmlns=\"$3\" xmlns:xlink=\"$4\" xmlns:xi=\"$5\">",
+                    "<phpdoc:$1 xml:id=\"$6\" xmlns:phpdoc=\"$2\" xmlns=\"$5\" xmlns:xlink=\"$3\" xmlns:xi=\"$4\">",
                     "<phpdoc:$1 xml:id=\"$6\" xmlns:phpdoc=\"$5\" xmlns=\"$2\" xmlns:xlink=\"$3\" xmlns:xi=\"$4\">",
                 ],
                 $replacedXml
@@ -3013,6 +4611,16 @@
         }
     }
 
+    if ($isVerify) {
+        $missingClassSynopses = array_diff_key($classMap, $existingClassSynopses);
+        foreach ($missingClassSynopses as $className => $info) {
+            /** @var ClassInfo $info */
+            if (!$info->isUndocumentable) {
+                echo "Warning: Missing class synopsis for $className\n";
+            }
+        }
+    }
+
     return $classSynopses;
 }
 
@@ -3054,7 +4662,8 @@
  * @param array<string, FuncInfo> $aliasMap
  * @return array<string, string>
  */
-function replaceMethodSynopses(string $targetDirectory, array $funcMap, array $aliasMap): array {
+function replaceMethodSynopses(string $targetDirectory, array $funcMap, array $aliasMap, bool $isVerify): array {
+    $existingMethodSynopses = [];
     $methodSynopses = [];
 
     $it = new RecursiveIteratorIterator(
@@ -3073,6 +4682,35 @@
             continue;
         }
 
+        if ($isVerify) {
+            $matches = [];
+            preg_match("/<refname>\s*([\w:]+)\s*<\/refname>\s*<refpurpose>\s*&Alias;\s*<(?:function|methodname)>\s*([\w:]+)\s*<\/(?:function|methodname)>\s*<\/refpurpose>/i", $xml, $matches);
+            $aliasName = $matches[1] ?? null;
+            $alias = $funcMap[$aliasName] ?? null;
+            $funcName = $matches[2] ?? null;
+            $func = $funcMap[$funcName] ?? null;
+
+            if ($alias &&
+                !$alias->isUndocumentable &&
+                ($func === null || $func->alias === null || $func->alias->__toString() !== $aliasName) &&
+                ($alias->alias === null || $alias->alias->__toString() !== $funcName)
+            ) {
+                echo "Warning: $aliasName()" . ($alias->alias ? " is an alias of " . $alias->alias->__toString() . "(), but it" : "") . " is incorrectly documented as an alias for $funcName()\n";
+            }
+
+            $matches = [];
+            preg_match("/<(?:para|simpara)>\s*(?:&info.function.alias;|&info.method.alias;|&Alias;)\s+<(?:function|methodname)>\s*([\w:]+)\s*<\/(?:function|methodname)>/i", $xml, $matches);
+            $descriptionFuncName = $matches[1] ?? null;
+            $descriptionFunc = $funcMap[$descriptionFuncName] ?? null;
+            if ($descriptionFunc && $funcName !== $descriptionFuncName) {
+                echo "Warning: Alias in the method synopsis description of $pathName doesn't match the alias in the <refpurpose>\n";
+            }
+
+            if ($aliasName) {
+                $existingMethodSynopses[$aliasName] = $aliasName;
+            }
+        }
+
         if (stripos($xml, "<methodsynopsis") === false && stripos($xml, "<constructorsynopsis") === false && stripos($xml, "<destructorsynopsis") === false) {
             continue;
         }
@@ -3114,7 +4752,9 @@
             if (!isset($funcMap[$funcName])) {
                 continue;
             }
+
             $funcInfo = $funcMap[$funcName];
+            $existingMethodSynopses[$funcInfo->name->__toString()] = $funcInfo->name->__toString();
 
             $newMethodSynopsis = $funcInfo->getMethodSynopsisElement($funcMap, $aliasMap, $doc);
             if ($newMethodSynopsis === null) {
@@ -3185,8 +4825,8 @@
             $replacedXml = preg_replace(
                 [
                     "/REPLACED-ENTITY-([A-Za-z0-9._{}%-]+?;)/",
-                    "/<refentry\s+xmlns=\"([a-z0-9.:\/]+)\"\s+xml:id=\"([a-z0-9._-]+)\"\s*>/i",
-                    "/<refentry\s+xmlns=\"([a-z0-9.:\/]+)\"\s+xmlns:xlink=\"([a-z0-9.:\/]+)\"\s+xml:id=\"([a-z0-9._-]+)\"\s*>/i",
+                    '/<refentry\s+xmlns="([^"]+)"\s+xml:id="([^"]+)"\s*>/i',
+                    '/<refentry\s+xmlns="([^"]+)"\s+xmlns:xlink="([^"]+)"\s+xml:id="([^"]+)"\s*>/i',
                 ],
                 [
                     "&$1",
@@ -3200,6 +4840,16 @@
         }
     }
 
+    if ($isVerify) {
+        $missingMethodSynopses = array_diff_key($funcMap, $existingMethodSynopses);
+        foreach ($missingMethodSynopses as $functionName => $info) {
+            /** @var FuncInfo $info */
+            if (!$info->isUndocumentable) {
+                echo "Warning: Missing method synopsis for $functionName()\n";
+            }
+        }
+    }
+
     return $methodSynopses;
 }
 
@@ -3275,13 +4925,13 @@
     }
 
     $isInitialized = true;
-    $version = "4.13.0";
+    $version = "5.0.0";
     $phpParserDir = __DIR__ . "/PHP-Parser-$version";
     if (!is_dir($phpParserDir)) {
         installPhpParser($version, $phpParserDir);
     }
 
-    spl_autoload_register(function(string $class) use($phpParserDir) {
+    spl_autoload_register(static function(string $class) use ($phpParserDir) {
         if (strpos($class, "PhpParser\\") === 0) {
             $fileName = $phpParserDir . "/lib/" . str_replace("\\", "/", $class) . ".php";
             require $fileName;
@@ -3367,7 +5017,6 @@
 
 foreach ($fileInfos as $fileInfo) {
     foreach ($fileInfo->getAllFuncInfos() as $funcInfo) {
-        /** @var FuncInfo $funcInfo */
         $funcMap[$funcInfo->name->__toString()] = $funcInfo;
 
         // TODO: Don't use aliasMap for methodsynopsis?
@@ -3469,7 +5118,7 @@
 if ($generateClassSynopses) {
     $classSynopsesDirectory = getcwd() . "/classsynopses";
 
-    $classSynopses = generateClassSynopses($classMap);
+    $classSynopses = generateClassSynopses($classMap, $context->allConstInfos);
     if (!empty($classSynopses)) {
         if (!file_exists($classSynopsesDirectory)) {
             mkdir($classSynopsesDirectory);
@@ -3484,7 +5133,7 @@
 }
 
 if ($replaceClassSynopses) {
-    $classSynopses = replaceClassSynopses($targetSynopses, $classMap);
+    $classSynopses = replaceClassSynopses($targetSynopses, $classMap, $context->allConstInfos, $verify);
 
     foreach ($classSynopses as $filename => $content) {
         if (file_put_contents($filename, $content)) {
@@ -3511,7 +5160,7 @@
 }
 
 if ($replaceMethodSynopses) {
-    $methodSynopses = replaceMethodSynopses($targetSynopses, $funcMap, $aliasMap);
+    $methodSynopses = replaceMethodSynopses($targetSynopses, $funcMap, $aliasMap, $verify);
 
     foreach ($methodSynopses as $filename => $content) {
         if (file_put_contents($filename, $content)) {

Modified: branches/4.0/MgDev/Oem/php/build/template.rc
===================================================================
--- branches/4.0/MgDev/Oem/php/build/template.rc	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/build/template.rc	2025-05-05 12:41:13 UTC (rev 10139)
@@ -27,7 +27,7 @@
 #endif
 
 #ifndef URL
-#define URL "http://www.php.net/"
+#define URL "https://www.php.net/"
 #endif
 
 #ifndef EXT_VERSION

Modified: branches/4.0/MgDev/Oem/php/include/TSRM/TSRM.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/TSRM/TSRM.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/TSRM/TSRM.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -20,7 +20,8 @@
 # include "main/php_config.h"
 #endif
 
-#include "main/php_stdint.h"
+#include <stdint.h>
+#include <stdbool.h>
 
 #ifdef TSRM_WIN32
 #	ifdef TSRM_EXPORTS
@@ -79,7 +80,7 @@
 #endif
 
 /* startup/shutdown */
-TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, const char *debug_filename);
+TSRM_API bool tsrm_startup(int expected_threads, int expected_resources, int debug_level, const char *debug_filename);
 TSRM_API void tsrm_shutdown(void);
 
 /* environ lock API */
@@ -133,9 +134,10 @@
 
 TSRM_API void *tsrm_get_ls_cache(void);
 TSRM_API size_t tsrm_get_ls_cache_tcb_offset(void);
-TSRM_API uint8_t tsrm_is_main_thread(void);
-TSRM_API uint8_t tsrm_is_shutdown(void);
+TSRM_API bool tsrm_is_main_thread(void);
+TSRM_API bool tsrm_is_shutdown(void);
 TSRM_API const char *tsrm_api_name(void);
+TSRM_API bool tsrm_is_managed_thread(void);
 
 #ifdef TSRM_WIN32
 # define TSRM_TLS __declspec(thread)
@@ -149,10 +151,13 @@
 
 #if !__has_attribute(tls_model) || defined(__FreeBSD__) || defined(__MUSL__) || defined(__HAIKU__)
 # define TSRM_TLS_MODEL_ATTR
+# define TSRM_TLS_MODEL_DEFAULT
 #elif __PIC__
 # define TSRM_TLS_MODEL_ATTR __attribute__((tls_model("initial-exec")))
+# define TSRM_TLS_MODEL_INITIAL_EXEC
 #else
 # define TSRM_TLS_MODEL_ATTR __attribute__((tls_model("local-exec")))
+# define TSRM_TLS_MODEL_LOCAL_EXEC
 #endif
 
 #define TSRM_SHUFFLE_RSRC_ID(rsrc_id)		((rsrc_id)+1)

Modified: branches/4.0/MgDev/Oem/php/include/TSRM/tsrm_win32.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/TSRM/tsrm_win32.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/TSRM/tsrm_win32.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -50,7 +50,6 @@
 
 typedef struct {
 	void	*addr;
-	HANDLE	info;
 	HANDLE	segment;
 	struct	shmid_ds	*descriptor;
 } shm_pair;

Modified: branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_call_graph.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_call_graph.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_call_graph.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -38,7 +38,7 @@
 	bool               send_unpack;  /* Parameters passed by SEND_UNPACK or SEND_ARRAY */
 	bool               named_args;   /* Function has named arguments */
 	bool               is_prototype; /* An overridden child method may be called */
-	int                     num_args;
+	int                     num_args;	/* Number of arguments, excluding named and variadic arguments */
 	zend_send_arg_info      arg_info[1];
 };
 
@@ -60,10 +60,10 @@
 
 BEGIN_EXTERN_C()
 
-ZEND_API int zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph);
+ZEND_API void zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph);
 ZEND_API void zend_analyze_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph);
 ZEND_API zend_call_info **zend_build_call_map(zend_arena **arena, zend_func_info *info, const zend_op_array *op_array);
-ZEND_API int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info);
+ZEND_API void zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info);
 
 END_EXTERN_C()
 

Modified: branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_cfg.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_cfg.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_cfg.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -62,7 +62,6 @@
 |JMP         |ADR|   |   |OP1| - |
 |JMPZ        |   |ADR|   |OP2|FOL|
 |JMPNZ       |   |ADR|   |OP2|FOL|
-|JMPZNZ      |   |ADR|ADR|OP2|EXT|
 |JMPZ_EX     |   |ADR|   |OP2|FOL|
 |JMPNZ_EX    |   |ADR|   |OP2|FOL|
 |JMP_SET     |   |ADR|   |OP2|FOL|
@@ -116,11 +115,11 @@
 
 BEGIN_EXTERN_C()
 
-ZEND_API int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg);
+ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg);
 void zend_cfg_remark_reachable_blocks(const zend_op_array *op_array, zend_cfg *cfg);
-ZEND_API int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg);
-ZEND_API int zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg);
-ZEND_API int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg);
+ZEND_API void zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg);
+ZEND_API void zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg);
+ZEND_API void zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg);
 
 END_EXTERN_C()
 

Modified: branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_dump.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_dump.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_dump.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -22,6 +22,8 @@
 #include "zend_ssa.h"
 #include "zend_dfg.h"
 
+#include <stdint.h>
+
 #define ZEND_DUMP_HIDE_UNREACHABLE     (1<<0)
 #define ZEND_DUMP_RC_INFERENCE         (1<<1)
 #define ZEND_DUMP_CFG                  (1<<2)
@@ -39,8 +41,8 @@
 void zend_dump_phi_placement(const zend_op_array *op_array, const zend_ssa *ssa);
 void zend_dump_variables(const zend_op_array *op_array);
 void zend_dump_ssa_variables(const zend_op_array *op_array, const zend_ssa *ssa, uint32_t dump_flags);
-ZEND_API void zend_dump_ssa_var(const zend_op_array *op_array, const zend_ssa *ssa, int ssa_var_num, zend_uchar var_type, int var_num, uint32_t dump_flags);
-ZEND_API void zend_dump_var(const zend_op_array *op_array, zend_uchar var_type, int var_num);
+ZEND_API void zend_dump_ssa_var(const zend_op_array *op_array, const zend_ssa *ssa, int ssa_var_num, uint8_t var_type, int var_num, uint32_t dump_flags);
+ZEND_API void zend_dump_var(const zend_op_array *op_array, uint8_t var_type, int var_num);
 void zend_dump_op_array_name(const zend_op_array *op_array);
 void zend_dump_const(const zval *zv);
 void zend_dump_ht(HashTable *ht);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_func_info.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_func_info.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_func_info.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -62,8 +62,8 @@
 	const zend_call_info *call_info, const zend_ssa *ssa,
 	zend_class_entry **ce, bool *ce_is_instanceof);
 
-int zend_func_info_startup(void);
-int zend_func_info_shutdown(void);
+zend_result zend_func_info_startup(void);
+zend_result zend_func_info_shutdown(void);
 
 END_EXTERN_C()
 

Modified: branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_inference.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_inference.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_inference.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -26,10 +26,11 @@
 /* Bitmask for type inference (zend_ssa_var_info.type) */
 #include "zend_type_info.h"
 
+#include <stdint.h>
+
 #define MAY_BE_PACKED_GUARD         (1<<27) /* needs packed array guard */
 #define MAY_BE_CLASS_GUARD          (1<<27) /* needs class guard */
 #define MAY_BE_GUARD                (1<<28) /* needs type guard */
-//#define MAY_BE_IN_REG               (1<<29) /* deprecated and not used */
 
 #define MAY_HAVE_DTOR \
 	(MAY_BE_OBJECT|MAY_BE_RESOURCE \
@@ -40,7 +41,7 @@
 	{ \
 		if (opline->opN##_type == IS_CONST) { \
 			zval *zv = CRT_CONSTANT(opline->opN); \
-			return (Z_TYPE_P(zv) == IS_LONG || Z_TYPE_P(zv) == IS_TRUE || Z_TYPE_P(zv) == IS_FALSE || Z_TYPE_P(zv) == IS_NULL); \
+			return (Z_TYPE_P(zv) == IS_LONG); \
 		} else { \
 			return (opline->opN##_type != IS_UNUSED && \
 		        ssa->var_info && \
@@ -57,12 +58,6 @@
 			zval *zv = CRT_CONSTANT(opline->opN); \
 			if (Z_TYPE_P(zv) == IS_LONG) { \
 				return Z_LVAL_P(zv); \
-			} else if (Z_TYPE_P(zv) == IS_TRUE) { \
-				return 1; \
-			} else if (Z_TYPE_P(zv) == IS_FALSE) { \
-				return 0; \
-			} else if (Z_TYPE_P(zv) == IS_NULL) { \
-				return 0; \
 			} \
 		} else if (opline->opN##_type != IS_UNUSED && \
 		    ssa->var_info && \
@@ -80,12 +75,6 @@
 			zval *zv = CRT_CONSTANT(opline->opN); \
 			if (Z_TYPE_P(zv) == IS_LONG) { \
 				return Z_LVAL_P(zv); \
-			} else if (Z_TYPE_P(zv) == IS_TRUE) { \
-				return 1; \
-			} else if (Z_TYPE_P(zv) == IS_FALSE) { \
-				return 0; \
-			} else if (Z_TYPE_P(zv) == IS_NULL) { \
-				return 0; \
 			} \
 		} else if (opline->opN##_type != IS_UNUSED && \
 		    ssa->var_info && \
@@ -101,7 +90,7 @@
 	{ \
 		if (opline->opN##_type == IS_CONST) { \
 			zval *zv = CRT_CONSTANT(opline->opN); \
-			if (Z_TYPE_P(zv) == IS_LONG || Z_TYPE_P(zv) == IS_TRUE || Z_TYPE_P(zv) == IS_FALSE || Z_TYPE_P(zv) == IS_NULL) { \
+			if (Z_TYPE_P(zv) == IS_LONG) { \
 				return 0; \
 			} \
 		} else if (opline->opN##_type != IS_UNUSED && \
@@ -118,7 +107,7 @@
 	{ \
 		if (opline->opN##_type == IS_CONST) { \
 			zval *zv = CRT_CONSTANT(opline->opN); \
-			if (Z_TYPE_P(zv) == IS_LONG || Z_TYPE_P(zv) == IS_TRUE || Z_TYPE_P(zv) == IS_FALSE || Z_TYPE_P(zv) == IS_NULL) { \
+			if (Z_TYPE_P(zv) == IS_LONG) { \
 				return 0; \
 			} \
 		} else if (opline->opN##_type != IS_UNUSED && \
@@ -152,33 +141,15 @@
 #define OP2_RANGE_UNDERFLOW() (_ssa_op2_range_underflow (op_array, ssa, opline, ssa_op))
 #define OP2_RANGE_OVERFLOW()  (_ssa_op2_range_overflow (op_array, ssa, opline, ssa_op))
 
+BEGIN_EXTERN_C()
+ZEND_API uint32_t ZEND_FASTCALL zend_array_type_info(const zval *zv);
+END_EXTERN_C()
+
 static zend_always_inline uint32_t _const_op_type(const zval *zv) {
 	if (Z_TYPE_P(zv) == IS_CONSTANT_AST) {
 		return MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY;
 	} else if (Z_TYPE_P(zv) == IS_ARRAY) {
-		HashTable *ht = Z_ARRVAL_P(zv);
-		uint32_t tmp = MAY_BE_ARRAY;
-		zend_string *str;
-		zval *val;
-
-		if (Z_REFCOUNTED_P(zv)) {
-			tmp |= MAY_BE_RC1 | MAY_BE_RCN;
-		} else {
-			tmp |= MAY_BE_RCN;
-		}
-
-		ZEND_HASH_FOREACH_STR_KEY_VAL(ht, str, val) {
-			if (str) {
-				tmp |= MAY_BE_ARRAY_KEY_STRING;
-			} else {
-				tmp |= MAY_BE_ARRAY_KEY_LONG;
-			}
-			tmp |= 1 << (Z_TYPE_P(val) + MAY_BE_ARRAY_SHIFT);
-		} ZEND_HASH_FOREACH_END();
-		if (HT_IS_PACKED(ht)) {
-			tmp &= ~(MAY_BE_ARRAY_NUMERIC_HASH|MAY_BE_ARRAY_STRING_HASH);
-		}
-		return tmp;
+		return zend_array_type_info(zv);
 	} else {
 		uint32_t tmp = (1 << Z_TYPE_P(zv));
 
@@ -246,16 +217,16 @@
 
 BEGIN_EXTERN_C()
 
-ZEND_API int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa);
-ZEND_API int zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa);
-ZEND_API int zend_ssa_inference(zend_arena **raena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level);
+ZEND_API void zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa);
+ZEND_API void zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa);
+ZEND_API zend_result zend_ssa_inference(zend_arena **raena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level);
 
-ZEND_API uint32_t zend_array_element_type(uint32_t t1, zend_uchar op_type, int write, int insert);
+ZEND_API uint32_t zend_array_element_type(uint32_t t1, uint8_t op_type, int write, int insert);
 
-ZEND_API int zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp);
+ZEND_API bool zend_inference_propagate_range(const zend_op_array *op_array, const zend_ssa *ssa, const zend_op *opline, const zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp);
 
 ZEND_API uint32_t zend_fetch_arg_info_type(
-	const zend_script *script, zend_arg_info *arg_info, zend_class_entry **pce);
+	const zend_script *script, const zend_arg_info *arg_info, zend_class_entry **pce);
 ZEND_API void zend_init_func_return_info(
 	const zend_op_array *op_array, const zend_script *script, zend_ssa_var_info *ret);
 uint32_t zend_get_return_info_from_signature_only(
@@ -262,10 +233,10 @@
 		const zend_function *func, const zend_script *script,
 		zend_class_entry **ce, bool *ce_is_instanceof, bool use_tentative_return_info);
 
-ZEND_API int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, uint32_t t1, uint32_t t2);
-ZEND_API int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa);
+ZEND_API bool zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, const zend_ssa *ssa, uint32_t t1, uint32_t t2);
+ZEND_API bool zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, const zend_ssa *ssa);
 
-ZEND_API int zend_update_type_info(
+ZEND_API zend_result zend_update_type_info(
 	const zend_op_array *op_array, zend_ssa *ssa, const zend_script *script,
 	zend_op *opline, zend_ssa_op *ssa_op, const zend_op **ssa_opcodes,
 	zend_long optimization_level);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_optimizer.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_optimizer.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_optimizer.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -88,17 +88,16 @@
 	zend_op_array  main_op_array;
 	HashTable      function_table;
 	HashTable      class_table;
-	uint32_t       first_early_binding_opline; /* the linked list of delayed declarations */
 } zend_script;
 
 typedef void (*zend_optimizer_pass_t)(zend_script *, void *context);
 
 BEGIN_EXTERN_C()
-ZEND_API int zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level);
+ZEND_API void zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level);
 ZEND_API int zend_optimizer_register_pass(zend_optimizer_pass_t pass);
 ZEND_API void zend_optimizer_unregister_pass(int idx);
-int zend_optimizer_startup(void);
-int zend_optimizer_shutdown(void);
+zend_result zend_optimizer_startup(void);
+zend_result zend_optimizer_shutdown(void);
 END_EXTERN_C()
 
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_ssa.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_ssa.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/Optimizer/zend_ssa.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -67,8 +67,7 @@
 	int                    var;           /* Original CV, VAR or TMP variable index */
 	int                    ssa_var;       /* SSA variable index */
 	int                    block;         /* current BB index */
-	int                    visited : 1;   /* flag to avoid recursive processing */
-	int                    has_range_constraint : 1;
+	bool                   has_range_constraint : 1;
 	zend_ssa_phi         **use_chains;
 	zend_ssa_phi          *sym_use_chain;
 	int                   *sources;       /* Array of SSA IDs that produce this var.
@@ -109,8 +108,8 @@
 	int                    var;            /* original var number; op.var for CVs and following numbers for VARs and TMP_VARs */
 	int                    scc;            /* strongly connected component */
 	int                    definition;     /* opcode that defines this value */
+	int                    use_chain;      /* uses of this value, linked through opN_use_chain */
 	zend_ssa_phi          *definition_phi; /* phi that defines this value */
-	int                    use_chain;      /* uses of this value, linked through opN_use_chain */
 	zend_ssa_phi          *phi_use_chain;  /* uses of this value in Phi, linked through use_chain */
 	zend_ssa_phi          *sym_use_chain;  /* uses of this value in Pi constraints */
 	unsigned int           no_val : 1;     /* value doesn't matter (used as op1 in ZEND_ASSIGN) */
@@ -121,16 +120,16 @@
 
 typedef struct _zend_ssa_var_info {
 	uint32_t               type; /* inferred type (see zend_inference.h) */
+	bool                   has_range : 1;
+	bool                   is_instanceof : 1; /* 0 - class == "ce", 1 - may be child of "ce" */
+	bool                   recursive : 1;
+	bool                   use_as_double : 1;
+	bool                   delayed_fetch_this : 1;
+	bool                   avoid_refcounting : 1;
+	bool                   guarded_reference : 1;
+	bool                   indirect_reference : 1; /* IS_INDIRECT returned by FETCH_DIM_W/FETCH_OBJ_W */
 	zend_ssa_range         range;
 	zend_class_entry      *ce;
-	unsigned int           has_range : 1;
-	unsigned int           is_instanceof : 1; /* 0 - class == "ce", 1 - may be child of "ce" */
-	unsigned int           recursive : 1;
-	unsigned int           use_as_double : 1;
-	unsigned int           delayed_fetch_this : 1;
-	unsigned int           avoid_refcounting : 1;
-	unsigned int           guarded_reference : 1;
-	unsigned int           indirect_reference : 1; /* IS_INDIRECT returned by FETCH_DIM_W/FETCH_OBJ_W */
 } zend_ssa_var_info;
 
 typedef struct _zend_ssa {
@@ -145,10 +144,11 @@
 
 BEGIN_EXTERN_C()
 
-ZEND_API int zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa);
-ZEND_API int zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa);
+ZEND_API zend_result zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa);
+ZEND_API void zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa);
 ZEND_API int zend_ssa_rename_op(const zend_op_array *op_array, const zend_op *opline, uint32_t k, uint32_t build_flags, int ssa_vars_count, zend_ssa_op *ssa_ops, int *var);
-int zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var);
+void zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var);
+void zend_ssa_replace_use_chain(zend_ssa *ssa, int op, int new_op, int var);
 
 void zend_ssa_remove_predecessor(zend_ssa *ssa, int from, int to);
 void zend_ssa_remove_defs_of_instr(zend_ssa *ssa, zend_ssa_op *ssa_op);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -20,7 +20,7 @@
 #ifndef ZEND_H
 #define ZEND_H
 
-#define ZEND_VERSION "4.1.17"
+#define ZEND_VERSION "4.3.20"
 
 #define ZEND_ENGINE_3
 
@@ -39,6 +39,7 @@
 #include "zend_smart_str_public.h"
 #include "zend_smart_string_public.h"
 #include "zend_signal.h"
+#include "zend_max_execution_timer.h"
 
 #define zend_sprintf sprintf
 
@@ -115,6 +116,7 @@
 	zval      *default_properties_table;
 	HashTable *constants_table;
 	uint32_t   ce_flags;
+	HashTable *backed_enum_table;
 } zend_class_mutable_data;
 
 typedef struct _zend_class_dependency {
@@ -181,8 +183,12 @@
 	zend_function *__serialize;
 	zend_function *__unserialize;
 
+	const zend_object_handlers *default_object_handlers;
+
 	/* allocated only if class implements Iterator or IteratorAggregate interface */
 	zend_class_iterator_funcs *iterator_funcs_ptr;
+	/* allocated only if class implements ArrayAccess interface */
+	zend_class_arrayaccess_funcs *arrayaccess_funcs_ptr;
 
 	/* handlers */
 	union {
@@ -273,6 +279,7 @@
 void zend_register_standard_ini_entries(void);
 zend_result zend_post_startup(void);
 void zend_set_utility_values(zend_utility_values *utility_values);
+void zend_unload_modules(void);
 
 ZEND_API ZEND_COLD ZEND_NORETURN void _zend_bailout(const char *filename, uint32_t lineno);
 ZEND_API size_t zend_get_page_size(void);
@@ -295,8 +302,9 @@
 ZEND_API void zend_print_flat_zval_r(zval *expr);
 void zend_print_flat_zval_r_to_buf(smart_str *str, zval *expr);
 
-#define zend_print_variable(var) \
-	zend_print_zval((var), 0)
+static zend_always_inline size_t zend_print_variable(zval *var) {
+	return zend_print_zval(var, 0);
+}
 
 ZEND_API ZEND_COLD void zend_output_debug_string(bool trigger_break, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
 
@@ -350,9 +358,14 @@
 ZEND_API ZEND_COLD void zend_type_error(const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 1, 2);
 ZEND_API ZEND_COLD void zend_argument_count_error(const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 1, 2);
 ZEND_API ZEND_COLD void zend_value_error(const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 1, 2);
+/* type should be one of the BP_VAR_* constants, only special messages happen for isset/empty and unset */
+ZEND_API ZEND_COLD void zend_illegal_container_offset(const zend_string *container, const zval *offset, int type);
 
 ZEND_COLD void zenderror(const char *error);
 
+/* For internal C errors */
+ZEND_API ZEND_COLD ZEND_NORETURN void zend_strerror_noreturn(int type, int errn, const char *message);
+
 /* The following #define is used for code duality in PHP for Engine 1 & 2 */
 #define ZEND_STANDARD_CLASS_DEF_PTR zend_standard_class_def
 extern ZEND_API zend_class_entry *zend_standard_class_def;

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_API.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_API.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_API.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -58,7 +58,8 @@
 	zend_function *function_handler;
 	zend_class_entry *calling_scope;
 	zend_class_entry *called_scope;
-	zend_object *object;
+	zend_object *object; /* Instance of object for method calls */
+	zend_object *closure; /* Closure reference, only if the callable *is* the object */
 } zend_fcall_info_cache;
 
 #define ZEND_NS_NAME(ns, name)			ns "\\" name
@@ -95,6 +96,17 @@
 #define ZEND_NS_FENTRY(ns, zend_name, name, arg_info, flags)		ZEND_RAW_FENTRY(ZEND_NS_NAME(ns, #zend_name), name, arg_info, flags)
 
 #define ZEND_NS_RAW_FENTRY(ns, zend_name, name, arg_info, flags)	ZEND_RAW_FENTRY(ZEND_NS_NAME(ns, zend_name), name, arg_info, flags)
+/**
+ * Note that if you are asserting that a function is compile-time evaluable, you are asserting that
+ *
+ * 1. The function will always have the same result for the same arguments
+ * 2. The function does not depend on global state such as ini settings or locale (e.g. mb_strtolower), number_format(), etc.
+ * 3. The function does not have side effects. It is okay if they throw
+ *    or warn on invalid arguments, as we detect this and will discard the evaluation result.
+ * 4. The function will not take an unreasonable amount of time or memory to compute on code that may be seen in practice.
+ *    (e.g. str_repeat is special cased to check the length instead of using this)
+ */
+#define ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(name, arg_info) ZEND_RAW_FENTRY(#name, zif_##name, arg_info, ZEND_ACC_COMPILE_TIME_EVAL)
 
 /* Same as ZEND_NS_NAMED_FE */
 #define ZEND_NS_RAW_NAMED_FE(ns, zend_name, name, arg_info)			ZEND_NS_RAW_FENTRY(ns, #zend_name, name, arg_info, 0)
@@ -117,6 +129,7 @@
 	{ #name, ZEND_TYPE_INIT_NONE(_ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), default_value },
 #define ZEND_ARG_VARIADIC_INFO(pass_by_ref, name) \
 	{ #name, ZEND_TYPE_INIT_NONE(_ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0)), NULL },
+
 /* Arginfo structures with simple type information */
 #define ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) \
 	{ #name, ZEND_TYPE_INIT_CODE(type_hint, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), NULL },
@@ -124,18 +137,23 @@
 	{ #name, ZEND_TYPE_INIT_CODE(type_hint, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), default_value },
 #define ZEND_ARG_VARIADIC_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) \
 	{ #name, ZEND_TYPE_INIT_CODE(type_hint, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0)), NULL },
+
 /* Arginfo structures with complex type information */
 #define ZEND_ARG_TYPE_MASK(pass_by_ref, name, type_mask, default_value) \
 	{ #name, ZEND_TYPE_INIT_MASK(type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), default_value },
 #define ZEND_ARG_OBJ_TYPE_MASK(pass_by_ref, name, class_name, type_mask, default_value) \
 	{ #name, ZEND_TYPE_INIT_CLASS_CONST_MASK(#class_name, type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), default_value },
+#define ZEND_ARG_VARIADIC_OBJ_TYPE_MASK(pass_by_ref, name, class_name, type_mask) \
+	{ #name, ZEND_TYPE_INIT_CLASS_CONST_MASK(#class_name, type_mask | _ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0)), NULL },
+
 /* Arginfo structures with object type information */
-#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) \
-	{ #name, ZEND_TYPE_INIT_CLASS_CONST(#classname, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), NULL },
-#define ZEND_ARG_OBJ_INFO_WITH_DEFAULT_VALUE(pass_by_ref, name, classname, allow_null, default_value) \
-	{ #name, ZEND_TYPE_INIT_CLASS_CONST(#classname, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), default_value },
-#define ZEND_ARG_VARIADIC_OBJ_INFO(pass_by_ref, name, classname, allow_null) \
-	{ #name, ZEND_TYPE_INIT_CLASS_CONST(#classname, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0)), NULL },
+#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, class_name, allow_null) \
+	{ #name, ZEND_TYPE_INIT_CLASS_CONST(#class_name, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), NULL },
+#define ZEND_ARG_OBJ_INFO_WITH_DEFAULT_VALUE(pass_by_ref, name, class_name, allow_null, default_value) \
+	{ #name, ZEND_TYPE_INIT_CLASS_CONST(#class_name, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), default_value },
+#define ZEND_ARG_VARIADIC_OBJ_INFO(pass_by_ref, name, class_name, allow_null) \
+	{ #name, ZEND_TYPE_INIT_CLASS_CONST(#class_name, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 1, 0)), NULL },
+
 /* Legacy arginfo structures */
 #define ZEND_ARG_ARRAY_INFO(pass_by_ref, name, allow_null) \
 	{ #name, ZEND_TYPE_INIT_CODE(IS_ARRAY, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)), NULL },
@@ -144,7 +162,7 @@
 
 #define ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX2(name, return_reference, required_num_args, class_name, allow_null, is_tentative_return_type) \
 	static const zend_internal_arg_info name[] = { \
-		{ (const char*)(zend_uintptr_t)(required_num_args), \
+		{ (const char*)(uintptr_t)(required_num_args), \
 			ZEND_TYPE_INIT_CLASS_CONST(#class_name, allow_null, _ZEND_ARG_INFO_FLAGS(return_reference, 0, is_tentative_return_type)), NULL },
 
 #define ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, return_reference, required_num_args, class_name, allow_null) \
@@ -158,7 +176,7 @@
 
 #define ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX2(name, return_reference, required_num_args, type, is_tentative_return_type) \
 	static const zend_internal_arg_info name[] = { \
-		{ (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_INIT_MASK(type | _ZEND_ARG_INFO_FLAGS(return_reference, 0, is_tentative_return_type)), NULL },
+		{ (const char*)(uintptr_t)(required_num_args), ZEND_TYPE_INIT_MASK(type | _ZEND_ARG_INFO_FLAGS(return_reference, 0, is_tentative_return_type)), NULL },
 
 #define ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(name, return_reference, required_num_args, type) \
 	ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX2(name, return_reference, required_num_args, type, 0)
@@ -168,7 +186,7 @@
 
 #define ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX2(name, return_reference, required_num_args, class_name, type, is_tentative_return_type) \
 	static const zend_internal_arg_info name[] = { \
-		{ (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_INIT_CLASS_CONST_MASK(#class_name, type | _ZEND_ARG_INFO_FLAGS(return_reference, 0, is_tentative_return_type)), NULL },
+		{ (const char*)(uintptr_t)(required_num_args), ZEND_TYPE_INIT_CLASS_CONST_MASK(#class_name, type | _ZEND_ARG_INFO_FLAGS(return_reference, 0, is_tentative_return_type)), NULL },
 
 #define ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(name, return_reference, required_num_args, class_name, type) \
 	ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX2(name, return_reference, required_num_args, class_name, type, 0)
@@ -178,7 +196,7 @@
 
 #define ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX2(name, return_reference, required_num_args, type, allow_null, is_tentative_return_type) \
 	static const zend_internal_arg_info name[] = { \
-		{ (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_INIT_CODE(type, allow_null, _ZEND_ARG_INFO_FLAGS(return_reference, 0, is_tentative_return_type)), NULL },
+		{ (const char*)(uintptr_t)(required_num_args), ZEND_TYPE_INIT_CODE(type, allow_null, _ZEND_ARG_INFO_FLAGS(return_reference, 0, is_tentative_return_type)), NULL },
 
 #define ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, return_reference, required_num_args, type, allow_null) \
 	ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX2(name, return_reference, required_num_args, type, allow_null, 0)
@@ -191,7 +209,7 @@
 
 #define ZEND_BEGIN_ARG_INFO_EX(name, _unused, return_reference, required_num_args)	\
 	static const zend_internal_arg_info name[] = { \
-		{ (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_INIT_NONE(_ZEND_ARG_INFO_FLAGS(return_reference, 0, 0)), NULL },
+		{ (const char*)(uintptr_t)(required_num_args), ZEND_TYPE_INIT_NONE(_ZEND_ARG_INFO_FLAGS(return_reference, 0, 0)), NULL },
 #define ZEND_BEGIN_ARG_INFO(name, _unused)	\
 	ZEND_BEGIN_ARG_INFO_EX(name, {}, ZEND_RETURN_VALUE, -1)
 #define ZEND_END_ARG_INFO()		};
@@ -255,17 +273,19 @@
 #endif
 
 #define INIT_CLASS_ENTRY(class_container, class_name, functions) \
-	INIT_CLASS_ENTRY_EX(class_container, class_name, sizeof(class_name)-1, functions)
+	INIT_CLASS_ENTRY_EX(class_container, class_name, strlen(class_name), functions)
 
 #define INIT_CLASS_ENTRY_EX(class_container, class_name, class_name_len, functions) \
 	{															\
 		memset(&class_container, 0, sizeof(zend_class_entry)); \
 		class_container.name = zend_string_init_interned(class_name, class_name_len, 1); \
+		class_container.default_object_handlers = &std_object_handlers;	\
 		class_container.info.internal.builtin_functions = functions;	\
 	}
 
 #define INIT_CLASS_ENTRY_INIT_METHODS(class_container, functions) \
 	{															\
+		class_container.default_object_handlers = &std_object_handlers;	\
 		class_container.constructor = NULL;						\
 		class_container.destructor = NULL;						\
 		class_container.clone = NULL;							\
@@ -292,6 +312,7 @@
 		class_container.interfaces = NULL;						\
 		class_container.get_iterator = NULL;					\
 		class_container.iterator_funcs_ptr = NULL;				\
+		class_container.arrayaccess_funcs_ptr = NULL;			\
 		class_container.info.internal.module = NULL;			\
 		class_container.info.internal.builtin_functions = functions;	\
 	}
@@ -309,20 +330,22 @@
 #define CE_DEFAULT_PROPERTIES_TABLE(ce) \
 	zend_class_default_properties_table(ce)
 
+#define CE_BACKED_ENUM_TABLE(ce) \
+	zend_class_backed_enum_table(ce)
+
 #define ZEND_FCI_INITIALIZED(fci) ((fci).size != 0)
+#define ZEND_FCC_INITIALIZED(fcc) ((fcc).function_handler != NULL)
 
 ZEND_API int zend_next_free_module(void);
 
 BEGIN_EXTERN_C()
-ZEND_API zend_result _zend_get_parameters_array_ex(uint32_t param_count, zval *argument_array);
+ZEND_API zend_result zend_get_parameters_array_ex(uint32_t param_count, zval *argument_array);
 
 /* internal function to efficiently copy parameters when executing __call() */
 ZEND_API zend_result zend_copy_parameters_array(uint32_t param_count, zval *argument_array);
 
 #define zend_get_parameters_array(ht, param_count, argument_array) \
-	_zend_get_parameters_array_ex(param_count, argument_array)
-#define zend_get_parameters_array_ex(param_count, argument_array) \
-	_zend_get_parameters_array_ex(param_count, argument_array)
+	zend_get_parameters_array_ex(param_count, argument_array)
 #define zend_parse_parameters_none() \
 	(EXPECTED(ZEND_NUM_ARGS() == 0) ? SUCCESS : (zend_wrong_parameters_none_error(), FAILURE))
 #define zend_parse_parameters_none_throw() \
@@ -338,6 +361,7 @@
 #define zend_parse_parameters_throw(num_args, ...) \
 	zend_parse_parameters(num_args, __VA_ARGS__)
 ZEND_API const char *zend_zval_type_name(const zval *arg);
+ZEND_API const char *zend_zval_value_name(const zval *arg);
 ZEND_API zend_string *zend_zval_get_legacy_type(const zval *arg);
 
 ZEND_API zend_result zend_parse_method_parameters(uint32_t num_args, zval *this_ptr, const char *type_spec, ...);
@@ -367,8 +391,9 @@
 
 ZEND_API zend_result zend_register_class_alias_ex(const char *name, size_t name_len, zend_class_entry *ce, bool persistent);
 
-#define zend_register_class_alias(name, ce) \
-	zend_register_class_alias_ex(name, sizeof(name)-1, ce, 1)
+static zend_always_inline zend_result zend_register_class_alias(const char *name, zend_class_entry *ce) {
+	return zend_register_class_alias_ex(name, strlen(name), ce, 1);
+}
 #define zend_register_ns_class_alias(ns, name, ce) \
 	zend_register_class_alias_ex(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name))-1, ce, 1)
 
@@ -376,9 +401,10 @@
 ZEND_API zend_result zend_disable_class(const char *class_name, size_t class_name_length);
 
 ZEND_API ZEND_COLD void zend_wrong_param_count(void);
+ZEND_API ZEND_COLD void zend_wrong_property_read(zval *object, zval *property);
 
 #define IS_CALLABLE_CHECK_SYNTAX_ONLY (1<<0)
-#define IS_CALLABLE_CHECK_SILENT      (1<<3)
+#define IS_CALLABLE_SUPPRESS_DEPRECATIONS (1<<1)
 
 ZEND_API void zend_release_fcall_info_cache(zend_fcall_info_cache *fcc);
 ZEND_API zend_string *zend_get_callable_name_ex(zval *callable, zend_object *object);
@@ -390,7 +416,7 @@
 ZEND_API bool zend_is_callable(zval *callable, uint32_t check_flags, zend_string **callable_name);
 ZEND_API bool zend_make_callable(zval *callable, zend_string **callable_name);
 ZEND_API const char *zend_get_module_version(const char *module_name);
-ZEND_API int zend_get_module_started(const char *module_name);
+ZEND_API zend_result zend_get_module_started(const char *module_name);
 
 ZEND_API zend_property_info *zend_declare_typed_property(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_type type);
 
@@ -403,6 +429,7 @@
 ZEND_API void zend_declare_property_string(zend_class_entry *ce, const char *name, size_t name_length, const char *value, int access_type);
 ZEND_API void zend_declare_property_stringl(zend_class_entry *ce, const char *name, size_t name_length, const char *value, size_t value_len, int access_type);
 
+ZEND_API zend_class_constant *zend_declare_typed_class_constant(zend_class_entry *ce, zend_string *name, zval *value, int access_type, zend_string *doc_comment, zend_type type);
 ZEND_API zend_class_constant *zend_declare_class_constant_ex(zend_class_entry *ce, zend_string *name, zval *value, int access_type, zend_string *doc_comment);
 ZEND_API void zend_declare_class_constant(zend_class_entry *ce, const char *name, size_t name_length, zval *value);
 ZEND_API void zend_declare_class_constant_null(zend_class_entry *ce, const char *name, size_t name_length);
@@ -412,6 +439,7 @@
 ZEND_API void zend_declare_class_constant_stringl(zend_class_entry *ce, const char *name, size_t name_length, const char *value, size_t value_length);
 ZEND_API void zend_declare_class_constant_string(zend_class_entry *ce, const char *name, size_t name_length, const char *value);
 
+ZEND_API zend_result zend_update_class_constant(zend_class_constant *c, const zend_string *name, zend_class_entry *scope);
 ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type);
 ZEND_API HashTable *zend_separate_class_constants_table(zend_class_entry *class_type);
 
@@ -439,6 +467,26 @@
 	}
 }
 
+static zend_always_inline void zend_class_set_backed_enum_table(zend_class_entry *ce, HashTable *backed_enum_table)
+{
+	if (ZEND_MAP_PTR(ce->mutable_data) && ce->type == ZEND_USER_CLASS) {
+		zend_class_mutable_data *mutable_data = (zend_class_mutable_data*)ZEND_MAP_PTR_GET_IMM(ce->mutable_data);
+		mutable_data->backed_enum_table = backed_enum_table;
+	} else {
+		ce->backed_enum_table = backed_enum_table;
+	}
+}
+
+static zend_always_inline HashTable *zend_class_backed_enum_table(zend_class_entry *ce)
+{
+	if (ZEND_MAP_PTR(ce->mutable_data) && ce->type == ZEND_USER_CLASS) {
+		zend_class_mutable_data *mutable_data = (zend_class_mutable_data*)ZEND_MAP_PTR_GET_IMM(ce->mutable_data);
+		return mutable_data->backed_enum_table;
+	} else {
+		return ce->backed_enum_table;
+	}
+}
+
 ZEND_API void zend_update_property_ex(zend_class_entry *scope, zend_object *object, zend_string *name, zval *value);
 ZEND_API void zend_update_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zval *value);
 ZEND_API void zend_update_property_null(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length);
@@ -473,10 +521,8 @@
 #define ZEND_IS_METHOD_CALL()				(EX(func)->common.scope != NULL)
 
 #define WRONG_PARAM_COUNT					ZEND_WRONG_PARAM_COUNT()
-#define WRONG_PARAM_COUNT_WITH_RETVAL(ret)	ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret)
 #define ZEND_NUM_ARGS()						EX_NUM_ARGS()
 #define ZEND_WRONG_PARAM_COUNT()					{ zend_wrong_param_count(); return; }
-#define ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret)		{ zend_wrong_param_count(); return ret; }
 
 #ifndef ZEND_WIN32
 #define DLEXPORT
@@ -506,18 +552,42 @@
 ZEND_API void add_assoc_reference_ex(zval *arg, const char *key, size_t key_len, zend_reference *ref);
 ZEND_API void add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval *value);
 
-#define add_assoc_long(__arg, __key, __n) add_assoc_long_ex(__arg, __key, strlen(__key), __n)
-#define add_assoc_null(__arg, __key) add_assoc_null_ex(__arg, __key, strlen(__key))
-#define add_assoc_bool(__arg, __key, __b) add_assoc_bool_ex(__arg, __key, strlen(__key), __b)
-#define add_assoc_resource(__arg, __key, __r) add_assoc_resource_ex(__arg, __key, strlen(__key), __r)
-#define add_assoc_double(__arg, __key, __d) add_assoc_double_ex(__arg, __key, strlen(__key), __d)
-#define add_assoc_str(__arg, __key, __str) add_assoc_str_ex(__arg, __key, strlen(__key), __str)
-#define add_assoc_string(__arg, __key, __str) add_assoc_string_ex(__arg, __key, strlen(__key), __str)
-#define add_assoc_stringl(__arg, __key, __str, __length) add_assoc_stringl_ex(__arg, __key, strlen(__key), __str, __length)
-#define add_assoc_array(__arg, __key, __arr) add_assoc_array_ex(__arg, __key, strlen(__key), __arr)
-#define add_assoc_object(__arg, __key, __obj) add_assoc_object_ex(__arg, __key, strlen(__key), __obj)
-#define add_assoc_reference(__arg, __key, __ref) add_assoc_object_ex(__arg, __key, strlen(__key), __ref)
-#define add_assoc_zval(__arg, __key, __value) add_assoc_zval_ex(__arg, __key, strlen(__key), __value)
+static zend_always_inline void add_assoc_long(zval *arg, const char *key, zend_long n) {
+	add_assoc_long_ex(arg, key, strlen(key), n);
+}
+static zend_always_inline void add_assoc_null(zval *arg, const char *key) {
+	add_assoc_null_ex(arg, key, strlen(key));
+}
+static zend_always_inline void add_assoc_bool(zval *arg, const char *key, bool b) {
+	add_assoc_bool_ex(arg, key, strlen(key), b);
+}
+static zend_always_inline void add_assoc_resource(zval *arg, const char *key, zend_resource *r) {
+	add_assoc_resource_ex(arg, key, strlen(key), r);
+}
+static zend_always_inline void add_assoc_double(zval *arg, const char *key, double d) {
+	add_assoc_double_ex(arg, key, strlen(key), d);
+}
+static zend_always_inline void add_assoc_str(zval *arg, const char *key, zend_string *str) {
+	add_assoc_str_ex(arg, key, strlen(key), str);
+}
+static zend_always_inline void add_assoc_string(zval *arg, const char *key, const char *str) {
+	add_assoc_string_ex(arg, key, strlen(key), str);
+}
+static zend_always_inline void add_assoc_stringl(zval *arg, const char *key, const char *str, size_t length) {
+	add_assoc_stringl_ex(arg, key, strlen(key), str, length);
+}
+static zend_always_inline void add_assoc_array(zval *arg, const char *key, zend_array *arr) {
+	add_assoc_array_ex(arg, key, strlen(key), arr);
+}
+static zend_always_inline void add_assoc_object(zval *arg, const char *key, zend_object *obj) {
+	add_assoc_object_ex(arg, key, strlen(key), obj);
+}
+static zend_always_inline void add_assoc_reference(zval *arg, const char *key, zend_reference *ref) {
+	add_assoc_reference_ex(arg, key, strlen(key), ref);
+}
+static zend_always_inline void add_assoc_zval(zval *arg, const char *key, zval *value) {
+	add_assoc_zval_ex(arg, key, strlen(key), value);
+}
 
 ZEND_API void add_index_long(zval *arg, zend_ulong index, zend_long n);
 ZEND_API void add_index_null(zval *arg, zend_ulong index);
@@ -568,20 +638,43 @@
 ZEND_API void add_property_reference_ex(zval *arg, const char *key, size_t key_len, zend_reference *ref);
 ZEND_API void add_property_zval_ex(zval *arg, const char *key, size_t key_len, zval *value);
 
-#define add_property_long(__arg, __key, __n) add_property_long_ex(__arg, __key, strlen(__key), __n)
-#define add_property_null(__arg, __key) add_property_null_ex(__arg, __key, strlen(__key))
-#define add_property_bool(__arg, __key, __b) add_property_bool_ex(__arg, __key, strlen(__key), __b)
-#define add_property_resource(__arg, __key, __r) add_property_resource_ex(__arg, __key, strlen(__key), __r)
-#define add_property_double(__arg, __key, __d) add_property_double_ex(__arg, __key, strlen(__key), __d)
-#define add_property_str(__arg, __key, __str) add_property_str_ex(__arg, __key, strlen(__key), __str)
-#define add_property_string(__arg, __key, __str) add_property_string_ex(__arg, __key, strlen(__key), __str)
-#define add_property_stringl(__arg, __key, __str, __length) add_property_stringl_ex(__arg, __key, strlen(__key), __str, __length)
-#define add_property_array(__arg, __key, __arr) add_property_array_ex(__arg, __key, strlen(__key), __arr)
-#define add_property_object(__arg, __key, __obj) add_property_object_ex(__arg, __key, strlen(__key), __obj)
-#define add_property_reference(__arg, __key, __ref) add_property_reference_ex(__arg, __key, strlen(__key), __ref)
-#define add_property_zval(__arg, __key, __value) add_property_zval_ex(__arg, __key, strlen(__key), __value)
+static zend_always_inline void add_property_long(zval *arg, const char *key, zend_long n) {
+	add_property_long_ex(arg, key, strlen(key), n);
+}
+static zend_always_inline void add_property_null(zval *arg, const char *key) {
+	add_property_null_ex(arg, key, strlen(key));
+}
+static zend_always_inline void add_property_bool(zval *arg, const char *key, bool b) {
+	add_property_bool_ex(arg, key, strlen(key), b);
+}
+static zend_always_inline void add_property_resource(zval *arg, const char *key, zend_resource *r) {
+	add_property_resource_ex(arg, key, strlen(key), r);
+}
+static zend_always_inline void add_property_double(zval *arg, const char *key, double d) {
+	add_property_double_ex(arg, key, strlen(key), d);
+}
+static zend_always_inline void add_property_str(zval *arg, const char *key, zend_string *str) {
+	add_property_str_ex(arg, key, strlen(key), str);
+}
+static zend_always_inline void add_property_string(zval *arg, const char *key, const char *str) {
+	add_property_string_ex(arg, key, strlen(key), str);
+}
+static zend_always_inline void add_property_stringl(zval *arg, const char *key, const char *str, size_t length) {
+	add_property_stringl_ex(arg, key, strlen(key), str, length);
+}
+static zend_always_inline void add_property_array(zval *arg, const char *key, zend_array *arr) {
+	add_property_array_ex(arg, key, strlen(key), arr);
+}
+static zend_always_inline void add_property_object(zval *arg, const char *key, zend_object *obj) {
+	add_property_object_ex(arg, key, strlen(key), obj);
+}
+static zend_always_inline void add_property_reference(zval *arg, const char *key, zend_reference *ref) {
+	add_property_reference_ex(arg, key, strlen(key), ref);
+}
+static zend_always_inline void add_property_zval(zval *arg, const char *key, zval *value) {
+	add_property_zval_ex(arg, key, strlen(key), value);
+}
 
-
 ZEND_API zend_result _call_user_function_impl(zval *object, zval *function_name, zval *retval_ptr, uint32_t param_count, zval params[], HashTable *named_params);
 
 #define call_user_function(function_table, object, function_name, retval_ptr, param_count, params) \
@@ -646,8 +739,91 @@
  */
 ZEND_API zend_result zend_fcall_info_call(zend_fcall_info *fci, zend_fcall_info_cache *fcc, zval *retval, zval *args);
 
+/* Zend FCC API to store and handle PHP userland functions */
+static zend_always_inline bool zend_fcc_equals(const zend_fcall_info_cache* a, const zend_fcall_info_cache* b)
+{
+	if (UNEXPECTED((a->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) &&
+		(b->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE))) {
+		return a->object == b->object
+			&& a->calling_scope == b->calling_scope
+			&& a->closure == b->closure
+			&& zend_string_equals(a->function_handler->common.function_name, b->function_handler->common.function_name)
+		;
+	}
+	return a->function_handler == b->function_handler
+		&& a->object == b->object
+		&& a->calling_scope == b->calling_scope
+		&& a->closure == b->closure
+	;
+}
+
+static zend_always_inline void zend_fcc_addref(zend_fcall_info_cache *fcc)
+{
+	ZEND_ASSERT(ZEND_FCC_INITIALIZED(*fcc) && "FCC Not initialized, possibly refetch trampoline freed by ZPP?");
+	/* If the cached trampoline is set, free it */
+	if (UNEXPECTED(fcc->function_handler == &EG(trampoline))) {
+		zend_function *copy = (zend_function*)emalloc(sizeof(zend_function));
+
+		memcpy(copy, fcc->function_handler, sizeof(zend_function));
+		fcc->function_handler->common.function_name = NULL;
+		fcc->function_handler = copy;
+	}
+	if (fcc->object) {
+		GC_ADDREF(fcc->object);
+	}
+	if (fcc->closure) {
+		GC_ADDREF(fcc->closure);
+	}
+}
+
+static zend_always_inline void zend_fcc_dup(/* restrict */ zend_fcall_info_cache *dest, const zend_fcall_info_cache *src)
+{
+	memcpy(dest, src, sizeof(zend_fcall_info_cache));
+	zend_fcc_addref(dest);
+}
+
+static zend_always_inline void zend_fcc_dtor(zend_fcall_info_cache *fcc)
+{
+	ZEND_ASSERT(fcc->function_handler);
+	if (fcc->object) {
+		OBJ_RELEASE(fcc->object);
+	}
+	/* Need to free potential trampoline (__call/__callStatic) copied function handler before releasing the closure */
+	zend_release_fcall_info_cache(fcc);
+	if (fcc->closure) {
+		OBJ_RELEASE(fcc->closure);
+	}
+	memcpy(fcc, &empty_fcall_info_cache, sizeof(zend_fcall_info_cache));
+}
+
+ZEND_API void zend_get_callable_zval_from_fcc(const zend_fcall_info_cache *fcc, zval *callable);
+
+/* Moved out of zend_gc.h because zend_fcall_info_cache is an unknown type in that header */
+static zend_always_inline void zend_get_gc_buffer_add_fcc(zend_get_gc_buffer *gc_buffer, zend_fcall_info_cache *fcc)
+{
+	ZEND_ASSERT(ZEND_FCC_INITIALIZED(*fcc));
+	if (fcc->object) {
+		zend_get_gc_buffer_add_obj(gc_buffer, fcc->object);
+	}
+	if (fcc->closure) {
+		zend_get_gc_buffer_add_obj(gc_buffer, fcc->closure);
+	}
+}
+
+/* Can only return FAILURE if EG(active) is false during late engine shutdown.
+ * If the call or call setup throws, EG(exception) will be set and the retval
+ * will be UNDEF. Otherwise, the retval will be a non-UNDEF value. */
 ZEND_API zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache);
 
+/* Call the FCI/FCC pair while setting the call return value to the passed zval*. */
+static zend_always_inline zend_result zend_call_function_with_return_value(
+	zend_fcall_info *fci, zend_fcall_info_cache *fci_cache, zval *retval)
+{
+	ZEND_ASSERT(retval && "Use zend_call_function() directly if not providing a retval");
+	fci->retval = retval;
+	return zend_call_function(fci, fci_cache);
+}
+
 /* Call the provided zend_function with the given params.
  * If retval_ptr is NULL, the return value is discarded.
  * If object is NULL, this must be a free function or static call.
@@ -656,6 +832,19 @@
 		zend_function *fn, zend_object *object, zend_class_entry *called_scope, zval *retval_ptr,
 		uint32_t param_count, zval *params, HashTable *named_params);
 
+static zend_always_inline void zend_call_known_fcc(
+	const zend_fcall_info_cache *fcc, zval *retval_ptr, uint32_t param_count, zval *params, HashTable *named_params)
+{
+	zend_function *func = fcc->function_handler;
+	/* Need to copy trampolines as they get released after they are called */
+	if (UNEXPECTED(func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) {
+		func = (zend_function*) emalloc(sizeof(zend_function));
+		memcpy(func, fcc->function_handler, sizeof(zend_function));
+		zend_string_addref(func->op_array.function_name);
+	}
+	zend_call_known_function(func, fcc->object, fcc->called_scope, retval_ptr, param_count, params, named_params);
+}
+
 /* Call the provided zend_function instance method on an object. */
 static zend_always_inline void zend_call_known_instance_method(
 		zend_function *fn, zend_object *object, zval *retval_ptr,
@@ -679,6 +868,13 @@
 ZEND_API void zend_call_known_instance_method_with_2_params(
 		zend_function *fn, zend_object *object, zval *retval_ptr, zval *param1, zval *param2);
 
+/* Call method if it exists. Return FAILURE if method does not exist or call failed.
+ * If FAILURE is returned, retval will be UNDEF. As such, destroying retval unconditionally
+ * is legal. */
+ZEND_API zend_result zend_call_method_if_exists(
+		zend_object *object, zend_string *method_name, zval *retval,
+		uint32_t param_count, zval *params);
+
 ZEND_API zend_result zend_set_hash_symbol(zval *symbol, const char *name, size_t name_length, bool is_ref, int num_symbol_tables, ...);
 
 ZEND_API zend_result zend_delete_global_variable(zend_string *name);
@@ -689,13 +885,16 @@
 ZEND_API zend_result zend_set_local_var(zend_string *name, zval *value, bool force);
 ZEND_API zend_result zend_set_local_var_str(const char *name, size_t len, zval *value, bool force);
 
-static zend_always_inline zend_result zend_forbid_dynamic_call(const char *func_name)
+static zend_always_inline zend_result zend_forbid_dynamic_call(void)
 {
 	zend_execute_data *ex = EG(current_execute_data);
 	ZEND_ASSERT(ex != NULL && ex->func != NULL);
 
 	if (ZEND_CALL_INFO(ex) & ZEND_CALL_DYNAMIC) {
-		zend_throw_error(NULL, "Cannot call %s dynamically", func_name);
+		zend_string *function_or_method_name = get_active_function_or_method_name();
+		zend_throw_error(NULL, "Cannot call %.*s() dynamically",
+			(int) ZSTR_LEN(function_or_method_name), ZSTR_VAL(function_or_method_name));
+		zend_string_release(function_or_method_name);
 		return FAILURE;
 	}
 
@@ -702,12 +901,22 @@
 	return SUCCESS;
 }
 
-ZEND_API ZEND_COLD const char *zend_get_object_type(const zend_class_entry *ce);
+ZEND_API ZEND_COLD const char *zend_get_object_type_case(const zend_class_entry *ce, bool upper_case);
 
-ZEND_API bool zend_is_iterable(zval *iterable);
+static zend_always_inline const char *zend_get_object_type(const zend_class_entry *ce)
+{
+	return zend_get_object_type_case(ce, false);
+}
 
-ZEND_API bool zend_is_countable(zval *countable);
+static zend_always_inline const char *zend_get_object_type_uc(const zend_class_entry *ce)
+{
+	return zend_get_object_type_case(ce, true);
+}
 
+ZEND_API bool zend_is_iterable(const zval *iterable);
+
+ZEND_API bool zend_is_countable(const zval *countable);
+
 ZEND_API zend_result zend_get_default_from_internal_arg_info(
 		zval *default_value_zval, zend_internal_arg_info *arg_info);
 
@@ -720,9 +929,19 @@
 #define CHECK_ZVAL_STRING(z)
 #endif
 
-#define CHECK_ZVAL_NULL_PATH(p) (Z_STRLEN_P(p) != strlen(Z_STRVAL_P(p)))
-#define CHECK_NULL_PATH(p, l) (strlen(p) != (size_t)(l))
+static zend_always_inline bool zend_str_has_nul_byte(const zend_string *str)
+{
+	return ZSTR_LEN(str) != strlen(ZSTR_VAL(str));
+}
+static zend_always_inline bool zend_char_has_nul_byte(const char *s, size_t known_length)
+{
+	return known_length != strlen(s);
+}
 
+/* Compatibility with PHP 8.1 and below */
+#define CHECK_ZVAL_NULL_PATH(p) zend_str_has_nul_byte(Z_STR_P(p))
+#define CHECK_NULL_PATH(p, l) zend_char_has_nul_byte(p, l)
+
 #define ZVAL_STRINGL(z, s, l) do {				\
 		ZVAL_NEW_STR(z, zend_string_init(s, l, 0));		\
 	} while (0)
@@ -1259,7 +1478,10 @@
 		}
 		zv = &ref->val;
 	}
-	zval_ptr_dtor(zv);
+	zval garbage;
+	ZVAL_COPY_VALUE(&garbage, zv);
+	ZVAL_NULL(zv);
+	zval_ptr_dtor(&garbage);
 	ZVAL_ARR(zv, arr);
 	return zv;
 }
@@ -1287,8 +1509,8 @@
 	_(Z_EXPECTED_ARRAY_OR_NULL,		"of type ?array") \
 	_(Z_EXPECTED_ARRAY_OR_LONG,		"of type array|int") \
 	_(Z_EXPECTED_ARRAY_OR_LONG_OR_NULL, "of type array|int|null") \
-	_(Z_EXPECTED_ITERABLE,				"of type iterable") \
-	_(Z_EXPECTED_ITERABLE_OR_NULL,		"of type ?iterable") \
+	_(Z_EXPECTED_ITERABLE,				"of type Traversable|array") \
+	_(Z_EXPECTED_ITERABLE_OR_NULL,		"of type Traversable|array|null") \
 	_(Z_EXPECTED_FUNC,				"a valid callback") \
 	_(Z_EXPECTED_FUNC_OR_NULL,		"a valid callback or null") \
 	_(Z_EXPECTED_RESOURCE,			"of type resource") \
@@ -1301,6 +1523,8 @@
 	_(Z_EXPECTED_DOUBLE_OR_NULL,	"of type ?float") \
 	_(Z_EXPECTED_NUMBER,			"of type int|float") \
 	_(Z_EXPECTED_NUMBER_OR_NULL,	"of type int|float|null") \
+	_(Z_EXPECTED_NUMBER_OR_STRING,			"of type string|int|float") \
+	_(Z_EXPECTED_NUMBER_OR_STRING_OR_NULL,	"of type string|int|float|null") \
 	_(Z_EXPECTED_ARRAY_OR_STRING,	"of type array|string") \
 	_(Z_EXPECTED_ARRAY_OR_STRING_OR_NULL, "of type array|string|null") \
 	_(Z_EXPECTED_STRING_OR_LONG,	"of type string|int") \
@@ -1425,6 +1649,10 @@
 		SEPARATE_ZVAL_NOREF(_arg); \
 	}
 
+/* get the zval* for a previously parsed argument */
+#define Z_PARAM_GET_PREV_ZVAL(dest) \
+	zend_parse_arg_zval_deref(_arg, &dest, 0);
+
 /* old "|" */
 #define Z_PARAM_OPTIONAL \
 	_optional = 1;
@@ -1587,6 +1815,10 @@
 #define Z_PARAM_FUNC_OR_NULL(dest_fci, dest_fcc) \
 	Z_PARAM_FUNC_EX(dest_fci, dest_fcc, 1, 0)
 
+#define Z_PARAM_FUNC_OR_NULL_WITH_ZVAL(dest_fci, dest_fcc, dest_zp) \
+	Z_PARAM_FUNC_EX(dest_fci, dest_fcc, 1, 0) \
+	Z_PARAM_GET_PREV_ZVAL(dest_zp)
+
 /* old "h" */
 #define Z_PARAM_ARRAY_HT_EX2(dest, check_null, deref, separate) \
 		Z_PARAM_PROLOGUE(deref, separate); \
@@ -1664,6 +1896,20 @@
 #define Z_PARAM_NUMBER(dest) \
 	Z_PARAM_NUMBER_EX(dest, 0)
 
+#define Z_PARAM_NUMBER_OR_STR_EX(dest, check_null) \
+	Z_PARAM_PROLOGUE(0, 0); \
+	if (UNEXPECTED(!zend_parse_arg_number_or_str(_arg, &dest, check_null, _i))) { \
+		_expected_type = check_null ? Z_EXPECTED_NUMBER_OR_STRING_OR_NULL : Z_EXPECTED_NUMBER_OR_STRING; \
+		_error_code = ZPP_ERROR_WRONG_ARG; \
+		break; \
+	}
+
+#define Z_PARAM_NUMBER_OR_STR(dest) \
+	Z_PARAM_NUMBER_OR_STR_EX(dest, false)
+
+#define Z_PARAM_NUMBER_OR_STR_OR_NULL(dest) \
+	Z_PARAM_NUMBER_OR_STR_EX(dest, true)
+
 /* old "o" */
 #define Z_PARAM_OBJECT_EX(dest, check_null, deref) \
 		Z_PARAM_PROLOGUE(deref, 0); \
@@ -1861,7 +2107,7 @@
 	Z_PARAM_VARIADIC_EX(spec, dest, dest_num, 0)
 
 #define Z_PARAM_VARIADIC_WITH_NAMED(dest, dest_num, dest_named) do { \
-		int _num_varargs = _num_args - _i; \
+		uint32_t _num_varargs = _num_args - _i; \
 		if (EXPECTED(_num_varargs > 0)) { \
 			dest = _real_arg + 1; \
 			dest_num = _num_varargs; \
@@ -1909,18 +2155,19 @@
 /* Inlined implementations shared by new and old parameter parsing APIs */
 
 ZEND_API bool ZEND_FASTCALL zend_parse_arg_class(zval *arg, zend_class_entry **pce, uint32_t num, bool check_null);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_slow(zval *arg, bool *dest, uint32_t arg_num);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_weak(zval *arg, bool *dest, uint32_t arg_num);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_slow(zval *arg, zend_long *dest, uint32_t arg_num);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(zval *arg, zend_long *dest, uint32_t arg_num);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_slow(zval *arg, double *dest, uint32_t arg_num);
-ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_slow(const zval *arg, bool *dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_bool_weak(const zval *arg, bool *dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_slow(const zval *arg, zend_long *dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_long_weak(const zval *arg, zend_long *dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_slow(const zval *arg, double *dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_double_weak(const zval *arg, double *dest, uint32_t arg_num);
 ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest, uint32_t arg_num);
 ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest, uint32_t arg_num);
 ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_slow(zval *arg, zval **dest, uint32_t arg_num);
+ZEND_API bool ZEND_FASTCALL zend_parse_arg_number_or_str_slow(zval *arg, zval **dest, uint32_t arg_num);
 ZEND_API bool ZEND_FASTCALL zend_parse_arg_str_or_long_slow(zval *arg, zend_string **dest_str, zend_long *dest_long, uint32_t arg_num);
 
-static zend_always_inline bool zend_parse_arg_bool(zval *arg, bool *dest, bool *is_null, bool check_null, uint32_t arg_num)
+static zend_always_inline bool zend_parse_arg_bool(const zval *arg, bool *dest, bool *is_null, bool check_null, uint32_t arg_num)
 {
 	if (check_null) {
 		*is_null = 0;
@@ -1954,7 +2201,7 @@
 	return 1;
 }
 
-static zend_always_inline bool zend_parse_arg_double(zval *arg, double *dest, bool *is_null, bool check_null, uint32_t arg_num)
+static zend_always_inline bool zend_parse_arg_double(const zval *arg, double *dest, bool *is_null, bool check_null, uint32_t arg_num)
 {
 	if (check_null) {
 		*is_null = 0;
@@ -1982,6 +2229,18 @@
 	return 1;
 }
 
+static zend_always_inline bool zend_parse_arg_number_or_str(zval *arg, zval **dest, bool check_null, uint32_t arg_num)
+{
+	if (EXPECTED(Z_TYPE_P(arg) == IS_LONG || Z_TYPE_P(arg) == IS_DOUBLE || Z_TYPE_P(arg) == IS_STRING)) {
+		*dest = arg;
+	} else if (check_null && EXPECTED(Z_TYPE_P(arg) == IS_NULL)) {
+		*dest = NULL;
+	} else {
+		return zend_parse_arg_number_or_str_slow(arg, dest, arg_num);
+	}
+	return true;
+}
+
 static zend_always_inline bool zend_parse_arg_str(zval *arg, zend_string **dest, bool check_null, uint32_t arg_num)
 {
 	if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) {
@@ -2065,7 +2324,7 @@
 	return 1;
 }
 
-static zend_always_inline bool zend_parse_arg_array_ht(zval *arg, HashTable **dest, bool check_null, bool or_object, bool separate)
+static zend_always_inline bool zend_parse_arg_array_ht(const zval *arg, HashTable **dest, bool check_null, bool or_object, bool separate)
 {
 	if (EXPECTED(Z_TYPE_P(arg) == IS_ARRAY)) {
 		*dest = Z_ARRVAL_P(arg);
@@ -2124,7 +2383,7 @@
 	return 1;
 }
 
-static zend_always_inline bool zend_parse_arg_obj(zval *arg, zend_object **dest, zend_class_entry *ce, bool check_null)
+static zend_always_inline bool zend_parse_arg_obj(const zval *arg, zend_object **dest, zend_class_entry *ce, bool check_null)
 {
 	if (EXPECTED(Z_TYPE_P(arg) == IS_OBJECT) &&
 	    (!ce || EXPECTED(instanceof_function(Z_OBJCE_P(arg), ce) != 0))) {

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_alloc.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_alloc.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_alloc.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -27,13 +27,7 @@
 #include "zend.h"
 
 #ifndef ZEND_MM_ALIGNMENT
-# define ZEND_MM_ALIGNMENT Z_UL(8)
-# define ZEND_MM_ALIGNMENT_LOG2 Z_L(3)
-#elif ZEND_MM_ALIGNMENT < 4
-# undef ZEND_MM_ALIGNMENT
-# undef ZEND_MM_ALIGNMENT_LOG2
-# define ZEND_MM_ALIGNMENT Z_UL(4)
-# define ZEND_MM_ALIGNMENT_LOG2 Z_L(2)
+# error "ZEND_MM_ALIGNMENT was not defined during configure"
 #endif
 
 #define ZEND_MM_ALIGNMENT_MASK ~(ZEND_MM_ALIGNMENT - 1)
@@ -68,19 +62,19 @@
 
 BEGIN_EXTERN_C()
 
-ZEND_API char*  ZEND_FASTCALL zend_strndup(const char *s, size_t length) ZEND_ATTRIBUTE_MALLOC;
+ZEND_API ZEND_ATTRIBUTE_MALLOC char*  ZEND_FASTCALL zend_strndup(const char *s, size_t length);
 
-ZEND_API void*  ZEND_FASTCALL _emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_ALLOC_SIZE(1);
-ZEND_API void*  ZEND_FASTCALL _safe_emalloc(size_t nmemb, size_t size, size_t offset ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC;
-ZEND_API void*  ZEND_FASTCALL _safe_malloc(size_t nmemb, size_t size, size_t offset) ZEND_ATTRIBUTE_MALLOC;
+ZEND_API ZEND_ATTRIBUTE_MALLOC void*  ZEND_FASTCALL _emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_ALLOC_SIZE(1);
+ZEND_API ZEND_ATTRIBUTE_MALLOC void*  ZEND_FASTCALL _safe_emalloc(size_t nmemb, size_t size, size_t offset ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
+ZEND_API ZEND_ATTRIBUTE_MALLOC void*  ZEND_FASTCALL _safe_malloc(size_t nmemb, size_t size, size_t offset);
 ZEND_API void   ZEND_FASTCALL _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
-ZEND_API void*  ZEND_FASTCALL _ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_ALLOC_SIZE2(1,2);
+ZEND_API ZEND_ATTRIBUTE_MALLOC void*  ZEND_FASTCALL _ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_ALLOC_SIZE2(1,2);
 ZEND_API void*  ZEND_FASTCALL _erealloc(void *ptr, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_ALLOC_SIZE(2);
 ZEND_API void*  ZEND_FASTCALL _erealloc2(void *ptr, size_t size, size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_ALLOC_SIZE(2);
 ZEND_API void*  ZEND_FASTCALL _safe_erealloc(void *ptr, size_t nmemb, size_t size, size_t offset ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
 ZEND_API void*  ZEND_FASTCALL _safe_realloc(void *ptr, size_t nmemb, size_t size, size_t offset);
-ZEND_API char*  ZEND_FASTCALL _estrdup(const char *s ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC;
-ZEND_API char*  ZEND_FASTCALL _estrndup(const char *s, size_t length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC;
+ZEND_API ZEND_ATTRIBUTE_MALLOC char*  ZEND_FASTCALL _estrdup(const char *s ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
+ZEND_API ZEND_ATTRIBUTE_MALLOC char*  ZEND_FASTCALL _estrndup(const char *s, size_t length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
 ZEND_API size_t ZEND_FASTCALL _zend_mem_block_size(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
 
 #include "zend_alloc_sizes.h"
@@ -89,12 +83,12 @@
 #if !ZEND_DEBUG && defined(HAVE_BUILTIN_CONSTANT_P)
 
 # define _ZEND_BIN_ALLOCATOR_DEF(_num, _size, _elements, _pages, x, y) \
-	ZEND_API void* ZEND_FASTCALL _emalloc_  ## _size(void) ZEND_ATTRIBUTE_MALLOC;
+	ZEND_API ZEND_ATTRIBUTE_MALLOC void* ZEND_FASTCALL _emalloc_  ## _size(void);
 
 ZEND_MM_BINS_INFO(_ZEND_BIN_ALLOCATOR_DEF, x, y)
 
-ZEND_API void* ZEND_FASTCALL _emalloc_large(size_t size) ZEND_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_ALLOC_SIZE(1);
-ZEND_API void* ZEND_FASTCALL _emalloc_huge(size_t size) ZEND_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_ALLOC_SIZE(1);
+ZEND_API ZEND_ATTRIBUTE_MALLOC void* ZEND_FASTCALL _emalloc_large(size_t size) ZEND_ATTRIBUTE_ALLOC_SIZE(1);
+ZEND_API ZEND_ATTRIBUTE_MALLOC void* ZEND_FASTCALL _emalloc_huge(size_t size) ZEND_ATTRIBUTE_ALLOC_SIZE(1);
 
 # define _ZEND_BIN_ALLOCATOR_SELECTOR_START(_num, _size, _elements, _pages, size, y) \
 	((size <= _size) ? _emalloc_ ## _size() :
@@ -185,9 +179,10 @@
 #define estrndup_rel(s, length)					_estrndup((s), (length) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC)
 #define zend_mem_block_size_rel(ptr)			_zend_mem_block_size((ptr) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC)
 
-ZEND_API void * __zend_malloc(size_t len) ZEND_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_ALLOC_SIZE(1);
-ZEND_API void * __zend_calloc(size_t nmemb, size_t len) ZEND_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_ALLOC_SIZE2(1,2);
+ZEND_API ZEND_ATTRIBUTE_MALLOC void * __zend_malloc(size_t len) ZEND_ATTRIBUTE_ALLOC_SIZE(1);
+ZEND_API ZEND_ATTRIBUTE_MALLOC void * __zend_calloc(size_t nmemb, size_t len) ZEND_ATTRIBUTE_ALLOC_SIZE2(1,2);
 ZEND_API void * __zend_realloc(void *p, size_t len) ZEND_ATTRIBUTE_ALLOC_SIZE(2);
+ZEND_API ZEND_ATTRIBUTE_MALLOC char * __zend_strdup(const char *s);
 
 /* Selective persistent/non persistent allocation macros */
 #define pemalloc(size, persistent) ((persistent)?__zend_malloc(size):emalloc(size))
@@ -207,7 +202,7 @@
 #define safe_perealloc(ptr, nmemb, size, offset, persistent)	((persistent)?_safe_realloc((ptr), (nmemb), (size), (offset)):safe_erealloc((ptr), (nmemb), (size), (offset)))
 #define perealloc_recoverable(ptr, size, persistent) ((persistent)?realloc((ptr), (size)):erealloc_recoverable((ptr), (size)))
 #define perealloc2_recoverable(ptr, size, persistent) ((persistent)?realloc((ptr), (size)):erealloc2_recoverable((ptr), (size), (copy_size)))
-#define pestrdup(s, persistent) ((persistent)?strdup(s):estrdup(s))
+#define pestrdup(s, persistent) ((persistent)?__zend_strdup(s):estrdup(s))
 #define pestrndup(s, length, persistent) ((persistent)?zend_strndup((s),(length)):estrndup((s),(length)))
 
 #define pemalloc_rel(size, persistent) ((persistent)?__zend_malloc(size):emalloc_rel(size))
@@ -229,6 +224,7 @@
 
 ZEND_API size_t zend_memory_usage(bool real_usage);
 ZEND_API size_t zend_memory_peak_usage(bool real_usage);
+ZEND_API void zend_memory_reset_peak_usage(void);
 
 /* fast cache for HashTables */
 #define ALLOC_HASHTABLE(ht)	\
@@ -248,7 +244,7 @@
 
 ZEND_API zend_mm_heap *zend_mm_startup(void);
 ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, bool full_shutdown, bool silent);
-ZEND_API void*  ZEND_FASTCALL _zend_mm_alloc(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC;
+ZEND_API ZEND_ATTRIBUTE_MALLOC void*  ZEND_FASTCALL _zend_mm_alloc(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_ALLOC_SIZE(2);
 ZEND_API void   ZEND_FASTCALL _zend_mm_free(zend_mm_heap *heap, void *p ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
 ZEND_API void*  ZEND_FASTCALL _zend_mm_realloc(zend_mm_heap *heap, void *p, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
 ZEND_API void*  ZEND_FASTCALL _zend_mm_realloc2(zend_mm_heap *heap, void *p, size_t size, size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_ast.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_ast.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_ast.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -66,6 +66,7 @@
 	ZEND_AST_ATTRIBUTE_LIST,
 	ZEND_AST_ATTRIBUTE_GROUP,
 	ZEND_AST_MATCH_ARM_LIST,
+	ZEND_AST_MODIFIER_LIST,
 
 	/* 0 child nodes */
 	ZEND_AST_MAGIC_CONST = 0 << ZEND_AST_NUM_CHILDREN_SHIFT,
@@ -144,7 +145,6 @@
 	ZEND_AST_USE_ELEM,
 	ZEND_AST_TRAIT_ALIAS,
 	ZEND_AST_GROUP_USE,
-	ZEND_AST_CLASS_CONST_GROUP,
 	ZEND_AST_ATTRIBUTE,
 	ZEND_AST_MATCH,
 	ZEND_AST_MATCH_ARM,
@@ -161,6 +161,7 @@
 	ZEND_AST_PROP_GROUP,
 	ZEND_AST_PROP_ELEM,
 	ZEND_AST_CONST_ELEM,
+	ZEND_AST_CLASS_CONST_GROUP,
 
 	// Pseudo node for initializing enums
 	ZEND_AST_CONST_ENUM_INIT,
@@ -207,7 +208,6 @@
 	uint32_t start_lineno;
 	uint32_t end_lineno;
 	uint32_t flags;
-	unsigned char *lex_pos;
 	zend_string *doc_comment;
 	zend_string *name;
 	zend_ast *child[5];
@@ -297,7 +297,12 @@
 	zend_string *name, zend_ast *child0, zend_ast *child1, zend_ast *child2, zend_ast *child3, zend_ast *child4
 );
 
+typedef struct {
+	bool had_side_effects;
+} zend_ast_evaluate_ctx;
+
 ZEND_API zend_result ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast, zend_class_entry *scope);
+ZEND_API zend_result ZEND_FASTCALL zend_ast_evaluate_ex(zval *result, zend_ast *ast, zend_class_entry *scope, bool *short_circuited_ptr, zend_ast_evaluate_ctx *ctx);
 ZEND_API zend_string *zend_ast_export(const char *prefix, zend_ast *ast, const char *suffix);
 
 ZEND_API zend_ast_ref * ZEND_FASTCALL zend_ast_copy(zend_ast *ast);
@@ -308,7 +313,7 @@
 ZEND_API void zend_ast_apply(zend_ast *ast, zend_ast_apply_func fn, void *context);
 
 static zend_always_inline size_t zend_ast_size(uint32_t children) {
-	return sizeof(zend_ast) - sizeof(zend_ast *) + sizeof(zend_ast *) * children;
+	return XtOffsetOf(zend_ast, child) + (sizeof(zend_ast *) * children);
 }
 
 static zend_always_inline bool zend_ast_is_special(zend_ast *ast) {
@@ -347,6 +352,9 @@
 	if (ast->kind == ZEND_AST_ZVAL) {
 		zval *zv = zend_ast_get_zval(ast);
 		return Z_LINENO_P(zv);
+	} else if (ast->kind == ZEND_AST_CONSTANT) {
+		zval *zv = &((zend_ast_zval *) ast)->val;
+		return Z_LINENO_P(zv);
 	} else {
 		return ast->lineno;
 	}
@@ -355,6 +363,9 @@
 static zend_always_inline zend_ast *zend_ast_create_binary_op(uint32_t opcode, zend_ast *op0, zend_ast *op1) {
 	return zend_ast_create_ex(ZEND_AST_BINARY_OP, opcode, op0, op1);
 }
+
+zend_ast *zend_ast_create_concat_op(zend_ast *op0, zend_ast *op1);
+
 static zend_always_inline zend_ast *zend_ast_create_assign_op(uint32_t opcode, zend_ast *op0, zend_ast *op1) {
 	return zend_ast_create_ex(ZEND_AST_ASSIGN_OP, opcode, op0, op1);
 }

Added: branches/4.0/MgDev/Oem/php/include/Zend/zend_atomic.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_atomic.h	                        (rev 0)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_atomic.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -0,0 +1,179 @@
+/*
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.01 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | https://www.php.net/license/3_01.txt                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license at php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Authors: Levi Morrison <morrison.levi at gmail.com>                     |
+   +----------------------------------------------------------------------+
+ */
+
+#ifndef ZEND_ATOMIC_H
+#define ZEND_ATOMIC_H
+
+#include "zend_portability.h"
+
+#include <stdbool.h>
+
+#define ZEND_GCC_PREREQ(x, y) \
+	((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || (__GNUC__ > (x)))
+
+/* Builtins are used to avoid library linkage */
+#if __has_feature(c_atomic) && defined(__clang__)
+#define	HAVE_C11_ATOMICS 1
+#elif ZEND_GCC_PREREQ(4, 7)
+#define	HAVE_GNUC_ATOMICS 1
+#elif defined(__GNUC__)
+#define	HAVE_SYNC_ATOMICS 1
+#elif !defined(ZEND_WIN32)
+#define HAVE_NO_ATOMICS 1
+#endif
+
+#undef ZEND_GCC_PREREQ
+
+/* Treat zend_atomic_* types as opaque. They have definitions only for size
+ * and alignment purposes.
+ */
+
+#if defined(ZEND_WIN32) || defined(HAVE_SYNC_ATOMICS)
+typedef struct zend_atomic_bool_s {
+	volatile char value;
+} zend_atomic_bool;
+#elif defined(HAVE_C11_ATOMICS)
+typedef struct zend_atomic_bool_s {
+	_Atomic(bool) value;
+} zend_atomic_bool;
+#else
+typedef struct zend_atomic_bool_s {
+	volatile bool value;
+} zend_atomic_bool;
+#endif
+
+BEGIN_EXTERN_C()
+
+#ifdef ZEND_WIN32
+
+#ifndef InterlockedExchange8
+#define InterlockedExchange8 _InterlockedExchange8
+#endif
+#ifndef InterlockedOr8
+#define InterlockedOr8 _InterlockedOr8
+#endif
+
+#define ZEND_ATOMIC_BOOL_INIT(obj, desired) ((obj)->value = (desired))
+
+static zend_always_inline bool zend_atomic_bool_exchange_ex(zend_atomic_bool *obj, bool desired) {
+	return InterlockedExchange8(&obj->value, desired);
+}
+
+/* On this platform it is non-const due to Iterlocked API*/
+static zend_always_inline bool zend_atomic_bool_load_ex(zend_atomic_bool *obj) {
+	/* Or'ing with false won't change the value. */
+	return InterlockedOr8(&obj->value, false);
+}
+
+static zend_always_inline void zend_atomic_bool_store_ex(zend_atomic_bool *obj, bool desired) {
+	(void)InterlockedExchange8(&obj->value, desired);
+}
+
+#elif defined(HAVE_C11_ATOMICS)
+
+#define ZEND_ATOMIC_BOOL_INIT(obj, desired) __c11_atomic_init(&(obj)->value, (desired))
+
+static zend_always_inline bool zend_atomic_bool_exchange_ex(zend_atomic_bool *obj, bool desired) {
+	return __c11_atomic_exchange(&obj->value, desired, __ATOMIC_SEQ_CST);
+}
+
+static zend_always_inline bool zend_atomic_bool_load_ex(const zend_atomic_bool *obj) {
+	return __c11_atomic_load(&obj->value, __ATOMIC_SEQ_CST);
+}
+
+static zend_always_inline void zend_atomic_bool_store_ex(zend_atomic_bool *obj, bool desired) {
+	__c11_atomic_store(&obj->value, desired, __ATOMIC_SEQ_CST);
+}
+
+#elif defined(HAVE_GNUC_ATOMICS)
+
+#define ZEND_ATOMIC_BOOL_INIT(obj, desired) ((obj)->value = (desired))
+
+static zend_always_inline bool zend_atomic_bool_exchange_ex(zend_atomic_bool *obj, bool desired) {
+	bool prev = false;
+	__atomic_exchange(&obj->value, &desired, &prev, __ATOMIC_SEQ_CST);
+	return prev;
+}
+
+static zend_always_inline bool zend_atomic_bool_load_ex(const zend_atomic_bool *obj) {
+	bool prev = false;
+	__atomic_load(&obj->value, &prev, __ATOMIC_SEQ_CST);
+	return prev;
+}
+
+static zend_always_inline void zend_atomic_bool_store_ex(zend_atomic_bool *obj, bool desired) {
+	__atomic_store(&obj->value, &desired, __ATOMIC_SEQ_CST);
+}
+
+#elif defined(HAVE_SYNC_ATOMICS)
+
+#define ZEND_ATOMIC_BOOL_INIT(obj, desired) ((obj)->value = (desired))
+
+static zend_always_inline bool zend_atomic_bool_exchange_ex(zend_atomic_bool *obj, bool desired) {
+	bool prev = __sync_lock_test_and_set(&obj->value, desired);
+
+	/* __sync_lock_test_and_set only does an acquire barrier, so sync
+	 * immediately after.
+	 */
+	__sync_synchronize();
+	return prev;
+}
+
+static zend_always_inline bool zend_atomic_bool_load_ex(zend_atomic_bool *obj) {
+	/* Or'ing false won't change the value */
+	return __sync_fetch_and_or(&obj->value, false);
+}
+
+static zend_always_inline void zend_atomic_bool_store_ex(zend_atomic_bool *obj, bool desired) {
+	__sync_synchronize();
+	obj->value = desired;
+	__sync_synchronize();
+}
+
+#elif defined(HAVE_NO_ATOMICS)
+
+#warning No atomics support detected. Please open an issue with platform details.
+
+#define ZEND_ATOMIC_BOOL_INIT(obj, desired) ((obj)->value = (desired))
+
+static zend_always_inline void zend_atomic_bool_store_ex(zend_atomic_bool *obj, bool desired) {
+	obj->value = desired;
+}
+
+static zend_always_inline bool zend_atomic_bool_load_ex(const zend_atomic_bool *obj) {
+	return obj->value;
+}
+
+static zend_always_inline bool zend_atomic_bool_exchange_ex(zend_atomic_bool *obj, bool desired) {
+	bool prev = obj->value;
+	obj->value = desired;
+	return prev;
+}
+
+#endif
+
+ZEND_API void zend_atomic_bool_init(zend_atomic_bool *obj, bool desired);
+ZEND_API bool zend_atomic_bool_exchange(zend_atomic_bool *obj, bool desired);
+ZEND_API void zend_atomic_bool_store(zend_atomic_bool *obj, bool desired);
+
+#if defined(ZEND_WIN32) || defined(HAVE_SYNC_ATOMICS)
+/* On these platforms it is non-const due to underlying APIs. */
+ZEND_API bool zend_atomic_bool_load(zend_atomic_bool *obj);
+#else
+ZEND_API bool zend_atomic_bool_load(const zend_atomic_bool *obj);
+#endif
+
+END_EXTERN_C()
+
+#endif

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_attributes.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_attributes.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_attributes.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -40,6 +40,10 @@
 BEGIN_EXTERN_C()
 
 extern ZEND_API zend_class_entry *zend_ce_attribute;
+extern ZEND_API zend_class_entry *zend_ce_allow_dynamic_properties;
+extern ZEND_API zend_class_entry *zend_ce_sensitive_parameter;
+extern ZEND_API zend_class_entry *zend_ce_sensitive_parameter_value;
+extern ZEND_API zend_class_entry *zend_ce_override;
 
 typedef struct {
 	zend_string *name;
@@ -74,6 +78,7 @@
 ZEND_API zend_string *zend_get_attribute_target_names(uint32_t targets);
 ZEND_API bool zend_is_attribute_repeated(HashTable *attributes, zend_attribute *attr);
 
+ZEND_API zend_internal_attribute *zend_mark_internal_attribute(zend_class_entry *ce);
 ZEND_API zend_internal_attribute *zend_internal_attribute_register(zend_class_entry *ce, uint32_t flags);
 ZEND_API zend_internal_attribute *zend_internal_attribute_get(zend_string *lcname);
 
@@ -81,6 +86,8 @@
 		HashTable **attributes, zend_string *name, uint32_t argc,
 		uint32_t flags, uint32_t offset, uint32_t lineno);
 
+uint32_t zend_attribute_attribute_get_flags(zend_attribute *attr, zend_class_entry *scope);
+
 END_EXTERN_C()
 
 static zend_always_inline zend_attribute *zend_add_class_attribute(zend_class_entry *ce, zend_string *name, uint32_t argc)

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_attributes_arginfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_attributes_arginfo.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_attributes_arginfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 3fd949e1b9f49666bed3081ed1e8e711acd9f49c */
+ * Stub hash: 32f0458c20f04099e353a8300ffb19e40bc38f69 */
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Attribute___construct, 0, 0, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "Attribute::TARGET_ALL")
@@ -8,9 +8,31 @@
 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReturnTypeWillChange___construct, 0, 0, 0)
 ZEND_END_ARG_INFO()
 
+#define arginfo_class_AllowDynamicProperties___construct arginfo_class_ReturnTypeWillChange___construct
 
+#define arginfo_class_SensitiveParameter___construct arginfo_class_ReturnTypeWillChange___construct
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SensitiveParameterValue___construct, 0, 0, 1)
+	ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SensitiveParameterValue_getValue, 0, 0, IS_MIXED, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SensitiveParameterValue___debugInfo, 0, 0, IS_ARRAY, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_Override___construct arginfo_class_ReturnTypeWillChange___construct
+
+
 ZEND_METHOD(Attribute, __construct);
 ZEND_METHOD(ReturnTypeWillChange, __construct);
+ZEND_METHOD(AllowDynamicProperties, __construct);
+ZEND_METHOD(SensitiveParameter, __construct);
+ZEND_METHOD(SensitiveParameterValue, __construct);
+ZEND_METHOD(SensitiveParameterValue, getValue);
+ZEND_METHOD(SensitiveParameterValue, __debugInfo);
+ZEND_METHOD(Override, __construct);
 
 
 static const zend_function_entry class_Attribute_methods[] = {
@@ -24,6 +46,32 @@
 	ZEND_FE_END
 };
 
+
+static const zend_function_entry class_AllowDynamicProperties_methods[] = {
+	ZEND_ME(AllowDynamicProperties, __construct, arginfo_class_AllowDynamicProperties___construct, ZEND_ACC_PUBLIC)
+	ZEND_FE_END
+};
+
+
+static const zend_function_entry class_SensitiveParameter_methods[] = {
+	ZEND_ME(SensitiveParameter, __construct, arginfo_class_SensitiveParameter___construct, ZEND_ACC_PUBLIC)
+	ZEND_FE_END
+};
+
+
+static const zend_function_entry class_SensitiveParameterValue_methods[] = {
+	ZEND_ME(SensitiveParameterValue, __construct, arginfo_class_SensitiveParameterValue___construct, ZEND_ACC_PUBLIC)
+	ZEND_ME(SensitiveParameterValue, getValue, arginfo_class_SensitiveParameterValue_getValue, ZEND_ACC_PUBLIC)
+	ZEND_ME(SensitiveParameterValue, __debugInfo, arginfo_class_SensitiveParameterValue___debugInfo, ZEND_ACC_PUBLIC)
+	ZEND_FE_END
+};
+
+
+static const zend_function_entry class_Override_methods[] = {
+	ZEND_ME(Override, __construct, arginfo_class_Override___construct, ZEND_ACC_PUBLIC)
+	ZEND_FE_END
+};
+
 static zend_class_entry *register_class_Attribute(void)
 {
 	zend_class_entry ce, *class_entry;
@@ -32,6 +80,54 @@
 	class_entry = zend_register_internal_class_ex(&ce, NULL);
 	class_entry->ce_flags |= ZEND_ACC_FINAL;
 
+	zval const_TARGET_CLASS_value;
+	ZVAL_LONG(&const_TARGET_CLASS_value, ZEND_ATTRIBUTE_TARGET_CLASS);
+	zend_string *const_TARGET_CLASS_name = zend_string_init_interned("TARGET_CLASS", sizeof("TARGET_CLASS") - 1, 1);
+	zend_declare_typed_class_constant(class_entry, const_TARGET_CLASS_name, &const_TARGET_CLASS_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release(const_TARGET_CLASS_name);
+
+	zval const_TARGET_FUNCTION_value;
+	ZVAL_LONG(&const_TARGET_FUNCTION_value, ZEND_ATTRIBUTE_TARGET_FUNCTION);
+	zend_string *const_TARGET_FUNCTION_name = zend_string_init_interned("TARGET_FUNCTION", sizeof("TARGET_FUNCTION") - 1, 1);
+	zend_declare_typed_class_constant(class_entry, const_TARGET_FUNCTION_name, &const_TARGET_FUNCTION_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release(const_TARGET_FUNCTION_name);
+
+	zval const_TARGET_METHOD_value;
+	ZVAL_LONG(&const_TARGET_METHOD_value, ZEND_ATTRIBUTE_TARGET_METHOD);
+	zend_string *const_TARGET_METHOD_name = zend_string_init_interned("TARGET_METHOD", sizeof("TARGET_METHOD") - 1, 1);
+	zend_declare_typed_class_constant(class_entry, const_TARGET_METHOD_name, &const_TARGET_METHOD_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release(const_TARGET_METHOD_name);
+
+	zval const_TARGET_PROPERTY_value;
+	ZVAL_LONG(&const_TARGET_PROPERTY_value, ZEND_ATTRIBUTE_TARGET_PROPERTY);
+	zend_string *const_TARGET_PROPERTY_name = zend_string_init_interned("TARGET_PROPERTY", sizeof("TARGET_PROPERTY") - 1, 1);
+	zend_declare_typed_class_constant(class_entry, const_TARGET_PROPERTY_name, &const_TARGET_PROPERTY_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release(const_TARGET_PROPERTY_name);
+
+	zval const_TARGET_CLASS_CONSTANT_value;
+	ZVAL_LONG(&const_TARGET_CLASS_CONSTANT_value, ZEND_ATTRIBUTE_TARGET_CLASS_CONST);
+	zend_string *const_TARGET_CLASS_CONSTANT_name = zend_string_init_interned("TARGET_CLASS_CONSTANT", sizeof("TARGET_CLASS_CONSTANT") - 1, 1);
+	zend_declare_typed_class_constant(class_entry, const_TARGET_CLASS_CONSTANT_name, &const_TARGET_CLASS_CONSTANT_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release(const_TARGET_CLASS_CONSTANT_name);
+
+	zval const_TARGET_PARAMETER_value;
+	ZVAL_LONG(&const_TARGET_PARAMETER_value, ZEND_ATTRIBUTE_TARGET_PARAMETER);
+	zend_string *const_TARGET_PARAMETER_name = zend_string_init_interned("TARGET_PARAMETER", sizeof("TARGET_PARAMETER") - 1, 1);
+	zend_declare_typed_class_constant(class_entry, const_TARGET_PARAMETER_name, &const_TARGET_PARAMETER_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release(const_TARGET_PARAMETER_name);
+
+	zval const_TARGET_ALL_value;
+	ZVAL_LONG(&const_TARGET_ALL_value, ZEND_ATTRIBUTE_TARGET_ALL);
+	zend_string *const_TARGET_ALL_name = zend_string_init_interned("TARGET_ALL", sizeof("TARGET_ALL") - 1, 1);
+	zend_declare_typed_class_constant(class_entry, const_TARGET_ALL_name, &const_TARGET_ALL_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release(const_TARGET_ALL_name);
+
+	zval const_IS_REPEATABLE_value;
+	ZVAL_LONG(&const_IS_REPEATABLE_value, ZEND_ATTRIBUTE_IS_REPEATABLE);
+	zend_string *const_IS_REPEATABLE_name = zend_string_init_interned("IS_REPEATABLE", sizeof("IS_REPEATABLE") - 1, 1);
+	zend_declare_typed_class_constant(class_entry, const_IS_REPEATABLE_name, &const_IS_REPEATABLE_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release(const_IS_REPEATABLE_name);
+
 	zval property_flags_default_value;
 	ZVAL_UNDEF(&property_flags_default_value);
 	zend_string *property_flags_name = zend_string_init("flags", sizeof("flags") - 1, 1);
@@ -38,6 +134,13 @@
 	zend_declare_typed_property(class_entry, property_flags_name, &property_flags_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release(property_flags_name);
 
+	zend_string *attribute_name_Attribute_class_Attribute_0 = zend_string_init_interned("Attribute", sizeof("Attribute") - 1, 1);
+	zend_attribute *attribute_Attribute_class_Attribute_0 = zend_add_class_attribute(class_entry, attribute_name_Attribute_class_Attribute_0, 1);
+	zend_string_release(attribute_name_Attribute_class_Attribute_0);
+	zval attribute_Attribute_class_Attribute_0_arg0;
+	ZVAL_LONG(&attribute_Attribute_class_Attribute_0_arg0, ZEND_ATTRIBUTE_TARGET_CLASS);
+	ZVAL_COPY_VALUE(&attribute_Attribute_class_Attribute_0->args[0].value, &attribute_Attribute_class_Attribute_0_arg0);
+
 	return class_entry;
 }
 
@@ -49,5 +152,83 @@
 	class_entry = zend_register_internal_class_ex(&ce, NULL);
 	class_entry->ce_flags |= ZEND_ACC_FINAL;
 
+	zend_string *attribute_name_Attribute_class_ReturnTypeWillChange_0 = zend_string_init_interned("Attribute", sizeof("Attribute") - 1, 1);
+	zend_attribute *attribute_Attribute_class_ReturnTypeWillChange_0 = zend_add_class_attribute(class_entry, attribute_name_Attribute_class_ReturnTypeWillChange_0, 1);
+	zend_string_release(attribute_name_Attribute_class_ReturnTypeWillChange_0);
+	zval attribute_Attribute_class_ReturnTypeWillChange_0_arg0;
+	ZVAL_LONG(&attribute_Attribute_class_ReturnTypeWillChange_0_arg0, ZEND_ATTRIBUTE_TARGET_METHOD);
+	ZVAL_COPY_VALUE(&attribute_Attribute_class_ReturnTypeWillChange_0->args[0].value, &attribute_Attribute_class_ReturnTypeWillChange_0_arg0);
+
 	return class_entry;
 }
+
+static zend_class_entry *register_class_AllowDynamicProperties(void)
+{
+	zend_class_entry ce, *class_entry;
+
+	INIT_CLASS_ENTRY(ce, "AllowDynamicProperties", class_AllowDynamicProperties_methods);
+	class_entry = zend_register_internal_class_ex(&ce, NULL);
+	class_entry->ce_flags |= ZEND_ACC_FINAL;
+
+	zend_string *attribute_name_Attribute_class_AllowDynamicProperties_0 = zend_string_init_interned("Attribute", sizeof("Attribute") - 1, 1);
+	zend_attribute *attribute_Attribute_class_AllowDynamicProperties_0 = zend_add_class_attribute(class_entry, attribute_name_Attribute_class_AllowDynamicProperties_0, 1);
+	zend_string_release(attribute_name_Attribute_class_AllowDynamicProperties_0);
+	zval attribute_Attribute_class_AllowDynamicProperties_0_arg0;
+	ZVAL_LONG(&attribute_Attribute_class_AllowDynamicProperties_0_arg0, ZEND_ATTRIBUTE_TARGET_CLASS);
+	ZVAL_COPY_VALUE(&attribute_Attribute_class_AllowDynamicProperties_0->args[0].value, &attribute_Attribute_class_AllowDynamicProperties_0_arg0);
+
+	return class_entry;
+}
+
+static zend_class_entry *register_class_SensitiveParameter(void)
+{
+	zend_class_entry ce, *class_entry;
+
+	INIT_CLASS_ENTRY(ce, "SensitiveParameter", class_SensitiveParameter_methods);
+	class_entry = zend_register_internal_class_ex(&ce, NULL);
+	class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+	zend_string *attribute_name_Attribute_class_SensitiveParameter_0 = zend_string_init_interned("Attribute", sizeof("Attribute") - 1, 1);
+	zend_attribute *attribute_Attribute_class_SensitiveParameter_0 = zend_add_class_attribute(class_entry, attribute_name_Attribute_class_SensitiveParameter_0, 1);
+	zend_string_release(attribute_name_Attribute_class_SensitiveParameter_0);
+	zval attribute_Attribute_class_SensitiveParameter_0_arg0;
+	ZVAL_LONG(&attribute_Attribute_class_SensitiveParameter_0_arg0, ZEND_ATTRIBUTE_TARGET_PARAMETER);
+	ZVAL_COPY_VALUE(&attribute_Attribute_class_SensitiveParameter_0->args[0].value, &attribute_Attribute_class_SensitiveParameter_0_arg0);
+
+	return class_entry;
+}
+
+static zend_class_entry *register_class_SensitiveParameterValue(void)
+{
+	zend_class_entry ce, *class_entry;
+
+	INIT_CLASS_ENTRY(ce, "SensitiveParameterValue", class_SensitiveParameterValue_methods);
+	class_entry = zend_register_internal_class_ex(&ce, NULL);
+	class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES|ZEND_ACC_NOT_SERIALIZABLE;
+
+	zval property_value_default_value;
+	ZVAL_UNDEF(&property_value_default_value);
+	zend_string *property_value_name = zend_string_init("value", sizeof("value") - 1, 1);
+	zend_declare_typed_property(class_entry, property_value_name, &property_value_default_value, ZEND_ACC_PRIVATE|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ANY));
+	zend_string_release(property_value_name);
+
+	return class_entry;
+}
+
+static zend_class_entry *register_class_Override(void)
+{
+	zend_class_entry ce, *class_entry;
+
+	INIT_CLASS_ENTRY(ce, "Override", class_Override_methods);
+	class_entry = zend_register_internal_class_ex(&ce, NULL);
+	class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
+
+	zend_string *attribute_name_Attribute_class_Override_0 = zend_string_init_interned("Attribute", sizeof("Attribute") - 1, 1);
+	zend_attribute *attribute_Attribute_class_Override_0 = zend_add_class_attribute(class_entry, attribute_name_Attribute_class_Override_0, 1);
+	zend_string_release(attribute_name_Attribute_class_Override_0);
+	zval attribute_Attribute_class_Override_0_arg0;
+	ZVAL_LONG(&attribute_Attribute_class_Override_0_arg0, ZEND_ATTRIBUTE_TARGET_METHOD);
+	ZVAL_COPY_VALUE(&attribute_Attribute_class_Override_0->args[0].value, &attribute_Attribute_class_Override_0_arg0);
+
+	return class_entry;
+}

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_bitset.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_bitset.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_bitset.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -19,6 +19,13 @@
 #ifndef _ZEND_BITSET_H_
 #define _ZEND_BITSET_H_
 
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include "zend_portability.h"
+#include "zend_long.h"
+
 typedef zend_ulong *zend_bitset;
 
 #define ZEND_BITSET_ELM_SIZE sizeof(zend_ulong)

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_builtin_functions_arginfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_builtin_functions_arginfo.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_builtin_functions_arginfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: f87d92c002674c431827895a8d8b3a5da3b95482 */
+ * Stub hash: 12899073f3791c5da31aa555c0e612ee1faadf55 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_version, 0, 0, IS_STRING, 0)
 ZEND_END_ARG_INFO()
@@ -139,7 +139,7 @@
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, error_levels, IS_LONG, 0, "E_ALL")
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_restore_error_handler, 0, 0, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_restore_error_handler, 0, 0, IS_TRUE, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_set_exception_handler, 0, 0, 1)
@@ -207,7 +207,8 @@
 
 #define arginfo_gc_collect_cycles arginfo_func_num_args
 
-#define arginfo_gc_enabled arginfo_restore_error_handler
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gc_enabled, 0, 0, _IS_BOOL, 0)
+ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gc_enable, 0, 0, IS_VOID, 0)
 ZEND_END_ARG_INFO()
@@ -283,10 +284,10 @@
 	ZEND_FE(func_get_arg, arginfo_func_get_arg)
 	ZEND_FE(func_get_args, arginfo_func_get_args)
 	ZEND_FE(strlen, arginfo_strlen)
-	ZEND_FE(strcmp, arginfo_strcmp)
-	ZEND_FE(strncmp, arginfo_strncmp)
-	ZEND_FE(strcasecmp, arginfo_strcasecmp)
-	ZEND_FE(strncasecmp, arginfo_strncasecmp)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strcmp, arginfo_strcmp)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strncmp, arginfo_strncmp)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strcasecmp, arginfo_strcasecmp)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strncasecmp, arginfo_strncasecmp)
 	ZEND_FE(error_reporting, arginfo_error_reporting)
 	ZEND_FE(define, arginfo_define)
 	ZEND_FE(defined, arginfo_defined)
@@ -352,6 +353,11 @@
 
 	INIT_CLASS_ENTRY(ce, "stdClass", class_stdClass_methods);
 	class_entry = zend_register_internal_class_ex(&ce, NULL);
+	class_entry->ce_flags |= ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES;
 
+	zend_string *attribute_name_AllowDynamicProperties_class_stdClass_0 = zend_string_init_interned("AllowDynamicProperties", sizeof("AllowDynamicProperties") - 1, 1);
+	zend_add_class_attribute(class_entry, attribute_name_AllowDynamicProperties_class_stdClass_0, 0);
+	zend_string_release(attribute_name_AllowDynamicProperties_class_stdClass_0);
+
 	return class_entry;
 }

Added: branches/4.0/MgDev/Oem/php/include/Zend/zend_call_stack.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_call_stack.h	                        (rev 0)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_call_stack.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -0,0 +1,94 @@
+/*
+   +----------------------------------------------------------------------+
+   | Zend Engine                                                          |
+   +----------------------------------------------------------------------+
+   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.00 of the Zend license,     |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | http://www.zend.com/license/2_00.txt.                                |
+   | If you did not receive a copy of the Zend license and are unable to  |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license at zend.com so we can mail you a copy immediately.              |
+   +----------------------------------------------------------------------+
+   | Authors: Arnaud Le Blanc <arnaud.lb at gmail.com>                       |
+   +----------------------------------------------------------------------+
+*/
+
+#ifndef ZEND_CALL_STACK_H
+#define ZEND_CALL_STACK_H
+
+#include "zend.h"
+#include "zend_portability.h"
+#ifdef __APPLE__
+# include <pthread.h>
+#endif
+
+#ifdef ZEND_CHECK_STACK_LIMIT
+
+typedef struct _zend_call_stack {
+	void *base;
+	size_t max_size;
+} zend_call_stack;
+
+ZEND_API void zend_call_stack_init(void);
+
+ZEND_API bool zend_call_stack_get(zend_call_stack *stack);
+
+/** Returns an approximation of the current stack position */
+static zend_always_inline void *zend_call_stack_position(void) {
+#ifdef ZEND_WIN32
+	return _AddressOfReturnAddress();
+#elif PHP_HAVE_BUILTIN_FRAME_ADDRESS
+	return __builtin_frame_address(0);
+#else
+	void *a;
+	void *pos = (void*)&a;
+	return pos;
+#endif
+}
+
+static zend_always_inline bool zend_call_stack_overflowed(void *stack_limit) {
+	return (uintptr_t) zend_call_stack_position() <= (uintptr_t) stack_limit;
+}
+
+static inline void* zend_call_stack_limit(void *base, size_t size, size_t reserved_size)
+{
+	if (UNEXPECTED(size > (uintptr_t)base)) {
+		return (void*)0;
+	}
+
+	base = (int8_t*)base - size;
+
+	if (UNEXPECTED(UINTPTR_MAX - (uintptr_t)base < reserved_size)) {
+		return (void*)UINTPTR_MAX;
+	}
+
+	return (int8_t*)base + reserved_size;
+}
+
+static inline size_t zend_call_stack_default_size(void)
+{
+#ifdef __linux__
+	return 8 * 1024 * 1024;
+#endif
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+	return 4 * 1024 * 1024;
+#endif
+#ifdef __OpenBSD__
+	return 512 * 1024;
+#endif
+#ifdef __APPLE__
+	// https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html
+	if (pthread_main_np()) {
+		return 8 * 1024 * 1024;
+	}
+	return 512 * 1024;
+#endif
+
+	return 2 * 1024 * 1024;
+}
+
+#endif /* ZEND_CHECK_STACK_LIMIT */
+#endif /* ZEND_CALL_STACK_H */

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_compile.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_compile.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_compile.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -24,19 +24,20 @@
 #include "zend_ast.h"
 
 #include <stdarg.h>
+#include <stdint.h>
 
 #include "zend_llist.h"
 
-#define SET_UNUSED(op)  op ## _type = IS_UNUSED
+#define SET_UNUSED(op) do { \
+	op ## _type = IS_UNUSED; \
+	op.num = (uint32_t) -1; \
+} while (0)
 
 #define MAKE_NOP(opline) do { \
-	(opline)->op1.num = 0; \
-	(opline)->op2.num = 0; \
-	(opline)->result.num = 0; \
 	(opline)->opcode = ZEND_NOP; \
-	(opline)->op1_type =  IS_UNUSED; \
-	(opline)->op2_type = IS_UNUSED; \
-	(opline)->result_type = IS_UNUSED; \
+	SET_UNUSED((opline)->op1); \
+	SET_UNUSED((opline)->op2); \
+	SET_UNUSED((opline)->result); \
 } while (0)
 
 #define RESET_DOC_COMMENT() do { \
@@ -76,8 +77,8 @@
 } znode_op;
 
 typedef struct _znode { /* used only during compilation */
-	zend_uchar op_type;
-	zend_uchar flag;
+	uint8_t op_type;
+	uint8_t flag;
 	union {
 		znode_op op;
 		zval constant; /* replaced by literal/zv */
@@ -137,10 +138,10 @@
 	znode_op result;
 	uint32_t extended_value;
 	uint32_t lineno;
-	zend_uchar opcode;
-	zend_uchar op1_type;
-	zend_uchar op2_type;
-	zend_uchar result_type;
+	uint8_t opcode;       /* Opcodes defined in Zend/zend_vm_opcodes.h */
+	uint8_t op1_type;     /* IS_UNUSED, IS_CONST, IS_TMP_VAR, IS_VAR, IS_CV */
+	uint8_t op2_type;     /* IS_UNUSED, IS_CONST, IS_TMP_VAR, IS_VAR, IS_CV */
+	uint8_t result_type;  /* IS_UNUSED, IS_CONST, IS_TMP_VAR, IS_VAR, IS_CV */
 };
 
 
@@ -237,7 +238,7 @@
 /* or IS_CONSTANT_VISITED_MARK                            |     |     |     */
 #define ZEND_CLASS_CONST_IS_CASE         (1 << 6)  /*     |     |     |  X  */
 /*                                                        |     |     |     */
-/* Class Flags (unused: 15,21,30,31)                      |     |     |     */
+/* Class Flags (unused: 30,31)                            |     |     |     */
 /* ===========                                            |     |     |     */
 /*                                                        |     |     |     */
 /* Special class types                                    |     |     |     */
@@ -266,9 +267,13 @@
 /* User class has methods with static variables           |     |     |     */
 #define ZEND_HAS_STATIC_IN_METHODS       (1 << 14) /*  X  |     |     |     */
 /*                                                        |     |     |     */
-/* Children must reuse parent get_iterator()              |     |     |     */
-#define ZEND_ACC_REUSE_GET_ITERATOR      (1 << 16) /*  X  |     |     |     */
+/* Objects of this class may have dynamic properties      |     |     |     */
+/* without triggering a deprecation warning               |     |     |     */
+#define ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES (1 << 15) /* X  |     |     |     */
 /*                                                        |     |     |     */
+/* Readonly class                                         |     |     |     */
+#define ZEND_ACC_READONLY_CLASS          (1 << 16) /*  X  |     |     |     */
+/*                                                        |     |     |     */
 /* Parent class is resolved (CE).                         |     |     |     */
 #define ZEND_ACC_RESOLVED_PARENT         (1 << 17) /*  X  |     |     |     */
 /*                                                        |     |     |     */
@@ -280,6 +285,8 @@
 /*                                                        |     |     |     */
 /* Class is linked apart from variance obligations.       |     |     |     */
 #define ZEND_ACC_NEARLY_LINKED           (1 << 20) /*  X  |     |     |     */
+/* Class has readonly props                               |     |     |     */
+#define ZEND_ACC_HAS_READONLY_PROPS      (1 << 21) /*  X  |     |     |     */
 /*                                                        |     |     |     */
 /* stored in opcache (may be partially)                   |     |     |     */
 #define ZEND_ACC_CACHED                  (1 << 22) /*  X  |     |     |     */
@@ -297,7 +304,7 @@
 /* Class cannot be serialized or unserialized             |     |     |     */
 #define ZEND_ACC_NOT_SERIALIZABLE        (1 << 29) /*  X  |     |     |     */
 /*                                                        |     |     |     */
-/* Function Flags (unused: 27-30)                         |     |     |     */
+/* Function Flags (unused: 29-30)                         |     |     |     */
 /* ==============                                         |     |     |     */
 /*                                                        |     |     |     */
 /* deprecation flag                                       |     |     |     */
@@ -353,6 +360,12 @@
 /* method flag used by Closure::__invoke() (int only)     |     |     |     */
 #define ZEND_ACC_USER_ARG_INFO           (1 << 26) /*     |  X  |     |     */
 /*                                                        |     |     |     */
+/* supports opcache compile-time evaluation (funcs)       |     |     |     */
+#define ZEND_ACC_COMPILE_TIME_EVAL       (1 << 27) /*     |  X  |     |     */
+/*                                                        |     |     |     */
+/* has #[\Override] attribute                             |     |     |     */
+#define ZEND_ACC_OVERRIDE                (1 << 28) /*     |  X  |     |     */
+/*                                                        |     |     |     */
 /* op_array uses strict mode types                        |     |     |     */
 #define ZEND_ACC_STRICT_TYPES            (1U << 31) /*    |  X  |     |     */
 
@@ -362,10 +375,14 @@
 /* call through internal function handler. e.g. Closure::invoke() */
 #define ZEND_ACC_CALL_VIA_HANDLER     ZEND_ACC_CALL_VIA_TRAMPOLINE
 
+#define ZEND_SHORT_CIRCUITING_CHAIN_MASK 0x3
 #define ZEND_SHORT_CIRCUITING_CHAIN_EXPR 0
 #define ZEND_SHORT_CIRCUITING_CHAIN_ISSET 1
 #define ZEND_SHORT_CIRCUITING_CHAIN_EMPTY 2
 
+// Must not clash with ZEND_SHORT_CIRCUITING_CHAIN_MASK
+#define ZEND_JMP_NULL_BP_VAR_IS 4
+
 char *zend_visibility_string(uint32_t fn_flags);
 
 typedef struct _zend_property_info {
@@ -393,6 +410,7 @@
 	zend_string *doc_comment;
 	HashTable *attributes;
 	zend_class_entry *ce;
+	zend_type type;
 } zend_class_constant;
 
 #define ZEND_CLASS_CONST_FLAGS(c) Z_CONSTANT_FLAGS((c)->value)
@@ -417,7 +435,7 @@
  * It's also used for the return type.
  */
 typedef struct _zend_internal_function_info {
-	zend_uintptr_t required_num_args;
+	uintptr_t required_num_args;
 	zend_type type;
 	const char *default_value;
 } zend_internal_function_info;
@@ -424,8 +442,8 @@
 
 struct _zend_op_array {
 	/* Common elements */
-	zend_uchar type;
-	zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */
+	uint8_t type;
+	uint8_t arg_flags[3]; /* bitset of arg_info.pass_by_reference */
 	uint32_t fn_flags;
 	zend_string *function_name;
 	zend_class_entry *scope;
@@ -434,15 +452,15 @@
 	uint32_t required_num_args;
 	zend_arg_info *arg_info;
 	HashTable *attributes;
+	ZEND_MAP_PTR_DEF(void **, run_time_cache);
+	uint32_t T;         /* number of temporary variables */
 	/* END of common elements */
 
 	int cache_size;     /* number of run_time_cache_slots * sizeof(void*) */
 	int last_var;       /* number of CV variables */
-	uint32_t T;         /* number of temporary variables */
 	uint32_t last;      /* number of opcodes */
 
 	zend_op *opcodes;
-	ZEND_MAP_PTR_DEF(void **, run_time_cache);
 	ZEND_MAP_PTR_DEF(HashTable *, static_variables_ptr);
 	HashTable *static_variables;
 	zend_string **vars; /* names of CV variables */
@@ -479,8 +497,8 @@
 
 typedef struct _zend_internal_function {
 	/* Common elements */
-	zend_uchar type;
-	zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */
+	uint8_t type;
+	uint8_t arg_flags[3]; /* bitset of arg_info.pass_by_reference */
 	uint32_t fn_flags;
 	zend_string* function_name;
 	zend_class_entry *scope;
@@ -489,6 +507,8 @@
 	uint32_t required_num_args;
 	zend_internal_arg_info *arg_info;
 	HashTable *attributes;
+	ZEND_MAP_PTR_DEF(void **, run_time_cache);
+	uint32_t T;         /* number of temporary variables */
 	/* END of common elements */
 
 	zif_handler handler;
@@ -499,12 +519,12 @@
 #define ZEND_FN_SCOPE_NAME(function)  ((function) && (function)->common.scope ? ZSTR_VAL((function)->common.scope->name) : "")
 
 union _zend_function {
-	zend_uchar type;	/* MUST be the first element of this struct! */
+	uint8_t type;	/* MUST be the first element of this struct! */
 	uint32_t   quick_arg_flags;
 
 	struct {
-		zend_uchar type;  /* never used */
-		zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */
+		uint8_t type;  /* never used */
+		uint8_t arg_flags[3]; /* bitset of arg_info.pass_by_reference */
 		uint32_t fn_flags;
 		zend_string *function_name;
 		zend_class_entry *scope;
@@ -513,6 +533,8 @@
 		uint32_t required_num_args;
 		zend_arg_info *arg_info;  /* index -1 represents the return value info, if any */
 		HashTable   *attributes;
+		ZEND_MAP_PTR_DEF(void **, run_time_cache);
+		uint32_t T;         /* number of temporary variables */
 	} common;
 
 	zend_op_array op_array;
@@ -552,6 +574,7 @@
                                                /* to prevent optimization in RETURN handler and    */
                                                /* keep all local variables for "fcall_end" handler */
 #define ZEND_CALL_JIT_RESERVED       (1 << 29) /* reserved for tracing JIT */
+#define ZEND_CALL_NEEDS_REATTACH     (1 << 30)
 #define ZEND_CALL_SEND_ARG_BY_REF    (1u << 31)
 
 #define ZEND_CALL_NESTED_FUNCTION    (ZEND_CALL_FUNCTION | ZEND_CALL_NESTED)
@@ -587,8 +610,12 @@
 #define ZEND_CALL_NUM_ARGS(call) \
 	(call)->This.u2.num_args
 
+/* Ensure the correct alignment before slots calculation */
+ZEND_STATIC_ASSERT(ZEND_MM_ALIGNED_SIZE(sizeof(zval)) == sizeof(zval),
+                   "zval must be aligned by ZEND_MM_ALIGNMENT");
+/* A number of call frame slots (zvals) reserved for zend_execute_data. */
 #define ZEND_CALL_FRAME_SLOT \
-	((int)((ZEND_MM_ALIGNED_SIZE(sizeof(zend_execute_data)) + ZEND_MM_ALIGNED_SIZE(sizeof(zval)) - 1) / ZEND_MM_ALIGNED_SIZE(sizeof(zval))))
+	((int)((sizeof(zend_execute_data) + sizeof(zval) - 1) / sizeof(zval)))
 
 #define ZEND_CALL_VAR(call, n) \
 	((zval*)(((char*)(call)) + ((int)(n))))
@@ -741,6 +768,12 @@
 
 #include "zend_globals.h"
 
+typedef enum _zend_compile_position {
+	ZEND_COMPILE_POSITION_AT_SHEBANG = 0,
+	ZEND_COMPILE_POSITION_AT_OPEN_TAG,
+	ZEND_COMPILE_POSITION_AFTER_OPEN_TAG
+} zend_compile_position;
+
 BEGIN_EXTERN_C()
 
 void init_compiler(void);
@@ -753,7 +786,7 @@
 void zend_file_context_end(zend_file_context *prev_context);
 
 extern ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type);
-extern ZEND_API zend_op_array *(*zend_compile_string)(zend_string *source_string, const char *filename);
+extern ZEND_API zend_op_array *(*zend_compile_string)(zend_string *source_string, const char *filename, zend_compile_position position);
 
 ZEND_API int ZEND_FASTCALL lex_scan(zval *zendlval, zend_parser_stack_elem *elem);
 void startup_scanner(void);
@@ -781,11 +814,23 @@
 void zend_stop_lexing(void);
 void zend_emit_final_return(bool return_one);
 
+typedef enum {
+	ZEND_MODIFIER_TARGET_PROPERTY = 0,
+	ZEND_MODIFIER_TARGET_METHOD,
+	ZEND_MODIFIER_TARGET_CONSTANT,
+	ZEND_MODIFIER_TARGET_CPP,
+} zend_modifier_target;
+
 /* Used during AST construction */
 zend_ast *zend_ast_append_str(zend_ast *left, zend_ast *right);
 zend_ast *zend_negate_num_string(zend_ast *ast);
 uint32_t zend_add_class_modifier(uint32_t flags, uint32_t new_flag);
-uint32_t zend_add_member_modifier(uint32_t flags, uint32_t new_flag);
+uint32_t zend_add_anonymous_class_modifier(uint32_t flags, uint32_t new_flag);
+uint32_t zend_add_member_modifier(uint32_t flags, uint32_t new_flag, zend_modifier_target target);
+
+uint32_t zend_modifier_token_to_flag(zend_modifier_target target, uint32_t flags);
+uint32_t zend_modifier_list_to_flags(zend_modifier_target target, zend_ast *modifiers);
+
 bool zend_handle_encoding_declaration(zend_ast *ast);
 
 ZEND_API zend_class_entry *zend_bind_class_in_slot(
@@ -792,13 +837,10 @@
 		zval *class_table_slot, zval *lcname, zend_string *lc_parent_name);
 ZEND_API zend_result do_bind_function(zend_function *func, zval *lcname);
 ZEND_API zend_result do_bind_class(zval *lcname, zend_string *lc_parent_name);
-ZEND_API uint32_t zend_build_delayed_early_binding_list(const zend_op_array *op_array);
-ZEND_API void zend_do_delayed_early_binding(zend_op_array *op_array, uint32_t first_early_binding_opline);
 
 void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline);
 
 ZEND_API void function_add_ref(zend_function *function);
-void zend_init_static_variables_map_ptr(zend_op_array *op_array);
 zend_string *zval_make_interned_string(zval *zv);
 
 #define INITIAL_OP_ARRAY_SIZE 64
@@ -808,13 +850,13 @@
 struct _zend_arena;
 
 ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type);
-ZEND_API zend_op_array *compile_string(zend_string *source_string, const char *filename);
+ZEND_API zend_op_array *compile_string(zend_string *source_string, const char *filename, zend_compile_position position);
 ZEND_API zend_op_array *compile_filename(int type, zend_string *filename);
 ZEND_API zend_ast *zend_compile_string_to_ast(
 		zend_string *code, struct _zend_arena **ast_arena, zend_string *filename);
-ZEND_API int zend_execute_scripts(int type, zval *retval, int file_count, ...);
-ZEND_API int open_file_for_scanning(zend_file_handle *file_handle);
-ZEND_API void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_size);
+ZEND_API zend_result zend_execute_scripts(int type, zval *retval, int file_count, ...);
+ZEND_API zend_result open_file_for_scanning(zend_file_handle *file_handle);
+ZEND_API void init_op_array(zend_op_array *op_array, uint8_t type, int initial_ops_size);
 ZEND_API void destroy_op_array(zend_op_array *op_array);
 ZEND_API void zend_destroy_static_vars(zend_op_array *op_array);
 ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle);
@@ -862,8 +904,8 @@
 ZEND_API bool zend_is_compiling(void);
 ZEND_API char *zend_make_compiled_string_description(const char *name);
 ZEND_API void zend_initialize_class_data(zend_class_entry *ce, bool nullify_handlers);
-uint32_t zend_get_class_fetch_type(zend_string *name);
-ZEND_API zend_uchar zend_get_call_op(const zend_op *init_op, zend_function *fbc);
+uint32_t zend_get_class_fetch_type(const zend_string *name);
+ZEND_API uint8_t zend_get_call_op(const zend_op *init_op, zend_function *fbc);
 ZEND_API bool zend_is_smart_branch(const zend_op *opline);
 
 typedef bool (*zend_auto_global_callback)(zend_string *name);
@@ -961,6 +1003,13 @@
 #define ZEND_FETCH_DIM_WRITE	2
 #define ZEND_FETCH_OBJ_FLAGS	3
 
+/* Used to mark what kind of operation a writing FETCH_DIM is used in,
+ * to produce a more precise error on incorrect string offset use. */
+#define ZEND_FETCH_DIM_REF 1
+#define ZEND_FETCH_DIM_DIM 2
+#define ZEND_FETCH_DIM_OBJ 3
+#define ZEND_FETCH_DIM_INCDEC 4
+
 #define ZEND_ISEMPTY			(1<<0)
 
 #define ZEND_LAST_CATCH			(1<<0)
@@ -990,9 +1039,15 @@
 #define ZEND_ARG_TYPE_IS_TENTATIVE(arg_info) \
 	((ZEND_TYPE_FULL_MASK((arg_info)->type) & _ZEND_IS_TENTATIVE_BIT) != 0)
 
-#define ZEND_DIM_IS					(1 << 0) /* isset fetch needed for null coalesce */
+#define ZEND_DIM_IS					(1 << 0) /* isset fetch needed for null coalesce. Set in zend_compile.c for ZEND_AST_DIM nested within ZEND_AST_COALESCE. */
 #define ZEND_DIM_ALTERNATIVE_SYNTAX	(1 << 1) /* deprecated curly brace usage */
 
+/* Attributes for ${} encaps var in strings (ZEND_AST_DIM or ZEND_AST_VAR node) */
+/* ZEND_AST_VAR nodes can have any of the ZEND_ENCAPS_VAR_* flags */
+/* ZEND_AST_DIM flags can have ZEND_DIM_ALTERNATIVE_SYNTAX or ZEND_ENCAPS_VAR_DOLLAR_CURLY during the parse phase (ZEND_DIM_ALTERNATIVE_SYNTAX is a thrown fatal error). */
+#define ZEND_ENCAPS_VAR_DOLLAR_CURLY (1 << 0)
+#define ZEND_ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR (1 << 1)
+
 /* Make sure these don't clash with ZEND_FETCH_CLASS_* flags. */
 #define IS_CONSTANT_CLASS                    0x400 /* __CLASS__ in trait */
 #define IS_CONSTANT_UNQUALIFIED_IN_NAMESPACE 0x800
@@ -1149,6 +1204,9 @@
 /* this flag is set when compiler invoked during preloading in separate process */
 #define ZEND_COMPILE_PRELOAD_IN_CHILD           (1<<17)
 
+/* ignore observer notifications, e.g. to manually notify afterwards in a post-processing step after compilation */
+#define ZEND_COMPILE_IGNORE_OBSERVER			(1<<18)
+
 /* The default value for CG(compiler_options) */
 #define ZEND_COMPILE_DEFAULT					ZEND_COMPILE_HANDLE_OP_ARRAY
 
@@ -1155,8 +1213,8 @@
 /* The default value for CG(compiler_options) during eval() */
 #define ZEND_COMPILE_DEFAULT_FOR_EVAL			0
 
-ZEND_API bool zend_is_op_long_compatible(zval *op);
-ZEND_API bool zend_binary_op_produces_error(uint32_t opcode, zval *op1, zval *op2);
-ZEND_API bool zend_unary_op_produces_error(uint32_t opcode, zval *op);
+ZEND_API bool zend_is_op_long_compatible(const zval *op);
+ZEND_API bool zend_binary_op_produces_error(uint32_t opcode, const zval *op1, const zval *op2);
+ZEND_API bool zend_unary_op_produces_error(uint32_t opcode, const zval *op);
 
 #endif /* ZEND_COMPILE_H */

Added: branches/4.0/MgDev/Oem/php/include/Zend/zend_constants_arginfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_constants_arginfo.h	                        (rev 0)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_constants_arginfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -0,0 +1,31 @@
+/* This is a generated file, edit the .stub.php file instead.
+ * Stub hash: df76f4e5a735baba96c4ac3538e9e3e48d934f0f */
+
+
+
+static void register_zend_constants_symbols(int module_number)
+{
+	REGISTER_LONG_CONSTANT("E_ERROR", E_ERROR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_WARNING", E_WARNING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_PARSE", E_PARSE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_NOTICE", E_NOTICE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_CORE_ERROR", E_CORE_ERROR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_CORE_WARNING", E_CORE_WARNING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_COMPILE_ERROR", E_COMPILE_ERROR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_COMPILE_WARNING", E_COMPILE_WARNING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_USER_ERROR", E_USER_ERROR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_USER_WARNING", E_USER_WARNING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_USER_NOTICE", E_USER_NOTICE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_STRICT", E_STRICT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_RECOVERABLE_ERROR", E_RECOVERABLE_ERROR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_DEPRECATED", E_DEPRECATED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_USER_DEPRECATED", E_USER_DEPRECATED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_ALL", E_ALL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("DEBUG_BACKTRACE_PROVIDE_OBJECT", DEBUG_BACKTRACE_PROVIDE_OBJECT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("DEBUG_BACKTRACE_IGNORE_ARGS", DEBUG_BACKTRACE_IGNORE_ARGS, CONST_PERSISTENT);
+	REGISTER_BOOL_CONSTANT("ZEND_THREAD_SAFE", ZTS_V, CONST_PERSISTENT);
+	REGISTER_BOOL_CONSTANT("ZEND_DEBUG_BUILD", ZEND_DEBUG, CONST_PERSISTENT);
+	REGISTER_BOOL_CONSTANT("TRUE", true, CONST_PERSISTENT);
+	REGISTER_BOOL_CONSTANT("FALSE", false, CONST_PERSISTENT);
+	REGISTER_NULL_CONSTANT("NULL", CONST_PERSISTENT);
+}

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_cpuinfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_cpuinfo.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_cpuinfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -61,6 +61,11 @@
 
 	/* EBX */
 	ZEND_CPU_FEATURE_AVX2			= (1<<5 | ZEND_CPU_EBX_MASK),
+	ZEND_CPU_FEATURE_AVX512F		= (1<<16 | ZEND_CPU_EBX_MASK),
+	ZEND_CPU_FEATURE_AVX512DQ		= (1<<17 | ZEND_CPU_EBX_MASK),
+	ZEND_CPU_FEATURE_AVX512CD		= (1<<28 | ZEND_CPU_EBX_MASK),
+	/* intentionally don't support		= (1<<30 | ZEND_CPU_EBX_MASK) */
+	/* intentionally don't support		= (1<<31 | ZEND_CPU_EBX_MASK) */
 
 	/* EDX */
 	ZEND_CPU_FEATURE_FPU			= (1<<0 | ZEND_CPU_EDX_MASK),
@@ -174,6 +179,29 @@
 #endif
 	return __builtin_cpu_supports("avx2");
 }
+
+#if PHP_HAVE_AVX512_SUPPORTS
+ZEND_NO_SANITIZE_ADDRESS
+static inline int zend_cpu_supports_avx512(void) {
+#if PHP_HAVE_BUILTIN_CPU_INIT
+	__builtin_cpu_init();
+#endif
+	return __builtin_cpu_supports("avx512f") && __builtin_cpu_supports("avx512dq")
+		&& __builtin_cpu_supports("avx512cd") && __builtin_cpu_supports("avx512bw")
+		&& __builtin_cpu_supports("avx512vl");
+}
+#endif
+
+#if PHP_HAVE_AVX512_VBMI_SUPPORTS
+ZEND_NO_SANITIZE_ADDRESS
+static inline int zend_cpu_supports_avx512_vbmi(void) {
+#if PHP_HAVE_BUILTIN_CPU_INIT
+	__builtin_cpu_init();
+#endif
+	return zend_cpu_supports_avx512() && __builtin_cpu_supports("avx512vbmi");
+}
+#endif
+
 #else
 
 static inline int zend_cpu_supports_sse2(void) {
@@ -203,6 +231,16 @@
 static inline int zend_cpu_supports_avx2(void) {
 	return zend_cpu_supports(ZEND_CPU_FEATURE_AVX2);
 }
+
+static inline int zend_cpu_supports_avx512(void) {
+	/* TODO: avx512_bw/avx512_vl use bit 30/31 which are reserved for mask */
+	return 0;
+}
+
+static zend_always_inline int zend_cpu_supports_avx512_vbmi(void) {
+	/* TODO: avx512_vbmi use ECX of cpuid 7 */
+	return 0;
+}
 #endif
 
 /* __builtin_cpu_supports has pclmul from gcc9 */
@@ -220,4 +258,15 @@
 }
 #endif
 
+/* __builtin_cpu_supports has cldemote from gcc11 */
+#if PHP_HAVE_BUILTIN_CPU_SUPPORTS && defined(__GNUC__) && (ZEND_GCC_VERSION >= 11000)
+ZEND_NO_SANITIZE_ADDRESS
+static inline int zend_cpu_supports_cldemote(void) {
+#if PHP_HAVE_BUILTIN_CPU_INIT
+	__builtin_cpu_init();
 #endif
+	return __builtin_cpu_supports("cldemote");
+}
+#endif
+
+#endif

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_enum.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_enum.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_enum.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -22,13 +22,17 @@
 #include "zend.h"
 #include "zend_types.h"
 
+#include <stdint.h>
+
 BEGIN_EXTERN_C()
 
 extern ZEND_API zend_class_entry *zend_ce_unit_enum;
 extern ZEND_API zend_class_entry *zend_ce_backed_enum;
+extern ZEND_API zend_object_handlers zend_enum_object_handlers;
 
 void zend_register_enum_ce(void);
 void zend_enum_add_interfaces(zend_class_entry *ce);
+zend_result zend_enum_build_backed_enum_table(zend_class_entry *ce);
 zend_object *zend_enum_new(zval *result, zend_class_entry *ce, zend_string *case_name, zval *backing_value_zv);
 void zend_verify_enum(zend_class_entry *ce);
 void zend_enum_register_funcs(zend_class_entry *ce);
@@ -35,11 +39,12 @@
 void zend_enum_register_props(zend_class_entry *ce);
 
 ZEND_API zend_class_entry *zend_register_internal_enum(
-	const char *name, zend_uchar type, const zend_function_entry *functions);
+	const char *name, uint8_t type, const zend_function_entry *functions);
 ZEND_API void zend_enum_add_case(zend_class_entry *ce, zend_string *case_name, zval *value);
 ZEND_API void zend_enum_add_case_cstr(zend_class_entry *ce, const char *name, zval *value);
 ZEND_API zend_object *zend_enum_get_case(zend_class_entry *ce, zend_string *name);
 ZEND_API zend_object *zend_enum_get_case_cstr(zend_class_entry *ce, const char *name);
+ZEND_API zend_result zend_enum_get_case_by_value(zend_object **result, zend_class_entry *ce, zend_long long_key, zend_string *string_key, bool try_from);
 
 static zend_always_inline zval *zend_enum_fetch_case_name(zend_object *zobj)
 {

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_exceptions_arginfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_exceptions_arginfo.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_exceptions_arginfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 9d1c2027ebd14e621d9b5b79056ba7300a455be8 */
+ * Stub hash: 4cf2c620393f468968a219b5bd12a2b5f6b03ecc */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Throwable_getMessage, 0, 0, IS_STRING, 0)
 ZEND_END_ARG_INFO()
@@ -209,7 +209,7 @@
 	zval property_message_default_value;
 	ZVAL_EMPTY_STRING(&property_message_default_value);
 	zend_string *property_message_name = zend_string_init("message", sizeof("message") - 1, 1);
-	zend_declare_property_ex(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PROTECTED, NULL);
+	zend_declare_typed_property(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
 	zend_string_release(property_message_name);
 
 	zval property_string_default_value;
@@ -221,7 +221,7 @@
 	zval property_code_default_value;
 	ZVAL_LONG(&property_code_default_value, 0);
 	zend_string *property_code_name = zend_string_init("code", sizeof("code") - 1, 1);
-	zend_declare_property_ex(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PROTECTED, NULL);
+	zend_declare_typed_property(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
 	zend_string_release(property_code_name);
 
 	zval property_file_default_value;
@@ -242,10 +242,10 @@
 	zend_declare_typed_property(class_entry, property_trace_name, &property_trace_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY));
 	zend_string_release(property_trace_name);
 
-	zend_string *property_previous_class_Throwable = zend_string_init("Throwable", sizeof("Throwable")-1, 1);
 	zval property_previous_default_value;
 	ZVAL_NULL(&property_previous_default_value);
 	zend_string *property_previous_name = zend_string_init("previous", sizeof("previous") - 1, 1);
+	zend_string *property_previous_class_Throwable = zend_string_init("Throwable", sizeof("Throwable")-1, 1);
 	zend_declare_typed_property(class_entry, property_previous_name, &property_previous_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previous_class_Throwable, 0, MAY_BE_NULL));
 	zend_string_release(property_previous_name);
 
@@ -259,6 +259,12 @@
 	INIT_CLASS_ENTRY(ce, "ErrorException", class_ErrorException_methods);
 	class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
 
+	zval property_severity_default_value;
+	ZVAL_LONG(&property_severity_default_value, E_ERROR);
+	zend_string *property_severity_name = zend_string_init("severity", sizeof("severity") - 1, 1);
+	zend_declare_typed_property(class_entry, property_severity_name, &property_severity_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release(property_severity_name);
+
 	return class_entry;
 }
 
@@ -273,7 +279,7 @@
 	zval property_message_default_value;
 	ZVAL_EMPTY_STRING(&property_message_default_value);
 	zend_string *property_message_name = zend_string_init("message", sizeof("message") - 1, 1);
-	zend_declare_property_ex(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PROTECTED, NULL);
+	zend_declare_typed_property(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
 	zend_string_release(property_message_name);
 
 	zval property_string_default_value;
@@ -285,7 +291,7 @@
 	zval property_code_default_value;
 	ZVAL_LONG(&property_code_default_value, 0);
 	zend_string *property_code_name = zend_string_init("code", sizeof("code") - 1, 1);
-	zend_declare_property_ex(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PROTECTED, NULL);
+	zend_declare_typed_property(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
 	zend_string_release(property_code_name);
 
 	zval property_file_default_value;
@@ -306,10 +312,10 @@
 	zend_declare_typed_property(class_entry, property_trace_name, &property_trace_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY));
 	zend_string_release(property_trace_name);
 
-	zend_string *property_previous_class_Throwable = zend_string_init("Throwable", sizeof("Throwable")-1, 1);
 	zval property_previous_default_value;
 	ZVAL_NULL(&property_previous_default_value);
 	zend_string *property_previous_name = zend_string_init("previous", sizeof("previous") - 1, 1);
+	zend_string *property_previous_class_Throwable = zend_string_init("Throwable", sizeof("Throwable")-1, 1);
 	zend_declare_typed_property(class_entry, property_previous_name, &property_previous_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previous_class_Throwable, 0, MAY_BE_NULL));
 	zend_string_release(property_previous_name);
 

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_execute.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_execute.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_execute.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -26,6 +26,8 @@
 #include "zend_operators.h"
 #include "zend_variables.h"
 
+#include <stdint.h>
+
 BEGIN_EXTERN_C()
 struct _zend_fcall_info;
 ZEND_API extern void (*zend_execute_ex)(zend_execute_data *execute_data);
@@ -65,17 +67,29 @@
 ZEND_API ZEND_COLD void ZEND_FASTCALL zend_use_resource_as_offset(const zval *dim);
 
 ZEND_API bool ZEND_FASTCALL zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, bool strict);
-ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, bool strict);
 
-ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv);
-ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv);
+typedef enum {
+	ZEND_VERIFY_PROP_ASSIGNABLE_BY_REF_CONTEXT_ASSIGNMENT,
+	ZEND_VERIFY_PROP_ASSIGNABLE_BY_REF_CONTEXT_MAGIC_GET,
+} zend_verify_prop_assignable_by_ref_context;
+ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref_ex(const zend_property_info *prop_info, zval *orig_val, bool strict, zend_verify_prop_assignable_by_ref_context context);
+ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref(const zend_property_info *prop_info, zval *orig_val, bool strict);
+
+ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(const zend_property_info *prop, const zval *zv);
+ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const zend_property_info *prop1, const zend_property_info *prop2, const zval *zv);
 ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_offset_write(HashTable *ht, zend_long lval);
 ZEND_API ZEND_COLD zval* ZEND_FASTCALL zend_undefined_index_write(HashTable *ht, zend_string *offset);
 ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void);
 
-ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error(zend_property_info *info);
-ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_indirect_modification_error(zend_property_info *info);
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error(const zend_property_info *info);
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_indirect_modification_error(const zend_property_info *info);
 
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_invalid_class_constant_type_error(uint8_t type);
+
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_object_released_while_assigning_to_property_error(const zend_property_info *info);
+
+ZEND_API ZEND_COLD void ZEND_FASTCALL zend_cannot_add_element(void);
+
 ZEND_API bool zend_verify_scalar_type_hint(uint32_t type_mask, zval *arg, bool strict, bool is_internal_arg);
 ZEND_API ZEND_COLD void zend_verify_arg_error(
 		const zend_function *zf, const zend_arg_info *arg_info, uint32_t arg_num, zval *value);
@@ -106,11 +120,12 @@
 
 
 ZEND_API void ZEND_FASTCALL zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop);
-ZEND_API void ZEND_FASTCALL zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop);
+ZEND_API void ZEND_FASTCALL zend_ref_del_type_source(zend_property_info_source_list *source_list, const zend_property_info *prop);
 
-ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *value, zend_uchar value_type, bool strict);
+ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *value, uint8_t value_type, bool strict);
+ZEND_API zval* zend_assign_to_typed_ref_ex(zval *variable_ptr, zval *value, uint8_t value_type, bool strict, zend_refcounted **garbage_ptr);
 
-static zend_always_inline void zend_copy_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type)
+static zend_always_inline void zend_copy_to_variable(zval *variable_ptr, zval *value, uint8_t value_type)
 {
 	zend_refcounted *ref = NULL;
 
@@ -137,7 +152,7 @@
 	}
 }
 
-static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, bool strict)
+static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, uint8_t value_type, bool strict)
 {
 	do {
 		if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
@@ -155,15 +170,30 @@
 			}
 			garbage = Z_COUNTED_P(variable_ptr);
 			zend_copy_to_variable(variable_ptr, value, value_type);
-			if (GC_DELREF(garbage) == 0) {
-				rc_dtor_func(garbage);
-			} else { /* we need to split */
-				/* optimized version of GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr) */
-				if (UNEXPECTED(GC_MAY_LEAK(garbage))) {
-					gc_possible_root(garbage);
+			GC_DTOR_NO_REF(garbage);
+			return variable_ptr;
+		}
+	} while (0);
+
+	zend_copy_to_variable(variable_ptr, value, value_type);
+	return variable_ptr;
+}
+
+static zend_always_inline zval* zend_assign_to_variable_ex(zval *variable_ptr, zval *value, zend_uchar value_type, bool strict, zend_refcounted **garbage_ptr)
+{
+	do {
+		if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr))) {
+			if (Z_ISREF_P(variable_ptr)) {
+				if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) {
+					return zend_assign_to_typed_ref_ex(variable_ptr, value, value_type, strict, garbage_ptr);
 				}
+
+				variable_ptr = Z_REFVAL_P(variable_ptr);
+				if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) {
+					break;
+				}
 			}
-			return variable_ptr;
+			*garbage_ptr = Z_COUNTED_P(variable_ptr);
 		}
 	} while (0);
 
@@ -173,6 +203,7 @@
 
 ZEND_API zend_result ZEND_FASTCALL zval_update_constant(zval *pp);
 ZEND_API zend_result ZEND_FASTCALL zval_update_constant_ex(zval *pp, zend_class_entry *scope);
+ZEND_API zend_result ZEND_FASTCALL zval_update_constant_with_ctx(zval *pp, zend_class_entry *scope, zend_ast_evaluate_ctx *ctx);
 
 /* dedicated Zend executor functions - do not use! */
 struct _zend_vm_stack {
@@ -181,8 +212,12 @@
 	zend_vm_stack prev;
 };
 
+/* Ensure the correct alignment before slots calculation */
+ZEND_STATIC_ASSERT(ZEND_MM_ALIGNED_SIZE(sizeof(zval)) == sizeof(zval),
+                   "zval must be aligned by ZEND_MM_ALIGNMENT");
+/* A number of call frame slots (zvals) reserved for _zend_vm_stack. */
 #define ZEND_VM_STACK_HEADER_SLOTS \
-	((ZEND_MM_ALIGNED_SIZE(sizeof(struct _zend_vm_stack)) + ZEND_MM_ALIGNED_SIZE(sizeof(zval)) - 1) / ZEND_MM_ALIGNED_SIZE(sizeof(zval)))
+	((sizeof(struct _zend_vm_stack) + sizeof(zval) - 1) / sizeof(zval))
 
 #define ZEND_VM_STACK_ELEMENTS(stack) \
 	(((zval*)(stack)) + ZEND_VM_STACK_HEADER_SLOTS)
@@ -245,10 +280,10 @@
 
 static zend_always_inline uint32_t zend_vm_calc_used_stack(uint32_t num_args, zend_function *func)
 {
-	uint32_t used_stack = ZEND_CALL_FRAME_SLOT + num_args;
+	uint32_t used_stack = ZEND_CALL_FRAME_SLOT + num_args + func->common.T;
 
 	if (EXPECTED(ZEND_USER_CODE(func->type))) {
-		used_stack += func->op_array.last_var + func->op_array.T - MIN(func->op_array.num_args, num_args);
+		used_stack += func->op_array.last_var - MIN(func->op_array.num_args, num_args);
 	}
 	return used_stack * sizeof(zval);
 }
@@ -349,9 +384,9 @@
 ZEND_API void zend_set_timeout(zend_long seconds, bool reset_signals);
 ZEND_API void zend_unset_timeout(void);
 ZEND_API ZEND_NORETURN void ZEND_FASTCALL zend_timeout(void);
-ZEND_API zend_class_entry *zend_fetch_class(zend_string *class_name, int fetch_type);
-ZEND_API zend_class_entry *zend_fetch_class_with_scope(zend_string *class_name, int fetch_type, zend_class_entry *scope);
-ZEND_API zend_class_entry *zend_fetch_class_by_name(zend_string *class_name, zend_string *lcname, int fetch_type);
+ZEND_API zend_class_entry *zend_fetch_class(zend_string *class_name, uint32_t fetch_type);
+ZEND_API zend_class_entry *zend_fetch_class_with_scope(zend_string *class_name, uint32_t fetch_type, zend_class_entry *scope);
+ZEND_API zend_class_entry *zend_fetch_class_by_name(zend_string *class_name, zend_string *lcname, uint32_t fetch_type);
 
 ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function(zend_string *name);
 ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function_str(const char *name, size_t len);
@@ -361,6 +396,8 @@
 
 ZEND_API zval* zend_get_compiled_variable_value(const zend_execute_data *execute_data_ptr, uint32_t var);
 
+ZEND_API bool zend_gcc_global_regs(void);
+
 #define ZEND_USER_OPCODE_CONTINUE   0 /* execute next opcode */
 #define ZEND_USER_OPCODE_RETURN     1 /* exit from executor (return from function) */
 #define ZEND_USER_OPCODE_DISPATCH   2 /* call original opcode handler */
@@ -369,8 +406,8 @@
 
 #define ZEND_USER_OPCODE_DISPATCH_TO 0x100 /* call original handler of returned opcode */
 
-ZEND_API int zend_set_user_opcode_handler(zend_uchar opcode, user_opcode_handler_t handler);
-ZEND_API user_opcode_handler_t zend_get_user_opcode_handler(zend_uchar opcode);
+ZEND_API zend_result zend_set_user_opcode_handler(uint8_t opcode, user_opcode_handler_t handler);
+ZEND_API user_opcode_handler_t zend_get_user_opcode_handler(uint8_t opcode);
 
 ZEND_API zval *zend_get_zval_ptr(const zend_op *opline, int op_type, const znode_op *node, const zend_execute_data *execute_data);
 
@@ -384,7 +421,7 @@
 zval * ZEND_FASTCALL zend_handle_named_arg(
 		zend_execute_data **call_ptr, zend_string *arg_name,
 		uint32_t *arg_num_ptr, void **cache_slot);
-ZEND_API int ZEND_FASTCALL zend_handle_undef_args(zend_execute_data *call);
+ZEND_API zend_result ZEND_FASTCALL zend_handle_undef_args(zend_execute_data *call);
 
 #define CACHE_ADDR(num) \
 	((void**)((char*)EX(run_time_cache) + (num)))
@@ -447,10 +484,16 @@
 	} while (0)
 
 #define ZEND_CLASS_HAS_TYPE_HINTS(ce) ((ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) == ZEND_ACC_HAS_TYPE_HINTS)
+#define ZEND_CLASS_HAS_READONLY_PROPS(ce) ((ce->ce_flags & ZEND_ACC_HAS_READONLY_PROPS) == ZEND_ACC_HAS_READONLY_PROPS)
 
-ZEND_API bool zend_verify_property_type(zend_property_info *info, zval *property, bool strict);
-ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zval *property);
 
+ZEND_API bool zend_verify_class_constant_type(zend_class_constant *c, const zend_string *name, zval *constant);
+ZEND_COLD void zend_verify_class_constant_type_error(const zend_class_constant *c, const zend_string *name, const zval *constant);
+
+ZEND_API bool zend_verify_property_type(const zend_property_info *info, zval *property, bool strict);
+ZEND_COLD void zend_verify_property_type_error(const zend_property_info *info, const zval *property);
+ZEND_COLD void zend_magic_get_property_type_inconsistency_error(const zend_property_info *info, const zval *property);
+
 #define ZEND_REF_ADD_TYPE_SOURCE(ref, source) \
 	zend_ref_add_type_source(&ZEND_REF_TYPE_SOURCES(ref), source)
 
@@ -478,8 +521,14 @@
 		} \
 	} while (0)
 
-ZEND_COLD void zend_match_unhandled_error(zval *value);
+ZEND_COLD void zend_match_unhandled_error(const zval *value);
 
+static zend_always_inline void *zend_get_bad_ptr(void)
+{
+	ZEND_UNREACHABLE();
+	return NULL;
+}
+
 END_EXTERN_C()
 
 #endif /* ZEND_EXECUTE_H */

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_extensions.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_extensions.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_extensions.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -44,7 +44,7 @@
 
 /* The first number is the engine version and the rest is the date (YYYYMMDD).
  * This way engine 2/3 API no. is always greater than engine 1 API no..  */
-#define ZEND_EXTENSION_API_NO	420210902
+#define ZEND_EXTENSION_API_NO	420230831
 
 typedef struct _zend_extension_version_info {
 	int zend_extension_api_no;
@@ -145,6 +145,9 @@
 void zend_startup_extensions(void);
 void zend_shutdown_extensions(void);
 
+ZEND_API size_t zend_internal_run_time_cache_reserved_size(void);
+ZEND_API void zend_init_internal_run_time_cache(void);
+
 BEGIN_EXTERN_C()
 ZEND_API zend_result zend_load_extension(const char *path);
 ZEND_API zend_result zend_load_extension_handle(DL_HANDLE handle, const char *path);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_fibers.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_fibers.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_fibers.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -71,6 +71,7 @@
 /* Coroutine functions must populate the given transfer with a new context
  * and (optional) data before they return. */
 typedef void (*zend_fiber_coroutine)(zend_fiber_transfer *transfer);
+typedef void (*zend_fiber_clean)(zend_fiber_context *context);
 
 struct _zend_fiber_context {
 	/* Pointer to boost.context or ucontext_t data. */
@@ -82,6 +83,9 @@
 	/* Entrypoint function of the fiber. */
 	zend_fiber_coroutine function;
 
+	/* Cleanup function for fiber. */
+	zend_fiber_clean cleanup;
+
 	/* Assigned C stack. */
 	zend_fiber_stack *stack;
 
@@ -88,6 +92,9 @@
 	/* Fiber status. */
 	zend_fiber_status status;
 
+	/* Observer state */
+	zend_execute_data *top_observed_frame;
+
 	/* Reserved for extensions */
 	void *reserved[ZEND_MAX_RESERVED_RESOURCES];
 };
@@ -118,14 +125,21 @@
 	/* Frame on the bottom of the fiber vm stack. */
 	zend_execute_data *stack_bottom;
 
+	/* Active fiber vm stack. */
+	zend_vm_stack vm_stack;
+
 	/* Storage for fiber return value. */
 	zval result;
 };
 
 /* These functions may be used to create custom fiber objects using the bundled fiber switching context. */
-ZEND_API bool zend_fiber_init_context(zend_fiber_context *context, void *kind, zend_fiber_coroutine coroutine, size_t stack_size);
+ZEND_API zend_result zend_fiber_init_context(zend_fiber_context *context, void *kind, zend_fiber_coroutine coroutine, size_t stack_size);
 ZEND_API void zend_fiber_destroy_context(zend_fiber_context *context);
 ZEND_API void zend_fiber_switch_context(zend_fiber_transfer *transfer);
+#ifdef ZEND_CHECK_STACK_LIMIT
+ZEND_API void* zend_fiber_stack_limit(zend_fiber_stack *stack);
+ZEND_API void* zend_fiber_stack_base(zend_fiber_stack *stack);
+#endif /* ZEND_CHECK_STACK_LIMIT */
 
 ZEND_API void zend_fiber_switch_block(void);
 ZEND_API void zend_fiber_switch_unblock(void);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_gc.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_gc.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_gc.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -20,13 +20,27 @@
 #ifndef ZEND_GC_H
 #define ZEND_GC_H
 
+#include "zend_hrtime.h"
+
+#ifndef GC_BENCH
+# define GC_BENCH 0
+#endif
+
 BEGIN_EXTERN_C()
 
 typedef struct _zend_gc_status {
+	bool active;
+	bool gc_protected;
+	bool full;
 	uint32_t runs;
 	uint32_t collected;
 	uint32_t threshold;
+	uint32_t buf_size;
 	uint32_t num_roots;
+	zend_hrtime_t application_time;
+	zend_hrtime_t collector_time;
+	zend_hrtime_t dtor_time;
+	zend_hrtime_t free_time;
 } zend_gc_status;
 
 ZEND_API extern int (*gc_collect_cycles)(void);
@@ -42,6 +56,10 @@
 ZEND_API bool gc_protect(bool protect);
 ZEND_API bool gc_protected(void);
 
+#if GC_BENCH
+void gc_bench_print(void);
+#endif
+
 /* The default implementation of the gc_collect_cycles callback. */
 ZEND_API int  zend_gc_collect_cycles(void);
 
@@ -81,6 +99,14 @@
 	}
 }
 
+static zend_always_inline void gc_check_possible_root_no_ref(zend_refcounted *ref)
+{
+	ZEND_ASSERT(GC_TYPE_INFO(ref) != GC_REFERENCE);
+	if (UNEXPECTED(GC_MAY_LEAK(ref))) {
+		gc_possible_root(ref);
+	}
+}
+
 /* These APIs can be used to simplify object get_gc implementations
  * over heterogeneous structures. See zend_generator_get_gc() for
  * a usage example. */
@@ -114,6 +140,15 @@
 	gc_buffer->cur++;
 }
 
+static zend_always_inline void zend_get_gc_buffer_add_ptr(
+		zend_get_gc_buffer *gc_buffer, void *ptr) {
+	if (UNEXPECTED(gc_buffer->cur == gc_buffer->end)) {
+		zend_get_gc_buffer_grow(gc_buffer);
+	}
+	ZVAL_PTR(gc_buffer->cur, ptr);
+	gc_buffer->cur++;
+}
+
 static zend_always_inline void zend_get_gc_buffer_use(
 		zend_get_gc_buffer *gc_buffer, zval **table, int *n) {
 	*table = gc_buffer->start;

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_generators.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_generators.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_generators.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -20,6 +20,8 @@
 #ifndef ZEND_GENERATORS_H
 #define ZEND_GENERATORS_H
 
+#include <stdint.h>
+
 BEGIN_EXTERN_C()
 
 extern ZEND_API zend_class_entry *zend_ce_generator;
@@ -85,14 +87,14 @@
 	zend_execute_data execute_fake;
 
 	/* ZEND_GENERATOR_* flags */
-	zend_uchar flags;
+	uint8_t flags;
 };
 
-static const zend_uchar ZEND_GENERATOR_CURRENTLY_RUNNING = 0x1;
-static const zend_uchar ZEND_GENERATOR_FORCED_CLOSE      = 0x2;
-static const zend_uchar ZEND_GENERATOR_AT_FIRST_YIELD    = 0x4;
-static const zend_uchar ZEND_GENERATOR_DO_INIT           = 0x8;
-static const zend_uchar ZEND_GENERATOR_IN_FIBER          = 0x10;
+static const uint8_t ZEND_GENERATOR_CURRENTLY_RUNNING = 0x1;
+static const uint8_t ZEND_GENERATOR_FORCED_CLOSE      = 0x2;
+static const uint8_t ZEND_GENERATOR_AT_FIRST_YIELD    = 0x4;
+static const uint8_t ZEND_GENERATOR_DO_INIT           = 0x8;
+static const uint8_t ZEND_GENERATOR_IN_FIBER          = 0x10;
 
 void zend_register_generator_ce(void);
 ZEND_API void zend_generator_close(zend_generator *generator, bool finished_execution);
@@ -126,6 +128,8 @@
 	return zend_generator_update_current(generator);
 }
 
+HashTable *zend_generator_frame_gc(zend_get_gc_buffer *gc_buffer, zend_generator *generator);
+
 END_EXTERN_C()
 
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_globals.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_globals.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_globals.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -22,9 +22,12 @@
 
 
 #include <setjmp.h>
+#include <stdint.h>
+#include <sys/types.h>
 
 #include "zend_globals_macros.h"
 
+#include "zend_atomic.h"
 #include "zend_stack.h"
 #include "zend_ptr_stack.h"
 #include "zend_hash.h"
@@ -36,6 +39,8 @@
 #include "zend_multibyte.h"
 #include "zend_multiply.h"
 #include "zend_arena.h"
+#include "zend_call_stack.h"
+#include "zend_max_execution_timer.h"
 
 /* Define ZTS if you want a thread-safe Zend */
 /*#undef ZTS*/
@@ -53,6 +58,10 @@
 
 #define SYMTABLE_CACHE_SIZE 32
 
+#ifdef ZEND_CHECK_STACK_LIMIT
+# define ZEND_MAX_ALLOWED_STACK_SIZE_UNCHECKED -1
+# define ZEND_MAX_ALLOWED_STACK_SIZE_DETECT     0
+#endif
 
 #include "zend_compile.h"
 
@@ -64,6 +73,12 @@
 typedef struct _zend_fiber_context zend_fiber_context;
 typedef struct _zend_fiber zend_fiber;
 
+typedef enum {
+	ZEND_MEMOIZE_NONE,
+	ZEND_MEMOIZE_COMPILE,
+	ZEND_MEMOIZE_FETCH,
+} zend_memoize_mode;
+
 struct _zend_compiler_globals {
 	zend_stack loop_var_stack;
 
@@ -81,7 +96,7 @@
 	HashTable *auto_globals;
 
 	/* Refer to zend_yytnamerr() in zend_language_parser.y for meaning of values */
-	zend_uchar parse_error;
+	uint8_t parse_error;
 	bool in_compilation;
 	bool short_tags;
 
@@ -123,7 +138,7 @@
 
 	zend_stack delayed_oplines_stack;
 	HashTable *memoized_exprs;
-	int memoize_mode;
+	zend_memoize_mode memoize_mode;
 
 	void   *map_ptr_real_base;
 	void   *map_ptr_base;
@@ -138,6 +153,9 @@
 	uint32_t rtd_key_counter;
 
 	zend_stack short_circuiting_opnums;
+#ifdef ZTS
+	uint32_t copied_functions_count;
+#endif
 };
 
 
@@ -175,23 +193,27 @@
 
 	uint32_t jit_trace_num; /* Used by tracing JIT to reference the currently running trace */
 
+	int ticks_count;
+
 	zend_long precision;
 
-	int ticks_count;
-
 	uint32_t persistent_constants_count;
 	uint32_t persistent_functions_count;
 	uint32_t persistent_classes_count;
 
-	HashTable *in_autoload;
-	bool full_tables_cleanup;
-
 	/* for extended information support */
 	bool no_extensions;
 
-	bool vm_interrupt;
-	bool timed_out;
+	bool full_tables_cleanup;
+
+	zend_atomic_bool vm_interrupt;
+	zend_atomic_bool timed_out;
+
+	HashTable *in_autoload;
+
 	zend_long hard_timeout;
+	void *stack_base;
+	void *stack_limit;
 
 #ifdef ZEND_WIN32
 	OSVERSIONINFOEX windows_version_info;
@@ -201,6 +223,7 @@
 	HashTable persistent_list;
 
 	int user_error_handler_error_reporting;
+	bool exception_ignore_args;
 	zval user_error_handler;
 	zval user_exception_handler;
 	zend_stack user_error_handlers_error_reporting;
@@ -207,14 +230,14 @@
 	zend_stack user_error_handlers;
 	zend_stack user_exception_handlers;
 
+	zend_class_entry      *exception_class;
 	zend_error_handling_t  error_handling;
-	zend_class_entry      *exception_class;
 
+	int capture_warnings_during_sccp;
+
 	/* timeout support */
 	zend_long timeout_seconds;
 
-	int capture_warnings_during_sccp;
-
 	HashTable *ini_directives;
 	HashTable *modified_ini_directives;
 	zend_ini_entry *error_reporting_ini_entry;
@@ -227,7 +250,7 @@
 	struct _zend_module_entry *current_module;
 
 	bool active;
-	zend_uchar flags;
+	uint8_t flags;
 
 	zend_long assertions;
 
@@ -246,7 +269,6 @@
 
 	HashTable weakrefs;
 
-	bool exception_ignore_args;
 	zend_long exception_string_param_max_len;
 
 	zend_get_gc_buffer get_gc_buffer;
@@ -258,7 +280,7 @@
 	zend_fiber *active_fiber;
 
 	/* Default fiber C stack size. */
-	zend_long fiber_stack_size;
+	size_t fiber_stack_size;
 
 	/* If record_errors is enabled, all emitted diagnostics will be recorded,
 	 * in addition to being processed as usual. */
@@ -266,6 +288,22 @@
 	uint32_t num_errors;
 	zend_error_info **errors;
 
+	/* Override filename or line number of thrown errors and exceptions */
+	zend_string *filename_override;
+	zend_long lineno_override;
+
+#ifdef ZEND_CHECK_STACK_LIMIT
+	zend_call_stack call_stack;
+	zend_long max_allowed_stack_size;
+	zend_ulong reserved_stack_size;
+#endif
+
+#ifdef ZEND_MAX_EXECUTION_TIMERS
+	timer_t max_execution_timer_timer;
+	pid_t pid;
+	struct sigaction oldact;
+#endif
+
 	void *reserved[ZEND_MAX_RESERVED_RESOURCES];
 };
 
@@ -279,11 +317,11 @@
 	zend_file_handle *yy_out;
 
 	unsigned int yy_leng;
-	unsigned char *yy_start;
-	unsigned char *yy_text;
-	unsigned char *yy_cursor;
-	unsigned char *yy_marker;
-	unsigned char *yy_limit;
+	const unsigned char *yy_start;
+	const unsigned char *yy_text;
+	const unsigned char *yy_cursor;
+	const unsigned char *yy_marker;
+	const unsigned char *yy_limit;
 	int yy_state;
 	zend_stack state_stack;
 

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_hash.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_hash.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_hash.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -22,6 +22,7 @@
 #define ZEND_HASH_H
 
 #include "zend.h"
+#include "zend_sort.h"
 
 #define HASH_KEY_IS_STRING 1
 #define HASH_KEY_IS_LONG 2
@@ -170,6 +171,7 @@
 ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const char *key, size_t len);
 ZEND_API zend_result ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h);
 ZEND_API void ZEND_FASTCALL zend_hash_del_bucket(HashTable *ht, Bucket *p);
+ZEND_API void ZEND_FASTCALL zend_hash_packed_del_val(HashTable *ht, zval *zv);
 
 /* Data retrieval */
 ZEND_API zval* ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key);
@@ -178,7 +180,7 @@
 ZEND_API zval* ZEND_FASTCALL _zend_hash_index_find(const HashTable *ht, zend_ulong h);
 
 /* The same as zend_hash_find(), but hash value of the key must be already calculated. */
-ZEND_API zval* ZEND_FASTCALL zend_hash_find_known_hash(const HashTable *ht, zend_string *key);
+ZEND_API zval* ZEND_FASTCALL zend_hash_find_known_hash(const HashTable *ht, const zend_string *key);
 
 static zend_always_inline zval *zend_hash_find_ex(const HashTable *ht, zend_string *key, bool known_hash)
 {
@@ -190,9 +192,9 @@
 }
 
 #define ZEND_HASH_INDEX_FIND(_ht, _h, _ret, _not_found) do { \
-		if (EXPECTED(HT_FLAGS(_ht) & HASH_FLAG_PACKED)) { \
+		if (EXPECTED(HT_IS_PACKED(_ht))) { \
 			if (EXPECTED((zend_ulong)(_h) < (zend_ulong)(_ht)->nNumUsed)) { \
-				_ret = &_ht->arData[_h].val; \
+				_ret = &_ht->arPacked[_h]; \
 				if (UNEXPECTED(Z_TYPE_P(_ret) == IS_UNDEF)) { \
 					goto _not_found; \
 				} \
@@ -213,9 +215,9 @@
 ZEND_API zval* ZEND_FASTCALL zend_hash_index_lookup(HashTable *ht, zend_ulong h);
 
 #define ZEND_HASH_INDEX_LOOKUP(_ht, _h, _ret) do { \
-		if (EXPECTED(HT_FLAGS(_ht) & HASH_FLAG_PACKED)) { \
+		if (EXPECTED(HT_IS_PACKED(_ht))) { \
 			if (EXPECTED((zend_ulong)(_h) < (zend_ulong)(_ht)->nNumUsed)) { \
-				_ret = &_ht->arData[_h].val; \
+				_ret = &_ht->arPacked[_h]; \
 				if (EXPECTED(Z_TYPE_P(_ret) != IS_UNDEF)) { \
 					break; \
 				} \
@@ -243,35 +245,45 @@
 /* traversing */
 ZEND_API HashPosition ZEND_FASTCALL zend_hash_get_current_pos(const HashTable *ht);
 
-#define zend_hash_has_more_elements_ex(ht, pos) \
-	(zend_hash_get_current_key_type_ex(ht, pos) == HASH_KEY_NON_EXISTENT ? FAILURE : SUCCESS)
 ZEND_API zend_result   ZEND_FASTCALL zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos);
 ZEND_API zend_result   ZEND_FASTCALL zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos);
-ZEND_API int   ZEND_FASTCALL zend_hash_get_current_key_ex(const HashTable *ht, zend_string **str_index, zend_ulong *num_index, HashPosition *pos);
-ZEND_API void  ZEND_FASTCALL zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, HashPosition *pos);
+ZEND_API int   ZEND_FASTCALL zend_hash_get_current_key_ex(const HashTable *ht, zend_string **str_index, zend_ulong *num_index, const HashPosition *pos);
+ZEND_API void  ZEND_FASTCALL zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, const HashPosition *pos);
 ZEND_API int   ZEND_FASTCALL zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos);
 ZEND_API zval* ZEND_FASTCALL zend_hash_get_current_data_ex(HashTable *ht, HashPosition *pos);
 ZEND_API void  ZEND_FASTCALL zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos);
 ZEND_API void  ZEND_FASTCALL zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos);
 
-#define zend_hash_has_more_elements(ht) \
-	zend_hash_has_more_elements_ex(ht, &(ht)->nInternalPointer)
-#define zend_hash_move_forward(ht) \
-	zend_hash_move_forward_ex(ht, &(ht)->nInternalPointer)
-#define zend_hash_move_backwards(ht) \
-	zend_hash_move_backwards_ex(ht, &(ht)->nInternalPointer)
-#define zend_hash_get_current_key(ht, str_index, num_index) \
-	zend_hash_get_current_key_ex(ht, str_index, num_index, &(ht)->nInternalPointer)
-#define zend_hash_get_current_key_zval(ht, key) \
-	zend_hash_get_current_key_zval_ex(ht, key, &(ht)->nInternalPointer)
-#define zend_hash_get_current_key_type(ht) \
-	zend_hash_get_current_key_type_ex(ht, &(ht)->nInternalPointer)
-#define zend_hash_get_current_data(ht) \
-	zend_hash_get_current_data_ex(ht, &(ht)->nInternalPointer)
-#define zend_hash_internal_pointer_reset(ht) \
-	zend_hash_internal_pointer_reset_ex(ht, &(ht)->nInternalPointer)
-#define zend_hash_internal_pointer_end(ht) \
-	zend_hash_internal_pointer_end_ex(ht, &(ht)->nInternalPointer)
+static zend_always_inline zend_result zend_hash_has_more_elements_ex(HashTable *ht, HashPosition *pos) {
+	return (zend_hash_get_current_key_type_ex(ht, pos) == HASH_KEY_NON_EXISTENT ? FAILURE : SUCCESS);
+}
+static zend_always_inline zend_result zend_hash_has_more_elements(HashTable *ht) {
+	return zend_hash_has_more_elements_ex(ht, &ht->nInternalPointer);
+}
+static zend_always_inline zend_result zend_hash_move_forward(HashTable *ht) {
+	return zend_hash_move_forward_ex(ht, &ht->nInternalPointer);
+}
+static zend_always_inline zend_result zend_hash_move_backwards(HashTable *ht) {
+	return zend_hash_move_backwards_ex(ht, &ht->nInternalPointer);
+}
+static zend_always_inline int zend_hash_get_current_key(const HashTable *ht, zend_string **str_index, zend_ulong *num_index) {
+	return zend_hash_get_current_key_ex(ht, str_index, num_index, &ht->nInternalPointer);
+}
+static zend_always_inline void zend_hash_get_current_key_zval(const HashTable *ht, zval *key) {
+	zend_hash_get_current_key_zval_ex(ht, key, &ht->nInternalPointer);
+}
+static zend_always_inline int zend_hash_get_current_key_type(HashTable *ht) {
+	return zend_hash_get_current_key_type_ex(ht, &ht->nInternalPointer);
+}
+static zend_always_inline zval* zend_hash_get_current_data(HashTable *ht) {
+	return zend_hash_get_current_data_ex(ht, &ht->nInternalPointer);
+}
+static zend_always_inline void zend_hash_internal_pointer_reset(HashTable *ht) {
+	zend_hash_internal_pointer_reset_ex(ht, &ht->nInternalPointer);
+}
+static zend_always_inline void zend_hash_internal_pointer_end(HashTable *ht) {
+	zend_hash_internal_pointer_end_ex(ht, &ht->nInternalPointer);
+}
 
 /* Copying, merging and sorting */
 ZEND_API void  ZEND_FASTCALL zend_hash_copy(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor);
@@ -284,17 +296,28 @@
 typedef int (*bucket_compare_func_t)(Bucket *a, Bucket *b);
 ZEND_API int   zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, bool ordered);
 ZEND_API void  ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort_func, bucket_compare_func_t compare_func, bool renumber);
-ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, bucket_compare_func_t compar, uint32_t flag);
+void  ZEND_FASTCALL zend_array_sort_ex(HashTable *ht, sort_func_t sort_func, bucket_compare_func_t compare_func, bool renumber);
+ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, compare_func_t compar, uint32_t flag);
 
-#define zend_hash_sort(ht, compare_func, renumber) \
-	zend_hash_sort_ex(ht, zend_sort, compare_func, renumber)
+static zend_always_inline void ZEND_FASTCALL zend_hash_sort(HashTable *ht, bucket_compare_func_t compare_func, bool renumber) {
+	zend_hash_sort_ex(ht, zend_sort, compare_func, renumber);
+}
 
-#define zend_hash_num_elements(ht) \
-	(ht)->nNumOfElements
+/* Use this variant over zend_hash_sort() when sorting user arrays that may
+ * trigger user code. It will ensure the user code cannot free the array during
+ * sorting. */
+static zend_always_inline void zend_array_sort(HashTable *ht, bucket_compare_func_t compare_func, bool renumber) {
+	zend_array_sort_ex(ht, zend_sort, compare_func, renumber);
+}
 
-#define zend_hash_next_free_element(ht) \
-	(ht)->nNextFreeElement
+static zend_always_inline uint32_t zend_hash_num_elements(const HashTable *ht) {
+	return ht->nNumOfElements;
+}
 
+static zend_always_inline zend_long zend_hash_next_free_element(const HashTable *ht) {
+	return ht->nNextFreeElement;
+}
+
 ZEND_API void ZEND_FASTCALL zend_hash_rehash(HashTable *ht);
 
 #if !ZEND_DEBUG && defined(HAVE_BUILTIN_CONSTANT_P)
@@ -319,6 +342,7 @@
 ZEND_API uint32_t zend_array_count(HashTable *ht);
 ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source);
 ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht);
+ZEND_API HashTable* zend_array_to_list(HashTable *source);
 ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht);
 ZEND_API HashTable* ZEND_FASTCALL zend_symtable_to_proptable(HashTable *ht);
 ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, bool always_duplicate);
@@ -958,15 +982,68 @@
 #define zend_hash_get_current_data_ptr(ht) \
 	zend_hash_get_current_data_ptr_ex(ht, &(ht)->nInternalPointer)
 
+/* Common hash/packed array iterators */
+#if 0
+# define ZEND_HASH_ELEMENT_SIZE(__ht) \
+	(HT_IS_PACKED(__ht) ? sizeof(zval) : sizeof(Bucket))
+#else /* optimized version */
+# define ZEND_HASH_ELEMENT_SIZE(__ht) \
+	(sizeof(zval) + (~HT_FLAGS(__ht) & HASH_FLAG_PACKED) * ((sizeof(Bucket)-sizeof(zval))/HASH_FLAG_PACKED))
+#endif
+
+#define ZEND_HASH_ELEMENT_EX(__ht, _idx, _size) \
+	((zval*)(((char*)(__ht)->arPacked) + ((_idx) * (_size))))
+
+#define ZEND_HASH_ELEMENT(__ht, _idx) \
+	ZEND_HASH_ELEMENT_EX(__ht, _idx, ZEND_HASH_ELEMENT_SIZE(__ht))
+
+#define ZEND_HASH_NEXT_ELEMENT(_el, _size) \
+	((zval*)(((char*)(_el)) + (_size)))
+
+#define ZEND_HASH_PREV_ELEMENT(_el, _size) \
+	((zval*)(((char*)(_el)) - (_size)))
+
+#define _ZEND_HASH_FOREACH_VAL(_ht) do { \
+		HashTable *__ht = (_ht); \
+		uint32_t _count = __ht->nNumUsed; \
+		size_t _size = ZEND_HASH_ELEMENT_SIZE(__ht); \
+		zval *_z = __ht->arPacked; \
+		for (; _count > 0; _z = ZEND_HASH_NEXT_ELEMENT(_z, _size), _count--) { \
+			if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue;
+
+#define _ZEND_HASH_REVERSE_FOREACH_VAL(_ht) do { \
+		HashTable *__ht = (_ht); \
+		uint32_t _idx = __ht->nNumUsed; \
+		size_t _size = ZEND_HASH_ELEMENT_SIZE(__ht); \
+		zval *_z = ZEND_HASH_ELEMENT_EX(__ht, _idx, _size); \
+		for (;_idx > 0; _idx--) { \
+			_z = ZEND_HASH_PREV_ELEMENT(_z, _size); \
+			if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue;
+
 #define ZEND_HASH_FOREACH_FROM(_ht, indirect, _from) do { \
 		HashTable *__ht = (_ht); \
-		Bucket *_p = __ht->arData + (_from); \
-		Bucket *_end = __ht->arData + __ht->nNumUsed; \
-		for (; _p != _end; _p++) { \
-			zval *_z = &_p->val; \
-			if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \
-				_z = Z_INDIRECT_P(_z); \
+		zend_ulong __h; \
+		zend_string *__key = NULL; \
+		uint32_t _idx = (_from); \
+		size_t _size = ZEND_HASH_ELEMENT_SIZE(__ht); \
+		zval *__z = ZEND_HASH_ELEMENT_EX(__ht, _idx, _size); \
+		uint32_t _count = __ht->nNumUsed - _idx; \
+		for (;_count > 0; _count--) { \
+			zval *_z = __z; \
+			if (HT_IS_PACKED(__ht)) { \
+				__z++; \
+				__h = _idx; \
+				_idx++; \
+			} else { \
+				Bucket *_p = (Bucket*)__z; \
+				__z = &(_p + 1)->val; \
+				__h = _p->h; \
+				__key = _p->key; \
+				if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \
+					_z = Z_INDIRECT_P(_z); \
+				} \
 			} \
+			(void) __h; (void) __key; (void) _idx; \
 			if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue;
 
 #define ZEND_HASH_FOREACH(_ht, indirect) ZEND_HASH_FOREACH_FROM(_ht, indirect, 0)
@@ -974,14 +1051,28 @@
 #define ZEND_HASH_REVERSE_FOREACH(_ht, indirect) do { \
 		HashTable *__ht = (_ht); \
 		uint32_t _idx = __ht->nNumUsed; \
-		Bucket *_p = __ht->arData + _idx; \
 		zval *_z; \
-		for (_idx = __ht->nNumUsed; _idx > 0; _idx--) { \
-			_p--; \
-			_z = &_p->val; \
-			if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \
-				_z = Z_INDIRECT_P(_z); \
+		zend_ulong __h; \
+		zend_string *__key = NULL; \
+		size_t _size = ZEND_HASH_ELEMENT_SIZE(__ht); \
+		zval *__z = ZEND_HASH_ELEMENT_EX(__ht, _idx, _size); \
+		for (;_idx > 0; _idx--) { \
+			if (HT_IS_PACKED(__ht)) { \
+				__z--; \
+				_z = __z; \
+				__h = _idx - 1; \
+			} else { \
+				Bucket *_p = (Bucket*)__z; \
+				_p--; \
+				__z = &_p->val; \
+				_z = __z; \
+				__h = _p->h; \
+				__key = _p->key; \
+				if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \
+					_z = Z_INDIRECT_P(_z); \
+				} \
 			} \
+			(void) __h; (void) __key; (void) __z; \
 			if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue;
 
 #define ZEND_HASH_FOREACH_END() \
@@ -989,44 +1080,23 @@
 	} while (0)
 
 #define ZEND_HASH_FOREACH_END_DEL() \
-			__ht->nNumOfElements--; \
-			do { \
-				uint32_t j = HT_IDX_TO_HASH(_idx - 1); \
-				uint32_t nIndex = _p->h | __ht->nTableMask; \
-				uint32_t i = HT_HASH(__ht, nIndex); \
-				if (UNEXPECTED(j != i)) { \
-					Bucket *prev = HT_HASH_TO_BUCKET(__ht, i); \
-					while (Z_NEXT(prev->val) != j) { \
-						i = Z_NEXT(prev->val); \
-						prev = HT_HASH_TO_BUCKET(__ht, i); \
-					} \
-					Z_NEXT(prev->val) = Z_NEXT(_p->val); \
-				} else { \
-					HT_HASH(__ht, nIndex) = Z_NEXT(_p->val); \
-				} \
-			} while (0); \
-		} \
-		__ht->nNumUsed = _idx; \
-	} while (0)
+	ZEND_HASH_MAP_FOREACH_END_DEL()
 
 #define ZEND_HASH_FOREACH_BUCKET(ht, _bucket) \
-	ZEND_HASH_FOREACH(ht, 0); \
-	_bucket = _p;
+	ZEND_HASH_MAP_FOREACH_BUCKET(ht, _bucket)
 
 #define ZEND_HASH_FOREACH_BUCKET_FROM(ht, _bucket, _from) \
-	ZEND_HASH_FOREACH_FROM(ht, 0, _from); \
-	_bucket = _p;
+	ZEND_HASH_MAP_FOREACH_BUCKET_FROM(ht, _bucket, _from)
 
 #define ZEND_HASH_REVERSE_FOREACH_BUCKET(ht, _bucket) \
-	ZEND_HASH_REVERSE_FOREACH(ht, 0); \
-	_bucket = _p;
+	ZEND_HASH_MAP_REVERSE_FOREACH_BUCKET(ht, _bucket)
 
 #define ZEND_HASH_FOREACH_VAL(ht, _val) \
-	ZEND_HASH_FOREACH(ht, 0); \
+	_ZEND_HASH_FOREACH_VAL(ht); \
 	_val = _z;
 
 #define ZEND_HASH_REVERSE_FOREACH_VAL(ht, _val) \
-	ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+	_ZEND_HASH_REVERSE_FOREACH_VAL(ht); \
 	_val = _z;
 
 #define ZEND_HASH_FOREACH_VAL_IND(ht, _val) \
@@ -1038,7 +1108,7 @@
 	_val = _z;
 
 #define ZEND_HASH_FOREACH_PTR(ht, _ptr) \
-	ZEND_HASH_FOREACH(ht, 0); \
+	_ZEND_HASH_FOREACH_VAL(ht); \
 	_ptr = Z_PTR_P(_z);
 
 #define ZEND_HASH_FOREACH_PTR_FROM(ht, _ptr, _from) \
@@ -1046,126 +1116,402 @@
 	_ptr = Z_PTR_P(_z);
 
 #define ZEND_HASH_REVERSE_FOREACH_PTR(ht, _ptr) \
-	ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+	_ZEND_HASH_REVERSE_FOREACH_VAL(ht); \
 	_ptr = Z_PTR_P(_z);
 
 #define ZEND_HASH_FOREACH_NUM_KEY(ht, _h) \
 	ZEND_HASH_FOREACH(ht, 0); \
-	_h = _p->h;
+	_h = __h;
 
 #define ZEND_HASH_REVERSE_FOREACH_NUM_KEY(ht, _h) \
 	ZEND_HASH_REVERSE_FOREACH(ht, 0); \
-	_h = _p->h;
+	_h = __h;
 
 #define ZEND_HASH_FOREACH_STR_KEY(ht, _key) \
 	ZEND_HASH_FOREACH(ht, 0); \
-	_key = _p->key;
+	_key = __key;
 
 #define ZEND_HASH_REVERSE_FOREACH_STR_KEY(ht, _key) \
 	ZEND_HASH_REVERSE_FOREACH(ht, 0); \
-	_key = _p->key;
+	_key = __key;
 
 #define ZEND_HASH_FOREACH_KEY(ht, _h, _key) \
 	ZEND_HASH_FOREACH(ht, 0); \
-	_h = _p->h; \
-	_key = _p->key;
+	_h = __h; \
+	_key = __key;
 
 #define ZEND_HASH_REVERSE_FOREACH_KEY(ht, _h, _key) \
 	ZEND_HASH_REVERSE_FOREACH(ht, 0); \
-	_h = _p->h; \
-	_key = _p->key;
+	_h = __h; \
+	_key = __key;
 
 #define ZEND_HASH_FOREACH_NUM_KEY_VAL(ht, _h, _val) \
 	ZEND_HASH_FOREACH(ht, 0); \
-	_h = _p->h; \
+	_h = __h; \
 	_val = _z;
 
 #define ZEND_HASH_REVERSE_FOREACH_NUM_KEY_VAL(ht, _h, _val) \
 	ZEND_HASH_REVERSE_FOREACH(ht, 0); \
-	_h = _p->h; \
+	_h = __h; \
 	_val = _z;
 
 #define ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val) \
 	ZEND_HASH_FOREACH(ht, 0); \
-	_key = _p->key; \
+	_key = __key; \
 	_val = _z;
 
 #define ZEND_HASH_FOREACH_STR_KEY_VAL_FROM(ht, _key, _val, _from) \
 	ZEND_HASH_FOREACH_FROM(ht, 0, _from); \
-	_key = _p->key; \
+	_key = __key; \
 	_val = _z;
 
 #define ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(ht, _key, _val) \
 	ZEND_HASH_REVERSE_FOREACH(ht, 0); \
-	_key = _p->key; \
+	_key = __key; \
 	_val = _z;
 
 #define ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _val) \
 	ZEND_HASH_FOREACH(ht, 0); \
-	_h = _p->h; \
-	_key = _p->key; \
+	_h = __h; \
+	_key = __key; \
 	_val = _z;
 
 #define ZEND_HASH_REVERSE_FOREACH_KEY_VAL(ht, _h, _key, _val) \
 	ZEND_HASH_REVERSE_FOREACH(ht, 0); \
-	_h = _p->h; \
-	_key = _p->key; \
+	_h = __h; \
+	_key = __key; \
 	_val = _z;
 
 #define ZEND_HASH_FOREACH_STR_KEY_VAL_IND(ht, _key, _val) \
 	ZEND_HASH_FOREACH(ht, 1); \
-	_key = _p->key; \
+	_key = __key; \
 	_val = _z;
 
 #define ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL_IND(ht, _key, _val) \
 	ZEND_HASH_REVERSE_FOREACH(ht, 1); \
-	_key = _p->key; \
+	_key = __key; \
 	_val = _z;
 
 #define ZEND_HASH_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \
 	ZEND_HASH_FOREACH(ht, 1); \
-	_h = _p->h; \
-	_key = _p->key; \
+	_h = __h; \
+	_key = __key; \
 	_val = _z;
 
 #define ZEND_HASH_REVERSE_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \
 	ZEND_HASH_REVERSE_FOREACH(ht, 1); \
-	_h = _p->h; \
-	_key = _p->key; \
+	_h = __h; \
+	_key = __key; \
 	_val = _z;
 
 #define ZEND_HASH_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \
 	ZEND_HASH_FOREACH(ht, 0); \
-	_h = _p->h; \
+	_h = __h; \
 	_ptr = Z_PTR_P(_z);
 
 #define ZEND_HASH_REVERSE_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \
 	ZEND_HASH_REVERSE_FOREACH(ht, 0); \
-	_h = _p->h; \
+	_h = __h; \
 	_ptr = Z_PTR_P(_z);
 
 #define ZEND_HASH_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \
 	ZEND_HASH_FOREACH(ht, 0); \
-	_key = _p->key; \
+	_key = __key; \
 	_ptr = Z_PTR_P(_z);
 
 #define ZEND_HASH_REVERSE_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \
 	ZEND_HASH_REVERSE_FOREACH(ht, 0); \
-	_key = _p->key; \
+	_key = __key; \
 	_ptr = Z_PTR_P(_z);
 
 #define ZEND_HASH_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \
 	ZEND_HASH_FOREACH(ht, 0); \
-	_h = _p->h; \
-	_key = _p->key; \
+	_h = __h; \
+	_key = __key; \
 	_ptr = Z_PTR_P(_z);
 
 #define ZEND_HASH_REVERSE_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \
 	ZEND_HASH_REVERSE_FOREACH(ht, 0); \
+	_h = __h; \
+	_key = __key; \
+	_ptr = Z_PTR_P(_z);
+
+/* Hash array iterators */
+#define ZEND_HASH_MAP_FOREACH_FROM(_ht, indirect, _from) do { \
+		HashTable *__ht = (_ht); \
+		Bucket *_p = __ht->arData + (_from); \
+		Bucket *_end = __ht->arData + __ht->nNumUsed; \
+		ZEND_ASSERT(!HT_IS_PACKED(__ht)); \
+		for (; _p != _end; _p++) { \
+			zval *_z = &_p->val; \
+			if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \
+				_z = Z_INDIRECT_P(_z); \
+			} \
+			if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue;
+
+#define ZEND_HASH_MAP_FOREACH(_ht, indirect) ZEND_HASH_MAP_FOREACH_FROM(_ht, indirect, 0)
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH(_ht, indirect) do { \
+		HashTable *__ht = (_ht); \
+		uint32_t _idx = __ht->nNumUsed; \
+		Bucket *_p = __ht->arData + _idx; \
+		zval *_z; \
+		ZEND_ASSERT(!HT_IS_PACKED(__ht)); \
+		for (_idx = __ht->nNumUsed; _idx > 0; _idx--) { \
+			_p--; \
+			_z = &_p->val; \
+			if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \
+				_z = Z_INDIRECT_P(_z); \
+			} \
+			if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue;
+
+#define ZEND_HASH_MAP_FOREACH_END_DEL() \
+			ZEND_ASSERT(!HT_IS_PACKED(__ht)); \
+			__ht->nNumOfElements--; \
+			do { \
+				uint32_t j = HT_IDX_TO_HASH(_idx - 1); \
+				uint32_t nIndex = _p->h | __ht->nTableMask; \
+				uint32_t i = HT_HASH(__ht, nIndex); \
+				if (UNEXPECTED(j != i)) { \
+					Bucket *prev = HT_HASH_TO_BUCKET(__ht, i); \
+					while (Z_NEXT(prev->val) != j) { \
+						i = Z_NEXT(prev->val); \
+						prev = HT_HASH_TO_BUCKET(__ht, i); \
+					} \
+					Z_NEXT(prev->val) = Z_NEXT(_p->val); \
+				} else { \
+					HT_HASH(__ht, nIndex) = Z_NEXT(_p->val); \
+				} \
+			} while (0); \
+		} \
+		__ht->nNumUsed = _idx; \
+	} while (0)
+
+#define ZEND_HASH_MAP_FOREACH_BUCKET(ht, _bucket) \
+	ZEND_HASH_MAP_FOREACH(ht, 0); \
+	_bucket = _p;
+
+#define ZEND_HASH_MAP_FOREACH_BUCKET_FROM(ht, _bucket, _from) \
+	ZEND_HASH_MAP_FOREACH_FROM(ht, 0, _from); \
+	_bucket = _p;
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_BUCKET(ht, _bucket) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \
+	_bucket = _p;
+
+#define ZEND_HASH_MAP_FOREACH_VAL(ht, _val) \
+	ZEND_HASH_MAP_FOREACH(ht, 0); \
+	_val = _z;
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_VAL(ht, _val) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \
+	_val = _z;
+
+#define ZEND_HASH_MAP_FOREACH_VAL_IND(ht, _val) \
+	ZEND_HASH_MAP_FOREACH(ht, 1); \
+	_val = _z;
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_VAL_IND(ht, _val) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 1); \
+	_val = _z;
+
+#define ZEND_HASH_MAP_FOREACH_PTR(ht, _ptr) \
+	ZEND_HASH_MAP_FOREACH(ht, 0); \
+	_ptr = Z_PTR_P(_z);
+
+#define ZEND_HASH_MAP_FOREACH_PTR_FROM(ht, _ptr, _from) \
+	ZEND_HASH_MAP_FOREACH_FROM(ht, 0, _from); \
+	_ptr = Z_PTR_P(_z);
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_PTR(ht, _ptr) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \
+	_ptr = Z_PTR_P(_z);
+
+#define ZEND_HASH_MAP_FOREACH_NUM_KEY(ht, _h) \
+	ZEND_HASH_MAP_FOREACH(ht, 0); \
+	_h = _p->h;
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_NUM_KEY(ht, _h) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \
+	_h = _p->h;
+
+#define ZEND_HASH_MAP_FOREACH_STR_KEY(ht, _key) \
+	ZEND_HASH_MAP_FOREACH(ht, 0); \
+	_key = _p->key;
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_STR_KEY(ht, _key) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \
+	_key = _p->key;
+
+#define ZEND_HASH_MAP_FOREACH_KEY(ht, _h, _key) \
+	ZEND_HASH_MAP_FOREACH(ht, 0); \
 	_h = _p->h; \
+	_key = _p->key;
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_KEY(ht, _h, _key) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \
+	_h = _p->h; \
+	_key = _p->key;
+
+#define ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(ht, _h, _val) \
+	ZEND_HASH_MAP_FOREACH(ht, 0); \
+	_h = _p->h; \
+	_val = _z;
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_NUM_KEY_VAL(ht, _h, _val) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \
+	_h = _p->h; \
+	_val = _z;
+
+#define ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(ht, _key, _val) \
+	ZEND_HASH_MAP_FOREACH(ht, 0); \
 	_key = _p->key; \
+	_val = _z;
+
+#define ZEND_HASH_MAP_FOREACH_STR_KEY_VAL_FROM(ht, _key, _val, _from) \
+	ZEND_HASH_MAP_FOREACH_FROM(ht, 0, _from); \
+	_key = _p->key; \
+	_val = _z;
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_STR_KEY_VAL(ht, _key, _val) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \
+	_key = _p->key; \
+	_val = _z;
+
+#define ZEND_HASH_MAP_FOREACH_KEY_VAL(ht, _h, _key, _val) \
+	ZEND_HASH_MAP_FOREACH(ht, 0); \
+	_h = _p->h; \
+	_key = _p->key; \
+	_val = _z;
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_KEY_VAL(ht, _h, _key, _val) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \
+	_h = _p->h; \
+	_key = _p->key; \
+	_val = _z;
+
+#define ZEND_HASH_MAP_FOREACH_STR_KEY_VAL_IND(ht, _key, _val) \
+	ZEND_HASH_MAP_FOREACH(ht, 1); \
+	_key = _p->key; \
+	_val = _z;
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_STR_KEY_VAL_IND(ht, _key, _val) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 1); \
+	_key = _p->key; \
+	_val = _z;
+
+#define ZEND_HASH_MAP_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \
+	ZEND_HASH_MAP_FOREACH(ht, 1); \
+	_h = _p->h; \
+	_key = _p->key; \
+	_val = _z;
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 1); \
+	_h = _p->h; \
+	_key = _p->key; \
+	_val = _z;
+
+#define ZEND_HASH_MAP_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \
+	ZEND_HASH_MAP_FOREACH(ht, 0); \
+	_h = _p->h; \
 	_ptr = Z_PTR_P(_z);
 
+#define ZEND_HASH_MAP_REVERSE_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \
+	_h = _p->h; \
+	_ptr = Z_PTR_P(_z);
+
+#define ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \
+	ZEND_HASH_MAP_FOREACH(ht, 0); \
+	_key = _p->key; \
+	_ptr = Z_PTR_P(_z);
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \
+	_key = _p->key; \
+	_ptr = Z_PTR_P(_z);
+
+#define ZEND_HASH_MAP_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \
+	ZEND_HASH_MAP_FOREACH(ht, 0); \
+	_h = _p->h; \
+	_key = _p->key; \
+	_ptr = Z_PTR_P(_z);
+
+#define ZEND_HASH_MAP_REVERSE_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \
+	ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \
+	_h = _p->h; \
+	_key = _p->key; \
+	_ptr = Z_PTR_P(_z);
+
+/* Packed array iterators */
+#define ZEND_HASH_PACKED_FOREACH_FROM(_ht, _from) do { \
+		HashTable *__ht = (_ht); \
+		zend_ulong _idx = (_from); \
+		zval *_z = __ht->arPacked + (_from); \
+		zval *_end = __ht->arPacked + __ht->nNumUsed; \
+		ZEND_ASSERT(HT_IS_PACKED(__ht)); \
+		for (;_z != _end; _z++, _idx++) { \
+			(void) _idx; \
+			if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue;
+
+#define ZEND_HASH_PACKED_FOREACH(_ht) ZEND_HASH_PACKED_FOREACH_FROM(_ht, 0)
+
+#define ZEND_HASH_PACKED_REVERSE_FOREACH(_ht) do { \
+		HashTable *__ht = (_ht); \
+		zend_ulong _idx = __ht->nNumUsed; \
+		zval *_z = __ht->arPacked + _idx; \
+		ZEND_ASSERT(HT_IS_PACKED(__ht)); \
+		while (_idx > 0) { \
+			_z--; \
+			_idx--; \
+			(void) _idx; \
+			if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue;
+
+#define ZEND_HASH_PACKED_FOREACH_VAL(ht, _val) \
+	ZEND_HASH_PACKED_FOREACH(ht); \
+	_val = _z;
+
+#define ZEND_HASH_PACKED_REVERSE_FOREACH_VAL(ht, _val) \
+	ZEND_HASH_PACKED_REVERSE_FOREACH(ht); \
+	_val = _z;
+
+#define ZEND_HASH_PACKED_FOREACH_PTR(ht, _ptr) \
+	ZEND_HASH_PACKED_FOREACH(ht); \
+	_ptr = Z_PTR_P(_z);
+
+#define ZEND_HASH_PACKED_REVERSE_FOREACH_PTR(ht, _ptr) \
+	ZEND_HASH_PACKED_REVERSE_FOREACH(ht); \
+	_ptr = Z_PTR_P(_z);
+
+#define ZEND_HASH_PACKED_FOREACH_KEY(ht, _h) \
+	ZEND_HASH_PACKED_FOREACH(ht); \
+	_h = _idx;
+
+#define ZEND_HASH_PACKED_REVERSE_FOREACH_KEY(ht, _h) \
+	ZEND_HASH_PACKED_REVERSE_FOREACH(ht); \
+	_h = _idx;
+
+#define ZEND_HASH_PACKED_FOREACH_KEY_VAL(ht, _h, _val) \
+	ZEND_HASH_PACKED_FOREACH(ht); \
+	_h = _idx; \
+	_val = _z;
+
+#define ZEND_HASH_PACKED_REVERSE_FOREACH_KEY_VAL(ht, _h, _val) \
+	ZEND_HASH_PACKED_REVERSE_FOREACH(ht); \
+	_h = _idx; \
+	_val = _z;
+
+#define ZEND_HASH_PACKED_FOREACH_KEY_PTR(ht, _h, _ptr) \
+	ZEND_HASH_PACKED_FOREACH(ht); \
+	_h = _idx; \
+	_ptr = Z_PTR_P(_z);
+
+#define ZEND_HASH_PACKED_REVERSE_FOREACH_KEY_PTR(ht, _h, _ptr) \
+	ZEND_HASH_PACKED_REVERSE_FOREACH(ht); \
+	_h = _idx; \
+	_ptr = Z_PTR_P(_z);
+
 /* The following macros are useful to insert a sequence of new elements
  * of packed array. They may be used instead of series of
  * zend_hash_next_index_insert_new()
@@ -1173,45 +1519,43 @@
  */
 #define ZEND_HASH_FILL_PACKED(ht) do { \
 		HashTable *__fill_ht = (ht); \
-		Bucket *__fill_bkt = __fill_ht->arData + __fill_ht->nNumUsed; \
+		zval *__fill_val = __fill_ht->arPacked + __fill_ht->nNumUsed; \
 		uint32_t __fill_idx = __fill_ht->nNumUsed; \
-		ZEND_ASSERT(HT_FLAGS(__fill_ht) & HASH_FLAG_PACKED);
+		ZEND_ASSERT(HT_IS_PACKED(__fill_ht));
 
 #define ZEND_HASH_FILL_GROW() do { \
 		if (UNEXPECTED(__fill_idx >= __fill_ht->nTableSize)) { \
+			__fill_ht->nNumOfElements += __fill_idx - __fill_ht->nNumUsed; \
 			__fill_ht->nNumUsed = __fill_idx; \
-			__fill_ht->nNumOfElements = __fill_idx; \
 			__fill_ht->nNextFreeElement = __fill_idx; \
 			zend_hash_packed_grow(__fill_ht); \
-			__fill_bkt = __fill_ht->arData + __fill_idx; \
+			__fill_val = __fill_ht->arPacked + __fill_idx; \
 		} \
 	} while (0);
 
 #define ZEND_HASH_FILL_SET(_val) \
-		ZVAL_COPY_VALUE(&__fill_bkt->val, _val)
+		ZVAL_COPY_VALUE(__fill_val, _val)
 
 #define ZEND_HASH_FILL_SET_NULL() \
-		ZVAL_NULL(&__fill_bkt->val)
+		ZVAL_NULL(__fill_val)
 
 #define ZEND_HASH_FILL_SET_LONG(_val) \
-		ZVAL_LONG(&__fill_bkt->val, _val)
+		ZVAL_LONG(__fill_val, _val)
 
 #define ZEND_HASH_FILL_SET_DOUBLE(_val) \
-		ZVAL_DOUBLE(&__fill_bkt->val, _val)
+		ZVAL_DOUBLE(__fill_val, _val)
 
 #define ZEND_HASH_FILL_SET_STR(_val) \
-		ZVAL_STR(&__fill_bkt->val, _val)
+		ZVAL_STR(__fill_val, _val)
 
 #define ZEND_HASH_FILL_SET_STR_COPY(_val) \
-		ZVAL_STR_COPY(&__fill_bkt->val, _val)
+		ZVAL_STR_COPY(__fill_val, _val)
 
 #define ZEND_HASH_FILL_SET_INTERNED_STR(_val) \
-		ZVAL_INTERNED_STR(&__fill_bkt->val, _val)
+		ZVAL_INTERNED_STR(__fill_val, _val)
 
 #define ZEND_HASH_FILL_NEXT() do {\
-		__fill_bkt->h = (__fill_idx); \
-		__fill_bkt->key = NULL; \
-		__fill_bkt++; \
+		__fill_val++; \
 		__fill_idx++; \
 	} while (0)
 
@@ -1221,8 +1565,8 @@
 	} while (0)
 
 #define ZEND_HASH_FILL_FINISH() do { \
+		__fill_ht->nNumOfElements += __fill_idx - __fill_ht->nNumUsed; \
 		__fill_ht->nNumUsed = __fill_idx; \
-		__fill_ht->nNumOfElements = __fill_idx; \
 		__fill_ht->nNextFreeElement = __fill_idx; \
 		__fill_ht->nInternalPointer = 0; \
 	} while (0)
@@ -1234,8 +1578,8 @@
 /* Check if an array is a list */
 static zend_always_inline bool zend_array_is_list(zend_array *array)
 {
-	zend_long expected_idx = 0;
-	zend_long num_idx;
+	zend_ulong expected_idx = 0;
+	zend_ulong num_idx;
 	zend_string* str_idx;
 	/* Empty arrays are lists */
 	if (zend_hash_num_elements(array) == 0) {
@@ -1243,17 +1587,25 @@
 	}
 
 	/* Packed arrays are lists */
-	if (HT_IS_PACKED(array) && HT_IS_WITHOUT_HOLES(array)) {
-		return 1;
+	if (HT_IS_PACKED(array)) {
+		if (HT_IS_WITHOUT_HOLES(array)) {
+			return 1;
+		}
+		/* Check if the list could theoretically be repacked */
+		ZEND_HASH_PACKED_FOREACH_KEY(array, num_idx) {
+			if (num_idx != expected_idx++) {
+				return 0;
+			}
+		} ZEND_HASH_FOREACH_END();
+	} else {
+		/* Check if the list could theoretically be repacked */
+		ZEND_HASH_MAP_FOREACH_KEY(array, num_idx, str_idx) {
+			if (str_idx != NULL || num_idx != expected_idx++) {
+				return 0;
+			}
+		} ZEND_HASH_FOREACH_END();
 	}
 
-	/* Check if the list could theoretically be repacked */
-	ZEND_HASH_FOREACH_KEY(array, num_idx, str_idx) {
-		if (str_idx != NULL || num_idx != expected_idx++) {
-			return 0;
-		}
-	} ZEND_HASH_FOREACH_END();
-
 	return 1;
 }
 

Added: branches/4.0/MgDev/Oem/php/include/Zend/zend_hrtime.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_hrtime.h	                        (rev 0)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_hrtime.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -0,0 +1,107 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright (c) The PHP Group                                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.01 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | https://www.php.net/license/3_01.txt                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license at php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Author: Niklas Keller <kelunik at php.net>                              |
+   | Author: Anatol Belski <ab at php.net>                                   |
+   +----------------------------------------------------------------------+
+*/
+
+#ifndef ZEND_HRTIME_H
+#define ZEND_HRTIME_H
+
+#include "zend_portability.h"
+#include "zend_types.h"
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifndef PHP_WIN32
+# include <time.h>
+#endif
+
+/* This file reuses code parts from the cross-platform timer library
+	Public Domain - 2011 Mattias Jansson / Rampant Pixels */
+
+#define ZEND_HRTIME_PLATFORM_POSIX   0
+#define ZEND_HRTIME_PLATFORM_WINDOWS 0
+#define ZEND_HRTIME_PLATFORM_APPLE   0
+#define ZEND_HRTIME_PLATFORM_HPUX    0
+#define ZEND_HRTIME_PLATFORM_AIX     0
+
+#if defined(_POSIX_TIMERS) && ((_POSIX_TIMERS > 0) || defined(__OpenBSD__)) && defined(_POSIX_MONOTONIC_CLOCK) && defined(CLOCK_MONOTONIC)
+# undef  ZEND_HRTIME_PLATFORM_POSIX
+# define ZEND_HRTIME_PLATFORM_POSIX 1
+#elif defined(_WIN32) || defined(_WIN64)
+# undef  ZEND_HRTIME_PLATFORM_WINDOWS
+# define ZEND_HRTIME_PLATFORM_WINDOWS 1
+#elif defined(__APPLE__)
+# undef  ZEND_HRTIME_PLATFORM_APPLE
+# define ZEND_HRTIME_PLATFORM_APPLE 1
+#elif (defined(__hpux) || defined(hpux)) || ((defined(__sun__) || defined(__sun) || defined(sun)) && (defined(__SVR4) || defined(__svr4__)))
+# undef  ZEND_HRTIME_PLATFORM_HPUX
+# define ZEND_HRTIME_PLATFORM_HPUX 1
+#elif defined(_AIX)
+# undef  ZEND_HRTIME_PLATFORM_AIX
+# define ZEND_HRTIME_PLATFORM_AIX 1
+#endif
+
+#define ZEND_HRTIME_AVAILABLE (ZEND_HRTIME_PLATFORM_POSIX || ZEND_HRTIME_PLATFORM_WINDOWS || ZEND_HRTIME_PLATFORM_APPLE || ZEND_HRTIME_PLATFORM_HPUX || ZEND_HRTIME_PLATFORM_AIX)
+
+BEGIN_EXTERN_C()
+
+#if ZEND_HRTIME_PLATFORM_WINDOWS
+
+ZEND_API extern double zend_hrtime_timer_scale;
+
+#elif ZEND_HRTIME_PLATFORM_APPLE
+
+# include <mach/mach_time.h>
+# include <string.h>
+ZEND_API extern mach_timebase_info_data_t zend_hrtime_timerlib_info;
+
+#endif
+
+#define ZEND_NANO_IN_SEC UINT64_C(1000000000)
+
+typedef uint64_t zend_hrtime_t;
+
+void zend_startup_hrtime(void);
+
+static zend_always_inline zend_hrtime_t zend_hrtime(void)
+{
+#if ZEND_HRTIME_PLATFORM_WINDOWS
+	LARGE_INTEGER lt = {0};
+	QueryPerformanceCounter(&lt);
+	return (zend_hrtime_t)((zend_hrtime_t)lt.QuadPart * zend_hrtime_timer_scale);
+#elif ZEND_HRTIME_PLATFORM_APPLE
+	return (zend_hrtime_t)mach_absolute_time() * zend_hrtime_timerlib_info.numer / zend_hrtime_timerlib_info.denom;
+#elif ZEND_HRTIME_PLATFORM_POSIX
+	struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 };
+	if (EXPECTED(0 == clock_gettime(CLOCK_MONOTONIC, &ts))) {
+		return ((zend_hrtime_t) ts.tv_sec * (zend_hrtime_t)ZEND_NANO_IN_SEC) + ts.tv_nsec;
+	}
+	return 0;
+#elif ZEND_HRTIME_PLATFORM_HPUX
+	return (zend_hrtime_t) gethrtime();
+#elif  ZEND_HRTIME_PLATFORM_AIX
+	timebasestruct_t t;
+	read_wall_time(&t, TIMEBASE_SZ);
+	time_base_to_time(&t, TIMEBASE_SZ);
+	return (zend_hrtime_t) t.tb_high * (zend_hrtime_t)NANO_IN_SEC + t.tb_low;
+#else
+	return 0;
+#endif
+}
+
+END_EXTERN_C()
+
+#endif /* ZEND_HRTIME_H */

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_inheritance.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_inheritance.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_inheritance.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -27,15 +27,18 @@
 ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface);
 ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *parent_ce, bool checked);
 
-#define zend_do_inheritance(ce, parent_ce) \
-	zend_do_inheritance_ex(ce, parent_ce, 0)
+static zend_always_inline void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce) {
+	zend_do_inheritance_ex(ce, parent_ce, 0);
+}
 
 ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string *lc_parent_name, zend_string *key);
 
 void zend_verify_abstract_class(zend_class_entry *ce);
 void zend_build_properties_info_table(zend_class_entry *ce);
-zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding);
+ZEND_API zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding);
 
+void zend_inheritance_check_override(zend_class_entry *ce);
+
 ZEND_API extern zend_class_entry* (*zend_inheritance_cache_get)(zend_class_entry *ce, zend_class_entry *parent, zend_class_entry **traits_and_interfaces);
 ZEND_API extern zend_class_entry* (*zend_inheritance_cache_add)(zend_class_entry *ce, zend_class_entry *proto, zend_class_entry *parent, zend_class_entry **traits_and_interfaces, HashTable *dependencies);
 

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_ini.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_ini.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_ini.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -87,9 +87,57 @@
 ZEND_API double zend_ini_double(const char *name, size_t name_length, int orig);
 ZEND_API char *zend_ini_string(const char *name, size_t name_length, int orig);
 ZEND_API char *zend_ini_string_ex(const char *name, size_t name_length, int orig, bool *exists);
+ZEND_API zend_string *zend_ini_str(const char *name, size_t name_length, bool orig);
+ZEND_API zend_string *zend_ini_str_ex(const char *name, size_t name_length, bool orig, bool *exists);
 ZEND_API zend_string *zend_ini_get_value(zend_string *name);
 ZEND_API bool zend_ini_parse_bool(zend_string *str);
 
+/**
+ * Parses an ini quantity
+ *
+ * The value parameter must be a string in the form
+ *
+ *     sign? digits ws* multiplier?
+ *
+ * with
+ *
+ *     sign: [+-]
+ *     digit: [0-9]
+ *     digits: digit+
+ *     ws: [ \t\n\r\v\f]
+ *     multiplier: [KMG]
+ *
+ * Leading and trailing whitespaces are ignored.
+ *
+ * If the string is empty or consists only of only whitespaces, 0 is returned.
+ *
+ * Digits is parsed as decimal unless the first digit is '0', in which case
+ * digits is parsed as octal.
+ *
+ * The multiplier is case-insensitive. K, M, and G multiply the quantity by
+ * 2**10, 2**20, and 2**30, respectively.
+ *
+ * For backwards compatibility, ill-formatted values are handled as follows:
+ * - No leading digits: value is treated as '0'
+ * - Invalid multiplier: multiplier is ignored
+ * - Invalid characters between digits and multiplier: invalid characters are
+ *   ignored
+ * - Integer overflow: The result of the overflow is returned
+ *
+ * In any of these cases an error string is stored in *errstr (caller must
+ * release it), otherwise *errstr is set to NULL.
+ */
+ZEND_API zend_long zend_ini_parse_quantity(zend_string *value, zend_string **errstr);
+
+/**
+ * Unsigned variant of zend_ini_parse_quantity
+ */
+ZEND_API zend_ulong zend_ini_parse_uquantity(zend_string *value, zend_string **errstr);
+
+ZEND_API zend_long zend_ini_parse_quantity_warn(zend_string *value, zend_string *setting);
+
+ZEND_API zend_ulong zend_ini_parse_uquantity_warn(zend_string *value, zend_string *setting);
+
 ZEND_API zend_result zend_ini_register_displayer(const char *name, uint32_t name_length, void (*displayer)(zend_ini_entry *ini_entry, int type));
 
 ZEND_API ZEND_INI_DISP(zend_ini_boolean_displayer_cb);
@@ -150,8 +198,8 @@
 #define INI_ORIG_STR(name)	zend_ini_string((name), strlen(name), 1)
 #define INI_ORIG_BOOL(name) ((bool) INI_ORIG_INT(name))
 
-#define REGISTER_INI_ENTRIES() zend_register_ini_entries(ini_entries, module_number)
-#define UNREGISTER_INI_ENTRIES() zend_unregister_ini_entries(module_number)
+#define REGISTER_INI_ENTRIES() zend_register_ini_entries_ex(ini_entries, module_number, type)
+#define UNREGISTER_INI_ENTRIES() zend_unregister_ini_entries_ex(module_number, type)
 #define DISPLAY_INI_ENTRIES() display_ini_entries(zend_module)
 
 #define REGISTER_INI_DISPLAYER(name, displayer) zend_ini_register_displayer((name), strlen(name), displayer)
@@ -163,8 +211,12 @@
 ZEND_API ZEND_INI_MH(OnUpdateLong);
 ZEND_API ZEND_INI_MH(OnUpdateLongGEZero);
 ZEND_API ZEND_INI_MH(OnUpdateReal);
+/* char* versions */
 ZEND_API ZEND_INI_MH(OnUpdateString);
 ZEND_API ZEND_INI_MH(OnUpdateStringUnempty);
+/* zend_string* versions */
+ZEND_API ZEND_INI_MH(OnUpdateStr);
+ZEND_API ZEND_INI_MH(OnUpdateStrNotEmpty);
 END_EXTERN_C()
 
 #define ZEND_INI_DISPLAY_ORIG	1
@@ -182,8 +234,8 @@
 /* INI parsing engine */
 typedef void (*zend_ini_parser_cb_t)(zval *arg1, zval *arg2, zval *arg3, int callback_type, void *arg);
 BEGIN_EXTERN_C()
-ZEND_API int zend_parse_ini_file(zend_file_handle *fh, bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg);
-ZEND_API int zend_parse_ini_string(char *str, bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg);
+ZEND_API zend_result zend_parse_ini_file(zend_file_handle *fh, bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg);
+ZEND_API zend_result zend_parse_ini_string(const char *str, bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg);
 END_EXTERN_C()
 
 /* INI entries */

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_ini_parser.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_ini_parser.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_ini_parser.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -69,10 +69,11 @@
     TC_DOLLAR_CURLY = 266,
     TC_VARNAME = 267,
     TC_QUOTED_STRING = 268,
-    BOOL_TRUE = 269,
-    BOOL_FALSE = 270,
-    NULL_NULL = 271,
-    END_OF_LINE = 272
+    TC_FALLBACK = 269,
+    BOOL_TRUE = 270,
+    BOOL_FALSE = 271,
+    NULL_NULL = 272,
+    END_OF_LINE = 273
   };
 #endif
 

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_ini_scanner.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_ini_scanner.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_ini_scanner.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -27,9 +27,9 @@
 
 BEGIN_EXTERN_C()
 ZEND_COLD int zend_ini_scanner_get_lineno(void);
-ZEND_COLD char *zend_ini_scanner_get_filename(void);
+ZEND_COLD const char *zend_ini_scanner_get_filename(void);
 zend_result zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode);
-zend_result zend_ini_prepare_string_for_scanning(char *str, int scanner_mode);
+zend_result zend_ini_prepare_string_for_scanning(const char *str, int scanner_mode);
 int ini_lex(zval *ini_lval);
 void shutdown_ini_scanner(void);
 END_EXTERN_C()

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_ini_scanner_defs.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_ini_scanner_defs.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_ini_scanner_defs.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -8,6 +8,7 @@
 	yycST_VALUE,
 	yycST_SECTION_RAW,
 	yycST_DOUBLE_QUOTES,
+	yycST_VAR_FALLBACK,
 	yycST_VARNAME,
 	yycST_RAW,
 };

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_interfaces.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_interfaces.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_interfaces.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -40,14 +40,23 @@
 
 ZEND_API zval* zend_call_method(zend_object *object, zend_class_entry *obj_ce, zend_function **fn_proxy, const char *function_name, size_t function_name_len, zval *retval, uint32_t param_count, zval* arg1, zval* arg2);
 
-#define zend_call_method_with_0_params(obj, obj_ce, fn_proxy, function_name, retval) \
-	zend_call_method(obj, obj_ce, fn_proxy, function_name, sizeof(function_name)-1, retval, 0, NULL, NULL)
+static zend_always_inline zval* zend_call_method_with_0_params(zend_object *object, zend_class_entry *obj_ce,
+		zend_function **fn_proxy, const char *function_name, zval *retval)
+{
+	return zend_call_method(object, obj_ce, fn_proxy, function_name, strlen(function_name), retval, 0, NULL, NULL);
+}
 
-#define zend_call_method_with_1_params(obj, obj_ce, fn_proxy, function_name, retval, arg1) \
-	zend_call_method(obj, obj_ce, fn_proxy, function_name, sizeof(function_name)-1, retval, 1, arg1, NULL)
+static zend_always_inline zval* zend_call_method_with_1_params(zend_object *object, zend_class_entry *obj_ce,
+		zend_function **fn_proxy, const char *function_name, zval *retval, zval* arg1)
+{
+	return zend_call_method(object, obj_ce, fn_proxy, function_name, strlen(function_name), retval, 1, arg1, NULL);
+}
 
-#define zend_call_method_with_2_params(obj, obj_ce, fn_proxy, function_name, retval, arg1, arg2) \
-	zend_call_method(obj, obj_ce, fn_proxy, function_name, sizeof(function_name)-1, retval, 2, arg1, arg2)
+static zend_always_inline zval* zend_call_method_with_2_params(zend_object *object, zend_class_entry *obj_ce,
+		zend_function **fn_proxy, const char *function_name, zval *retval, zval* arg1, zval* arg2)
+{
+	return zend_call_method(object, obj_ce, fn_proxy, function_name, strlen(function_name), retval, 2, arg1, arg2);
+}
 
 ZEND_API void zend_user_it_rewind(zend_object_iterator *_iter);
 ZEND_API zend_result zend_user_it_valid(zend_object_iterator *_iter);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_iterators.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_iterators.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_iterators.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -72,6 +72,13 @@
 	zend_function *zf_rewind;
 } zend_class_iterator_funcs;
 
+typedef struct _zend_class_arrayaccess_funcs {
+	zend_function *zf_offsetget;
+	zend_function *zf_offsetexists;
+	zend_function *zf_offsetset;
+	zend_function *zf_offsetunset;
+} zend_class_arrayaccess_funcs;
+
 BEGIN_EXTERN_C()
 /* given a zval, returns stuff that can be used to iterate it. */
 ZEND_API zend_object_iterator* zend_iterator_unwrap(zval *array_ptr);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_list.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_list.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_list.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -54,7 +54,7 @@
 
 ZEND_API zval* ZEND_FASTCALL zend_list_insert(void *ptr, int type);
 ZEND_API void ZEND_FASTCALL zend_list_free(zend_resource *res);
-ZEND_API int ZEND_FASTCALL zend_list_delete(zend_resource *res);
+ZEND_API zend_result ZEND_FASTCALL zend_list_delete(zend_resource *res);
 ZEND_API void ZEND_FASTCALL zend_list_close(zend_resource *res);
 
 ZEND_API zend_resource *zend_register_resource(void *rsrc_pointer, int rsrc_type);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_llist.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_llist.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_llist.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -66,11 +66,26 @@
 ZEND_API void *zend_llist_get_next_ex(zend_llist *l, zend_llist_position *pos);
 ZEND_API void *zend_llist_get_prev_ex(zend_llist *l, zend_llist_position *pos);
 
-#define zend_llist_get_first(l) zend_llist_get_first_ex(l, NULL)
-#define zend_llist_get_last(l) zend_llist_get_last_ex(l, NULL)
-#define zend_llist_get_next(l) zend_llist_get_next_ex(l, NULL)
-#define zend_llist_get_prev(l) zend_llist_get_prev_ex(l, NULL)
+static zend_always_inline void *zend_llist_get_first(zend_llist *l)
+{
+	return zend_llist_get_first_ex(l, NULL);
+}
 
+static zend_always_inline void *zend_llist_get_last(zend_llist *l)
+{
+	return zend_llist_get_last_ex(l, NULL);
+}
+
+static zend_always_inline void *zend_llist_get_next(zend_llist *l)
+{
+	return zend_llist_get_next_ex(l, NULL);
+}
+
+static zend_always_inline void *zend_llist_get_prev(zend_llist *l)
+{
+	return zend_llist_get_prev_ex(l, NULL);
+}
+
 END_EXTERN_C()
 
 #endif /* ZEND_LLIST_H */

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_long.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_long.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_long.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -19,7 +19,8 @@
 #ifndef ZEND_LONG_H
 #define ZEND_LONG_H
 
-#include "main/php_stdint.h"
+#include <inttypes.h>
+#include <stdint.h>
 
 /* This is the heart of the whole int64 enablement in zval. */
 #if defined(__x86_64__) || defined(__LP64__) || defined(_LP64) || defined(_WIN64)

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_map_ptr.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_map_ptr.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_map_ptr.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -24,16 +24,12 @@
 #define ZEND_MAP_PTR_KIND_PTR           0
 #define ZEND_MAP_PTR_KIND_PTR_OR_OFFSET 1
 
-//#if defined(ZTS) || defined(TSRM_WIN32)
-# define ZEND_MAP_PTR_KIND ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
-//#else
-//# define ZEND_MAP_PTR_KIND ZEND_MAP_PTR_KIND_PTR
-//#endif
+#define ZEND_MAP_PTR_KIND ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
 
 #define ZEND_MAP_PTR(ptr) \
 	ptr ## __ptr
 #define ZEND_MAP_PTR_DEF(type, name) \
-	type * ZEND_MAP_PTR(name)
+	type ZEND_MAP_PTR(name)
 #define ZEND_MAP_PTR_OFFSET2PTR(offset) \
 	((void**)((char*)CG(map_ptr_base) + offset))
 #define ZEND_MAP_PTR_PTR2OFFSET(ptr) \
@@ -45,37 +41,23 @@
 		ZEND_MAP_PTR(ptr) = zend_map_ptr_new(); \
 	} while (0)
 
-#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
+#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
 # define ZEND_MAP_PTR_NEW_OFFSET() \
-	((uint32_t)(uintptr_t)ZEND_MAP_PTR_PTR2OFFSET(zend_map_ptr_new()))
-# define ZEND_MAP_PTR_GET(ptr) \
-	(*(ZEND_MAP_PTR(ptr)))
-# define ZEND_MAP_PTR_GET_IMM(ptr) \
-	ZEND_MAP_PTR_GET(ptr)
-# define ZEND_MAP_PTR_SET(ptr, val) do { \
-		(*(ZEND_MAP_PTR(ptr))) = (val); \
-	} while (0)
-# define ZEND_MAP_PTR_SET_IMM(ptr, val) \
-	ZEND_MAP_PTR_SET(ptr, val)
-# define ZEND_MAP_PTR_BIASED_BASE(real_base) \
-	(real_base)
-#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
-# define ZEND_MAP_PTR_NEW_OFFSET() \
 	((uint32_t)(uintptr_t)zend_map_ptr_new())
 # define ZEND_MAP_PTR_IS_OFFSET(ptr) \
 	(((uintptr_t)ZEND_MAP_PTR(ptr)) & 1L)
 # define ZEND_MAP_PTR_GET(ptr) \
-	(*(ZEND_MAP_PTR_IS_OFFSET(ptr) ? \
-		ZEND_MAP_PTR_OFFSET2PTR((uintptr_t)ZEND_MAP_PTR(ptr)) : \
-		((void**)(ZEND_MAP_PTR(ptr)))))
+	((ZEND_MAP_PTR_IS_OFFSET(ptr) ? \
+		ZEND_MAP_PTR_GET_IMM(ptr) : \
+		((void*)(ZEND_MAP_PTR(ptr)))))
 # define ZEND_MAP_PTR_GET_IMM(ptr) \
 	(*ZEND_MAP_PTR_OFFSET2PTR((uintptr_t)ZEND_MAP_PTR(ptr)))
 # define ZEND_MAP_PTR_SET(ptr, val) do { \
-		void **__p = (void**)(ZEND_MAP_PTR(ptr)); \
 		if (ZEND_MAP_PTR_IS_OFFSET(ptr)) { \
-			__p = ZEND_MAP_PTR_OFFSET2PTR((uintptr_t)ZEND_MAP_PTR(ptr)); \
+			ZEND_MAP_PTR_SET_IMM(ptr, val); \
+		} else { \
+			ZEND_MAP_PTR_INIT(ptr, val); \
 		} \
-		*__p = (val); \
 	} while (0)
 # define ZEND_MAP_PTR_SET_IMM(ptr, val) do { \
 		void **__p = ZEND_MAP_PTR_OFFSET2PTR((uintptr_t)ZEND_MAP_PTR(ptr)); \
@@ -87,9 +69,13 @@
 # error "Unknown ZEND_MAP_PTR_KIND"
 #endif
 
+BEGIN_EXTERN_C()
+
 ZEND_API void  zend_map_ptr_reset(void);
 ZEND_API void *zend_map_ptr_new(void);
 ZEND_API void  zend_map_ptr_extend(size_t last);
 ZEND_API void zend_alloc_ce_cache(zend_string *type_name);
 
+END_EXTERN_C()
+
 #endif /* ZEND_MAP_PTR_H */

Added: branches/4.0/MgDev/Oem/php/include/Zend/zend_max_execution_timer.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_max_execution_timer.h	                        (rev 0)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_max_execution_timer.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -0,0 +1,36 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright (c) The PHP Group                                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.01 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | https://www.php.net/license/3_01.txt                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license at php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Author: Kévin Dunglas <kevin at dunglas.dev>                            |
+   +----------------------------------------------------------------------+
+ */
+
+#ifndef ZEND_MAX_EXECUTION_TIMER_H
+#define ZEND_MAX_EXECUTION_TIMER_H
+
+# ifdef ZEND_MAX_EXECUTION_TIMERS
+
+#include "zend_long.h"
+
+/* Must be called after calls to fork() */
+ZEND_API void zend_max_execution_timer_init(void);
+void zend_max_execution_timer_settime(zend_long seconds);
+void zend_max_execution_timer_shutdown(void);
+
+# else
+
+#define zend_max_execution_timer_init()
+#define zend_max_execution_timer_settime(seconds)
+#define zend_max_execution_timer_shutdown()
+
+# endif
+#endif

Added: branches/4.0/MgDev/Oem/php/include/Zend/zend_mmap.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_mmap.h	                        (rev 0)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_mmap.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -0,0 +1,44 @@
+/*
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.00 of the Zend license,     |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | http://www.zend.com/license/2_00.txt.                                |
+   | If you did not receive a copy of the Zend license and are unable to  |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license at zend.com so we can mail you a copy immediately.              |
+   +----------------------------------------------------------------------+
+   | Authors: Max Kellermann <max.kellermann at ionos.com>                   |
+   +----------------------------------------------------------------------+
+*/
+
+#ifndef ZEND_MMAP_H
+#define ZEND_MMAP_H
+
+#include "zend_portability.h"
+
+#ifdef HAVE_PRCTL
+# include <sys/prctl.h>
+
+/* fallback definitions if our libc is older than the kernel */
+# ifndef PR_SET_VMA
+#  define PR_SET_VMA 0x53564d41
+# endif
+# ifndef PR_SET_VMA_ANON_NAME
+#  define PR_SET_VMA_ANON_NAME 0
+# endif
+#endif // HAVE_PRCTL
+
+/**
+ * Set a name for the specified memory area.
+ *
+ * This feature requires Linux 5.17.
+ */
+static zend_always_inline void zend_mmap_set_name(const void *start, size_t len, const char *name)
+{
+#ifdef HAVE_PRCTL
+	prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, (unsigned long)start, len, (unsigned long)name);
+#endif
+}
+
+#endif /* ZEND_MMAP_H */

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_modules.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_modules.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_modules.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -31,7 +31,7 @@
 #define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module
 #define ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU zend_module
 
-#define ZEND_MODULE_API_NO 20210902
+#define ZEND_MODULE_API_NO 20230831
 #ifdef ZTS
 #define USING_ZTS 1
 #else
@@ -125,7 +125,7 @@
 
 void module_destructor(zend_module_entry *module);
 int module_registry_request_startup(zend_module_entry *module);
-int module_registry_unload_temp(const zend_module_entry *module);
+void module_registry_unload(const zend_module_entry *module);
 END_EXTERN_C()
 
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_multibyte.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_multibyte.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_multibyte.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -66,12 +66,12 @@
 ZEND_API int zend_multibyte_check_lexer_compatibility(const zend_encoding *encoding);
 ZEND_API const zend_encoding *zend_multibyte_encoding_detector(const unsigned char *string, size_t length, const zend_encoding **list, size_t list_size);
 ZEND_API size_t zend_multibyte_encoding_converter(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length, const zend_encoding *encoding_to, const zend_encoding *encoding_from);
-ZEND_API int zend_multibyte_parse_encoding_list(const char *encoding_list, size_t encoding_list_len, const zend_encoding ***return_list, size_t *return_size, bool persistent);
+ZEND_API zend_result zend_multibyte_parse_encoding_list(const char *encoding_list, size_t encoding_list_len, const zend_encoding ***return_list, size_t *return_size, bool persistent);
 
 ZEND_API const zend_encoding *zend_multibyte_get_internal_encoding(void);
 ZEND_API const zend_encoding *zend_multibyte_get_script_encoding(void);
 ZEND_API int zend_multibyte_set_script_encoding(const zend_encoding **encoding_list, size_t encoding_list_size);
-ZEND_API int zend_multibyte_set_internal_encoding(const zend_encoding *encoding);
+ZEND_API zend_result zend_multibyte_set_internal_encoding(const zend_encoding *encoding);
 ZEND_API zend_result zend_multibyte_set_script_encoding_by_string(const char *new_value, size_t new_value_length);
 
 END_EXTERN_C()

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_multiply.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_multiply.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_multiply.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -94,6 +94,19 @@
 		(dval) = (double)(a) * (double)(b); \
 	} \
 } while (0)
+# elif defined(_M_ARM64)
+#  pragma intrinsic(__mulh)
+#  define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {       \
+	__int64 __high = __mulh((a), (b)); \
+	__int64 __low  = (a) * (b); \
+	if ((__low >> 63I64) == __high) { \
+		(usedval) = 0; \
+		(lval) = __low; \
+	} else { \
+		(usedval) = 1; \
+		(dval) = (double)(a) * (double)(b); \
+	} \
+} while (0)
 # else
 #  define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {	\
 	zend_long   __lres  = (a) * (b);										\

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_object_handlers.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_object_handlers.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_object_handlers.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -20,6 +20,8 @@
 #ifndef ZEND_OBJECT_HANDLERS_H
 #define ZEND_OBJECT_HANDLERS_H
 
+#include <stdint.h>
+
 struct _zend_property_info;
 
 #define ZEND_WRONG_PROPERTY_INFO \
@@ -144,17 +146,17 @@
 /* Cast an object to some other type.
  * readobj and retval must point to distinct zvals.
  */
-typedef int (*zend_object_cast_t)(zend_object *readobj, zval *retval, int type);
+typedef zend_result (*zend_object_cast_t)(zend_object *readobj, zval *retval, int type);
 
 /* updates *count to hold the number of elements present and returns SUCCESS.
  * Returns FAILURE if the object does not have any sense of overloaded dimensions */
-typedef int (*zend_object_count_elements_t)(zend_object *object, zend_long *count);
+typedef zend_result (*zend_object_count_elements_t)(zend_object *object, zend_long *count);
 
-typedef int (*zend_object_get_closure_t)(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only);
+typedef zend_result (*zend_object_get_closure_t)(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only);
 
 typedef HashTable *(*zend_object_get_gc_t)(zend_object *object, zval **table, int *n);
 
-typedef int (*zend_object_do_operation_t)(zend_uchar opcode, zval *result, zval *op1, zval *op2);
+typedef zend_result (*zend_object_do_operation_t)(uint8_t opcode, zval *result, zval *op1, zval *op2);
 
 struct _zend_object_handlers {
 	/* offset of real object header (usually zero) */
@@ -205,11 +207,11 @@
 ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type);
 ZEND_API ZEND_COLD bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name);
 ZEND_API zend_function *zend_std_get_constructor(zend_object *object);
-ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_string *member, int silent);
+ZEND_API struct _zend_property_info *zend_get_property_info(const zend_class_entry *ce, zend_string *member, int silent);
 ZEND_API HashTable *zend_std_get_properties(zend_object *object);
 ZEND_API HashTable *zend_std_get_gc(zend_object *object, zval **table, int *n);
 ZEND_API HashTable *zend_std_get_debug_info(zend_object *object, int *is_temp);
-ZEND_API int zend_std_cast_object_tostring(zend_object *object, zval *writeobj, int type);
+ZEND_API zend_result zend_std_cast_object_tostring(zend_object *object, zval *writeobj, int type);
 ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *object, zend_string *member, int type, void **cache_slot);
 ZEND_API zval *zend_std_read_property(zend_object *object, zend_string *member, int type, void **cache_slot, zval *rv);
 ZEND_API zval *zend_std_write_property(zend_object *object, zend_string *member, zval *value, void **cache_slot);
@@ -222,7 +224,7 @@
 ZEND_API zend_function *zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key);
 ZEND_API zend_string *zend_std_get_class_name(const zend_object *zobj);
 ZEND_API int zend_std_compare_objects(zval *o1, zval *o2);
-ZEND_API int zend_std_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only);
+ZEND_API zend_result zend_std_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only);
 ZEND_API void rebuild_object_properties(zend_object *zobj);
 
 ZEND_API HashTable *zend_std_build_object_properties_array(zend_object *zobj);
@@ -231,14 +233,18 @@
  * Only objects with the same identity will be considered equal. */
 ZEND_API int zend_objects_not_comparable(zval *o1, zval *o2);
 
-ZEND_API int zend_check_protected(zend_class_entry *ce, zend_class_entry *scope);
+ZEND_API bool zend_check_protected(const zend_class_entry *ce, const zend_class_entry *scope);
 
-ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_info_name, bool is_dynamic);
+ZEND_API zend_result zend_check_property_access(const zend_object *zobj, zend_string *prop_info_name, bool is_dynamic);
 
-ZEND_API zend_function *zend_get_call_trampoline_func(zend_class_entry *ce, zend_string *method_name, int is_static);
+ZEND_API zend_function *zend_get_call_trampoline_func(const zend_class_entry *ce, zend_string *method_name, bool is_static);
 
 ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *member);
 
+ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *member);
+
+ZEND_API uint32_t *zend_get_recursion_guard(zend_object *zobj);
+
 /* Default behavior for get_properties_for. For use as a fallback in custom
  * get_properties_for implementations. */
 ZEND_API HashTable *zend_std_get_properties_for(zend_object *obj, zend_prop_purpose purpose);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_objects_API.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_objects_API.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_objects_API.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -25,14 +25,14 @@
 
 #define OBJ_BUCKET_INVALID			(1<<0)
 
-#define IS_OBJ_VALID(o)				(!(((zend_uintptr_t)(o)) & OBJ_BUCKET_INVALID))
+#define IS_OBJ_VALID(o)				(!(((uintptr_t)(o)) & OBJ_BUCKET_INVALID))
 
-#define SET_OBJ_INVALID(o)			((zend_object*)((((zend_uintptr_t)(o)) | OBJ_BUCKET_INVALID)))
+#define SET_OBJ_INVALID(o)			((zend_object*)((((uintptr_t)(o)) | OBJ_BUCKET_INVALID)))
 
-#define GET_OBJ_BUCKET_NUMBER(o)	(((zend_intptr_t)(o)) >> 1)
+#define GET_OBJ_BUCKET_NUMBER(o)	(((intptr_t)(o)) >> 1)
 
 #define SET_OBJ_BUCKET_NUMBER(o, n)	do { \
-		(o) = (zend_object*)((((zend_uintptr_t)(n)) << 1) | OBJ_BUCKET_INVALID); \
+		(o) = (zend_object*)((((uintptr_t)(n)) << 1) | OBJ_BUCKET_INVALID); \
 	} while (0)
 
 #define ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(h) do { \

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_observer.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_observer.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_observer.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -27,6 +27,9 @@
 BEGIN_EXTERN_C()
 
 extern ZEND_API int zend_observer_fcall_op_array_extension;
+extern ZEND_API bool zend_observer_errors_observed;
+extern ZEND_API bool zend_observer_function_declared_observed;
+extern ZEND_API bool zend_observer_class_linked_observed;
 
 #define ZEND_OBSERVER_ENABLED (zend_observer_fcall_op_array_extension != -1)
 
@@ -56,10 +59,16 @@
 // Call during minit/startup ONLY
 ZEND_API void zend_observer_fcall_register(zend_observer_fcall_init);
 
+// Call during runtime, but only if you have used zend_observer_fcall_register.
+// You must not have more than one begin and one end handler active at the same time. Remove the old one first, if there is an existing one.
+ZEND_API void zend_observer_add_begin_handler(zend_function *function, zend_observer_fcall_begin_handler begin);
+ZEND_API bool zend_observer_remove_begin_handler(zend_function *function, zend_observer_fcall_begin_handler begin);
+ZEND_API void zend_observer_add_end_handler(zend_function *function, zend_observer_fcall_end_handler end);
+ZEND_API bool zend_observer_remove_end_handler(zend_function *function, zend_observer_fcall_end_handler end);
+
 ZEND_API void zend_observer_startup(void); // Called by engine before MINITs
 ZEND_API void zend_observer_post_startup(void); // Called by engine after MINITs
 ZEND_API void zend_observer_activate(void);
-ZEND_API void zend_observer_deactivate(void);
 ZEND_API void zend_observer_shutdown(void);
 
 ZEND_API void ZEND_FASTCALL zend_observer_fcall_begin(
@@ -74,10 +83,35 @@
 
 ZEND_API void zend_observer_fcall_end_all(void);
 
+typedef void (*zend_observer_function_declared_cb)(zend_op_array *op_array, zend_string *name);
+
+ZEND_API void zend_observer_function_declared_register(zend_observer_function_declared_cb cb);
+ZEND_API void ZEND_FASTCALL _zend_observer_function_declared_notify(zend_op_array *op_array, zend_string *name);
+static inline void zend_observer_function_declared_notify(zend_op_array *op_array, zend_string *name) {
+    if (UNEXPECTED(zend_observer_function_declared_observed)) {
+		_zend_observer_function_declared_notify(op_array, name);
+	}
+}
+
+typedef void (*zend_observer_class_linked_cb)(zend_class_entry *ce, zend_string *name);
+
+ZEND_API void zend_observer_class_linked_register(zend_observer_class_linked_cb cb);
+ZEND_API void ZEND_FASTCALL _zend_observer_class_linked_notify(zend_class_entry *ce, zend_string *name);
+static inline void zend_observer_class_linked_notify(zend_class_entry *ce, zend_string *name) {
+	if (UNEXPECTED(zend_observer_class_linked_observed)) {
+		_zend_observer_class_linked_notify(ce, name);
+	}
+}
+
 typedef void (*zend_observer_error_cb)(int type, zend_string *error_filename, uint32_t error_lineno, zend_string *message);
 
 ZEND_API void zend_observer_error_register(zend_observer_error_cb callback);
-void zend_observer_error_notify(int type, zend_string *error_filename, uint32_t error_lineno, zend_string *message);
+ZEND_API void _zend_observer_error_notify(int type, zend_string *error_filename, uint32_t error_lineno, zend_string *message);
+static inline void zend_observer_error_notify(int type, zend_string *error_filename, uint32_t error_lineno, zend_string *message) {
+	if (UNEXPECTED(zend_observer_errors_observed)) {
+		_zend_observer_error_notify(type, error_filename, error_lineno, message);
+	}
+}
 
 typedef void (*zend_observer_fiber_init_handler)(zend_fiber_context *initializing);
 typedef void (*zend_observer_fiber_switch_handler)(zend_fiber_context *from, zend_fiber_context *to);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_operators.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_operators.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_operators.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -25,9 +25,23 @@
 #include <math.h>
 #include <assert.h>
 #include <stddef.h>
+#include <stdint.h>
 
 #ifdef HAVE_IEEEFP_H
-#include <ieeefp.h>
+/**
+ * On FreeBSD with ubsan/clang we get the following:
+ * `/usr/include/machine/ieeefp.h:161:17: runtime error: left shift of negative value -1`
+ * `SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/include/machine/ieeefp.h:161:17`
+ * ...
+ * `_newcw |= (~_m << FP_MSKS_OFF) & FP_MSKS_FLD;`
+**/
+# if __has_feature(undefined_behavior_sanitizer) && defined(__FreeBSD__) && defined(__clang__)
+#  pragma clang attribute push (__attribute__((no_sanitize("undefined"))), apply_to=function)
+# endif
+# include <ieeefp.h>
+# if __has_feature(undefined_behavior_sanitizer) && defined(__FreeBSD__) && defined(__clang__)
+#  pragma clang attribute pop
+# endif
 #endif
 
 #include "zend_portability.h"
@@ -54,7 +68,7 @@
 ZEND_API zend_result ZEND_FASTCALL shift_right_function(zval *result, zval *op1, zval *op2);
 ZEND_API zend_result ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2);
 
-ZEND_API bool ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2);
+ZEND_API bool ZEND_FASTCALL zend_is_identical(const zval *op1, const zval *op2);
 
 ZEND_API zend_result ZEND_FASTCALL is_equal_function(zval *result, zval *op1, zval *op2);
 ZEND_API zend_result ZEND_FASTCALL is_identical_function(zval *result, zval *op1, zval *op2);
@@ -71,6 +85,8 @@
 	return instance_ce == ce || instanceof_function_slow(instance_ce, ce);
 }
 
+ZEND_API bool zend_string_only_has_ascii_alphanumeric(const zend_string *str);
+
 /**
  * Checks whether the string "str" with length "length" is numeric. The value
  * of allow_errors determines whether it's required to be entirely numeric, or
@@ -86,7 +102,7 @@
  * could not be represented as such due to overflow. It writes 1 to oflow_info
  * if the integer is larger than ZEND_LONG_MAX and -1 if it's smaller than ZEND_LONG_MIN.
  */
-ZEND_API zend_uchar ZEND_FASTCALL _is_numeric_string_ex(const char *str, size_t length, zend_long *lval,
+ZEND_API uint8_t ZEND_FASTCALL _is_numeric_string_ex(const char *str, size_t length, zend_long *lval,
 	double *dval, bool allow_errors, int *oflow_info, bool *trailing_data);
 
 ZEND_API const char* ZEND_FASTCALL zend_memnstr_ex(const char *haystack, const char *needle, size_t needle_len, const char *end);
@@ -142,7 +158,7 @@
 #define ZEND_IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
 #define ZEND_IS_XDIGIT(c) (((c) >= 'A' && (c) <= 'F') || ((c) >= 'a' && (c) <= 'f'))
 
-static zend_always_inline zend_uchar is_numeric_string_ex(const char *str, size_t length, zend_long *lval,
+static zend_always_inline uint8_t is_numeric_string_ex(const char *str, size_t length, zend_long *lval,
 	double *dval, bool allow_errors, int *oflow_info, bool *trailing_data)
 {
 	if (*str > '9') {
@@ -151,29 +167,27 @@
 	return _is_numeric_string_ex(str, length, lval, dval, allow_errors, oflow_info, trailing_data);
 }
 
-static zend_always_inline zend_uchar is_numeric_string(const char *str, size_t length, zend_long *lval, double *dval, bool allow_errors) {
+static zend_always_inline uint8_t is_numeric_string(const char *str, size_t length, zend_long *lval, double *dval, bool allow_errors) {
     return is_numeric_string_ex(str, length, lval, dval, allow_errors, NULL, NULL);
 }
 
-ZEND_API zend_uchar ZEND_FASTCALL is_numeric_str_function(const zend_string *str, zend_long *lval, double *dval);
+ZEND_API uint8_t ZEND_FASTCALL is_numeric_str_function(const zend_string *str, zend_long *lval, double *dval);
 
 static zend_always_inline const char *
 zend_memnstr(const char *haystack, const char *needle, size_t needle_len, const char *end)
 {
 	const char *p = haystack;
-	ptrdiff_t off_p;
 	size_t off_s;
 
-	if (needle_len == 0) {
-		return p;
-	}
+	ZEND_ASSERT(end >= p);
 
 	if (needle_len == 1) {
 		return (const char *)memchr(p, *needle, (end-p));
+	} else if (UNEXPECTED(needle_len == 0)) {
+		return p;
 	}
 
-	off_p = end - haystack;
-	off_s = (off_p > 0) ? (size_t)off_p : 0;
+	off_s = (size_t)(end - p);
 
 	if (needle_len > off_s) {
 		return NULL;
@@ -184,16 +198,13 @@
 		end -= needle_len;
 
 		while (p <= end) {
-			if ((p = (const char *)memchr(p, *needle, (end-p+1))) && ne == p[needle_len-1]) {
-				if (!memcmp(needle+1, p+1, needle_len-2)) {
+			if ((p = (const char *)memchr(p, *needle, (end-p+1)))) {
+				if (ne == p[needle_len-1] && !memcmp(needle+1, p+1, needle_len-2)) {
 					return p;
 				}
-			}
-
-			if (p == NULL) {
+			} else {
 				return NULL;
 			}
-
 			p++;
 		}
 
@@ -205,6 +216,10 @@
 
 static zend_always_inline const void *zend_memrchr(const void *s, int c, size_t n)
 {
+#if defined(HAVE_MEMRCHR) && !defined(i386)
+	/* On x86 memrchr() doesn't use SSE/AVX, so inlined version is faster */
+	return (const void*)memrchr(s, c, n);
+#else
 	const unsigned char *e;
 	if (0 == n) {
 		return NULL;
@@ -216,6 +231,7 @@
 		}
 	}
 	return NULL;
+#endif
 }
 
 
@@ -261,6 +277,16 @@
 	}
 }
 
+static zend_always_inline size_t zend_strnlen(const char* s, size_t maxlen)
+{
+#if defined(HAVE_STRNLEN)
+	return strnlen(s, maxlen);
+#else
+	const char *p = (const char *)memchr(s, '\0', maxlen);
+	return p ? p-s : maxlen;
+#endif
+}
+
 ZEND_API zend_result ZEND_FASTCALL increment_function(zval *op1);
 ZEND_API zend_result ZEND_FASTCALL decrement_function(zval *op2);
 
@@ -273,18 +299,19 @@
 ZEND_API void ZEND_FASTCALL convert_to_array(zval *op);
 ZEND_API void ZEND_FASTCALL convert_to_object(zval *op);
 
-ZEND_API zend_long    ZEND_FASTCALL zval_get_long_func(zval *op, bool is_strict);
-ZEND_API double       ZEND_FASTCALL zval_get_double_func(zval *op);
+ZEND_API zend_long    ZEND_FASTCALL zval_get_long_func(const zval *op, bool is_strict);
+ZEND_API zend_long    ZEND_FASTCALL zval_try_get_long(const zval *op, bool *failed);
+ZEND_API double       ZEND_FASTCALL zval_get_double_func(const zval *op);
 ZEND_API zend_string* ZEND_FASTCALL zval_get_string_func(zval *op);
 ZEND_API zend_string* ZEND_FASTCALL zval_try_get_string_func(zval *op);
 
-static zend_always_inline zend_long zval_get_long(zval *op) {
+static zend_always_inline zend_long zval_get_long(const zval *op) {
 	return EXPECTED(Z_TYPE_P(op) == IS_LONG) ? Z_LVAL_P(op) : zval_get_long_func(op, false);
 }
-static zend_always_inline zend_long zval_get_long_ex(zval *op, bool is_strict) {
+static zend_always_inline zend_long zval_get_long_ex(const zval *op, bool is_strict) {
 	return EXPECTED(Z_TYPE_P(op) == IS_LONG) ? Z_LVAL_P(op) : zval_get_long_func(op, is_strict);
 }
-static zend_always_inline double zval_get_double(zval *op) {
+static zend_always_inline double zval_get_double(const zval *op) {
 	return EXPECTED(Z_TYPE_P(op) == IS_DOUBLE) ? Z_DVAL_P(op) : zval_get_double_func(op);
 }
 static zend_always_inline zend_string *zval_get_string(zval *op) {
@@ -349,13 +376,13 @@
 #define convert_to_string(op) if (Z_TYPE_P(op) != IS_STRING) { _convert_to_string((op)); }
 
 
-ZEND_API int ZEND_FASTCALL zend_is_true(zval *op);
-ZEND_API bool ZEND_FASTCALL zend_object_is_true(zval *op);
+ZEND_API int ZEND_FASTCALL zend_is_true(const zval *op);
+ZEND_API bool ZEND_FASTCALL zend_object_is_true(const zval *op);
 
 #define zval_is_true(op) \
 	zend_is_true(op)
 
-static zend_always_inline bool i_zend_is_true(zval *op)
+static zend_always_inline bool i_zend_is_true(const zval *op)
 {
 	bool result = 0;
 
@@ -422,18 +449,32 @@
 ZEND_API int ZEND_FASTCALL string_case_compare_function(zval *op1, zval *op2);
 ZEND_API int ZEND_FASTCALL string_locale_compare_function(zval *op1, zval *op2);
 
+ZEND_API extern const unsigned char zend_tolower_map[256];
+ZEND_API extern const unsigned char zend_toupper_map[256];
+
+#define zend_tolower_ascii(c) (zend_tolower_map[(unsigned char)(c)])
+#define zend_toupper_ascii(c) (zend_toupper_map[(unsigned char)(c)])
+
 ZEND_API void         ZEND_FASTCALL zend_str_tolower(char *str, size_t length);
+ZEND_API void         ZEND_FASTCALL zend_str_toupper(char *str, size_t length);
 ZEND_API char*        ZEND_FASTCALL zend_str_tolower_copy(char *dest, const char *source, size_t length);
+ZEND_API char*        ZEND_FASTCALL zend_str_toupper_copy(char *dest, const char *source, size_t length);
 ZEND_API char*        ZEND_FASTCALL zend_str_tolower_dup(const char *source, size_t length);
+ZEND_API char*        ZEND_FASTCALL zend_str_toupper_dup(const char *source, size_t length);
 ZEND_API char*        ZEND_FASTCALL zend_str_tolower_dup_ex(const char *source, size_t length);
+ZEND_API char*        ZEND_FASTCALL zend_str_toupper_dup_ex(const char *source, size_t length);
 ZEND_API zend_string* ZEND_FASTCALL zend_string_tolower_ex(zend_string *str, bool persistent);
+ZEND_API zend_string* ZEND_FASTCALL zend_string_toupper_ex(zend_string *str, bool persistent);
 
-#define zend_string_tolower(str) zend_string_tolower_ex(str, 0)
+static zend_always_inline zend_string* zend_string_tolower(zend_string *str) {
+	return zend_string_tolower_ex(str, false);
+}
+static zend_always_inline zend_string* zend_string_toupper(zend_string *str) {
+	return zend_string_toupper_ex(str, false);
+}
 
 ZEND_API int ZEND_FASTCALL zend_binary_zval_strcmp(zval *s1, zval *s2);
 ZEND_API int ZEND_FASTCALL zend_binary_zval_strncmp(zval *s1, zval *s2, zval *s3);
-ZEND_API int ZEND_FASTCALL zend_binary_zval_strcasecmp(zval *s1, zval *s2);
-ZEND_API int ZEND_FASTCALL zend_binary_zval_strncasecmp(zval *s1, zval *s2, zval *s3);
 ZEND_API int ZEND_FASTCALL zend_binary_strcmp(const char *s1, size_t len1, const char *s2, size_t len2);
 ZEND_API int ZEND_FASTCALL zend_binary_strncmp(const char *s1, size_t len1, const char *s2, size_t len2, size_t length);
 ZEND_API int ZEND_FASTCALL zend_binary_strcasecmp(const char *s1, size_t len1, const char *s2, size_t len2);
@@ -447,9 +488,12 @@
 ZEND_API int ZEND_FASTCALL zend_compare_arrays(zval *a1, zval *a2);
 ZEND_API int ZEND_FASTCALL zend_compare_objects(zval *o1, zval *o2);
 
-ZEND_API int ZEND_FASTCALL zend_atoi(const char *str, size_t str_len);
-ZEND_API zend_long ZEND_FASTCALL zend_atol(const char *str, size_t str_len);
+/** Deprecatd in favor of ZEND_STRTOL() */
+ZEND_ATTRIBUTE_DEPRECATED ZEND_API int ZEND_FASTCALL zend_atoi(const char *str, size_t str_len);
 
+/** Deprecatd in favor of ZEND_STRTOL() */
+ZEND_ATTRIBUTE_DEPRECATED ZEND_API zend_long ZEND_FASTCALL zend_atol(const char *str, size_t str_len);
+
 #define convert_to_null_ex(zv) convert_to_null(zv)
 #define convert_to_boolean_ex(zv) convert_to_boolean(zv)
 #define convert_to_long_ex(zv) convert_to_long(zv)
@@ -678,37 +722,17 @@
 	 * have read the values of op1 and op2.
 	 */
 
+	zend_long sum = (zend_long) ((zend_ulong) Z_LVAL_P(op1) + (zend_ulong) Z_LVAL_P(op2));
+
 	if (UNEXPECTED((Z_LVAL_P(op1) & LONG_SIGN_MASK) == (Z_LVAL_P(op2) & LONG_SIGN_MASK)
-		&& (Z_LVAL_P(op1) & LONG_SIGN_MASK) != ((Z_LVAL_P(op1) + Z_LVAL_P(op2)) & LONG_SIGN_MASK))) {
+		&& (Z_LVAL_P(op1) & LONG_SIGN_MASK) != (sum & LONG_SIGN_MASK))) {
 		ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2));
 	} else {
-		ZVAL_LONG(result, Z_LVAL_P(op1) + Z_LVAL_P(op2));
+		ZVAL_LONG(result, sum);
 	}
 #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__)
@@ -782,11 +806,19 @@
 		ZVAL_LONG(result, llresult);
 	}
 #else
-	ZVAL_LONG(result, Z_LVAL_P(op1) - Z_LVAL_P(op2));
+	/*
+	 * 'result' may alias with op1 or op2, so we need to
+	 * ensure that 'result' is not updated until after we
+	 * have read the values of op1 and op2.
+	 */
 
+	zend_long sub = (zend_long) ((zend_ulong) Z_LVAL_P(op1) - (zend_ulong) Z_LVAL_P(op2));
+
 	if (UNEXPECTED((Z_LVAL_P(op1) & LONG_SIGN_MASK) != (Z_LVAL_P(op2) & LONG_SIGN_MASK)
-		&& (Z_LVAL_P(op1) & LONG_SIGN_MASK) != (Z_LVAL_P(result) & LONG_SIGN_MASK))) {
+		&& (Z_LVAL_P(op1) & LONG_SIGN_MASK) != (sub & LONG_SIGN_MASK))) {
 		ZVAL_DOUBLE(result, (double) Z_LVAL_P(op1) - (double) Z_LVAL_P(op2));
+	} else {
+		ZVAL_LONG(result, sub);
 	}
 #endif
 }
@@ -898,7 +930,68 @@
 }
 /* }}} */
 
+static zend_always_inline bool zend_strnieq(const char *ptr1, const char *ptr2, size_t num)
+{
+	const char *end = ptr1 + num;
+	while (ptr1 < end) {
+		if (zend_tolower_ascii(*ptr1++) != zend_tolower_ascii(*ptr2++)) {
+			return 0;
+		}
+	}
+	return 1;
+}
 
+static zend_always_inline const char *
+zend_memnistr(const char *haystack, const char *needle, size_t needle_len, const char *end)
+{
+	ZEND_ASSERT(end >= haystack);
+
+	if (UNEXPECTED(needle_len == 0)) {
+		return haystack;
+	}
+
+	if (UNEXPECTED(needle_len > (size_t)(end - haystack))) {
+		return NULL;
+	}
+
+	const char first_lower = zend_tolower_ascii(*needle);
+	const char first_upper = zend_toupper_ascii(*needle);
+	const char *p_lower = (const char *)memchr(haystack, first_lower, end - haystack);
+	const char *p_upper = NULL;
+	if (first_lower != first_upper) {
+		// If the needle length is 1 we don't need to look beyond p_lower as it is a guaranteed match
+		size_t upper_search_length = needle_len == 1 && p_lower != NULL ? p_lower - haystack : end - haystack;
+		p_upper = (const char *)memchr(haystack, first_upper, upper_search_length);
+	}
+	const char *p = !p_upper || (p_lower && p_lower < p_upper) ? p_lower : p_upper;
+
+	if (needle_len == 1) {
+		return p;
+	}
+
+	const char needle_end_lower = zend_tolower_ascii(needle[needle_len - 1]);
+	const char needle_end_upper = zend_toupper_ascii(needle[needle_len - 1]);
+	end -= needle_len;
+
+	while (p && p <= end) {
+		if (needle_end_lower == p[needle_len - 1] || needle_end_upper == p[needle_len - 1]) {
+			if (zend_strnieq(needle + 1, p + 1, needle_len - 2)) {
+				return p;
+			}
+		}
+		if (p_lower == p) {
+			p_lower = (const char *)memchr(p_lower + 1, first_lower, end - p_lower);
+		}
+		if (p_upper == p) {
+			p_upper = (const char *)memchr(p_upper + 1, first_upper, end - p_upper);
+		}
+		p = !p_upper || (p_lower && p_lower < p_upper) ? p_lower : p_upper;
+	}
+
+	return NULL;
+}
+
+
 END_EXTERN_C()
 
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_portability.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_portability.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_portability.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -63,10 +63,6 @@
 
 #include <limits.h>
 
-#if HAVE_ALLOCA_H && !defined(_ALLOCA_H)
-# include <alloca.h>
-#endif
-
 #if defined(ZEND_WIN32) && !defined(__clang__)
 #include <intrin.h>
 #endif
@@ -93,6 +89,9 @@
 
 #if defined(ZEND_WIN32) && !defined(__clang__)
 # define ZEND_ASSUME(c)	__assume(c)
+#elif defined(__clang__) && __has_builtin(__builtin_assume)
+# pragma clang diagnostic ignored "-Wassume"
+# define ZEND_ASSUME(c)	__builtin_assume(c)
 #elif ((defined(__GNUC__) && ZEND_GCC_VERSION >= 4005) || __has_builtin(__builtin_unreachable)) && PHP_HAVE_BUILTIN_EXPECT
 # define ZEND_ASSUME(c)	do { \
 		if (__builtin_expect(!(c), 0)) __builtin_unreachable(); \
@@ -136,7 +135,7 @@
 
 #if defined(HAVE_LIBDL) && !defined(ZEND_WIN32)
 
-# if __has_feature(address_sanitizer)
+# if __has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__)
 #  define __SANITIZE_ADDRESS__
 # endif
 
@@ -181,6 +180,9 @@
 # define ZEND_EXTENSIONS_SUPPORT	0
 #endif
 
+#if defined(HAVE_ALLOCA_H) && !defined(_ALLOCA_H)
+# include <alloca.h>
+#endif
 /* AIX requires this to be the first thing in the file.  */
 #ifndef __GNUC__
 # ifndef HAVE_ALLOCA_H
@@ -194,8 +196,29 @@
 # endif
 #endif
 
+#if !ZEND_DEBUG && (defined(HAVE_ALLOCA) || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && defined(HPUX)) && !defined(DARWIN)
+# define ZEND_ALLOCA_MAX_SIZE (32 * 1024)
+# define ALLOCA_FLAG(name) \
+	bool name;
+# define SET_ALLOCA_FLAG(name) \
+	name = true
+# define do_alloca_ex(size, limit, use_heap) \
+	((use_heap = (UNEXPECTED((size) > (limit)))) ? emalloc(size) : alloca(size))
+# define do_alloca(size, use_heap) \
+	do_alloca_ex(size, ZEND_ALLOCA_MAX_SIZE, use_heap)
+# define free_alloca(p, use_heap) \
+	do { if (UNEXPECTED(use_heap)) efree(p); } while (0)
+#else
+# define ALLOCA_FLAG(name)
+# define SET_ALLOCA_FLAG(name)
+# define do_alloca(p, use_heap)		emalloc(p)
+# define free_alloca(p, use_heap)	efree(p)
+#endif
+
 #if ZEND_GCC_VERSION >= 2096 || __has_attribute(__malloc__)
 # define ZEND_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+#elif defined(ZEND_WIN32)
+# define ZEND_ATTRIBUTE_MALLOC __declspec(allocator) __declspec(restrict)
 #else
 # define ZEND_ATTRIBUTE_MALLOC
 #endif
@@ -208,6 +231,12 @@
 # define ZEND_ATTRIBUTE_ALLOC_SIZE2(X,Y)
 #endif
 
+#if ZEND_GCC_VERSION >= 3000
+# define ZEND_ATTRIBUTE_CONST __attribute__((const))
+#else
+# define ZEND_ATTRIBUTE_CONST
+#endif
+
 #if ZEND_GCC_VERSION >= 2007 || __has_attribute(format)
 # define ZEND_ATTRIBUTE_FORMAT(type, idx, first) __attribute__ ((format(type, idx, first)))
 #else
@@ -236,7 +265,6 @@
 
 #if defined(__GNUC__) && ZEND_GCC_VERSION >= 4003
 # define ZEND_COLD __attribute__((cold))
-# define ZEND_HOT __attribute__((hot))
 # ifdef __OPTIMIZE__
 #  define ZEND_OPT_SIZE  __attribute__((optimize("Os")))
 #  define ZEND_OPT_SPEED __attribute__((optimize("Ofast")))
@@ -246,7 +274,6 @@
 # endif
 #else
 # define ZEND_COLD
-# define ZEND_HOT
 # define ZEND_OPT_SIZE
 # define ZEND_OPT_SPEED
 #endif
@@ -254,11 +281,9 @@
 #if defined(__GNUC__) && ZEND_GCC_VERSION >= 5000
 # define ZEND_ATTRIBUTE_UNUSED_LABEL __attribute__((unused));
 # define ZEND_ATTRIBUTE_COLD_LABEL __attribute__((cold));
-# define ZEND_ATTRIBUTE_HOT_LABEL __attribute__((hot));
 #else
 # define ZEND_ATTRIBUTE_UNUSED_LABEL
 # define ZEND_ATTRIBUTE_COLD_LABEL
-# define ZEND_ATTRIBUTE_HOT_LABEL
 #endif
 
 #if defined(__GNUC__) && ZEND_GCC_VERSION >= 3004 && defined(__i386__)
@@ -345,25 +370,6 @@
 # define XtOffsetOf(s_type, field) offsetof(s_type, field)
 #endif
 
-#if (defined(HAVE_ALLOCA) || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && defined(HPUX)) && !defined(DARWIN)
-# define ZEND_ALLOCA_MAX_SIZE (32 * 1024)
-# define ALLOCA_FLAG(name) \
-	bool name;
-# define SET_ALLOCA_FLAG(name) \
-	name = 1
-# define do_alloca_ex(size, limit, use_heap) \
-	((use_heap = (UNEXPECTED((size) > (limit)))) ? emalloc(size) : alloca(size))
-# define do_alloca(size, use_heap) \
-	do_alloca_ex(size, ZEND_ALLOCA_MAX_SIZE, use_heap)
-# define free_alloca(p, use_heap) \
-	do { if (UNEXPECTED(use_heap)) efree(p); } while (0)
-#else
-# define ALLOCA_FLAG(name)
-# define SET_ALLOCA_FLAG(name)
-# define do_alloca(p, use_heap)		emalloc(p)
-# define free_alloca(p, use_heap)	efree(p)
-#endif
-
 #ifdef HAVE_SIGSETJMP
 # define SETJMP(a) sigsetjmp(a, 0)
 # define LONGJMP(a,b) siglongjmp(a, b)
@@ -457,6 +463,12 @@
 #define ZEND_TRUTH(x)		((x) ? 1 : 0)
 #define ZEND_LOG_XOR(a, b)		(ZEND_TRUTH(a) ^ ZEND_TRUTH(b))
 
+/**
+ * Do a three-way comparison of two integers and returns -1, 0 or 1
+ * depending on whether #a is smaller, equal or larger than #b.
+ */
+#define ZEND_THREEWAY_COMPARE(a, b) ((a) == (b) ? 0 : ((a) < (b) ? -1 : 1))
+
 #define ZEND_MAX_RESERVED_RESOURCES	6
 
 /* excpt.h on Digital Unix 4.0 defines function_table */
@@ -517,7 +529,7 @@
 #ifdef __SSSE3__
 /* Instructions compiled directly. */
 # define ZEND_INTRIN_SSSE3_NATIVE 1
-#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_SSSE3)) || defined(ZEND_WIN32)
+#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_SSSE3)) || (defined(ZEND_WIN32) && (!defined(_M_ARM64)))
 /* Function resolved by ifunc or MINIT. */
 # define ZEND_INTRIN_SSSE3_RESOLVER 1
 #endif
@@ -542,7 +554,7 @@
 #ifdef __SSE4_2__
 /* Instructions compiled directly. */
 # define ZEND_INTRIN_SSE4_2_NATIVE 1
-#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_SSE4_2)) || defined(ZEND_WIN32)
+#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_SSE4_2)) || (defined(ZEND_WIN32) && (!defined(_M_ARM64)))
 /* Function resolved by ifunc or MINIT. */
 # define ZEND_INTRIN_SSE4_2_RESOLVER 1
 #endif
@@ -567,7 +579,7 @@
 #ifdef __PCLMUL__
 /* Instructions compiled directly. */
 # define ZEND_INTRIN_PCLMUL_NATIVE 1
-#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_PCLMUL)) || defined(ZEND_WIN32)
+#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_PCLMUL)) || (defined(ZEND_WIN32) && (!defined(_M_ARM64)))
 /* Function resolved by ifunc or MINIT. */
 # define ZEND_INTRIN_PCLMUL_RESOLVER 1
 #endif
@@ -593,7 +605,7 @@
 #if defined(ZEND_INTRIN_SSE4_2_NATIVE) && defined(ZEND_INTRIN_PCLMUL_NATIVE)
 /* Instructions compiled directly. */
 # define ZEND_INTRIN_SSE4_2_PCLMUL_NATIVE 1
-#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_SSE4_2) && defined(PHP_HAVE_PCLMUL)) || defined(ZEND_WIN32)
+#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_SSE4_2) && defined(PHP_HAVE_PCLMUL)) || (defined(ZEND_WIN32) && (!defined(_M_ARM64)))
 /* Function resolved by ifunc or MINIT. */
 # define ZEND_INTRIN_SSE4_2_PCLMUL_RESOLVER 1
 #endif
@@ -618,7 +630,7 @@
 
 #ifdef __AVX2__
 # define ZEND_INTRIN_AVX2_NATIVE 1
-#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_AVX2)) || defined(ZEND_WIN32)
+#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_AVX2)) || (defined(ZEND_WIN32) && (!defined(_M_ARM64)))
 # define ZEND_INTRIN_AVX2_RESOLVER 1
 #endif
 
@@ -639,6 +651,46 @@
 # define ZEND_INTRIN_AVX2_FUNC_DECL(func)
 #endif
 
+#if PHP_HAVE_AVX512_SUPPORTS && defined(HAVE_FUNC_ATTRIBUTE_TARGET) || defined(ZEND_WIN32)
+#define ZEND_INTRIN_AVX512_RESOLVER 1
+#endif
+
+#if defined(ZEND_INTRIN_AVX512_RESOLVER) && defined(ZEND_INTRIN_HAVE_IFUNC_TARGET)
+# define ZEND_INTRIN_AVX512_FUNC_PROTO 1
+#elif defined(ZEND_INTRIN_AVX512_RESOLVER)
+# define ZEND_INTRIN_AVX512_FUNC_PTR 1
+#endif
+
+#ifdef ZEND_INTRIN_AVX512_RESOLVER
+# ifdef HAVE_FUNC_ATTRIBUTE_TARGET
+#  define ZEND_INTRIN_AVX512_FUNC_DECL(func) ZEND_API func __attribute__((target("avx512f,avx512cd,avx512vl,avx512dq,avx512bw")))
+# else
+#  define ZEND_INTRIN_AVX512_FUNC_DECL(func) func
+# endif
+#else
+# define ZEND_INTRIN_AVX512_FUNC_DECL(func)
+#endif
+
+#if PHP_HAVE_AVX512_VBMI_SUPPORTS && defined(HAVE_FUNC_ATTRIBUTE_TARGET)
+#define ZEND_INTRIN_AVX512_VBMI_RESOLVER 1
+#endif
+
+#if defined(ZEND_INTRIN_AVX512_VBMI_RESOLVER) && defined(ZEND_INTRIN_HAVE_IFUNC_TARGET)
+# define ZEND_INTRIN_AVX512_VBMI_FUNC_PROTO 1
+#elif defined(ZEND_INTRIN_AVX512_VBMI_RESOLVER)
+# define ZEND_INTRIN_AVX512_VBMI_FUNC_PTR 1
+#endif
+
+#ifdef ZEND_INTRIN_AVX512_VBMI_RESOLVER
+# ifdef HAVE_FUNC_ATTRIBUTE_TARGET
+#  define ZEND_INTRIN_AVX512_VBMI_FUNC_DECL(func) ZEND_API func __attribute__((target("avx512f,avx512cd,avx512vl,avx512dq,avx512bw,avx512vbmi")))
+# else
+#  define ZEND_INTRIN_AVX512_VBMI_FUNC_DECL(func) func
+# endif
+#else
+# define ZEND_INTRIN_AVX512_VBMI_FUNC_DECL(func)
+#endif
+
 /* Intrinsics macros end. */
 
 #ifdef ZEND_WIN32
@@ -649,7 +701,7 @@
 # define ZEND_SET_ALIGNED(alignment, decl) decl
 #endif
 
-#define ZEND_SLIDE_TO_ALIGNED(alignment, ptr) (((zend_uintptr_t)(ptr) + ((alignment)-1)) & ~((alignment)-1))
+#define ZEND_SLIDE_TO_ALIGNED(alignment, ptr) (((uintptr_t)(ptr) + ((alignment)-1)) & ~((alignment)-1))
 #define ZEND_SLIDE_TO_ALIGNED16(ptr) ZEND_SLIDE_TO_ALIGNED(Z_UL(16), ptr)
 
 #ifdef ZEND_WIN32
@@ -685,4 +737,34 @@
 # define ZEND_INDIRECT_RETURN
 #endif
 
+#define __ZEND_DO_PRAGMA(x) _Pragma(#x)
+#define _ZEND_DO_PRAGMA(x) __ZEND_DO_PRAGMA(x)
+#if defined(__clang__)
+# define ZEND_DIAGNOSTIC_IGNORED_START(warning) \
+	_Pragma("clang diagnostic push") \
+	_ZEND_DO_PRAGMA(clang diagnostic ignored warning)
+# define ZEND_DIAGNOSTIC_IGNORED_END \
+	_Pragma("clang diagnostic pop")
+#elif defined(__GNUC__)
+# define ZEND_DIAGNOSTIC_IGNORED_START(warning) \
+	_Pragma("GCC diagnostic push") \
+	_ZEND_DO_PRAGMA(GCC diagnostic ignored warning)
+# define ZEND_DIAGNOSTIC_IGNORED_END \
+	_Pragma("GCC diagnostic pop")
+#else
+# define ZEND_DIAGNOSTIC_IGNORED_START(warning)
+# define ZEND_DIAGNOSTIC_IGNORED_END
+#endif
+
+/** @deprecated */
+#define ZEND_CGG_DIAGNOSTIC_IGNORED_START ZEND_DIAGNOSTIC_IGNORED_START
+/** @deprecated */
+#define ZEND_CGG_DIAGNOSTIC_IGNORED_END ZEND_DIAGNOSTIC_IGNORED_END
+
+#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */
+# define ZEND_STATIC_ASSERT(c, m) _Static_assert((c), m)
+#else
+# define ZEND_STATIC_ASSERT(c, m)
+#endif
+
 #endif /* ZEND_PORTABILITY_H */

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_ptr_stack.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_ptr_stack.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_ptr_stack.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -48,7 +48,7 @@
 		do {												\
 			stack->max += PTR_STACK_BLOCK_SIZE;				\
 		} while (stack->top+count > stack->max);			\
-		stack->elements = (void **) perealloc(stack->elements, (sizeof(void *) * (stack->max)), stack->persistent);	\
+		stack->elements = (void **) safe_perealloc(stack->elements, sizeof(void *), (stack->max), 0, stack->persistent);	\
 		stack->top_element = stack->elements+stack->top;	\
 	}
 

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_smart_str.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_smart_str.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_smart_str.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -21,29 +21,6 @@
 #include "zend_globals.h"
 #include "zend_smart_str_public.h"
 
-#define smart_str_appends_ex(dest, src, what) \
-	smart_str_appendl_ex((dest), (src), strlen(src), (what))
-#define smart_str_appends(dest, src) \
-	smart_str_appendl((dest), (src), strlen(src))
-#define smart_str_extend(dest, len) \
-	smart_str_extend_ex((dest), (len), 0)
-#define smart_str_appendc(dest, c) \
-	smart_str_appendc_ex((dest), (c), 0)
-#define smart_str_appendl(dest, src, len) \
-	smart_str_appendl_ex((dest), (src), (len), 0)
-#define smart_str_append(dest, src) \
-	smart_str_append_ex((dest), (src), 0)
-#define smart_str_append_smart_str(dest, src) \
-	smart_str_append_smart_str_ex((dest), (src), 0)
-#define smart_str_sets(dest, src) \
-	smart_str_setl((dest), (src), strlen(src));
-#define smart_str_append_long(dest, val) \
-	smart_str_append_long_ex((dest), (val), 0)
-#define smart_str_append_unsigned(dest, val) \
-	smart_str_append_unsigned_ex((dest), (val), 0)
-#define smart_str_free(dest) \
-	smart_str_free_ex((dest), 0)
-
 BEGIN_EXTERN_C()
 
 ZEND_API void ZEND_FASTCALL smart_str_erealloc(smart_str *str, size_t len);
@@ -55,8 +32,8 @@
 		smart_str *str, double num, int precision, bool zero_fraction);
 ZEND_API void smart_str_append_printf(smart_str *dest, const char *format, ...)
 	ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
-ZEND_API void ZEND_FASTCALL smart_str_append_escaped_truncated(smart_str *str, zend_string *value, size_t length);
-ZEND_API void ZEND_FASTCALL smart_str_append_scalar(smart_str *str, zval *value, size_t truncate);
+ZEND_API void ZEND_FASTCALL smart_str_append_escaped_truncated(smart_str *str, const zend_string *value, size_t length);
+ZEND_API void ZEND_FASTCALL smart_str_append_scalar(smart_str *str, const zval *value, size_t truncate);
 END_EXTERN_C()
 
 static zend_always_inline size_t smart_str_alloc(smart_str *str, size_t len, bool persistent) {
@@ -83,6 +60,11 @@
 	return ret;
 }
 
+static zend_always_inline char* smart_str_extend(smart_str *dest, size_t length)
+{
+	return smart_str_extend_ex(dest, length, false);
+}
+
 static zend_always_inline void smart_str_free_ex(smart_str *str, bool persistent) {
 	if (str->s) {
 		zend_string_release_ex(str->s, persistent);
@@ -91,6 +73,11 @@
 	str->a = 0;
 }
 
+static zend_always_inline void smart_str_free(smart_str *str)
+{
+	smart_str_free_ex(str, false);
+}
+
 static zend_always_inline void smart_str_0(smart_str *str) {
 	if (str->s) {
 		ZSTR_VAL(str->s)[ZSTR_LEN(str->s)] = '\0';
@@ -101,10 +88,24 @@
 	return str->s ? ZSTR_LEN(str->s) : 0;
 }
 
-static zend_always_inline zend_string *smart_str_extract(smart_str *str) {
+static zend_always_inline void smart_str_trim_to_size_ex(smart_str *str, bool persistent)
+{
+	if (str->s && str->a > ZSTR_LEN(str->s)) {
+		str->s = zend_string_realloc(str->s, ZSTR_LEN(str->s), persistent);
+		str->a = ZSTR_LEN(str->s);
+	}
+}
+
+static zend_always_inline void smart_str_trim_to_size(smart_str *dest)
+{
+	smart_str_trim_to_size_ex(dest, false);
+}
+
+static zend_always_inline zend_string *smart_str_extract_ex(smart_str *str, bool persistent) {
 	if (str->s) {
 		zend_string *res;
 		smart_str_0(str);
+		smart_str_trim_to_size_ex(str, persistent);
 		res = str->s;
 		str->s = NULL;
 		return res;
@@ -113,6 +114,11 @@
 	}
 }
 
+static zend_always_inline zend_string *smart_str_extract(smart_str *dest)
+{
+	return smart_str_extract_ex(dest, false);
+}
+
 static zend_always_inline void smart_str_appendc_ex(smart_str *dest, char ch, bool persistent) {
 	size_t new_len = smart_str_alloc(dest, 1, persistent);
 	ZSTR_VAL(dest->s)[new_len - 1] = ch;
@@ -141,6 +147,11 @@
 	smart_str_appendl_ex(dest, result, buf + sizeof(buf) - 1 - result, persistent);
 }
 
+static zend_always_inline void smart_str_append_long(smart_str *dest, zend_long num)
+{
+	smart_str_append_long_ex(dest, num, false);
+}
+
 static zend_always_inline void smart_str_append_unsigned_ex(smart_str *dest, zend_ulong num, bool persistent) {
 	char buf[32];
 	char *result = zend_print_ulong_to_buf(buf + sizeof(buf) - 1, num);
@@ -147,9 +158,43 @@
 	smart_str_appendl_ex(dest, result, buf + sizeof(buf) - 1 - result, persistent);
 }
 
+static zend_always_inline void smart_str_append_unsigned(smart_str *dest, zend_ulong num)
+{
+	smart_str_append_unsigned_ex(dest, num, false);
+}
+
+static zend_always_inline void smart_str_appendl(smart_str *dest, const char *src, size_t length)
+{
+	smart_str_appendl_ex(dest, src, length, false);
+}
+static zend_always_inline void smart_str_appends_ex(smart_str *dest, const char *src, bool persistent)
+{
+	smart_str_appendl_ex(dest, src, strlen(src), persistent);
+}
+static zend_always_inline void smart_str_appends(smart_str *dest, const char *src)
+{
+	smart_str_appendl_ex(dest, src, strlen(src), false);
+}
+static zend_always_inline void smart_str_append(smart_str *dest, const zend_string *src)
+{
+	smart_str_append_ex(dest, src, false);
+}
+static zend_always_inline void smart_str_appendc(smart_str *dest, char ch)
+{
+	smart_str_appendc_ex(dest, ch, false);
+}
+static zend_always_inline void smart_str_append_smart_str(smart_str *dest, const smart_str *src)
+{
+	smart_str_append_smart_str_ex(dest, src, false);
+}
+
 static zend_always_inline void smart_str_setl(smart_str *dest, const char *src, size_t len) {
 	smart_str_free(dest);
 	smart_str_appendl(dest, src, len);
 }
 
+static zend_always_inline void smart_str_sets(smart_str *dest, const char *src)
+{
+	smart_str_setl(dest, src, strlen(src));
+}
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_smart_str_public.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_smart_str_public.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_smart_str_public.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -18,6 +18,7 @@
 #define ZEND_SMART_STR_PUBLIC_H
 
 typedef struct {
+	/** See smart_str_extract() */
 	zend_string *s;
 	size_t a;
 } smart_str;

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_stack.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_stack.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_stack.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -28,6 +28,11 @@
 
 #define STACK_BLOCK_SIZE 16
 
+typedef enum {
+	ZEND_STACK_APPLY_TOPDOWN,
+	ZEND_STACK_APPLY_BOTTOMUP,
+} zend_stack_apply_direction;
+
 BEGIN_EXTERN_C()
 ZEND_API void zend_stack_init(zend_stack *stack, int size);
 ZEND_API int zend_stack_push(zend_stack *stack, const void *element);
@@ -39,11 +44,8 @@
 ZEND_API void *zend_stack_base(const zend_stack *stack);
 ZEND_API int zend_stack_count(const zend_stack *stack);
 ZEND_API void zend_stack_apply(zend_stack *stack, int type, int (*apply_function)(void *element));
-ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (*apply_function)(void *element, void *arg), void *arg);
+ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, zend_stack_apply_direction type, int (*apply_function)(void *element, void *arg), void *arg);
 ZEND_API void zend_stack_clean(zend_stack *stack, void (*func)(void *), bool free_elements);
 END_EXTERN_C()
 
-#define ZEND_STACK_APPLY_TOPDOWN	1
-#define ZEND_STACK_APPLY_BOTTOMUP	2
-
 #endif /* ZEND_STACK_H */

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_stream.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_stream.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_stream.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -55,7 +55,7 @@
 	} handle;
 	zend_string       *filename;
 	zend_string       *opened_path;
-	zend_uchar        type; /* packed zend_stream_type */
+	uint8_t           type; /* packed zend_stream_type */
 	bool              primary_script;
 	bool              in_list; /* added into CG(open_file) */
 	char              *buf;

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_string.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_string.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_string.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -80,7 +80,29 @@
 /*---*/
 
 #define ZSTR_IS_INTERNED(s)					(GC_FLAGS(s) & IS_STR_INTERNED)
+#define ZSTR_IS_VALID_UTF8(s)				(GC_FLAGS(s) & IS_STR_VALID_UTF8)
 
+/* These are properties, encoded as flags, that will hold on the resulting string
+ * after concatenating two strings that have these property.
+ * Example: concatenating two UTF-8 strings yields another UTF-8 string. */
+#define ZSTR_COPYABLE_CONCAT_PROPERTIES		(IS_STR_VALID_UTF8)
+
+#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(s) 				(GC_FLAGS(s) & ZSTR_COPYABLE_CONCAT_PROPERTIES)
+/* This macro returns the copyable concat properties which hold on both strings. */
+#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(s1, s2)	(GC_FLAGS(s1) & GC_FLAGS(s2) & ZSTR_COPYABLE_CONCAT_PROPERTIES)
+
+#define ZSTR_COPY_CONCAT_PROPERTIES(out, in) do { \
+	zend_string *_out = (out); \
+	uint32_t properties = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES((in)); \
+	GC_ADD_FLAGS(_out, properties); \
+} while (0)
+
+#define ZSTR_COPY_CONCAT_PROPERTIES_BOTH(out, in1, in2) do { \
+	zend_string *_out = (out); \
+	uint32_t properties = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH((in1), (in2)); \
+	GC_ADD_FLAGS(_out, properties); \
+} while (0)
+
 #define ZSTR_EMPTY_ALLOC() zend_empty_string
 #define ZSTR_CHAR(c) zend_one_char_string[c]
 #define ZSTR_KNOWN(idx) zend_known_strings[idx]
@@ -108,6 +130,8 @@
 
 #define ZSTR_ALLOCA_FREE(str, use_heap) free_alloca(str, use_heap)
 
+#define ZSTR_INIT_LITERAL(s, persistent) (zend_string_init((s), strlen(s), (persistent)))
+
 /*---*/
 
 static zend_always_inline zend_ulong zend_string_hash_val(zend_string *s)
@@ -339,23 +363,28 @@
 	}
 }
 
+static zend_always_inline bool zend_string_equals_cstr(const zend_string *s1, const char *s2, size_t s2_length)
+{
+	return ZSTR_LEN(s1) == s2_length && !memcmp(ZSTR_VAL(s1), s2, s2_length);
+}
+
 #if defined(__GNUC__) && (defined(__i386__) || (defined(__x86_64__) && !defined(__ILP32__)))
 BEGIN_EXTERN_C()
-ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2);
+ZEND_API bool ZEND_FASTCALL zend_string_equal_val(const zend_string *s1, const zend_string *s2);
 END_EXTERN_C()
 #else
-static zend_always_inline bool zend_string_equal_val(zend_string *s1, zend_string *s2)
+static zend_always_inline bool zend_string_equal_val(const zend_string *s1, const zend_string *s2)
 {
 	return !memcmp(ZSTR_VAL(s1), ZSTR_VAL(s2), ZSTR_LEN(s1));
 }
 #endif
 
-static zend_always_inline bool zend_string_equal_content(zend_string *s1, zend_string *s2)
+static zend_always_inline bool zend_string_equal_content(const zend_string *s1, const zend_string *s2)
 {
 	return ZSTR_LEN(s1) == ZSTR_LEN(s2) && zend_string_equal_val(s1, s2);
 }
 
-static zend_always_inline bool zend_string_equals(zend_string *s1, zend_string *s2)
+static zend_always_inline bool zend_string_equals(const zend_string *s1, const zend_string *s2)
 {
 	return s1 == s2 || zend_string_equal_content(s1, s2);
 }
@@ -364,11 +393,37 @@
 	(ZSTR_LEN(s1) == ZSTR_LEN(s2) && !zend_binary_strcasecmp(ZSTR_VAL(s1), ZSTR_LEN(s1), ZSTR_VAL(s2), ZSTR_LEN(s2)))
 
 #define zend_string_equals_literal_ci(str, c) \
-	(ZSTR_LEN(str) == sizeof(c) - 1 && !zend_binary_strcasecmp(ZSTR_VAL(str), ZSTR_LEN(str), (c), sizeof(c) - 1))
+	(ZSTR_LEN(str) == sizeof("" c) - 1 && !zend_binary_strcasecmp(ZSTR_VAL(str), ZSTR_LEN(str), (c), sizeof(c) - 1))
 
 #define zend_string_equals_literal(str, literal) \
-	(ZSTR_LEN(str) == sizeof(literal)-1 && !memcmp(ZSTR_VAL(str), literal, sizeof(literal) - 1))
+	zend_string_equals_cstr(str, "" literal, sizeof(literal) - 1)
 
+static zend_always_inline bool zend_string_starts_with_cstr(const zend_string *str, const char *prefix, size_t prefix_length)
+{
+	return ZSTR_LEN(str) >= prefix_length && !memcmp(ZSTR_VAL(str), prefix, prefix_length);
+}
+
+static zend_always_inline bool zend_string_starts_with(const zend_string *str, const zend_string *prefix)
+{
+	return zend_string_starts_with_cstr(str, ZSTR_VAL(prefix), ZSTR_LEN(prefix));
+}
+
+#define zend_string_starts_with_literal(str, prefix) \
+	zend_string_starts_with_cstr(str, prefix, strlen(prefix))
+
+static zend_always_inline bool zend_string_starts_with_cstr_ci(const zend_string *str, const char *prefix, size_t prefix_length)
+{
+	return ZSTR_LEN(str) >= prefix_length && !strncasecmp(ZSTR_VAL(str), prefix, prefix_length);
+}
+
+static zend_always_inline bool zend_string_starts_with_ci(const zend_string *str, const zend_string *prefix)
+{
+	return zend_string_starts_with_cstr_ci(str, ZSTR_VAL(prefix), ZSTR_LEN(prefix));
+}
+
+#define zend_string_starts_with_literal_ci(str, prefix) \
+	zend_string_starts_with_cstr_ci(str, prefix, strlen(prefix))
+
 /*
  * DJBX33A (Daniel J. Bernstein, Times 33 with Addition)
  *
@@ -429,25 +484,25 @@
 			((chunk >> (8 * 7)) & 0xff);
 # else
 		hash =
-			hash   * 33 * 33 * 33 * 33 +
-			str[0] * 33 * 33 * 33 +
-			str[1] * 33 * 33 +
-			str[2] * 33 +
+			hash   * Z_L(33 * 33 * 33 * 33) +
+			str[0] * Z_L(33 * 33 * 33) +
+			str[1] * Z_L(33 * 33) +
+			str[2] * Z_L(33) +
 			str[3];
 		hash =
-			hash   * 33 * 33 * 33 * 33 +
-			str[4] * 33 * 33 * 33 +
-			str[5] * 33 * 33 +
-			str[6] * 33 +
+			hash   * Z_L(33 * 33 * 33 * 33) +
+			str[4] * Z_L(33 * 33 * 33) +
+			str[5] * Z_L(33 * 33) +
+			str[6] * Z_L(33) +
 			str[7];
 # endif
 	}
 	if (len >= 4) {
 		hash =
-			hash   * 33 * 33 * 33 * 33 +
-			str[0] * 33 * 33 * 33 +
-			str[1] * 33 * 33 +
-			str[2] * 33 +
+			hash   * Z_L(33 * 33 * 33 * 33) +
+			str[0] * Z_L(33 * 33 * 33) +
+			str[1] * Z_L(33 * 33) +
+			str[2] * Z_L(33) +
 			str[3];
 		len -= 4;
 		str += 4;
@@ -455,18 +510,18 @@
 	if (len >= 2) {
 		if (len > 2) {
 			hash =
-				hash   * 33 * 33 * 33 +
-				str[0] * 33 * 33 +
-				str[1] * 33 +
+				hash   * Z_L(33 * 33 * 33) +
+				str[0] * Z_L(33 * 33) +
+				str[1] * Z_L(33) +
 				str[2];
 		} else {
 			hash =
-				hash   * 33 * 33 +
-				str[0] * 33 +
+				hash   * Z_L(33 * 33) +
+				str[0] * Z_L(33) +
 				str[1];
 		}
 	} else if (len != 0) {
-		hash = hash * 33 + *str;
+		hash = hash * Z_L(33) + *str;
 	}
 #else
 	/* variant with the hash unrolled eight times */
@@ -560,8 +615,10 @@
 	_(ZEND_STR_VOID,                   "void") \
 	_(ZEND_STR_NEVER,                  "never") \
 	_(ZEND_STR_FALSE,                  "false") \
+	_(ZEND_STR_TRUE,                   "true") \
 	_(ZEND_STR_NULL_LOWERCASE,         "null") \
 	_(ZEND_STR_MIXED,                  "mixed") \
+	_(ZEND_STR_TRAVERSABLE,            "Traversable") \
 	_(ZEND_STR_SLEEP,                  "__sleep") \
 	_(ZEND_STR_WAKEUP,                 "__wakeup") \
 	_(ZEND_STR_CASES,                  "cases") \
@@ -571,6 +628,9 @@
 	_(ZEND_STR_AUTOGLOBAL_SERVER,      "_SERVER") \
 	_(ZEND_STR_AUTOGLOBAL_ENV,         "_ENV") \
 	_(ZEND_STR_AUTOGLOBAL_REQUEST,     "_REQUEST") \
+	_(ZEND_STR_COUNT,                  "count") \
+	_(ZEND_STR_SENSITIVEPARAMETER,     "SensitiveParameter") \
+	_(ZEND_STR_CONST_EXPR_PLACEHOLDER, "[constant expression]") \
 
 
 typedef enum _zend_known_string_id {

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_strtod_int.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_strtod_int.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_strtod_int.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -44,22 +44,6 @@
 
 #include <inttypes.h>
 
-#ifndef HAVE_INT32_T
-# if SIZEOF_INT == 4
-typedef int int32_t;
-# elif SIZEOF_LONG == 4
-typedef long int int32_t;
-# endif
-#endif
-
-#ifndef HAVE_UINT32_T
-# if SIZEOF_INT == 4
-typedef unsigned int uint32_t;
-# elif SIZEOF_LONG == 4
-typedef unsigned long int uint32_t;
-# endif
-#endif
-
 #ifdef USE_LOCALE
 #undef USE_LOCALE
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_type_info.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_type_info.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_type_info.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -38,7 +38,6 @@
 /* These are used in zend_type, but not for type inference.
  * They are allowed to overlap with types used during inference. */
 #define MAY_BE_CALLABLE             (1 << IS_CALLABLE)
-#define MAY_BE_ITERABLE             (1 << IS_ITERABLE)
 #define MAY_BE_VOID                 (1 << IS_VOID)
 #define MAY_BE_NEVER                (1 << IS_NEVER)
 #define MAY_BE_STATIC               (1 << IS_STATIC)
@@ -60,15 +59,17 @@
 #define MAY_BE_ARRAY_PACKED         (1<<21)
 #define MAY_BE_ARRAY_NUMERIC_HASH   (1<<22) /* hash with numeric keys */
 #define MAY_BE_ARRAY_STRING_HASH    (1<<23) /* hash with string keys */
+#define MAY_BE_ARRAY_EMPTY          (1<<29)
 
 #define MAY_BE_ARRAY_KEY_LONG       (MAY_BE_ARRAY_PACKED | MAY_BE_ARRAY_NUMERIC_HASH)
 #define MAY_BE_ARRAY_KEY_STRING     MAY_BE_ARRAY_STRING_HASH
-#define MAY_BE_ARRAY_KEY_ANY        (MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_KEY_STRING)
+#define MAY_BE_ARRAY_KEY_ANY        (MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_EMPTY)
 
 #define MAY_BE_PACKED(t)            ((t) & MAY_BE_ARRAY_PACKED)
 #define MAY_BE_HASH(t)              ((t) & (MAY_BE_ARRAY_NUMERIC_HASH | MAY_BE_ARRAY_KEY_STRING))
-#define MAY_BE_PACKED_ONLY(t)       (MAY_BE_PACKED(t) && !MAY_BE_HASH(t))
-#define MAY_BE_HASH_ONLY(t)         (MAY_BE_HASH(t) && !MAY_BE_PACKED(t))
+#define MAY_BE_PACKED_ONLY(t)       (((t) & MAY_BE_ARRAY_KEY_ANY) == MAY_BE_ARRAY_PACKED)
+#define MAY_BE_HASH_ONLY(t)         (MAY_BE_HASH(t) && !((t) & (MAY_BE_ARRAY_PACKED|MAY_BE_ARRAY_EMPTY)))
+#define MAY_BE_EMPTY_ONLY(t)        (((t) & MAY_BE_ARRAY_KEY_ANY) == MAY_BE_ARRAY_EMPTY)
 
 #define MAY_BE_CLASS                (1<<24)
 #define MAY_BE_INDIRECT             (1<<25)

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_types.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_types.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_types.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -25,11 +25,18 @@
 #include "zend_portability.h"
 #include "zend_long.h"
 #include <stdbool.h>
+#include <stdint.h>
 
 #ifdef __SSE2__
 # include <mmintrin.h>
 # include <emmintrin.h>
 #endif
+#if defined(__AVX2__)
+# include <immintrin.h>
+#endif
+#if defined(__aarch64__) || defined(_M_ARM64)
+# include <arm_neon.h>
+#endif
 
 #ifdef WORDS_BIGENDIAN
 # define ZEND_ENDIAN_LOHI(lo, hi)          hi; lo;
@@ -47,7 +54,6 @@
 # define ZEND_ENDIAN_LOHI_C_4(a, b, c, d)  a, b, c, d
 #endif
 
-typedef bool zend_bool;
 typedef unsigned char zend_uchar;
 
 typedef enum {
@@ -71,9 +77,6 @@
 # endif
 #endif
 
-typedef intptr_t zend_intptr_t;
-typedef uintptr_t zend_uintptr_t;
-
 #ifdef ZTS
 #define ZEND_TLS static TSRM_TLS
 #define ZEND_EXT_TLS TSRM_TLS
@@ -112,6 +115,7 @@
  * ZEND_TYPE_IS_ONLY_MASK()  - checks if type-hint refer to standard type only
  * ZEND_TYPE_IS_COMPLEX()    - checks if type is a type_list, or contains a class either as a CE or as a name
  * ZEND_TYPE_HAS_NAME()      - checks if type-hint contains some class as zend_string *
+ * ZEND_TYPE_HAS_LITERAL_NAME()	- checks if type-hint contains some class as const char *
  * ZEND_TYPE_IS_INTERSECTION() - checks if the type_list represents an intersection type list
  * ZEND_TYPE_IS_UNION()      - checks if the type_list represents a union type list
  *
@@ -142,9 +146,12 @@
 #define _ZEND_TYPE_MASK ((1u << 25) - 1)
 /* Only one of these bits may be set. */
 #define _ZEND_TYPE_NAME_BIT (1u << 24)
+// Used to signify that type.ptr is not a `zend_string*` but a `const char*`,
+#define _ZEND_TYPE_LITERAL_NAME_BIT (1u << 23)
 #define _ZEND_TYPE_LIST_BIT (1u << 22)
-#define _ZEND_TYPE_KIND_MASK (_ZEND_TYPE_LIST_BIT|_ZEND_TYPE_NAME_BIT)
-/* TODO: bit 21 is not used */
+#define _ZEND_TYPE_KIND_MASK (_ZEND_TYPE_LIST_BIT|_ZEND_TYPE_NAME_BIT|_ZEND_TYPE_LITERAL_NAME_BIT)
+/* For BC behaviour with iterable type */
+#define _ZEND_TYPE_ITERABLE_BIT (1u << 21)
 /* Whether the type list is arena allocated */
 #define _ZEND_TYPE_ARENA_BIT (1u << 20)
 /* Whether the type list is an intersection type */
@@ -167,9 +174,15 @@
 #define ZEND_TYPE_HAS_NAME(t) \
 	((((t).type_mask) & _ZEND_TYPE_NAME_BIT) != 0)
 
+#define ZEND_TYPE_HAS_LITERAL_NAME(t) \
+	((((t).type_mask) & _ZEND_TYPE_LITERAL_NAME_BIT) != 0)
+
 #define ZEND_TYPE_HAS_LIST(t) \
 	((((t).type_mask) & _ZEND_TYPE_LIST_BIT) != 0)
 
+#define ZEND_TYPE_IS_ITERABLE_FALLBACK(t) \
+	((((t).type_mask) & _ZEND_TYPE_ITERABLE_BIT) != 0)
+
 #define ZEND_TYPE_IS_INTERSECTION(t) \
 	((((t).type_mask) & _ZEND_TYPE_INTERSECTION_BIT) != 0)
 
@@ -256,34 +269,48 @@
 #define ZEND_TYPE_ALLOW_NULL(t) \
 	(((t).type_mask & _ZEND_TYPE_NULLABLE_BIT) != 0)
 
+#if defined(__cplusplus) && defined(_MSC_VER)
+# define _ZEND_TYPE_PREFIX zend_type
+#else
+/* FIXME: We could add (zend_type) here at some point but this breaks in MSVC because
+ * (zend_type)(zend_type){} is no longer considered constant. */
+# define _ZEND_TYPE_PREFIX
+#endif
+
 #define ZEND_TYPE_INIT_NONE(extra_flags) \
-	{ NULL, (extra_flags) }
+	_ZEND_TYPE_PREFIX { NULL, (extra_flags) }
 
 #define ZEND_TYPE_INIT_MASK(_type_mask) \
-	{ NULL, (_type_mask) }
+	_ZEND_TYPE_PREFIX { NULL, (_type_mask) }
 
 #define ZEND_TYPE_INIT_CODE(code, allow_null, extra_flags) \
-	ZEND_TYPE_INIT_MASK(((code) == _IS_BOOL ? MAY_BE_BOOL : ((code) == IS_MIXED ? MAY_BE_ANY : (1 << (code)))) \
+	ZEND_TYPE_INIT_MASK(((code) == _IS_BOOL ? MAY_BE_BOOL : ( (code) == IS_ITERABLE ? _ZEND_TYPE_ITERABLE_BIT : ((code) == IS_MIXED ? MAY_BE_ANY : (1 << (code))))) \
 		| ((allow_null) ? _ZEND_TYPE_NULLABLE_BIT : 0) | (extra_flags))
 
 #define ZEND_TYPE_INIT_PTR(ptr, type_kind, allow_null, extra_flags) \
-	{ (void *) (ptr), \
+	_ZEND_TYPE_PREFIX { (void *) (ptr), \
 		(type_kind) | ((allow_null) ? _ZEND_TYPE_NULLABLE_BIT : 0) | (extra_flags) }
 
 #define ZEND_TYPE_INIT_PTR_MASK(ptr, type_mask) \
-	{ (void *) (ptr), (type_mask) }
+	_ZEND_TYPE_PREFIX { (void *) (ptr), (type_mask) }
 
 #define ZEND_TYPE_INIT_UNION(ptr, extra_flags) \
-	{ (void *) (ptr), (_ZEND_TYPE_LIST_BIT|_ZEND_TYPE_UNION_BIT) | (extra_flags) }
+	_ZEND_TYPE_PREFIX { (void *) (ptr), (_ZEND_TYPE_LIST_BIT|_ZEND_TYPE_UNION_BIT) | (extra_flags) }
 
+#define ZEND_TYPE_INIT_INTERSECTION(ptr, extra_flags) \
+	_ZEND_TYPE_PREFIX { (void *) (ptr), (_ZEND_TYPE_LIST_BIT|_ZEND_TYPE_INTERSECTION_BIT) | (extra_flags) }
+
 #define ZEND_TYPE_INIT_CLASS(class_name, allow_null, extra_flags) \
 	ZEND_TYPE_INIT_PTR(class_name, _ZEND_TYPE_NAME_BIT, allow_null, extra_flags)
 
+#define ZEND_TYPE_INIT_CLASS_MASK(class_name, type_mask) \
+	ZEND_TYPE_INIT_PTR_MASK(class_name, _ZEND_TYPE_NAME_BIT | (type_mask))
+
 #define ZEND_TYPE_INIT_CLASS_CONST(class_name, allow_null, extra_flags) \
-	ZEND_TYPE_INIT_PTR(class_name, _ZEND_TYPE_NAME_BIT, allow_null, extra_flags)
+	ZEND_TYPE_INIT_PTR(class_name, _ZEND_TYPE_LITERAL_NAME_BIT, allow_null, extra_flags)
 
 #define ZEND_TYPE_INIT_CLASS_CONST_MASK(class_name, type_mask) \
-	ZEND_TYPE_INIT_PTR_MASK(class_name, _ZEND_TYPE_NAME_BIT | (type_mask))
+	ZEND_TYPE_INIT_PTR_MASK(class_name, (_ZEND_TYPE_LITERAL_NAME_BIT | (type_mask)))
 
 typedef union _zend_value {
 	zend_long         lval;				/* long value */
@@ -311,8 +338,8 @@
 		uint32_t type_info;
 		struct {
 			ZEND_ENDIAN_LOHI_3(
-				zend_uchar    type,			/* active type */
-				zend_uchar    type_flags,
+				uint8_t    type,			/* active type */
+				uint8_t    type_flags,
 				union {
 					uint16_t  extra;        /* not further specified */
 				} u)
@@ -326,7 +353,7 @@
 		uint32_t     num_args;             /* arguments number for EX(This) */
 		uint32_t     fe_pos;               /* foreach position */
 		uint32_t     fe_iter_idx;          /* foreach iterator index */
-		uint32_t     property_guard;       /* single property guard */
+		uint32_t     guard;                /* recursion and single property guard */
 		uint32_t     constant_flags;       /* constant flags */
 		uint32_t     extra;                /* not further specified */
 	} u2;
@@ -363,15 +390,19 @@
 	union {
 		struct {
 			ZEND_ENDIAN_LOHI_4(
-				zend_uchar    flags,
-				zend_uchar    _unused,
-				zend_uchar    nIteratorsCount,
-				zend_uchar    _unused2)
+				uint8_t    flags,
+				uint8_t    _unused,
+				uint8_t    nIteratorsCount,
+				uint8_t    _unused2)
 		} v;
 		uint32_t flags;
 	} u;
 	uint32_t          nTableMask;
-	Bucket           *arData;
+	union {
+		uint32_t     *arHash;   /* hash table (allocated above this pointer) */
+		Bucket       *arData;   /* array of hash buckets */
+		zval         *arPacked; /* packed array of zvals */
+	};
 	uint32_t          nNumUsed;
 	uint32_t          nNumOfElements;
 	uint32_t          nTableSize;
@@ -385,14 +416,14 @@
  * =====================
  *
  *                 +=============================+
- *                 | HT_HASH(ht, ht->nTableMask) |
- *                 | ...                         |
- *                 | HT_HASH(ht, -1)             |
- *                 +-----------------------------+
- * ht->arData ---> | Bucket[0]                   |
- *                 | ...                         |
- *                 | Bucket[ht->nTableSize-1]    |
- *                 +=============================+
+ *                 | HT_HASH(ht, ht->nTableMask) |                   +=============================+
+ *                 | ...                         |                   | HT_INVALID_IDX              |
+ *                 | HT_HASH(ht, -1)             |                   | HT_INVALID_IDX              |
+ *                 +-----------------------------+                   +-----------------------------+
+ * ht->arData ---> | Bucket[0]                   | ht->arPacked ---> | ZVAL[0]                     |
+ *                 | ...                         |                   | ...                         |
+ *                 | Bucket[ht->nTableSize-1]    |                   | ZVAL[ht->nTableSize-1]      |
+ *                 +=============================+                   +=============================+
  */
 
 #define HT_INVALID_IDX ((uint32_t) -1)
@@ -430,7 +461,7 @@
 #define HT_HASH_EX(data, idx) \
 	((uint32_t*)(data))[(int32_t)(idx)]
 #define HT_HASH(ht, idx) \
-	HT_HASH_EX((ht)->arData, idx)
+	HT_HASH_EX((ht)->arHash, idx)
 
 #define HT_SIZE_TO_MASK(nTableSize) \
 	((uint32_t)(-((nTableSize) + (nTableSize))))
@@ -444,10 +475,32 @@
 	HT_SIZE_EX((ht)->nTableSize, (ht)->nTableMask)
 #define HT_USED_SIZE(ht) \
 	(HT_HASH_SIZE((ht)->nTableMask) + ((size_t)(ht)->nNumUsed * sizeof(Bucket)))
-#ifdef __SSE2__
+#define HT_PACKED_DATA_SIZE(nTableSize) \
+	((size_t)(nTableSize) * sizeof(zval))
+#define HT_PACKED_SIZE_EX(nTableSize, nTableMask) \
+	(HT_PACKED_DATA_SIZE((nTableSize)) + HT_HASH_SIZE((nTableMask)))
+#define HT_PACKED_SIZE(ht) \
+	HT_PACKED_SIZE_EX((ht)->nTableSize, (ht)->nTableMask)
+#define HT_PACKED_USED_SIZE(ht) \
+	(HT_HASH_SIZE((ht)->nTableMask) + ((size_t)(ht)->nNumUsed * sizeof(zval)))
+#if defined(__AVX2__)
 # define HT_HASH_RESET(ht) do { \
 		char *p = (char*)&HT_HASH(ht, (ht)->nTableMask); \
 		size_t size = HT_HASH_SIZE((ht)->nTableMask); \
+		__m256i ymm0 = _mm256_setzero_si256(); \
+		ymm0 = _mm256_cmpeq_epi64(ymm0, ymm0); \
+		ZEND_ASSERT(size >= 64 && ((size & 0x3f) == 0)); \
+		do { \
+			_mm256_storeu_si256((__m256i*)p, ymm0); \
+			_mm256_storeu_si256((__m256i*)(p+32), ymm0); \
+			p += 64; \
+			size -= 64; \
+		} while (size != 0); \
+	} while (0)
+#elif defined(__SSE2__)
+# define HT_HASH_RESET(ht) do { \
+		char *p = (char*)&HT_HASH(ht, (ht)->nTableMask); \
+		size_t size = HT_HASH_SIZE((ht)->nTableMask); \
 		__m128i xmm0 = _mm_setzero_si128(); \
 		xmm0 = _mm_cmpeq_epi8(xmm0, xmm0); \
 		ZEND_ASSERT(size >= 64 && ((size & 0x3f) == 0)); \
@@ -460,6 +513,21 @@
 			size -= 64; \
 		} while (size != 0); \
 	} while (0)
+#elif defined(__aarch64__) || defined(_M_ARM64)
+# define HT_HASH_RESET(ht) do { \
+		char *p = (char*)&HT_HASH(ht, (ht)->nTableMask); \
+		size_t size = HT_HASH_SIZE((ht)->nTableMask); \
+		int32x4_t t = vdupq_n_s32(-1); \
+		ZEND_ASSERT(size >= 64 && ((size & 0x3f) == 0)); \
+		do { \
+			vst1q_s32((int32_t*)p, t); \
+			vst1q_s32((int32_t*)(p+16), t); \
+			vst1q_s32((int32_t*)(p+32), t); \
+			vst1q_s32((int32_t*)(p+48), t); \
+			p += 64; \
+			size -= 64; \
+		} while (size != 0); \
+	} while (0)
 #else
 # define HT_HASH_RESET(ht) \
 	memset(&HT_HASH(ht, (ht)->nTableMask), HT_INVALID_IDX, HT_HASH_SIZE((ht)->nTableMask))
@@ -482,6 +550,7 @@
 typedef struct _HashTableIterator {
 	HashTable    *ht;
 	HashPosition  pos;
+	uint32_t      next_copy; // circular linked list via index into EG(ht_iterators)
 } HashTableIterator;
 
 struct _zend_object {
@@ -559,7 +628,23 @@
 #define _IS_BOOL					18
 #define _IS_NUMBER					19
 
-static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
+/* guard flags */
+#define ZEND_GUARD_PROPERTY_GET		(1<<0)
+#define ZEND_GUARD_PROPERTY_SET		(1<<1)
+#define ZEND_GUARD_PROPERTY_UNSET	(1<<2)
+#define ZEND_GUARD_PROPERTY_ISSET	(1<<3)
+#define ZEND_GUARD_PROPERTY_MASK	15
+#define ZEND_GUARD_RECURSION_DEBUG	(1<<4)
+#define ZEND_GUARD_RECURSION_EXPORT	(1<<5)
+#define ZEND_GUARD_RECURSION_JSON	(1<<6)
+
+#define ZEND_GUARD_RECURSION_TYPE(t) ZEND_GUARD_RECURSION_ ## t
+
+#define ZEND_GUARD_IS_RECURSIVE(pg, t)			((*pg & ZEND_GUARD_RECURSION_TYPE(t)) != 0)
+#define ZEND_GUARD_PROTECT_RECURSION(pg, t)		*pg |= ZEND_GUARD_RECURSION_TYPE(t)
+#define ZEND_GUARD_UNPROTECT_RECURSION(pg, t)	*pg &= ~ZEND_GUARD_RECURSION_TYPE(t)
+
+static zend_always_inline uint8_t zval_get_type(const zval* pz) {
 	return pz->u1.v.type;
 }
 
@@ -575,6 +660,9 @@
 #define Z_TYPE_FLAGS(zval)			(zval).u1.v.type_flags
 #define Z_TYPE_FLAGS_P(zval_p)		Z_TYPE_FLAGS(*(zval_p))
 
+#define Z_TYPE_EXTRA(zval)			(zval).u1.v.u.extra
+#define Z_TYPE_EXTRA_P(zval_p)		Z_TYPE_EXTRA(*(zval_p))
+
 #define Z_TYPE_INFO(zval)			(zval).u1.type_info
 #define Z_TYPE_INFO_P(zval_p)		Z_TYPE_INFO(*(zval_p))
 
@@ -596,8 +684,8 @@
 #define Z_FE_ITER(zval)				(zval).u2.fe_iter_idx
 #define Z_FE_ITER_P(zval_p)			Z_FE_ITER(*(zval_p))
 
-#define Z_PROPERTY_GUARD(zval)		(zval).u2.property_guard
-#define Z_PROPERTY_GUARD_P(zval_p)	Z_PROPERTY_GUARD(*(zval_p))
+#define Z_GUARD(zval)				(zval).u2.guard
+#define Z_GUARD_P(zval_p)			Z_GUARD(*(zval_p))
 
 #define Z_CONSTANT_FLAGS(zval)		(zval).u2.constant_flags
 #define Z_CONSTANT_FLAGS_P(zval_p)	Z_CONSTANT_FLAGS(*(zval_p))
@@ -612,6 +700,7 @@
 #define Z_TYPE_FLAGS_MASK			0xff00
 
 #define Z_TYPE_FLAGS_SHIFT			8
+#define Z_TYPE_INFO_EXTRA_SHIFT		16
 
 #define GC_REFCOUNT(p)				zend_gc_refcount(&(p)->gc)
 #define GC_SET_REFCOUNT(p, rc)		zend_gc_set_refcount(&(p)->gc, rc)
@@ -622,6 +711,26 @@
 #define GC_TRY_ADDREF(p)			zend_gc_try_addref(&(p)->gc)
 #define GC_TRY_DELREF(p)			zend_gc_try_delref(&(p)->gc)
 
+#define GC_DTOR(p) \
+	do { \
+		zend_refcounted_h *_p = &(p)->gc; \
+		if (zend_gc_delref(_p) == 0) { \
+			rc_dtor_func((zend_refcounted *)_p); \
+		} else { \
+			gc_check_possible_root((zend_refcounted *)_p); \
+		} \
+	} while (0)
+
+#define GC_DTOR_NO_REF(p) \
+	do { \
+		zend_refcounted_h *_p = &(p)->gc; \
+		if (zend_gc_delref(_p) == 0) { \
+			rc_dtor_func((zend_refcounted *)_p); \
+		} else { \
+			gc_check_possible_root_no_ref((zend_refcounted *)_p); \
+		} \
+	} while (0)
+
 #define GC_TYPE_MASK				0x0000000f
 #define GC_FLAGS_MASK				0x000003f0
 #define GC_INFO_MASK				0xfffffc00
@@ -628,7 +737,7 @@
 #define GC_FLAGS_SHIFT				0
 #define GC_INFO_SHIFT				10
 
-static zend_always_inline zend_uchar zval_gc_type(uint32_t gc_type_info) {
+static zend_always_inline uint8_t zval_gc_type(uint32_t gc_type_info) {
 	return (gc_type_info & GC_TYPE_MASK);
 }
 
@@ -681,6 +790,11 @@
 /* zval.u1.v.type_flags */
 #define IS_TYPE_REFCOUNTED			(1<<0)
 #define IS_TYPE_COLLECTABLE			(1<<1)
+/* Used for static variables to check if they have been initialized. We can't use IS_UNDEF because
+ * we can't store IS_UNDEF zvals in the static_variables HashTable. This needs to live in type_info
+ * so that the ZEND_ASSIGN overrides it but is moved to extra to avoid breaking the Z_REFCOUNTED()
+ * optimization that only checks for Z_TYPE_FLAGS() without `& (IS_TYPE_COLLECTABLE|IS_TYPE_REFCOUNTED)`. */
+#define IS_STATIC_VAR_UNINITIALIZED		(1<<0)
 
 #if 1
 /* This optimized version assumes that we have a single "type_flag" */
@@ -770,6 +884,25 @@
 #define Z_PROTECT_RECURSION_P(zv)   Z_PROTECT_RECURSION(*(zv))
 #define Z_UNPROTECT_RECURSION_P(zv) Z_UNPROTECT_RECURSION(*(zv))
 
+#define ZEND_GUARD_OR_GC_IS_RECURSIVE(pg, t, zobj) \
+	(pg ? ZEND_GUARD_IS_RECURSIVE(pg, t) : GC_IS_RECURSIVE(zobj))
+
+#define ZEND_GUARD_OR_GC_PROTECT_RECURSION(pg, t, zobj) do { \
+		if (pg) { \
+			ZEND_GUARD_PROTECT_RECURSION(pg, t); \
+		} else { \
+			GC_PROTECT_RECURSION(zobj); \
+		} \
+	} while(0)
+
+#define ZEND_GUARD_OR_GC_UNPROTECT_RECURSION(pg, t, zobj) do { \
+		if (pg) { \
+			ZEND_GUARD_UNPROTECT_RECURSION(pg, t); \
+		} else { \
+			GC_UNPROTECT_RECURSION(zobj); \
+		} \
+	} while(0)
+
 /* All data types < IS_STRING have their constructor/destructors skipped */
 #define Z_CONSTANT(zval)			(Z_TYPE(zval) == IS_CONSTANT_AST)
 #define Z_CONSTANT_P(zval_p)		Z_CONSTANT(*(zval_p))
@@ -1160,7 +1293,7 @@
  * Skip checks for OBJECT/NULL type to avoid interpreting the flag incorrectly. */
 # define ZEND_RC_MOD_CHECK(p) do { \
 		if (zend_rc_debug) { \
-			zend_uchar type = zval_gc_type((p)->u.type_info); \
+			uint8_t type = zval_gc_type((p)->u.type_info); \
 			if (type != IS_OBJECT && type != IS_NULL) { \
 				ZEND_ASSERT(!(zval_gc_flags((p)->u.type_info) & GC_IMMUTABLE)); \
 				ZEND_ASSERT((zval_gc_flags((p)->u.type_info) & (GC_PERSISTENT|GC_PERSISTENT_LOCAL)) != GC_PERSISTENT); \
@@ -1425,7 +1558,8 @@
  * (both use IS_UNDEF type) in the Z_EXTRA space. As such we also need to copy
  * the Z_EXTRA space when copying property default values etc. We define separate
  * macros for this purpose, so this workaround is easier to remove in the future. */
-#define IS_PROP_UNINIT 1
+#define IS_PROP_UNINIT (1<<0)
+#define IS_PROP_REINITABLE (1<<1)  /* It has impact only on readonly properties */
 #define Z_PROP_FLAG_P(z) Z_EXTRA_P(z)
 #define ZVAL_COPY_VALUE_PROP(z, v) \
 	do { *(z) = *(v); } while (0)
@@ -1435,4 +1569,9 @@
 	do { ZVAL_COPY_OR_DUP(z, v); Z_PROP_FLAG_P(z) = Z_PROP_FLAG_P(v); } while (0)
 
 
+static zend_always_inline bool zend_may_modify_arg_in_place(const zval *arg)
+{
+	return Z_REFCOUNTED_P(arg) && !(GC_FLAGS(Z_COUNTED_P(arg)) & (GC_IMMUTABLE | GC_PERSISTENT)) && Z_REFCOUNT_P(arg) == 1;
+}
+
 #endif /* ZEND_TYPES_H */

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_virtual_cwd.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_virtual_cwd.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_virtual_cwd.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -73,8 +73,11 @@
 #define DEFAULT_SLASH '\\'
 #define DEFAULT_DIR_SEPARATOR	';'
 #define IS_SLASH(c)	((c) == '/' || (c) == '\\')
+// IS_SLASH_P() may read the previous char on Windows, which may be OOB; use IS_SLASH_P_EX() instead
 #define IS_SLASH_P(c)	(*(c) == '/' || \
         (*(c) == '\\' && !IsDBCSLeadByte(*(c-1))))
+#define IS_SLASH_P_EX(c, first_byte)	(*(c) == '/' || \
+        (*(c) == '\\' && ((first_byte) || !IsDBCSLeadByte(*(c-1)))))
 
 /* COPY_WHEN_ABSOLUTE is 2 under Win32 because by chance both regular absolute paths
    in the file system and UNC paths need copying of two characters */
@@ -87,7 +90,17 @@
 #else
 #ifdef HAVE_DIRENT_H
 #include <dirent.h>
+
+#ifndef DT_UNKNOWN
+# define DT_UNKNOWN 0
 #endif
+#ifndef DT_DIR
+# define DT_DIR 4
+#endif
+#ifndef DT_REG
+# define DT_REG 8
+#endif
+#endif
 
 #define DEFAULT_SLASH '/'
 
@@ -98,7 +111,9 @@
 #endif
 
 #define IS_SLASH(c)	((c) == '/')
+// IS_SLASH_P() may read the previous char on Windows, which may be OOB; use IS_SLASH_P_EX() instead
 #define IS_SLASH_P(c)	(*(c) == '/')
+#define IS_SLASH_P_EX(c, first_byte) IS_SLASH_P(c)
 
 #endif
 
@@ -160,7 +175,7 @@
 CWD_API int virtual_cwd_deactivate(void);
 CWD_API char *virtual_getcwd_ex(size_t *length);
 CWD_API char *virtual_getcwd(char *buf, size_t size);
-CWD_API int virtual_chdir(const char *path);
+CWD_API zend_result virtual_chdir(const char *path);
 CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path));
 CWD_API int virtual_filepath(const char *path, char **filepath);
 CWD_API int virtual_filepath_ex(const char *path, char **filepath, verify_path_func verify_path);
@@ -260,7 +275,7 @@
 #define VCWD_OPEN_MODE(path, flags, mode) virtual_open(path, flags, mode)
 #define VCWD_CREAT(path, mode) virtual_creat(path, mode)
 #define VCWD_CHDIR(path) virtual_chdir(path)
-#define VCWD_CHDIR_FILE(path) virtual_chdir_file(path, virtual_chdir)
+#define VCWD_CHDIR_FILE(path) virtual_chdir_file(path, (int (*)(const char *)) virtual_chdir)
 #define VCWD_GETWD(buf)
 #define VCWD_REALPATH(path, real_path) virtual_realpath(path, real_path)
 #define VCWD_RENAME(oldname, newname) virtual_rename(oldname, newname)

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_vm.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_vm.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_vm.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -29,6 +29,7 @@
 ZEND_API const zend_op *zend_get_halt_op(void);
 ZEND_API int ZEND_FASTCALL zend_vm_call_opcode_handler(zend_execute_data *ex);
 ZEND_API int zend_vm_kind(void);
+ZEND_API bool zend_gcc_global_regs(void);
 
 void zend_vm_init(void);
 void zend_vm_dtor(void);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_def.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_def.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_def.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -384,6 +384,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (OP1_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_CV) {
@@ -405,7 +406,7 @@
 			}
 		} else if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			if (UNEXPECTED(len > ZSTR_MAX_LEN - ZSTR_LEN(op2_str))) {
 				zend_error_noreturn(E_ERROR, "Integer overflow in memory allocation");
@@ -412,6 +413,7 @@
 			}
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -420,6 +422,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -1093,7 +1096,7 @@
 
 	FREE_OP_DATA();
 	FREE_OP2();
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	/* assign_obj has two opcodes! */
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
@@ -1213,7 +1216,7 @@
 			}
 			zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
 		} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
-			zend_uchar old_type;
+			uint8_t old_type;
 
 			if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
 				ZVAL_UNDEFINED_OP1();
@@ -1242,7 +1245,7 @@
 	}
 
 	FREE_OP2();
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -1273,7 +1276,7 @@
 	}
 
 	FREE_OP2();
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -1341,7 +1344,7 @@
 	} while (0);
 
 	FREE_OP2();
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -1413,7 +1416,7 @@
 	} while (0);
 
 	FREE_OP2();
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -1503,7 +1506,7 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
 	}
 
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -1555,7 +1558,7 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
 	}
 
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -1605,7 +1608,7 @@
 		increment_function(var_ptr);
 	} while (0);
 
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -1653,7 +1656,7 @@
 		decrement_function(var_ptr);
 	} while (0);
 
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -1748,6 +1751,10 @@
 		} else if (type == BP_VAR_IS || type == BP_VAR_UNSET) {
 			retval = &EG(uninitialized_zval);
 		} else {
+			if (OP1_TYPE == IS_CV) {
+				/* Keep name alive in case an error handler tries to free it. */
+				zend_string_addref(name);
+			}
 			zend_error(E_WARNING, "Undefined %svariable $%s",
 				(opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), ZSTR_VAL(name));
 			if (type == BP_VAR_RW && !EG(exception)) {
@@ -1755,6 +1762,9 @@
 			} else {
 				retval = &EG(uninitialized_zval);
 			}
+			if (OP1_TYPE == IS_CV) {
+				zend_string_release(name);
+			}
 		}
 	/* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
 	} else if (Z_TYPE_P(retval) == IS_INDIRECT) {
@@ -1837,7 +1847,7 @@
 
 	SAVE_OPLINE();
 
-	if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
+	if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
 		ZEND_ASSERT(EG(exception) || (type == BP_VAR_IS));
 		prop = &EG(uninitialized_zval);
 	}
@@ -1998,9 +2008,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
+		if ((OP1_TYPE & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_DISPATCH_TO_HELPER(zend_use_tmp_in_write_context_helper);
-        }
+		}
 		ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_DIM_W);
 	} else {
 		if (OP2_TYPE == IS_UNUSED) {
@@ -2036,7 +2046,7 @@
 
 	if (OP1_TYPE == IS_CONST ||
 	    (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -2083,11 +2093,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
 									ZEND_VM_C_GOTO(fetch_obj_r_copy);
@@ -2119,10 +2128,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -2157,7 +2176,7 @@
 	zend_fetch_property_address(
 		result, container, OP1_TYPE, property, OP2_TYPE,
 		((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
 	FREE_OP2();
 	if (OP1_TYPE == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -2174,7 +2193,7 @@
 	container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
 	property = GET_OP2_ZVAL_PTR(BP_VAR_R);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
 	FREE_OP2();
 	if (OP1_TYPE == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -2239,11 +2258,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) {
 									ZEND_VM_C_GOTO(fetch_obj_is_copy);
@@ -2321,7 +2339,7 @@
 	container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
 	property = GET_OP2_ZVAL_PTR(BP_VAR_R);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
 	FREE_OP2();
 	if (OP1_TYPE == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -2370,6 +2388,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
@@ -2391,7 +2410,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -2400,11 +2418,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						ZEND_VM_C_GOTO(free_and_exit_assign_obj);
 					} else {
 ZEND_VM_C_LABEL(fast_assign_obj):
-						value = zend_assign_to_variable(property_val, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -2426,7 +2444,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -2483,13 +2501,16 @@
 	}
 
 ZEND_VM_C_LABEL(free_and_exit_assign_obj):
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	FREE_OP_DATA();
 ZEND_VM_C_LABEL(exit_assign_obj):
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	FREE_OP2();
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	/* assign_obj has two opcodes! */
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
@@ -2500,6 +2521,7 @@
 	USE_OPLINE
 	zval *prop, *value;
 	zend_property_info *prop_info;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 
@@ -2512,10 +2534,10 @@
 	value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
 
 	if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) {
-		value = zend_assign_to_typed_prop(prop_info, prop, value EXECUTE_DATA_CC);
+		value = zend_assign_to_typed_prop(prop_info, prop, value, &garbage EXECUTE_DATA_CC);
 		FREE_OP_DATA();
 	} else {
-		value = zend_assign_to_variable(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES());
+		value = zend_assign_to_variable_ex(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES(), &garbage);
 	}
 
 	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -2522,6 +2544,10 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), value);
 	}
 
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
+
 	/* assign_static_prop has two opcodes! */
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
@@ -2533,6 +2559,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
@@ -2588,11 +2615,14 @@
 				ZEND_VM_C_GOTO(assign_dim_error);
 			}
 			value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
-			value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -2644,7 +2674,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -2670,7 +2700,7 @@
 	if (OP2_TYPE != IS_UNUSED) {
 		FREE_OP2();
 	}
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	/* assign_dim has two opcodes! */
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
@@ -2685,11 +2715,20 @@
 	value = GET_OP2_ZVAL_PTR(BP_VAR_R);
 	variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
 
-	value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (!ZEND_VM_SPEC || UNEXPECTED(RETURN_VALUE_USED(opline))) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, OP2_TYPE, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE, EX_USES_STRICT_TYPES());
 	}
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
 
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -2700,6 +2739,7 @@
 	USE_OPLINE
 	zval *variable_ptr;
 	zval *value_ptr;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	value_ptr = GET_OP2_ZVAL_PTR_PTR(BP_VAR_W);
@@ -2715,9 +2755,9 @@
 			   UNEXPECTED(!Z_ISREF_P(value_ptr))) {
 
 		variable_ptr = zend_wrong_assign_to_variable_reference(
-			variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+			variable_ptr, value_ptr, &garbage OPLINE_CC EXECUTE_DATA_CC);
 	} else {
-		zend_assign_to_variable_reference(variable_ptr, value_ptr);
+		zend_assign_to_variable_reference(variable_ptr, value_ptr, &garbage);
 	}
 
 	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -2724,8 +2764,12 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
 	}
 
-	FREE_OP2_VAR_PTR();
-	FREE_OP1_VAR_PTR();
+	if (garbage) {
+		GC_DTOR(garbage);
+	}
+
+	FREE_OP2();
+	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -2759,9 +2803,9 @@
 		zend_assign_to_property_reference(container, OP1_TYPE, property, OP2_TYPE, value_ptr OPLINE_CC EXECUTE_DATA_CC);
 	}
 
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	FREE_OP2();
-	FREE_OP_DATA_VAR_PTR();
+	FREE_OP_DATA();
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -2771,6 +2815,7 @@
 	USE_OPLINE
 	zval *prop, *value_ptr;
 	zend_property_info *prop_info;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 
@@ -2783,13 +2828,13 @@
 	value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W);
 
 	if (OP_DATA_TYPE == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) {
-		if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
+		if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, &garbage OPLINE_CC EXECUTE_DATA_CC))) {
 			prop = &EG(uninitialized_zval);
 		}
 	} else if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) {
-		prop = zend_assign_to_typed_property_reference(prop_info, prop, value_ptr EXECUTE_DATA_CC);
+		prop = zend_assign_to_typed_property_reference(prop_info, prop, value_ptr, &garbage EXECUTE_DATA_CC);
 	} else {
-		zend_assign_to_variable_reference(prop, value_ptr);
+		zend_assign_to_variable_reference(prop, value_ptr, &garbage);
 	}
 
 	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -2796,7 +2841,11 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), prop);
 	}
 
-	FREE_OP_DATA_VAR_PTR();
+	if (garbage) {
+		GC_DTOR(garbage);
+	}
+
+	FREE_OP_DATA();
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -2865,18 +2914,24 @@
 		LOAD_NEXT_OPLINE();
 		ZEND_VM_LEAVE();
 	} else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) {
-		zend_detach_symbol_table(execute_data);
+		if (EX(func)->op_array.last_var > 0) {
+			zend_detach_symbol_table(execute_data);
+			call_info |= ZEND_CALL_NEEDS_REATTACH;
+		}
 		zend_destroy_static_vars(&EX(func)->op_array);
 		destroy_op_array(&EX(func)->op_array);
 		efree_size(EX(func), sizeof(zend_op_array));
-#ifdef ZEND_PREFER_RELOAD
-		call_info = EX_CALL_INFO();
-#endif
 		old_execute_data = execute_data;
 		execute_data = EG(current_execute_data) = EX(prev_execute_data);
 		zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
 
-		zend_attach_symbol_table(execute_data);
+		if (call_info & ZEND_CALL_NEEDS_REATTACH) {
+			if (EX(func)->op_array.last_var > 0) {
+				zend_attach_symbol_table(execute_data);
+			} else {
+				ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_NEEDS_REATTACH);
+			}
+		}
 		if (UNEXPECTED(EG(exception) != NULL)) {
 			zend_rethrow_exception(execute_data);
 			HANDLE_EXCEPTION_LEAVE();
@@ -2907,16 +2962,25 @@
 		} else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
 			zend_array *symbol_table = EX(symbol_table);
 
-			zend_detach_symbol_table(execute_data);
-			old_execute_data = EX(prev_execute_data);
-			while (old_execute_data) {
-				if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) {
-					if (old_execute_data->symbol_table == symbol_table) {
-						zend_attach_symbol_table(old_execute_data);
+			if (EX(func)->op_array.last_var > 0) {
+				zend_detach_symbol_table(execute_data);
+				call_info |= ZEND_CALL_NEEDS_REATTACH;
+			}
+			if (call_info & ZEND_CALL_NEEDS_REATTACH) {
+				old_execute_data = EX(prev_execute_data);
+				while (old_execute_data) {
+					if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) {
+						if (old_execute_data->symbol_table == symbol_table) {
+							if (old_execute_data->func->op_array.last_var > 0) {
+								zend_attach_symbol_table(old_execute_data);
+							} else {
+								ZEND_ADD_CALL_FLAG(old_execute_data, ZEND_CALL_NEEDS_REATTACH);
+							}
+						}
+						break;
 					}
-					break;
+					old_execute_data = old_execute_data->prev_execute_data;
 				}
-				old_execute_data = old_execute_data->prev_execute_data;
 			}
 			EG(current_execute_data) = EX(prev_execute_data);
 			ZEND_VM_RETURN();
@@ -2935,7 +2999,7 @@
 {
 	USE_OPLINE
 	zval *val;
-	zend_uchar op1_type;
+	uint8_t op1_type;
 
 	val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
 
@@ -2969,7 +3033,7 @@
 {
 	USE_OPLINE
 	zval *val;
-	zend_uchar op1_type;
+	uint8_t op1_type;
 
 	val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
 
@@ -2999,41 +3063,6 @@
 	ZEND_VM_JMP(opline);
 }
 
-ZEND_VM_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, JMP_ADDR, JMP_ADDR)
-{
-	USE_OPLINE
-	zval *val;
-	zend_uchar op1_type;
-
-	val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
-
-	if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
-		ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
-		ZEND_VM_CONTINUE();
-	} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
-		if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
-			SAVE_OPLINE();
-			ZVAL_UNDEFINED_OP1();
-			if (UNEXPECTED(EG(exception))) {
-				HANDLE_EXCEPTION();
-			}
-		}
-		ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
-	}
-
-	SAVE_OPLINE();
-	op1_type = OP1_TYPE;
-	if (i_zend_is_true(val)) {
-		opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value);
-	} else {
-		opline = OP_JMP_ADDR(opline, opline->op2);
-	}
-	if (op1_type & (IS_TMP_VAR|IS_VAR)) {
-		zval_ptr_dtor_nogc(val);
-	}
-	ZEND_VM_JMP(opline);
-}
-
 ZEND_VM_COLD_CONST_HANDLER(46, ZEND_JMPZ_EX, CONST|TMPVAR|CV, JMP_ADDR)
 {
 	USE_OPLINE
@@ -3153,6 +3182,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (OP1_TYPE != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_CV) {
@@ -3174,10 +3204,11 @@
 			}
 		} else if (OP1_TYPE != IS_CONST && OP1_TYPE != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (OP2_TYPE & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -3186,6 +3217,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -3246,6 +3278,8 @@
 		str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 		memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 		memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+
+		ZSTR_COPY_CONCAT_PROPERTIES_BOTH(str, op1_str, op2_str);
 		ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 		if (OP1_TYPE != IS_CONST) {
 			zend_string_release_ex(op1_str, 0);
@@ -3335,8 +3369,6 @@
 	zend_string **rope;
 	zval *var, *ret;
 	uint32_t i;
-	size_t len = 0;
-	char *target;
 
 	rope = (zend_string**)EX_VAR(opline->op1.var);
 	if (OP2_TYPE == IS_CONST) {
@@ -3369,12 +3401,18 @@
 			}
 		}
 	}
+
+	size_t len = 0;
+	uint32_t flags = ZSTR_COPYABLE_CONCAT_PROPERTIES;
 	for (i = 0; i <= opline->extended_value; i++) {
+		flags &= ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(rope[i]);
 		len += ZSTR_LEN(rope[i]);
 	}
 	ret = EX_VAR(opline->result.var);
 	ZVAL_STR(ret, zend_string_alloc(len, 0));
-	target = Z_STRVAL_P(ret);
+	GC_ADD_FLAGS(Z_STR_P(ret), flags);
+
+	char *target = Z_STRVAL_P(ret);
 	for (i = 0; i <= opline->extended_value; i++) {
 		memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
 		target += ZSTR_LEN(rope[i]);
@@ -3516,9 +3554,9 @@
 
 	if (OP2_TYPE == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if (OP2_TYPE == IS_CONST) {
 			function_name = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -3812,6 +3850,16 @@
 	function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
 	if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
 		ZEND_ASSERT(!error);
+
+		/* Deprecation can be emitted from zend_is_callable_ex(), which can
+		 * invoke a user error handler and throw an exception.
+		 * For the CONST and CV case we reuse the same exception block below
+		 * to make sure we don't increase VM size too much. */
+		if (!(OP2_TYPE & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) {
+			FREE_OP2();
+			HANDLE_EXCEPTION();
+		}
+
 		func = fcc.function_handler;
 		object_or_called_scope = fcc.called_scope;
 		if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
@@ -3904,9 +3952,7 @@
 	if (UNEXPECTED(fbc == NULL)) {
 		fname = (zval*)RT_CONSTANT(opline, opline->op2);
 		func = zend_hash_find_known_hash(EG(function_table), Z_STR_P(fname));
-		if (UNEXPECTED(func == NULL)) {
-			ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper);
-		}
+		ZEND_ASSERT(func != NULL && "Function existence must be checked at compile time");
 		fbc = Z_FUNC_P(func);
 		if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
 			init_func_run_time_cache(&fbc->op_array);
@@ -3923,7 +3969,7 @@
 	ZEND_VM_NEXT_OPCODE();
 }
 
-ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL))
+ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
 {
 	USE_OPLINE
 	zend_execute_data *call = EX(call);
@@ -3944,6 +3990,7 @@
 	ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
 	ZVAL_NULL(ret);
 
+	ZEND_OBSERVER_FCALL_BEGIN(call);
 	fbc->internal_function.handler(call, ret);
 
 #if ZEND_DEBUG
@@ -3958,6 +4005,7 @@
 		zend_verify_internal_func_info(call->func, ret);
 	}
 #endif
+	ZEND_OBSERVER_FCALL_END(call, EG(exception) ? NULL : ret);
 
 	EG(current_execute_data) = execute_data;
 	zend_vm_stack_free_args(call);
@@ -4063,6 +4111,7 @@
 		ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
 		ZVAL_NULL(ret);
 
+		ZEND_OBSERVER_FCALL_BEGIN(call);
 		fbc->internal_function.handler(call, ret);
 
 #if ZEND_DEBUG
@@ -4077,6 +4126,7 @@
 			zend_verify_internal_func_info(call->func, ret);
 		}
 #endif
+		ZEND_OBSERVER_FCALL_END(call, EG(exception) ? NULL : ret);
 
 		EG(current_execute_data) = execute_data;
 
@@ -4168,6 +4218,7 @@
 		ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
 		ZVAL_NULL(ret);
 
+		ZEND_OBSERVER_FCALL_BEGIN(call);
 		if (!zend_execute_internal) {
 			/* saves one function call if zend_execute_internal is not used */
 			fbc->internal_function.handler(call, ret);
@@ -4176,7 +4227,7 @@
 		}
 
 #if ZEND_DEBUG
-		if (!EG(exception) && call->func) {
+		if (!EG(exception) && call->func && !(call->func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
@@ -4187,6 +4238,7 @@
 			zend_verify_internal_func_info(call->func, ret);
 		}
 #endif
+		ZEND_OBSERVER_FCALL_END(call, EG(exception) ? NULL : ret);
 
 		EG(current_execute_data) = execute_data;
 
@@ -4411,7 +4463,7 @@
 				if (return_value) {
 					ZVAL_NEW_REF(return_value, retval_ptr);
 				} else {
-					FREE_OP1_VAR_PTR();
+					FREE_OP1();
 				}
 				break;
 			}
@@ -4426,7 +4478,7 @@
 			ZVAL_REF(return_value, Z_REF_P(retval_ptr));
 		}
 
-		FREE_OP1_VAR_PTR();
+		FREE_OP1();
 	} while (0);
 
 	ZEND_OBSERVER_FCALL_END(execute_data, return_value);
@@ -4549,6 +4601,8 @@
 
 	ZEND_OBSERVER_FCALL_END(generator->execute_data, &generator->retval);
 
+	EG(current_execute_data) = EX(prev_execute_data);
+
 	/* Close the generator to free up resources */
 	zend_generator_close(generator, 1);
 
@@ -4892,7 +4946,7 @@
 	}
 	ZVAL_REF(arg, Z_REF_P(varptr));
 
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE();
 }
 
@@ -4929,7 +4983,7 @@
 		}
 		ZVAL_REF(arg, Z_REF_P(varptr));
 
-		FREE_OP1_VAR_PTR();
+		FREE_OP1();
 		ZEND_VM_NEXT_OPCODE();
 	}
 
@@ -5022,7 +5076,7 @@
 		}
 		ZVAL_REF(arg, Z_REF_P(varptr));
 
-		FREE_OP1_VAR_PTR();
+		FREE_OP1();
 		ZEND_VM_NEXT_OPCODE();
 	}
 
@@ -5273,7 +5327,7 @@
 				ZEND_VM_C_GOTO(send_array);
 			}
 		}
-		zend_type_error("call_user_func_array(): Argument #2 ($args) must be of type array, %s given", zend_zval_type_name(args));
+		zend_type_error("call_user_func_array(): Argument #2 ($args) must be of type array, %s given", zend_zval_value_name(args));
 		FREE_OP2();
 		FREE_OP1();
 		HANDLE_EXCEPTION();
@@ -5299,7 +5353,7 @@
 					|| !zend_parse_arg_long_weak(op2, &len, /* arg_num */ 3)) {
 				zend_type_error(
 					"array_slice(): Argument #3 ($length) must be of type ?int, %s given",
-					zend_zval_type_name(op2));
+					zend_zval_value_name(op2));
 				FREE_OP2();
 				FREE_OP1();
 				HANDLE_EXCEPTION();
@@ -5520,12 +5574,13 @@
 			} else {
 				SAVE_OPLINE();
 				ZVAL_COPY(param, default_value);
-				if (UNEXPECTED(zval_update_constant_ex(param, EX(func)->op_array.scope) != SUCCESS)) {
+				zend_ast_evaluate_ctx ctx = {0};
+				if (UNEXPECTED(zval_update_constant_with_ctx(param, EX(func)->op_array.scope, &ctx) != SUCCESS)) {
 					zval_ptr_dtor_nogc(param);
 					ZVAL_UNDEF(param);
 					HANDLE_EXCEPTION();
 				}
-				if (!Z_REFCOUNTED_P(param)) {
+				if (!Z_REFCOUNTED_P(param) && !ctx.had_side_effects) {
 					ZVAL_COPY_VALUE(cache_val, param);
 				}
 			}
@@ -5597,7 +5652,7 @@
 		zend_arg_info *arg_info = &EX(func)->common.arg_info[EX(func)->common.num_args];
 		if (ZEND_TYPE_IS_SET(arg_info->type)) {
 			SEPARATE_ARRAY(params);
-			ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
+			ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
 				if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_info, arg_num, param, CACHE_ADDR(opline->extended_value)))) {
 					HANDLE_EXCEPTION();
 				}
@@ -5609,7 +5664,7 @@
 			ZVAL_ARR(params, EX(extra_named_params));
 		} else {
 			SEPARATE_ARRAY(params);
-			ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
+			ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
 				Z_TRY_ADDREF_P(param);
 				zend_hash_add_new(Z_ARRVAL_P(params), name, param);
 			} ZEND_HASH_FOREACH_END();
@@ -5799,7 +5854,7 @@
 	do {
 		if (OP1_TYPE == IS_CONST ||
 		    (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
-		    if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
+			if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
 				obj = Z_REFVAL_P(obj);
 				if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
 					break;
@@ -5864,67 +5919,122 @@
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
-ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CONST, CACHE_SLOT)
+ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED|CLASS_FETCH, CONST|TMPVARCV, CACHE_SLOT)
 {
 	zend_class_entry *ce, *scope;
 	zend_class_constant *c;
-	zval *value, *zv;
+	zval *value, *zv, *constant_zv;
+	zend_string *constant_name;
 	USE_OPLINE
 
 	SAVE_OPLINE();
 
 	do {
-		if (OP1_TYPE == IS_CONST) {
+		if (OP1_TYPE == IS_CONST && OP2_TYPE == IS_CONST) {
 			if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
 				value = CACHED_PTR(opline->extended_value + sizeof(void*));
 				break;
-			} else if (EXPECTED(CACHED_PTR(opline->extended_value))) {
+			}
+		}
+		if (OP1_TYPE == IS_CONST) {
+			if (EXPECTED(CACHED_PTR(opline->extended_value))) {
 				ce = CACHED_PTR(opline->extended_value);
 			} else {
 				ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
 				if (UNEXPECTED(ce == NULL)) {
 					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP2();
 					HANDLE_EXCEPTION();
 				}
+				CACHE_PTR(opline->extended_value, ce);
 			}
+		} else if (OP1_TYPE == IS_UNUSED) {
+			ce = zend_fetch_class(NULL, opline->op1.num);
+			if (UNEXPECTED(ce == NULL)) {
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+				FREE_OP2();
+				HANDLE_EXCEPTION();
+			}
 		} else {
-			if (OP1_TYPE == IS_UNUSED) {
-				ce = zend_fetch_class(NULL, opline->op1.num);
-				if (UNEXPECTED(ce == NULL)) {
-					ZVAL_UNDEF(EX_VAR(opline->result.var));
-					HANDLE_EXCEPTION();
-				}
-			} else {
-				ce = Z_CE_P(EX_VAR(opline->op1.var));
-			}
-			if (EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
-				value = CACHED_PTR(opline->extended_value + sizeof(void*));
-				break;
-			}
+			ce = Z_CE_P(EX_VAR(opline->op1.var));
 		}
+		if (OP1_TYPE != IS_CONST
+			&& OP2_TYPE == IS_CONST
+			&& EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
+			value = CACHED_PTR(opline->extended_value + sizeof(void*));
+			break;
+		}
 
-		zv = zend_hash_find_known_hash(CE_CONSTANTS_TABLE(ce), Z_STR_P(RT_CONSTANT(opline, opline->op2)));
+		constant_zv = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
+		if (UNEXPECTED(Z_TYPE_P(constant_zv) != IS_STRING)) {
+			zend_invalid_class_constant_type_error(Z_TYPE_P(constant_zv));
+			ZVAL_UNDEF(EX_VAR(opline->result.var));
+			FREE_OP2();
+			HANDLE_EXCEPTION();
+		}
+		constant_name = Z_STR_P(constant_zv);
+		/* Magic 'class' for constant OP2 is caught at compile-time */
+		if (OP2_TYPE != IS_CONST && UNEXPECTED(zend_string_equals_literal_ci(constant_name, "class"))) {
+			ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
+			FREE_OP2();
+			ZEND_VM_NEXT_OPCODE();
+		}
+		zv = OP2_TYPE == IS_CONST
+			? zend_hash_find_known_hash(CE_CONSTANTS_TABLE(ce), constant_name)
+			: zend_hash_find(CE_CONSTANTS_TABLE(ce), constant_name);
+
 		if (EXPECTED(zv != NULL)) {
 			c = Z_PTR_P(zv);
 			scope = EX(func)->op_array.scope;
 			if (!zend_verify_const_access(c, scope)) {
-				zend_throw_error(NULL, "Cannot access %s constant %s::%s", zend_visibility_string(ZEND_CLASS_CONST_FLAGS(c)), ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
+				zend_throw_error(NULL, "Cannot access %s constant %s::%s", zend_visibility_string(ZEND_CLASS_CONST_FLAGS(c)), ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
+				FREE_OP2();
 				HANDLE_EXCEPTION();
 			}
+
+			if (ce->ce_flags & ZEND_ACC_TRAIT) {
+				zend_throw_error(NULL, "Cannot access trait constant %s::%s directly", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+				FREE_OP2();
+				HANDLE_EXCEPTION();
+			}
+
+			bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
+			if (UNEXPECTED(is_constant_deprecated)) {
+				zend_error(E_DEPRECATED, "Constant %s::%s is deprecated", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+
+				if (EG(exception)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP2();
+					HANDLE_EXCEPTION();
+				}
+			}
+
 			value = &c->value;
+			// Enums require loading of all class constants to build the backed enum table
+			if (ce->ce_flags & ZEND_ACC_ENUM && ce->enum_backing_type != IS_UNDEF && ce->type == ZEND_USER_CLASS && !(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
+				if (UNEXPECTED(zend_update_class_constants(ce) == FAILURE)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP2();
+					HANDLE_EXCEPTION();
+				}
+			}
 			if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
-				zval_update_constant_ex(value, c->ce);
-				if (UNEXPECTED(EG(exception) != NULL)) {
+				if (UNEXPECTED(zend_update_class_constant(c, constant_name, c->ce) != SUCCESS)) {
 					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP2();
 					HANDLE_EXCEPTION();
 				}
 			}
-			CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
+			if (OP2_TYPE == IS_CONST && !is_constant_deprecated) {
+				CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
+			}
 		} else {
 			zend_throw_error(NULL, "Undefined constant %s::%s",
-				ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
+				ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
+			FREE_OP2();
 			HANDLE_EXCEPTION();
 		}
 	} while (0);
@@ -5931,6 +6041,7 @@
 
 	ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), value);
 
+	FREE_OP2();
 	ZEND_VM_NEXT_OPCODE();
 }
 
@@ -5948,7 +6059,7 @@
 		} else {
 			ZVAL_MAKE_REF_EX(expr_ptr, 2);
 		}
-		FREE_OP1_VAR_PTR();
+		FREE_OP1();
 	} else {
 		expr_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
 		if (OP1_TYPE == IS_TMP_VAR) {
@@ -6017,7 +6128,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			ZEND_VM_C_GOTO(str_index);
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 		FREE_OP2();
@@ -6044,23 +6155,39 @@
 	if (EXPECTED(Z_TYPE_P(op1) == IS_ARRAY)) {
 		HashTable *ht = Z_ARRVAL_P(op1);
 		zval *val;
-		zend_string *key;
 
-		ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
-			if (Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1) {
-				val = Z_REFVAL_P(val);
-			}
-			Z_TRY_ADDREF_P(val);
-			if (key) {
-				zend_hash_update(result_ht, key, val);
-			} else {
-				if (!zend_hash_next_index_insert(result_ht, val)) {
-					zend_cannot_add_element();
-					zval_ptr_dtor_nogc(val);
-					break;
+		if (HT_IS_PACKED(ht) && (zend_hash_num_elements(result_ht) == 0 || HT_IS_PACKED(result_ht))) {
+			zend_hash_extend(result_ht, result_ht->nNumUsed + zend_hash_num_elements(ht), 1);
+			ZEND_HASH_FILL_PACKED(result_ht) {
+				ZEND_HASH_PACKED_FOREACH_VAL(ht, val) {
+					if (UNEXPECTED(Z_ISREF_P(val)) &&
+						UNEXPECTED(Z_REFCOUNT_P(val) == 1)) {
+						val = Z_REFVAL_P(val);
+					}
+					Z_TRY_ADDREF_P(val);
+					ZEND_HASH_FILL_ADD(val);
+				} ZEND_HASH_FOREACH_END();
+			} ZEND_HASH_FILL_END();
+		} else {
+			zend_string *key;
+
+			ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+				if (UNEXPECTED(Z_ISREF_P(val)) &&
+					UNEXPECTED(Z_REFCOUNT_P(val) == 1)) {
+					val = Z_REFVAL_P(val);
 				}
-			}
-		} ZEND_HASH_FOREACH_END();
+				Z_TRY_ADDREF_P(val);
+				if (key) {
+					zend_hash_update(result_ht, key, val);
+				} else {
+					if (!zend_hash_next_index_insert(result_ht, val)) {
+						zend_cannot_add_element();
+						zval_ptr_dtor_nogc(val);
+						break;
+					}
+				}
+			} ZEND_HASH_FOREACH_END();
+		}
 	} else if (EXPECTED(Z_TYPE_P(op1) == IS_OBJECT)) {
 		zend_class_entry *ce = Z_OBJCE_P(op1);
 		zend_object_iterator *iter;
@@ -6285,10 +6412,25 @@
 		if (RETURN_VALUE_USED(opline)) {
 			ZVAL_TRUE(EX_VAR(opline->result.var));
 		}
-	} else if (EXPECTED(new_op_array != NULL)) {
+	} else if (UNEXPECTED(new_op_array == NULL)) {
+		if (RETURN_VALUE_USED(opline)) {
+			ZVAL_FALSE(EX_VAR(opline->result.var));
+		}
+	} else if (new_op_array->last == 1
+			&& new_op_array->opcodes[0].opcode == ZEND_RETURN
+			&& new_op_array->opcodes[0].op1_type == IS_CONST
+			&& EXPECTED(zend_execute_ex == execute_ex)) {
+		if (RETURN_VALUE_USED(opline)) {
+			const zend_op *op = new_op_array->opcodes;
+
+			ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1));
+		}
+		zend_destroy_static_vars(new_op_array);
+		destroy_op_array(new_op_array);
+		efree_size(new_op_array, sizeof(zend_op_array));
+	} else {
 		zval *return_value = NULL;
 		zend_execute_data *call;
-
 		if (RETURN_VALUE_USED(opline)) {
 			return_value = EX_VAR(opline->result.var);
 		}
@@ -6296,7 +6438,7 @@
 		new_op_array->scope = EX(func)->op_array.scope;
 
 		call = zend_vm_stack_push_call_frame(
-		    (Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
+			(Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
 			(zend_function*)new_op_array, 0,
 			Z_PTR(EX(This)));
 
@@ -6327,8 +6469,6 @@
 			UNDEF_RESULT();
 			HANDLE_EXCEPTION();
 		}
-	} else if (RETURN_VALUE_USED(opline)) {
-		ZVAL_FALSE(EX_VAR(opline->result.var));
 	}
 	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE();
@@ -6344,11 +6484,7 @@
 
 		ZVAL_UNDEF(var);
 		SAVE_OPLINE();
-		if (!GC_DELREF(garbage)) {
-			rc_dtor_func(garbage);
-		} else {
-			gc_check_possible_root(garbage);
-		}
+		GC_DTOR(garbage);
 		ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 	} else {
 		ZVAL_UNDEF(var);
@@ -6504,7 +6640,7 @@
 				key = ZSTR_EMPTY_ALLOC();
 				ZEND_VM_C_GOTO(str_index_dim);
 			} else {
-				zend_type_error("Illegal offset type in unset");
+				zend_illegal_array_offset_unset(offset);
 			}
 			break;
 		} else if (Z_ISREF_P(container)) {
@@ -6534,7 +6670,7 @@
 	} while (0);
 
 	FREE_OP2();
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -6579,7 +6715,7 @@
 	} while (0);
 
 	FREE_OP2();
-	FREE_OP1_VAR_PTR();
+	FREE_OP1();
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -6644,7 +6780,7 @@
 			}
 		}
 	} else {
-		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
+		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array_ptr));
 		ZVAL_UNDEF(EX_VAR(opline->result.var));
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
 		FREE_OP1();
@@ -6688,9 +6824,7 @@
 		}
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
 
-		if (OP1_TYPE == IS_VAR) {
-			FREE_OP1_VAR_PTR();
-		}
+		FREE_OP1_IF_VAR();
 		ZEND_VM_NEXT_OPCODE();
 	} else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@@ -6717,21 +6851,16 @@
 			properties = Z_OBJPROP_P(array_ptr);
 			if (zend_hash_num_elements(properties) == 0) {
 				Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t) -1;
-				FREE_OP1_VAR_PTR();
+				FREE_OP1_IF_VAR();
 				ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
 			}
 
 			Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(properties, 0);
-			FREE_OP1_VAR_PTR();
+			FREE_OP1_IF_VAR();
 			ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 		} else {
 			bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
-
-			if (OP1_TYPE == IS_VAR) {
-				FREE_OP1_VAR_PTR();
-			} else {
-				FREE_OP1();
-			}
+			FREE_OP1();
 			if (UNEXPECTED(EG(exception))) {
 				HANDLE_EXCEPTION();
 			} else if (is_empty) {
@@ -6741,14 +6870,10 @@
 			}
 		}
 	} else {
-		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
+		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array_ptr));
 		ZVAL_UNDEF(EX_VAR(opline->result.var));
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
-		if (OP1_TYPE == IS_VAR) {
-			FREE_OP1_VAR_PTR();
-		} else {
-			FREE_OP1();
-		}
+		FREE_OP1();
 		ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
 	}
 }
@@ -6879,7 +7004,6 @@
 	uint32_t value_type;
 	HashTable *fe_ht;
 	HashPosition pos;
-	Bucket *p;
 
 	array = EX_VAR(opline->op1.var);
 	if (UNEXPECTED(Z_TYPE_P(array) != IS_ARRAY)) {
@@ -6887,31 +7011,54 @@
 	}
 	fe_ht = Z_ARRVAL_P(array);
 	pos = Z_FE_POS_P(array);
-	p = fe_ht->arData + pos;
-	while (1) {
-		if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
-			/* reached end of iteration */
-			ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
-			ZEND_VM_CONTINUE();
+	if (HT_IS_PACKED(fe_ht)) {
+		value = fe_ht->arPacked + pos;
+		while (1) {
+			if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+				/* reached end of iteration */
+				ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+				ZEND_VM_CONTINUE();
+			}
+			value_type = Z_TYPE_INFO_P(value);
+			ZEND_ASSERT(value_type != IS_INDIRECT);
+			if (EXPECTED(value_type != IS_UNDEF)) {
+				break;
+			}
+			pos++;
+			value++;
 		}
-		pos++;
-		value = &p->val;
-		value_type = Z_TYPE_INFO_P(value);
-		ZEND_ASSERT(value_type != IS_INDIRECT);
-		if (EXPECTED(value_type != IS_UNDEF)) {
-			break;
+		Z_FE_POS_P(array) = pos + 1;
+		if (RETURN_VALUE_USED(opline)) {
+			ZVAL_LONG(EX_VAR(opline->result.var), pos);
 		}
-		p++;
-	}
-	Z_FE_POS_P(array) = pos;
-	if (RETURN_VALUE_USED(opline)) {
-		if (!p->key) {
-			ZVAL_LONG(EX_VAR(opline->result.var), p->h);
-		} else {
-			ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+	} else {
+		Bucket *p;
+
+		p = fe_ht->arData + pos;
+		while (1) {
+			if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+				/* reached end of iteration */
+				ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+				ZEND_VM_CONTINUE();
+			}
+			pos++;
+			value = &p->val;
+			value_type = Z_TYPE_INFO_P(value);
+			ZEND_ASSERT(value_type != IS_INDIRECT);
+			if (EXPECTED(value_type != IS_UNDEF)) {
+				break;
+			}
+			p++;
 		}
+		Z_FE_POS_P(array) = pos;
+		if (RETURN_VALUE_USED(opline)) {
+			if (!p->key) {
+				ZVAL_LONG(EX_VAR(opline->result.var), p->h);
+			} else {
+				ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+			}
+		}
 	}
-
 	if (EXPECTED(OP2_TYPE == IS_CV)) {
 		zval *variable_ptr = EX_VAR(opline->op2.var);
 		SAVE_OPLINE();
@@ -6946,28 +7093,49 @@
 	if (EXPECTED(Z_TYPE_P(array) == IS_ARRAY)) {
 		pos = zend_hash_iterator_pos_ex(Z_FE_ITER_P(EX_VAR(opline->op1.var)), array);
 		fe_ht = Z_ARRVAL_P(array);
-		p = fe_ht->arData + pos;
-		while (1) {
-			if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
-				/* reached end of iteration */
-				ZEND_VM_C_GOTO(fe_fetch_w_exit);
+		if (HT_IS_PACKED(fe_ht)) {
+			value = fe_ht->arPacked + pos;
+			while (1) {
+				if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+					/* reached end of iteration */
+					ZEND_VM_C_GOTO(fe_fetch_w_exit);
+				}
+				value_type = Z_TYPE_INFO_P(value);
+				ZEND_ASSERT(value_type != IS_INDIRECT);
+				if (EXPECTED(value_type != IS_UNDEF)) {
+					break;
+				}
+				pos++;
+				value++;
 			}
-			pos++;
-			value = &p->val;
-			value_type = Z_TYPE_INFO_P(value);
-			ZEND_ASSERT(value_type != IS_INDIRECT);
-			if (EXPECTED(value_type != IS_UNDEF)) {
-				break;
+			EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos + 1;
+			if (RETURN_VALUE_USED(opline)) {
+				ZVAL_LONG(EX_VAR(opline->result.var), pos);
 			}
-			p++;
-		}
-		EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
-		if (RETURN_VALUE_USED(opline)) {
-			if (!p->key) {
-				ZVAL_LONG(EX_VAR(opline->result.var), p->h);
-			} else {
-				ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+		} else {
+			p = fe_ht->arData + pos;
+			while (1) {
+				if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+					/* reached end of iteration */
+					ZEND_VM_C_GOTO(fe_fetch_w_exit);
+				}
+				pos++;
+				value = &p->val;
+				value_type = Z_TYPE_INFO_P(value);
+				ZEND_ASSERT(value_type != IS_INDIRECT);
+				if (EXPECTED(value_type != IS_UNDEF)) {
+					break;
+				}
+				p++;
 			}
+			EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
+			if (RETURN_VALUE_USED(opline)) {
+				if (!p->key) {
+					ZVAL_LONG(EX_VAR(opline->result.var), p->h);
+				} else {
+					ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+				}
+			}
 		}
 	} else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) {
 		zend_object_iterator *iter;
@@ -7076,7 +7244,7 @@
 			value_type = Z_TYPE_INFO_P(value);
 		}
 	} else {
-		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array));
+		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array));
 		if (UNEXPECTED(EG(exception))) {
 			UNDEF_RESULT();
 			HANDLE_EXCEPTION();
@@ -7547,9 +7715,13 @@
 	}
 
 	result = EX_VAR(opline->result.var);
-	if (EXPECTED(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
+	uint32_t short_circuiting_type = opline->extended_value & ZEND_SHORT_CIRCUITING_CHAIN_MASK;
+	if (EXPECTED(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
 		ZVAL_NULL(result);
-		if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(val) == IS_UNDEF)) {
+		if (OP1_TYPE == IS_CV
+			&& UNEXPECTED(Z_TYPE_P(val) == IS_UNDEF)
+			&& (opline->extended_value & ZEND_JMP_NULL_BP_VAR_IS) == 0
+		) {
 			SAVE_OPLINE();
 			ZVAL_UNDEFINED_OP1();
 			if (UNEXPECTED(EG(exception) != NULL)) {
@@ -7556,10 +7728,10 @@
 				HANDLE_EXCEPTION();
 			}
 		}
-	} else if (opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
+	} else if (short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
 		ZVAL_FALSE(result);
 	} else {
-		ZEND_ASSERT(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EMPTY);
+		ZEND_ASSERT(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EMPTY);
 		ZVAL_TRUE(result);
 	}
 
@@ -7713,7 +7885,9 @@
 		EG(ticks_count) = 0;
 		if (zend_ticks_function) {
 			SAVE_OPLINE();
+			zend_fiber_switch_block();
 			zend_ticks_function(opline->extended_value);
+			zend_fiber_switch_unblock();
 			ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 		}
 	}
@@ -7822,7 +7996,12 @@
 			/* Chain potential exception from wrapping finally block */
 			if (Z_OBJ_P(fast_call)) {
 				if (ex) {
-					zend_exception_set_previous(ex, Z_OBJ_P(fast_call));
+					if (zend_is_unwind_exit(ex) || zend_is_graceful_exit(ex)) {
+						/* discard the previously thrown exception */
+						OBJ_RELEASE(Z_OBJ_P(fast_call));
+					} else {
+						zend_exception_set_previous(ex, Z_OBJ_P(fast_call));
+					}
 				} else {
 					ex = EG(exception) = Z_OBJ_P(fast_call);
 				}
@@ -7837,6 +8016,7 @@
 	cleanup_live_vars(execute_data, op_num, 0);
 	if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) {
 		zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
+		EG(current_execute_data) = EX(prev_execute_data);
 		zend_generator_close(generator, 1);
 		ZEND_VM_RETURN();
 	} else {
@@ -7851,6 +8031,12 @@
 ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
 {
 	const zend_op *throw_op = EG(opline_before_exception);
+
+	/* Exception was thrown before executing any op */
+	if (UNEXPECTED(!throw_op)) {
+		ZEND_VM_DISPATCH_TO_HELPER(zend_dispatch_try_catch_finally_helper, try_catch_offset, -1, op_num, 0);
+	}
+
 	uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
 	int i, current_try_catch_offset = -1;
 
@@ -7930,6 +8116,7 @@
 		case ZEND_USER_OPCODE_RETURN:
 			if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) {
 				zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
+				EG(current_execute_data) = EX(prev_execute_data);
 				zend_generator_close(generator, 1);
 				ZEND_VM_RETURN();
 			} else {
@@ -7942,7 +8129,7 @@
 		case ZEND_USER_OPCODE_DISPATCH:
 			ZEND_VM_DISPATCH(opline->opcode, opline);
 		default:
-			ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), opline);
+			ZEND_VM_DISPATCH((uint8_t)(ret & 0xff), opline);
 	}
 }
 
@@ -7967,7 +8154,7 @@
 		}
 	}
 	/* non persistent, case sensitive */
-	ZEND_CONSTANT_SET_FLAGS(&c, CONST_CS, PHP_USER_CONSTANT);
+	ZEND_CONSTANT_SET_FLAGS(&c, 0, PHP_USER_CONSTANT);
 	c.name = zend_string_copy(Z_STR_P(name));
 
 	if (zend_register_constant(&c) == FAILURE) {
@@ -7998,6 +8185,7 @@
 		called_scope = Z_CE(EX(This));
 		object = NULL;
 	}
+	SAVE_OPLINE();
 	zend_create_closure(EX_VAR(opline->result.var), func,
 		EX(func)->op_array.scope, called_scope, object);
 
@@ -8088,7 +8276,7 @@
 					ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
 				} while (0);
 
-				FREE_OP1_VAR_PTR();
+				FREE_OP1();
 			}
 		} else {
 			zval *value = GET_OP1_ZVAL_PTR(BP_VAR_R);
@@ -8101,7 +8289,7 @@
 				}
 			} else if (OP1_TYPE == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 				FREE_OP1_IF_VAR();
 			} else {
@@ -8335,11 +8523,10 @@
 	if (EXPECTED(idx < EG(symbol_table).nNumUsed * sizeof(Bucket))) {
 		Bucket *p = (Bucket*)((char*)EG(symbol_table).arData + idx);
 
-		if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-	        (EXPECTED(p->key == varname) ||
-	         (EXPECTED(p->h == ZSTR_H(varname)) &&
-	          EXPECTED(p->key != NULL) &&
-	          EXPECTED(zend_string_equal_content(p->key, varname))))) {
+		if (EXPECTED(p->key == varname) ||
+		    (EXPECTED(p->h == ZSTR_H(varname)) &&
+		     EXPECTED(p->key != NULL) &&
+		     EXPECTED(zend_string_equal_content(p->key, varname)))) {
 
 			value = (zval*)p; /* value = &p->val; */
 			ZEND_VM_C_GOTO(check_indirect);
@@ -8451,7 +8638,7 @@
 				zval_ptr_dtor(&tmp);
 			}
 			if (!EG(exception)) {
-				zend_type_error("strlen(): Argument #1 ($str) must be of type string, %s given", zend_zval_type_name(value));
+				zend_type_error("strlen(): Argument #1 ($string) must be of type string, %s given", zend_zval_value_name(value));
 			}
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
 		} while (0);
@@ -8546,7 +8733,7 @@
 		if (UNEXPECTED(Z_TYPE_P(op) != IS_OBJECT)) {
 			ZVAL_DEREF(op);
 			if (Z_TYPE_P(op) != IS_OBJECT) {
-				zend_type_error("Cannot use \"::class\" on value of type %s", zend_zval_type_name(op));
+				zend_type_error("Cannot use \"::class\" on %s", zend_zval_value_name(op));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
 				FREE_OP1();
 				HANDLE_EXCEPTION();
@@ -8685,6 +8872,7 @@
 		}
 
 		ZVAL_NULL(ret);
+		ZEND_OBSERVER_FCALL_BEGIN(call);
 		if (!zend_execute_internal) {
 			/* saves one function call if zend_execute_internal is not used */
 			fbc->internal_function.handler(call, ret);
@@ -8704,10 +8892,14 @@
 			zend_verify_internal_func_info(call->func, ret);
 		}
 #endif
+		ZEND_OBSERVER_FCALL_END(call, EG(exception) ? NULL : ret);
 
 		EG(current_execute_data) = call->prev_execute_data;
 
 		zend_vm_stack_free_args(call);
+		if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
+			zend_free_extra_named_params(call->extra_named_params);
+		}
 		if (ret == &retval) {
 			zval_ptr_dtor(ret);
 		}
@@ -8767,7 +8959,7 @@
 	ZEND_VM_NEXT_OPCODE();
 }
 
-ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, UNUSED, REF)
+ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, ANY, REF)
 {
 	USE_OPLINE
 	HashTable *ht;
@@ -8776,6 +8968,8 @@
 
 	variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
 
+	SAVE_OPLINE();
+
 	ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
 	if (!ht) {
 		ht = zend_array_dup(EX(func)->op_array.static_variables);
@@ -8785,20 +8979,19 @@
 
 	value = (zval*)((char*)ht->arData + (opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT|ZEND_BIND_EXPLICIT)));
 
-	SAVE_OPLINE();
 	if (opline->extended_value & ZEND_BIND_REF) {
-		if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
-			if (UNEXPECTED(zval_update_constant_ex(value, EX(func)->op_array.scope) != SUCCESS)) {
-				HANDLE_EXCEPTION();
-			}
-		}
-
 		i_zval_ptr_dtor(variable_ptr);
 		if (UNEXPECTED(!Z_ISREF_P(value))) {
 			zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
 			GC_SET_REFCOUNT(ref, 2);
 			GC_TYPE_INFO(ref) = GC_REFERENCE;
-			ZVAL_COPY_VALUE(&ref->val, value);
+			if (OP2_TYPE == IS_UNUSED) {
+				ZVAL_COPY_VALUE(&ref->val, value);
+			} else {
+				ZEND_ASSERT(!Z_REFCOUNTED_P(value));
+				ZVAL_COPY(&ref->val, GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R));
+				FREE_OP2();
+			}
 			ref->sources.ptr = NULL;
 			Z_REF_P(value) = ref;
 			Z_TYPE_INFO_P(value) = IS_REFERENCE_EX;
@@ -8806,6 +8999,9 @@
 		} else {
 			Z_ADDREF_P(value);
 			ZVAL_REF(variable_ptr, Z_REF_P(value));
+			if (OP2_TYPE != IS_UNUSED) {
+				FREE_OP2();
+			}
 		}
 	} else {
 		i_zval_ptr_dtor(variable_ptr);
@@ -8815,6 +9011,34 @@
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
+ZEND_VM_HANDLER(203, ZEND_BIND_INIT_STATIC_OR_JMP, CV, JMP_ADDR)
+{
+	USE_OPLINE
+	HashTable *ht;
+	zval *value;
+	zval *variable_ptr;
+
+	variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
+
+	ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
+	if (!ht) {
+		ZEND_VM_NEXT_OPCODE();
+	}
+	ZEND_ASSERT(GC_REFCOUNT(ht) == 1);
+
+	value = (zval*)((char*)ht->arData + opline->extended_value);
+	if (Z_TYPE_EXTRA_P(value) & IS_STATIC_VAR_UNINITIALIZED) {
+		ZEND_VM_NEXT_OPCODE();
+	} else {
+		SAVE_OPLINE();
+		zval_ptr_dtor(variable_ptr);
+		ZEND_ASSERT(Z_TYPE_P(value) == IS_REFERENCE);
+		Z_ADDREF_P(value);
+		ZVAL_REF(variable_ptr, Z_REF_P(value));
+		ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 1);
+	}
+}
+
 ZEND_VM_HOT_HANDLER(184, ZEND_FETCH_THIS, UNUSED, UNUSED)
 {
 	USE_OPLINE
@@ -9069,7 +9293,7 @@
 		}
 
 		SAVE_OPLINE();
-		ZEND_HASH_FOREACH_STR_KEY(ht, key) {
+		ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) {
 			ZVAL_STR(&key_tmp, key);
 			if (zend_compare(op1, &key_tmp) == 0) {
 				FREE_OP1();
@@ -9112,7 +9336,8 @@
 			if (zend_class_implements_interface(zobj->ce, zend_ce_countable)) {
 				zval retval;
 
-				zend_call_method_with_0_params(zobj, NULL, NULL, "count", &retval);
+				zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT));
+				zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval);
 				count = zval_get_long(&retval);
 				zval_ptr_dtor(&retval);
 				break;
@@ -9126,7 +9351,7 @@
 			ZVAL_UNDEFINED_OP1();
 		}
 		count = 0;
-		zend_type_error("%s(): Argument #1 ($value) must be of type Countable|array, %s given", opline->extended_value ? "sizeof" : "count", zend_zval_type_name(op1));
+		zend_type_error("%s(): Argument #1 ($value) must be of type Countable|array, %s given", opline->extended_value ? "sizeof" : "count", zend_zval_value_name(op1));
 		break;
 	}
 
@@ -9135,18 +9360,37 @@
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
+ZEND_VM_TYPE_SPEC_HANDLER(ZEND_COUNT, (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) == MAY_BE_ARRAY, ZEND_COUNT_ARRAY, CV|TMPVAR, UNUSED)
+{
+	USE_OPLINE
+	zend_array *ht = Z_ARRVAL_P(GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R));
+	ZVAL_LONG(EX_VAR(opline->result.var), zend_hash_num_elements(ht));
+	if (OP1_TYPE & (IS_TMP_VAR|IS_VAR) && !(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) {
+		SAVE_OPLINE();
+		zend_array_destroy(ht);
+		if (EG(exception)) {
+			HANDLE_EXCEPTION();
+		}
+	}
+	ZEND_VM_NEXT_OPCODE();
+}
+
 ZEND_VM_COLD_CONST_HANDLER(191, ZEND_GET_CLASS, UNUSED|CONST|TMPVAR|CV, UNUSED)
 {
 	USE_OPLINE
 
 	if (OP1_TYPE == IS_UNUSED) {
+		SAVE_OPLINE();
 		if (UNEXPECTED(!EX(func)->common.scope)) {
-			SAVE_OPLINE();
 			zend_throw_error(NULL, "get_class() without arguments must be called from within a class");
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
 			HANDLE_EXCEPTION();
 		} else {
+			zend_error(E_DEPRECATED, "Calling get_class() without arguments is deprecated");
 			ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(func)->common.scope->name);
+			if (UNEXPECTED(EG(exception))) {
+				HANDLE_EXCEPTION();
+			}
 			ZEND_VM_NEXT_OPCODE();
 		}
 	} else {
@@ -9164,7 +9408,7 @@
 				if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
 					ZVAL_UNDEFINED_OP1();
 				}
-				zend_type_error("get_class(): Argument #1 ($object) must be of type object, %s given", zend_zval_type_name(op1));
+				zend_type_error("get_class(): Argument #1 ($object) must be of type object, %s given", zend_zval_value_name(op1));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
 			}
 			break;
@@ -9238,6 +9482,7 @@
 	}
 
 	if (result_size) {
+		SAVE_OPLINE();
 		uint32_t first_extra_arg = EX(func)->op_array.num_args;
 
 		ht = zend_new_array(result_size);
@@ -9293,6 +9538,7 @@
 	ZEND_VM_NEXT_OPCODE();
 }
 
+/* Contrary to what its name indicates, ZEND_COPY_TMP may receive and define references. */
 ZEND_VM_HANDLER(167, ZEND_COPY_TMP, TMPVAR, UNUSED)
 {
 	USE_OPLINE
@@ -9817,35 +10063,58 @@
 	uint32_t value_type;
 	HashTable *fe_ht;
 	HashPosition pos;
-	Bucket *p;
 
 	array = EX_VAR(opline->op1.var);
 	SAVE_OPLINE();
 	fe_ht = Z_ARRVAL_P(array);
 	pos = Z_FE_POS_P(array);
-	p = fe_ht->arData + pos;
-	while (1) {
-		if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
-			/* reached end of iteration */
-			ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
-			ZEND_VM_CONTINUE();
+	if (HT_IS_PACKED(fe_ht)) {
+		value = fe_ht->arPacked + pos;
+		while (1) {
+			if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+				/* reached end of iteration */
+				ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+				ZEND_VM_CONTINUE();
+			}
+			value_type = Z_TYPE_INFO_P(value);
+			ZEND_ASSERT(value_type != IS_INDIRECT);
+			if (EXPECTED(value_type != IS_UNDEF)) {
+				break;
+			}
+			pos++;
+			value++;
 		}
-		pos++;
-		value = &p->val;
-		value_type = Z_TYPE_INFO_P(value);
-		ZEND_ASSERT(value_type != IS_INDIRECT);
-		if (EXPECTED(value_type != IS_UNDEF)) {
-			break;
+		Z_FE_POS_P(array) = pos + 1;
+		if (RETURN_VALUE_USED(opline)) {
+			ZVAL_LONG(EX_VAR(opline->result.var), pos);
 		}
-		p++;
-	}
-	Z_FE_POS_P(array) = pos;
-	if (RETURN_VALUE_USED(opline)) {
-		if (!p->key) {
-			ZVAL_LONG(EX_VAR(opline->result.var), p->h);
-		} else {
-			ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+	} else {
+		Bucket *p;
+
+		p = fe_ht->arData + pos;
+		while (1) {
+			if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+				/* reached end of iteration */
+				ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+				ZEND_VM_CONTINUE();
+			}
+			pos++;
+			value = &p->val;
+			value_type = Z_TYPE_INFO_P(value);
+			ZEND_ASSERT(value_type != IS_INDIRECT);
+			if (EXPECTED(value_type != IS_UNDEF)) {
+				break;
+			}
+			p++;
 		}
+		Z_FE_POS_P(array) = pos;
+		if (RETURN_VALUE_USED(opline)) {
+			if (!p->key) {
+				ZVAL_LONG(EX_VAR(opline->result.var), p->h);
+			} else {
+				ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+			}
+		}
 	}
 
 	variable_ptr = EX_VAR(opline->op2.var);
@@ -9857,9 +10126,9 @@
 
 ZEND_VM_HELPER(zend_interrupt_helper, ANY, ANY)
 {
-	EG(vm_interrupt) = 0;
+	zend_atomic_bool_store_ex(&EG(vm_interrupt), false);
 	SAVE_OPLINE();
-	if (EG(timed_out)) {
+	if (zend_atomic_bool_load_ex(&EG(timed_out))) {
 		zend_timeout();
 	} else if (zend_interrupt_function) {
 		zend_interrupt_function(execute_data);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_execute.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_execute.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_execute.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -287,7 +287,7 @@
 	(user_opcode_handler_t)NULL
 };
 
-static zend_uchar zend_user_opcodes[256] = {0,
+static uint8_t zend_user_opcodes[256] = {0,
 	1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
 	17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
 	33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,
@@ -326,11 +326,11 @@
 static zend_op hybrid_halt_op;
 #endif
 #if (ZEND_VM_KIND != ZEND_VM_KIND_HYBRID) || !ZEND_VM_SPEC
-static const void *zend_vm_get_opcode_handler(zend_uchar opcode, const zend_op* op);
+static const void *zend_vm_get_opcode_handler(uint8_t opcode, const zend_op* op);
 #endif
 
 #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
-static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend_op* op);
+static const void *zend_vm_get_opcode_handler_func(uint8_t opcode, const zend_op* op);
 #else
 # define zend_vm_get_opcode_handler_func zend_vm_get_opcode_handler
 #endif
@@ -846,7 +846,7 @@
 
 	SAVE_OPLINE();
 
-	if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
+	if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
 		ZEND_ASSERT(EG(exception) || (type == BP_VAR_IS));
 		prop = &EG(uninitialized_zval);
 	}
@@ -927,6 +927,7 @@
 	USE_OPLINE
 	zval *prop, *value;
 	zend_property_info *prop_info;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 
@@ -939,10 +940,10 @@
 	value = RT_CONSTANT((opline+1), (opline+1)->op1);
 
 	if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) {
-		value = zend_assign_to_typed_prop(prop_info, prop, value EXECUTE_DATA_CC);
+		value = zend_assign_to_typed_prop(prop_info, prop, value, &garbage EXECUTE_DATA_CC);
 
 	} else {
-		value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES());
+		value = zend_assign_to_variable_ex(prop, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 	}
 
 	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -949,6 +950,10 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), value);
 	}
 
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
+
 	/* assign_static_prop has two opcodes! */
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
@@ -958,6 +963,7 @@
 	USE_OPLINE
 	zval *prop, *value;
 	zend_property_info *prop_info;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 
@@ -970,10 +976,10 @@
 	value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC);
 
 	if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) {
-		value = zend_assign_to_typed_prop(prop_info, prop, value EXECUTE_DATA_CC);
+		value = zend_assign_to_typed_prop(prop_info, prop, value, &garbage EXECUTE_DATA_CC);
 		zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 	} else {
-		value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+		value = zend_assign_to_variable_ex(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 	}
 
 	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -980,6 +986,10 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), value);
 	}
 
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
+
 	/* assign_static_prop has two opcodes! */
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
@@ -989,6 +999,7 @@
 	USE_OPLINE
 	zval *prop, *value;
 	zend_property_info *prop_info;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 
@@ -1001,10 +1012,10 @@
 	value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC);
 
 	if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) {
-		value = zend_assign_to_typed_prop(prop_info, prop, value EXECUTE_DATA_CC);
+		value = zend_assign_to_typed_prop(prop_info, prop, value, &garbage EXECUTE_DATA_CC);
 		zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 	} else {
-		value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES());
+		value = zend_assign_to_variable_ex(prop, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 	}
 
 	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -1011,6 +1022,10 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), value);
 	}
 
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
+
 	/* assign_static_prop has two opcodes! */
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
@@ -1020,6 +1035,7 @@
 	USE_OPLINE
 	zval *prop, *value;
 	zend_property_info *prop_info;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 
@@ -1032,10 +1048,10 @@
 	value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
 
 	if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) {
-		value = zend_assign_to_typed_prop(prop_info, prop, value EXECUTE_DATA_CC);
+		value = zend_assign_to_typed_prop(prop_info, prop, value, &garbage EXECUTE_DATA_CC);
 
 	} else {
-		value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES());
+		value = zend_assign_to_variable_ex(prop, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 	}
 
 	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -1042,6 +1058,10 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), value);
 	}
 
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
+
 	/* assign_static_prop has two opcodes! */
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
@@ -1051,6 +1071,7 @@
 	USE_OPLINE
 	zval *prop, *value_ptr;
 	zend_property_info *prop_info;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 
@@ -1063,13 +1084,13 @@
 	value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, BP_VAR_W);
 
 	if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) {
-		if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
+		if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, &garbage OPLINE_CC EXECUTE_DATA_CC))) {
 			prop = &EG(uninitialized_zval);
 		}
 	} else if (UNEXPECTED(ZEND_TYPE_IS_SET(prop_info->type))) {
-		prop = zend_assign_to_typed_property_reference(prop_info, prop, value_ptr EXECUTE_DATA_CC);
+		prop = zend_assign_to_typed_property_reference(prop_info, prop, value_ptr, &garbage EXECUTE_DATA_CC);
 	} else {
-		zend_assign_to_variable_reference(prop, value_ptr);
+		zend_assign_to_variable_reference(prop, value_ptr, &garbage);
 	}
 
 	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -1076,7 +1097,11 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), prop);
 	}
 
-	if ((opline+1)->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));};
+	if (garbage) {
+		GC_DTOR(garbage);
+	}
+
+	FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -1145,18 +1170,24 @@
 		LOAD_NEXT_OPLINE();
 		ZEND_VM_LEAVE();
 	} else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) {
-		zend_detach_symbol_table(execute_data);
+		if (EX(func)->op_array.last_var > 0) {
+			zend_detach_symbol_table(execute_data);
+			call_info |= ZEND_CALL_NEEDS_REATTACH;
+		}
 		zend_destroy_static_vars(&EX(func)->op_array);
 		destroy_op_array(&EX(func)->op_array);
 		efree_size(EX(func), sizeof(zend_op_array));
-#ifdef ZEND_PREFER_RELOAD
-		call_info = EX_CALL_INFO();
-#endif
 		old_execute_data = execute_data;
 		execute_data = EG(current_execute_data) = EX(prev_execute_data);
 		zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
 
-		zend_attach_symbol_table(execute_data);
+		if (call_info & ZEND_CALL_NEEDS_REATTACH) {
+			if (EX(func)->op_array.last_var > 0) {
+				zend_attach_symbol_table(execute_data);
+			} else {
+				ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_NEEDS_REATTACH);
+			}
+		}
 		if (UNEXPECTED(EG(exception) != NULL)) {
 			zend_rethrow_exception(execute_data);
 			HANDLE_EXCEPTION_LEAVE();
@@ -1187,16 +1218,25 @@
 		} else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
 			zend_array *symbol_table = EX(symbol_table);
 
-			zend_detach_symbol_table(execute_data);
-			old_execute_data = EX(prev_execute_data);
-			while (old_execute_data) {
-				if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) {
-					if (old_execute_data->symbol_table == symbol_table) {
-						zend_attach_symbol_table(old_execute_data);
+			if (EX(func)->op_array.last_var > 0) {
+				zend_detach_symbol_table(execute_data);
+				call_info |= ZEND_CALL_NEEDS_REATTACH;
+			}
+			if (call_info & ZEND_CALL_NEEDS_REATTACH) {
+				old_execute_data = EX(prev_execute_data);
+				while (old_execute_data) {
+					if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) {
+						if (old_execute_data->symbol_table == symbol_table) {
+							if (old_execute_data->func->op_array.last_var > 0) {
+								zend_attach_symbol_table(old_execute_data);
+							} else {
+								ZEND_ADD_CALL_FLAG(old_execute_data, ZEND_CALL_NEEDS_REATTACH);
+							}
+						}
+						break;
 					}
-					break;
+					old_execute_data = old_execute_data->prev_execute_data;
 				}
-				old_execute_data = old_execute_data->prev_execute_data;
 			}
 			EG(current_execute_data) = EX(prev_execute_data);
 			ZEND_VM_RETURN();
@@ -1335,6 +1375,70 @@
 	ZEND_VM_CONTINUE();
 }
 
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+	USE_OPLINE
+	zend_execute_data *call = EX(call);
+	zend_function *fbc = call->func;
+	zval *ret;
+	zval retval;
+
+	SAVE_OPLINE();
+	EX(call) = call->prev_execute_data;
+
+	call->prev_execute_data = execute_data;
+	EG(current_execute_data) = call;
+
+#if ZEND_DEBUG
+	bool should_throw = zend_internal_call_should_throw(fbc, call);
+#endif
+
+	ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
+	ZVAL_NULL(ret);
+
+	zend_observer_fcall_begin(call);
+	fbc->internal_function.handler(call, ret);
+
+#if ZEND_DEBUG
+	if (!EG(exception) && call->func) {
+		if (should_throw) {
+			zend_internal_call_arginfo_violation(call->func);
+		}
+		ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
+			zend_verify_internal_return_type(call->func, ret));
+		ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+			? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
+		zend_verify_internal_func_info(call->func, ret);
+	}
+#endif
+	zend_observer_fcall_end(call, EG(exception) ? NULL : ret);
+
+	EG(current_execute_data) = execute_data;
+	zend_vm_stack_free_args(call);
+
+	uint32_t call_info = ZEND_CALL_INFO(call);
+	if (UNEXPECTED(call_info & (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_ALLOCATED))) {
+		if (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
+			zend_free_extra_named_params(call->extra_named_params);
+		}
+		zend_vm_stack_free_call_frame_ex(call_info, call);
+	} else {
+		EG(vm_stack_top) = (zval*)call;
+	}
+
+	if (!RETURN_VALUE_USED(opline)) {
+		i_zval_ptr_dtor(ret);
+	}
+
+	if (UNEXPECTED(EG(exception) != NULL)) {
+		zend_rethrow_exception(execute_data);
+		HANDLE_EXCEPTION();
+	}
+
+	ZEND_VM_SET_OPCODE(opline + 1);
+	ZEND_VM_CONTINUE();
+}
+
 static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
@@ -1651,6 +1755,7 @@
 		ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
 		ZVAL_NULL(ret);
 
+		zend_observer_fcall_begin(call);
 		fbc->internal_function.handler(call, ret);
 
 #if ZEND_DEBUG
@@ -1665,6 +1770,7 @@
 			zend_verify_internal_func_info(call->func, ret);
 		}
 #endif
+		zend_observer_fcall_end(call, EG(exception) ? NULL : ret);
 
 		EG(current_execute_data) = execute_data;
 
@@ -1764,7 +1870,7 @@
 		}
 
 #if ZEND_DEBUG
-		if (!EG(exception) && call->func) {
+		if (!EG(exception) && call->func && !(call->func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
@@ -1873,7 +1979,7 @@
 		}
 
 #if ZEND_DEBUG
-		if (!EG(exception) && call->func) {
+		if (!EG(exception) && call->func && !(call->func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
@@ -1974,6 +2080,7 @@
 		ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
 		ZVAL_NULL(ret);
 
+		zend_observer_fcall_begin(call);
 		if (!zend_execute_internal) {
 			/* saves one function call if zend_execute_internal is not used */
 			fbc->internal_function.handler(call, ret);
@@ -1982,7 +2089,7 @@
 		}
 
 #if ZEND_DEBUG
-		if (!EG(exception) && call->func) {
+		if (!EG(exception) && call->func && !(call->func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
 			if (should_throw) {
 				zend_internal_call_arginfo_violation(call->func);
 			}
@@ -1993,6 +2100,7 @@
 			zend_verify_internal_func_info(call->func, ret);
 		}
 #endif
+		zend_observer_fcall_end(call, EG(exception) ? NULL : ret);
 
 		EG(current_execute_data) = execute_data;
 
@@ -2338,7 +2446,7 @@
 				goto send_array;
 			}
 		}
-		zend_type_error("call_user_func_array(): Argument #2 ($args) must be of type array, %s given", zend_zval_type_name(args));
+		zend_type_error("call_user_func_array(): Argument #2 ($args) must be of type array, %s given", zend_zval_value_name(args));
 		FREE_OP(opline->op2_type, opline->op2.var);
 		FREE_OP(opline->op1_type, opline->op1.var);
 		HANDLE_EXCEPTION();
@@ -2364,7 +2472,7 @@
 					|| !zend_parse_arg_long_weak(op2, &len, /* arg_num */ 3)) {
 				zend_type_error(
 					"array_slice(): Argument #3 ($length) must be of type ?int, %s given",
-					zend_zval_type_name(op2));
+					zend_zval_value_name(op2));
 				FREE_OP(opline->op2_type, opline->op2.var);
 				FREE_OP(opline->op1_type, opline->op1.var);
 				HANDLE_EXCEPTION();
@@ -2542,23 +2650,39 @@
 	if (EXPECTED(Z_TYPE_P(op1) == IS_ARRAY)) {
 		HashTable *ht = Z_ARRVAL_P(op1);
 		zval *val;
-		zend_string *key;
 
-		ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
-			if (Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1) {
-				val = Z_REFVAL_P(val);
-			}
-			Z_TRY_ADDREF_P(val);
-			if (key) {
-				zend_hash_update(result_ht, key, val);
-			} else {
-				if (!zend_hash_next_index_insert(result_ht, val)) {
-					zend_cannot_add_element();
-					zval_ptr_dtor_nogc(val);
-					break;
+		if (HT_IS_PACKED(ht) && (zend_hash_num_elements(result_ht) == 0 || HT_IS_PACKED(result_ht))) {
+			zend_hash_extend(result_ht, result_ht->nNumUsed + zend_hash_num_elements(ht), 1);
+			ZEND_HASH_FILL_PACKED(result_ht) {
+				ZEND_HASH_PACKED_FOREACH_VAL(ht, val) {
+					if (UNEXPECTED(Z_ISREF_P(val)) &&
+						UNEXPECTED(Z_REFCOUNT_P(val) == 1)) {
+						val = Z_REFVAL_P(val);
+					}
+					Z_TRY_ADDREF_P(val);
+					ZEND_HASH_FILL_ADD(val);
+				} ZEND_HASH_FOREACH_END();
+			} ZEND_HASH_FILL_END();
+		} else {
+			zend_string *key;
+
+			ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
+				if (UNEXPECTED(Z_ISREF_P(val)) &&
+					UNEXPECTED(Z_REFCOUNT_P(val) == 1)) {
+					val = Z_REFVAL_P(val);
 				}
-			}
-		} ZEND_HASH_FOREACH_END();
+				Z_TRY_ADDREF_P(val);
+				if (key) {
+					zend_hash_update(result_ht, key, val);
+				} else {
+					if (!zend_hash_next_index_insert(result_ht, val)) {
+						zend_cannot_add_element();
+						zval_ptr_dtor_nogc(val);
+						break;
+					}
+				}
+			} ZEND_HASH_FOREACH_END();
+		}
 	} else if (EXPECTED(Z_TYPE_P(op1) == IS_OBJECT)) {
 		zend_class_entry *ce = Z_OBJCE_P(op1);
 		zend_object_iterator *iter;
@@ -2982,7 +3106,9 @@
 		EG(ticks_count) = 0;
 		if (zend_ticks_function) {
 			SAVE_OPLINE();
+			zend_fiber_switch_block();
 			zend_ticks_function(opline->extended_value);
+			zend_fiber_switch_unblock();
 			ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 		}
 	}
@@ -3046,7 +3172,12 @@
 			/* Chain potential exception from wrapping finally block */
 			if (Z_OBJ_P(fast_call)) {
 				if (ex) {
-					zend_exception_set_previous(ex, Z_OBJ_P(fast_call));
+					if (zend_is_unwind_exit(ex) || zend_is_graceful_exit(ex)) {
+						/* discard the previously thrown exception */
+						OBJ_RELEASE(Z_OBJ_P(fast_call));
+					} else {
+						zend_exception_set_previous(ex, Z_OBJ_P(fast_call));
+					}
 				} else {
 					ex = EG(exception) = Z_OBJ_P(fast_call);
 				}
@@ -3061,6 +3192,7 @@
 	cleanup_live_vars(execute_data, op_num, 0);
 	if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) {
 		zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
+		EG(current_execute_data) = EX(prev_execute_data);
 		zend_generator_close(generator, 1);
 		ZEND_VM_RETURN();
 	} else {
@@ -3075,6 +3207,12 @@
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	const zend_op *throw_op = EG(opline_before_exception);
+
+	/* Exception was thrown before executing any op */
+	if (UNEXPECTED(!throw_op)) {
+		ZEND_VM_TAIL_CALL(zend_dispatch_try_catch_finally_helper_SPEC(-1, 0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+	}
+
 	uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
 	int i, current_try_catch_offset = -1;
 
@@ -3154,6 +3292,7 @@
 		case ZEND_USER_OPCODE_RETURN:
 			if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) {
 				zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
+				EG(current_execute_data) = EX(prev_execute_data);
 				zend_generator_close(generator, 1);
 				ZEND_VM_RETURN();
 			} else {
@@ -3166,7 +3305,7 @@
 		case ZEND_USER_OPCODE_DISPATCH:
 			ZEND_VM_DISPATCH(opline->opcode, opline);
 		default:
-			ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), opline);
+			ZEND_VM_DISPATCH((uint8_t)(ret & 0xff), opline);
 	}
 }
 
@@ -3341,6 +3480,7 @@
 		}
 
 		ZVAL_NULL(ret);
+
 		if (!zend_execute_internal) {
 			/* saves one function call if zend_execute_internal is not used */
 			fbc->internal_function.handler(call, ret);
@@ -3364,6 +3504,9 @@
 		EG(current_execute_data) = call->prev_execute_data;
 
 		zend_vm_stack_free_args(call);
+		if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
+			zend_free_extra_named_params(call->extra_named_params);
+		}
 		if (ret == &retval) {
 			zval_ptr_dtor(ret);
 		}
@@ -3480,6 +3623,7 @@
 		}
 
 		ZVAL_NULL(ret);
+		zend_observer_fcall_begin(call);
 		if (!zend_execute_internal) {
 			/* saves one function call if zend_execute_internal is not used */
 			fbc->internal_function.handler(call, ret);
@@ -3499,10 +3643,14 @@
 			zend_verify_internal_func_info(call->func, ret);
 		}
 #endif
+		zend_observer_fcall_end(call, EG(exception) ? NULL : ret);
 
 		EG(current_execute_data) = call->prev_execute_data;
 
 		zend_vm_stack_free_args(call);
+		if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
+			zend_free_extra_named_params(call->extra_named_params);
+		}
 		if (ret == &retval) {
 			zval_ptr_dtor(ret);
 		}
@@ -3540,9 +3688,9 @@
 
 static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_interrupt_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
 {
-	EG(vm_interrupt) = 0;
+	zend_atomic_bool_store_ex(&EG(vm_interrupt), false);
 	SAVE_OPLINE();
-	if (EG(timed_out)) {
+	if (zend_atomic_bool_load_ex(&EG(timed_out))) {
 		zend_timeout();
 	} else if (zend_interrupt_function) {
 		zend_interrupt_function(execute_data);
@@ -3690,9 +3838,7 @@
 	if (UNEXPECTED(fbc == NULL)) {
 		fname = (zval*)RT_CONSTANT(opline, opline->op2);
 		func = zend_hash_find_known_hash(EG(function_table), Z_STR_P(fname));
-		if (UNEXPECTED(func == NULL)) {
-			ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-		}
+		ZEND_ASSERT(func != NULL && "Function existence must be checked at compile time");
 		fbc = Z_FUNC_P(func);
 		if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
 			init_func_run_time_cache(&fbc->op_array);
@@ -3731,12 +3877,13 @@
 			} else {
 				SAVE_OPLINE();
 				ZVAL_COPY(param, default_value);
-				if (UNEXPECTED(zval_update_constant_ex(param, EX(func)->op_array.scope) != SUCCESS)) {
+				zend_ast_evaluate_ctx ctx = {0};
+				if (UNEXPECTED(zval_update_constant_with_ctx(param, EX(func)->op_array.scope, &ctx) != SUCCESS)) {
 					zval_ptr_dtor_nogc(param);
 					ZVAL_UNDEF(param);
 					HANDLE_EXCEPTION();
 				}
-				if (!Z_REFCOUNTED_P(param)) {
+				if (!Z_REFCOUNTED_P(param) && !ctx.had_side_effects) {
 					ZVAL_COPY_VALUE(cache_val, param);
 				}
 			}
@@ -3880,7 +4027,7 @@
 		zend_arg_info *arg_info = &EX(func)->common.arg_info[EX(func)->common.num_args];
 		if (ZEND_TYPE_IS_SET(arg_info->type)) {
 			SEPARATE_ARRAY(params);
-			ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
+			ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
 				if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_info, arg_num, param, CACHE_ADDR(opline->extended_value)))) {
 					HANDLE_EXCEPTION();
 				}
@@ -3892,7 +4039,7 @@
 			ZVAL_ARR(params, EX(extra_named_params));
 		} else {
 			SEPARATE_ARRAY(params);
-			ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
+			ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) {
 				Z_TRY_ADDREF_P(param);
 				zend_hash_add_new(Z_ARRVAL_P(params), name, param);
 			} ZEND_HASH_FOREACH_END();
@@ -4027,7 +4174,7 @@
 {
 	USE_OPLINE
 	zval *val;
-	zend_uchar op1_type;
+	uint8_t op1_type;
 
 	val = RT_CONSTANT(opline, opline->op1);
 
@@ -4061,7 +4208,7 @@
 {
 	USE_OPLINE
 	zval *val;
-	zend_uchar op1_type;
+	uint8_t op1_type;
 
 	val = RT_CONSTANT(opline, opline->op1);
 
@@ -4091,41 +4238,6 @@
 	ZEND_VM_JMP(opline);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
-	USE_OPLINE
-	zval *val;
-	zend_uchar op1_type;
-
-	val = RT_CONSTANT(opline, opline->op1);
-
-	if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
-		ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
-		ZEND_VM_CONTINUE();
-	} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
-		if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
-			SAVE_OPLINE();
-			ZVAL_UNDEFINED_OP1();
-			if (UNEXPECTED(EG(exception))) {
-				HANDLE_EXCEPTION();
-			}
-		}
-		ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
-	}
-
-	SAVE_OPLINE();
-	op1_type = IS_CONST;
-	if (i_zend_is_true(val)) {
-		opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value);
-	} else {
-		opline = OP_JMP_ADDR(opline, opline->op2);
-	}
-	if (op1_type & (IS_TMP_VAR|IS_VAR)) {
-		zval_ptr_dtor_nogc(val);
-	}
-	ZEND_VM_JMP(opline);
-}
-
 static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
@@ -4385,7 +4497,7 @@
 			break;
 		}
 
-		retval_ptr = NULL;
+		retval_ptr = zend_get_bad_ptr();
 
 		if (IS_CONST == IS_VAR) {
 			ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
@@ -4458,7 +4570,7 @@
 				if (return_value) {
 					ZVAL_NEW_REF(return_value, retval_ptr);
 				} else {
-					if (opline->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));};
+					FREE_OP(opline->op1_type, opline->op1.var);
 				}
 				break;
 			}
@@ -4473,7 +4585,7 @@
 			ZVAL_REF(return_value, Z_REF_P(retval_ptr));
 		}
 
-		if (opline->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));};
+		FREE_OP(opline->op1_type, opline->op1.var);
 	} while (0);
 
 	zend_observer_fcall_end(execute_data, return_value);
@@ -4517,6 +4629,8 @@
 		}
 	}
 
+	EG(current_execute_data) = EX(prev_execute_data);
+
 	/* Close the generator to free up resources */
 	zend_generator_close(generator, 1);
 
@@ -4562,6 +4676,8 @@
 
 	zend_observer_fcall_end(generator->execute_data, &generator->retval);
 
+	EG(current_execute_data) = EX(prev_execute_data);
+
 	/* Close the generator to free up resources */
 	zend_generator_close(generator, 1);
 
@@ -4717,7 +4833,7 @@
 	do {
 		if (IS_CONST == IS_CONST ||
 		    (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
-		    if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
+			if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
 				obj = Z_REFVAL_P(obj);
 				if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
 					break;
@@ -4879,10 +4995,25 @@
 		if (RETURN_VALUE_USED(opline)) {
 			ZVAL_TRUE(EX_VAR(opline->result.var));
 		}
-	} else if (EXPECTED(new_op_array != NULL)) {
+	} else if (UNEXPECTED(new_op_array == NULL)) {
+		if (RETURN_VALUE_USED(opline)) {
+			ZVAL_FALSE(EX_VAR(opline->result.var));
+		}
+	} else if (new_op_array->last == 1
+			&& new_op_array->opcodes[0].opcode == ZEND_RETURN
+			&& new_op_array->opcodes[0].op1_type == IS_CONST
+			&& EXPECTED(zend_execute_ex == execute_ex)) {
+		if (RETURN_VALUE_USED(opline)) {
+			const zend_op *op = new_op_array->opcodes;
+
+			ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1));
+		}
+		zend_destroy_static_vars(new_op_array);
+		destroy_op_array(new_op_array);
+		efree_size(new_op_array, sizeof(zend_op_array));
+	} else {
 		zval *return_value = NULL;
 		zend_execute_data *call;
-
 		if (RETURN_VALUE_USED(opline)) {
 			return_value = EX_VAR(opline->result.var);
 		}
@@ -4890,7 +5021,7 @@
 		new_op_array->scope = EX(func)->op_array.scope;
 
 		call = zend_vm_stack_push_call_frame(
-		    (Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
+			(Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
 			(zend_function*)new_op_array, 0,
 			Z_PTR(EX(This)));
 
@@ -4921,8 +5052,6 @@
 			UNDEF_RESULT();
 			HANDLE_EXCEPTION();
 		}
-	} else if (RETURN_VALUE_USED(opline)) {
-		ZVAL_FALSE(EX_VAR(opline->result.var));
 	}
 
 	ZEND_VM_NEXT_OPCODE();
@@ -4949,10 +5078,25 @@
 		if (RETURN_VALUE_USED(opline)) {
 			ZVAL_TRUE(EX_VAR(opline->result.var));
 		}
-	} else if (EXPECTED(new_op_array != NULL)) {
+	} else if (UNEXPECTED(new_op_array == NULL)) {
+		if (RETURN_VALUE_USED(opline)) {
+			ZVAL_FALSE(EX_VAR(opline->result.var));
+		}
+	} else if (new_op_array->last == 1
+			&& new_op_array->opcodes[0].opcode == ZEND_RETURN
+			&& new_op_array->opcodes[0].op1_type == IS_CONST
+			&& EXPECTED(zend_execute_ex == execute_ex)) {
+		if (RETURN_VALUE_USED(opline)) {
+			const zend_op *op = new_op_array->opcodes;
+
+			ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1));
+		}
+		zend_destroy_static_vars(new_op_array);
+		destroy_op_array(new_op_array);
+		efree_size(new_op_array, sizeof(zend_op_array));
+	} else {
 		zval *return_value = NULL;
 		zend_execute_data *call;
-
 		if (RETURN_VALUE_USED(opline)) {
 			return_value = EX_VAR(opline->result.var);
 		}
@@ -4960,7 +5104,7 @@
 		new_op_array->scope = EX(func)->op_array.scope;
 
 		call = zend_vm_stack_push_call_frame(
-		    (Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
+			(Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
 			(zend_function*)new_op_array, 0,
 			Z_PTR(EX(This)));
 
@@ -4991,8 +5135,6 @@
 			UNDEF_RESULT();
 			HANDLE_EXCEPTION();
 		}
-	} else if (RETURN_VALUE_USED(opline)) {
-		ZVAL_FALSE(EX_VAR(opline->result.var));
 	}
 	FREE_OP(opline->op1_type, opline->op1.var);
 	ZEND_VM_NEXT_OPCODE();
@@ -5057,7 +5199,7 @@
 			}
 		}
 	} else {
-		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
+		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array_ptr));
 		ZVAL_UNDEF(EX_VAR(opline->result.var));
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
 
@@ -5073,7 +5215,7 @@
 	SAVE_OPLINE();
 
 	if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
-		array_ref = array_ptr = NULL;
+		array_ref = array_ptr = zend_get_bad_ptr();
 		if (Z_ISREF_P(array_ref)) {
 			array_ptr = Z_REFVAL_P(array_ref);
 		}
@@ -5101,9 +5243,6 @@
 		}
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
 
-		if (IS_CONST == IS_VAR) {
-
-		}
 		ZEND_VM_NEXT_OPCODE();
 	} else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@@ -5140,11 +5279,6 @@
 		} else {
 			bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
 
-			if (IS_CONST == IS_VAR) {
-
-			} else {
-
-			}
 			if (UNEXPECTED(EG(exception))) {
 				HANDLE_EXCEPTION();
 			} else if (is_empty) {
@@ -5154,14 +5288,10 @@
 			}
 		}
 	} else {
-		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
+		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array_ptr));
 		ZVAL_UNDEF(EX_VAR(opline->result.var));
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
-		if (IS_CONST == IS_VAR) {
 
-		} else {
-
-		}
 		ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
 	}
 }
@@ -5274,9 +5404,13 @@
 	}
 
 	result = EX_VAR(opline->result.var);
-	if (EXPECTED(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
+	uint32_t short_circuiting_type = opline->extended_value & ZEND_SHORT_CIRCUITING_CHAIN_MASK;
+	if (EXPECTED(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
 		ZVAL_NULL(result);
-		if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(val) == IS_UNDEF)) {
+		if (IS_CONST == IS_CV
+			&& UNEXPECTED(Z_TYPE_P(val) == IS_UNDEF)
+			&& (opline->extended_value & ZEND_JMP_NULL_BP_VAR_IS) == 0
+		) {
 			SAVE_OPLINE();
 			ZVAL_UNDEFINED_OP1();
 			if (UNEXPECTED(EG(exception) != NULL)) {
@@ -5283,10 +5417,10 @@
 				HANDLE_EXCEPTION();
 			}
 		}
-	} else if (opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
+	} else if (short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
 		ZVAL_FALSE(result);
 	} else {
-		ZEND_ASSERT(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EMPTY);
+		ZEND_ASSERT(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EMPTY);
 		ZVAL_TRUE(result);
 	}
 
@@ -5360,6 +5494,7 @@
 		called_scope = Z_CE(EX(This));
 		object = NULL;
 	}
+	SAVE_OPLINE();
 	zend_create_closure(EX_VAR(opline->result.var), func,
 		EX(func)->op_array.scope, called_scope, object);
 
@@ -5523,7 +5658,7 @@
 				zval_ptr_dtor(&tmp);
 			}
 			if (!EG(exception)) {
-				zend_type_error("strlen(): Argument #1 ($str) must be of type string, %s given", zend_zval_type_name(value));
+				zend_type_error("strlen(): Argument #1 ($string) must be of type string, %s given", zend_zval_value_name(value));
 			}
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
 		} while (0);
@@ -6232,9 +6367,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if (IS_CONST == IS_UNUSED) {
@@ -6255,7 +6390,7 @@
 
 	if (IS_CONST == IS_CONST ||
 	    (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -6302,11 +6437,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_r_copy;
@@ -6338,10 +6472,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -6420,11 +6564,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_is_copy;
@@ -6519,6 +6662,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
@@ -6540,10 +6684,11 @@
 			}
 		} else if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -6552,6 +6697,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -6612,6 +6758,8 @@
 		str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 		memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 		memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+
+		ZSTR_COPY_CONCAT_PROPERTIES_BOTH(str, op1_str, op2_str);
 		ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 		if (IS_CONST != IS_CONST) {
 			zend_string_release_ex(op1_str, 0);
@@ -6713,9 +6861,9 @@
 
 	if (IS_CONST == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if (IS_CONST == IS_CONST) {
 			function_name = RT_CONSTANT(opline, opline->op2);
@@ -6928,6 +7076,16 @@
 	function_name = RT_CONSTANT(opline, opline->op2);
 	if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
 		ZEND_ASSERT(!error);
+
+		/* Deprecation can be emitted from zend_is_callable_ex(), which can
+		 * invoke a user error handler and throw an exception.
+		 * For the CONST and CV case we reuse the same exception block below
+		 * to make sure we don't increase VM size too much. */
+		if (!(IS_CONST & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) {
+
+			HANDLE_EXCEPTION();
+		}
+
 		func = fcc.function_handler;
 		object_or_called_scope = fcc.called_scope;
 		if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
@@ -7043,63 +7201,118 @@
 {
 	zend_class_entry *ce, *scope;
 	zend_class_constant *c;
-	zval *value, *zv;
+	zval *value, *zv, *constant_zv;
+	zend_string *constant_name;
 	USE_OPLINE
 
 	SAVE_OPLINE();
 
 	do {
-		if (IS_CONST == IS_CONST) {
+		if (IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
 			if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
 				value = CACHED_PTR(opline->extended_value + sizeof(void*));
 				break;
-			} else if (EXPECTED(CACHED_PTR(opline->extended_value))) {
+			}
+		}
+		if (IS_CONST == IS_CONST) {
+			if (EXPECTED(CACHED_PTR(opline->extended_value))) {
 				ce = CACHED_PTR(opline->extended_value);
 			} else {
 				ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
 				if (UNEXPECTED(ce == NULL)) {
 					ZVAL_UNDEF(EX_VAR(opline->result.var));
+
 					HANDLE_EXCEPTION();
 				}
+				CACHE_PTR(opline->extended_value, ce);
 			}
+		} else if (IS_CONST == IS_UNUSED) {
+			ce = zend_fetch_class(NULL, opline->op1.num);
+			if (UNEXPECTED(ce == NULL)) {
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+				HANDLE_EXCEPTION();
+			}
 		} else {
-			if (IS_CONST == IS_UNUSED) {
-				ce = zend_fetch_class(NULL, opline->op1.num);
-				if (UNEXPECTED(ce == NULL)) {
-					ZVAL_UNDEF(EX_VAR(opline->result.var));
-					HANDLE_EXCEPTION();
-				}
-			} else {
-				ce = Z_CE_P(EX_VAR(opline->op1.var));
-			}
-			if (EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
-				value = CACHED_PTR(opline->extended_value + sizeof(void*));
-				break;
-			}
+			ce = Z_CE_P(EX_VAR(opline->op1.var));
 		}
+		if (IS_CONST != IS_CONST
+			&& IS_CONST == IS_CONST
+			&& EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
+			value = CACHED_PTR(opline->extended_value + sizeof(void*));
+			break;
+		}
 
-		zv = zend_hash_find_known_hash(CE_CONSTANTS_TABLE(ce), Z_STR_P(RT_CONSTANT(opline, opline->op2)));
+		constant_zv = RT_CONSTANT(opline, opline->op2);
+		if (UNEXPECTED(Z_TYPE_P(constant_zv) != IS_STRING)) {
+			zend_invalid_class_constant_type_error(Z_TYPE_P(constant_zv));
+			ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+			HANDLE_EXCEPTION();
+		}
+		constant_name = Z_STR_P(constant_zv);
+		/* Magic 'class' for constant OP2 is caught at compile-time */
+		if (IS_CONST != IS_CONST && UNEXPECTED(zend_string_equals_literal_ci(constant_name, "class"))) {
+			ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
+
+			ZEND_VM_NEXT_OPCODE();
+		}
+		zv = IS_CONST == IS_CONST
+			? zend_hash_find_known_hash(CE_CONSTANTS_TABLE(ce), constant_name)
+			: zend_hash_find(CE_CONSTANTS_TABLE(ce), constant_name);
+
 		if (EXPECTED(zv != NULL)) {
 			c = Z_PTR_P(zv);
 			scope = EX(func)->op_array.scope;
 			if (!zend_verify_const_access(c, scope)) {
-				zend_throw_error(NULL, "Cannot access %s constant %s::%s", zend_visibility_string(ZEND_CLASS_CONST_FLAGS(c)), ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
+				zend_throw_error(NULL, "Cannot access %s constant %s::%s", zend_visibility_string(ZEND_CLASS_CONST_FLAGS(c)), ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
+
 				HANDLE_EXCEPTION();
 			}
+
+			if (ce->ce_flags & ZEND_ACC_TRAIT) {
+				zend_throw_error(NULL, "Cannot access trait constant %s::%s directly", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+				HANDLE_EXCEPTION();
+			}
+
+			bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
+			if (UNEXPECTED(is_constant_deprecated)) {
+				zend_error(E_DEPRECATED, "Constant %s::%s is deprecated", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+
+				if (EG(exception)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+					HANDLE_EXCEPTION();
+				}
+			}
+
 			value = &c->value;
+			// Enums require loading of all class constants to build the backed enum table
+			if (ce->ce_flags & ZEND_ACC_ENUM && ce->enum_backing_type != IS_UNDEF && ce->type == ZEND_USER_CLASS && !(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
+				if (UNEXPECTED(zend_update_class_constants(ce) == FAILURE)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+					HANDLE_EXCEPTION();
+				}
+			}
 			if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
-				zval_update_constant_ex(value, c->ce);
-				if (UNEXPECTED(EG(exception) != NULL)) {
+				if (UNEXPECTED(zend_update_class_constant(c, constant_name, c->ce) != SUCCESS)) {
 					ZVAL_UNDEF(EX_VAR(opline->result.var));
+
 					HANDLE_EXCEPTION();
 				}
 			}
-			CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
+			if (IS_CONST == IS_CONST && !is_constant_deprecated) {
+				CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
+			}
 		} else {
 			zend_throw_error(NULL, "Undefined constant %s::%s",
-				ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
+				ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
+
 			HANDLE_EXCEPTION();
 		}
 	} while (0);
@@ -7117,7 +7330,7 @@
 	SAVE_OPLINE();
 	if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
 	    UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
-		expr_ptr = NULL;
+		expr_ptr = zend_get_bad_ptr();
 		if (Z_ISREF_P(expr_ptr)) {
 			Z_ADDREF_P(expr_ptr);
 		} else {
@@ -7192,7 +7405,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 
@@ -7429,7 +7642,7 @@
 		}
 	}
 	/* non persistent, case sensitive */
-	ZEND_CONSTANT_SET_FLAGS(&c, CONST_CS, PHP_USER_CONSTANT);
+	ZEND_CONSTANT_SET_FLAGS(&c, 0, PHP_USER_CONSTANT);
 	c.name = zend_string_copy(Z_STR_P(name));
 
 	if (zend_register_constant(&c) == FAILURE) {
@@ -7474,7 +7687,7 @@
 					}
 				}
 			} else {
-				zval *value_ptr = NULL;
+				zval *value_ptr = zend_get_bad_ptr();
 
 				/* If a function call result is yielded and the function did
 				 * not return by reference we throw a notice. */
@@ -7508,7 +7721,7 @@
 				}
 			} else if (IS_CONST == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -7724,7 +7937,7 @@
 		}
 
 		SAVE_OPLINE();
-		ZEND_HASH_FOREACH_STR_KEY(ht, key) {
+		ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) {
 			ZVAL_STR(&key_tmp, key);
 			if (zend_compare(op1, &key_tmp) == 0) {
 
@@ -8149,6 +8362,132 @@
 	ZEND_VM_TAIL_CALL(zend_is_smaller_or_equal_helper_SPEC(op1, op2 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
 }
 
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+	zend_class_entry *ce, *scope;
+	zend_class_constant *c;
+	zval *value, *zv, *constant_zv;
+	zend_string *constant_name;
+	USE_OPLINE
+
+	SAVE_OPLINE();
+
+	do {
+		if (IS_CONST == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+			if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
+				value = CACHED_PTR(opline->extended_value + sizeof(void*));
+				break;
+			}
+		}
+		if (IS_CONST == IS_CONST) {
+			if (EXPECTED(CACHED_PTR(opline->extended_value))) {
+				ce = CACHED_PTR(opline->extended_value);
+			} else {
+				ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+				if (UNEXPECTED(ce == NULL)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP(opline->op2_type, opline->op2.var);
+					HANDLE_EXCEPTION();
+				}
+				CACHE_PTR(opline->extended_value, ce);
+			}
+		} else if (IS_CONST == IS_UNUSED) {
+			ce = zend_fetch_class(NULL, opline->op1.num);
+			if (UNEXPECTED(ce == NULL)) {
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+				FREE_OP(opline->op2_type, opline->op2.var);
+				HANDLE_EXCEPTION();
+			}
+		} else {
+			ce = Z_CE_P(EX_VAR(opline->op1.var));
+		}
+		if (IS_CONST != IS_CONST
+			&& (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST
+			&& EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
+			value = CACHED_PTR(opline->extended_value + sizeof(void*));
+			break;
+		}
+
+		constant_zv = _get_zval_ptr_tmpvarcv(opline->op2_type, opline->op2, BP_VAR_R EXECUTE_DATA_CC);
+		if (UNEXPECTED(Z_TYPE_P(constant_zv) != IS_STRING)) {
+			zend_invalid_class_constant_type_error(Z_TYPE_P(constant_zv));
+			ZVAL_UNDEF(EX_VAR(opline->result.var));
+			FREE_OP(opline->op2_type, opline->op2.var);
+			HANDLE_EXCEPTION();
+		}
+		constant_name = Z_STR_P(constant_zv);
+		/* Magic 'class' for constant OP2 is caught at compile-time */
+		if ((IS_TMP_VAR|IS_VAR|IS_CV) != IS_CONST && UNEXPECTED(zend_string_equals_literal_ci(constant_name, "class"))) {
+			ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
+			FREE_OP(opline->op2_type, opline->op2.var);
+			ZEND_VM_NEXT_OPCODE();
+		}
+		zv = (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST
+			? zend_hash_find_known_hash(CE_CONSTANTS_TABLE(ce), constant_name)
+			: zend_hash_find(CE_CONSTANTS_TABLE(ce), constant_name);
+
+		if (EXPECTED(zv != NULL)) {
+			c = Z_PTR_P(zv);
+			scope = EX(func)->op_array.scope;
+			if (!zend_verify_const_access(c, scope)) {
+				zend_throw_error(NULL, "Cannot access %s constant %s::%s", zend_visibility_string(ZEND_CLASS_CONST_FLAGS(c)), ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+				FREE_OP(opline->op2_type, opline->op2.var);
+				HANDLE_EXCEPTION();
+			}
+
+			if (ce->ce_flags & ZEND_ACC_TRAIT) {
+				zend_throw_error(NULL, "Cannot access trait constant %s::%s directly", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+				FREE_OP(opline->op2_type, opline->op2.var);
+				HANDLE_EXCEPTION();
+			}
+
+			bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
+			if (UNEXPECTED(is_constant_deprecated)) {
+				zend_error(E_DEPRECATED, "Constant %s::%s is deprecated", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+
+				if (EG(exception)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP(opline->op2_type, opline->op2.var);
+					HANDLE_EXCEPTION();
+				}
+			}
+
+			value = &c->value;
+			// Enums require loading of all class constants to build the backed enum table
+			if (ce->ce_flags & ZEND_ACC_ENUM && ce->enum_backing_type != IS_UNDEF && ce->type == ZEND_USER_CLASS && !(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
+				if (UNEXPECTED(zend_update_class_constants(ce) == FAILURE)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP(opline->op2_type, opline->op2.var);
+					HANDLE_EXCEPTION();
+				}
+			}
+			if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
+				if (UNEXPECTED(zend_update_class_constant(c, constant_name, c->ce) != SUCCESS)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP(opline->op2_type, opline->op2.var);
+					HANDLE_EXCEPTION();
+				}
+			}
+			if ((IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && !is_constant_deprecated) {
+				CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
+			}
+		} else {
+			zend_throw_error(NULL, "Undefined constant %s::%s",
+				ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+			ZVAL_UNDEF(EX_VAR(opline->result.var));
+			FREE_OP(opline->op2_type, opline->op2.var);
+			HANDLE_EXCEPTION();
+		}
+	} while (0);
+
+	ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), value);
+
+	FREE_OP(opline->op2_type, opline->op2.var);
+	ZEND_VM_NEXT_OPCODE();
+}
+
 static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
@@ -8425,6 +8764,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
@@ -8446,7 +8786,7 @@
 			}
 		} else if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			if (UNEXPECTED(len > ZSTR_MAX_LEN - ZSTR_LEN(op2_str))) {
 				zend_error_noreturn(E_ERROR, "Integer overflow in memory allocation");
@@ -8453,6 +8793,7 @@
 			}
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -8461,6 +8802,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -8555,9 +8897,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
@@ -8578,7 +8920,7 @@
 
 	if (IS_CONST == IS_CONST ||
 	    (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -8625,11 +8967,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_r_copy;
@@ -8661,10 +9002,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -8743,11 +9094,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_is_copy;
@@ -8842,6 +9192,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
@@ -8863,10 +9214,11 @@
 			}
 		} else if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -8875,6 +9227,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -8935,6 +9288,8 @@
 		str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 		memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 		memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+
+		ZSTR_COPY_CONCAT_PROPERTIES_BOTH(str, op1_str, op2_str);
 		ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 		if (IS_CONST != IS_CONST) {
 			zend_string_release_ex(op1_str, 0);
@@ -9036,9 +9391,9 @@
 
 	if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 			function_name = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
@@ -9251,6 +9606,16 @@
 	function_name = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
 		ZEND_ASSERT(!error);
+
+		/* Deprecation can be emitted from zend_is_callable_ex(), which can
+		 * invoke a user error handler and throw an exception.
+		 * For the CONST and CV case we reuse the same exception block below
+		 * to make sure we don't increase VM size too much. */
+		if (!((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) {
+			zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
+			HANDLE_EXCEPTION();
+		}
+
 		func = fcc.function_handler;
 		object_or_called_scope = fcc.called_scope;
 		if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
@@ -9306,7 +9671,7 @@
 	SAVE_OPLINE();
 	if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
 	    UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
-		expr_ptr = NULL;
+		expr_ptr = zend_get_bad_ptr();
 		if (Z_ISREF_P(expr_ptr)) {
 			Z_ADDREF_P(expr_ptr);
 		} else {
@@ -9381,7 +9746,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 		zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -9613,7 +9978,7 @@
 					}
 				}
 			} else {
-				zval *value_ptr = NULL;
+				zval *value_ptr = zend_get_bad_ptr();
 
 				/* If a function call result is yielded and the function did
 				 * not return by reference we throw a notice. */
@@ -9647,7 +10012,7 @@
 				}
 			} else if (IS_CONST == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -9748,6 +10113,10 @@
 		} else if (type == BP_VAR_IS || type == BP_VAR_UNSET) {
 			retval = &EG(uninitialized_zval);
 		} else {
+			if (IS_CONST == IS_CV) {
+				/* Keep name alive in case an error handler tries to free it. */
+				zend_string_addref(name);
+			}
 			zend_error(E_WARNING, "Undefined %svariable $%s",
 				(opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), ZSTR_VAL(name));
 			if (type == BP_VAR_RW && !EG(exception)) {
@@ -9755,6 +10124,9 @@
 			} else {
 				retval = &EG(uninitialized_zval);
 			}
+			if (IS_CONST == IS_CV) {
+				zend_string_release(name);
+			}
 		}
 	/* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
 	} else if (Z_TYPE_P(retval) == IS_INDIRECT) {
@@ -9837,9 +10209,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if (IS_UNUSED == IS_UNUSED) {
@@ -10229,7 +10601,7 @@
 	SAVE_OPLINE();
 	if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
 	    UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
-		expr_ptr = NULL;
+		expr_ptr = zend_get_bad_ptr();
 		if (Z_ISREF_P(expr_ptr)) {
 			Z_ADDREF_P(expr_ptr);
 		} else {
@@ -10304,7 +10676,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 
@@ -10456,7 +10828,7 @@
 					}
 				}
 			} else {
-				zval *value_ptr = NULL;
+				zval *value_ptr = zend_get_bad_ptr();
 
 				/* If a function call result is yielded and the function did
 				 * not return by reference we throw a notice. */
@@ -10490,7 +10862,7 @@
 				}
 			} else if (IS_CONST == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -10586,7 +10958,8 @@
 			if (zend_class_implements_interface(zobj->ce, zend_ce_countable)) {
 				zval retval;
 
-				zend_call_method_with_0_params(zobj, NULL, NULL, "count", &retval);
+				zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT));
+				zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval);
 				count = zval_get_long(&retval);
 				zval_ptr_dtor(&retval);
 				break;
@@ -10600,7 +10973,7 @@
 			ZVAL_UNDEFINED_OP1();
 		}
 		count = 0;
-		zend_type_error("%s(): Argument #1 ($value) must be of type Countable|array, %s given", opline->extended_value ? "sizeof" : "count", zend_zval_type_name(op1));
+		zend_type_error("%s(): Argument #1 ($value) must be of type Countable|array, %s given", opline->extended_value ? "sizeof" : "count", zend_zval_value_name(op1));
 		break;
 	}
 
@@ -10614,13 +10987,17 @@
 	USE_OPLINE
 
 	if (IS_CONST == IS_UNUSED) {
+		SAVE_OPLINE();
 		if (UNEXPECTED(!EX(func)->common.scope)) {
-			SAVE_OPLINE();
 			zend_throw_error(NULL, "get_class() without arguments must be called from within a class");
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
 			HANDLE_EXCEPTION();
 		} else {
+			zend_error(E_DEPRECATED, "Calling get_class() without arguments is deprecated");
 			ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(func)->common.scope->name);
+			if (UNEXPECTED(EG(exception))) {
+				HANDLE_EXCEPTION();
+			}
 			ZEND_VM_NEXT_OPCODE();
 		}
 	} else {
@@ -10638,7 +11015,7 @@
 				if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
 					ZVAL_UNDEFINED_OP1();
 				}
-				zend_type_error("get_class(): Argument #1 ($object) must be of type object, %s given", zend_zval_type_name(op1));
+				zend_type_error("get_class(): Argument #1 ($object) must be of type object, %s given", zend_zval_value_name(op1));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
 			}
 			break;
@@ -10686,6 +11063,7 @@
 	}
 
 	if (result_size) {
+		SAVE_OPLINE();
 		uint32_t first_extra_arg = EX(func)->op_array.num_args;
 
 		ht = zend_new_array(result_size);
@@ -10741,6 +11119,7 @@
 	ZEND_VM_NEXT_OPCODE();
 }
 
+/* Contrary to what its name indicates, ZEND_COPY_TMP may receive and define references. */
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
@@ -10782,6 +11161,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (IS_CV == IS_CONST || IS_CV == IS_CV) {
@@ -10803,7 +11183,7 @@
 			}
 		} else if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			if (UNEXPECTED(len > ZSTR_MAX_LEN - ZSTR_LEN(op2_str))) {
 				zend_error_noreturn(E_ERROR, "Integer overflow in memory allocation");
@@ -10810,6 +11190,7 @@
 			}
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -10818,6 +11199,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -10912,9 +11294,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if (IS_CV == IS_UNUSED) {
@@ -10935,7 +11317,7 @@
 
 	if (IS_CONST == IS_CONST ||
 	    (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -10982,11 +11364,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_r_copy;
@@ -11018,10 +11399,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -11100,11 +11491,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_is_copy;
@@ -11199,6 +11589,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (IS_CONST != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (IS_CV == IS_CONST || IS_CV == IS_CV) {
@@ -11220,10 +11611,11 @@
 			}
 		} else if (IS_CONST != IS_CONST && IS_CONST != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -11232,6 +11624,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -11292,6 +11685,8 @@
 		str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 		memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 		memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+
+		ZSTR_COPY_CONCAT_PROPERTIES_BOTH(str, op1_str, op2_str);
 		ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 		if (IS_CONST != IS_CONST) {
 			zend_string_release_ex(op1_str, 0);
@@ -11393,9 +11788,9 @@
 
 	if (IS_CV == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if (IS_CV == IS_CONST) {
 			function_name = EX_VAR(opline->op2.var);
@@ -11608,6 +12003,16 @@
 	function_name = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	if (zend_is_callable_ex(function_name, NULL, 0, NULL, &fcc, &error)) {
 		ZEND_ASSERT(!error);
+
+		/* Deprecation can be emitted from zend_is_callable_ex(), which can
+		 * invoke a user error handler and throw an exception.
+		 * For the CONST and CV case we reuse the same exception block below
+		 * to make sure we don't increase VM size too much. */
+		if (!(IS_CV & (IS_TMP_VAR|IS_VAR)) && UNEXPECTED(EG(exception))) {
+
+			HANDLE_EXCEPTION();
+		}
+
 		func = fcc.function_handler;
 		object_or_called_scope = fcc.called_scope;
 		if (func->common.fn_flags & ZEND_ACC_CLOSURE) {
@@ -11662,7 +12067,7 @@
 	SAVE_OPLINE();
 	if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
 	    UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
-		expr_ptr = NULL;
+		expr_ptr = zend_get_bad_ptr();
 		if (Z_ISREF_P(expr_ptr)) {
 			Z_ADDREF_P(expr_ptr);
 		} else {
@@ -11737,7 +12142,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 
@@ -11968,7 +12373,7 @@
 					}
 				}
 			} else {
-				zval *value_ptr = NULL;
+				zval *value_ptr = zend_get_bad_ptr();
 
 				/* If a function call result is yielded and the function did
 				 * not return by reference we throw a notice. */
@@ -12002,7 +12407,7 @@
 				}
 			} else if (IS_CONST == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -14120,7 +14525,7 @@
 {
 	USE_OPLINE
 	zval *val;
-	zend_uchar op1_type;
+	uint8_t op1_type;
 
 	val = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 
@@ -14154,7 +14559,7 @@
 {
 	USE_OPLINE
 	zval *val;
-	zend_uchar op1_type;
+	uint8_t op1_type;
 
 	val = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 
@@ -14184,41 +14589,6 @@
 	ZEND_VM_JMP(opline);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
-	USE_OPLINE
-	zval *val;
-	zend_uchar op1_type;
-
-	val = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
-
-	if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
-		ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
-		ZEND_VM_CONTINUE();
-	} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
-		if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
-			SAVE_OPLINE();
-			ZVAL_UNDEFINED_OP1();
-			if (UNEXPECTED(EG(exception))) {
-				HANDLE_EXCEPTION();
-			}
-		}
-		ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
-	}
-
-	SAVE_OPLINE();
-	op1_type = (IS_TMP_VAR|IS_VAR);
-	if (i_zend_is_true(val)) {
-		opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value);
-	} else {
-		opline = OP_JMP_ADDR(opline, opline->op2);
-	}
-	if (op1_type & (IS_TMP_VAR|IS_VAR)) {
-		zval_ptr_dtor_nogc(val);
-	}
-	ZEND_VM_JMP(opline);
-}
-
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
@@ -14401,7 +14771,7 @@
 	do {
 		if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
 		    ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
-		    if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
+			if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
 				obj = Z_REFVAL_P(obj);
 				if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
 					break;
@@ -14471,10 +14841,25 @@
 		if (RETURN_VALUE_USED(opline)) {
 			ZVAL_TRUE(EX_VAR(opline->result.var));
 		}
-	} else if (EXPECTED(new_op_array != NULL)) {
+	} else if (UNEXPECTED(new_op_array == NULL)) {
+		if (RETURN_VALUE_USED(opline)) {
+			ZVAL_FALSE(EX_VAR(opline->result.var));
+		}
+	} else if (new_op_array->last == 1
+			&& new_op_array->opcodes[0].opcode == ZEND_RETURN
+			&& new_op_array->opcodes[0].op1_type == IS_CONST
+			&& EXPECTED(zend_execute_ex == execute_ex)) {
+		if (RETURN_VALUE_USED(opline)) {
+			const zend_op *op = new_op_array->opcodes;
+
+			ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1));
+		}
+		zend_destroy_static_vars(new_op_array);
+		destroy_op_array(new_op_array);
+		efree_size(new_op_array, sizeof(zend_op_array));
+	} else {
 		zval *return_value = NULL;
 		zend_execute_data *call;
-
 		if (RETURN_VALUE_USED(opline)) {
 			return_value = EX_VAR(opline->result.var);
 		}
@@ -14482,7 +14867,7 @@
 		new_op_array->scope = EX(func)->op_array.scope;
 
 		call = zend_vm_stack_push_call_frame(
-		    (Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
+			(Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
 			(zend_function*)new_op_array, 0,
 			Z_PTR(EX(This)));
 
@@ -14513,8 +14898,6 @@
 			UNDEF_RESULT();
 			HANDLE_EXCEPTION();
 		}
-	} else if (RETURN_VALUE_USED(opline)) {
-		ZVAL_FALSE(EX_VAR(opline->result.var));
 	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	ZEND_VM_NEXT_OPCODE();
@@ -14679,7 +15062,7 @@
 				zval_ptr_dtor(&tmp);
 			}
 			if (!EG(exception)) {
-				zend_type_error("strlen(): Argument #1 ($str) must be of type string, %s given", zend_zval_type_name(value));
+				zend_type_error("strlen(): Argument #1 ($string) must be of type string, %s given", zend_zval_value_name(value));
 			}
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
 		} while (0);
@@ -14736,7 +15119,7 @@
 		if (UNEXPECTED(Z_TYPE_P(op) != IS_OBJECT)) {
 			ZVAL_DEREF(op);
 			if (Z_TYPE_P(op) != IS_OBJECT) {
-				zend_type_error("Cannot use \"::class\" on value of type %s", zend_zval_type_name(op));
+				zend_type_error("Cannot use \"::class\" on %s", zend_zval_value_name(op));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
 				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 				HANDLE_EXCEPTION();
@@ -14827,6 +15210,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
@@ -14848,7 +15232,7 @@
 			}
 		} else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			if (UNEXPECTED(len > ZSTR_MAX_LEN - ZSTR_LEN(op2_str))) {
 				zend_error_noreturn(E_ERROR, "Integer overflow in memory allocation");
@@ -14855,6 +15239,7 @@
 			}
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -14863,6 +15248,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -15323,7 +15709,7 @@
 
 	if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
 	    ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -15370,11 +15756,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_r_copy;
@@ -15406,10 +15791,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -15488,11 +15883,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_is_copy;
@@ -15558,6 +15952,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
@@ -15579,10 +15974,11 @@
 			}
 		} else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -15591,6 +15987,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -15651,6 +16048,8 @@
 		str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 		memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 		memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+
+		ZSTR_COPY_CONCAT_PROPERTIES_BOTH(str, op1_str, op2_str);
 		ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 		if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 			zend_string_release_ex(op1_str, 0);
@@ -15752,9 +16151,9 @@
 
 	if (IS_CONST == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if (IS_CONST == IS_CONST) {
 			function_name = RT_CONSTANT(opline, opline->op2);
@@ -16256,6 +16655,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
@@ -16277,7 +16677,7 @@
 			}
 		} else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			if (UNEXPECTED(len > ZSTR_MAX_LEN - ZSTR_LEN(op2_str))) {
 				zend_error_noreturn(E_ERROR, "Integer overflow in memory allocation");
@@ -16284,6 +16684,7 @@
 			}
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -16292,6 +16693,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -16752,7 +17154,7 @@
 
 	if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
 	    ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -16799,11 +17201,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_r_copy;
@@ -16835,10 +17236,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -16917,11 +17328,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_is_copy;
@@ -16987,6 +17397,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
@@ -17008,10 +17419,11 @@
 			}
 		} else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -17020,6 +17432,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -17080,6 +17493,8 @@
 		str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 		memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 		memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+
+		ZSTR_COPY_CONCAT_PROPERTIES_BOTH(str, op1_str, op2_str);
 		ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 		if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 			zend_string_release_ex(op1_str, 0);
@@ -17181,9 +17596,9 @@
 
 	if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 			function_name = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
@@ -17553,6 +17968,10 @@
 		} else if (type == BP_VAR_IS || type == BP_VAR_UNSET) {
 			retval = &EG(uninitialized_zval);
 		} else {
+			if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
+				/* Keep name alive in case an error handler tries to free it. */
+				zend_string_addref(name);
+			}
 			zend_error(E_WARNING, "Undefined %svariable $%s",
 				(opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), ZSTR_VAL(name));
 			if (type == BP_VAR_RW && !EG(exception)) {
@@ -17560,6 +17979,9 @@
 			} else {
 				retval = &EG(uninitialized_zval);
 			}
+			if ((IS_TMP_VAR|IS_VAR) == IS_CV) {
+				zend_string_release(name);
+			}
 		}
 	/* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
 	} else if (Z_TYPE_P(retval) == IS_INDIRECT) {
@@ -17823,7 +18245,8 @@
 			if (zend_class_implements_interface(zobj->ce, zend_ce_countable)) {
 				zval retval;
 
-				zend_call_method_with_0_params(zobj, NULL, NULL, "count", &retval);
+				zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT));
+				zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval);
 				count = zval_get_long(&retval);
 				zval_ptr_dtor(&retval);
 				break;
@@ -17837,7 +18260,7 @@
 			ZVAL_UNDEFINED_OP1();
 		}
 		count = 0;
-		zend_type_error("%s(): Argument #1 ($value) must be of type Countable|array, %s given", opline->extended_value ? "sizeof" : "count", zend_zval_type_name(op1));
+		zend_type_error("%s(): Argument #1 ($value) must be of type Countable|array, %s given", opline->extended_value ? "sizeof" : "count", zend_zval_value_name(op1));
 		break;
 	}
 
@@ -17846,18 +18269,37 @@
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+	USE_OPLINE
+	zend_array *ht = Z_ARRVAL_P(_get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC));
+	ZVAL_LONG(EX_VAR(opline->result.var), zend_hash_num_elements(ht));
+	if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR) && !(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) {
+		SAVE_OPLINE();
+		zend_array_destroy(ht);
+		if (EG(exception)) {
+			HANDLE_EXCEPTION();
+		}
+	}
+	ZEND_VM_NEXT_OPCODE();
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
 
 	if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+		SAVE_OPLINE();
 		if (UNEXPECTED(!EX(func)->common.scope)) {
-			SAVE_OPLINE();
 			zend_throw_error(NULL, "get_class() without arguments must be called from within a class");
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
 			HANDLE_EXCEPTION();
 		} else {
+			zend_error(E_DEPRECATED, "Calling get_class() without arguments is deprecated");
 			ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(func)->common.scope->name);
+			if (UNEXPECTED(EG(exception))) {
+				HANDLE_EXCEPTION();
+			}
 			ZEND_VM_NEXT_OPCODE();
 		}
 	} else {
@@ -17875,7 +18317,7 @@
 				if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
 					ZVAL_UNDEFINED_OP1();
 				}
-				zend_type_error("get_class(): Argument #1 ($object) must be of type object, %s given", zend_zval_type_name(op1));
+				zend_type_error("get_class(): Argument #1 ($object) must be of type object, %s given", zend_zval_value_name(op1));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
 			}
 			break;
@@ -17935,6 +18377,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (IS_CV == IS_CONST || IS_CV == IS_CV) {
@@ -17956,7 +18399,7 @@
 			}
 		} else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			if (UNEXPECTED(len > ZSTR_MAX_LEN - ZSTR_LEN(op2_str))) {
 				zend_error_noreturn(E_ERROR, "Integer overflow in memory allocation");
@@ -17963,6 +18406,7 @@
 			}
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -17971,6 +18415,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -18069,7 +18514,7 @@
 
 	if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
 	    ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -18116,11 +18561,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_r_copy;
@@ -18152,10 +18596,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -18234,11 +18688,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_is_copy;
@@ -18304,6 +18757,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if ((IS_TMP_VAR|IS_VAR) != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (IS_CV == IS_CONST || IS_CV == IS_CV) {
@@ -18325,10 +18779,11 @@
 			}
 		} else if ((IS_TMP_VAR|IS_VAR) != IS_CONST && (IS_TMP_VAR|IS_VAR) != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -18337,6 +18792,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -18397,6 +18853,8 @@
 		str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 		memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 		memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+
+		ZSTR_COPY_CONCAT_PROPERTIES_BOTH(str, op1_str, op2_str);
 		ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 		if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
 			zend_string_release_ex(op1_str, 0);
@@ -18498,9 +18956,9 @@
 
 	if (IS_CV == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if (IS_CV == IS_CONST) {
 			function_name = EX_VAR(opline->op2.var);
@@ -18888,7 +19346,7 @@
 			break;
 		}
 
-		retval_ptr = NULL;
+		retval_ptr = zend_get_bad_ptr();
 
 		if (IS_TMP_VAR == IS_VAR) {
 			ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
@@ -18897,7 +19355,7 @@
 				if (return_value) {
 					ZVAL_NEW_REF(return_value, retval_ptr);
 				} else {
-
+					zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 				}
 				break;
 			}
@@ -18912,6 +19370,7 @@
 			ZVAL_REF(return_value, Z_REF_P(retval_ptr));
 		}
 
+		zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	} while (0);
 
 
@@ -18954,6 +19413,8 @@
 		}
 	}
 
+	EG(current_execute_data) = EX(prev_execute_data);
+
 	/* Close the generator to free up resources */
 	zend_generator_close(generator, 1);
 
@@ -19136,7 +19597,7 @@
 			}
 		}
 	} else {
-		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
+		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array_ptr));
 		ZVAL_UNDEF(EX_VAR(opline->result.var));
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
 		zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
@@ -19152,7 +19613,7 @@
 	SAVE_OPLINE();
 
 	if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
-		array_ref = array_ptr = NULL;
+		array_ref = array_ptr = zend_get_bad_ptr();
 		if (Z_ISREF_P(array_ref)) {
 			array_ptr = Z_REFVAL_P(array_ref);
 		}
@@ -19180,9 +19641,6 @@
 		}
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
 
-		if (IS_TMP_VAR == IS_VAR) {
-
-		}
 		ZEND_VM_NEXT_OPCODE();
 	} else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@@ -19218,12 +19676,7 @@
 			ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 		} else {
 			bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
-
-			if (IS_TMP_VAR == IS_VAR) {
-
-			} else {
-				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
-			}
+			zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 			if (UNEXPECTED(EG(exception))) {
 				HANDLE_EXCEPTION();
 			} else if (is_empty) {
@@ -19233,14 +19686,10 @@
 			}
 		}
 	} else {
-		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
+		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array_ptr));
 		ZVAL_UNDEF(EX_VAR(opline->result.var));
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
-		if (IS_TMP_VAR == IS_VAR) {
-
-		} else {
-			zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
-		}
+		zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 		ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
 	}
 }
@@ -19365,9 +19814,13 @@
 	}
 
 	result = EX_VAR(opline->result.var);
-	if (EXPECTED(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
+	uint32_t short_circuiting_type = opline->extended_value & ZEND_SHORT_CIRCUITING_CHAIN_MASK;
+	if (EXPECTED(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
 		ZVAL_NULL(result);
-		if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(val) == IS_UNDEF)) {
+		if (IS_TMP_VAR == IS_CV
+			&& UNEXPECTED(Z_TYPE_P(val) == IS_UNDEF)
+			&& (opline->extended_value & ZEND_JMP_NULL_BP_VAR_IS) == 0
+		) {
 			SAVE_OPLINE();
 			ZVAL_UNDEFINED_OP1();
 			if (UNEXPECTED(EG(exception) != NULL)) {
@@ -19374,10 +19827,10 @@
 				HANDLE_EXCEPTION();
 			}
 		}
-	} else if (opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
+	} else if (short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
 		ZVAL_FALSE(result);
 	} else {
-		ZEND_ASSERT(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EMPTY);
+		ZEND_ASSERT(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EMPTY);
 		ZVAL_TRUE(result);
 	}
 
@@ -19473,9 +19926,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if (IS_CONST == IS_UNUSED) {
@@ -19543,8 +19996,6 @@
 	zend_string **rope;
 	zval *var, *ret;
 	uint32_t i;
-	size_t len = 0;
-	char *target;
 
 	rope = (zend_string**)EX_VAR(opline->op1.var);
 	if (IS_CONST == IS_CONST) {
@@ -19577,12 +20028,18 @@
 			}
 		}
 	}
+
+	size_t len = 0;
+	uint32_t flags = ZSTR_COPYABLE_CONCAT_PROPERTIES;
 	for (i = 0; i <= opline->extended_value; i++) {
+		flags &= ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(rope[i]);
 		len += ZSTR_LEN(rope[i]);
 	}
 	ret = EX_VAR(opline->result.var);
 	ZVAL_STR(ret, zend_string_alloc(len, 0));
-	target = Z_STRVAL_P(ret);
+	GC_ADD_FLAGS(Z_STR_P(ret), flags);
+
+	char *target = Z_STRVAL_P(ret);
 	for (i = 0; i <= opline->extended_value; i++) {
 		memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
 		target += ZSTR_LEN(rope[i]);
@@ -19638,13 +20095,13 @@
 	SAVE_OPLINE();
 	if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
 	    UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
-		expr_ptr = NULL;
+		expr_ptr = zend_get_bad_ptr();
 		if (Z_ISREF_P(expr_ptr)) {
 			Z_ADDREF_P(expr_ptr);
 		} else {
 			ZVAL_MAKE_REF_EX(expr_ptr, 2);
 		}
-
+		zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	} else {
 		expr_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
 		if (IS_TMP_VAR == IS_TMP_VAR) {
@@ -19713,7 +20170,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 
@@ -19782,7 +20239,7 @@
 					}
 				}
 			} else {
-				zval *value_ptr = NULL;
+				zval *value_ptr = zend_get_bad_ptr();
 
 				/* If a function call result is yielded and the function did
 				 * not return by reference we throw a notice. */
@@ -19804,6 +20261,7 @@
 					ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
 				} while (0);
 
+				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 			}
 		} else {
 			zval *value = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@@ -19816,7 +20274,7 @@
 				}
 			} else if (IS_TMP_VAR == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -19930,7 +20388,7 @@
 		}
 
 		SAVE_OPLINE();
-		ZEND_HASH_FOREACH_STR_KEY(ht, key) {
+		ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) {
 			ZVAL_STR(&key_tmp, key);
 			if (zend_compare(op1, &key_tmp) == 0) {
 				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
@@ -19949,9 +20407,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
@@ -20019,8 +20477,6 @@
 	zend_string **rope;
 	zval *var, *ret;
 	uint32_t i;
-	size_t len = 0;
-	char *target;
 
 	rope = (zend_string**)EX_VAR(opline->op1.var);
 	if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
@@ -20053,12 +20509,18 @@
 			}
 		}
 	}
+
+	size_t len = 0;
+	uint32_t flags = ZSTR_COPYABLE_CONCAT_PROPERTIES;
 	for (i = 0; i <= opline->extended_value; i++) {
+		flags &= ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(rope[i]);
 		len += ZSTR_LEN(rope[i]);
 	}
 	ret = EX_VAR(opline->result.var);
 	ZVAL_STR(ret, zend_string_alloc(len, 0));
-	target = Z_STRVAL_P(ret);
+	GC_ADD_FLAGS(Z_STR_P(ret), flags);
+
+	char *target = Z_STRVAL_P(ret);
 	for (i = 0; i <= opline->extended_value; i++) {
 		memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
 		target += ZSTR_LEN(rope[i]);
@@ -20077,13 +20539,13 @@
 	SAVE_OPLINE();
 	if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
 	    UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
-		expr_ptr = NULL;
+		expr_ptr = zend_get_bad_ptr();
 		if (Z_ISREF_P(expr_ptr)) {
 			Z_ADDREF_P(expr_ptr);
 		} else {
 			ZVAL_MAKE_REF_EX(expr_ptr, 2);
 		}
-
+		zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	} else {
 		expr_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
 		if (IS_TMP_VAR == IS_TMP_VAR) {
@@ -20152,7 +20614,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 		zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -20221,7 +20683,7 @@
 					}
 				}
 			} else {
-				zval *value_ptr = NULL;
+				zval *value_ptr = zend_get_bad_ptr();
 
 				/* If a function call result is yielded and the function did
 				 * not return by reference we throw a notice. */
@@ -20243,6 +20705,7 @@
 					ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
 				} while (0);
 
+				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 			}
 		} else {
 			zval *value = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@@ -20255,7 +20718,7 @@
 				}
 			} else if (IS_TMP_VAR == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -20375,9 +20838,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if (IS_UNUSED == IS_UNUSED) {
@@ -20537,13 +21000,13 @@
 	SAVE_OPLINE();
 	if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
 	    UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
-		expr_ptr = NULL;
+		expr_ptr = zend_get_bad_ptr();
 		if (Z_ISREF_P(expr_ptr)) {
 			Z_ADDREF_P(expr_ptr);
 		} else {
 			ZVAL_MAKE_REF_EX(expr_ptr, 2);
 		}
-
+		zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	} else {
 		expr_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
 		if (IS_TMP_VAR == IS_TMP_VAR) {
@@ -20612,7 +21075,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 
@@ -20681,7 +21144,7 @@
 					}
 				}
 			} else {
-				zval *value_ptr = NULL;
+				zval *value_ptr = zend_get_bad_ptr();
 
 				/* If a function call result is yielded and the function did
 				 * not return by reference we throw a notice. */
@@ -20703,6 +21166,7 @@
 					ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
 				} while (0);
 
+				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 			}
 		} else {
 			zval *value = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@@ -20715,7 +21179,7 @@
 				}
 			} else if (IS_TMP_VAR == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -20808,9 +21272,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if (IS_CV == IS_UNUSED) {
@@ -20878,8 +21342,6 @@
 	zend_string **rope;
 	zval *var, *ret;
 	uint32_t i;
-	size_t len = 0;
-	char *target;
 
 	rope = (zend_string**)EX_VAR(opline->op1.var);
 	if (IS_CV == IS_CONST) {
@@ -20912,12 +21374,18 @@
 			}
 		}
 	}
+
+	size_t len = 0;
+	uint32_t flags = ZSTR_COPYABLE_CONCAT_PROPERTIES;
 	for (i = 0; i <= opline->extended_value; i++) {
+		flags &= ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(rope[i]);
 		len += ZSTR_LEN(rope[i]);
 	}
 	ret = EX_VAR(opline->result.var);
 	ZVAL_STR(ret, zend_string_alloc(len, 0));
-	target = Z_STRVAL_P(ret);
+	GC_ADD_FLAGS(Z_STR_P(ret), flags);
+
+	char *target = Z_STRVAL_P(ret);
 	for (i = 0; i <= opline->extended_value; i++) {
 		memcpy(target, ZSTR_VAL(rope[i]), ZSTR_LEN(rope[i]));
 		target += ZSTR_LEN(rope[i]);
@@ -20936,13 +21404,13 @@
 	SAVE_OPLINE();
 	if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
 	    UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
-		expr_ptr = NULL;
+		expr_ptr = zend_get_bad_ptr();
 		if (Z_ISREF_P(expr_ptr)) {
 			Z_ADDREF_P(expr_ptr);
 		} else {
 			ZVAL_MAKE_REF_EX(expr_ptr, 2);
 		}
-
+		zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	} else {
 		expr_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
 		if (IS_TMP_VAR == IS_TMP_VAR) {
@@ -21011,7 +21479,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 
@@ -21080,7 +21548,7 @@
 					}
 				}
 			} else {
-				zval *value_ptr = NULL;
+				zval *value_ptr = zend_get_bad_ptr();
 
 				/* If a function call result is yielded and the function did
 				 * not return by reference we throw a notice. */
@@ -21102,6 +21570,7 @@
 					ZVAL_REF(&generator->value, Z_REF_P(value_ptr));
 				} while (0);
 
+				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 			}
 		} else {
 			zval *value = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
@@ -21114,7 +21583,7 @@
 				}
 			} else if (IS_TMP_VAR == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -21612,6 +22081,8 @@
 		}
 	}
 
+	EG(current_execute_data) = EX(prev_execute_data);
+
 	/* Close the generator to free up resources */
 	zend_generator_close(generator, 1);
 
@@ -21796,7 +22267,7 @@
 			}
 		}
 	} else {
-		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
+		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array_ptr));
 		ZVAL_UNDEF(EX_VAR(opline->result.var));
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
 		zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
@@ -21840,9 +22311,7 @@
 		}
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
 
-		if (IS_VAR == IS_VAR) {
-			zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
-		}
+		zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 		ZEND_VM_NEXT_OPCODE();
 	} else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@@ -21878,12 +22347,7 @@
 			ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 		} else {
 			bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
-
-			if (IS_VAR == IS_VAR) {
-				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
-			} else {
-				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
-			}
+			zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 			if (UNEXPECTED(EG(exception))) {
 				HANDLE_EXCEPTION();
 			} else if (is_empty) {
@@ -21893,14 +22357,10 @@
 			}
 		}
 	} else {
-		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
+		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array_ptr));
 		ZVAL_UNDEF(EX_VAR(opline->result.var));
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
-		if (IS_VAR == IS_VAR) {
-			zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
-		} else {
-			zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
-		}
+		zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 		ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
 	}
 }
@@ -21913,7 +22373,6 @@
 	uint32_t value_type;
 	HashTable *fe_ht;
 	HashPosition pos;
-	Bucket *p;
 
 	array = EX_VAR(opline->op1.var);
 	if (UNEXPECTED(Z_TYPE_P(array) != IS_ARRAY)) {
@@ -21921,31 +22380,54 @@
 	}
 	fe_ht = Z_ARRVAL_P(array);
 	pos = Z_FE_POS_P(array);
-	p = fe_ht->arData + pos;
-	while (1) {
-		if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
-			/* reached end of iteration */
-			ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
-			ZEND_VM_CONTINUE();
+	if (HT_IS_PACKED(fe_ht)) {
+		value = fe_ht->arPacked + pos;
+		while (1) {
+			if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+				/* reached end of iteration */
+				ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+				ZEND_VM_CONTINUE();
+			}
+			value_type = Z_TYPE_INFO_P(value);
+			ZEND_ASSERT(value_type != IS_INDIRECT);
+			if (EXPECTED(value_type != IS_UNDEF)) {
+				break;
+			}
+			pos++;
+			value++;
 		}
-		pos++;
-		value = &p->val;
-		value_type = Z_TYPE_INFO_P(value);
-		ZEND_ASSERT(value_type != IS_INDIRECT);
-		if (EXPECTED(value_type != IS_UNDEF)) {
-			break;
+		Z_FE_POS_P(array) = pos + 1;
+		if (RETURN_VALUE_USED(opline)) {
+			ZVAL_LONG(EX_VAR(opline->result.var), pos);
 		}
-		p++;
-	}
-	Z_FE_POS_P(array) = pos;
-	if (RETURN_VALUE_USED(opline)) {
-		if (!p->key) {
-			ZVAL_LONG(EX_VAR(opline->result.var), p->h);
-		} else {
-			ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+	} else {
+		Bucket *p;
+
+		p = fe_ht->arData + pos;
+		while (1) {
+			if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+				/* reached end of iteration */
+				ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+				ZEND_VM_CONTINUE();
+			}
+			pos++;
+			value = &p->val;
+			value_type = Z_TYPE_INFO_P(value);
+			ZEND_ASSERT(value_type != IS_INDIRECT);
+			if (EXPECTED(value_type != IS_UNDEF)) {
+				break;
+			}
+			p++;
 		}
+		Z_FE_POS_P(array) = pos;
+		if (RETURN_VALUE_USED(opline)) {
+			if (!p->key) {
+				ZVAL_LONG(EX_VAR(opline->result.var), p->h);
+			} else {
+				ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+			}
+		}
 	}
-
 	if (EXPECTED(opline->op2_type == IS_CV)) {
 		zval *variable_ptr = EX_VAR(opline->op2.var);
 		SAVE_OPLINE();
@@ -21980,28 +22462,49 @@
 	if (EXPECTED(Z_TYPE_P(array) == IS_ARRAY)) {
 		pos = zend_hash_iterator_pos_ex(Z_FE_ITER_P(EX_VAR(opline->op1.var)), array);
 		fe_ht = Z_ARRVAL_P(array);
-		p = fe_ht->arData + pos;
-		while (1) {
-			if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
-				/* reached end of iteration */
-				goto fe_fetch_w_exit;
+		if (HT_IS_PACKED(fe_ht)) {
+			value = fe_ht->arPacked + pos;
+			while (1) {
+				if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+					/* reached end of iteration */
+					goto fe_fetch_w_exit;
+				}
+				value_type = Z_TYPE_INFO_P(value);
+				ZEND_ASSERT(value_type != IS_INDIRECT);
+				if (EXPECTED(value_type != IS_UNDEF)) {
+					break;
+				}
+				pos++;
+				value++;
 			}
-			pos++;
-			value = &p->val;
-			value_type = Z_TYPE_INFO_P(value);
-			ZEND_ASSERT(value_type != IS_INDIRECT);
-			if (EXPECTED(value_type != IS_UNDEF)) {
-				break;
+			EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos + 1;
+			if (RETURN_VALUE_USED(opline)) {
+				ZVAL_LONG(EX_VAR(opline->result.var), pos);
 			}
-			p++;
-		}
-		EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
-		if (RETURN_VALUE_USED(opline)) {
-			if (!p->key) {
-				ZVAL_LONG(EX_VAR(opline->result.var), p->h);
-			} else {
-				ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+		} else {
+			p = fe_ht->arData + pos;
+			while (1) {
+				if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+					/* reached end of iteration */
+					goto fe_fetch_w_exit;
+				}
+				pos++;
+				value = &p->val;
+				value_type = Z_TYPE_INFO_P(value);
+				ZEND_ASSERT(value_type != IS_INDIRECT);
+				if (EXPECTED(value_type != IS_UNDEF)) {
+					break;
+				}
+				p++;
 			}
+			EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
+			if (RETURN_VALUE_USED(opline)) {
+				if (!p->key) {
+					ZVAL_LONG(EX_VAR(opline->result.var), p->h);
+				} else {
+					ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+				}
+			}
 		}
 	} else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) {
 		zend_object_iterator *iter;
@@ -22110,7 +22613,7 @@
 			value_type = Z_TYPE_INFO_P(value);
 		}
 	} else {
-		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array));
+		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array));
 		if (UNEXPECTED(EG(exception))) {
 			UNDEF_RESULT();
 			HANDLE_EXCEPTION();
@@ -22253,9 +22756,13 @@
 	}
 
 	result = EX_VAR(opline->result.var);
-	if (EXPECTED(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
+	uint32_t short_circuiting_type = opline->extended_value & ZEND_SHORT_CIRCUITING_CHAIN_MASK;
+	if (EXPECTED(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
 		ZVAL_NULL(result);
-		if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(val) == IS_UNDEF)) {
+		if (IS_VAR == IS_CV
+			&& UNEXPECTED(Z_TYPE_P(val) == IS_UNDEF)
+			&& (opline->extended_value & ZEND_JMP_NULL_BP_VAR_IS) == 0
+		) {
 			SAVE_OPLINE();
 			ZVAL_UNDEFINED_OP1();
 			if (UNEXPECTED(EG(exception) != NULL)) {
@@ -22262,10 +22769,10 @@
 				HANDLE_EXCEPTION();
 			}
 		}
-	} else if (opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
+	} else if (short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
 		ZVAL_FALSE(result);
 	} else {
-		ZEND_ASSERT(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EMPTY);
+		ZEND_ASSERT(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EMPTY);
 		ZVAL_TRUE(result);
 	}
 
@@ -22536,7 +23043,7 @@
 			}
 			zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
 		} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
-			zend_uchar old_type;
+			uint8_t old_type;
 
 			if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
 				ZVAL_UNDEFINED_OP1();
@@ -22768,9 +23275,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if (IS_CONST == IS_UNUSED) {
@@ -22808,7 +23315,7 @@
 	zend_fetch_property_address(
 		result, container, IS_VAR, property, IS_CONST,
 		((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -22825,7 +23332,7 @@
 	container = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 	property = RT_CONSTANT(opline, opline->op2);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -22859,7 +23366,7 @@
 	container = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 	property = RT_CONSTANT(opline, opline->op2);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -22895,6 +23402,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -22916,7 +23424,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -22925,11 +23432,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -22951,7 +23458,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -23008,11 +23515,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* assign_obj has two opcodes! */
@@ -23026,6 +23536,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -23047,7 +23558,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -23056,11 +23566,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -23082,7 +23592,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -23139,11 +23649,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* assign_obj has two opcodes! */
@@ -23157,6 +23670,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -23178,7 +23692,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -23187,11 +23700,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -23213,7 +23726,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -23270,11 +23783,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* assign_obj has two opcodes! */
@@ -23288,6 +23804,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -23309,7 +23826,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -23318,11 +23834,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -23344,7 +23860,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -23401,11 +23917,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* assign_obj has two opcodes! */
@@ -23420,6 +23939,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -23475,11 +23995,14 @@
 				goto assign_dim_error;
 			}
 			value = RT_CONSTANT((opline+1), (opline+1)->op1);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -23530,7 +24053,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -23568,6 +24091,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -23623,11 +24147,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -23679,7 +24206,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -23717,6 +24244,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -23772,11 +24300,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -23828,7 +24359,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -23866,6 +24397,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -23921,11 +24453,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -23976,7 +24511,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -24017,9 +24552,18 @@
 	value = RT_CONSTANT(opline, opline->op2);
 	variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(0)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(0)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(0)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
 	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -24037,9 +24581,18 @@
 	value = RT_CONSTANT(opline, opline->op2);
 	variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(1)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(1)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(1)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
 	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -24079,7 +24632,7 @@
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 
-	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
+	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -24551,63 +25104,118 @@
 {
 	zend_class_entry *ce, *scope;
 	zend_class_constant *c;
-	zval *value, *zv;
+	zval *value, *zv, *constant_zv;
+	zend_string *constant_name;
 	USE_OPLINE
 
 	SAVE_OPLINE();
 
 	do {
-		if (IS_VAR == IS_CONST) {
+		if (IS_VAR == IS_CONST && IS_CONST == IS_CONST) {
 			if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
 				value = CACHED_PTR(opline->extended_value + sizeof(void*));
 				break;
-			} else if (EXPECTED(CACHED_PTR(opline->extended_value))) {
+			}
+		}
+		if (IS_VAR == IS_CONST) {
+			if (EXPECTED(CACHED_PTR(opline->extended_value))) {
 				ce = CACHED_PTR(opline->extended_value);
 			} else {
 				ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
 				if (UNEXPECTED(ce == NULL)) {
 					ZVAL_UNDEF(EX_VAR(opline->result.var));
+
 					HANDLE_EXCEPTION();
 				}
+				CACHE_PTR(opline->extended_value, ce);
 			}
+		} else if (IS_VAR == IS_UNUSED) {
+			ce = zend_fetch_class(NULL, opline->op1.num);
+			if (UNEXPECTED(ce == NULL)) {
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+				HANDLE_EXCEPTION();
+			}
 		} else {
-			if (IS_VAR == IS_UNUSED) {
-				ce = zend_fetch_class(NULL, opline->op1.num);
-				if (UNEXPECTED(ce == NULL)) {
-					ZVAL_UNDEF(EX_VAR(opline->result.var));
-					HANDLE_EXCEPTION();
-				}
-			} else {
-				ce = Z_CE_P(EX_VAR(opline->op1.var));
-			}
-			if (EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
-				value = CACHED_PTR(opline->extended_value + sizeof(void*));
-				break;
-			}
+			ce = Z_CE_P(EX_VAR(opline->op1.var));
 		}
+		if (IS_VAR != IS_CONST
+			&& IS_CONST == IS_CONST
+			&& EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
+			value = CACHED_PTR(opline->extended_value + sizeof(void*));
+			break;
+		}
 
-		zv = zend_hash_find_known_hash(CE_CONSTANTS_TABLE(ce), Z_STR_P(RT_CONSTANT(opline, opline->op2)));
+		constant_zv = RT_CONSTANT(opline, opline->op2);
+		if (UNEXPECTED(Z_TYPE_P(constant_zv) != IS_STRING)) {
+			zend_invalid_class_constant_type_error(Z_TYPE_P(constant_zv));
+			ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+			HANDLE_EXCEPTION();
+		}
+		constant_name = Z_STR_P(constant_zv);
+		/* Magic 'class' for constant OP2 is caught at compile-time */
+		if (IS_CONST != IS_CONST && UNEXPECTED(zend_string_equals_literal_ci(constant_name, "class"))) {
+			ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
+
+			ZEND_VM_NEXT_OPCODE();
+		}
+		zv = IS_CONST == IS_CONST
+			? zend_hash_find_known_hash(CE_CONSTANTS_TABLE(ce), constant_name)
+			: zend_hash_find(CE_CONSTANTS_TABLE(ce), constant_name);
+
 		if (EXPECTED(zv != NULL)) {
 			c = Z_PTR_P(zv);
 			scope = EX(func)->op_array.scope;
 			if (!zend_verify_const_access(c, scope)) {
-				zend_throw_error(NULL, "Cannot access %s constant %s::%s", zend_visibility_string(ZEND_CLASS_CONST_FLAGS(c)), ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
+				zend_throw_error(NULL, "Cannot access %s constant %s::%s", zend_visibility_string(ZEND_CLASS_CONST_FLAGS(c)), ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
+
 				HANDLE_EXCEPTION();
 			}
+
+			if (ce->ce_flags & ZEND_ACC_TRAIT) {
+				zend_throw_error(NULL, "Cannot access trait constant %s::%s directly", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+				HANDLE_EXCEPTION();
+			}
+
+			bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
+			if (UNEXPECTED(is_constant_deprecated)) {
+				zend_error(E_DEPRECATED, "Constant %s::%s is deprecated", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+
+				if (EG(exception)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+					HANDLE_EXCEPTION();
+				}
+			}
+
 			value = &c->value;
+			// Enums require loading of all class constants to build the backed enum table
+			if (ce->ce_flags & ZEND_ACC_ENUM && ce->enum_backing_type != IS_UNDEF && ce->type == ZEND_USER_CLASS && !(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
+				if (UNEXPECTED(zend_update_class_constants(ce) == FAILURE)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+					HANDLE_EXCEPTION();
+				}
+			}
 			if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
-				zval_update_constant_ex(value, c->ce);
-				if (UNEXPECTED(EG(exception) != NULL)) {
+				if (UNEXPECTED(zend_update_class_constant(c, constant_name, c->ce) != SUCCESS)) {
 					ZVAL_UNDEF(EX_VAR(opline->result.var));
+
 					HANDLE_EXCEPTION();
 				}
 			}
-			CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
+			if (IS_CONST == IS_CONST && !is_constant_deprecated) {
+				CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
+			}
 		} else {
 			zend_throw_error(NULL, "Undefined constant %s::%s",
-				ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
+				ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
+
 			HANDLE_EXCEPTION();
 		}
 	} while (0);
@@ -24700,7 +25308,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 
@@ -24792,7 +25400,7 @@
 				key = ZSTR_EMPTY_ALLOC();
 				goto str_index_dim;
 			} else {
-				zend_type_error("Illegal offset type in unset");
+				zend_illegal_array_offset_unset(offset);
 			}
 			break;
 		} else if (Z_ISREF_P(container)) {
@@ -24939,7 +25547,7 @@
 				}
 			} else if (IS_VAR == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 			} else {
@@ -25053,7 +25661,7 @@
 		}
 
 		SAVE_OPLINE();
-		ZEND_HASH_FOREACH_STR_KEY(ht, key) {
+		ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) {
 			ZVAL_STR(&key_tmp, key);
 			if (zend_compare(op1, &key_tmp) == 0) {
 				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
@@ -25065,6 +25673,132 @@
 	ZEND_VM_SMART_BRANCH(0, 1);
 }
 
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+	zend_class_entry *ce, *scope;
+	zend_class_constant *c;
+	zval *value, *zv, *constant_zv;
+	zend_string *constant_name;
+	USE_OPLINE
+
+	SAVE_OPLINE();
+
+	do {
+		if (IS_VAR == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+			if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
+				value = CACHED_PTR(opline->extended_value + sizeof(void*));
+				break;
+			}
+		}
+		if (IS_VAR == IS_CONST) {
+			if (EXPECTED(CACHED_PTR(opline->extended_value))) {
+				ce = CACHED_PTR(opline->extended_value);
+			} else {
+				ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+				if (UNEXPECTED(ce == NULL)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP(opline->op2_type, opline->op2.var);
+					HANDLE_EXCEPTION();
+				}
+				CACHE_PTR(opline->extended_value, ce);
+			}
+		} else if (IS_VAR == IS_UNUSED) {
+			ce = zend_fetch_class(NULL, opline->op1.num);
+			if (UNEXPECTED(ce == NULL)) {
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+				FREE_OP(opline->op2_type, opline->op2.var);
+				HANDLE_EXCEPTION();
+			}
+		} else {
+			ce = Z_CE_P(EX_VAR(opline->op1.var));
+		}
+		if (IS_VAR != IS_CONST
+			&& (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST
+			&& EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
+			value = CACHED_PTR(opline->extended_value + sizeof(void*));
+			break;
+		}
+
+		constant_zv = _get_zval_ptr_tmpvarcv(opline->op2_type, opline->op2, BP_VAR_R EXECUTE_DATA_CC);
+		if (UNEXPECTED(Z_TYPE_P(constant_zv) != IS_STRING)) {
+			zend_invalid_class_constant_type_error(Z_TYPE_P(constant_zv));
+			ZVAL_UNDEF(EX_VAR(opline->result.var));
+			FREE_OP(opline->op2_type, opline->op2.var);
+			HANDLE_EXCEPTION();
+		}
+		constant_name = Z_STR_P(constant_zv);
+		/* Magic 'class' for constant OP2 is caught at compile-time */
+		if ((IS_TMP_VAR|IS_VAR|IS_CV) != IS_CONST && UNEXPECTED(zend_string_equals_literal_ci(constant_name, "class"))) {
+			ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
+			FREE_OP(opline->op2_type, opline->op2.var);
+			ZEND_VM_NEXT_OPCODE();
+		}
+		zv = (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST
+			? zend_hash_find_known_hash(CE_CONSTANTS_TABLE(ce), constant_name)
+			: zend_hash_find(CE_CONSTANTS_TABLE(ce), constant_name);
+
+		if (EXPECTED(zv != NULL)) {
+			c = Z_PTR_P(zv);
+			scope = EX(func)->op_array.scope;
+			if (!zend_verify_const_access(c, scope)) {
+				zend_throw_error(NULL, "Cannot access %s constant %s::%s", zend_visibility_string(ZEND_CLASS_CONST_FLAGS(c)), ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+				FREE_OP(opline->op2_type, opline->op2.var);
+				HANDLE_EXCEPTION();
+			}
+
+			if (ce->ce_flags & ZEND_ACC_TRAIT) {
+				zend_throw_error(NULL, "Cannot access trait constant %s::%s directly", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+				FREE_OP(opline->op2_type, opline->op2.var);
+				HANDLE_EXCEPTION();
+			}
+
+			bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
+			if (UNEXPECTED(is_constant_deprecated)) {
+				zend_error(E_DEPRECATED, "Constant %s::%s is deprecated", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+
+				if (EG(exception)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP(opline->op2_type, opline->op2.var);
+					HANDLE_EXCEPTION();
+				}
+			}
+
+			value = &c->value;
+			// Enums require loading of all class constants to build the backed enum table
+			if (ce->ce_flags & ZEND_ACC_ENUM && ce->enum_backing_type != IS_UNDEF && ce->type == ZEND_USER_CLASS && !(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
+				if (UNEXPECTED(zend_update_class_constants(ce) == FAILURE)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP(opline->op2_type, opline->op2.var);
+					HANDLE_EXCEPTION();
+				}
+			}
+			if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
+				if (UNEXPECTED(zend_update_class_constant(c, constant_name, c->ce) != SUCCESS)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP(opline->op2_type, opline->op2.var);
+					HANDLE_EXCEPTION();
+				}
+			}
+			if ((IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && !is_constant_deprecated) {
+				CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
+			}
+		} else {
+			zend_throw_error(NULL, "Undefined constant %s::%s",
+				ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+			ZVAL_UNDEF(EX_VAR(opline->result.var));
+			FREE_OP(opline->op2_type, opline->op2.var);
+			HANDLE_EXCEPTION();
+		}
+	} while (0);
+
+	ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), value);
+
+	FREE_OP(opline->op2_type, opline->op2.var);
+	ZEND_VM_NEXT_OPCODE();
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
@@ -25230,7 +25964,7 @@
 			}
 			zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
 		} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
-			zend_uchar old_type;
+			uint8_t old_type;
 
 			if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
 				ZVAL_UNDEFINED_OP1();
@@ -25466,9 +26200,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
@@ -25506,7 +26240,7 @@
 	zend_fetch_property_address(
 		result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR),
 		(((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -25523,7 +26257,7 @@
 	container = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 	property = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -25557,7 +26291,7 @@
 	container = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 	property = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -25594,6 +26328,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -25615,7 +26350,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -25624,11 +26358,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -25650,7 +26384,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -25707,11 +26441,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* assign_obj has two opcodes! */
@@ -25725,6 +26462,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -25746,7 +26484,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -25755,11 +26492,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -25781,7 +26518,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -25838,11 +26575,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* assign_obj has two opcodes! */
@@ -25856,6 +26596,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -25877,7 +26618,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -25886,11 +26626,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -25912,7 +26652,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -25969,11 +26709,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* assign_obj has two opcodes! */
@@ -25987,6 +26730,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -26008,7 +26752,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -26017,11 +26760,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -26043,7 +26786,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -26100,11 +26843,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* assign_obj has two opcodes! */
@@ -26119,6 +26865,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -26174,11 +26921,14 @@
 				goto assign_dim_error;
 			}
 			value = RT_CONSTANT((opline+1), (opline+1)->op1);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -26229,7 +26979,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -26267,6 +27017,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -26322,11 +27073,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -26378,7 +27132,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -26416,6 +27170,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -26471,11 +27226,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -26527,7 +27285,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -26565,6 +27323,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -26620,11 +27379,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -26675,7 +27437,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -26738,7 +27500,7 @@
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
+	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -26996,7 +27758,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 		zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -27088,7 +27850,7 @@
 				key = ZSTR_EMPTY_ALLOC();
 				goto str_index_dim;
 			} else {
-				zend_type_error("Illegal offset type in unset");
+				zend_illegal_array_offset_unset(offset);
 			}
 			break;
 		} else if (Z_ISREF_P(container)) {
@@ -27237,7 +27999,7 @@
 				}
 			} else if (IS_VAR == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 			} else {
@@ -27346,9 +28108,18 @@
 	value = _get_zval_ptr_tmp(opline->op2.var EXECUTE_DATA_CC);
 	variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(0)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(0)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(0)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
 	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -27366,9 +28137,18 @@
 	value = _get_zval_ptr_tmp(opline->op2.var EXECUTE_DATA_CC);
 	variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(1)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(1)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(1)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
 	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -27430,9 +28210,18 @@
 	value = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(0)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(0)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(0)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
 	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -27450,9 +28239,18 @@
 	value = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(1)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(1)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(1)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
 	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -27465,6 +28263,7 @@
 	USE_OPLINE
 	zval *variable_ptr;
 	zval *value_ptr;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	value_ptr = _get_zval_ptr_ptr_var(opline->op2.var EXECUTE_DATA_CC);
@@ -27480,9 +28279,9 @@
 			   UNEXPECTED(!Z_ISREF_P(value_ptr))) {
 
 		variable_ptr = zend_wrong_assign_to_variable_reference(
-			variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+			variable_ptr, value_ptr, &garbage OPLINE_CC EXECUTE_DATA_CC);
 	} else {
-		zend_assign_to_variable_reference(variable_ptr, value_ptr);
+		zend_assign_to_variable_reference(variable_ptr, value_ptr, &garbage);
 	}
 
 	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -27489,6 +28288,10 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
 	}
 
+	if (garbage) {
+		GC_DTOR(garbage);
+	}
+
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -27562,7 +28365,7 @@
 			}
 			zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
 		} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
-			zend_uchar old_type;
+			uint8_t old_type;
 
 			if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
 				ZVAL_UNDEFINED_OP1();
@@ -27631,9 +28434,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if (IS_UNUSED == IS_UNUSED) {
@@ -27650,6 +28453,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -27705,11 +28509,14 @@
 				goto assign_dim_error;
 			}
 			value = RT_CONSTANT((opline+1), (opline+1)->op1);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -27760,7 +28567,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -27798,6 +28605,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -27853,11 +28661,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -27909,7 +28720,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -27947,6 +28758,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -28002,11 +28814,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -28058,7 +28873,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -28096,6 +28911,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -28151,11 +28967,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -28206,7 +29025,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -29017,7 +29836,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 
@@ -29136,7 +29955,7 @@
 				}
 			} else if (IS_VAR == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 			} else {
@@ -29442,7 +30261,7 @@
 			}
 			zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
 		} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
-			zend_uchar old_type;
+			uint8_t old_type;
 
 			if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
 				ZVAL_UNDEFINED_OP1();
@@ -29674,9 +30493,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if (IS_CV == IS_UNUSED) {
@@ -29714,7 +30533,7 @@
 	zend_fetch_property_address(
 		result, container, IS_VAR, property, IS_CV,
 		((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -29731,7 +30550,7 @@
 	container = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 	property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -29765,7 +30584,7 @@
 	container = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 	property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -29801,6 +30620,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -29822,7 +30642,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -29831,11 +30650,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -29857,7 +30676,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -29914,11 +30733,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* assign_obj has two opcodes! */
@@ -29932,6 +30754,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -29953,7 +30776,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -29962,11 +30784,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -29988,7 +30810,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -30045,11 +30867,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* assign_obj has two opcodes! */
@@ -30063,6 +30888,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -30084,7 +30910,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -30093,11 +30918,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -30119,7 +30944,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -30176,11 +31001,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* assign_obj has two opcodes! */
@@ -30194,6 +31022,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -30215,7 +31044,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -30224,11 +31052,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -30250,7 +31078,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -30307,11 +31135,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* assign_obj has two opcodes! */
@@ -30326,6 +31157,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -30381,11 +31213,14 @@
 				goto assign_dim_error;
 			}
 			value = RT_CONSTANT((opline+1), (opline+1)->op1);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -30436,7 +31271,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -30474,6 +31309,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -30529,11 +31365,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -30585,7 +31424,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -30623,6 +31462,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -30678,11 +31518,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -30734,7 +31577,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -30772,6 +31615,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
@@ -30827,11 +31671,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -30882,7 +31729,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -30923,9 +31770,18 @@
 	value = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(0)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(0)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(0)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
 	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -30943,9 +31799,18 @@
 	value = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(1)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(1)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(1)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
 	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -30958,6 +31823,7 @@
 	USE_OPLINE
 	zval *variable_ptr;
 	zval *value_ptr;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	value_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
@@ -30973,9 +31839,9 @@
 			   UNEXPECTED(!Z_ISREF_P(value_ptr))) {
 
 		variable_ptr = zend_wrong_assign_to_variable_reference(
-			variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+			variable_ptr, value_ptr, &garbage OPLINE_CC EXECUTE_DATA_CC);
 	} else {
-		zend_assign_to_variable_reference(variable_ptr, value_ptr);
+		zend_assign_to_variable_reference(variable_ptr, value_ptr, &garbage);
 	}
 
 	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -30982,6 +31848,10 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
 	}
 
+	if (garbage) {
+		GC_DTOR(garbage);
+	}
+
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
@@ -31018,7 +31888,7 @@
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 
-	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
+	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -31276,7 +32146,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 
@@ -31368,7 +32238,7 @@
 				key = ZSTR_EMPTY_ALLOC();
 				goto str_index_dim;
 			} else {
-				zend_type_error("Illegal offset type in unset");
+				zend_illegal_array_offset_unset(offset);
 			}
 			break;
 		} else if (Z_ISREF_P(container)) {
@@ -31515,7 +32385,7 @@
 				}
 			} else if (IS_VAR == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 				zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
 			} else {
@@ -31577,35 +32447,58 @@
 	uint32_t value_type;
 	HashTable *fe_ht;
 	HashPosition pos;
-	Bucket *p;
 
 	array = EX_VAR(opline->op1.var);
 	SAVE_OPLINE();
 	fe_ht = Z_ARRVAL_P(array);
 	pos = Z_FE_POS_P(array);
-	p = fe_ht->arData + pos;
-	while (1) {
-		if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
-			/* reached end of iteration */
-			ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
-			ZEND_VM_CONTINUE();
+	if (HT_IS_PACKED(fe_ht)) {
+		value = fe_ht->arPacked + pos;
+		while (1) {
+			if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+				/* reached end of iteration */
+				ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+				ZEND_VM_CONTINUE();
+			}
+			value_type = Z_TYPE_INFO_P(value);
+			ZEND_ASSERT(value_type != IS_INDIRECT);
+			if (EXPECTED(value_type != IS_UNDEF)) {
+				break;
+			}
+			pos++;
+			value++;
 		}
-		pos++;
-		value = &p->val;
-		value_type = Z_TYPE_INFO_P(value);
-		ZEND_ASSERT(value_type != IS_INDIRECT);
-		if (EXPECTED(value_type != IS_UNDEF)) {
-			break;
+		Z_FE_POS_P(array) = pos + 1;
+		if (0) {
+			ZVAL_LONG(EX_VAR(opline->result.var), pos);
 		}
-		p++;
-	}
-	Z_FE_POS_P(array) = pos;
-	if (0) {
-		if (!p->key) {
-			ZVAL_LONG(EX_VAR(opline->result.var), p->h);
-		} else {
-			ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+	} else {
+		Bucket *p;
+
+		p = fe_ht->arData + pos;
+		while (1) {
+			if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+				/* reached end of iteration */
+				ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+				ZEND_VM_CONTINUE();
+			}
+			pos++;
+			value = &p->val;
+			value_type = Z_TYPE_INFO_P(value);
+			ZEND_ASSERT(value_type != IS_INDIRECT);
+			if (EXPECTED(value_type != IS_UNDEF)) {
+				break;
+			}
+			p++;
 		}
+		Z_FE_POS_P(array) = pos;
+		if (0) {
+			if (!p->key) {
+				ZVAL_LONG(EX_VAR(opline->result.var), p->h);
+			} else {
+				ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+			}
+		}
 	}
 
 	variable_ptr = EX_VAR(opline->op2.var);
@@ -31622,35 +32515,58 @@
 	uint32_t value_type;
 	HashTable *fe_ht;
 	HashPosition pos;
-	Bucket *p;
 
 	array = EX_VAR(opline->op1.var);
 	SAVE_OPLINE();
 	fe_ht = Z_ARRVAL_P(array);
 	pos = Z_FE_POS_P(array);
-	p = fe_ht->arData + pos;
-	while (1) {
-		if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
-			/* reached end of iteration */
-			ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
-			ZEND_VM_CONTINUE();
+	if (HT_IS_PACKED(fe_ht)) {
+		value = fe_ht->arPacked + pos;
+		while (1) {
+			if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+				/* reached end of iteration */
+				ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+				ZEND_VM_CONTINUE();
+			}
+			value_type = Z_TYPE_INFO_P(value);
+			ZEND_ASSERT(value_type != IS_INDIRECT);
+			if (EXPECTED(value_type != IS_UNDEF)) {
+				break;
+			}
+			pos++;
+			value++;
 		}
-		pos++;
-		value = &p->val;
-		value_type = Z_TYPE_INFO_P(value);
-		ZEND_ASSERT(value_type != IS_INDIRECT);
-		if (EXPECTED(value_type != IS_UNDEF)) {
-			break;
+		Z_FE_POS_P(array) = pos + 1;
+		if (1) {
+			ZVAL_LONG(EX_VAR(opline->result.var), pos);
 		}
-		p++;
-	}
-	Z_FE_POS_P(array) = pos;
-	if (1) {
-		if (!p->key) {
-			ZVAL_LONG(EX_VAR(opline->result.var), p->h);
-		} else {
-			ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+	} else {
+		Bucket *p;
+
+		p = fe_ht->arData + pos;
+		while (1) {
+			if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
+				/* reached end of iteration */
+				ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
+				ZEND_VM_CONTINUE();
+			}
+			pos++;
+			value = &p->val;
+			value_type = Z_TYPE_INFO_P(value);
+			ZEND_ASSERT(value_type != IS_INDIRECT);
+			if (EXPECTED(value_type != IS_UNDEF)) {
+				break;
+			}
+			p++;
 		}
+		Z_FE_POS_P(array) = pos;
+		if (1) {
+			if (!p->key) {
+				ZVAL_LONG(EX_VAR(opline->result.var), p->h);
+			} else {
+				ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
+			}
+		}
 	}
 
 	variable_ptr = EX_VAR(opline->op2.var);
@@ -31674,7 +32590,7 @@
 	do {
 		if (IS_UNUSED == IS_CONST ||
 		    (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
-		    if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
+			if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
 				obj = Z_REFVAL_P(obj);
 				if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
 					break;
@@ -31734,7 +32650,7 @@
 		if (UNEXPECTED(Z_TYPE_P(op) != IS_OBJECT)) {
 			ZVAL_DEREF(op);
 			if (Z_TYPE_P(op) != IS_OBJECT) {
-				zend_type_error("Cannot use \"::class\" on value of type %s", zend_zval_type_name(op));
+				zend_type_error("Cannot use \"::class\" on %s", zend_zval_value_name(op));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
 
 				HANDLE_EXCEPTION();
@@ -32025,7 +32941,7 @@
 
 	if (IS_UNUSED == IS_CONST ||
 	    (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -32072,11 +32988,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_r_copy;
@@ -32108,10 +33023,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -32151,7 +33076,7 @@
 	zend_fetch_property_address(
 		result, container, IS_UNUSED, property, IS_CONST,
 		((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -32168,7 +33093,7 @@
 	container = &EX(This);
 	property = RT_CONSTANT(opline, opline->op2);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -32233,11 +33158,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_is_copy;
@@ -32315,7 +33239,7 @@
 	container = &EX(This);
 	property = RT_CONSTANT(opline, opline->op2);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -32329,6 +33253,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = &EX(This);
@@ -32350,7 +33275,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -32359,11 +33283,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -32385,7 +33309,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -32442,11 +33366,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -32460,6 +33387,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = &EX(This);
@@ -32481,7 +33409,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -32490,11 +33417,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -32516,7 +33443,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -32573,11 +33500,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -32591,6 +33521,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = &EX(This);
@@ -32612,7 +33543,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -32621,11 +33551,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -32647,7 +33577,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -32704,11 +33634,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -32722,6 +33655,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = &EX(This);
@@ -32743,7 +33677,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -32752,11 +33685,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -32778,7 +33711,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -32835,11 +33768,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -32878,7 +33814,7 @@
 	}
 
 
-	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
+	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -33084,9 +34020,9 @@
 
 	if (IS_CONST == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if (IS_CONST == IS_CONST) {
 			function_name = RT_CONSTANT(opline, opline->op2);
@@ -33336,63 +34272,118 @@
 {
 	zend_class_entry *ce, *scope;
 	zend_class_constant *c;
-	zval *value, *zv;
+	zval *value, *zv, *constant_zv;
+	zend_string *constant_name;
 	USE_OPLINE
 
 	SAVE_OPLINE();
 
 	do {
-		if (IS_UNUSED == IS_CONST) {
+		if (IS_UNUSED == IS_CONST && IS_CONST == IS_CONST) {
 			if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
 				value = CACHED_PTR(opline->extended_value + sizeof(void*));
 				break;
-			} else if (EXPECTED(CACHED_PTR(opline->extended_value))) {
+			}
+		}
+		if (IS_UNUSED == IS_CONST) {
+			if (EXPECTED(CACHED_PTR(opline->extended_value))) {
 				ce = CACHED_PTR(opline->extended_value);
 			} else {
 				ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
 				if (UNEXPECTED(ce == NULL)) {
 					ZVAL_UNDEF(EX_VAR(opline->result.var));
+
 					HANDLE_EXCEPTION();
 				}
+				CACHE_PTR(opline->extended_value, ce);
 			}
+		} else if (IS_UNUSED == IS_UNUSED) {
+			ce = zend_fetch_class(NULL, opline->op1.num);
+			if (UNEXPECTED(ce == NULL)) {
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+				HANDLE_EXCEPTION();
+			}
 		} else {
-			if (IS_UNUSED == IS_UNUSED) {
-				ce = zend_fetch_class(NULL, opline->op1.num);
-				if (UNEXPECTED(ce == NULL)) {
-					ZVAL_UNDEF(EX_VAR(opline->result.var));
-					HANDLE_EXCEPTION();
-				}
-			} else {
-				ce = Z_CE_P(EX_VAR(opline->op1.var));
-			}
-			if (EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
-				value = CACHED_PTR(opline->extended_value + sizeof(void*));
-				break;
-			}
+			ce = Z_CE_P(EX_VAR(opline->op1.var));
 		}
+		if (IS_UNUSED != IS_CONST
+			&& IS_CONST == IS_CONST
+			&& EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
+			value = CACHED_PTR(opline->extended_value + sizeof(void*));
+			break;
+		}
 
-		zv = zend_hash_find_known_hash(CE_CONSTANTS_TABLE(ce), Z_STR_P(RT_CONSTANT(opline, opline->op2)));
+		constant_zv = RT_CONSTANT(opline, opline->op2);
+		if (UNEXPECTED(Z_TYPE_P(constant_zv) != IS_STRING)) {
+			zend_invalid_class_constant_type_error(Z_TYPE_P(constant_zv));
+			ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+			HANDLE_EXCEPTION();
+		}
+		constant_name = Z_STR_P(constant_zv);
+		/* Magic 'class' for constant OP2 is caught at compile-time */
+		if (IS_CONST != IS_CONST && UNEXPECTED(zend_string_equals_literal_ci(constant_name, "class"))) {
+			ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
+
+			ZEND_VM_NEXT_OPCODE();
+		}
+		zv = IS_CONST == IS_CONST
+			? zend_hash_find_known_hash(CE_CONSTANTS_TABLE(ce), constant_name)
+			: zend_hash_find(CE_CONSTANTS_TABLE(ce), constant_name);
+
 		if (EXPECTED(zv != NULL)) {
 			c = Z_PTR_P(zv);
 			scope = EX(func)->op_array.scope;
 			if (!zend_verify_const_access(c, scope)) {
-				zend_throw_error(NULL, "Cannot access %s constant %s::%s", zend_visibility_string(ZEND_CLASS_CONST_FLAGS(c)), ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
+				zend_throw_error(NULL, "Cannot access %s constant %s::%s", zend_visibility_string(ZEND_CLASS_CONST_FLAGS(c)), ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
+
 				HANDLE_EXCEPTION();
 			}
+
+			if (ce->ce_flags & ZEND_ACC_TRAIT) {
+				zend_throw_error(NULL, "Cannot access trait constant %s::%s directly", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+				HANDLE_EXCEPTION();
+			}
+
+			bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
+			if (UNEXPECTED(is_constant_deprecated)) {
+				zend_error(E_DEPRECATED, "Constant %s::%s is deprecated", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+
+				if (EG(exception)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+					HANDLE_EXCEPTION();
+				}
+			}
+
 			value = &c->value;
+			// Enums require loading of all class constants to build the backed enum table
+			if (ce->ce_flags & ZEND_ACC_ENUM && ce->enum_backing_type != IS_UNDEF && ce->type == ZEND_USER_CLASS && !(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
+				if (UNEXPECTED(zend_update_class_constants(ce) == FAILURE)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+
+					HANDLE_EXCEPTION();
+				}
+			}
 			if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
-				zval_update_constant_ex(value, c->ce);
-				if (UNEXPECTED(EG(exception) != NULL)) {
+				if (UNEXPECTED(zend_update_class_constant(c, constant_name, c->ce) != SUCCESS)) {
 					ZVAL_UNDEF(EX_VAR(opline->result.var));
+
 					HANDLE_EXCEPTION();
 				}
 			}
-			CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
+			if (IS_CONST == IS_CONST && !is_constant_deprecated) {
+				CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
+			}
 		} else {
 			zend_throw_error(NULL, "Undefined constant %s::%s",
-				ZSTR_VAL(ce->name), Z_STRVAL_P(RT_CONSTANT(opline, opline->op2)));
+				ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
+
 			HANDLE_EXCEPTION();
 		}
 	} while (0);
@@ -33586,7 +34577,7 @@
 				}
 			} else if (IS_UNUSED == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -33640,6 +34631,132 @@
 	ZEND_VM_RETURN();
 }
 
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+	zend_class_entry *ce, *scope;
+	zend_class_constant *c;
+	zval *value, *zv, *constant_zv;
+	zend_string *constant_name;
+	USE_OPLINE
+
+	SAVE_OPLINE();
+
+	do {
+		if (IS_UNUSED == IS_CONST && (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST) {
+			if (EXPECTED(CACHED_PTR(opline->extended_value + sizeof(void*)))) {
+				value = CACHED_PTR(opline->extended_value + sizeof(void*));
+				break;
+			}
+		}
+		if (IS_UNUSED == IS_CONST) {
+			if (EXPECTED(CACHED_PTR(opline->extended_value))) {
+				ce = CACHED_PTR(opline->extended_value);
+			} else {
+				ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+				if (UNEXPECTED(ce == NULL)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP(opline->op2_type, opline->op2.var);
+					HANDLE_EXCEPTION();
+				}
+				CACHE_PTR(opline->extended_value, ce);
+			}
+		} else if (IS_UNUSED == IS_UNUSED) {
+			ce = zend_fetch_class(NULL, opline->op1.num);
+			if (UNEXPECTED(ce == NULL)) {
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+				FREE_OP(opline->op2_type, opline->op2.var);
+				HANDLE_EXCEPTION();
+			}
+		} else {
+			ce = Z_CE_P(EX_VAR(opline->op1.var));
+		}
+		if (IS_UNUSED != IS_CONST
+			&& (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST
+			&& EXPECTED(CACHED_PTR(opline->extended_value) == ce)) {
+			value = CACHED_PTR(opline->extended_value + sizeof(void*));
+			break;
+		}
+
+		constant_zv = _get_zval_ptr_tmpvarcv(opline->op2_type, opline->op2, BP_VAR_R EXECUTE_DATA_CC);
+		if (UNEXPECTED(Z_TYPE_P(constant_zv) != IS_STRING)) {
+			zend_invalid_class_constant_type_error(Z_TYPE_P(constant_zv));
+			ZVAL_UNDEF(EX_VAR(opline->result.var));
+			FREE_OP(opline->op2_type, opline->op2.var);
+			HANDLE_EXCEPTION();
+		}
+		constant_name = Z_STR_P(constant_zv);
+		/* Magic 'class' for constant OP2 is caught at compile-time */
+		if ((IS_TMP_VAR|IS_VAR|IS_CV) != IS_CONST && UNEXPECTED(zend_string_equals_literal_ci(constant_name, "class"))) {
+			ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
+			FREE_OP(opline->op2_type, opline->op2.var);
+			ZEND_VM_NEXT_OPCODE();
+		}
+		zv = (IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST
+			? zend_hash_find_known_hash(CE_CONSTANTS_TABLE(ce), constant_name)
+			: zend_hash_find(CE_CONSTANTS_TABLE(ce), constant_name);
+
+		if (EXPECTED(zv != NULL)) {
+			c = Z_PTR_P(zv);
+			scope = EX(func)->op_array.scope;
+			if (!zend_verify_const_access(c, scope)) {
+				zend_throw_error(NULL, "Cannot access %s constant %s::%s", zend_visibility_string(ZEND_CLASS_CONST_FLAGS(c)), ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+				FREE_OP(opline->op2_type, opline->op2.var);
+				HANDLE_EXCEPTION();
+			}
+
+			if (ce->ce_flags & ZEND_ACC_TRAIT) {
+				zend_throw_error(NULL, "Cannot access trait constant %s::%s directly", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+				ZVAL_UNDEF(EX_VAR(opline->result.var));
+				FREE_OP(opline->op2_type, opline->op2.var);
+				HANDLE_EXCEPTION();
+			}
+
+			bool is_constant_deprecated = ZEND_CLASS_CONST_FLAGS(c) & ZEND_ACC_DEPRECATED;
+			if (UNEXPECTED(is_constant_deprecated)) {
+				zend_error(E_DEPRECATED, "Constant %s::%s is deprecated", ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+
+				if (EG(exception)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP(opline->op2_type, opline->op2.var);
+					HANDLE_EXCEPTION();
+				}
+			}
+
+			value = &c->value;
+			// Enums require loading of all class constants to build the backed enum table
+			if (ce->ce_flags & ZEND_ACC_ENUM && ce->enum_backing_type != IS_UNDEF && ce->type == ZEND_USER_CLASS && !(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) {
+				if (UNEXPECTED(zend_update_class_constants(ce) == FAILURE)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP(opline->op2_type, opline->op2.var);
+					HANDLE_EXCEPTION();
+				}
+			}
+			if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
+				if (UNEXPECTED(zend_update_class_constant(c, constant_name, c->ce) != SUCCESS)) {
+					ZVAL_UNDEF(EX_VAR(opline->result.var));
+					FREE_OP(opline->op2_type, opline->op2.var);
+					HANDLE_EXCEPTION();
+				}
+			}
+			if ((IS_TMP_VAR|IS_VAR|IS_CV) == IS_CONST && !is_constant_deprecated) {
+				CACHE_POLYMORPHIC_PTR(opline->extended_value, ce, value);
+			}
+		} else {
+			zend_throw_error(NULL, "Undefined constant %s::%s",
+				ZSTR_VAL(ce->name), ZSTR_VAL(constant_name));
+			ZVAL_UNDEF(EX_VAR(opline->result.var));
+			FREE_OP(opline->op2_type, opline->op2.var);
+			HANDLE_EXCEPTION();
+		}
+	} while (0);
+
+	ZVAL_COPY_OR_DUP(EX_VAR(opline->result.var), value);
+
+	FREE_OP(opline->op2_type, opline->op2.var);
+	ZEND_VM_NEXT_OPCODE();
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
@@ -33883,7 +35000,7 @@
 
 	if (IS_UNUSED == IS_CONST ||
 	    (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -33930,11 +35047,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_r_copy;
@@ -33966,10 +35082,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -34004,7 +35130,7 @@
 	zend_fetch_property_address(
 		result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR),
 		(((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -34021,7 +35147,7 @@
 	container = &EX(This);
 	property = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -34086,11 +35212,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_is_copy;
@@ -34168,7 +35293,7 @@
 	container = &EX(This);
 	property = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -34182,6 +35307,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = &EX(This);
@@ -34203,7 +35329,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -34212,11 +35337,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -34238,7 +35363,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -34295,11 +35420,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
 	/* assign_obj has two opcodes! */
@@ -34313,6 +35441,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = &EX(This);
@@ -34334,7 +35463,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -34343,11 +35471,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -34369,7 +35497,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -34426,11 +35554,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
 	/* assign_obj has two opcodes! */
@@ -34444,6 +35575,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = &EX(This);
@@ -34465,7 +35597,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -34474,11 +35605,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -34500,7 +35631,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -34557,11 +35688,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
 	/* assign_obj has two opcodes! */
@@ -34575,6 +35709,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = &EX(This);
@@ -34596,7 +35731,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -34605,11 +35739,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -34631,7 +35765,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -34688,11 +35822,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
 	/* assign_obj has two opcodes! */
@@ -34731,7 +35868,7 @@
 	}
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
+	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -34938,9 +36075,9 @@
 
 	if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 			function_name = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
@@ -35323,7 +36460,7 @@
 				}
 			} else if (IS_UNUSED == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -35865,7 +37002,7 @@
 				}
 			} else if (IS_UNUSED == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -35959,13 +37096,17 @@
 	USE_OPLINE
 
 	if (IS_UNUSED == IS_UNUSED) {
+		SAVE_OPLINE();
 		if (UNEXPECTED(!EX(func)->common.scope)) {
-			SAVE_OPLINE();
 			zend_throw_error(NULL, "get_class() without arguments must be called from within a class");
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
 			HANDLE_EXCEPTION();
 		} else {
+			zend_error(E_DEPRECATED, "Calling get_class() without arguments is deprecated");
 			ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(func)->common.scope->name);
+			if (UNEXPECTED(EG(exception))) {
+				HANDLE_EXCEPTION();
+			}
 			ZEND_VM_NEXT_OPCODE();
 		}
 	} else {
@@ -35983,7 +37124,7 @@
 				if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
 					ZVAL_UNDEFINED_OP1();
 				}
-				zend_type_error("get_class(): Argument #1 ($object) must be of type object, %s given", zend_zval_type_name(op1));
+				zend_type_error("get_class(): Argument #1 ($object) must be of type object, %s given", zend_zval_value_name(op1));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
 			}
 			break;
@@ -36039,6 +37180,7 @@
 	}
 
 	if (result_size) {
+		SAVE_OPLINE();
 		uint32_t first_extra_arg = EX(func)->op_array.num_args;
 
 		ht = zend_new_array(result_size);
@@ -36094,6 +37236,7 @@
 	ZEND_VM_NEXT_OPCODE();
 }
 
+/* Contrary to what its name indicates, ZEND_COPY_TMP may receive and define references. */
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALLABLE_CONVERT_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
@@ -36353,7 +37496,7 @@
 
 	if (IS_UNUSED == IS_CONST ||
 	    (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -36400,11 +37543,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_r_copy;
@@ -36436,10 +37578,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -36474,7 +37626,7 @@
 	zend_fetch_property_address(
 		result, container, IS_UNUSED, property, IS_CV,
 		((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -36491,7 +37643,7 @@
 	container = &EX(This);
 	property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -36556,11 +37708,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_is_copy;
@@ -36638,7 +37789,7 @@
 	container = &EX(This);
 	property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -36652,6 +37803,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = &EX(This);
@@ -36673,7 +37825,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -36682,11 +37833,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -36708,7 +37859,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -36765,11 +37916,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -36783,6 +37937,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = &EX(This);
@@ -36804,7 +37959,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -36813,11 +37967,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -36839,7 +37993,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -36896,11 +38050,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -36914,6 +38071,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = &EX(This);
@@ -36935,7 +38093,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -36944,11 +38101,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -36970,7 +38127,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -37027,11 +38184,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -37045,6 +38205,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = &EX(This);
@@ -37066,7 +38227,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -37075,11 +38235,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -37101,7 +38261,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -37158,11 +38318,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -37201,7 +38364,7 @@
 	}
 
 
-	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
+	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -37407,9 +38570,9 @@
 
 	if (IS_CV == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if (IS_CV == IS_CONST) {
 			function_name = EX_VAR(opline->op2.var);
@@ -37791,7 +38954,7 @@
 				}
 			} else if (IS_UNUSED == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -38134,7 +39297,7 @@
 {
 	USE_OPLINE
 	zval *val;
-	zend_uchar op1_type;
+	uint8_t op1_type;
 
 	val = EX_VAR(opline->op1.var);
 
@@ -38168,7 +39331,7 @@
 {
 	USE_OPLINE
 	zval *val;
-	zend_uchar op1_type;
+	uint8_t op1_type;
 
 	val = EX_VAR(opline->op1.var);
 
@@ -38198,41 +39361,6 @@
 	ZEND_VM_JMP(opline);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
-	USE_OPLINE
-	zval *val;
-	zend_uchar op1_type;
-
-	val = EX_VAR(opline->op1.var);
-
-	if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) {
-		ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
-		ZEND_VM_CONTINUE();
-	} else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) {
-		if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) {
-			SAVE_OPLINE();
-			ZVAL_UNDEFINED_OP1();
-			if (UNEXPECTED(EG(exception))) {
-				HANDLE_EXCEPTION();
-			}
-		}
-		ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0);
-	}
-
-	SAVE_OPLINE();
-	op1_type = IS_CV;
-	if (i_zend_is_true(val)) {
-		opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value);
-	} else {
-		opline = OP_JMP_ADDR(opline, opline->op2);
-	}
-	if (op1_type & (IS_TMP_VAR|IS_VAR)) {
-		zval_ptr_dtor_nogc(val);
-	}
-	ZEND_VM_JMP(opline);
-}
-
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
@@ -38480,6 +39608,8 @@
 		}
 	}
 
+	EG(current_execute_data) = EX(prev_execute_data);
+
 	/* Close the generator to free up resources */
 	zend_generator_close(generator, 1);
 
@@ -38584,7 +39714,7 @@
 	do {
 		if (IS_CV == IS_CONST ||
 		    (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT))) {
-		    if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
+			if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(obj)) {
 				obj = Z_REFVAL_P(obj);
 				if (EXPECTED(Z_TYPE_P(obj) == IS_OBJECT)) {
 					break;
@@ -38746,10 +39876,25 @@
 		if (RETURN_VALUE_USED(opline)) {
 			ZVAL_TRUE(EX_VAR(opline->result.var));
 		}
-	} else if (EXPECTED(new_op_array != NULL)) {
+	} else if (UNEXPECTED(new_op_array == NULL)) {
+		if (RETURN_VALUE_USED(opline)) {
+			ZVAL_FALSE(EX_VAR(opline->result.var));
+		}
+	} else if (new_op_array->last == 1
+			&& new_op_array->opcodes[0].opcode == ZEND_RETURN
+			&& new_op_array->opcodes[0].op1_type == IS_CONST
+			&& EXPECTED(zend_execute_ex == execute_ex)) {
+		if (RETURN_VALUE_USED(opline)) {
+			const zend_op *op = new_op_array->opcodes;
+
+			ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1));
+		}
+		zend_destroy_static_vars(new_op_array);
+		destroy_op_array(new_op_array);
+		efree_size(new_op_array, sizeof(zend_op_array));
+	} else {
 		zval *return_value = NULL;
 		zend_execute_data *call;
-
 		if (RETURN_VALUE_USED(opline)) {
 			return_value = EX_VAR(opline->result.var);
 		}
@@ -38757,7 +39902,7 @@
 		new_op_array->scope = EX(func)->op_array.scope;
 
 		call = zend_vm_stack_push_call_frame(
-		    (Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
+			(Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
 			(zend_function*)new_op_array, 0,
 			Z_PTR(EX(This)));
 
@@ -38788,8 +39933,6 @@
 			UNDEF_RESULT();
 			HANDLE_EXCEPTION();
 		}
-	} else if (RETURN_VALUE_USED(opline)) {
-		ZVAL_FALSE(EX_VAR(opline->result.var));
 	}
 
 	ZEND_VM_NEXT_OPCODE();
@@ -38854,7 +39997,7 @@
 			}
 		}
 	} else {
-		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
+		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array_ptr));
 		ZVAL_UNDEF(EX_VAR(opline->result.var));
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
 
@@ -38898,9 +40041,6 @@
 		}
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
 
-		if (IS_CV == IS_VAR) {
-
-		}
 		ZEND_VM_NEXT_OPCODE();
 	} else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		if (!Z_OBJCE_P(array_ptr)->get_iterator) {
@@ -38937,11 +40077,6 @@
 		} else {
 			bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC);
 
-			if (IS_CV == IS_VAR) {
-
-			} else {
-
-			}
 			if (UNEXPECTED(EG(exception))) {
 				HANDLE_EXCEPTION();
 			} else if (is_empty) {
@@ -38951,14 +40086,10 @@
 			}
 		}
 	} else {
-		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr));
+		zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_value_name(array_ptr));
 		ZVAL_UNDEF(EX_VAR(opline->result.var));
 		Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
-		if (IS_CV == IS_VAR) {
 
-		} else {
-
-		}
 		ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
 	}
 }
@@ -39071,9 +40202,13 @@
 	}
 
 	result = EX_VAR(opline->result.var);
-	if (EXPECTED(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
+	uint32_t short_circuiting_type = opline->extended_value & ZEND_SHORT_CIRCUITING_CHAIN_MASK;
+	if (EXPECTED(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EXPR)) {
 		ZVAL_NULL(result);
-		if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(val) == IS_UNDEF)) {
+		if (IS_CV == IS_CV
+			&& UNEXPECTED(Z_TYPE_P(val) == IS_UNDEF)
+			&& (opline->extended_value & ZEND_JMP_NULL_BP_VAR_IS) == 0
+		) {
 			SAVE_OPLINE();
 			ZVAL_UNDEFINED_OP1();
 			if (UNEXPECTED(EG(exception) != NULL)) {
@@ -39080,10 +40215,10 @@
 				HANDLE_EXCEPTION();
 			}
 		}
-	} else if (opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
+	} else if (short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_ISSET) {
 		ZVAL_FALSE(result);
 	} else {
-		ZEND_ASSERT(opline->extended_value == ZEND_SHORT_CIRCUITING_CHAIN_EMPTY);
+		ZEND_ASSERT(short_circuiting_type == ZEND_SHORT_CIRCUITING_CHAIN_EMPTY);
 		ZVAL_TRUE(result);
 	}
 
@@ -39285,7 +40420,7 @@
 				zval_ptr_dtor(&tmp);
 			}
 			if (!EG(exception)) {
-				zend_type_error("strlen(): Argument #1 ($str) must be of type string, %s given", zend_zval_type_name(value));
+				zend_type_error("strlen(): Argument #1 ($string) must be of type string, %s given", zend_zval_value_name(value));
 			}
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
 		} while (0);
@@ -39342,7 +40477,7 @@
 		if (UNEXPECTED(Z_TYPE_P(op) != IS_OBJECT)) {
 			ZVAL_DEREF(op);
 			if (Z_TYPE_P(op) != IS_OBJECT) {
-				zend_type_error("Cannot use \"::class\" on value of type %s", zend_zval_type_name(op));
+				zend_type_error("Cannot use \"::class\" on %s", zend_zval_value_name(op));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
 
 				HANDLE_EXCEPTION();
@@ -39392,6 +40527,86 @@
 	ZEND_VM_NEXT_OPCODE();
 }
 
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+	USE_OPLINE
+	HashTable *ht;
+	zval *value;
+	zval *variable_ptr;
+
+	variable_ptr = EX_VAR(opline->op1.var);
+
+	SAVE_OPLINE();
+
+	ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
+	if (!ht) {
+		ht = zend_array_dup(EX(func)->op_array.static_variables);
+		ZEND_MAP_PTR_SET(EX(func)->op_array.static_variables_ptr, ht);
+	}
+	ZEND_ASSERT(GC_REFCOUNT(ht) == 1);
+
+	value = (zval*)((char*)ht->arData + (opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT|ZEND_BIND_EXPLICIT)));
+
+	if (opline->extended_value & ZEND_BIND_REF) {
+		i_zval_ptr_dtor(variable_ptr);
+		if (UNEXPECTED(!Z_ISREF_P(value))) {
+			zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
+			GC_SET_REFCOUNT(ref, 2);
+			GC_TYPE_INFO(ref) = GC_REFERENCE;
+			if (opline->op2_type == IS_UNUSED) {
+				ZVAL_COPY_VALUE(&ref->val, value);
+			} else {
+				ZEND_ASSERT(!Z_REFCOUNTED_P(value));
+				ZVAL_COPY(&ref->val, get_zval_ptr_deref(opline->op2_type, opline->op2, BP_VAR_R));
+				FREE_OP(opline->op2_type, opline->op2.var);
+			}
+			ref->sources.ptr = NULL;
+			Z_REF_P(value) = ref;
+			Z_TYPE_INFO_P(value) = IS_REFERENCE_EX;
+			ZVAL_REF(variable_ptr, ref);
+		} else {
+			Z_ADDREF_P(value);
+			ZVAL_REF(variable_ptr, Z_REF_P(value));
+			if (opline->op2_type != IS_UNUSED) {
+				FREE_OP(opline->op2_type, opline->op2.var);
+			}
+		}
+	} else {
+		i_zval_ptr_dtor(variable_ptr);
+		ZVAL_COPY(variable_ptr, value);
+	}
+
+	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_INIT_STATIC_OR_JMP_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+	USE_OPLINE
+	HashTable *ht;
+	zval *value;
+	zval *variable_ptr;
+
+	variable_ptr = EX_VAR(opline->op1.var);
+
+	ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
+	if (!ht) {
+		ZEND_VM_NEXT_OPCODE();
+	}
+	ZEND_ASSERT(GC_REFCOUNT(ht) == 1);
+
+	value = (zval*)((char*)ht->arData + opline->extended_value);
+	if (Z_TYPE_EXTRA_P(value) & IS_STATIC_VAR_UNINITIALIZED) {
+		ZEND_VM_NEXT_OPCODE();
+	} else {
+		SAVE_OPLINE();
+		zval_ptr_dtor(variable_ptr);
+		ZEND_ASSERT(Z_TYPE_P(value) == IS_REFERENCE);
+		Z_ADDREF_P(value);
+		ZVAL_REF(variable_ptr, Z_REF_P(value));
+		ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 1);
+	}
+}
+
 static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
@@ -39598,6 +40813,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
@@ -39619,7 +40835,7 @@
 			}
 		} else if (IS_CV != IS_CONST && IS_CV != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			if (UNEXPECTED(len > ZSTR_MAX_LEN - ZSTR_LEN(op2_str))) {
 				zend_error_noreturn(E_ERROR, "Integer overflow in memory allocation");
@@ -39626,6 +40842,7 @@
 			}
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -39634,6 +40851,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -40230,7 +41448,7 @@
 			}
 			zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
 		} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
-			zend_uchar old_type;
+			uint8_t old_type;
 
 			if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
 				ZVAL_UNDEFINED_OP1();
@@ -40510,9 +41728,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if (IS_CONST == IS_UNUSED) {
@@ -40548,7 +41766,7 @@
 
 	if (IS_CV == IS_CONST ||
 	    (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -40595,11 +41813,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_r_copy;
@@ -40631,10 +41848,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -40674,7 +41901,7 @@
 	zend_fetch_property_address(
 		result, container, IS_CV, property, IS_CONST,
 		((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -40691,7 +41918,7 @@
 	container = EX_VAR(opline->op1.var);
 	property = RT_CONSTANT(opline, opline->op2);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -40756,11 +41983,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_is_copy;
@@ -40838,7 +42064,7 @@
 	container = EX_VAR(opline->op1.var);
 	property = RT_CONSTANT(opline, opline->op2);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -40852,6 +42078,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = EX_VAR(opline->op1.var);
@@ -40873,7 +42100,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -40882,11 +42108,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -40908,7 +42134,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -40965,11 +42191,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -40983,6 +42212,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = EX_VAR(opline->op1.var);
@@ -41004,7 +42234,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -41013,11 +42242,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -41039,7 +42268,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -41096,11 +42325,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -41114,6 +42346,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = EX_VAR(opline->op1.var);
@@ -41135,7 +42368,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -41144,11 +42376,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -41170,7 +42402,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -41227,11 +42459,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -41245,6 +42480,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = EX_VAR(opline->op1.var);
@@ -41266,7 +42502,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -41275,11 +42510,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -41301,7 +42536,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -41358,11 +42593,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -41377,6 +42615,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -41432,11 +42671,14 @@
 				goto assign_dim_error;
 			}
 			value = RT_CONSTANT((opline+1), (opline+1)->op1);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -41487,7 +42729,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -41525,6 +42767,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -41580,11 +42823,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -41636,7 +42882,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -41674,6 +42920,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -41729,11 +42976,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -41785,7 +43035,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -41823,6 +43073,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -41878,11 +43129,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -41933,7 +43187,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -41974,9 +43228,18 @@
 	value = RT_CONSTANT(opline, opline->op2);
 	variable_ptr = EX_VAR(opline->op1.var);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(0)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(0)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(0)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
 	}
 
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -41994,9 +43257,18 @@
 	value = RT_CONSTANT(opline, opline->op2);
 	variable_ptr = EX_VAR(opline->op1.var);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(1)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(1)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(1)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
 	}
 
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -42035,7 +43307,7 @@
 	}
 
 
-	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
+	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -42090,6 +43362,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (IS_CONST == IS_CONST || IS_CONST == IS_CV) {
@@ -42111,10 +43384,11 @@
 			}
 		} else if (IS_CV != IS_CONST && IS_CV != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CONST & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -42123,6 +43397,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -42183,6 +43458,8 @@
 		str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 		memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 		memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+
+		ZSTR_COPY_CONCAT_PROPERTIES_BOTH(str, op1_str, op2_str);
 		ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 		if (IS_CV != IS_CONST) {
 			zend_string_release_ex(op1_str, 0);
@@ -42284,9 +43561,9 @@
 
 	if (IS_CONST == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if (IS_CONST == IS_CONST) {
 			function_name = RT_CONSTANT(opline, opline->op2);
@@ -42575,7 +43852,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 
@@ -42667,7 +43944,7 @@
 				key = ZSTR_EMPTY_ALLOC();
 				goto str_index_dim;
 			} else {
-				zend_type_error("Illegal offset type in unset");
+				zend_illegal_array_offset_unset(offset);
 			}
 			break;
 		} else if (Z_ISREF_P(container)) {
@@ -43020,7 +44297,7 @@
 				}
 			} else if (IS_CV == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -43092,11 +44369,10 @@
 	if (EXPECTED(idx < EG(symbol_table).nNumUsed * sizeof(Bucket))) {
 		Bucket *p = (Bucket*)((char*)EG(symbol_table).arData + idx);
 
-		if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-	        (EXPECTED(p->key == varname) ||
-	         (EXPECTED(p->h == ZSTR_H(varname)) &&
-	          EXPECTED(p->key != NULL) &&
-	          EXPECTED(zend_string_equal_content(p->key, varname))))) {
+		if (EXPECTED(p->key == varname) ||
+		    (EXPECTED(p->h == ZSTR_H(varname)) &&
+		     EXPECTED(p->key != NULL) &&
+		     EXPECTED(zend_string_equal_content(p->key, varname)))) {
 
 			value = (zval*)p; /* value = &p->val; */
 			goto check_indirect;
@@ -43215,7 +44491,7 @@
 		}
 
 		SAVE_OPLINE();
-		ZEND_HASH_FOREACH_STR_KEY(ht, key) {
+		ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) {
 			ZVAL_STR(&key_tmp, key);
 			if (zend_compare(op1, &key_tmp) == 0) {
 
@@ -43407,6 +44683,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
@@ -43428,7 +44705,7 @@
 			}
 		} else if (IS_CV != IS_CONST && IS_CV != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			if (UNEXPECTED(len > ZSTR_MAX_LEN - ZSTR_LEN(op2_str))) {
 				zend_error_noreturn(E_ERROR, "Integer overflow in memory allocation");
@@ -43435,6 +44712,7 @@
 			}
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -43443,6 +44721,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -44009,7 +45288,7 @@
 			}
 			zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
 		} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
-			zend_uchar old_type;
+			uint8_t old_type;
 
 			if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
 				ZVAL_UNDEFINED_OP1();
@@ -44293,9 +45572,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
@@ -44331,7 +45610,7 @@
 
 	if (IS_CV == IS_CONST ||
 	    (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -44378,11 +45657,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_r_copy;
@@ -44414,10 +45692,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -44452,7 +45740,7 @@
 	zend_fetch_property_address(
 		result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR),
 		(((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -44469,7 +45757,7 @@
 	container = EX_VAR(opline->op1.var);
 	property = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -44534,11 +45822,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_is_copy;
@@ -44616,7 +45903,7 @@
 	container = EX_VAR(opline->op1.var);
 	property = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -44630,6 +45917,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = EX_VAR(opline->op1.var);
@@ -44651,7 +45939,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -44660,11 +45947,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -44686,7 +45973,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -44743,11 +46030,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
 	/* assign_obj has two opcodes! */
@@ -44761,6 +46051,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = EX_VAR(opline->op1.var);
@@ -44782,7 +46073,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -44791,11 +46081,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -44817,7 +46107,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -44874,11 +46164,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
 	/* assign_obj has two opcodes! */
@@ -44892,6 +46185,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = EX_VAR(opline->op1.var);
@@ -44913,7 +46207,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -44922,11 +46215,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -44948,7 +46241,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -45005,11 +46298,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
 	/* assign_obj has two opcodes! */
@@ -45023,6 +46319,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = EX_VAR(opline->op1.var);
@@ -45044,7 +46341,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -45053,11 +46349,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -45079,7 +46375,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -45136,11 +46432,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
 	/* assign_obj has two opcodes! */
@@ -45155,6 +46454,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -45210,11 +46510,14 @@
 				goto assign_dim_error;
 			}
 			value = RT_CONSTANT((opline+1), (opline+1)->op1);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -45265,7 +46568,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -45303,6 +46606,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -45358,11 +46662,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -45414,7 +46721,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -45452,6 +46759,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -45507,11 +46815,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -45563,7 +46874,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -45601,6 +46912,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -45656,11 +46968,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -45711,7 +47026,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -45773,7 +47088,7 @@
 	}
 
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
-	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
+	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -45828,6 +47143,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if ((IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == IS_CV) {
@@ -45849,10 +47165,11 @@
 			}
 		} else if (IS_CV != IS_CONST && IS_CV != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -45861,6 +47178,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -45921,6 +47239,8 @@
 		str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 		memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 		memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+
+		ZSTR_COPY_CONCAT_PROPERTIES_BOTH(str, op1_str, op2_str);
 		ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 		if (IS_CV != IS_CONST) {
 			zend_string_release_ex(op1_str, 0);
@@ -46022,9 +47342,9 @@
 
 	if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
 			function_name = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
@@ -46172,7 +47492,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 		zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -46264,7 +47584,7 @@
 				key = ZSTR_EMPTY_ALLOC();
 				goto str_index_dim;
 			} else {
-				zend_type_error("Illegal offset type in unset");
+				zend_illegal_array_offset_unset(offset);
 			}
 			break;
 		} else if (Z_ISREF_P(container)) {
@@ -46575,7 +47895,7 @@
 				}
 			} else if (IS_CV == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -46670,9 +47990,18 @@
 	value = _get_zval_ptr_tmp(opline->op2.var EXECUTE_DATA_CC);
 	variable_ptr = EX_VAR(opline->op1.var);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(0)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(0)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(0)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
 	}
 
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -46690,9 +48019,18 @@
 	value = _get_zval_ptr_tmp(opline->op2.var EXECUTE_DATA_CC);
 	variable_ptr = EX_VAR(opline->op1.var);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(1)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(1)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(1)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
 	}
 
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -46740,9 +48078,18 @@
 	value = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	variable_ptr = EX_VAR(opline->op1.var);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(0)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(0)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(0)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
 	}
 
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -46760,9 +48107,18 @@
 	value = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	variable_ptr = EX_VAR(opline->op1.var);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(1)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(1)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(1)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
 	}
 
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -46775,6 +48131,7 @@
 	USE_OPLINE
 	zval *variable_ptr;
 	zval *value_ptr;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	value_ptr = _get_zval_ptr_ptr_var(opline->op2.var EXECUTE_DATA_CC);
@@ -46790,9 +48147,9 @@
 			   UNEXPECTED(!Z_ISREF_P(value_ptr))) {
 
 		variable_ptr = zend_wrong_assign_to_variable_reference(
-			variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+			variable_ptr, value_ptr, &garbage OPLINE_CC EXECUTE_DATA_CC);
 	} else {
-		zend_assign_to_variable_reference(variable_ptr, value_ptr);
+		zend_assign_to_variable_reference(variable_ptr, value_ptr, &garbage);
 	}
 
 	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -46799,6 +48156,10 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
 	}
 
+	if (garbage) {
+		GC_DTOR(garbage);
+	}
+
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -46917,7 +48278,7 @@
 			}
 			zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
 		} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
-			zend_uchar old_type;
+			uint8_t old_type;
 
 			if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
 				ZVAL_UNDEFINED_OP1();
@@ -46995,6 +48356,10 @@
 		} else if (type == BP_VAR_IS || type == BP_VAR_UNSET) {
 			retval = &EG(uninitialized_zval);
 		} else {
+			if (IS_CV == IS_CV) {
+				/* Keep name alive in case an error handler tries to free it. */
+				zend_string_addref(name);
+			}
 			zend_error(E_WARNING, "Undefined %svariable $%s",
 				(opline->extended_value & ZEND_FETCH_GLOBAL ? "global " : ""), ZSTR_VAL(name));
 			if (type == BP_VAR_RW && !EG(exception)) {
@@ -47002,6 +48367,9 @@
 			} else {
 				retval = &EG(uninitialized_zval);
 			}
+			if (IS_CV == IS_CV) {
+				zend_string_release(name);
+			}
 		}
 	/* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
 	} else if (Z_TYPE_P(retval) == IS_INDIRECT) {
@@ -47114,9 +48482,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if (IS_UNUSED == IS_UNUSED) {
@@ -47133,6 +48501,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -47188,11 +48557,14 @@
 				goto assign_dim_error;
 			}
 			value = RT_CONSTANT((opline+1), (opline+1)->op1);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -47243,7 +48615,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -47281,6 +48653,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -47336,11 +48709,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -47392,7 +48768,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -47430,6 +48806,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -47485,11 +48862,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -47541,7 +48921,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -47579,6 +48959,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -47634,11 +49015,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -47689,7 +49073,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -48077,7 +49461,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 
@@ -48121,11 +49505,7 @@
 
 		ZVAL_UNDEF(var);
 		SAVE_OPLINE();
-		if (!GC_DELREF(garbage)) {
-			rc_dtor_func(garbage);
-		} else {
-			gc_check_possible_root(garbage);
-		}
+		GC_DTOR(garbage);
 		ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 	} else {
 		ZVAL_UNDEF(var);
@@ -48374,7 +49754,7 @@
 				}
 			} else if (IS_CV == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -48428,54 +49808,6 @@
 	ZEND_VM_RETURN();
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
-	USE_OPLINE
-	HashTable *ht;
-	zval *value;
-	zval *variable_ptr;
-
-	variable_ptr = EX_VAR(opline->op1.var);
-
-	ht = ZEND_MAP_PTR_GET(EX(func)->op_array.static_variables_ptr);
-	if (!ht) {
-		ht = zend_array_dup(EX(func)->op_array.static_variables);
-		ZEND_MAP_PTR_SET(EX(func)->op_array.static_variables_ptr, ht);
-	}
-	ZEND_ASSERT(GC_REFCOUNT(ht) == 1);
-
-	value = (zval*)((char*)ht->arData + (opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT|ZEND_BIND_EXPLICIT)));
-
-	SAVE_OPLINE();
-	if (opline->extended_value & ZEND_BIND_REF) {
-		if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
-			if (UNEXPECTED(zval_update_constant_ex(value, EX(func)->op_array.scope) != SUCCESS)) {
-				HANDLE_EXCEPTION();
-			}
-		}
-
-		i_zval_ptr_dtor(variable_ptr);
-		if (UNEXPECTED(!Z_ISREF_P(value))) {
-			zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
-			GC_SET_REFCOUNT(ref, 2);
-			GC_TYPE_INFO(ref) = GC_REFERENCE;
-			ZVAL_COPY_VALUE(&ref->val, value);
-			ref->sources.ptr = NULL;
-			Z_REF_P(value) = ref;
-			Z_TYPE_INFO_P(value) = IS_REFERENCE_EX;
-			ZVAL_REF(variable_ptr, ref);
-		} else {
-			Z_ADDREF_P(value);
-			ZVAL_REF(variable_ptr, Z_REF_P(value));
-		}
-	} else {
-		i_zval_ptr_dtor(variable_ptr);
-		ZVAL_COPY(variable_ptr, value);
-	}
-
-	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
-}
-
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CHECK_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
@@ -48553,7 +49885,8 @@
 			if (zend_class_implements_interface(zobj->ce, zend_ce_countable)) {
 				zval retval;
 
-				zend_call_method_with_0_params(zobj, NULL, NULL, "count", &retval);
+				zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT));
+				zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval);
 				count = zval_get_long(&retval);
 				zval_ptr_dtor(&retval);
 				break;
@@ -48567,7 +49900,7 @@
 			ZVAL_UNDEFINED_OP1();
 		}
 		count = 0;
-		zend_type_error("%s(): Argument #1 ($value) must be of type Countable|array, %s given", opline->extended_value ? "sizeof" : "count", zend_zval_type_name(op1));
+		zend_type_error("%s(): Argument #1 ($value) must be of type Countable|array, %s given", opline->extended_value ? "sizeof" : "count", zend_zval_value_name(op1));
 		break;
 	}
 
@@ -48576,18 +49909,37 @@
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_ARRAY_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+	USE_OPLINE
+	zend_array *ht = Z_ARRVAL_P(EX_VAR(opline->op1.var));
+	ZVAL_LONG(EX_VAR(opline->result.var), zend_hash_num_elements(ht));
+	if (IS_CV & (IS_TMP_VAR|IS_VAR) && !(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) {
+		SAVE_OPLINE();
+		zend_array_destroy(ht);
+		if (EG(exception)) {
+			HANDLE_EXCEPTION();
+		}
+	}
+	ZEND_VM_NEXT_OPCODE();
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
 	USE_OPLINE
 
 	if (IS_CV == IS_UNUSED) {
+		SAVE_OPLINE();
 		if (UNEXPECTED(!EX(func)->common.scope)) {
-			SAVE_OPLINE();
 			zend_throw_error(NULL, "get_class() without arguments must be called from within a class");
 			ZVAL_UNDEF(EX_VAR(opline->result.var));
 			HANDLE_EXCEPTION();
 		} else {
+			zend_error(E_DEPRECATED, "Calling get_class() without arguments is deprecated");
 			ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(func)->common.scope->name);
+			if (UNEXPECTED(EG(exception))) {
+				HANDLE_EXCEPTION();
+			}
 			ZEND_VM_NEXT_OPCODE();
 		}
 	} else {
@@ -48605,7 +49957,7 @@
 				if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
 					ZVAL_UNDEFINED_OP1();
 				}
-				zend_type_error("get_class(): Argument #1 ($object) must be of type object, %s given", zend_zval_type_name(op1));
+				zend_type_error("get_class(): Argument #1 ($object) must be of type object, %s given", zend_zval_value_name(op1));
 				ZVAL_UNDEF(EX_VAR(opline->result.var));
 			}
 			break;
@@ -48696,6 +50048,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (IS_CV == IS_CONST || IS_CV == IS_CV) {
@@ -48717,7 +50070,7 @@
 			}
 		} else if (IS_CV != IS_CONST && IS_CV != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			if (UNEXPECTED(len > ZSTR_MAX_LEN - ZSTR_LEN(op2_str))) {
 				zend_error_noreturn(E_ERROR, "Integer overflow in memory allocation");
@@ -48724,6 +50077,7 @@
 			}
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -48732,6 +50086,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -49328,7 +50683,7 @@
 			}
 			zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
 		} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
-			zend_uchar old_type;
+			uint8_t old_type;
 
 			if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(container) == IS_UNDEF)) {
 				ZVAL_UNDEFINED_OP1();
@@ -49608,9 +50963,9 @@
 #endif
 
 	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
-        if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
+		if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
 			ZEND_VM_TAIL_CALL(zend_use_tmp_in_write_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-        }
+		}
 		ZEND_VM_TAIL_CALL(ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 	} else {
 		if (IS_CV == IS_UNUSED) {
@@ -49646,7 +51001,7 @@
 
 	if (IS_CV == IS_CONST ||
 	    (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
-	    do {
+		do {
 			if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
 				container = Z_REFVAL_P(container);
 				if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
@@ -49693,11 +51048,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_r_copy;
@@ -49729,10 +51083,20 @@
 			}
 		}
 
+#if ZEND_DEBUG
+		/* For non-standard object handlers, verify a declared property type in debug builds.
+		 * Fetch prop_info before calling read_property(), as it may deallocate the object. */
+		zend_property_info *prop_info = NULL;
+		if (zobj->handlers->read_property != zend_std_read_property) {
+			prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true);
+		}
+#endif
 		retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
 #if ZEND_DEBUG
-		if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) {
-			zend_verify_internal_read_property_type(zobj, name, retval);
+		if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO
+				&& ZEND_TYPE_IS_SET(prop_info->type)) {
+			ZVAL_OPT_DEREF(retval);
+			zend_verify_property_type(prop_info, retval, /* strict */ true);
 		}
 #endif
 
@@ -49767,7 +51131,7 @@
 	zend_fetch_property_address(
 		result, container, IS_CV, property, IS_CV,
 		((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -49784,7 +51148,7 @@
 	container = EX_VAR(opline->op1.var);
 	property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -49849,11 +51213,10 @@
 						if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) {
 							Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx);
 
-							if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
-						        (EXPECTED(p->key == name) ||
-						         (EXPECTED(p->h == ZSTR_H(name)) &&
-						          EXPECTED(p->key != NULL) &&
-						          EXPECTED(zend_string_equal_content(p->key, name))))) {
+							if (EXPECTED(p->key == name) ||
+							    (EXPECTED(p->h == ZSTR_H(name)) &&
+							     EXPECTED(p->key != NULL) &&
+							     EXPECTED(zend_string_equal_content(p->key, name)))) {
 								retval = &p->val;
 								if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) {
 									goto fetch_obj_is_copy;
@@ -49931,7 +51294,7 @@
 	container = EX_VAR(opline->op1.var);
 	property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, 1 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -49945,6 +51308,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = EX_VAR(opline->op1.var);
@@ -49966,7 +51330,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -49975,11 +51338,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -50001,7 +51364,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -50058,11 +51421,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -50076,6 +51442,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = EX_VAR(opline->op1.var);
@@ -50097,7 +51464,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -50106,11 +51472,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -50132,7 +51498,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -50189,11 +51555,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -50207,6 +51576,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = EX_VAR(opline->op1.var);
@@ -50228,7 +51598,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -50237,11 +51606,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -50263,7 +51632,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -50320,11 +51689,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -50338,6 +51710,7 @@
 	zval *object, *value, tmp;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	object = EX_VAR(opline->op1.var);
@@ -50359,7 +51732,6 @@
 		if (EXPECTED(zobj->ce == CACHED_PTR(opline->extended_value))) {
 			void **cache_slot = CACHE_ADDR(opline->extended_value);
 			uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
-			zend_object *zobj = Z_OBJ_P(object);
 			zval *property_val;
 
 			if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
@@ -50368,11 +51740,11 @@
 					zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2);
 
 					if (UNEXPECTED(prop_info != NULL)) {
-						value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
+						value = zend_assign_to_typed_prop(prop_info, property_val, value, &garbage EXECUTE_DATA_CC);
 						goto free_and_exit_assign_obj;
 					} else {
 fast_assign_obj:
-						value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES());
+						value = zend_assign_to_variable_ex(property_val, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 						if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 							ZVAL_COPY(EX_VAR(opline->result.var), value);
 						}
@@ -50394,7 +51766,7 @@
 					}
 				}
 
-				if (!zobj->ce->__set) {
+				if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) {
 					if (EXPECTED(zobj->properties == NULL)) {
 						rebuild_object_properties(zobj);
 					}
@@ -50451,11 +51823,14 @@
 	}
 
 free_and_exit_assign_obj:
-	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+	if (UNEXPECTED(RETURN_VALUE_USED(opline)) && value) {
 		ZVAL_COPY_DEREF(EX_VAR(opline->result.var), value);
 	}
 
 exit_assign_obj:
+	if (garbage) {
+		GC_DTOR_NO_REF(garbage);
+	}
 
 
 	/* assign_obj has two opcodes! */
@@ -50470,6 +51845,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -50525,11 +51901,14 @@
 				goto assign_dim_error;
 			}
 			value = RT_CONSTANT((opline+1), (opline+1)->op1);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -50580,7 +51959,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -50618,6 +51997,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -50673,11 +52053,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -50729,7 +52112,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -50767,6 +52150,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -50822,11 +52206,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -50878,7 +52265,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -50916,6 +52303,7 @@
 	zval *value;
 	zval *variable_ptr;
 	zval *dim;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	orig_object_ptr = object_ptr = EX_VAR(opline->op1.var);
@@ -50971,11 +52359,14 @@
 				goto assign_dim_error;
 			}
 			value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
-			value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
+			value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
 		}
 		if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 			ZVAL_COPY(EX_VAR(opline->result.var), value);
 		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
 	} else {
 		if (EXPECTED(Z_ISREF_P(object_ptr))) {
 			object_ptr = Z_REFVAL_P(object_ptr);
@@ -51026,7 +52417,7 @@
 				UNDEF_RESULT();
 			} else {
 				HashTable *ht = zend_new_array(8);
-				zend_uchar old_type = Z_TYPE_P(object_ptr);
+				uint8_t old_type = Z_TYPE_P(object_ptr);
 
 				ZVAL_ARR(object_ptr, ht);
 				if (UNEXPECTED(old_type == IS_FALSE)) {
@@ -51067,9 +52458,18 @@
 	value = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	variable_ptr = EX_VAR(opline->op1.var);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(0)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(0)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(0)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
 	}
 
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -51087,9 +52487,18 @@
 	value = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	variable_ptr = EX_VAR(opline->op1.var);
 
-	value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
-	if (UNEXPECTED(1)) {
-		ZVAL_COPY(EX_VAR(opline->result.var), value);
+	if (0 || UNEXPECTED(1)) {
+		zend_refcounted *garbage = NULL;
+
+		value = zend_assign_to_variable_ex(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES(), &garbage);
+		if (UNEXPECTED(1)) {
+			ZVAL_COPY(EX_VAR(opline->result.var), value);
+		}
+		if (garbage) {
+			GC_DTOR_NO_REF(garbage);
+		}
+	} else {
+		value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES());
 	}
 
 	/* zend_assign_to_variable() always takes care of op2, never free it! */
@@ -51102,6 +52511,7 @@
 	USE_OPLINE
 	zval *variable_ptr;
 	zval *value_ptr;
+	zend_refcounted *garbage = NULL;
 
 	SAVE_OPLINE();
 	value_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
@@ -51117,9 +52527,9 @@
 			   UNEXPECTED(!Z_ISREF_P(value_ptr))) {
 
 		variable_ptr = zend_wrong_assign_to_variable_reference(
-			variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+			variable_ptr, value_ptr, &garbage OPLINE_CC EXECUTE_DATA_CC);
 	} else {
-		zend_assign_to_variable_reference(variable_ptr, value_ptr);
+		zend_assign_to_variable_reference(variable_ptr, value_ptr, &garbage);
 	}
 
 	if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -51126,7 +52536,11 @@
 		ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
 	}
 
+	if (garbage) {
+		GC_DTOR(garbage);
+	}
 
+
 	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -51161,7 +52575,7 @@
 	}
 
 
-	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));;
+	zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 	ZEND_VM_NEXT_OPCODE_EX(1, 2);
 }
 
@@ -51216,6 +52630,7 @@
 		zend_string *op1_str = Z_STR_P(op1);
 		zend_string *op2_str = Z_STR_P(op2);
 		zend_string *str;
+		uint32_t flags = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(op1_str, op2_str);
 
 		if (IS_CV != IS_CONST && UNEXPECTED(ZSTR_LEN(op1_str) == 0)) {
 			if (IS_CV == IS_CONST || IS_CV == IS_CV) {
@@ -51237,10 +52652,11 @@
 			}
 		} else if (IS_CV != IS_CONST && IS_CV != IS_CV &&
 		    !ZSTR_IS_INTERNED(op1_str) && GC_REFCOUNT(op1_str) == 1) {
-		    size_t len = ZSTR_LEN(op1_str);
+			size_t len = ZSTR_LEN(op1_str);
 
 			str = zend_string_extend(op1_str, len + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str) + len, ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op2_str, 0);
@@ -51249,6 +52665,7 @@
 			str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 			memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 			memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+			GC_ADD_FLAGS(str, flags);
 			ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 			if (IS_CV & (IS_TMP_VAR|IS_VAR)) {
 				zend_string_release_ex(op1_str, 0);
@@ -51309,6 +52726,8 @@
 		str = zend_string_alloc(ZSTR_LEN(op1_str) + ZSTR_LEN(op2_str), 0);
 		memcpy(ZSTR_VAL(str), ZSTR_VAL(op1_str), ZSTR_LEN(op1_str));
 		memcpy(ZSTR_VAL(str) + ZSTR_LEN(op1_str), ZSTR_VAL(op2_str), ZSTR_LEN(op2_str)+1);
+
+		ZSTR_COPY_CONCAT_PROPERTIES_BOTH(str, op1_str, op2_str);
 		ZVAL_NEW_STR(EX_VAR(opline->result.var), str);
 		if (IS_CV != IS_CONST) {
 			zend_string_release_ex(op1_str, 0);
@@ -51410,9 +52829,9 @@
 
 	if (IS_CV == IS_CONST &&
 	    EXPECTED(CACHED_PTR(opline->result.num) == called_scope)) {
-	    fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
 	} else {
-	    zend_object *orig_obj = obj;
+		zend_object *orig_obj = obj;
 
 		if (IS_CV == IS_CONST) {
 			function_name = EX_VAR(opline->op2.var);
@@ -51560,7 +52979,7 @@
 			str = ZSTR_EMPTY_ALLOC();
 			goto str_index;
 		} else {
-			zend_illegal_offset();
+			zend_illegal_array_offset_access(offset);
 			zval_ptr_dtor_nogc(expr_ptr);
 		}
 
@@ -51652,7 +53071,7 @@
 				key = ZSTR_EMPTY_ALLOC();
 				goto str_index_dim;
 			} else {
-				zend_type_error("Illegal offset type in unset");
+				zend_illegal_array_offset_unset(offset);
 			}
 			break;
 		} else if (Z_ISREF_P(container)) {
@@ -51960,7 +53379,7 @@
 				}
 			} else if (IS_CV == IS_TMP_VAR) {
 				ZVAL_COPY_VALUE(&generator->value, value);
-            } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+			} else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
 				ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
 
 			} else {
@@ -53365,11 +54784,6 @@
 			(void*)&&ZEND_JMPNZ_SPEC_TMPVAR_LABEL,
 			(void*)&&ZEND_NULL_LABEL,
 			(void*)&&ZEND_JMPNZ_SPEC_CV_LABEL,
-			(void*)&&ZEND_JMPZNZ_SPEC_CONST_LABEL,
-			(void*)&&ZEND_JMPZNZ_SPEC_TMPVAR_LABEL,
-			(void*)&&ZEND_JMPZNZ_SPEC_TMPVAR_LABEL,
-			(void*)&&ZEND_NULL_LABEL,
-			(void*)&&ZEND_JMPZNZ_SPEC_CV_LABEL,
 			(void*)&&ZEND_JMPZ_EX_SPEC_CONST_LABEL,
 			(void*)&&ZEND_JMPZ_EX_SPEC_TMPVAR_LABEL,
 			(void*)&&ZEND_JMPZ_EX_SPEC_TMPVAR_LABEL,
@@ -54293,6 +55707,8 @@
 			(void*)&&ZEND_INIT_DYNAMIC_CALL_SPEC_CV_LABEL,
 			(void*)&&ZEND_DO_ICALL_SPEC_RETVAL_UNUSED_LABEL,
 			(void*)&&ZEND_DO_ICALL_SPEC_RETVAL_USED_LABEL,
+			(void*)&&ZEND_DO_ICALL_SPEC_OBSERVER_LABEL,
+			(void*)&&ZEND_DO_ICALL_SPEC_OBSERVER_LABEL,
 			(void*)&&ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_LABEL,
 			(void*)&&ZEND_DO_UCALL_SPEC_RETVAL_USED_LABEL,
 			(void*)&&ZEND_DO_UCALL_SPEC_OBSERVER_LABEL,
@@ -54536,12 +55952,32 @@
 			(void*)&&ZEND_UNSET_STATIC_PROP_SPEC_LABEL,
 			(void*)&&ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_LABEL,
 			(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST_LABEL,
+			(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV_LABEL,
+			(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV_LABEL,
 			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
 			(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST_LABEL,
+			(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV_LABEL,
+			(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV_LABEL,
 			(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_LABEL,
+			(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV_LABEL,
+			(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV_LABEL,
 			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
 			(void*)&&ZEND_BIND_LEXICAL_SPEC_TMP_CV_LABEL,
-			(void*)&&ZEND_BIND_STATIC_SPEC_CV_UNUSED_LABEL,
+			(void*)&&ZEND_BIND_STATIC_SPEC_CV_LABEL,
 			(void*)&&ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED_LABEL,
 			(void*)&&ZEND_SEND_FUNC_ARG_SPEC_VAR_CONST_LABEL,
 			(void*)&&ZEND_NULL_LABEL,
@@ -54649,7 +56085,13 @@
 			(void*)&&ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED_LABEL,
 			(void*)&&ZEND_VERIFY_NEVER_TYPE_SPEC_UNUSED_UNUSED_LABEL,
 			(void*)&&ZEND_CALLABLE_CONVERT_SPEC_UNUSED_UNUSED_LABEL,
+			(void*)&&ZEND_BIND_INIT_STATIC_OR_JMP_SPEC_CV_LABEL,
 			(void*)&&ZEND_RECV_NOTYPE_SPEC_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED_LABEL,
+			(void*)&&ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED_LABEL,
+			(void*)&&ZEND_NULL_LABEL,
+			(void*)&&ZEND_COUNT_ARRAY_SPEC_CV_UNUSED_LABEL,
 			(void*)&&ZEND_JMP_FORWARD_SPEC_LABEL,
 			(void*)&&ZEND_NULL_LABEL,
 			(void*)&&ZEND_NULL_LABEL,
@@ -55571,6 +57013,16 @@
 	LOAD_OPLINE();
 	ZEND_VM_LOOP_INTERRUPT_CHECK();
 
+#ifdef ZEND_CHECK_STACK_LIMIT
+	if (UNEXPECTED(zend_call_stack_overflowed(EG(stack_limit)))) {
+		zend_call_stack_size_error();
+		/* No opline was executed before exception */
+		EG(opline_before_exception) = NULL;
+		LOAD_OPLINE();
+		/* Fall through to handle exception below. */
+	}
+#endif /* ZEND_CHECK_STACK_LIMIT */
+
 	while (1) {
 #if !defined(ZEND_VM_FP_GLOBAL_REG) || !defined(ZEND_VM_IP_GLOBAL_REG)
 			int ret;
@@ -55707,18 +57159,24 @@
 		LOAD_NEXT_OPLINE();
 		ZEND_VM_LEAVE();
 	} else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) {
-		zend_detach_symbol_table(execute_data);
+		if (EX(func)->op_array.last_var > 0) {
+			zend_detach_symbol_table(execute_data);
+			call_info |= ZEND_CALL_NEEDS_REATTACH;
+		}
 		zend_destroy_static_vars(&EX(func)->op_array);
 		destroy_op_array(&EX(func)->op_array);
 		efree_size(EX(func), sizeof(zend_op_array));
-#ifdef ZEND_PREFER_RELOAD
-		call_info = EX_CALL_INFO();
-#endif
 		old_execute_data = execute_data;
 		execute_data = EG(current_execute_data) = EX(prev_execute_data);
 		zend_vm_stack_free_call_frame_ex(call_info, old_execute_data);
 
-		zend_attach_symbol_table(execute_data);
+		if (call_info & ZEND_CALL_NEEDS_REATTACH) {
+			if (EX(func)->op_array.last_var > 0) {
+				zend_attach_symbol_table(execute_data);
+			} else {
+				ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_NEEDS_REATTACH);
+			}
+		}
 		if (UNEXPECTED(EG(exception) != NULL)) {
 			zend_rethrow_exception(execute_data);
 			HANDLE_EXCEPTION_LEAVE();
@@ -55749,16 +57207,25 @@
 		} else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
 			zend_array *symbol_table = EX(symbol_table);
 
-			zend_detach_symbol_table(execute_data);
-			old_execute_data = EX(prev_execute_data);
-			while (old_execute_data) {
-				if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) {
-					if (old_execute_data->symbol_table == symbol_table) {
-						zend_attach_symbol_table(old_execute_data);
+			if (EX(func)->op_array.last_var > 0) {
+				zend_detach_symbol_table(execute_data);
+				call_info |= ZEND_CALL_NEEDS_REATTACH;
+			}
+			if (call_info & ZEND_CALL_NEEDS_REATTACH) {
+				old_execute_data = EX(prev_execute_data);
+				while (old_execute_data) {
+					if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) {
+						if (old_execute_data->symbol_table == symbol_table) {
+							if (old_execute_data->func->op_array.last_var > 0) {
+								zend_attach_symbol_table(old_execute_data);
+							} else {
+								ZEND_ADD_CALL_FLAG(old_execute_data, ZEND_CALL_NEEDS_REATTACH);
+							}
+						}
+						break;
 					}
-					break;
+					old_execute_data = old_execute_data->prev_execute_data;
 				}
-				old_execute_data = old_execute_data->prev_execute_data;
 			}
 			EG(current_execute_data) = EX(prev_execute_data);
 			ZEND_VM_RETURN();
@@ -55778,6 +57245,10 @@
 				VM_TRACE(ZEND_DO_ICALL_SPEC_RETVAL_USED)
 				ZEND_DO_ICALL_SPEC_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 				HYBRID_BREAK();
+			HYBRID_CASE(ZEND_DO_ICALL_SPEC_OBSERVER):
+				VM_TRACE(ZEND_DO_ICALL_SPEC_OBSERVER)
+				ZEND_DO_ICALL_SPEC_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+				HYBRID_BREAK();
 			HYBRID_CASE(ZEND_DO_UCALL_SPEC_RETVAL_UNUSED):
 				VM_TRACE(ZEND_DO_UCALL_SPEC_RETVAL_UNUSED)
 				ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -55974,10 +57445,6 @@
 				VM_TRACE(ZEND_JMPNZ_SPEC_CONST)
 				ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 				HYBRID_BREAK();
-			HYBRID_CASE(ZEND_JMPZNZ_SPEC_CONST):
-				VM_TRACE(ZEND_JMPZNZ_SPEC_CONST)
-				ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
-				HYBRID_BREAK();
 			HYBRID_CASE(ZEND_JMPZ_EX_SPEC_CONST):
 				VM_TRACE(ZEND_JMPZ_EX_SPEC_CONST)
 				ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -56483,6 +57950,10 @@
 				VM_TRACE(ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ)
 				ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVARCV_JMPNZ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 				HYBRID_BREAK();
+			HYBRID_CASE(ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV):
+				VM_TRACE(ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV)
+				ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+				HYBRID_BREAK();
 			HYBRID_CASE(ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV):
 				VM_TRACE(ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV)
 				ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -57251,10 +58722,6 @@
 				VM_TRACE(ZEND_JMPNZ_SPEC_TMPVAR)
 				ZEND_JMPNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 				HYBRID_BREAK();
-			HYBRID_CASE(ZEND_JMPZNZ_SPEC_TMPVAR):
-				VM_TRACE(ZEND_JMPZNZ_SPEC_TMPVAR)
-				ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
-				HYBRID_BREAK();
 			HYBRID_CASE(ZEND_JMPZ_EX_SPEC_TMPVAR):
 				VM_TRACE(ZEND_JMPZ_EX_SPEC_TMPVAR)
 				ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -57535,6 +59002,10 @@
 				VM_TRACE(ZEND_COUNT_SPEC_TMPVAR_UNUSED)
 				ZEND_COUNT_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 				HYBRID_BREAK();
+			HYBRID_CASE(ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED):
+				VM_TRACE(ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED)
+				ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+				HYBRID_BREAK();
 			HYBRID_CASE(ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED):
 				VM_TRACE(ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED)
 				ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -58207,6 +59678,10 @@
 				VM_TRACE(ZEND_IN_ARRAY_SPEC_VAR_CONST)
 				ZEND_IN_ARRAY_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 				HYBRID_BREAK();
+			HYBRID_CASE(ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV):
+				VM_TRACE(ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV)
+				ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+				HYBRID_BREAK();
 			HYBRID_CASE(ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR):
 				VM_TRACE(ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR)
 				ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -58731,6 +60206,10 @@
 				VM_TRACE(ZEND_YIELD_SPEC_UNUSED_CONST)
 				ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 				HYBRID_BREAK();
+			HYBRID_CASE(ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV):
+				VM_TRACE(ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV)
+				ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+				HYBRID_BREAK();
 			HYBRID_CASE(ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR):
 				VM_TRACE(ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR)
 				ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -59027,10 +60506,6 @@
 				VM_TRACE(ZEND_JMPNZ_SPEC_CV)
 				ZEND_JMPNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 				HYBRID_BREAK();
-			HYBRID_CASE(ZEND_JMPZNZ_SPEC_CV):
-				VM_TRACE(ZEND_JMPZNZ_SPEC_CV)
-				ZEND_JMPZNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
-				HYBRID_BREAK();
 			HYBRID_CASE(ZEND_JMPZ_EX_SPEC_CV):
 				VM_TRACE(ZEND_JMPZ_EX_SPEC_CV)
 				ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -59189,6 +60664,14 @@
 				VM_TRACE(ZEND_FETCH_CLASS_NAME_SPEC_CV)
 				ZEND_FETCH_CLASS_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 				HYBRID_BREAK();
+			HYBRID_CASE(ZEND_BIND_STATIC_SPEC_CV):
+				VM_TRACE(ZEND_BIND_STATIC_SPEC_CV)
+				ZEND_BIND_STATIC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+				HYBRID_BREAK();
+			HYBRID_CASE(ZEND_BIND_INIT_STATIC_OR_JMP_SPEC_CV):
+				VM_TRACE(ZEND_BIND_INIT_STATIC_OR_JMP_SPEC_CV)
+				ZEND_BIND_INIT_STATIC_OR_JMP_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+				HYBRID_BREAK();
 			HYBRID_CASE(ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED):
 				VM_TRACE(ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED)
 				ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -59833,10 +61316,6 @@
 				VM_TRACE(ZEND_YIELD_SPEC_CV_UNUSED)
 				ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 				HYBRID_BREAK();
-			HYBRID_CASE(ZEND_BIND_STATIC_SPEC_CV_UNUSED):
-				VM_TRACE(ZEND_BIND_STATIC_SPEC_CV_UNUSED)
-				ZEND_BIND_STATIC_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
-				HYBRID_BREAK();
 			HYBRID_CASE(ZEND_CHECK_VAR_SPEC_CV_UNUSED):
 				VM_TRACE(ZEND_CHECK_VAR_SPEC_CV_UNUSED)
 				ZEND_CHECK_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -59849,6 +61328,10 @@
 				VM_TRACE(ZEND_COUNT_SPEC_CV_UNUSED)
 				ZEND_COUNT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
 				HYBRID_BREAK();
+			HYBRID_CASE(ZEND_COUNT_ARRAY_SPEC_CV_UNUSED):
+				VM_TRACE(ZEND_COUNT_ARRAY_SPEC_CV_UNUSED)
+				ZEND_COUNT_ARRAY_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+				HYBRID_BREAK();
 			HYBRID_CASE(ZEND_GET_CLASS_SPEC_CV_UNUSED):
 				VM_TRACE(ZEND_GET_CLASS_SPEC_CV_UNUSED)
 				ZEND_GET_CLASS_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -61423,11 +62906,6 @@
 		ZEND_JMPNZ_SPEC_TMPVAR_HANDLER,
 		ZEND_NULL_HANDLER,
 		ZEND_JMPNZ_SPEC_CV_HANDLER,
-		ZEND_JMPZNZ_SPEC_CONST_HANDLER,
-		ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER,
-		ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER,
-		ZEND_NULL_HANDLER,
-		ZEND_JMPZNZ_SPEC_CV_HANDLER,
 		ZEND_JMPZ_EX_SPEC_CONST_HANDLER,
 		ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER,
 		ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER,
@@ -62351,6 +63829,8 @@
 		ZEND_INIT_DYNAMIC_CALL_SPEC_CV_HANDLER,
 		ZEND_DO_ICALL_SPEC_RETVAL_UNUSED_HANDLER,
 		ZEND_DO_ICALL_SPEC_RETVAL_USED_HANDLER,
+		ZEND_DO_ICALL_SPEC_OBSERVER_HANDLER,
+		ZEND_DO_ICALL_SPEC_OBSERVER_HANDLER,
 		ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_HANDLER,
 		ZEND_DO_UCALL_SPEC_RETVAL_USED_HANDLER,
 		ZEND_DO_UCALL_SPEC_OBSERVER_HANDLER,
@@ -62594,12 +64074,32 @@
 		ZEND_UNSET_STATIC_PROP_SPEC_HANDLER,
 		ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC_HANDLER,
 		ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST_HANDLER,
+		ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV_HANDLER,
+		ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV_HANDLER,
 		ZEND_NULL_HANDLER,
+		ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV_HANDLER,
+		ZEND_NULL_HANDLER,
+		ZEND_NULL_HANDLER,
+		ZEND_NULL_HANDLER,
+		ZEND_NULL_HANDLER,
+		ZEND_NULL_HANDLER,
 		ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST_HANDLER,
+		ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV_HANDLER,
+		ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV_HANDLER,
+		ZEND_NULL_HANDLER,
+		ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV_HANDLER,
 		ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST_HANDLER,
+		ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV_HANDLER,
+		ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV_HANDLER,
 		ZEND_NULL_HANDLER,
+		ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV_HANDLER,
+		ZEND_NULL_HANDLER,
+		ZEND_NULL_HANDLER,
+		ZEND_NULL_HANDLER,
+		ZEND_NULL_HANDLER,
+		ZEND_NULL_HANDLER,
 		ZEND_BIND_LEXICAL_SPEC_TMP_CV_HANDLER,
-		ZEND_BIND_STATIC_SPEC_CV_UNUSED_HANDLER,
+		ZEND_BIND_STATIC_SPEC_CV_HANDLER,
 		ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED_HANDLER,
 		ZEND_SEND_FUNC_ARG_SPEC_VAR_CONST_HANDLER,
 		ZEND_NULL_HANDLER,
@@ -62707,7 +64207,13 @@
 		ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED_HANDLER,
 		ZEND_VERIFY_NEVER_TYPE_SPEC_UNUSED_UNUSED_HANDLER,
 		ZEND_CALLABLE_CONVERT_SPEC_UNUSED_UNUSED_HANDLER,
+		ZEND_BIND_INIT_STATIC_OR_JMP_SPEC_CV_HANDLER,
 		ZEND_RECV_NOTYPE_SPEC_HANDLER,
+		ZEND_NULL_HANDLER,
+		ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED_HANDLER,
+		ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED_HANDLER,
+		ZEND_NULL_HANDLER,
+		ZEND_COUNT_ARRAY_SPEC_CV_UNUSED_HANDLER,
 		ZEND_JMP_FORWARD_SPEC_HANDLER,
 		ZEND_NULL_HANDLER,
 		ZEND_NULL_HANDLER,
@@ -63658,165 +65164,217 @@
 		1255,
 		1256 | SPEC_RULE_OP1,
 		1261 | SPEC_RULE_OP1,
+		3476,
 		1266 | SPEC_RULE_OP1,
 		1271 | SPEC_RULE_OP1,
-		1276 | SPEC_RULE_OP1,
-		1281 | SPEC_RULE_OP2,
-		1286,
-		1287 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
+		1276 | SPEC_RULE_OP2,
+		1281,
+		1282 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
+		1292 | SPEC_RULE_OP1,
 		1297 | SPEC_RULE_OP1,
-		1302 | SPEC_RULE_OP1,
-		1307 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1302 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1327 | SPEC_RULE_OP2,
 		1332 | SPEC_RULE_OP2,
 		1337 | SPEC_RULE_OP2,
-		1342 | SPEC_RULE_OP2,
-		1347,
-		1348,
+		1342,
+		1343,
+		1344,
+		1345 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER,
 		1349,
-		1350 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER,
-		1354,
-		1355 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
-		1365,
-		1366,
-		1367 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1392 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
-		1442 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1467 | SPEC_RULE_OP1,
-		1472,
-		1473,
-		1474 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1499 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1524 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
-		1534 | SPEC_RULE_OP1,
-		1539 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1564 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1589 | SPEC_RULE_OP1,
-		1594,
-		1595,
-		1596 | SPEC_RULE_OP1,
-		1601 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1626 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1651 | SPEC_RULE_OP1,
-		1656 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1681 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1706 | SPEC_RULE_OP1,
-		1711 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1736 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1761 | SPEC_RULE_OP1,
-		1766 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1791 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1816 | SPEC_RULE_OP1,
-		1821 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1846 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1871 | SPEC_RULE_OP1,
-		1876 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1901 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1926 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		1951,
-		1952 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
-		1962,
-		1963,
-		1964,
-		1965,
-		1966,
-		1967 | SPEC_RULE_OP2,
-		1972,
-		1973 | SPEC_RULE_OP1,
-		1978 | SPEC_RULE_OP2,
-		1983 | SPEC_RULE_OP1,
-		1988 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
-		1998 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2023 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2048 | SPEC_RULE_OP1,
-		2053 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2078 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
-		2128 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2153 | SPEC_RULE_OP2,
-		2158,
+		1350 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
+		1360,
+		1361,
+		1362 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1387 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
+		1437 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1462 | SPEC_RULE_OP1,
+		1467,
+		1468,
+		1469 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1494 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1519 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
+		1529 | SPEC_RULE_OP1,
+		1534 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1559 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1584 | SPEC_RULE_OP1,
+		1589,
+		1590,
+		1591 | SPEC_RULE_OP1,
+		1596 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1621 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1646 | SPEC_RULE_OP1,
+		1651 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1676 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1701 | SPEC_RULE_OP1,
+		1706 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1731 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1756 | SPEC_RULE_OP1,
+		1761 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1786 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1811 | SPEC_RULE_OP1,
+		1816 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1841 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1866 | SPEC_RULE_OP1,
+		1871 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1896 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1921 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		1946,
+		1947 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
+		1957,
+		1958,
+		1959,
+		1960,
+		1961,
+		1962 | SPEC_RULE_OP2,
+		1967,
+		1968 | SPEC_RULE_OP1,
+		1973 | SPEC_RULE_OP2,
+		1978 | SPEC_RULE_OP1,
+		1983 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
+		1993 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2018 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2043 | SPEC_RULE_OP1,
+		2048 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2073 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
+		2123 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2148 | SPEC_RULE_OP2,
+		2153,
+		2154 | SPEC_RULE_OP1,
 		2159 | SPEC_RULE_OP1,
-		2164 | SPEC_RULE_OP1,
-		2169,
+		2164,
+		2165 | SPEC_RULE_OP1,
 		2170 | SPEC_RULE_OP1,
 		2175 | SPEC_RULE_OP1,
-		2180 | SPEC_RULE_OP1,
-		2185,
-		2186,
-		2187 | SPEC_RULE_OP2,
-		2192 | SPEC_RULE_RETVAL,
-		2194 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER,
-		2198 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER,
-		2202 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2202 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2227 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2227 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2252 | SPEC_RULE_OP1,
-		2257,
-		2258 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2283,
-		2284 | SPEC_RULE_OP1,
+		2180,
+		2181,
+		2182 | SPEC_RULE_OP2,
+		2187 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER,
+		2191 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER,
+		2195 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER,
+		2199 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2199 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2224 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2224 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2249 | SPEC_RULE_OP1,
+		2254,
+		2255 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2280,
+		2281 | SPEC_RULE_OP1,
+		2286,
+		2287,
+		2288,
 		2289,
 		2290,
 		2291,
 		2292,
-		2293,
-		2294,
-		2295,
-		2296 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2321,
-		2322,
-		2323,
-		2324 | SPEC_RULE_OP1,
-		2329,
-		2330 | SPEC_RULE_ISSET,
-		2332 | SPEC_RULE_OP2,
-		2337,
-		2338 | SPEC_RULE_OP1,
-		2343 | SPEC_RULE_OBSERVER,
-		2345,
-		2346 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2371 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
+		2293 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2318,
+		2319,
+		2320,
+		2321 | SPEC_RULE_OP1,
+		2326,
+		2327 | SPEC_RULE_ISSET,
+		2329 | SPEC_RULE_OP2,
+		2334,
+		2335 | SPEC_RULE_OP1,
+		2340 | SPEC_RULE_OBSERVER,
+		2342,
+		2343 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2368 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
+		2378,
+		2379,
+		2380,
 		2381,
-		2382,
-		2383,
-		2384,
-		2385 | SPEC_RULE_OP1,
-		2390,
-		2391,
-		2392 | SPEC_RULE_OP1,
-		2397 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2422,
-		2423 | SPEC_RULE_OP1,
+		2382 | SPEC_RULE_OP1,
+		2387,
+		2388,
+		2389 | SPEC_RULE_OP1,
+		2394 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2419,
+		2420 | SPEC_RULE_OP1,
+		2425,
+		2426,
+		2427,
 		2428,
 		2429,
 		2430,
 		2431,
 		2432,
-		2433,
-		2434,
-		2435,
-		2436 | SPEC_RULE_OP1,
-		2441,
-		2442,
-		2443,
-		2444 | SPEC_RULE_OP2,
-		2449,
-		2450 | SPEC_RULE_OP1,
-		2455 | SPEC_RULE_OP1,
-		2460 | SPEC_RULE_OP1,
-		2465 | SPEC_RULE_OP1,
-		2470 | SPEC_RULE_OP1,
-		2475,
-		2476 | SPEC_RULE_OP1,
-		2481 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2506 | SPEC_RULE_OP1,
-		2511 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-		2536 | SPEC_RULE_OP1,
-		2541 | SPEC_RULE_OP1,
-		2546,
-		2547,
-		2548,
-		2549,
-		3453
+		2433 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2458,
+		2459,
+		2460,
+		2461 | SPEC_RULE_OP2,
+		2466,
+		2467 | SPEC_RULE_OP1,
+		2472 | SPEC_RULE_OP1,
+		2477 | SPEC_RULE_OP1,
+		2482 | SPEC_RULE_OP1,
+		2487 | SPEC_RULE_OP1,
+		2492,
+		2493 | SPEC_RULE_OP1,
+		2498 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2523 | SPEC_RULE_OP1,
+		2528 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+		2553 | SPEC_RULE_OP1,
+		2558 | SPEC_RULE_OP1,
+		2563,
+		2564,
+		2565,
+		2566,
+		2567,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
+		3476,
 	};
 #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
 	zend_opcode_handler_funcs = labels;
@@ -63853,7 +65411,7 @@
 	Z_TYPE_INFO(tmp) = IS_LONG;
 	for (i = 0; i < zend_handlers_count; i++) {
 		Z_LVAL(tmp) = i;
-		zend_hash_index_add(zend_handlers_table, (zend_long)(zend_uintptr_t)zend_opcode_handlers[i], &tmp);
+		zend_hash_index_add(zend_handlers_table, (zend_long)(uintptr_t)zend_opcode_handlers[i], &tmp);
 	}
 }
 
@@ -63864,14 +65422,14 @@
 	if (!zend_handlers_table) {
 		init_opcode_serialiser();
 	}
-	zv = zend_hash_index_find(zend_handlers_table, (zend_long)(zend_uintptr_t)op->handler);
+	zv = zend_hash_index_find(zend_handlers_table, (zend_long)(uintptr_t)op->handler);
 	ZEND_ASSERT(zv != NULL);
-	op->handler = (const void *)(zend_uintptr_t)Z_LVAL_P(zv);
+	op->handler = (const void *)(uintptr_t)Z_LVAL_P(zv);
 }
 
 ZEND_API void ZEND_FASTCALL zend_deserialize_opcode_handler(zend_op *op)
 {
-	op->handler = zend_opcode_handlers[(zend_uintptr_t)op->handler];
+	op->handler = zend_opcode_handlers[(uintptr_t)op->handler];
 }
 
 ZEND_API const void* ZEND_FASTCALL zend_get_opcode_handler_func(const zend_op *op)
@@ -63884,7 +65442,7 @@
 	if (!zend_handlers_table) {
 		init_opcode_serialiser();
 	}
-	zv = zend_hash_index_find(zend_handlers_table, (zend_long)(zend_uintptr_t)op->handler);
+	zv = zend_hash_index_find(zend_handlers_table, (zend_long)(uintptr_t)op->handler);
 	ZEND_ASSERT(zv != NULL);
 	return zend_opcode_handler_funcs[Z_LVAL_P(zv)];
 #else
@@ -63952,7 +65510,7 @@
 }
 
 #if (ZEND_VM_KIND != ZEND_VM_KIND_HYBRID) || !ZEND_VM_SPEC
-static const void *zend_vm_get_opcode_handler(zend_uchar opcode, const zend_op* op)
+static const void *zend_vm_get_opcode_handler(uint8_t opcode, const zend_op* op)
 {
 	return zend_opcode_handlers[zend_vm_get_opcode_handler_idx(zend_spec_handlers[opcode], op)];
 }
@@ -63959,7 +65517,7 @@
 #endif
 
 #if ZEND_VM_KIND == ZEND_VM_KIND_HYBRID
-static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend_op* op)
+static const void *zend_vm_get_opcode_handler_func(uint8_t opcode, const zend_op* op)
 {
 	uint32_t spec = zend_spec_handlers[opcode];
 	return zend_opcode_handler_funcs[zend_vm_get_opcode_handler_idx(spec, op)];
@@ -63969,7 +65527,7 @@
 
 ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler(zend_op* op)
 {
-	zend_uchar opcode = zend_user_opcodes[op->opcode];
+	uint8_t opcode = zend_user_opcodes[op->opcode];
 
 	if (zend_spec_handlers[op->opcode] & SPEC_RULE_COMMUTATIVE) {
 		if (op->op1_type < op->op2_type) {
@@ -63981,7 +65539,7 @@
 
 ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint32_t op2_info, uint32_t res_info)
 {
-	zend_uchar opcode = zend_user_opcodes[op->opcode];
+	uint8_t opcode = zend_user_opcodes[op->opcode];
 	uint32_t spec = zend_spec_handlers[opcode];
 	switch (opcode) {
 		case ZEND_ADD:
@@ -63989,7 +65547,7 @@
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2552 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+				spec = 2575 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
 				if (op->op1_type < op->op2_type) {
 					zend_swap_operands(op);
 				}
@@ -63997,7 +65555,7 @@
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2577 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+				spec = 2600 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
 				if (op->op1_type < op->op2_type) {
 					zend_swap_operands(op);
 				}
@@ -64005,7 +65563,7 @@
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2602 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+				spec = 2625 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
 				if (op->op1_type < op->op2_type) {
 					zend_swap_operands(op);
 				}
@@ -64016,17 +65574,17 @@
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2627 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+				spec = 2650 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
 			} else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2652 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+				spec = 2675 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
 			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2677 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+				spec = 2700 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
 			}
 			break;
 		case ZEND_MUL:
@@ -64037,17 +65595,17 @@
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2702 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+				spec = 2725 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
 			} else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2727 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+				spec = 2750 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
 			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2752 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+				spec = 2775 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
 			}
 			break;
 		case ZEND_IS_IDENTICAL:
@@ -64058,14 +65616,14 @@
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2777 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+				spec = 2800 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
 			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2852 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+				spec = 2875 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
 			} else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) {
-				spec = 3077 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+				spec = 3100 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
 			}
 			break;
 		case ZEND_IS_NOT_IDENTICAL:
@@ -64076,14 +65634,14 @@
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2927 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+				spec = 2950 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
 			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 3002 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+				spec = 3025 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
 			} else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) {
-				spec = 3082 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+				spec = 3105 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
 			}
 			break;
 		case ZEND_IS_EQUAL:
@@ -64094,12 +65652,12 @@
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2777 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+				spec = 2800 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
 			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2852 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+				spec = 2875 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
 			}
 			break;
 		case ZEND_IS_NOT_EQUAL:
@@ -64110,12 +65668,12 @@
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 2927 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+				spec = 2950 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
 			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 3002 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+				spec = 3025 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
 			}
 			break;
 		case ZEND_IS_SMALLER:
@@ -64123,12 +65681,12 @@
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 3087 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+				spec = 3110 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
 			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 3162 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+				spec = 3185 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
 			}
 			break;
 		case ZEND_IS_SMALLER_OR_EQUAL:
@@ -64136,74 +65694,74 @@
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 3237 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+				spec = 3260 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
 			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 3312 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+				spec = 3335 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
 			}
 			break;
 		case ZEND_QM_ASSIGN:
 			if (op1_info == MAY_BE_LONG) {
-				spec = 3399 | SPEC_RULE_OP1;
+				spec = 3422 | SPEC_RULE_OP1;
 			} else if (op1_info == MAY_BE_DOUBLE) {
-				spec = 3404 | SPEC_RULE_OP1;
+				spec = 3427 | SPEC_RULE_OP1;
 			} else if ((op->op1_type == IS_CONST) ? !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)) : (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) {
-				spec = 3409 | SPEC_RULE_OP1;
+				spec = 3432 | SPEC_RULE_OP1;
 			}
 			break;
 		case ZEND_PRE_INC:
 			if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
-				spec = 3387 | SPEC_RULE_RETVAL;
+				spec = 3410 | SPEC_RULE_RETVAL;
 			} else if (op1_info == MAY_BE_LONG) {
-				spec = 3389 | SPEC_RULE_RETVAL;
+				spec = 3412 | SPEC_RULE_RETVAL;
 			}
 			break;
 		case ZEND_PRE_DEC:
 			if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
-				spec = 3391 | SPEC_RULE_RETVAL;
+				spec = 3414 | SPEC_RULE_RETVAL;
 			} else if (op1_info == MAY_BE_LONG) {
-				spec = 3393 | SPEC_RULE_RETVAL;
+				spec = 3416 | SPEC_RULE_RETVAL;
 			}
 			break;
 		case ZEND_POST_INC:
 			if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
-				spec = 3395;
+				spec = 3418;
 			} else if (op1_info == MAY_BE_LONG) {
-				spec = 3396;
+				spec = 3419;
 			}
 			break;
 		case ZEND_POST_DEC:
 			if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
-				spec = 3397;
+				spec = 3420;
 			} else if (op1_info == MAY_BE_LONG) {
-				spec = 3398;
+				spec = 3421;
 			}
 			break;
 		case ZEND_JMP:
 			if (OP_JMP_ADDR(op, op->op1) > op) {
-				spec = 2551;
+				spec = 2574;
 			}
 			break;
 		case ZEND_RECV:
 			if (op->op2.num == MAY_BE_ANY) {
-				spec = 2550;
+				spec = 2568;
 			}
 			break;
 		case ZEND_SEND_VAL:
 			if (op->op1_type == IS_CONST && op->op2_type == IS_UNUSED && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
-				spec = 3449;
+				spec = 3472;
 			}
 			break;
 		case ZEND_SEND_VAR_EX:
 			if (op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
-				spec = 3444 | SPEC_RULE_OP1;
+				spec = 3467 | SPEC_RULE_OP1;
 			}
 			break;
 		case ZEND_FE_FETCH_R:
 			if (op->op2_type == IS_CV && (op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) {
-				spec = 3451 | SPEC_RULE_RETVAL;
+				spec = 3474 | SPEC_RULE_RETVAL;
 			}
 			break;
 		case ZEND_FETCH_DIM_R:
@@ -64211,19 +65769,24 @@
 				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
 					break;
 				}
-				spec = 3414 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+				spec = 3437 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
 			}
 			break;
 		case ZEND_SEND_VAL_EX:
 			if (op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
-				spec = 3450;
+				spec = 3473;
 			}
 			break;
 		case ZEND_SEND_VAR:
 			if (op->op2_type == IS_UNUSED && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
-				spec = 3439 | SPEC_RULE_OP1;
+				spec = 3462 | SPEC_RULE_OP1;
 			}
 			break;
+		case ZEND_COUNT:
+			if ((op1_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) == MAY_BE_ARRAY) {
+				spec = 2569 | SPEC_RULE_OP1;
+			}
+			break;
 		case ZEND_BW_OR:
 		case ZEND_BW_AND:
 		case ZEND_BW_XOR:

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_handlers.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_handlers.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_handlers.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -575,1278 +575,1289 @@
 	_(1262, ZEND_JMPNZ_SPEC_TMPVAR) \
 	_(1263, ZEND_JMPNZ_SPEC_TMPVAR) \
 	_(1265, ZEND_JMPNZ_SPEC_CV) \
-	_(1266, ZEND_JMPZNZ_SPEC_CONST) \
-	_(1267, ZEND_JMPZNZ_SPEC_TMPVAR) \
-	_(1268, ZEND_JMPZNZ_SPEC_TMPVAR) \
-	_(1270, ZEND_JMPZNZ_SPEC_CV) \
-	_(1271, ZEND_JMPZ_EX_SPEC_CONST) \
-	_(1272, ZEND_JMPZ_EX_SPEC_TMPVAR) \
-	_(1273, ZEND_JMPZ_EX_SPEC_TMPVAR) \
-	_(1275, ZEND_JMPZ_EX_SPEC_CV) \
-	_(1276, ZEND_JMPNZ_EX_SPEC_CONST) \
-	_(1277, ZEND_JMPNZ_EX_SPEC_TMPVAR) \
-	_(1278, ZEND_JMPNZ_EX_SPEC_TMPVAR) \
-	_(1280, ZEND_JMPNZ_EX_SPEC_CV) \
-	_(1281, ZEND_CASE_SPEC_TMPVAR_CONST) \
-	_(1282, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \
-	_(1283, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \
-	_(1285, ZEND_CASE_SPEC_TMPVAR_CV) \
-	_(1286, ZEND_CHECK_VAR_SPEC_CV_UNUSED) \
-	_(1287, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_CONST) \
-	_(1288, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_CONST) \
-	_(1293, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_UNUSED) \
-	_(1294, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_UNUSED_QUICK) \
-	_(1297, ZEND_CAST_SPEC_CONST) \
-	_(1298, ZEND_CAST_SPEC_TMP) \
-	_(1299, ZEND_CAST_SPEC_VAR) \
-	_(1301, ZEND_CAST_SPEC_CV) \
-	_(1302, ZEND_BOOL_SPEC_CONST) \
-	_(1303, ZEND_BOOL_SPEC_TMPVAR) \
-	_(1304, ZEND_BOOL_SPEC_TMPVAR) \
-	_(1306, ZEND_BOOL_SPEC_CV) \
-	_(1307, ZEND_FAST_CONCAT_SPEC_CONST_CONST) \
-	_(1308, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \
-	_(1309, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \
-	_(1311, ZEND_FAST_CONCAT_SPEC_CONST_CV) \
+	_(1266, ZEND_JMPZ_EX_SPEC_CONST) \
+	_(1267, ZEND_JMPZ_EX_SPEC_TMPVAR) \
+	_(1268, ZEND_JMPZ_EX_SPEC_TMPVAR) \
+	_(1270, ZEND_JMPZ_EX_SPEC_CV) \
+	_(1271, ZEND_JMPNZ_EX_SPEC_CONST) \
+	_(1272, ZEND_JMPNZ_EX_SPEC_TMPVAR) \
+	_(1273, ZEND_JMPNZ_EX_SPEC_TMPVAR) \
+	_(1275, ZEND_JMPNZ_EX_SPEC_CV) \
+	_(1276, ZEND_CASE_SPEC_TMPVAR_CONST) \
+	_(1277, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \
+	_(1278, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \
+	_(1280, ZEND_CASE_SPEC_TMPVAR_CV) \
+	_(1281, ZEND_CHECK_VAR_SPEC_CV_UNUSED) \
+	_(1282, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_CONST) \
+	_(1283, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_CONST) \
+	_(1288, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_UNUSED) \
+	_(1289, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_UNUSED_QUICK) \
+	_(1292, ZEND_CAST_SPEC_CONST) \
+	_(1293, ZEND_CAST_SPEC_TMP) \
+	_(1294, ZEND_CAST_SPEC_VAR) \
+	_(1296, ZEND_CAST_SPEC_CV) \
+	_(1297, ZEND_BOOL_SPEC_CONST) \
+	_(1298, ZEND_BOOL_SPEC_TMPVAR) \
+	_(1299, ZEND_BOOL_SPEC_TMPVAR) \
+	_(1301, ZEND_BOOL_SPEC_CV) \
+	_(1302, ZEND_FAST_CONCAT_SPEC_CONST_CONST) \
+	_(1303, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \
+	_(1304, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \
+	_(1306, ZEND_FAST_CONCAT_SPEC_CONST_CV) \
+	_(1307, ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) \
+	_(1308, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \
+	_(1309, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \
+	_(1311, ZEND_FAST_CONCAT_SPEC_TMPVAR_CV) \
 	_(1312, ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) \
 	_(1313, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \
 	_(1314, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \
 	_(1316, ZEND_FAST_CONCAT_SPEC_TMPVAR_CV) \
-	_(1317, ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) \
-	_(1318, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \
-	_(1319, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \
-	_(1321, ZEND_FAST_CONCAT_SPEC_TMPVAR_CV) \
-	_(1327, ZEND_FAST_CONCAT_SPEC_CV_CONST) \
-	_(1328, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \
-	_(1329, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \
-	_(1331, ZEND_FAST_CONCAT_SPEC_CV_CV) \
-	_(1332, ZEND_ROPE_INIT_SPEC_UNUSED_CONST) \
-	_(1333, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \
-	_(1334, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \
-	_(1336, ZEND_ROPE_INIT_SPEC_UNUSED_CV) \
-	_(1337, ZEND_ROPE_ADD_SPEC_TMP_CONST) \
-	_(1338, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \
-	_(1339, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \
-	_(1341, ZEND_ROPE_ADD_SPEC_TMP_CV) \
-	_(1342, ZEND_ROPE_END_SPEC_TMP_CONST) \
-	_(1343, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \
-	_(1344, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \
-	_(1346, ZEND_ROPE_END_SPEC_TMP_CV) \
-	_(1347, ZEND_BEGIN_SILENCE_SPEC) \
-	_(1348, ZEND_END_SILENCE_SPEC_TMP) \
-	_(1349, ZEND_INIT_FCALL_BY_NAME_SPEC_CONST) \
-	_(1350, ZEND_DO_FCALL_SPEC_RETVAL_UNUSED) \
-	_(1351, ZEND_DO_FCALL_SPEC_RETVAL_USED) \
-	_(1352, ZEND_DO_FCALL_SPEC_OBSERVER) \
-	_(1353, ZEND_DO_FCALL_SPEC_OBSERVER) \
-	_(1354, ZEND_INIT_FCALL_SPEC_CONST) \
-	_(1355, ZEND_RETURN_SPEC_CONST) \
-	_(1356, ZEND_RETURN_SPEC_OBSERVER) \
-	_(1357, ZEND_RETURN_SPEC_TMP) \
-	_(1358, ZEND_RETURN_SPEC_OBSERVER) \
-	_(1359, ZEND_RETURN_SPEC_VAR) \
-	_(1360, ZEND_RETURN_SPEC_OBSERVER) \
-	_(1363, ZEND_RETURN_SPEC_CV) \
-	_(1364, ZEND_RETURN_SPEC_OBSERVER) \
-	_(1365, ZEND_RECV_SPEC_UNUSED) \
-	_(1366, ZEND_RECV_INIT_SPEC_CONST) \
-	_(1367, ZEND_SEND_VAL_SPEC_CONST_CONST) \
-	_(1370, ZEND_SEND_VAL_SPEC_CONST_UNUSED) \
+	_(1322, ZEND_FAST_CONCAT_SPEC_CV_CONST) \
+	_(1323, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \
+	_(1324, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \
+	_(1326, ZEND_FAST_CONCAT_SPEC_CV_CV) \
+	_(1327, ZEND_ROPE_INIT_SPEC_UNUSED_CONST) \
+	_(1328, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \
+	_(1329, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \
+	_(1331, ZEND_ROPE_INIT_SPEC_UNUSED_CV) \
+	_(1332, ZEND_ROPE_ADD_SPEC_TMP_CONST) \
+	_(1333, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \
+	_(1334, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \
+	_(1336, ZEND_ROPE_ADD_SPEC_TMP_CV) \
+	_(1337, ZEND_ROPE_END_SPEC_TMP_CONST) \
+	_(1338, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \
+	_(1339, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \
+	_(1341, ZEND_ROPE_END_SPEC_TMP_CV) \
+	_(1342, ZEND_BEGIN_SILENCE_SPEC) \
+	_(1343, ZEND_END_SILENCE_SPEC_TMP) \
+	_(1344, ZEND_INIT_FCALL_BY_NAME_SPEC_CONST) \
+	_(1345, ZEND_DO_FCALL_SPEC_RETVAL_UNUSED) \
+	_(1346, ZEND_DO_FCALL_SPEC_RETVAL_USED) \
+	_(1347, ZEND_DO_FCALL_SPEC_OBSERVER) \
+	_(1348, ZEND_DO_FCALL_SPEC_OBSERVER) \
+	_(1349, ZEND_INIT_FCALL_SPEC_CONST) \
+	_(1350, ZEND_RETURN_SPEC_CONST) \
+	_(1351, ZEND_RETURN_SPEC_OBSERVER) \
+	_(1352, ZEND_RETURN_SPEC_TMP) \
+	_(1353, ZEND_RETURN_SPEC_OBSERVER) \
+	_(1354, ZEND_RETURN_SPEC_VAR) \
+	_(1355, ZEND_RETURN_SPEC_OBSERVER) \
+	_(1358, ZEND_RETURN_SPEC_CV) \
+	_(1359, ZEND_RETURN_SPEC_OBSERVER) \
+	_(1360, ZEND_RECV_SPEC_UNUSED) \
+	_(1361, ZEND_RECV_INIT_SPEC_CONST) \
+	_(1362, ZEND_SEND_VAL_SPEC_CONST_CONST) \
+	_(1365, ZEND_SEND_VAL_SPEC_CONST_UNUSED) \
+	_(1367, ZEND_SEND_VAL_SPEC_TMPVAR_CONST) \
+	_(1370, ZEND_SEND_VAL_SPEC_TMPVAR_UNUSED) \
 	_(1372, ZEND_SEND_VAL_SPEC_TMPVAR_CONST) \
 	_(1375, ZEND_SEND_VAL_SPEC_TMPVAR_UNUSED) \
-	_(1377, ZEND_SEND_VAL_SPEC_TMPVAR_CONST) \
-	_(1380, ZEND_SEND_VAL_SPEC_TMPVAR_UNUSED) \
-	_(1412, ZEND_SEND_VAR_EX_SPEC_VAR_CONST) \
-	_(1413, ZEND_SEND_VAR_EX_SPEC_VAR_CONST) \
-	_(1418, ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED) \
-	_(1419, ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED_QUICK) \
-	_(1432, ZEND_SEND_VAR_EX_SPEC_CV_CONST) \
-	_(1433, ZEND_SEND_VAR_EX_SPEC_CV_CONST) \
-	_(1438, ZEND_SEND_VAR_EX_SPEC_CV_UNUSED) \
-	_(1439, ZEND_SEND_VAR_EX_SPEC_CV_UNUSED_QUICK) \
-	_(1452, ZEND_SEND_REF_SPEC_VAR_CONST) \
-	_(1455, ZEND_SEND_REF_SPEC_VAR_UNUSED) \
-	_(1462, ZEND_SEND_REF_SPEC_CV_CONST) \
-	_(1465, ZEND_SEND_REF_SPEC_CV_UNUSED) \
-	_(1467, ZEND_NEW_SPEC_CONST_UNUSED) \
-	_(1469, ZEND_NEW_SPEC_VAR_UNUSED) \
-	_(1470, ZEND_NEW_SPEC_UNUSED_UNUSED) \
-	_(1472, ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST) \
-	_(1473, ZEND_FREE_SPEC_TMPVAR) \
-	_(1474, ZEND_INIT_ARRAY_SPEC_CONST_CONST) \
-	_(1475, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \
-	_(1476, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \
-	_(1477, ZEND_INIT_ARRAY_SPEC_CONST_UNUSED) \
-	_(1478, ZEND_INIT_ARRAY_SPEC_CONST_CV) \
-	_(1479, ZEND_INIT_ARRAY_SPEC_TMP_CONST) \
-	_(1480, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \
-	_(1481, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \
-	_(1482, ZEND_INIT_ARRAY_SPEC_TMP_UNUSED) \
-	_(1483, ZEND_INIT_ARRAY_SPEC_TMP_CV) \
-	_(1484, ZEND_INIT_ARRAY_SPEC_VAR_CONST) \
-	_(1485, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \
-	_(1486, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \
-	_(1487, ZEND_INIT_ARRAY_SPEC_VAR_UNUSED) \
-	_(1488, ZEND_INIT_ARRAY_SPEC_VAR_CV) \
-	_(1489, ZEND_INIT_ARRAY_SPEC_UNUSED_CONST) \
-	_(1490, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \
-	_(1491, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \
-	_(1492, ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED) \
-	_(1493, ZEND_INIT_ARRAY_SPEC_UNUSED_CV) \
-	_(1494, ZEND_INIT_ARRAY_SPEC_CV_CONST) \
-	_(1495, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \
-	_(1496, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \
-	_(1497, ZEND_INIT_ARRAY_SPEC_CV_UNUSED) \
-	_(1498, ZEND_INIT_ARRAY_SPEC_CV_CV) \
-	_(1499, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST) \
-	_(1500, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \
-	_(1501, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \
-	_(1502, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED) \
-	_(1503, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV) \
-	_(1504, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST) \
-	_(1505, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \
-	_(1506, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \
-	_(1507, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED) \
-	_(1508, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV) \
-	_(1509, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST) \
-	_(1510, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \
-	_(1511, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \
-	_(1512, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED) \
-	_(1513, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV) \
-	_(1519, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST) \
-	_(1520, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \
-	_(1521, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \
-	_(1522, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED) \
-	_(1523, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV) \
-	_(1524, ZEND_INCLUDE_OR_EVAL_SPEC_CONST) \
-	_(1525, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \
-	_(1526, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \
-	_(1527, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \
-	_(1528, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \
-	_(1529, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \
-	_(1532, ZEND_INCLUDE_OR_EVAL_SPEC_CV) \
-	_(1533, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \
-	_(1534, ZEND_UNSET_VAR_SPEC_CONST_UNUSED) \
-	_(1535, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \
-	_(1536, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \
-	_(1538, ZEND_UNSET_VAR_SPEC_CV_UNUSED) \
-	_(1549, ZEND_UNSET_DIM_SPEC_VAR_CONST) \
-	_(1550, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \
-	_(1551, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \
-	_(1553, ZEND_UNSET_DIM_SPEC_VAR_CV) \
-	_(1559, ZEND_UNSET_DIM_SPEC_CV_CONST) \
-	_(1560, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \
-	_(1561, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \
-	_(1563, ZEND_UNSET_DIM_SPEC_CV_CV) \
-	_(1574, ZEND_UNSET_OBJ_SPEC_VAR_CONST) \
-	_(1575, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \
-	_(1576, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \
-	_(1578, ZEND_UNSET_OBJ_SPEC_VAR_CV) \
-	_(1579, ZEND_UNSET_OBJ_SPEC_UNUSED_CONST) \
-	_(1580, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \
-	_(1581, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \
-	_(1583, ZEND_UNSET_OBJ_SPEC_UNUSED_CV) \
-	_(1584, ZEND_UNSET_OBJ_SPEC_CV_CONST) \
-	_(1585, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \
-	_(1586, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \
-	_(1588, ZEND_UNSET_OBJ_SPEC_CV_CV) \
-	_(1589, ZEND_FE_RESET_R_SPEC_CONST) \
-	_(1590, ZEND_FE_RESET_R_SPEC_TMP) \
-	_(1591, ZEND_FE_RESET_R_SPEC_VAR) \
-	_(1593, ZEND_FE_RESET_R_SPEC_CV) \
-	_(1594, ZEND_FE_FETCH_R_SPEC_VAR) \
-	_(1595, ZEND_EXIT_SPEC) \
-	_(1596, ZEND_FETCH_R_SPEC_CONST_UNUSED) \
-	_(1597, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \
-	_(1598, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \
-	_(1600, ZEND_FETCH_R_SPEC_CV_UNUSED) \
-	_(1601, ZEND_FETCH_DIM_R_SPEC_CONST_CONST) \
-	_(1602, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \
-	_(1603, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \
-	_(1605, ZEND_FETCH_DIM_R_SPEC_CONST_CV) \
+	_(1407, ZEND_SEND_VAR_EX_SPEC_VAR_CONST) \
+	_(1408, ZEND_SEND_VAR_EX_SPEC_VAR_CONST) \
+	_(1413, ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED) \
+	_(1414, ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED_QUICK) \
+	_(1427, ZEND_SEND_VAR_EX_SPEC_CV_CONST) \
+	_(1428, ZEND_SEND_VAR_EX_SPEC_CV_CONST) \
+	_(1433, ZEND_SEND_VAR_EX_SPEC_CV_UNUSED) \
+	_(1434, ZEND_SEND_VAR_EX_SPEC_CV_UNUSED_QUICK) \
+	_(1447, ZEND_SEND_REF_SPEC_VAR_CONST) \
+	_(1450, ZEND_SEND_REF_SPEC_VAR_UNUSED) \
+	_(1457, ZEND_SEND_REF_SPEC_CV_CONST) \
+	_(1460, ZEND_SEND_REF_SPEC_CV_UNUSED) \
+	_(1462, ZEND_NEW_SPEC_CONST_UNUSED) \
+	_(1464, ZEND_NEW_SPEC_VAR_UNUSED) \
+	_(1465, ZEND_NEW_SPEC_UNUSED_UNUSED) \
+	_(1467, ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST) \
+	_(1468, ZEND_FREE_SPEC_TMPVAR) \
+	_(1469, ZEND_INIT_ARRAY_SPEC_CONST_CONST) \
+	_(1470, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \
+	_(1471, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \
+	_(1472, ZEND_INIT_ARRAY_SPEC_CONST_UNUSED) \
+	_(1473, ZEND_INIT_ARRAY_SPEC_CONST_CV) \
+	_(1474, ZEND_INIT_ARRAY_SPEC_TMP_CONST) \
+	_(1475, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \
+	_(1476, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \
+	_(1477, ZEND_INIT_ARRAY_SPEC_TMP_UNUSED) \
+	_(1478, ZEND_INIT_ARRAY_SPEC_TMP_CV) \
+	_(1479, ZEND_INIT_ARRAY_SPEC_VAR_CONST) \
+	_(1480, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \
+	_(1481, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \
+	_(1482, ZEND_INIT_ARRAY_SPEC_VAR_UNUSED) \
+	_(1483, ZEND_INIT_ARRAY_SPEC_VAR_CV) \
+	_(1484, ZEND_INIT_ARRAY_SPEC_UNUSED_CONST) \
+	_(1485, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \
+	_(1486, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \
+	_(1487, ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED) \
+	_(1488, ZEND_INIT_ARRAY_SPEC_UNUSED_CV) \
+	_(1489, ZEND_INIT_ARRAY_SPEC_CV_CONST) \
+	_(1490, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \
+	_(1491, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \
+	_(1492, ZEND_INIT_ARRAY_SPEC_CV_UNUSED) \
+	_(1493, ZEND_INIT_ARRAY_SPEC_CV_CV) \
+	_(1494, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST) \
+	_(1495, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \
+	_(1496, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \
+	_(1497, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED) \
+	_(1498, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV) \
+	_(1499, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST) \
+	_(1500, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \
+	_(1501, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \
+	_(1502, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED) \
+	_(1503, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV) \
+	_(1504, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST) \
+	_(1505, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \
+	_(1506, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \
+	_(1507, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED) \
+	_(1508, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV) \
+	_(1514, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST) \
+	_(1515, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \
+	_(1516, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \
+	_(1517, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED) \
+	_(1518, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV) \
+	_(1519, ZEND_INCLUDE_OR_EVAL_SPEC_CONST) \
+	_(1520, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \
+	_(1521, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \
+	_(1522, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \
+	_(1523, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \
+	_(1524, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \
+	_(1527, ZEND_INCLUDE_OR_EVAL_SPEC_CV) \
+	_(1528, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \
+	_(1529, ZEND_UNSET_VAR_SPEC_CONST_UNUSED) \
+	_(1530, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \
+	_(1531, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \
+	_(1533, ZEND_UNSET_VAR_SPEC_CV_UNUSED) \
+	_(1544, ZEND_UNSET_DIM_SPEC_VAR_CONST) \
+	_(1545, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \
+	_(1546, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \
+	_(1548, ZEND_UNSET_DIM_SPEC_VAR_CV) \
+	_(1554, ZEND_UNSET_DIM_SPEC_CV_CONST) \
+	_(1555, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \
+	_(1556, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \
+	_(1558, ZEND_UNSET_DIM_SPEC_CV_CV) \
+	_(1569, ZEND_UNSET_OBJ_SPEC_VAR_CONST) \
+	_(1570, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \
+	_(1571, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \
+	_(1573, ZEND_UNSET_OBJ_SPEC_VAR_CV) \
+	_(1574, ZEND_UNSET_OBJ_SPEC_UNUSED_CONST) \
+	_(1575, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \
+	_(1576, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \
+	_(1578, ZEND_UNSET_OBJ_SPEC_UNUSED_CV) \
+	_(1579, ZEND_UNSET_OBJ_SPEC_CV_CONST) \
+	_(1580, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \
+	_(1581, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \
+	_(1583, ZEND_UNSET_OBJ_SPEC_CV_CV) \
+	_(1584, ZEND_FE_RESET_R_SPEC_CONST) \
+	_(1585, ZEND_FE_RESET_R_SPEC_TMP) \
+	_(1586, ZEND_FE_RESET_R_SPEC_VAR) \
+	_(1588, ZEND_FE_RESET_R_SPEC_CV) \
+	_(1589, ZEND_FE_FETCH_R_SPEC_VAR) \
+	_(1590, ZEND_EXIT_SPEC) \
+	_(1591, ZEND_FETCH_R_SPEC_CONST_UNUSED) \
+	_(1592, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \
+	_(1593, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \
+	_(1595, ZEND_FETCH_R_SPEC_CV_UNUSED) \
+	_(1596, ZEND_FETCH_DIM_R_SPEC_CONST_CONST) \
+	_(1597, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \
+	_(1598, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \
+	_(1600, ZEND_FETCH_DIM_R_SPEC_CONST_CV) \
+	_(1601, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \
+	_(1602, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
+	_(1603, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
+	_(1605, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \
 	_(1606, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \
 	_(1607, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
 	_(1608, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
 	_(1610, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \
-	_(1611, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \
-	_(1612, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
-	_(1613, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
-	_(1615, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \
-	_(1621, ZEND_FETCH_DIM_R_SPEC_CV_CONST) \
-	_(1622, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \
-	_(1623, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \
-	_(1625, ZEND_FETCH_DIM_R_SPEC_CV_CV) \
-	_(1626, ZEND_FETCH_OBJ_R_SPEC_CONST_CONST) \
-	_(1627, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \
-	_(1628, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \
-	_(1630, ZEND_FETCH_OBJ_R_SPEC_CONST_CV) \
+	_(1616, ZEND_FETCH_DIM_R_SPEC_CV_CONST) \
+	_(1617, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \
+	_(1618, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \
+	_(1620, ZEND_FETCH_DIM_R_SPEC_CV_CV) \
+	_(1621, ZEND_FETCH_OBJ_R_SPEC_CONST_CONST) \
+	_(1622, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \
+	_(1623, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \
+	_(1625, ZEND_FETCH_OBJ_R_SPEC_CONST_CV) \
+	_(1626, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \
+	_(1627, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
+	_(1628, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
+	_(1630, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \
 	_(1631, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \
 	_(1632, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
 	_(1633, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
 	_(1635, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \
-	_(1636, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \
-	_(1637, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
-	_(1638, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
-	_(1640, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \
-	_(1641, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST) \
-	_(1642, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \
-	_(1643, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \
-	_(1645, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV) \
-	_(1646, ZEND_FETCH_OBJ_R_SPEC_CV_CONST) \
-	_(1647, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \
-	_(1648, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \
-	_(1650, ZEND_FETCH_OBJ_R_SPEC_CV_CV) \
-	_(1651, ZEND_FETCH_W_SPEC_CONST_UNUSED) \
-	_(1652, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \
-	_(1653, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \
-	_(1655, ZEND_FETCH_W_SPEC_CV_UNUSED) \
-	_(1666, ZEND_FETCH_DIM_W_SPEC_VAR_CONST) \
-	_(1667, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \
-	_(1668, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \
-	_(1669, ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED) \
-	_(1670, ZEND_FETCH_DIM_W_SPEC_VAR_CV) \
-	_(1676, ZEND_FETCH_DIM_W_SPEC_CV_CONST) \
-	_(1677, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \
-	_(1678, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \
-	_(1679, ZEND_FETCH_DIM_W_SPEC_CV_UNUSED) \
-	_(1680, ZEND_FETCH_DIM_W_SPEC_CV_CV) \
-	_(1691, ZEND_FETCH_OBJ_W_SPEC_VAR_CONST) \
-	_(1692, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \
-	_(1693, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \
-	_(1695, ZEND_FETCH_OBJ_W_SPEC_VAR_CV) \
-	_(1696, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST) \
-	_(1697, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \
-	_(1698, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \
-	_(1700, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV) \
-	_(1701, ZEND_FETCH_OBJ_W_SPEC_CV_CONST) \
-	_(1702, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \
-	_(1703, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \
-	_(1705, ZEND_FETCH_OBJ_W_SPEC_CV_CV) \
-	_(1706, ZEND_FETCH_RW_SPEC_CONST_UNUSED) \
-	_(1707, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \
-	_(1708, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \
-	_(1710, ZEND_FETCH_RW_SPEC_CV_UNUSED) \
-	_(1721, ZEND_FETCH_DIM_RW_SPEC_VAR_CONST) \
-	_(1722, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \
-	_(1723, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \
-	_(1724, ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED) \
-	_(1725, ZEND_FETCH_DIM_RW_SPEC_VAR_CV) \
-	_(1731, ZEND_FETCH_DIM_RW_SPEC_CV_CONST) \
-	_(1732, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \
-	_(1733, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \
-	_(1734, ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED) \
-	_(1735, ZEND_FETCH_DIM_RW_SPEC_CV_CV) \
-	_(1746, ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST) \
-	_(1747, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \
-	_(1748, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \
-	_(1750, ZEND_FETCH_OBJ_RW_SPEC_VAR_CV) \
-	_(1751, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST) \
-	_(1752, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \
-	_(1753, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \
-	_(1755, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV) \
-	_(1756, ZEND_FETCH_OBJ_RW_SPEC_CV_CONST) \
-	_(1757, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \
-	_(1758, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \
-	_(1760, ZEND_FETCH_OBJ_RW_SPEC_CV_CV) \
-	_(1761, ZEND_FETCH_IS_SPEC_CONST_UNUSED) \
-	_(1762, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \
-	_(1763, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \
-	_(1765, ZEND_FETCH_IS_SPEC_CV_UNUSED) \
-	_(1766, ZEND_FETCH_DIM_IS_SPEC_CONST_CONST) \
-	_(1767, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \
-	_(1768, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \
-	_(1770, ZEND_FETCH_DIM_IS_SPEC_CONST_CV) \
+	_(1636, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST) \
+	_(1637, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \
+	_(1638, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \
+	_(1640, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV) \
+	_(1641, ZEND_FETCH_OBJ_R_SPEC_CV_CONST) \
+	_(1642, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \
+	_(1643, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \
+	_(1645, ZEND_FETCH_OBJ_R_SPEC_CV_CV) \
+	_(1646, ZEND_FETCH_W_SPEC_CONST_UNUSED) \
+	_(1647, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \
+	_(1648, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \
+	_(1650, ZEND_FETCH_W_SPEC_CV_UNUSED) \
+	_(1661, ZEND_FETCH_DIM_W_SPEC_VAR_CONST) \
+	_(1662, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \
+	_(1663, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \
+	_(1664, ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED) \
+	_(1665, ZEND_FETCH_DIM_W_SPEC_VAR_CV) \
+	_(1671, ZEND_FETCH_DIM_W_SPEC_CV_CONST) \
+	_(1672, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \
+	_(1673, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \
+	_(1674, ZEND_FETCH_DIM_W_SPEC_CV_UNUSED) \
+	_(1675, ZEND_FETCH_DIM_W_SPEC_CV_CV) \
+	_(1686, ZEND_FETCH_OBJ_W_SPEC_VAR_CONST) \
+	_(1687, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \
+	_(1688, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \
+	_(1690, ZEND_FETCH_OBJ_W_SPEC_VAR_CV) \
+	_(1691, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST) \
+	_(1692, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \
+	_(1693, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \
+	_(1695, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV) \
+	_(1696, ZEND_FETCH_OBJ_W_SPEC_CV_CONST) \
+	_(1697, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \
+	_(1698, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \
+	_(1700, ZEND_FETCH_OBJ_W_SPEC_CV_CV) \
+	_(1701, ZEND_FETCH_RW_SPEC_CONST_UNUSED) \
+	_(1702, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \
+	_(1703, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \
+	_(1705, ZEND_FETCH_RW_SPEC_CV_UNUSED) \
+	_(1716, ZEND_FETCH_DIM_RW_SPEC_VAR_CONST) \
+	_(1717, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \
+	_(1718, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \
+	_(1719, ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED) \
+	_(1720, ZEND_FETCH_DIM_RW_SPEC_VAR_CV) \
+	_(1726, ZEND_FETCH_DIM_RW_SPEC_CV_CONST) \
+	_(1727, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \
+	_(1728, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \
+	_(1729, ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED) \
+	_(1730, ZEND_FETCH_DIM_RW_SPEC_CV_CV) \
+	_(1741, ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST) \
+	_(1742, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \
+	_(1743, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \
+	_(1745, ZEND_FETCH_OBJ_RW_SPEC_VAR_CV) \
+	_(1746, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST) \
+	_(1747, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \
+	_(1748, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \
+	_(1750, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV) \
+	_(1751, ZEND_FETCH_OBJ_RW_SPEC_CV_CONST) \
+	_(1752, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \
+	_(1753, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \
+	_(1755, ZEND_FETCH_OBJ_RW_SPEC_CV_CV) \
+	_(1756, ZEND_FETCH_IS_SPEC_CONST_UNUSED) \
+	_(1757, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \
+	_(1758, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \
+	_(1760, ZEND_FETCH_IS_SPEC_CV_UNUSED) \
+	_(1761, ZEND_FETCH_DIM_IS_SPEC_CONST_CONST) \
+	_(1762, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \
+	_(1763, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \
+	_(1765, ZEND_FETCH_DIM_IS_SPEC_CONST_CV) \
+	_(1766, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \
+	_(1767, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
+	_(1768, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
+	_(1770, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \
 	_(1771, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \
 	_(1772, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
 	_(1773, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
 	_(1775, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \
-	_(1776, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \
-	_(1777, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
-	_(1778, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
-	_(1780, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \
-	_(1786, ZEND_FETCH_DIM_IS_SPEC_CV_CONST) \
-	_(1787, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \
-	_(1788, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \
-	_(1790, ZEND_FETCH_DIM_IS_SPEC_CV_CV) \
-	_(1791, ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST) \
-	_(1792, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \
-	_(1793, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \
-	_(1795, ZEND_FETCH_OBJ_IS_SPEC_CONST_CV) \
+	_(1781, ZEND_FETCH_DIM_IS_SPEC_CV_CONST) \
+	_(1782, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \
+	_(1783, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \
+	_(1785, ZEND_FETCH_DIM_IS_SPEC_CV_CV) \
+	_(1786, ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST) \
+	_(1787, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \
+	_(1788, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \
+	_(1790, ZEND_FETCH_OBJ_IS_SPEC_CONST_CV) \
+	_(1791, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \
+	_(1792, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
+	_(1793, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
+	_(1795, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \
 	_(1796, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \
 	_(1797, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
 	_(1798, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
 	_(1800, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \
-	_(1801, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \
-	_(1802, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
-	_(1803, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
-	_(1805, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \
-	_(1806, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST) \
-	_(1807, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \
-	_(1808, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \
-	_(1810, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV) \
-	_(1811, ZEND_FETCH_OBJ_IS_SPEC_CV_CONST) \
-	_(1812, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \
-	_(1813, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \
-	_(1815, ZEND_FETCH_OBJ_IS_SPEC_CV_CV) \
-	_(1816, ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED) \
-	_(1817, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \
-	_(1818, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \
-	_(1820, ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED) \
-	_(1821, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST) \
-	_(1822, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \
-	_(1823, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \
-	_(1824, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED) \
-	_(1825, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV) \
-	_(1826, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST) \
-	_(1827, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \
-	_(1828, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \
-	_(1829, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED) \
-	_(1830, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV) \
-	_(1831, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST) \
-	_(1832, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \
-	_(1833, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \
-	_(1834, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED) \
-	_(1835, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV) \
-	_(1841, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST) \
-	_(1842, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \
-	_(1843, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \
-	_(1844, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED) \
-	_(1845, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV) \
-	_(1846, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST) \
-	_(1847, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \
-	_(1848, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \
-	_(1850, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV) \
-	_(1851, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST) \
-	_(1852, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \
-	_(1853, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \
-	_(1855, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV) \
-	_(1856, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST) \
-	_(1857, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \
-	_(1858, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \
-	_(1860, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV) \
-	_(1861, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST) \
-	_(1862, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \
-	_(1863, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \
-	_(1865, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV) \
-	_(1866, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST) \
-	_(1867, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \
-	_(1868, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \
-	_(1870, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV) \
-	_(1871, ZEND_FETCH_UNSET_SPEC_CONST_UNUSED) \
-	_(1872, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \
-	_(1873, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \
-	_(1875, ZEND_FETCH_UNSET_SPEC_CV_UNUSED) \
-	_(1886, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST) \
-	_(1887, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \
-	_(1888, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \
-	_(1890, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV) \
-	_(1896, ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST) \
-	_(1897, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \
-	_(1898, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \
-	_(1900, ZEND_FETCH_DIM_UNSET_SPEC_CV_CV) \
-	_(1911, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST) \
-	_(1912, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \
-	_(1913, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \
-	_(1915, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV) \
-	_(1916, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST) \
-	_(1917, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \
-	_(1918, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \
-	_(1920, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV) \
-	_(1921, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST) \
-	_(1922, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \
-	_(1923, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \
-	_(1925, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV) \
-	_(1926, ZEND_FETCH_LIST_R_SPEC_CONST_CONST) \
-	_(1927, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \
-	_(1928, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \
-	_(1930, ZEND_FETCH_LIST_R_SPEC_CONST_CV) \
+	_(1801, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST) \
+	_(1802, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \
+	_(1803, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \
+	_(1805, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV) \
+	_(1806, ZEND_FETCH_OBJ_IS_SPEC_CV_CONST) \
+	_(1807, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \
+	_(1808, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \
+	_(1810, ZEND_FETCH_OBJ_IS_SPEC_CV_CV) \
+	_(1811, ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED) \
+	_(1812, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \
+	_(1813, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \
+	_(1815, ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED) \
+	_(1816, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST) \
+	_(1817, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \
+	_(1818, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \
+	_(1819, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED) \
+	_(1820, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV) \
+	_(1821, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST) \
+	_(1822, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \
+	_(1823, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \
+	_(1824, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED) \
+	_(1825, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV) \
+	_(1826, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST) \
+	_(1827, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \
+	_(1828, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \
+	_(1829, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED) \
+	_(1830, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV) \
+	_(1836, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST) \
+	_(1837, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \
+	_(1838, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \
+	_(1839, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED) \
+	_(1840, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV) \
+	_(1841, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST) \
+	_(1842, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \
+	_(1843, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \
+	_(1845, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV) \
+	_(1846, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST) \
+	_(1847, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \
+	_(1848, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \
+	_(1850, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV) \
+	_(1851, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST) \
+	_(1852, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \
+	_(1853, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \
+	_(1855, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV) \
+	_(1856, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST) \
+	_(1857, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \
+	_(1858, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \
+	_(1860, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV) \
+	_(1861, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST) \
+	_(1862, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \
+	_(1863, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \
+	_(1865, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV) \
+	_(1866, ZEND_FETCH_UNSET_SPEC_CONST_UNUSED) \
+	_(1867, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \
+	_(1868, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \
+	_(1870, ZEND_FETCH_UNSET_SPEC_CV_UNUSED) \
+	_(1881, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST) \
+	_(1882, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \
+	_(1883, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \
+	_(1885, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV) \
+	_(1891, ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST) \
+	_(1892, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \
+	_(1893, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \
+	_(1895, ZEND_FETCH_DIM_UNSET_SPEC_CV_CV) \
+	_(1906, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST) \
+	_(1907, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \
+	_(1908, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \
+	_(1910, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV) \
+	_(1911, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST) \
+	_(1912, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \
+	_(1913, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \
+	_(1915, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV) \
+	_(1916, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST) \
+	_(1917, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \
+	_(1918, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \
+	_(1920, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV) \
+	_(1921, ZEND_FETCH_LIST_R_SPEC_CONST_CONST) \
+	_(1922, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \
+	_(1923, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \
+	_(1925, ZEND_FETCH_LIST_R_SPEC_CONST_CV) \
+	_(1926, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
+	_(1927, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+	_(1928, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+	_(1930, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
 	_(1931, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
 	_(1932, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
 	_(1933, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
 	_(1935, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
-	_(1936, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
-	_(1937, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
-	_(1938, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
-	_(1940, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
-	_(1946, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
-	_(1947, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
-	_(1948, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
-	_(1950, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
-	_(1951, ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST) \
-	_(1952, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_CONST) \
-	_(1953, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_CONST) \
-	_(1958, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_UNUSED) \
-	_(1959, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_UNUSED_QUICK) \
-	_(1962, ZEND_EXT_STMT_SPEC) \
-	_(1963, ZEND_EXT_FCALL_BEGIN_SPEC) \
-	_(1964, ZEND_EXT_FCALL_END_SPEC) \
-	_(1965, ZEND_EXT_NOP_SPEC) \
-	_(1966, ZEND_TICKS_SPEC) \
-	_(1967, ZEND_SEND_VAR_NO_REF_SPEC_VAR_CONST) \
-	_(1970, ZEND_SEND_VAR_NO_REF_SPEC_VAR_UNUSED) \
-	_(1972, ZEND_CATCH_SPEC_CONST) \
-	_(1973, ZEND_THROW_SPEC_CONST) \
-	_(1974, ZEND_THROW_SPEC_TMPVAR) \
-	_(1975, ZEND_THROW_SPEC_TMPVAR) \
-	_(1977, ZEND_THROW_SPEC_CV) \
-	_(1978, ZEND_FETCH_CLASS_SPEC_UNUSED_CONST) \
-	_(1979, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \
-	_(1980, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \
-	_(1981, ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED) \
-	_(1982, ZEND_FETCH_CLASS_SPEC_UNUSED_CV) \
-	_(1983, ZEND_CLONE_SPEC_CONST) \
-	_(1984, ZEND_CLONE_SPEC_TMPVAR) \
-	_(1985, ZEND_CLONE_SPEC_TMPVAR) \
-	_(1986, ZEND_CLONE_SPEC_UNUSED) \
-	_(1987, ZEND_CLONE_SPEC_CV) \
-	_(1988, ZEND_RETURN_BY_REF_SPEC_CONST) \
-	_(1989, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \
-	_(1990, ZEND_RETURN_BY_REF_SPEC_TMP) \
-	_(1991, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \
-	_(1992, ZEND_RETURN_BY_REF_SPEC_VAR) \
-	_(1993, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \
-	_(1996, ZEND_RETURN_BY_REF_SPEC_CV) \
-	_(1997, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \
-	_(1998, ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST) \
-	_(1999, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \
-	_(2000, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \
-	_(2002, ZEND_INIT_METHOD_CALL_SPEC_CONST_CV) \
+	_(1941, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
+	_(1942, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+	_(1943, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+	_(1945, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
+	_(1946, ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST) \
+	_(1947, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_CONST) \
+	_(1948, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_CONST) \
+	_(1953, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_UNUSED) \
+	_(1954, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_UNUSED_QUICK) \
+	_(1957, ZEND_EXT_STMT_SPEC) \
+	_(1958, ZEND_EXT_FCALL_BEGIN_SPEC) \
+	_(1959, ZEND_EXT_FCALL_END_SPEC) \
+	_(1960, ZEND_EXT_NOP_SPEC) \
+	_(1961, ZEND_TICKS_SPEC) \
+	_(1962, ZEND_SEND_VAR_NO_REF_SPEC_VAR_CONST) \
+	_(1965, ZEND_SEND_VAR_NO_REF_SPEC_VAR_UNUSED) \
+	_(1967, ZEND_CATCH_SPEC_CONST) \
+	_(1968, ZEND_THROW_SPEC_CONST) \
+	_(1969, ZEND_THROW_SPEC_TMPVAR) \
+	_(1970, ZEND_THROW_SPEC_TMPVAR) \
+	_(1972, ZEND_THROW_SPEC_CV) \
+	_(1973, ZEND_FETCH_CLASS_SPEC_UNUSED_CONST) \
+	_(1974, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \
+	_(1975, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \
+	_(1976, ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED) \
+	_(1977, ZEND_FETCH_CLASS_SPEC_UNUSED_CV) \
+	_(1978, ZEND_CLONE_SPEC_CONST) \
+	_(1979, ZEND_CLONE_SPEC_TMPVAR) \
+	_(1980, ZEND_CLONE_SPEC_TMPVAR) \
+	_(1981, ZEND_CLONE_SPEC_UNUSED) \
+	_(1982, ZEND_CLONE_SPEC_CV) \
+	_(1983, ZEND_RETURN_BY_REF_SPEC_CONST) \
+	_(1984, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \
+	_(1985, ZEND_RETURN_BY_REF_SPEC_TMP) \
+	_(1986, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \
+	_(1987, ZEND_RETURN_BY_REF_SPEC_VAR) \
+	_(1988, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \
+	_(1991, ZEND_RETURN_BY_REF_SPEC_CV) \
+	_(1992, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \
+	_(1993, ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST) \
+	_(1994, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \
+	_(1995, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \
+	_(1997, ZEND_INIT_METHOD_CALL_SPEC_CONST_CV) \
+	_(1998, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \
+	_(1999, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
+	_(2000, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
+	_(2002, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \
 	_(2003, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \
 	_(2004, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
 	_(2005, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
 	_(2007, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \
-	_(2008, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \
-	_(2009, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
-	_(2010, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
-	_(2012, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \
-	_(2013, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST) \
-	_(2014, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
-	_(2015, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
-	_(2017, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV) \
-	_(2018, ZEND_INIT_METHOD_CALL_SPEC_CV_CONST) \
-	_(2019, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \
-	_(2020, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \
-	_(2022, ZEND_INIT_METHOD_CALL_SPEC_CV_CV) \
-	_(2023, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST) \
-	_(2024, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \
-	_(2025, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \
-	_(2026, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) \
-	_(2027, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV) \
-	_(2033, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST) \
-	_(2034, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \
-	_(2035, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \
-	_(2036, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED) \
-	_(2037, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV) \
-	_(2038, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST) \
-	_(2039, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
-	_(2040, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
-	_(2041, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED) \
-	_(2042, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CV) \
-	_(2048, ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED) \
-	_(2049, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \
-	_(2050, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \
-	_(2052, ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED) \
-	_(2053, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST) \
-	_(2054, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \
-	_(2055, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \
-	_(2057, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV) \
+	_(2008, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST) \
+	_(2009, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
+	_(2010, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
+	_(2012, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV) \
+	_(2013, ZEND_INIT_METHOD_CALL_SPEC_CV_CONST) \
+	_(2014, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \
+	_(2015, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \
+	_(2017, ZEND_INIT_METHOD_CALL_SPEC_CV_CV) \
+	_(2018, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST) \
+	_(2019, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \
+	_(2020, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \
+	_(2021, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) \
+	_(2022, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV) \
+	_(2028, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST) \
+	_(2029, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \
+	_(2030, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \
+	_(2031, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED) \
+	_(2032, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV) \
+	_(2033, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST) \
+	_(2034, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
+	_(2035, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
+	_(2036, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED) \
+	_(2037, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CV) \
+	_(2043, ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED) \
+	_(2044, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \
+	_(2045, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \
+	_(2047, ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED) \
+	_(2048, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST) \
+	_(2049, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \
+	_(2050, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \
+	_(2052, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV) \
+	_(2053, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \
+	_(2054, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
+	_(2055, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
+	_(2057, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \
 	_(2058, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \
 	_(2059, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
 	_(2060, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
 	_(2062, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \
-	_(2063, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \
-	_(2064, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
-	_(2065, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
-	_(2067, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \
-	_(2073, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST) \
-	_(2074, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \
-	_(2075, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \
-	_(2077, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV) \
-	_(2078, ZEND_SEND_VAL_EX_SPEC_CONST_CONST) \
-	_(2079, ZEND_SEND_VAL_EX_SPEC_CONST_CONST) \
-	_(2084, ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED) \
-	_(2085, ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED_QUICK) \
-	_(2088, ZEND_SEND_VAL_EX_SPEC_TMP_CONST) \
-	_(2089, ZEND_SEND_VAL_EX_SPEC_TMP_CONST) \
-	_(2094, ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED) \
-	_(2095, ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED_QUICK) \
-	_(2138, ZEND_SEND_VAR_SPEC_VAR_CONST) \
-	_(2141, ZEND_SEND_VAR_SPEC_VAR_UNUSED) \
-	_(2148, ZEND_SEND_VAR_SPEC_CV_CONST) \
-	_(2151, ZEND_SEND_VAR_SPEC_CV_UNUSED) \
-	_(2153, ZEND_INIT_USER_CALL_SPEC_CONST_CONST) \
-	_(2154, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \
-	_(2155, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \
-	_(2157, ZEND_INIT_USER_CALL_SPEC_CONST_CV) \
-	_(2158, ZEND_SEND_ARRAY_SPEC) \
-	_(2159, ZEND_SEND_USER_SPEC_CONST) \
-	_(2160, ZEND_SEND_USER_SPEC_TMP) \
-	_(2161, ZEND_SEND_USER_SPEC_VAR) \
-	_(2163, ZEND_SEND_USER_SPEC_CV) \
-	_(2164, ZEND_STRLEN_SPEC_CONST) \
-	_(2165, ZEND_STRLEN_SPEC_TMPVAR) \
-	_(2166, ZEND_STRLEN_SPEC_TMPVAR) \
-	_(2168, ZEND_STRLEN_SPEC_CV) \
-	_(2169, ZEND_DEFINED_SPEC_CONST) \
-	_(2170, ZEND_TYPE_CHECK_SPEC_CONST) \
-	_(2171, ZEND_TYPE_CHECK_SPEC_TMPVAR) \
-	_(2172, ZEND_TYPE_CHECK_SPEC_TMPVAR) \
-	_(2174, ZEND_TYPE_CHECK_SPEC_CV) \
-	_(2175, ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED) \
-	_(2176, ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED) \
-	_(2177, ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED) \
-	_(2178, ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED) \
-	_(2179, ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) \
-	_(2180, ZEND_FE_RESET_RW_SPEC_CONST) \
-	_(2181, ZEND_FE_RESET_RW_SPEC_TMP) \
-	_(2182, ZEND_FE_RESET_RW_SPEC_VAR) \
-	_(2184, ZEND_FE_RESET_RW_SPEC_CV) \
-	_(2185, ZEND_FE_FETCH_RW_SPEC_VAR) \
-	_(2186, ZEND_FE_FREE_SPEC_TMPVAR) \
-	_(2187, ZEND_INIT_DYNAMIC_CALL_SPEC_CONST) \
-	_(2188, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \
-	_(2189, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \
-	_(2191, ZEND_INIT_DYNAMIC_CALL_SPEC_CV) \
-	_(2192, ZEND_DO_ICALL_SPEC_RETVAL_UNUSED) \
-	_(2193, ZEND_DO_ICALL_SPEC_RETVAL_USED) \
-	_(2194, ZEND_DO_UCALL_SPEC_RETVAL_UNUSED) \
-	_(2195, ZEND_DO_UCALL_SPEC_RETVAL_USED) \
-	_(2196, ZEND_DO_UCALL_SPEC_OBSERVER) \
-	_(2197, ZEND_DO_UCALL_SPEC_OBSERVER) \
-	_(2198, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED) \
-	_(2199, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED) \
-	_(2200, ZEND_DO_FCALL_BY_NAME_SPEC_OBSERVER) \
-	_(2201, ZEND_DO_FCALL_BY_NAME_SPEC_OBSERVER) \
-	_(2212, ZEND_PRE_INC_OBJ_SPEC_VAR_CONST) \
-	_(2213, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
-	_(2214, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
-	_(2216, ZEND_PRE_INC_OBJ_SPEC_VAR_CV) \
-	_(2217, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST) \
-	_(2218, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \
-	_(2219, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \
-	_(2221, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV) \
-	_(2222, ZEND_PRE_INC_OBJ_SPEC_CV_CONST) \
-	_(2223, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \
-	_(2224, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \
-	_(2226, ZEND_PRE_INC_OBJ_SPEC_CV_CV) \
-	_(2237, ZEND_POST_INC_OBJ_SPEC_VAR_CONST) \
-	_(2238, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \
-	_(2239, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \
-	_(2241, ZEND_POST_INC_OBJ_SPEC_VAR_CV) \
-	_(2242, ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST) \
-	_(2243, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \
-	_(2244, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \
-	_(2246, ZEND_POST_INC_OBJ_SPEC_UNUSED_CV) \
-	_(2247, ZEND_POST_INC_OBJ_SPEC_CV_CONST) \
-	_(2248, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \
-	_(2249, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \
-	_(2251, ZEND_POST_INC_OBJ_SPEC_CV_CV) \
-	_(2252, ZEND_ECHO_SPEC_CONST) \
-	_(2253, ZEND_ECHO_SPEC_TMPVAR) \
-	_(2254, ZEND_ECHO_SPEC_TMPVAR) \
-	_(2256, ZEND_ECHO_SPEC_CV) \
-	_(2263, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \
-	_(2265, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \
-	_(2266, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \
-	_(2268, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \
-	_(2270, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \
-	_(2271, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \
-	_(2278, ZEND_INSTANCEOF_SPEC_CV_CONST) \
-	_(2280, ZEND_INSTANCEOF_SPEC_CV_VAR) \
-	_(2281, ZEND_INSTANCEOF_SPEC_CV_UNUSED) \
-	_(2283, ZEND_GENERATOR_CREATE_SPEC) \
-	_(2286, ZEND_MAKE_REF_SPEC_VAR_UNUSED) \
-	_(2288, ZEND_MAKE_REF_SPEC_CV_UNUSED) \
-	_(2289, ZEND_DECLARE_FUNCTION_SPEC) \
-	_(2290, ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST) \
-	_(2291, ZEND_DECLARE_CONST_SPEC_CONST_CONST) \
-	_(2292, ZEND_DECLARE_CLASS_SPEC_CONST) \
-	_(2293, ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST) \
-	_(2294, ZEND_DECLARE_ANON_CLASS_SPEC) \
-	_(2295, ZEND_ADD_ARRAY_UNPACK_SPEC) \
-	_(2296, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST) \
-	_(2297, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \
-	_(2298, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \
-	_(2300, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV) \
-	_(2301, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \
-	_(2302, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
-	_(2303, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
-	_(2305, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \
-	_(2306, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \
-	_(2307, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
-	_(2308, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
-	_(2310, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \
-	_(2311, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST) \
-	_(2312, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \
-	_(2313, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \
-	_(2315, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV) \
-	_(2316, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST) \
-	_(2317, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \
-	_(2318, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \
-	_(2320, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV) \
-	_(2321, ZEND_HANDLE_EXCEPTION_SPEC) \
-	_(2322, ZEND_USER_OPCODE_SPEC) \
-	_(2323, ZEND_ASSERT_CHECK_SPEC) \
-	_(2324, ZEND_JMP_SET_SPEC_CONST) \
-	_(2325, ZEND_JMP_SET_SPEC_TMP) \
-	_(2326, ZEND_JMP_SET_SPEC_VAR) \
-	_(2328, ZEND_JMP_SET_SPEC_CV) \
-	_(2329, ZEND_UNSET_CV_SPEC_CV_UNUSED) \
-	_(2330, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) \
-	_(2331, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) \
-	_(2332, ZEND_FETCH_LIST_W_SPEC_VAR_CONST) \
-	_(2333, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
-	_(2334, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
-	_(2336, ZEND_FETCH_LIST_W_SPEC_VAR_CV) \
-	_(2337, ZEND_SEPARATE_SPEC_VAR_UNUSED) \
-	_(2339, ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR) \
-	_(2340, ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR) \
-	_(2341, ZEND_FETCH_CLASS_NAME_SPEC_UNUSED) \
-	_(2342, ZEND_FETCH_CLASS_NAME_SPEC_CV) \
-	_(2343, ZEND_CALL_TRAMPOLINE_SPEC) \
-	_(2344, ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER) \
-	_(2345, ZEND_DISCARD_EXCEPTION_SPEC) \
-	_(2346, ZEND_YIELD_SPEC_CONST_CONST) \
-	_(2347, ZEND_YIELD_SPEC_CONST_TMPVAR) \
-	_(2348, ZEND_YIELD_SPEC_CONST_TMPVAR) \
-	_(2349, ZEND_YIELD_SPEC_CONST_UNUSED) \
-	_(2350, ZEND_YIELD_SPEC_CONST_CV) \
-	_(2351, ZEND_YIELD_SPEC_TMP_CONST) \
-	_(2352, ZEND_YIELD_SPEC_TMP_TMPVAR) \
-	_(2353, ZEND_YIELD_SPEC_TMP_TMPVAR) \
-	_(2354, ZEND_YIELD_SPEC_TMP_UNUSED) \
-	_(2355, ZEND_YIELD_SPEC_TMP_CV) \
-	_(2356, ZEND_YIELD_SPEC_VAR_CONST) \
-	_(2357, ZEND_YIELD_SPEC_VAR_TMPVAR) \
-	_(2358, ZEND_YIELD_SPEC_VAR_TMPVAR) \
-	_(2359, ZEND_YIELD_SPEC_VAR_UNUSED) \
-	_(2360, ZEND_YIELD_SPEC_VAR_CV) \
-	_(2361, ZEND_YIELD_SPEC_UNUSED_CONST) \
-	_(2362, ZEND_YIELD_SPEC_UNUSED_TMPVAR) \
-	_(2363, ZEND_YIELD_SPEC_UNUSED_TMPVAR) \
-	_(2364, ZEND_YIELD_SPEC_UNUSED_UNUSED) \
-	_(2365, ZEND_YIELD_SPEC_UNUSED_CV) \
-	_(2366, ZEND_YIELD_SPEC_CV_CONST) \
-	_(2367, ZEND_YIELD_SPEC_CV_TMPVAR) \
-	_(2368, ZEND_YIELD_SPEC_CV_TMPVAR) \
-	_(2369, ZEND_YIELD_SPEC_CV_UNUSED) \
-	_(2370, ZEND_YIELD_SPEC_CV_CV) \
-	_(2371, ZEND_GENERATOR_RETURN_SPEC_CONST) \
-	_(2372, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \
-	_(2373, ZEND_GENERATOR_RETURN_SPEC_TMP) \
-	_(2374, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \
-	_(2375, ZEND_GENERATOR_RETURN_SPEC_VAR) \
-	_(2376, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \
-	_(2379, ZEND_GENERATOR_RETURN_SPEC_CV) \
-	_(2380, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \
-	_(2381, ZEND_FAST_CALL_SPEC) \
-	_(2382, ZEND_FAST_RET_SPEC) \
-	_(2383, ZEND_RECV_VARIADIC_SPEC_UNUSED) \
-	_(2384, ZEND_SEND_UNPACK_SPEC) \
-	_(2385, ZEND_YIELD_FROM_SPEC_CONST) \
-	_(2386, ZEND_YIELD_FROM_SPEC_TMPVAR) \
-	_(2387, ZEND_YIELD_FROM_SPEC_TMPVAR) \
-	_(2389, ZEND_YIELD_FROM_SPEC_CV) \
-	_(2390, ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED) \
-	_(2391, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \
-	_(2392, ZEND_COALESCE_SPEC_CONST) \
-	_(2393, ZEND_COALESCE_SPEC_TMP) \
-	_(2394, ZEND_COALESCE_SPEC_VAR) \
-	_(2396, ZEND_COALESCE_SPEC_CV) \
-	_(2397, ZEND_SPACESHIP_SPEC_CONST_CONST) \
-	_(2398, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
-	_(2399, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
-	_(2401, ZEND_SPACESHIP_SPEC_CONST_CV) \
-	_(2402, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \
-	_(2403, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
-	_(2404, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
-	_(2406, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \
-	_(2407, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \
-	_(2408, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
-	_(2409, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
-	_(2411, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \
-	_(2417, ZEND_SPACESHIP_SPEC_CV_CONST) \
-	_(2418, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \
-	_(2419, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \
-	_(2421, ZEND_SPACESHIP_SPEC_CV_CV) \
-	_(2422, ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED) \
-	_(2423, ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED) \
-	_(2426, ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED) \
-	_(2428, ZEND_FETCH_STATIC_PROP_R_SPEC) \
-	_(2429, ZEND_FETCH_STATIC_PROP_W_SPEC) \
-	_(2430, ZEND_FETCH_STATIC_PROP_RW_SPEC) \
-	_(2431, ZEND_FETCH_STATIC_PROP_IS_SPEC) \
-	_(2432, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC) \
-	_(2433, ZEND_FETCH_STATIC_PROP_UNSET_SPEC) \
-	_(2434, ZEND_UNSET_STATIC_PROP_SPEC) \
-	_(2435, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC) \
-	_(2436, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST) \
-	_(2438, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST) \
-	_(2439, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST) \
-	_(2441, ZEND_BIND_LEXICAL_SPEC_TMP_CV) \
-	_(2442, ZEND_BIND_STATIC_SPEC_CV_UNUSED) \
-	_(2443, ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED) \
-	_(2444, ZEND_SEND_FUNC_ARG_SPEC_VAR_CONST) \
-	_(2447, ZEND_SEND_FUNC_ARG_SPEC_VAR_UNUSED) \
-	_(2449, ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED) \
-	_(2450, ZEND_SWITCH_LONG_SPEC_CONST_CONST) \
-	_(2451, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
-	_(2452, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
-	_(2454, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
-	_(2455, ZEND_SWITCH_STRING_SPEC_CONST_CONST) \
-	_(2456, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
-	_(2457, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
-	_(2459, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
-	_(2460, ZEND_IN_ARRAY_SPEC_CONST_CONST) \
-	_(2461, ZEND_IN_ARRAY_SPEC_TMP_CONST) \
-	_(2462, ZEND_IN_ARRAY_SPEC_VAR_CONST) \
-	_(2464, ZEND_IN_ARRAY_SPEC_CV_CONST) \
-	_(2465, ZEND_COUNT_SPEC_CONST_UNUSED) \
-	_(2466, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \
-	_(2467, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \
-	_(2469, ZEND_COUNT_SPEC_CV_UNUSED) \
-	_(2470, ZEND_GET_CLASS_SPEC_CONST_UNUSED) \
-	_(2471, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \
-	_(2472, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \
-	_(2473, ZEND_GET_CLASS_SPEC_UNUSED_UNUSED) \
-	_(2474, ZEND_GET_CLASS_SPEC_CV_UNUSED) \
-	_(2475, ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED) \
-	_(2476, ZEND_GET_TYPE_SPEC_CONST_UNUSED) \
-	_(2477, ZEND_GET_TYPE_SPEC_TMP_UNUSED) \
-	_(2478, ZEND_GET_TYPE_SPEC_VAR_UNUSED) \
-	_(2480, ZEND_GET_TYPE_SPEC_CV_UNUSED) \
-	_(2481, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST) \
-	_(2482, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \
-	_(2483, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \
-	_(2485, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV) \
-	_(2486, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \
-	_(2487, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
-	_(2488, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
-	_(2490, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \
-	_(2491, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \
-	_(2492, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
-	_(2493, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
-	_(2495, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \
-	_(2501, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST) \
-	_(2502, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \
-	_(2503, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \
-	_(2505, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV) \
-	_(2506, ZEND_MATCH_SPEC_CONST_CONST) \
-	_(2507, ZEND_MATCH_SPEC_TMPVARCV_CONST) \
-	_(2508, ZEND_MATCH_SPEC_TMPVARCV_CONST) \
-	_(2510, ZEND_MATCH_SPEC_TMPVARCV_CONST) \
-	_(2516, ZEND_CASE_STRICT_SPEC_TMP_CONST) \
-	_(2517, ZEND_CASE_STRICT_SPEC_TMP_TMP) \
-	_(2518, ZEND_CASE_STRICT_SPEC_TMP_VAR) \
-	_(2520, ZEND_CASE_STRICT_SPEC_TMP_CV) \
-	_(2521, ZEND_CASE_STRICT_SPEC_VAR_CONST) \
-	_(2522, ZEND_CASE_STRICT_SPEC_VAR_TMP) \
-	_(2523, ZEND_CASE_STRICT_SPEC_VAR_VAR) \
-	_(2525, ZEND_CASE_STRICT_SPEC_VAR_CV) \
-	_(2536, ZEND_MATCH_ERROR_SPEC_CONST_UNUSED) \
-	_(2537, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \
-	_(2538, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \
-	_(2540, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \
-	_(2541, ZEND_JMP_NULL_SPEC_CONST) \
-	_(2542, ZEND_JMP_NULL_SPEC_TMP) \
-	_(2543, ZEND_JMP_NULL_SPEC_VAR) \
-	_(2545, ZEND_JMP_NULL_SPEC_CV) \
-	_(2546, ZEND_CHECK_UNDEF_ARGS_SPEC_UNUSED_UNUSED) \
-	_(2547, ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED) \
-	_(2548, ZEND_VERIFY_NEVER_TYPE_SPEC_UNUSED_UNUSED) \
-	_(2549, ZEND_CALLABLE_CONVERT_SPEC_UNUSED_UNUSED) \
-	_(2550, ZEND_RECV_NOTYPE_SPEC) \
-	_(2551, ZEND_JMP_FORWARD_SPEC) \
-	_(2557, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-	_(2558, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2559, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2561, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2562, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-	_(2563, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2564, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2566, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2572, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-	_(2573, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2574, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2576, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2582, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
-	_(2583, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2584, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2586, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2587, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
-	_(2588, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2589, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2591, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2597, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
-	_(2598, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2599, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2601, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2607, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(2608, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2609, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2611, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2612, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(2613, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2614, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2616, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2622, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(2623, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2624, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2626, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2628, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
-	_(2629, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
-	_(2631, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
-	_(2632, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-	_(2633, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2634, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2636, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2637, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-	_(2638, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2639, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2641, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2647, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-	_(2648, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2649, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2651, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2653, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
-	_(2654, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
-	_(2656, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
-	_(2657, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
-	_(2658, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2659, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2661, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2662, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
-	_(2663, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2664, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2666, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2672, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
-	_(2673, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2674, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2676, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2678, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
-	_(2679, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
-	_(2681, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
-	_(2682, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(2683, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2684, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2686, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2687, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(2688, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2689, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2691, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2697, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(2698, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2699, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2701, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2707, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-	_(2708, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2709, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2711, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2712, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-	_(2713, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2714, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2716, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2722, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-	_(2723, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2724, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2726, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-	_(2732, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
-	_(2733, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2734, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2736, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2737, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
-	_(2738, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2739, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2741, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2747, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
-	_(2748, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2749, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2751, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2757, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(2758, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2759, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2761, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2762, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(2763, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2764, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2766, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2772, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(2773, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2774, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2776, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2792, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-	_(2793, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(2794, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(2795, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2796, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2797, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2798, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2799, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2800, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2804, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2805, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2806, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2807, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-	_(2808, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(2809, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(2810, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2811, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2812, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2813, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2814, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2815, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2819, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2820, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2821, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2837, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-	_(2838, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(2839, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(2840, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2841, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2842, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2843, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2844, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2845, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2849, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2850, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2851, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2867, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(2868, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(2869, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(2870, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2871, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2872, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2873, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2874, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2875, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2879, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2880, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2881, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2882, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(2883, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(2884, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(2885, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2886, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2887, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2888, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2889, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2890, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2894, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2895, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2896, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2912, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(2913, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(2914, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(2915, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2916, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2917, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2918, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2919, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2920, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2924, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(2925, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2926, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2942, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-	_(2943, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(2944, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(2945, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2946, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2947, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2948, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2949, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2950, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2954, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2955, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2956, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2957, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-	_(2958, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(2959, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(2960, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2961, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2962, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2963, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2964, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2965, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2969, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2970, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2971, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2987, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-	_(2988, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(2989, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(2990, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2991, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2992, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2993, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(2994, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(2995, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(2999, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3000, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3001, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3017, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(3018, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3019, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3020, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3021, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3022, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3023, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3024, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3025, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3029, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3030, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3031, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3032, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(3033, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3034, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3035, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3036, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3037, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3038, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3039, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3040, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3044, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3045, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3046, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3062, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(3063, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3064, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3065, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3066, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3067, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3068, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3069, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3070, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3074, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3075, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3076, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3077, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \
-	_(3081, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \
-	_(3082, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \
-	_(3086, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \
-	_(3090, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
-	_(3091, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
-	_(3092, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
-	_(3093, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
-	_(3094, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
-	_(3095, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
-	_(3099, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
-	_(3100, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
-	_(3101, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
-	_(3102, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
-	_(3103, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3104, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3105, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3106, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3107, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3108, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3109, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3110, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3114, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3115, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3116, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3117, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
-	_(3118, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3119, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3120, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3121, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3122, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3123, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3124, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3125, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3129, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3130, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3131, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3147, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
-	_(3148, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3149, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3150, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3151, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3152, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3153, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3154, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3155, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3159, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3160, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3161, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3165, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
-	_(3166, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
-	_(3167, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
-	_(3168, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
-	_(3169, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
-	_(3170, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
-	_(3174, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
-	_(3175, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
-	_(3176, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
-	_(3177, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(3178, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3179, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3180, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3181, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3182, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3183, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3184, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3185, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3189, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3190, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3191, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3192, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(3193, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3194, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3195, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3196, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3197, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3198, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3199, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3200, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3204, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3205, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3206, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3222, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(3223, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3224, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3225, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3226, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3227, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3228, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3229, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3230, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3234, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3235, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3236, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3240, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
-	_(3241, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
-	_(3242, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
-	_(3243, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
-	_(3244, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
-	_(3245, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
-	_(3249, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
-	_(3250, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
-	_(3251, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
-	_(3252, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-	_(3253, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3254, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3255, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3256, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3257, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3258, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3259, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3260, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3264, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3265, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3266, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3267, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-	_(3268, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3269, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3270, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3271, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3272, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3273, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3274, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3275, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3279, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3280, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3281, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3297, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-	_(3298, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3299, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3300, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3301, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3302, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3303, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3304, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3305, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3309, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-	_(3310, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3311, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3315, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
-	_(3316, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
-	_(3317, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
-	_(3318, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
-	_(3319, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
-	_(3320, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
-	_(3324, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
-	_(3325, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
-	_(3326, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
-	_(3327, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(3328, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3329, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3330, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3331, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3332, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3333, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3334, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3335, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3339, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3340, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3341, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3342, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(3343, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3344, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3345, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3346, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3347, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3348, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3349, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3350, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3354, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3355, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3356, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3372, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-	_(3373, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-	_(3374, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-	_(3375, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3376, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3377, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3378, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3379, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3380, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3384, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-	_(3385, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-	_(3386, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-	_(3387, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
-	_(3388, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
-	_(3389, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \
-	_(3390, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \
-	_(3391, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
-	_(3392, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
-	_(3393, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \
-	_(3394, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \
-	_(3395, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \
-	_(3396, ZEND_POST_INC_LONG_SPEC_CV) \
-	_(3397, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \
-	_(3398, ZEND_POST_DEC_LONG_SPEC_CV) \
-	_(3399, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \
-	_(3400, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
-	_(3401, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
-	_(3403, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
-	_(3404, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \
-	_(3405, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
-	_(3406, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
-	_(3408, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
-	_(3409, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \
-	_(3410, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
-	_(3411, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
-	_(3413, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
-	_(3415, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
-	_(3416, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
-	_(3418, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
-	_(3419, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
-	_(3420, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
-	_(3421, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
-	_(3423, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
-	_(3424, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
-	_(3425, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
-	_(3426, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
-	_(3428, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
-	_(3434, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \
-	_(3435, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
-	_(3436, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
-	_(3438, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
-	_(3441, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \
-	_(3443, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \
-	_(3446, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \
-	_(3448, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \
-	_(3449, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \
-	_(3450, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \
-	_(3451, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \
-	_(3452, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \
-	_(3452+1, ZEND_NULL)
+	_(2068, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST) \
+	_(2069, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \
+	_(2070, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \
+	_(2072, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV) \
+	_(2073, ZEND_SEND_VAL_EX_SPEC_CONST_CONST) \
+	_(2074, ZEND_SEND_VAL_EX_SPEC_CONST_CONST) \
+	_(2079, ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED) \
+	_(2080, ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED_QUICK) \
+	_(2083, ZEND_SEND_VAL_EX_SPEC_TMP_CONST) \
+	_(2084, ZEND_SEND_VAL_EX_SPEC_TMP_CONST) \
+	_(2089, ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED) \
+	_(2090, ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED_QUICK) \
+	_(2133, ZEND_SEND_VAR_SPEC_VAR_CONST) \
+	_(2136, ZEND_SEND_VAR_SPEC_VAR_UNUSED) \
+	_(2143, ZEND_SEND_VAR_SPEC_CV_CONST) \
+	_(2146, ZEND_SEND_VAR_SPEC_CV_UNUSED) \
+	_(2148, ZEND_INIT_USER_CALL_SPEC_CONST_CONST) \
+	_(2149, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \
+	_(2150, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \
+	_(2152, ZEND_INIT_USER_CALL_SPEC_CONST_CV) \
+	_(2153, ZEND_SEND_ARRAY_SPEC) \
+	_(2154, ZEND_SEND_USER_SPEC_CONST) \
+	_(2155, ZEND_SEND_USER_SPEC_TMP) \
+	_(2156, ZEND_SEND_USER_SPEC_VAR) \
+	_(2158, ZEND_SEND_USER_SPEC_CV) \
+	_(2159, ZEND_STRLEN_SPEC_CONST) \
+	_(2160, ZEND_STRLEN_SPEC_TMPVAR) \
+	_(2161, ZEND_STRLEN_SPEC_TMPVAR) \
+	_(2163, ZEND_STRLEN_SPEC_CV) \
+	_(2164, ZEND_DEFINED_SPEC_CONST) \
+	_(2165, ZEND_TYPE_CHECK_SPEC_CONST) \
+	_(2166, ZEND_TYPE_CHECK_SPEC_TMPVAR) \
+	_(2167, ZEND_TYPE_CHECK_SPEC_TMPVAR) \
+	_(2169, ZEND_TYPE_CHECK_SPEC_CV) \
+	_(2170, ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED) \
+	_(2171, ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED) \
+	_(2172, ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED) \
+	_(2173, ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED) \
+	_(2174, ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) \
+	_(2175, ZEND_FE_RESET_RW_SPEC_CONST) \
+	_(2176, ZEND_FE_RESET_RW_SPEC_TMP) \
+	_(2177, ZEND_FE_RESET_RW_SPEC_VAR) \
+	_(2179, ZEND_FE_RESET_RW_SPEC_CV) \
+	_(2180, ZEND_FE_FETCH_RW_SPEC_VAR) \
+	_(2181, ZEND_FE_FREE_SPEC_TMPVAR) \
+	_(2182, ZEND_INIT_DYNAMIC_CALL_SPEC_CONST) \
+	_(2183, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \
+	_(2184, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \
+	_(2186, ZEND_INIT_DYNAMIC_CALL_SPEC_CV) \
+	_(2187, ZEND_DO_ICALL_SPEC_RETVAL_UNUSED) \
+	_(2188, ZEND_DO_ICALL_SPEC_RETVAL_USED) \
+	_(2189, ZEND_DO_ICALL_SPEC_OBSERVER) \
+	_(2190, ZEND_DO_ICALL_SPEC_OBSERVER) \
+	_(2191, ZEND_DO_UCALL_SPEC_RETVAL_UNUSED) \
+	_(2192, ZEND_DO_UCALL_SPEC_RETVAL_USED) \
+	_(2193, ZEND_DO_UCALL_SPEC_OBSERVER) \
+	_(2194, ZEND_DO_UCALL_SPEC_OBSERVER) \
+	_(2195, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED) \
+	_(2196, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED) \
+	_(2197, ZEND_DO_FCALL_BY_NAME_SPEC_OBSERVER) \
+	_(2198, ZEND_DO_FCALL_BY_NAME_SPEC_OBSERVER) \
+	_(2209, ZEND_PRE_INC_OBJ_SPEC_VAR_CONST) \
+	_(2210, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
+	_(2211, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
+	_(2213, ZEND_PRE_INC_OBJ_SPEC_VAR_CV) \
+	_(2214, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST) \
+	_(2215, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \
+	_(2216, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \
+	_(2218, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV) \
+	_(2219, ZEND_PRE_INC_OBJ_SPEC_CV_CONST) \
+	_(2220, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \
+	_(2221, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \
+	_(2223, ZEND_PRE_INC_OBJ_SPEC_CV_CV) \
+	_(2234, ZEND_POST_INC_OBJ_SPEC_VAR_CONST) \
+	_(2235, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \
+	_(2236, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \
+	_(2238, ZEND_POST_INC_OBJ_SPEC_VAR_CV) \
+	_(2239, ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST) \
+	_(2240, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \
+	_(2241, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \
+	_(2243, ZEND_POST_INC_OBJ_SPEC_UNUSED_CV) \
+	_(2244, ZEND_POST_INC_OBJ_SPEC_CV_CONST) \
+	_(2245, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \
+	_(2246, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \
+	_(2248, ZEND_POST_INC_OBJ_SPEC_CV_CV) \
+	_(2249, ZEND_ECHO_SPEC_CONST) \
+	_(2250, ZEND_ECHO_SPEC_TMPVAR) \
+	_(2251, ZEND_ECHO_SPEC_TMPVAR) \
+	_(2253, ZEND_ECHO_SPEC_CV) \
+	_(2260, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \
+	_(2262, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \
+	_(2263, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \
+	_(2265, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \
+	_(2267, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \
+	_(2268, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \
+	_(2275, ZEND_INSTANCEOF_SPEC_CV_CONST) \
+	_(2277, ZEND_INSTANCEOF_SPEC_CV_VAR) \
+	_(2278, ZEND_INSTANCEOF_SPEC_CV_UNUSED) \
+	_(2280, ZEND_GENERATOR_CREATE_SPEC) \
+	_(2283, ZEND_MAKE_REF_SPEC_VAR_UNUSED) \
+	_(2285, ZEND_MAKE_REF_SPEC_CV_UNUSED) \
+	_(2286, ZEND_DECLARE_FUNCTION_SPEC) \
+	_(2287, ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST) \
+	_(2288, ZEND_DECLARE_CONST_SPEC_CONST_CONST) \
+	_(2289, ZEND_DECLARE_CLASS_SPEC_CONST) \
+	_(2290, ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST) \
+	_(2291, ZEND_DECLARE_ANON_CLASS_SPEC) \
+	_(2292, ZEND_ADD_ARRAY_UNPACK_SPEC) \
+	_(2293, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST) \
+	_(2294, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \
+	_(2295, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \
+	_(2297, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV) \
+	_(2298, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \
+	_(2299, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+	_(2300, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+	_(2302, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \
+	_(2303, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \
+	_(2304, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+	_(2305, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+	_(2307, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \
+	_(2308, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST) \
+	_(2309, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \
+	_(2310, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \
+	_(2312, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV) \
+	_(2313, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST) \
+	_(2314, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \
+	_(2315, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \
+	_(2317, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV) \
+	_(2318, ZEND_HANDLE_EXCEPTION_SPEC) \
+	_(2319, ZEND_USER_OPCODE_SPEC) \
+	_(2320, ZEND_ASSERT_CHECK_SPEC) \
+	_(2321, ZEND_JMP_SET_SPEC_CONST) \
+	_(2322, ZEND_JMP_SET_SPEC_TMP) \
+	_(2323, ZEND_JMP_SET_SPEC_VAR) \
+	_(2325, ZEND_JMP_SET_SPEC_CV) \
+	_(2326, ZEND_UNSET_CV_SPEC_CV_UNUSED) \
+	_(2327, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) \
+	_(2328, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) \
+	_(2329, ZEND_FETCH_LIST_W_SPEC_VAR_CONST) \
+	_(2330, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
+	_(2331, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
+	_(2333, ZEND_FETCH_LIST_W_SPEC_VAR_CV) \
+	_(2334, ZEND_SEPARATE_SPEC_VAR_UNUSED) \
+	_(2336, ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR) \
+	_(2337, ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR) \
+	_(2338, ZEND_FETCH_CLASS_NAME_SPEC_UNUSED) \
+	_(2339, ZEND_FETCH_CLASS_NAME_SPEC_CV) \
+	_(2340, ZEND_CALL_TRAMPOLINE_SPEC) \
+	_(2341, ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER) \
+	_(2342, ZEND_DISCARD_EXCEPTION_SPEC) \
+	_(2343, ZEND_YIELD_SPEC_CONST_CONST) \
+	_(2344, ZEND_YIELD_SPEC_CONST_TMPVAR) \
+	_(2345, ZEND_YIELD_SPEC_CONST_TMPVAR) \
+	_(2346, ZEND_YIELD_SPEC_CONST_UNUSED) \
+	_(2347, ZEND_YIELD_SPEC_CONST_CV) \
+	_(2348, ZEND_YIELD_SPEC_TMP_CONST) \
+	_(2349, ZEND_YIELD_SPEC_TMP_TMPVAR) \
+	_(2350, ZEND_YIELD_SPEC_TMP_TMPVAR) \
+	_(2351, ZEND_YIELD_SPEC_TMP_UNUSED) \
+	_(2352, ZEND_YIELD_SPEC_TMP_CV) \
+	_(2353, ZEND_YIELD_SPEC_VAR_CONST) \
+	_(2354, ZEND_YIELD_SPEC_VAR_TMPVAR) \
+	_(2355, ZEND_YIELD_SPEC_VAR_TMPVAR) \
+	_(2356, ZEND_YIELD_SPEC_VAR_UNUSED) \
+	_(2357, ZEND_YIELD_SPEC_VAR_CV) \
+	_(2358, ZEND_YIELD_SPEC_UNUSED_CONST) \
+	_(2359, ZEND_YIELD_SPEC_UNUSED_TMPVAR) \
+	_(2360, ZEND_YIELD_SPEC_UNUSED_TMPVAR) \
+	_(2361, ZEND_YIELD_SPEC_UNUSED_UNUSED) \
+	_(2362, ZEND_YIELD_SPEC_UNUSED_CV) \
+	_(2363, ZEND_YIELD_SPEC_CV_CONST) \
+	_(2364, ZEND_YIELD_SPEC_CV_TMPVAR) \
+	_(2365, ZEND_YIELD_SPEC_CV_TMPVAR) \
+	_(2366, ZEND_YIELD_SPEC_CV_UNUSED) \
+	_(2367, ZEND_YIELD_SPEC_CV_CV) \
+	_(2368, ZEND_GENERATOR_RETURN_SPEC_CONST) \
+	_(2369, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \
+	_(2370, ZEND_GENERATOR_RETURN_SPEC_TMP) \
+	_(2371, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \
+	_(2372, ZEND_GENERATOR_RETURN_SPEC_VAR) \
+	_(2373, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \
+	_(2376, ZEND_GENERATOR_RETURN_SPEC_CV) \
+	_(2377, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \
+	_(2378, ZEND_FAST_CALL_SPEC) \
+	_(2379, ZEND_FAST_RET_SPEC) \
+	_(2380, ZEND_RECV_VARIADIC_SPEC_UNUSED) \
+	_(2381, ZEND_SEND_UNPACK_SPEC) \
+	_(2382, ZEND_YIELD_FROM_SPEC_CONST) \
+	_(2383, ZEND_YIELD_FROM_SPEC_TMPVAR) \
+	_(2384, ZEND_YIELD_FROM_SPEC_TMPVAR) \
+	_(2386, ZEND_YIELD_FROM_SPEC_CV) \
+	_(2387, ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED) \
+	_(2388, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \
+	_(2389, ZEND_COALESCE_SPEC_CONST) \
+	_(2390, ZEND_COALESCE_SPEC_TMP) \
+	_(2391, ZEND_COALESCE_SPEC_VAR) \
+	_(2393, ZEND_COALESCE_SPEC_CV) \
+	_(2394, ZEND_SPACESHIP_SPEC_CONST_CONST) \
+	_(2395, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
+	_(2396, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
+	_(2398, ZEND_SPACESHIP_SPEC_CONST_CV) \
+	_(2399, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \
+	_(2400, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+	_(2401, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+	_(2403, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \
+	_(2404, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \
+	_(2405, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+	_(2406, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+	_(2408, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \
+	_(2414, ZEND_SPACESHIP_SPEC_CV_CONST) \
+	_(2415, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \
+	_(2416, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \
+	_(2418, ZEND_SPACESHIP_SPEC_CV_CV) \
+	_(2419, ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED) \
+	_(2420, ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED) \
+	_(2423, ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED) \
+	_(2425, ZEND_FETCH_STATIC_PROP_R_SPEC) \
+	_(2426, ZEND_FETCH_STATIC_PROP_W_SPEC) \
+	_(2427, ZEND_FETCH_STATIC_PROP_RW_SPEC) \
+	_(2428, ZEND_FETCH_STATIC_PROP_IS_SPEC) \
+	_(2429, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC) \
+	_(2430, ZEND_FETCH_STATIC_PROP_UNSET_SPEC) \
+	_(2431, ZEND_UNSET_STATIC_PROP_SPEC) \
+	_(2432, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC) \
+	_(2433, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST) \
+	_(2434, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV) \
+	_(2435, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV) \
+	_(2437, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_TMPVARCV) \
+	_(2443, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST) \
+	_(2444, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV) \
+	_(2445, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV) \
+	_(2447, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_TMPVARCV) \
+	_(2448, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST) \
+	_(2449, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV) \
+	_(2450, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV) \
+	_(2452, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_TMPVARCV) \
+	_(2458, ZEND_BIND_LEXICAL_SPEC_TMP_CV) \
+	_(2459, ZEND_BIND_STATIC_SPEC_CV) \
+	_(2460, ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED) \
+	_(2461, ZEND_SEND_FUNC_ARG_SPEC_VAR_CONST) \
+	_(2464, ZEND_SEND_FUNC_ARG_SPEC_VAR_UNUSED) \
+	_(2466, ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED) \
+	_(2467, ZEND_SWITCH_LONG_SPEC_CONST_CONST) \
+	_(2468, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
+	_(2469, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
+	_(2471, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
+	_(2472, ZEND_SWITCH_STRING_SPEC_CONST_CONST) \
+	_(2473, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
+	_(2474, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
+	_(2476, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
+	_(2477, ZEND_IN_ARRAY_SPEC_CONST_CONST) \
+	_(2478, ZEND_IN_ARRAY_SPEC_TMP_CONST) \
+	_(2479, ZEND_IN_ARRAY_SPEC_VAR_CONST) \
+	_(2481, ZEND_IN_ARRAY_SPEC_CV_CONST) \
+	_(2482, ZEND_COUNT_SPEC_CONST_UNUSED) \
+	_(2483, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \
+	_(2484, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \
+	_(2486, ZEND_COUNT_SPEC_CV_UNUSED) \
+	_(2487, ZEND_GET_CLASS_SPEC_CONST_UNUSED) \
+	_(2488, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \
+	_(2489, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \
+	_(2490, ZEND_GET_CLASS_SPEC_UNUSED_UNUSED) \
+	_(2491, ZEND_GET_CLASS_SPEC_CV_UNUSED) \
+	_(2492, ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED) \
+	_(2493, ZEND_GET_TYPE_SPEC_CONST_UNUSED) \
+	_(2494, ZEND_GET_TYPE_SPEC_TMP_UNUSED) \
+	_(2495, ZEND_GET_TYPE_SPEC_VAR_UNUSED) \
+	_(2497, ZEND_GET_TYPE_SPEC_CV_UNUSED) \
+	_(2498, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST) \
+	_(2499, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \
+	_(2500, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \
+	_(2502, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV) \
+	_(2503, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \
+	_(2504, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
+	_(2505, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
+	_(2507, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \
+	_(2508, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \
+	_(2509, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
+	_(2510, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
+	_(2512, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \
+	_(2518, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST) \
+	_(2519, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \
+	_(2520, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \
+	_(2522, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV) \
+	_(2523, ZEND_MATCH_SPEC_CONST_CONST) \
+	_(2524, ZEND_MATCH_SPEC_TMPVARCV_CONST) \
+	_(2525, ZEND_MATCH_SPEC_TMPVARCV_CONST) \
+	_(2527, ZEND_MATCH_SPEC_TMPVARCV_CONST) \
+	_(2533, ZEND_CASE_STRICT_SPEC_TMP_CONST) \
+	_(2534, ZEND_CASE_STRICT_SPEC_TMP_TMP) \
+	_(2535, ZEND_CASE_STRICT_SPEC_TMP_VAR) \
+	_(2537, ZEND_CASE_STRICT_SPEC_TMP_CV) \
+	_(2538, ZEND_CASE_STRICT_SPEC_VAR_CONST) \
+	_(2539, ZEND_CASE_STRICT_SPEC_VAR_TMP) \
+	_(2540, ZEND_CASE_STRICT_SPEC_VAR_VAR) \
+	_(2542, ZEND_CASE_STRICT_SPEC_VAR_CV) \
+	_(2553, ZEND_MATCH_ERROR_SPEC_CONST_UNUSED) \
+	_(2554, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \
+	_(2555, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \
+	_(2557, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \
+	_(2558, ZEND_JMP_NULL_SPEC_CONST) \
+	_(2559, ZEND_JMP_NULL_SPEC_TMP) \
+	_(2560, ZEND_JMP_NULL_SPEC_VAR) \
+	_(2562, ZEND_JMP_NULL_SPEC_CV) \
+	_(2563, ZEND_CHECK_UNDEF_ARGS_SPEC_UNUSED_UNUSED) \
+	_(2564, ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED) \
+	_(2565, ZEND_VERIFY_NEVER_TYPE_SPEC_UNUSED_UNUSED) \
+	_(2566, ZEND_CALLABLE_CONVERT_SPEC_UNUSED_UNUSED) \
+	_(2567, ZEND_BIND_INIT_STATIC_OR_JMP_SPEC_CV) \
+	_(2568, ZEND_RECV_NOTYPE_SPEC) \
+	_(2570, ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED) \
+	_(2571, ZEND_COUNT_ARRAY_SPEC_TMPVAR_UNUSED) \
+	_(2573, ZEND_COUNT_ARRAY_SPEC_CV_UNUSED) \
+	_(2574, ZEND_JMP_FORWARD_SPEC) \
+	_(2580, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+	_(2581, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2582, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2584, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2585, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+	_(2586, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2587, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2589, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2595, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+	_(2596, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2597, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2599, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2605, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
+	_(2606, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2607, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2609, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2610, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
+	_(2611, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2612, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2614, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2620, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
+	_(2621, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2622, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2624, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2630, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(2631, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2632, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2634, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2635, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(2636, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2637, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2639, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2645, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(2646, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2647, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2649, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2651, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+	_(2652, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+	_(2654, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+	_(2655, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+	_(2656, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2657, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2659, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2660, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+	_(2661, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2662, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2664, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2670, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+	_(2671, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2672, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2674, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2676, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+	_(2677, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+	_(2679, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+	_(2680, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
+	_(2681, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2682, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2684, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2685, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
+	_(2686, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2687, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2689, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2695, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
+	_(2696, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2697, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2699, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2701, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+	_(2702, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+	_(2704, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+	_(2705, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(2706, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2707, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2709, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2710, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(2711, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2712, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2714, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2720, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(2721, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2722, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2724, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2730, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+	_(2731, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2732, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2734, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2735, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+	_(2736, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2737, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2739, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2745, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+	_(2746, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2747, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2749, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+	_(2755, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
+	_(2756, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2757, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2759, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2760, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
+	_(2761, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2762, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2764, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2770, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
+	_(2771, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2772, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2774, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2780, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(2781, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2782, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2784, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2785, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(2786, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2787, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2789, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2795, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(2796, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2797, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2799, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2815, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+	_(2816, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(2817, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(2818, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2819, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2820, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2821, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2822, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2823, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2827, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2828, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2829, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2830, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+	_(2831, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(2832, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(2833, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2834, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2835, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2836, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2837, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2838, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2842, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2843, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2844, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2860, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+	_(2861, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(2862, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(2863, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2864, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2865, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2866, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2867, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2868, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2872, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2873, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2874, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2890, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(2891, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(2892, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(2893, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2894, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2895, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2896, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2897, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2898, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2902, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2903, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2904, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2905, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(2906, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(2907, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(2908, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2909, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2910, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2911, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2912, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2913, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2917, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2918, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2919, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2935, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(2936, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(2937, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(2938, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2939, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2940, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2941, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2942, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2943, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2947, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(2948, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2949, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2965, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+	_(2966, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(2967, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(2968, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2969, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2970, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2971, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2972, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2973, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2977, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2978, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2979, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2980, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+	_(2981, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(2982, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(2983, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2984, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2985, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2986, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2987, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2988, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(2992, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(2993, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(2994, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3010, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+	_(3011, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3012, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3013, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3014, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3015, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3016, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3017, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3018, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3022, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3023, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3024, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3040, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(3041, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3042, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3043, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3044, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3045, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3046, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3047, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3048, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3052, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3053, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3054, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3055, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(3056, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3057, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3058, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3059, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3060, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3061, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3062, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3063, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3067, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3068, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3069, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3085, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(3086, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3087, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3088, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3089, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3090, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3091, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3092, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3093, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3097, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3098, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3099, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3100, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \
+	_(3104, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \
+	_(3105, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \
+	_(3109, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \
+	_(3113, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+	_(3114, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+	_(3115, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+	_(3116, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+	_(3117, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+	_(3118, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+	_(3122, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+	_(3123, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+	_(3124, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+	_(3125, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+	_(3126, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3127, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3128, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3129, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3130, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3131, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3132, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3133, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3137, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3138, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3139, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3140, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+	_(3141, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3142, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3143, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3144, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3145, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3146, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3147, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3148, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3152, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3153, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3154, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3170, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+	_(3171, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3172, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3173, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3174, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3175, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3176, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3177, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3178, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3182, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3183, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3184, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3188, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+	_(3189, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+	_(3190, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+	_(3191, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+	_(3192, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+	_(3193, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+	_(3197, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+	_(3198, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+	_(3199, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+	_(3200, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(3201, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3202, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3203, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3204, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3205, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3206, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3207, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3208, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3212, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3213, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3214, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3215, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(3216, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3217, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3218, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3219, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3220, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3221, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3222, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3223, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3227, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3228, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3229, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3245, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(3246, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3247, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3248, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3249, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3250, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3251, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3252, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3253, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3257, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3258, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3259, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3263, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+	_(3264, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+	_(3265, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+	_(3266, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+	_(3267, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+	_(3268, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+	_(3272, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+	_(3273, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+	_(3274, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+	_(3275, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+	_(3276, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3277, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3278, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3279, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3280, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3281, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3282, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3283, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3287, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3288, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3289, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3290, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+	_(3291, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3292, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3293, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3294, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3295, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3296, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3297, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3298, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3302, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3303, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3304, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3320, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+	_(3321, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3322, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3323, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3324, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3325, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3326, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3327, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3328, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3332, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+	_(3333, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3334, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3338, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+	_(3339, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+	_(3340, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+	_(3341, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+	_(3342, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+	_(3343, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+	_(3347, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+	_(3348, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+	_(3349, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+	_(3350, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(3351, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3352, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3353, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3354, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3355, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3356, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3357, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3358, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3362, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3363, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3364, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3365, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(3366, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3367, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3368, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3369, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3370, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3371, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3372, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3373, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3377, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3378, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3379, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3395, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+	_(3396, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+	_(3397, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+	_(3398, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3399, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3400, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3401, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3402, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3403, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3407, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+	_(3408, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+	_(3409, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+	_(3410, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
+	_(3411, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
+	_(3412, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \
+	_(3413, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \
+	_(3414, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
+	_(3415, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
+	_(3416, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \
+	_(3417, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \
+	_(3418, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \
+	_(3419, ZEND_POST_INC_LONG_SPEC_CV) \
+	_(3420, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \
+	_(3421, ZEND_POST_DEC_LONG_SPEC_CV) \
+	_(3422, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \
+	_(3423, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
+	_(3424, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
+	_(3426, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
+	_(3427, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \
+	_(3428, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+	_(3429, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+	_(3431, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+	_(3432, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \
+	_(3433, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+	_(3434, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+	_(3436, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+	_(3438, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+	_(3439, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+	_(3441, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+	_(3442, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
+	_(3443, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+	_(3444, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+	_(3446, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+	_(3447, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
+	_(3448, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+	_(3449, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+	_(3451, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+	_(3457, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \
+	_(3458, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+	_(3459, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+	_(3461, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+	_(3464, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \
+	_(3466, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \
+	_(3469, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \
+	_(3471, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \
+	_(3472, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \
+	_(3473, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \
+	_(3474, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \
+	_(3475, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \
+	_(3475+1, ZEND_NULL)

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_opcodes.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_opcodes.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_opcodes.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -77,9 +77,9 @@
 
 BEGIN_EXTERN_C()
 
-ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode);
-ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(zend_uchar opcode);
-ZEND_API zend_uchar zend_get_opcode_id(const char *name, size_t length);
+ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(uint8_t opcode);
+ZEND_API uint32_t ZEND_FASTCALL zend_get_opcode_flags(uint8_t opcode);
+ZEND_API uint8_t zend_get_opcode_id(const char *name, size_t length);
 
 END_EXTERN_C()
 
@@ -128,7 +128,6 @@
 #define ZEND_JMP                         42
 #define ZEND_JMPZ                        43
 #define ZEND_JMPNZ                       44
-#define ZEND_JMPZNZ                      45
 #define ZEND_JMPZ_EX                     46
 #define ZEND_JMPNZ_EX                    47
 #define ZEND_CASE                        48
@@ -286,7 +285,8 @@
 #define ZEND_FETCH_GLOBALS              200
 #define ZEND_VERIFY_NEVER_TYPE          201
 #define ZEND_CALLABLE_CONVERT           202
+#define ZEND_BIND_INIT_STATIC_OR_JMP    203
 
-#define ZEND_VM_LAST_OPCODE             202
+#define ZEND_VM_LAST_OPCODE             203
 
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_trace_handlers.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_trace_handlers.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_trace_handlers.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -71,7 +71,7 @@
 	f = fopen("zend_vm_trace.log", "w+");
 	if (f) {
 		zend_hash_sort(&vm_trace_ht, (compare_func_t)zend_vm_trace_compare, 0);
-		ZEND_HASH_FOREACH_STR_KEY_VAL(&vm_trace_ht, key, val) {
+		ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(&vm_trace_ht, key, val) {
 			fprintf(f, "%s "ZEND_LONG_FMT"\n", ZSTR_VAL(key), Z_LVAL_P(val));
 		} ZEND_HASH_FOREACH_END();
 		fclose(f);

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_trace_map.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_trace_map.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_vm_trace_map.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -65,7 +65,7 @@
 	if (f) {
 		zend_hash_sort(&vm_trace_ht, (bucket_compare_func_t)zend_vm_trace_compare, 0);
 		prev_key = NULL;
-		ZEND_HASH_FOREACH_STR_KEY_VAL(&vm_trace_ht, key, val) {
+		ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(&vm_trace_ht, key, val) {
 			if (prev_key) {
 				fprintf(f, ADDR_FMT" "ADDR_FMT" t %s\n", prev_addr, Z_LVAL_P(val) - prev_addr, ZSTR_VAL(prev_key));
 			}

Modified: branches/4.0/MgDev/Oem/php/include/Zend/zend_weakrefs.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/Zend/zend_weakrefs.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/Zend/zend_weakrefs.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -17,6 +17,8 @@
 #ifndef ZEND_WEAKREFS_H
 #define ZEND_WEAKREFS_H
 
+#include "zend_alloc.h"
+
 BEGIN_EXTERN_C()
 
 extern ZEND_API zend_class_entry *zend_ce_weakref;
@@ -40,6 +42,32 @@
 	}
 }
 
+/* Because php uses the raw numbers as a hash function, raw pointers will lead to hash collisions.
+ * We have a guarantee that the lowest ZEND_MM_ALIGNED_OFFSET_LOG2 bits of a pointer are zero.
+ *
+ * E.g. On most 64-bit platforms, pointers are aligned to 8 bytes, so the least significant 3 bits are always 0 and can be discarded.
+ *
+ * NOTE: This function is only used for EG(weakrefs) and zend_weakmap->ht.
+ * It is not used for the HashTable instances associated with ZEND_WEAKREF_TAG_HT tags (created in zend_weakref_register, which uses ZEND_WEAKREF_ENCODE instead).
+ * The ZEND_WEAKREF_TAG_HT instances are used to disambiguate between multiple weak references to the same zend_object.
+ */
+static zend_always_inline zend_ulong zend_object_to_weakref_key(const zend_object *object)
+{
+	ZEND_ASSERT(((uintptr_t)object) % ZEND_MM_ALIGNMENT == 0);
+	return ((uintptr_t) object) >> ZEND_MM_ALIGNMENT_LOG2;
+}
+
+static zend_always_inline zend_object *zend_weakref_key_to_object(zend_ulong key)
+{
+	return (zend_object *) (((uintptr_t) key) << ZEND_MM_ALIGNMENT_LOG2);
+}
+
+HashTable *zend_weakmap_get_gc(zend_object *object, zval **table, int *n);
+HashTable *zend_weakmap_get_key_entry_gc(zend_object *object, zval **table, int *n);
+HashTable *zend_weakmap_get_entry_gc(zend_object *object, zval **table, int *n);
+HashTable *zend_weakmap_get_object_key_entry_gc(zend_object *object, zval **table, int *n);
+HashTable *zend_weakmap_get_object_entry_gc(zend_object *object, zval **table, int *n);
+
 END_EXTERN_C()
 
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/ext/date/lib/timelib.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/date/lib/timelib.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/date/lib/timelib.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,7 +1,7 @@
 /*
  * The MIT License (MIT)
  *
- * Copyright (c) 2015-2022 Derick Rethans
+ * Copyright (c) 2015-2024 Derick Rethans
  * Copyright (c) 2018,2021 MongoDB, Inc.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -30,9 +30,9 @@
 # include "timelib_config.h"
 #endif
 
-#define TIMELIB_VERSION 202119
-#define TIMELIB_EXTENDED_VERSION 20211901
-#define TIMELIB_ASCII_VERSION "2021.19"
+#define TIMELIB_VERSION 202212
+#define TIMELIB_EXTENDED_VERSION 20221201
+#define TIMELIB_ASCII_VERSION "2022.12"
 
 #include <stdlib.h>
 #include <stdbool.h>
@@ -321,6 +321,7 @@
 #define TIMELIB_ERR_INVALID_TZ_OFFSET          0x223
 #define TIMELIB_ERR_FORMAT_LITERAL_MISMATCH    0x224
 #define TIMELIB_ERR_MIX_ISO_WITH_NATURAL       0x225
+#define TIMELIB_ERR_NUMBER_OUT_OF_RANGE        0x226
 
 #define TIMELIB_ZONETYPE_NONE   0
 #define TIMELIB_ZONETYPE_OFFSET 1
@@ -378,7 +379,7 @@
 #define TIMELIB_OVERRIDE_TIME    0x01
 #define TIMELIB_NO_CLONE         0x02
 
-#define TIMELIB_UNSET   -99999
+#define TIMELIB_UNSET   -9999999
 
 /* An entry for each of these error codes is also in the
  * timelib_error_messages array in timelib.c.
@@ -438,6 +439,7 @@
 	TIMELIB_FORMAT_WHITESPACE,
 	TIMELIB_FORMAT_YEAR_TWO_DIGIT,
 	TIMELIB_FORMAT_YEAR_FOUR_DIGIT,
+	TIMELIB_FORMAT_YEAR_EXPANDED,
 	TIMELIB_FORMAT_YEAR_ISO
 } timelib_format_specifier_code;
 
@@ -793,6 +795,19 @@
 timelib_time_offset *timelib_get_time_zone_info(timelib_sll ts, timelib_tzinfo *tz);
 
 /**
+ * Returns offset information with time zone 'tz' for the time stamp 'ts'.
+ *
+ * The returned information contains: the offset in seconds East of UTC (in
+ * the output parameter 'offset'), whether DST is active (in the output
+ * parameter 'is_dst'), and the transition time that got to this state (in
+ * the output parameter 'transition_time'); if NULL is passed, the value is
+ * not retrieved
+ *
+ * Returns 1 if successful, 0 for failure.
+ */
+int timelib_get_time_zone_offset_info(timelib_sll ts, timelib_tzinfo *tz, int32_t* offset, timelib_sll* transition_time, unsigned int* is_dst);
+
+/**
  * Returns the UTC offset currently applicable for the information stored in 't'.
  *
  * The value returned is the UTC offset in seconds East.

Modified: branches/4.0/MgDev/Oem/php/include/ext/date/lib/timelib_config.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/date/lib/timelib_config.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/date/lib/timelib_config.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,5 +1,6 @@
 #include "config.w32.h"
-#include <php_stdint.h>
+#include <inttypes.h>
+#include <stdint.h>
 #include "zend.h"
 #define timelib_malloc  emalloc
 #define timelib_realloc erealloc

Modified: branches/4.0/MgDev/Oem/php/include/ext/date/php_date.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/date/php_date.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/date/php_date.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -50,7 +50,7 @@
 #define Z_PHPDATE_P(zv)  php_date_obj_from_obj(Z_OBJ_P((zv)))
 
 struct _php_timezone_obj {
-	int             initialized;
+	bool            initialized;
 	int             type;
 	union {
 		timelib_tzinfo   *tz;         /* TIMELIB_ZONETYPE_ID */
@@ -72,7 +72,9 @@
 struct _php_interval_obj {
 	timelib_rel_time *diff;
 	int               civil_or_wall;
-	int               initialized;
+	bool              from_string;
+	zend_string      *date_string;
+	bool              initialized;
 	zend_object       std;
 };
 
@@ -89,8 +91,9 @@
 	timelib_time     *end;
 	timelib_rel_time *interval;
 	int               recurrences;
-	int               initialized;
-	int               include_start_date;
+	bool              initialized;
+	bool              include_start_date;
+	bool              include_end_date;
 	zend_object       std;
 };
 
@@ -105,7 +108,6 @@
 	char                    *timezone;
 	HashTable               *tzcache;
 	timelib_error_container *last_errors;
-	int                     timezone_valid;
 ZEND_END_MODULE_GLOBALS(date)
 
 #define DATEG(v) ZEND_MODULE_GLOBALS_ACCESSOR(date, v)
@@ -114,13 +116,13 @@
 
 /* Backwards compatibility wrapper */
 PHPAPI zend_long php_parse_date(const char *string, zend_long *now);
-PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt);
-PHPAPI int php_idate(char format, time_t ts, int localtime);
+PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, bool gmt);
+PHPAPI int php_idate(char format, time_t ts, bool localtime);
 
 #define _php_strftime php_strftime
 
-PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gm);
-PHPAPI zend_string *php_format_date(const char *format, size_t format_len, time_t ts, int localtime);
+PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, bool gm);
+PHPAPI zend_string *php_format_date(const char *format, size_t format_len, time_t ts, bool localtime);
 
 /* Mechanism to set new TZ database */
 PHPAPI void php_date_set_tzdb(timelib_tzdb *tzdb);
@@ -139,7 +141,7 @@
 #define PHP_DATE_INIT_FORMAT 0x02
 
 PHPAPI zval *php_date_instantiate(zend_class_entry *pce, zval *object);
-PHPAPI int php_date_initialize(php_date_obj *dateobj, const char *time_str, size_t time_str_len, const char *format, zval *timezone_object, int flags);
+PHPAPI bool php_date_initialize(php_date_obj *dateobj, const char *time_str, size_t time_str_len, const char *format, zval *timezone_object, int flags);
 
 
 #endif /* PHP_DATE_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/dom/xml_common.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/dom/xml_common.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/dom/xml_common.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -61,20 +61,18 @@
 
 #define NODE_GET_OBJ(__ptr, __id, __prtype, __intern) { \
 	__intern = Z_LIBXML_NODE_P(__id); \
-	if (__intern->node == NULL || !(__ptr = (__prtype)__intern->node->node)) { \
-  		php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", \
-			ZSTR_VAL(__intern->std.ce->name));\
-  		RETURN_NULL();\
-  	} \
+	if (UNEXPECTED(__intern->node == NULL)) { \
+		php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", \
+			ZSTR_VAL(Z_OBJCE_P(__zv)->name));\
+		RETURN_NULL();\
+	} \
+	__ptr = (__prtype)__intern->node->node; \
 }
 
 #define DOC_GET_OBJ(__ptr, __id, __prtype, __intern) { \
 	__intern = Z_LIBXML_NODE_P(__id); \
-	if (__intern->document != NULL) { \
-		if (!(__ptr = (__prtype)__intern->document->ptr)) { \
-  			php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", __intern->std.ce->name);\
-  			RETURN_NULL();\
-  		} \
+	if (EXPECTED(__intern->document != NULL)) { \
+		__ptr = (__prtype)__intern->document->ptr); \
 	} \
 }
 

Modified: branches/4.0/MgDev/Oem/php/include/ext/gd/gd_arginfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/gd/gd_arginfo.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/gd/gd_arginfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 4de3d369fad259705acc5bf5de0e935b7e142ec7 */
+ * Stub hash: 0f8a22bff1d123313f37da400500e573baace837 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gd_info, 0, 0, IS_ARRAY, 0)
 ZEND_END_ARG_INFO()
@@ -122,7 +122,6 @@
 	ZEND_ARG_OBJ_INFO(0, image, GdImage, 0)
 	ZEND_ARG_TYPE_INFO(0, angle, IS_DOUBLE, 0)
 	ZEND_ARG_TYPE_INFO(0, background_color, IS_LONG, 0)
-	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, ignore_transparent, _IS_BOOL, 0, "false")
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagesettile, 0, 2, _IS_BOOL, 0)
@@ -265,8 +264,8 @@
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagegd2, 0, 1, _IS_BOOL, 0)
 	ZEND_ARG_OBJ_INFO(0, image, GdImage, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, file, IS_STRING, 1, "null")
-	ZEND_ARG_TYPE_INFO(0, chunk_size, IS_LONG, 0)
-	ZEND_ARG_TYPE_INFO(0, mode, IS_LONG, 0)
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, chunk_size, IS_LONG, 0, "128")
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "IMG_GD2_RAW")
 ZEND_END_ARG_INFO()
 
 #if defined(HAVE_GD_BMP)
@@ -315,7 +314,7 @@
 
 #define arginfo_imagecolorexact arginfo_imagecolorclosest
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecolorset, 0, 5, _IS_BOOL, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecolorset, 0, 5, IS_FALSE, 1)
 	ZEND_ARG_OBJ_INFO(0, image, GdImage, 0)
 	ZEND_ARG_TYPE_INFO(0, color, IS_LONG, 0)
 	ZEND_ARG_TYPE_INFO(0, red, IS_LONG, 0)
@@ -747,7 +746,7 @@
 	ZEND_FE(imagesettile, arginfo_imagesettile)
 	ZEND_FE(imagesetbrush, arginfo_imagesetbrush)
 	ZEND_FE(imagecreate, arginfo_imagecreate)
-	ZEND_FE(imagetypes, arginfo_imagetypes)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(imagetypes, arginfo_imagetypes)
 	ZEND_FE(imagecreatefromstring, arginfo_imagecreatefromstring)
 #if defined(HAVE_GD_AVIF)
 	ZEND_FE(imagecreatefromavif, arginfo_imagecreatefromavif)
@@ -875,6 +874,127 @@
 	ZEND_FE_END
 };
 
+static void register_gd_symbols(int module_number)
+{
+	REGISTER_LONG_CONSTANT("IMG_AVIF", PHP_IMG_AVIF, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_GIF", PHP_IMG_GIF, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_JPG", PHP_IMG_JPG, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_JPEG", PHP_IMG_JPEG, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_PNG", PHP_IMG_PNG, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_WBMP", PHP_IMG_WBMP, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_XPM", PHP_IMG_XPM, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_WEBP", PHP_IMG_WEBP, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_BMP", PHP_IMG_BMP, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_TGA", PHP_IMG_TGA, CONST_PERSISTENT);
+#if defined(gdWebpLossless)
+	REGISTER_LONG_CONSTANT("IMG_WEBP_LOSSLESS", gdWebpLossless, CONST_PERSISTENT);
+#endif
+	REGISTER_LONG_CONSTANT("IMG_COLOR_TILED", gdTiled, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_COLOR_STYLED", gdStyled, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_COLOR_BRUSHED", gdBrushed, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_COLOR_STYLEDBRUSHED", gdStyledBrushed, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_COLOR_TRANSPARENT", gdTransparent, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_ARC_ROUNDED", gdArc, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_ARC_PIE", gdPie, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_ARC_CHORD", gdChord, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_ARC_NOFILL", gdNoFill, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_ARC_EDGED", gdEdged, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_GD2_RAW", GD2_FMT_RAW, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_GD2_COMPRESSED", GD2_FMT_COMPRESSED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FLIP_HORIZONTAL", PHP_GD_FLIP_HORIZONTAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FLIP_VERTICAL", PHP_GD_FLIP_VERTICAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FLIP_BOTH", PHP_GD_FLIP_BOTH, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_EFFECT_REPLACE", gdEffectReplace, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_EFFECT_ALPHABLEND", gdEffectAlphaBlend, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_EFFECT_NORMAL", gdEffectNormal, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_EFFECT_OVERLAY", gdEffectOverlay, CONST_PERSISTENT);
+#if defined(gdEffectMultiply)
+	REGISTER_LONG_CONSTANT("IMG_EFFECT_MULTIPLY", gdEffectMultiply, CONST_PERSISTENT);
+#endif
+	REGISTER_LONG_CONSTANT("IMG_CROP_DEFAULT", GD_CROP_DEFAULT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_CROP_TRANSPARENT", GD_CROP_TRANSPARENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_CROP_BLACK", GD_CROP_BLACK, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_CROP_WHITE", GD_CROP_WHITE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_CROP_SIDES", GD_CROP_SIDES, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_CROP_THRESHOLD", GD_CROP_THRESHOLD, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_BELL", GD_BELL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_BESSEL", GD_BESSEL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_BILINEAR_FIXED", GD_BILINEAR_FIXED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_BICUBIC", GD_BICUBIC, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_BICUBIC_FIXED", GD_BICUBIC_FIXED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_BLACKMAN", GD_BLACKMAN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_BOX", GD_BOX, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_BSPLINE", GD_BSPLINE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_CATMULLROM", GD_CATMULLROM, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_GAUSSIAN", GD_GAUSSIAN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_GENERALIZED_CUBIC", GD_GENERALIZED_CUBIC, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_HERMITE", GD_HERMITE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_HAMMING", GD_HAMMING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_HANNING", GD_HANNING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_MITCHELL", GD_MITCHELL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_POWER", GD_POWER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_QUADRATIC", GD_QUADRATIC, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_SINC", GD_SINC, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_NEAREST_NEIGHBOUR", GD_NEAREST_NEIGHBOUR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_WEIGHTED4", GD_WEIGHTED4, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_TRIANGLE", GD_TRIANGLE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_AFFINE_TRANSLATE", GD_AFFINE_TRANSLATE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_AFFINE_SCALE", GD_AFFINE_SCALE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_AFFINE_ROTATE", GD_AFFINE_ROTATE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_AFFINE_SHEAR_HORIZONTAL", GD_AFFINE_SHEAR_HORIZONTAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_AFFINE_SHEAR_VERTICAL", GD_AFFINE_SHEAR_VERTICAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("GD_BUNDLED", GD_BUNDLED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_NEGATE", IMAGE_FILTER_NEGATE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_GRAYSCALE", IMAGE_FILTER_GRAYSCALE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_BRIGHTNESS", IMAGE_FILTER_BRIGHTNESS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_CONTRAST", IMAGE_FILTER_CONTRAST, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_COLORIZE", IMAGE_FILTER_COLORIZE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_EDGEDETECT", IMAGE_FILTER_EDGEDETECT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_GAUSSIAN_BLUR", IMAGE_FILTER_GAUSSIAN_BLUR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_SELECTIVE_BLUR", IMAGE_FILTER_SELECTIVE_BLUR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_EMBOSS", IMAGE_FILTER_EMBOSS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_MEAN_REMOVAL", IMAGE_FILTER_MEAN_REMOVAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_SMOOTH", IMAGE_FILTER_SMOOTH, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_PIXELATE", IMAGE_FILTER_PIXELATE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMG_FILTER_SCATTER", IMAGE_FILTER_SCATTER, CONST_PERSISTENT);
+#if defined(GD_VERSION_STRING)
+	REGISTER_STRING_CONSTANT("GD_VERSION", GD_VERSION_STRING, CONST_PERSISTENT);
+#endif
+#if (defined(GD_MAJOR_VERSION) && defined(GD_MINOR_VERSION) && defined(GD_RELEASE_VERSION) && defined(GD_EXTRA_VERSION))
+	REGISTER_LONG_CONSTANT("GD_MAJOR_VERSION", GD_MAJOR_VERSION, CONST_PERSISTENT);
+#endif
+#if (defined(GD_MAJOR_VERSION) && defined(GD_MINOR_VERSION) && defined(GD_RELEASE_VERSION) && defined(GD_EXTRA_VERSION))
+	REGISTER_LONG_CONSTANT("GD_MINOR_VERSION", GD_MINOR_VERSION, CONST_PERSISTENT);
+#endif
+#if (defined(GD_MAJOR_VERSION) && defined(GD_MINOR_VERSION) && defined(GD_RELEASE_VERSION) && defined(GD_EXTRA_VERSION))
+	REGISTER_LONG_CONSTANT("GD_RELEASE_VERSION", GD_RELEASE_VERSION, CONST_PERSISTENT);
+#endif
+#if (defined(GD_MAJOR_VERSION) && defined(GD_MINOR_VERSION) && defined(GD_RELEASE_VERSION) && defined(GD_EXTRA_VERSION))
+	REGISTER_STRING_CONSTANT("GD_EXTRA_VERSION", GD_EXTRA_VERSION, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_GD_PNG)
+	REGISTER_LONG_CONSTANT("PNG_NO_FILTER", 0x0, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_GD_PNG)
+	REGISTER_LONG_CONSTANT("PNG_FILTER_NONE", 0x8, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_GD_PNG)
+	REGISTER_LONG_CONSTANT("PNG_FILTER_SUB", 0x10, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_GD_PNG)
+	REGISTER_LONG_CONSTANT("PNG_FILTER_UP", 0x20, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_GD_PNG)
+	REGISTER_LONG_CONSTANT("PNG_FILTER_AVG", 0x40, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_GD_PNG)
+	REGISTER_LONG_CONSTANT("PNG_FILTER_PAETH", 0x80, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_GD_PNG)
+	REGISTER_LONG_CONSTANT("PNG_ALL_FILTERS", 0x8 | 0x10 | 0x20 | 0x40 | 0x80, CONST_PERSISTENT);
+#endif
+}
+
 static zend_class_entry *register_class_GdImage(void)
 {
 	zend_class_entry ce, *class_entry;

Modified: branches/4.0/MgDev/Oem/php/include/ext/gd/php_gd.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/gd/php_gd.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/gd/php_gd.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -55,6 +55,35 @@
 #define PHP_IMG_TGA  128
 #define PHP_IMG_AVIF 256
 
+/* Section Filters Declarations */
+/* IMPORTANT NOTE FOR NEW FILTER
+ * Do not forget to update:
+ * IMAGE_FILTER_MAX: define the last filter index
+ * IMAGE_FILTER_MAX_ARGS: define the biggest amount of arguments
+ * image_filter array in PHP_FUNCTION(imagefilter)
+ * */
+#define IMAGE_FILTER_NEGATE         0
+#define IMAGE_FILTER_GRAYSCALE      1
+#define IMAGE_FILTER_BRIGHTNESS     2
+#define IMAGE_FILTER_CONTRAST       3
+#define IMAGE_FILTER_COLORIZE       4
+#define IMAGE_FILTER_EDGEDETECT     5
+#define IMAGE_FILTER_EMBOSS         6
+#define IMAGE_FILTER_GAUSSIAN_BLUR  7
+#define IMAGE_FILTER_SELECTIVE_BLUR 8
+#define IMAGE_FILTER_MEAN_REMOVAL   9
+#define IMAGE_FILTER_SMOOTH         10
+#define IMAGE_FILTER_PIXELATE       11
+#define IMAGE_FILTER_SCATTER		12
+#define IMAGE_FILTER_MAX            12
+#define IMAGE_FILTER_MAX_ARGS       6
+
+#ifdef HAVE_GD_BUNDLED
+#define GD_BUNDLED 1
+#else
+#define GD_BUNDLED 0
+#endif
+
 #ifdef PHP_WIN32
 #	ifdef PHP_GD_EXPORTS
 #		define PHP_GD_API __declspec(dllexport)

Modified: branches/4.0/MgDev/Oem/php/include/ext/gmp/php_gmp_int.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/gmp/php_gmp_int.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/gmp/php_gmp_int.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -28,7 +28,7 @@
 PHP_GMP_API zend_class_entry *php_gmp_class_entry(void);
 
 /* GMP and MPIR use different datatypes on different platforms */
-#ifdef PHP_WIN32
+#ifdef _WIN64
 typedef zend_long gmp_long;
 typedef zend_ulong gmp_ulong;
 #else

Modified: branches/4.0/MgDev/Oem/php/include/ext/iconv/iconv_arginfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/iconv/iconv_arginfo.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/iconv/iconv_arginfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: c7198f92b39f7a15d242a74ed5f42036f858da2e */
+ * Stub hash: 4367fa431d3e4814e42d9aa514c10cae1d842d8f */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_iconv_strlen, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
@@ -85,3 +85,11 @@
 	ZEND_FE(iconv_get_encoding, arginfo_iconv_get_encoding)
 	ZEND_FE_END
 };
+
+static void register_iconv_symbols(int module_number)
+{
+	REGISTER_STRING_CONSTANT("ICONV_IMPL", PHP_ICONV_IMPL_VALUE, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("ICONV_VERSION", get_iconv_version(), CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ICONV_MIME_DECODE_STRICT", PHP_ICONV_MIME_DECODE_STRICT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ICONV_MIME_DECODE_CONTINUE_ON_ERROR", PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR, CONST_PERSISTENT);
+}

Modified: branches/4.0/MgDev/Oem/php/include/ext/iconv/php_iconv.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/iconv/php_iconv.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/iconv/php_iconv.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -41,18 +41,6 @@
 PHP_MSHUTDOWN_FUNCTION(miconv);
 PHP_MINFO_FUNCTION(miconv);
 
-PHP_NAMED_FUNCTION(php_if_iconv);
-PHP_FUNCTION(ob_iconv_handler);
-PHP_FUNCTION(iconv_get_encoding);
-PHP_FUNCTION(iconv_set_encoding);
-PHP_FUNCTION(iconv_strlen);
-PHP_FUNCTION(iconv_substr);
-PHP_FUNCTION(iconv_strpos);
-PHP_FUNCTION(iconv_strrpos);
-PHP_FUNCTION(iconv_mime_encode);
-PHP_FUNCTION(iconv_mime_decode);
-PHP_FUNCTION(iconv_mime_decode_headers);
-
 ZEND_BEGIN_MODULE_GLOBALS(iconv)
 	char *input_encoding;
 	char *internal_encoding;

Modified: branches/4.0/MgDev/Oem/php/include/ext/json/php_json.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/json/php_json.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/json/php_json.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -72,8 +72,10 @@
 #define PHP_JSON_PRESERVE_ZERO_FRACTION     (1<<10)
 #define PHP_JSON_UNESCAPED_LINE_TERMINATORS (1<<11)
 
+/* json_validate(), json_decode() and json_encode() common options */
+#define PHP_JSON_INVALID_UTF8_IGNORE        (1<<20)
+
 /* json_decode() and json_encode() common options */
-#define PHP_JSON_INVALID_UTF8_IGNORE        (1<<20)
 #define PHP_JSON_INVALID_UTF8_SUBSTITUTE    (1<<21)
 #define PHP_JSON_THROW_ON_ERROR             (1<<22)
 
@@ -97,11 +99,14 @@
 ZEND_TSRMLS_CACHE_EXTERN()
 #endif
 
-PHP_JSON_API int php_json_encode_ex(smart_str *buf, zval *val, int options, zend_long depth);
-PHP_JSON_API int php_json_encode(smart_str *buf, zval *val, int options);
-PHP_JSON_API int php_json_decode_ex(zval *return_value, const char *str, size_t str_len, zend_long options, zend_long depth);
+PHP_JSON_API zend_string *php_json_encode_string(const char *s, size_t len, int options);
 
-static inline int php_json_decode(zval *return_value, const char *str, int str_len, bool assoc, zend_long depth)
+PHP_JSON_API zend_result php_json_encode_ex(smart_str *buf, zval *val, int options, zend_long depth);
+PHP_JSON_API zend_result php_json_encode(smart_str *buf, zval *val, int options);
+PHP_JSON_API zend_result php_json_decode_ex(zval *return_value, const char *str, size_t str_len, zend_long options, zend_long depth);
+PHP_JSON_API bool php_json_validate_ex(const char *str, size_t str_len, zend_long options, zend_long depth);
+
+static inline zend_result php_json_decode(zval *return_value, const char *str, size_t str_len, bool assoc, zend_long depth)
 {
 	return php_json_decode_ex(return_value, str, str_len, assoc ? PHP_JSON_OBJECT_AS_ARRAY : 0, depth);
 }

Modified: branches/4.0/MgDev/Oem/php/include/ext/json/php_json_parser.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/json/php_json_parser.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/json/php_json_parser.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -81,4 +81,6 @@
 
 int php_json_yyparse(php_json_parser *parser);
 
+const php_json_parser_methods* php_json_get_validate_methods(void);
+
 #endif	/* PHP_JSON_PARSER_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/libxml/php_libxml.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/libxml/php_libxml.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/libxml/php_libxml.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -35,6 +35,7 @@
 
 #include "zend_smart_str.h"
 #include <libxml/tree.h>
+#include <libxml/parser.h>
 
 #define LIBXML_SAVE_NOEMPTYTAG 1<<2
 
@@ -42,29 +43,30 @@
 	zval stream_context;
 	smart_str error_buffer;
 	zend_llist *error_list;
-	struct _php_libxml_entity_resolver {
-		zval                    object;
-		zend_fcall_info			fci;
-		zend_fcall_info_cache	fcc;
-	} entity_loader;
+	zend_fcall_info_cache entity_loader_callback;
 	bool entity_loader_disabled;
 ZEND_END_MODULE_GLOBALS(libxml)
 
 typedef struct _libxml_doc_props {
-	int formatoutput;
-	int validateonparse;
-	int resolveexternals;
-	int preservewhitespace;
-	int substituteentities;
-	int stricterror;
-	int recover;
 	HashTable *classmap;
+	bool formatoutput;
+	bool validateonparse;
+	bool resolveexternals;
+	bool preservewhitespace;
+	bool substituteentities;
+	bool stricterror;
+	bool recover;
 } libxml_doc_props;
 
+typedef struct {
+	size_t modification_nr;
+} php_libxml_cache_tag;
+
 typedef struct _php_libxml_ref_obj {
 	void *ptr;
 	int   refcount;
 	libxml_doc_props *doc_props;
+	php_libxml_cache_tag cache_tag;
 } php_libxml_ref_obj;
 
 typedef struct _php_libxml_node_ptr {
@@ -85,6 +87,34 @@
 	return (php_libxml_node_object *)((char*)(obj) - obj->handlers->offset);
 }
 
+static zend_always_inline void php_libxml_invalidate_node_list_cache(php_libxml_ref_obj *doc_ptr)
+{
+	if (!doc_ptr) {
+		return;
+	}
+#if SIZEOF_SIZE_T == 8
+	/* If one operation happens every nanosecond, then it would still require 584 years to overflow
+	 * the counter. So we'll just assume this never happens. */
+	doc_ptr->cache_tag.modification_nr++;
+#else
+	size_t new_modification_nr = doc_ptr->cache_tag.modification_nr + 1;
+	if (EXPECTED(new_modification_nr > 0)) { /* unsigned overflow; checking after addition results in one less instruction */
+		doc_ptr->cache_tag.modification_nr = new_modification_nr;
+	}
+#endif
+}
+
+static zend_always_inline void php_libxml_invalidate_node_list_cache_from_doc(xmlDocPtr docp)
+{
+	if (docp && docp->_private) { /* docp is NULL for detached nodes */
+		php_libxml_node_ptr *node_private = (php_libxml_node_ptr *) docp->_private;
+		php_libxml_node_object *object_private = (php_libxml_node_object *) node_private->_private;
+		if (object_private) {
+			php_libxml_invalidate_node_list_cache(object_private->document);
+		}
+	}
+}
+
 #define Z_LIBXML_NODE_P(zv) php_libxml_node_fetch_object(Z_OBJ_P((zv)))
 
 typedef void * (*php_libxml_export_node) (zval *object);
@@ -107,6 +137,7 @@
 PHP_LIBXML_API void php_libxml_switch_context(zval *context, zval *oldcontext);
 PHP_LIBXML_API void php_libxml_issue_error(int level, const char *msg);
 PHP_LIBXML_API bool php_libxml_disable_entity_loader(bool disable);
+PHP_LIBXML_API void php_libxml_set_old_ns(xmlDocPtr doc, xmlNsPtr ns);
 
 /* Init/shutdown functions*/
 PHP_LIBXML_API void php_libxml_initialize(void);
@@ -118,6 +149,65 @@
 ZEND_TSRMLS_CACHE_EXTERN()
 #endif
 
+#if defined(__clang__)
+# define PHP_LIBXML_IGNORE_DEPRECATIONS_START \
+	_Pragma("clang diagnostic push") \
+	_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")
+# define PHP_LIBXML_IGNORE_DEPRECATIONS_END \
+	_Pragma("clang diagnostic pop")
+#elif defined(__GNUC__)
+# define PHP_LIBXML_IGNORE_DEPRECATIONS_START \
+	_Pragma("GCC diagnostic push") \
+	_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
+# define PHP_LIBXML_IGNORE_DEPRECATIONS_END \
+	_Pragma("GCC diagnostic pop")
+#else
+# define PHP_LIBXML_IGNORE_DEPRECATIONS_START
+# define PHP_LIBXML_IGNORE_DEPRECATIONS_END
+#endif
+
+/* Other extension may override the global state options, these global options
+ * are copied initially to ctxt->options. Set the options to a known good value.
+ * See libxml2 globals.c and parserInternals.c.
+ * The unique_name argument allows multiple sanitizes and restores within the
+ * same function, even nested is necessary. */
+#define PHP_LIBXML_SANITIZE_GLOBALS(unique_name) \
+	PHP_LIBXML_IGNORE_DEPRECATIONS_START \
+	int xml_old_loadsubset_##unique_name = xmlLoadExtDtdDefaultValue; \
+	xmlLoadExtDtdDefaultValue = 0; \
+	int xml_old_validate_##unique_name = xmlDoValidityCheckingDefaultValue; \
+	xmlDoValidityCheckingDefaultValue = 0; \
+	int xml_old_pedantic_##unique_name = xmlPedanticParserDefault(0); \
+	int xml_old_substitute_##unique_name = xmlSubstituteEntitiesDefault(0); \
+	int xml_old_linenrs_##unique_name = xmlLineNumbersDefault(0); \
+	int xml_old_blanks_##unique_name = xmlKeepBlanksDefault(1); \
+	PHP_LIBXML_IGNORE_DEPRECATIONS_END
+
+#define PHP_LIBXML_RESTORE_GLOBALS(unique_name) \
+	PHP_LIBXML_IGNORE_DEPRECATIONS_START \
+	xmlLoadExtDtdDefaultValue = xml_old_loadsubset_##unique_name; \
+	xmlDoValidityCheckingDefaultValue = xml_old_validate_##unique_name; \
+	(void) xmlPedanticParserDefault(xml_old_pedantic_##unique_name); \
+	(void) xmlSubstituteEntitiesDefault(xml_old_substitute_##unique_name); \
+	(void) xmlLineNumbersDefault(xml_old_linenrs_##unique_name); \
+	(void) xmlKeepBlanksDefault(xml_old_blanks_##unique_name); \
+	PHP_LIBXML_IGNORE_DEPRECATIONS_END
+
+/* Alternative for above, working directly on the context and not setting globals.
+ * Generally faster because no locking is involved, and this has the advantage that it sets the options to a known good value. */
+static zend_always_inline void php_libxml_sanitize_parse_ctxt_options(xmlParserCtxtPtr ctxt)
+{
+	PHP_LIBXML_IGNORE_DEPRECATIONS_START
+	ctxt->loadsubset = 0;
+	ctxt->validate = 0;
+	ctxt->pedantic = 0;
+	ctxt->replaceEntities = 0;
+	ctxt->linenumbers = 0;
+	ctxt->keepBlanks = 1;
+	ctxt->options = 0;
+	PHP_LIBXML_IGNORE_DEPRECATIONS_END
+}
+
 #else /* HAVE_LIBXML */
 #define libxml_module_ptr NULL
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/eaw_table.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/eaw_table.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/eaw_table.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -14,6 +14,8 @@
  * which should be displayed as double-width.
  */
 
+#define FIRST_DOUBLEWIDTH_CODEPOINT 0x1100
+
 static const struct {
 	int begin;
 	int end;

Modified: branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfilter.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfilter.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfilter.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -112,13 +112,11 @@
 #define MBFL_VERSION_MINOR 3
 #define MBFL_VERSION_TEENY 2
 
-/*
- * convert filter
- */
 #define MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE 0
 #define MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR 1
 #define MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG 2
 #define MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY 3
+#define MBFL_OUTPUTFILTER_ILLEGAL_MODE_BADUTF8 4 /* For internal use only; deliberately uses invalid UTF-8 byte sequence as error marker */
 
 /*
  * convenience macros
@@ -127,75 +125,11 @@
 #define MIN(a,b) ((a)<(b)?(a):(b))
 #endif
 
-/*
- * buffering converter
- */
-typedef struct _mbfl_buffer_converter mbfl_buffer_converter;
-
-struct _mbfl_buffer_converter {
-	mbfl_convert_filter *filter1;
-	mbfl_convert_filter *filter2;
-	mbfl_memory_device device;
-	const mbfl_encoding *to;
-};
-
-MBFLAPI extern mbfl_buffer_converter * mbfl_buffer_converter_new(const mbfl_encoding *from, const mbfl_encoding *to, size_t buf_initsz);
-MBFLAPI extern void mbfl_buffer_converter_delete(mbfl_buffer_converter *convd);
-MBFLAPI extern int mbfl_buffer_converter_illegal_mode(mbfl_buffer_converter *convd, int mode);
-MBFLAPI extern int mbfl_buffer_converter_illegal_substchar(mbfl_buffer_converter *convd, int substchar);
-MBFLAPI extern size_t mbfl_buffer_converter_feed(mbfl_buffer_converter *convd, mbfl_string *string);
-MBFLAPI extern int mbfl_buffer_converter_flush(mbfl_buffer_converter *convd);
-MBFLAPI extern mbfl_string * mbfl_buffer_converter_result(mbfl_buffer_converter *convd, mbfl_string *result);
-MBFLAPI extern mbfl_string * mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *string, mbfl_string *result);
-MBFLAPI extern size_t mbfl_buffer_illegalchars(mbfl_buffer_converter *convd);
-
-/*
- * encoding detector
- */
-typedef struct _mbfl_encoding_detector mbfl_encoding_detector;
-
-typedef struct {
-	size_t num_illegalchars;
-	size_t score;
-} mbfl_encoding_detector_data;
-
-struct _mbfl_encoding_detector {
-	mbfl_convert_filter **filter_list;
-	mbfl_encoding_detector_data *filter_data;
-	int filter_list_size;
-	int strict;
-};
-
-MBFLAPI extern mbfl_encoding_detector * mbfl_encoding_detector_new(const mbfl_encoding **elist, int elistsz, int strict);
-MBFLAPI extern void mbfl_encoding_detector_delete(mbfl_encoding_detector *identd);
-MBFLAPI extern int mbfl_encoding_detector_feed(mbfl_encoding_detector *identd, mbfl_string *string);
-MBFLAPI extern const mbfl_encoding *mbfl_encoding_detector_judge(mbfl_encoding_detector *identd);
-
-
-/*
- * encoding converter
- */
-MBFLAPI extern mbfl_string *
-mbfl_convert_encoding(mbfl_string *string, mbfl_string *result, const mbfl_encoding *toenc);
-
-
-/*
- * identify encoding
- */
-MBFLAPI extern const mbfl_encoding *
-mbfl_identify_encoding(mbfl_string *string, const mbfl_encoding **elist, int elistsz, int strict);
-
 /* Lengths -1 through -16 are reserved for error return values */
 static inline int mbfl_is_error(size_t len) {
 	return len >= (size_t) -16;
 }
 
-/*
- * strlen
- */
-MBFLAPI extern size_t
-mbfl_strlen(const mbfl_string *string);
-
 #define MBFL_ERROR_NOT_FOUND ((size_t) -1)
 #define MBFL_ERROR_ENCODING ((size_t) -4)
 #define MBFL_ERROR_EMPTY ((size_t) -8)
@@ -202,102 +136,14 @@
 #define MBFL_ERROR_OFFSET ((size_t) -16)
 
 /*
- * strpos.
- * Errors: MBFL_ERROR_NOT_FOUND, MBFL_ERROR_ENCODING, MBFL_ERROR_OFFSET
- */
-MBFLAPI extern size_t
-mbfl_strpos(mbfl_string *haystack, mbfl_string *needle, ssize_t offset, int reverse);
-
-/*
- * substr_count
- */
-MBFLAPI extern size_t
-mbfl_substr_count(mbfl_string *haystack, mbfl_string *needle);
-
-/*
  * If specified as length, the substr until the end of the string is taken.
  */
 #define MBFL_SUBSTR_UNTIL_END ((size_t) -1)
 
 /*
- * substr
- */
-MBFLAPI extern mbfl_string *
-mbfl_substr(mbfl_string *string, mbfl_string *result, size_t from, size_t length);
-
-/*
  * strcut
  */
 MBFLAPI extern mbfl_string *
 mbfl_strcut(mbfl_string *string, mbfl_string *result, size_t from, size_t length);
 
-/*
- *  strwidth
- */
-MBFLAPI extern size_t
-mbfl_strwidth(mbfl_string *string);
-
-/*
- *  strimwidth
- */
-MBFLAPI extern mbfl_string *
-mbfl_strimwidth(mbfl_string *string, mbfl_string *marker, mbfl_string *result, size_t from, size_t width);
-
-/*
- * MIME header encode
- */
-struct mime_header_encoder_data;	/* forward declaration */
-
-MBFLAPI extern struct mime_header_encoder_data *
-mime_header_encoder_new(
-    const mbfl_encoding *incode,
-    const mbfl_encoding *outcode,
-    const mbfl_encoding *encoding);
-
-MBFLAPI extern void
-mime_header_encoder_delete(struct mime_header_encoder_data *pe);
-
-MBFLAPI extern mbfl_string *
-mime_header_encoder_result(struct mime_header_encoder_data *pe, mbfl_string *result);
-
-MBFLAPI extern mbfl_string *
-mbfl_mime_header_encode(
-    mbfl_string *string, mbfl_string *result,
-    const mbfl_encoding *outcode,
-    const mbfl_encoding *encoding,
-    const char *linefeed,
-    int indent);
-
-/*
- * MIME header decode
- */
-struct mime_header_decoder_data;	/* forward declaration */
-
-MBFLAPI extern struct mime_header_decoder_data *
-mime_header_decoder_new(const mbfl_encoding *outcode);
-
-MBFLAPI extern void
-mime_header_decoder_delete(struct mime_header_decoder_data *pd);
-
-MBFLAPI extern mbfl_string *
-mime_header_decoder_result(struct mime_header_decoder_data *pd, mbfl_string *result);
-
-MBFLAPI extern mbfl_string *
-mbfl_mime_header_decode(
-    mbfl_string *string,
-    mbfl_string *result,
-    const mbfl_encoding *outcode);
-
-/*
- * convert HTML numeric entity
- */
-MBFLAPI extern mbfl_string *
-mbfl_html_numeric_entity(mbfl_string *string, mbfl_string *result, int *convmap, int mapsize, int type);
-
-/*
- * convert of halfwidth and fullwidth for japanese
- */
-MBFLAPI extern mbfl_string *
-mbfl_ja_jp_hantozen(mbfl_string *string, mbfl_string *result, int mode);
-
 #endif	/* MBFL_MBFILTER_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_consts.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_consts.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_consts.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -32,9 +32,8 @@
 #define MBFL_CONSTS_H
 
 #define MBFL_ENCTYPE_SBCS		0x00000001 /* single-byte encoding */
-#define MBFL_ENCTYPE_WCS2		0x00000010 /* 2 bytes/char */
-#define MBFL_ENCTYPE_MWC2		0x00000040 /* 2+ bytes/char */
-#define MBFL_ENCTYPE_WCS4		0x00000100 /* 4 bytes/char */
+#define MBFL_ENCTYPE_WCS2		0x00000002 /* 2 bytes/char */
+#define MBFL_ENCTYPE_WCS4		0x00000004 /* 4 bytes/char */
 #define MBFL_ENCTYPE_GL_UNSAFE	0x00004000
 
 #define MBFL_WCSPLANE_UCS2MAX		0x00010000
@@ -45,7 +44,10 @@
 /* Marker for an erroneous input byte (or sequence of bytes) */
 #define MBFL_BAD_INPUT (-1)
 
-#define MBFL_QPRINT_STS_MIME_HEADER 0x1000000
-#define MBFL_BASE64_STS_MIME_HEADER 0x1000000
+#define MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE 0
+#define MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR 1
+#define MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG 2
+#define MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY 3
+#define MBFL_OUTPUTFILTER_ILLEGAL_MODE_BADUTF8 4 /* For internal use only; deliberately uses invalid UTF-8 byte sequence as error marker */
 
 #endif /* MBFL_CONSTS_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_convert.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_convert.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_convert.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -57,7 +57,7 @@
 	const mbfl_encoding *from;
 	const mbfl_encoding *to;
 	int illegal_mode;
-	int illegal_substchar;
+	uint32_t illegal_substchar;
 	size_t num_illegalchar;
 	void *opaque;
 };
@@ -81,4 +81,7 @@
 MBFLAPI extern void mbfl_convert_filter_devcat(mbfl_convert_filter *filter, mbfl_memory_device *src);
 MBFLAPI extern int mbfl_convert_filter_strcat(mbfl_convert_filter *filter, const unsigned char *p);
 
+MBFLAPI extern zend_string* mb_fast_convert(unsigned char *in, size_t in_len, const mbfl_encoding *from, const mbfl_encoding *to, uint32_t replacement_char, unsigned int error_mode, unsigned int *num_errors);
+MBFLAPI extern void mb_illegal_output(uint32_t bad_cp, mb_from_wchar_fn fn, mb_convert_buf* buf);
+
 #endif /* MBFL_CONVERT_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -31,7 +31,9 @@
 #ifndef MBFL_ENCODING_H
 #define MBFL_ENCODING_H
 
+#include "zend.h"
 #include "mbfl_defs.h"
+#include "mbfl_consts.h"
 
 enum mbfl_no_encoding {
 	mbfl_no_encoding_invalid = -1,
@@ -119,8 +121,6 @@
 	mbfl_no_encoding_charset_max
 };
 
-typedef enum mbfl_no_encoding mbfl_encoding_id;
-
 struct _mbfl_convert_filter;
 struct mbfl_convert_vtbl {
 	enum mbfl_no_encoding from;
@@ -132,10 +132,114 @@
 	void (*filter_copy)(struct _mbfl_convert_filter *src, struct _mbfl_convert_filter *dest);
 };
 
-/*
- * encoding
- */
-typedef struct _mbfl_encoding {
+typedef struct {
+	unsigned char *out;
+	unsigned char *limit;
+	uint32_t state;
+	uint32_t errors;
+	uint32_t replacement_char;
+	unsigned int error_mode;
+	zend_string *str;
+} mb_convert_buf;
+
+typedef size_t (*mb_to_wchar_fn)(unsigned char **in, size_t *in_len, uint32_t *out, size_t out_len, unsigned int *state);
+typedef void (*mb_from_wchar_fn)(uint32_t *in, size_t in_len, mb_convert_buf *out, bool end);
+typedef bool (*mb_check_fn)(unsigned char *in, size_t in_len);
+
+/* When converting encoded text to a buffer of wchars (Unicode codepoints) using `mb_to_wchar_fn`,
+ * the buffer must be at least this size (to work with all supported text encodings) */
+#define MBSTRING_MIN_WCHAR_BUFSIZE 5
+
+static inline void mb_convert_buf_init(mb_convert_buf *buf, size_t initsize, uint32_t repl_char, unsigned int err_mode)
+{
+	buf->state = buf->errors = 0;
+	buf->str = emalloc(_ZSTR_STRUCT_SIZE(initsize));
+	buf->out = (unsigned char*)ZSTR_VAL(buf->str);
+	buf->limit = buf->out + initsize;
+	buf->replacement_char = repl_char;
+	buf->error_mode = err_mode;
+}
+
+#define MB_CONVERT_BUF_ENSURE(buf, out, limit, needed) \
+	ZEND_ASSERT(out <= limit); \
+	if ((limit - out) < (needed)) { \
+		size_t oldsize = limit - (unsigned char*)ZSTR_VAL((buf)->str); \
+		size_t newsize = oldsize + MAX(oldsize >> 1, needed); \
+		zend_string *newstr = erealloc((buf)->str, _ZSTR_STRUCT_SIZE(newsize)); \
+		out = (unsigned char*)ZSTR_VAL(newstr) + (out - (unsigned char*)ZSTR_VAL((buf)->str)); \
+		limit = (unsigned char*)ZSTR_VAL(newstr) + newsize; \
+		(buf)->str = newstr; \
+	}
+
+#define MB_CONVERT_BUF_STORE(buf, _out, _limit) (buf)->out = _out; (buf)->limit = _limit
+
+#define MB_CONVERT_BUF_LOAD(buf, _out, _limit) _out = (buf)->out; _limit = (buf)->limit
+
+#define MB_CONVERT_ERROR(buf, out, limit, bad_cp, conv_fn) \
+	MB_CONVERT_BUF_STORE(buf, out, limit); \
+	mb_illegal_output(bad_cp, conv_fn, buf); \
+	MB_CONVERT_BUF_LOAD(buf, out, limit)
+
+static inline unsigned char* mb_convert_buf_add(unsigned char *out, char c)
+{
+	*out++ = c;
+	return out;
+}
+
+static inline unsigned char* mb_convert_buf_add2(unsigned char *out, char c1, char c2)
+{
+	*out++ = c1;
+	*out++ = c2;
+	return out;
+}
+
+static inline unsigned char* mb_convert_buf_add3(unsigned char *out, char c1, char c2, char c3)
+{
+	*out++ = c1;
+	*out++ = c2;
+	*out++ = c3;
+	return out;
+}
+
+static inline unsigned char* mb_convert_buf_add4(unsigned char *out, char c1, char c2, char c3, char c4)
+{
+	*out++ = c1;
+	*out++ = c2;
+	*out++ = c3;
+	*out++ = c4;
+	return out;
+}
+
+static inline unsigned char* mb_convert_buf_appends(unsigned char *out, const char *s)
+{
+	while (*s) {
+		*out++ = *s++;
+	}
+	return out;
+}
+
+static inline unsigned char* mb_convert_buf_appendn(unsigned char *out, const char *s, size_t n)
+{
+	while (n--) {
+		*out++ = *s++;
+	}
+	return out;
+}
+
+static inline zend_string* mb_convert_buf_result_raw(mb_convert_buf *buf)
+{
+	ZEND_ASSERT(buf->out <= buf->limit);
+	zend_string *ret = buf->str;
+	/* See `zend_string_alloc` in zend_string.h */
+	GC_SET_REFCOUNT(ret, 1);
+	GC_TYPE_INFO(ret) = GC_STRING;
+	ZSTR_H(ret) = 0;
+	ZSTR_LEN(ret) = buf->out - (unsigned char*)ZSTR_VAL(ret);
+	*(buf->out) = '\0';
+	return ret;
+}
+
+typedef struct {
 	enum mbfl_no_encoding no_encoding;
 	const char *name;
 	const char *mime_name;
@@ -144,14 +248,44 @@
 	unsigned int flag;
 	const struct mbfl_convert_vtbl *input_filter;
 	const struct mbfl_convert_vtbl *output_filter;
+	mb_to_wchar_fn to_wchar;
+	mb_from_wchar_fn from_wchar;
+	mb_check_fn check;
 } mbfl_encoding;
 
+extern const mbfl_encoding mbfl_encoding_utf8;
+
+static inline zend_string* mb_convert_buf_result(mb_convert_buf *buf, const mbfl_encoding *enc)
+{
+	zend_string *ret = mb_convert_buf_result_raw(buf);
+	if (enc == &mbfl_encoding_utf8 && buf->error_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_BADUTF8) {
+		GC_ADD_FLAGS(ret, IS_STR_VALID_UTF8);
+	}
+	return ret;
+}
+
+/* Used if we initialize an `mb_convert_buf` but then discover we don't actually
+ * want to return `zend_string` */
+static inline void mb_convert_buf_free(mb_convert_buf *buf)
+{
+	efree(buf->str);
+}
+
+static inline size_t mb_convert_buf_len(mb_convert_buf *buf)
+{
+	return buf->out - (unsigned char*)ZSTR_VAL(buf->str);
+}
+
+static inline void mb_convert_buf_reset(mb_convert_buf *buf, size_t len)
+{
+	buf->out = (unsigned char*)ZSTR_VAL(buf->str) + len;
+	ZEND_ASSERT(buf->out <= buf->limit);
+}
+
 MBFLAPI extern const mbfl_encoding *mbfl_name2encoding(const char *name);
 MBFLAPI extern const mbfl_encoding *mbfl_no2encoding(enum mbfl_no_encoding no_encoding);
-MBFLAPI extern enum mbfl_no_encoding mbfl_name2no_encoding(const char *name);
 MBFLAPI extern const mbfl_encoding **mbfl_get_supported_encodings(void);
 MBFLAPI extern const char *mbfl_no_encoding2name(enum mbfl_no_encoding no_encoding);
-MBFLAPI extern const char *mbfl_no2preferred_mime_name(enum mbfl_no_encoding no_encoding);
 MBFLAPI extern const char *mbfl_encoding_preferred_mime_name(const mbfl_encoding *encoding);
 
 #endif /* MBFL_ENCODING_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_language.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_language.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mbstring/libmbfl/mbfl/mbfl_language.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -72,7 +72,7 @@
 	enum mbfl_no_language no_language;
 	const char *name;
 	const char *short_name;
-	const char *(*aliases)[];
+	const char **aliases;
 	enum mbfl_no_encoding mail_charset;
 	enum mbfl_no_encoding mail_header_encoding;
 	enum mbfl_no_encoding mail_body_encoding;

Modified: branches/4.0/MgDev/Oem/php/include/ext/mbstring/mbstring.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mbstring/mbstring.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mbstring/mbstring.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -53,24 +53,22 @@
 PHP_RSHUTDOWN_FUNCTION(mbstring);
 PHP_MINFO_FUNCTION(mbstring);
 
-MBSTRING_API char *php_mb_safe_strrchr_ex(const char *s, unsigned int c,
-                                    size_t nbytes, const mbfl_encoding *enc);
-MBSTRING_API char *php_mb_safe_strrchr(const char *s, unsigned int c,
-                                 size_t nbytes);
+MBSTRING_API char *php_mb_safe_strrchr(const char *s, unsigned int c, size_t nbytes, const mbfl_encoding *enc);
 
-MBSTRING_API char *php_mb_convert_encoding_ex(
+MBSTRING_API zend_string* php_mb_convert_encoding_ex(
 		const char *input, size_t length,
-		const mbfl_encoding *to_encoding, const mbfl_encoding *from_encoding, size_t *output_len);
-MBSTRING_API char * php_mb_convert_encoding(
+		const mbfl_encoding *to_encoding, const mbfl_encoding *from_encoding);
+MBSTRING_API zend_string* php_mb_convert_encoding(
 		const char *input, size_t length, const mbfl_encoding *to_encoding,
-		const mbfl_encoding **from_encodings, size_t num_from_encodings, size_t *output_len);
+		const mbfl_encoding **from_encodings, size_t num_from_encodings);
 
-MBSTRING_API size_t php_mb_mbchar_bytes_ex(const char *s, const mbfl_encoding *enc);
-MBSTRING_API size_t php_mb_mbchar_bytes(const char *s);
+MBSTRING_API size_t php_mb_mbchar_bytes(const char *s, const mbfl_encoding *enc);
 
-MBSTRING_API size_t php_mb_stripos(int mode, const char *old_haystack, size_t old_haystack_len, const char *old_needle, size_t old_needle_len, zend_long offset, const mbfl_encoding *encoding);
-MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const mbfl_encoding *encoding);
+MBSTRING_API size_t php_mb_stripos(bool mode, zend_string *haystack, zend_string *needle, zend_long offset, const mbfl_encoding *enc);
+MBSTRING_API bool php_mb_check_encoding(const char *input, size_t length, const mbfl_encoding *encoding);
 
+MBSTRING_API const mbfl_encoding* mb_guess_encoding_for_strings(const unsigned char **strings, size_t *str_lengths, size_t n, const mbfl_encoding **elist, unsigned int elist_size, bool strict, bool order_significant);
+
 ZEND_BEGIN_MODULE_GLOBALS(mbstring)
 	char *internal_encoding_name;
 	const mbfl_encoding *internal_encoding;
@@ -90,15 +88,17 @@
 	size_t current_detect_order_list_size;
 	enum mbfl_no_encoding *default_detect_order_list;
 	size_t default_detect_order_list_size;
+	HashTable *all_encodings_list;
 	int filter_illegal_mode;
-	int filter_illegal_substchar;
+	uint32_t filter_illegal_substchar;
 	int current_filter_illegal_mode;
-	int current_filter_illegal_substchar;
+	uint32_t current_filter_illegal_substchar;
 	enum mbfl_no_language language;
 	bool encoding_translation;
 	bool strict_detection;
 	size_t illegalchars;
-	mbfl_buffer_converter *outconv;
+	bool outconv_enabled;
+	unsigned int outconv_state;
     void *http_output_conv_mimetypes;
 #ifdef HAVE_MBREGEX
     struct _zend_mb_regex_globals *mb_regex_globals;

Modified: branches/4.0/MgDev/Oem/php/include/ext/mbstring/php_mbregex.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mbstring/php_mbregex.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mbstring/php_mbregex.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -30,6 +30,8 @@
 PHP_RSHUTDOWN_FUNCTION(mb_regex);
 PHP_MINFO_FUNCTION(mb_regex);
 
+extern char php_mb_oniguruma_version[256];
+
 typedef struct _zend_mb_regex_globals zend_mb_regex_globals;
 
 zend_mb_regex_globals *php_mb_regex_globals_alloc(void);

Modified: branches/4.0/MgDev/Oem/php/include/ext/mysqli/php_mysqli_structs.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mysqli/php_mysqli_structs.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mysqli/php_mysqli_structs.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -26,22 +26,10 @@
 #undef LIST
 #endif
 
-#ifdef MYSQLI_USE_MYSQLND
 #include "ext/mysqlnd/mysqlnd.h"
 #include "mysqli_mysqlnd.h"
-#else
 
-#include <mysql.h>
-#if MYSQL_VERSION_ID >= 80000 &&  MYSQL_VERSION_ID < 100000
-typedef _Bool		my_bool;
-#endif
-#include <errmsg.h>
-#include <mysqld_error.h>
-#include "mysqli_libmysql.h"
 
-#endif /* MYSQLI_USE_MYSQLND */
-
-
 #define MYSQLI_VERSION_ID		101009
 
 enum mysqli_status {
@@ -69,10 +57,6 @@
 	BIND_BUFFER	param;
 	BIND_BUFFER	result;
 	char		*query;
-#ifndef MYSQLI_USE_MYSQLND
-	/* used to manage refcount with libmysql (already implement in mysqlnd) */
-	zval		link_handle;
-#endif
 } MY_STMT;
 
 typedef struct {
@@ -82,9 +66,7 @@
 	php_stream		*li_stream;
 	unsigned int 	multi_query;
 	bool		persistent;
-#ifdef MYSQLI_USE_MYSQLND
 	int				async_result_fetch_type;
-#endif
 } MY_MYSQL;
 
 typedef struct {
@@ -259,14 +241,13 @@
 	zend_long 			num_active_persistent;
 	zend_long 			num_inactive_persistent;
 	zend_long			max_persistent;
-	zend_long			allow_persistent;
+	bool				allow_persistent;
 	zend_ulong			default_port;
 	char				*default_host;
 	char				*default_user;
 	char				*default_pw;
 	char				*default_socket;
-	zend_long			reconnect;
-	zend_long			allow_local_infile;
+	bool				allow_local_infile;
 	char				*local_infile_directory;
 	zend_long			error_no;
 	char				*error_msg;

Modified: branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/config-win.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/config-win.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/config-win.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -15,32 +15,6 @@
 
 #include <stdint.h>
 
-#ifndef HAVE_INT8_T
-#define HAVE_INT8_T
-#endif
-#ifndef HAVE_UINT8_T
-#define HAVE_UINT8_T
-#endif
-#ifndef HAVE_INT16_T
-#define HAVE_INT16_T
-#endif
-#ifndef HAVE_UINT16_T
-#define HAVE_UINT16_T
-#endif
-#ifndef HAVE_INT32_T
-#define HAVE_INT32_T
-#endif
-#ifndef HAVE_UINT32_T
-#define HAVE_UINT32_T
-#endif
-#ifndef HAVE_INT64_T
-#define HAVE_INT64_T
-#endif
-#ifndef HAVE_UINT64_T
-#define HAVE_UINT64_T
-#endif
-
-
 #ifndef _WIN64
 #ifndef _WIN32
 #define _WIN32				/* Compatible with old source */

Modified: branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -109,7 +109,6 @@
 #define mysqlnd_query(conn, query_str, query_len)		((conn)->data)->m->query((conn)->data, (query_str), (query_len))
 #define mysqlnd_async_query(conn, query_str, query_len)	((conn)->data)->m->send_query((conn)->data, (query_str), (query_len), NULL, NULL)
 #define mysqlnd_reap_async_query(conn)					((conn)->data)->m->reap_query((conn)->data)
-#define mysqlnd_unbuffered_skip_result(result)			(result)->m.skip_result((result))
 
 PHPAPI enum_func_status mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQLND ***dont_poll, long sec, long usec, int * desc_num);
 
@@ -195,7 +194,6 @@
 #define mysqlnd_ping(conn)					((conn)->data)->m->ping((conn)->data)
 #define mysqlnd_kill(conn, pid)				((conn)->data)->m->kill_connection((conn)->data, (pid))
 #define mysqlnd_refresh(conn, options)		((conn)->data)->m->refresh_server((conn)->data, (options))
-#define mysqlnd_shutdown(conn, level)		((conn)->data)->m->shutdown_server((conn)->data, (level))
 #define mysqlnd_set_character_set(conn, cs)	((conn)->data)->m->set_charset((conn)->data, (cs))
 #define mysqlnd_stat(conn, msg)				((conn)->data)->m->get_server_statistics(((conn)->data), (msg))
 #define mysqlnd_options(conn, opt, value)	((conn)->data)->m->set_client_option((conn)->data, (opt), (value))

Modified: branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd_charset.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd_charset.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd_charset.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -19,6 +19,9 @@
 #ifndef MYSQLND_CHARSET_H
 #define MYSQLND_CHARSET_H
 
+#define MYSQLND_UTF8_MB3_DEFAULT_ID 33
+#define MYSQLND_UTF8_MB4_DEFAULT_ID 45
+
 PHPAPI zend_ulong mysqlnd_cset_escape_quotes(const MYSQLND_CHARSET * const charset, char * newstr,
 											 const char * escapestr, const size_t escapestr_len);
 

Modified: branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd_portability.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd_portability.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd_portability.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -38,7 +38,7 @@
   #define atoll atol
 #endif
 
-#include "php_stdint.h"
+#include <stdint.h>
 
 #if SIZEOF_LONG_LONG > 4 && !defined(_LONG_LONG)
 #define _LONG_LONG 1        /* For AIX string library */
@@ -215,8 +215,8 @@
                   *(((char *)(T))+1) = (char)(((A) >> 8));\
                   *(((char *)(T))+2) = (char)(((A) >> 16));\
                   *(((char *)(T))+3) = (char)(((A) >> 24)); \
-                  *(((char *)(T))+4) = (char)(((A) >> 32)); } while (0)
-#define int8store(T,A)        { uint32_t def_temp= (uint32_t) (A), def_temp2= (uint32_t) ((A) >> 32); \
+                  *(((char *)(T))+4) = sizeof(A) == 4 ? 0 : (char)(((A) >> 32)); } while (0)
+#define int8store(T,A)        { uint32_t def_temp= (uint32_t) (A), def_temp2= sizeof(A) == 4 ? 0 : (uint32_t) ((A) >> 32); \
                   int4store((T),def_temp); \
                   int4store((T+4),def_temp2); \
                 }

Modified: branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd_structs.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd_structs.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/mysqlnd/mysqlnd_structs.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -311,7 +311,6 @@
 typedef enum_func_status (*func_mysqlnd_execute_com_statistics)(MYSQLND_CONN_DATA * const conn, zend_string ** message);
 typedef enum_func_status (*func_mysqlnd_execute_com_process_kill)(MYSQLND_CONN_DATA * const conn, const unsigned int process_id, const bool read_response);
 typedef enum_func_status (*func_mysqlnd_execute_com_refresh)(MYSQLND_CONN_DATA * const conn, const uint8_t options);
-typedef enum_func_status (*func_mysqlnd_execute_com_shutdown)(MYSQLND_CONN_DATA * const conn, const uint8_t level);
 typedef enum_func_status (*func_mysqlnd_execute_com_quit)(MYSQLND_CONN_DATA * const conn);
 typedef enum_func_status (*func_mysqlnd_execute_com_query)(MYSQLND_CONN_DATA * const conn, MYSQLND_CSTRING query);
 typedef enum_func_status (*func_mysqlnd_execute_com_change_user)(MYSQLND_CONN_DATA * const conn, const MYSQLND_CSTRING payload, const bool silent);
@@ -335,7 +334,6 @@
 	func_mysqlnd_execute_com_statistics statistics;
 	func_mysqlnd_execute_com_process_kill process_kill;
 	func_mysqlnd_execute_com_refresh refresh;
-	func_mysqlnd_execute_com_shutdown shutdown;
 	func_mysqlnd_execute_com_quit quit;
 	func_mysqlnd_execute_com_query query;
 	func_mysqlnd_execute_com_change_user change_user;
@@ -352,7 +350,7 @@
 
 
 
-typedef enum_func_status	(*func_mysqlnd_vio__init)(MYSQLND_VIO * const vio, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info);
+typedef void				(*func_mysqlnd_vio__init)(MYSQLND_VIO * const vio, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info);
 typedef void				(*func_mysqlnd_vio__dtor)(MYSQLND_VIO * const vio, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
 
 typedef enum_func_status	(*func_mysqlnd_vio__connect)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
@@ -486,8 +484,8 @@
 typedef enum_func_status	(*func_mysqlnd_conn_data__send_command_do_request)(MYSQLND_CONN_DATA * const conn, const enum php_mysqlnd_server_command command, const zend_uchar * const arg, const size_t arg_len, const bool silent, const bool ignore_upsert_status);
 typedef enum_func_status	(*func_mysqlnd_conn_data__send_command_handle_response)(MYSQLND_CONN_DATA * const conn, const enum mysqlnd_packet_type ok_packet, const bool silent, const enum php_mysqlnd_server_command command, const bool ignore_upsert_status);
 
-typedef enum_func_status	(*func_mysqlnd_conn_data__restart_psession)(MYSQLND_CONN_DATA * conn);
-typedef enum_func_status	(*func_mysqlnd_conn_data__end_psession)(MYSQLND_CONN_DATA * conn);
+typedef void				(*func_mysqlnd_conn_data__restart_psession)(MYSQLND_CONN_DATA * conn);
+typedef void				(*func_mysqlnd_conn_data__end_psession)(MYSQLND_CONN_DATA * conn);
 typedef enum_func_status	(*func_mysqlnd_conn_data__send_close)(MYSQLND_CONN_DATA * conn);
 
 typedef enum_func_status    (*func_mysqlnd_conn_data__ssl_set)(MYSQLND_CONN_DATA * const conn, const char * key, const char * const cert, const char * const ca, const char * const capath, const char * const cipher);
@@ -533,7 +531,6 @@
 
 	func_mysqlnd_conn_data__stmt_init stmt_init;
 
-	func_mysqlnd_conn_data__shutdown_server shutdown_server;
 	func_mysqlnd_conn_data__refresh_server refresh_server;
 
 	func_mysqlnd_conn_data__ping ping;
@@ -632,7 +629,7 @@
 typedef MYSQLND_ROW_C 		(*func_mysqlnd_res__fetch_row_c)(MYSQLND_RES *result);
 typedef uint64_t			(*func_mysqlnd_res__num_rows)(const MYSQLND_RES * const result);
 typedef unsigned int		(*func_mysqlnd_res__num_fields)(const MYSQLND_RES * const result);
-typedef enum_func_status	(*func_mysqlnd_res__skip_result)(MYSQLND_RES * const result);
+typedef void				(*func_mysqlnd_res__skip_result)(MYSQLND_RES * const result);
 typedef enum_func_status	(*func_mysqlnd_res__seek_data)(MYSQLND_RES * const result, const uint64_t row);
 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res__seek_field)(MYSQLND_RES * const result, const MYSQLND_FIELD_OFFSET field_offset);
 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res__field_tell)(const MYSQLND_RES * const result);
@@ -1085,9 +1082,9 @@
 
 
 
-typedef enum_func_status	(*func_mysqlnd_pfc__init)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info);
+typedef void				(*func_mysqlnd_pfc__init)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info);
 typedef void				(*func_mysqlnd_pfc__dtor)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
-typedef enum_func_status	(*func_mysqlnd_pfc__reset)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
+typedef void				(*func_mysqlnd_pfc__reset)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
 typedef enum_func_status	(*func_mysqlnd_pfc__set_client_option)(MYSQLND_PFC * const pfc, enum_mysqlnd_client_option option, const char * const value);
 typedef enum_func_status	(*func_mysqlnd_pfc__decode)(zend_uchar * uncompressed_data, const size_t uncompressed_data_len, const zend_uchar * const compressed_data, const size_t compressed_data_len);
 typedef enum_func_status	(*func_mysqlnd_pfc__encode)(zend_uchar * compress_buffer, size_t * compress_buffer_len, const zend_uchar * const uncompressed_data, const size_t uncompressed_data_len);

Modified: branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -42,9 +42,9 @@
 /* The current PCRE version information. */
 
 #define PCRE2_MAJOR           10
-#define PCRE2_MINOR           39
+#define PCRE2_MINOR           42
 #define PCRE2_PRERELEASE      
-#define PCRE2_DATE            2021-10-29
+#define PCRE2_DATE            2022-12-12
 
 /* When an application links to a PCRE DLL in Windows, the symbols that are
 imported have to be identified as such. When building PCRE2, the appropriate

Modified: branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_internal.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_internal.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_internal.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -7,7 +7,7 @@
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2020 University of Cambridge
+          New API code Copyright (c) 2016-2022 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -220,18 +220,17 @@
 
 #define COMPILE_ERROR_BASE 100
 
-/* The initial frames vector for remembering backtracking points in
-pcre2_match() is allocated on the system stack, of this size (bytes). The size
-must be a multiple of sizeof(PCRE2_SPTR) in all environments, so making it a
-multiple of 8 is best. Typical frame sizes are a few hundred bytes (it depends
-on the number of capturing parentheses) so 20KiB handles quite a few frames. A
-larger vector on the heap is obtained for patterns that need more frames. The
-maximum size of this can be limited. */
+/* The initial frames vector for remembering pcre2_match() backtracking points
+is allocated on the heap, of this size (bytes) or ten times the frame size if
+larger, unless the heap limit is smaller. Typical frame sizes are a few hundred
+bytes (it depends on the number of capturing parentheses) so 20KiB handles
+quite a few frames. A larger vector on the heap is obtained for matches that
+need more frames, subject to the heap limit. */
 
 #define START_FRAMES_SIZE 20480
 
-/* Similarly, for DFA matching, an initial internal workspace vector is
-allocated on the stack. */
+/* For DFA matching, an initial internal workspace vector is allocated on the
+stack. The heap is used only if this turns out to be too small. */
 
 #define DFA_START_RWS_SIZE 30720
 
@@ -954,6 +953,13 @@
 #define STRING_LIMIT_RECURSION_EQ         "LIMIT_RECURSION="
 #define STRING_MARK                       "MARK"
 
+#define STRING_bc                         "bc"
+#define STRING_bidiclass                  "bidiclass"
+#define STRING_sc                         "sc"
+#define STRING_script                     "script"
+#define STRING_scriptextensions           "scriptextensions"
+#define STRING_scx                        "scx"
+
 #else  /* SUPPORT_UNICODE */
 
 /* UTF-8 support is enabled; always use UTF-8 (=ASCII) character codes. This
@@ -1248,6 +1254,14 @@
 #define STRING_LIMIT_RECURSION_EQ         STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_R STR_E STR_C STR_U STR_R STR_S STR_I STR_O STR_N STR_EQUALS_SIGN
 #define STRING_MARK                       STR_M STR_A STR_R STR_K
 
+#define STRING_bc                         STR_b STR_c
+#define STRING_bidiclass                  STR_b STR_i STR_d STR_i STR_c STR_l STR_a STR_s STR_s
+#define STRING_sc                         STR_s STR_c
+#define STRING_script                     STR_s STR_c STR_r STR_i STR_p STR_t
+#define STRING_scriptextensions           STR_s STR_c STR_r STR_i STR_p STR_t STR_e STR_x STR_t STR_e STR_n STR_s STR_i STR_o STR_n STR_s
+#define STRING_scx                        STR_s STR_c STR_x
+
+
 #endif  /* SUPPORT_UNICODE */
 
 /* -------------------- End of character and string names -------------------*/
@@ -1254,20 +1268,25 @@
 
 /* -------------------- Definitions for compiled patterns -------------------*/
 
-/* Codes for different types of Unicode property */
+/* Codes for different types of Unicode property. If these definitions are
+changed, the autopossessifying table in pcre2_auto_possess.c must be updated to
+match. */
 
 #define PT_ANY        0    /* Any property - matches all chars */
 #define PT_LAMP       1    /* L& - the union of Lu, Ll, Lt */
 #define PT_GC         2    /* Specified general characteristic (e.g. L) */
 #define PT_PC         3    /* Specified particular characteristic (e.g. Lu) */
-#define PT_SC         4    /* Script (e.g. Han) */
-#define PT_ALNUM      5    /* Alphanumeric - the union of L and N */
-#define PT_SPACE      6    /* Perl space - Z plus 9,10,12,13 */
-#define PT_PXSPACE    7    /* POSIX space - Z plus 9,10,11,12,13 */
-#define PT_WORD       8    /* Word - L plus N plus underscore */
-#define PT_CLIST      9    /* Pseudo-property: match character list */
-#define PT_UCNC      10    /* Universal Character nameable character */
-#define PT_TABSIZE   11    /* Size of square table for autopossessify tests */
+#define PT_SC         4    /* Script only (e.g. Han) */
+#define PT_SCX        5    /* Script extensions (includes SC) */
+#define PT_ALNUM      6    /* Alphanumeric - the union of L and N */
+#define PT_SPACE      7    /* Perl space - general category Z plus 9,10,12,13 */
+#define PT_PXSPACE    8    /* POSIX space - Z plus 9,10,11,12,13 */
+#define PT_WORD       9    /* Word - L plus N plus underscore */
+#define PT_CLIST     10    /* Pseudo-property: match character list */
+#define PT_UCNC      11    /* Universal Character nameable character */
+#define PT_BIDICL    12    /* Specified bidi class */
+#define PT_BOOL      13    /* Boolean property */
+#define PT_TABSIZE   14    /* Size of square table for autopossessify tests */
 
 /* The following special properties are used only in XCLASS items, when POSIX
 classes are specified and PCRE2_UCP is set - in other words, for Unicode
@@ -1275,22 +1294,27 @@
 those in the above list, and so they do not take part in the autopossessifying
 table. */
 
-#define PT_PXGRAPH   11    /* [:graph:] - characters that mark the paper */
-#define PT_PXPRINT   12    /* [:print:] - [:graph:] plus non-control spaces */
-#define PT_PXPUNCT   13    /* [:punct:] - punctuation characters */
+#define PT_PXGRAPH   14    /* [:graph:] - characters that mark the paper */
+#define PT_PXPRINT   15    /* [:print:] - [:graph:] plus non-control spaces */
+#define PT_PXPUNCT   16    /* [:punct:] - punctuation characters */
 
+/* This value is used when parsing \p and \P escapes to indicate that neither
+\p{script:...} nor \p{scx:...} has been encountered. */
+
+#define PT_NOTSCRIPT 255
+
 /* Flag bits and data types for the extended class (OP_XCLASS) for classes that
 contain characters with values greater than 255. */
 
-#define XCL_NOT       0x01    /* Flag: this is a negative class */
-#define XCL_MAP       0x02    /* Flag: a 32-byte map is present */
-#define XCL_HASPROP   0x04    /* Flag: property checks are present. */
+#define XCL_NOT      0x01  /* Flag: this is a negative class */
+#define XCL_MAP      0x02  /* Flag: a 32-byte map is present */
+#define XCL_HASPROP  0x04  /* Flag: property checks are present. */
 
-#define XCL_END       0    /* Marks end of individual items */
-#define XCL_SINGLE    1    /* Single item (one multibyte char) follows */
-#define XCL_RANGE     2    /* A range (two multibyte chars) follows */
-#define XCL_PROP      3    /* Unicode property (2-byte property code follows) */
-#define XCL_NOTPROP   4    /* Unicode inverted property (ditto) */
+#define XCL_END      0     /* Marks end of individual items */
+#define XCL_SINGLE   1     /* Single item (one multibyte char) follows */
+#define XCL_RANGE    2     /* A range (two multibyte chars) follows */
+#define XCL_PROP     3     /* Unicode property (2-byte property code follows) */
+#define XCL_NOTPROP  4     /* Unicode inverted property (ditto) */
 
 /* These are escaped items that aren't just an encoding of a particular data
 value such as \n. They must have non-zero values, as check_escape() returns 0
@@ -1797,8 +1821,8 @@
   uint8_t gbprop;     /* ucp_gbControl, etc. (grapheme break property) */
   uint8_t caseset;    /* offset to multichar other cases or zero */
   int32_t other_case; /* offset to other case, or zero if none */
-  int16_t scriptx;    /* script extension value */
-  int16_t dummy;      /* spare - to round to multiple of 4 bytes */
+  uint16_t scriptx_bidiclass; /* script extension (11 bit) and bidi class (5 bit) values */
+  uint16_t bprops;    /* binary properties offset */
 } ucd_record;
 
 /* UCD access macros */
@@ -1815,6 +1839,14 @@
 #define GET_UCD(ch) REAL_GET_UCD(ch)
 #endif
 
+#define UCD_SCRIPTX_MASK 0x3ff
+#define UCD_BIDICLASS_SHIFT 11
+#define UCD_BPROPS_MASK 0xfff
+
+#define UCD_SCRIPTX_PROP(prop) ((prop)->scriptx_bidiclass & UCD_SCRIPTX_MASK)
+#define UCD_BIDICLASS_PROP(prop) ((prop)->scriptx_bidiclass >> UCD_BIDICLASS_SHIFT)
+#define UCD_BPROPS_PROP(prop) ((prop)->bprops & UCD_BPROPS_MASK)
+
 #define UCD_CHARTYPE(ch)    GET_UCD(ch)->chartype
 #define UCD_SCRIPT(ch)      GET_UCD(ch)->script
 #define UCD_CATEGORY(ch)    PRIV(ucp_gentype)[UCD_CHARTYPE(ch)]
@@ -1821,8 +1853,17 @@
 #define UCD_GRAPHBREAK(ch)  GET_UCD(ch)->gbprop
 #define UCD_CASESET(ch)     GET_UCD(ch)->caseset
 #define UCD_OTHERCASE(ch)   ((uint32_t)((int)ch + (int)(GET_UCD(ch)->other_case)))
-#define UCD_SCRIPTX(ch)     GET_UCD(ch)->scriptx
+#define UCD_SCRIPTX(ch)     UCD_SCRIPTX_PROP(GET_UCD(ch))
+#define UCD_BPROPS(ch)      UCD_BPROPS_PROP(GET_UCD(ch))
+#define UCD_BIDICLASS(ch)   UCD_BIDICLASS_PROP(GET_UCD(ch))
 
+/* The "scriptx" and bprops fields contain offsets into vectors of 32-bit words
+that form a bitmap representing a list of scripts or boolean properties. These
+macros test or set a bit in the map by number. */
+
+#define MAPBIT(map,n) ((map)[(n)/32]&(1u<<((n)%32)))
+#define MAPSET(map,n) ((map)[(n)/32]|=(1u<<((n)%32)))
+
 /* Header for serialized pcre2 codes. */
 
 typedef struct pcre2_serialized_data {
@@ -1878,6 +1919,7 @@
 #endif
 #define _pcre2_hspace_list             PCRE2_SUFFIX(_pcre2_hspace_list_)
 #define _pcre2_vspace_list             PCRE2_SUFFIX(_pcre2_vspace_list_)
+#define _pcre2_ucd_boolprop_sets       PCRE2_SUFFIX(_pcre2_ucd_boolprop_sets_)
 #define _pcre2_ucd_caseless_sets       PCRE2_SUFFIX(_pcre2_ucd_caseless_sets_)
 #define _pcre2_ucd_digit_sets          PCRE2_SUFFIX(_pcre2_ucd_digit_sets_)
 #define _pcre2_ucd_script_sets         PCRE2_SUFFIX(_pcre2_ucd_script_sets_)
@@ -1901,9 +1943,10 @@
 extern const uint8_t                   PRIV(default_tables)[];
 extern const uint32_t                  PRIV(hspace_list)[];
 extern const uint32_t                  PRIV(vspace_list)[];
+extern const uint32_t                  PRIV(ucd_boolprop_sets)[];
 extern const uint32_t                  PRIV(ucd_caseless_sets)[];
 extern const uint32_t                  PRIV(ucd_digit_sets)[];
-extern const uint8_t                   PRIV(ucd_script_sets)[];
+extern const uint32_t                  PRIV(ucd_script_sets)[];
 extern const ucd_record                PRIV(ucd_records)[];
 #if PCRE2_CODE_UNIT_WIDTH == 32
 extern const ucd_record                PRIV(dummy_ucd_record)[];

Modified: branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_intmodedep.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_intmodedep.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_intmodedep.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -7,7 +7,7 @@
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2018 University of Cambridge
+          New API code Copyright (c) 2016-2022 University of Cambridge
 
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
@@ -519,7 +519,7 @@
 macro because almost all calls are already within a block of UTF-32 only
 code.
 
-These are all no-ops since all UTF-32 characters fit into one pcre_uchar. */
+These are all no-ops since all UTF-32 characters fit into one PCRE2_UCHAR. */
 
 #define BACKCHAR(eptr) do { } while (0)
 
@@ -649,19 +649,23 @@
 subpatterns is 65535 we must allow for 65536 strings to include the overall
 match. (See also the heapframe structure below.) */
 
+struct heapframe;  /* Forward reference */
+
 typedef struct pcre2_real_match_data {
-  pcre2_memctl     memctl;
-  const pcre2_real_code *code;    /* The pattern used for the match */
-  PCRE2_SPTR       subject;       /* The subject that was matched */
-  PCRE2_SPTR       mark;          /* Pointer to last mark */
-  PCRE2_SIZE       leftchar;      /* Offset to leftmost code unit */
-  PCRE2_SIZE       rightchar;     /* Offset to rightmost code unit */
-  PCRE2_SIZE       startchar;     /* Offset to starting code unit */
-  uint8_t          matchedby;     /* Type of match (normal, JIT, DFA) */
-  uint8_t          flags;         /* Various flags */
-  uint16_t         oveccount;     /* Number of pairs */
-  int              rc;            /* The return code from the match */
-  PCRE2_SIZE       ovector[131072]; /* Must be last in the structure */
+  pcre2_memctl     memctl;           /* Memory control fields */
+  const pcre2_real_code *code;       /* The pattern used for the match */
+  PCRE2_SPTR       subject;          /* The subject that was matched */
+  PCRE2_SPTR       mark;             /* Pointer to last mark */
+  struct heapframe *heapframes;      /* Backtracking frames heap memory */
+  PCRE2_SIZE       heapframes_size;  /* Malloc-ed size */
+  PCRE2_SIZE       leftchar;         /* Offset to leftmost code unit */
+  PCRE2_SIZE       rightchar;        /* Offset to rightmost code unit */
+  PCRE2_SIZE       startchar;        /* Offset to starting code unit */
+  uint8_t          matchedby;        /* Type of match (normal, JIT, DFA) */
+  uint8_t          flags;            /* Various flags */
+  uint16_t         oveccount;        /* Number of pairs */
+  int              rc;               /* The return code from the match */
+  PCRE2_SIZE       ovector[131072];  /* Must be last in the structure */
 } pcre2_real_match_data;
 
 
@@ -747,8 +751,8 @@
   uint32_t class_range_start;      /* Overall class range start */
   uint32_t class_range_end;        /* Overall class range end */
   PCRE2_UCHAR nl[4];               /* Newline string when fixed length */
+  uint32_t req_varyopt;            /* "After variable item" flag for reqbyte */
   int  max_lookbehind;             /* Maximum lookbehind (characters) */
-  int  req_varyopt;                /* "After variable item" flag for reqbyte */
   BOOL had_accept;                 /* (*ACCEPT) encountered */
   BOOL had_pruneorskip;            /* (*PRUNE) or (*SKIP) encountered */
   BOOL had_recurse;                /* Had a recursion or subroutine call */
@@ -764,7 +768,7 @@
 } pcre2_real_jit_stack;
 
 /* Structure for items in a linked list that represents an explicit recursive
-call within the pattern when running pcre_dfa_match(). */
+call within the pattern when running pcre2_dfa_match(). */
 
 typedef struct dfa_recursion_info {
   struct dfa_recursion_info *prevrec;
@@ -838,15 +842,22 @@
 typedef char check_heapframe_size[
   ((sizeof(heapframe) % sizeof(PCRE2_SIZE)) == 0)? (+1):(-1)];
 
+/* Structure for computing the alignment of heapframe. */
+
+typedef struct heapframe_align {
+  char unalign;    /* Completely unalign the current offset */
+  heapframe frame; /* Offset is its alignment */
+} heapframe_align;
+
+/* This define is the minimum alignment required for a heapframe, in bytes. */
+
+#define HEAPFRAME_ALIGNMENT offsetof(heapframe_align, frame)
+
 /* Structure for passing "static" information around between the functions
 doing traditional NFA matching (pcre2_match() and friends). */
 
 typedef struct match_block {
   pcre2_memctl memctl;            /* For general use */
-  PCRE2_SIZE frame_vector_size;   /* Size of a backtracking frame */
-  heapframe *match_frames;        /* Points to vector of frames */
-  heapframe *match_frames_top;    /* Points after the end of the vector */
-  heapframe *stack_frames;        /* The original vector on the stack */
   PCRE2_SIZE heap_limit;          /* As it says */
   uint32_t match_limit;           /* As it says */
   uint32_t match_limit_depth;     /* As it says */

Modified: branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_jit_neon_inc.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_jit_neon_inc.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_jit_neon_inc.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -183,6 +183,8 @@
 #endif
 
 #if defined(FFCPS)
+if (str_ptr >= str_end)
+  return NULL;
 sljit_u8 *p1 = str_ptr - diff;
 #endif
 sljit_s32 align_offset = ((uint64_t)str_ptr & 0xf);
@@ -327,7 +329,7 @@
     return NULL;
 
 #if defined(FF_UTF)
-  if (utf_continue(str_ptr + IN_UCHARS(-offs1)))
+  if (utf_continue((PCRE2_SPTR)str_ptr - offs1))
     {
     /* Not a match. */
     str_ptr += IN_UCHARS(1);

Modified: branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_jit_simd_inc.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_jit_simd_inc.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_jit_simd_inc.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -339,7 +339,7 @@
   {
   JUMPHERE(partial_quit[0]);
   JUMPHERE(partial_quit[1]);
-  OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0);
+  OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_PTR, 0, STR_END, 0);
   CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
   }
 else
@@ -537,7 +537,7 @@
   OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
   OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1));
 
-  OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, STR_END, 0);
+  OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, STR_END, 0);
   CMOV(SLJIT_LESS, STR_END, TMP1, 0);
   }
 
@@ -776,7 +776,7 @@
 } int_char;
 
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
-static SLJIT_INLINE int utf_continue(sljit_u8 *s)
+static SLJIT_INLINE int utf_continue(PCRE2_SPTR s)
 {
 #if PCRE2_CODE_UNIT_WIDTH == 8
 return (*s & 0xc0) == 0x80;
@@ -883,14 +883,14 @@
 
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
   if (common->utf && offset > 0)
-    sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
-                     SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_utf));
+    sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                     SLJIT_IMM, SLJIT_FUNC_ADDR(ffcs_utf));
   else
-    sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
-                     SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs));
+    sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                     SLJIT_IMM, SLJIT_FUNC_ADDR(ffcs));
 #else
-  sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
-                   SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs));
+  sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                   SLJIT_IMM, SLJIT_FUNC_ADDR(ffcs));
 #endif
   }
 else
@@ -904,14 +904,14 @@
 
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
     if (common->utf && offset > 0)
-      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
-                       SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_mask_utf));
+      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                       SLJIT_IMM, SLJIT_FUNC_ADDR(ffcs_mask_utf));
     else
-      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
-                       SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_mask));
+      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                       SLJIT_IMM, SLJIT_FUNC_ADDR(ffcs_mask));
 #else
-    sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
-                     SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_mask));
+    sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                     SLJIT_IMM, SLJIT_FUNC_ADDR(ffcs_mask));
 #endif
     }
   else
@@ -922,14 +922,14 @@
 
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
     if (common->utf && offset > 0)
-      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
-                       SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_2_utf));
+      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                       SLJIT_IMM, SLJIT_FUNC_ADDR(ffcs_2_utf));
     else
-      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
-                       SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_2));
+      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                       SLJIT_IMM, SLJIT_FUNC_ADDR(ffcs_2));
 #else
-    sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(UW) | SLJIT_ARG3(UW) | SLJIT_ARG4(UW),
-                     SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcs_2));
+    sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                     SLJIT_IMM, SLJIT_FUNC_ADDR(ffcs_2));
 #endif
     }
   }
@@ -1067,7 +1067,7 @@
   OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);
   OP2(SLJIT_ADD, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1));
 
-  OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, STR_END, 0, SLJIT_R0, 0);
+  OP2U(SLJIT_SUB | SLJIT_SET_LESS, STR_END, 0, SLJIT_R0, 0);
   CMOV(SLJIT_LESS, SLJIT_R0, STR_END, 0);
   }
 
@@ -1084,31 +1084,31 @@
   if (char1a == char1b && char2a == char2b) {
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
     if (common->utf)
-      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW),
-                       SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcps_0_utf));
+      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                       SLJIT_IMM, SLJIT_FUNC_ADDR(ffcps_0_utf));
     else
 #endif
-      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW),
-                       SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcps_0));
+      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                       SLJIT_IMM, SLJIT_FUNC_ADDR(ffcps_0));
   } else {
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
     if (common->utf)
-      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW),
-                       SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcps_1_utf));
+      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                       SLJIT_IMM, SLJIT_FUNC_ADDR(ffcps_1_utf));
     else
 #endif
-      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW),
-                       SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcps_1));
+      sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                       SLJIT_IMM, SLJIT_FUNC_ADDR(ffcps_1));
   }
 } else {
 #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
   if (common->utf)
-    sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW),
-                     SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcps_default_utf));
+    sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                     SLJIT_IMM, SLJIT_FUNC_ADDR(ffcps_default_utf));
   else
 #endif
-    sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW),
-                     SLJIT_IMM, SLJIT_FUNC_OFFSET(ffcps_default));
+    sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS4(W, W, W, W, W),
+                     SLJIT_IMM, SLJIT_FUNC_ADDR(ffcps_default));
 }
 
 /* Restore STR_PTR register. */
@@ -1418,7 +1418,7 @@
   {
   JUMPHERE(partial_quit[0]);
   JUMPHERE(partial_quit[1]);
-  OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0);
+  OP2U(SLJIT_SUB | SLJIT_SET_GREATER, STR_PTR, 0, STR_END, 0);
   CMOV(SLJIT_GREATER, STR_PTR, STR_END, 0);
   }
 else
@@ -1673,7 +1673,7 @@
   OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);
   OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(offs1 + 1));
 
-  OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP1, 0, STR_END, 0);
+  OP2U(SLJIT_SUB | SLJIT_SET_LESS, TMP1, 0, STR_END, 0);
   CMOV(SLJIT_LESS, STR_END, TMP1, 0);
   }
 

Modified: branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_ucp.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_ucp.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/pcre/pcre2lib/pcre2_ucp.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -7,8 +7,12 @@
 
                        Written by Philip Hazel
      Original API code Copyright (c) 1997-2012 University of Cambridge
-          New API code Copyright (c) 2016-2018 University of Cambridge
+          New API code Copyright (c) 2016-2022 University of Cambridge
 
+This module is auto-generated from Unicode data files. DO NOT EDIT MANUALLY!
+Instead, modify the maint/GenerateUcpHeader.py script and run it to generate
+a new version of this code.
+
 -----------------------------------------------------------------------------
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
@@ -38,31 +42,27 @@
 -----------------------------------------------------------------------------
 */
 
-
 #ifndef PCRE2_UCP_H_IDEMPOTENT_GUARD
 #define PCRE2_UCP_H_IDEMPOTENT_GUARD
 
-/* This file contains definitions of the property values that are returned by
-the UCD access macros. New values that are added for new releases of Unicode
-should always be at the end of each enum, for backwards compatibility.
+/* This file contains definitions of the Unicode property values that are
+returned by the UCD access macros and used throughout PCRE2.
 
-IMPORTANT: Note also that the specific numeric values of the enums have to be
-the same as the values that are generated by the maint/MultiStage2.py script,
-where the equivalent property descriptive names are listed in vectors.
+IMPORTANT: The specific values of the first two enums (general and particular
+character categories) are assumed by the table called catposstab in the file
+pcre2_auto_possess.c. They are unlikely to change, but should be checked after
+an update. */
 
-ALSO: The specific values of the first two enums are assumed for the table
-called catposstab in pcre2_compile.c. */
-
 /* These are the general character categories. */
 
 enum {
-  ucp_C,     /* Other */
-  ucp_L,     /* Letter */
-  ucp_M,     /* Mark */
-  ucp_N,     /* Number */
-  ucp_P,     /* Punctuation */
-  ucp_S,     /* Symbol */
-  ucp_Z      /* Separator */
+  ucp_C,
+  ucp_L,
+  ucp_M,
+  ucp_N,
+  ucp_P,
+  ucp_S,
+  ucp_Z,
 };
 
 /* These are the particular character categories. */
@@ -97,9 +97,100 @@
   ucp_So,    /* Other symbol */
   ucp_Zl,    /* Line separator */
   ucp_Zp,    /* Paragraph separator */
-  ucp_Zs     /* Space separator */
+  ucp_Zs,    /* Space separator */
 };
 
+/* These are Boolean properties. */
+
+enum {
+  ucp_ASCII,
+  ucp_ASCII_Hex_Digit,
+  ucp_Alphabetic,
+  ucp_Bidi_Control,
+  ucp_Bidi_Mirrored,
+  ucp_Case_Ignorable,
+  ucp_Cased,
+  ucp_Changes_When_Casefolded,
+  ucp_Changes_When_Casemapped,
+  ucp_Changes_When_Lowercased,
+  ucp_Changes_When_Titlecased,
+  ucp_Changes_When_Uppercased,
+  ucp_Dash,
+  ucp_Default_Ignorable_Code_Point,
+  ucp_Deprecated,
+  ucp_Diacritic,
+  ucp_Emoji,
+  ucp_Emoji_Component,
+  ucp_Emoji_Modifier,
+  ucp_Emoji_Modifier_Base,
+  ucp_Emoji_Presentation,
+  ucp_Extended_Pictographic,
+  ucp_Extender,
+  ucp_Grapheme_Base,
+  ucp_Grapheme_Extend,
+  ucp_Grapheme_Link,
+  ucp_Hex_Digit,
+  ucp_IDS_Binary_Operator,
+  ucp_IDS_Trinary_Operator,
+  ucp_ID_Continue,
+  ucp_ID_Start,
+  ucp_Ideographic,
+  ucp_Join_Control,
+  ucp_Logical_Order_Exception,
+  ucp_Lowercase,
+  ucp_Math,
+  ucp_Noncharacter_Code_Point,
+  ucp_Pattern_Syntax,
+  ucp_Pattern_White_Space,
+  ucp_Prepended_Concatenation_Mark,
+  ucp_Quotation_Mark,
+  ucp_Radical,
+  ucp_Regional_Indicator,
+  ucp_Sentence_Terminal,
+  ucp_Soft_Dotted,
+  ucp_Terminal_Punctuation,
+  ucp_Unified_Ideograph,
+  ucp_Uppercase,
+  ucp_Variation_Selector,
+  ucp_White_Space,
+  ucp_XID_Continue,
+  ucp_XID_Start,
+  /* This must be last */
+  ucp_Bprop_Count
+};
+
+/* Size of entries in ucd_boolprop_sets[] */
+
+#define ucd_boolprop_sets_item_size 2
+
+/* These are the bidi class values. */
+
+enum {
+  ucp_bidiAL,   /* Arabic letter */
+  ucp_bidiAN,   /* Arabic number */
+  ucp_bidiB,    /* Paragraph separator */
+  ucp_bidiBN,   /* Boundary neutral */
+  ucp_bidiCS,   /* Common separator */
+  ucp_bidiEN,   /* European number */
+  ucp_bidiES,   /* European separator */
+  ucp_bidiET,   /* European terminator */
+  ucp_bidiFSI,  /* First strong isolate */
+  ucp_bidiL,    /* Left to right */
+  ucp_bidiLRE,  /* Left to right embedding */
+  ucp_bidiLRI,  /* Left to right isolate */
+  ucp_bidiLRO,  /* Left to right override */
+  ucp_bidiNSM,  /* Non-spacing mark */
+  ucp_bidiON,   /* Other neutral */
+  ucp_bidiPDF,  /* Pop directional format */
+  ucp_bidiPDI,  /* Pop directional isolate */
+  ucp_bidiR,    /* Right to left */
+  ucp_bidiRLE,  /* Right to left embedding */
+  ucp_bidiRLI,  /* Right to left isolate */
+  ucp_bidiRLO,  /* Right to left override */
+  ucp_bidiS,    /* Segment separator */
+  ucp_bidiWS,   /* White space */
+};
+
 /* These are grapheme break properties. The Extended Pictographic property
 comes from the emoji-data.txt file. */
 
@@ -115,191 +206,189 @@
   ucp_gbT,                     /*  8 Hangul syllable type T */
   ucp_gbLV,                    /*  9 Hangul syllable type LV */
   ucp_gbLVT,                   /* 10 Hangul syllable type LVT */
-  ucp_gbRegionalIndicator,     /* 11 */
+  ucp_gbRegional_Indicator,    /* 11 */
   ucp_gbOther,                 /* 12 */
   ucp_gbZWJ,                   /* 13 */
-  ucp_gbExtended_Pictographic  /* 14 */
+  ucp_gbExtended_Pictographic, /* 14 */
 };
 
 /* These are the script identifications. */
 
 enum {
-  ucp_Unknown,
+  /* Scripts which has characters in other scripts. */
+  ucp_Latin,
+  ucp_Greek,
+  ucp_Cyrillic,
   ucp_Arabic,
-  ucp_Armenian,
+  ucp_Syriac,
+  ucp_Thaana,
+  ucp_Devanagari,
   ucp_Bengali,
+  ucp_Gurmukhi,
+  ucp_Gujarati,
+  ucp_Oriya,
+  ucp_Tamil,
+  ucp_Telugu,
+  ucp_Kannada,
+  ucp_Malayalam,
+  ucp_Sinhala,
+  ucp_Myanmar,
+  ucp_Georgian,
+  ucp_Hangul,
+  ucp_Mongolian,
+  ucp_Hiragana,
+  ucp_Katakana,
   ucp_Bopomofo,
-  ucp_Braille,
+  ucp_Han,
+  ucp_Yi,
+  ucp_Tagalog,
+  ucp_Hanunoo,
+  ucp_Buhid,
+  ucp_Tagbanwa,
+  ucp_Limbu,
+  ucp_Tai_Le,
+  ucp_Linear_B,
+  ucp_Cypriot,
   ucp_Buginese,
-  ucp_Buhid,
-  ucp_Canadian_Aboriginal,
-  ucp_Cherokee,
-  ucp_Common,
   ucp_Coptic,
-  ucp_Cypriot,
-  ucp_Cyrillic,
-  ucp_Deseret,
-  ucp_Devanagari,
-  ucp_Ethiopic,
-  ucp_Georgian,
   ucp_Glagolitic,
-  ucp_Gothic,
-  ucp_Greek,
-  ucp_Gujarati,
-  ucp_Gurmukhi,
-  ucp_Han,
-  ucp_Hangul,
-  ucp_Hanunoo,
+  ucp_Syloti_Nagri,
+  ucp_Phags_Pa,
+  ucp_Nko,
+  ucp_Kayah_Li,
+  ucp_Javanese,
+  ucp_Kaithi,
+  ucp_Mandaic,
+  ucp_Chakma,
+  ucp_Sharada,
+  ucp_Takri,
+  ucp_Duployan,
+  ucp_Grantha,
+  ucp_Khojki,
+  ucp_Linear_A,
+  ucp_Mahajani,
+  ucp_Manichaean,
+  ucp_Modi,
+  ucp_Old_Permic,
+  ucp_Psalter_Pahlavi,
+  ucp_Khudawadi,
+  ucp_Tirhuta,
+  ucp_Multani,
+  ucp_Adlam,
+  ucp_Masaram_Gondi,
+  ucp_Dogra,
+  ucp_Gunjala_Gondi,
+  ucp_Hanifi_Rohingya,
+  ucp_Sogdian,
+  ucp_Nandinagari,
+  ucp_Yezidi,
+  ucp_Cypro_Minoan,
+  ucp_Old_Uyghur,
+
+  /* Scripts which has no characters in other scripts. */
+  ucp_Unknown,
+  ucp_Common,
+  ucp_Armenian,
   ucp_Hebrew,
-  ucp_Hiragana,
-  ucp_Inherited,
-  ucp_Kannada,
-  ucp_Katakana,
-  ucp_Kharoshthi,
-  ucp_Khmer,
+  ucp_Thai,
   ucp_Lao,
-  ucp_Latin,
-  ucp_Limbu,
-  ucp_Linear_B,
-  ucp_Malayalam,
-  ucp_Mongolian,
-  ucp_Myanmar,
-  ucp_New_Tai_Lue,
+  ucp_Tibetan,
+  ucp_Ethiopic,
+  ucp_Cherokee,
+  ucp_Canadian_Aboriginal,
   ucp_Ogham,
+  ucp_Runic,
+  ucp_Khmer,
   ucp_Old_Italic,
-  ucp_Old_Persian,
-  ucp_Oriya,
+  ucp_Gothic,
+  ucp_Deseret,
+  ucp_Inherited,
+  ucp_Ugaritic,
+  ucp_Shavian,
   ucp_Osmanya,
-  ucp_Runic,
-  ucp_Shavian,
-  ucp_Sinhala,
-  ucp_Syloti_Nagri,
-  ucp_Syriac,
-  ucp_Tagalog,
-  ucp_Tagbanwa,
-  ucp_Tai_Le,
-  ucp_Tamil,
-  ucp_Telugu,
-  ucp_Thaana,
-  ucp_Thai,
-  ucp_Tibetan,
+  ucp_Braille,
+  ucp_New_Tai_Lue,
   ucp_Tifinagh,
-  ucp_Ugaritic,
-  ucp_Yi,
-  /* New for Unicode 5.0 */
+  ucp_Old_Persian,
+  ucp_Kharoshthi,
   ucp_Balinese,
   ucp_Cuneiform,
-  ucp_Nko,
-  ucp_Phags_Pa,
   ucp_Phoenician,
-  /* New for Unicode 5.1 */
-  ucp_Carian,
-  ucp_Cham,
-  ucp_Kayah_Li,
+  ucp_Sundanese,
   ucp_Lepcha,
+  ucp_Ol_Chiki,
+  ucp_Vai,
+  ucp_Saurashtra,
+  ucp_Rejang,
   ucp_Lycian,
+  ucp_Carian,
   ucp_Lydian,
-  ucp_Ol_Chiki,
-  ucp_Rejang,
-  ucp_Saurashtra,
-  ucp_Sundanese,
-  ucp_Vai,
-  /* New for Unicode 5.2 */
+  ucp_Cham,
+  ucp_Tai_Tham,
+  ucp_Tai_Viet,
   ucp_Avestan,
-  ucp_Bamum,
   ucp_Egyptian_Hieroglyphs,
-  ucp_Imperial_Aramaic,
-  ucp_Inscriptional_Pahlavi,
-  ucp_Inscriptional_Parthian,
-  ucp_Javanese,
-  ucp_Kaithi,
+  ucp_Samaritan,
   ucp_Lisu,
+  ucp_Bamum,
   ucp_Meetei_Mayek,
+  ucp_Imperial_Aramaic,
   ucp_Old_South_Arabian,
+  ucp_Inscriptional_Parthian,
+  ucp_Inscriptional_Pahlavi,
   ucp_Old_Turkic,
-  ucp_Samaritan,
-  ucp_Tai_Tham,
-  ucp_Tai_Viet,
-  /* New for Unicode 6.0.0 */
   ucp_Batak,
   ucp_Brahmi,
-  ucp_Mandaic,
-  /* New for Unicode 6.1.0 */
-  ucp_Chakma,
   ucp_Meroitic_Cursive,
   ucp_Meroitic_Hieroglyphs,
   ucp_Miao,
-  ucp_Sharada,
   ucp_Sora_Sompeng,
-  ucp_Takri,
-  /* New for Unicode 7.0.0 */
+  ucp_Caucasian_Albanian,
   ucp_Bassa_Vah,
-  ucp_Caucasian_Albanian,
-  ucp_Duployan,
   ucp_Elbasan,
-  ucp_Grantha,
-  ucp_Khojki,
-  ucp_Khudawadi,
-  ucp_Linear_A,
-  ucp_Mahajani,
-  ucp_Manichaean,
+  ucp_Pahawh_Hmong,
   ucp_Mende_Kikakui,
-  ucp_Modi,
   ucp_Mro,
+  ucp_Old_North_Arabian,
   ucp_Nabataean,
-  ucp_Old_North_Arabian,
-  ucp_Old_Permic,
-  ucp_Pahawh_Hmong,
   ucp_Palmyrene,
-  ucp_Psalter_Pahlavi,
   ucp_Pau_Cin_Hau,
   ucp_Siddham,
-  ucp_Tirhuta,
   ucp_Warang_Citi,
-  /* New for Unicode 8.0.0 */
   ucp_Ahom,
   ucp_Anatolian_Hieroglyphs,
   ucp_Hatran,
-  ucp_Multani,
   ucp_Old_Hungarian,
   ucp_SignWriting,
-  /* New for Unicode 10.0.0 (no update since 8.0.0) */
-  ucp_Adlam,
   ucp_Bhaiksuki,
   ucp_Marchen,
   ucp_Newa,
   ucp_Osage,
   ucp_Tangut,
-  ucp_Masaram_Gondi,
   ucp_Nushu,
   ucp_Soyombo,
   ucp_Zanabazar_Square,
-  /* New for Unicode 11.0.0 */
-  ucp_Dogra,
-  ucp_Gunjala_Gondi,
-  ucp_Hanifi_Rohingya,
   ucp_Makasar,
   ucp_Medefaidrin,
   ucp_Old_Sogdian,
-  ucp_Sogdian,
-  /* New for Unicode 12.0.0 */
   ucp_Elymaic,
-  ucp_Nandinagari,
   ucp_Nyiakeng_Puachue_Hmong,
   ucp_Wancho,
-  /* New for Unicode 13.0.0 */
   ucp_Chorasmian,
   ucp_Dives_Akuru,
   ucp_Khitan_Small_Script,
-  ucp_Yezidi,
-  /* New for Unicode 14.0.0 */
-  ucp_Cypro_Minoan,
-  ucp_Old_Uyghur,
   ucp_Tangsa,
   ucp_Toto,
-  ucp_Vithkuqi
+  ucp_Vithkuqi,
+
+  /* This must be last */
+  ucp_Script_Count
 };
 
+/* Size of entries in ucd_script_sets[] */
+
+#define ucd_script_sets_item_size 3
+
 #endif  /* PCRE2_UCP_H_IDEMPOTENT_GUARD */
 
 /* End of pcre2_ucp.h */

Modified: branches/4.0/MgDev/Oem/php/include/ext/pcre/php_pcre.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/pcre/php_pcre.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/pcre/php_pcre.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -27,7 +27,6 @@
 
 PHPAPI zend_string *php_pcre_replace(zend_string *regex, zend_string *subject_str, const char *subject, size_t subject_len, zend_string *replace_str, size_t limit, size_t *replace_count);
 PHPAPI pcre2_code* pcre_get_compiled_regex(zend_string *regex, uint32_t *capture_count);
-PHPAPI pcre2_code* pcre_get_compiled_regex_ex(zend_string *regex, uint32_t *capture_count, uint32_t *preg_options, uint32_t *coptions);
 
 extern zend_module_entry pcre_module_entry;
 #define pcre_module_ptr &pcre_module_entry

Modified: branches/4.0/MgDev/Oem/php/include/ext/pdo/php_pdo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/pdo/php_pdo.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/pdo/php_pdo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -53,6 +53,8 @@
 #define REGISTER_PDO_CLASS_CONST_STRING(const_name, value) \
 	zend_declare_class_constant_stringl(php_pdo_get_dbh_ce(), const_name, sizeof(const_name)-1, value, sizeof(value)-1);
 
+#define LONG_CONST(c) (zend_long) c
+
 #define PDO_CONSTRUCT_CHECK \
 	if (!dbh->driver) { \
 		zend_throw_error(NULL, "PDO object is not initialized, constructor was not called"); \

Modified: branches/4.0/MgDev/Oem/php/include/ext/pdo/php_pdo_driver.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/pdo/php_pdo_driver.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/pdo/php_pdo_driver.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -672,7 +672,7 @@
 PDO_API int pdo_parse_params(pdo_stmt_t *stmt, zend_string *inquery, zend_string **outquery);
 
 PDO_API void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt,
-	const char *sqlstate, const char *supp);
+	pdo_error_type sqlstate, const char *supp);
 
 PDO_API void php_pdo_dbh_addref(pdo_dbh_t *dbh);
 PDO_API void php_pdo_dbh_delref(pdo_dbh_t *dbh);

Added: branches/4.0/MgDev/Oem/php/include/ext/random/php_random.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/random/php_random.h	                        (rev 0)
+++ branches/4.0/MgDev/Oem/php/include/ext/random/php_random.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -0,0 +1,355 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright (c) The PHP Group                                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.01 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | https://www.php.net/license/3_01.txt                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license at php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Authors: Rasmus Lerdorf <rasmus at php.net>                             |
+   |          Zeev Suraski <zeev at php.net>                                 |
+   |          Sascha Schumann <sascha at schumann.cx>                        |
+   |          Pedro Melo <melo at ip.pt>                                     |
+   |          Sterling Hughes <sterling at php.net>                          |
+   |          Sammy Kaye Powers <me at sammyk.me>                            |
+   |          Go Kudo <zeriyoshi at php.net>                                 |
+   |                                                                      |
+   | Based on code from: Richard J. Wagner <rjwagner at writeme.com>         |
+   |                     Makoto Matsumoto <matumoto at math.keio.ac.jp>      |
+   |                     Takuji Nishimura                                 |
+   |                     Shawn Cokus <Cokus at math.washington.edu>          |
+   |                     David Blackman                                   |
+   |                     Sebastiano Vigna <vigna at acm.org>                 |
+   |                     Melissa O'Neill <oneill at pcg-random.org>          |
+   +----------------------------------------------------------------------+
+*/
+
+#ifndef PHP_RANDOM_H
+# define PHP_RANDOM_H
+
+# include "php.h"
+
+PHPAPI double php_combined_lcg(void);
+
+/*
+ * A bit of tricky math here.  We want to avoid using a modulus because
+ * that simply tosses the high-order bits and might skew the distribution
+ * of random values over the range.  Instead we map the range directly.
+ *
+ * We need to map the range from 0...M evenly to the range a...b
+ * Let n = the random number and n' = the mapped random number
+ *
+ * Then we have: n' = a + n(b-a)/M
+ *
+ * We have a problem here in that only n==M will get mapped to b which
+ * means the chances of getting b is much much less than getting any of
+ * the other values in the range.  We can fix this by increasing our range
+ * artificially and using:
+ *
+ *               n' = a + n(b-a+1)/M
+ *
+ * Now we only have a problem if n==M which would cause us to produce a
+ * number of b+1 which would be bad.  So we bump M up by one to make sure
+ * this will never happen, and the final algorithm looks like this:
+ *
+ *               n' = a + n(b-a+1)/(M+1)
+ *
+ * -RL
+ */
+# define RAND_RANGE_BADSCALING(__n, __min, __max, __tmax) \
+	(__n) = (__min) + (zend_long) ((double) ( (double) (__max) - (__min) + 1.0) * ((__n) / ((__tmax) + 1.0)))
+
+# ifdef PHP_WIN32
+#  define GENERATE_SEED() (((zend_long) ((zend_ulong) time(NULL) * (zend_ulong) GetCurrentProcessId())) ^ ((zend_long) (1000000.0 * php_combined_lcg())))
+# else
+#  define GENERATE_SEED() (((zend_long) ((zend_ulong) time(NULL) * (zend_ulong) getpid())) ^ ((zend_long) (1000000.0 * php_combined_lcg())))
+# endif
+
+# define PHP_MT_RAND_MAX ((zend_long) (0x7FFFFFFF)) /* (1<<31) - 1 */
+
+# define MT_RAND_MT19937 0
+# define MT_RAND_PHP 1
+
+# define MT_N (624)
+
+#define PHP_RANDOM_RANGE_ATTEMPTS (50)
+
+PHPAPI void php_mt_srand(uint32_t seed);
+PHPAPI uint32_t php_mt_rand(void);
+PHPAPI zend_long php_mt_rand_range(zend_long min, zend_long max);
+PHPAPI zend_long php_mt_rand_common(zend_long min, zend_long max);
+
+# ifndef RAND_MAX
+#  define RAND_MAX PHP_MT_RAND_MAX
+# endif
+
+# define PHP_RAND_MAX PHP_MT_RAND_MAX
+
+PHPAPI void php_srand(zend_long seed);
+PHPAPI zend_long php_rand(void);
+
+# if !defined(__SIZEOF_INT128__) || defined(PHP_RANDOM_FORCE_EMULATE_128)
+typedef struct _php_random_uint128_t {
+	uint64_t hi;
+	uint64_t lo;
+} php_random_uint128_t;
+
+static inline uint64_t php_random_uint128_hi(php_random_uint128_t num)
+{
+	return num.hi;
+}
+
+static inline uint64_t php_random_uint128_lo(php_random_uint128_t num)
+{
+	return num.lo;
+}
+
+static inline php_random_uint128_t php_random_uint128_constant(uint64_t hi, uint64_t lo)
+{
+	php_random_uint128_t r;
+
+	r.hi = hi;
+	r.lo = lo;
+
+	return r;
+}
+
+static inline php_random_uint128_t php_random_uint128_add(php_random_uint128_t num1, php_random_uint128_t num2)
+{
+	php_random_uint128_t r;
+
+	r.lo = (num1.lo + num2.lo);
+	r.hi = (num1.hi + num2.hi + (r.lo < num1.lo));
+
+	return r;
+}
+
+static inline php_random_uint128_t php_random_uint128_multiply(php_random_uint128_t num1, php_random_uint128_t num2)
+{
+	php_random_uint128_t r;
+	const uint64_t
+		x0 = num1.lo & 0xffffffffULL,
+		x1 = num1.lo >> 32,
+		y0 = num2.lo & 0xffffffffULL,
+		y1 = num2.lo >> 32,
+		z0 = (((x1 * y0) + (x0 * y0 >> 32)) & 0xffffffffULL) + x0 * y1;
+
+	r.hi = num1.hi * num2.lo + num1.lo * num2.hi;
+	r.lo = num1.lo * num2.lo;
+	r.hi += x1 * y1 + ((x1 * y0 + (x0 * y0 >> 32)) >> 32) + (z0 >> 32);
+
+	return r;
+}
+
+static inline uint64_t php_random_pcgoneseq128xslrr64_rotr64(php_random_uint128_t num)
+{
+	const uint64_t
+		v = (num.hi ^ num.lo),
+		s = num.hi >> 58U;
+
+	return (v >> s) | (v << ((-s) & 63));
+}
+# else
+typedef __uint128_t php_random_uint128_t;
+
+static inline uint64_t php_random_uint128_hi(php_random_uint128_t num)
+{
+	return (uint64_t) (num >> 64);
+}
+
+static inline uint64_t php_random_uint128_lo(php_random_uint128_t num)
+{
+	return (uint64_t) num;
+}
+
+static inline php_random_uint128_t php_random_uint128_constant(uint64_t hi, uint64_t lo)
+{
+	php_random_uint128_t r;
+
+	r = ((php_random_uint128_t) hi << 64) + lo;
+
+	return r;
+}
+
+static inline php_random_uint128_t php_random_uint128_add(php_random_uint128_t num1, php_random_uint128_t num2)
+{
+	return num1 + num2;
+}
+
+static inline php_random_uint128_t php_random_uint128_multiply(php_random_uint128_t num1, php_random_uint128_t num2)
+{
+	return num1 * num2;
+}
+
+static inline uint64_t php_random_pcgoneseq128xslrr64_rotr64(php_random_uint128_t num)
+{
+	const uint64_t
+		v = ((uint64_t) (num >> 64U)) ^ (uint64_t) num,
+		s = num >> 122U;
+
+	return (v >> s) | (v << ((-s) & 63));
+}
+# endif
+
+PHPAPI zend_result php_random_bytes(void *bytes, size_t size, bool should_throw);
+PHPAPI zend_result php_random_int(zend_long min, zend_long max, zend_long *result, bool should_throw);
+
+static inline zend_result php_random_bytes_throw(void *bytes, size_t size)
+{
+	return php_random_bytes(bytes, size, true);
+}
+
+static inline zend_result php_random_bytes_silent(void *bytes, size_t size)
+{
+	return php_random_bytes(bytes, size, false);
+}
+
+static inline zend_result php_random_int_throw(zend_long min, zend_long max, zend_long *result)
+{
+	return php_random_int(min, max, result, true);
+}
+
+static inline zend_result php_random_int_silent(zend_long min, zend_long max, zend_long *result)
+{
+	return php_random_int(min, max, result, false);
+}
+
+typedef struct _php_random_status_ {
+	size_t last_generated_size;
+	void *state;
+} php_random_status;
+
+typedef struct _php_random_status_state_combinedlcg {
+	int32_t state[2];
+} php_random_status_state_combinedlcg;
+
+typedef struct _php_random_status_state_mt19937 {
+	uint32_t state[MT_N];
+	uint32_t count;
+	uint8_t mode;
+} php_random_status_state_mt19937;
+
+typedef struct _php_random_status_state_pcgoneseq128xslrr64 {
+	php_random_uint128_t state;
+} php_random_status_state_pcgoneseq128xslrr64;
+
+typedef struct _php_random_status_state_xoshiro256starstar {
+	uint64_t state[4];
+} php_random_status_state_xoshiro256starstar;
+
+typedef struct _php_random_status_state_user {
+	zend_object *object;
+	zend_function *generate_method;
+} php_random_status_state_user;
+
+typedef struct _php_random_algo {
+	const size_t generate_size;
+	const size_t state_size;
+	void (*seed)(php_random_status *status, uint64_t seed);
+	uint64_t (*generate)(php_random_status *status);
+	zend_long (*range)(php_random_status *status, zend_long min, zend_long max);
+	bool (*serialize)(php_random_status *status, HashTable *data);
+	bool (*unserialize)(php_random_status *status, HashTable *data);
+} php_random_algo;
+
+extern PHPAPI const php_random_algo php_random_algo_combinedlcg;
+extern PHPAPI const php_random_algo php_random_algo_mt19937;
+extern PHPAPI const php_random_algo php_random_algo_pcgoneseq128xslrr64;
+extern PHPAPI const php_random_algo php_random_algo_xoshiro256starstar;
+extern PHPAPI const php_random_algo php_random_algo_secure;
+extern PHPAPI const php_random_algo php_random_algo_user;
+
+typedef struct _php_random_engine {
+	const php_random_algo *algo;
+	php_random_status *status;
+	zend_object std;
+} php_random_engine;
+
+typedef struct _php_random_randomizer {
+	const php_random_algo *algo;
+	php_random_status *status;
+	bool is_userland_algo;
+	zend_object std;
+} php_random_randomizer;
+
+extern PHPAPI zend_class_entry *random_ce_Random_Engine;
+extern PHPAPI zend_class_entry *random_ce_Random_CryptoSafeEngine;
+
+extern PHPAPI zend_class_entry *random_ce_Random_RandomError;
+extern PHPAPI zend_class_entry *random_ce_Random_BrokenRandomEngineError;
+extern PHPAPI zend_class_entry *random_ce_Random_RandomException;
+
+extern PHPAPI zend_class_entry *random_ce_Random_Engine_PcgOneseq128XslRr64;
+extern PHPAPI zend_class_entry *random_ce_Random_Engine_Mt19937;
+extern PHPAPI zend_class_entry *random_ce_Random_Engine_Xoshiro256StarStar;
+extern PHPAPI zend_class_entry *random_ce_Random_Engine_Secure;
+
+extern PHPAPI zend_class_entry *random_ce_Random_Randomizer;
+
+extern PHPAPI zend_class_entry *random_ce_Random_IntervalBoundary;
+
+static inline php_random_engine *php_random_engine_from_obj(zend_object *object) {
+	return (php_random_engine *)((char *)(object) - XtOffsetOf(php_random_engine, std));
+}
+
+static inline php_random_randomizer *php_random_randomizer_from_obj(zend_object *object) {
+	return (php_random_randomizer *)((char *)(object) - XtOffsetOf(php_random_randomizer, std));
+}
+
+# define Z_RANDOM_ENGINE_P(zval) php_random_engine_from_obj(Z_OBJ_P(zval))
+
+# define Z_RANDOM_RANDOMIZER_P(zval) php_random_randomizer_from_obj(Z_OBJ_P(zval));
+
+PHPAPI php_random_status *php_random_status_alloc(const php_random_algo *algo, const bool persistent);
+PHPAPI php_random_status *php_random_status_copy(const php_random_algo *algo, php_random_status *old_status, php_random_status *new_status);
+PHPAPI void php_random_status_free(php_random_status *status, const bool persistent);
+PHPAPI php_random_engine *php_random_engine_common_init(zend_class_entry *ce, zend_object_handlers *handlers, const php_random_algo *algo);
+PHPAPI void php_random_engine_common_free_object(zend_object *object);
+PHPAPI zend_object *php_random_engine_common_clone_object(zend_object *object);
+PHPAPI uint32_t php_random_range32(const php_random_algo *algo, php_random_status *status, uint32_t umax);
+PHPAPI uint64_t php_random_range64(const php_random_algo *algo, php_random_status *status, uint64_t umax);
+PHPAPI zend_long php_random_range(const php_random_algo *algo, php_random_status *status, zend_long min, zend_long max);
+PHPAPI const php_random_algo *php_random_default_algo(void);
+PHPAPI php_random_status *php_random_default_status(void);
+
+PHPAPI zend_string *php_random_bin2hex_le(const void *ptr, const size_t len);
+PHPAPI bool php_random_hex2bin_le(zend_string *hexstr, void *dest);
+
+PHPAPI void php_random_combinedlcg_seed_default(php_random_status_state_combinedlcg *state);
+
+PHPAPI void php_random_mt19937_seed_default(php_random_status_state_mt19937 *state);
+
+PHPAPI void php_random_pcgoneseq128xslrr64_advance(php_random_status_state_pcgoneseq128xslrr64 *state, uint64_t advance);
+
+PHPAPI void php_random_xoshiro256starstar_jump(php_random_status_state_xoshiro256starstar *state);
+PHPAPI void php_random_xoshiro256starstar_jump_long(php_random_status_state_xoshiro256starstar *state);
+
+PHPAPI double php_random_gammasection_closed_open(const php_random_algo *algo, php_random_status *status, double min, double max);
+PHPAPI double php_random_gammasection_closed_closed(const php_random_algo *algo, php_random_status *status, double min, double max);
+PHPAPI double php_random_gammasection_open_closed(const php_random_algo *algo, php_random_status *status, double min, double max);
+PHPAPI double php_random_gammasection_open_open(const php_random_algo *algo, php_random_status *status, double min, double max);
+
+extern zend_module_entry random_module_entry;
+# define phpext_random_ptr &random_module_entry
+
+PHP_MINIT_FUNCTION(random);
+PHP_MSHUTDOWN_FUNCTION(random);
+PHP_RINIT_FUNCTION(random);
+
+ZEND_BEGIN_MODULE_GLOBALS(random)
+	php_random_status *combined_lcg;
+	bool combined_lcg_seeded;
+	php_random_status *mt19937;
+	bool mt19937_seeded;
+	int random_fd;
+ZEND_END_MODULE_GLOBALS(random)
+
+PHPAPI ZEND_EXTERN_MODULE_GLOBALS(random)
+
+# define RANDOM_G(v)	ZEND_MODULE_GLOBALS_ACCESSOR(random, v)
+
+#endif	/* PHP_RANDOM_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/session/php_session.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/session/php_session.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/session/php_session.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -26,7 +26,6 @@
 #define PHP_SESSION_VERSION PHP_VERSION
 
 /* save handler macros */
-#define PS_NUM_APIS      9
 #define PS_OPEN_ARGS     void **mod_data, const char *save_path, const char *session_name
 #define PS_CLOSE_ARGS    void **mod_data
 #define PS_READ_ARGS     void **mod_data, zend_string *key, zend_string **val, zend_long maxlifetime
@@ -39,29 +38,29 @@
 
 typedef struct ps_module_struct {
 	const char *s_name;
-	int (*s_open)(PS_OPEN_ARGS);
-	int (*s_close)(PS_CLOSE_ARGS);
-	int (*s_read)(PS_READ_ARGS);
-	int (*s_write)(PS_WRITE_ARGS);
-	int (*s_destroy)(PS_DESTROY_ARGS);
+	zend_result (*s_open)(PS_OPEN_ARGS);
+	zend_result (*s_close)(PS_CLOSE_ARGS);
+	zend_result (*s_read)(PS_READ_ARGS);
+	zend_result (*s_write)(PS_WRITE_ARGS);
+	zend_result (*s_destroy)(PS_DESTROY_ARGS);
 	zend_long (*s_gc)(PS_GC_ARGS);
 	zend_string *(*s_create_sid)(PS_CREATE_SID_ARGS);
-	int (*s_validate_sid)(PS_VALIDATE_SID_ARGS);
-	int (*s_update_timestamp)(PS_UPDATE_TIMESTAMP_ARGS);
+	zend_result (*s_validate_sid)(PS_VALIDATE_SID_ARGS);
+	zend_result (*s_update_timestamp)(PS_UPDATE_TIMESTAMP_ARGS);
 } ps_module;
 
 #define PS_GET_MOD_DATA() *mod_data
 #define PS_SET_MOD_DATA(a) *mod_data = (a)
 
-#define PS_OPEN_FUNC(x) 	int ps_open_##x(PS_OPEN_ARGS)
-#define PS_CLOSE_FUNC(x) 	int ps_close_##x(PS_CLOSE_ARGS)
-#define PS_READ_FUNC(x) 	int ps_read_##x(PS_READ_ARGS)
-#define PS_WRITE_FUNC(x) 	int ps_write_##x(PS_WRITE_ARGS)
-#define PS_DESTROY_FUNC(x) 	int ps_delete_##x(PS_DESTROY_ARGS)
+#define PS_OPEN_FUNC(x) 	zend_result ps_open_##x(PS_OPEN_ARGS)
+#define PS_CLOSE_FUNC(x) 	zend_result ps_close_##x(PS_CLOSE_ARGS)
+#define PS_READ_FUNC(x) 	zend_result ps_read_##x(PS_READ_ARGS)
+#define PS_WRITE_FUNC(x) 	zend_result ps_write_##x(PS_WRITE_ARGS)
+#define PS_DESTROY_FUNC(x) 	zend_result ps_delete_##x(PS_DESTROY_ARGS)
 #define PS_GC_FUNC(x) 		zend_long ps_gc_##x(PS_GC_ARGS)
 #define PS_CREATE_SID_FUNC(x)	zend_string *ps_create_sid_##x(PS_CREATE_SID_ARGS)
-#define PS_VALIDATE_SID_FUNC(x)	int ps_validate_sid_##x(PS_VALIDATE_SID_ARGS)
-#define PS_UPDATE_TIMESTAMP_FUNC(x) 	int ps_update_timestamp_##x(PS_UPDATE_TIMESTAMP_ARGS)
+#define PS_VALIDATE_SID_FUNC(x)	zend_result ps_validate_sid_##x(PS_VALIDATE_SID_ARGS)
+#define PS_UPDATE_TIMESTAMP_FUNC(x) 	zend_result ps_update_timestamp_##x(PS_UPDATE_TIMESTAMP_ARGS)
 
 /* Legacy save handler module definitions */
 #define PS_FUNCS(x) \
@@ -155,27 +154,27 @@
 	const ps_module *default_mod;
 	void *mod_data;
 	php_session_status session_status;
+	zend_string *session_started_filename;
+	uint32_t session_started_lineno;
 	zend_long gc_probability;
 	zend_long gc_divisor;
 	zend_long gc_maxlifetime;
 	int module_number;
 	zend_long cache_expire;
-	union {
-		zval names[PS_NUM_APIS];
-		struct {
-			zval ps_open;
-			zval ps_close;
-			zval ps_read;
-			zval ps_write;
-			zval ps_destroy;
-			zval ps_gc;
-			zval ps_create_sid;
-			zval ps_validate_sid;
-			zval ps_update_timestamp;
-		} name;
+	struct {
+		zval ps_open;
+		zval ps_close;
+		zval ps_read;
+		zval ps_write;
+		zval ps_destroy;
+		zval ps_gc;
+		zval ps_create_sid;
+		zval ps_validate_sid;
+		zval ps_update_timestamp;
 	} mod_user_names;
-	int mod_user_implemented;
-	int mod_user_is_open;
+	bool mod_user_implemented;
+	bool mod_user_is_open;
+	zend_string *mod_user_class_name;
 	const struct ps_serializer_struct *serializer;
 	zval http_session_vars;
 	bool auto_start;
@@ -185,8 +184,8 @@
 
 	zend_long sid_length;
 	zend_long sid_bits_per_character;
-	int send_cookie;
-	int define_sid;
+	bool send_cookie;
+	bool define_sid;
 
 	php_session_rfc1867_progress *rfc1867_progress;
 	bool rfc1867_enabled; /* session.upload_progress.enabled */
@@ -223,7 +222,7 @@
 typedef struct ps_serializer_struct {
 	const char *name;
 	zend_string *(*encode)(PS_SERIALIZER_ENCODE_ARGS);
-	int (*decode)(PS_SERIALIZER_DECODE_ARGS);
+	zend_result (*decode)(PS_SERIALIZER_DECODE_ARGS);
 } ps_serializer;
 
 #define PS_SERIALIZER_ENCODE_NAME(x) ps_srlzr_encode_##x
@@ -232,7 +231,7 @@
 #define PS_SERIALIZER_ENCODE_FUNC(x) \
 	zend_string *PS_SERIALIZER_ENCODE_NAME(x)(PS_SERIALIZER_ENCODE_ARGS)
 #define PS_SERIALIZER_DECODE_FUNC(x) \
-	int PS_SERIALIZER_DECODE_NAME(x)(PS_SERIALIZER_DECODE_ARGS)
+	zend_result PS_SERIALIZER_DECODE_NAME(x)(PS_SERIALIZER_DECODE_ARGS)
 
 #define PS_SERIALIZER_FUNCS(x) \
 	PS_SERIALIZER_ENCODE_FUNC(x); \
@@ -244,30 +243,30 @@
 /* default create id function */
 PHPAPI zend_string *php_session_create_id(PS_CREATE_SID_ARGS);
 /* Dummy PS module functions */
-PHPAPI int php_session_validate_sid(PS_VALIDATE_SID_ARGS);
-PHPAPI int php_session_update_timestamp(PS_UPDATE_TIMESTAMP_ARGS);
+PHPAPI zend_result php_session_validate_sid(PS_VALIDATE_SID_ARGS);
+PHPAPI zend_result php_session_update_timestamp(PS_UPDATE_TIMESTAMP_ARGS);
 
 PHPAPI void session_adapt_url(const char *url, size_t url_len, char **new_url, size_t *new_len);
 
-PHPAPI int php_session_destroy(void);
+PHPAPI zend_result php_session_destroy(void);
 PHPAPI void php_add_session_var(zend_string *name);
 PHPAPI zval *php_set_session_var(zend_string *name, zval *state_val, php_unserialize_data_t *var_hash);
 PHPAPI zval *php_get_session_var(zend_string *name);
 
-PHPAPI int php_session_register_module(const ps_module *);
+PHPAPI zend_result php_session_register_module(const ps_module *);
 
-PHPAPI int php_session_register_serializer(const char *name,
+PHPAPI zend_result php_session_register_serializer(const char *name,
 	        zend_string *(*encode)(PS_SERIALIZER_ENCODE_ARGS),
-	        int (*decode)(PS_SERIALIZER_DECODE_ARGS));
+	        zend_result (*decode)(PS_SERIALIZER_DECODE_ARGS));
 
-PHPAPI int php_session_start(void);
-PHPAPI int php_session_flush(int write);
+PHPAPI zend_result php_session_start(void);
+PHPAPI zend_result php_session_flush(int write);
 
 PHPAPI const ps_module *_php_find_ps_module(const char *name);
 PHPAPI const ps_serializer *_php_find_ps_serializer(const char *name);
 
-PHPAPI int php_session_valid_key(const char *key);
-PHPAPI int php_session_reset_id(void);
+PHPAPI zend_result php_session_valid_key(const char *key);
+PHPAPI zend_result php_session_reset_id(void);
 
 #define PS_ADD_VARL(name) do {										\
 	php_add_session_var(name);							\

Modified: branches/4.0/MgDev/Oem/php/include/ext/sockets/php_sockets.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/sockets/php_sockets.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/sockets/php_sockets.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -126,7 +126,7 @@
 };
 
 PHP_SOCKETS_API char *sockets_strerror(int error);
-PHP_SOCKETS_API int socket_import_file_descriptor(PHP_SOCKET socket, php_socket *retsock);
+PHP_SOCKETS_API bool socket_import_file_descriptor(PHP_SOCKET socket, php_socket *retsock);
 
 #else
 #define phpext_sockets_ptr NULL
@@ -136,4 +136,271 @@
 # define ss_family __ss_family
 #endif
 
+#ifndef MSG_EOF
+#ifdef MSG_FIN
+#define MSG_EOF MSG_FIN
 #endif
+#endif
+
+#ifndef MSG_WAITALL
+#ifdef LINUX
+#define MSG_WAITALL 0x00000100
+#else
+#define MSG_WAITALL 0x00000000
+#endif
+#endif
+
+#define PHP_NORMAL_READ 0x0001
+#define PHP_BINARY_READ 0x0002
+
+#ifdef WIN32
+#define PHP_SOCKET_EINTR WSAEINTR
+#elif defined(EINTR)
+#define PHP_SOCKET_EINTR EINTR
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EBADF WSAEBADF
+#elif defined(EBADF)
+#define PHP_SOCKET_EBADF EBADF
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EACCES WSAEACCES
+#elif defined(EACCES)
+#define PHP_SOCKET_EACCES EACCES
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EFAULT WSAEFAULT
+#elif defined(EFAULT)
+#define PHP_SOCKET_EFAULT EFAULT
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EINVAL WSAEINVAL
+#elif defined(EINVAL)
+#define PHP_SOCKET_EINVAL EINVAL
+#endif
+
+#ifdef ENFILE
+#define PHP_SOCKET_ENFILE ENFILE
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EMFILE WSAEMFILE
+#elif defined(EMFILE)
+#define PHP_SOCKET_EMFILE EMFILE
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EWOULDBLOCK WSAEWOULDBLOCK
+#elif defined(EWOULDBLOCK)
+#define PHP_SOCKET_EWOULDBLOCK EWOULDBLOCK
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EINPROGRESS WSAEINPROGRESS
+#elif defined(EINPROGRESS)
+#define PHP_SOCKET_EINPROGRESS EINPROGRESS
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EALREADY WSAEALREADY
+#elif defined(EALREADY)
+#define PHP_SOCKET_EALREADY EALREADY
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ENOTSOCK WSAENOTSOCK
+#elif defined(ENOTSOCK)
+#define PHP_SOCKET_ENOTSOCK ENOTSOCK
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EDESTADDRREQ WSAEDESTADDRREQ
+#elif defined(EDESTADDRREQ)
+#define PHP_SOCKET_EDESTADDRREQ EDESTADDRREQ
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EMSGSIZE WSAEMSGSIZE
+#elif defined(EMSGSIZE)
+#define PHP_SOCKET_EMSGSIZE EMSGSIZE
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EPROTOTYPE WSAEPROTOTYPE
+#elif defined(EPROTOTYPE)
+#define PHP_SOCKET_EPROTOTYPE EPROTOTYPE
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ENOPROTOOPT WSAENOPROTOOPT
+#elif defined(ENOPROTOOPT)
+#define PHP_SOCKET_ENOPROTOOPT ENOPROTOOPT
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EPROTONOSUPPORT WSAEPROTONOSUPPORT
+#elif defined(EPROTONOSUPPORT)
+#define PHP_SOCKET_EPROTONOSUPPORT EPROTONOSUPPORT
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
+#elif defined(ESOCKTNOSUPPORT)
+#define PHP_SOCKET_ESOCKTNOSUPPORT ESOCKTNOSUPPORT
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EOPNOTSUPP WSAEOPNOTSUPP
+#elif defined(EOPNOTSUPP)
+#define PHP_SOCKET_EOPNOTSUPP EOPNOTSUPP
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EPFNOSUPPORT WSAEPFNOSUPPORT
+#elif defined(EPFNOSUPPORT)
+#define PHP_SOCKET_EPFNOSUPPORT EPFNOSUPPORT
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EAFNOSUPPORT WSAEAFNOSUPPORT
+#elif defined(EAFNOSUPPORT)
+#define PHP_SOCKET_EAFNOSUPPORT EAFNOSUPPORT
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EADDRINUSE WSAEADDRINUSE
+#elif defined(EADDRINUSE)
+#define PHP_SOCKET_EADDRINUSE EADDRINUSE
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EADDRNOTAVAIL WSAEADDRNOTAVAIL
+#elif defined(EADDRNOTAVAIL)
+#define PHP_SOCKET_EADDRNOTAVAIL EADDRNOTAVAIL
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ENETDOWN WSAENETDOWN
+#elif defined(ENETDOWN)
+#define PHP_SOCKET_ENETDOWN ENETDOWN
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ENETUNREACH WSAENETUNREACH
+#elif defined(ENETUNREACH)
+#define PHP_SOCKET_ENETUNREACH ENETUNREACH
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ENETRESET WSAENETRESET
+#elif defined(ENETRESET)
+#define PHP_SOCKET_ENETRESET ENETRESET
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ECONNABORTED WSAECONNABORTED
+#elif defined(ECONNABORTED)
+#define PHP_SOCKET_ECONNABORTED ECONNABORTED
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ECONNRESET WSAECONNRESET
+#elif defined(ECONNRESET)
+#define PHP_SOCKET_ECONNRESET ECONNRESET
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ENOBUFS WSAENOBUFS
+#elif defined(ENOBUFS)
+#define PHP_SOCKET_ENOBUFS ENOBUFS
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EISCONN WSAEISCONN
+#elif defined(EISCONN)
+#define PHP_SOCKET_EISCONN EISCONN
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ENOTCONN WSAENOTCONN
+#elif defined(ENOTCONN)
+#define PHP_SOCKET_ENOTCONN ENOTCONN
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ESHUTDOWN WSAESHUTDOWN
+#elif defined(ESHUTDOWN)
+#define PHP_SOCKET_ESHUTDOWN ESHUTDOWN
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ETOOMANYREFS WSAETOOMANYREFS
+#elif defined(ETOOMANYREFS)
+#define PHP_SOCKET_ETOOMANYREFS ETOOMANYREFS
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ETIMEDOUT WSAETIMEDOUT
+#elif defined(ETIMEDOUT)
+#define PHP_SOCKET_ETIMEDOUT ETIMEDOUT
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ECONNREFUSED WSAECONNREFUSED
+#elif defined(ECONNREFUSED)
+#define PHP_SOCKET_ECONNREFUSED ECONNREFUSED
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ELOOP WSAELOOP
+#elif defined(ELOOP)
+#define PHP_SOCKET_ELOOP ELOOP
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ENAMETOOLONG WSAENAMETOOLONG
+#elif defined(ENAMETOOLONG)
+#define PHP_SOCKET_ENAMETOOLONG ENAMETOOLONG
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EHOSTDOWN WSAEHOSTDOWN
+#elif defined(EHOSTDOWN)
+#define PHP_SOCKET_EHOSTDOWN EHOSTDOWN
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EHOSTUNREACH WSAEHOSTUNREACH
+#elif defined(EHOSTUNREACH)
+#define PHP_SOCKET_EHOSTUNREACH EHOSTUNREACH
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_ENOTEMPTY WSAENOTEMPTY
+#elif defined(ENOTEMPTY)
+#define PHP_SOCKET_ENOTEMPTY ENOTEMPTY
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EUSERS WSAEUSERS
+#elif defined(EUSERS)
+#define PHP_SOCKET_EUSERS EUSERS
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EDQUOT WSAEDQUOT
+#elif defined(EDQUOT)
+#define PHP_SOCKET_EDQUOT EDQUOT
+#endif
+
+#ifdef WIN32
+#define PHP_SOCKET_EREMOTE WSAEREMOTE
+#elif defined(EREMOTE)
+#define PHP_SOCKET_EREMOTE EREMOTE
+#endif
+
+#endif

Modified: branches/4.0/MgDev/Oem/php/include/ext/sodium/php_libsodium.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/sodium/php_libsodium.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/sodium/php_libsodium.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -26,6 +26,14 @@
 # include "TSRM.h"
 #endif
 
+#define SODIUM_LIBRARY_VERSION() (char *) (void *) sodium_version_string()
+
+#define SODIUM_CRYPTO_BOX_KEYPAIRBYTES() crypto_box_SECRETKEYBYTES + crypto_box_PUBLICKEYBYTES
+
+#define SODIUM_CRYPTO_KX_KEYPAIRBYTES() crypto_kx_SECRETKEYBYTES + crypto_kx_PUBLICKEYBYTES
+
+#define SODIUM_CRYPTO_SIGN_KEYPAIRBYTES() crypto_sign_SECRETKEYBYTES + crypto_sign_PUBLICKEYBYTES
+
 PHP_MINIT_FUNCTION(sodium);
 PHP_MINIT_FUNCTION(sodium_password_hash);
 PHP_MSHUTDOWN_FUNCTION(sodium);
@@ -33,108 +41,4 @@
 PHP_RSHUTDOWN_FUNCTION(sodium);
 PHP_MINFO_FUNCTION(sodium);
 
-PHP_FUNCTION(sodium_add);
-PHP_FUNCTION(sodium_base642bin);
-PHP_FUNCTION(sodium_bin2base64);
-PHP_FUNCTION(sodium_bin2hex);
-PHP_FUNCTION(sodium_compare);
-PHP_FUNCTION(sodium_crypto_aead_aes256gcm_decrypt);
-PHP_FUNCTION(sodium_crypto_aead_aes256gcm_encrypt);
-PHP_FUNCTION(sodium_crypto_aead_aes256gcm_is_available);
-PHP_FUNCTION(sodium_crypto_aead_aes256gcm_keygen);
-PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_decrypt);
-PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_encrypt);
-PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_decrypt);
-PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_encrypt);
-PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_keygen);
-PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_keygen);
-PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_decrypt);
-PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_encrypt);
-PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_keygen);
-PHP_FUNCTION(sodium_crypto_auth);
-PHP_FUNCTION(sodium_crypto_auth_keygen);
-PHP_FUNCTION(sodium_crypto_auth_verify);
-PHP_FUNCTION(sodium_crypto_box);
-PHP_FUNCTION(sodium_crypto_box_keypair);
-PHP_FUNCTION(sodium_crypto_box_keypair_from_secretkey_and_publickey);
-PHP_FUNCTION(sodium_crypto_box_open);
-PHP_FUNCTION(sodium_crypto_box_publickey);
-PHP_FUNCTION(sodium_crypto_box_publickey_from_secretkey);
-PHP_FUNCTION(sodium_crypto_box_seal);
-PHP_FUNCTION(sodium_crypto_box_seal_open);
-PHP_FUNCTION(sodium_crypto_box_secretkey);
-PHP_FUNCTION(sodium_crypto_box_seed_keypair);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_add);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_from_hash);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_is_valid_point);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_random);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_add);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_complement);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_invert);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_mul);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_negate);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_random);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_reduce);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_sub);
-PHP_FUNCTION(sodium_crypto_core_ristretto255_sub);
-PHP_FUNCTION(sodium_crypto_generichash);
-PHP_FUNCTION(sodium_crypto_generichash_final);
-PHP_FUNCTION(sodium_crypto_generichash_init);
-PHP_FUNCTION(sodium_crypto_generichash_keygen);
-PHP_FUNCTION(sodium_crypto_generichash_update);
-PHP_FUNCTION(sodium_crypto_kdf_derive_from_key);
-PHP_FUNCTION(sodium_crypto_kdf_keygen);
-PHP_FUNCTION(sodium_crypto_kx_client_session_keys);
-PHP_FUNCTION(sodium_crypto_kx_keypair);
-PHP_FUNCTION(sodium_crypto_kx_publickey);
-PHP_FUNCTION(sodium_crypto_kx_secretkey);
-PHP_FUNCTION(sodium_crypto_kx_seed_keypair);
-PHP_FUNCTION(sodium_crypto_kx_server_session_keys);
-PHP_FUNCTION(sodium_crypto_pwhash);
-PHP_FUNCTION(sodium_crypto_pwhash_scryptsalsa208sha256);
-PHP_FUNCTION(sodium_crypto_pwhash_scryptsalsa208sha256_str);
-PHP_FUNCTION(sodium_crypto_pwhash_scryptsalsa208sha256_str_verify);
-PHP_FUNCTION(sodium_crypto_pwhash_str);
-PHP_FUNCTION(sodium_crypto_pwhash_str_needs_rehash);
-PHP_FUNCTION(sodium_crypto_pwhash_str_verify);
-PHP_FUNCTION(sodium_crypto_scalarmult);
-PHP_FUNCTION(sodium_crypto_scalarmult_base);
-PHP_FUNCTION(sodium_crypto_scalarmult_ristretto255);
-PHP_FUNCTION(sodium_crypto_scalarmult_ristretto255_base);
-PHP_FUNCTION(sodium_crypto_secretbox);
-PHP_FUNCTION(sodium_crypto_secretbox_keygen);
-PHP_FUNCTION(sodium_crypto_secretbox_open);
-PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_keygen);
-PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_init_push);
-PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_push);
-PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_init_pull);
-PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_pull);
-PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_rekey);
-PHP_FUNCTION(sodium_crypto_shorthash);
-PHP_FUNCTION(sodium_crypto_shorthash_keygen);
-PHP_FUNCTION(sodium_crypto_sign);
-PHP_FUNCTION(sodium_crypto_sign_detached);
-PHP_FUNCTION(sodium_crypto_sign_ed25519_pk_to_curve25519);
-PHP_FUNCTION(sodium_crypto_sign_ed25519_sk_to_curve25519);
-PHP_FUNCTION(sodium_crypto_sign_keypair);
-PHP_FUNCTION(sodium_crypto_sign_keypair_from_secretkey_and_publickey);
-PHP_FUNCTION(sodium_crypto_sign_open);
-PHP_FUNCTION(sodium_crypto_sign_publickey);
-PHP_FUNCTION(sodium_crypto_sign_publickey_from_secretkey);
-PHP_FUNCTION(sodium_crypto_sign_secretkey);
-PHP_FUNCTION(sodium_crypto_sign_seed_keypair);
-PHP_FUNCTION(sodium_crypto_sign_verify_detached);
-PHP_FUNCTION(sodium_crypto_stream);
-PHP_FUNCTION(sodium_crypto_stream_keygen);
-PHP_FUNCTION(sodium_crypto_stream_xor);
-PHP_FUNCTION(sodium_crypto_stream_xchacha20);
-PHP_FUNCTION(sodium_crypto_stream_xchacha20_keygen);
-PHP_FUNCTION(sodium_crypto_stream_xchacha20_xor);
-PHP_FUNCTION(sodium_hex2bin);
-PHP_FUNCTION(sodium_increment);
-PHP_FUNCTION(sodium_memcmp);
-PHP_FUNCTION(sodium_memzero);
-PHP_FUNCTION(sodium_pad);
-PHP_FUNCTION(sodium_unpad);
-
 #endif	/* PHP_LIBSODIUM_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/spl/spl_array.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/spl/spl_array.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/spl/spl_array.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -21,6 +21,18 @@
 #include "php_spl.h"
 #include "spl_iterators.h"
 
+#define SPL_ARRAY_STD_PROP_LIST      0x00000001
+#define SPL_ARRAY_ARRAY_AS_PROPS     0x00000002
+#define SPL_ARRAY_CHILD_ARRAYS_ONLY  0x00000004
+#define SPL_ARRAY_IS_SELF            0x01000000
+#define SPL_ARRAY_USE_OTHER          0x02000000
+#define SPL_ARRAY_INT_MASK           0xFFFF0000
+#define SPL_ARRAY_CLONE_MASK         0x0100FFFF
+
+#define SPL_ARRAY_METHOD_NO_ARG				0
+#define SPL_ARRAY_METHOD_CALLBACK_ARG  		1
+#define SPL_ARRAY_METHOD_SORT_FLAGS_ARG 	2
+
 extern PHPAPI zend_class_entry *spl_ce_ArrayObject;
 extern PHPAPI zend_class_entry *spl_ce_ArrayIterator;
 extern PHPAPI zend_class_entry *spl_ce_RecursiveArrayIterator;

Modified: branches/4.0/MgDev/Oem/php/include/ext/spl/spl_directory.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/spl/spl_directory.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/spl/spl_directory.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -30,18 +30,13 @@
 
 PHP_MINIT_FUNCTION(spl_directory);
 
-typedef enum {
-	SPL_FS_INFO, /* must be 0 */
-	SPL_FS_DIR,
-	SPL_FS_FILE
-} SPL_FS_OBJ_TYPE;
-
+/* Internal objecte structure and helpers for Directory and File SPL objects */
 typedef struct _spl_filesystem_object  spl_filesystem_object;
 
 typedef void (*spl_foreign_dtor_t)(spl_filesystem_object *object);
 typedef void (*spl_foreign_clone_t)(spl_filesystem_object *src, spl_filesystem_object *dst);
 
-PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, size_t *len);
+PHPAPI zend_string *spl_filesystem_object_get_path(spl_filesystem_object *intern);
 
 typedef struct _spl_other_handler {
 	spl_foreign_dtor_t     dtor;
@@ -48,12 +43,11 @@
 	spl_foreign_clone_t    clone;
 } spl_other_handler;
 
-/* define an overloaded iterator structure */
-typedef struct {
-	zend_object_iterator  intern;
-	zval                  current;
-	void                 *object;
-} spl_filesystem_iterator;
+typedef enum {
+	SPL_FS_INFO, /* must be 0 */
+	SPL_FS_DIR,
+	SPL_FS_FILE
+} SPL_FS_OBJ_TYPE;
 
 struct _spl_filesystem_object {
 	void               *oth;
@@ -70,7 +64,6 @@
 			php_stream         *dirp;
 			zend_string        *sub_path;
 			int                index;
-			int                is_recursive;
 			zend_function      *func_rewind;
 			zend_function      *func_next;
 			zend_function      *func_valid;
@@ -96,28 +89,6 @@
 	zend_object        std;
 };
 
-static inline spl_filesystem_object *spl_filesystem_from_obj(zend_object *obj) /* {{{ */ {
-	return (spl_filesystem_object*)((char*)(obj) - XtOffsetOf(spl_filesystem_object, std));
-}
-/* }}} */
-
-#define Z_SPLFILESYSTEM_P(zv)  spl_filesystem_from_obj(Z_OBJ_P((zv)))
-
-static inline spl_filesystem_iterator* spl_filesystem_object_to_iterator(spl_filesystem_object *obj)
-{
-	spl_filesystem_iterator    *it;
-
-	it = ecalloc(1, sizeof(spl_filesystem_iterator));
-	it->object = (void *)obj;
-	zend_iterator_init(&it->intern);
-	return it;
-}
-
-static inline spl_filesystem_object* spl_filesystem_iterator_to_object(spl_filesystem_iterator *it)
-{
-	return (spl_filesystem_object*)it->object;
-}
-
 #define SPL_FILE_OBJECT_DROP_NEW_LINE      0x00000001 /* drop new lines */
 #define SPL_FILE_OBJECT_READ_AHEAD         0x00000002 /* read on rewind/next */
 #define SPL_FILE_OBJECT_SKIP_EMPTY         0x00000004 /* skip empty lines */
@@ -133,6 +104,7 @@
 #define SPL_FILE_DIR_KEY_AS_PATHNAME       0x00000000 /* make RecursiveDirectoryTree::key() return getPathname() */
 #define SPL_FILE_DIR_KEY_AS_FILENAME       0x00000100 /* make RecursiveDirectoryTree::key() return getFilename() */
 #define SPL_FILE_DIR_KEY_MODE_MASK         0x00000F00 /* mask RecursiveDirectoryTree::key() */
+#define SPL_FILE_NEW_CURRENT_AND_KEY       SPL_FILE_DIR_KEY_AS_FILENAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO
 #define SPL_FILE_DIR_KEY(intern,mode)      ((intern->flags&SPL_FILE_DIR_KEY_MODE_MASK)==mode)
 
 #define SPL_FILE_DIR_SKIPDOTS              0x00001000 /* Tells whether it should skip dots or not */

Modified: branches/4.0/MgDev/Oem/php/include/ext/spl/spl_dllist.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/spl/spl_dllist.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/spl/spl_dllist.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -20,6 +20,13 @@
 #include "php.h"
 #include "php_spl.h"
 
+#define SPL_DLLIST_IT_KEEP   0x00000000
+#define SPL_DLLIST_IT_FIFO   0x00000000 /* FIFO flag makes the iterator traverse the structure as a FirstInFirstOut */
+#define SPL_DLLIST_IT_DELETE 0x00000001 /* Delete flag makes the iterator delete the current element on next */
+#define SPL_DLLIST_IT_LIFO   0x00000002 /* LIFO flag makes the iterator traverse the structure as a LastInFirstOut */
+#define SPL_DLLIST_IT_MASK   0x00000003 /* Mask to isolate flags related to iterators */
+#define SPL_DLLIST_IT_FIX    0x00000004 /* Backward/Forward bit is fixed */
+
 extern PHPAPI zend_class_entry *spl_ce_SplDoublyLinkedList;
 extern PHPAPI zend_class_entry *spl_ce_SplQueue;
 extern PHPAPI zend_class_entry *spl_ce_SplStack;

Modified: branches/4.0/MgDev/Oem/php/include/ext/spl/spl_functions.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/spl/spl_functions.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/spl/spl_functions.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -21,9 +21,6 @@
 
 typedef zend_object* (*create_object_func_t)(zend_class_entry *class_type);
 
-#define REGISTER_SPL_CLASS_CONST_LONG(class_name, const_name, value) \
-	zend_declare_class_constant_long(spl_ce_ ## class_name, const_name, sizeof(const_name)-1, (zend_long)value);
-
 /* sub: whether to allow subclasses/interfaces
    allow = 0: allow all classes and interfaces
    allow > 0: allow all that match and mask ce_flags
@@ -32,9 +29,9 @@
 void spl_add_class_name(zval * list, zend_class_entry * pce, int allow, int ce_flags);
 void spl_add_interfaces(zval * list, zend_class_entry * pce, int allow, int ce_flags);
 void spl_add_traits(zval * list, zend_class_entry * pce, int allow, int ce_flags);
-int spl_add_classes(zend_class_entry *pce, zval *list, int sub, int allow, int ce_flags);
+void spl_add_classes(zend_class_entry *pce, zval *list, bool sub, int allow, int ce_flags);
 
 /* caller must efree(return) */
-zend_string *spl_gen_private_prop_name(zend_class_entry *ce, char *prop_name, int prop_len);
+zend_string *spl_gen_private_prop_name(zend_class_entry *ce, char *prop_name, size_t prop_len);
 
 #endif /* PHP_FUNCTIONS_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/spl/spl_heap.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/spl/spl_heap.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/spl/spl_heap.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -20,6 +20,11 @@
 #include "php.h"
 #include "php_spl.h"
 
+#define SPL_PQUEUE_EXTR_MASK     0x00000003
+#define SPL_PQUEUE_EXTR_BOTH     0x00000003
+#define SPL_PQUEUE_EXTR_DATA     0x00000001
+#define SPL_PQUEUE_EXTR_PRIORITY 0x00000002
+
 extern PHPAPI zend_class_entry *spl_ce_SplHeap;
 extern PHPAPI zend_class_entry *spl_ce_SplMinHeap;
 extern PHPAPI zend_class_entry *spl_ce_SplMaxHeap;

Modified: branches/4.0/MgDev/Oem/php/include/ext/spl/spl_iterators.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/spl/spl_iterators.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/spl/spl_iterators.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -19,7 +19,6 @@
 
 #include "php.h"
 #include "php_spl.h"
-#include "ext/pcre/php_pcre.h"
 
 extern PHPAPI zend_class_entry *spl_ce_AppendIterator;
 extern PHPAPI zend_class_entry *spl_ce_CachingIterator;
@@ -44,11 +43,21 @@
 
 PHP_MINIT_FUNCTION(spl_iterators);
 
-PHP_FUNCTION(iterator_apply);
-PHP_FUNCTION(iterator_count);
-PHP_FUNCTION(iterator_to_array);
 
 typedef enum {
+	RIT_LEAVES_ONLY = 0,
+	RIT_SELF_FIRST  = 1,
+	RIT_CHILD_FIRST = 2
+} RecursiveIteratorMode;
+
+#define RIT_CATCH_GET_CHILD CIT_CATCH_GET_CHILD
+
+typedef enum {
+	RTIT_BYPASS_CURRENT = 4,
+	RTIT_BYPASS_KEY	    = 8
+} RecursiveTreeIteratorFlags;
+
+typedef enum {
 	DIT_Default = 0,
 	DIT_FilterIterator = DIT_Default,
 	DIT_RecursiveFilterIterator = DIT_Default,
@@ -103,61 +112,8 @@
 	REGIT_MODE_MAX
 } regex_mode;
 
-typedef struct _spl_cbfilter_it_intern {
-	zend_fcall_info       fci;
-	zend_fcall_info_cache fcc;
-	zend_object           *object;
-} _spl_cbfilter_it_intern;
-
-typedef struct _spl_dual_it_object {
-	struct {
-		zval                 zobject;
-		zend_class_entry     *ce;
-		zend_object          *object;
-		zend_object_iterator *iterator;
-	} inner;
-	struct {
-		zval                 data;
-		zval                 key;
-		zend_long            pos;
-	} current;
-	dual_it_type             dit_type;
-	union {
-		struct {
-			zend_long             offset;
-			zend_long             count;
-		} limit;
-		struct {
-			zend_long             flags; /* CIT_* */
-			zend_string          *zstr;
-			zval             zchildren;
-			zval             zcache;
-		} caching;
-		struct {
-			zval                  zarrayit;
-			zend_object_iterator *iterator;
-		} append;
-		struct {
-			zend_long        flags;
-			zend_long        preg_flags;
-			pcre_cache_entry *pce;
-			zend_string      *regex;
-			regex_mode       mode;
-			int              use_flags;
-		} regex;
-		_spl_cbfilter_it_intern *cbfilter;
-	} u;
-	zend_object              std;
-} spl_dual_it_object;
-
-static inline spl_dual_it_object *spl_dual_it_from_obj(zend_object *obj) /* {{{ */ {
-	return (spl_dual_it_object*)((char*)(obj) - XtOffsetOf(spl_dual_it_object, std));
-} /* }}} */
-
-#define Z_SPLDUAL_IT_P(zv)  spl_dual_it_from_obj(Z_OBJ_P((zv)))
-
 typedef int (*spl_iterator_apply_func_t)(zend_object_iterator *iter, void *puser);
 
-PHPAPI int spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, void *puser);
+PHPAPI zend_result spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, void *puser);
 
 #endif /* SPL_ITERATORS_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/spl/spl_observer.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/spl/spl_observer.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/spl/spl_observer.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -20,6 +20,13 @@
 #include "php.h"
 #include "php_spl.h"
 
+typedef enum {
+	MIT_NEED_ANY     = 0,
+	MIT_NEED_ALL     = 1,
+	MIT_KEYS_NUMERIC = 0,
+	MIT_KEYS_ASSOC   = 2
+} MultipleIteratorFlags;
+
 extern PHPAPI zend_class_entry *spl_ce_SplObserver;
 extern PHPAPI zend_class_entry *spl_ce_SplSubject;
 extern PHPAPI zend_class_entry *spl_ce_SplObjectStorage;

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/base64.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/base64.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/base64.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -19,7 +19,7 @@
 #define BASE64_H
 
 /*
- * NEON implementation is based on https://github.com/WojciechMula/base64simd
+ * NEON and AVX512 implementation are based on https://github.com/WojciechMula/base64simd
  * which is copyrighted to:
  * Copyright (c) 2015-2018, Wojciech Mula
  * All rights reserved.
@@ -57,7 +57,7 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#if (ZEND_INTRIN_AVX2_FUNC_PTR || ZEND_INTRIN_SSSE3_FUNC_PTR) && !ZEND_INTRIN_AVX2_NATIVE
+#if (ZEND_INTRIN_AVX2_FUNC_PTR || ZEND_INTRIN_SSSE3_FUNC_PTR || ZEND_INTRIN_AVX512_FUNC_PTR || ZEND_INTRIN_AVX512_VBMI_FUNC_PTR) && !ZEND_INTRIN_AVX2_NATIVE
 PHP_MINIT_FUNCTION(base64_intrin);
 #endif
 

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/basic_functions.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/basic_functions.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/basic_functions.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -27,6 +27,9 @@
 
 #include "url_scanner_ex.h"
 
+/* for MT_N */
+#include "ext/random/php_random.h"
+
 #if defined(_WIN32) && !defined(__clang__)
 #include <intrin.h>
 #endif
@@ -51,8 +54,6 @@
 PHPAPI int _php_error_log_ex(int opt_err, const char *message, size_t message_len, const char *opt, const char *headers);
 PHPAPI int php_prefix_varname(zval *result, zend_string *prefix, const char *var_name, size_t var_name_len, bool add_underscore);
 
-#define MT_N (624)
-
 /* Deprecated type aliases -- use the standard types instead */
 typedef uint32_t php_uint32;
 typedef int32_t php_int32;
@@ -82,14 +83,6 @@
 	zend_string *CurrentStatFile, *CurrentLStatFile;
 	php_stream_statbuf ssb, lssb;
 
-	/* mt_rand.c */
-	uint32_t state[MT_N+1];  /* state vector + 1 extra to not violate ANSI C */
-	uint32_t *next;       /* next random value is computed from here */
-	int      left;        /* can *next++ this many times before reloading */
-
-	bool mt_rand_is_seeded; /* Whether mt_rand() has been seeded */
-	zend_long mt_rand_mode;
-
 	/* syslog.c */
 	char *syslog_device;
 

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/basic_functions_arginfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/basic_functions_arginfo.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/basic_functions_arginfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: eb6a3a2e3cf8f62e768d5d4968606438819e6cf0 */
+ * Stub hash: 7389d094a842a2289cd32cb37386e5e40ea7e031 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0)
@@ -74,7 +74,7 @@
 	ZEND_ARG_VARIADIC_TYPE_INFO(0, values, IS_MIXED, 0)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_krsort, 0, 1, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_krsort, 0, 1, IS_TRUE, 0)
 	ZEND_ARG_TYPE_INFO(1, array, IS_ARRAY, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "SORT_REGULAR")
 ZEND_END_ARG_INFO()
@@ -88,7 +88,7 @@
 
 #define arginfo_sizeof arginfo_count
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_natsort, 0, 1, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_natsort, 0, 1, IS_TRUE, 0)
 	ZEND_ARG_TYPE_INFO(1, array, IS_ARRAY, 0)
 ZEND_END_ARG_INFO()
 
@@ -102,7 +102,7 @@
 
 #define arginfo_rsort arginfo_krsort
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_usort, 0, 2, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_usort, 0, 2, IS_TRUE, 0)
 	ZEND_ARG_TYPE_INFO(1, array, IS_ARRAY, 0)
 	ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0)
 ZEND_END_ARG_INFO()
@@ -138,7 +138,7 @@
 
 #define arginfo_max arginfo_min
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_walk, 0, 2, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_walk, 0, 2, IS_TRUE, 0)
 	ZEND_ARG_TYPE_MASK(1, array, MAY_BE_ARRAY|MAY_BE_OBJECT, NULL)
 	ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0)
 	ZEND_ARG_TYPE_INFO(0, arg, IS_MIXED, 0)
@@ -181,8 +181,8 @@
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_range, 0, 2, IS_ARRAY, 0)
-	ZEND_ARG_INFO(0, start)
-	ZEND_ARG_INFO(0, end)
+	ZEND_ARG_TYPE_MASK(0, start, MAY_BE_STRING|MAY_BE_LONG|MAY_BE_DOUBLE, NULL)
+	ZEND_ARG_TYPE_MASK(0, end, MAY_BE_STRING|MAY_BE_LONG|MAY_BE_DOUBLE, NULL)
 	ZEND_ARG_TYPE_MASK(0, step, MAY_BE_LONG|MAY_BE_DOUBLE, "1")
 ZEND_END_ARG_INFO()
 
@@ -413,7 +413,7 @@
 	ZEND_ARG_TYPE_INFO(0, microseconds, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
-#if HAVE_NANOSLEEP
+#if defined(HAVE_NANOSLEEP)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_time_nanosleep, 0, 2, MAY_BE_ARRAY|MAY_BE_BOOL)
 	ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0)
 	ZEND_ARG_TYPE_INFO(0, nanoseconds, IS_LONG, 0)
@@ -420,7 +420,7 @@
 ZEND_END_ARG_INFO()
 #endif
 
-#if HAVE_NANOSLEEP
+#if defined(HAVE_NANOSLEEP)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_time_sleep_until, 0, 1, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, timestamp, IS_DOUBLE, 0)
 ZEND_END_ARG_INFO()
@@ -459,7 +459,7 @@
 
 #define arginfo_forward_static_call_array arginfo_call_user_func_array
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_register_shutdown_function, 0, 1, _IS_BOOL, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_register_shutdown_function, 0, 1, IS_VOID, 0)
 	ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0)
 	ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0)
 ZEND_END_ARG_INFO()
@@ -500,6 +500,10 @@
 	ZEND_ARG_TYPE_INFO(0, option, IS_STRING, 0)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ini_parse_quantity, 0, 1, IS_LONG, 0)
+	ZEND_ARG_TYPE_INFO(0, shorthand, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_set_include_path, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, include_path, IS_STRING, 0)
 ZEND_END_ARG_INFO()
@@ -519,7 +523,7 @@
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, enable, _IS_BOOL, 1, "null")
 ZEND_END_ARG_INFO()
 
-#if HAVE_GETSERVBYNAME
+#if defined(HAVE_GETSERVBYNAME)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getservbyname, 0, 2, MAY_BE_LONG|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, service, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, protocol, IS_STRING, 0)
@@ -526,7 +530,7 @@
 ZEND_END_ARG_INFO()
 #endif
 
-#if HAVE_GETSERVBYPORT
+#if defined(HAVE_GETSERVBYPORT)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getservbyport, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, port, IS_LONG, 0)
 	ZEND_ARG_TYPE_INFO(0, protocol, IS_STRING, 0)
@@ -533,13 +537,13 @@
 ZEND_END_ARG_INFO()
 #endif
 
-#if HAVE_GETPROTOBYNAME
+#if defined(HAVE_GETPROTOBYNAME)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getprotobyname, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, protocol, IS_STRING, 0)
 ZEND_END_ARG_INFO()
 #endif
 
-#if HAVE_GETPROTOBYNUMBER
+#if defined(HAVE_GETPROTOBYNUMBER)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getprotobynumber, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, protocol, IS_LONG, 0)
 ZEND_END_ARG_INFO()
@@ -599,7 +603,7 @@
 	ZEND_ARG_TYPE_INFO(0, salt, IS_STRING, 0)
 ZEND_END_ARG_INFO()
 
-#if HAVE_STRPTIME
+#if defined(HAVE_STRPTIME)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strptime, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, timestamp, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0)
@@ -623,7 +627,7 @@
 	ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0)
 ZEND_END_ARG_INFO()
 
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dns_check_record, 0, 1, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_STRING, 0, "\"MX\"")
@@ -630,11 +634,11 @@
 ZEND_END_ARG_INFO()
 #endif
 
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 #define arginfo_checkdnsrr arginfo_dns_check_record
 #endif
 
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dns_get_record, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_LONG, 0, "DNS_ANY")
@@ -644,7 +648,7 @@
 ZEND_END_ARG_INFO()
 #endif
 
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dns_get_mx, 0, 2, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0)
 	ZEND_ARG_INFO(1, hosts)
@@ -652,16 +656,16 @@
 ZEND_END_ARG_INFO()
 #endif
 
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 #define arginfo_getmxrr arginfo_dns_get_mx
 #endif
 
-#if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__)
+#if (defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__))
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_net_get_interfaces, 0, 0, MAY_BE_ARRAY|MAY_BE_FALSE)
 ZEND_END_ARG_INFO()
 #endif
 
-#if HAVE_FTOK
+#if defined(HAVE_FTOK)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftok, 0, 2, IS_LONG, 0)
 	ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, project_id, IS_STRING, 0)
@@ -672,9 +676,6 @@
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, as_number, _IS_BOOL, 0, "false")
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_lcg_value, 0, 0, IS_DOUBLE, 0)
-ZEND_END_ARG_INFO()
-
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_md5, 0, 1, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, binary, _IS_BOOL, 0, "false")
@@ -700,7 +701,7 @@
 #define arginfo_sha1_file arginfo_md5_file
 
 #if defined(HAVE_SYSLOG_H)
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_openlog, 0, 3, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_openlog, 0, 3, IS_TRUE, 0)
 	ZEND_ARG_TYPE_INFO(0, prefix, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0)
 	ZEND_ARG_TYPE_INFO(0, facility, IS_LONG, 0)
@@ -708,12 +709,12 @@
 #endif
 
 #if defined(HAVE_SYSLOG_H)
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_closelog, 0, 0, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_closelog, 0, 0, IS_TRUE, 0)
 ZEND_END_ARG_INFO()
 #endif
 
 #if defined(HAVE_SYSLOG_H)
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_syslog, 0, 2, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_syslog, 0, 2, IS_TRUE, 0)
 	ZEND_ARG_TYPE_INFO(0, priority, IS_LONG, 0)
 	ZEND_ARG_TYPE_INFO(0, message, IS_STRING, 0)
 ZEND_END_ARG_INFO()
@@ -820,7 +821,7 @@
 
 #define arginfo_strcspn arginfo_strspn
 
-#if HAVE_NL_LANGINFO
+#if defined(HAVE_NL_LANGINFO)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_nl_langinfo, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, item, IS_LONG, 0)
 ZEND_END_ARG_INFO()
@@ -871,6 +872,10 @@
 
 #define arginfo_strtolower arginfo_base64_encode
 
+#define arginfo_str_increment arginfo_base64_encode
+
+#define arginfo_str_decrement arginfo_base64_encode
+
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_basename, 0, 1, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, suffix, IS_STRING, 0, "\"\"")
@@ -908,10 +913,7 @@
 
 #define arginfo_strripos arginfo_strpos
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strrchr, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
-	ZEND_ARG_TYPE_INFO(0, haystack, IS_STRING, 0)
-	ZEND_ARG_TYPE_INFO(0, needle, IS_STRING, 0)
-ZEND_END_ARG_INFO()
+#define arginfo_strrchr arginfo_stristr
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_str_contains, 0, 2, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, haystack, IS_STRING, 0)
@@ -1113,7 +1115,7 @@
 	ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
 ZEND_END_ARG_INFO()
 
-#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC
+#if (defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC))
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chroot, 0, 1, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
 ZEND_END_ARG_INFO()
@@ -1151,7 +1153,7 @@
 	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, result_code, "null")
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_passthru, 0, 1, _IS_BOOL, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_passthru, 0, 1, IS_FALSE, 1)
 	ZEND_ARG_TYPE_INFO(0, command, IS_STRING, 0)
 	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, result_code, "null")
 ZEND_END_ARG_INFO()
@@ -1415,7 +1417,7 @@
 	ZEND_ARG_TYPE_MASK(0, group, MAY_BE_STRING|MAY_BE_LONG, NULL)
 ZEND_END_ARG_INFO()
 
-#if HAVE_LCHOWN
+#if defined(HAVE_LCHOWN)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_lchown, 0, 2, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
 	ZEND_ARG_TYPE_MASK(0, user, MAY_BE_STRING|MAY_BE_LONG, NULL)
@@ -1422,7 +1424,7 @@
 ZEND_END_ARG_INFO()
 #endif
 
-#if HAVE_LCHOWN
+#if defined(HAVE_LCHOWN)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_lchgrp, 0, 2, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
 	ZEND_ARG_TYPE_MASK(0, group, MAY_BE_STRING|MAY_BE_LONG, NULL)
@@ -1434,7 +1436,7 @@
 	ZEND_ARG_TYPE_INFO(0, permissions, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
-#if HAVE_UTIME
+#if defined(HAVE_UTIME)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_touch, 0, 1, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mtime, IS_LONG, 1, "null")
@@ -1527,7 +1529,7 @@
 	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, image_info, "null")
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_phpinfo, 0, 0, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_phpinfo, 0, 0, IS_TRUE, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "INFO_ALL")
 ZEND_END_ARG_INFO()
 
@@ -1535,7 +1537,7 @@
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, extension, IS_STRING, 1, "null")
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_phpcredits, 0, 0, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_phpcredits, 0, 0, IS_TRUE, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "CREDITS_ALL")
 ZEND_END_ARG_INFO()
 
@@ -1567,19 +1569,19 @@
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, deletion_cost, IS_LONG, 0, "1")
 ZEND_END_ARG_INFO()
 
-#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
+#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32))
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_readlink, 0, 1, MAY_BE_STRING|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0)
 ZEND_END_ARG_INFO()
 #endif
 
-#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
+#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32))
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_linkinfo, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0)
 ZEND_END_ARG_INFO()
 #endif
 
-#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
+#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32))
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_symlink, 0, 2, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, target, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, link, IS_STRING, 0)
@@ -1586,7 +1588,7 @@
 ZEND_END_ARG_INFO()
 #endif
 
-#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
+#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32))
 #define arginfo_link arginfo_symlink
 #endif
 
@@ -1649,7 +1651,8 @@
 
 #define arginfo_log1p arginfo_sin
 
-#define arginfo_pi arginfo_lcg_value
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pi, 0, 0, IS_DOUBLE, 0)
+ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_is_finite, 0, 1, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, num, IS_DOUBLE, 0)
@@ -1812,33 +1815,6 @@
 
 #define arginfo_quoted_printable_encode arginfo_base64_encode
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mt_srand, 0, 0, IS_VOID, 0)
-	ZEND_ARG_TYPE_INFO(0, seed, IS_LONG, 0)
-	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "MT_RAND_MT19937")
-ZEND_END_ARG_INFO()
-
-#define arginfo_srand arginfo_mt_srand
-
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rand, 0, 0, IS_LONG, 0)
-	ZEND_ARG_TYPE_INFO(0, min, IS_LONG, 0)
-	ZEND_ARG_TYPE_INFO(0, max, IS_LONG, 0)
-ZEND_END_ARG_INFO()
-
-#define arginfo_mt_rand arginfo_rand
-
-#define arginfo_mt_getrandmax arginfo_ob_get_level
-
-#define arginfo_getrandmax arginfo_ob_get_level
-
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_random_bytes, 0, 1, IS_STRING, 0)
-	ZEND_ARG_TYPE_INFO(0, length, IS_LONG, 0)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_random_int, 0, 2, IS_LONG, 0)
-	ZEND_ARG_TYPE_INFO(0, min, IS_LONG, 0)
-	ZEND_ARG_TYPE_INFO(0, max, IS_LONG, 0)
-ZEND_END_ARG_INFO()
-
 #define arginfo_soundex arginfo_base64_encode
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_select, 0, 4, MAY_BE_LONG|MAY_BE_FALSE)
@@ -1870,6 +1846,11 @@
 	ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_set_options, 0, 2, _IS_BOOL, 0)
+	ZEND_ARG_INFO(0, context)
+	ZEND_ARG_TYPE_INFO(0, options, IS_ARRAY, 0)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_get_options, 0, 1, IS_ARRAY, 0)
 	ZEND_ARG_INFO(0, stream_or_context)
 ZEND_END_ARG_INFO()
@@ -1951,7 +1932,7 @@
 ZEND_END_ARG_INFO()
 #endif
 
-#if HAVE_SOCKETPAIR
+#if defined(HAVE_SOCKETPAIR)
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_pair, 0, 3, MAY_BE_ARRAY|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, domain, IS_LONG, 0)
 	ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0)
@@ -2021,7 +2002,7 @@
 
 #define arginfo_stream_set_chunk_size arginfo_stream_set_write_buffer
 
-#if HAVE_SYS_TIME_H || defined(PHP_WIN32)
+#if (defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32))
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_timeout, 0, 2, _IS_BOOL, 0)
 	ZEND_ARG_INFO(0, stream)
 	ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0)
@@ -2029,7 +2010,7 @@
 ZEND_END_ARG_INFO()
 #endif
 
-#if HAVE_SYS_TIME_H || defined(PHP_WIN32)
+#if (defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32))
 #define arginfo_socket_set_timeout arginfo_stream_set_timeout
 #endif
 
@@ -2175,6 +2156,8 @@
 
 #define arginfo_memory_get_peak_usage arginfo_memory_get_usage
 
+#define arginfo_memory_reset_peak_usage arginfo_flush
+
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_version_compare, 0, 2, MAY_BE_LONG|MAY_BE_BOOL)
 	ZEND_ARG_TYPE_INFO(0, version1, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, version2, IS_STRING, 0)
@@ -2332,10 +2315,10 @@
 ZEND_FUNCTION(flush);
 ZEND_FUNCTION(sleep);
 ZEND_FUNCTION(usleep);
-#if HAVE_NANOSLEEP
+#if defined(HAVE_NANOSLEEP)
 ZEND_FUNCTION(time_nanosleep);
 #endif
-#if HAVE_NANOSLEEP
+#if defined(HAVE_NANOSLEEP)
 ZEND_FUNCTION(time_sleep_until);
 #endif
 ZEND_FUNCTION(get_current_user);
@@ -2355,6 +2338,7 @@
 ZEND_FUNCTION(ini_get_all);
 ZEND_FUNCTION(ini_set);
 ZEND_FUNCTION(ini_restore);
+ZEND_FUNCTION(ini_parse_quantity);
 ZEND_FUNCTION(set_include_path);
 ZEND_FUNCTION(get_include_path);
 ZEND_FUNCTION(print_r);
@@ -2361,16 +2345,16 @@
 ZEND_FUNCTION(connection_aborted);
 ZEND_FUNCTION(connection_status);
 ZEND_FUNCTION(ignore_user_abort);
-#if HAVE_GETSERVBYNAME
+#if defined(HAVE_GETSERVBYNAME)
 ZEND_FUNCTION(getservbyname);
 #endif
-#if HAVE_GETSERVBYPORT
+#if defined(HAVE_GETSERVBYPORT)
 ZEND_FUNCTION(getservbyport);
 #endif
-#if HAVE_GETPROTOBYNAME
+#if defined(HAVE_GETPROTOBYNAME)
 ZEND_FUNCTION(getprotobyname);
 #endif
-#if HAVE_GETPROTOBYNUMBER
+#if defined(HAVE_GETPROTOBYNUMBER)
 ZEND_FUNCTION(getprotobynumber);
 #endif
 ZEND_FUNCTION(register_tick_function);
@@ -2388,7 +2372,7 @@
 ZEND_FUNCTION(get_browser);
 ZEND_FUNCTION(crc32);
 ZEND_FUNCTION(crypt);
-#if HAVE_STRPTIME
+#if defined(HAVE_STRPTIME)
 ZEND_FUNCTION(strptime);
 #endif
 #if defined(HAVE_GETHOSTNAME)
@@ -2397,23 +2381,22 @@
 ZEND_FUNCTION(gethostbyaddr);
 ZEND_FUNCTION(gethostbyname);
 ZEND_FUNCTION(gethostbynamel);
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 ZEND_FUNCTION(dns_check_record);
 #endif
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 ZEND_FUNCTION(dns_get_record);
 #endif
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 ZEND_FUNCTION(dns_get_mx);
 #endif
-#if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__)
+#if (defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__))
 ZEND_FUNCTION(net_get_interfaces);
 #endif
-#if HAVE_FTOK
+#if defined(HAVE_FTOK)
 ZEND_FUNCTION(ftok);
 #endif
 ZEND_FUNCTION(hrtime);
-ZEND_FUNCTION(lcg_value);
 ZEND_FUNCTION(md5);
 ZEND_FUNCTION(md5_file);
 ZEND_FUNCTION(getmyuid);
@@ -2457,7 +2440,7 @@
 ZEND_FUNCTION(hex2bin);
 ZEND_FUNCTION(strspn);
 ZEND_FUNCTION(strcspn);
-#if HAVE_NL_LANGINFO
+#if defined(HAVE_NL_LANGINFO)
 ZEND_FUNCTION(nl_langinfo);
 #endif
 ZEND_FUNCTION(strcoll);
@@ -2470,6 +2453,8 @@
 ZEND_FUNCTION(strtok);
 ZEND_FUNCTION(strtoupper);
 ZEND_FUNCTION(strtolower);
+ZEND_FUNCTION(str_increment);
+ZEND_FUNCTION(str_decrement);
 ZEND_FUNCTION(basename);
 ZEND_FUNCTION(dirname);
 ZEND_FUNCTION(pathinfo);
@@ -2527,7 +2512,7 @@
 ZEND_FUNCTION(dir);
 ZEND_FUNCTION(closedir);
 ZEND_FUNCTION(chdir);
-#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC
+#if (defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC))
 ZEND_FUNCTION(chroot);
 #endif
 ZEND_FUNCTION(getcwd);
@@ -2606,14 +2591,14 @@
 ZEND_FUNCTION(lstat);
 ZEND_FUNCTION(chown);
 ZEND_FUNCTION(chgrp);
-#if HAVE_LCHOWN
+#if defined(HAVE_LCHOWN)
 ZEND_FUNCTION(lchown);
 #endif
-#if HAVE_LCHOWN
+#if defined(HAVE_LCHOWN)
 ZEND_FUNCTION(lchgrp);
 #endif
 ZEND_FUNCTION(chmod);
-#if HAVE_UTIME
+#if defined(HAVE_UTIME)
 ZEND_FUNCTION(touch);
 #endif
 ZEND_FUNCTION(clearstatcache);
@@ -2644,16 +2629,16 @@
 ZEND_FUNCTION(iptcembed);
 ZEND_FUNCTION(iptcparse);
 ZEND_FUNCTION(levenshtein);
-#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
+#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32))
 ZEND_FUNCTION(readlink);
 #endif
-#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
+#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32))
 ZEND_FUNCTION(linkinfo);
 #endif
-#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
+#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32))
 ZEND_FUNCTION(symlink);
 #endif
-#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
+#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32))
 ZEND_FUNCTION(link);
 #endif
 ZEND_FUNCTION(mail);
@@ -2729,12 +2714,6 @@
 #endif
 ZEND_FUNCTION(quoted_printable_decode);
 ZEND_FUNCTION(quoted_printable_encode);
-ZEND_FUNCTION(mt_srand);
-ZEND_FUNCTION(rand);
-ZEND_FUNCTION(mt_rand);
-ZEND_FUNCTION(mt_getrandmax);
-ZEND_FUNCTION(random_bytes);
-ZEND_FUNCTION(random_int);
 ZEND_FUNCTION(soundex);
 ZEND_FUNCTION(stream_select);
 ZEND_FUNCTION(stream_context_create);
@@ -2741,6 +2720,7 @@
 ZEND_FUNCTION(stream_context_set_params);
 ZEND_FUNCTION(stream_context_get_params);
 ZEND_FUNCTION(stream_context_set_option);
+ZEND_FUNCTION(stream_context_set_options);
 ZEND_FUNCTION(stream_context_get_options);
 ZEND_FUNCTION(stream_context_get_default);
 ZEND_FUNCTION(stream_context_set_default);
@@ -2757,7 +2737,7 @@
 #if defined(HAVE_SHUTDOWN)
 ZEND_FUNCTION(stream_socket_shutdown);
 #endif
-#if HAVE_SOCKETPAIR
+#if defined(HAVE_SOCKETPAIR)
 ZEND_FUNCTION(stream_socket_pair);
 #endif
 ZEND_FUNCTION(stream_copy_to_stream);
@@ -2777,7 +2757,7 @@
 ZEND_FUNCTION(sapi_windows_vt100_support);
 #endif
 ZEND_FUNCTION(stream_set_chunk_size);
-#if HAVE_SYS_TIME_H || defined(PHP_WIN32)
+#if (defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32))
 ZEND_FUNCTION(stream_set_timeout);
 #endif
 ZEND_FUNCTION(gettype);
@@ -2824,6 +2804,7 @@
 ZEND_FUNCTION(unserialize);
 ZEND_FUNCTION(memory_get_usage);
 ZEND_FUNCTION(memory_get_peak_usage);
+ZEND_FUNCTION(memory_reset_peak_usage);
 ZEND_FUNCTION(version_compare);
 #if defined(PHP_WIN32)
 ZEND_FUNCTION(sapi_windows_cp_set);
@@ -2870,7 +2851,7 @@
 	ZEND_FE(array_push, arginfo_array_push)
 	ZEND_FE(krsort, arginfo_krsort)
 	ZEND_FE(ksort, arginfo_ksort)
-	ZEND_FE(count, arginfo_count)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(count, arginfo_count)
 	ZEND_FALIAS(sizeof, count, arginfo_sizeof)
 	ZEND_FE(natsort, arginfo_natsort)
 	ZEND_FE(natcasesort, arginfo_natcasesort)
@@ -2888,12 +2869,12 @@
 	ZEND_FE(current, arginfo_current)
 	ZEND_FALIAS(pos, current, arginfo_pos)
 	ZEND_FE(key, arginfo_key)
-	ZEND_FE(min, arginfo_min)
-	ZEND_FE(max, arginfo_max)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(min, arginfo_min)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(max, arginfo_max)
 	ZEND_FE(array_walk, arginfo_array_walk)
 	ZEND_FE(array_walk_recursive, arginfo_array_walk_recursive)
-	ZEND_FE(in_array, arginfo_in_array)
-	ZEND_FE(array_search, arginfo_array_search)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(in_array, arginfo_in_array)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_search, arginfo_array_search)
 	ZEND_FE(extract, arginfo_extract)
 	ZEND_FE(compact, arginfo_compact)
 	ZEND_FE(array_fill, arginfo_array_fill)
@@ -2904,52 +2885,52 @@
 	ZEND_FE(array_shift, arginfo_array_shift)
 	ZEND_FE(array_unshift, arginfo_array_unshift)
 	ZEND_FE(array_splice, arginfo_array_splice)
-	ZEND_FE(array_slice, arginfo_array_slice)
-	ZEND_FE(array_merge, arginfo_array_merge)
-	ZEND_FE(array_merge_recursive, arginfo_array_merge_recursive)
-	ZEND_FE(array_replace, arginfo_array_replace)
-	ZEND_FE(array_replace_recursive, arginfo_array_replace_recursive)
-	ZEND_FE(array_keys, arginfo_array_keys)
-	ZEND_FE(array_key_first, arginfo_array_key_first)
-	ZEND_FE(array_key_last, arginfo_array_key_last)
-	ZEND_FE(array_values, arginfo_array_values)
-	ZEND_FE(array_count_values, arginfo_array_count_values)
-	ZEND_FE(array_column, arginfo_array_column)
-	ZEND_FE(array_reverse, arginfo_array_reverse)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_slice, arginfo_array_slice)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_merge, arginfo_array_merge)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_merge_recursive, arginfo_array_merge_recursive)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_replace, arginfo_array_replace)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_replace_recursive, arginfo_array_replace_recursive)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_keys, arginfo_array_keys)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_key_first, arginfo_array_key_first)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_key_last, arginfo_array_key_last)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_values, arginfo_array_values)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_count_values, arginfo_array_count_values)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_column, arginfo_array_column)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_reverse, arginfo_array_reverse)
 	ZEND_FE(array_pad, arginfo_array_pad)
-	ZEND_FE(array_flip, arginfo_array_flip)
-	ZEND_FE(array_change_key_case, arginfo_array_change_key_case)
-	ZEND_FE(array_unique, arginfo_array_unique)
-	ZEND_FE(array_intersect_key, arginfo_array_intersect_key)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_flip, arginfo_array_flip)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_change_key_case, arginfo_array_change_key_case)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_unique, arginfo_array_unique)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_intersect_key, arginfo_array_intersect_key)
 	ZEND_FE(array_intersect_ukey, arginfo_array_intersect_ukey)
-	ZEND_FE(array_intersect, arginfo_array_intersect)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_intersect, arginfo_array_intersect)
 	ZEND_FE(array_uintersect, arginfo_array_uintersect)
-	ZEND_FE(array_intersect_assoc, arginfo_array_intersect_assoc)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_intersect_assoc, arginfo_array_intersect_assoc)
 	ZEND_FE(array_uintersect_assoc, arginfo_array_uintersect_assoc)
 	ZEND_FE(array_intersect_uassoc, arginfo_array_intersect_uassoc)
 	ZEND_FE(array_uintersect_uassoc, arginfo_array_uintersect_uassoc)
-	ZEND_FE(array_diff_key, arginfo_array_diff_key)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_diff_key, arginfo_array_diff_key)
 	ZEND_FE(array_diff_ukey, arginfo_array_diff_ukey)
-	ZEND_FE(array_diff, arginfo_array_diff)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_diff, arginfo_array_diff)
 	ZEND_FE(array_udiff, arginfo_array_udiff)
-	ZEND_FE(array_diff_assoc, arginfo_array_diff_assoc)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_diff_assoc, arginfo_array_diff_assoc)
 	ZEND_FE(array_diff_uassoc, arginfo_array_diff_uassoc)
 	ZEND_FE(array_udiff_assoc, arginfo_array_udiff_assoc)
 	ZEND_FE(array_udiff_uassoc, arginfo_array_udiff_uassoc)
 	ZEND_FE(array_multisort, arginfo_array_multisort)
 	ZEND_FE(array_rand, arginfo_array_rand)
-	ZEND_FE(array_sum, arginfo_array_sum)
-	ZEND_FE(array_product, arginfo_array_product)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_sum, arginfo_array_sum)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_product, arginfo_array_product)
 	ZEND_FE(array_reduce, arginfo_array_reduce)
 	ZEND_FE(array_filter, arginfo_array_filter)
 	ZEND_FE(array_map, arginfo_array_map)
-	ZEND_FE(array_key_exists, arginfo_array_key_exists)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_key_exists, arginfo_array_key_exists)
 	ZEND_FALIAS(key_exists, array_key_exists, arginfo_key_exists)
-	ZEND_FE(array_chunk, arginfo_array_chunk)
-	ZEND_FE(array_combine, arginfo_array_combine)
-	ZEND_FE(array_is_list, arginfo_array_is_list)
-	ZEND_FE(base64_encode, arginfo_base64_encode)
-	ZEND_FE(base64_decode, arginfo_base64_decode)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_chunk, arginfo_array_chunk)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_combine, arginfo_array_combine)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_is_list, arginfo_array_is_list)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(base64_encode, arginfo_base64_encode)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(base64_decode, arginfo_base64_decode)
 	ZEND_FE(constant, arginfo_constant)
 	ZEND_FE(ip2long, arginfo_ip2long)
 	ZEND_FE(long2ip, arginfo_long2ip)
@@ -2961,10 +2942,10 @@
 	ZEND_FE(flush, arginfo_flush)
 	ZEND_FE(sleep, arginfo_sleep)
 	ZEND_FE(usleep, arginfo_usleep)
-#if HAVE_NANOSLEEP
+#if defined(HAVE_NANOSLEEP)
 	ZEND_FE(time_nanosleep, arginfo_time_nanosleep)
 #endif
-#if HAVE_NANOSLEEP
+#if defined(HAVE_NANOSLEEP)
 	ZEND_FE(time_sleep_until, arginfo_time_sleep_until)
 #endif
 	ZEND_FE(get_current_user, arginfo_get_current_user)
@@ -2986,6 +2967,7 @@
 	ZEND_FE(ini_set, arginfo_ini_set)
 	ZEND_FALIAS(ini_alter, ini_set, arginfo_ini_alter)
 	ZEND_FE(ini_restore, arginfo_ini_restore)
+	ZEND_FE(ini_parse_quantity, arginfo_ini_parse_quantity)
 	ZEND_FE(set_include_path, arginfo_set_include_path)
 	ZEND_FE(get_include_path, arginfo_get_include_path)
 	ZEND_FE(print_r, arginfo_print_r)
@@ -2992,16 +2974,16 @@
 	ZEND_FE(connection_aborted, arginfo_connection_aborted)
 	ZEND_FE(connection_status, arginfo_connection_status)
 	ZEND_FE(ignore_user_abort, arginfo_ignore_user_abort)
-#if HAVE_GETSERVBYNAME
+#if defined(HAVE_GETSERVBYNAME)
 	ZEND_FE(getservbyname, arginfo_getservbyname)
 #endif
-#if HAVE_GETSERVBYPORT
+#if defined(HAVE_GETSERVBYPORT)
 	ZEND_FE(getservbyport, arginfo_getservbyport)
 #endif
-#if HAVE_GETPROTOBYNAME
+#if defined(HAVE_GETPROTOBYNAME)
 	ZEND_FE(getprotobyname, arginfo_getprotobyname)
 #endif
-#if HAVE_GETPROTOBYNUMBER
+#if defined(HAVE_GETPROTOBYNUMBER)
 	ZEND_FE(getprotobynumber, arginfo_getprotobynumber)
 #endif
 	ZEND_FE(register_tick_function, arginfo_register_tick_function)
@@ -3009,7 +2991,7 @@
 	ZEND_FE(is_uploaded_file, arginfo_is_uploaded_file)
 	ZEND_FE(move_uploaded_file, arginfo_move_uploaded_file)
 	ZEND_FE(parse_ini_file, arginfo_parse_ini_file)
-	ZEND_FE(parse_ini_string, arginfo_parse_ini_string)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(parse_ini_string, arginfo_parse_ini_string)
 #if ZEND_DEBUG
 	ZEND_FE(config_get_hash, arginfo_config_get_hash)
 #endif
@@ -3017,9 +2999,9 @@
 	ZEND_FE(sys_getloadavg, arginfo_sys_getloadavg)
 #endif
 	ZEND_FE(get_browser, arginfo_get_browser)
-	ZEND_FE(crc32, arginfo_crc32)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(crc32, arginfo_crc32)
 	ZEND_FE(crypt, arginfo_crypt)
-#if HAVE_STRPTIME
+#if defined(HAVE_STRPTIME)
 	ZEND_DEP_FE(strptime, arginfo_strptime)
 #endif
 #if defined(HAVE_GETHOSTNAME)
@@ -3028,29 +3010,28 @@
 	ZEND_FE(gethostbyaddr, arginfo_gethostbyaddr)
 	ZEND_FE(gethostbyname, arginfo_gethostbyname)
 	ZEND_FE(gethostbynamel, arginfo_gethostbynamel)
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 	ZEND_FE(dns_check_record, arginfo_dns_check_record)
 #endif
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 	ZEND_FALIAS(checkdnsrr, dns_check_record, arginfo_checkdnsrr)
 #endif
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 	ZEND_FE(dns_get_record, arginfo_dns_get_record)
 #endif
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 	ZEND_FE(dns_get_mx, arginfo_dns_get_mx)
 #endif
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
+#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC))
 	ZEND_FALIAS(getmxrr, dns_get_mx, arginfo_getmxrr)
 #endif
-#if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__)
+#if (defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__))
 	ZEND_FE(net_get_interfaces, arginfo_net_get_interfaces)
 #endif
-#if HAVE_FTOK
+#if defined(HAVE_FTOK)
 	ZEND_FE(ftok, arginfo_ftok)
 #endif
 	ZEND_FE(hrtime, arginfo_hrtime)
-	ZEND_FE(lcg_value, arginfo_lcg_value)
 	ZEND_FE(md5, arginfo_md5)
 	ZEND_FE(md5_file, arginfo_md5_file)
 	ZEND_FE(getmyuid, arginfo_getmyuid)
@@ -3089,85 +3070,87 @@
 	ZEND_FE(htmlentities, arginfo_htmlentities)
 	ZEND_FE(get_html_translation_table, arginfo_get_html_translation_table)
 	ZEND_FE(assert, arginfo_assert)
-	ZEND_FE(assert_options, arginfo_assert_options)
-	ZEND_FE(bin2hex, arginfo_bin2hex)
-	ZEND_FE(hex2bin, arginfo_hex2bin)
-	ZEND_FE(strspn, arginfo_strspn)
-	ZEND_FE(strcspn, arginfo_strcspn)
-#if HAVE_NL_LANGINFO
+	ZEND_DEP_FE(assert_options, arginfo_assert_options)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(bin2hex, arginfo_bin2hex)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(hex2bin, arginfo_hex2bin)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strspn, arginfo_strspn)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strcspn, arginfo_strcspn)
+#if defined(HAVE_NL_LANGINFO)
 	ZEND_FE(nl_langinfo, arginfo_nl_langinfo)
 #endif
 	ZEND_FE(strcoll, arginfo_strcoll)
-	ZEND_FE(trim, arginfo_trim)
-	ZEND_FE(rtrim, arginfo_rtrim)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(trim, arginfo_trim)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(rtrim, arginfo_rtrim)
 	ZEND_FALIAS(chop, rtrim, arginfo_chop)
-	ZEND_FE(ltrim, arginfo_ltrim)
-	ZEND_FE(wordwrap, arginfo_wordwrap)
-	ZEND_FE(explode, arginfo_explode)
-	ZEND_FE(implode, arginfo_implode)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(ltrim, arginfo_ltrim)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(wordwrap, arginfo_wordwrap)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(explode, arginfo_explode)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(implode, arginfo_implode)
 	ZEND_FALIAS(join, implode, arginfo_join)
 	ZEND_FE(strtok, arginfo_strtok)
-	ZEND_FE(strtoupper, arginfo_strtoupper)
-	ZEND_FE(strtolower, arginfo_strtolower)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strtoupper, arginfo_strtoupper)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strtolower, arginfo_strtolower)
+	ZEND_FE(str_increment, arginfo_str_increment)
+	ZEND_FE(str_decrement, arginfo_str_decrement)
 	ZEND_FE(basename, arginfo_basename)
 	ZEND_FE(dirname, arginfo_dirname)
 	ZEND_FE(pathinfo, arginfo_pathinfo)
-	ZEND_FE(stristr, arginfo_stristr)
-	ZEND_FE(strstr, arginfo_strstr)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(stristr, arginfo_stristr)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strstr, arginfo_strstr)
 	ZEND_FALIAS(strchr, strstr, arginfo_strchr)
-	ZEND_FE(strpos, arginfo_strpos)
-	ZEND_FE(stripos, arginfo_stripos)
-	ZEND_FE(strrpos, arginfo_strrpos)
-	ZEND_FE(strripos, arginfo_strripos)
-	ZEND_FE(strrchr, arginfo_strrchr)
-	ZEND_FE(str_contains, arginfo_str_contains)
-	ZEND_FE(str_starts_with, arginfo_str_starts_with)
-	ZEND_FE(str_ends_with, arginfo_str_ends_with)
-	ZEND_FE(chunk_split, arginfo_chunk_split)
-	ZEND_FE(substr, arginfo_substr)
-	ZEND_FE(substr_replace, arginfo_substr_replace)
-	ZEND_FE(quotemeta, arginfo_quotemeta)
-	ZEND_FE(ord, arginfo_ord)
-	ZEND_FE(chr, arginfo_chr)
-	ZEND_FE(ucfirst, arginfo_ucfirst)
-	ZEND_FE(lcfirst, arginfo_lcfirst)
-	ZEND_FE(ucwords, arginfo_ucwords)
-	ZEND_FE(strtr, arginfo_strtr)
-	ZEND_FE(strrev, arginfo_strrev)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strpos, arginfo_strpos)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(stripos, arginfo_stripos)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strrpos, arginfo_strrpos)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strripos, arginfo_strripos)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strrchr, arginfo_strrchr)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_contains, arginfo_str_contains)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_starts_with, arginfo_str_starts_with)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_ends_with, arginfo_str_ends_with)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(chunk_split, arginfo_chunk_split)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(substr, arginfo_substr)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(substr_replace, arginfo_substr_replace)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(quotemeta, arginfo_quotemeta)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(ord, arginfo_ord)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(chr, arginfo_chr)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(ucfirst, arginfo_ucfirst)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(lcfirst, arginfo_lcfirst)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(ucwords, arginfo_ucwords)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strtr, arginfo_strtr)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strrev, arginfo_strrev)
 	ZEND_FE(similar_text, arginfo_similar_text)
-	ZEND_FE(addcslashes, arginfo_addcslashes)
-	ZEND_FE(addslashes, arginfo_addslashes)
-	ZEND_FE(stripcslashes, arginfo_stripcslashes)
-	ZEND_FE(stripslashes, arginfo_stripslashes)
-	ZEND_FE(str_replace, arginfo_str_replace)
-	ZEND_FE(str_ireplace, arginfo_str_ireplace)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(addcslashes, arginfo_addcslashes)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(addslashes, arginfo_addslashes)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(stripcslashes, arginfo_stripcslashes)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(stripslashes, arginfo_stripslashes)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_replace, arginfo_str_replace)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_ireplace, arginfo_str_ireplace)
 	ZEND_FE(hebrev, arginfo_hebrev)
-	ZEND_FE(nl2br, arginfo_nl2br)
-	ZEND_FE(strip_tags, arginfo_strip_tags)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(nl2br, arginfo_nl2br)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strip_tags, arginfo_strip_tags)
 	ZEND_FE(setlocale, arginfo_setlocale)
 	ZEND_FE(parse_str, arginfo_parse_str)
 	ZEND_FE(str_getcsv, arginfo_str_getcsv)
 	ZEND_FE(str_repeat, arginfo_str_repeat)
-	ZEND_FE(count_chars, arginfo_count_chars)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(count_chars, arginfo_count_chars)
 	ZEND_FE(strnatcmp, arginfo_strnatcmp)
 	ZEND_FE(localeconv, arginfo_localeconv)
 	ZEND_FE(strnatcasecmp, arginfo_strnatcasecmp)
-	ZEND_FE(substr_count, arginfo_substr_count)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(substr_count, arginfo_substr_count)
 	ZEND_FE(str_pad, arginfo_str_pad)
 	ZEND_FE(sscanf, arginfo_sscanf)
-	ZEND_FE(str_rot13, arginfo_str_rot13)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_rot13, arginfo_str_rot13)
 	ZEND_FE(str_shuffle, arginfo_str_shuffle)
 	ZEND_FE(str_word_count, arginfo_str_word_count)
-	ZEND_FE(str_split, arginfo_str_split)
-	ZEND_FE(strpbrk, arginfo_strpbrk)
-	ZEND_FE(substr_compare, arginfo_substr_compare)
-	ZEND_FE(utf8_encode, arginfo_utf8_encode)
-	ZEND_FE(utf8_decode, arginfo_utf8_decode)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_split, arginfo_str_split)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strpbrk, arginfo_strpbrk)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(substr_compare, arginfo_substr_compare)
+	ZEND_DEP_FE(utf8_encode, arginfo_utf8_encode)
+	ZEND_DEP_FE(utf8_decode, arginfo_utf8_decode)
 	ZEND_FE(opendir, arginfo_opendir)
 	ZEND_FE(dir, arginfo_dir)
 	ZEND_FE(closedir, arginfo_closedir)
 	ZEND_FE(chdir, arginfo_chdir)
-#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC
+#if (defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC))
 	ZEND_FE(chroot, arginfo_chroot)
 #endif
 	ZEND_FE(getcwd, arginfo_getcwd)
@@ -3248,14 +3231,14 @@
 	ZEND_FE(lstat, arginfo_lstat)
 	ZEND_FE(chown, arginfo_chown)
 	ZEND_FE(chgrp, arginfo_chgrp)
-#if HAVE_LCHOWN
+#if defined(HAVE_LCHOWN)
 	ZEND_FE(lchown, arginfo_lchown)
 #endif
-#if HAVE_LCHOWN
+#if defined(HAVE_LCHOWN)
 	ZEND_FE(lchgrp, arginfo_lchgrp)
 #endif
 	ZEND_FE(chmod, arginfo_chmod)
-#if HAVE_UTIME
+#if defined(HAVE_UTIME)
 	ZEND_FE(touch, arginfo_touch)
 #endif
 	ZEND_FE(clearstatcache, arginfo_clearstatcache)
@@ -3273,75 +3256,75 @@
 	ZEND_FE(fsockopen, arginfo_fsockopen)
 	ZEND_FE(pfsockopen, arginfo_pfsockopen)
 	ZEND_FE(http_build_query, arginfo_http_build_query)
-	ZEND_FE(image_type_to_mime_type, arginfo_image_type_to_mime_type)
-	ZEND_FE(image_type_to_extension, arginfo_image_type_to_extension)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(image_type_to_mime_type, arginfo_image_type_to_mime_type)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(image_type_to_extension, arginfo_image_type_to_extension)
 	ZEND_FE(getimagesize, arginfo_getimagesize)
 	ZEND_FE(getimagesizefromstring, arginfo_getimagesizefromstring)
 	ZEND_FE(phpinfo, arginfo_phpinfo)
-	ZEND_FE(phpversion, arginfo_phpversion)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(phpversion, arginfo_phpversion)
 	ZEND_FE(phpcredits, arginfo_phpcredits)
-	ZEND_FE(php_sapi_name, arginfo_php_sapi_name)
-	ZEND_FE(php_uname, arginfo_php_uname)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(php_sapi_name, arginfo_php_sapi_name)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(php_uname, arginfo_php_uname)
 	ZEND_FE(php_ini_scanned_files, arginfo_php_ini_scanned_files)
 	ZEND_FE(php_ini_loaded_file, arginfo_php_ini_loaded_file)
 	ZEND_FE(iptcembed, arginfo_iptcembed)
 	ZEND_FE(iptcparse, arginfo_iptcparse)
 	ZEND_FE(levenshtein, arginfo_levenshtein)
-#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
+#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32))
 	ZEND_FE(readlink, arginfo_readlink)
 #endif
-#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
+#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32))
 	ZEND_FE(linkinfo, arginfo_linkinfo)
 #endif
-#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
+#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32))
 	ZEND_FE(symlink, arginfo_symlink)
 #endif
-#if defined(HAVE_SYMLINK) || defined(PHP_WIN32)
+#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32))
 	ZEND_FE(link, arginfo_link)
 #endif
 	ZEND_FE(mail, arginfo_mail)
-	ZEND_FE(abs, arginfo_abs)
-	ZEND_FE(ceil, arginfo_ceil)
-	ZEND_FE(floor, arginfo_floor)
-	ZEND_FE(round, arginfo_round)
-	ZEND_FE(sin, arginfo_sin)
-	ZEND_FE(cos, arginfo_cos)
-	ZEND_FE(tan, arginfo_tan)
-	ZEND_FE(asin, arginfo_asin)
-	ZEND_FE(acos, arginfo_acos)
-	ZEND_FE(atan, arginfo_atan)
-	ZEND_FE(atanh, arginfo_atanh)
-	ZEND_FE(atan2, arginfo_atan2)
-	ZEND_FE(sinh, arginfo_sinh)
-	ZEND_FE(cosh, arginfo_cosh)
-	ZEND_FE(tanh, arginfo_tanh)
-	ZEND_FE(asinh, arginfo_asinh)
-	ZEND_FE(acosh, arginfo_acosh)
-	ZEND_FE(expm1, arginfo_expm1)
-	ZEND_FE(log1p, arginfo_log1p)
-	ZEND_FE(pi, arginfo_pi)
-	ZEND_FE(is_finite, arginfo_is_finite)
-	ZEND_FE(is_nan, arginfo_is_nan)
-	ZEND_FE(intdiv, arginfo_intdiv)
-	ZEND_FE(is_infinite, arginfo_is_infinite)
-	ZEND_FE(pow, arginfo_pow)
-	ZEND_FE(exp, arginfo_exp)
-	ZEND_FE(log, arginfo_log)
-	ZEND_FE(log10, arginfo_log10)
-	ZEND_FE(sqrt, arginfo_sqrt)
-	ZEND_FE(hypot, arginfo_hypot)
-	ZEND_FE(deg2rad, arginfo_deg2rad)
-	ZEND_FE(rad2deg, arginfo_rad2deg)
-	ZEND_FE(bindec, arginfo_bindec)
-	ZEND_FE(hexdec, arginfo_hexdec)
-	ZEND_FE(octdec, arginfo_octdec)
-	ZEND_FE(decbin, arginfo_decbin)
-	ZEND_FE(decoct, arginfo_decoct)
-	ZEND_FE(dechex, arginfo_dechex)
-	ZEND_FE(base_convert, arginfo_base_convert)
-	ZEND_FE(number_format, arginfo_number_format)
-	ZEND_FE(fmod, arginfo_fmod)
-	ZEND_FE(fdiv, arginfo_fdiv)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(abs, arginfo_abs)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(ceil, arginfo_ceil)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(floor, arginfo_floor)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(round, arginfo_round)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(sin, arginfo_sin)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(cos, arginfo_cos)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(tan, arginfo_tan)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(asin, arginfo_asin)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(acos, arginfo_acos)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(atan, arginfo_atan)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(atanh, arginfo_atanh)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(atan2, arginfo_atan2)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(sinh, arginfo_sinh)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(cosh, arginfo_cosh)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(tanh, arginfo_tanh)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(asinh, arginfo_asinh)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(acosh, arginfo_acosh)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(expm1, arginfo_expm1)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(log1p, arginfo_log1p)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(pi, arginfo_pi)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_finite, arginfo_is_finite)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_nan, arginfo_is_nan)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(intdiv, arginfo_intdiv)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_infinite, arginfo_is_infinite)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(pow, arginfo_pow)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(exp, arginfo_exp)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(log, arginfo_log)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(log10, arginfo_log10)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(sqrt, arginfo_sqrt)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(hypot, arginfo_hypot)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(deg2rad, arginfo_deg2rad)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(rad2deg, arginfo_rad2deg)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(bindec, arginfo_bindec)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(hexdec, arginfo_hexdec)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(octdec, arginfo_octdec)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(decbin, arginfo_decbin)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(decoct, arginfo_decoct)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(dechex, arginfo_dechex)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(base_convert, arginfo_base_convert)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(number_format, arginfo_number_format)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(fmod, arginfo_fmod)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(fdiv, arginfo_fdiv)
 #if defined(HAVE_GETTIMEOFDAY)
 	ZEND_FE(microtime, arginfo_microtime)
 #endif
@@ -3351,13 +3334,13 @@
 #if defined(HAVE_GETRUSAGE)
 	ZEND_FE(getrusage, arginfo_getrusage)
 #endif
-	ZEND_FE(pack, arginfo_pack)
-	ZEND_FE(unpack, arginfo_unpack)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(pack, arginfo_pack)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(unpack, arginfo_unpack)
 	ZEND_FE(password_get_info, arginfo_password_get_info)
 	ZEND_FE(password_hash, arginfo_password_hash)
 	ZEND_FE(password_needs_rehash, arginfo_password_needs_rehash)
 	ZEND_FE(password_verify, arginfo_password_verify)
-	ZEND_FE(password_algos, arginfo_password_algos)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(password_algos, arginfo_password_algos)
 #if defined(PHP_CAN_SUPPORT_PROC_OPEN)
 	ZEND_FE(proc_open, arginfo_proc_open)
 #endif
@@ -3370,16 +3353,8 @@
 #if defined(PHP_CAN_SUPPORT_PROC_OPEN)
 	ZEND_FE(proc_get_status, arginfo_proc_get_status)
 #endif
-	ZEND_FE(quoted_printable_decode, arginfo_quoted_printable_decode)
-	ZEND_FE(quoted_printable_encode, arginfo_quoted_printable_encode)
-	ZEND_FE(mt_srand, arginfo_mt_srand)
-	ZEND_FALIAS(srand, mt_srand, arginfo_srand)
-	ZEND_FE(rand, arginfo_rand)
-	ZEND_FE(mt_rand, arginfo_mt_rand)
-	ZEND_FE(mt_getrandmax, arginfo_mt_getrandmax)
-	ZEND_FALIAS(getrandmax, mt_getrandmax, arginfo_getrandmax)
-	ZEND_FE(random_bytes, arginfo_random_bytes)
-	ZEND_FE(random_int, arginfo_random_int)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(quoted_printable_decode, arginfo_quoted_printable_decode)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(quoted_printable_encode, arginfo_quoted_printable_encode)
 	ZEND_FE(soundex, arginfo_soundex)
 	ZEND_FE(stream_select, arginfo_stream_select)
 	ZEND_FE(stream_context_create, arginfo_stream_context_create)
@@ -3386,6 +3361,7 @@
 	ZEND_FE(stream_context_set_params, arginfo_stream_context_set_params)
 	ZEND_FE(stream_context_get_params, arginfo_stream_context_get_params)
 	ZEND_FE(stream_context_set_option, arginfo_stream_context_set_option)
+	ZEND_FE(stream_context_set_options, arginfo_stream_context_set_options)
 	ZEND_FE(stream_context_get_options, arginfo_stream_context_get_options)
 	ZEND_FE(stream_context_get_default, arginfo_stream_context_get_default)
 	ZEND_FE(stream_context_set_default, arginfo_stream_context_set_default)
@@ -3402,7 +3378,7 @@
 #if defined(HAVE_SHUTDOWN)
 	ZEND_FE(stream_socket_shutdown, arginfo_stream_socket_shutdown)
 #endif
-#if HAVE_SOCKETPAIR
+#if defined(HAVE_SOCKETPAIR)
 	ZEND_FE(stream_socket_pair, arginfo_stream_socket_pair)
 #endif
 	ZEND_FE(stream_copy_to_stream, arginfo_stream_copy_to_stream)
@@ -3425,44 +3401,44 @@
 	ZEND_FE(sapi_windows_vt100_support, arginfo_sapi_windows_vt100_support)
 #endif
 	ZEND_FE(stream_set_chunk_size, arginfo_stream_set_chunk_size)
-#if HAVE_SYS_TIME_H || defined(PHP_WIN32)
+#if (defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32))
 	ZEND_FE(stream_set_timeout, arginfo_stream_set_timeout)
 #endif
-#if HAVE_SYS_TIME_H || defined(PHP_WIN32)
+#if (defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32))
 	ZEND_FALIAS(socket_set_timeout, stream_set_timeout, arginfo_socket_set_timeout)
 #endif
-	ZEND_FE(gettype, arginfo_gettype)
-	ZEND_FE(get_debug_type, arginfo_get_debug_type)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(gettype, arginfo_gettype)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(get_debug_type, arginfo_get_debug_type)
 	ZEND_FE(settype, arginfo_settype)
-	ZEND_FE(intval, arginfo_intval)
-	ZEND_FE(floatval, arginfo_floatval)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(intval, arginfo_intval)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(floatval, arginfo_floatval)
 	ZEND_FALIAS(doubleval, floatval, arginfo_doubleval)
-	ZEND_FE(boolval, arginfo_boolval)
-	ZEND_FE(strval, arginfo_strval)
-	ZEND_FE(is_null, arginfo_is_null)
-	ZEND_FE(is_resource, arginfo_is_resource)
-	ZEND_FE(is_bool, arginfo_is_bool)
-	ZEND_FE(is_int, arginfo_is_int)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(boolval, arginfo_boolval)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strval, arginfo_strval)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_null, arginfo_is_null)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_resource, arginfo_is_resource)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_bool, arginfo_is_bool)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_int, arginfo_is_int)
 	ZEND_FALIAS(is_integer, is_int, arginfo_is_integer)
 	ZEND_FALIAS(is_long, is_int, arginfo_is_long)
-	ZEND_FE(is_float, arginfo_is_float)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_float, arginfo_is_float)
 	ZEND_FALIAS(is_double, is_float, arginfo_is_double)
-	ZEND_FE(is_numeric, arginfo_is_numeric)
-	ZEND_FE(is_string, arginfo_is_string)
-	ZEND_FE(is_array, arginfo_is_array)
-	ZEND_FE(is_object, arginfo_is_object)
-	ZEND_FE(is_scalar, arginfo_is_scalar)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_numeric, arginfo_is_numeric)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_string, arginfo_is_string)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_array, arginfo_is_array)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_object, arginfo_is_object)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_scalar, arginfo_is_scalar)
 	ZEND_FE(is_callable, arginfo_is_callable)
-	ZEND_FE(is_iterable, arginfo_is_iterable)
-	ZEND_FE(is_countable, arginfo_is_countable)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_iterable, arginfo_is_iterable)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_countable, arginfo_is_countable)
 #if defined(HAVE_GETTIMEOFDAY)
 	ZEND_FE(uniqid, arginfo_uniqid)
 #endif
-	ZEND_FE(parse_url, arginfo_parse_url)
-	ZEND_FE(urlencode, arginfo_urlencode)
-	ZEND_FE(urldecode, arginfo_urldecode)
-	ZEND_FE(rawurlencode, arginfo_rawurlencode)
-	ZEND_FE(rawurldecode, arginfo_rawurldecode)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(parse_url, arginfo_parse_url)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(urlencode, arginfo_urlencode)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(urldecode, arginfo_urldecode)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(rawurlencode, arginfo_rawurlencode)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(rawurldecode, arginfo_rawurldecode)
 	ZEND_FE(get_headers, arginfo_get_headers)
 	ZEND_FE(stream_bucket_make_writeable, arginfo_stream_bucket_make_writeable)
 	ZEND_FE(stream_bucket_prepend, arginfo_stream_bucket_prepend)
@@ -3470,16 +3446,17 @@
 	ZEND_FE(stream_bucket_new, arginfo_stream_bucket_new)
 	ZEND_FE(stream_get_filters, arginfo_stream_get_filters)
 	ZEND_FE(stream_filter_register, arginfo_stream_filter_register)
-	ZEND_FE(convert_uuencode, arginfo_convert_uuencode)
-	ZEND_FE(convert_uudecode, arginfo_convert_uudecode)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(convert_uuencode, arginfo_convert_uuencode)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(convert_uudecode, arginfo_convert_uudecode)
 	ZEND_FE(var_dump, arginfo_var_dump)
 	ZEND_FE(var_export, arginfo_var_export)
 	ZEND_FE(debug_zval_dump, arginfo_debug_zval_dump)
-	ZEND_FE(serialize, arginfo_serialize)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(serialize, arginfo_serialize)
 	ZEND_FE(unserialize, arginfo_unserialize)
 	ZEND_FE(memory_get_usage, arginfo_memory_get_usage)
 	ZEND_FE(memory_get_peak_usage, arginfo_memory_get_peak_usage)
-	ZEND_FE(version_compare, arginfo_version_compare)
+	ZEND_FE(memory_reset_peak_usage, arginfo_memory_reset_peak_usage)
+	ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(version_compare, arginfo_version_compare)
 #if defined(PHP_WIN32)
 	ZEND_FE(sapi_windows_cp_set, arginfo_sapi_windows_cp_set)
 #endif
@@ -3511,6 +3488,515 @@
 	ZEND_FE_END
 };
 
+static void register_basic_functions_symbols(int module_number)
+{
+	REGISTER_LONG_CONSTANT("EXTR_OVERWRITE", PHP_EXTR_OVERWRITE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("EXTR_SKIP", PHP_EXTR_SKIP, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("EXTR_PREFIX_SAME", PHP_EXTR_PREFIX_SAME, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("EXTR_PREFIX_ALL", PHP_EXTR_PREFIX_ALL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("EXTR_PREFIX_INVALID", PHP_EXTR_PREFIX_INVALID, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("EXTR_PREFIX_IF_EXISTS", PHP_EXTR_PREFIX_IF_EXISTS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("EXTR_IF_EXISTS", PHP_EXTR_IF_EXISTS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("EXTR_REFS", PHP_EXTR_REFS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SORT_ASC", PHP_SORT_ASC, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SORT_DESC", PHP_SORT_DESC, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SORT_REGULAR", PHP_SORT_REGULAR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SORT_NUMERIC", PHP_SORT_NUMERIC, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SORT_STRING", PHP_SORT_STRING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SORT_LOCALE_STRING", PHP_SORT_LOCALE_STRING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SORT_NATURAL", PHP_SORT_NATURAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SORT_FLAG_CASE", PHP_SORT_FLAG_CASE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CASE_LOWER", PHP_CASE_LOWER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CASE_UPPER", PHP_CASE_UPPER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("COUNT_NORMAL", PHP_COUNT_NORMAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("COUNT_RECURSIVE", PHP_COUNT_RECURSIVE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_BOTH", ARRAY_FILTER_USE_BOTH, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_KEY", ARRAY_FILTER_USE_KEY, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ASSERT_ACTIVE", PHP_ASSERT_ACTIVE, CONST_PERSISTENT | CONST_DEPRECATED);
+	REGISTER_LONG_CONSTANT("ASSERT_CALLBACK", PHP_ASSERT_CALLBACK, CONST_PERSISTENT | CONST_DEPRECATED);
+	REGISTER_LONG_CONSTANT("ASSERT_BAIL", PHP_ASSERT_BAIL, CONST_PERSISTENT | CONST_DEPRECATED);
+	REGISTER_LONG_CONSTANT("ASSERT_WARNING", PHP_ASSERT_WARNING, CONST_PERSISTENT | CONST_DEPRECATED);
+	REGISTER_LONG_CONSTANT("ASSERT_EXCEPTION", PHP_ASSERT_EXCEPTION, CONST_PERSISTENT | CONST_DEPRECATED);
+	REGISTER_LONG_CONSTANT("CONNECTION_ABORTED", PHP_CONNECTION_ABORTED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CONNECTION_NORMAL", PHP_CONNECTION_NORMAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CONNECTION_TIMEOUT", PHP_CONNECTION_TIMEOUT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INI_USER", ZEND_INI_USER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INI_PERDIR", ZEND_INI_PERDIR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INI_SYSTEM", ZEND_INI_SYSTEM, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INI_ALL", ZEND_INI_ALL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INI_SCANNER_NORMAL", ZEND_INI_SCANNER_NORMAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INI_SCANNER_RAW", ZEND_INI_SCANNER_RAW, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INI_SCANNER_TYPED", ZEND_INI_SCANNER_TYPED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_URL_SCHEME", PHP_URL_SCHEME, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_URL_HOST", PHP_URL_HOST, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_URL_PORT", PHP_URL_PORT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_URL_USER", PHP_URL_USER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_URL_PASS", PHP_URL_PASS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_URL_PATH", PHP_URL_PATH, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_URL_QUERY", PHP_URL_QUERY, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_URL_FRAGMENT", PHP_URL_FRAGMENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_QUERY_RFC1738", PHP_QUERY_RFC1738, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_QUERY_RFC3986", PHP_QUERY_RFC3986, CONST_PERSISTENT);
+	REGISTER_DOUBLE_CONSTANT("M_E", M_E, CONST_PERSISTENT);
+	ZEND_ASSERT(M_E == 2.718281828459045);
+	REGISTER_DOUBLE_CONSTANT("M_LOG2E", M_LOG2E, CONST_PERSISTENT);
+	ZEND_ASSERT(M_LOG2E == 1.4426950408889634);
+	REGISTER_DOUBLE_CONSTANT("M_LOG10E", M_LOG10E, CONST_PERSISTENT);
+	ZEND_ASSERT(M_LOG10E == 0.4342944819032518);
+	REGISTER_DOUBLE_CONSTANT("M_LN2", M_LN2, CONST_PERSISTENT);
+	ZEND_ASSERT(M_LN2 == 0.6931471805599453);
+	REGISTER_DOUBLE_CONSTANT("M_LN10", M_LN10, CONST_PERSISTENT);
+	ZEND_ASSERT(M_LN10 == 2.302585092994046);
+	REGISTER_DOUBLE_CONSTANT("M_PI", M_PI, CONST_PERSISTENT);
+	ZEND_ASSERT(M_PI == 3.141592653589793);
+	REGISTER_DOUBLE_CONSTANT("M_PI_2", M_PI_2, CONST_PERSISTENT);
+	ZEND_ASSERT(M_PI_2 == 1.5707963267948966);
+	REGISTER_DOUBLE_CONSTANT("M_PI_4", M_PI_4, CONST_PERSISTENT);
+	ZEND_ASSERT(M_PI_4 == 0.7853981633974483);
+	REGISTER_DOUBLE_CONSTANT("M_1_PI", M_1_PI, CONST_PERSISTENT);
+	ZEND_ASSERT(M_1_PI == 0.3183098861837907);
+	REGISTER_DOUBLE_CONSTANT("M_2_PI", M_2_PI, CONST_PERSISTENT);
+	ZEND_ASSERT(M_2_PI == 0.6366197723675814);
+	REGISTER_DOUBLE_CONSTANT("M_SQRTPI", M_SQRTPI, CONST_PERSISTENT);
+	ZEND_ASSERT(M_SQRTPI == 1.772453850905516);
+	REGISTER_DOUBLE_CONSTANT("M_2_SQRTPI", M_2_SQRTPI, CONST_PERSISTENT);
+	ZEND_ASSERT(M_2_SQRTPI == 1.1283791670955126);
+	REGISTER_DOUBLE_CONSTANT("M_LNPI", M_LNPI, CONST_PERSISTENT);
+	ZEND_ASSERT(M_LNPI == 1.1447298858494002);
+	REGISTER_DOUBLE_CONSTANT("M_EULER", M_EULER, CONST_PERSISTENT);
+	ZEND_ASSERT(M_EULER == 0.5772156649015329);
+	REGISTER_DOUBLE_CONSTANT("M_SQRT2", M_SQRT2, CONST_PERSISTENT);
+	ZEND_ASSERT(M_SQRT2 == 1.4142135623730951);
+	REGISTER_DOUBLE_CONSTANT("M_SQRT1_2", M_SQRT1_2, CONST_PERSISTENT);
+	ZEND_ASSERT(M_SQRT1_2 == 0.7071067811865476);
+	REGISTER_DOUBLE_CONSTANT("M_SQRT3", M_SQRT3, CONST_PERSISTENT);
+	ZEND_ASSERT(M_SQRT3 == 1.7320508075688772);
+	REGISTER_DOUBLE_CONSTANT("INF", ZEND_INFINITY, CONST_PERSISTENT);
+	REGISTER_DOUBLE_CONSTANT("NAN", ZEND_NAN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_UP", PHP_ROUND_HALF_UP, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_DOWN", PHP_ROUND_HALF_DOWN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_EVEN", PHP_ROUND_HALF_EVEN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_ODD", PHP_ROUND_HALF_ODD, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CRYPT_SALT_LENGTH", PHP_MAX_SALT_LEN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CRYPT_STD_DES", 1, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CRYPT_EXT_DES", 1, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CRYPT_MD5", 1, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CRYPT_BLOWFISH", 1, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CRYPT_SHA256", 1, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CRYPT_SHA512", 1, CONST_PERSISTENT);
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_A", PHP_DNS_A, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_NS", PHP_DNS_NS, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_CNAME", PHP_DNS_CNAME, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_SOA", PHP_DNS_SOA, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_PTR", PHP_DNS_PTR, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_HINFO", PHP_DNS_HINFO, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) && (!defined(PHP_WIN32))
+	REGISTER_LONG_CONSTANT("DNS_CAA", PHP_DNS_CAA, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_MX", PHP_DNS_MX, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_TXT", PHP_DNS_TXT, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_SRV", PHP_DNS_SRV, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_NAPTR", PHP_DNS_NAPTR, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_AAAA", PHP_DNS_AAAA, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_A6", PHP_DNS_A6, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_ANY", PHP_DNS_ANY, CONST_PERSISTENT);
+#endif
+#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)))
+	REGISTER_LONG_CONSTANT("DNS_ALL", PHP_DNS_ALL, CONST_PERSISTENT);
+#endif
+	REGISTER_LONG_CONSTANT("HTML_SPECIALCHARS", PHP_HTML_SPECIALCHARS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("HTML_ENTITIES", PHP_HTML_ENTITIES, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ENT_COMPAT", ENT_COMPAT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ENT_QUOTES", ENT_QUOTES, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ENT_NOQUOTES", ENT_NOQUOTES, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ENT_IGNORE", ENT_IGNORE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ENT_SUBSTITUTE", ENT_SUBSTITUTE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ENT_DISALLOWED", ENT_DISALLOWED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ENT_HTML401", ENT_HTML401, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ENT_XML1", ENT_XML1, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ENT_XHTML", ENT_XHTML, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("ENT_HTML5", ENT_HTML5, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_GIF", IMAGE_FILETYPE_GIF, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_JPEG", IMAGE_FILETYPE_JPEG, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_PNG", IMAGE_FILETYPE_PNG, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_SWF", IMAGE_FILETYPE_SWF, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_PSD", IMAGE_FILETYPE_PSD, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_BMP", IMAGE_FILETYPE_BMP, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_TIFF_II", IMAGE_FILETYPE_TIFF_II, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_TIFF_MM", IMAGE_FILETYPE_TIFF_MM, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_JPC", IMAGE_FILETYPE_JPC, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_JP2", IMAGE_FILETYPE_JP2, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_JPX", IMAGE_FILETYPE_JPX, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_JB2", IMAGE_FILETYPE_JB2, CONST_PERSISTENT);
+#if (defined(HAVE_ZLIB) && !defined(COMPILE_DL_ZLIB))
+	REGISTER_LONG_CONSTANT("IMAGETYPE_SWC", IMAGE_FILETYPE_SWC, CONST_PERSISTENT);
+#endif
+	REGISTER_LONG_CONSTANT("IMAGETYPE_IFF", IMAGE_FILETYPE_IFF, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_WBMP", IMAGE_FILETYPE_WBMP, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_JPEG2000", IMAGE_FILETYPE_JPC, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_XBM", IMAGE_FILETYPE_XBM, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_ICO", IMAGE_FILETYPE_ICO, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_WEBP", IMAGE_FILETYPE_WEBP, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_AVIF", IMAGE_FILETYPE_AVIF, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_UNKNOWN", IMAGE_FILETYPE_UNKNOWN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("IMAGETYPE_COUNT", IMAGE_FILETYPE_COUNT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INFO_GENERAL", PHP_INFO_GENERAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INFO_CREDITS", PHP_INFO_CREDITS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INFO_CONFIGURATION", PHP_INFO_CONFIGURATION, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INFO_MODULES", PHP_INFO_MODULES, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INFO_ENVIRONMENT", PHP_INFO_ENVIRONMENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INFO_VARIABLES", PHP_INFO_VARIABLES, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INFO_LICENSE", PHP_INFO_LICENSE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("INFO_ALL", PHP_INFO_ALL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CREDITS_GROUP", PHP_CREDITS_GROUP, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CREDITS_GENERAL", PHP_CREDITS_GENERAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CREDITS_SAPI", PHP_CREDITS_SAPI, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CREDITS_MODULES", PHP_CREDITS_MODULES, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CREDITS_DOCS", PHP_CREDITS_DOCS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CREDITS_FULLPAGE", PHP_CREDITS_FULLPAGE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CREDITS_QA", PHP_CREDITS_QA, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CREDITS_ALL", PHP_CREDITS_ALL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_EMERG", LOG_EMERG, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_ALERT", LOG_ALERT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_CRIT", LOG_CRIT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_ERR", LOG_ERR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_WARNING", LOG_WARNING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_NOTICE", LOG_NOTICE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_INFO", LOG_INFO, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_DEBUG", LOG_DEBUG, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_KERN", LOG_KERN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_USER", LOG_USER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_MAIL", LOG_MAIL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_DAEMON", LOG_DAEMON, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_AUTH", LOG_AUTH, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_SYSLOG", LOG_SYSLOG, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_LPR", LOG_LPR, CONST_PERSISTENT);
+#if defined(LOG_NEWS)
+	REGISTER_LONG_CONSTANT("LOG_NEWS", LOG_NEWS, CONST_PERSISTENT);
+#endif
+#if defined(LOG_UUCP)
+	REGISTER_LONG_CONSTANT("LOG_UUCP", LOG_UUCP, CONST_PERSISTENT);
+#endif
+#if defined(LOG_CRON)
+	REGISTER_LONG_CONSTANT("LOG_CRON", LOG_CRON, CONST_PERSISTENT);
+#endif
+#if defined(LOG_AUTHPRIV)
+	REGISTER_LONG_CONSTANT("LOG_AUTHPRIV", LOG_AUTHPRIV, CONST_PERSISTENT);
+#endif
+#if !defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("LOG_LOCAL0", LOG_LOCAL0, CONST_PERSISTENT);
+#endif
+#if !defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("LOG_LOCAL1", LOG_LOCAL1, CONST_PERSISTENT);
+#endif
+#if !defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("LOG_LOCAL2", LOG_LOCAL2, CONST_PERSISTENT);
+#endif
+#if !defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("LOG_LOCAL3", LOG_LOCAL3, CONST_PERSISTENT);
+#endif
+#if !defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("LOG_LOCAL4", LOG_LOCAL4, CONST_PERSISTENT);
+#endif
+#if !defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("LOG_LOCAL5", LOG_LOCAL5, CONST_PERSISTENT);
+#endif
+#if !defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("LOG_LOCAL6", LOG_LOCAL6, CONST_PERSISTENT);
+#endif
+#if !defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("LOG_LOCAL7", LOG_LOCAL7, CONST_PERSISTENT);
+#endif
+	REGISTER_LONG_CONSTANT("LOG_PID", LOG_PID, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_CONS", LOG_CONS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_ODELAY", LOG_ODELAY, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOG_NDELAY", LOG_NDELAY, CONST_PERSISTENT);
+#if defined(LOG_NOWAIT)
+	REGISTER_LONG_CONSTANT("LOG_NOWAIT", LOG_NOWAIT, CONST_PERSISTENT);
+#endif
+#if defined(LOG_PERROR)
+	REGISTER_LONG_CONSTANT("LOG_PERROR", LOG_PERROR, CONST_PERSISTENT);
+#endif
+	REGISTER_LONG_CONSTANT("STR_PAD_LEFT", PHP_STR_PAD_LEFT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STR_PAD_RIGHT", PHP_STR_PAD_RIGHT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STR_PAD_BOTH", PHP_STR_PAD_BOTH, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PATHINFO_DIRNAME", PHP_PATHINFO_DIRNAME, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PATHINFO_BASENAME", PHP_PATHINFO_BASENAME, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PATHINFO_EXTENSION", PHP_PATHINFO_EXTENSION, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PATHINFO_FILENAME", PHP_PATHINFO_FILENAME, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PATHINFO_ALL", PHP_PATHINFO_ALL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CHAR_MAX", CHAR_MAX, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LC_CTYPE", LC_CTYPE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LC_NUMERIC", LC_NUMERIC, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LC_TIME", LC_TIME, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LC_COLLATE", LC_COLLATE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LC_MONETARY", LC_MONETARY, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LC_ALL", LC_ALL, CONST_PERSISTENT);
+#if defined(LC_MESSAGES)
+	REGISTER_LONG_CONSTANT("LC_MESSAGES", LC_MESSAGES, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABDAY_1)
+	REGISTER_LONG_CONSTANT("ABDAY_1", ABDAY_1, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABDAY_1)
+	REGISTER_LONG_CONSTANT("ABDAY_2", ABDAY_2, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABDAY_1)
+	REGISTER_LONG_CONSTANT("ABDAY_3", ABDAY_3, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABDAY_1)
+	REGISTER_LONG_CONSTANT("ABDAY_4", ABDAY_4, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABDAY_1)
+	REGISTER_LONG_CONSTANT("ABDAY_5", ABDAY_5, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABDAY_1)
+	REGISTER_LONG_CONSTANT("ABDAY_6", ABDAY_6, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABDAY_1)
+	REGISTER_LONG_CONSTANT("ABDAY_7", ABDAY_7, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(DAY_1)
+	REGISTER_LONG_CONSTANT("DAY_1", DAY_1, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(DAY_1)
+	REGISTER_LONG_CONSTANT("DAY_2", DAY_2, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(DAY_1)
+	REGISTER_LONG_CONSTANT("DAY_3", DAY_3, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(DAY_1)
+	REGISTER_LONG_CONSTANT("DAY_4", DAY_4, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(DAY_1)
+	REGISTER_LONG_CONSTANT("DAY_5", DAY_5, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(DAY_1)
+	REGISTER_LONG_CONSTANT("DAY_6", DAY_6, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(DAY_1)
+	REGISTER_LONG_CONSTANT("DAY_7", DAY_7, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABMON_1)
+	REGISTER_LONG_CONSTANT("ABMON_1", ABMON_1, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABMON_1)
+	REGISTER_LONG_CONSTANT("ABMON_2", ABMON_2, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABMON_1)
+	REGISTER_LONG_CONSTANT("ABMON_3", ABMON_3, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABMON_1)
+	REGISTER_LONG_CONSTANT("ABMON_4", ABMON_4, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABMON_1)
+	REGISTER_LONG_CONSTANT("ABMON_5", ABMON_5, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABMON_1)
+	REGISTER_LONG_CONSTANT("ABMON_6", ABMON_6, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABMON_1)
+	REGISTER_LONG_CONSTANT("ABMON_7", ABMON_7, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABMON_1)
+	REGISTER_LONG_CONSTANT("ABMON_8", ABMON_8, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABMON_1)
+	REGISTER_LONG_CONSTANT("ABMON_9", ABMON_9, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABMON_1)
+	REGISTER_LONG_CONSTANT("ABMON_10", ABMON_10, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABMON_1)
+	REGISTER_LONG_CONSTANT("ABMON_11", ABMON_11, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ABMON_1)
+	REGISTER_LONG_CONSTANT("ABMON_12", ABMON_12, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_1)
+	REGISTER_LONG_CONSTANT("MON_1", MON_1, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_1)
+	REGISTER_LONG_CONSTANT("MON_2", MON_2, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_1)
+	REGISTER_LONG_CONSTANT("MON_3", MON_3, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_1)
+	REGISTER_LONG_CONSTANT("MON_4", MON_4, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_1)
+	REGISTER_LONG_CONSTANT("MON_5", MON_5, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_1)
+	REGISTER_LONG_CONSTANT("MON_6", MON_6, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_1)
+	REGISTER_LONG_CONSTANT("MON_7", MON_7, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_1)
+	REGISTER_LONG_CONSTANT("MON_8", MON_8, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_1)
+	REGISTER_LONG_CONSTANT("MON_9", MON_9, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_1)
+	REGISTER_LONG_CONSTANT("MON_10", MON_10, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_1)
+	REGISTER_LONG_CONSTANT("MON_11", MON_11, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_1)
+	REGISTER_LONG_CONSTANT("MON_12", MON_12, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(AM_STR)
+	REGISTER_LONG_CONSTANT("AM_STR", AM_STR, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(PM_STR)
+	REGISTER_LONG_CONSTANT("PM_STR", PM_STR, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(D_T_FMT)
+	REGISTER_LONG_CONSTANT("D_T_FMT", D_T_FMT, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(D_FMT)
+	REGISTER_LONG_CONSTANT("D_FMT", D_FMT, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(T_FMT)
+	REGISTER_LONG_CONSTANT("T_FMT", T_FMT, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(T_FMT_AMPM)
+	REGISTER_LONG_CONSTANT("T_FMT_AMPM", T_FMT_AMPM, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ERA)
+	REGISTER_LONG_CONSTANT("ERA", ERA, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ERA_YEAR)
+	REGISTER_LONG_CONSTANT("ERA_YEAR", ERA_YEAR, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ERA_D_T_FMT)
+	REGISTER_LONG_CONSTANT("ERA_D_T_FMT", ERA_D_T_FMT, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ERA_D_FMT)
+	REGISTER_LONG_CONSTANT("ERA_D_FMT", ERA_D_FMT, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ERA_T_FMT)
+	REGISTER_LONG_CONSTANT("ERA_T_FMT", ERA_T_FMT, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(ALT_DIGITS)
+	REGISTER_LONG_CONSTANT("ALT_DIGITS", ALT_DIGITS, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(INT_CURR_SYMBOL)
+	REGISTER_LONG_CONSTANT("INT_CURR_SYMBOL", INT_CURR_SYMBOL, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(CURRENCY_SYMBOL)
+	REGISTER_LONG_CONSTANT("CURRENCY_SYMBOL", CURRENCY_SYMBOL, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(CRNCYSTR)
+	REGISTER_LONG_CONSTANT("CRNCYSTR", CRNCYSTR, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_DECIMAL_POINT)
+	REGISTER_LONG_CONSTANT("MON_DECIMAL_POINT", MON_DECIMAL_POINT, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_THOUSANDS_SEP)
+	REGISTER_LONG_CONSTANT("MON_THOUSANDS_SEP", MON_THOUSANDS_SEP, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(MON_GROUPING)
+	REGISTER_LONG_CONSTANT("MON_GROUPING", MON_GROUPING, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(POSITIVE_SIGN)
+	REGISTER_LONG_CONSTANT("POSITIVE_SIGN", POSITIVE_SIGN, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(NEGATIVE_SIGN)
+	REGISTER_LONG_CONSTANT("NEGATIVE_SIGN", NEGATIVE_SIGN, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(INT_FRAC_DIGITS)
+	REGISTER_LONG_CONSTANT("INT_FRAC_DIGITS", INT_FRAC_DIGITS, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(FRAC_DIGITS)
+	REGISTER_LONG_CONSTANT("FRAC_DIGITS", FRAC_DIGITS, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(P_CS_PRECEDES)
+	REGISTER_LONG_CONSTANT("P_CS_PRECEDES", P_CS_PRECEDES, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(P_SEP_BY_SPACE)
+	REGISTER_LONG_CONSTANT("P_SEP_BY_SPACE", P_SEP_BY_SPACE, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(N_CS_PRECEDES)
+	REGISTER_LONG_CONSTANT("N_CS_PRECEDES", N_CS_PRECEDES, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(N_SEP_BY_SPACE)
+	REGISTER_LONG_CONSTANT("N_SEP_BY_SPACE", N_SEP_BY_SPACE, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(P_SIGN_POSN)
+	REGISTER_LONG_CONSTANT("P_SIGN_POSN", P_SIGN_POSN, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(N_SIGN_POSN)
+	REGISTER_LONG_CONSTANT("N_SIGN_POSN", N_SIGN_POSN, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(DECIMAL_POINT)
+	REGISTER_LONG_CONSTANT("DECIMAL_POINT", DECIMAL_POINT, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(RADIXCHAR)
+	REGISTER_LONG_CONSTANT("RADIXCHAR", RADIXCHAR, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(THOUSANDS_SEP)
+	REGISTER_LONG_CONSTANT("THOUSANDS_SEP", THOUSANDS_SEP, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(THOUSEP)
+	REGISTER_LONG_CONSTANT("THOUSEP", THOUSEP, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(GROUPING)
+	REGISTER_LONG_CONSTANT("GROUPING", GROUPING, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(YESEXPR)
+	REGISTER_LONG_CONSTANT("YESEXPR", YESEXPR, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(NOEXPR)
+	REGISTER_LONG_CONSTANT("NOEXPR", NOEXPR, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(YESSTR)
+	REGISTER_LONG_CONSTANT("YESSTR", YESSTR, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(NOSTR)
+	REGISTER_LONG_CONSTANT("NOSTR", NOSTR, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_NL_LANGINFO) && defined(CODESET)
+	REGISTER_LONG_CONSTANT("CODESET", CODESET, CONST_PERSISTENT);
+#endif
+
+
+	zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "crypt", sizeof("crypt") - 1), 0, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0);
+
+	zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "password_hash", sizeof("password_hash") - 1), 0, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0);
+
+	zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "password_verify", sizeof("password_verify") - 1), 0, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0);
+}
+
 static zend_class_entry *register_class___PHP_Incomplete_Class(void)
 {
 	zend_class_entry ce, *class_entry;
@@ -3517,8 +4003,12 @@
 
 	INIT_CLASS_ENTRY(ce, "__PHP_Incomplete_Class", class___PHP_Incomplete_Class_methods);
 	class_entry = zend_register_internal_class_ex(&ce, NULL);
-	class_entry->ce_flags |= ZEND_ACC_FINAL;
+	class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES;
 
+	zend_string *attribute_name_AllowDynamicProperties_class___PHP_Incomplete_Class_0 = zend_string_init_interned("AllowDynamicProperties", sizeof("AllowDynamicProperties") - 1, 1);
+	zend_add_class_attribute(class_entry, attribute_name_AllowDynamicProperties_class___PHP_Incomplete_Class_0, 0);
+	zend_string_release(attribute_name_AllowDynamicProperties_class___PHP_Incomplete_Class_0);
+
 	return class_entry;
 }
 

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/credits_ext.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/credits_ext.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/credits_ext.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -55,6 +55,7 @@
 CREDIT_LINE("PostgreSQL driver for PDO", "Edin Kadribasic, Ilia Alshanetsky");
 CREDIT_LINE("PostgreSQL", "Jouni Ahto, Zeev Suraski, Yasuo Ohgaki, Chris Kings-Lynne");
 CREDIT_LINE("Pspell", "Vlad Krupin");
+CREDIT_LINE("random", "Go Kudo, Tim Düsterhus, Guilliam Xavier, Christoph M. Becker, Jakub Zelenka, Bob Weinand, Máté Kocsis, and Original RNG implementators");
 CREDIT_LINE("Readline", "Thies C. Arntzen");
 CREDIT_LINE("Reflection", "Marcus Boerger, Timm Friebe, George Schlossnagle, Andrei Zmievski, Johannes Schlueter");
 CREDIT_LINE("Sessions", "Sascha Schumann, Andrei Zmievski");

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/crypt_freesec.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/crypt_freesec.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/crypt_freesec.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,14 +1,8 @@
 #ifndef _CRYPT_FREESEC_H
 #define _CRYPT_FREESEC_H
 
-#ifdef PHP_WIN32
-# ifndef inline
-# define inline __inline
-# endif
-#endif
+#include <stdint.h>
 
-#include "php_stdint.h"
-
 #define MD5_HASH_MAX_LEN 120
 
 struct php_crypt_extended_data {

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/file.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/file.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/file.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -48,17 +48,24 @@
 	zval *wouldblock, zval *return_value);
 
 #define PHP_CSV_NO_ESCAPE EOF
-PHPAPI void php_fgetcsv(php_stream *stream, char delimiter, char enclosure, int escape_char, size_t buf_len, char *buf, zval *return_value);
+PHPAPI HashTable *php_bc_fgetcsv_empty_line(void);
+PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure, int escape_char, size_t buf_len, char *buf);
 PHPAPI ssize_t php_fputcsv(php_stream *stream, zval *fields, char delimiter, char enclosure, int escape_char, zend_string *eol_str);
 
 #define META_DEF_BUFSIZE 8192
 
-#define PHP_FILE_USE_INCLUDE_PATH 1
-#define PHP_FILE_IGNORE_NEW_LINES 2
-#define PHP_FILE_SKIP_EMPTY_LINES 4
-#define PHP_FILE_APPEND 8
-#define PHP_FILE_NO_DEFAULT_CONTEXT 16
+#define PHP_FILE_USE_INCLUDE_PATH (1 << 0)
+#define PHP_FILE_IGNORE_NEW_LINES (1 << 1)
+#define PHP_FILE_SKIP_EMPTY_LINES (1 << 2)
+#define PHP_FILE_APPEND (1 << 3)
+#define PHP_FILE_NO_DEFAULT_CONTEXT (1 << 4)
 
+#ifndef _WIN32
+#define PHP_TIMEOUT_ULL_MAX ULLONG_MAX
+#else
+#define PHP_TIMEOUT_ULL_MAX UINT64_MAX
+#endif
+
 typedef enum _php_meta_tags_token {
 	TOK_EOF = 0,
 	TOK_OPENTAG,
@@ -96,7 +103,7 @@
 	HashTable *stream_filters;			/* per-request copy of stream_filters_hash */
 	HashTable *wrapper_errors;			/* key: wrapper address; value: linked list of char* */
 	int pclose_wait;
-#if defined(HAVE_GETHOSTBYNAME_R)
+#ifdef HAVE_GETHOSTBYNAME_R
 	struct hostent tmp_host_info;
 	char *tmp_host_buf;
 	size_t tmp_host_buf_len;

Added: branches/4.0/MgDev/Oem/php/include/ext/standard/file_arginfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/file_arginfo.h	                        (rev 0)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/file_arginfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -0,0 +1,127 @@
+/* This is a generated file, edit the .stub.php file instead.
+ * Stub hash: e9a566d5ef96f781074027b1b3ff1824d0208b47 */
+
+
+
+static void register_file_symbols(int module_number)
+{
+	REGISTER_LONG_CONSTANT("SEEK_SET", SEEK_SET, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SEEK_CUR", SEEK_CUR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SEEK_END", SEEK_END, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOCK_SH", PHP_LOCK_SH, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOCK_EX", PHP_LOCK_EX, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOCK_UN", PHP_LOCK_UN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("LOCK_NB", PHP_LOCK_NB, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_CONNECT", PHP_STREAM_NOTIFY_CONNECT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_AUTH_REQUIRED", PHP_STREAM_NOTIFY_AUTH_REQUIRED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_AUTH_RESULT", PHP_STREAM_NOTIFY_AUTH_RESULT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_MIME_TYPE_IS", PHP_STREAM_NOTIFY_MIME_TYPE_IS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_FILE_SIZE_IS", PHP_STREAM_NOTIFY_FILE_SIZE_IS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_REDIRECTED", PHP_STREAM_NOTIFY_REDIRECTED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_PROGRESS", PHP_STREAM_NOTIFY_PROGRESS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_FAILURE", PHP_STREAM_NOTIFY_FAILURE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_COMPLETED", PHP_STREAM_NOTIFY_COMPLETED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_RESOLVE", PHP_STREAM_NOTIFY_RESOLVE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_INFO", PHP_STREAM_NOTIFY_SEVERITY_INFO, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_WARN", PHP_STREAM_NOTIFY_SEVERITY_WARN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_ERR", PHP_STREAM_NOTIFY_SEVERITY_ERR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_FILTER_READ", PHP_STREAM_FILTER_READ, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_FILTER_WRITE", PHP_STREAM_FILTER_WRITE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_FILTER_ALL", PHP_STREAM_FILTER_ALL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CLIENT_PERSISTENT", PHP_STREAM_CLIENT_PERSISTENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CLIENT_ASYNC_CONNECT", PHP_STREAM_CLIENT_ASYNC_CONNECT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CLIENT_CONNECT", PHP_STREAM_CLIENT_CONNECT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_ANY_CLIENT", STREAM_CRYPTO_METHOD_ANY_CLIENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv2_CLIENT", STREAM_CRYPTO_METHOD_SSLv2_CLIENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_CLIENT", STREAM_CRYPTO_METHOD_SSLv3_CLIENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_CLIENT", STREAM_CRYPTO_METHOD_SSLv23_CLIENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_CLIENT", STREAM_CRYPTO_METHOD_TLS_CLIENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_ANY_SERVER", STREAM_CRYPTO_METHOD_ANY_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv2_SERVER", STREAM_CRYPTO_METHOD_SSLv2_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_SERVER", STREAM_CRYPTO_METHOD_SSLv3_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_SERVER", STREAM_CRYPTO_METHOD_SSLv23_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_SERVER", STREAM_CRYPTO_METHOD_TLS_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_0_SERVER", STREAM_CRYPTO_METHOD_TLSv1_0_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_SERVER", STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_SERVER", STREAM_CRYPTO_METHOD_TLSv1_2_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_3_SERVER", STREAM_CRYPTO_METHOD_TLSv1_3_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_PROTO_SSLv3", STREAM_CRYPTO_METHOD_SSLv3_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_PROTO_TLSv1_0", STREAM_CRYPTO_METHOD_TLSv1_0_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_PROTO_TLSv1_1", STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_PROTO_TLSv1_2", STREAM_CRYPTO_METHOD_TLSv1_2_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CRYPTO_PROTO_TLSv1_3", STREAM_CRYPTO_METHOD_TLSv1_3_SERVER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_SHUT_RD", STREAM_SHUT_RD, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_SHUT_WR", STREAM_SHUT_WR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_SHUT_RDWR", STREAM_SHUT_RDWR, CONST_PERSISTENT);
+#if defined(PF_INET)
+	REGISTER_LONG_CONSTANT("STREAM_PF_INET", PF_INET, CONST_PERSISTENT);
+#endif
+#if (!defined(PF_INET) && defined(AF_INET))
+	REGISTER_LONG_CONSTANT("STREAM_PF_INET", AF_INET, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_IPV6) && defined(PF_INET6)
+	REGISTER_LONG_CONSTANT("STREAM_PF_INET6", PF_INET6, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_IPV6) && (!defined(PF_INET6) && defined(AF_INET6))
+	REGISTER_LONG_CONSTANT("STREAM_PF_INET6", AF_INET6, CONST_PERSISTENT);
+#endif
+#if defined(PF_UNIX)
+	REGISTER_LONG_CONSTANT("STREAM_PF_UNIX", PF_UNIX, CONST_PERSISTENT);
+#endif
+#if (!defined(PF_UNIX) && defined(AF_UNIX))
+	REGISTER_LONG_CONSTANT("STREAM_PF_UNIX", AF_UNIX, CONST_PERSISTENT);
+#endif
+#if defined(IPPROTO_IP)
+	REGISTER_LONG_CONSTANT("STREAM_IPPROTO_IP", IPPROTO_IP, CONST_PERSISTENT);
+#endif
+#if (defined(IPPROTO_TCP) || defined(PHP_WIN32))
+	REGISTER_LONG_CONSTANT("STREAM_IPPROTO_TCP", IPPROTO_TCP, CONST_PERSISTENT);
+#endif
+#if (defined(IPPROTO_UDP) || defined(PHP_WIN32))
+	REGISTER_LONG_CONSTANT("STREAM_IPPROTO_UDP", IPPROTO_UDP, CONST_PERSISTENT);
+#endif
+#if (defined(IPPROTO_ICMP) || defined(PHP_WIN32))
+	REGISTER_LONG_CONSTANT("STREAM_IPPROTO_ICMP", IPPROTO_ICMP, CONST_PERSISTENT);
+#endif
+#if (defined(IPPROTO_RAW) || defined(PHP_WIN32))
+	REGISTER_LONG_CONSTANT("STREAM_IPPROTO_RAW", IPPROTO_RAW, CONST_PERSISTENT);
+#endif
+	REGISTER_LONG_CONSTANT("STREAM_SOCK_STREAM", SOCK_STREAM, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_SOCK_DGRAM", SOCK_DGRAM, CONST_PERSISTENT);
+#if defined(SOCK_RAW)
+	REGISTER_LONG_CONSTANT("STREAM_SOCK_RAW", SOCK_RAW, CONST_PERSISTENT);
+#endif
+#if defined(SOCK_SEQPACKET)
+	REGISTER_LONG_CONSTANT("STREAM_SOCK_SEQPACKET", SOCK_SEQPACKET, CONST_PERSISTENT);
+#endif
+#if defined(SOCK_RDM)
+	REGISTER_LONG_CONSTANT("STREAM_SOCK_RDM", SOCK_RDM, CONST_PERSISTENT);
+#endif
+	REGISTER_LONG_CONSTANT("STREAM_PEEK", STREAM_PEEK, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_OOB", STREAM_OOB, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_SERVER_BIND", STREAM_XPORT_BIND, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_SERVER_LISTEN", STREAM_XPORT_LISTEN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("FILE_USE_INCLUDE_PATH", PHP_FILE_USE_INCLUDE_PATH, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("FILE_IGNORE_NEW_LINES", PHP_FILE_IGNORE_NEW_LINES, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("FILE_SKIP_EMPTY_LINES", PHP_FILE_SKIP_EMPTY_LINES, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("FILE_APPEND", PHP_FILE_APPEND, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("FILE_NO_DEFAULT_CONTEXT", PHP_FILE_NO_DEFAULT_CONTEXT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("FILE_TEXT", 0, CONST_PERSISTENT | CONST_DEPRECATED);
+	REGISTER_LONG_CONSTANT("FILE_BINARY", 0, CONST_PERSISTENT | CONST_DEPRECATED);
+#if defined(HAVE_FNMATCH)
+	REGISTER_LONG_CONSTANT("FNM_NOESCAPE", FNM_NOESCAPE, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_FNMATCH)
+	REGISTER_LONG_CONSTANT("FNM_PATHNAME", FNM_PATHNAME, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_FNMATCH)
+	REGISTER_LONG_CONSTANT("FNM_PERIOD", FNM_PERIOD, CONST_PERSISTENT);
+#endif
+#if defined(HAVE_FNMATCH) && defined(FNM_CASEFOLD)
+	REGISTER_LONG_CONSTANT("FNM_CASEFOLD", FNM_CASEFOLD, CONST_PERSISTENT);
+#endif
+}

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/flock_compat.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/flock_compat.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/flock_compat.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -17,7 +17,7 @@
 #ifndef FLOCK_COMPAT_H
 #define FLOCK_COMPAT_H
 
-#if HAVE_STRUCT_FLOCK
+#ifdef HAVE_STRUCT_FLOCK
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/file.h>
@@ -57,17 +57,16 @@
 # define ftruncate(a, b) chsize(a, b)
 #endif /* defined(PHP_WIN32) */
 
-#if !HAVE_INET_ATON
-#if HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-#if HAVE_ARPA_INET_H
-#include <arpa/inet.h>
-#endif
-
-#ifndef PHP_WIN32
+#ifndef HAVE_INET_ATON
+# ifdef HAVE_NETINET_IN_H
+#  include <netinet/in.h>
+# endif
+# ifdef HAVE_ARPA_INET_H
+#  include <arpa/inet.h>
+# endif
+# ifndef PHP_WIN32
 extern int inet_aton(const char *, struct in_addr *);
+# endif
 #endif
-#endif
 
 #endif	/* FLOCK_COMPAT_H */

Deleted: branches/4.0/MgDev/Oem/php/include/ext/standard/hrtime.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/hrtime.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/hrtime.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,56 +0,0 @@
-/*
-   +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
-   +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license at php.net so we can mail you a copy immediately.               |
-   +----------------------------------------------------------------------+
-   | Author: Niklas Keller <kelunik at php.net>                              |
-   | Author: Anatol Belski <ab at php.net>                                   |
-   +----------------------------------------------------------------------+
-*/
-
-#ifndef HRTIME_H
-#define HRTIME_H
-
-#define PHP_HRTIME_PLATFORM_POSIX   0
-#define PHP_HRTIME_PLATFORM_WINDOWS 0
-#define PHP_HRTIME_PLATFORM_APPLE   0
-#define PHP_HRTIME_PLATFORM_HPUX    0
-#define PHP_HRTIME_PLATFORM_AIX     0
-
-#if defined(_POSIX_TIMERS) && ((_POSIX_TIMERS > 0) || defined(__OpenBSD__)) && defined(_POSIX_MONOTONIC_CLOCK) && defined(CLOCK_MONOTONIC)
-# undef  PHP_HRTIME_PLATFORM_POSIX
-# define PHP_HRTIME_PLATFORM_POSIX 1
-#elif defined(_WIN32) || defined(_WIN64)
-# undef  PHP_HRTIME_PLATFORM_WINDOWS
-# define PHP_HRTIME_PLATFORM_WINDOWS 1
-#elif defined(__APPLE__)
-# undef  PHP_HRTIME_PLATFORM_APPLE
-# define PHP_HRTIME_PLATFORM_APPLE 1
-#elif (defined(__hpux) || defined(hpux)) || ((defined(__sun__) || defined(__sun) || defined(sun)) && (defined(__SVR4) || defined(__svr4__)))
-# undef  PHP_HRTIME_PLATFORM_HPUX
-# define PHP_HRTIME_PLATFORM_HPUX 1
-#elif defined(_AIX)
-# undef  PHP_HRTIME_PLATFORM_AIX
-# define PHP_HRTIME_PLATFORM_AIX 1
-#endif
-
-#define HRTIME_AVAILABLE (PHP_HRTIME_PLATFORM_POSIX || PHP_HRTIME_PLATFORM_WINDOWS || PHP_HRTIME_PLATFORM_APPLE || PHP_HRTIME_PLATFORM_HPUX || PHP_HRTIME_PLATFORM_AIX)
-
-BEGIN_EXTERN_C()
-
-typedef uint64_t php_hrtime_t;
-
-PHPAPI php_hrtime_t php_hrtime_current(void);
-
-PHP_MINIT_FUNCTION(hrtime);
-
-END_EXTERN_C()
-
-#endif /* HRTIME_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/html.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/html.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/html.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -30,6 +30,8 @@
 /* reserve bit 6 */
 #define ENT_HTML_SUBSTITUTE_DISALLOWED_CHARS	128
 
+#define PHP_HTML_SPECIALCHARS 	0
+#define PHP_HTML_ENTITIES	 	1
 
 #define ENT_COMPAT		ENT_HTML_QUOTE_DOUBLE
 #define ENT_QUOTES		(ENT_HTML_QUOTE_DOUBLE | ENT_HTML_QUOTE_SINGLE)
@@ -42,11 +44,9 @@
 #define ENT_HTML5		(16|32)
 #define ENT_DISALLOWED	128
 
-void register_html_constants(INIT_FUNC_ARGS);
-
 PHPAPI zend_string *php_escape_html_entities(const unsigned char *old, size_t oldlen, int all, int flags, const char *hint_charset);
 PHPAPI zend_string *php_escape_html_entities_ex(const unsigned char *old, size_t oldlen, int all, int flags, const char *hint_charset, bool double_encode, bool quiet);
 PHPAPI zend_string *php_unescape_html_entities(zend_string *str, int all, int flags, const char *hint_charset);
-PHPAPI unsigned int php_next_utf8_char(const unsigned char *str, size_t str_len, size_t *cursor, int *status);
+PHPAPI unsigned int php_next_utf8_char(const unsigned char *str, size_t str_len, size_t *cursor, zend_result *status);
 
 #endif /* HTML_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_array.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_array.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_array.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -20,6 +20,8 @@
 #ifndef PHP_ARRAY_H
 #define PHP_ARRAY_H
 
+# include "ext/random/php_random.h"
+
 PHP_MINIT_FUNCTION(array);
 PHP_MSHUTDOWN_FUNCTION(array);
 
@@ -29,6 +31,22 @@
 PHPAPI int php_multisort_compare(const void *a, const void *b);
 PHPAPI zend_long php_count_recursive(HashTable *ht);
 
+PHPAPI bool php_array_data_shuffle(const php_random_algo *algo, php_random_status *status, zval *array);
+PHPAPI bool php_array_pick_keys(const php_random_algo *algo, php_random_status *status, zval *input, zend_long num_req, zval *retval, bool silent);
+
+#define PHP_EXTR_OVERWRITE			0
+#define PHP_EXTR_SKIP				1
+#define PHP_EXTR_PREFIX_SAME		2
+#define PHP_EXTR_PREFIX_ALL			3
+#define PHP_EXTR_PREFIX_INVALID		4
+#define PHP_EXTR_PREFIX_IF_EXISTS	5
+#define PHP_EXTR_IF_EXISTS			6
+
+#define PHP_EXTR_REFS				0x100
+
+#define PHP_CASE_LOWER				0
+#define PHP_CASE_UPPER				1
+
 #define PHP_SORT_REGULAR            0
 #define PHP_SORT_NUMERIC            1
 #define PHP_SORT_STRING             2
@@ -38,8 +56,8 @@
 #define PHP_SORT_NATURAL            6
 #define PHP_SORT_FLAG_CASE          8
 
-#define COUNT_NORMAL      0
-#define COUNT_RECURSIVE   1
+#define PHP_COUNT_NORMAL      0
+#define PHP_COUNT_RECURSIVE   1
 
 #define ARRAY_FILTER_USE_BOTH	1
 #define ARRAY_FILTER_USE_KEY	2

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_assert.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_assert.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_assert.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -23,6 +23,14 @@
 PHP_RSHUTDOWN_FUNCTION(assert);
 PHP_MINFO_FUNCTION(assert);
 
+enum {
+	PHP_ASSERT_ACTIVE=1,
+	PHP_ASSERT_CALLBACK,
+	PHP_ASSERT_BAIL,
+	PHP_ASSERT_WARNING,
+	PHP_ASSERT_EXCEPTION
+};
+
 extern PHPAPI zend_class_entry *assertion_error_ce;
 
 #endif /* PHP_ASSERT_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_crypt.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_crypt.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_crypt.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -24,4 +24,7 @@
 PHP_MSHUTDOWN_FUNCTION(crypt);
 PHP_RINIT_FUNCTION(crypt);
 
+/* sha512 crypt has the maximal salt length of 123 characters */
+#define PHP_MAX_SALT_LEN 123
+
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_dir.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_dir.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_dir.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -20,9 +20,6 @@
 /* directory functions */
 PHP_MINIT_FUNCTION(dir);
 PHP_RINIT_FUNCTION(dir);
-PHP_FUNCTION(closedir);
-PHP_FUNCTION(rewinddir);
-PHP_FUNCTION(readdir);
 
 #define PHP_SCANDIR_SORT_ASCENDING 0
 #define PHP_SCANDIR_SORT_DESCENDING 1

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_dns.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_dns.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_dns.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -29,7 +29,7 @@
 #elif defined(HAVE_RES_NSEARCH)
 #define php_dns_search(res, dname, class, type, answer, anslen) \
 			res_nsearch(res, dname, class, type, answer, anslen);
-#if HAVE_RES_NDESTROY
+#ifdef HAVE_RES_NDESTROY
 #define php_dns_free_handle(res) \
 			res_ndestroy(res); \
 			php_dns_free_res(res)
@@ -52,16 +52,37 @@
 #define HAVE_DNS_SEARCH_FUNC 1
 #endif
 
-#if HAVE_DNS_SEARCH_FUNC && HAVE_DN_EXPAND && HAVE_DN_SKIPNAME
+#if defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_DN_EXPAND) && defined(HAVE_DN_SKIPNAME)
 #define HAVE_FULL_DNS_FUNCS 1
 #endif
 
-#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC
-# if defined(PHP_WIN32) || HAVE_FULL_DNS_FUNCS
-PHP_MINIT_FUNCTION(dns);
-# endif
-#endif /* defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC */
+#if defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))
+#define PHP_DNS_A      0x00000001
+#define PHP_DNS_NS     0x00000002
+#define PHP_DNS_CNAME  0x00000010
+#define PHP_DNS_SOA    0x00000020
+#define PHP_DNS_PTR    0x00000800
+#define PHP_DNS_HINFO  0x00001000
+#if !defined(PHP_WIN32)
+# define PHP_DNS_CAA    0x00002000
+#endif
+#define PHP_DNS_MX     0x00004000
+#define PHP_DNS_TXT    0x00008000
+#define PHP_DNS_A6     0x01000000
+#define PHP_DNS_SRV    0x02000000
+#define PHP_DNS_NAPTR  0x04000000
+#define PHP_DNS_AAAA   0x08000000
+#define PHP_DNS_ANY    0x10000000
 
+#if defined(PHP_WIN32)
+# define PHP_DNS_NUM_TYPES	12	/* Number of DNS Types Supported by PHP currently */
+# define PHP_DNS_ALL    (PHP_DNS_A|PHP_DNS_NS|PHP_DNS_CNAME|PHP_DNS_SOA|PHP_DNS_PTR|PHP_DNS_HINFO|PHP_DNS_MX|PHP_DNS_TXT|PHP_DNS_A6|PHP_DNS_SRV|PHP_DNS_NAPTR|PHP_DNS_AAAA)
+#else
+# define PHP_DNS_NUM_TYPES	13	/* Number of DNS Types Supported by PHP currently */
+# define PHP_DNS_ALL   (PHP_DNS_A|PHP_DNS_NS|PHP_DNS_CNAME|PHP_DNS_SOA|PHP_DNS_PTR|PHP_DNS_HINFO|PHP_DNS_CAA|PHP_DNS_MX|PHP_DNS_TXT|PHP_DNS_A6|PHP_DNS_SRV|PHP_DNS_NAPTR|PHP_DNS_AAAA)
+#endif
+#endif
+
 #ifndef INT16SZ
 #define INT16SZ		2
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_ext_syslog.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_ext_syslog.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_ext_syslog.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -22,11 +22,7 @@
 #include "php_syslog.h"
 
 PHP_MINIT_FUNCTION(syslog);
-PHP_RINIT_FUNCTION(syslog);
-#ifdef PHP_WIN32
 PHP_RSHUTDOWN_FUNCTION(syslog);
-#endif
-PHP_MSHUTDOWN_FUNCTION(syslog);
 
 #endif
 

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_http.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_http.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_http.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -18,12 +18,12 @@
 #define PHP_HTTP_H
 
 #include "php.h"
+#include "zend_types.h" /* for zend_string */
 #include "zend_smart_str.h"
 
 PHPAPI void php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
 				const char *num_prefix, size_t num_prefix_len,
-				const char *key_prefix, size_t key_prefix_len,
-				const char *key_suffix, size_t key_suffix_len,
-				zval *type, const char *arg_sep, int enc_type);
+				const zend_string *key_prefix,
+				zval *type, const zend_string *arg_sep, int enc_type);
 
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_image.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_image.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_image.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -44,13 +44,11 @@
   IMAGE_FILETYPE_ICO,
   IMAGE_FILETYPE_WEBP,
   IMAGE_FILETYPE_AVIF,
-/* WHEN EXTENDING: PLEASE ALSO REGISTER IN image.c:PHP_MINIT_FUNCTION(imagetypes) */
+/* WHEN EXTENDING: PLEASE ALSO REGISTER IN basic_function.stub.php */
   IMAGE_FILETYPE_COUNT
 } image_filetype;
 /* }}} */
 
-PHP_MINIT_FUNCTION(imagetypes);
-
 PHPAPI int php_getimagetype(php_stream *stream, const char *input, char *filetype);
 
 PHPAPI char * php_image_type_to_mime_type(int image_type);

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_lcg.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_lcg.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_lcg.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,38 +1 @@
-/*
-   +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
-   +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license at php.net so we can mail you a copy immediately.               |
-   +----------------------------------------------------------------------+
-   | Author: Sascha Schumann <sascha at schumann.cx>                         |
-   +----------------------------------------------------------------------+
-*/
-
-#ifndef PHP_LCG_H
-#define PHP_LCG_H
-
-#include "ext/standard/basic_functions.h"
-
-typedef struct {
-	int32_t s1;
-	int32_t s2;
-	int seeded;
-} php_lcg_globals;
-
-PHPAPI double php_combined_lcg(void);
-
-PHP_MINIT_FUNCTION(lcg);
-
-#ifdef ZTS
-#define LCG(v) ZEND_TSRMG(lcg_globals_id, php_lcg_globals *, v)
-#else
-#define LCG(v) (lcg_globals.v)
-#endif
-
-#endif
+#include "ext/random/php_random.h"

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_mail.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_mail.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_mail.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -33,7 +33,7 @@
 		} \
 		php_mail_build_headers_elems(&s, key, val); \
 	} else { \
-		zend_type_error("Header \"%s\" must be of type array|string, %s given", ZSTR_VAL(key), zend_zval_type_name(val)); \
+		zend_type_error("Header \"%s\" must be of type array|string, %s given", ZSTR_VAL(key), zend_zval_value_name(val)); \
 	} \
 } while(0)
 
@@ -45,9 +45,16 @@
 	} else if (Z_TYPE_P(val) == IS_ARRAY) { \
 		php_mail_build_headers_elems(&s, key, val); \
 	} else { \
-		zend_type_error("Header \"%s\" must be of type array|string, %s given", ZSTR_VAL(key), zend_zval_type_name(val)); \
+		zend_type_error("Header \"%s\" must be of type array|string, %s given", ZSTR_VAL(key), zend_zval_value_name(val)); \
 	} \
 } while(0)
 
+typedef enum {
+	NO_HEADER_ERROR,
+	CONTAINS_LF_ONLY,
+	CONTAINS_CR_ONLY,
+	CONTAINS_CRLF,
+	CONTAINS_NULL
+} php_mail_header_value_error_type;
 
 #endif /* PHP_MAIL_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_math.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_math.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_math.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -21,6 +21,7 @@
 PHPAPI double _php_math_round(double value, int places, int mode);
 PHPAPI zend_string *_php_math_number_format(double d, int dec, char dec_point, char thousand_sep);
 PHPAPI zend_string *_php_math_number_format_ex(double d, int dec, const char *dec_point, size_t dec_point_len, const char *thousand_sep, size_t thousand_sep_len);
+PHPAPI zend_string *_php_math_number_format_long(zend_long num, zend_long dec, const char *dec_point, size_t dec_point_len, const char *thousand_sep, size_t thousand_sep_len);
 PHPAPI zend_string * _php_math_longtobase(zend_long arg, int base);
 PHPAPI zend_long _php_math_basetolong(zval *arg, int base);
 PHPAPI void _php_math_basetozval(zend_string *str, int base, zval *ret);

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_mt_rand.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_mt_rand.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_mt_rand.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,40 +1 @@
-/*
-   +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
-   +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license at php.net so we can mail you a copy immediately.               |
-   +----------------------------------------------------------------------+
-   | Authors: Rasmus Lerdorf <rasmus at php.net>                             |
-   |          Zeev Suraski <zeev at php.net>                                 |
-   |          Pedro Melo <melo at ip.pt>                                     |
-   |          Sterling Hughes <sterling at php.net>                          |
-   |                                                                      |
-   | Based on code from: Shawn Cokus <Cokus at math.washington.edu>          |
-   +----------------------------------------------------------------------+
- */
-
-#ifndef PHP_MT_RAND_H
-#define PHP_MT_RAND_H
-
-#include "php_lcg.h"
-#include "php_rand.h"
-
-#define PHP_MT_RAND_MAX ((zend_long) (0x7FFFFFFF)) /* (1<<31) - 1 */
-
-#define MT_RAND_MT19937 0
-#define MT_RAND_PHP 1
-
-PHPAPI void php_mt_srand(uint32_t seed);
-PHPAPI uint32_t php_mt_rand(void);
-PHPAPI zend_long php_mt_rand_range(zend_long min, zend_long max);
-PHPAPI zend_long php_mt_rand_common(zend_long min, zend_long max);
-
-PHP_MINIT_FUNCTION(mt_rand);
-
-#endif	/* PHP_MT_RAND_H */
+#include "ext/random/php_random.h"

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_password.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_password.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_password.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -24,7 +24,7 @@
 #define PHP_PASSWORD_DEFAULT    PHP_PASSWORD_BCRYPT
 #define PHP_PASSWORD_BCRYPT_COST 10
 
-#if HAVE_ARGON2LIB
+#ifdef HAVE_ARGON2LIB
 /**
  * When updating these values, synchronize ext/sodium/sodium_pwhash.c values.
  * Note that libargon expresses memlimit in KB, while libsoidum uses bytes.
@@ -44,7 +44,7 @@
 } php_password_algo;
 
 extern const php_password_algo php_password_algo_bcrypt;
-#if HAVE_ARGON2LIB
+#ifdef HAVE_ARGON2LIB
 extern const php_password_algo php_password_algo_argon2i;
 extern const php_password_algo php_password_algo_argon2id;
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_rand.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_rand.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_rand.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,72 +1 @@
-/*
-   +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
-   +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license at php.net so we can mail you a copy immediately.               |
-   +----------------------------------------------------------------------+
-   | Authors: Rasmus Lerdorf <rasmus at php.net>                             |
-   |          Zeev Suraski <zeev at php.net>                                 |
-   |          Pedro Melo <melo at ip.pt>                                     |
-   |          Sterling Hughes <sterling at php.net>                          |
-   |                                                                      |
-   | Based on code from: Shawn Cokus <Cokus at math.washington.edu>          |
-   +----------------------------------------------------------------------+
- */
-
-#ifndef PHP_RAND_H
-#define	PHP_RAND_H
-
-#include "php_lcg.h"
-#include "php_mt_rand.h"
-
-/* System Rand functions */
-#ifndef RAND_MAX
-#define RAND_MAX PHP_MT_RAND_MAX
-#endif
-
-#define PHP_RAND_MAX PHP_MT_RAND_MAX
-
-/*
- * A bit of tricky math here.  We want to avoid using a modulus because
- * that simply tosses the high-order bits and might skew the distribution
- * of random values over the range.  Instead we map the range directly.
- *
- * We need to map the range from 0...M evenly to the range a...b
- * Let n = the random number and n' = the mapped random number
- *
- * Then we have: n' = a + n(b-a)/M
- *
- * We have a problem here in that only n==M will get mapped to b which
- # means the chances of getting b is much much less than getting any of
- # the other values in the range.  We can fix this by increasing our range
- # artificially and using:
- #
- #               n' = a + n(b-a+1)/M
- *
- # Now we only have a problem if n==M which would cause us to produce a
- # number of b+1 which would be bad.  So we bump M up by one to make sure
- # this will never happen, and the final algorithm looks like this:
- #
- #               n' = a + n(b-a+1)/(M+1)
- *
- * -RL
- */
-#define RAND_RANGE_BADSCALING(__n, __min, __max, __tmax) \
-	(__n) = (__min) + (zend_long) ((double) ( (double) (__max) - (__min) + 1.0) * ((__n) / ((__tmax) + 1.0)))
-
-#ifdef PHP_WIN32
-#define GENERATE_SEED() (((zend_long) (time(0) * GetCurrentProcessId())) ^ ((zend_long) (1000000.0 * php_combined_lcg())))
-#else
-#define GENERATE_SEED() (((zend_long) (time(0) * getpid())) ^ ((zend_long) (1000000.0 * php_combined_lcg())))
-#endif
-
-PHPAPI void php_srand(zend_long seed);
-PHPAPI zend_long php_rand(void);
-
-#endif	/* PHP_RAND_H */
+#include "ext/random/php_random.h"

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_random.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_random.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_random.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,50 +1 @@
-/*
-   +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
-   +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license at php.net so we can mail you a copy immediately.               |
-   +----------------------------------------------------------------------+
-   | Authors: Sammy Kaye Powers <me at sammyk.me>                            |
-   +----------------------------------------------------------------------+
-*/
-
-#ifndef PHP_RANDOM_H
-#define PHP_RANDOM_H
-
-BEGIN_EXTERN_C()
-
-PHP_MINIT_FUNCTION(random);
-PHP_MSHUTDOWN_FUNCTION(random);
-
-typedef struct {
-	int fd;
-} php_random_globals;
-
-#define php_random_bytes_throw(b, s) php_random_bytes((b), (s), 1)
-#define php_random_bytes_silent(b, s) php_random_bytes((b), (s), 0)
-
-#define php_random_int_throw(min, max, result) \
-	php_random_int((min), (max), (result), 1)
-#define php_random_int_silent(min, max, result) \
-	php_random_int((min), (max), (result), 0)
-
-PHPAPI int php_random_bytes(void *bytes, size_t size, bool should_throw);
-PHPAPI int php_random_int(zend_long min, zend_long max, zend_long *result, bool should_throw);
-
-#ifdef ZTS
-# define RANDOM_G(v) ZEND_TSRMG(random_globals_id, php_random_globals *, v)
-extern PHPAPI int random_globals_id;
-#else
-# define RANDOM_G(v) random_globals.v
-extern PHPAPI php_random_globals random_globals;
-#endif
-
-END_EXTERN_C()
-
-#endif
+#include "ext/random/php_random.h"
\ No newline at end of file

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_standard.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_standard.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_standard.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -23,7 +23,6 @@
 #include "php_mail.h"
 #include "md5.h"
 #include "sha1.h"
-#include "hrtime.h"
 #include "html.h"
 #include "exec.h"
 #include "file.h"
@@ -42,13 +41,11 @@
 #include "dl.h"
 #include "php_crypt.h"
 #include "head.h"
-#include "php_lcg.h"
 #include "php_output.h"
 #include "php_array.h"
 #include "php_assert.h"
 #include "php_versioning.h"
 #include "php_password.h"
-#include "php_random.h"
 
 #include "php_version.h"
 #define PHP_STANDARD_VERSION PHP_VERSION

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/php_string.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/php_string.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/php_string.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -18,14 +18,13 @@
 #ifndef PHP_STRING_H
 #define PHP_STRING_H
 
-#if defined(ZTS)
+# include "ext/random/php_random.h"
+
+#ifdef ZTS
 PHP_MINIT_FUNCTION(localeconv);
 PHP_MSHUTDOWN_FUNCTION(localeconv);
 #endif
-#if HAVE_NL_LANGINFO
-PHP_MINIT_FUNCTION(nl_langinfo);
-#endif
-#if ZEND_INTRIN_SSE4_2_FUNC_PTR
+#ifdef ZEND_INTRIN_SSE4_2_FUNC_PTR
 PHP_MINIT_FUNCTION(string_intrin);
 #endif
 
@@ -33,7 +32,7 @@
 	strnatcmp_ex(a, strlen(a), b, strlen(b), 0)
 #define strnatcasecmp(a, b) \
 	strnatcmp_ex(a, strlen(a), b, strlen(b), 1)
-PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len, int fold_case);
+PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len, bool is_case_insensitive);
 PHPAPI struct lconv *localeconv_r(struct lconv *out);
 PHPAPI char *php_strtoupper(char *s, size_t len);
 PHPAPI char *php_strtolower(char *s, size_t len);
@@ -63,7 +62,9 @@
 PHPAPI int string_natural_compare_function(zval *result, zval *op1, zval *op2);
 PHPAPI int string_natural_case_compare_function(zval *result, zval *op1, zval *op2);
 
-#if defined(_REENTRANT)
+PHPAPI bool php_binary_string_shuffle(const php_random_algo *algo, php_random_status *status, char *str, zend_long len);
+
+#ifdef _REENTRANT
 # ifdef PHP_WIN32
 #  include <wchar.h>
 # endif
@@ -74,6 +75,16 @@
 # define php_mb_reset() php_ignore_value(mblen(NULL, 0))
 #endif
 
-void register_string_constants(INIT_FUNC_ARGS);
+#define PHP_STR_PAD_LEFT		0
+#define PHP_STR_PAD_RIGHT		1
+#define PHP_STR_PAD_BOTH		2
+#define PHP_PATHINFO_DIRNAME 	1
+#define PHP_PATHINFO_BASENAME 	2
+#define PHP_PATHINFO_EXTENSION 	4
+#define PHP_PATHINFO_FILENAME 	8
+#define PHP_PATHINFO_ALL	(PHP_PATHINFO_DIRNAME | PHP_PATHINFO_BASENAME | PHP_PATHINFO_EXTENSION | PHP_PATHINFO_FILENAME)
 
+#define PHP_STR_STRSPN			0
+#define PHP_STR_STRCSPN			1
+
 #endif /* PHP_STRING_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/proc_open.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/proc_open.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/proc_open.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -43,4 +43,10 @@
 	zend_resource **pipes;
 	zend_string *command;
 	php_process_env env;
+#if HAVE_SYS_WAIT_H
+	/* We can only request the status once before it becomes unavailable.
+	 * Cache the result so we can request it multiple times. */
+	int cached_exit_wait_status_value;
+	bool has_cached_exit_wait_status;
+#endif
 } php_process_handle;

Modified: branches/4.0/MgDev/Oem/php/include/ext/standard/user_filters_arginfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/standard/user_filters_arginfo.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/standard/user_filters_arginfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: c7ae14efaeb0e8f5fdd6ddf92574a35bd5c860a1 */
+ * Stub hash: 1c03251b4e0b22056da43bf86087d6996454d2a0 */
 
 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_php_user_filter_filter, 0, 4, IS_LONG, 0)
 	ZEND_ARG_INFO(0, in)
@@ -27,6 +27,16 @@
 	ZEND_FE_END
 };
 
+static void register_user_filters_symbols(int module_number)
+{
+	REGISTER_LONG_CONSTANT("PSFS_PASS_ON", PSFS_PASS_ON, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PSFS_FEED_ME", PSFS_FEED_ME, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PSFS_ERR_FATAL", PSFS_ERR_FATAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PSFS_FLAG_NORMAL", PSFS_FLAG_NORMAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PSFS_FLAG_FLUSH_INC", PSFS_FLAG_FLUSH_INC, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PSFS_FLAG_FLUSH_CLOSE", PSFS_FLAG_FLUSH_CLOSE, CONST_PERSISTENT);
+}
+
 static zend_class_entry *register_class_php_user_filter(void)
 {
 	zend_class_entry ce, *class_entry;
@@ -49,7 +59,7 @@
 	zval property_stream_default_value;
 	ZVAL_NULL(&property_stream_default_value);
 	zend_string *property_stream_name = zend_string_init("stream", sizeof("stream") - 1, 1);
-	zend_declare_property_ex(class_entry, property_stream_name, &property_stream_default_value, ZEND_ACC_PUBLIC, NULL);
+	zend_declare_typed_property(class_entry, property_stream_name, &property_stream_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
 	zend_string_release(property_stream_name);
 
 	return class_entry;

Modified: branches/4.0/MgDev/Oem/php/include/ext/xml/php_xml.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/xml/php_xml.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/xml/php_xml.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -39,4 +39,17 @@
 
 #define phpext_xml_ptr xml_module_ptr
 
+enum php_xml_option {
+	PHP_XML_OPTION_CASE_FOLDING = 1,
+	PHP_XML_OPTION_TARGET_ENCODING,
+	PHP_XML_OPTION_SKIP_TAGSTART,
+	PHP_XML_OPTION_SKIP_WHITE
+};
+
+#ifdef LIBXML_EXPAT_COMPAT
+#define PHP_XML_SAX_IMPL "libxml"
+#else
+#define PHP_XML_SAX_IMPL "expat"
+#endif
+
 #endif /* PHP_XML_H */

Modified: branches/4.0/MgDev/Oem/php/include/ext/xml/xml_arginfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/ext/xml/xml_arginfo.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/ext/xml/xml_arginfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 19ecc0e3b7a82f8b992a311788919154cdb28a5d */
+ * Stub hash: f87e295b35cd43db72a936ee5745297a45730090 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_xml_parser_create, 0, 0, XMLParser, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 1, "null")
@@ -10,18 +10,18 @@
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, separator, IS_STRING, 0, "\":\"")
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_object, 0, 2, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_object, 0, 2, IS_TRUE, 0)
 	ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0)
 	ZEND_ARG_TYPE_INFO(0, object, IS_OBJECT, 0)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_element_handler, 0, 3, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_element_handler, 0, 3, IS_TRUE, 0)
 	ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0)
 	ZEND_ARG_INFO(0, start_handler)
 	ZEND_ARG_INFO(0, end_handler)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_character_data_handler, 0, 2, _IS_BOOL, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_character_data_handler, 0, 2, IS_TRUE, 0)
 	ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0)
 	ZEND_ARG_INFO(0, handler)
 ZEND_END_ARG_INFO()
@@ -46,7 +46,7 @@
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, is_final, _IS_BOOL, 0, "false")
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_parse_into_struct, 0, 3, IS_LONG, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_xml_parse_into_struct, 0, 3, MAY_BE_LONG|MAY_BE_FALSE)
 	ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0)
 	ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0)
 	ZEND_ARG_INFO(1, values)
@@ -77,7 +77,7 @@
 	ZEND_ARG_INFO(0, value)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_xml_parser_get_option, 0, 2, MAY_BE_STRING|MAY_BE_LONG)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_xml_parser_get_option, 0, 2, MAY_BE_STRING|MAY_BE_LONG|MAY_BE_BOOL)
 	ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0)
 	ZEND_ARG_TYPE_INFO(0, option, IS_LONG, 0)
 ZEND_END_ARG_INFO()
@@ -138,6 +138,37 @@
 	ZEND_FE_END
 };
 
+static void register_xml_symbols(int module_number)
+{
+	REGISTER_LONG_CONSTANT("XML_ERROR_NONE", XML_ERROR_NONE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_NO_MEMORY", XML_ERROR_NO_MEMORY, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_SYNTAX", XML_ERROR_SYNTAX, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_NO_ELEMENTS", XML_ERROR_NO_ELEMENTS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_INVALID_TOKEN", XML_ERROR_INVALID_TOKEN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_UNCLOSED_TOKEN", XML_ERROR_UNCLOSED_TOKEN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_PARTIAL_CHAR", XML_ERROR_PARTIAL_CHAR, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_TAG_MISMATCH", XML_ERROR_TAG_MISMATCH, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_DUPLICATE_ATTRIBUTE", XML_ERROR_DUPLICATE_ATTRIBUTE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_JUNK_AFTER_DOC_ELEMENT", XML_ERROR_JUNK_AFTER_DOC_ELEMENT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_PARAM_ENTITY_REF", XML_ERROR_PARAM_ENTITY_REF, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_UNDEFINED_ENTITY", XML_ERROR_UNDEFINED_ENTITY, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_RECURSIVE_ENTITY_REF", XML_ERROR_RECURSIVE_ENTITY_REF, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_ASYNC_ENTITY", XML_ERROR_ASYNC_ENTITY, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_BAD_CHAR_REF", XML_ERROR_BAD_CHAR_REF, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_BINARY_ENTITY_REF", XML_ERROR_BINARY_ENTITY_REF, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF", XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_MISPLACED_XML_PI", XML_ERROR_MISPLACED_XML_PI, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_UNKNOWN_ENCODING", XML_ERROR_UNKNOWN_ENCODING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_INCORRECT_ENCODING", XML_ERROR_INCORRECT_ENCODING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_UNCLOSED_CDATA_SECTION", XML_ERROR_UNCLOSED_CDATA_SECTION, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_ERROR_EXTERNAL_ENTITY_HANDLING", XML_ERROR_EXTERNAL_ENTITY_HANDLING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_OPTION_CASE_FOLDING", PHP_XML_OPTION_CASE_FOLDING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_OPTION_TARGET_ENCODING", PHP_XML_OPTION_TARGET_ENCODING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_OPTION_SKIP_TAGSTART", PHP_XML_OPTION_SKIP_TAGSTART, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("XML_OPTION_SKIP_WHITE", PHP_XML_OPTION_SKIP_WHITE, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("XML_SAX_IMPL", PHP_XML_SAX_IMPL, CONST_PERSISTENT);
+}
+
 static zend_class_entry *register_class_XMLParser(void)
 {
 	zend_class_entry ce, *class_entry;

Modified: branches/4.0/MgDev/Oem/php/include/main/SAPI.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/SAPI.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/SAPI.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -238,7 +238,7 @@
 
 	void (*register_server_variables)(zval *track_vars_array);
 	void (*log_message)(const char *message, int syslog_type_int);
-	double (*get_request_time)(void);
+	zend_result (*get_request_time)(double *request_time);
 	void (*terminate_process)(void);
 
 	char *php_ini_path_override;
@@ -262,7 +262,7 @@
 	void (*ini_defaults)(HashTable *configuration_hash);
 	int phpinfo_as_text;
 
-	char *ini_entries;
+	const char *ini_entries;
 	const zend_function_entry *additional_functions;
 	unsigned int (*input_filter_init)(void);
 };

Modified: branches/4.0/MgDev/Oem/php/include/main/config.w32.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/config.w32.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/config.w32.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -5,8 +5,8 @@
 /* Define the minimum supported version */
 #undef _WIN32_WINNT
 #undef NTDDI_VERSION
-#define _WIN32_WINNT 0x0601
-#define NTDDI_VERSION 0x06010000
+#define _WIN32_WINNT 0x0602
+#define NTDDI_VERSION 0x06020000
 
 /* Default PHP / PEAR directories */
 #define PHP_CONFIG_FILE_PATH ""
@@ -27,6 +27,10 @@
 #define DEFAULT_SHORT_OPEN_TAG "1"
 
 /* Platform-Specific Configuration. Should not be changed. */
+/* Alignment for Zend memory allocator */
+#define ZEND_MM_ALIGNMENT (size_t)8
+#define ZEND_MM_ALIGNMENT_LOG2 (size_t)3
+#define ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT 0
 #define PHP_SIGCHILD 0
 #define HAVE_GETSERVBYNAME 1
 #define HAVE_GETSERVBYPORT 1
@@ -163,6 +167,8 @@
 
 #define HAVE_STRNLEN 1
 
+#define ZEND_CHECK_STACK_LIMIT 1
+
 /* have the wspiapi.h header file */
 #define HAVE_WSPIAPI_H 1
 
@@ -445,12 +451,6 @@
 #define HAVE_EXIF 1
 
 /* Using MySQL native driver */
-#define MYSQLI_USE_MYSQLND 1
-
-/* Have MySQLi library */
-#define HAVE_MYSQLILIB 1
-
-/* Using MySQL native driver */
 #define PDO_USE_MYSQLND 1
 
 /* Have PostgreSQL library */

Added: branches/4.0/MgDev/Oem/php/include/main/main_arginfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/main_arginfo.h	                        (rev 0)
+++ branches/4.0/MgDev/Oem/php/include/main/main_arginfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -0,0 +1,98 @@
+/* This is a generated file, edit the .stub.php file instead.
+ * Stub hash: 58c8b6ec69650d241919ebba4f957b4b141fb9f2 */
+
+
+
+static void register_main_symbols(int module_number)
+{
+	REGISTER_STRING_CONSTANT("PHP_VERSION", PHP_VERSION, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_MAJOR_VERSION", PHP_MAJOR_VERSION, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_MINOR_VERSION", PHP_MINOR_VERSION, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_RELEASE_VERSION", PHP_RELEASE_VERSION, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_EXTRA_VERSION", PHP_EXTRA_VERSION, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_VERSION_ID", PHP_VERSION_ID, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_ZTS", PHP_ZTS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_DEBUG", PHP_DEBUG, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_OS", PHP_OS_STR, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_OS_FAMILY", PHP_OS_FAMILY, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("DEFAULT_INCLUDE_PATH", PHP_INCLUDE_PATH, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PEAR_INSTALL_DIR", PEAR_INSTALLDIR, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PEAR_EXTENSION_DIR", PHP_EXTENSION_DIR, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_EXTENSION_DIR", PHP_EXTENSION_DIR, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_PREFIX", PHP_PREFIX, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_BINDIR", PHP_BINDIR, CONST_PERSISTENT);
+#if !defined(PHP_WIN32)
+	REGISTER_STRING_CONSTANT("PHP_MANDIR", PHP_MANDIR, CONST_PERSISTENT);
+#endif
+	REGISTER_STRING_CONSTANT("PHP_LIBDIR", PHP_LIBDIR, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_DATADIR", PHP_DATADIR, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_SYSCONFDIR", PHP_SYSCONFDIR, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_LOCALSTATEDIR", PHP_LOCALSTATEDIR, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_CONFIG_FILE_PATH", PHP_CONFIG_FILE_PATH, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_CONFIG_FILE_SCAN_DIR", PHP_CONFIG_FILE_SCAN_DIR, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_SHLIB_SUFFIX", PHP_SHLIB_SUFFIX, CONST_PERSISTENT);
+	REGISTER_STRING_CONSTANT("PHP_EOL", PHP_EOL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_MAXPATHLEN", MAXPATHLEN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_INT_MAX", ZEND_LONG_MAX, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_INT_MIN", ZEND_LONG_MIN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_INT_SIZE", SIZEOF_ZEND_LONG, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_FD_SETSIZE", FD_SETSIZE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_FLOAT_DIG", DBL_DIG, CONST_PERSISTENT);
+	REGISTER_DOUBLE_CONSTANT("PHP_FLOAT_EPSILON", DBL_EPSILON, CONST_PERSISTENT);
+	REGISTER_DOUBLE_CONSTANT("PHP_FLOAT_MAX", DBL_MAX, CONST_PERSISTENT);
+	REGISTER_DOUBLE_CONSTANT("PHP_FLOAT_MIN", DBL_MIN, CONST_PERSISTENT);
+#if defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("PHP_WINDOWS_VERSION_MAJOR", EG(windows_version_info).dwMajorVersion, CONST_PERSISTENT);
+#endif
+#if defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("PHP_WINDOWS_VERSION_MINOR", EG(windows_version_info).dwMinorVersion, CONST_PERSISTENT);
+#endif
+#if defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("PHP_WINDOWS_VERSION_BUILD", EG(windows_version_info).dwBuildNumber, CONST_PERSISTENT);
+#endif
+#if defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("PHP_WINDOWS_VERSION_PLATFORM", EG(windows_version_info).dwPlatformId, CONST_PERSISTENT);
+#endif
+#if defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("PHP_WINDOWS_VERSION_SP_MAJOR", EG(windows_version_info).wServicePackMajor, CONST_PERSISTENT);
+#endif
+#if defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("PHP_WINDOWS_VERSION_SP_MINOR", EG(windows_version_info).wServicePackMinor, CONST_PERSISTENT);
+#endif
+#if defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("PHP_WINDOWS_VERSION_SUITEMASK", EG(windows_version_info).wSuiteMask, CONST_PERSISTENT);
+#endif
+#if defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("PHP_WINDOWS_VERSION_PRODUCTTYPE", EG(windows_version_info).wProductType, CONST_PERSISTENT);
+#endif
+#if defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("PHP_WINDOWS_NT_DOMAIN_CONTROLLER", VER_NT_DOMAIN_CONTROLLER, CONST_PERSISTENT);
+#endif
+#if defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("PHP_WINDOWS_NT_SERVER", VER_NT_SERVER, CONST_PERSISTENT);
+#endif
+#if defined(PHP_WIN32)
+	REGISTER_LONG_CONSTANT("PHP_WINDOWS_NT_WORKSTATION", VER_NT_WORKSTATION, CONST_PERSISTENT);
+#endif
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_START", PHP_OUTPUT_HANDLER_START, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_WRITE", PHP_OUTPUT_HANDLER_WRITE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_FLUSH", PHP_OUTPUT_HANDLER_FLUSH, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_CLEAN", PHP_OUTPUT_HANDLER_CLEAN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_FINAL", PHP_OUTPUT_HANDLER_FINAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_CONT", PHP_OUTPUT_HANDLER_WRITE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_END", PHP_OUTPUT_HANDLER_FINAL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_CLEANABLE", PHP_OUTPUT_HANDLER_CLEANABLE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_FLUSHABLE", PHP_OUTPUT_HANDLER_FLUSHABLE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_REMOVABLE", PHP_OUTPUT_HANDLER_REMOVABLE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_STDFLAGS", PHP_OUTPUT_HANDLER_STDFLAGS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_STARTED", PHP_OUTPUT_HANDLER_STARTED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("PHP_OUTPUT_HANDLER_DISABLED", PHP_OUTPUT_HANDLER_DISABLED, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("UPLOAD_ERR_OK", PHP_UPLOAD_ERROR_OK, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("UPLOAD_ERR_INI_SIZE", PHP_UPLOAD_ERROR_A, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("UPLOAD_ERR_FORM_SIZE", PHP_UPLOAD_ERROR_B, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("UPLOAD_ERR_PARTIAL", PHP_UPLOAD_ERROR_C, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("UPLOAD_ERR_NO_FILE", PHP_UPLOAD_ERROR_D, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("UPLOAD_ERR_NO_TMP_DIR", PHP_UPLOAD_ERROR_E, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("UPLOAD_ERR_CANT_WRITE", PHP_UPLOAD_ERROR_F, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("UPLOAD_ERR_EXTENSION", PHP_UPLOAD_ERROR_X, CONST_PERSISTENT);
+}

Modified: branches/4.0/MgDev/Oem/php/include/main/php.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/php.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/php.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -22,7 +22,7 @@
 #include <dmalloc.h>
 #endif
 
-#define PHP_API_VERSION 20210902
+#define PHP_API_VERSION 20230831
 #define PHP_HAVE_STREAMS
 #define YYDEBUG 0
 #define PHP_DEFAULT_CHARSET "UTF-8"
@@ -183,6 +183,10 @@
 #define explicit_bzero php_explicit_bzero
 #endif
 
+BEGIN_EXTERN_C()
+PHPAPI int php_safe_bcmp(const zend_string *a, const zend_string *b);
+END_EXTERN_C()
+
 #ifndef HAVE_STRTOK_R
 BEGIN_EXTERN_C()
 char *strtok_r(char *s, const char *delim, char **last);
@@ -215,8 +219,6 @@
 
 #include <stdarg.h>
 
-#include "php_stdint.h"
-
 #include "zend_hash.h"
 #include "zend_alloc.h"
 #include "zend_stack.h"
@@ -301,9 +303,9 @@
 PHPAPI size_t php_write(void *buf, size_t size);
 PHPAPI size_t php_printf(const char *format, ...) PHP_ATTRIBUTE_FORMAT(printf, 1, 2);
 PHPAPI size_t php_printf_unchecked(const char *format, ...);
-PHPAPI int php_during_module_startup(void);
-PHPAPI int php_during_module_shutdown(void);
-PHPAPI int php_get_module_initialized(void);
+PHPAPI bool php_during_module_startup(void);
+PHPAPI bool php_during_module_shutdown(void);
+PHPAPI bool php_get_module_initialized(void);
 #ifdef HAVE_SYSLOG_H
 #include "php_syslog.h"
 #define php_log_err(msg) php_log_err_with_severity(msg, LOG_NOTICE)
@@ -348,6 +350,7 @@
 #define phpin zendin
 
 #define php_memnstr zend_memnstr
+#define php_memnistr zend_memnistr
 
 /* functions */
 BEGIN_EXTERN_C()
@@ -435,4 +438,10 @@
 
 #include "php_reentrancy.h"
 
+/* the following typedefs are deprecated and will be removed in PHP
+ * 9.0; use the standard C99 types instead */
+typedef bool zend_bool;
+typedef intptr_t zend_intptr_t;
+typedef uintptr_t zend_uintptr_t;
+
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/main/php_globals.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/php_globals.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/php_globals.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -19,6 +19,8 @@
 
 #include "zend_globals.h"
 
+#include <stdint.h>
+
 typedef struct _php_core_globals php_core_globals;
 
 #ifdef ZTS
@@ -51,12 +53,19 @@
 } arg_separators;
 
 struct _php_core_globals {
+	zend_long output_buffering;
+
 	bool implicit_flush;
 
-	zend_long output_buffering;
-
 	bool enable_dl;
 
+	uint8_t display_errors;
+	bool display_startup_errors;
+	bool log_errors;
+	bool ignore_repeated_errors;
+	bool ignore_repeated_source;
+	bool report_memleaks;
+
 	char *output_handler;
 
 	char *unserialize_callback_func;
@@ -65,12 +74,6 @@
 	zend_long memory_limit;
 	zend_long max_input_time;
 
-	zend_uchar display_errors;
-	bool display_startup_errors;
-	bool log_errors;
-	bool ignore_repeated_errors;
-	bool ignore_repeated_source;
-	bool report_memleaks;
 	char *error_log;
 
 	char *doc_root;
@@ -77,6 +80,7 @@
 	char *user_dir;
 	char *include_path;
 	char *open_basedir;
+	bool open_basedir_modified;
 	char *extension_dir;
 	char *php_binary;
 	char *sys_temp_dir;
@@ -114,12 +118,12 @@
 	bool register_argc_argv;
 	bool auto_globals_jit;
 
+	bool html_errors;
+	bool xmlrpc_errors;
+
 	char *docref_root;
 	char *docref_ext;
 
-	bool html_errors;
-	bool xmlrpc_errors;
-
 	zend_long xmlrpc_error_number;
 
 	bool activated_auto_globals[8];
@@ -132,20 +136,15 @@
 	bool report_zend_debug;
 
 	int last_error_type;
+	int last_error_lineno;
 	zend_string *last_error_message;
 	zend_string *last_error_file;
-	int  last_error_lineno;
 
 	char *php_sys_temp_dir;
 
 	char *disable_classes;
-	bool allow_url_include;
-#ifdef PHP_WIN32
-	bool com_initialized;
-#endif
 	zend_long max_input_nesting_level;
 	zend_long max_input_vars;
-	bool in_user_include;
 
 	char *user_ini_filename;
 	zend_long user_ini_cache_ttl;
@@ -152,19 +151,27 @@
 
 	char *request_order;
 
+	char *mail_log;
 	bool mail_x_header;
-	char *mail_log;
+	bool mail_mixed_lf_and_crlf;
 
 	bool in_error_log;
 
+	bool allow_url_include;
 #ifdef PHP_WIN32
+	bool com_initialized;
+#endif
+	bool in_user_include;
+
+#ifdef PHP_WIN32
 	bool windows_show_crt_warning;
 #endif
 
+	bool have_called_openlog;
 	zend_long syslog_facility;
 	char *syslog_ident;
-	bool have_called_openlog;
 	zend_long syslog_filter;
+	zend_long error_log_mode;
 };
 
 

Added: branches/4.0/MgDev/Oem/php/include/main/php_ini_builder.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/php_ini_builder.h	                        (rev 0)
+++ branches/4.0/MgDev/Oem/php/include/main/php_ini_builder.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -0,0 +1,95 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright (c) The PHP Group                                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.01 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | https://www.php.net/license/3_01.txt                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license at php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Authors: Max Kellermann <max.kellermann at ionos.com>                   |
+   +----------------------------------------------------------------------+
+*/
+
+#ifndef PHP_INI_BUILDER_H
+#define PHP_INI_BUILDER_H
+
+#include "php.h"
+
+/**
+ * A class which helps with constructing INI entries from the command
+ * line.
+ */
+struct php_ini_builder {
+	char *value;
+	size_t length;
+};
+
+BEGIN_EXTERN_C()
+
+static inline void php_ini_builder_init(struct php_ini_builder *b)
+{
+	b->value = NULL;
+	b->length = 0;
+}
+
+static inline void php_ini_builder_deinit(struct php_ini_builder *b)
+{
+	free(b->value);
+}
+
+/**
+ * Null-terminate the buffer and return it.
+ */
+static inline char *php_ini_builder_finish(struct php_ini_builder *b)
+{
+	if (b->value != NULL) {
+		/* null-terminate the string */
+		b->value[b->length] = '\0';
+	}
+
+	return b->value;
+}
+
+/**
+ * Make room for more data.
+ *
+ * @param delta the number of bytes to be appended
+ */
+static inline void php_ini_builder_realloc(struct php_ini_builder *b, size_t delta)
+{
+	/* reserve enough space for the null terminator */
+	b->value = realloc(b->value, b->length + delta + 1);
+}
+
+/**
+ * Prepend a string.
+ *
+ * @param src the source string
+ * @param length the size of the source string
+ */
+PHPAPI void php_ini_builder_prepend(struct php_ini_builder *b, const char *src, size_t length);
+
+#define php_ini_builder_prepend_literal(b, l) php_ini_builder_prepend(b, l, strlen(l))
+
+/**
+ * Append an unquoted name/value pair.
+ */
+PHPAPI void php_ini_builder_unquoted(struct php_ini_builder *b, const char *name, size_t name_length, const char *value, size_t value_length);
+
+/**
+ * Append a quoted name/value pair.
+ */
+PHPAPI void php_ini_builder_quoted(struct php_ini_builder *b, const char *name, size_t name_length, const char *value, size_t value_length);
+
+/**
+ * Parse an INI entry from the command-line option "--define".
+ */
+PHPAPI void php_ini_builder_define(struct php_ini_builder *b, const char *arg);
+
+END_EXTERN_C()
+
+#endif

Modified: branches/4.0/MgDev/Oem/php/include/main/php_main.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/php_main.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/php_main.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -23,24 +23,36 @@
 #include "SAPI.h"
 
 BEGIN_EXTERN_C()
-PHPAPI int php_request_startup(void);
+
+/* Returns the PHP version the engine was built with. This is useful for
+ * extensions which want to know the version of PHP at run-time, rather than
+ * the version they were built with at compile-time.
+ */
+PHPAPI const char *php_version(void);
+
+/* Returns the PHP version id the engine was built with. This is useful for
+ * extensions which want to know the version of PHP at run-time, rather than
+ * the version they were built with at compile-time.
+ */
+PHPAPI unsigned int php_version_id(void);
+
+PHPAPI zend_result php_request_startup(void);
 PHPAPI void php_request_shutdown(void *dummy);
-PHPAPI int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_modules, uint32_t num_additional_modules);
+PHPAPI zend_result php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_module);
 PHPAPI void php_module_shutdown(void);
 PHPAPI int php_module_shutdown_wrapper(sapi_module_struct *sapi_globals);
 
-PHPAPI int php_register_extensions(zend_module_entry * const * ptr, int count);
+PHPAPI zend_result php_register_extensions(zend_module_entry * const * ptr, int count);
 
-PHPAPI int php_execute_script(zend_file_handle *primary_file);
+PHPAPI bool php_execute_script(zend_file_handle *primary_file);
 PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval *ret);
-PHPAPI int php_handle_special_queries(void);
-PHPAPI int php_lint_script(zend_file_handle *file);
+PHPAPI zend_result php_lint_script(zend_file_handle *file);
 
 PHPAPI void php_handle_aborted_connection(void);
 PHPAPI int php_handle_auth_data(const char *auth);
 
 PHPAPI void php_html_puts(const char *str, size_t siz);
-PHPAPI int php_stream_open_for_zend_ex(zend_file_handle *handle, int mode);
+PHPAPI zend_result php_stream_open_for_zend_ex(zend_file_handle *handle, int mode);
 
 /* environment module */
 extern int php_init_environ(void);
@@ -48,9 +60,20 @@
 
 #ifdef ZTS
 PHPAPI void php_reserve_tsrm_memory(void);
-PHPAPI int php_tsrm_startup(void);
+PHPAPI bool php_tsrm_startup_ex(int expected_threads);
+PHPAPI bool php_tsrm_startup(void);
+
+#define PHP_ZTS 1
+#else
+#define PHP_ZTS 0
 #endif
 
+#ifdef PHP_WIN32
+#define PHP_OS_STR "WINNT"
+#else
+#define PHP_OS_STR PHP_OS
+#endif
+
 END_EXTERN_C()
 
 #endif

Modified: branches/4.0/MgDev/Oem/php/include/main/php_network.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/php_network.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/php_network.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -49,7 +49,7 @@
 # define EWOULDBLOCK EAGAIN
 #endif
 
-/* This is a work around for GCC bug 69602: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602 */
+/* This is a workaround for GCC bug 69602: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602 */
 #if EAGAIN != EWOULDBLOCK
 # define PHP_IS_TRANSIENT_ERROR(err) (err == EAGAIN || err == EWOULDBLOCK)
 #else
@@ -162,7 +162,7 @@
 /* timeval-to-timeout (for poll(2)) */
 static inline int php_tvtoto(struct timeval *timeouttv)
 {
-	if (timeouttv) {
+	if (timeouttv && timeouttv->tv_sec >= 0 && timeouttv->tv_sec <= ((INT_MAX - 1000) / 1000)) {
 		return (timeouttv->tv_sec * 1000) + (timeouttv->tv_usec / 1000);
 	}
 	return -1;

Added: branches/4.0/MgDev/Oem/php/include/main/php_odbc_utils.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/php_odbc_utils.h	                        (rev 0)
+++ branches/4.0/MgDev/Oem/php/include/main/php_odbc_utils.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -0,0 +1,22 @@
+/*
+   +----------------------------------------------------------------------+
+   | Copyright (c) The PHP Group                                          |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.01 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | https://www.php.net/license/3_01.txt                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license at php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Authors: Calvin Buckley <calvin at cmpct.info>                          |
+   +----------------------------------------------------------------------+
+*/
+
+#include "php.h"
+
+PHPAPI bool php_odbc_connstr_is_quoted(const char *str);
+PHPAPI bool php_odbc_connstr_should_quote(const char *str);
+PHPAPI size_t php_odbc_connstr_estimate_quote_length(const char *in_str);
+PHPAPI size_t php_odbc_connstr_quote(char *out_str, const char *in_str, size_t out_str_size);

Modified: branches/4.0/MgDev/Oem/php/include/main/php_output.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/php_output.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/php_output.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -186,8 +186,6 @@
 /* MSHUTDOWN */
 PHPAPI void php_output_shutdown(void);
 
-PHPAPI void php_output_register_constants(void);
-
 /* RINIT */
 PHPAPI int php_output_activate(void);
 /* RSHUTDOWN */
@@ -241,22 +239,4 @@
 
 END_EXTERN_C()
 
-
-PHP_FUNCTION(ob_start);
-PHP_FUNCTION(ob_flush);
-PHP_FUNCTION(ob_clean);
-PHP_FUNCTION(ob_end_flush);
-PHP_FUNCTION(ob_end_clean);
-PHP_FUNCTION(ob_get_flush);
-PHP_FUNCTION(ob_get_clean);
-PHP_FUNCTION(ob_get_contents);
-PHP_FUNCTION(ob_get_length);
-PHP_FUNCTION(ob_get_level);
-PHP_FUNCTION(ob_get_status);
-PHP_FUNCTION(ob_implicit_flush);
-PHP_FUNCTION(ob_list_handlers);
-
-PHP_FUNCTION(output_add_rewrite_var);
-PHP_FUNCTION(output_reset_rewrite_vars);
-
 #endif

Deleted: branches/4.0/MgDev/Oem/php/include/main/php_stdint.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/php_stdint.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/php_stdint.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,51 +0,0 @@
-/*
-   +----------------------------------------------------------------------+
-   | Copyright (c) The PHP Group                                          |
-   +----------------------------------------------------------------------+
-   | This source file is subject to version 3.01 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available through the world-wide-web at the following url:           |
-   | https://www.php.net/license/3_01.txt                                 |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license at php.net so we can mail you a copy immediately.               |
-   +----------------------------------------------------------------------+
-   | Author: Michael Wallner <mike at php.net>                               |
-   +----------------------------------------------------------------------+
-*/
-
-#ifndef PHP_STDINT_H
-#define PHP_STDINT_H
-
-/* C99 requires these for C++ to get the definitions
- * of INT64_MAX and other macros used by Zend/zend_long.h
- * C11 drops this requirement, so these effectively
- * just backport that piece of behavior.
- *
- * These defines are placed here instead of
- * with the include below, because sys/types
- * and inttypes may include stdint themselves.
- * And these definitions MUST come first.
- */
-#ifdef __cplusplus
-# ifndef __STDC_LIMIT_MACROS
-#  define __STDC_LIMIT_MACROS
-# endif
-# ifndef __STDC_CONSTANT_MACROS
-#  define __STDC_CONSTANT_MACROS
-# endif
-# ifndef __STDC_FORMAT_MACROS
-#  define __STDC_FORMAT_MACROS
-# endif
-#endif
-
-#include <inttypes.h>
-#include <stdint.h>
-
-#if defined(_MSC_VER)
-# ifndef u_char
-typedef unsigned __int8   u_char;
-# endif
-#endif /* !_MSC_VER */
-
-#endif /* PHP_STDINT_H */

Modified: branches/4.0/MgDev/Oem/php/include/main/php_streams.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/php_streams.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/php_streams.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -65,7 +65,7 @@
 
 #define php_stream_fopen_with_path_rel(filename, mode, path, opened, options) _php_stream_fopen_with_path((filename), (mode), (path), (opened), (options) STREAMS_REL_CC)
 
-#define php_stream_fopen_from_fd_rel(fd, mode, persistent_id)	 _php_stream_fopen_from_fd((fd), (mode), (persistent_id) STREAMS_REL_CC)
+#define php_stream_fopen_from_fd_rel(fd, mode, persistent_id, zero_position)	 _php_stream_fopen_from_fd((fd), (mode), (persistent_id), (zero_position) STREAMS_REL_CC)
 #define php_stream_fopen_from_file_rel(file, mode)	 _php_stream_fopen_from_file((file), (mode) STREAMS_REL_CC)
 
 #define php_stream_fopen_from_pipe_rel(file, mode)	 _php_stream_fopen_from_pipe((file), (mode) STREAMS_REL_CC)
@@ -90,7 +90,7 @@
  * The only exceptions to this rule are that stream implementations can use
  * the php_stream->abstract pointer to hold their context, and streams
  * opened via stream_open_wrappers can use the zval ptr in
- * php_stream->wrapperdata to hold meta data for php scripts to
+ * php_stream->wrapperdata to hold metadata for php scripts to
  * retrieve using file_get_wrapper_data(). */
 
 typedef struct _php_stream php_stream;
@@ -107,7 +107,12 @@
 } php_stream_statbuf;
 
 typedef struct _php_stream_dirent {
+#ifdef NAME_MAX
+	char d_name[NAME_MAX + 1];
+#else
 	char d_name[MAXPATHLEN];
+#endif
+	unsigned char d_type;
 } php_stream_dirent;
 
 /* operations on streams that are file-handles */
@@ -182,9 +187,14 @@
 #define PHP_STREAM_FLAG_NO_FCLOSE					0x80
 
 /* Suppress generation of PHP warnings on stream read/write errors.
- * Currently for internal use only. */
+ * Currently, for internal use only. */
 #define PHP_STREAM_FLAG_SUPPRESS_ERRORS				0x100
 
+/* Do not close handle except it is explicitly closed by user (e.g. fclose) */
+#define PHP_STREAM_FLAG_NO_RSCR_DTOR_CLOSE			0x200
+
+#define PHP_STREAM_FLAG_NO_IO						0x400
+
 #define PHP_STREAM_FLAG_WAS_WRITTEN					0x80000000
 
 struct _php_stream  {
@@ -194,18 +204,25 @@
 	php_stream_filter_chain readfilters, writefilters;
 
 	php_stream_wrapper *wrapper; /* which wrapper was used to open the stream */
-	void *wrapperthis;		/* convenience pointer for a instance of a wrapper */
+	void *wrapperthis;		/* convenience pointer for an instance of a wrapper */
 	zval wrapperdata;		/* fgetwrapperdata retrieves this */
 
-	uint8_t is_persistent:1;
-	uint8_t in_free:2;			/* to prevent recursion during free */
-	uint8_t eof:1;
-	uint8_t __exposed:1;	/* non-zero if exposed as a zval somewhere */
+	uint16_t is_persistent:1;
+	uint16_t in_free:2;			/* to prevent recursion during free */
+	uint16_t eof:1;
+	uint16_t __exposed:1;	/* non-zero if exposed as a zval somewhere */
 
 	/* so we know how to clean it up correctly.  This should be set to
 	 * PHP_STREAM_FCLOSE_XXX as appropriate */
-	uint8_t fclose_stdiocast:2;
+	uint16_t fclose_stdiocast:2;
 
+
+	/* flag to mark whether the stream has buffered data */
+	uint16_t has_buffered_data:1;
+
+	/* whether stdio cast flushing is in progress */
+	uint16_t fclose_stdiocast_flush_in_progress:1;
+
 	char mode[16];			/* "rwb" etc. ala stdio */
 
 	uint32_t flags;	/* PHP_STREAM_FLAG_XXX */
@@ -284,7 +301,7 @@
 
 #define PHP_STREAM_FREE_CALL_DTOR			1 /* call ops->close */
 #define PHP_STREAM_FREE_RELEASE_STREAM		2 /* pefree(stream) */
-#define PHP_STREAM_FREE_PRESERVE_HANDLE		4 /* tell ops->close to not close it's underlying handle */
+#define PHP_STREAM_FREE_PRESERVE_HANDLE		4 /* tell ops->close to not close its underlying handle */
 #define PHP_STREAM_FREE_RSRC_DTOR			8 /* called from the resource list dtor */
 #define PHP_STREAM_FREE_PERSISTENT			16 /* manually freeing a persistent connection */
 #define PHP_STREAM_FREE_IGNORE_ENCLOSING	32 /* don't close the enclosing stream instead */
@@ -314,7 +331,7 @@
 #define php_stream_write_string(stream, str)	_php_stream_write(stream, str, strlen(str))
 #define php_stream_write(stream, buf, count)	_php_stream_write(stream, (buf), (count))
 
-PHPAPI int _php_stream_fill_read_buffer(php_stream *stream, size_t size);
+PHPAPI zend_result _php_stream_fill_read_buffer(php_stream *stream, size_t size);
 #define php_stream_fill_read_buffer(stream, size)	_php_stream_fill_read_buffer((stream), (size))
 
 PHPAPI ssize_t _php_stream_printf(php_stream *stream, const char *fmt, ...) PHP_ATTRIBUTE_FORMAT(printf, 2, 3);
@@ -322,7 +339,7 @@
 /* php_stream_printf macro & function require */
 #define php_stream_printf _php_stream_printf
 
-PHPAPI int _php_stream_eof(php_stream *stream);
+PHPAPI bool _php_stream_eof(php_stream *stream);
 #define php_stream_eof(stream)	_php_stream_eof((stream))
 
 PHPAPI int _php_stream_getc(php_stream *stream);
@@ -343,8 +360,8 @@
 #define php_stream_get_line(stream, buf, maxlen, retlen) _php_stream_get_line((stream), (buf), (maxlen), (retlen))
 PHPAPI zend_string *php_stream_get_record(php_stream *stream, size_t maxlen, const char *delim, size_t delim_len);
 
-/* CAREFUL! this is equivalent to puts NOT fputs! */
-PHPAPI int _php_stream_puts(php_stream *stream, const char *buf);
+/* Returns true if buffer has been appended, false on error */
+PHPAPI bool _php_stream_puts(php_stream *stream, const char *buf);
 #define php_stream_puts(stream, buf)	_php_stream_puts((stream), (buf))
 
 PHPAPI int _php_stream_stat(php_stream *stream, php_stream_statbuf *ssb);
@@ -435,7 +452,7 @@
 #define php_stream_truncate_set_size(stream, size)	_php_stream_truncate_set_size((stream), (size))
 END_EXTERN_C()
 
-#define PHP_STREAM_OPTION_META_DATA_API		11 /* ptrparam is a zval* to which to add meta data information */
+#define PHP_STREAM_OPTION_META_DATA_API		11 /* ptrparam is a zval* to which to add metadata information */
 #define php_stream_populate_meta_data(stream, zv)	(_php_stream_set_option((stream), PHP_STREAM_OPTION_META_DATA_API, 0, zv) == PHP_STREAM_OPTION_RETURN_OK ? 1 : 0)
 
 /* Check if the stream is still "live"; for sockets/pipes this means the socket
@@ -466,7 +483,7 @@
 ZEND_ATTRIBUTE_DEPRECATED
 PHPAPI size_t _php_stream_copy_to_stream(php_stream *src, php_stream *dest, size_t maxlen STREAMS_DC);
 #define php_stream_copy_to_stream(src, dest, maxlen)	_php_stream_copy_to_stream((src), (dest), (maxlen) STREAMS_CC)
-PHPAPI int _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen, size_t *len STREAMS_DC);
+PHPAPI zend_result _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen, size_t *len STREAMS_DC);
 #define php_stream_copy_to_stream_ex(src, dest, maxlen, len)	_php_stream_copy_to_stream_ex((src), (dest), (maxlen), (len) STREAMS_CC)
 
 
@@ -568,15 +585,15 @@
 #define STREAM_OPEN_FOR_ZEND_STREAM     0x00010000
 
 int php_init_stream_wrappers(int module_number);
-int php_shutdown_stream_wrappers(int module_number);
+void php_shutdown_stream_wrappers(int module_number);
 void php_shutdown_stream_hashes(void);
 PHP_RSHUTDOWN_FUNCTION(streams);
 
 BEGIN_EXTERN_C()
-PHPAPI int php_register_url_stream_wrapper(const char *protocol, const php_stream_wrapper *wrapper);
-PHPAPI int php_unregister_url_stream_wrapper(const char *protocol);
-PHPAPI int php_register_url_stream_wrapper_volatile(zend_string *protocol, php_stream_wrapper *wrapper);
-PHPAPI int php_unregister_url_stream_wrapper_volatile(zend_string *protocol);
+PHPAPI zend_result php_register_url_stream_wrapper(const char *protocol, const php_stream_wrapper *wrapper);
+PHPAPI zend_result php_unregister_url_stream_wrapper(const char *protocol);
+PHPAPI zend_result php_register_url_stream_wrapper_volatile(zend_string *protocol, php_stream_wrapper *wrapper);
+PHPAPI zend_result php_unregister_url_stream_wrapper_volatile(zend_string *protocol);
 PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mode, int options, zend_string **opened_path, php_stream_context *context STREAMS_DC);
 PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, const char **path_for_open, int options);
 PHPAPI const char *php_stream_locate_eol(php_stream *stream, zend_string *buf);
@@ -606,6 +623,20 @@
 #define php_get_stream_filters_hash()	_php_get_stream_filters_hash()
 PHPAPI HashTable *php_get_stream_filters_hash_global(void);
 extern const php_stream_wrapper_ops *php_stream_user_wrapper_ops;
+
+static inline bool php_is_stream_path(const char *filename)
+{
+	const char *p;
+
+	for (p = filename;
+	     (*p >= 'a' && *p <= 'z') ||
+	     (*p >= 'A' && *p <= 'Z') ||
+	     (*p >= '0' && *p <= '9') ||
+	     *p == '+' || *p == '-' || *p == '.';
+	     p++);
+	return ((p != filename) && (p[0] == ':') && (p[1] == '/') && (p[2] == '/'));
+}
+
 END_EXTERN_C()
 #endif
 

Modified: branches/4.0/MgDev/Oem/php/include/main/php_ticks.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/php_ticks.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/php_ticks.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -19,7 +19,7 @@
 
 int php_startup_ticks(void);
 void php_deactivate_ticks(void);
-void php_shutdown_ticks(void);
+void php_shutdown_ticks(php_core_globals *core_globals);
 void php_run_ticks(int count);
 
 BEGIN_EXTERN_C()

Modified: branches/4.0/MgDev/Oem/php/include/main/php_variables.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/php_variables.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/php_variables.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -32,10 +32,12 @@
 BEGIN_EXTERN_C()
 void php_startup_auto_globals(void);
 extern PHPAPI void (*php_import_environment_variables)(zval *array_ptr);
+extern PHPAPI void (*php_load_environment_variables)(zval *array_ptr);
 PHPAPI void php_register_variable(const char *var, const char *val, zval *track_vars_array);
 /* binary-safe version */
 PHPAPI void php_register_variable_safe(const char *var, const char *val, size_t val_len, zval *track_vars_array);
 PHPAPI void php_register_variable_ex(const char *var, zval *val, zval *track_vars_array);
+PHPAPI void php_register_known_variable(const char *var, size_t var_len, zval *value, zval *track_vars_array);
 
 PHPAPI void php_build_argv(const char *s, zval *track_vars_array);
 PHPAPI int php_hash_environment(void);

Modified: branches/4.0/MgDev/Oem/php/include/main/php_version.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/php_version.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/php_version.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -1,8 +1,8 @@
 /* automatically generated by configure */
 /* edit configure.ac to change version number */
 #define PHP_MAJOR_VERSION 8
-#define PHP_MINOR_VERSION 1
-#define PHP_RELEASE_VERSION 17
+#define PHP_MINOR_VERSION 3
+#define PHP_RELEASE_VERSION 20
 #define PHP_EXTRA_VERSION ""
-#define PHP_VERSION "8.1.17"
-#define PHP_VERSION_ID 80117
+#define PHP_VERSION "8.3.20"
+#define PHP_VERSION_ID 80320

Modified: branches/4.0/MgDev/Oem/php/include/main/rfc1867.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/rfc1867.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/rfc1867.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -27,6 +27,16 @@
 #define MULTIPART_EVENT_FILE_END	4
 #define MULTIPART_EVENT_END		5
 
+/* Errors */
+#define PHP_UPLOAD_ERROR_OK   0  /* File upload successful */
+#define PHP_UPLOAD_ERROR_A    1  /* Uploaded file exceeded upload_max_filesize */
+#define PHP_UPLOAD_ERROR_B    2  /* Uploaded file exceeded MAX_FILE_SIZE */
+#define PHP_UPLOAD_ERROR_C    3  /* Partially uploaded */
+#define PHP_UPLOAD_ERROR_D    4  /* No file uploaded */
+#define PHP_UPLOAD_ERROR_E    6  /* Missing /tmp or similar directory */
+#define PHP_UPLOAD_ERROR_F    7  /* Failed to write file to disk */
+#define PHP_UPLOAD_ERROR_X    8  /* File upload stopped by extension */
+
 typedef struct _multipart_event_start {
 	size_t	content_length;
 } multipart_event_start;
@@ -73,8 +83,7 @@
 SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler);
 
 PHPAPI void destroy_uploaded_files_hash(void);
-void php_rfc1867_register_constants(void);
-extern PHPAPI int (*php_rfc1867_callback)(unsigned int event, void *event_data, void **extra);
+extern PHPAPI zend_result (*php_rfc1867_callback)(unsigned int event, void *event_data, void **extra);
 
 SAPI_API void php_rfc1867_set_multibyte_callbacks(
 					php_rfc1867_encoding_translation_t encoding_translation,

Modified: branches/4.0/MgDev/Oem/php/include/main/streams/php_stream_context.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/streams/php_stream_context.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/streams/php_stream_context.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -57,7 +57,7 @@
 PHPAPI php_stream_context *php_stream_context_alloc(void);
 PHPAPI zval *php_stream_context_get_option(php_stream_context *context,
 		const char *wrappername, const char *optionname);
-PHPAPI int php_stream_context_set_option(php_stream_context *context,
+PHPAPI void php_stream_context_set_option(php_stream_context *context,
 		const char *wrappername, const char *optionname, zval *optionvalue);
 
 PHPAPI php_stream_notifier *php_stream_notification_alloc(void);
@@ -94,6 +94,10 @@
 	php_stream_notification_notify((context), PHP_STREAM_NOTIFY_PROGRESS, PHP_STREAM_NOTIFY_SEVERITY_INFO, \
 			NULL, 0, (bsofar), (bmax), NULL); } } while(0)
 
+#define php_stream_notify_completed(context) do { if ((context) && (context)->notifier) { \
+	php_stream_notification_notify((context), PHP_STREAM_NOTIFY_COMPLETED, PHP_STREAM_NOTIFY_SEVERITY_INFO, \
+			NULL, 0, (context)->notifier->progress, (context)->notifier->progress_max, NULL); } } while(0)
+
 #define php_stream_notify_progress_init(context, sofar, bmax) do { if ((context) && (context)->notifier) { \
 	(context)->notifier->progress = (sofar); \
 	(context)->notifier->progress_max = (bmax); \

Modified: branches/4.0/MgDev/Oem/php/include/main/streams/php_stream_plain_wrapper.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/streams/php_stream_plain_wrapper.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/streams/php_stream_plain_wrapper.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -32,8 +32,8 @@
 PHPAPI php_stream *_php_stream_fopen_from_file(FILE *file, const char *mode STREAMS_DC);
 #define php_stream_fopen_from_file(file, mode)	_php_stream_fopen_from_file((file), (mode) STREAMS_CC)
 
-PHPAPI php_stream *_php_stream_fopen_from_fd(int fd, const char *mode, const char *persistent_id STREAMS_DC);
-#define php_stream_fopen_from_fd(fd, mode, persistent_id)	_php_stream_fopen_from_fd((fd), (mode), (persistent_id) STREAMS_CC)
+PHPAPI php_stream *_php_stream_fopen_from_fd(int fd, const char *mode, const char *persistent_id, bool zero_position STREAMS_DC);
+#define php_stream_fopen_from_fd(fd, mode, persistent_id)	_php_stream_fopen_from_fd((fd), (mode), (persistent_id), false STREAMS_CC)
 
 PHPAPI php_stream *_php_stream_fopen_from_pipe(FILE *file, const char *mode STREAMS_DC);
 #define php_stream_fopen_from_pipe(file, mode)	_php_stream_fopen_from_pipe((file), (mode) STREAMS_CC)

Modified: branches/4.0/MgDev/Oem/php/include/main/streams/php_streams_int.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/streams/php_streams_int.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/main/streams/php_streams_int.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -60,6 +60,3 @@
  * any other function that expects standard modes and you allow non-standard
  * ones. result should be a char[5]. */
 void php_stream_mode_sanitize_fdopen_fopencookie(php_stream *stream, char *result);
-
-void php_stream_tidy_wrapper_error_log(php_stream_wrapper *wrapper);
-void php_stream_display_wrapper_errors(php_stream_wrapper *wrapper, const char *path, const char *caption);

Added: branches/4.0/MgDev/Oem/php/include/main/streams/userspace_arginfo.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/main/streams/userspace_arginfo.h	                        (rev 0)
+++ branches/4.0/MgDev/Oem/php/include/main/streams/userspace_arginfo.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -0,0 +1,31 @@
+/* This is a generated file, edit the .stub.php file instead.
+ * Stub hash: 9198095c858c95fcb31252ddfa24fe04787d0460 */
+
+
+
+static void register_userspace_symbols(int module_number)
+{
+	REGISTER_LONG_CONSTANT("STREAM_USE_PATH", USE_PATH, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_IGNORE_URL", IGNORE_URL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_REPORT_ERRORS", REPORT_ERRORS, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_MUST_SEEK", STREAM_MUST_SEEK, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_URL_STAT_LINK", PHP_STREAM_URL_STAT_LINK, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_URL_STAT_QUIET", PHP_STREAM_URL_STAT_QUIET, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_MKDIR_RECURSIVE", PHP_STREAM_MKDIR_RECURSIVE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_IS_URL", PHP_STREAM_IS_URL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_OPTION_BLOCKING", PHP_STREAM_OPTION_BLOCKING, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_OPTION_READ_TIMEOUT", PHP_STREAM_OPTION_READ_TIMEOUT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_OPTION_READ_BUFFER", PHP_STREAM_OPTION_READ_BUFFER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_OPTION_WRITE_BUFFER", PHP_STREAM_OPTION_WRITE_BUFFER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_BUFFER_NONE", PHP_STREAM_BUFFER_NONE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_BUFFER_LINE", PHP_STREAM_BUFFER_LINE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_BUFFER_FULL", PHP_STREAM_BUFFER_FULL, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CAST_AS_STREAM", PHP_STREAM_AS_STDIO, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_CAST_FOR_SELECT", PHP_STREAM_AS_FD_FOR_SELECT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_META_TOUCH", PHP_STREAM_META_TOUCH, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_META_OWNER", PHP_STREAM_META_OWNER, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_META_OWNER_NAME", PHP_STREAM_META_OWNER_NAME, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_META_GROUP", PHP_STREAM_META_GROUP, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_META_GROUP_NAME", PHP_STREAM_META_GROUP_NAME, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("STREAM_META_ACCESS", PHP_STREAM_META_ACCESS, CONST_PERSISTENT);
+}

Modified: branches/4.0/MgDev/Oem/php/include/win32/readdir.h
===================================================================
--- branches/4.0/MgDev/Oem/php/include/win32/readdir.h	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/include/win32/readdir.h	2025-05-05 12:41:13 UTC (rev 10139)
@@ -15,11 +15,17 @@
 
 #include "ioutil.h"
 
+#define _DIRENT_HAVE_D_TYPE
+#define DT_UNKNOWN 0
+#define DT_DIR 4
+#define DT_REG 8
+
 /* struct dirent - same as Unix */
 struct dirent {
 	long d_ino;					/* inode (always 1 in WIN32) */
 	off_t d_off;					/* offset to this dirent */
 	unsigned short d_reclen;			/* length of d_name */
+	unsigned char d_type;
 	char d_name[1];	/* null terminated filename in the current encoding, glyph number <= 255 wchar_t's + \0 byte */
 };
 

Modified: branches/4.0/MgDev/Oem/php/lib/php8.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_bz2.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_com_dotnet.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_curl.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_dba.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_dl_test.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_enchant.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_exif.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_ffi.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_fileinfo.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_ftp.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_gd.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_gettext.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_gmp.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_imap.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_intl.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_ldap.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_mbstring.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_mysqli.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_oci8_19.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_odbc.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_opcache.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_openssl.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_pdo_firebird.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_pdo_mysql.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_pdo_oci.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_pdo_odbc.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_pdo_pgsql.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_pdo_sqlite.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_pgsql.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_shmop.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_snmp.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_soap.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_sockets.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_sodium.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_sqlite3.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_sysvshm.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_tidy.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_xsl.lib
===================================================================
(Binary files differ)

Modified: branches/4.0/MgDev/Oem/php/lib/php_zend_test.lib
===================================================================
(Binary files differ)

Added: branches/4.0/MgDev/Oem/php/lib/php_zip.lib
===================================================================
(Binary files differ)

Index: branches/4.0/MgDev/Oem/php/lib/php_zip.lib
===================================================================
--- branches/4.0/MgDev/Oem/php/lib/php_zip.lib	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/lib/php_zip.lib	2025-05-05 12:41:13 UTC (rev 10139)

Property changes on: branches/4.0/MgDev/Oem/php/lib/php_zip.lib
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: branches/4.0/MgDev/Oem/php/script/Makefile.phpize
===================================================================
--- branches/4.0/MgDev/Oem/php/script/Makefile.phpize	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/script/Makefile.phpize	2025-05-05 12:41:13 UTC (rev 10139)
@@ -42,12 +42,20 @@
 _EXTENSION_DLL=$(EXT_TARGETS)
 !endif
 
+!if $(PHP_TEST_INI_PATH) == ""
 test: set-tmp-env
-	$(DEBUGGER_CMD) $(DEBUGGER_ARGS) "$(PHP_PREFIX)\php.exe" -d open_basedir= -d output_buffering=0 run-tests.php $(TESTS) -p "$(PHP_PREFIX)\php.exe" -d extension=$(BUILD_DIR)\$(_EXTENSION_DLL)
+	$(DEBUGGER_CMD) $(DEBUGGER_ARGS) "$(PHP_PREFIX)\php.exe" -d open_basedir= -d output_buffering=0 run-tests.php -p "$(PHP_PREFIX)\php.exe" -d extension=$(BUILD_DIR)\$(_EXTENSION_DLL) $(TESTS)
 
 run: set-tmp-env
 	$(DEBUGGER_CMD) $(DEBUGGER_ARGS) "$(PHP_PREFIX)\php.exe" -n -d extension=$(BUILD_DIR)\\$(_EXTENSION_DLL) $(ARGS)
+!else
+test: set-tmp-env
+	$(DEBUGGER_CMD) $(DEBUGGER_ARGS) "$(PHP_PREFIX)\php.exe" -n -d open_basedir= -d output_buffering=0 -d memory_limit=-1 run-tests.php -p "$(PHP_PREFIX)\php.exe" -n -c $(PHP_TEST_INI_PATH) $(TESTS)
 
+run: set-tmp-env
+	$(DEBUGGER_CMD) $(DEBUGGER_ARGS) "$(PHP_PREFIX)\php.exe" -n -c $(PHP_TEST_INI_PATH) $(ARGS)
+!endif
+
 !if $(MT) == ""
 _VC_MANIFEST_EMBED_EXE=
 _VC_MANIFEST_EMBED_DLL=

Modified: branches/4.0/MgDev/Oem/php/script/config.w32.phpize.in
===================================================================
--- branches/4.0/MgDev/Oem/php/script/config.w32.phpize.in	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/script/config.w32.phpize.in	2025-05-05 12:41:13 UTC (rev 10139)
@@ -14,8 +14,10 @@
 
 toolset_setup_compiler();
 
-// do we use x64 or 80x86 version of compiler?
-X64 = toolset_is_64();
+HOST_ARCH = toolset_host_arch();
+TARGET_ARCH = toolset_target_arch();
+// for compatible only
+X64 = TARGET_ARCH != 'x86';
 toolset_setup_arch();
 
 toolset_setup_linker();
@@ -128,6 +130,12 @@
 ARG_WITH("codegen-arch", "Architecture for code generation", "no");
 toolset_setup_codegen_arch();
 
+ARG_ENABLE("test-ini", "Enable automatic php.ini generation. The test.ini will be put \
+		into the build dir and used to automatically load the shared extensions.", "no");
+
+ARG_WITH("test-ini-ext-exclude", "Comma separated list of shared extensions to \
+		be excluded from the test.ini", "no");
+
 ARG_ENABLE("native-intrinsics", "Comma separated list of intrinsic optimizations to enable. \
 	Available optimization names are sse, sse2, sse3, ssse3, sse4.1, sse4.2, avx, avx2. \
 	SSE and SSE2 are enabled by default. The best optimization specified will \

Modified: branches/4.0/MgDev/Oem/php/script/confutils.js
===================================================================
--- branches/4.0/MgDev/Oem/php/script/confutils.js	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/script/confutils.js	2025-05-05 12:41:13 UTC (rev 10139)
@@ -50,7 +50,7 @@
 
 /* Care also about NTDDI_VERSION and _WIN32_WINNT in config.w32.h.in
    and manifest. */
-var WINVER = "0x0601"; /* 7/2008r2 */
+var WINVER = "0x0602"; /* 8/2012 */
 
 // There's a minimum requirement for bison.
 var MINBISON = "3.0.0";
@@ -95,10 +95,10 @@
 if (!MODE_PHPIZE) {
 	/* defaults; we pick up the precise versions from configure.ac */
 	var PHP_VERSION = 8;
-	var PHP_MINOR_VERSION = 1;
+	var PHP_MINOR_VERSION = 3;
 	var PHP_RELEASE_VERSION = 0;
 	var PHP_EXTRA_VERSION = "";
-	var PHP_VERSION_STRING = "8.1.0";
+	var PHP_VERSION_STRING = "8.3.0";
 }
 
 /* Get version numbers and DEFINE as a string */
@@ -168,9 +168,13 @@
 	}
 	var version = execute(command + '" 2>&1"');
 
-	if (what == "64") {
-		if (version.match(/x64/)) {
-			return 1;
+	if (what == "arch") {
+		if (version.match(/x86/)) {
+			return "x86";
+		} else if (version.match(/x64/)) {
+			return "x64";
+		} else if (version.match(/ARM64/)) {
+			return "arm64";
 		}
 	} else {
 		if (version.match(/(\d+\.\d+(\.\d+)?(\.\d+)?)/)) {
@@ -450,14 +454,9 @@
 	}
 
 	var snapshot_build_exclusions = new Array(
-		'debug', 'lzf-better-compression',
-		 'php-build', 'snapshot-template', 'ereg',
-		 'pcre-regex', 'fastcgi', 'force-cgi-redirect',
-		 'path-info-check', 'zts', 'ipv6', 'memory-limit',
-		 'zend-multibyte', 'fd-setsize', 'memory-manager',
-		 'pgi', 'pgo', 'all-shared', 'config-profile',
-		 'sanitizer'
-		);
+		'debug', 'lzf-better-compression', 'php-build', 'snapshot-template', 'zts',
+		'ipv6', 'fd-setsize', 'pgi', 'pgo', 'all-shared', 'config-profile', 'sanitizer'
+	);
 	var force;
 
 	// Now set any defaults we might have missed out earlier
@@ -1077,7 +1076,7 @@
 	var thanks = "";
 	var logo = "";
 	var debug = "";
-	var project_url = "http://www.php.net";
+	var project_url = "https://www.php.net";
 	var project_header = creditspath + "/php_" + basename + ".h";
 	var versioning = "";
 
@@ -1098,7 +1097,7 @@
 		if (thanks == null) {
 			thanks = "";
 		} else {
-			thanks = "Thanks to " + thanks;
+			thanks = "Thanks to " + thanks.replace(/([<>&|%])/g, "^$1").replace(/"/g, '\\"\\"');
 		}
 		credits.Close();
 	}
@@ -1105,7 +1104,7 @@
 
 	if (creditspath.match(new RegExp("pecl"))) {
 		/* PECL project url - this will eventually work correctly for all */
-		project_url = "http://pecl.php.net/" + basename;
+		project_url = "https://pecl.php.net/" + basename;
 
 		/* keep independent versioning PECL-specific for now */
 		if (FSO.FileExists(project_header)) {
@@ -1670,7 +1669,7 @@
 		}
 
 		if (PHP_ANALYZER == "clang") {
-			var analyzer_base_args = X64 ? "-m64" : "-m32";
+			var analyzer_base_args = TARGET_ARCH == 'x86' ? "-m32" : "-m64";
 			var analyzer_base_flags = "";
 
 			analyzer_base_args += " --analyze";
@@ -1693,10 +1692,14 @@
 				analyzer_base_flags += " -D _MSC_VER=" + probe_binary(PATH_PROG('cl', null));
 			}
 
-			if (X64) {
+			if (TARGET_ARCH == 'x64') {
 				analyzer_base_flags += " -D _M_X64 -D _WIN64";
+			} else if (TARGET_ARCH == 'ARM64') {
+				analyzer_base_flags += " -D _M_ARM64 -D _WIN64";
+			} else if (TARGET_ARCH == 'x86') {
+				analyzer_base_flags += " -D _M_IX86 ";
 			} else {
-				analyzer_base_flags += " -D _M_IX86 ";
+				ERROR("analyzer is not supported at arch " + TARGET_ARCH);
 			}
 			analyzer_base_flags += " -D _WIN32 -D WIN32 -D _WINDOWS";
 
@@ -1708,8 +1711,8 @@
 				analyzer_base_flags += " -I " + "\"" + vc_incs[i] + "\"";
 			}
 
-			var cppcheck_platform = X64 ? "win64" : "win32A";
-			var cppcheck_lib = "win32\\build\\cppcheck_" + (X64 ? "x64" : "x86") + ".cfg";
+			var cppcheck_platform = TARGET_ARCH == 'x86' ? "win32A" : "win64";
+			var cppcheck_lib = "win32\\build\\cppcheck_" + (TARGET_ARCH == 'x86' ? "x86" : "x64") + ".cfg"; // use x64 for arm64 yet
 			analyzer_base_args += "--enable=warning,performance,portability,information,missingInclude " +
 						"--platform=" + cppcheck_platform + " " +
 						"--library=windows.cfg --library=microsoft_sal.cfg " +
@@ -1960,7 +1963,8 @@
 	ar[k++] = ['Build type', PHP_DEBUG == "yes" ? "Debug" : "Release"];
 	ar[k++] = ['Thread Safety', PHP_ZTS == "yes" ? "Yes" : "No"];
 	ar[k++] = ['Compiler', COMPILER_NAME_LONG];
-	ar[k++] = ['Architecture', X64 ? 'x64' : 'x86'];
+	ar[k++] = ['Target Architecture', TARGET_ARCH];
+	ar[k++] = ['Host Architecture', HOST_ARCH];
 	if (PHP_PGO == "yes") {
 		ar[k++] = ['Optimization', "PGO"];
 	} else if (PHP_PGI == "yes") {
@@ -2083,9 +2087,7 @@
 	}
 
 	STDOUT.WriteLine("Generating files...");
-	if (!MODE_PHPIZE) {
-		generate_tmp_php_ini();
-	}
+	generate_tmp_php_ini();
 	generate_makefile();
 	if (!MODE_PHPIZE) {
 		generate_internal_functions();
@@ -2528,11 +2530,9 @@
 		handle_analyzer_makefile_flags(MF, keys[i], val);
 	}
 
-	if (!MODE_PHPIZE) {
-		var val = "yes" == PHP_TEST_INI ? PHP_TEST_INI_PATH : "";
-		/* Be sure it's done after generate_tmp_php_ini(). */
-		MF.WriteLine("PHP_TEST_INI_PATH=\"" + val + "\"");
-	}
+	var val = "yes" == PHP_TEST_INI ? PHP_TEST_INI_PATH : "";
+	/* Be sure it's done after generate_tmp_php_ini(). */
+	MF.WriteLine("PHP_TEST_INI_PATH=\"" + val + "\"");
 
 	MF.WriteBlankLines(1);
 	if (MODE_PHPIZE) {
@@ -3101,9 +3101,11 @@
 
 		version = probe_binary(PHP_CL).substr(0, 5).replace('.', '');
 
-		if (version >= 1930) {
+		if (version >= 1940) {
 			return name;
-		} if (version >= 1920) {
+		} else if (version >= 1930) {
+			name = short ? "VS17" : "Visual C++ 2022";
+		} else if (version >= 1920) {
 			/* NOTE - VS is intentional. Due to changes in recent Visual Studio
 						versioning scheme referring to the exact VC++ version is
 						hardly predictable. From this version on, it refers to
@@ -3131,10 +3133,32 @@
 }
 
 
-function toolset_is_64()
+function toolset_host_arch()
 {
+	var command = 'cmd /c "where cl.exe"';
+	var clpath = execute(command).split(/\n/)[0].replace(/\s$/, '');
+
+	var command = 'cmd /c "dumpbin "' + clpath + '" /nologo /headers"';
+	var full = execute(command);
+
+	/*
+	output is something like
+	FILE HEADER VALUES
+		8664 machine (x64)
+	*/
+	var matches = full.match(/FILE HEADER VALUES\s+[A-F0-9]{3,4}\smachine \((x64|x86|ARM64)\)/);
+
+	if(!matches){
+		ERROR("Unsupported toolset host");
+	}
+
+	return matches[1].toLowerCase();
+}
+
+function toolset_target_arch()
+{
 	if (VS_TOOLSET) {
-		return probe_binary(PHP_CL, 64);
+		return probe_binary(PHP_CL, 'arch');
 	} else if (CLANG_TOOLSET) {
 		/*var command = 'cmd /c ""' + PHP_CL + '" -v"';
 		var full = execute(command + '" 2>&1"');
@@ -3144,26 +3168,22 @@
 		/* Even executed within an environment setup with vcvars32.bat,
 		clang-cl doesn't recognize the arch toolset. But as it needs
 		the VS environment, checking the arch of cl.exe is correct. */
-		return probe_binary(PATH_PROG('cl', null), 64);
+		return probe_binary(PATH_PROG('cl', null), 'arch');
 	} else if (ICC_TOOLSET) {
-		var command = 'cmd /c ""' + PHP_CL + '" -v"';
+		var command = 'cmd /c "where cl"';
 		var full = execute(command + '" 2>&1"');
 
 		return null != full.match(/Intel\(R\) 64/);
 	}
 
-	ERROR("Unsupported toolset");
+	ERROR("Unsupported toolset target");
 }
 
 function toolset_setup_arch()
 {
-	if (X64) {
-		STDOUT.WriteLine("  Detected 64-bit compiler");
-	} else {
-		STDOUT.WriteLine("  Detected 32-bit compiler");
-	}
-	AC_DEFINE('PHP_BUILD_ARCH', X64 ? 'x64' : 'x86', "Detected compiler architecture");
-	DEFINE("PHP_ARCHITECTURE", X64 ? 'x64' : 'x86');
+	STDOUT.WriteLine("  Detected " + TARGET_ARCH + " compiler" + (TARGET_ARCH == HOST_ARCH ? "" : " (cross compile from " + HOST_ARCH + ")"));
+	AC_DEFINE('PHP_BUILD_ARCH', TARGET_ARCH, "Detected compiler architecture");
+	DEFINE("PHP_ARCHITECTURE", TARGET_ARCH);
 }
 
 function toolset_setup_codegen_arch()
@@ -3177,7 +3197,7 @@
 
 		if ("IA32" != arc) {
 			ERROR("Only IA32 arch is supported by --with-codegen-arch, got '" + arc + "'");
-		} else if (X64) {
+		} else if (TARGET_ARCH != 'x86') {
 			ERROR("IA32 arch is only supported with 32-bit build");
 		}
 		ADD_FLAG("CFLAGS", "/arch:" + arc);
@@ -3237,10 +3257,10 @@
 		// fun stuff: MS deprecated ANSI stdio and similar functions
 		// disable annoying warnings.  In addition, time_t defaults
 		// to 64-bit.  Ask for 32-bit.
-		if (X64) {
+		if (TARGET_ARCH == 'x86') {
+			ADD_FLAG('CFLAGS', ' /wd4996 /D_USE_32BIT_TIME_T=1 ');
+		} else {
 			ADD_FLAG('CFLAGS', ' /wd4996 ');
-		} else {
-			ADD_FLAG('CFLAGS', ' /wd4996 /D_USE_32BIT_TIME_T=1 ');
 		}
 
 		if (PHP_DEBUG == "yes") {
@@ -3292,10 +3312,10 @@
 
 		ADD_FLAG("CFLAGS", "/Zc:wchar_t");
 	} else if (CLANG_TOOLSET) {
-		if (X64) {
+		if (TARGET_ARCH == 'x86') {
+			ADD_FLAG('CFLAGS', '-m32');
+		} else {
 			ADD_FLAG('CFLAGS', '-m64');
-		} else {
-			ADD_FLAG('CFLAGS', '-m32');
 		}
 		ADD_FLAG("CFLAGS", " /fallback ");
 		ADD_FLAG("CFLAGS", "-Xclang -fmodules");
@@ -3325,6 +3345,14 @@
 			ERROR("Can't enable intrinsics, --with-codegen-arch passed with an incompatible option. ")
 		}
 
+		if (TARGET_ARCH == 'arm64') {
+			/* arm64 supports neon */
+			configure_subst.Add("PHP_SIMD_SCALE", 'NEON');
+			/* all offically supported arm64 cpu supports crc32 (TODO: to be confirmed) */
+			AC_DEFINE('HAVE_ARCH64_CRC32', 1);
+			return;
+		}
+
 		if ("no" == PHP_NATIVE_INTRINSICS || "yes" == PHP_NATIVE_INTRINSICS) {
 			PHP_NATIVE_INTRINSICS = default_enabled;
 		}
@@ -3352,7 +3380,7 @@
 					}
 				}
 			}
-			if (!X64) {
+			if (TARGET_ARCH == 'x86') {
 				/* SSE2 is currently the default on 32-bit. It could change later,
 					for now no need to pass it. But, if SSE only was chosen,
 					/arch:SSE is required. */
@@ -3423,7 +3451,7 @@
 {
 	if (PHP_DEBUG == "yes") {
 		ADD_FLAG("CFLAGS", "/LDd /MDd /Od /D _DEBUG /D ZEND_DEBUG=1 " +
-			(X64?"/Zi":"/ZI"));
+			(TARGET_ARCH == 'x86'?"/ZI":"/Zi"));
 		ADD_FLAG("LDFLAGS", "/debug");
 		// Avoid problems when linking to release libraries that use the release
 		// version of the libc
@@ -3458,11 +3486,16 @@
 	} else {
 		PHP_OBJECT_OUT_DIR = FSO.GetAbsolutePathName(".") + '\\';
 
-		if (X64) {
+		if (TARGET_ARCH == 'x64') {
 			PHP_OBJECT_OUT_DIR += 'x64\\';
 			if (!FSO.FolderExists(PHP_OBJECT_OUT_DIR)) {
 				FSO.CreateFolder(PHP_OBJECT_OUT_DIR);
 			}
+		} else if (TARGET_ARCH == 'arm64') {
+			PHP_OBJECT_OUT_DIR += 'arm64\\';
+			if (!FSO.FolderExists(PHP_OBJECT_OUT_DIR)) {
+				FSO.CreateFolder(PHP_OBJECT_OUT_DIR);
+			}
 		}
 	}
 }
@@ -3519,7 +3552,7 @@
 			if (FSO.FolderExists("..\\php_build")) {
 				PHP_PHP_BUILD = "..\\php_build";
 			} else {
-				if (X64) {
+				if (TARGET_ARCH != 'x86') {
 					if (FSO.FolderExists("..\\win64build")) {
 						PHP_PHP_BUILD = "..\\win64build";
 					} else if (FSO.FolderExists("..\\php-win64-dev\\php_build")) {
@@ -3681,7 +3714,7 @@
 		ERROR("Failed to determine clang lib path");
 	}
 
-	if (X64) {
+	if (TARGET_ARCH != 'x86') {
 		ret = PROGRAM_FILES + "\\LLVM\\lib\\clang\\" + ver + "\\lib";
 		if (!FSO.FolderExists(ret)) {
 			ret = null;
@@ -3718,10 +3751,13 @@
 		ADD_FLAG(cflags_name, "-fsanitize=address,undefined");
 	}
 	if (!!libs_name) {
-		if (X64) {
+		if (TARGET_ARCH == 'x64') {
 			ADD_FLAG(libs_name, "clang_rt.asan_dynamic-x86_64.lib clang_rt.asan_dynamic_runtime_thunk-x86_64.lib");
+		} else if (TARGET_ARCH == 'x86') {
+			ADD_FLAG(libs_name, "clang_rt.asan_dynamic-i386.lib clang_rt.asan_dynamic_runtime_thunk-i386.lib");
 		} else {
-			ADD_FLAG(libs_name, "clang_rt.asan_dynamic-i386.lib clang_rt.asan_dynamic_runtime_thunk-i386.lib");
+			// TODO: support arm64?
+			ERROR("Failed to determine clang lib path");
 		}
 	}
 

Modified: branches/4.0/MgDev/Oem/php/script/ext_deps.js
===================================================================
--- branches/4.0/MgDev/Oem/php/script/ext_deps.js	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/script/ext_deps.js	2025-05-05 12:41:13 UTC (rev 10139)
@@ -60,6 +60,8 @@
 PHP_PCRE_SHARED=false;
 PHP_PGSQL=true;
 PHP_PGSQL_SHARED=true;
+PHP_RANDOM=true;
+PHP_RANDOM_SHARED=false;
 PHP_READLINE=true;
 PHP_READLINE_SHARED=false;
 PHP_REFLECTION=true;
@@ -89,7 +91,7 @@
 PHP_ZEND_TEST=true;
 PHP_ZEND_TEST_SHARED=true;
 PHP_ZIP=true;
-PHP_ZIP_SHARED=false;
+PHP_ZIP_SHARED=true;
 PHP_ZLIB=true;
 PHP_ZLIB_SHARED=false;
 PHP_LIBXML=true;

Modified: branches/4.0/MgDev/Oem/php/script/phpize.js
===================================================================
--- branches/4.0/MgDev/Oem/php/script/phpize.js	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/script/phpize.js	2025-05-05 12:41:13 UTC (rev 10139)
@@ -2,10 +2,10 @@
 var PHP_ZTS="No"
 var VC_VERSION=1929
 var PHP_VERSION=8
-var PHP_MINOR_VERSION=1
-var PHP_RELEASE_VERSION=17
+var PHP_MINOR_VERSION=3
+var PHP_RELEASE_VERSION=20
 var PHP_EXTRA_VERSION=""
-var PHP_VERSION_STRING="8.1.17"
+var PHP_VERSION_STRING="8.3.20"
 
 /* Generated extensions list with mode (static/shared) */
 PHP_BCMATH_SHARED=false;
@@ -39,6 +39,7 @@
 PHP_OPENSSL_SHARED=true;
 PHP_PCRE_SHARED=false;
 PHP_PGSQL_SHARED=true;
+PHP_RANDOM_SHARED=false;
 PHP_READLINE_SHARED=false;
 PHP_REFLECTION_SHARED=false;
 PHP_SESSION_SHARED=false;
@@ -53,7 +54,7 @@
 PHP_TIDY_SHARED=true;
 PHP_TOKENIZER_SHARED=false;
 PHP_ZEND_TEST_SHARED=true;
-PHP_ZIP_SHARED=false;
+PHP_ZIP_SHARED=true;
 PHP_ZLIB_SHARED=false;
 PHP_LIBXML_SHARED=false;
 PHP_DOM_SHARED=false;
@@ -170,6 +171,7 @@
 
 		deps = get_module_dep(contents);
 
+		n = "";
 		item = new Module_Item(n, c, dir_line, deps, contents);
 		MODULES.Add(n, item);
 	}

Modified: branches/4.0/MgDev/Oem/php/script/run-tests.php
===================================================================
--- branches/4.0/MgDev/Oem/php/script/run-tests.php	2025-05-05 12:17:12 UTC (rev 10138)
+++ branches/4.0/MgDev/Oem/php/script/run-tests.php	2025-05-05 12:41:13 UTC (rev 10139)
@@ -23,8 +23,6 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: edfab1f57adcd4ed819df5076d7ffb5a15c40bc1 $ */
-
 /* Temporary variables while this file is being refactored. */
 /** @var ?JUnit */
 $junit = null;
@@ -127,6 +125,9 @@
     --color
     --no-color  Do/Don't colorize the result type in the test result.
 
+    --progress
+    --no-progress  Do/Don't show the current progress.
+
     --repeat [n]
                 Run the tests multiple times in the same process and check the
                 output of the last execution (CLI SAPI only).
@@ -152,14 +153,14 @@
            $cfgfiles, $cfgtypes, $conf_passed, $end_time, $environment,
            $exts_skipped, $exts_tested, $exts_to_test, $failed_tests_file,
            $ignored_by_ext, $ini_overwrites, $is_switch, $colorize,
-           $just_save_results, $log_format, $matches, $no_clean, $no_file_cache,
-           $optionals, $output_file, $pass_option_n, $pass_options,
+           $log_format, $matches, $no_clean, $no_file_cache,
+           $optionals, $pass_option_n, $pass_options,
            $pattern_match, $php, $php_cgi, $phpdbg, $preload, $redir_tests,
            $repeat, $result_tests_file, $slow_min_ms, $start_time, $switch,
            $temp_source, $temp_target, $test_cnt, $test_dirs,
            $test_files, $test_idx, $test_list, $test_results, $testfile,
            $user_tests, $valgrind, $sum_results, $shuffle, $file_cache, $num_repeats,
-           $bless;
+           $bless, $show_progress;
     // Parallel testing
     global $workers, $workerID;
     global $context_line_count;
@@ -228,14 +229,14 @@
             // fail to reattach to the OpCache because it will be using the
             // wrong path.
             die("TEMP environment is NOT set");
-        } else {
-            if (count($environment) == 1) {
-                // Not having other environment variables, only having TEMP, is
-                // probably ok, but strange and may make a difference in the
-                // test pass rate, so warn the user.
-                echo "WARNING: Only 1 environment variable will be available to tests(TEMP environment variable)" . PHP_EOL;
-            }
         }
+
+        if (count($environment) == 1) {
+            // Not having other environment variables, only having TEMP, is
+            // probably ok, but strange and may make a difference in the
+            // test pass rate, so warn the user.
+            echo "WARNING: Only 1 environment variable will be available to tests(TEMP environment variable)" , PHP_EOL;
+        }
     }
 
     if (IS_WINDOWS && empty($environment["SystemRoot"])) {
@@ -313,9 +314,6 @@
 
     $no_file_cache = '-d opcache.file_cache= -d opcache.file_cache_only=0';
 
-    define('PHP_QA_EMAIL', 'qa-reports at lists.php.net');
-    define('QA_SUBMISSION_PAGE', 'http://qa.php.net/buildtest-process.php');
-    define('QA_REPORTS_PAGE', 'http://qa.php.net/reports');
     define('TRAVIS_CI', (bool) getenv('TRAVIS'));
 
     // Determine the tests to be run.
@@ -363,6 +361,8 @@
     $workers = null;
     $context_line_count = 3;
     $num_repeats = 1;
+    $show_progress = true;
+    $ignored_by_ext = [];
 
     $cfgtypes = ['show', 'keep'];
     $cfgfiles = ['skip', 'php', 'clean', 'out', 'diff', 'exp', 'mem'];
@@ -422,7 +422,7 @@
             switch ($switch) {
                 case 'j':
                     $workers = substr($argv[$i], 2);
-                    if (!preg_match('/^\d+$/', $workers) || $workers == 0) {
+                    if ($workers == 0 || !preg_match('/^\d+$/', $workers)) {
                         error("'$workers' is not a valid number of workers, try e.g. -j16 for 16 workers");
                     }
                     $workers = intval($workers, 10);
@@ -439,10 +439,8 @@
                             $matches = [];
                             if (preg_match('/^#.*\[(.*)\]\:\s+(.*)$/', $test, $matches)) {
                                 $redir_tests[] = [$matches[1], $matches[2]];
-                            } else {
-                                if (strlen($test)) {
-                                    $test_files[] = trim($test);
-                                }
+                            } elseif (strlen($test)) {
+                                $test_files[] = trim($test);
                             }
                         }
                     }
@@ -582,6 +580,7 @@
                     $environment['SKIP_PERF_SENSITIVE'] = 1;
                     if ($switch === '--msan') {
                         $environment['SKIP_MSAN'] = 1;
+                        $environment['MSAN_OPTIONS'] = 'intercept_tls_get_addr=0';
                     }
 
                     $lsanSuppressions = __DIR__ . '/.github/lsan-suppressions.txt';
@@ -605,8 +604,14 @@
                         $repeat = true;
                     }
                     break;
+                case '--progress':
+                    $show_progress = true;
+                    break;
+                case '--no-progress':
+                    $show_progress = false;
+                    break;
                 case '--version':
-                    echo '$Id: edfab1f57adcd4ed819df5076d7ffb5a15c40bc1 $' . "\n";
+                    echo '$Id: d51ab99a205a313e0e88894fca82b3b274d71b69 $' . "\n";
                     exit(1);
 
                 default:
@@ -627,27 +632,21 @@
             if (!$testfile && strpos($argv[$i], '*') !== false && function_exists('glob')) {
                 if (substr($argv[$i], -5) == '.phpt') {
                     $pattern_match = glob($argv[$i]);
+                } elseif (preg_match("/\*$/", $argv[$i])) {
+                    $pattern_match = glob($argv[$i] . '.phpt');
                 } else {
-                    if (preg_match("/\*$/", $argv[$i])) {
-                        $pattern_match = glob($argv[$i] . '.phpt');
-                    } else {
-                        die('Cannot find test file "' . $argv[$i] . '".' . PHP_EOL);
-                    }
+                    die('Cannot find test file "' . $argv[$i] . '".' . PHP_EOL);
                 }
 
                 if (is_array($pattern_match)) {
                     $test_files = array_merge($test_files, $pattern_match);
                 }
+            } elseif (is_dir($testfile)) {
+                find_files($testfile);
+            } elseif (substr($testfile, -5) == '.phpt') {
+                $test_files[] = $testfile;
             } else {
-                if (is_dir($testfile)) {
-                    find_files($testfile);
-                } else {
-                    if (substr($testfile, -5) == '.phpt') {
-                        $test_files[] = $testfile;
-                    } else {
-                        die('Cannot find test file "' . $argv[$i] . '".' . PHP_EOL);
-                    }
-                }
+                die('Cannot find test file "' . $argv[$i] . '".' . PHP_EOL);
             }
         }
     }
@@ -680,10 +679,16 @@
 
     putenv("TEST_PHP_EXECUTABLE=$php");
     $environment['TEST_PHP_EXECUTABLE'] = $php;
+    putenv("TEST_PHP_EXECUTABLE_ESCAPED=" . escapeshellarg($php));
+    $environment['TEST_PHP_EXECUTABLE_ESCAPED'] = escapeshellarg($php);
     putenv("TEST_PHP_CGI_EXECUTABLE=$php_cgi");
     $environment['TEST_PHP_CGI_EXECUTABLE'] = $php_cgi;
+    putenv("TEST_PHP_CGI_EXECUTABLE_ESCAPED=" . escapeshellarg($php_cgi ?? ''));
+    $environment['TEST_PHP_CGI_EXECUTABLE_ESCAPED'] = escapeshellarg($php_cgi ?? '');
     putenv("TEST_PHPDBG_EXECUTABLE=$phpdbg");
     $environment['TEST_PHPDBG_EXECUTABLE'] = $phpdbg;
+    putenv("TEST_PHPDBG_EXECUTABLE_ESCAPED=" . escapeshellarg($phpdbg ?? ''));
+    $environment['TEST_PHPDBG_EXECUTABLE_ESCAPED'] = escapeshellarg($phpdbg ?? '');
 
     if ($conf_passed !== null) {
         if (IS_WINDOWS) {
@@ -731,14 +736,13 @@
         echo get_summary(false);
 
         if ($output_file != '' && $just_save_results) {
-            save_or_mail_results();
+            save_results($output_file, /* prompt_to_save_results: */ false);
         }
     } else {
         // Compile a list of all test files (*.phpt).
         $test_files = [];
-        $exts_tested = count($exts_to_test);
-        $exts_skipped = 0;
-        $ignored_by_ext = 0;
+        $exts_tested = $exts_to_test;
+        $exts_skipped = [];
         sort($exts_to_test);
         $test_dirs = [];
         $optionals = ['Zend', 'tests', 'ext', 'sapi'];
@@ -749,11 +753,6 @@
             }
         }
 
-        // Convert extension names to lowercase
-        foreach ($exts_to_test as $key => $val) {
-            $exts_to_test[$key] = strtolower($val);
-        }
-
         foreach ($test_dirs as $dir) {
             find_files(TEST_PHP_SRCDIR . "/{$dir}", $dir == 'ext');
         }
@@ -793,7 +792,7 @@
         show_end($end_time);
         show_summary();
 
-        save_or_mail_results();
+        save_results($output_file, /* prompt_to_save_results: */ true);
     }
 
     $junit->saveXML();
@@ -839,6 +838,7 @@
 function write_information(): void
 {
     global $php, $php_cgi, $phpdbg, $php_info, $user_tests, $ini_overwrites, $pass_options, $exts_to_test, $valgrind, $no_file_cache;
+    $php_escaped = escapeshellarg($php);
 
     // Get info from php
     $info_file = __DIR__ . '/run-test-info.php';
@@ -854,11 +854,12 @@
     $info_params = [];
     settings2array($ini_overwrites, $info_params);
     $info_params = settings2params($info_params);
-    $php_info = `$php $pass_options $info_params $no_file_cache "$info_file"`;
-    define('TESTED_PHP_VERSION', `$php -n -r "echo PHP_VERSION;"`);
+    $php_info = shell_exec("$php_escaped $pass_options $info_params $no_file_cache \"$info_file\"");
+    define('TESTED_PHP_VERSION', shell_exec("$php_escaped -n -r \"echo PHP_VERSION;\""));
 
     if ($php_cgi && $php != $php_cgi) {
-        $php_info_cgi = `$php_cgi $pass_options $info_params $no_file_cache -q "$info_file"`;
+        $php_cgi_escaped = escapeshellarg($php_cgi);
+        $php_info_cgi = shell_exec("$php_cgi_escaped $pass_options $info_params $no_file_cache -q \"$info_file\"");
         $php_info_sep = "\n---------------------------------------------------------------------";
         $php_cgi_info = "$php_info_sep\nPHP         : $php_cgi $php_info_cgi$php_info_sep";
     } else {
@@ -866,7 +867,8 @@
     }
 
     if ($phpdbg) {
-        $phpdbg_info = `$phpdbg $pass_options $info_params $no_file_cache -qrr "$info_file"`;
+        $phpdbg_escaped = escapeshellarg($phpdbg);
+        $phpdbg_info = shell_exec("$phpdbg_escaped $pass_options $info_params $no_file_cache -qrr \"$info_file\"");
         $php_info_sep = "\n---------------------------------------------------------------------";
         $phpdbg_info = "$php_info_sep\nPHP         : $phpdbg $phpdbg_info$php_info_sep";
     } else {
@@ -881,20 +883,19 @@
     // load list of enabled and loadable extensions
     save_text($info_file, <<<'PHP'
         <?php
-        echo str_replace("Zend OPcache", "opcache", implode(",", get_loaded_extensions()));
-        $ext_dir = ini_get("extension_dir");
+        $exts = get_loaded_extensions();
+        $ext_dir = ini_get('extension_dir');
         foreach (scandir($ext_dir) as $file) {
-            if (!preg_match('/^(?:php_)?([_a-zA-Z0-9]+)\.(?:so|dll)$/', $file, $matches)) {
-                continue;
+            if (preg_match('/^(?:php_)?([_a-zA-Z0-9]+)\.(?:so|dll)$/', $file, $matches)) {
+                if (!extension_loaded($matches[1]) && @dl($matches[1])) {
+                    $exts[] = $matches[1];
+                }
             }
-            $ext = $matches[1];
-            if (!extension_loaded($ext) && @dl($file)) {
-                echo ",", $ext;
-            }
         }
-        ?>
-    PHP);
-    $exts_to_test = explode(',', `$php $pass_options $info_params $no_file_cache "$info_file"`);
+        echo implode(',', $exts);
+        PHP);
+    $extensionsNames = explode(',', shell_exec("$php_escaped $pass_options $info_params $no_file_cache \"$info_file\""));
+    $exts_to_test = array_unique(remap_loaded_extensions_names($extensionsNames));
     // check for extensions that need special handling and regenerate
     $info_params_ex = [
         'session' => ['session.auto_start=0'],
@@ -929,134 +930,101 @@
 ";
 }
 
-function save_or_mail_results(): void
+function save_results(string $output_file, bool $prompt_to_save_results): void
 {
-    global $sum_results, $just_save_results, $failed_test_summary,
-           $PHP_FAILED_TESTS, $php, $output_file;
+    global $sum_results, $failed_test_summary,
+           $PHP_FAILED_TESTS, $php;
 
-    /* We got failed Tests, offer the user to send an e-mail to QA team, unless NO_INTERACTION is set */
-    if (!getenv('NO_INTERACTION') && !TRAVIS_CI) {
+    if (getenv('NO_INTERACTION') || TRAVIS_CI) {
+        return;
+    }
+
+    if ($prompt_to_save_results) {
+        /* We got failed Tests, offer the user to save a QA report */
         $fp = fopen("php://stdin", "r+");
         if ($sum_results['FAILED'] || $sum_results['BORKED'] || $sum_results['WARNED'] || $sum_results['LEAKED']) {
             echo "\nYou may have found a problem in PHP.";
         }
-        echo "\nThis report can be automatically sent to the PHP QA team at\n";
-        echo QA_REPORTS_PAGE . " and http://news.php.net/php.qa.reports\n";
+        echo "\nThis report can be saved and used to open an issue on the bug tracker at\n";
+        echo "https://github.com/php/php-src/issues\n";
         echo "This gives us a better understanding of PHP's behavior.\n";
-        echo "If you don't want to send the report immediately you can choose\n";
-        echo "option \"s\" to save it.	You can then email it to " . PHP_QA_EMAIL . " later.\n";
-        echo "Do you want to send this report now? [Yns]: ";
+        echo "Do you want to save this report in a file? [Yn]: ";
         flush();
 
         $user_input = fgets($fp, 10);
-        $just_save_results = (!empty($user_input) && strtolower($user_input[0]) === 's');
+        fclose($fp);
+        if (!(strlen(trim($user_input)) == 0 || strtolower($user_input[0]) == 'y')) {
+            return;
+        }
     }
+    /**
+     * Collect information about the host system for our report
+     * Fetch phpinfo() output so that we can see the PHP environment
+     * Make an archive of all the failed tests
+     */
+    $failed_tests_data = '';
+    $sep = "\n" . str_repeat('=', 80) . "\n";
+    $failed_tests_data .= $failed_test_summary . "\n";
+    $failed_tests_data .= get_summary(true) . "\n";
 
-    if ($just_save_results || !getenv('NO_INTERACTION') || TRAVIS_CI) {
-        if ($just_save_results || TRAVIS_CI || strlen(trim($user_input)) == 0 || strtolower($user_input[0]) == 'y') {
-            /*
-             * Collect information about the host system for our report
-             * Fetch phpinfo() output so that we can see the PHP environment
-             * Make an archive of all the failed tests
-             * Send an email
-             */
-            if ($just_save_results) {
-                $user_input = 's';
-            }
+    if ($sum_results['FAILED']) {
+        foreach ($PHP_FAILED_TESTS['FAILED'] as $test_info) {
+            $failed_tests_data .= $sep . $test_info['name'] . $test_info['info'];
+            $failed_tests_data .= $sep . file_get_contents(realpath($test_info['output']));
+            $failed_tests_data .= $sep . file_get_contents(realpath($test_info['diff']));
+            $failed_tests_data .= $sep . "\n\n";
+        }
+    }
 
-            /* Ask the user to provide an email address, so that QA team can contact the user */
-            if (TRAVIS_CI) {
-                $user_email = 'travis at php dot net';
-            } elseif (!strncasecmp($user_input, 'y', 1) || strlen(trim($user_input)) == 0) {
-                echo "\nPlease enter your email address.\n(Your address will be mangled so that it will not go out on any\nmailinglist in plain text): ";
-                flush();
-                $user_email = trim(fgets($fp, 1024));
-                $user_email = str_replace("@", " at ", str_replace(".", " dot ", $user_email));
-            }
+    $failed_tests_data .= "\n" . $sep . 'BUILD ENVIRONMENT' . $sep;
+    $failed_tests_data .= "OS:\n" . PHP_OS . " - " . php_uname() . "\n\n";
+    $ldd = $autoconf = $sys_libtool = $libtool = $compiler = 'N/A';
 
-            $failed_tests_data = '';
-            $sep = "\n" . str_repeat('=', 80) . "\n";
-            $failed_tests_data .= $failed_test_summary . "\n";
-            $failed_tests_data .= get_summary(true) . "\n";
+    if (!IS_WINDOWS) {
+        /* If PHP_AUTOCONF is set, use it; otherwise, use 'autoconf'. */
+        if (getenv('PHP_AUTOCONF')) {
+            $autoconf = shell_exec(getenv('PHP_AUTOCONF') . ' --version');
+        } else {
+            $autoconf = shell_exec('autoconf --version');
+        }
 
-            if ($sum_results['FAILED']) {
-                foreach ($PHP_FAILED_TESTS['FAILED'] as $test_info) {
-                    $failed_tests_data .= $sep . $test_info['name'] . $test_info['info'];
-                    $failed_tests_data .= $sep . file_get_contents(realpath($test_info['output']));
-                    $failed_tests_data .= $sep . file_get_contents(realpath($test_info['diff']));
-                    $failed_tests_data .= $sep . "\n\n";
-                }
-                $status = "failed";
-            } else {
-                $status = "success";
-            }
+        /* Always use the generated libtool - Mac OSX uses 'glibtool' */
+        $libtool = shell_exec(INIT_DIR . '/libtool --version');
 
-            $failed_tests_data .= "\n" . $sep . 'BUILD ENVIRONMENT' . $sep;
-            $failed_tests_data .= "OS:\n" . PHP_OS . " - " . php_uname() . "\n\n";
-            $ldd = $autoconf = $sys_libtool = $libtool = $compiler = 'N/A';
+        /* Use shtool to find out if there is glibtool present (MacOSX) */
+        $sys_libtool_path = shell_exec(__DIR__ . '/build/shtool path glibtool libtool');
 
-            if (!IS_WINDOWS) {
-                /* If PHP_AUTOCONF is set, use it; otherwise, use 'autoconf'. */
-                if (getenv('PHP_AUTOCONF')) {
-                    $autoconf = shell_exec(getenv('PHP_AUTOCONF') . ' --version');
-                } else {
-                    $autoconf = shell_exec('autoconf --version');
-                }
+        if ($sys_libtool_path) {
+            $sys_libtool = shell_exec(str_replace("\n", "", $sys_libtool_path) . ' --version');
+        }
 
-                /* Always use the generated libtool - Mac OSX uses 'glibtool' */
-                $libtool = shell_exec(INIT_DIR . '/libtool --version');
+        /* Try the most common flags for 'version' */
+        $flags = ['-v', '-V', '--version'];
+        $cc_status = 0;
 
-                /* Use shtool to find out if there is glibtool present (MacOSX) */
-                $sys_libtool_path = shell_exec(__DIR__ . '/build/shtool path glibtool libtool');
-
-                if ($sys_libtool_path) {
-                    $sys_libtool = shell_exec(str_replace("\n", "", $sys_libtool_path) . ' --version');
-                }
-
-                /* Try the most common flags for 'version' */
-                $flags = ['-v', '-V', '--version'];
-                $cc_status = 0;
-
-                foreach ($flags as $flag) {
-                    system(getenv('CC') . " $flag >/dev/null 2>&1", $cc_status);
-                    if ($cc_status == 0) {
-                        $compiler = shell_exec(getenv('CC') . " $flag 2>&1");
-                        break;
-                    }
-                }
-
-                $ldd = shell_exec("ldd $php 2>/dev/null");
+        foreach ($flags as $flag) {
+            system(getenv('CC') . " $flag >/dev/null 2>&1", $cc_status);
+            if ($cc_status == 0) {
+                $compiler = shell_exec(getenv('CC') . " $flag 2>&1");
+                break;
             }
+        }
 
-            $failed_tests_data .= "Autoconf:\n$autoconf\n";
-            $failed_tests_data .= "Bundled Libtool:\n$libtool\n";
-            $failed_tests_data .= "System Libtool:\n$sys_libtool\n";
-            $failed_tests_data .= "Compiler:\n$compiler\n";
-            $failed_tests_data .= "Bison:\n" . shell_exec('bison --version 2>/dev/null') . "\n";
-            $failed_tests_data .= "Libraries:\n$ldd\n";
-            $failed_tests_data .= "\n";
+        $ldd = shell_exec("ldd $php 2>/dev/null");
+    }
 
-            if (isset($user_email)) {
-                $failed_tests_data .= "User's E-mail: " . $user_email . "\n\n";
-            }
+    $failed_tests_data .= "Autoconf:\n$autoconf\n";
+    $failed_tests_data .= "Bundled Libtool:\n$libtool\n";
+    $failed_tests_data .= "System Libtool:\n$sys_libtool\n";
+    $failed_tests_data .= "Compiler:\n$compiler\n";
+    $failed_tests_data .= "Bison:\n" . shell_exec('bison --version 2>/dev/null') . "\n";
+    $failed_tests_data .= "Libraries:\n$ldd\n";
+    $failed_tests_data .= "\n";
+    $failed_tests_data .= $sep . "PHPINFO" . $sep;
+    $failed_tests_data .= shell_exec($php . ' -ddisplay_errors=stderr -dhtml_errors=0 -i 2> /dev/null');
 
-            $failed_tests_data .= $sep . "PHPINFO" . $sep;
-            $failed_tests_data .= shell_exec($php . ' -ddisplay_errors=stderr -dhtml_errors=0 -i 2> /dev/null');
-
-            if (($just_save_results || !mail_qa_team($failed_tests_data, $status)) && !TRAVIS_CI) {
-                file_put_contents($output_file, $failed_tests_data);
-
-                if (!$just_save_results) {
-                    echo "\nThe test script was unable to automatically send the report to PHP's QA Team\n";
-                }
-
-                echo "Please send " . $output_file . " to " . PHP_QA_EMAIL . " manually, thank you.\n";
-            } elseif (!getenv('NO_INTERACTION') && !TRAVIS_CI) {
-                fwrite($fp, "\nThank you for helping to make PHP better.\n");
-                fclose($fp);
-            }
-        }
-    }
+    file_put_contents($output_file, $failed_tests_data);
+    echo "Report saved to: ", $output_file, "\n";
 }
 
 function get_binary(string $php, string $sapi, string $sapi_path): ?string
@@ -1085,9 +1053,9 @@
 
     while (($name = readdir($o)) !== false) {
         if (is_dir("{$dir}/{$name}") && !in_array($name, ['.', '..', '.svn'])) {
-            $skip_ext = ($is_ext_dir && !in_array(strtolower($name), $exts_to_test));
+            $skip_ext = ($is_ext_dir && !in_array($name, $exts_to_test));
             if ($skip_ext) {
-                $exts_skipped++;
+                $exts_skipped[] = $name;
             }
             find_files("{$dir}/{$name}", false, $ignore || $skip_ext);
         }
@@ -1099,11 +1067,13 @@
         }
 
         // Otherwise we're only interested in *.phpt files.
-        if (substr($name, -5) == '.phpt') {
+        // (but not those starting with a dot, which are hidden on
+        // many platforms)
+        if (substr($name, -5) == '.phpt' && substr($name, 0, 1) !== '.') {
+            $testfile = realpath("{$dir}/{$name}");
             if ($ignore) {
-                $ignored_by_ext++;
+                $ignored_by_ext[] = $testfile;
             } else {
-                $testfile = realpath("{$dir}/{$name}");
                 $test_files[] = $testfile;
             }
         }
@@ -1119,9 +1089,9 @@
 {
     if (is_array($name)) {
         return $name[0] . ':' . $name[1];
-    } else {
-        return $name;
     }
+
+    return $name;
 }
 /**
  * @param array|string $a
@@ -1139,55 +1109,9 @@
 
     if ($ta == $tb) {
         return strcmp($a, $b);
-    } else {
-        return $tb - $ta;
     }
-}
 
-//
-// Send Email to QA Team
-//
-
-function mail_qa_team(string $data, bool $status = false): bool
-{
-    $url_bits = parse_url(QA_SUBMISSION_PAGE);
-
-    if ($proxy = getenv('http_proxy')) {
-        $proxy = parse_url($proxy);
-        $path = $url_bits['host'] . $url_bits['path'];
-        $host = $proxy['host'];
-        if (empty($proxy['port'])) {
-            $proxy['port'] = 80;
-        }
-        $port = $proxy['port'];
-    } else {
-        $path = $url_bits['path'];
-        $host = $url_bits['host'];
-        $port = empty($url_bits['port']) ? 80 : $port = $url_bits['port'];
-    }
-
-    $data = "php_test_data=" . urlencode(base64_encode(str_replace("\00", '[0x0]', $data)));
-    $data_length = strlen($data);
-
-    $fs = fsockopen($host, $port, $errno, $errstr, 10);
-
-    if (!$fs) {
-        return false;
-    }
-
-    $php_version = urlencode(TESTED_PHP_VERSION);
-
-    echo "\nPosting to " . QA_SUBMISSION_PAGE . "\n";
-    fwrite($fs, "POST " . $path . "?status=$status&version=$php_version HTTP/1.1\r\n");
-    fwrite($fs, "Host: " . $host . "\r\n");
-    fwrite($fs, "User-Agent: QA Browser 0.1\r\n");
-    fwrite($fs, "Content-Type: application/x-www-form-urlencoded\r\n");
-    fwrite($fs, "Content-Length: " . $data_length . "\r\n\r\n");
-    fwrite($fs, $data);
-    fwrite($fs, "\r\n\r\n");
-    fclose($fs);
-
-    return true;
+    return $tb - $ta;
 }
 
 //
@@ -1198,10 +1122,8 @@
 {
     global $DETAILED;
 
-    if ($filename_copy && $filename_copy != $filename) {
-        if (file_put_contents($filename_copy, $text) === false) {
-            error("Cannot open file '" . $filename_copy . "' (save_text)");
-        }
+    if ($filename_copy && $filename_copy != $filename && file_put_contents($filename_copy, $text) === false) {
+        error("Cannot open file '" . $filename_copy . "' (save_text)");
     }
 
     if (file_put_contents($filename, $text) === false) {
@@ -1251,6 +1173,13 @@
 ) {
     global $valgrind;
 
+    // when proc_open cmd is passed as a string (without bypass_shell=true option) the cmd goes thru shell
+    // and on Windows quotes are discarded, this is a fix to honor the quotes and allow values containing
+    // spaces like '"C:\Program Files\PHP\php.exe"' to be passed as 1 argument correctly
+    if (IS_WINDOWS) {
+        $commandline = 'start "" /b /wait ' . $commandline . ' & exit';
+    }
+
     $data = '';
 
     $bin_env = [];
@@ -1283,6 +1212,10 @@
     }
 
     $timeout = $valgrind ? 300 : ($env['TEST_TIMEOUT'] ?? 60);
+    /* ASAN can cause a ~2-3x slowdown. */
+    if (isset($env['SKIP_ASAN'])) {
+        $timeout *= 3;
+    }
 
     while (true) {
         /* hide errors from interrupted syscalls */
@@ -1294,12 +1227,16 @@
 
         if ($n === false) {
             break;
-        } elseif ($n === 0) {
+        }
+
+        if ($n === 0) {
             /* timed out */
             $data .= "\n ** ERROR: process timed out **\n";
             proc_terminate($proc, 9);
             return $data;
-        } elseif ($n > 0) {
+        }
+
+        if ($n > 0) {
             if ($captureStdOut) {
                 $line = fread($pipes[1], 8192);
             } elseif ($captureStdErr) {
@@ -1417,7 +1354,7 @@
  */
 function run_all_tests_parallel(array $test_files, array $env, $redir_tested): void
 {
-    global $workers, $test_idx, $test_cnt, $test_results, $failed_tests_file, $result_tests_file, $PHP_FAILED_TESTS, $shuffle, $SHOW_ONLY_GROUPS, $valgrind;
+    global $workers, $test_idx, $test_cnt, $test_results, $failed_tests_file, $result_tests_file, $PHP_FAILED_TESTS, $shuffle, $SHOW_ONLY_GROUPS, $valgrind, $show_progress;
 
     global $junit;
 
@@ -1528,9 +1465,6 @@
             "constants" => [
                 "INIT_DIR" => INIT_DIR,
                 "TEST_PHP_SRCDIR" => TEST_PHP_SRCDIR,
-                "PHP_QA_EMAIL" => PHP_QA_EMAIL,
-                "QA_SUBMISSION_PAGE" => QA_SUBMISSION_PAGE,
-                "QA_REPORTS_PAGE" => QA_REPORTS_PAGE,
                 "TRAVIS_CI" => TRAVIS_CI
             ]
         ])) . "\n";
@@ -1660,8 +1594,7 @@
                                 ]);
                             } else {
                                 proc_terminate($workerProcs[$i]);
-                                unset($workerProcs[$i]);
-                                unset($workerSocks[$i]);
+                                unset($workerProcs[$i], $workerSocks[$i]);
                                 goto escape;
                             }
                             break;
@@ -1672,13 +1605,13 @@
                             }
                             $test_idx++;
 
-                            if (!$SHOW_ONLY_GROUPS) {
+                            if ($show_progress) {
                                 clear_show_test();
                             }
 
                             echo $resultText;
 
-                            if (!$SHOW_ONLY_GROUPS) {
+                            if ($show_progress) {
                                 show_test($test_idx, count($workerProcs) . "/$workers concurrent test workers running");
                             }
 
@@ -1728,7 +1661,7 @@
         }
     }
 
-    if (!$SHOW_ONLY_GROUPS) {
+    if ($show_progress) {
         clear_show_test();
     }
 
@@ -1739,11 +1672,47 @@
     }
 }
 
+/**
+ * Calls fwrite and retries when network writes fail with errors such as "Resource temporarily unavailable"
+ *
+ * @param resource $stream the stream to fwrite to
+ * @param string $data
+ * @return int|false
+ */
+function safe_fwrite($stream, string $data)
+{
+    // safe_fwrite was tested by adding $message['unused'] = str_repeat('a', 20_000_000); in send_message()
+    // fwrites on tcp sockets can return false or less than strlen if the recipient is busy.
+    // (e.g. fwrite(): Send of 577 bytes failed with errno=35 Resource temporarily unavailable)
+    $bytes_written = 0;
+    while ($bytes_written < strlen($data)) {
+        $n = @fwrite($stream, substr($data, $bytes_written));
+        if ($n === false) {
+            $write_streams = [$stream];
+            $read_streams = [];
+            $except_streams = [];
+            /* Wait for up to 10 seconds for the stream to be ready to write again. */
+            $result = stream_select($read_streams, $write_streams, $except_streams, 10);
+            if (!$result) {
+                echo "ERROR: send_message() stream_select() failed\n";
+                return false;
+            }
+            $n = @fwrite($stream, substr($data, $bytes_written));
+            if ($n === false) {
+                echo "ERROR: send_message() Failed to write chunk after stream_select: " . error_get_last()['message'] . "\n";
+                return false;
+            }
+        }
+        $bytes_written += $n;
+    }
+    return $bytes_written;
+}
+
 function send_message($stream, array $message): void
 {
     $blocking = stream_get_meta_data($stream)["blocked"];
     stream_set_blocking($stream, true);
-    fwrite($stream, base64_encode(serialize($message)) . "\n");
+    safe_fwrite($stream, base64_encode(serialize($message)) . "\n");
     stream_set_blocking($stream, $blocking);
 }
 
@@ -1874,6 +1843,7 @@
     global $num_repeats;
     // Parallel testing
     global $workerID;
+    global $show_progress;
 
     // Temporary
     /** @var JUnit */
@@ -1885,18 +1855,18 @@
         $skipCache = new SkipCache($enableSkipCache, $cfg['keep']['skip']);
     }
 
+    $orig_php = $php;
+    $php = escapeshellarg($php);
+
+    $retried = false;
+retry:
+
     $temp_filenames = null;
     $org_file = $file;
-    $orig_php = $php;
 
-    if (isset($env['TEST_PHP_CGI_EXECUTABLE'])) {
-        $php_cgi = $env['TEST_PHP_CGI_EXECUTABLE'];
-    }
+    $php_cgi = $env['TEST_PHP_CGI_EXECUTABLE'] ?? null;
+    $phpdbg = $env['TEST_PHPDBG_EXECUTABLE'] ?? null;
 
-    if (isset($env['TEST_PHPDBG_EXECUTABLE'])) {
-        $phpdbg = $env['TEST_PHPDBG_EXECUTABLE'];
-    }
-
     if (is_array($file)) {
         $file = $file[0];
     }
@@ -1929,8 +1899,10 @@
 
     $tested = $test->getName();
 
-    if ($num_repeats > 1 && $test->hasSection('FILE_EXTERNAL')) {
-        return skip_test($tested, $tested_file, $shortname, 'Test with FILE_EXTERNAL might not be repeatable');
+    if ($test->hasSection('FILE_EXTERNAL')) {
+        if ($num_repeats > 1) {
+            return skip_test($tested, $tested_file, $shortname, 'Test with FILE_EXTERNAL might not be repeatable');
+        }
     }
 
     if ($test->hasSection('CAPTURE_STDIO')) {
@@ -1954,7 +1926,7 @@
         if (!$php_cgi) {
             return skip_test($tested, $tested_file, $shortname, 'CGI not available');
         }
-        $php = $php_cgi . ' -C ';
+        $php = escapeshellarg($php_cgi) . ' -C ';
         $uses_cgi = true;
         if ($num_repeats > 1) {
             return skip_test($tested, $tested_file, $shortname, 'CGI does not support --repeat');
@@ -1965,7 +1937,7 @@
     $extra_options = '';
     if ($test->hasSection('PHPDBG')) {
         if (isset($phpdbg)) {
-            $php = $phpdbg . ' -qIb';
+            $php = escapeshellarg($phpdbg) . ' -qIb';
 
             // Additional phpdbg command line options for sections that need to
             // be run straight away. For example, EXTENSIONS, SKIPIF, CLEAN.
@@ -1978,19 +1950,15 @@
         }
     }
 
-    if ($num_repeats > 1) {
-        if ($test->hasSection('CLEAN')) {
-            return skip_test($tested, $tested_file, $shortname, 'Test with CLEAN might not be repeatable');
+    foreach (['CLEAN', 'STDIN', 'CAPTURE_STDIO'] as $section) {
+        if ($test->hasSection($section)) {
+            if ($num_repeats > 1) {
+                return skip_test($tested, $tested_file, $shortname, "Test with $section might not be repeatable");
+            }
         }
-        if ($test->hasSection('STDIN')) {
-            return skip_test($tested, $tested_file, $shortname, 'Test with STDIN might not be repeatable');
-        }
-        if ($test->hasSection('CAPTURE_STDIO')) {
-            return skip_test($tested, $tested_file, $shortname, 'Test with CAPTURE_STDIO might not be repeatable');
-        }
     }
 
-    if (!$SHOW_ONLY_GROUPS && !$workerID) {
+    if ($show_progress && !$workerID) {
         show_test($test_idx, $shortname);
     }
 
@@ -2114,7 +2082,7 @@
         $ext_prefix = IS_WINDOWS ? "php_" : "";
         $missing = [];
         foreach ($extensions as $req_ext) {
-            if (!in_array(strtolower($req_ext), $loaded)) {
+            if (!in_array($req_ext, $loaded, true)) {
                 if ($req_ext == 'opcache' || $req_ext == 'xdebug') {
                     $ext_file = $ext_dir . DIRECTORY_SEPARATOR . $ext_prefix . $req_ext . '.' . PHP_SHLIB_SUFFIX;
                     $ini_settings['zend_extension'][] = $ext_file;
@@ -2163,10 +2131,25 @@
         $ini = str_replace('{TMP}', sys_get_temp_dir(), $ini);
         $replacement = IS_WINDOWS ? '"' . PHP_BINARY . ' -r \"while ($in = fgets(STDIN)) echo $in;\" > $1"' : 'tee $1 >/dev/null';
         $ini = preg_replace('/{MAIL:(\S+)}/', $replacement, $ini);
+        $skip = false;
+        $ini = preg_replace_callback('/{ENV:(\S+)}/', function ($m) use (&$skip) {
+            $name = $m[1];
+            $value = getenv($name);
+            if ($value === false) {
+                $skip = sprintf('Environment variable %s is not set', $name);
+                return '';
+            }
+            return $value;
+        }, $ini);
+        if ($skip !== false) {
+            return skip_test($tested, $tested_file, $shortname, $skip);
+        }
         settings2array(preg_split("/[\n\r]+/", $ini), $ini_settings);
 
-        if ($num_repeats > 1 && isset($ini_settings['opcache.opt_debug_level'])) {
-            return skip_test($tested, $tested_file, $shortname, 'opt_debug_level tests are not repeatable');
+        if (isset($ini_settings['opcache.opt_debug_level'])) {
+            if ($num_repeats > 1) {
+                return skip_test($tested, $tested_file, $shortname, 'opt_debug_level tests are not repeatable');
+            }
         }
     }
 
@@ -2232,6 +2215,12 @@
         } elseif (!strncasecmp('xfail', $output, 5)) {
             // Pretend we have an XFAIL section
             $test->setSection('XFAIL', ltrim(substr($output, 5)));
+        } elseif (!strncasecmp('xleak', $output, 5)) {
+            // Pretend we have an XLEAK section
+            $test->setSection('XLEAK', ltrim(substr($output, 5)));
+        } elseif (!strncasecmp('flaky', $output, 5)) {
+            // Pretend we have a FLAKY section
+            $test->setSection('FLAKY', ltrim(substr($output, 5)));
         } elseif ($output !== '') {
             show_result("BORK", $output, $tested_file, 'reason: invalid output from SKIPIF', $temp_filenames);
             $PHP_FAILED_TESTS['BORKED'][] = [
@@ -2293,17 +2282,17 @@
 
             $junit->markTestAs('PASS', $shortname, $tested);
             return 'REDIR';
-        } else {
-            $bork_info = "Redirect info must contain exactly one TEST string to be used as redirect directory.";
-            show_result("BORK", $bork_info, '', '', $temp_filenames);
-            $PHP_FAILED_TESTS['BORKED'][] = [
-                'name' => $file,
-                'test_name' => '',
-                'output' => '',
-                'diff' => '',
-                'info' => "$bork_info [$file]",
-            ];
         }
+
+        $bork_info = "Redirect info must contain exactly one TEST string to be used as redirect directory.";
+        show_result("BORK", $bork_info, '', '', $temp_filenames);
+        $PHP_FAILED_TESTS['BORKED'][] = [
+            'name' => $file,
+            'test_name' => '',
+            'output' => '',
+            'diff' => '',
+            'info' => "$bork_info [$file]",
+        ];
     }
 
     if (is_array($org_file) || $test->hasSection('REDIRECTTEST')) {
@@ -2486,6 +2475,16 @@
         $cmd = $valgrind->wrapCommand($cmd, $memcheck_filename, strpos($test_file, "pcre") !== false);
     }
 
+    if ($test->hasSection('XLEAK')) {
+        $env['ZEND_ALLOC_PRINT_LEAKS'] = '0';
+        if (isset($env['SKIP_ASAN'])) {
+            // $env['LSAN_OPTIONS'] = 'detect_leaks=0';
+            /* For unknown reasons, LSAN_OPTIONS=detect_leaks=0 would occasionally not be picked up
+             * in CI. Skip the test with ASAN, as it's not worth investegating. */
+            return skip_test($tested, $tested_file, $shortname, 'xleak does not work with asan');
+        }
+    }
+
     if ($DETAILED) {
         echo "
 CONTENT_LENGTH  = " . $env['CONTENT_LENGTH'] . "
@@ -2520,7 +2519,9 @@
         ];
     }
 
-    if ($test->sectionNotEmpty('CLEAN') && (!$no_clean || $cfg['keep']['clean'])) {
+    // Remember CLEAN output to report borked test if it otherwise passes.
+    $clean_output = null;
+    if ((!$no_clean || $cfg['keep']['clean']) && $test->sectionNotEmpty('CLEAN')) {
         show_file_block('clean', $test->getSection('CLEAN'));
         save_text($test_clean, trim($test->getSection('CLEAN')), $temp_clean);
 
@@ -2527,7 +2528,7 @@
         if (!$no_clean) {
             $extra = !IS_WINDOWS ?
                 "unset REQUEST_METHOD; unset QUERY_STRING; unset PATH_TRANSLATED; unset SCRIPT_FILENAME; unset REQUEST_METHOD;" : "";
-            system_with_timeout("$extra $php $pass_options $extra_options -q $orig_ini_settings $no_file_cache \"$test_clean\"", $env);
+            $clean_output = system_with_timeout("$extra $orig_php $pass_options -q $orig_ini_settings $no_file_cache \"$test_clean\"", $env);
         }
 
         if (!$cfg['keep']['clean']) {
@@ -2583,6 +2584,8 @@
         }
     }
 
+    $wanted_headers = null;
+    $output_headers = null;
     $failed_headers = false;
 
     if ($test->hasSection('EXPECTHEADERS')) {
@@ -2633,71 +2636,11 @@
         $wanted_re = preg_replace('/\r\n/', "\n", $wanted);
 
         if ($test->hasSection('EXPECTF')) {
-            // do preg_quote, but miss out any %r delimited sections
-            $temp = "";
-            $r = "%r";
-            $startOffset = 0;
-            $length = strlen($wanted_re);
-            while ($startOffset < $length) {
-                $start = strpos($wanted_re, $r, $startOffset);
-                if ($start !== false) {
-                    // we have found a start tag
-                    $end = strpos($wanted_re, $r, $start + 2);
-                    if ($end === false) {
-                        // unbalanced tag, ignore it.
-                        $end = $start = $length;
-                    }
-                } else {
-                    // no more %r sections
-                    $start = $end = $length;
-                }
-                // quote a non re portion of the string
-                $temp .= preg_quote(substr($wanted_re, $startOffset, $start - $startOffset), '/');
-                // add the re unquoted.
-                if ($end > $start) {
-                    $temp .= '(' . substr($wanted_re, $start + 2, $end - $start - 2) . ')';
-                }
-                $startOffset = $end + 2;
-            }
-            $wanted_re = $temp;
-
-            // Stick to basics
-            $wanted_re = str_replace('%e', '\\' . DIRECTORY_SEPARATOR, $wanted_re);
-            $wanted_re = str_replace('%s', '[^\r\n]+', $wanted_re);
-            $wanted_re = str_replace('%S', '[^\r\n]*', $wanted_re);
-            $wanted_re = str_replace('%a', '.+', $wanted_re);
-            $wanted_re = str_replace('%A', '.*', $wanted_re);
-            $wanted_re = str_replace('%w', '\s*', $wanted_re);
-            $wanted_re = str_replace('%i', '[+-]?\d+', $wanted_re);
-            $wanted_re = str_replace('%d', '\d+', $wanted_re);
-            $wanted_re = str_replace('%x', '[0-9a-fA-F]+', $wanted_re);
-            $wanted_re = str_replace('%f', '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?', $wanted_re);
-            $wanted_re = str_replace('%c', '.', $wanted_re);
-            $wanted_re = str_replace('%0', '\x00', $wanted_re);
-            // %f allows two points "-.0.0" but that is the best *simple* expression
+            $wanted_re = expectf_to_regex($wanted_re);
         }
 
-        if (preg_match("/^$wanted_re\$/s", $output)) {
+        if (preg_match('/^' . $wanted_re . '$/s', $output)) {
             $passed = true;
-            if (!$cfg['keep']['php'] && !$leaked) {
-                @unlink($test_file);
-                @unlink($preload_filename);
-            }
-            @unlink($tmp_post);
-
-            if (!$leaked && !$failed_headers) {
-                if ($test->hasSection('XFAIL')) {
-                    $warn = true;
-                    $info = " (warn: XFAIL section but test passes)";
-                } elseif ($test->hasSection('XLEAK')) {
-                    $warn = true;
-                    $info = " (warn: XLEAK section but test passes)";
-                } else {
-                    show_result("PASS", $tested, $tested_file, '', $temp_filenames);
-                    $junit->markTestAs('PASS', $shortname, $tested);
-                    return 'PASSED';
-                }
-            }
         }
     } else {
         $wanted = trim($test->getSection('EXPECT'));
@@ -2707,29 +2650,54 @@
         // compare and leave on success
         if (!strcmp($output, $wanted)) {
             $passed = true;
+        }
 
-            if (!$cfg['keep']['php'] && !$leaked) {
-                @unlink($test_file);
-                @unlink($preload_filename);
+        $wanted_re = null;
+    }
+    if (!$passed && !$retried && error_may_be_retried($test, $output)) {
+        $retried = true;
+        goto retry;
+    }
+
+    if ($passed) {
+        if (!$cfg['keep']['php'] && !$leaked) {
+            @unlink($test_file);
+            @unlink($preload_filename);
+        }
+        @unlink($tmp_post);
+
+        if (!$leaked && !$failed_headers) {
+            // If the test passed and CLEAN produced output, report test as borked.
+            if ($clean_output) {
+                show_result("BORK", $output, $tested_file, 'reason: invalid output from CLEAN', $temp_filenames);
+                    $PHP_FAILED_TESTS['BORKED'][] = [
+                    'name' => $file,
+                    'test_name' => '',
+                    'output' => '',
+                    'diff' => '',
+                    'info' => "$clean_output [$file]",
+                ];
+
+                $junit->markTestAs('BORK', $shortname, $tested, null, $clean_output);
+                return 'BORKED';
             }
-            @unlink($tmp_post);
 
-            if (!$leaked && !$failed_headers) {
-                if ($test->hasSection('XFAIL')) {
-                    $warn = true;
-                    $info = " (warn: XFAIL section but test passes)";
-                } elseif ($test->hasSection('XLEAK')) {
-                    $warn = true;
-                    $info = " (warn: XLEAK section but test passes)";
-                } else {
-                    show_result("PASS", $tested, $tested_file, '', $temp_filenames);
-                    $junit->markTestAs('PASS', $shortname, $tested);
-                    return 'PASSED';
-                }
+            if ($test->hasSection('XFAIL')) {
+                $warn = true;
+                $info = " (warn: XFAIL section but test passes)";
+            } elseif ($test->hasSection('XLEAK') && $valgrind) {
+                // XLEAK with ASAN completely disables LSAN so the test is expected to pass
+                $warn = true;
+                $info = " (warn: XLEAK section but test passes)";
+            } elseif ($retried) {
+                $warn = true;
+                $info = " (warn: Test passed on retry attempt)";
+            } else {
+                show_result("PASS", $tested, $tested_file, '', $temp_filenames);
+                $junit->markTestAs('PASS', $shortname, $tested);
+                return 'PASSED';
             }
         }
-
-        $wanted_re = null;
     }
 
     // Test failed so we need to report details.
@@ -2743,6 +2711,8 @@
         }
     }
 
+    $restype = [];
+
     if ($leaked) {
         $restype[] = $test->hasSection('XLEAK') ?
                         'XLEAK' : 'LEAK';
@@ -2756,7 +2726,8 @@
         if ($test->hasSection('XFAIL')) {
             $restype[] = 'XFAIL';
             $info = '  XFAIL REASON: ' . rtrim($test->getSection('XFAIL'));
-        } elseif ($test->hasSection('XLEAK')) {
+        } elseif ($test->hasSection('XLEAK') && $valgrind) {
+            // XLEAK with ASAN completely disables LSAN so the test is expected to pass
             $restype[] = 'XLEAK';
             $info = '  XLEAK REASON: ' . rtrim($test->getSection('XLEAK'));
         } else {
@@ -2776,12 +2747,19 @@
         }
 
         // write .diff
-        $diff = generate_diff($wanted, $wanted_re, $output);
+        if (!empty($environment['TEST_PHP_DIFF_CMD'])) {
+            $diff = generate_diff_external($environment['TEST_PHP_DIFF_CMD'], $exp_filename, $output_filename);
+        } else {
+            $diff = generate_diff($wanted, $wanted_re, $output);
+        }
+
         if (is_array($IN_REDIRECT)) {
             $orig_shortname = str_replace(TEST_PHP_SRCDIR . '/', '', $file);
             $diff = "# original source file: $orig_shortname\n" . $diff;
         }
-        show_file_block('diff', $diff);
+        if (!$SHOW_ONLY_GROUPS || array_intersect($restype, $SHOW_ONLY_GROUPS)) {
+            show_file_block('diff', $diff);
+        }
         if (strpos($log_format, 'D') !== false && file_put_contents($diff_filename, $diff) === false) {
             error("Cannot create test diff - $diff_filename");
         }
@@ -2814,11 +2792,14 @@
 "gdb")
     gdb --args {$orig_cmd}
     ;;
+"lldb")
+    lldb -- {$orig_cmd}
+    ;;
 "valgrind")
-    USE_ZEND_ALLOC=0 valgrind $2 ${orig_cmd}
+    USE_ZEND_ALLOC=0 valgrind $2 {$orig_cmd}
     ;;
 "rr")
-    rr record $2 ${orig_cmd}
+    rr record $2 {$orig_cmd}
     ;;
 *)
     {$orig_cmd}
@@ -2855,183 +2836,129 @@
     return $restype[0] . 'ED';
 }
 
-/**
- * @return bool|int
- */
-function comp_line(string $l1, string $l2, bool $is_reg)
+function is_flaky(TestFile $test): bool
 {
-    if ($is_reg) {
-        return preg_match('/^' . $l1 . '$/s', $l2);
-    } else {
-        return !strcmp($l1, $l2);
+    if ($test->hasSection('FLAKY')) {
+        return true;
     }
+    if (!$test->hasSection('FILE')) {
+        return false;
+    }
+    $file = $test->getSection('FILE');
+    $flaky_functions = [
+        'disk_free_space',
+        'hrtime',
+        'microtime',
+        'sleep',
+        'usleep',
+    ];
+    $regex = '(\b(' . implode('|', $flaky_functions) . ')\()i';
+    return preg_match($regex, $file) === 1;
 }
 
-function count_array_diff(
-    array $ar1,
-    array $ar2,
-    bool $is_reg,
-    array $w,
-    int $idx1,
-    int $idx2,
-    int $cnt1,
-    int $cnt2,
-    int $steps
-): int {
-    $equal = 0;
+function is_flaky_output(string $output): bool
+{
+    $messages = [
+        '404: page not found',
+        'address already in use',
+        'connection refused',
+        'deadlock',
+        'mailbox already exists',
+        'timed out',
+    ];
+    $regex = '(\b(' . implode('|', $messages) . ')\b)i';
+    return preg_match($regex, $output) === 1;
+}
 
-    while ($idx1 < $cnt1 && $idx2 < $cnt2 && comp_line($ar1[$idx1], $ar2[$idx2], $is_reg)) {
-        $idx1++;
-        $idx2++;
-        $equal++;
-        $steps--;
-    }
-    if (--$steps > 0) {
-        $eq1 = 0;
-        $st = $steps / 2;
+function error_may_be_retried(TestFile $test, string $output): bool
+{
+    return is_flaky_output($output)
+        || is_flaky($test);
+}
 
-        for ($ofs1 = $idx1 + 1; $ofs1 < $cnt1 && $st-- > 0; $ofs1++) {
-            $eq = @count_array_diff($ar1, $ar2, $is_reg, $w, $ofs1, $idx2, $cnt1, $cnt2, $st);
+function expectf_to_regex(?string $wanted): string
+{
+    $wanted_re = $wanted ?? '';
 
-            if ($eq > $eq1) {
-                $eq1 = $eq;
-            }
-        }
+    $wanted_re = preg_replace('/\r\n/', "\n", $wanted_re);
 
-        $eq2 = 0;
-        $st = $steps;
-
-        for ($ofs2 = $idx2 + 1; $ofs2 < $cnt2 && $st-- > 0; $ofs2++) {
-            $eq = @count_array_diff($ar1, $ar2, $is_reg, $w, $idx1, $ofs2, $cnt1, $cnt2, $st);
-            if ($eq > $eq2) {
-                $eq2 = $eq;
+    // do preg_quote, but miss out any %r delimited sections
+    $temp = "";
+    $r = "%r";
+    $startOffset = 0;
+    $length = strlen($wanted_re);
+    while ($startOffset < $length) {
+        $start = strpos($wanted_re, $r, $startOffset);
+        if ($start !== false) {
+            // we have found a start tag
+            $end = strpos($wanted_re, $r, $start + 2);
+            if ($end === false) {
+                // unbalanced tag, ignore it.
+                $end = $start = $length;
             }
+        } else {
+            // no more %r sections
+            $start = $end = $length;
         }
-
-        if ($eq1 > $eq2) {
-            $equal += $eq1;
-        } elseif ($eq2 > 0) {
-            $equal += $eq2;
+        // quote a non re portion of the string
+        $temp .= preg_quote(substr($wanted_re, $startOffset, $start - $startOffset), '/');
+        // add the re unquoted.
+        if ($end > $start) {
+            $temp .= '(' . substr($wanted_re, $start + 2, $end - $start - 2) . ')';
         }
+        $startOffset = $end + 2;
     }
+    $wanted_re = $temp;
 
-    return $equal;
+    return strtr($wanted_re, [
+        '%e' => preg_quote(DIRECTORY_SEPARATOR, '/'),
+        '%s' => '[^\r\n]+',
+        '%S' => '[^\r\n]*',
+        '%a' => '.+',
+        '%A' => '.*',
+        '%w' => '\s*',
+        '%i' => '[+-]?\d+',
+        '%d' => '\d+',
+        '%x' => '[0-9a-fA-F]+',
+        '%f' => '[+-]?(?:\d+|(?=\.\d))(?:\.\d+)?(?:[Ee][+-]?\d+)?',
+        '%c' => '.',
+        '%0' => '\x00',
+    ]);
 }
 
-function generate_array_diff(array $ar1, array $ar2, bool $is_reg, array $w): array
+/**
+ * @return bool|int
+ */
+function comp_line(string $l1, string $l2, bool $is_reg)
 {
-    global $context_line_count;
-    $idx1 = 0;
-    $cnt1 = @count($ar1);
-    $idx2 = 0;
-    $cnt2 = @count($ar2);
-    $diff = [];
-    $old1 = [];
-    $old2 = [];
-    $number_len = max(3, strlen((string)max($cnt1 + 1, $cnt2 + 1)));
-    $line_number_spec = '%0' . $number_len . 'd';
+    if ($is_reg) {
+        return preg_match('/^' . $l1 . '$/s', $l2);
+    }
 
-    /** Mapping from $idx2 to $idx1, including indexes of idx2 that are identical to idx1 as well as entries that don't have matches */
-    $mapping = [];
+    return !strcmp($l1, $l2);
+}
 
-    while ($idx1 < $cnt1 && $idx2 < $cnt2) {
-        $mapping[$idx2] = $idx1;
-        if (comp_line($ar1[$idx1], $ar2[$idx2], $is_reg)) {
-            $idx1++;
-            $idx2++;
+/**
+ * Map "Zend OPcache" to "opcache" and convert all ext names to lowercase.
+ */
+function remap_loaded_extensions_names(array $names): array
+{
+    $exts = [];
+    foreach ($names as $name) {
+        if ($name === 'Core') {
             continue;
-        } else {
-            $c1 = @count_array_diff($ar1, $ar2, $is_reg, $w, $idx1 + 1, $idx2, $cnt1, $cnt2, 10);
-            $c2 = @count_array_diff($ar1, $ar2, $is_reg, $w, $idx1, $idx2 + 1, $cnt1, $cnt2, 10);
-
-            if ($c1 > $c2) {
-                $old1[$idx1] = sprintf("{$line_number_spec}- ", $idx1 + 1) . $w[$idx1++];
-            } elseif ($c2 > 0) {
-                $old2[$idx2] = sprintf("{$line_number_spec}+ ", $idx2 + 1) . $ar2[$idx2++];
-            } else {
-                $old1[$idx1] = sprintf("{$line_number_spec}- ", $idx1 + 1) . $w[$idx1++];
-                $old2[$idx2] = sprintf("{$line_number_spec}+ ", $idx2 + 1) . $ar2[$idx2++];
-            }
-            $last_printed_context_line = $idx1;
         }
+        $exts[] = ['Zend OPcache' => 'opcache'][$name] ?? strtolower($name);
     }
-    $mapping[$idx2] = $idx1;
 
-    reset($old1);
-    $k1 = key($old1);
-    $l1 = -2;
-    reset($old2);
-    $k2 = key($old2);
-    $l2 = -2;
-    $old_k1 = -1;
-    $add_context_lines = function (int $new_k1) use (&$old_k1, &$diff, $w, $context_line_count, $number_len) {
-        if ($old_k1 >= $new_k1 || !$context_line_count) {
-            return;
-        }
-        $end = $new_k1 - 1;
-        $range_end = min($end, $old_k1 + $context_line_count);
-        if ($old_k1 >= 0) {
-            while ($old_k1 < $range_end) {
-                $diff[] = str_repeat(' ', $number_len + 2) . $w[$old_k1++];
-            }
-        }
-        if ($end - $context_line_count > $old_k1) {
-            $old_k1 = $end - $context_line_count;
-            if ($old_k1 > 0) {
-                // Add a '--' to mark sections where the common areas were truncated
-                $diff[] = '--';
-            }
-        }
-        $old_k1 = max($old_k1, 0);
-        while ($old_k1 < $end) {
-            $diff[] = str_repeat(' ', $number_len + 2) . $w[$old_k1++];
-        }
-        $old_k1 = $new_k1;
-    };
+    return $exts;
+}
 
-    while ($k1 !== null || $k2 !== null) {
-        if ($k1 == $l1 + 1 || $k2 === null) {
-            $add_context_lines($k1);
-            $l1 = $k1;
-            $diff[] = current($old1);
-            $old_k1 = $k1;
-            $k1 = next($old1) ? key($old1) : null;
-        } elseif ($k2 == $l2 + 1 || $k1 === null) {
-            $add_context_lines($mapping[$k2]);
-            $l2 = $k2;
-            $diff[] = current($old2);
-            $k2 = next($old2) ? key($old2) : null;
-        } elseif ($k1 < $mapping[$k2]) {
-            $add_context_lines($k1);
-            $l1 = $k1;
-            $diff[] = current($old1);
-            $k1 = next($old1) ? key($old1) : null;
-        } else {
-            $add_context_lines($mapping[$k2]);
-            $l2 = $k2;
-            $diff[] = current($old2);
-            $k2 = next($old2) ? key($old2) : null;
-        }
-    }
+function generate_diff_external(string $diff_cmd, string $exp_file, string $output_file): string
+{
+    $retval = shell_exec("{$diff_cmd} {$exp_file} {$output_file}");
 
-    while ($idx1 < $cnt1) {
-        $add_context_lines($idx1 + 1);
-        $diff[] = sprintf("{$line_number_spec}- ", $idx1 + 1) . $w[$idx1++];
-    }
-
-    while ($idx2 < $cnt2) {
-        if (isset($mapping[$idx2])) {
-            $add_context_lines($mapping[$idx2] + 1);
-        }
-        $diff[] = sprintf("{$line_number_spec}+ ", $idx2 + 1) . $ar2[$idx2++];
-    }
-    $add_context_lines(min($old_k1 + $context_line_count + 1, $cnt1 + 1));
-    if ($context_line_count && $old_k1 < $cnt1 + 1) {
-        // Add a '--' to mark sections where the common areas were truncated
-        $diff[] = '--';
-    }
-
-    return $diff;
+    return is_string($retval) ? $retval : 'Could not run external diff tool set through TEST_PHP_DIFF_CMD environment variable';
 }
 
 function generate_diff(string $wanted, ?string $wanted_re, string $output): string
@@ -3038,10 +2965,17 @@
 {
     $w = explode("\n", $wanted);
     $o = explode("\n", $output);
-    $r = is_null($wanted_re) ? $w : explode("\n", $wanted_re);
-    $diff = generate_array_diff($r, $o, !is_null($wanted_re), $w);
+    $is_regex = $wanted_re !== null;
 
-    return implode(PHP_EOL, $diff);
+    $differ = new Differ(function ($expected, $new) use ($is_regex) {
+        if (!$is_regex) {
+            return $expected === $new;
+        }
+        $regex = '/^' . expectf_to_regex($expected). '$/s';
+        return preg_match($regex, $new);
+    });
+    $result = $differ->diff($w, $o);
+    return $result;
 }
 
 function error(string $message): void
@@ -3105,7 +3039,7 @@
     global $n_total, $test_results, $ignored_by_ext, $sum_results, $percent_results;
 
     $n_total = count($test_results);
-    $n_total += $ignored_by_ext;
+    $n_total += count($ignored_by_ext);
     $sum_results = [
         'PASSED' => 0,
         'WARNED' => 0,
@@ -3121,7 +3055,7 @@
         $sum_results[$v]++;
     }
 
-    $sum_results['SKIPPED'] += $ignored_by_ext;
+    $sum_results['SKIPPED'] += count($ignored_by_ext);
     $percent_results = [];
 
     foreach ($sum_results as $v => $n) {
@@ -3153,43 +3087,43 @@
 =====================================================================
 TEST RESULT SUMMARY
 ---------------------------------------------------------------------
-Exts skipped    : ' . sprintf('%4d', $exts_skipped) . '
-Exts tested     : ' . sprintf('%4d', $exts_tested) . '
+Exts skipped    : ' . sprintf('%5d', count($exts_skipped)) . ($exts_skipped ? ' (' . implode(', ', $exts_skipped) . ')' : '') . '
+Exts tested     : ' . sprintf('%5d', count($exts_tested)) . '
 ---------------------------------------------------------------------
 ';
     }
 
     $summary .= '
-Number of tests : ' . sprintf('%4d', $n_total) . '          ' . sprintf('%8d', $x_total);
+Number of tests : ' . sprintf('%5d', $n_total) . '          ' . sprintf('%8d', $x_total);
 
     if ($sum_results['BORKED']) {
         $summary .= '
-Tests borked    : ' . sprintf('%4d (%5.1f%%)', $sum_results['BORKED'], $percent_results['BORKED']) . ' --------';
+Tests borked    : ' . sprintf('%5d (%5.1f%%)', $sum_results['BORKED'], $percent_results['BORKED']) . ' --------';
     }
 
     $summary .= '
-Tests skipped   : ' . sprintf('%4d (%5.1f%%)', $sum_results['SKIPPED'], $percent_results['SKIPPED']) . ' --------
-Tests warned    : ' . sprintf('%4d (%5.1f%%)', $sum_results['WARNED'], $percent_results['WARNED']) . ' ' . sprintf('(%5.1f%%)', $x_warned) . '
-Tests failed    : ' . sprintf('%4d (%5.1f%%)', $sum_results['FAILED'], $percent_results['FAILED']) . ' ' . sprintf('(%5.1f%%)', $x_failed);
+Tests skipped   : ' . sprintf('%5d (%5.1f%%)', $sum_results['SKIPPED'], $percent_results['SKIPPED']) . ' --------
+Tests warned    : ' . sprintf('%5d (%5.1f%%)', $sum_results['WARNED'], $percent_results['WARNED']) . ' ' . sprintf('(%5.1f%%)', $x_warned) . '
+Tests failed    : ' . sprintf('%5d (%5.1f%%)', $sum_results['FAILED'], $percent_results['FAILED']) . ' ' . sprintf('(%5.1f%%)', $x_failed);
 
     if ($sum_results['XFAILED']) {
         $summary .= '
-Expected fail   : ' . sprintf('%4d (%5.1f%%)', $sum_results['XFAILED'], $percent_results['XFAILED']) . ' ' . sprintf('(%5.1f%%)', $x_xfailed);
+Expected fail   : ' . sprintf('%5d (%5.1f%%)', $sum_results['XFAILED'], $percent_results['XFAILED']) . ' ' . sprintf('(%5.1f%%)', $x_xfailed);
     }
 
     if ($valgrind) {
         $summary .= '
-Tests leaked    : ' . sprintf('%4d (%5.1f%%)', $sum_results['LEAKED'], $percent_results['LEAKED']) . ' ' . sprintf('(%5.1f%%)', $x_leaked);
+Tests leaked    : ' . sprintf('%5d (%5.1f%%)', $sum_results['LEAKED'], $percent_results['LEAKED']) . ' ' . sprintf('(%5.1f%%)', $x_leaked);
         if ($sum_results['XLEAKED']) {
             $summary .= '
-Expected leak   : ' . sprintf('%4d (%5.1f%%)', $sum_results['XLEAKED'], $percent_results['XLEAKED']) . ' ' . sprintf('(%5.1f%%)', $x_xleaked);
+Expected leak   : ' . sprintf('%5d (%5.1f%%)', $sum_results['XLEAKED'], $percent_results['XLEAKED']) . ' ' . sprintf('(%5.1f%%)', $x_xleaked);
         }
     }
 
     $summary .= '
-Tests passed    : ' . sprintf('%4d (%5.1f%%)', $sum_results['PASSED'], $percent_results['PASSED']) . ' ' . sprintf('(%5.1f%%)', $x_passed) . '
+Tests passed    : ' . sprintf('%5d (%5.1f%%)', $sum_results['PASSED'], $percent_results['PASSED']) . ' ' . sprintf('(%5.1f%%)', $x_passed) . '
 ---------------------------------------------------------------------
-Time taken      : ' . sprintf('%4d seconds', $end_time - $start_time) . '
+Time taken      : ' . sprintf('%5d seconds', $end_time - $start_time) . '
 =====================================================================
 ';
     $failed_test_summary = '';
@@ -3210,18 +3144,6 @@
         $failed_test_summary .= "=====================================================================\n";
     }
 
-    if (count($PHP_FAILED_TESTS['XFAILED'])) {
-        $failed_test_summary .= '
-=====================================================================
-EXPECTED FAILED TEST SUMMARY
----------------------------------------------------------------------
-';
-        foreach ($PHP_FAILED_TESTS['XFAILED'] as $failed_test_data) {
-            $failed_test_summary .= $failed_test_data['test_name'] . $failed_test_data['info'] . "\n";
-        }
-        $failed_test_summary .= "=====================================================================\n";
-    }
-
     if (count($PHP_FAILED_TESTS['BORKED'])) {
         $failed_test_summary .= '
 =====================================================================
@@ -3272,19 +3194,6 @@
         $failed_test_summary .= "=====================================================================\n";
     }
 
-    if (count($PHP_FAILED_TESTS['XLEAKED'])) {
-        $failed_test_summary .= '
-=====================================================================
-EXPECTED LEAK TEST SUMMARY
----------------------------------------------------------------------
-';
-        foreach ($PHP_FAILED_TESTS['XLEAKED'] as $failed_test_data) {
-            $failed_test_summary .= $failed_test_data['test_name'] . $failed_test_data['info'] . "\n";
-        }
-
-        $failed_test_summary .= "=====================================================================\n";
-    }
-
     if ($failed_test_summary && !getenv('NO_PHPTEST_SUMMARY')) {
         $summary .= $failed_test_summary;
     }
@@ -3309,11 +3218,11 @@
 
 function show_redirect_start(string $tests, string $tested, string $tested_file): void
 {
-    global $SHOW_ONLY_GROUPS;
+    global $SHOW_ONLY_GROUPS, $show_progress;
 
     if (!$SHOW_ONLY_GROUPS || in_array('REDIRECT', $SHOW_ONLY_GROUPS)) {
         echo "REDIRECT $tests ($tested [$tested_file]) begin\n";
-    } else {
+    } elseif ($show_progress) {
         clear_show_test();
     }
 }
@@ -3320,11 +3229,11 @@
 
 function show_redirect_ends(string $tests, string $tested, string $tested_file): void
 {
-    global $SHOW_ONLY_GROUPS;
+    global $SHOW_ONLY_GROUPS, $show_progress;
 
     if (!$SHOW_ONLY_GROUPS || in_array('REDIRECT', $SHOW_ONLY_GROUPS)) {
         echo "REDIRECT $tests ($tested [$tested_file]) done\n";
-    } else {
+    } elseif ($show_progress) {
         clear_show_test();
     }
 }
@@ -3366,7 +3275,7 @@
     string $extra = '',
     ?array $temp_filenames = null
 ): void {
-    global $SHOW_ONLY_GROUPS, $colorize;
+    global $SHOW_ONLY_GROUPS, $colorize, $show_progress;
 
     if (!$SHOW_ONLY_GROUPS || in_array($result, $SHOW_ONLY_GROUPS)) {
         if ($colorize) {
@@ -3388,10 +3297,9 @@
         } else {
             echo "$result $tested [$tested_file] $extra\n";
         }
-    } elseif (!$SHOW_ONLY_GROUPS) {
+    } elseif ($show_progress) {
         clear_show_test();
     }
-
 }
 
 class BorkageException extends Exception
@@ -3745,12 +3653,9 @@
             return $this->extensions[$php];
         }
 
-        $extDir = `$php -d display_errors=0 -r "echo ini_get('extension_dir');"`;
-        $extensions = explode(",", `$php -d display_errors=0 -r "echo implode(',', get_loaded_extensions());"`);
-        $extensions = array_map('strtolower', $extensions);
-        if (in_array('zend opcache', $extensions)) {
-            $extensions[] = 'opcache';
-        }
+        $extDir = shell_exec("$php -d display_errors=0 -r \"echo ini_get('extension_dir');\"");
+        $extensionsNames = explode(",", shell_exec("$php -d display_errors=0 -r \"echo implode(',', get_loaded_extensions());\""));
+        $extensions = remap_loaded_extensions_names($extensionsNames);
 
         $result = [$extDir, $extensions];
         $this->extensions[$php] = $result;
@@ -3836,6 +3741,7 @@
         'INI', 'ENV', 'EXTENSIONS',
         'SKIPIF', 'XFAIL', 'XLEAK', 'CLEAN',
         'CREDITS', 'DESCRIPTION', 'CONFLICTS', 'WHITESPACE_SENSITIVE',
+        'FLAKY',
     ];
 
     /**
@@ -4074,4 +3980,265 @@
     proc_open($args, [], $pipes);
 }
 
+/*
+ * BSD 3-Clause License
+ *
+ * Copyright (c) 2002-2023, Sebastian Bergmann
+ * All rights reserved.
+ *
+ * This file is part of sebastian/diff.
+ * https://github.com/sebastianbergmann/diff
+ */
+
+final class Differ
+{
+    public const OLD = 0;
+    public const ADDED = 1;
+    public const REMOVED = 2;
+    private $outputBuilder;
+    private $isEqual;
+
+    public function __construct(callable $isEqual)
+    {
+        $this->outputBuilder = new DiffOutputBuilder;
+        $this->isEqual = $isEqual;
+    }
+
+    public function diff(array $from, array $to): string
+    {
+        $diff = $this->diffToArray($from, $to);
+
+        return $this->outputBuilder->getDiff($diff);
+    }
+
+    public function diffToArray(array $from, array $to): array
+    {
+        $fromLine = 1;
+        $toLine = 1;
+
+        [$from, $to, $start, $end] = $this->getArrayDiffParted($from, $to);
+
+        $common = $this->calculateCommonSubsequence(array_values($from), array_values($to));
+        $diff   = [];
+
+        foreach ($start as $token) {
+            $diff[] = [$token, self::OLD];
+            $fromLine++;
+            $toLine++;
+        }
+
+        reset($from);
+        reset($to);
+
+        foreach ($common as $token) {
+            while (!empty($from) && !($this->isEqual)(reset($from), $token)) {
+                $diff[] = [array_shift($from), self::REMOVED, $fromLine++];
+            }
+
+            while (!empty($to) && !($this->isEqual)($token, reset($to))) {
+                $diff[] = [array_shift($to), self::ADDED, $toLine++];
+            }
+
+            $diff[] = [$token, self::OLD];
+            $fromLine++;
+            $toLine++;
+
+            array_shift($from);
+            array_shift($to);
+        }
+
+        while (($token = array_shift($from)) !== null) {
+            $diff[] = [$token, self::REMOVED, $fromLine++];
+        }
+
+        while (($token = array_shift($to)) !== null) {
+            $diff[] = [$token, self::ADDED, $toLine++];
+        }
+
+        foreach ($end as $token) {
+            $diff[] = [$token, self::OLD];
+            $fromLine++;
+            $toLine++;
+        }
+
+        return $diff;
+    }
+
+    private function getArrayDiffParted(array &$from, array &$to): array
+    {
+        $start = [];
+        $end   = [];
+
+        reset($to);
+
+        foreach ($from as $k => $v) {
+            $toK = key($to);
+
+            if (($this->isEqual)($toK, $k) && ($this->isEqual)($v, $to[$k])) {
+                $start[$k] = $v;
+
+                unset($from[$k], $to[$k]);
+            } else {
+                break;
+            }
+        }
+
+        end($from);
+        end($to);
+
+        do {
+            $fromK = key($from);
+            $toK   = key($to);
+
+            if (null === $fromK || null === $toK || !($this->isEqual)(current($from), current($to))) {
+                break;
+            }
+
+            prev($from);
+            prev($to);
+
+            $end = [$fromK => $from[$fromK]] + $end;
+            unset($from[$fromK], $to[$toK]);
+        } while (true);
+
+        return [$from, $to, $start, $end];
+    }
+
+    public function calculateCommonSubsequence(array $from, array $to): array
+    {
+        $cFrom = count($from);
+        $cTo   = count($to);
+
+        if ($cFrom === 0) {
+            return [];
+        }
+
+        if ($cFrom === 1) {
+            foreach ($to as $toV) {
+                if (($this->isEqual)($from[0], $toV)) {
+                    return [$toV];
+                }
+            }
+
+            return [];
+        }
+
+        $i         = (int) ($cFrom / 2);
+        $fromStart = array_slice($from, 0, $i);
+        $fromEnd   = array_slice($from, $i);
+        $llB       = $this->commonSubsequenceLength($fromStart, $to);
+        $llE       = $this->commonSubsequenceLength(array_reverse($fromEnd), array_reverse($to));
+        $jMax      = 0;
+        $max       = 0;
+
+        for ($j = 0; $j <= $cTo; $j++) {
+            $m = $llB[$j] + $llE[$cTo - $j];
+
+            if ($m >= $max) {
+                $max  = $m;
+                $jMax = $j;
+            }
+        }
+
+        $toStart = array_slice($to, 0, $jMax);
+        $toEnd   = array_slice($to, $jMax);
+
+        return array_merge(
+            $this->calculateCommonSubsequence($fromStart, $toStart),
+            $this->calculateCommonSubsequence($fromEnd, $toEnd)
+        );
+    }
+
+    private function commonSubsequenceLength(array $from, array $to): array
+    {
+        $current = array_fill(0, count($to) + 1, 0);
+        $cFrom   = count($from);
+        $cTo     = count($to);
+
+        for ($i = 0; $i < $cFrom; $i++) {
+            $prev = $current;
+
+            for ($j = 0; $j < $cTo; $j++) {
+                if (($this->isEqual)($from[$i], $to[$j])) {
+                    $current[$j + 1] = $prev[$j] + 1;
+                } else {
+                    $current[$j + 1] = max($current[$j], $prev[$j + 1]);
+                }
+            }
+        }
+
+        return $current;
+    }
+}
+
+class DiffOutputBuilder
+{
+    public function getDiff(array $diffs): string
+    {
+        global $context_line_count;
+        $i = 0;
+        $string = '';
+        $number_len = max(3, strlen((string)count($diffs)));
+        $line_number_spec = '%0' . $number_len . 'd';
+        $buffer = fopen('php://memory', 'r+b');
+        while ($i < count($diffs)) {
+            // Find next difference
+            $next = $i;
+            while ($next < count($diffs)) {
+                if ($diffs[$next][1] !== Differ::OLD) {
+                    break;
+                }
+                $next++;
+            }
+            // Found no more differenciating rows, we're done
+            if ($next === count($diffs)) {
+                if (($i - 1) < count($diffs)) {
+                    fwrite($buffer, "--\n");
+                }
+                break;
+            }
+            // Print separator if necessary
+            if ($i < ($next - $context_line_count)) {
+                fwrite($buffer, "--\n");
+                $i = $next - $context_line_count;
+            }
+            // Print leading context
+            while ($i < $next) {
+                fwrite($buffer, str_repeat(' ', $number_len + 2));
+                fwrite($buffer, $diffs[$i][0]);
+                fwrite($buffer, "\n");
+                $i++;
+            }
+            // Print differences
+            while ($i < count($diffs) && $diffs[$i][1] !== Differ::OLD) {
+                fwrite($buffer, sprintf($line_number_spec, $diffs[$i][2]));
+                switch ($diffs[$i][1]) {
+                    case Differ::ADDED:
+                        fwrite($buffer, '+ ');
+                        break;
+                    case Differ::REMOVED:
+                        fwrite($buffer, '- ');
+                        break;
+                }
+                fwrite($buffer, $diffs[$i][0]);
+                fwrite($buffer, "\n");
+                $i++;
+            }
+            // Print trailing context
+            $afterContext = min($i + $context_line_count, count($diffs));
+            while ($i < $afterContext && $diffs[$i][1] === Differ::OLD) {
+                fwrite($buffer, str_repeat(' ', $number_len + 2));
+                fwrite($buffer, $diffs[$i][0]);
+                fwrite($buffer, "\n");
+                $i++;
+            }
+        }
+
+        $diff = stream_get_contents($buffer, -1, 0);
+        fclose($buffer);
+
+        return $diff;
+    }
+}
+
 main();



More information about the mapguide-commits mailing list