[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(<);
+ 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