Version in base suite: 8.4.11-1 Version in overlay suite: 8.4.16-1~deb13u1 Base version: php8.4_8.4.16-1~deb13u1 Target version: php8.4_8.4.21-1~deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/p/php8.4/php8.4_8.4.16-1~deb13u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/p/php8.4/php8.4_8.4.21-1~deb13u1.dsc .circleci/config.yml | 3 .github/CODEOWNERS | 19 .github/actions/brew/action.yml | 12 .github/actions/build-libmysqlclient/action.yml | 6 .github/actions/ccache/action.yml | 39 .github/actions/freebsd/action.yml | 2 .github/actions/macos-update-clang/action.yml | 17 .github/actions/solaris/action.yml | 88 .github/actions/test-alpine/action.yml | 4 .github/actions/test-gentoo/action.yml | 1 .github/actions/test-libmysqlclient/action.yml | 6 .github/actions/test-linux/action.yml | 5 .github/actions/test-macos/action.yml | 5 .github/matrix.php | 206 .github/nightly_matrix.php | 66 .github/workflows/docs.yml | 2 .github/workflows/labeler.yml | 2 .github/workflows/nightly-results.yml | 4 .github/workflows/nightly.yml | 1049 - .github/workflows/push.yml | 406 .github/workflows/root.yml | 65 .github/workflows/test-suite.yml | 1109 ++ .github/workflows/test.yml | 74 EXTENSIONS | 36 NEWS | 393 Zend/Optimizer/block_pass.c | 2 Zend/Optimizer/sccp.c | 4 Zend/Optimizer/zend_dump.c | 4 Zend/Optimizer/zend_optimizer.c | 6 Zend/tests/GHSA-wm6j-2649-pv75.phpt | 22 Zend/tests/bug55509.phpt | 1 Zend/tests/bug74093.phpt | 6 Zend/tests/bug78010.phpt | 1 Zend/tests/enum/comparison-internal.phpt | 54 Zend/tests/enum/gh21760.phpt | 19 Zend/tests/enum/implements-internal.phpt | 14 Zend/tests/enum/instanceof-backed-enum.phpt | 6 Zend/tests/enum/instanceof-unitenum.phpt | 4 Zend/tests/enum/no-clone-internal.phpt | 16 Zend/tests/enum/no-dynamic-properties-internal.phpt | 18 Zend/tests/fibers/gh19983.phpt | 32 Zend/tests/fibers/oss-fuzz-471533782-001.phpt | 33 Zend/tests/fibers/oss-fuzz-471533782-002.phpt | 34 Zend/tests/gc_050.phpt | 57 Zend/tests/gc_051.phpt | 29 Zend/tests/gc_052.phpt | 36 Zend/tests/gc_053.phpt | 37 Zend/tests/gh16799.phpt | 7 Zend/tests/gh20714.phpt | 29 Zend/tests/gh21603.phpt | 22 Zend/tests/gh21605.phpt | 24 Zend/tests/gh_21699.phpt | 31 Zend/tests/gh_21699_parent.phpt | 32 Zend/tests/gh_21699_static.phpt | 31 Zend/tests/lazy_objects/gh18038-002.phpt | 1 Zend/tests/lazy_objects/gh18038-004.phpt | 1 Zend/tests/lazy_objects/gh18038-007.phpt | 1 Zend/tests/lazy_objects/gh18038-009.phpt | 1 Zend/tests/lazy_objects/gh20504-001.phpt | 24 Zend/tests/lazy_objects/gh20504-002.phpt | 23 Zend/tests/lazy_objects/gh20504-003.phpt | 33 Zend/tests/lazy_objects/gh20504-004.phpt | 28 Zend/tests/lazy_objects/gh20504-005.phpt | 30 Zend/tests/lazy_objects/gh20657-001.phpt | 32 Zend/tests/lazy_objects/gh20657-002.phpt | 43 Zend/tests/lazy_objects/gh20854.phpt | 22 Zend/tests/lazy_objects/gh20873.phpt | 30 Zend/tests/lazy_objects/gh20875.phpt | 41 Zend/tests/lazy_objects/gh20875_proxy_get_no_init.phpt | 23 Zend/tests/lazy_objects/gh20905.phpt | 24 Zend/tests/lazy_objects/gh21478-isset.phpt | 30 Zend/tests/lazy_objects/gh21478-proxy-get-override.phpt | 30 Zend/tests/lazy_objects/gh21478-proxy-get-ref-forward.phpt | 32 Zend/tests/lazy_objects/gh21478-set.phpt | 32 Zend/tests/lazy_objects/gh21478-unset.phpt | 30 Zend/tests/lazy_objects/gh21478.phpt | 32 Zend/tests/oss-fuzz-465488618.phpt | 16 Zend/tests/oss-fuzz-471486164-001.phpt | 22 Zend/tests/oss-fuzz-471486164-002.phpt | 26 Zend/tests/oss-fuzz-474613951.phpt | 17 Zend/tests/oss-fuzz-478009707.phpt | 27 Zend/tests/oss_fuzz_438780145.phpt | 27 Zend/tests/property_hooks/gh20479.phpt | 40 Zend/tests/stack_limit/stack_limit_015.phpt | 2 Zend/zend.h | 4 Zend/zend_API.c | 4 Zend/zend_call_stack.h | 3 Zend/zend_compile.c | 2 Zend/zend_enum.c | 2 Zend/zend_execute.c | 24 Zend/zend_gc.c | 21 Zend/zend_generators.c | 6 Zend/zend_hash.c | 8 Zend/zend_inheritance.c | 27 Zend/zend_ini.c | 6 Zend/zend_ini_scanner.c | 1185 -- Zend/zend_ini_scanner.l | 2 Zend/zend_ini_scanner_defs.h | 2 Zend/zend_language_scanner.c | 3251 ++---- Zend/zend_language_scanner_defs.h | 2 Zend/zend_lazy_objects.c | 6 Zend/zend_multiply.h | 6 Zend/zend_object_handlers.c | 141 Zend/zend_opcode.c | 29 Zend/zend_operators.c | 8 Zend/zend_property_hooks.c | 2 Zend/zend_virtual_cwd.c | 12 Zend/zend_virtual_cwd.h | 2 Zend/zend_vm_def.h | 39 Zend/zend_vm_execute.h | 103 Zend/zend_vm_gen.php | 43 Zend/zend_vm_opcodes.c | 4 Zend/zend_vm_opcodes.h | 1 build/gen_stub.php | 12 configure | 24 configure.ac | 2 debian/changelog | 20 debian/gbp.conf | 2 ext/bz2/bz2.c | 27 ext/bz2/tests/gh20620.phpt | 22 ext/bz2/tests/gh20807.phpt | 21 ext/calendar/jewish.c | 2 ext/calendar/tests/gh21557.phpt | 24 ext/com_dotnet/com_extension.c | 4 ext/curl/config.w32 | 5 ext/curl/interface.c | 16 ext/curl/tests/bug71523.phpt | 1 ext/curl/tests/check_win_config.phpt | 4 ext/curl/tests/curl_setopt_ssl.phpt | 19 ext/curl/tests/gh21023.phpt | 27 ext/date/lib/parse_date.c | 227 ext/date/lib/parse_date.re | 19 ext/date/lib/parse_iso_intervals.c | 4 ext/date/lib/parse_iso_intervals.re | 4 ext/date/lib/timelib.c | 2 ext/date/lib/timelib.h | 8 ext/date/lib/timezonedb.h | 2614 ++-- ext/date/php_date.c | 91 ext/date/tests/bug81565.phpt | 2 ext/date/tests/gh20764.phpt | 53 ext/date/tests/gh20936.phpt | 14 ext/dba/tests/dba_db4_018.phpt | 2 ext/dom/config.m4 | 17 ext/dom/config.w32 | 10 ext/dom/documenttype.c | 4 ext/dom/dom_properties.h | 3 ext/dom/entityreference.c | 8 ext/dom/html5_parser.c | 7 ext/dom/lexbor/lexbor/core/base.h | 6 ext/dom/lexbor/lexbor/core/def.h | 2 ext/dom/lexbor/lexbor/core/diyfp.c | 36 ext/dom/lexbor/lexbor/core/diyfp.h | 35 ext/dom/lexbor/lexbor/core/dtoa.c | 65 ext/dom/lexbor/lexbor/core/dtoa.h | 34 ext/dom/lexbor/lexbor/core/hash.c | 9 ext/dom/lexbor/lexbor/core/in.c | 3 ext/dom/lexbor/lexbor/core/shs.c | 10 ext/dom/lexbor/lexbor/core/str.c | 31 ext/dom/lexbor/lexbor/core/str.h | 7 ext/dom/lexbor/lexbor/core/str_res.h | 140 ext/dom/lexbor/lexbor/core/strtod.c | 38 ext/dom/lexbor/lexbor/core/strtod.h | 34 ext/dom/lexbor/lexbor/css/at_rule.c | 449 ext/dom/lexbor/lexbor/css/at_rule.h | 50 ext/dom/lexbor/lexbor/css/at_rule/const.h | 9 ext/dom/lexbor/lexbor/css/at_rule/res.h | 17 ext/dom/lexbor/lexbor/css/at_rule/state.c | 374 ext/dom/lexbor/lexbor/css/at_rule/state.h | 108 ext/dom/lexbor/lexbor/css/at_rule/types.h | 60 ext/dom/lexbor/lexbor/css/base.h | 21 ext/dom/lexbor/lexbor/css/blank.c | 389 ext/dom/lexbor/lexbor/css/blank.h | 38 ext/dom/lexbor/lexbor/css/css.c | 39 ext/dom/lexbor/lexbor/css/css.h | 4 ext/dom/lexbor/lexbor/css/declaration.c | 86 ext/dom/lexbor/lexbor/css/declaration.h | 17 ext/dom/lexbor/lexbor/css/log.c | 2 ext/dom/lexbor/lexbor/css/parser.c | 222 ext/dom/lexbor/lexbor/css/parser.h | 456 ext/dom/lexbor/lexbor/css/property.c | 3171 +++++ ext/dom/lexbor/lexbor/css/property/const.h | 2 ext/dom/lexbor/lexbor/css/property/res.h | 2 ext/dom/lexbor/lexbor/css/property/state.c | 5343 ++++++++++ ext/dom/lexbor/lexbor/css/property/types.h | 21 ext/dom/lexbor/lexbor/css/rule.c | 598 + ext/dom/lexbor/lexbor/css/rule.h | 32 ext/dom/lexbor/lexbor/css/selectors/base.h | 4 ext/dom/lexbor/lexbor/css/selectors/pseudo_const.h | 19 ext/dom/lexbor/lexbor/css/selectors/pseudo_res.h | 98 ext/dom/lexbor/lexbor/css/selectors/pseudo_state.c | 130 ext/dom/lexbor/lexbor/css/selectors/pseudo_state.h | 4 ext/dom/lexbor/lexbor/css/selectors/selector.c | 79 ext/dom/lexbor/lexbor/css/selectors/selector.h | 6 ext/dom/lexbor/lexbor/css/selectors/selectors.c | 118 ext/dom/lexbor/lexbor/css/selectors/state.c | 18 ext/dom/lexbor/lexbor/css/state.c | 627 + ext/dom/lexbor/lexbor/css/state.h | 27 ext/dom/lexbor/lexbor/css/stylesheet.c | 110 ext/dom/lexbor/lexbor/css/stylesheet.h | 64 ext/dom/lexbor/lexbor/css/syntax/anb.c | 13 ext/dom/lexbor/lexbor/css/syntax/base.h | 2 ext/dom/lexbor/lexbor/css/syntax/parser.c | 1763 ++- ext/dom/lexbor/lexbor/css/syntax/parser.h | 61 ext/dom/lexbor/lexbor/css/syntax/res.h | 10 ext/dom/lexbor/lexbor/css/syntax/state.c | 15 ext/dom/lexbor/lexbor/css/syntax/state_res.h | 2 ext/dom/lexbor/lexbor/css/syntax/syntax.c | 341 ext/dom/lexbor/lexbor/css/syntax/syntax.h | 259 ext/dom/lexbor/lexbor/css/syntax/token.c | 13 ext/dom/lexbor/lexbor/css/syntax/token_res.h | 10 ext/dom/lexbor/lexbor/css/syntax/tokenizer.c | 9 ext/dom/lexbor/lexbor/css/unit.c | 113 ext/dom/lexbor/lexbor/css/unit/const.h | 2 ext/dom/lexbor/lexbor/css/unit/res.h | 2 ext/dom/lexbor/lexbor/css/value.c | 678 + ext/dom/lexbor/lexbor/css/value/const.h | 2 ext/dom/lexbor/lexbor/css/value/res.h | 2 ext/dom/lexbor/lexbor/dom/base.h | 6 ext/dom/lexbor/lexbor/dom/exception.c | 370 ext/dom/lexbor/lexbor/dom/exception.h | 114 ext/dom/lexbor/lexbor/dom/interface.h | 4 ext/dom/lexbor/lexbor/dom/interfaces/attr_const.h | 33 ext/dom/lexbor/lexbor/dom/interfaces/attr_res.h | 6 ext/dom/lexbor/lexbor/dom/interfaces/character_data.c | 2 ext/dom/lexbor/lexbor/dom/interfaces/document_type.c | 105 ext/dom/lexbor/lexbor/dom/interfaces/document_type.h | 30 ext/dom/lexbor/lexbor/dom/interfaces/element.c | 12 ext/dom/lexbor/lexbor/dom/interfaces/element.h | 4 ext/dom/lexbor/lexbor/dom/interfaces/node.c | 471 ext/dom/lexbor/lexbor/dom/interfaces/node.h | 118 ext/dom/lexbor/lexbor/dom/interfaces/shadow_root.c | 2 ext/dom/lexbor/lexbor/encoding/base.h | 4 ext/dom/lexbor/lexbor/encoding/encode.c | 118 ext/dom/lexbor/lexbor/encoding/encoding.c | 116 ext/dom/lexbor/lexbor/encoding/encoding.h | 71 ext/dom/lexbor/lexbor/encoding/multi.c | 2 ext/dom/lexbor/lexbor/encoding/multi.h | 160 ext/dom/lexbor/lexbor/encoding/range.h | 3 ext/dom/lexbor/lexbor/encoding/res.h | 4 ext/dom/lexbor/lexbor/encoding/single.h | 3 ext/dom/lexbor/lexbor/html/base.h | 4 ext/dom/lexbor/lexbor/html/encoding.c | 100 ext/dom/lexbor/lexbor/html/encoding.h | 141 ext/dom/lexbor/lexbor/html/interface.c | 15 ext/dom/lexbor/lexbor/html/interface.h | 3 ext/dom/lexbor/lexbor/html/interface_res.h | 1758 +-- ext/dom/lexbor/lexbor/html/interfaces/document.c | 17 ext/dom/lexbor/lexbor/html/interfaces/option_element.c | 47 ext/dom/lexbor/lexbor/html/interfaces/option_element.h | 7 ext/dom/lexbor/lexbor/html/interfaces/search_element.c | 35 ext/dom/lexbor/lexbor/html/interfaces/search_element.h | 34 ext/dom/lexbor/lexbor/html/interfaces/select_element.c | 47 ext/dom/lexbor/lexbor/html/interfaces/select_element.h | 2 ext/dom/lexbor/lexbor/html/interfaces/selectedcontent_element.c | 67 ext/dom/lexbor/lexbor/html/interfaces/selectedcontent_element.h | 37 ext/dom/lexbor/lexbor/html/parser.c | 13 ext/dom/lexbor/lexbor/html/style.c | 23 ext/dom/lexbor/lexbor/html/style.h | 46 ext/dom/lexbor/lexbor/html/tag.c | 30 ext/dom/lexbor/lexbor/html/tag.h | 33 ext/dom/lexbor/lexbor/html/tag_res.h | 1985 +-- ext/dom/lexbor/lexbor/html/token.c | 13 ext/dom/lexbor/lexbor/html/tokenizer.c | 327 ext/dom/lexbor/lexbor/html/tokenizer.h | 50 ext/dom/lexbor/lexbor/html/tokenizer/error.c | 76 ext/dom/lexbor/lexbor/html/tokenizer/error.h | 106 ext/dom/lexbor/lexbor/html/tokenizer/res.h | 16 ext/dom/lexbor/lexbor/html/tokenizer/state.c | 106 ext/dom/lexbor/lexbor/html/tokenizer/state.h | 36 ext/dom/lexbor/lexbor/html/tokenizer/state_comment.c | 19 ext/dom/lexbor/lexbor/html/tokenizer/state_doctype.c | 15 ext/dom/lexbor/lexbor/html/tokenizer/state_rawtext.c | 16 ext/dom/lexbor/lexbor/html/tokenizer/state_rcdata.c | 16 ext/dom/lexbor/lexbor/html/tokenizer/state_script.c | 34 ext/dom/lexbor/lexbor/html/tree.c | 84 ext/dom/lexbor/lexbor/html/tree.h | 24 ext/dom/lexbor/lexbor/html/tree/error.c | 68 ext/dom/lexbor/lexbor/html/tree/error.h | 18 ext/dom/lexbor/lexbor/html/tree/insertion_mode.h | 8 ext/dom/lexbor/lexbor/html/tree/insertion_mode/foreign_content.c | 34 ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_body.c | 192 ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_head_noscript.c | 7 ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_select.c | 375 ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_select_in_table.c | 115 ext/dom/lexbor/lexbor/ns/base.h | 4 ext/dom/lexbor/lexbor/ns/const.h | 2 ext/dom/lexbor/lexbor/ns/ns.c | 7 ext/dom/lexbor/lexbor/ns/res.h | 6 ext/dom/lexbor/lexbor/selectors-adapted/selectors.c | 6 ext/dom/lexbor/lexbor/selectors/base.h | 4 ext/dom/lexbor/lexbor/selectors/selectors.c | 1443 +- ext/dom/lexbor/lexbor/selectors/selectors.h | 11 ext/dom/lexbor/lexbor/tag/base.h | 4 ext/dom/lexbor/lexbor/tag/const.h | 78 ext/dom/lexbor/lexbor/tag/res.h | 128 ext/dom/lexbor/patches/0001-Expose-line-and-column-information-for-use-in-PHP.patch | 38 ext/dom/lexbor/patches/0002-Track-implied-added-nodes-for-options-use-in-PHP.patch | 6 ext/dom/lexbor/patches/0003-Patch-utilities-and-data-structure-to-be-able-to-gen.patch | 23 ext/dom/lexbor/patches/0004-Remove-unused-upper-case-tag-static-data.patch | 12 ext/dom/lexbor/patches/0005-Shrink-size-of-static-binary-search-tree.patch | 37 ext/dom/lexbor/patches/0006-Patch-out-unused-CSS-style-code.patch | 106 ext/dom/lexbor/patches/README.md | 5 ext/dom/lexbor/patches/update-lexbor.sh | 63 ext/dom/node.c | 163 ext/dom/php_dom.c | 18 ext/dom/tests/canonicalization.phpt | 30 ext/dom/tests/gh20722.phpt | 13 ext/dom/tests/modern/common/gh21077.phpt | 28 ext/dom/tests/modern/common/gh21097.phpt | 49 ext/dom/tests/modern/html/gh21688.phpt | 13 ext/dom/tests/modern/html/parser/Element_innerHTML.phpt | 2 ext/dom/tests/modern/html/parser/gh21486.phpt | 18 ext/dom/tests/modern/spec/Document_implementation_createDocumentType.phpt | 8 ext/dom/tests/modern/xml/DTDNamedNodeMap.phpt | 2 ext/dom/tests/modern/xml/canonicalize_unattached.phpt | 20 ext/dom/tests/modern/xml/gh20444.phpt | 43 ext/dom/tests/modern/xml/gh21548.phpt | 17 ext/dom/tests/parentnode_childnode_too_long_text.phpt | 1 ext/ffi/ffi.c | 44 ext/ffi/tests/gh14286_2.phpt | 4 ext/ffi/tests/gh18629_cdef_resolve_func.phpt | 16 ext/ffi/tests/gh18629_read_field_non_struct.phpt | 17 ext/filter/logical_filters.c | 14 ext/ftp/ftp.c | 10 ext/ftp/php_ftp.c | 4 ext/gd/gd.c | 9 ext/gd/libgd/gd_jpeg.c | 4 ext/gd/libgd/gd_xbm.c | 2 ext/gd/tests/bug77270.phpt | 2 ext/gd/tests/bug77272.phpt | 1 ext/gd/tests/bug77479.phpt | 1 ext/gd/tests/gh16322.phpt | 2 ext/gd/tests/gh20622.phpt | 13 ext/gmp/gmp.c | 2 ext/iconv/iconv.c | 1363 +- ext/iconv/tests/gh17399.phpt | 13 ext/iconv/tests/gh17399_iconv.phpt | 13 ext/iconv/tests/gh17399_mime_decode.phpt | 13 ext/iconv/tests/gh17399_substr.phpt | 17 ext/iconv/tests/gh21664.phpt | 21 ext/intl/locale/locale_methods.c | 2 ext/intl/msgformat/msgformat_helpers.cpp | 1 ext/intl/tests/msgfmt_format_error4.phpt | 9 ext/json/json_scanner.c | 118 ext/json/php_json_scanner_defs.h | 2 ext/ldap/ldap.c | 10 ext/ldap/tests/GHSA-g665-fm4p-vhff-1.phpt | 1 ext/ldap/tests/GHSA-g665-fm4p-vhff-2.phpt | 1 ext/ldap/tests/ldap_set_option_leak_attrvalue_context.phpt | 34 ext/mbstring/libmbfl/mbfl/mbfl_encoding.c | 6 ext/mbstring/mbstring.c | 91 ext/mbstring/php_mbregex.c | 9 ext/mbstring/tests/GHSA-74r9-qxhc-fx53.phpt | 50 ext/mbstring/tests/gh20674.phpt | 40 ext/mbstring/tests/gh20833.phpt | 16 ext/mbstring/tests/gh20836.phpt | 33 ext/mbstring/tests/gh20836_stack_limit.phpt | 38 ext/mbstring/tests/gh21223.phpt | 19 ext/mysqli/mysqli_nonapi.c | 3 ext/mysqli/tests/mysqli_begin_transaction_error.phpt | 42 ext/opcache/jit/ir/ir.c | 257 ext/opcache/jit/ir/ir.h | 107 ext/opcache/jit/ir/ir_aarch64.dasc | 1441 +- ext/opcache/jit/ir/ir_aarch64.h | 66 ext/opcache/jit/ir/ir_builder.h | 18 ext/opcache/jit/ir/ir_cfg.c | 623 - ext/opcache/jit/ir/ir_check.c | 6 ext/opcache/jit/ir/ir_dump.c | 34 ext/opcache/jit/ir/ir_emit.c | 195 ext/opcache/jit/ir/ir_fold.h | 201 ext/opcache/jit/ir/ir_gcm.c | 478 ext/opcache/jit/ir/ir_gdb.c | 17 ext/opcache/jit/ir/ir_perf.c | 8 ext/opcache/jit/ir/ir_private.h | 106 ext/opcache/jit/ir/ir_ra.c | 425 ext/opcache/jit/ir/ir_save.c | 84 ext/opcache/jit/ir/ir_sccp.c | 577 - ext/opcache/jit/ir/ir_x86.dasc | 2370 ++-- ext/opcache/jit/ir/ir_x86.h | 124 ext/opcache/jit/zend_jit.c | 2 ext/opcache/jit/zend_jit_helpers.c | 14 ext/opcache/jit/zend_jit_ir.c | 25 ext/opcache/jit/zend_jit_trace.c | 26 ext/opcache/shared_alloc_shm.c | 43 ext/opcache/tests/gh21052.phpt | 32 ext/opcache/tests/gh21052_a.inc | 13 ext/opcache/tests/gh21052_b.inc | 5 ext/opcache/tests/gh21227.phpt | 23 ext/opcache/tests/jit/gh20818.phpt | 30 ext/opcache/tests/jit/gh20838.inc | 53 ext/opcache/tests/jit/gh20838.phpt | 66 ext/opcache/tests/jit/gh20880.phpt | 27 ext/opcache/tests/jit/gh21158.phpt | 49 ext/opcache/tests/jit/gh21267.phpt | 35 ext/opcache/tests/jit/gh21267_blacklist.phpt | 36 ext/opcache/tests/jit/gh21593.phpt | 49 ext/opcache/tests/opt/gh11245_2.phpt | 4 ext/opcache/tests/oss-fuzz-472563272.phpt | 14 ext/opcache/zend_accelerator_util_funcs.c | 6 ext/openssl/openssl.c | 207 ext/openssl/tests/bug74796.phpt | 29 ext/openssl/tests/bug80770.phpt | 31 ext/openssl/tests/gh20802.phpt | 62 ext/openssl/tests/gh21031.phpt | 55 ext/openssl/tests/gh21083.phpt | 61 ext/openssl/tests/gh9310.phpt | 59 ext/openssl/tests/openssl_password.phpt | 5 ext/openssl/tests/openssl_x509_checkpurpose_basic.phpt | 2 ext/openssl/tests/openssl_x509_export_to_file_leak.phpt | 2 ext/openssl/tests/sni_server.pem | 57 ext/openssl/tests/sni_server.phpt | 29 ext/openssl/tests/sni_server_cs.pem | 57 ext/openssl/tests/sni_server_cs_cert.pem | 30 ext/openssl/tests/sni_server_cs_expired.pem | 57 ext/openssl/tests/sni_server_cs_key.pem | 27 ext/openssl/tests/sni_server_key_cert.phpt | 45 ext/openssl/tests/sni_server_uk.pem | 57 ext/openssl/tests/sni_server_uk_cert.pem | 30 ext/openssl/tests/sni_server_uk_key.pem | 27 ext/openssl/tests/sni_server_us.pem | 57 ext/openssl/tests/sni_server_us_cert.pem | 30 ext/openssl/tests/sni_server_us_key.pem | 27 ext/openssl/xp_ssl.c | 47 ext/pcntl/pcntl.c | 35 ext/pcntl/tests/pcntl_signal_dispatch_exception.phpt | 34 ext/pcntl/tests/pcntl_signal_functions_invalid_signals.phpt | 80 ext/pcre/php_pcre.c | 46 ext/pcre/tests/pcre_reentrancy.phpt | 58 ext/pcre/tests/preg_match_all_negative_length_match.phpt | 10 ext/pcre/tests/preg_match_frameless_leak.phpt | 23 ext/pcre/tests/preg_match_negative_length_match.phpt | 10 ext/pdo/pdo.c | 2 ext/pdo/pdo_sql_parser.c | 4 ext/pdo/pdo_sql_parser.re | 2 ext/pdo/pdo_stmt.c | 2 ext/pdo_dblib/tests/GHSA-5hqh-c84r-qjcv.phpt | 1 ext/pdo_firebird/firebird_driver.c | 71 ext/pdo_firebird/firebird_statement.c | 2 ext/pdo_firebird/tests/autocommit.phpt | 4 ext/pdo_firebird/tests/ghsa-w476-322c-wpvm.phpt | 46 ext/pdo_mysql/mysql_sql_parser.c | 2 ext/pdo_odbc/odbc_stmt.c | 2 ext/pdo_pgsql/pgsql_driver.c | 2 ext/pdo_pgsql/pgsql_sql_parser.c | 2 ext/pdo_sqlite/sqlite_sql_parser.c | 2 ext/pdo_sqlite/tests/bug81740.phpt | 1 ext/pgsql/pgsql.c | 16 ext/pgsql/pgsql.stub.php | 2 ext/pgsql/pgsql_arginfo.h | 4 ext/pgsql/tests/gh21162.phpt | 18 ext/phar/func_interceptors.c | 1 ext/phar/phar.c | 26 ext/phar/phar_internal.h | 1 ext/phar/phar_object.c | 23 ext/phar/phar_path_check.c | 9 ext/phar/stream.c | 4 ext/phar/tar.c | 2 ext/phar/tests/SplFileInfo_openFile_write.phpt | 31 ext/phar/tests/bug74154.phpt | 41 ext/phar/tests/gh17808.phpt | 20 ext/phar/tests/gh20732.phpt | 14 ext/phar/tests/gh20882.phpt | 22 ext/phar/tests/gh21797.phpt | 30 ext/phar/tests/gh21798-add-file-delref.phpt | 29 ext/phar/tests/gh21798-offsetget-temp-entry.phpt | 39 ext/phar/tests/gh21799-stream-close-flush.phpt | 32 ext/phar/tests/phar-is-link-intercept.phpt | 29 ext/phar/tests/phar_extract2.phpt | 2 ext/phar/tests/tar/bug70417.phpt | 5 ext/phar/util.c | 9 ext/phar/zip.c | 2 ext/posix/posix.c | 3 ext/random/engine_mt19937.c | 2 ext/random/engine_xoshiro256starstar.c | 4 ext/random/tests/02_engine/xoshiro256starstar_unserialize_zero_state.phpt | 14 ext/readline/readline.c | 44 ext/readline/tests/gh18139.phpt | 18 ext/session/mod_user.c | 1 ext/session/tests/user_session_module/gh_gc_retval_leak.phpt | 33 ext/snmp/snmp.c | 39 ext/snmp/tests/gh21336.phpt | 41 ext/soap/php_encoding.c | 12 ext/soap/php_http.c | 10 ext/soap/soap.c | 12 ext/soap/tests/GHSA-85c2-q967-79q5.phpt | 61 ext/soap/tests/GHSA-hmxp-6pc4-f3vv.phpt | 39 ext/soap/tests/GHSA-m33r-qmcv-p97q.phpt | 58 ext/soap/tests/bugs/cookie_parse_options_offset.phpt | 61 ext/soap/tests/soap_qname_crash.phpt | 1 ext/sockets/conversions.c | 2 ext/sockets/sockets.c | 6 ext/sockets/tests/gh21161.phpt | 19 ext/sockets/tests/socket_sendto_unix_addr_too_long.phpt | 29 ext/sodium/libsodium.c | 6 ext/spl/spl_array.c | 57 ext/spl/spl_directory.c | 5 ext/spl/spl_dllist.c | 7 ext/spl/spl_heap.c | 6 ext/spl/spl_observer.c | 27 ext/spl/tests/SplObjectStorage/concurrent_deletion.phpt | 46 ext/spl/tests/SplObjectStorage/concurrent_deletion_addall.phpt | 43 ext/spl/tests/SplObjectStorage/concurrent_deletion_removeexcept.phpt | 35 ext/spl/tests/bug42654.phpt | 12 ext/spl/tests/bug42654_2.phpt | 33 ext/spl/tests/gh10519.phpt | 2 ext/spl/tests/gh20678.phpt | 14 ext/spl/tests/gh20856.phpt | 26 ext/spl/tests/gh21499.phpt | 17 ext/spl/tests/heap_next_write_lock.phpt | 34 ext/sqlite3/sqlite3.c | 1 ext/sqlite3/tests/gh20699.phpt | 14 ext/standard/basic_functions.c | 15 ext/standard/dl.c | 2 ext/standard/exec.c | 4 ext/standard/file.c | 2 ext/standard/filters.c | 4 ext/standard/formatted_print.c | 8 ext/standard/ftp_fopen_wrapper.c | 12 ext/standard/html.c | 4 ext/standard/html_tables/html_table_gen.php | 4 ext/standard/http_fopen_wrapper.c | 12 ext/standard/iptc.c | 80 ext/standard/libavifinfo/README.md | 2 ext/standard/libavifinfo/avifinfo.c | 303 ext/standard/libavifinfo/avifinfo.h | 38 ext/standard/mail.c | 3 ext/standard/math.c | 6 ext/standard/metaphone.c | 18 ext/standard/proc_open.c | 2 ext/standard/quot_print.c | 8 ext/standard/scanf.c | 10 ext/standard/soundex.c | 2 ext/standard/string.c | 14 ext/standard/strnatcmp.c | 30 ext/standard/tests/GHSA-96wq-48vp-hh57.phpt | 22 ext/standard/tests/file/bug52820.phpt | 12 ext/standard/tests/file/bug69442.phpt | 1 ext/standard/tests/file/bug74357.phpt | 32 ext/standard/tests/file/file_get_contents_file_put_contents_5gb.phpt | 1 ext/standard/tests/filters/gh20370.phpt | 44 ext/standard/tests/filters/gh20370_dynamic_stream_property.phpt | 51 ext/standard/tests/filters/gh20370_no_stream_property.phpt | 37 ext/standard/tests/filters/gh20370_private_stream_property.phpt | 38 ext/standard/tests/general_functions/gh20840.phpt | 47 ext/standard/tests/gh20695.phpt | 14 ext/standard/tests/http/http_build_query/gh20583.phpt | 4 ext/standard/tests/image/gh20582.phpt | 54 ext/standard/tests/mail/gh20776.phpt | 15 ext/standard/tests/skipif_no_root.inc | 16 ext/standard/tests/strings/gh15613.phpt | 1 ext/standard/tests/strings/gh18976.phpt | 4 ext/standard/tests/strings/gh20906_1.phpt | 25 ext/standard/tests/strings/gh20906_2.phpt | 21 ext/standard/tests/strings/gh20906_3.phpt | 21 ext/standard/type.c | 2 ext/standard/url.c | 20 ext/standard/url_scanner_ex.c | 452 ext/standard/url_scanner_ex.re | 6 ext/standard/user_filters.c | 62 ext/standard/var.c | 6 ext/standard/var_unserializer.c | 76 ext/standard/versioning.c | 16 ext/sysvshm/sysvshm.c | 8 ext/sysvshm/tests/shm_get_var_leak.phpt | 37 ext/tidy/tests/parsing_file_too_large.phpt | 1 ext/xml/tests/bug81481.phpt | 1 ext/xsl/php_xsl.c | 1 ext/xsl/tests/auto_registration_namespaces_new_dom.phpt | 2 ext/xsl/tests/gh21357_1.phpt | 20 ext/xsl/tests/gh21357_2.phpt | 35 ext/xsl/tests/gh21496.phpt | 32 ext/xsl/xsltprocessor.c | 157 ext/zend_test/test.c | 2 ext/zend_test/test.stub.php | 5 ext/zend_test/test_arginfo.h | 16 ext/zip/php_zip.c | 2 ext/zip/php_zip.h | 2 ext/zip/tests/gh21698.phpt | 21 ext/zip/zip_stream.c | 6 ext/zlib/tests/gzseek_seek_oob.phpt | 19 ext/zlib/zlib_fopen_wrapper.c | 9 main/SAPI.c | 6 main/debug_gdb_scripts.c | 2 main/fastcgi.c | 4 main/fopen_wrappers.c | 6 main/main.c | 2 main/network.c | 2 main/output.c | 17 main/php_ini.c | 2 main/php_ini_builder.c | 2 main/php_variables.c | 4 main/php_version.h | 6 main/rfc1867.c | 12 main/snprintf.c | 14 main/spprintf.c | 14 main/streams/filter.c | 16 main/streams/memory.c | 7 main/streams/plain_wrapper.c | 2 main/streams/streams.c | 4 main/streams/transports.c | 2 main/streams/xp_socket.c | 4 pear/install-pear-nozlib.phar | 1220 +- run-tests.php | 12 sapi/cgi/Makefile.frag | 2 sapi/cli/Makefile.frag | 2 sapi/cli/php_cli.c | 18 sapi/cli/php_cli_server.c | 2 sapi/cli/tests/004.phpt | 14 sapi/fpm/Makefile.frag | 2 sapi/fpm/fpm/fpm_conf.c | 4 sapi/fpm/fpm/fpm_status.c | 34 sapi/fpm/tests/bug77023-pm-dynamic-blocking-sigquit.phpt | 2 sapi/fpm/tests/ghsa-7qg2-v9fj-4mwv-status-xss.phpt | 48 sapi/fpm/tests/proc-idle-timeout.phpt | 2 sapi/litespeed/Makefile.frag | 2 sapi/litespeed/lsapi_main.c | 4 sapi/litespeed/lsapilib.c | 6 sapi/phpdbg/Makefile.frag | 2 sapi/phpdbg/phpdbg_cmd.c | 4 sapi/phpdbg/phpdbg_lexer.c | 797 - sapi/phpdbg/phpdbg_prompt.c | 2 sapi/phpdbg/phpdbg_utils.c | 12 scripts/gdb/debug_gdb_scripts_gen.php | 2 tests/output/gh20352.phpt | 27 tests/output/gh20837.phpt | 23 win32/sendmail.c | 6 626 files changed, 39919 insertions(+), 17294 deletions(-) dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp4_0p9ibi/php8.4_8.4.16-1~deb13u1.dsc: no acceptable signature found dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp4_0p9ibi/php8.4_8.4.21-1~deb13u1.dsc: no acceptable signature found diff -Nru php8.4-8.4.16/.circleci/config.yml php8.4-8.4.21/.circleci/config.yml --- php8.4-8.4.16/.circleci/config.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.circleci/config.yml 2026-05-05 16:34:12.000000000 +0000 @@ -5,7 +5,7 @@ resource_class: arm.medium docker: - image: cimg/base:current-22.04 - - image: mysql:8.3 + - image: mysql:8.4 environment: MYSQL_ALLOW_EMPTY_PASSWORD: true MYSQL_ROOT_PASSWORD: '' @@ -167,6 +167,7 @@ name: Test no_output_timeout: 30m command: | + export RUN_RESOURCE_HEAVY_TESTS=1 sapi/cli/php run-tests.php \ -d zend_extension=opcache.so \ -d opcache.enable_cli=1 \ diff -Nru php8.4-8.4.16/.github/CODEOWNERS php8.4-8.4.21/.github/CODEOWNERS --- php8.4-8.4.16/.github/CODEOWNERS 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/CODEOWNERS 2026-05-05 16:34:12.000000000 +0000 @@ -16,18 +16,18 @@ /.github @TimWolla /build/gen_stub.php @kocsismate -/ext/bcmath @Girgias @ndossche @SakiTakamachi +/ext/bcmath @Girgias @SakiTakamachi /ext/curl @adoy /ext/date @derickr /ext/dba @Girgias -/ext/dom @ndossche +/ext/dom @devnexen /ext/ffi @dstogov /ext/gd @devnexen /ext/gettext @devnexen /ext/gmp @Girgias /ext/intl @devnexen +/ext/libxml @devnexen /ext/json @bukka -/ext/libxml @ndossche /ext/mbstring @alexdowad @youkidearitai /ext/mysqli @bukka @kamil-tekiela /ext/mysqlnd @bukka @kamil-tekiela @SakiTakamachi @@ -46,16 +46,15 @@ /ext/random @TimWolla @zeriyoshi /ext/reflection @DanielEScherzer /ext/session @Girgias -/ext/simplexml @ndossche -/ext/soap @ndossche +/ext/simplexml @devnexen +/ext/soap @devnexen /ext/sockets @devnexen /ext/spl @Girgias /ext/standard @bukka -/ext/tidy @ndossche -/ext/xml @ndossche -/ext/xmlreader @ndossche -/ext/xmlwriter @ndossche -/ext/xsl @ndossche +/ext/xml @devnexen +/ext/xmlreader @devnexen +/ext/xmlwriter @devnexen +/ext/xsl @devnexen /main @bukka /sapi/fpm @bukka /Zend/Optimizer @dstogov diff -Nru php8.4-8.4.16/.github/actions/brew/action.yml php8.4-8.4.21/.github/actions/brew/action.yml --- php8.4-8.4.16/.github/actions/brew/action.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/actions/brew/action.yml 2026-05-05 16:34:12.000000000 +0000 @@ -13,11 +13,17 @@ # Some packages exist on x86 but not arm, or vice versa. # Install them with reinstall to avoid warnings. - brew reinstall autoconf webp tidy-html5 libzip libsodium icu4c - brew install \ + brew reinstall -v \ + autoconf \ + webp \ + tidy-html5 \ + libzip \ + libsodium \ + icu4c + brew install -v \ bison \ re2c - brew install \ + brew install -v \ bzip2 \ enchant \ libffi \ diff -Nru php8.4-8.4.16/.github/actions/build-libmysqlclient/action.yml php8.4-8.4.21/.github/actions/build-libmysqlclient/action.yml --- php8.4-8.4.16/.github/actions/build-libmysqlclient/action.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/actions/build-libmysqlclient/action.yml 2026-05-05 16:34:12.000000000 +0000 @@ -5,8 +5,6 @@ required: false libmysql: required: true - withMysqli: - required: true runs: using: composite steps: @@ -21,13 +19,11 @@ wget -nv $URL tar -xf $LIBMYSQL --strip-components=1 -C $MYSQL_DIR PDO_MYSQL=${MYSQL_DIR} - ${{ inputs.withMysqli == 'true' && 'MYSQLI=${MYSQL_DIR}/bin/mysql_config' || '' }} ./buildconf --force ./configure ${{ inputs.configurationParameters }} \ --enable-option-checking=fatal \ --disable-all \ --enable-pdo \ - --with-pdo-mysql=${PDO_MYSQL} \ - ${{ inputs.withMysqli == 'true' && '--with-mysqli=${MYSQLI}' || '' }} + --with-pdo-mysql=${PDO_MYSQL} make clean make -j$(/usr/bin/nproc) >/dev/null diff -Nru php8.4-8.4.16/.github/actions/ccache/action.yml php8.4-8.4.21/.github/actions/ccache/action.yml --- php8.4-8.4.16/.github/actions/ccache/action.yml 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/.github/actions/ccache/action.yml 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,39 @@ +name: ccache +inputs: + name: + required: true + php_directory: + required: false + default: '.' + cc: + required: false + default: 'gcc' + cxx: + required: false + default: 'g++' +runs: + using: composite + steps: + - name: Get cache key + shell: bash + id: cache_key + run: | + major=$(cat ${{ inputs.php_directory }}/main/php_version.h | sed -En 's/^#define PHP_MAJOR_VERSION ([0-9]+)/\1/p') + minor=$(cat ${{ inputs.php_directory }}/main/php_version.h | sed -En 's/^#define PHP_MINOR_VERSION ([0-9]+)/\1/p') + release=$(cat ${{ inputs.php_directory }}/main/php_version.h | sed -En 's/^#define PHP_RELEASE_VERSION ([0-9]+)/\1/p') + week=$(date +"%Y-%W") + prefix="${{ inputs.name }}-$major.$minor.$release" + echo "key=$prefix-$week" >> $GITHUB_OUTPUT + echo "prefix=$prefix-" >> $GITHUB_OUTPUT + - name: ccache + uses: hendrikmuhs/ccache-action@v1.2 + with: + key: "${{ steps.cache_key.outputs.key }}" + append-timestamp: false + restore-keys: "${{ steps.cache_key.outputs.prefix }}" + save: ${{ github.event_name != 'pull_request' }} + - name: Export CC/CXX + shell: bash + run: | + echo "CC=ccache ${{ inputs.cc }}" >> $GITHUB_ENV + echo "CXX=ccache ${{ inputs.cxx }}" >> $GITHUB_ENV diff -Nru php8.4-8.4.16/.github/actions/freebsd/action.yml php8.4-8.4.21/.github/actions/freebsd/action.yml --- php8.4-8.4.16/.github/actions/freebsd/action.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/actions/freebsd/action.yml 2026-05-05 16:34:12.000000000 +0000 @@ -15,6 +15,7 @@ release: '13.5' usesh: true copyback: false + disable-cache: true # Temporarily disable sqlite, as FreeBSD ships it with disabled double quotes. We'll need to fix our tests. # https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=269889 prepare: | @@ -106,6 +107,7 @@ export SKIP_IO_CAPTURE_TESTS=1 export CI_NO_IPV6=1 export STACK_LIMIT_DEFAULTS_CHECK=1 + export RUN_RESOURCE_HEAVY_TESTS=1 sapi/cli/php run-tests.php \ -P -q -j2 \ -g FAIL,BORK,LEAK,XLEAK \ diff -Nru php8.4-8.4.16/.github/actions/macos-update-clang/action.yml php8.4-8.4.21/.github/actions/macos-update-clang/action.yml --- php8.4-8.4.16/.github/actions/macos-update-clang/action.yml 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/.github/actions/macos-update-clang/action.yml 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,17 @@ +name: Update clang +runs: + using: composite + steps: + - shell: bash + run: | + softwareupdate -l + label=$((softwareupdate -l 2>/dev/null | grep 'Label:' | grep -o 'Command Line Tools for Xcode.*' | head -1) || echo '') + if [ -n "$label" ]; then + softwareupdate -i "$label" + xcode_path=$(ls -1 '/Applications' | grep 'Xcode_.*\.app' | sort -r | head -1) + sudo xcode-select -s "/Applications/$xcode_path" + else + echo "Not found." + fi + which clang + clang -v diff -Nru php8.4-8.4.16/.github/actions/solaris/action.yml php8.4-8.4.21/.github/actions/solaris/action.yml --- php8.4-8.4.16/.github/actions/solaris/action.yml 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/.github/actions/solaris/action.yml 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,88 @@ +name: Solaris +inputs: + configurationParameters: + default: '' + required: false + runExtraTests: + default: false + required: false +runs: + using: composite + steps: + - name: Solaris + uses: vmactions/solaris-vm@v1 + with: + release: "11.4-gcc" + usesh: true + copyback: false + disable-cache: true + prepare: | + cd $GITHUB_WORKSPACE + pkg install bison developer/icu libzip oniguruma re2c + + ./buildconf -f + CC=gcc CXX=g++ \ + CFLAGS="-Wno-char-subscripts" \ + PATH=/usr/gnu/bin:/usr/bin \ + PKG_CONFIG_PATH=/usr/lib/amd64/pkgconfig \ + ./configure \ + --prefix=/usr/local \ + --enable-debug \ + --enable-werror \ + --enable-option-checking=fatal \ + --enable-fpm \ + --without-pear \ + --with-bz2 \ + --with-jpeg \ + --with-webp \ + --with-freetype \ + --enable-gd \ + --enable-exif \ + --with-zip \ + --with-zlib \ + --enable-soap \ + --enable-xmlreader \ + --with-xsl \ + --with-libxml \ + --enable-shmop \ + --enable-pcntl \ + --enable-mbstring \ + --with-curl \ + --enable-sockets \ + --with-openssl \ + --enable-bcmath \ + --enable-calendar \ + --enable-ftp \ + --enable-zend-test \ + --enable-dl-test=shared \ + --enable-intl \ + --with-mhash \ + --with-config-file-path=/etc \ + --with-config-file-scan-dir=/etc/php.d \ + ${{ inputs.configurationParameters }} + + gmake -j2 + mkdir /etc/php.d + gmake install > /dev/null + echo opcache.enable_cli=1 > /etc/php.d/opcache.ini + echo opcache.protect_memory=1 >> /etc/php.d/opcache.ini + echo opcache.preload_user=root >> /etc/php.d/opcache.ini + run: | + cd $GITHUB_WORKSPACE + + export SKIP_IO_CAPTURE_TESTS=1 + export CI_NO_IPV6=1 + export STACK_LIMIT_DEFAULTS_CHECK=1 + PATH=/usr/gnu/bin:/usr/bin \ + sapi/cli/php run-tests.php \ + -P -q -j1 \ + -g FAIL,BORK,LEAK,XLEAK \ + --no-progress \ + --offline \ + --show-diff \ + --show-slow 1000 \ + --set-timeout 120 + + if test "${{ inputs.runExtraTests }}" = "true"; then + sapi/cli/php run-extra-tests.php + fi diff -Nru php8.4-8.4.16/.github/actions/test-alpine/action.yml php8.4-8.4.21/.github/actions/test-alpine/action.yml --- php8.4-8.4.16/.github/actions/test-alpine/action.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/actions/test-alpine/action.yml 2026-05-05 16:34:12.000000000 +0000 @@ -3,6 +3,9 @@ runTestsParameters: default: '' required: false + enableOpcache: + default: 'false' + required: false jitType: default: 'disable' required: false @@ -15,6 +18,7 @@ export SKIP_IO_CAPTURE_TESTS=1 export STACK_LIMIT_DEFAULTS_CHECK=1 sapi/cli/php run-tests.php -P -q ${{ inputs.runTestsParameters }} \ + ${{ inputs.enableOpcache == 'true' && '-d zend_extension=opcache.so -d opcache.enable_cli=1' || '' }} \ -d opcache.jit=${{ inputs.jitType }} \ -d opcache.jit_buffer_size=64M \ -j$(nproc) \ diff -Nru php8.4-8.4.16/.github/actions/test-gentoo/action.yml php8.4-8.4.21/.github/actions/test-gentoo/action.yml --- php8.4-8.4.16/.github/actions/test-gentoo/action.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/actions/test-gentoo/action.yml 2026-05-05 16:34:12.000000000 +0000 @@ -25,6 +25,7 @@ # Slow tests criteron is doubled because this runner isn't as fast as others export SKIP_IO_CAPTURE_TESTS=1 export STACK_LIMIT_DEFAULTS_CHECK=1 + export RUN_RESOURCE_HEAVY_TESTS=1 sapi/cli/php run-tests.php -P -q ${{ inputs.runTestsParameters }} \ -j$(nproc) \ -g FAIL,BORK,LEAK,XLEAK \ diff -Nru php8.4-8.4.16/.github/actions/test-libmysqlclient/action.yml php8.4-8.4.21/.github/actions/test-libmysqlclient/action.yml --- php8.4-8.4.16/.github/actions/test-libmysqlclient/action.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/actions/test-libmysqlclient/action.yml 2026-05-05 16:34:12.000000000 +0000 @@ -1,19 +1,15 @@ name: Test libmysqlclient -inputs: - withMysqli: - required: true runs: using: composite steps: - shell: bash run: | set -x - ${{ inputs.withMysqli == 'true' && 'export MYSQL_TEST_USER=root' || '' }} - ${{ inputs.withMysqli == 'true' && 'export MYSQL_TEST_PASSWD=root' || '' }} export PDO_MYSQL_TEST_DSN="mysql:host=127.0.0.1;dbname=test" export PDO_MYSQL_TEST_HOST=127.0.0.1 export PDO_MYSQL_TEST_USER=root export PDO_MYSQL_TEST_PASS=root + export RUN_RESOURCE_HEAVY_TESTS=1 sapi/cli/php run-tests.php -P -q \ -g FAIL,BORK,LEAK,XLEAK \ --no-progress --offline --show-diff --show-slow 1000 --set-timeout 120 \ diff -Nru php8.4-8.4.16/.github/actions/test-linux/action.yml php8.4-8.4.21/.github/actions/test-linux/action.yml --- php8.4-8.4.16/.github/actions/test-linux/action.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/actions/test-linux/action.yml 2026-05-05 16:34:12.000000000 +0000 @@ -3,6 +3,9 @@ runTestsParameters: default: '' required: false + enableOpcache: + default: 'false' + required: false jitType: default: 'disable' required: false @@ -39,7 +42,9 @@ export PDO_ODBC_TEST_DSN="odbc:Driver={ODBC Driver 17 for SQL Server};Server=127.0.0.1;Database=pdo_odbc;uid=$ODBC_TEST_USER;pwd=$ODBC_TEST_PASS" export SKIP_IO_CAPTURE_TESTS=1 export STACK_LIMIT_DEFAULTS_CHECK=1 + export RUN_RESOURCE_HEAVY_TESTS=1 sapi/cli/php run-tests.php -P -q ${{ inputs.runTestsParameters }} \ + ${{ inputs.enableOpcache == 'true' && '-d zend_extension=opcache.so -d opcache.enable_cli=1' || '' }} \ -d opcache.jit=${{ inputs.jitType }} \ -d opcache.protect_memory=1 \ -d opcache.jit_buffer_size=64M \ diff -Nru php8.4-8.4.16/.github/actions/test-macos/action.yml php8.4-8.4.21/.github/actions/test-macos/action.yml --- php8.4-8.4.16/.github/actions/test-macos/action.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/actions/test-macos/action.yml 2026-05-05 16:34:12.000000000 +0000 @@ -3,6 +3,9 @@ runTestsParameters: default: '' required: false + enableOpcache: + default: 'false' + required: false jitType: default: 'disable' required: false @@ -15,7 +18,9 @@ export SKIP_IO_CAPTURE_TESTS=1 export CI_NO_IPV6=1 export STACK_LIMIT_DEFAULTS_CHECK=1 + export RUN_RESOURCE_HEAVY_TESTS=1 sapi/cli/php run-tests.php -P -q ${{ inputs.runTestsParameters }} \ + ${{ inputs.enableOpcache == 'true' && '-d zend_extension=opcache.so -d opcache.enable_cli=1' || '' }} \ -d opcache.jit=${{ inputs.jitType }} \ -d opcache.protect_memory=1 \ -d opcache.jit_buffer_size=64M \ diff -Nru php8.4-8.4.16/.github/matrix.php php8.4-8.4.21/.github/matrix.php --- php8.4-8.4.16/.github/matrix.php 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/.github/matrix.php 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,206 @@ + 'master', 'ref' => 'master', 'version' => [8, 6]], + ['name' => 'PHP-8.5', 'ref' => 'PHP-8.5', 'version' => [8, 5]], + ['name' => 'PHP-8.4', 'ref' => 'PHP-8.4', 'version' => [8, 4]], + ['name' => 'PHP-8.3', 'ref' => 'PHP-8.3', 'version' => [8, 3]], + ['name' => 'PHP-8.2', 'ref' => 'PHP-8.2', 'version' => [8, 2]], +]; + +function get_branch_commit_cache_file_path(): string { + return dirname(__DIR__) . '/branch-commit-cache.json'; +} + +function get_branches() { + $branch_commit_cache_file = get_branch_commit_cache_file_path(); + $branch_commit_map = []; + if (file_exists($branch_commit_cache_file)) { + $branch_commit_map = json_decode(file_get_contents($branch_commit_cache_file), JSON_THROW_ON_ERROR); + } + + $changed_branches = []; + foreach (BRANCHES as $branch) { + $previous_commit_hash = $branch_commit_map[$branch['ref']] ?? null; + $current_commit_hash = trim(shell_exec('git rev-parse origin/' . $branch['ref'])); + + if ($previous_commit_hash !== $current_commit_hash) { + $changed_branches[] = $branch; + } + + $branch_commit_map[$branch['ref']] = $current_commit_hash; + } + + file_put_contents($branch_commit_cache_file, json_encode($branch_commit_map)); + + return $changed_branches; +} + +function get_current_version(): array { + $file = dirname(__DIR__) . '/main/php_version.h'; + $content = file_get_contents($file); + preg_match('(^#define PHP_MAJOR_VERSION (?\d+)$)m', $content, $matches); + $major = (int) $matches['num']; + preg_match('(^#define PHP_MINOR_VERSION (?\d+)$)m', $content, $matches); + $minor = (int) $matches['num']; + return [$major, $minor]; +} + +function select_jobs($repository, $trigger, $nightly, $labels, $php_version, $ref, $all_variations) { + $no_jobs = in_array('CI: No jobs', $labels, true); + $all_jobs = in_array('CI: All jobs', $labels, true) || $nightly; + $test_alpine = in_array('CI: Alpine', $labels, true); + $test_benchmarking = in_array('CI: Benchmarking', $labels, true); + $test_community = in_array('CI: Community', $labels, true); + $test_coverage = in_array('CI: Coverage', $labels, true); + $test_freebsd = in_array('CI: FreeBSD', $labels, true); + $test_libmysqlclient = in_array('CI: libmysqlclient', $labels, true); + $test_linux_ppc64 = in_array('CI: Linux PPC64', $labels, true); + $test_linux_x32 = in_array('CI: Linux X32', $labels, true); + $test_linux_x64 = in_array('CI: Linux X64', $labels, true); + $test_macos = in_array('CI: macOS', $labels, true); + $test_msan = in_array('CI: MSAN', $labels, true); + $test_opcache_variation = in_array('CI: Opcache Variation', $labels, true); + $test_pecl = in_array('CI: PECL', $labels, true); + $test_solaris = in_array('CI: Solaris', $labels, true); + $test_windows = in_array('CI: Windows', $labels, true); + + $jobs = []; + if (version_compare($php_version, '8.4', '>=') && ($all_jobs || !$no_jobs || $test_alpine)) { + $jobs['ALPINE'] = true; + } + if (version_compare($php_version, '8.4', '>=') + && !$nightly + && ($all_jobs || !$no_jobs || $test_benchmarking) + // push trigger is restricted to official repository. + && ($repository === 'php/php-src' || $trigger === 'pull_request')) { + $jobs['BENCHMARKING']['config']['integrated_opcache'] = version_compare($php_version, '8.5', '>='); + } + if ($all_jobs || $test_community) { + $jobs['COMMUNITY']['matrix'] = version_compare($php_version, '8.4', '>=') + ? ['type' => ['asan', 'verify_type_inference']] + : ['type' => ['asan']]; + $jobs['COMMUNITY']['config']['symfony_version'] = match (true) { + version_compare($php_version, '8.3', '<=') => '7.4', + default => '', + }; + $jobs['COMMUNITY']['config']['laravel_version'] = match (true) { + version_compare($php_version, '8.2', '<=') => '12.x', + default => '', + }; + } + if (($all_jobs && $ref === 'master') || $test_coverage) { + $jobs['COVERAGE'] = true; + } + if ($all_jobs || $test_libmysqlclient) { + $jobs['LIBMYSQLCLIENT'] = true; + } + if (version_compare($php_version, '8.4', '>=') && ($all_jobs || $test_linux_ppc64)) { + $jobs['LINUX_PPC64'] = true; + } + if ($all_jobs || !$no_jobs || $test_linux_x64) { + $jobs['LINUX_X64']['matrix'] = $all_variations + ? [ + 'name' => [''], + 'asan' => [false], + 'debug' => [true, false], + 'repeat' => [false], + 'variation' => [false], + 'zts' => [true, false], + 'include' => [ + ['name' => '_ASAN', 'asan' => true, 'debug' => true, 'repeat' => false, 'variation' => false, 'zts' => true], + ['name' => '_REPEAT', 'asan' => false, 'debug' => true, 'repeat' => true, 'variation' => false, 'zts' => false], + ['name' => '_VARIATION', 'asan' => false, 'debug' => true, 'repeat' => false, 'variation' => true, 'zts' => true], + ], + ] + : ['include' => [ + ['name' => '', 'asan' => false, 'debug' => false, 'repeat' => false, 'variation' => false, 'zts' => false], + ['name' => '_ASAN', 'asan' => true, 'debug' => true, 'repeat' => false, 'variation' => false, 'zts' => true], + ]]; + $jobs['LINUX_X64']['config']['variation_enable_zend_max_execution_timers'] = version_compare($php_version, '8.3', '>='); + } + if ($all_jobs || !$no_jobs || $test_linux_x32) { + $jobs['LINUX_X32']['matrix'] = $all_variations + ? ['debug' => [true, false], 'zts' => [true, false]] + : ['debug' => [true], 'zts' => [true]]; + } + if ($all_jobs || !$no_jobs || $test_macos) { + $test_arm = version_compare($php_version, '8.4', '>='); + $jobs['MACOS']['matrix'] = $all_variations + ? ['arch' => $test_arm ? ['X64', 'ARM64'] : ['X64'], 'debug' => [true, false], 'zts' => [true, false]] + : ['include' => [['arch' => $test_arm ? 'ARM64' : 'X64', 'debug' => true, 'zts' => false]]]; + $jobs['MACOS']['config']['arm64_version'] = version_compare($php_version, '8.4', '>=') ? '15' : '14'; + } + if ($all_jobs || $test_msan) { + $jobs['MSAN'] = true; + } + if ($all_jobs || $test_opcache_variation) { + $jobs['OPCACHE_VARIATION'] = true; + } + if (($all_jobs && $ref === 'master') || $test_pecl) { + $jobs['PECL'] = true; + } + if (version_compare($php_version, '8.6', '>=') && ($all_jobs || $test_solaris)) { + $jobs['SOLARIS'] = true; + } + if ($all_jobs || !$no_jobs || $test_windows) { + $matrix = [['asan' => false, 'opcache' => true, 'x64' => true, 'zts' => true]]; + if ($all_variations) { + $matrix[] = ['asan' => true, 'opcache' => true, 'x64' => true, 'zts' => true]; + $matrix[] = ['asan' => false, 'opcache' => false, 'x64' => false, 'zts' => false]; + if (version_compare($php_version, '8.5', '>=')) { + $matrix[] = ['asan' => false, 'opcache' => true, 'x64' => true, 'zts' => true, 'clang' => true]; + } + } + $jobs['WINDOWS']['matrix'] = ['include' => $matrix]; + $jobs['WINDOWS']['config'] = version_compare($php_version, '8.4', '>=') + ? ['vs_crt_version' => 'vs17'] + : ['vs_crt_version' => 'vs16']; + } + if ($all_jobs || !$no_jobs || $test_freebsd) { + $jobs['FREEBSD']['matrix'] = $all_variations && version_compare($php_version, '8.3', '>=') + ? ['zts' => [true, false]] + : ['zts' => [false]]; + } + return $jobs; +} + +$trigger = $argv[1] ?? 'schedule'; +$attempt = (int) ($argv[2] ?? 1); +$sunday = date('w', time()) === '0'; +$discard_cache = $sunday + || ($trigger === 'schedule' && $attempt !== 1) + || $trigger === 'workflow_dispatch'; +if ($discard_cache) { + @unlink(get_branch_commit_cache_file_path()); +} +$branch = $argv[3] ?? 'master'; +$nightly = $trigger === 'schedule' || $trigger === 'workflow_dispatch'; +$branches = $nightly && $branch === 'master' + ? get_branches() + : [['name' => 'Suite', 'ref' => $branch, 'version' => get_current_version()]]; + +$labels = json_decode($argv[4] ?? '[]', true) ?? []; +$labels = array_column($labels, 'name'); +$all_variations = $nightly || in_array('CI: All variations', $labels, true); + +$repository = $argv[5] ?? null; + +foreach ($branches as &$branch) { + $php_version = $branch['version'][0] . '.' . $branch['version'][1]; + $branch['jobs'] = select_jobs($repository, $trigger, $nightly, $labels, $php_version, $branch['ref'], $all_variations); + $branch['config']['ubuntu_version'] = version_compare($php_version, '8.5', '>=') ? '24.04' : '22.04'; +} + +echo "All variations:"; +echo json_encode($all_variations, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT); +echo "\n\nBranches:\n"; +echo json_encode($branches, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT); +echo "\n"; + +if (false !== ($github_output = getenv('GITHUB_OUTPUT'))) { + $f = fopen($github_output, 'a'); + fwrite($f, 'branches=' . json_encode($branches, JSON_UNESCAPED_SLASHES) . "\n"); + fwrite($f, 'all_variations=' . json_encode($all_variations, JSON_UNESCAPED_SLASHES) . "\n"); + fclose($f); +} diff -Nru php8.4-8.4.16/.github/nightly_matrix.php php8.4-8.4.21/.github/nightly_matrix.php --- php8.4-8.4.16/.github/nightly_matrix.php 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/nightly_matrix.php 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ - 'master', 'version' => [8, 6]], - ['ref' => 'PHP-8.5', 'version' => [8, 5]], - ['ref' => 'PHP-8.4', 'version' => [8, 4]], - ['ref' => 'PHP-8.3', 'version' => [8, 3]], - ['ref' => 'PHP-8.2', 'version' => [8, 2]], - ['ref' => 'PHP-8.1', 'version' => [8, 1]], -]; - -function get_branch_commit_cache_file_path(): string { - return dirname(__DIR__) . '/branch-commit-cache.json'; -} - -function get_branches() { - $branch_commit_cache_file = get_branch_commit_cache_file_path(); - $branch_commit_map = []; - if (file_exists($branch_commit_cache_file)) { - $branch_commit_map = json_decode(file_get_contents($branch_commit_cache_file), JSON_THROW_ON_ERROR); - } - - $changed_branches = []; - foreach (BRANCHES as $branch) { - $previous_commit_hash = $branch_commit_map[$branch['ref']] ?? null; - $current_commit_hash = trim(shell_exec('git rev-parse origin/' . $branch['ref'])); - - if ($previous_commit_hash !== $current_commit_hash) { - $changed_branches[] = $branch; - } - - $branch_commit_map[$branch['ref']] = $current_commit_hash; - } - - file_put_contents($branch_commit_cache_file, json_encode($branch_commit_map)); - - return $changed_branches; -} - -function get_current_version(): array { - $file = dirname(__DIR__) . '/main/php_version.h'; - $content = file_get_contents($file); - preg_match('(^#define PHP_MAJOR_VERSION (?\d+)$)m', $content, $matches); - $major = (int) $matches['num']; - preg_match('(^#define PHP_MINOR_VERSION (?\d+)$)m', $content, $matches); - $minor = (int) $matches['num']; - return [$major, $minor]; -} - -$trigger = $argv[1] ?? 'schedule'; -$attempt = (int) ($argv[2] ?? 1); -$sunday = date('w', time()) === '0'; -$discard_cache = $sunday - || ($trigger === 'schedule' && $attempt !== 1) - || $trigger === 'workflow_dispatch'; -if ($discard_cache) { - @unlink(get_branch_commit_cache_file_path()); -} -$branch = $argv[3] ?? 'master'; -$branches = $branch === 'master' - ? get_branches() - : [['ref' => $branch, 'version' => get_current_version()]]; - -$f = fopen(getenv('GITHUB_OUTPUT'), 'a'); -fwrite($f, 'branches=' . json_encode($branches, JSON_UNESCAPED_SLASHES) . "\n"); -fclose($f); diff -Nru php8.4-8.4.16/.github/workflows/docs.yml php8.4-8.4.21/.github/workflows/docs.yml --- php8.4-8.4.16/.github/workflows/docs.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/workflows/docs.yml 2026-05-05 16:34:12.000000000 +0000 @@ -17,7 +17,7 @@ if: github.repository == 'php/php-src' steps: - name: git checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install dependencies run: pip install sphinx-design sphinxawesome-theme rstfmt - name: Check formatting diff -Nru php8.4-8.4.16/.github/workflows/labeler.yml php8.4-8.4.21/.github/workflows/labeler.yml --- php8.4-8.4.16/.github/workflows/labeler.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/workflows/labeler.yml 2026-05-05 16:34:12.000000000 +0000 @@ -12,6 +12,6 @@ pull-requests: write runs-on: ubuntu-latest steps: - - uses: actions/labeler@v5 + - uses: actions/labeler@v6 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" diff -Nru php8.4-8.4.16/.github/workflows/nightly-results.yml php8.4-8.4.21/.github/workflows/nightly-results.yml --- php8.4-8.4.16/.github/workflows/nightly-results.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/workflows/nightly-results.yml 2026-05-05 16:34:12.000000000 +0000 @@ -2,13 +2,13 @@ on: workflow_run: workflows: - - Nightly + - Test types: - completed jobs: on-failure: runs-on: ubuntu-latest - if: ${{ github.repository == 'php/php-src' && github.event.workflow_run.conclusion == 'failure' }} + if: ${{ github.repository == 'php/php-src' && github.event.workflow_run.event == 'schedule' && github.event.workflow_run.conclusion == 'failure' }} steps: - run: | export DEBIAN_FRONTEND=noninteractive diff -Nru php8.4-8.4.16/.github/workflows/nightly.yml php8.4-8.4.21/.github/workflows/nightly.yml --- php8.4-8.4.16/.github/workflows/nightly.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/workflows/nightly.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,1049 +0,0 @@ -name: Test suite -on: - workflow_call: - inputs: - asan_ubuntu_version: - required: true - type: string - branch: - required: true - type: string - community_verify_type_inference: - required: true - type: boolean - libmysqlclient_with_mysqli: - required: true - type: boolean - run_alpine: - required: true - type: boolean - run_linux_ppc64: - required: true - type: boolean - run_macos_arm64: - required: true - type: boolean - run_freebsd_zts: - required: true - type: boolean - ubuntu_version: - required: true - type: string - windows_version: - required: true - type: string - vs_crt_version: - required: true - type: string - skip_laravel: - required: true - type: boolean - symfony_version: - required: true - type: string - skip_wordpress: - required: true - type: boolean - variation_enable_zend_max_execution_timers: - required: true - type: boolean -permissions: - contents: read -jobs: - LINUX_PPC64: - if: inputs.run_linux_ppc64 - name: LINUX_PPC64_ASAN_UBSAN_DEBUG_ZTS - # This runs on a self-hosted runner; see https://wiki.php.net/systems/ci - runs-on: [self-hosted, gentoo, ppc64] - steps: - - name: git checkout - uses: actions/checkout@v5 - with: - ref: ${{ inputs.branch }} - - name: System info - run: | - echo "::group::Show host CPU info" - lscpu - echo "::endgroup::" - echo "::group::Show installed packages" - cat /var/lib/portage/world - echo "::endgroup::" - - name: ./configure - uses: ./.github/actions/configure-gentoo - with: - configurationParameters: >- - CFLAGS="-fsanitize=undefined,address -fno-sanitize=function -DZEND_TRACK_ARENA_ALLOC" - LDFLAGS="-fsanitize=undefined,address -fno-sanitize=function" - CC=clang-17 - CXX=clang++-17 - --enable-debug - --enable-zts - skipSlow: false # FIXME: This should likely include slow extensions - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - # Skip an install action for now - - name: Tests - uses: ./.github/actions/test-gentoo - # There is no PPC JIT, so rip this out - with: - runTestsParameters: >- - --asan -x - - name: Extra tests - uses: ./.github/actions/extra-tests - ALPINE: - if: inputs.run_alpine - name: ALPINE_X64_ASAN_UBSAN_DEBUG_ZTS - runs-on: ubuntu-24.04 - container: - image: 'alpine:3.22' - steps: - - name: git checkout - uses: actions/checkout@v5 - with: - ref: ${{ inputs.branch }} - - name: apk - uses: ./.github/actions/apk - - name: System info - run: | - echo "::group::Show host CPU info" - lscpu - echo "::endgroup::" - echo "::group::Show installed package versions" - apk list - echo "::endgroup::" - - name: ./configure - uses: ./.github/actions/configure-alpine - with: - configurationParameters: >- - CFLAGS="-fsanitize=undefined,address -fno-sanitize=function -DZEND_TRACK_ARENA_ALLOC" - LDFLAGS="-fsanitize=undefined,address -fno-sanitize=function" - CC=clang-20 - CXX=clang++-20 - --enable-debug - --enable-zts - skipSlow: true # FIXME: This should likely include slow extensions - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - - name: make install - uses: ./.github/actions/install-alpine - - name: Test Tracing JIT - uses: ./.github/actions/test-alpine - with: - jitType: tracing - runTestsParameters: >- - --asan -x - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - name: Extra tests - uses: ./.github/actions/extra-tests - LINUX_X64: - services: - mysql: - image: mysql:8.3 - ports: - - 3306:3306 - env: - MYSQL_DATABASE: test - MYSQL_ROOT_PASSWORD: root - postgres: - image: postgres - env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: test - firebird: - image: jacobalberty/firebird - ports: - - 3050:3050 - env: - ISC_PASSWORD: test - FIREBIRD_DATABASE: test.fdb - FIREBIRD_USER: test - FIREBIRD_PASSWORD: test - strategy: - fail-fast: false - matrix: - configuration_parameters: [''] - debug: [true, false] - name: [''] - run_tests_parameters: [''] - test_function_jit: [true] - zts: [true, false] - include: - - name: _ASAN_UBSAN - debug: true - zts: true - configuration_parameters: >- - CFLAGS="-fsanitize=undefined,address -DZEND_TRACK_ARENA_ALLOC" - LDFLAGS="-fsanitize=undefined,address" - run_tests_parameters: '--asan' - test_function_jit: false - asan: true - - name: _REPEAT - debug: true - zts: false - run_tests_parameters: --repeat 2 - timeout_minutes: 360 - test_function_jit: true - asan: false - - name: _VARIATION - debug: true - zts: true - configuration_parameters: >- - CFLAGS="-DZEND_RC_DEBUG=1 -DPROFITABILITY_CHECKS=0 -DZEND_VERIFY_FUNC_INFO=1 -DZEND_VERIFY_TYPE_INFERENCE" - ${{ inputs.variation_enable_zend_max_execution_timers && '--enable-zend-max-execution-timers' || '' }} - run_tests_parameters: -d zend_test.observer.enabled=1 -d zend_test.observer.show_output=0 - timeout_minutes: 360 - test_function_jit: true - asan: false - name: "LINUX_X64${{ matrix.name }}_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" - runs-on: ubuntu-${{ matrix.asan && inputs.asan_ubuntu_version || inputs.ubuntu_version }} - steps: - - name: git checkout - uses: actions/checkout@v5 - with: - ref: ${{ inputs.branch }} - - name: Create MSSQL container - uses: ./.github/actions/setup-mssql - - name: apt - uses: ./.github/actions/apt-x64 - with: - asan: ${{ matrix.asan && 'true' || 'false' }} - - name: System info - run: | - echo "::group::Show host CPU info" - lscpu - echo "::endgroup::" - echo "::group::Show installed package versions" - dpkg -l - echo "::endgroup::" - - name: ./configure - uses: ./.github/actions/configure-x64 - with: - configurationParameters: >- - ${{ matrix.configuration_parameters }} - --${{ matrix.debug && 'enable' || 'disable' }}-debug - --${{ matrix.zts && 'enable' || 'disable' }}-zts - asan: ${{ matrix.asan && 'true' || 'false' }} - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - - name: make install - uses: ./.github/actions/install-linux - - name: Setup - uses: ./.github/actions/setup-x64 - - name: Test - uses: ./.github/actions/test-linux - with: - runTestsParameters: >- - ${{ matrix.run_tests_parameters }} - idleCpu: ${{ matrix.asan && 'true' || 'false' }} - - name: Test Tracing JIT - uses: ./.github/actions/test-linux - with: - jitType: tracing - runTestsParameters: >- - ${{ matrix.run_tests_parameters }} - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - name: Test OpCache - uses: ./.github/actions/test-linux - with: - runTestsParameters: >- - ${{ matrix.run_tests_parameters }} - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - name: Test Function JIT - # ASAN frequently timeouts. Each test run takes ~90 minutes, we can - # avoid running into the 6 hour timeout by skipping the function JIT. - if: matrix.test_function_jit - uses: ./.github/actions/test-linux - with: - jitType: function - runTestsParameters: >- - ${{ matrix.run_tests_parameters }} - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - name: Extra tests - uses: ./.github/actions/extra-tests - - name: Verify generated files are up to date - uses: ./.github/actions/verify-generated-files - LINUX_X32: - strategy: - fail-fast: false - matrix: - debug: [true, false] - zts: [true, false] - name: "LINUX_X32_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" - runs-on: ubuntu-latest - container: - image: ubuntu:${{ inputs.ubuntu_version }} - env: - PDO_FIREBIRD_TEST_DSN: firebird:dbname=firebird:test.fdb - services: - mysql: - image: mysql:8.3 - ports: - - 3306:3306 - env: - MYSQL_DATABASE: test - MYSQL_ROOT_PASSWORD: root - firebird: - image: jacobalberty/firebird - ports: - - 3050:3050 - env: - ISC_PASSWORD: test - FIREBIRD_DATABASE: test.fdb - FIREBIRD_USER: test - FIREBIRD_PASSWORD: test - steps: - - name: git checkout - uses: actions/checkout@v5 - with: - ref: ${{ inputs.branch }} - - name: apt - uses: ./.github/actions/apt-x32 - - name: System info - run: | - echo "::group::Show host CPU info" - lscpu - echo "::endgroup::" - echo "::group::Show installed package versions" - dpkg -l - echo "::endgroup::" - - name: ./configure - uses: ./.github/actions/configure-x32 - with: - configurationParameters: >- - --${{ matrix.debug && 'enable' || 'disable' }}-debug - --${{ matrix.zts && 'enable' || 'disable' }}-zts - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - - name: make install - uses: ./.github/actions/install-linux-x32 - - name: Test - uses: ./.github/actions/test-linux - with: - runTestsParameters: >- - ${{ matrix.run_tests_parameters }} - - name: Test Tracing JIT - uses: ./.github/actions/test-linux - with: - jitType: tracing - runTestsParameters: >- - ${{ matrix.run_tests_parameters }} - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - name: Test OpCache - uses: ./.github/actions/test-linux - with: - runTestsParameters: >- - ${{ matrix.run_tests_parameters }} - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - name: Test Function JIT - uses: ./.github/actions/test-linux - with: - jitType: function - runTestsParameters: >- - ${{ matrix.run_tests_parameters }} - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - name: Extra tests - uses: ./.github/actions/extra-tests - MACOS: - strategy: - fail-fast: false - matrix: - debug: [true, false] - zts: [true, false] - os: ['13', '14'] - exclude: - - os: ${{ !inputs.run_macos_arm64 && '14' || '*never*' }} - name: "MACOS_${{ matrix.os == '13' && 'X64' || 'ARM64' }}_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" - runs-on: macos-${{ matrix.os }} - steps: - - name: git checkout - uses: actions/checkout@v5 - with: - ref: ${{ inputs.branch }} - - name: brew - uses: ./.github/actions/brew - - name: ./configure - uses: ./.github/actions/configure-macos - with: - configurationParameters: >- - --${{ matrix.debug && 'enable' || 'disable' }}-debug - --${{ matrix.zts && 'enable' || 'disable' }}-zts - - name: make - run: |- - export PATH="$(brew --prefix)/opt/bison/bin:$PATH" - make -j$(sysctl -n hw.logicalcpu) >/dev/null - - name: make install - run: sudo make install - - name: Test - uses: ./.github/actions/test-macos - - name: Test Tracing JIT - if: matrix.os != '14' || !matrix.zts - uses: ./.github/actions/test-macos - with: - jitType: tracing - runTestsParameters: >- - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - name: Test OpCache - uses: ./.github/actions/test-macos - with: - runTestsParameters: >- - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - name: Test Function JIT - if: matrix.os != '14' || !matrix.zts - uses: ./.github/actions/test-macos - with: - jitType: function - runTestsParameters: >- - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - name: Extra tests - uses: ./.github/actions/extra-tests - - name: Verify generated files are up to date - uses: ./.github/actions/verify-generated-files - COVERAGE_DEBUG_NTS: - if: inputs.branch == 'master' - services: - mysql: - image: mysql:8.3 - ports: - - 3306:3306 - env: - MYSQL_DATABASE: test - MYSQL_ROOT_PASSWORD: root - postgres: - image: postgres - env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: test - firebird: - image: jacobalberty/firebird - ports: - - 3050:3050 - env: - ISC_PASSWORD: test - FIREBIRD_DATABASE: test.fdb - FIREBIRD_USER: test - FIREBIRD_PASSWORD: test - runs-on: ubuntu-22.04 - steps: - - name: git checkout - uses: actions/checkout@v5 - with: - ref: ${{ inputs.branch }} - - name: Create MSSQL container - uses: ./.github/actions/setup-mssql - - name: apt - uses: ./.github/actions/apt-x64 - - name: Install gcovr - run: sudo -H pip install gcovr - - name: ./configure - uses: ./.github/actions/configure-x64 - with: - configurationParameters: --enable-debug --disable-zts --enable-gcov - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - - name: make install - uses: ./.github/actions/install-linux - - name: Setup - uses: ./.github/actions/setup-x64 - # We only test with OpCache, the difference in coverage is negligible - - name: Test OpCache - uses: ./.github/actions/test-linux - with: - jitType: tracing - runTestsParameters: >- - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - uses: codecov/codecov-action@v4 - if: ${{ !cancelled() }} - with: - fail_ci_if_error: true - token: ${{ secrets.CODECOV_TOKEN }} - verbose: true - COMMUNITY: - strategy: - fail-fast: false - matrix: - type: ['asan', 'verify_type_inference'] - exclude: - - type: ${{ !inputs.community_verify_type_inference && 'verify_type_inference' || '*never*' }} - name: "COMMUNITY_${{ matrix.type }}" - runs-on: ubuntu-${{ inputs.ubuntu_version }} - env: - ASAN_OPTIONS: exitcode=139 - UBSAN_OPTIONS: print_stacktrace=1 - USE_ZEND_ALLOC: 0 - USE_TRACKED_ALLOC: 1 - steps: - - name: git checkout - uses: actions/checkout@v5 - with: - ref: ${{ inputs.branch }} - - name: apt - uses: ./.github/actions/apt-x64 - - name: ./configure - uses: ./.github/actions/configure-x64 - with: - # CFLAGS removes O2, so we have to add it again... - configurationParameters: >- - --enable-zts - ${{ matrix.type == 'asan' && '--enable-debug CFLAGS="-fsanitize=undefined,address -fno-sanitize-recover -DZEND_TRACK_ARENA_ALLOC" LDFLAGS="-fsanitize=undefined,address"' || '' }} - ${{ matrix.type == 'verify_type_inference' && 'CFLAGS="-DZEND_VERIFY_TYPE_INFERENCE -O2"' || '' }} - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - - name: make install - uses: ./.github/actions/install-linux - - name: Setup - run: | - sudo service mysql start - mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test" - mysql -uroot -proot -e "SET GLOBAL local_infile = true" - - name: Enable Opcache - run: | - echo memory_limit=-1 >> /etc/php.d/opcache.ini - echo zend_extension=opcache.so > /etc/php.d/opcache.ini - echo opcache.enable_cli=1 >> /etc/php.d/opcache.ini - echo opcache.enable=1 >> /etc/php.d/opcache.ini - echo opcache.protect_memory=1 >> /etc/php.d/opcache.ini - echo opcache.memory_consumption=256M >> /etc/php.d/opcache.ini - echo opcache.file_update_protection=0 >> /etc/php.d/opcache.ini - echo opcache.interned_strings_buffer=64 >> /etc/php.d/opcache.ini - echo opcache.max_accelerated_files=100000 >> /etc/php.d/opcache.ini - - name: Enable JIT - if: matrix.type != 'verify_type_inference' - run: | - echo opcache.jit=tracing >> /etc/php.d/opcache.ini - echo opcache.jit_buffer_size=1G >> /etc/php.d/opcache.ini - echo opcache.jit_max_root_traces=100000 >> /etc/php.d/opcache.ini - echo opcache.jit_max_side_traces=100000 >> /etc/php.d/opcache.ini - echo opcache.jit_max_exit_counters=100000 >> /etc/php.d/opcache.ini - echo opcache.jit_hot_loop=1 >> /etc/php.d/opcache.ini - echo opcache.jit_hot_func=1 >> /etc/php.d/opcache.ini - echo opcache.jit_hot_return=1 >> /etc/php.d/opcache.ini - echo opcache.jit_hot_side_exit=1 >> /etc/php.d/opcache.ini - php -v - - name: Test AMPHP - if: ${{ !cancelled() }} - run: | - repositories="amp cache dns file http parallel parser pipeline process serialization socket sync websocket-client websocket-server" - X=0 - for repository in $repositories; do - echo "::group::$repository" - git clone "https://github.com/amphp/$repository.git" "amphp-$repository" --depth 1 - cd "amphp-$repository" - git rev-parse HEAD - php /usr/bin/composer install --no-progress --ignore-platform-req=php+ - EXIT_CODE=0 - vendor/bin/phpunit || EXIT_CODE=$? - echo -e "\n::endgroup::" - if [ ${EXIT_CODE:-0} -gt 128 ]; then - X=1; - echo "Failed" - fi - cd .. - done - exit $X - - name: Test Laravel - if: ${{ !cancelled() && !inputs.skip_laravel }} - run: | - git clone https://github.com/laravel/framework.git --depth=1 - cd framework - git rev-parse HEAD - php /usr/bin/composer install --no-progress --ignore-platform-req=php+ - # Hack to disable a test that hangs - php -r '$c = file_get_contents("tests/Filesystem/FilesystemTest.php"); $c = str_replace("public function testSharedGet()", "#[\\PHPUnit\\Framework\\Attributes\\Group('"'"'skip'"'"')]\n public function testSharedGet()", $c); file_put_contents("tests/Filesystem/FilesystemTest.php", $c);' - php vendor/bin/phpunit --exclude-group skip || EXIT_CODE=$? - if [ ${EXIT_CODE:-0} -gt 128 ]; then - exit 1 - fi - - name: Test ReactPHP - if: ${{ !cancelled() }} - run: | - repositories="async cache child-process datagram dns event-loop promise promise-stream promise-timer stream" - X=0 - for repository in $repositories; do - echo "::group::$repository" - git clone "https://github.com/reactphp/$repository.git" "reactphp-$repository" --depth 1 - cd "reactphp-$repository" - git rev-parse HEAD - php /usr/bin/composer install --no-progress --ignore-platform-req=php+ - EXIT_CODE=0 - vendor/bin/phpunit || EXIT_CODE=$? - echo -e "\n::endgroup::" - if [ $[EXIT_CODE:-0} -gt 128 ]; then - X=1; - echo "Failed" - fi - cd .. - done - exit $X - - name: Test Revolt PHP - if: ${{ !cancelled() }} - run: | - git clone https://github.com/revoltphp/event-loop.git --depth=1 - cd event-loop - git rev-parse HEAD - php /usr/bin/composer install --no-progress --ignore-platform-req=php+ - vendor/bin/phpunit || EXIT_CODE=$? - if [ ${EXIT_CODE:-0} -gt 128 ]; then - exit 1 - fi - - name: Test Symfony - if: ${{ !cancelled() && inputs.symfony_version != '' }} - run: | - git clone https://github.com/symfony/symfony.git --depth=1 --branch="${{ inputs.symfony_version }}" - cd symfony - git rev-parse HEAD - php /usr/bin/composer install --no-progress --ignore-platform-req=php+ - php ./phpunit install - # Test causes a heap-buffer-overflow but I cannot reproduce it locally... - php -r '$c = file_get_contents("src/Symfony/Component/HtmlSanitizer/Tests/HtmlSanitizerCustomTest.php"); $c = str_replace("public function testSanitizeDeepNestedString()", "#[\\PHPUnit\\Framework\\Attributes\\Group('"'"'skip'"'"')]\n public function testSanitizeDeepNestedString()", $c); file_put_contents("src/Symfony/Component/HtmlSanitizer/Tests/HtmlSanitizerCustomTest.php", $c);' - # Buggy FFI test in Symfony, see https://github.com/symfony/symfony/issues/47668 - php -r '$c = file_get_contents("src/Symfony/Component/VarDumper/Tests/Caster/FFICasterTest.php"); $c = str_replace("public function testCastNonTrailingCharPointer()", "#[\\PHPUnit\\Framework\\Attributes\\Group('"'"'skip'"'"')]\n public function testCastNonTrailingCharPointer()", $c); file_put_contents("src/Symfony/Component/VarDumper/Tests/Caster/FFICasterTest.php", $c);' - export SYMFONY_DEPRECATIONS_HELPER=max[total]=999 - X=0 - for component in $(find src/Symfony -mindepth 2 -type f -name phpunit.xml.dist -printf '%h\n'); do - echo "::group::$component" - EXIT_CODE=0 - php ./phpunit $component --exclude-group tty --exclude-group benchmark --exclude-group intl-data --exclude-group transient --exclude-group skip || EXIT_CODE=$? - echo -e "\n::endgroup::" - if [ ${EXIT_CODE:-0} -gt 128 ]; then - X=1; - echo "Failed" - fi - done - exit $X - - name: Test PHPUnit - if: ${{ !cancelled() }} - run: | - git clone https://github.com/sebastianbergmann/phpunit.git --branch=main --depth=1 - cd phpunit - git rev-parse HEAD - php /usr/bin/composer install --no-progress --ignore-platform-req=php+ - php ./phpunit || EXIT_CODE=$? - if [ ${EXIT_CODE:-0} -gt 128 ]; then - exit 1 - fi - - name: 'Symfony Preloading' - # composer create-project will automatically pick the right Symfony version for us. - if: ${{ !cancelled() && inputs.symfony_version != '' }} - run: | - php /usr/bin/composer create-project symfony/symfony-demo symfony_demo --no-progress --ignore-platform-req=php+ - cd symfony_demo - git rev-parse HEAD - sed -i 's/PHP_SAPI/"cli-server"/g' var/cache/dev/App_KernelDevDebugContainer.preload.php - php -d opcache.preload=var/cache/dev/App_KernelDevDebugContainer.preload.php public/index.php - - name: Test Wordpress - if: ${{ !cancelled() && !inputs.skip_wordpress }} - run: | - git clone https://github.com/WordPress/wordpress-develop.git wordpress --depth=1 - cd wordpress - git rev-parse HEAD - php /usr/bin/composer install --no-progress --ignore-platform-req=php+ - cp wp-tests-config-sample.php wp-tests-config.php - sed -i 's/youremptytestdbnamehere/test/g' wp-tests-config.php - sed -i 's/yourusernamehere/root/g' wp-tests-config.php - sed -i 's/yourpasswordhere/root/g' wp-tests-config.php - php vendor/bin/phpunit || EXIT_CODE=$? - if [ $EXIT_CODE -gt 128 ]; then - exit 1 - fi - OPCACHE_VARIATION: - services: - mysql: - image: mysql:8.3 - ports: - - 3306:3306 - env: - MYSQL_DATABASE: test - MYSQL_ROOT_PASSWORD: root - postgres: - image: postgres - env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: test - firebird: - image: jacobalberty/firebird - ports: - - 3050:3050 - env: - ISC_PASSWORD: test - FIREBIRD_DATABASE: test.fdb - FIREBIRD_USER: test - FIREBIRD_PASSWORD: test - name: OPCACHE_VARIATION - runs-on: ubuntu-${{ inputs.ubuntu_version }} - steps: - - name: git checkout - uses: actions/checkout@v5 - with: - ref: ${{ inputs.branch }} - - name: Create MSSQL container - uses: ./.github/actions/setup-mssql - - name: apt - uses: ./.github/actions/apt-x64 - - name: ./configure - uses: ./.github/actions/configure-x64 - with: - configurationParameters: >- - --enable-debug --disable-zts - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - - name: make install - uses: ./.github/actions/install-linux - - name: Setup - uses: ./.github/actions/setup-x64 - - name: Test File Cache (prime shm) - uses: ./.github/actions/test-linux - with: - runTestsParameters: >- - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - --file-cache-prime - - name: Test File Cache (prime shm, use shm) - uses: ./.github/actions/test-linux - with: - runTestsParameters: >- - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - --file-cache-use - - name: Test File Cache (prime shm, use file) - uses: ./.github/actions/test-linux - with: - runTestsParameters: >- - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - --file-cache-use - -d opcache.file_cache_only=1 - - name: Test File Cache Only (prime) - uses: ./.github/actions/test-linux - with: - runTestsParameters: >- - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - --file-cache-prime - -d opcache.file_cache_only=1 - - name: Test File Cache Only (use) - uses: ./.github/actions/test-linux - with: - runTestsParameters: >- - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - --file-cache-use - -d opcache.file_cache_only=1 - - name: Verify generated files are up to date - uses: ./.github/actions/verify-generated-files - MSAN: - name: MSAN - runs-on: ubuntu-${{ inputs.ubuntu_version }} - steps: - - name: git checkout - uses: actions/checkout@v5 - with: - ref: ${{ inputs.branch }} - - name: apt - uses: ./.github/actions/apt-x64 - - name: ./configure - run: | - export CC=clang - export CXX=clang++ - export CFLAGS="-DZEND_TRACK_ARENA_ALLOC" - ./buildconf --force - # msan requires all used libraries to be instrumented, - # so we should avoiding linking against anything but libc here - ./configure \ - --enable-debug \ - --enable-zts \ - --enable-option-checking=fatal \ - --prefix=/usr \ - --without-sqlite3 \ - --without-pdo-sqlite \ - --without-libxml \ - --disable-dom \ - --disable-simplexml \ - --disable-xml \ - --disable-xmlreader \ - --disable-xmlwriter \ - --without-pcre-jit \ - --disable-opcache-jit \ - --enable-phpdbg \ - --enable-fpm \ - --with-pdo-mysql=mysqlnd \ - --with-mysqli=mysqlnd \ - --disable-mysqlnd-compression-support \ - --without-pear \ - --enable-exif \ - --enable-sysvsem \ - --enable-sysvshm \ - --enable-shmop \ - --enable-pcntl \ - --enable-mbstring \ - --disable-mbregex \ - --enable-sockets \ - --enable-bcmath \ - --enable-calendar \ - --enable-ftp \ - --enable-zend-test \ - --enable-werror \ - --enable-memory-sanitizer \ - --with-config-file-path=/etc \ - --with-config-file-scan-dir=/etc/php.d \ - --enable-dl-test=shared - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - - name: make install - run: | - sudo make install - sudo mkdir -p /etc/php.d - sudo chmod 777 /etc/php.d - echo mysqli.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/mysqli.ini - echo pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/pdo_mysql.ini - - name: Setup - run: | - set -x - sudo service mysql start - mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test" - # Ensure local_infile tests can run. - mysql -uroot -proot -e "SET GLOBAL local_infile = true" - sudo locale-gen de_DE - - name: Test - uses: ./.github/actions/test-linux - with: - runTestsParameters: >- - --msan - - name: Test Opcache - uses: ./.github/actions/test-linux - with: - runTestsParameters: >- - --msan - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - name: Verify generated files are up to date - uses: ./.github/actions/verify-generated-files - LIBMYSQLCLIENT: - name: LIBMYSQLCLIENT - runs-on: ubuntu-${{ inputs.ubuntu_version }} - steps: - - name: git checkout - uses: actions/checkout@v5 - with: - ref: ${{ inputs.branch }} - - name: apt - run: | - sudo apt-get update -y | true - sudo apt install bison re2c - - name: Setup - run: | - sudo service mysql start - mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test" - # Ensure local_infile tests can run. - mysql -uroot -proot -e "SET GLOBAL local_infile = true" - - name: Build mysql-8.0 - uses: ./.github/actions/build-libmysqlclient - with: - configurationParameters: ${{ !inputs.libmysqlclient_with_mysqli && '--enable-werror' || '' }} - libmysql: mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz - withMysqli: ${{ inputs.libmysqlclient_with_mysqli }} - - name: Test mysql-8.0 - uses: ./.github/actions/test-libmysqlclient - with: - withMysqli: ${{ inputs.libmysqlclient_with_mysqli }} - - name: Build mysql-8.4 - if: ${{ !inputs.libmysqlclient_with_mysqli }} - uses: ./.github/actions/build-libmysqlclient - with: - configurationParameters: ${{ !inputs.libmysqlclient_with_mysqli && '--enable-werror' || '' }} - libmysql: mysql-8.4.0-linux-glibc2.28-x86_64.tar.xz - withMysqli: ${{ inputs.libmysqlclient_with_mysqli }} - - name: Test mysql-8.4 - if: ${{ !inputs.libmysqlclient_with_mysqli }} - uses: ./.github/actions/test-libmysqlclient - with: - withMysqli: ${{ inputs.libmysqlclient_with_mysqli }} - - name: Verify generated files are up to date - uses: ./.github/actions/verify-generated-files - PECL: - if: inputs.branch == 'master' - runs-on: ubuntu-22.04 - env: - CC: ccache gcc - CXX: ccache g++ - steps: - - name: git checkout PHP - uses: actions/checkout@v5 - with: - path: php - ref: ${{ inputs.branch }} - - name: git checkout apcu - uses: actions/checkout@v5 - with: - repository: krakjoe/apcu - path: apcu - - name: git checkout imagick - uses: actions/checkout@v5 - with: - repository: Imagick/imagick - path: imagick - - name: git checkout memcached - uses: actions/checkout@v5 - with: - repository: php-memcached-dev/php-memcached - path: memcached - - name: git checkout redis - uses: actions/checkout@v5 - with: - repository: phpredis/phpredis - path: redis - - name: git checkout xdebug - if: false - uses: actions/checkout@v5 - with: - repository: xdebug/xdebug - path: xdebug - - name: git checkout yaml - uses: actions/checkout@v5 - with: - repository: php/pecl-file_formats-yaml - path: yaml - - name: apt - run: | - sudo apt-get update - sudo apt-get install -y --no-install-recommends \ - ccache \ - libmemcached-dev \ - bison \ - re2c - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: "${{github.job}}-${{hashFiles('php/main/php_version.h')}}" - append-timestamp: false - save: ${{ github.event_name != 'pull_request' }} - - name: build PHP - run: | - cd php - ./buildconf --force - ./configure \ - --enable-option-checking=fatal \ - --prefix=/opt/php \ - --enable-cli \ - --disable-all \ - --enable-session \ - --enable-werror - make -j$(/usr/bin/nproc) - sudo make install - - name: build apcu - run: | - cd apcu - /opt/php/bin/phpize - ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config - make -j$(/usr/bin/nproc) - - name: build imagick - run: | - cd imagick - /opt/php/bin/phpize - ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config - make -j$(/usr/bin/nproc) - - name: build memcached - run: | - cd memcached - /opt/php/bin/phpize - ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config - make -j$(/usr/bin/nproc) - - name: build redis - run: | - cd redis - /opt/php/bin/phpize - ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config - make -j$(/usr/bin/nproc) - - name: build xdebug - if: false - run: | - cd xdebug - /opt/php/bin/phpize - ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config - make -j$(/usr/bin/nproc) - - name: build yaml - run: | - cd yaml - /opt/php/bin/phpize - ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config - make -j$(/usr/bin/nproc) - WINDOWS: - strategy: - fail-fast: false - matrix: - include: - - x64: true - zts: true - opcache: true - asan: false - - x64: false - zts: false - opcache: false - asan: false - - x64: true - zts: true - opcache: true - asan: true - branch: 'master' - timeout: 120 - name: "WINDOWS_${{ matrix.x64 && 'X64' || 'X86' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}${{ matrix.asan && '_ASAN' || ''}}" - runs-on: windows-${{ inputs.windows_version }} - env: - PHP_BUILD_CACHE_BASE_DIR: C:\build-cache - PHP_BUILD_OBJ_DIR: C:\obj - PHP_BUILD_CACHE_SDK_DIR: C:\build-cache\sdk - PHP_BUILD_SDK_BRANCH: php-sdk-2.3.0 - PHP_BUILD_CRT: ${{ inputs.vs_crt_version }} - PLATFORM: ${{ matrix.x64 && 'x64' || 'x86' }} - THREAD_SAFE: "${{ matrix.zts && '1' || '0' }}" - INTRINSICS: "${{ matrix.zts && 'AVX2' || '' }}" - PARALLEL: -j2 - OPCACHE: "${{ matrix.opcache && '1' || '0' }}" - ASAN: "${{ matrix.asan && '1' || '0' }}" - steps: - - name: git config - run: git config --global core.autocrlf false && git config --global core.eol lf - - name: git checkout - uses: actions/checkout@v5 - with: - ref: ${{ inputs.branch }} - - name: Setup - uses: ./.github/actions/setup-windows - - name: Build - run: .github/scripts/windows/build.bat - - name: Test - run: .github/scripts/windows/test.bat - FREEBSD: - strategy: - fail-fast: false - matrix: - zts: [true, false] - exclude: - - zts: ${{ !inputs.run_freebsd_zts && true || '*never*' }} - name: "FREEBSD_${{ matrix.zts && 'ZTS' || 'NTS' }}" - runs-on: ubuntu-latest - timeout-minutes: 50 - steps: - - name: git checkout - uses: actions/checkout@v5 - with: - ref: ${{ inputs.branch }} - - name: FreeBSD - uses: ./.github/actions/freebsd - with: - configurationParameters: >- - --${{ matrix.zts && 'enable' || 'disable' }}-zts - runExtraTests: true diff -Nru php8.4-8.4.16/.github/workflows/push.yml php8.4-8.4.21/.github/workflows/push.yml --- php8.4-8.4.16/.github/workflows/push.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/workflows/push.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,406 +0,0 @@ -name: Push -on: - push: - paths-ignore: - - docs/** - - NEWS - - UPGRADING - - UPGRADING.INTERNALS - - '**/README.*' - - CONTRIBUTING.md - - CODING_STANDARDS.md - - .cirrus.yml - - .circleci/** - branches: - - PHP-8.1 - - PHP-8.2 - - PHP-8.3 - - PHP-8.4 - - master - pull_request: - paths-ignore: - - docs/** - - NEWS - - UPGRADING - - UPGRADING.INTERNALS - - '**/README.*' - - CONTRIBUTING.md - - CODING_STANDARDS.md - - .cirrus.yml - - .circleci/** - branches: - - '**' - workflow_dispatch: ~ -permissions: - contents: read -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.url || github.run_id }} - cancel-in-progress: true -env: - CC: ccache gcc - CXX: ccache g++ -jobs: - ALPINE: - if: github.repository == 'php/php-src' || github.event_name == 'pull_request' - name: ALPINE_X64_ASAN_UBSAN_DEBUG_ZTS - runs-on: ubuntu-24.04 - container: - image: 'alpine:3.22' - steps: - - name: git checkout - uses: actions/checkout@v5 - - name: apk - uses: ./.github/actions/apk - - name: System info - run: | - echo "::group::Show host CPU info" - lscpu - echo "::endgroup::" - echo "::group::Show installed package versions" - apk list - echo "::endgroup::" - - name: ./configure - uses: ./.github/actions/configure-alpine - with: - configurationParameters: >- - CFLAGS="-fsanitize=undefined,address -fno-sanitize=function -DZEND_TRACK_ARENA_ALLOC" - LDFLAGS="-fsanitize=undefined,address -fno-sanitize=function" - CC=clang-20 - CXX=clang++-20 - --enable-debug - --enable-zts - skipSlow: true # FIXME: This should likely include slow extensions - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - - name: make install - uses: ./.github/actions/install-alpine - - name: Test Tracing JIT - uses: ./.github/actions/test-alpine - with: - jitType: tracing - runTestsParameters: >- - --asan -x - -d opcache.enable_cli=1 - LINUX_X64: - if: github.repository == 'php/php-src' || github.event_name == 'pull_request' - services: - mysql: - image: mysql:8.3 - ports: - - 3306:3306 - env: - MYSQL_DATABASE: test - MYSQL_ROOT_PASSWORD: root - postgres: - image: postgres - ports: - - 5432:5432 - env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: test - firebird: - image: jacobalberty/firebird - ports: - - 3050:3050 - env: - ISC_PASSWORD: test - FIREBIRD_DATABASE: test.fdb - FIREBIRD_USER: test - FIREBIRD_PASSWORD: test - strategy: - fail-fast: false - matrix: - include: - - debug: false - zts: false - asan: false - - debug: true - zts: true - asan: true - name: "LINUX_X64_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}${{ matrix.asan && '_ASAN' || '' }}" - runs-on: ubuntu-${{ !matrix.asan && '22' || '24' }}.04 - steps: - - name: git checkout - uses: actions/checkout@v5 - - name: apt - uses: ./.github/actions/apt-x64 - - name: System info - run: | - echo "::group::Show host CPU info" - lscpu - echo "::endgroup::" - echo "::group::Show installed package versions" - dpkg -l - echo "::endgroup::" - - name: Create MSSQL container - if: ${{ !matrix.asan }} - uses: ./.github/actions/setup-mssql - - name: Setup Caddy server - uses: ./.github/actions/setup-caddy - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - # This duplicates the "job.name" expression above because - # GitHub has no way to query the job name (github.job is the - # job id, not the job name) - key: "LINUX_X64_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}${{ matrix.asan && '_ASAN' || '' }}-${{hashFiles('main/php_version.h')}}" - append-timestamp: false - save: ${{ github.event_name != 'pull_request' }} - - name: ./configure - uses: ./.github/actions/configure-x64 - with: - configurationParameters: >- - --${{ matrix.debug && 'enable' || 'disable' }}-debug - --${{ matrix.zts && 'enable' || 'disable' }}-zts - ${{ matrix.asan && 'CFLAGS="-fsanitize=undefined,address -fno-sanitize=function -DZEND_TRACK_ARENA_ALLOC" LDFLAGS="-fsanitize=undefined,address -fno-sanitize=function" CC=clang CXX=clang++' || '' }} - skipSlow: ${{ matrix.asan }} - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - - name: make install - uses: ./.github/actions/install-linux - - name: Setup - if: ${{ !matrix.asan }} - uses: ./.github/actions/setup-x64 - - name: Test - if: matrix.asan == false - uses: ./.github/actions/test-linux - - name: Test Tracing JIT - uses: ./.github/actions/test-linux - with: - jitType: tracing - runTestsParameters: >- - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - ${{ matrix.asan && '--asan -x' || '' }} - - name: Verify generated files are up to date - if: ${{ !matrix.asan }} - uses: ./.github/actions/verify-generated-files - LINUX_X32: - if: github.repository == 'php/php-src' || github.event_name == 'pull_request' - name: LINUX_X32_DEBUG_ZTS - runs-on: ubuntu-latest - container: - image: ubuntu:22.04 - env: - MYSQL_TEST_HOST: mysql - PDO_MYSQL_TEST_DSN: mysql:host=mysql;dbname=test - PDO_MYSQL_TEST_HOST: mysql - services: - mysql: - image: mysql:8.3 - ports: - - 3306:3306 - env: - MYSQL_DATABASE: test - MYSQL_ROOT_PASSWORD: root - steps: - - name: git checkout - uses: actions/checkout@v5 - - name: apt - uses: ./.github/actions/apt-x32 - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: "${{github.job}}-${{hashFiles('main/php_version.h')}}" - append-timestamp: false - save: ${{ github.event_name != 'pull_request' }} - - name: ./configure - uses: ./.github/actions/configure-x32 - with: - configurationParameters: >- - --enable-debug - --enable-zts - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - - name: make install - uses: ./.github/actions/install-linux-x32 - - name: Test Tracing JIT - uses: ./.github/actions/test-linux - with: - jitType: tracing - runTestsParameters: >- - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - MACOS_DEBUG_NTS: - if: github.repository == 'php/php-src' || github.event_name == 'pull_request' - strategy: - fail-fast: false - matrix: - include: - - os: 14 - arch: ARM64 - name: MACOS_${{ matrix.arch }}_DEBUG_NTS - runs-on: macos-${{ matrix.os }} - steps: - - name: git checkout - uses: actions/checkout@v5 - - name: brew - uses: ./.github/actions/brew - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: "${{github.job}}-${{matrix.os}}-${{hashFiles('main/php_version.h')}}" - append-timestamp: false - save: ${{ github.event_name != 'pull_request' }} - - name: ./configure - uses: ./.github/actions/configure-macos - with: - configurationParameters: --enable-debug --disable-zts - - name: make - run: |- - export PATH="$(brew --prefix)/opt/bison/bin:$PATH" - make -j$(sysctl -n hw.logicalcpu) >/dev/null - - name: make install - run: sudo make install - - name: Test Tracing JIT - uses: ./.github/actions/test-macos - with: - jitType: tracing - runTestsParameters: >- - -d zend_extension=opcache.so - -d opcache.enable_cli=1 - - name: Verify generated files are up to date - uses: ./.github/actions/verify-generated-files - WINDOWS: - if: github.repository == 'php/php-src' || github.event_name == 'pull_request' - name: WINDOWS_X64_ZTS - runs-on: windows-2022 - env: - PHP_BUILD_CACHE_BASE_DIR: C:\build-cache - PHP_BUILD_OBJ_DIR: C:\obj - PHP_BUILD_CACHE_SDK_DIR: C:\build-cache\sdk - PHP_BUILD_SDK_BRANCH: php-sdk-2.3.0 - PHP_BUILD_CRT: vs17 - PLATFORM: x64 - THREAD_SAFE: "1" - INTRINSICS: AVX2 - PARALLEL: -j2 - OPCACHE: "1" - steps: - - name: git config - run: git config --global core.autocrlf false && git config --global core.eol lf - - name: git checkout - uses: actions/checkout@v5 - - name: Setup - uses: ./.github/actions/setup-windows - - name: Build - run: .github/scripts/windows/build.bat - - name: Test - run: .github/scripts/windows/test.bat - BENCHMARKING: - name: BENCHMARKING - if: github.repository == 'php/php-src' || github.event_name == 'pull_request' - runs-on: ubuntu-22.04 - steps: - - name: git checkout - uses: actions/checkout@v5 - with: - fetch-depth: 0 - # ASLR can cause a lot of noise due to missed sse opportunities for memcpy - # and other operations, so we disable it during benchmarking. - - name: Disable ASLR - run: echo 0 | sudo tee /proc/sys/kernel/randomize_va_space - - name: apt - run: | - set -x - sudo apt-get update - sudo apt-get install \ - bison \ - libgmp-dev \ - libonig-dev \ - libsqlite3-dev \ - openssl \ - re2c \ - valgrind - - name: ccache - uses: hendrikmuhs/ccache-action@v1.2 - with: - key: "${{github.job}}-${{hashFiles('main/php_version.h')}}" - append-timestamp: false - save: ${{ github.event_name != 'pull_request' }} - - name: ./configure - run: | - set -x - ./buildconf --force - ./configure \ - --disable-debug \ - --enable-mbstring \ - --enable-opcache \ - --enable-option-checking=fatal \ - --enable-sockets \ - --enable-werror \ - --prefix=/usr \ - --with-config-file-scan-dir=/etc/php.d \ - --with-gmp \ - --with-mysqli=mysqlnd \ - --with-openssl \ - --with-pdo-sqlite \ - --with-valgrind - - name: make - run: make -j$(/usr/bin/nproc) >/dev/null - - name: make install - run: | - set -x - sudo make install - sudo mkdir -p /etc/php.d - sudo chmod 777 /etc/php.d - echo mysqli.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/mysqli.ini - echo zend_extension=opcache.so >> /etc/php.d/opcache.ini - echo opcache.enable=1 >> /etc/php.d/opcache.ini - echo opcache.enable_cli=1 >> /etc/php.d/opcache.ini - - name: Setup - run: | - git config --global user.name "Benchmark" - git config --global user.email "benchmark@php.net" - sudo service mysql start - mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS wordpress" - mysql -uroot -proot -e "CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'wordpress'; FLUSH PRIVILEGES;" - mysql -uroot -proot -e "GRANT ALL PRIVILEGES ON *.* TO 'wordpress'@'localhost' WITH GRANT OPTION;" - - name: git checkout benchmarking-data - uses: actions/checkout@v5 - with: - repository: php/benchmarking-data - ssh-key: ${{ secrets.BENCHMARKING_DATA_DEPLOY_KEY }} - path: benchmark/repos/data - - name: Benchmark - run: php benchmark/benchmark.php true - - name: Store result - if: github.event_name == 'push' - run: | - set -x - cd benchmark/repos/data - git pull --autostash - if [ -e ".git/MERGE_HEAD" ]; then - echo "Merging, can't proceed" - exit 1 - fi - git add . - if git diff --cached --quiet; then - exit 0 - fi - git commit -m "Add result for ${{ github.repository }}@${{ github.sha }}" - git push - - name: Show diff - if: github.event_name == 'pull_request' - run: |- - set -x - php benchmark/generate_diff.php \ - ${{ github.sha }} \ - $(git merge-base ${{ github.event.pull_request.base.sha }} ${{ github.sha }}) \ - > $GITHUB_STEP_SUMMARY - - uses: actions/upload-artifact@v4 - with: - name: profiles - path: ${{ github.workspace }}/benchmark/profiles - retention-days: 30 - FREEBSD: - if: github.repository == 'php/php-src' || github.event_name == 'pull_request' - name: FREEBSD - runs-on: ubuntu-latest - timeout-minutes: 50 - steps: - - name: git checkout - uses: actions/checkout@v5 - - name: FreeBSD - uses: ./.github/actions/freebsd diff -Nru php8.4-8.4.16/.github/workflows/root.yml php8.4-8.4.21/.github/workflows/root.yml --- php8.4-8.4.16/.github/workflows/root.yml 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/.github/workflows/root.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -name: Nightly -on: - schedule: - - cron: "0 1 * * *" - workflow_dispatch: ~ -permissions: - contents: read -jobs: - GENERATE_MATRIX: - name: Generate Matrix - if: github.repository == 'php/php-src' || github.event_name == 'workflow_dispatch' - runs-on: ubuntu-latest - outputs: - branches: ${{ steps.set-matrix.outputs.branches }} - steps: - - uses: actions/checkout@v5 - with: - # Set fetch-depth to 0 to clone the full repository - # including all branches. This is required to find - # the correct commit hashes. - fetch-depth: 0 - - name: Grab the commit mapping - uses: actions/cache@v4 - with: - path: branch-commit-cache.json - # The cache key needs to change every time for the - # cache to be updated after this job finishes. - key: nightly-${{ github.run_id }}-${{ github.run_attempt }} - restore-keys: | - nightly- - - name: Generate Matrix - id: set-matrix - run: php .github/nightly_matrix.php "${{ github.event_name }}" "${{ github.run_attempt }}" "${{ github.head_ref || github.ref_name }}" - NIGHTLY: - needs: GENERATE_MATRIX - name: ${{ matrix.branch.ref }} - if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} - uses: ./.github/workflows/nightly.yml - strategy: - fail-fast: false - matrix: - branch: ${{ fromJson(needs.GENERATE_MATRIX.outputs.branches) }} - with: - asan_ubuntu_version: ${{ - (((matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 5) || matrix.branch.version[0] >= 9) && '24.04') - || '22.04' }} - branch: ${{ matrix.branch.ref }} - community_verify_type_inference: ${{ (matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 4) || matrix.branch.version[0] >= 9 }} - libmysqlclient_with_mysqli: ${{ (matrix.branch.version[0] == 8 && matrix.branch.version[1] == 1) }} - run_alpine: ${{ (matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 4) || matrix.branch.version[0] >= 9 }} - run_linux_ppc64: ${{ (matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 4) || matrix.branch.version[0] >= 9 }} - run_macos_arm64: ${{ (matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 4) || matrix.branch.version[0] >= 9 }} - run_freebsd_zts: ${{ (matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 3) || matrix.branch.version[0] >= 9 }} - ubuntu_version: ${{ - (((matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 5) || matrix.branch.version[0] >= 9) && '24.04') - || '22.04' }} - windows_version: '2022' - vs_crt_version: ${{ ((matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 4) && 'vs17') || 'vs16' }} - skip_laravel: ${{ matrix.branch.version[0] == 8 && matrix.branch.version[1] == 1 }} - symfony_version: ${{ (((matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 4) || matrix.branch.version[0] >= 9) && '8.1') - || ((matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 2) && '7.4') - || '' }} - skip_wordpress: ${{ matrix.branch.version[0] == 8 && matrix.branch.version[1] == 1 }} - variation_enable_zend_max_execution_timers: ${{ (matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 3) || matrix.branch.version[0] >= 9 }} - secrets: inherit diff -Nru php8.4-8.4.16/.github/workflows/test-suite.yml php8.4-8.4.21/.github/workflows/test-suite.yml --- php8.4-8.4.16/.github/workflows/test-suite.yml 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/.github/workflows/test-suite.yml 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,1109 @@ +name: Test suite +on: + workflow_call: + inputs: + all_variations: + required: true + type: boolean + branch: + required: true + type: string +permissions: + contents: read +jobs: + LINUX_PPC64: + if: ${{ fromJson(inputs.branch).jobs.LINUX_PPC64 }} + name: LINUX_PPC64_ASAN_DEBUG_ZTS + # This runs on a self-hosted runner; see https://wiki.php.net/systems/ci + runs-on: [self-hosted, gentoo, ppc64] + steps: + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: System info + run: | + echo "::group::Show host CPU info" + lscpu + echo "::endgroup::" + echo "::group::Show installed packages" + cat /var/lib/portage/world + echo "::endgroup::" + - name: ./configure + uses: ./.github/actions/configure-gentoo + with: + configurationParameters: >- + CFLAGS="-fsanitize=undefined,address -fno-sanitize=function -DZEND_TRACK_ARENA_ALLOC" + LDFLAGS="-fsanitize=undefined,address -fno-sanitize=function" + CC=clang-17 + CXX=clang++-17 + --enable-debug + --enable-zts + skipSlow: false # FIXME: This should likely include slow extensions + - name: make + run: make -j$(/usr/bin/nproc) >/dev/null + # Skip an install action for now + - name: Tests + uses: ./.github/actions/test-gentoo + # There is no PPC JIT, so rip this out + with: + runTestsParameters: >- + --asan -x + - name: Extra tests + uses: ./.github/actions/extra-tests + ALPINE: + if: ${{ fromJson(inputs.branch).jobs.ALPINE }} + name: ALPINE_X64_ASAN_DEBUG_ZTS + runs-on: ubuntu-24.04 + container: + image: 'alpine:3.22' + steps: + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: apk + uses: ./.github/actions/apk + - name: System info + run: | + echo "::group::Show host CPU info" + lscpu + echo "::endgroup::" + echo "::group::Show installed package versions" + apk list + echo "::endgroup::" + - name: ccache + uses: ./.github/actions/ccache + with: + name: "${{ github.job }}" + cc: clang-20 + cxx: clang++-20 + - name: ./configure + uses: ./.github/actions/configure-alpine + with: + configurationParameters: >- + CFLAGS="-fsanitize=undefined,address -fno-sanitize=function -DZEND_TRACK_ARENA_ALLOC" + LDFLAGS="-fsanitize=undefined,address -fno-sanitize=function" + --enable-debug + --enable-zts + skipSlow: true # FIXME: This should likely include slow extensions + - name: make + run: make -j$(/usr/bin/nproc) >/dev/null + - name: make install + uses: ./.github/actions/install-alpine + - name: Test Tracing JIT + uses: ./.github/actions/test-alpine + with: + enableOpcache: true + jitType: tracing + runTestsParameters: >- + --asan -x + - name: Extra tests + uses: ./.github/actions/extra-tests + LINUX_X64: + if: ${{ fromJson(inputs.branch).jobs.LINUX_X64 }} + services: + mysql: + image: mysql:8.4 + ports: + - 3306:3306 + env: + MYSQL_DATABASE: test + MYSQL_ROOT_PASSWORD: root + postgres: + image: postgres + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: test + firebird: + image: jacobalberty/firebird + ports: + - 3050:3050 + env: + ISC_PASSWORD: test + FIREBIRD_DATABASE: test.fdb + FIREBIRD_USER: test + FIREBIRD_PASSWORD: test + strategy: + fail-fast: false + matrix: ${{ fromJson(inputs.branch).jobs.LINUX_X64.matrix }} + name: "LINUX_X64${{ matrix.name }}_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" + runs-on: ubuntu-${{ fromJson(inputs.branch).config.ubuntu_version }} + steps: + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: Create MSSQL container + uses: ./.github/actions/setup-mssql + - name: apt + uses: ./.github/actions/apt-x64 + with: + asan: ${{ matrix.asan && 'true' || 'false' }} + - name: System info + run: | + echo "::group::Show host CPU info" + lscpu + echo "::endgroup::" + echo "::group::Show installed package versions" + dpkg -l + echo "::endgroup::" + - name: Setup Caddy server + uses: ./.github/actions/setup-caddy + - name: ccache + uses: ./.github/actions/ccache + with: + # This duplicates the "job.name" expression above because + # GitHub has no way to query the job name (github.job is the + # job id, not the job name) + name: "LINUX_X64${{ matrix.name }}_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" + - name: ./configure + uses: ./.github/actions/configure-x64 + with: + configurationParameters: >- + ${{ matrix.asan && 'CFLAGS="-fsanitize=undefined,address -DZEND_TRACK_ARENA_ALLOC" LDFLAGS="-fsanitize=undefined,address"' || '' }} + ${{ matrix.variation && 'CFLAGS="-DZEND_RC_DEBUG=1 -DPROFITABILITY_CHECKS=0 -DZEND_VERIFY_FUNC_INFO=1 -DZEND_VERIFY_TYPE_INFERENCE"' || '' }} + ${{ (matrix.variation && fromJson(inputs.branch).jobs.LINUX_X64.config.variation_enable_zend_max_execution_timers) && '--enable-zend-max-execution-timers' || '' }} + --${{ matrix.debug && 'enable' || 'disable' }}-debug + ${{ matrix.debug && 'CXXFLAGS="-D_GLIBCXX_ASSERTIONS"' || '' }} + --${{ matrix.zts && 'enable' || 'disable' }}-zts + asan: ${{ matrix.asan && 'true' || 'false' }} + skipSlow: ${{ (matrix.asan && !inputs.all_variations) && 'true' || 'false' }} + - name: make + run: make -j$(/usr/bin/nproc) >/dev/null + - name: make install + uses: ./.github/actions/install-linux + - name: Setup + if: ${{ !matrix.asan || inputs.all_variations }} + uses: ./.github/actions/setup-x64 + - name: Test + if: ${{ inputs.all_variations || !matrix.asan }} + uses: ./.github/actions/test-linux + with: + runTestsParameters: >- + ${{ matrix.asan && '--asan' || '' }} + ${{ matrix.repeat && '--repeat 2' || '' }} + ${{ matrix.variation && '-d zend_test.observer.enabled=1 -d zend_test.observer.show_output=0' || '' }} + idleCpu: ${{ matrix.asan && 'true' || 'false' }} + - name: Test Tracing JIT + if: ${{ inputs.all_variations || matrix.asan }} + uses: ./.github/actions/test-linux + with: + enableOpcache: true + jitType: tracing + runTestsParameters: >- + ${{ matrix.asan && '--asan' || '' }} + ${{ (matrix.asan && !inputs.all_variations) && '-x' || '' }} + ${{ matrix.repeat && '--repeat 2' || '' }} + ${{ matrix.variation && '-d zend_test.observer.enabled=1 -d zend_test.observer.show_output=0' || '' }} + - name: Test OpCache + if: ${{ inputs.all_variations }} + uses: ./.github/actions/test-linux + with: + enableOpcache: true + runTestsParameters: >- + ${{ matrix.asan && '--asan' || '' }} + ${{ matrix.repeat && '--repeat 2' || '' }} + ${{ matrix.variation && '-d zend_test.observer.enabled=1 -d zend_test.observer.show_output=0' || '' }} + - name: Test Function JIT + # ASAN frequently timeouts. Each test run takes ~90 minutes, we can + # avoid running into the 6 hour timeout by skipping the function JIT. + if: ${{ !matrix.asan }} + uses: ./.github/actions/test-linux + with: + enableOpcache: true + jitType: function + runTestsParameters: >- + ${{ matrix.repeat && '--repeat 2' || '' }} + ${{ matrix.variation && '-d zend_test.observer.enabled=1 -d zend_test.observer.show_output=0' || '' }} + - name: Extra tests + uses: ./.github/actions/extra-tests + - name: Verify generated files are up to date + uses: ./.github/actions/verify-generated-files + LINUX_X32: + if: ${{ fromJson(inputs.branch).jobs.LINUX_X32 }} + strategy: + fail-fast: false + matrix: ${{ fromJson(inputs.branch).jobs.LINUX_X32.matrix }} + name: "LINUX_X32_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" + runs-on: ubuntu-latest + container: + image: ubuntu:${{ fromJson(inputs.branch).config.ubuntu_version }} + env: + MYSQL_TEST_HOST: mysql + PDO_MYSQL_TEST_DSN: mysql:host=mysql;dbname=test + PDO_MYSQL_TEST_HOST: mysql + PDO_FIREBIRD_TEST_DSN: firebird:dbname=firebird:test.fdb + services: + mysql: + image: mysql:8.4 + ports: + - 3306:3306 + env: + MYSQL_DATABASE: test + MYSQL_ROOT_PASSWORD: root + firebird: + image: jacobalberty/firebird + ports: + - 3050:3050 + env: + ISC_PASSWORD: test + FIREBIRD_DATABASE: test.fdb + FIREBIRD_USER: test + FIREBIRD_PASSWORD: test + steps: + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: apt + uses: ./.github/actions/apt-x32 + - name: ccache + uses: ./.github/actions/ccache + with: + name: "LINUX_X32_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" + - name: System info + run: | + echo "::group::Show host CPU info" + lscpu + echo "::endgroup::" + echo "::group::Show installed package versions" + dpkg -l + echo "::endgroup::" + - name: ./configure + uses: ./.github/actions/configure-x32 + with: + configurationParameters: >- + --${{ matrix.debug && 'enable' || 'disable' }}-debug + --${{ matrix.zts && 'enable' || 'disable' }}-zts + - name: make + run: make -j$(/usr/bin/nproc) >/dev/null + - name: make install + uses: ./.github/actions/install-linux-x32 + - name: Test + if: ${{ inputs.all_variations }} + uses: ./.github/actions/test-linux + - name: Test Tracing JIT + uses: ./.github/actions/test-linux + with: + enableOpcache: true + jitType: tracing + - name: Test OpCache + if: ${{ inputs.all_variations }} + uses: ./.github/actions/test-linux + with: + enableOpcache: true + - name: Test Function JIT + if: ${{ inputs.all_variations }} + uses: ./.github/actions/test-linux + with: + enableOpcache: true + jitType: function + - name: Extra tests + uses: ./.github/actions/extra-tests + MACOS: + if: ${{ fromJson(inputs.branch).jobs.MACOS }} + strategy: + fail-fast: false + matrix: ${{ fromJson(inputs.branch).jobs.MACOS.matrix }} + name: "MACOS_${{ matrix.arch }}_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" + runs-on: macos-${{ matrix.arch == 'X64' && '15-intel' || fromJson(inputs.branch).jobs.MACOS.config.arm64_version }} + steps: + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: Update clang + timeout-minutes: 10 + uses: ./.github/actions/macos-update-clang + - name: brew + timeout-minutes: 10 + uses: ./.github/actions/brew + - name: ccache + uses: ./.github/actions/ccache + with: + name: "MACOS_${{ matrix.arch }}_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}" + - name: ./configure + uses: ./.github/actions/configure-macos + with: + configurationParameters: >- + --${{ matrix.debug && 'enable' || 'disable' }}-debug + --${{ matrix.zts && 'enable' || 'disable' }}-zts + - name: make + run: |- + export PATH="$(brew --prefix)/opt/bison/bin:$PATH" + make -j$(sysctl -n hw.logicalcpu) >/dev/null + - name: make install + run: sudo make install + - name: Test + if: ${{ inputs.all_variations }} + uses: ./.github/actions/test-macos + - name: Test Tracing JIT + if: ${{ matrix.arch == 'X64' || !matrix.zts }} + uses: ./.github/actions/test-macos + with: + enableOpcache: true + jitType: tracing + - name: Test OpCache + if: ${{ inputs.all_variations || (matrix.arch == 'ARM64' && matrix.zts) }} + uses: ./.github/actions/test-macos + with: + enableOpcache: true + - name: Test Function JIT + if: ${{ inputs.all_variations && (matrix.arch == 'X64' || !matrix.zts) }} + uses: ./.github/actions/test-macos + with: + enableOpcache: true + jitType: function + - name: Extra tests + uses: ./.github/actions/extra-tests + - name: Verify generated files are up to date + uses: ./.github/actions/verify-generated-files + COVERAGE: + if: ${{ fromJson(inputs.branch).jobs.COVERAGE }} + services: + mysql: + image: mysql:8.4 + ports: + - 3306:3306 + env: + MYSQL_DATABASE: test + MYSQL_ROOT_PASSWORD: root + postgres: + image: postgres + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: test + firebird: + image: jacobalberty/firebird + ports: + - 3050:3050 + env: + ISC_PASSWORD: test + FIREBIRD_DATABASE: test.fdb + FIREBIRD_USER: test + FIREBIRD_PASSWORD: test + runs-on: ubuntu-24.04 + steps: + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: Create MSSQL container + uses: ./.github/actions/setup-mssql + - name: apt + uses: ./.github/actions/apt-x64 + - name: Install gcovr + run: sudo -H pip install gcovr + - name: ./configure + uses: ./.github/actions/configure-x64 + with: + configurationParameters: --enable-debug --disable-zts --enable-gcov + - name: make + run: make -j$(/usr/bin/nproc) >/dev/null + - name: make install + uses: ./.github/actions/install-linux + - name: Setup + uses: ./.github/actions/setup-x64 + # We only test with OpCache, the difference in coverage is negligible + - name: Test OpCache + uses: ./.github/actions/test-linux + with: + enableOpcache: true + jitType: tracing + - name: Generate coverage report + if: ${{ !cancelled() }} + run: make gcovr-xml + - uses: codecov/codecov-action@v6 + if: ${{ !cancelled() }} + with: + disable_search: true + fail_ci_if_error: true + files: gcovr.xml + token: ${{ secrets.CODECOV_TOKEN }} + verbose: true + COMMUNITY: + if: ${{ fromJson(inputs.branch).jobs.COMMUNITY }} + strategy: + fail-fast: false + matrix: ${{ fromJson(inputs.branch).jobs.COMMUNITY.matrix }} + name: "COMMUNITY_${{ matrix.type }}" + runs-on: ubuntu-${{ fromJson(inputs.branch).config.ubuntu_version }} + env: + ASAN_OPTIONS: exitcode=139 + UBSAN_OPTIONS: print_stacktrace=1 + USE_ZEND_ALLOC: 0 + USE_TRACKED_ALLOC: 1 + steps: + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: apt + uses: ./.github/actions/apt-x64 + - name: ccache + uses: ./.github/actions/ccache + with: + name: "COMMUNITY_${{ matrix.type }}" + - name: ./configure + uses: ./.github/actions/configure-x64 + with: + # CFLAGS removes O2, so we have to add it again... + configurationParameters: >- + --enable-zts + ${{ matrix.type == 'asan' && '--enable-debug CFLAGS="-fsanitize=undefined,address -fno-sanitize-recover -DZEND_TRACK_ARENA_ALLOC" LDFLAGS="-fsanitize=undefined,address"' || '' }} + ${{ matrix.type == 'verify_type_inference' && 'CFLAGS="-DZEND_VERIFY_TYPE_INFERENCE -O2"' || '' }} + - name: make + run: make -j$(/usr/bin/nproc) >/dev/null + - name: make install + uses: ./.github/actions/install-linux + - name: Setup + run: | + sudo service mysql start + mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test" + mysql -uroot -proot -e "SET GLOBAL local_infile = true" + - name: Enable Opcache + run: | + echo memory_limit=-1 >> /etc/php.d/opcache.ini + echo opcache.enable_cli=1 >> /etc/php.d/opcache.ini + echo opcache.enable=1 >> /etc/php.d/opcache.ini + echo opcache.protect_memory=1 >> /etc/php.d/opcache.ini + echo opcache.memory_consumption=256M >> /etc/php.d/opcache.ini + echo opcache.file_update_protection=0 >> /etc/php.d/opcache.ini + echo opcache.interned_strings_buffer=64 >> /etc/php.d/opcache.ini + echo opcache.max_accelerated_files=100000 >> /etc/php.d/opcache.ini + - name: Enable JIT + if: ${{ matrix.type != 'verify_type_inference' }} + run: | + echo opcache.jit=tracing >> /etc/php.d/opcache.ini + echo opcache.jit_buffer_size=1G >> /etc/php.d/opcache.ini + echo opcache.jit_max_root_traces=100000 >> /etc/php.d/opcache.ini + echo opcache.jit_max_side_traces=100000 >> /etc/php.d/opcache.ini + echo opcache.jit_max_exit_counters=100000 >> /etc/php.d/opcache.ini + echo opcache.jit_hot_loop=1 >> /etc/php.d/opcache.ini + echo opcache.jit_hot_func=1 >> /etc/php.d/opcache.ini + echo opcache.jit_hot_return=1 >> /etc/php.d/opcache.ini + echo opcache.jit_hot_side_exit=1 >> /etc/php.d/opcache.ini + php -v + - name: Test AMPHP + if: ${{ !cancelled() }} + run: | + repositories="amp cache dns file http parallel parser pipeline process serialization socket sync websocket-client websocket-server" + X=0 + for repository in $repositories; do + echo "::group::$repository" + git clone "https://github.com/amphp/$repository.git" "amphp-$repository" --depth 1 + cd "amphp-$repository" + git rev-parse HEAD + php /usr/bin/composer install --no-progress --ignore-platform-req=php+ + EXIT_CODE=0 + vendor/bin/phpunit || EXIT_CODE=$? + echo -e "\n::endgroup::" + if [ ${EXIT_CODE:-0} -gt 128 ]; then + X=1; + echo "Failed" + fi + cd .. + done + exit $X + - name: Test Laravel + if: ${{ !cancelled() }} + run: | + branch=${{ fromJson(inputs.branch).jobs.COMMUNITY.config.laravel_version }} + git clone https://github.com/laravel/framework.git --depth=1 ${branch:+--branch="$branch"} + cd framework + git rev-parse HEAD + php /usr/bin/composer install --no-progress --ignore-platform-req=php+ + # Hack to disable a test that hangs + php -r '$c = file_get_contents("tests/Filesystem/FilesystemTest.php"); $c = str_replace("public function testSharedGet()", "#[\\PHPUnit\\Framework\\Attributes\\Group('"'"'skip'"'"')]\n public function testSharedGet()", $c); file_put_contents("tests/Filesystem/FilesystemTest.php", $c);' + php vendor/bin/phpunit --exclude-group skip || EXIT_CODE=$? + if [ ${EXIT_CODE:-0} -gt 128 ]; then + exit 1 + fi + - name: Test ReactPHP + if: ${{ !cancelled() }} + run: | + repositories="async cache child-process datagram dns event-loop promise promise-stream promise-timer stream" + X=0 + for repository in $repositories; do + echo "::group::$repository" + git clone "https://github.com/reactphp/$repository.git" "reactphp-$repository" --depth 1 + cd "reactphp-$repository" + git rev-parse HEAD + php /usr/bin/composer install --no-progress --ignore-platform-req=php+ + EXIT_CODE=0 + vendor/bin/phpunit || EXIT_CODE=$? + echo -e "\n::endgroup::" + if [ $[EXIT_CODE:-0} -gt 128 ]; then + X=1; + echo "Failed" + fi + cd .. + done + exit $X + - name: Test Revolt PHP + if: ${{ !cancelled() }} + run: | + git clone https://github.com/revoltphp/event-loop.git --depth=1 + cd event-loop + git rev-parse HEAD + php /usr/bin/composer install --no-progress --ignore-platform-req=php+ + vendor/bin/phpunit || EXIT_CODE=$? + if [ ${EXIT_CODE:-0} -gt 128 ]; then + exit 1 + fi + - name: Test Symfony + if: ${{ !cancelled() }} + run: | + branch=${{ fromJson(inputs.branch).jobs.COMMUNITY.config.symfony_version }} + git clone https://github.com/symfony/symfony.git --depth=1 ${branch:+--branch="$branch"} + cd symfony + git rev-parse HEAD + php /usr/bin/composer install --no-progress --ignore-platform-req=php+ + php ./phpunit install + # Test causes a heap-buffer-overflow but I cannot reproduce it locally... + php -r '$c = file_get_contents("src/Symfony/Component/HtmlSanitizer/Tests/HtmlSanitizerCustomTest.php"); $c = str_replace("public function testSanitizeDeepNestedString()", "#[\\PHPUnit\\Framework\\Attributes\\Group('"'"'skip'"'"')]\n public function testSanitizeDeepNestedString()", $c); file_put_contents("src/Symfony/Component/HtmlSanitizer/Tests/HtmlSanitizerCustomTest.php", $c);' + # Buggy FFI test in Symfony, see https://github.com/symfony/symfony/issues/47668 + php -r '$c = file_get_contents("src/Symfony/Component/VarDumper/Tests/Caster/FFICasterTest.php"); $c = str_replace("public function testCastNonTrailingCharPointer()", "#[\\PHPUnit\\Framework\\Attributes\\Group('"'"'skip'"'"')]\n public function testCastNonTrailingCharPointer()", $c); file_put_contents("src/Symfony/Component/VarDumper/Tests/Caster/FFICasterTest.php", $c);' + export SYMFONY_DEPRECATIONS_HELPER=max[total]=999 + X=0 + for component in $(find src/Symfony -mindepth 2 -type f -name phpunit.xml.dist -printf '%h\n'); do + echo "::group::$component" + EXIT_CODE=0 + php ./phpunit $component --exclude-group tty --exclude-group benchmark --exclude-group intl-data --exclude-group transient --exclude-group skip || EXIT_CODE=$? + echo -e "\n::endgroup::" + if [ ${EXIT_CODE:-0} -gt 128 ]; then + X=1; + echo "Failed" + fi + done + exit $X + - name: Test PHPUnit + if: ${{ !cancelled() }} + run: | + git clone https://github.com/sebastianbergmann/phpunit.git --branch=main --depth=1 + cd phpunit + git rev-parse HEAD + php /usr/bin/composer install --no-progress --ignore-platform-req=php+ + php ./phpunit || EXIT_CODE=$? + if [ ${EXIT_CODE:-0} -gt 128 ]; then + exit 1 + fi + - name: 'Symfony Preloading' + # composer create-project will automatically pick the right Symfony version for us. + if: ${{ !cancelled() }} + run: | + php /usr/bin/composer create-project symfony/symfony-demo symfony_demo --no-progress --ignore-platform-req=php+ + cd symfony_demo + git rev-parse HEAD + sed -i 's/PHP_SAPI/"cli-server"/g' var/cache/dev/App_KernelDevDebugContainer.preload.php + php -d opcache.preload=var/cache/dev/App_KernelDevDebugContainer.preload.php public/index.php + - name: Test Wordpress + if: ${{ !cancelled() }} + run: | + git clone https://github.com/WordPress/wordpress-develop.git wordpress --depth=1 + cd wordpress + git rev-parse HEAD + php /usr/bin/composer install --no-progress --ignore-platform-req=php+ + cp wp-tests-config-sample.php wp-tests-config.php + sed -i 's/youremptytestdbnamehere/test/g' wp-tests-config.php + sed -i 's/yourusernamehere/root/g' wp-tests-config.php + sed -i 's/yourpasswordhere/root/g' wp-tests-config.php + php vendor/bin/phpunit || EXIT_CODE=$? + if [ $EXIT_CODE -gt 128 ]; then + exit 1 + fi + OPCACHE_VARIATION: + if: ${{ fromJson(inputs.branch).jobs.OPCACHE_VARIATION }} + services: + mysql: + image: mysql:8.4 + ports: + - 3306:3306 + env: + MYSQL_DATABASE: test + MYSQL_ROOT_PASSWORD: root + postgres: + image: postgres + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: test + firebird: + image: jacobalberty/firebird + ports: + - 3050:3050 + env: + ISC_PASSWORD: test + FIREBIRD_DATABASE: test.fdb + FIREBIRD_USER: test + FIREBIRD_PASSWORD: test + name: OPCACHE_VARIATION + runs-on: ubuntu-${{ fromJson(inputs.branch).config.ubuntu_version }} + steps: + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: Create MSSQL container + uses: ./.github/actions/setup-mssql + - name: apt + uses: ./.github/actions/apt-x64 + - name: ccache + uses: ./.github/actions/ccache + with: + name: "${{ github.job }}" + - name: ./configure + uses: ./.github/actions/configure-x64 + with: + configurationParameters: >- + --enable-debug --disable-zts + - name: make + run: make -j$(/usr/bin/nproc) >/dev/null + - name: make install + uses: ./.github/actions/install-linux + - name: Setup + uses: ./.github/actions/setup-x64 + - name: Test File Cache (prime shm) + uses: ./.github/actions/test-linux + with: + enableOpcache: true + runTestsParameters: >- + --file-cache-prime + - name: Test File Cache (prime shm, use shm) + uses: ./.github/actions/test-linux + with: + enableOpcache: true + runTestsParameters: >- + --file-cache-use + - name: Test File Cache (prime shm, use file) + uses: ./.github/actions/test-linux + with: + enableOpcache: true + runTestsParameters: >- + --file-cache-use + -d opcache.file_cache_only=1 + - name: Test File Cache Only (prime) + uses: ./.github/actions/test-linux + with: + enableOpcache: true + runTestsParameters: >- + --file-cache-prime + -d opcache.file_cache_only=1 + - name: Test File Cache Only (use) + uses: ./.github/actions/test-linux + with: + enableOpcache: true + runTestsParameters: >- + --file-cache-use + -d opcache.file_cache_only=1 + - name: Verify generated files are up to date + uses: ./.github/actions/verify-generated-files + MSAN: + if: ${{ fromJson(inputs.branch).jobs.MSAN }} + name: MSAN + runs-on: ubuntu-${{ fromJson(inputs.branch).config.ubuntu_version }} + steps: + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: apt + uses: ./.github/actions/apt-x64 + - name: ccache + uses: ./.github/actions/ccache + with: + name: "${{ github.job }}" + cc: clang + cxx: clang++ + - name: ./configure + run: | + export CFLAGS="-DZEND_TRACK_ARENA_ALLOC" + ./buildconf --force + # msan requires all used libraries to be instrumented, + # so we should avoiding linking against anything but libc here + ./configure \ + --enable-debug \ + --enable-zts \ + --enable-option-checking=fatal \ + --prefix=/usr \ + --without-sqlite3 \ + --without-pdo-sqlite \ + --without-libxml \ + --disable-dom \ + --disable-simplexml \ + --disable-xml \ + --disable-xmlreader \ + --disable-xmlwriter \ + --without-pcre-jit \ + --disable-opcache-jit \ + --enable-phpdbg \ + --enable-fpm \ + --with-pdo-mysql=mysqlnd \ + --with-mysqli=mysqlnd \ + --disable-mysqlnd-compression-support \ + --without-pear \ + --enable-exif \ + --enable-sysvsem \ + --enable-sysvshm \ + --enable-shmop \ + --enable-pcntl \ + --enable-mbstring \ + --disable-mbregex \ + --enable-sockets \ + --enable-bcmath \ + --enable-calendar \ + --enable-ftp \ + --enable-zend-test \ + --enable-werror \ + --enable-memory-sanitizer \ + --with-config-file-path=/etc \ + --with-config-file-scan-dir=/etc/php.d \ + --enable-dl-test=shared + - name: make + run: make -j$(/usr/bin/nproc) >/dev/null + - name: make install + run: | + sudo make install + sudo mkdir -p /etc/php.d + sudo chmod 777 /etc/php.d + echo mysqli.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/mysqli.ini + echo pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/pdo_mysql.ini + - name: Setup + run: | + set -x + sudo service mysql start + mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test" + # Ensure local_infile tests can run. + mysql -uroot -proot -e "SET GLOBAL local_infile = true" + sudo locale-gen de_DE + - name: Test + uses: ./.github/actions/test-linux + with: + runTestsParameters: >- + --msan + - name: Test Opcache + uses: ./.github/actions/test-linux + with: + enableOpcache: true + runTestsParameters: >- + --msan + - name: Verify generated files are up to date + uses: ./.github/actions/verify-generated-files + LIBMYSQLCLIENT: + if: ${{ fromJson(inputs.branch).jobs.LIBMYSQLCLIENT }} + name: LIBMYSQLCLIENT + runs-on: ubuntu-${{ fromJson(inputs.branch).config.ubuntu_version }} + steps: + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: apt + run: | + sudo apt-get update -y | true + sudo apt install bison re2c + - name: Setup + run: | + sudo service mysql start + mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test" + # Ensure local_infile tests can run. + mysql -uroot -proot -e "SET GLOBAL local_infile = true" + - name: Build mysql-8.0 + uses: ./.github/actions/build-libmysqlclient + with: + configurationParameters: '--enable-werror' + libmysql: mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz + - name: Test mysql-8.0 + uses: ./.github/actions/test-libmysqlclient + - name: Build mysql-8.4 + uses: ./.github/actions/build-libmysqlclient + with: + configurationParameters: '--enable-werror' + libmysql: mysql-8.4.0-linux-glibc2.28-x86_64.tar.xz + - name: Test mysql-8.4 + uses: ./.github/actions/test-libmysqlclient + - name: Verify generated files are up to date + uses: ./.github/actions/verify-generated-files + PECL: + if: ${{ fromJson(inputs.branch).jobs.PECL }} + runs-on: ubuntu-24.04 + steps: + - name: git checkout PHP + uses: actions/checkout@v6 + with: + path: php + ref: ${{ fromJson(inputs.branch).ref }} + # Used for ccache action + - name: Move .github + run: mv php/.github . + - name: git checkout apcu + uses: actions/checkout@v6 + with: + repository: krakjoe/apcu + path: apcu + - name: git checkout imagick + uses: actions/checkout@v6 + with: + repository: Imagick/imagick + path: imagick + - name: git checkout memcached + uses: actions/checkout@v6 + with: + repository: php-memcached-dev/php-memcached + path: memcached + - name: git checkout redis + if: ${{ false }} + uses: actions/checkout@v6 + with: + repository: phpredis/phpredis + path: redis + - name: git checkout xdebug + uses: actions/checkout@v6 + with: + repository: xdebug/xdebug + path: xdebug + - name: git checkout yaml + uses: actions/checkout@v6 + with: + repository: php/pecl-file_formats-yaml + path: yaml + - name: apt + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends \ + ccache \ + libmemcached-dev \ + imagemagick \ + libmagickwand-dev \ + bison \ + re2c + - name: ccache + uses: ./.github/actions/ccache + with: + name: "${{ github.job }}" + php_directory: php + - name: build PHP + run: | + cd php + ./buildconf --force + ./configure \ + --enable-option-checking=fatal \ + --prefix=/opt/php \ + --enable-cli \ + --disable-all \ + --enable-session \ + --enable-werror + make -j$(/usr/bin/nproc) + sudo make install + - name: build apcu + run: | + cd apcu + /opt/php/bin/phpize + ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config + make -j$(/usr/bin/nproc) + - name: build imagick + run: | + cd imagick + /opt/php/bin/phpize + ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config + make -j$(/usr/bin/nproc) + - name: build memcached + run: | + cd memcached + /opt/php/bin/phpize + ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config + make -j$(/usr/bin/nproc) + - name: build redis + if: ${{ false }} + run: | + cd redis + /opt/php/bin/phpize + ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config + make -j$(/usr/bin/nproc) + - name: build xdebug + run: | + cd xdebug + /opt/php/bin/phpize + ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config + make -j$(/usr/bin/nproc) + - name: build yaml + run: | + cd yaml + /opt/php/bin/phpize + ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config + make -j$(/usr/bin/nproc) + WINDOWS: + if: ${{ fromJson(inputs.branch).jobs.WINDOWS }} + strategy: + fail-fast: false + matrix: ${{ fromJson(inputs.branch).jobs.WINDOWS.matrix }} + name: "WINDOWS_${{ matrix.x64 && 'X64' || 'X86' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}${{ matrix.asan && '_ASAN' || ''}}${{ matrix.clang && '_CLANG' || ''}}" + runs-on: windows-2022 + env: + PHP_BUILD_CACHE_BASE_DIR: C:\build-cache + PHP_BUILD_OBJ_DIR: C:\obj + PHP_BUILD_CACHE_SDK_DIR: C:\build-cache\sdk + PHP_BUILD_SDK_BRANCH: php-sdk-2.5.0 + PHP_BUILD_CRT: ${{ fromJson(inputs.branch).jobs.WINDOWS.config.vs_crt_version }} + PLATFORM: ${{ matrix.x64 && 'x64' || 'x86' }} + THREAD_SAFE: "${{ matrix.zts && '1' || '0' }}" + INTRINSICS: "${{ matrix.zts && 'AVX2' || '' }}" + PARALLEL: -j2 + OPCACHE: "${{ matrix.opcache && '1' || '0' }}" + ASAN: "${{ matrix.asan && '1' || '0' }}" + CLANG_TOOLSET: "${{ matrix.clang && '1' || '0' }}" + steps: + - name: git config + run: git config --global core.autocrlf false && git config --global core.eol lf + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: Setup + uses: ./.github/actions/setup-windows + - name: Build + run: .github/scripts/windows/build.bat + - name: Test + run: .github/scripts/windows/test.bat + FREEBSD: + if: ${{ fromJson(inputs.branch).jobs.FREEBSD }} + strategy: + fail-fast: false + matrix: ${{ fromJson(inputs.branch).jobs.FREEBSD.matrix }} + name: "FREEBSD_${{ matrix.zts && 'ZTS' || 'NTS' }}" + runs-on: ubuntu-latest + timeout-minutes: 50 + steps: + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: FreeBSD + uses: ./.github/actions/freebsd + with: + configurationParameters: >- + --${{ matrix.zts && 'enable' || 'disable' }}-zts + runExtraTests: true + SOLARIS: + if: ${{ fromJson(inputs.branch).jobs.SOLARIS }} + name: "SOLARIS" + runs-on: ubuntu-latest + timeout-minutes: 50 + steps: + - name: git checkout + uses: actions/checkout@v5 + with: + ref: ${{ fromJson(inputs.branch).ref }} + - name: Solaris + uses: ./.github/actions/solaris + with: + configurationParameters: --disable-zts + runExtraTests: true + BENCHMARKING: + name: BENCHMARKING + if: ${{ fromJson(inputs.branch).jobs.BENCHMARKING }} + runs-on: ubuntu-${{ fromJson(inputs.branch).config.ubuntu_version }} + timeout-minutes: 50 + steps: + - name: git checkout + uses: actions/checkout@v6 + with: + ref: ${{ fromJson(inputs.branch).ref }} + fetch-depth: 0 + # ASLR can cause a lot of noise due to missed sse opportunities for memcpy + # and other operations, so we disable it during benchmarking. + - name: Disable ASLR + run: echo 0 | sudo tee /proc/sys/kernel/randomize_va_space + - name: apt + run: | + set -x + sudo apt-get update + sudo apt-get install \ + bison \ + libgmp-dev \ + libonig-dev \ + libsqlite3-dev \ + openssl \ + re2c \ + valgrind + - name: ccache + uses: ./.github/actions/ccache + with: + name: "${{ github.job }}" + - name: ./configure + run: | + set -x + ./buildconf --force + ./configure \ + --disable-debug \ + --enable-mbstring \ + --enable-option-checking=fatal \ + --enable-sockets \ + --enable-werror \ + --prefix=/usr \ + --with-config-file-scan-dir=/etc/php.d \ + --with-gmp \ + --with-mysqli=mysqlnd \ + --with-openssl \ + --with-pdo-sqlite \ + --with-valgrind + - name: make + run: make -j$(/usr/bin/nproc) >/dev/null + - name: make install + run: | + set -x + sudo make install + sudo mkdir -p /etc/php.d + sudo chmod 777 /etc/php.d + echo mysqli.default_socket=/var/run/mysqld/mysqld.sock > /etc/php.d/mysqli.ini + ${{ !fromJson(inputs.branch).jobs.BENCHMARKING.config.integrated_opcache && 'echo zend_extension=opcache.so >> /etc/php.d/opcache.ini' || '' }} + echo opcache.enable=1 >> /etc/php.d/opcache.ini + echo opcache.enable_cli=1 >> /etc/php.d/opcache.ini + - name: Setup + run: | + git config --global user.name "Benchmark" + git config --global user.email "benchmark@php.net" + sudo service mysql start + mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS wordpress" + mysql -uroot -proot -e "CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'wordpress'; FLUSH PRIVILEGES;" + mysql -uroot -proot -e "GRANT ALL PRIVILEGES ON *.* TO 'wordpress'@'localhost' WITH GRANT OPTION;" + - name: git checkout benchmarking-data + uses: actions/checkout@v6 + with: + repository: php/benchmarking-data + ssh-key: ${{ secrets.BENCHMARKING_DATA_DEPLOY_KEY }} + path: benchmark/repos/data + - name: Benchmark + run: php benchmark/benchmark.php true + - name: Store result + if: github.event_name == 'push' + run: | + set -x + cd benchmark/repos/data + git pull --autostash + if [ -e ".git/MERGE_HEAD" ]; then + echo "Merging, can't proceed" + exit 1 + fi + git add . + if git diff --cached --quiet; then + exit 0 + fi + git commit -m "Add result for ${{ github.repository }}@${{ github.sha }}" + git push + - name: Show diff + if: github.event_name == 'pull_request' + run: |- + set -x + php benchmark/generate_diff.php \ + ${{ github.sha }} \ + ${{ github.event.pull_request.base.sha }} \ + > $GITHUB_STEP_SUMMARY + - uses: actions/upload-artifact@v6 + with: + name: profiles + path: ${{ github.workspace }}/benchmark/profiles + retention-days: 30 diff -Nru php8.4-8.4.16/.github/workflows/test.yml php8.4-8.4.21/.github/workflows/test.yml --- php8.4-8.4.16/.github/workflows/test.yml 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/.github/workflows/test.yml 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,74 @@ +name: Test +on: + push: + paths-ignore: &ignore_paths + - .circleci/** + - .github/CODEOWNERS + - .github/ISSUE_TEMPLATE/** + - '**/*.md' + - '**/*.rst' + - docs/** + - EXTENSIONS + - LICENSE + - NEWS + - UPGRADING + - UPGRADING.INTERNALS + branches: + - PHP-8.2 + - PHP-8.3 + - PHP-8.4 + - PHP-8.5 + - master + pull_request: + paths-ignore: *ignore_paths + branches: + - '**' + schedule: + - cron: "0 1 * * *" + workflow_dispatch: ~ +permissions: + contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.url || github.run_id }} + cancel-in-progress: true +jobs: + GENERATE_MATRIX: + name: Generate Matrix + if: github.repository == 'php/php-src' || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch' + runs-on: ubuntu-latest + outputs: + all_variations: ${{ steps.set-matrix.outputs.all_variations }} + branches: ${{ steps.set-matrix.outputs.branches }} + steps: + - uses: actions/checkout@v6 + with: + # When running nightly, set fetch-depth to 0 to clone the full + # repository including all branches. This is required to find the + # correct commit hashes. + fetch-depth: ${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && '0' || '1' }} + - name: Grab the commit mapping + if: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} + uses: actions/cache@v5 + with: + path: branch-commit-cache.json + # The cache key needs to change every time for the + # cache to be updated after this job finishes. + key: nightly-${{ github.run_id }}-${{ github.run_attempt }} + restore-keys: | + nightly- + - name: Generate Matrix + id: set-matrix + run: php .github/matrix.php "${{ github.event_name }}" "${{ github.run_attempt }}" "${{ github.event_name == 'pull_request' && github.ref || github.ref_name }}" '${{ toJSON(github.event.pull_request.labels) }}' "${{ github.repository }}" + TEST: + needs: GENERATE_MATRIX + if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }} + name: ${{ matrix.branch.name }} + uses: ./.github/workflows/test-suite.yml + strategy: + fail-fast: false + matrix: + branch: ${{ fromJson(needs.GENERATE_MATRIX.outputs.branches) }} + with: + all_variations: ${{ needs.GENERATE_MATRIX.outputs.all_variations == 'true' }} + branch: ${{ toJSON(matrix.branch) }} + secrets: inherit diff -Nru php8.4-8.4.16/EXTENSIONS php8.4-8.4.21/EXTENSIONS --- php8.4-8.4.16/EXTENSIONS 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/EXTENSIONS 2026-05-05 16:34:12.000000000 +0000 @@ -170,57 +170,57 @@ PRIMARY MAINTAINER: Christian Stocker (2003 - 2011) Rob Richards (2003 - 2012) Marcus Börger (2003 - 2006) - Niels Dossche (2023 - 2025) -MAINTENANCE: Maintained + Nora Dossche (2023 - 2026) +MAINTENANCE: Orphan STATUS: Working SINCE: 5.0 ------------------------------------------------------------------------------- EXTENSION: simplexml PRIMARY MAINTAINER: Marcus Börger (2003 - 2008) - Niels Dossche (2023 - 2025) -MAINTENANCE: Maintained + Nora Dossche (2023 - 2026) +MAINTENANCE: Orphan STATUS: Working SINCE: 5.0 ------------------------------------------------------------------------------- EXTENSION: soap PRIMARY MAINTAINER: Dmitry Stogov (2004 - 2018) - Niels Dossche (2024 - 2025) -MAINTENANCE: Odd fixes + Nora Dossche (2024 - 2026) +MAINTENANCE: Orphan STATUS: Working ------------------------------------------------------------------------------- EXTENSION: xml PRIMARY MAINTAINER: Thies C. Arntzen (1999 - 2002) Rob Richards (2003 - 2013) - Niels Dossche (2023 - 2025) -MAINTENANCE: Maintained + Nora Dossche (2023 - 2026) +MAINTENANCE: Orphan STATUS: Working ------------------------------------------------------------------------------- EXTENSION: libxml PRIMARY MAINTAINER: Rob Richards (2003 - 2009) Christian Stocker (2004 - 2011) - Niels Dossche (2023 - 2025) -MAINTENANCE: Maintained + Nora Dossche (2023 - 2026) +MAINTENANCE: Orphan STATUS: Working ------------------------------------------------------------------------------- EXTENSION: xmlreader PRIMARY MAINTAINER: Rob Richards (2004 - 2010) Christian Stocker (2004 - 2004) - Niels Dossche (2023 - 2025) -MAINTENANCE: Maintained + Nora Dossche (2023 - 2026) +MAINTENANCE: Orphan STATUS: Working ------------------------------------------------------------------------------- EXTENSION: xmlwriter PRIMARY MAINTAINER: Rob Richards (2004 - 2010) Pierre-Alain Joye (2005-2009) - Niels Dossche (2023 - 2025) -MAINTENANCE: Maintained + Nora Dossche (2023 - 2026) +MAINTENANCE: Orphan STATUS: Working ------------------------------------------------------------------------------- EXTENSION: xsl PRIMARY MAINTAINER: Christian Stocker (2003 - 2011) Rob Richards (2003 - 2010) - Niels Dossche (2023 - 2025) -MAINTENANCE: Maintained + Nora Dossche (2023 - 2026) +MAINTENANCE: Orphan STATUS: Working SINCE: 5.0 ------------------------------------------------------------------------------- @@ -486,8 +486,8 @@ PRIMARY MAINTAINER: John Coggeshall (2003 - 2006) Ilia Alshanetsky (2003 - 2009) Nuno Lopes (2006 - 2012) - Niels Dossche (2025 - 2025) -MAINTENANCE: Maintained + Nora Dossche (2025 - 2026) +MAINTENANCE: Orphan STATUS: Working ------------------------------------------------------------------------------- EXTENSION: tokenizer diff -Nru php8.4-8.4.16/NEWS php8.4-8.4.21/NEWS --- php8.4-8.4.16/NEWS 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/NEWS 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,391 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +07 May 2026, PHP 8.4.21 + +- Core: + . Fixed bug GH-19983 (GC assertion failure with fibers, generators and + destructors). (iliaal) + . Fixed bug GH-21478 (Forward property operations to real instance for + initialized lazy proxies). (iliaal) + . Fixed bug GH-21605 (Missing addref for Countable::count()). (ilutov) + . Fixed bug GH-21699 (Assertion failure in shutdown_executor when resolving + self::/parent::/static:: callables if the error handler throws). (macoaure) + . Fixed bug GH-21603 (Missing addref for __unset). (ilutov) + . Fixed bug GH-21760 (Trait with class constant name conflict against + enum case causes SEGV). (Pratik Bhujel) + +- CLI: + . Fixed bug GH-21754 (`--rf` command line option with a method triggers + ext/reflection deprecation warnings). (DanielEScherzer) + +- Curl: + . Add support for brotli and zstd on Windows. (Shivam Mathur) + +- DOM: + . Fixed GHSA-4jhr-8w89-j733 and GH-21566 (Dom\XMLDocument::C14N() emits + duplicate xmlns declarations after setAttributeNS()). (CVE-2026-7263) + (David Carlier) + . Fixed bug GH-21688 (segmentation fault on empty HTMLDocument). + (David Carlier) + . Upgrade to lexbor v2.7.0. (CVE-2026-29078, CVE-2026-29079) + (ndossche, ilutov) + +- FPM: + . Fixed GHSA-7qg2-v9fj-4mwv (XSS within status endpoint). (CVE-2026-6735) + (Jakub Zelenka) + +- Iconv: + . Fixed bug GH-17399 (iconv memory leak on bailout). (iliaal) + +- MBString: + . Fixed GHSA-wm6j-2649-pv75 (Null pointer dereference in + php_mb_check_encoding() via mb_ereg_search_init()). (CVE-2026-7259) + (vi3tL0u1s) + . Fixed GHSA-74r9-qxhc-fx53 (Out-of-bounds access in mbfl_name2encoding_ex()). + (CVE-2026-6104) (ilutov) + +- Opcache: + . Fixed bug GH-21158 (JIT: Assertion jit->ra[var].flags & (1<<0) failed in + zend_jit_use_reg). (Arnaud) + . Fixed bug GH-21593 (Borked function JIT JMPNZ smart branch). (ilutov) + . Fixed bug GH-21460 (COND optimization regression). (Dmitry, Arnaud) + . Fixed faulty returns out of zend_try block in zend_jit_trace(). (ilutov) + +- OpenSSL: + . Fix a bunch of memory leaks and crashes on edge cases. (ndossche) + +- PDO_Firebird: + . Fixed GHSA-w476-322c-wpvm (SQL injection via NUL bytes in quoted strings). + (CVE-2025-14179) (SakiTakamachi) + +- Phar: + . Restore is_link handler in phar_intercept_functions_shutdown. (iliaal) + . Fixed bug GH-21797 (phar: NULL dereference in Phar::webPhar() when + SCRIPT_NAME is absent from SAPI environment). (iliaal) + . Fix memory leak in Phar::offsetGet(). (iliaal) + . Fix memory leak in phar_add_file(). (iliaal) + . Fixed bug GH-21799 (phar: propagate phar_stream_flush return value from + phar_stream_close). (iliaal) + . Fix memory leak in phar_verify_signature() when md_ctx is invalid. + (JarneClauw) + +- Random: + . Fixed bug GH-21731 (Random\Engine\Xoshiro256StarStar::__unserialize() + accepts all-zero state). (iliaal) + +- Session: + . Fixed memory leak when session GC callback return a refcounted value. + (jorgsowa) + +- SOAP: + . Fixed GHSA-85c2-q967-79q5 (Stale SOAP_GLOBAL(ref_map) pointer with Apache + Map). (CVE-2026-6722) (ilutov) + . Fixed GHSA-m33r-qmcv-p97q (Use-after-free after header parsing failure with + SOAP_PERSISTENCE_SESSION). (CVE-2026-7261) (ilutov) + . Fixed GHSA-hmxp-6pc4-f3vv (Broken Apache map value NULL check). + (CVE-2026-7262) (ilutov) + +- SPL: + . Fixed bug GH-21499 (RecursiveArrayIterator getChildren UAF after parent + free). (Girgias) + . Fix concurrent iteration and deletion issues in SplObjectStorage. + (ndossche) + +- Standard: + . Fixed GHSA-96wq-48vp-hh57 (Signed integer overflow of char array offset). + (CVE-2026-7568) (TimWolla) + . Fixed GHSA-m8rr-4c36-8gq4 (Consistently pass unsigned char to ctype.h + functions). (CVE-2026-7258) (ilutov) + +- Streams: + . Fixed bug GH-21468 (Segfault in file_get_contents w/ a https URL + and a proxy set). (ndossche) + +- XSL: + . Fixed bug GH-21600 (Segfault on module shutdown). (David Carlier) + +- Zip: + . Fixed bug GH-21698 (memory leak with ZipArchive::addGlob() + early return statements). (David Carlier) + +09 Apr 2026, PHP 8.4.20 + +- Bz2: + . Fix truncation of total output size causing erroneous errors. (ndossche) + +- Core: + . Fixed bugs GH-20875, GH-20873, GH-20854 (Propagate IN_GET guard in + get_property_ptr_ptr for lazy proxies). (iliaal) + +- DOM: + . Fixed bug GH-21486 (Dom\HTMLDocument parser mangles xml:space and + xml:lang attributes). (ndossche) + +- FFI: + . Fixed resource leak in FFI::cdef() onsymbol resolution failure. + (David Carlier) + +- GD: + . Fixed bug GH-21431 (phpinfo() to display libJPEG 10.0 support). + (David Carlier) + +- Opcache: + . Fixed bug GH-20838 (JIT compiler produces wrong arithmetic results). + (Dmitry, iliaal) + . Fixed bug GH-21267 (JIT tracing: infinite loop on FETCH_OBJ_R with + IS_UNDEF property in polymorphic context). (Dmitry, iliaal) + . Fixed bug GH-21395 (uaf in jit). (ndossche) + +- OpenSSL: + . Fixed bug GH-21083 (Skip private_key_bits validation for EC/curve-based + keys). (iliaal) + . Fix missing error propagation for BIO_printf() calls. (ndossche) + +- PCRE: + . Fixed re-entrancy issue on php_pcre_match_impl, php_pcre_replace_impl, + php_pcre_split_impl, and php_pcre_grep_impl. (David Carlier) + +- PGSQL: + . Fixed preprocessor silently guarding PGSQL_SUPPRESS_TIMESTAMPS support + due to a typo. (KentarouTakeda) + +- SNMP: + . Fixed bug GH-21336 (SNMP::setSecurity() undefined behavior with + NULL arguments). (David Carlier) + +- SOAP: + . Fixed Set-Cookie parsing bug wrong offset while scanning attributes. + (David Carlier) + +- SPL: + . Fixed bug GH-21454 (missing write lock validation in SplHeap). + (ndossche) + +- Standard: + . Fixed bug GH-20906 (Assertion failure when messing up output buffers). + (ndossche) + . Fixed bug GH-20627 (Cannot identify some avif images with getimagesize). + (y-guyon) + +- Sysvshm: + . Fix memory leak in shm_get_var() when variable is corrupted. (ndossche) + +- XSL: + . Fix GH-21357 (XSLTProcessor works with DOMDocument, but fails with + Dom\XMLDocument). (ndossche) + . Fixed bug GH-21496 (UAF in dom_objects_free_storage). + (David Carlier/ndossche) + +12 Mar 2026, PHP 8.4.19 + +- Core: + . Fixed bug GH-21029 (zend_mm_heap corrupted on Aarch64, LTO builds). (Arnaud) + . Fixed bug GH-20657 (Assertion failure in zend_lazy_object_get_info triggered + by setRawValueWithoutLazyInitialization() and newLazyGhost()). (Arnaud) + . Fixed bug GH-20504 (Assertion failure in zend_get_property_guard when + accessing properties on Reflection LazyProxy via isset()). (Arnaud) + . Fixed OSS-Fuzz #478009707 (Borked assign-op/inc/dec on untyped hooked + property backing value). (ilutov) + . Fixed bug GH-21215 (Build fails with -std=). (Arnaud) + . Fixed bug GH-13674 (Build system installs libtool wrappers when using + slibtool). (Michael Orlitzky) + +- Curl: + . Fixed bug GH-21023 (CURLOPT_XFERINFOFUNCTION crash with a null callback). + (David Carlier) + . Don't truncate length. (ndossche) + +- Date: + . Fixed bug GH-20936 (DatePeriod::__set_state() cannot handle null start). + (ndossche) + . Fix timezone offset with seconds losing precision. (ndossche) + +- DOM: + . Fixed bug GH-21077 (Accessing Dom\Node::baseURI can throw TypeError). + (ndossche) + . Fixed bug GH-21097 (Accessing Dom\Node properties can can throw TypeError). + (ndossche) + +- MBString: + . Fixed bug GH-21223; mb_guess_encoding no longer crashes when passed huge + list of candidate encodings (with 200,000+ entries). (Jordi Kroon) + +- Opcache: + . Fixed bug GH-20718 ("Insufficient shared memory" when using JIT on Solaris). + (Petr Sumbera) + . Fixed bug GH-21227 (Borked SCCP of array containing partial object). + (ilutov) + . Fixed bug GH-21052 (Preloaded constant erroneously propagated to file-cached + script). (ilutov) + +- OpenSSL: + . Fix a bunch of leaks and error propagation. (ndossche) + +- PCNTL: + . Fixed pcntl_setns() internal errors handling regarding errnos. + (David Carlier/ndossche) + . Fixed cpuset leak in pcntl_setcpuaffinity on out-of-range CPU ID + on NetBSD/Solaris platforms. (David Carlier) + . Fixed pcntl_signal() signal table registering the callback first + OS-wise before the internal list. (David Carlier) + . Fixed pcntl_signal_dispatch() stale pointer and exception + handling. (David Carlier) + +- PCRE: + . Fixed preg_match memory leak with invalid regexes. (David Carlier) + . Fixed pcre2_code leak when pcre2_pattern_info() fails after a + successful pcre2_compile(), and match_sets/match_data/marks leaks + in php_pcre_match_impl(). (David Carlier) + +- PDO_PGSQL: + . Fixed bug GH-21055 (connection attribute status typo for GSS negotiation). + (lsaos) + +- PGSQL: + . Fixed bug GH-21162 (pg_connect() memory leak on error). + (David Carlier) + +- Sockets: + . Fixed bug GH-21161 (socket_set_option() crash with array 'addr' + entry as null). (David Carlier) + . Fixed possible addr length overflow with socket_connect() and AF_UNIX + family sockets. (David Carlier) + +- Windows: + . Fixed compilation with clang (missing intrin.h include). (Kévin Dunglas) + +12 Feb 2026, PHP 8.4.18 + +- Core: + . Fixed bug GH-20837 (NULL dereference when calling ob_start() in shutdown + function triggered by bailout in php_output_lock_error()). (timwolla) + . Fix OSS-Fuzz #471533782 (Infinite loop in GC destructor fiber). (ilutov) + . Fix OSS-Fuzz #472563272 (Borked block_pass JMP[N]Z optimization). (ilutov) + . Fixed bug GH-GH-20914 (Internal enums can be cloned and compared). (Arnaud) + . Fix OSS-Fuzz #474613951 (Leaked parent property default value). (ilutov) + . Fixed bug GH-20766 (Use-after-free in FE_FREE with GC interaction). (Bob) + . Fix OSS-Fuzz #471486164 (Broken by-ref assignment to uninitialized hooked + backing value). (ilutov) + . Fix OSS-Fuzz #438780145 (Nested finally with repeated return type check may + uaf). (ilutov) + . Fixed bug GH-20905 (Lazy proxy bailing __clone assertion). (ilutov) + . Fixed bug GH-20479 (Hooked object properties overflow). (ndossche) + +- Date: + . Update timelib to 2022.16. (Derick) + +- DOM: + . Fixed GH-21041 (Dom\HTMLDocument corrupts closing tags within scripts). + (lexborisov) + +- MbString: + . Fixed bug GH-20833 (mb_str_pad() divide by zero if padding string is + invalid in the encoding). (ndossche) + . Fixed bug GH-20836 (Stack overflow in mb_convert_variables with + recursive array references). (alexandre-daubois) + +- Opcache: + . Fixed bug GH-20818 (Segfault in Tracing JIT with object reference). + (khasinski) + +- OpenSSL: + . Fix memory leaks when sk_X509_new_null() fails. (ndossche) + . Fix crash when in openssl_x509_parse() when i2s_ASN1_INTEGER() fails. + (ndossche) + . Fix crash in openssl_x509_parse() when X509_NAME_oneline() fails. + (ndossche) + +- Phar: + . Fixed bug GH-20882 (buildFromIterator breaks with missing base directory). + (ndossche) + +- PGSQL: + . Fixed INSERT/UPDATE queries building with PQescapeIdentifier() and possible + UB. (David Carlier) + +- Readline: + . Fixed bug GH-18139 (Memory leak when overriding some settings + via readline_info()). (ndossche) + +- SPL: + . Fixed bug GH-20856 (heap-use-after-free in SplDoublyLinkedList iterator + when modifying during iteration). (ndossche) + +- Standard: + . Fixed bug #74357 (lchown fails to change ownership of symlink with ZTS) + (Jakub Zelenka) + . Fixed bug GH-20843 (var_dump() crash with nested objects) + (David Carlier) + +15 Jan 2026, PHP 8.4.17 + +- Core: + . Fix OSS-Fuzz #465488618 (Wrong assumptions when dumping function signature + with dynamic class const lookup default argument). (ilutov) + . Fixed bug GH-20695 (Assertion failure in normalize_value() when parsing + malformed INI input via parse_ini_string()). (ndossche) + . Fixed bug GH-20714 (Uncatchable exception thrown in generator). (ilutov) + . Fixed bug GH-20352 (UAF in php_output_handler_free via re-entrant + ob_start() during error deactivation). (ndossche) + +- Bz2: + . Fixed bug GH-20620 (bzcompress overflow on large source size). + (David Carlier) + +- DOM: + . Fixed bug GH-20722 (Null pointer dereference in DOM namespace node cloning + via clone on malformed objects). (ndossche) + . Fixed bug GH-20444 (Dom\XMLDocument::C14N() seems broken compared + to DOMDocument::C14N()). (ndossche) + +- GD: + . Fixed bug GH-20622 (imagestring/imagestringup overflow). (David Carlier) + +- Intl: + . Fix leak in umsg_format_helper(). (ndossche) + +- LDAP: + . Fix memory leak in ldap_set_options(). (ndossche) + +- Mbstring: + . Fixed bug GH-20674 (mb_decode_mimeheader does not handle separator). + (Yuya Hamada) + +- OpenSSL: + . Fixed bug GH-20802 (undefined behavior with invalid SNI_server_certs + options). (David Carlier) + +- PCNTL: + . Fixed bug with pcntl_getcpuaffinity() on solaris regarding invalid + process ids handling. (David Carlier) + +- Phar: + . Fixed bug GH-20732 (Phar::LoadPhar undefined behavior when reading fails). + (ndossche) + . Fix SplFileInfo::openFile() in write mode. (ndossche) + . Fix build on legacy OpenSSL 1.1.0 systems. (Giovanni Giacobbi) + . Fixed bug #74154 (Phar extractTo creates empty files). (ndossche) + +- POSIX: + . Fixed crash on posix groups to php array creation on macos. + (David Carlier) + +- SPL: + . Fixed bug GH-20678 (resource created by GlobIterator crashes with fclose()). + (David Carlier) + +- Sqlite3: + . Fixed bug GH-20699 (SQLite3Result fetchArray return array|false, + null returned). (ndossche, plusminmax) + +- Standard: + . Fix error check for proc_open() command. (ndossche) + . Fix memory leak in mail() when header key is numeric. (Girgias) + . Fixed bug GH-20582 (Heap Buffer Overflow in iptcembed). (ndossche) + +- Zlib: + . Fix OOB gzseek() causing assertion failure. (ndossche) + 18 Dec 2025, PHP 8.4.16 - Core: @@ -51,6 +437,9 @@ . Fixed bug GH-20492 (mbstring compile warning due to non-strings). (ndossche) +- mysqli: + . Make mysqli_begin_transaction() report errors properly. (Kamil Tekiela) + - MySQLnd: . Fixed bug GH-20528 (Regression breaks mysql connexion using an IPv6 address enclosed in square brackets). (Remi) @@ -88,6 +477,10 @@ . Fixed GHSA-3237-qqm7-mfv7 (Information Leak of Memory in getimagesize). (CVE-2025-14177) (ndossche) +- Streams: + . Fixed bug GH-20370 (User stream filters could violate typed property + constraints). (alexandre-daubois) + - Tidy: . Fixed bug GH-20374 (PHP with tidy and custom-tags). (ndossche) diff -Nru php8.4-8.4.16/Zend/Optimizer/block_pass.c php8.4-8.4.21/Zend/Optimizer/block_pass.c --- php8.4-8.4.16/Zend/Optimizer/block_pass.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/Optimizer/block_pass.c 2026-05-05 16:34:12.000000000 +0000 @@ -1152,7 +1152,7 @@ } next_block++; } - while (next_block->len == 0 && !(next_block->flags & ZEND_BB_PROTECTED)) { + while (next_block->len == 0 && !(next_block->flags & (ZEND_BB_TARGET|ZEND_BB_PROTECTED))) { next_block = cfg->blocks + next_block->successors[0]; } return next_block; diff -Nru php8.4-8.4.16/Zend/Optimizer/sccp.c php8.4-8.4.21/Zend/Optimizer/sccp.c --- php8.4-8.4.16/Zend/Optimizer/sccp.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/Optimizer/sccp.c 2026-05-05 16:34:12.000000000 +0000 @@ -965,7 +965,7 @@ SET_RESULT(op1, &zv); } else if (ct_eval_assign_dim(&zv, data, op2) == SUCCESS) { /* Mark array containing partial array as partial */ - if (IS_PARTIAL_ARRAY(data)) { + if (IS_PARTIAL_ARRAY(data) || IS_PARTIAL_OBJECT(data)) { MAKE_PARTIAL_ARRAY(&zv); } SET_RESULT(result, data); @@ -1165,7 +1165,7 @@ /* We can't add NEXT element into partial array (skip it) */ SET_RESULT(result, &zv); } else if (ct_eval_add_array_elem(&zv, op1, op2) == SUCCESS) { - if (IS_PARTIAL_ARRAY(op1)) { + if (IS_PARTIAL_ARRAY(op1) || IS_PARTIAL_OBJECT(op1)) { MAKE_PARTIAL_ARRAY(&zv); } SET_RESULT(result, &zv); diff -Nru php8.4-8.4.16/Zend/Optimizer/zend_dump.c php8.4-8.4.21/Zend/Optimizer/zend_dump.c --- php8.4-8.4.16/Zend/Optimizer/zend_dump.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/Optimizer/zend_dump.c 2026-05-05 16:34:12.000000000 +0000 @@ -122,6 +122,10 @@ if (op.num != (uint32_t)-1) { fprintf(stderr, " try-catch(%u)", op.num); } + } else if (ZEND_VM_OP_LOOP_END == (flags & ZEND_VM_OP_MASK)) { + if (opline->extended_value & ZEND_FREE_ON_RETURN) { + fprintf(stderr, " loop-end(+%u)", op.num); + } } else if (ZEND_VM_OP_THIS == (flags & ZEND_VM_OP_MASK)) { fprintf(stderr, " THIS"); } else if (ZEND_VM_OP_NEXT == (flags & ZEND_VM_OP_MASK)) { diff -Nru php8.4-8.4.16/Zend/Optimizer/zend_optimizer.c php8.4-8.4.21/Zend/Optimizer/zend_optimizer.c --- php8.4-8.4.16/Zend/Optimizer/zend_optimizer.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/Optimizer/zend_optimizer.c 2026-05-05 16:34:12.000000000 +0000 @@ -799,6 +799,9 @@ zend_class_entry *ce = Z_PTR_P(ce_zv); if (ce->ce_flags & ZEND_ACC_PRELOADED) { + if (CG(compiler_options) & ZEND_COMPILE_WITH_FILE_CACHE) { + return true; + } Bucket *ce_bucket = (Bucket*)((uintptr_t)ce_zv - XtOffsetOf(Bucket, val)); size_t offset = ce_bucket - EG(class_table)->arData; if (offset < EG(persistent_classes_count)) { @@ -817,6 +820,9 @@ return false; } else if (fbc->type == ZEND_USER_FUNCTION) { if (fbc->op_array.fn_flags & ZEND_ACC_PRELOADED) { + if (CG(compiler_options) & ZEND_COMPILE_WITH_FILE_CACHE) { + return true; + } Bucket *fbc_bucket = (Bucket*)((uintptr_t)fbc_zv - XtOffsetOf(Bucket, val)); size_t offset = fbc_bucket - EG(function_table)->arData; if (offset < EG(persistent_functions_count)) { diff -Nru php8.4-8.4.16/Zend/tests/GHSA-wm6j-2649-pv75.phpt php8.4-8.4.21/Zend/tests/GHSA-wm6j-2649-pv75.phpt --- php8.4-8.4.16/Zend/tests/GHSA-wm6j-2649-pv75.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/GHSA-wm6j-2649-pv75.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,22 @@ +--TEST-- +GHSA-wm6j-2649-pv75: Null pointer dereference in php_mb_check_encoding() via mb_ereg_search_init() +--CREDITS-- +vi3tL0u1s +--EXTENSIONS-- +mbstring +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught ValueError: mb_regex_encoding(): Argument #1 ($encoding) must be a valid encoding, "iso-8859-11" given in %s:%d +Stack trace: +#0 %s(%d): mb_regex_encoding('iso-8859-11') +#1 {main} + thrown in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/bug55509.phpt php8.4-8.4.21/Zend/tests/bug55509.phpt --- php8.4-8.4.16/Zend/tests/bug55509.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/bug55509.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -2,6 +2,7 @@ Bug #55509 (segfault on x86_64 using more than 2G memory) --SKIPIF-- --EXPECTF-- diff -Nru php8.4-8.4.16/Zend/tests/bug78010.phpt php8.4-8.4.21/Zend/tests/bug78010.phpt --- php8.4-8.4.16/Zend/tests/bug78010.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/bug78010.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -2,6 +2,7 @@ Bug #78010: Segmentation fault during GC --SKIPIF-- --INI-- diff -Nru php8.4-8.4.16/Zend/tests/enum/comparison-internal.phpt php8.4-8.4.21/Zend/tests/enum/comparison-internal.phpt --- php8.4-8.4.16/Zend/tests/enum/comparison-internal.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/enum/comparison-internal.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,54 @@ +--TEST-- +Enum comparison (internal enum) +--EXTENSIONS-- +zend_test +--FILE-- + $foo); +var_dump($foo < $foo); +var_dump($foo >= $foo); +var_dump($foo <= $foo); + +var_dump($foo > $bar); +var_dump($foo < $bar); +var_dump($foo >= $bar); +var_dump($foo <= $bar); + +var_dump($foo > true); +var_dump($foo < true); +var_dump($foo >= true); +var_dump($foo <= true); + +?> +--EXPECT-- +bool(true) +bool(true) +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +bool(true) +bool(true) +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) diff -Nru php8.4-8.4.16/Zend/tests/enum/gh21760.phpt php8.4-8.4.21/Zend/tests/enum/gh21760.phpt --- php8.4-8.4.16/Zend/tests/enum/gh21760.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/enum/gh21760.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,19 @@ +--TEST-- +GH-21760 (Trait with class constant name conflict against enum case causes SEGV) +--FILE-- + +--EXPECTF-- +Fatal error: Cannot use trait X, because X::Up conflicts with enum case Direction::Up in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/enum/implements-internal.phpt php8.4-8.4.21/Zend/tests/enum/implements-internal.phpt --- php8.4-8.4.16/Zend/tests/enum/implements-internal.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/enum/implements-internal.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,14 @@ +--TEST-- +Enum implements (internal enum) +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECT-- +bool(false) +bool(true) diff -Nru php8.4-8.4.16/Zend/tests/enum/instanceof-backed-enum.phpt php8.4-8.4.21/Zend/tests/enum/instanceof-backed-enum.phpt --- php8.4-8.4.16/Zend/tests/enum/instanceof-backed-enum.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/enum/instanceof-backed-enum.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,7 @@ --TEST-- Auto implement BackedEnum interface +--EXTENSIONS-- +zend_test --FILE-- --EXPECT-- bool(false) bool(true) +bool(false) +bool(true) diff -Nru php8.4-8.4.16/Zend/tests/enum/instanceof-unitenum.phpt php8.4-8.4.21/Zend/tests/enum/instanceof-unitenum.phpt --- php8.4-8.4.16/Zend/tests/enum/instanceof-unitenum.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/enum/instanceof-unitenum.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,7 @@ --TEST-- Auto implement UnitEnum interface +--EXTENSIONS-- +zend_test --FILE-- --EXPECT-- bool(true) bool(false) +bool(true) diff -Nru php8.4-8.4.16/Zend/tests/enum/no-clone-internal.phpt php8.4-8.4.21/Zend/tests/enum/no-clone-internal.phpt --- php8.4-8.4.16/Zend/tests/enum/no-clone-internal.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/enum/no-clone-internal.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,16 @@ +--TEST-- +Enum disallows cloning (internal enum) +--EXTENSIONS-- +zend_test +--FILE-- +getMessage() . "\n"; +} + +?> +--EXPECT-- +Trying to clone an uncloneable object of class ZendTestIntEnum diff -Nru php8.4-8.4.16/Zend/tests/enum/no-dynamic-properties-internal.phpt php8.4-8.4.21/Zend/tests/enum/no-dynamic-properties-internal.phpt --- php8.4-8.4.16/Zend/tests/enum/no-dynamic-properties-internal.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/enum/no-dynamic-properties-internal.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,18 @@ +--TEST-- +Enum case disallows dynamic properties (internal enum) +--EXTENSIONS-- +zend_test +--FILE-- +baz = 'Baz'; +} catch (\Error $e) { + echo $e->getMessage(); +} + +?> +--EXPECT-- +Cannot create dynamic property ZendTestUnitEnum::$baz diff -Nru php8.4-8.4.16/Zend/tests/fibers/gh19983.phpt php8.4-8.4.21/Zend/tests/fibers/gh19983.phpt --- php8.4-8.4.16/Zend/tests/fibers/gh19983.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/fibers/gh19983.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,32 @@ +--TEST-- +GH-19983 (GC Assertion Failure with fibers, generators and destructors) +--SKIPIF-- + +--INI-- +memory_limit=16M +--FILE-- +current(); + }); + $fiber->start(); + } +} +new a; +?> +--EXPECTF-- +Fatal error: Allowed memory size of %d bytes exhausted%s diff -Nru php8.4-8.4.16/Zend/tests/fibers/oss-fuzz-471533782-001.phpt php8.4-8.4.21/Zend/tests/fibers/oss-fuzz-471533782-001.phpt --- php8.4-8.4.16/Zend/tests/fibers/oss-fuzz-471533782-001.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/fibers/oss-fuzz-471533782-001.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,33 @@ +--TEST-- +OSS-Fuzz #471533782: Infinite loop in GC destructor fiber +--FILE-- +self = $this; + } + public function __destruct() { + try { + Fiber::suspend(); + } finally { + throw new Exception(); + } + } +} + +$f = new Fiber(function () { + new Cycle(); + gc_collect_cycles(); +}); +$f->start(); + +?> +--EXPECTF-- +Fatal error: Uncaught Exception in %s:%d +Stack trace: +#0 [internal function]: Cycle->__destruct() +#1 [internal function]: gc_destructor_fiber() +#2 {main} + thrown in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/fibers/oss-fuzz-471533782-002.phpt php8.4-8.4.21/Zend/tests/fibers/oss-fuzz-471533782-002.phpt --- php8.4-8.4.16/Zend/tests/fibers/oss-fuzz-471533782-002.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/fibers/oss-fuzz-471533782-002.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,34 @@ +--TEST-- +OSS-Fuzz #471533782: Infinite loop in GC destructor fiber +--FILE-- +self = $this; + } + public function __destruct() { + try { + Fiber::suspend(); + } finally { + Fiber::suspend(); + } + } +} + +$f = new Fiber(function () { + new Cycle(); + gc_collect_cycles(); +}); +$f->start(); + +?> +--EXPECTF-- +Fatal error: Uncaught FiberError: Cannot suspend in a force-closed fiber in %s:%d +Stack trace: +#0 %s(%d): Fiber::suspend() +#1 [internal function]: Cycle->__destruct() +#2 [internal function]: gc_destructor_fiber() +#3 {main} + thrown in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/gc_050.phpt php8.4-8.4.21/Zend/tests/gc_050.phpt --- php8.4-8.4.16/Zend/tests/gc_050.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/gc_050.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -1,37 +1,40 @@ --TEST-- -GC 050: Destructor are never called twice +GC 050: Try/finally in foreach should create separate live ranges --FILE-- v = 1; + } + return new stdClass; } -class WithDestructor -{ - public function __destruct() - { - echo "d\n"; +for ($i = 0; $i < 100000; $i++) { + // Create cyclic garbage to trigger GC + $a = new stdClass; + $b = new stdClass; + $a->r = $b; + $b->r = $a; - G::$v = $this; - } + $r = f($i % 2 + 1); } - -$o = new WithDestructor(); -$weakO = \WeakReference::create($o); -echo "---\n"; -unset($o); -echo "---\n"; -var_dump($weakO->get() !== null); // verify if kept allocated -G::$v = null; -echo "---\n"; -var_dump($weakO->get() !== null); // verify if released +echo "OK\n"; ?> --EXPECT-- ---- -d ---- -bool(true) ---- -bool(false) +OK diff -Nru php8.4-8.4.16/Zend/tests/gc_051.phpt php8.4-8.4.21/Zend/tests/gc_051.phpt --- php8.4-8.4.16/Zend/tests/gc_051.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/gc_051.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,29 @@ +--TEST-- +GC 048: FE_FREE should mark variable as UNDEF to prevent use-after-free during GC +--FILE-- +ref = $b; + $b->ref = $a; + + $result = test_foreach_early_return("x"); +} + +echo "OK\n"; +?> +--EXPECT-- +OK diff -Nru php8.4-8.4.16/Zend/tests/gc_052.phpt php8.4-8.4.21/Zend/tests/gc_052.phpt --- php8.4-8.4.16/Zend/tests/gc_052.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/gc_052.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,36 @@ +--TEST-- +GC 049: Multiple early returns from foreach should create separate live ranges +--FILE-- +r = $b; + $b->r = $a; + + $r = f($i % 3 + 1); +} +echo "OK\n"; +?> +--EXPECT-- +OK diff -Nru php8.4-8.4.16/Zend/tests/gc_053.phpt php8.4-8.4.21/Zend/tests/gc_053.phpt --- php8.4-8.4.16/Zend/tests/gc_053.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/gc_053.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,37 @@ +--TEST-- +GC 050: Destructor are never called twice +--FILE-- +get() !== null); // verify if kept allocated +G::$v = null; +echo "---\n"; +var_dump($weakO->get() !== null); // verify if released +?> +--EXPECT-- +--- +d +--- +bool(true) +--- +bool(false) diff -Nru php8.4-8.4.16/Zend/tests/gh16799.phpt php8.4-8.4.21/Zend/tests/gh16799.phpt --- php8.4-8.4.16/Zend/tests/gh16799.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/gh16799.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -15,7 +15,12 @@ --EXPECTF-- Fatal error: Uncaught Exception: Use of "static" in callables is deprecated in %s:%d Stack trace: -#0 %s(%d): {closure:%s:%d}(8192, 'Use of "static"...', %s, %d) +#0 %s(%d): {closure:%s}(8192, 'Use of "static"%s', '%s', %d) #1 %s(%d): Test::test() #2 {main} + +Next TypeError: call_user_func(): Argument #1 ($callback) must be a valid callback, (null) in %s:%d +Stack trace: +#0 %s(%d): Test::test() +#1 {main} thrown in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/gh20714.phpt php8.4-8.4.21/Zend/tests/gh20714.phpt --- php8.4-8.4.16/Zend/tests/gh20714.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/gh20714.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,29 @@ +--TEST-- +GH-20714: Uncatchable exception thrown in generator +--CREDITS-- +Grégoire Paris (greg0ire) +--FILE-- + +--EXPECT-- +Caught diff -Nru php8.4-8.4.16/Zend/tests/gh21603.phpt php8.4-8.4.21/Zend/tests/gh21603.phpt --- php8.4-8.4.16/Zend/tests/gh21603.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/gh21603.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,22 @@ +--TEST-- +GH-21603: Missing addref for __unset +--CREDITS-- +cnwangjihe +--FILE-- +prop); + +?> +--EXPECTF-- +object(C)#%d (0) { +} diff -Nru php8.4-8.4.16/Zend/tests/gh21605.phpt php8.4-8.4.21/Zend/tests/gh21605.phpt --- php8.4-8.4.16/Zend/tests/gh21605.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/gh21605.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,24 @@ +--TEST-- +GH-21605: Missing addref for Countable::count() +--CREDITS-- +cnwangjihe +--FILE-- + +--EXPECTF-- +object(C)#%d (0) { +} +int(42) diff -Nru php8.4-8.4.16/Zend/tests/gh_21699.phpt php8.4-8.4.21/Zend/tests/gh_21699.phpt --- php8.4-8.4.16/Zend/tests/gh_21699.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/gh_21699.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,31 @@ +--TEST-- +GH-21699: Assertion failure in shutdown_executor when error handler throws during self:: callable resolution +--FILE-- +test(); +?> +--EXPECTF-- +Fatal error: Uncaught Exception in %s:%d +Stack trace: +#0 %s(%d): {closure:%s}(%d, 'Use of "self" i%s', '%s', %d) +#1 %s(%d): bar->test() +#2 {main} + +Next TypeError: call_user_func(): Argument #1 ($callback) must be a valid callback, (null) in %s:%d +Stack trace: +#0 %s(%d): bar->test() +#1 {main} + thrown in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/gh_21699_parent.phpt php8.4-8.4.21/Zend/tests/gh_21699_parent.phpt --- php8.4-8.4.16/Zend/tests/gh_21699_parent.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/gh_21699_parent.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,32 @@ +--TEST-- +GH-21699 (parent::): no shutdown_executor trampoline assertion when error handler throws during parent:: callable resolution +--FILE-- +test(); +?> +--EXPECTF-- +Fatal error: Uncaught Exception in %s:%d +Stack trace: +#0 %s(%d): {closure:%s}(%d, 'Use of "parent"%s', '%s', %d) +#1 %s(%d): Child->test() +#2 {main} + +Next TypeError: call_user_func(): Argument #1 ($callback) must be a valid callback, (null) in %s:%d +Stack trace: +#0 %s(%d): Child->test() +#1 {main} + thrown in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/gh_21699_static.phpt php8.4-8.4.21/Zend/tests/gh_21699_static.phpt --- php8.4-8.4.16/Zend/tests/gh_21699_static.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/gh_21699_static.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,31 @@ +--TEST-- +GH-21699 (static::): no shutdown_executor trampoline assertion when error handler throws during static:: callable resolution +--FILE-- +test(); +?> +--EXPECTF-- +Fatal error: Uncaught Exception in %s:%d +Stack trace: +#0 %s(%d): {closure:%s}(%d, 'Use of "static"%s', '%s', %d) +#1 %s(%d): bar->test() +#2 {main} + +Next TypeError: call_user_func(): Argument #1 ($callback) must be a valid callback, (null) in %s:%d +Stack trace: +#0 %s(%d): bar->test() +#1 {main} + thrown in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh18038-002.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh18038-002.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh18038-002.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh18038-002.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -34,5 +34,4 @@ --EXPECT-- init string(19) "RealInstance::__set" -string(12) "Proxy::__set" int(2) diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh18038-004.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh18038-004.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh18038-004.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh18038-004.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -36,7 +36,6 @@ --EXPECTF-- init string(19) "RealInstance::__get" -string(12) "Proxy::__get" Warning: Undefined property: RealInstance::$prop in %s on line %d NULL diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh18038-007.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh18038-007.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh18038-007.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh18038-007.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -36,6 +36,5 @@ --EXPECT-- init string(21) "RealInstance::__isset" -string(14) "Proxy::__isset" bool(false) bool(false) diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh18038-009.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh18038-009.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh18038-009.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh18038-009.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -36,6 +36,5 @@ --EXPECT-- init string(21) "RealInstance::__isset" -string(14) "Proxy::__isset" bool(false) bool(false) diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh20504-001.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh20504-001.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh20504-001.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh20504-001.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,24 @@ +--TEST-- +GH-20504: Assertion failure in zend_get_property_guard() when lazy proxy adds magic method - isset +--CREDITS-- +vi3tL0u1s +--FILE-- +$name['']); + } +} +$rc = new ReflectionClass(Proxy::class); +$obj = $rc->newLazyProxy(function () { + return new RealInstance; +}); +var_dump(isset($obj->name[''])); + +?> +--EXPECT-- +bool(false) diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh20504-002.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh20504-002.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh20504-002.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh20504-002.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,23 @@ +--TEST-- +GH-20504: Assertion failure in zend_get_property_guard() when lazy proxy adds magic method - get +--FILE-- +$name; + } +} +$rc = new ReflectionClass(Proxy::class); +$obj = $rc->newLazyProxy(function () { + return new RealInstance; +}); +var_dump($obj->name); + +?> +--EXPECTF-- +Warning: Undefined property: RealInstance::$name in %s on line %d +NULL diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh20504-003.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh20504-003.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh20504-003.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh20504-003.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,33 @@ +--TEST-- +GH-20504: Assertion failure in zend_get_property_guard() when lazy proxy adds magic method - set +--FILE-- +$name = $value; + } +} +$rc = new ReflectionClass(Proxy::class); +$obj = $rc->newLazyProxy(function () { + return new RealInstance; +}); +$obj->name = 0; + +var_dump($obj); + +?> +--EXPECTF-- +lazy proxy object(Proxy)#%d (1) { + ["instance"]=> + object(RealInstance)#%d (2) { + ["_"]=> + NULL + ["name"]=> + int(0) + } +} diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh20504-004.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh20504-004.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh20504-004.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh20504-004.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,28 @@ +--TEST-- +GH-20504: Assertion failure in zend_get_property_guard() when lazy proxy adds magic method - proxy defines __isset(), both have guards +--FILE-- +$name['']); + } +} +$rc = new ReflectionClass(Proxy::class); +$obj = $rc->newLazyProxy(function () { + return new RealInstance; +}); +var_dump(isset($obj->name[''])); + +?> +--EXPECT-- +Proxy::__isset +Proxy::__get +bool(false) diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh20504-005.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh20504-005.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh20504-005.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh20504-005.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,30 @@ +--TEST-- +GH-20504: Assertion failure in zend_get_property_guard() when lazy proxy adds magic method - unset +--FILE-- +$name); + } +} +$rc = new ReflectionClass(Proxy::class); +$obj = $rc->newLazyProxy(function () { + return new RealInstance; +}); +unset($obj->name); + +var_dump($obj); + +?> +--EXPECTF-- +lazy proxy object(Proxy)#%d (1) { + ["instance"]=> + object(RealInstance)#%d (1) { + ["_"]=> + NULL + } +} diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh20657-001.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh20657-001.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh20657-001.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh20657-001.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,32 @@ +--TEST-- +GH-20657: GC during zend_lazy_object_realize() +--CREDITS-- +vi3tL0u1s +--FILE-- +newLazyGhost(function ($obj) {}); + + // Add to roots + $obj2 = $obj; + unset($obj2); + + // Initialize all props to mark object non-lazy. Also create a cycle. + $reflector->getProperty('a')->setRawValueWithoutLazyInitialization($obj, $obj); +} + +var_dump($obj); + +?> +--EXPECTF-- +object(C)#%d (1) { + ["a"]=> + *RECURSION* +} diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh20657-002.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh20657-002.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh20657-002.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh20657-002.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,43 @@ +--TEST-- +GH-20657 002: GC during zend_lazy_object_realize() - reset as lazy during realize() +--FILE-- +self = $this; + } + public function __destruct() { + global $obj, $reflector; + $reflector->resetAsLazyGhost($obj, function () {}); + } +} + +new D(); + +$reflector = new ReflectionClass(C::class); + +for ($i = 0; $i < 10000; $i++) { + $obj = $reflector->newLazyGhost(function ($obj) {}); + + // Add to roots + $obj2 = $obj; + unset($obj2); + + // Initialize all props to mark object non-lazy. Also create a cycle. + $reflector->getProperty('a')->setRawValueWithoutLazyInitialization($obj, $obj); +} + +var_dump($obj); + +?> +--EXPECTF-- +object(C)#%d (1) { + ["a"]=> + *RECURSION* +} diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh20854.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh20854.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh20854.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh20854.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,22 @@ +--TEST-- +GH-20854 (Assertion in ZEND_RETURN_BY_REF with lazy proxy and return-by-ref __get) +--FILE-- +x; + } +} + +$rc = new ReflectionClass(C::class); +$obj = $rc->newLazyProxy(function () { + return new C; +}); +$obj->x; +echo "Done\n"; +?> +--EXPECTF-- +Deprecated: Creation of dynamic property C::$x is deprecated in %s on line %d +Done diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh20873.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh20873.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh20873.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh20873.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,30 @@ +--TEST-- +GH-20873 (Assertion failure in _zendi_try_convert_scalar_to_number with lazy proxy) +--FILE-- +x =& $this->_; + static $a = $a; + $e =& $this->_ - $a; + } +} +$rc = new ReflectionClass(A::class); +$obj = $rc->newLazyProxy(fn() => new A); +$rc->initializeLazyObject($obj); +var_dump($obj->p); +?> +--EXPECTF-- +Deprecated: Creation of dynamic property A::$x is deprecated in %s on line %d + +Warning: Undefined variable $a in %s on line %d + +Notice: Indirect modification of overloaded property A::$x has no effect in %s on line %d + +Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d +Stack trace: +#0 %s(%d): A->__get('p') +#1 {main} + thrown in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh20875.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh20875.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh20875.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh20875.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,41 @@ +--TEST-- +GH-20875 (Assertion failure in _get_zval_ptr_tmp with lazy proxy) +--FILE-- +f =& $this->b - $x > $y = new StdClass; + static $a = $a; + $t = 'x'; + foreach (get_defined_vars() as $key => $e) {} + if ($v ==!1) $x = $a ?: $t = "ok"; + } +} +$rc = new ReflectionClass(A::class); +$obj = $rc->newLazyProxy(function () { return new A; }); +$real = $rc->initializeLazyObject($obj); +var_dump($real->prop); +?> +--EXPECTF-- +Deprecated: Creation of dynamic property A::$b is deprecated in %s on line %d + +Deprecated: Creation of dynamic property A::$f is deprecated in %s on line %d + +Warning: Undefined variable $x in %s on line %d + +Notice: Object of class stdClass could not be converted to int in %s on line %d + +Warning: Undefined variable $a in %s on line %d + +Warning: Undefined variable $v in %s on line %d + +Notice: Indirect modification of overloaded property A::$f has no effect in %s on line %d + +Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d +Stack trace: +#0 %s(%d): A->__get('b') +#1 %s(%d): A->__get('prop') +#2 {main} + thrown in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh20875_proxy_get_no_init.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh20875_proxy_get_no_init.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh20875_proxy_get_no_init.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh20875_proxy_get_no_init.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,23 @@ +--TEST-- +GH-20875 (Lazy proxy should not initialize when __get handles dynamic property access) +--FILE-- +newLazyProxy(function () { + echo "init\n"; + return new Foo(); +}); +$x = &$proxy->x; + +?> +--EXPECT-- +__get diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh20905.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh20905.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh20905.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh20905.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,24 @@ +--TEST-- +GH-20905: Lazy proxy bailing __clone assertion +--CREDITS-- +Viet Hoang Luu (@vi3tL0u1s) +--FILE-- +newLazyProxy(fn() => new A); + +?> +--EXPECTF-- +Fatal error: Cannot redeclare function f() (previously declared in %s:%d) in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh21478-isset.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh21478-isset.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh21478-isset.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh21478-isset.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,30 @@ +--TEST-- +GH-21478: __isset on lazy proxy should not double-invoke when real instance guard is set +--FILE-- +{$name}); + } +} + +class Bar extends Foo {} + +$rc = new ReflectionClass(Bar::class); +$proxy = $rc->newLazyProxy(function () { + echo "Init\n"; + return new Foo(); +}); + +$real = $rc->initializeLazyObject($proxy); +isset($real->x); + +?> +--EXPECT-- +Init +__isset($x) on Foo diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh21478-proxy-get-override.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh21478-proxy-get-override.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh21478-proxy-get-override.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh21478-proxy-get-override.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,30 @@ +--TEST-- +GH-21478: Proxy's own __get runs when accessed directly (not from real instance) +--FILE-- +newLazyProxy(function () { + return new Foo(); +}); +$rc->initializeLazyObject($proxy); + +$proxy->x; + +?> +--EXPECT-- +Bar x diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh21478-proxy-get-ref-forward.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh21478-proxy-get-ref-forward.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh21478-proxy-get-ref-forward.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh21478-proxy-get-ref-forward.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,32 @@ +--TEST-- +GH-21478: No assertion failure when &__get forwards through initialized lazy proxy +--FILE-- +{$name}; + } +} + +class Bar extends Foo {} + +$rc = new ReflectionClass(Bar::class); +$proxy = $rc->newLazyProxy(function () { + echo "Init\n"; + return new Foo(); +}); + +$real = $rc->initializeLazyObject($proxy); +$a = &$real->x; +var_dump($a); +?> +--EXPECTF-- +Init +Foo::__get($x) on Foo + +Warning: Undefined property: Foo::$x in %s on line %d +NULL diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh21478-set.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh21478-set.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh21478-set.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh21478-set.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,32 @@ +--TEST-- +GH-21478: __set on lazy proxy should not double-invoke when real instance guard is set +--FILE-- +{$name} = $value; + } +} + +#[AllowDynamicProperties] +class Bar extends Foo {} + +$rc = new ReflectionClass(Bar::class); +$proxy = $rc->newLazyProxy(function () { + echo "Init\n"; + return new Foo(); +}); + +$real = $rc->initializeLazyObject($proxy); +$real->x = 1; + +?> +--EXPECT-- +Init +__set($x) on Foo diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh21478-unset.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh21478-unset.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh21478-unset.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh21478-unset.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,30 @@ +--TEST-- +GH-21478: __unset on lazy proxy should not double-invoke when real instance guard is set +--FILE-- +{$name}); + } +} + +class Bar extends Foo {} + +$rc = new ReflectionClass(Bar::class); +$proxy = $rc->newLazyProxy(function () { + echo "Init\n"; + return new Foo(); +}); + +$real = $rc->initializeLazyObject($proxy); +unset($real->x); + +?> +--EXPECT-- +Init +__unset($x) on Foo diff -Nru php8.4-8.4.16/Zend/tests/lazy_objects/gh21478.phpt php8.4-8.4.21/Zend/tests/lazy_objects/gh21478.phpt --- php8.4-8.4.16/Zend/tests/lazy_objects/gh21478.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/lazy_objects/gh21478.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,32 @@ +--TEST-- +GH-21478 (Property access on lazy proxy may invoke magic method despite real instance guards) +--FILE-- +{$name}; + } +} + +class Bar extends Foo {} + +$rc = new ReflectionClass(Bar::class); +$proxy = $rc->newLazyProxy(function () { + echo "Init\n"; + return new Foo(); +}); + +$real = $rc->initializeLazyObject($proxy); +$real->x; + +?> +--EXPECTF-- +Init +__get($x) on Foo + +Warning: Undefined property: Foo::$x in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/oss-fuzz-465488618.phpt php8.4-8.4.21/Zend/tests/oss-fuzz-465488618.phpt --- php8.4-8.4.16/Zend/tests/oss-fuzz-465488618.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/oss-fuzz-465488618.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,16 @@ +--TEST-- +OSS-Fuzz #465488618: Dump function signature with dynamic class const lookup default argument +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of B::test(string $x = ) must be compatible with A::test(int $x) in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/oss-fuzz-471486164-001.phpt php8.4-8.4.21/Zend/tests/oss-fuzz-471486164-001.phpt --- php8.4-8.4.16/Zend/tests/oss-fuzz-471486164-001.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/oss-fuzz-471486164-001.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,22 @@ +--TEST-- +OSS-Fuzz #471486164: get_property_ptr_ptr() on uninitialized hooked property +--FILE-- + $this->a; + set { $this->a = &$value; } + } + public $x = 1; +} + +$proxy = (new ReflectionClass(C::class))->newLazyProxy(function ($proxy) { + $proxy->a = 1; + return new C; +}); +var_dump($proxy->x); + +?> +--EXPECT-- +int(1) diff -Nru php8.4-8.4.16/Zend/tests/oss-fuzz-471486164-002.phpt php8.4-8.4.21/Zend/tests/oss-fuzz-471486164-002.phpt --- php8.4-8.4.16/Zend/tests/oss-fuzz-471486164-002.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/oss-fuzz-471486164-002.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,26 @@ +--TEST-- +OSS-Fuzz #471486164: get_property_ptr_ptr() on uninitialized hooked property +--FILE-- + $this->a; + set { + global $ref; + $this->a = &$ref; + } + } +} + +$ref = 1; +$proxy = new C; +$proxy->a = 1; +var_dump($proxy->a); +$ref++; +var_dump($proxy->a); + +?> +--EXPECT-- +int(1) +int(2) diff -Nru php8.4-8.4.16/Zend/tests/oss-fuzz-474613951.phpt php8.4-8.4.21/Zend/tests/oss-fuzz-474613951.phpt --- php8.4-8.4.16/Zend/tests/oss-fuzz-474613951.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/oss-fuzz-474613951.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,17 @@ +--TEST-- +OSS-Fuzz #474613951: Leaked parent property default value +--FILE-- + $this->prop; } +} + +class B extends A { + public $prop { get => 42; } +} + +?> +===DONE=== +--EXPECT-- +===DONE=== diff -Nru php8.4-8.4.16/Zend/tests/oss-fuzz-478009707.phpt php8.4-8.4.21/Zend/tests/oss-fuzz-478009707.phpt --- php8.4-8.4.16/Zend/tests/oss-fuzz-478009707.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/oss-fuzz-478009707.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,27 @@ +--TEST-- +OSS-Fuzz #478009707: Assign-op/inc/dec on untyped hooked property backing value +--FILE-- +prop = $value; + $this->prop += 1; + $this->prop++; + ++$this->prop; + } + } +} + +$c = new C(1); +$c->prop = 1; +var_dump($c->prop); + +$c->prop = PHP_INT_MAX; +var_dump($c->prop); + +?> +--EXPECTF-- +int(4) +float(%s) diff -Nru php8.4-8.4.16/Zend/tests/oss_fuzz_438780145.phpt php8.4-8.4.21/Zend/tests/oss_fuzz_438780145.phpt --- php8.4-8.4.16/Zend/tests/oss_fuzz_438780145.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/oss_fuzz_438780145.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,27 @@ +--TEST-- +OSS-Fuzz #438780145: Nested finally with repeated return type check may uaf +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught TypeError: test(): Return value must be of type int, string returned in %s:%d +Stack trace: +#0 %s(%d): test() +#1 {main} + thrown in %s on line %d diff -Nru php8.4-8.4.16/Zend/tests/property_hooks/gh20479.phpt php8.4-8.4.21/Zend/tests/property_hooks/gh20479.phpt --- php8.4-8.4.16/Zend/tests/property_hooks/gh20479.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/property_hooks/gh20479.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,40 @@ +--TEST-- +GH-20479: Hooked object properties overflow +--CREDITS-- +Viet Hoang Luu (@vi3tL0u1s) +--FILE-- +g = $obj->h = 'x'; +var_export($obj); + +?> +--EXPECT-- +\Trigger::__set_state(array( + 'a' => 'x', + 'b' => 'x', + 'c' => 'x', + 'd' => 'x', + 'e' => 'x', + 'f' => 'x', + 'trigger' => 'trigger', + 'h' => 'x', + 'g' => 'x', +)) diff -Nru php8.4-8.4.16/Zend/tests/stack_limit/stack_limit_015.phpt php8.4-8.4.21/Zend/tests/stack_limit/stack_limit_015.phpt --- php8.4-8.4.16/Zend/tests/stack_limit/stack_limit_015.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/tests/stack_limit/stack_limit_015.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -9,7 +9,7 @@ --EXTENSIONS-- zend_test --INI-- -zend.max_allowed_stack_size=128K +zend.max_allowed_stack_size=64K --FILE-- +#endif #ifdef __APPLE__ # include #endif diff -Nru php8.4-8.4.16/Zend/zend_compile.c php8.4-8.4.21/Zend/zend_compile.c --- php8.4-8.4.16/Zend/zend_compile.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_compile.c 2026-05-05 16:34:12.000000000 +0000 @@ -2188,7 +2188,7 @@ /* Note that on Win32 CWD is per drive (heritage from CP/M). * This means dirname("c:foo") maps to "c:." or "c:" - which means CWD on C: drive. */ - if ((2 <= len) && isalpha((int)((unsigned char *)path)[0]) && (':' == path[1])) { + if ((2 <= len) && isalpha((unsigned char)path[0]) && (':' == path[1])) { /* Skip over the drive spec (if any) so as not to change */ path += 2; len_adjust += 2; diff -Nru php8.4-8.4.16/Zend/zend_enum.c php8.4-8.4.21/Zend/zend_enum.c --- php8.4-8.4.16/Zend/zend_enum.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_enum.c 2026-05-05 16:34:12.000000000 +0000 @@ -528,6 +528,8 @@ zend_class_implements(ce, 1, zend_ce_backed_enum); } + ce->default_object_handlers = &zend_enum_object_handlers; + return ce; } diff -Nru php8.4-8.4.16/Zend/zend_execute.c php8.4-8.4.21/Zend/zend_execute.c --- php8.4-8.4.16/Zend/zend_execute.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_execute.c 2026-05-05 16:34:12.000000000 +0000 @@ -4673,20 +4673,6 @@ } /* }}} */ -static const zend_live_range *find_live_range(const zend_op_array *op_array, uint32_t op_num, uint32_t var_num) /* {{{ */ -{ - int i; - for (i = 0; i < op_array->last_live_range; i++) { - const zend_live_range *range = &op_array->live_range[i]; - if (op_num >= range->start && op_num < range->end - && var_num == (range->var & ~ZEND_LIVE_MASK)) { - return range; - } - } - return NULL; -} -/* }}} */ - static void cleanup_live_vars(zend_execute_data *execute_data, uint32_t op_num, uint32_t catch_op_num) /* {{{ */ { int i; @@ -4702,6 +4688,16 @@ uint32_t var_num = range->var & ~ZEND_LIVE_MASK; zval *var = EX_VAR(var_num); + /* Handle the split range for loop vars */ + if (catch_op_num) { + zend_op *final_op = EX(func)->op_array.opcodes + range->end; + if (final_op->extended_value & ZEND_FREE_ON_RETURN && (final_op->opcode == ZEND_FE_FREE || final_op->opcode == ZEND_FREE)) { + if (catch_op_num < range->end + final_op->op2.num) { + continue; + } + } + } + if (kind == ZEND_LIVE_TMPVAR) { zval_ptr_dtor_nogc(var); } else if (kind == ZEND_LIVE_NEW) { diff -Nru php8.4-8.4.16/Zend/zend_gc.c php8.4-8.4.21/Zend/zend_gc.c --- php8.4-8.4.16/Zend/zend_gc.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_gc.c 2026-05-05 16:34:12.000000000 +0000 @@ -76,6 +76,7 @@ #include "zend_types.h" #include "zend_weakrefs.h" #include "zend_string.h" +#include "zend_exceptions.h" #ifndef GC_BENCH # define GC_BENCH 0 @@ -1872,6 +1873,17 @@ return fiber; } +static void remember_prev_exception(zend_object **prev_exception) +{ + if (EG(exception)) { + if (*prev_exception) { + zend_exception_set_previous(EG(exception), *prev_exception); + } + *prev_exception = EG(exception); + EG(exception) = NULL; + } +} + static zend_never_inline void gc_call_destructors_in_fiber(uint32_t end) { ZEND_ASSERT(!GC_G(dtor_fiber_running)); @@ -1881,12 +1893,17 @@ GC_G(dtor_idx) = GC_FIRST_ROOT; GC_G(dtor_end) = GC_G(first_unused); + zend_object *exception = NULL; + remember_prev_exception(&exception); + if (UNEXPECTED(!fiber)) { fiber = gc_create_destructor_fiber(); } else { zend_fiber_resume(fiber, NULL, NULL); } + remember_prev_exception(&exception); + for (;;) { /* At this point, fiber has executed until suspension */ GC_TRACE("resumed from destructor fiber"); @@ -1900,7 +1917,9 @@ /* We do not own the fiber anymore. It may be collected if the * application does not reference it. */ zend_object_release(&fiber->std); + remember_prev_exception(&exception); fiber = gc_create_destructor_fiber(); + remember_prev_exception(&exception); continue; } else { /* Fiber suspended itself after calling all destructors */ @@ -1908,6 +1927,8 @@ break; } } + + EG(exception) = exception; } ZEND_API int zend_gc_collect_cycles(void) diff -Nru php8.4-8.4.16/Zend/zend_generators.c php8.4-8.4.21/Zend/zend_generators.c --- php8.4-8.4.16/Zend/zend_generators.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_generators.c 2026-05-05 16:34:12.000000000 +0000 @@ -313,7 +313,9 @@ zend_object *old_exception = NULL; const zend_op *old_opline_before_exception = NULL; if (EG(exception)) { - if (EG(current_execute_data)) { + if (EG(current_execute_data) + && EG(current_execute_data)->opline + && EG(current_execute_data)->opline->opcode == ZEND_HANDLE_EXCEPTION) { EG(current_execute_data)->opline = EG(opline_before_exception); old_opline_before_exception = EG(opline_before_exception); } @@ -330,7 +332,7 @@ zend_generator_resume(generator); if (old_exception) { - if (EG(current_execute_data)) { + if (old_opline_before_exception) { EG(current_execute_data)->opline = EG(exception_op); EG(opline_before_exception) = old_opline_before_exception; } diff -Nru php8.4-8.4.16/Zend/zend_hash.c php8.4-8.4.21/Zend/zend_hash.c --- php8.4-8.4.16/Zend/zend_hash.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_hash.c 2026-05-05 16:34:12.000000000 +0000 @@ -169,7 +169,7 @@ void *data; uint32_t nSize = ht->nTableSize; - ZEND_ASSERT(HT_SIZE_TO_MASK(nSize)); + ZEND_ASSERT(HT_SIZE_TO_MASK(nSize) != 0); if (UNEXPECTED(GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)) { data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), 1); @@ -351,7 +351,7 @@ uint32_t i; uint32_t nSize = ht->nTableSize; - ZEND_ASSERT(HT_SIZE_TO_MASK(nSize)); + ZEND_ASSERT(HT_SIZE_TO_MASK(nSize) != 0); HT_ASSERT_RC1(ht); // Alloc before assign to avoid inconsistencies on OOM @@ -399,7 +399,7 @@ if (nSize == 0) return; - ZEND_ASSERT(HT_SIZE_TO_MASK(nSize)); + ZEND_ASSERT(HT_SIZE_TO_MASK(nSize) != 0); if (UNEXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { if (nSize > ht->nTableSize) { @@ -1318,7 +1318,7 @@ uint32_t nSize = ht->nTableSize + ht->nTableSize; Bucket *old_buckets = ht->arData; - ZEND_ASSERT(HT_SIZE_TO_MASK(nSize)); + ZEND_ASSERT(HT_SIZE_TO_MASK(nSize) != 0); new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); ht->nTableSize = nSize; diff -Nru php8.4-8.4.16/Zend/zend_inheritance.c php8.4-8.4.21/Zend/zend_inheritance.c --- php8.4-8.4.16/Zend/zend_inheritance.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_inheritance.c 2026-05-05 16:34:12.000000000 +0000 @@ -988,7 +988,9 @@ zend_ast *ast = Z_ASTVAL_P(zv); if (ast->kind == ZEND_AST_CONSTANT) { smart_str_append(&str, zend_ast_get_constant_name(ast)); - } else if (ast->kind == ZEND_AST_CLASS_CONST) { + } else if (ast->kind == ZEND_AST_CLASS_CONST + && ast->child[1]->kind == ZEND_AST_ZVAL + && Z_TYPE_P(zend_ast_get_zval(ast->child[1])) == IS_STRING) { smart_str_append(&str, zend_ast_get_str(ast->child[0])); smart_str_appends(&str, "::"); smart_str_append(&str, zend_ast_get_str(ast->child[1])); @@ -1493,10 +1495,9 @@ } int parent_num = OBJ_PROP_TO_NUM(parent_info->offset); + /* Don't keep default properties in GC (they may be freed by opcache) */ + zval_ptr_dtor_nogc(&(ce->default_properties_table[parent_num])); if (child_info->offset != ZEND_VIRTUAL_PROPERTY_OFFSET) { - /* Don't keep default properties in GC (they may be freed by opcache) */ - zval_ptr_dtor_nogc(&(ce->default_properties_table[parent_num])); - if (use_child_prop) { ZVAL_UNDEF(&ce->default_properties_table[parent_num]); } else { @@ -2756,6 +2757,19 @@ ); } +static void emit_trait_constant_enum_case_conflict_error( + const zend_class_entry *ce, const zend_class_constant *trait_constant, zend_string *name +) { + zend_error_noreturn(E_COMPILE_ERROR, + "Cannot use trait %s, because %s::%s conflicts with enum case %s::%s", + ZSTR_VAL(trait_constant->ce->name), + ZSTR_VAL(trait_constant->ce->name), + ZSTR_VAL(name), + ZSTR_VAL(ce->name), + ZSTR_VAL(name) + ); +} + static bool do_trait_constant_check( zend_class_entry *ce, zend_class_constant *trait_constant, zend_string *name, zend_class_entry **traits, size_t current_trait ) { @@ -2769,6 +2783,11 @@ zend_class_constant *existing_constant = Z_PTR_P(zv); + if (UNEXPECTED(ZEND_CLASS_CONST_FLAGS(existing_constant) & ZEND_CLASS_CONST_IS_CASE)) { + emit_trait_constant_enum_case_conflict_error(ce, trait_constant, name); + return false; + } + if ((ZEND_CLASS_CONST_FLAGS(trait_constant) & flags_mask) != (ZEND_CLASS_CONST_FLAGS(existing_constant) & flags_mask)) { emit_incompatible_trait_constant_error(ce, existing_constant, trait_constant, name, traits, current_trait); return false; diff -Nru php8.4-8.4.16/Zend/zend_ini.c php8.4-8.4.21/Zend/zend_ini.c --- php8.4-8.4.16/Zend/zend_ini.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_ini.c 2026-05-05 16:34:12.000000000 +0000 @@ -595,7 +595,7 @@ ++digits_consumed; } - if (digits_consumed[0] == '0' && !isdigit(digits_consumed[1])) { + if (digits_consumed[0] == '0' && !isdigit((unsigned char)digits_consumed[1])) { /* Value is just 0 */ if ((digits_consumed+1) == str_end) { return digits_consumed; @@ -653,7 +653,7 @@ } /* if there is no digit after +/- */ - if (!isdigit(digits[0])) { + if (!isdigit((unsigned char)digits[0])) { /* Escape the string to avoid null bytes and to make non-printable chars * visible */ smart_str_append_escaped(&invalid, ZSTR_VAL(value), ZSTR_LEN(value)); @@ -667,7 +667,7 @@ } int base = 0; - if (digits[0] == '0' && !isdigit(digits[1])) { + if (digits[0] == '0' && !isdigit((unsigned char)digits[1])) { /* Value is just 0 */ if ((digits+1) == str_end) { *errstr = NULL; diff -Nru php8.4-8.4.16/Zend/zend_ini_scanner.c php8.4-8.4.21/Zend/zend_ini_scanner.c --- php8.4-8.4.16/Zend/zend_ini_scanner.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_ini_scanner.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 3.1 */ +/* Generated by re2c 4.3 */ /* +----------------------------------------------------------------------+ | Zend Engine | @@ -147,10 +147,10 @@ if (SCNG(scanner_mode) == ZEND_INI_SCANNER_TYPED && \ (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW))) {\ zend_ini_copy_typed_value(ini_lval, type, str, len); \ - Z_EXTRA_P(ini_lval) = 0; \ } else { \ zend_ini_copy_value(ini_lval, str, len); \ } \ + Z_EXTRA_P(ini_lval) = 0; \ return type; \ } @@ -355,319 +355,305 @@ { YYCTYPE yych; unsigned int yyaccept = 0; - static const unsigned char yybm_INITIAL[] = { - 128, 144, 144, 144, 144, 144, 144, 144, - 144, 160, 0, 144, 144, 0, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 240, 128, 128, 144, 128, 144, 128, 144, - 128, 128, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 128, 144, 128, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 128, 144, 128, 128, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 128, 128, 128, 128, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, + static const unsigned char yybm_INITIAL[256] = { + 128, 144, 144, 144, 144, 144, 144, 144, + 144, 160, 0, 144, 144, 0, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 240, 128, 128, 144, 128, 144, 128, 144, + 128, 128, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 144, 128, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 144, 128, 128, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 128, 128, 128, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144 }; - static const unsigned char yybm_ST_OFFSET[] = { - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 140, 128, 132, 132, 128, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 140, 132, 128, 132, 192, 132, 132, 0, - 132, 132, 132, 132, 132, 132, 132, 132, - 180, 180, 180, 180, 180, 180, 180, 180, - 180, 180, 132, 128, 132, 132, 132, 132, - 132, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 132, 192, 128, 132, 164, - 132, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, + static const unsigned char yybm_ST_OFFSET[256] = { + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 140, 128, 132, 132, 128, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 140, 132, 128, 132, 192, 132, 132, 0, + 132, 132, 132, 132, 132, 132, 132, 132, + 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 132, 128, 132, 132, 132, 132, + 132, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 132, 192, 128, 132, 164, + 132, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132 }; - static const unsigned char yybm_ST_SECTION_VALUE[] = { - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 140, 128, 132, 132, 128, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 140, 132, 128, 132, 192, 132, 132, 0, - 132, 132, 132, 132, 132, 132, 132, 132, - 180, 180, 180, 180, 180, 180, 180, 180, - 180, 180, 132, 128, 132, 132, 132, 132, - 132, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 132, 192, 128, 132, 164, - 132, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, + static const unsigned char yybm_ST_SECTION_VALUE[256] = { + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 140, 128, 132, 132, 128, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 140, 132, 128, 132, 192, 132, 132, 0, + 132, 132, 132, 132, 132, 132, 132, 132, + 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 132, 128, 132, 132, 132, 132, + 132, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 132, 192, 128, 132, 164, + 132, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132 }; - static const unsigned char yybm_ST_VALUE[] = { - 80, 82, 82, 82, 82, 82, 82, 82, - 82, 84, 64, 82, 82, 64, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 84, 80, 80, 82, 208, 82, 80, 16, - 80, 80, 82, 82, 82, 82, 82, 82, - 122, 122, 122, 122, 122, 122, 122, 122, - 122, 122, 82, 80, 82, 80, 82, 82, - 82, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 82, 82, 82, 80, 114, - 82, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 82, 80, 82, 80, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, + static const unsigned char yybm_ST_VALUE[256] = { + 80, 82, 82, 82, 82, 82, 82, 82, + 82, 84, 64, 82, 82, 64, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 84, 80, 80, 82, 208, 82, 80, 16, + 80, 80, 82, 82, 82, 82, 82, 82, + 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 82, 80, 82, 80, 82, 82, + 82, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 82, 82, 82, 80, 114, + 82, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 82, 80, 82, 80, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82 }; - static const unsigned char yybm_ST_SECTION_RAW[] = { - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 192, 0, 64, 64, 0, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 192, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 0, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, + static const unsigned char yybm_ST_SECTION_RAW[256] = { + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 192, 0, 64, 64, 0, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 192, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 0, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64 }; - static const unsigned char yybm_ST_DOUBLE_QUOTES[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + static const unsigned char yybm_ST_DOUBLE_QUOTES[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }; - static const unsigned char yybm_ST_VAR_FALLBACK[] = { - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 24, 0, 8, 8, 0, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 24, 8, 0, 8, 128, 8, 8, 0, - 8, 8, 8, 8, 8, 8, 8, 8, - 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 8, 0, 8, 8, 8, 8, - 8, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 8, 128, 8, 8, 72, - 8, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 8, 8, 0, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, + static const unsigned char yybm_ST_VAR_FALLBACK[256] = { + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 24, 0, 8, 8, 0, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 24, 8, 0, 8, 128, 8, 8, 0, + 8, 8, 8, 8, 8, 8, 8, 8, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 8, 0, 8, 8, 8, 8, + 8, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 8, 128, 8, 8, 72, + 8, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 8, 8, 0, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8 }; - static const unsigned char yybm_ST_RAW[] = { - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 192, 0, 64, 64, 0, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 192, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, + static const unsigned char yybm_ST_RAW[256] = { + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 192, 0, 64, 64, 0, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 192, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64 }; if (YYGETCONDITION() < 4) { if (YYGETCONDITION() < 2) { - if (YYGETCONDITION() < 1) { - goto yyc_INITIAL; - } else { - goto yyc_ST_OFFSET; - } + if (YYGETCONDITION() < 1) goto yyc_INITIAL; + else goto yyc_ST_OFFSET; } else { - if (YYGETCONDITION() < 3) { - goto yyc_ST_SECTION_VALUE; - } else { - goto yyc_ST_VALUE; - } + if (YYGETCONDITION() < 3) goto yyc_ST_SECTION_VALUE; + else goto yyc_ST_VALUE; } } else { if (YYGETCONDITION() < 6) { - if (YYGETCONDITION() < 5) { - goto yyc_ST_SECTION_RAW; - } else { - goto yyc_ST_DOUBLE_QUOTES; - } + if (YYGETCONDITION() < 5) goto yyc_ST_SECTION_RAW; + else goto yyc_ST_DOUBLE_QUOTES; } else { if (YYGETCONDITION() < 7) { goto yyc_ST_VAR_FALLBACK; } else { - if (YYGETCONDITION() < 8) { - goto yyc_ST_VARNAME; - } else { - goto yyc_ST_RAW; - } + if (YYGETCONDITION() < 8) goto yyc_ST_VARNAME; + else goto yyc_ST_RAW; } } } /* *********************************** */ yyc_INITIAL: - YYDEBUG(0, *YYCURSOR); YYFILL(5); yych = *YYCURSOR; - if (yybm_INITIAL[0+yych] & 64) { - goto yy9; - } + YYDEBUG(0, yych); + if (yybm_INITIAL[0+yych] & 64) goto yy9; if (yych <= 'M') { if (yych <= '$') { if (yych <= '\f') { @@ -758,19 +744,17 @@ return 0; } yy1: - YYDEBUG(1, *YYCURSOR); + YYDEBUG(1, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; yy2: - YYDEBUG(2, *YYCURSOR); - if (yybm_INITIAL[0+yych] & 16) { - goto yy1; - } + YYDEBUG(2, yych); + if (yybm_INITIAL[0+yych] & 16) goto yy1; if (yych <= '=') goto yy3; if (yych <= '[') goto yy19; yy3: - YYDEBUG(3, *YYCURSOR); + YYDEBUG(3, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Get option name */ /* Eat leading whitespace */ @@ -782,13 +766,11 @@ RETURN_TOKEN(TC_LABEL, yytext, yyleng); } yy4: - YYDEBUG(4, *YYCURSOR); + YYDEBUG(4, yych); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - if (yybm_INITIAL[0+yych] & 32) { - goto yy4; - } + if (yybm_INITIAL[0+yych] & 32) goto yy4; if (yych <= '\r') { if (yych <= 0x08) goto yy5; if (yych <= '\n') goto yy6; @@ -801,35 +783,33 @@ } } yy5: - YYDEBUG(5, *YYCURSOR); + YYDEBUG(5, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* eat whitespace */ goto restart; } yy6: - YYDEBUG(6, *YYCURSOR); + YYDEBUG(6, yych); ++YYCURSOR; yy7: - YYDEBUG(7, *YYCURSOR); + YYDEBUG(7, yych); yyleng = YYCURSOR - SCNG(yy_text); { SCNG(lineno)++; return END_OF_LINE; } yy8: - YYDEBUG(8, *YYCURSOR); + YYDEBUG(8, yych); yych = *++YYCURSOR; if (yych == '\n') goto yy6; goto yy7; yy9: - YYDEBUG(9, *YYCURSOR); + YYDEBUG(9, yych); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - if (yybm_INITIAL[0+yych] & 64) { - goto yy9; - } + if (yybm_INITIAL[0+yych] & 64) goto yy9; if (yych <= '&') { if (yych <= '\r') { if (yych <= '\t') { @@ -875,24 +855,22 @@ } } yy10: - YYDEBUG(10, *YYCURSOR); + YYDEBUG(10, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Disallow these chars outside option values */ return yytext[0]; } yy11: - YYDEBUG(11, *YYCURSOR); + YYDEBUG(11, yych); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - if (yybm_INITIAL[0+yych] & 128) { - goto yy11; - } + if (yybm_INITIAL[0+yych] & 128) goto yy11; if (yych <= '\n') goto yy20; goto yy22; yy12: - YYDEBUG(12, *YYCURSOR); + YYDEBUG(12, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -908,13 +886,13 @@ return '='; } yy13: - YYDEBUG(13, *YYCURSOR); + YYDEBUG(13, yych); yych = *++YYCURSOR; if (yych == 'A') goto yy23; if (yych == 'a') goto yy23; goto yy2; yy14: - YYDEBUG(14, *YYCURSOR); + YYDEBUG(14, yych); yych = *++YYCURSOR; if (yych <= 'U') { if (yych == 'O') goto yy24; @@ -930,7 +908,7 @@ } } yy15: - YYDEBUG(15, *YYCURSOR); + YYDEBUG(15, yych); yych = *++YYCURSOR; if (yych <= 'N') { if (yych == 'F') goto yy27; @@ -946,19 +924,19 @@ } } yy16: - YYDEBUG(16, *YYCURSOR); + YYDEBUG(16, yych); yych = *++YYCURSOR; if (yych == 'R') goto yy30; if (yych == 'r') goto yy30; goto yy2; yy17: - YYDEBUG(17, *YYCURSOR); + YYDEBUG(17, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy31; if (yych == 'e') goto yy31; goto yy2; yy18: - YYDEBUG(18, *YYCURSOR); + YYDEBUG(18, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Section start */ @@ -971,7 +949,7 @@ return TC_SECTION; } yy19: - YYDEBUG(19, *YYCURSOR); + YYDEBUG(19, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -991,10 +969,10 @@ RETURN_TOKEN(TC_OFFSET, yytext, yyleng); } yy20: - YYDEBUG(20, *YYCURSOR); + YYDEBUG(20, yych); ++YYCURSOR; yy21: - YYDEBUG(21, *YYCURSOR); + YYDEBUG(21, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Comment */ BEGIN(INITIAL); @@ -1002,18 +980,18 @@ return END_OF_LINE; } yy22: - YYDEBUG(22, *YYCURSOR); + YYDEBUG(22, yych); yych = *++YYCURSOR; if (yych == '\n') goto yy20; goto yy21; yy23: - YYDEBUG(23, *YYCURSOR); + YYDEBUG(23, yych); yych = *++YYCURSOR; if (yych == 'L') goto yy32; if (yych == 'l') goto yy32; goto yy2; yy24: - YYDEBUG(24, *YYCURSOR); + YYDEBUG(24, yych); yych = *++YYCURSOR; if (yych <= '\'') { if (yych <= 0x1F) { @@ -1056,25 +1034,25 @@ } } yy25: - YYDEBUG(25, *YYCURSOR); + YYDEBUG(25, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* FALSE value (when used outside option value/offset this causes parse error!)*/ RETURN_TOKEN(BOOL_FALSE, "", 0); } yy26: - YYDEBUG(26, *YYCURSOR); + YYDEBUG(26, yych); yych = *++YYCURSOR; if (yych == 'L') goto yy36; if (yych == 'l') goto yy36; goto yy2; yy27: - YYDEBUG(27, *YYCURSOR); + YYDEBUG(27, yych); yych = *++YYCURSOR; if (yych == 'F') goto yy34; if (yych == 'f') goto yy34; goto yy2; yy28: - YYDEBUG(28, *YYCURSOR); + YYDEBUG(28, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -1117,31 +1095,31 @@ } } yy29: - YYDEBUG(29, *YYCURSOR); + YYDEBUG(29, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* TRUE value (when used outside option value/offset this causes parse error!) */ RETURN_TOKEN(BOOL_TRUE, "1", 1); } yy30: - YYDEBUG(30, *YYCURSOR); + YYDEBUG(30, yych); yych = *++YYCURSOR; if (yych == 'U') goto yy38; if (yych == 'u') goto yy38; goto yy2; yy31: - YYDEBUG(31, *YYCURSOR); + YYDEBUG(31, yych); yych = *++YYCURSOR; if (yych == 'S') goto yy28; if (yych == 's') goto yy28; goto yy2; yy32: - YYDEBUG(32, *YYCURSOR); + YYDEBUG(32, yych); yych = *++YYCURSOR; if (yych == 'S') goto yy35; if (yych == 's') goto yy35; goto yy2; yy33: - YYDEBUG(33, *YYCURSOR); + YYDEBUG(33, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -1149,7 +1127,7 @@ if (yych == ' ') goto yy33; goto yy25; yy34: - YYDEBUG(34, *YYCURSOR); + YYDEBUG(34, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -1198,19 +1176,19 @@ } } yy35: - YYDEBUG(35, *YYCURSOR); + YYDEBUG(35, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy34; if (yych == 'e') goto yy34; goto yy2; yy36: - YYDEBUG(36, *YYCURSOR); + YYDEBUG(36, yych); yych = *++YYCURSOR; if (yych == 'L') goto yy39; if (yych == 'l') goto yy39; goto yy2; yy37: - YYDEBUG(37, *YYCURSOR); + YYDEBUG(37, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -1218,13 +1196,13 @@ if (yych == ' ') goto yy37; goto yy29; yy38: - YYDEBUG(38, *YYCURSOR); + YYDEBUG(38, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy28; if (yych == 'e') goto yy28; goto yy2; yy39: - YYDEBUG(39, *YYCURSOR); + YYDEBUG(39, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -1267,13 +1245,13 @@ } } yy40: - YYDEBUG(40, *YYCURSOR); + YYDEBUG(40, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(NULL_NULL, "", 0); } yy41: - YYDEBUG(41, *YYCURSOR); + YYDEBUG(41, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -1282,12 +1260,10 @@ goto yy40; /* *********************************** */ yyc_ST_OFFSET: - YYDEBUG(42, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; - if (yybm_ST_OFFSET[0+yych] & 8) { - goto yy46; - } + YYDEBUG(42, yych); + if (yybm_ST_OFFSET[0+yych] & 8) goto yy46; if (yych <= '/') { if (yych <= '"') { if (yych <= '\f') { @@ -1326,35 +1302,31 @@ } } yy43: - YYDEBUG(43, *YYCURSOR); + YYDEBUG(43, yych); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; yy44: - YYDEBUG(44, *YYCURSOR); - if (yybm_ST_OFFSET[0+yych] & 4) { - goto yy43; - } + YYDEBUG(44, yych); + if (yybm_ST_OFFSET[0+yych] & 4) goto yy43; if (yych <= '"') goto yy45; if (yych <= '$') goto yy59; if (yych <= ';') goto yy45; if (yych <= '\\') goto yy57; yy45: - YYDEBUG(45, *YYCURSOR); + YYDEBUG(45, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Get rest as section/offset value */ RETURN_TOKEN(TC_STRING, yytext, yyleng); } yy46: - YYDEBUG(46, *YYCURSOR); + YYDEBUG(46, yych); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_OFFSET[0+yych] & 8) { - goto yy46; - } + if (yybm_ST_OFFSET[0+yych] & 8) goto yy46; if (yych <= '$') { if (yych <= '\r') { if (yych <= 0x08) goto yy43; @@ -1379,16 +1351,16 @@ } } yy47: - YYDEBUG(47, *YYCURSOR); + YYDEBUG(47, yych); ++YYCURSOR; yy48: - YYDEBUG(48, *YYCURSOR); + YYDEBUG(48, yych); yyleng = YYCURSOR - SCNG(yy_text); { return 0; } yy49: - YYDEBUG(49, *YYCURSOR); + YYDEBUG(49, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Double quoted '"' string start */ @@ -1396,7 +1368,7 @@ return '"'; } yy50: - YYDEBUG(50, *YYCURSOR); + YYDEBUG(50, yych); yych = *++YYCURSOR; if (yych <= '\\') { if (yych <= 0x00) goto yy48; @@ -1407,28 +1379,24 @@ goto yy43; } yy51: - YYDEBUG(51, *YYCURSOR); + YYDEBUG(51, yych); yych = *++YYCURSOR; - if (yybm_ST_OFFSET[0+yych] & 128) { - goto yy63; - } + if (yybm_ST_OFFSET[0+yych] & 128) goto yy63; goto yy48; yy52: - YYDEBUG(52, *YYCURSOR); + YYDEBUG(52, yych); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') goto yy44; if (yych <= '9') goto yy64; goto yy44; yy53: - YYDEBUG(53, *YYCURSOR); + YYDEBUG(53, yych); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_OFFSET[0+yych] & 16) { - goto yy53; - } + if (yybm_ST_OFFSET[0+yych] & 16) goto yy53; if (yych <= '&') { if (yych <= '\r') { if (yych == '\n') goto yy54; @@ -1456,20 +1424,18 @@ } } yy54: - YYDEBUG(54, *YYCURSOR); + YYDEBUG(54, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Get number option value as string */ RETURN_TOKEN(TC_NUMBER, yytext, yyleng); } yy55: - YYDEBUG(55, *YYCURSOR); + YYDEBUG(55, yych); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_OFFSET[0+yych] & 32) { - goto yy55; - } + if (yybm_ST_OFFSET[0+yych] & 32) goto yy55; if (yych <= '$') { if (yych <= '\r') { if (yych == '\n') goto yy56; @@ -1490,18 +1456,18 @@ } } yy56: - YYDEBUG(56, *YYCURSOR); + YYDEBUG(56, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Get constant option value */ RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); } yy57: - YYDEBUG(57, *YYCURSOR); + YYDEBUG(57, yych); ++YYCURSOR; YYFILL(1); goto yy43; yy58: - YYDEBUG(58, *YYCURSOR); + YYDEBUG(58, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* End of section or an option offset */ @@ -1509,7 +1475,7 @@ return ']'; } yy59: - YYDEBUG(59, *YYCURSOR); + YYDEBUG(59, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -1521,28 +1487,23 @@ if (yych != '{') goto yy43; } yy60: - YYDEBUG(60, *YYCURSOR); + YYDEBUG(60, yych); YYCURSOR = YYMARKER; if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy45; - } else { - goto yy54; - } + if (yyaccept == 0) goto yy45; + else goto yy54; } else { goto yy56; } yy61: - YYDEBUG(61, *YYCURSOR); + YYDEBUG(61, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_OFFSET[0+yych] & 64) { - goto yy61; - } + if (yybm_ST_OFFSET[0+yych] & 64) goto yy61; goto yy43; yy62: - YYDEBUG(62, *YYCURSOR); + YYDEBUG(62, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Variable start */ @@ -1550,16 +1511,14 @@ return TC_DOLLAR_CURLY; } yy63: - YYDEBUG(63, *YYCURSOR); + YYDEBUG(63, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_OFFSET[0+yych] & 128) { - goto yy63; - } + if (yybm_ST_OFFSET[0+yych] & 128) goto yy63; goto yy65; yy64: - YYDEBUG(64, *YYCURSOR); + YYDEBUG(64, yych); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -1596,7 +1555,7 @@ } } yy65: - YYDEBUG(65, *YYCURSOR); + YYDEBUG(65, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Raw string */ @@ -1609,12 +1568,10 @@ } /* *********************************** */ yyc_ST_SECTION_VALUE: - YYDEBUG(66, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; - if (yybm_ST_SECTION_VALUE[0+yych] & 8) { - goto yy70; - } + YYDEBUG(66, yych); + if (yybm_ST_SECTION_VALUE[0+yych] & 8) goto yy70; if (yych <= '/') { if (yych <= '"') { if (yych <= '\f') { @@ -1653,35 +1610,31 @@ } } yy67: - YYDEBUG(67, *YYCURSOR); + YYDEBUG(67, yych); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; yy68: - YYDEBUG(68, *YYCURSOR); - if (yybm_ST_SECTION_VALUE[0+yych] & 4) { - goto yy67; - } + YYDEBUG(68, yych); + if (yybm_ST_SECTION_VALUE[0+yych] & 4) goto yy67; if (yych <= '"') goto yy69; if (yych <= '$') goto yy84; if (yych <= ';') goto yy69; if (yych <= '\\') goto yy81; yy69: - YYDEBUG(69, *YYCURSOR); + YYDEBUG(69, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Get rest as section/offset value */ RETURN_TOKEN(TC_STRING, yytext, yyleng); } yy70: - YYDEBUG(70, *YYCURSOR); + YYDEBUG(70, yych); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_SECTION_VALUE[0+yych] & 8) { - goto yy70; - } + if (yybm_ST_SECTION_VALUE[0+yych] & 8) goto yy70; if (yych <= '$') { if (yych <= '\r') { if (yych <= 0x08) goto yy67; @@ -1706,16 +1659,16 @@ } } yy71: - YYDEBUG(71, *YYCURSOR); + YYDEBUG(71, yych); ++YYCURSOR; yy72: - YYDEBUG(72, *YYCURSOR); + YYDEBUG(72, yych); yyleng = YYCURSOR - SCNG(yy_text); { return 0; } yy73: - YYDEBUG(73, *YYCURSOR); + YYDEBUG(73, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Double quoted '"' string start */ @@ -1723,7 +1676,7 @@ return '"'; } yy74: - YYDEBUG(74, *YYCURSOR); + YYDEBUG(74, yych); yych = *++YYCURSOR; if (yych <= '\\') { if (yych <= 0x00) goto yy72; @@ -1734,28 +1687,24 @@ goto yy67; } yy75: - YYDEBUG(75, *YYCURSOR); + YYDEBUG(75, yych); yych = *++YYCURSOR; - if (yybm_ST_SECTION_VALUE[0+yych] & 128) { - goto yy88; - } + if (yybm_ST_SECTION_VALUE[0+yych] & 128) goto yy88; goto yy72; yy76: - YYDEBUG(76, *YYCURSOR); + YYDEBUG(76, yych); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') goto yy68; if (yych <= '9') goto yy89; goto yy68; yy77: - YYDEBUG(77, *YYCURSOR); + YYDEBUG(77, yych); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_SECTION_VALUE[0+yych] & 16) { - goto yy77; - } + if (yybm_ST_SECTION_VALUE[0+yych] & 16) goto yy77; if (yych <= '&') { if (yych <= '\r') { if (yych == '\n') goto yy78; @@ -1783,20 +1732,18 @@ } } yy78: - YYDEBUG(78, *YYCURSOR); + YYDEBUG(78, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Get number option value as string */ RETURN_TOKEN(TC_NUMBER, yytext, yyleng); } yy79: - YYDEBUG(79, *YYCURSOR); + YYDEBUG(79, yych); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_SECTION_VALUE[0+yych] & 32) { - goto yy79; - } + if (yybm_ST_SECTION_VALUE[0+yych] & 32) goto yy79; if (yych <= '$') { if (yych <= '\r') { if (yych == '\n') goto yy80; @@ -1817,18 +1764,18 @@ } } yy80: - YYDEBUG(80, *YYCURSOR); + YYDEBUG(80, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Get constant option value */ RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); } yy81: - YYDEBUG(81, *YYCURSOR); + YYDEBUG(81, yych); ++YYCURSOR; YYFILL(1); goto yy67; yy82: - YYDEBUG(82, *YYCURSOR); + YYDEBUG(82, yych); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; @@ -1841,7 +1788,7 @@ if (yych == ' ') goto yy82; } yy83: - YYDEBUG(83, *YYCURSOR); + YYDEBUG(83, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* End of section */ BEGIN(INITIAL); @@ -1849,7 +1796,7 @@ return ']'; } yy84: - YYDEBUG(84, *YYCURSOR); + YYDEBUG(84, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -1861,28 +1808,23 @@ if (yych != '{') goto yy67; } yy85: - YYDEBUG(85, *YYCURSOR); + YYDEBUG(85, yych); YYCURSOR = YYMARKER; if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy69; - } else { - goto yy78; - } + if (yyaccept == 0) goto yy69; + else goto yy78; } else { goto yy80; } yy86: - YYDEBUG(86, *YYCURSOR); + YYDEBUG(86, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_SECTION_VALUE[0+yych] & 64) { - goto yy86; - } + if (yybm_ST_SECTION_VALUE[0+yych] & 64) goto yy86; goto yy67; yy87: - YYDEBUG(87, *YYCURSOR); + YYDEBUG(87, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Variable start */ @@ -1890,16 +1832,14 @@ return TC_DOLLAR_CURLY; } yy88: - YYDEBUG(88, *YYCURSOR); + YYDEBUG(88, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_SECTION_VALUE[0+yych] & 128) { - goto yy88; - } + if (yybm_ST_SECTION_VALUE[0+yych] & 128) goto yy88; goto yy92; yy89: - YYDEBUG(89, *YYCURSOR); + YYDEBUG(89, yych); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -1936,16 +1876,16 @@ } } yy90: - YYDEBUG(90, *YYCURSOR); + YYDEBUG(90, yych); ++YYCURSOR; goto yy83; yy91: - YYDEBUG(91, *YYCURSOR); + YYDEBUG(91, yych); yych = *++YYCURSOR; if (yych == '\n') goto yy90; goto yy83; yy92: - YYDEBUG(92, *YYCURSOR); + YYDEBUG(92, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Raw string */ @@ -1958,12 +1898,10 @@ } /* *********************************** */ yyc_ST_VALUE: - YYDEBUG(93, *YYCURSOR); YYFILL(6); yych = *YYCURSOR; - if (yybm_ST_VALUE[0+yych] & 4) { - goto yy99; - } + YYDEBUG(93, yych); + if (yybm_ST_VALUE[0+yych] & 4) goto yy99; switch (yych) { case 0x00: goto yy94; case '\t': @@ -2050,42 +1988,38 @@ default: goto yy96; } yy94: - YYDEBUG(94, *YYCURSOR); + YYDEBUG(94, yych); ++YYCURSOR; yy95: - YYDEBUG(95, *YYCURSOR); + YYDEBUG(95, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* End of option value (if EOF is reached before EOL */ BEGIN(INITIAL); return END_OF_LINE; } yy96: - YYDEBUG(96, *YYCURSOR); + YYDEBUG(96, yych); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; yy97: - YYDEBUG(97, *YYCURSOR); - if (yybm_ST_VALUE[0+yych] & 2) { - goto yy96; - } + YYDEBUG(97, yych); + if (yybm_ST_VALUE[0+yych] & 2) goto yy96; if (yych <= '"') goto yy98; if (yych <= '$') goto yy120; yy98: - YYDEBUG(98, *YYCURSOR); + YYDEBUG(98, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Get everything else as option/offset value */ RETURN_TOKEN(TC_STRING, yytext, yyleng); } yy99: - YYDEBUG(99, *YYCURSOR); + YYDEBUG(99, yych); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - if (yybm_ST_VALUE[0+yych] & 4) { - goto yy99; - } + if (yybm_ST_VALUE[0+yych] & 4) goto yy99; if (yych <= '\r') { if (yych <= 0x08) goto yy100; if (yych <= '\n') goto yy101; @@ -2098,16 +2032,16 @@ } } yy100: - YYDEBUG(100, *YYCURSOR); + YYDEBUG(100, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng); } yy101: - YYDEBUG(101, *YYCURSOR); + YYDEBUG(101, yych); ++YYCURSOR; yy102: - YYDEBUG(102, *YYCURSOR); + YYDEBUG(102, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* End of option value */ BEGIN(INITIAL); @@ -2115,12 +2049,12 @@ return END_OF_LINE; } yy103: - YYDEBUG(103, *YYCURSOR); + YYDEBUG(103, yych); yych = *++YYCURSOR; if (yych == '\n') goto yy101; goto yy102; yy104: - YYDEBUG(104, *YYCURSOR); + YYDEBUG(104, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -2131,7 +2065,7 @@ return yytext[0]; } yy105: - YYDEBUG(105, *YYCURSOR); + YYDEBUG(105, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Double quoted '"' string start */ @@ -2139,7 +2073,7 @@ return '"'; } yy106: - YYDEBUG(106, *YYCURSOR); + YYDEBUG(106, yych); yych = *++YYCURSOR; if (yych <= '\\') { if (yych <= 0x00) goto yy95; @@ -2150,28 +2084,24 @@ goto yy96; } yy107: - YYDEBUG(107, *YYCURSOR); + YYDEBUG(107, yych); yych = *++YYCURSOR; - if (yybm_ST_VALUE[0+yych] & 64) { - goto yy124; - } + if (yybm_ST_VALUE[0+yych] & 64) goto yy124; goto yy95; yy108: - YYDEBUG(108, *YYCURSOR); + YYDEBUG(108, yych); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') goto yy97; if (yych <= '9') goto yy125; goto yy97; yy109: - YYDEBUG(109, *YYCURSOR); + YYDEBUG(109, yych); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VALUE[0+yych] & 8) { - goto yy109; - } + if (yybm_ST_VALUE[0+yych] & 8) goto yy109; if (yych <= '-') { if (yych <= 0x1F) { if (yych <= '\n') { @@ -2208,23 +2138,21 @@ } } yy110: - YYDEBUG(110, *YYCURSOR); + YYDEBUG(110, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Get number option value as string */ RETURN_TOKEN(TC_NUMBER, yytext, yyleng); } yy111: - YYDEBUG(111, *YYCURSOR); + YYDEBUG(111, yych); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - if (yybm_ST_VALUE[0+yych] & 16) { - goto yy111; - } + if (yybm_ST_VALUE[0+yych] & 16) goto yy111; if (yych <= '\n') goto yy126; goto yy128; yy112: - YYDEBUG(112, *YYCURSOR); + YYDEBUG(112, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Make = used in option value to trigger error */ @@ -2233,14 +2161,12 @@ return END_OF_LINE; } yy113: - YYDEBUG(113, *YYCURSOR); + YYDEBUG(113, yych); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VALUE[0+yych] & 32) { - goto yy113; - } + if (yybm_ST_VALUE[0+yych] & 32) goto yy113; if (yych <= ')') { if (yych <= '\r') { if (yych <= 0x08) { @@ -2275,13 +2201,13 @@ } } yy114: - YYDEBUG(114, *YYCURSOR); + YYDEBUG(114, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Get constant option value */ RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); } yy115: - YYDEBUG(115, *YYCURSOR); + YYDEBUG(115, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '<') { @@ -2332,7 +2258,7 @@ } } yy116: - YYDEBUG(116, *YYCURSOR); + YYDEBUG(116, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'N') { @@ -2397,7 +2323,7 @@ } } yy117: - YYDEBUG(117, *YYCURSOR); + YYDEBUG(117, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -2462,7 +2388,7 @@ } } yy118: - YYDEBUG(118, *YYCURSOR); + YYDEBUG(118, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { @@ -2513,7 +2439,7 @@ } } yy119: - YYDEBUG(119, *YYCURSOR); + YYDEBUG(119, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { @@ -2564,7 +2490,7 @@ } } yy120: - YYDEBUG(120, *YYCURSOR); + YYDEBUG(120, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -2576,40 +2502,32 @@ if (yych != '{') goto yy96; } yy121: - YYDEBUG(121, *YYCURSOR); + YYDEBUG(121, yych); YYCURSOR = YYMARKER; if (yyaccept <= 2) { if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy98; - } else { - goto yy110; - } + if (yyaccept == 0) goto yy98; + else goto yy110; } else { goto yy114; } } else { if (yyaccept <= 4) { - if (yyaccept == 3) { - goto yy131; - } else { - goto yy135; - } + if (yyaccept == 3) goto yy131; + else goto yy135; } else { goto yy148; } } yy122: - YYDEBUG(122, *YYCURSOR); + YYDEBUG(122, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VALUE[0+yych] & 128) { - goto yy138; - } + if (yybm_ST_VALUE[0+yych] & 128) goto yy138; goto yy96; yy123: - YYDEBUG(123, *YYCURSOR); + YYDEBUG(123, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Variable start */ @@ -2617,16 +2535,14 @@ return TC_DOLLAR_CURLY; } yy124: - YYDEBUG(124, *YYCURSOR); + YYDEBUG(124, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VALUE[0+yych] & 64) { - goto yy124; - } + if (yybm_ST_VALUE[0+yych] & 64) goto yy124; goto yy139; yy125: - YYDEBUG(125, *YYCURSOR); + YYDEBUG(125, yych); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -2674,10 +2590,10 @@ } } yy126: - YYDEBUG(126, *YYCURSOR); + YYDEBUG(126, yych); ++YYCURSOR; yy127: - YYDEBUG(127, *YYCURSOR); + YYDEBUG(127, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Comment */ BEGIN(INITIAL); @@ -2685,12 +2601,12 @@ return END_OF_LINE; } yy128: - YYDEBUG(128, *YYCURSOR); + YYDEBUG(128, yych); yych = *++YYCURSOR; if (yych == '\n') goto yy126; goto yy127; yy129: - YYDEBUG(129, *YYCURSOR); + YYDEBUG(129, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { @@ -2741,7 +2657,7 @@ } } yy130: - YYDEBUG(130, *YYCURSOR); + YYDEBUG(130, yych); yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '<') { @@ -2792,13 +2708,13 @@ } } yy131: - YYDEBUG(131, *YYCURSOR); + YYDEBUG(131, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* FALSE value (when used outside option value/offset this causes parse error!)*/ RETURN_TOKEN(BOOL_FALSE, "", 0); } yy132: - YYDEBUG(132, *YYCURSOR); + YYDEBUG(132, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { @@ -2849,7 +2765,7 @@ } } yy133: - YYDEBUG(133, *YYCURSOR); + YYDEBUG(133, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { @@ -2900,12 +2816,10 @@ } } yy134: - YYDEBUG(134, *YYCURSOR); + YYDEBUG(134, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_VALUE[0+yych] & 32) { - goto yy113; - } + if (yybm_ST_VALUE[0+yych] & 32) goto yy113; if (yych <= ')') { if (yych <= '\f') { if (yych <= 0x08) { @@ -2941,13 +2855,13 @@ } } yy135: - YYDEBUG(135, *YYCURSOR); + YYDEBUG(135, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* TRUE value (when used outside option value/offset this causes parse error!) */ RETURN_TOKEN(BOOL_TRUE, "1", 1); } yy136: - YYDEBUG(136, *YYCURSOR); + YYDEBUG(136, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { @@ -2998,7 +2912,7 @@ } } yy137: - YYDEBUG(137, *YYCURSOR); + YYDEBUG(137, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { @@ -3049,18 +2963,16 @@ } } yy138: - YYDEBUG(138, *YYCURSOR); + YYDEBUG(138, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VALUE[0+yych] & 128) { - goto yy138; - } + if (yybm_ST_VALUE[0+yych] & 128) goto yy138; if (yych <= 0x00) goto yy98; if (yych == '\\') goto yy122; goto yy96; yy139: - YYDEBUG(139, *YYCURSOR); + YYDEBUG(139, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Raw string */ @@ -3072,7 +2984,7 @@ RETURN_TOKEN(TC_RAW, yytext, yyleng); } yy140: - YYDEBUG(140, *YYCURSOR); + YYDEBUG(140, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { @@ -3123,7 +3035,7 @@ } } yy141: - YYDEBUG(141, *YYCURSOR); + YYDEBUG(141, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -3131,7 +3043,7 @@ if (yych == ' ') goto yy141; goto yy131; yy142: - YYDEBUG(142, *YYCURSOR); + YYDEBUG(142, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { @@ -3182,7 +3094,7 @@ } } yy143: - YYDEBUG(143, *YYCURSOR); + YYDEBUG(143, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { @@ -3233,12 +3145,10 @@ } } yy144: - YYDEBUG(144, *YYCURSOR); + YYDEBUG(144, yych); yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_VALUE[0+yych] & 32) { - goto yy113; - } + if (yybm_ST_VALUE[0+yych] & 32) goto yy113; if (yych <= ')') { if (yych <= '\f') { if (yych <= 0x08) { @@ -3281,7 +3191,7 @@ } } yy145: - YYDEBUG(145, *YYCURSOR); + YYDEBUG(145, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -3289,7 +3199,7 @@ if (yych == ' ') goto yy145; goto yy135; yy146: - YYDEBUG(146, *YYCURSOR); + YYDEBUG(146, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { @@ -3340,12 +3250,10 @@ } } yy147: - YYDEBUG(147, *YYCURSOR); + YYDEBUG(147, yych); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_VALUE[0+yych] & 32) { - goto yy113; - } + if (yybm_ST_VALUE[0+yych] & 32) goto yy113; if (yych <= ')') { if (yych <= '\f') { if (yych <= 0x08) { @@ -3381,13 +3289,13 @@ } } yy148: - YYDEBUG(148, *YYCURSOR); + YYDEBUG(148, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(NULL_NULL, "", 0); } yy149: - YYDEBUG(149, *YYCURSOR); + YYDEBUG(149, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -3396,46 +3304,40 @@ goto yy148; /* *********************************** */ yyc_ST_SECTION_RAW: - YYDEBUG(150, *YYCURSOR); YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_SECTION_RAW[0+yych] & 64) { - goto yy151; - } + YYDEBUG(150, yych); + if (yybm_ST_SECTION_RAW[0+yych] & 64) goto yy151; if (yych <= '\r') goto yy152; goto yy153; yy151: - YYDEBUG(151, *YYCURSOR); + YYDEBUG(151, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_SECTION_RAW[0+yych] & 64) { - goto yy151; - } + if (yybm_ST_SECTION_RAW[0+yych] & 64) goto yy151; yyleng = YYCURSOR - SCNG(yy_text); { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ RETURN_TOKEN(TC_RAW, yytext, yyleng); } yy152: - YYDEBUG(152, *YYCURSOR); + YYDEBUG(152, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { return 0; } yy153: - YYDEBUG(153, *YYCURSOR); + YYDEBUG(153, yych); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - if (yybm_ST_SECTION_RAW[0+yych] & 128) { - goto yy153; - } + if (yybm_ST_SECTION_RAW[0+yych] & 128) goto yy153; if (yych <= 0x08) goto yy154; if (yych <= '\n') goto yy155; if (yych == '\r') goto yy156; yy154: - YYDEBUG(154, *YYCURSOR); + YYDEBUG(154, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* End of section */ BEGIN(INITIAL); @@ -3443,24 +3345,24 @@ return ']'; } yy155: - YYDEBUG(155, *YYCURSOR); + YYDEBUG(155, yych); ++YYCURSOR; goto yy154; yy156: - YYDEBUG(156, *YYCURSOR); + YYDEBUG(156, yych); yych = *++YYCURSOR; if (yych == '\n') goto yy155; goto yy154; /* *********************************** */ yyc_ST_DOUBLE_QUOTES: - YYDEBUG(157, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; + YYDEBUG(157, yych); if (yych == '"') goto yy159; if (yych == '$') goto yy160; ++YYCURSOR; yy158: - YYDEBUG(158, *YYCURSOR); + YYDEBUG(158, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Escape double quoted string contents */ if (YYCURSOR > YYLIMIT) { @@ -3503,20 +3405,18 @@ return TC_QUOTED_STRING; } yy159: - YYDEBUG(159, *YYCURSOR); + YYDEBUG(159, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_DOUBLE_QUOTES[0+yych] & 128) { - goto yy159; - } + if (yybm_ST_DOUBLE_QUOTES[0+yych] & 128) goto yy159; yyleng = YYCURSOR - SCNG(yy_text); { /* Double quoted '"' string ends */ yy_pop_state(); return '"'; } yy160: - YYDEBUG(160, *YYCURSOR); + YYDEBUG(160, yych); yych = *++YYCURSOR; if (yych != '{') goto yy158; ++YYCURSOR; @@ -3527,12 +3427,10 @@ } /* *********************************** */ yyc_ST_VAR_FALLBACK: - YYDEBUG(161, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; - if (yybm_ST_VAR_FALLBACK[0+yych] & 16) { - goto yy165; - } + YYDEBUG(161, yych); + if (yybm_ST_VAR_FALLBACK[0+yych] & 16) goto yy165; if (yych <= '/') { if (yych <= '"') { if (yych <= '\f') { @@ -3571,35 +3469,31 @@ } } yy162: - YYDEBUG(162, *YYCURSOR); + YYDEBUG(162, yych); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; yy163: - YYDEBUG(163, *YYCURSOR); - if (yybm_ST_VAR_FALLBACK[0+yych] & 8) { - goto yy162; - } + YYDEBUG(163, yych); + if (yybm_ST_VAR_FALLBACK[0+yych] & 8) goto yy162; if (yych <= '"') goto yy164; if (yych <= '$') goto yy177; if (yych <= ';') goto yy164; if (yych <= '\\') goto yy175; yy164: - YYDEBUG(164, *YYCURSOR); + YYDEBUG(164, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Same as below, but excluding '}' */ RETURN_TOKEN(TC_STRING, yytext, yyleng); } yy165: - YYDEBUG(165, *YYCURSOR); + YYDEBUG(165, yych); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VAR_FALLBACK[0+yych] & 16) { - goto yy165; - } + if (yybm_ST_VAR_FALLBACK[0+yych] & 16) goto yy165; if (yych <= '$') { if (yych <= '\r') { if (yych <= 0x08) goto yy162; @@ -3627,16 +3521,16 @@ } } yy166: - YYDEBUG(166, *YYCURSOR); + YYDEBUG(166, yych); ++YYCURSOR; yy167: - YYDEBUG(167, *YYCURSOR); + YYDEBUG(167, yych); yyleng = YYCURSOR - SCNG(yy_text); { return 0; } yy168: - YYDEBUG(168, *YYCURSOR); + YYDEBUG(168, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Double quoted '"' string start */ @@ -3644,7 +3538,7 @@ return '"'; } yy169: - YYDEBUG(169, *YYCURSOR); + YYDEBUG(169, yych); yych = *++YYCURSOR; if (yych <= '\\') { if (yych <= 0x00) goto yy167; @@ -3655,21 +3549,19 @@ goto yy162; } yy170: - YYDEBUG(170, *YYCURSOR); + YYDEBUG(170, yych); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') goto yy163; if (yych <= '9') goto yy181; goto yy163; yy171: - YYDEBUG(171, *YYCURSOR); + YYDEBUG(171, yych); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VAR_FALLBACK[0+yych] & 32) { - goto yy171; - } + if (yybm_ST_VAR_FALLBACK[0+yych] & 32) goto yy171; if (yych <= '&') { if (yych <= '\r') { if (yych == '\n') goto yy172; @@ -3700,20 +3592,18 @@ } } yy172: - YYDEBUG(172, *YYCURSOR); + YYDEBUG(172, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Get number option value as string */ RETURN_TOKEN(TC_NUMBER, yytext, yyleng); } yy173: - YYDEBUG(173, *YYCURSOR); + YYDEBUG(173, yych); yyaccept = 2; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VAR_FALLBACK[0+yych] & 64) { - goto yy173; - } + if (yybm_ST_VAR_FALLBACK[0+yych] & 64) goto yy173; if (yych <= '$') { if (yych <= '\r') { if (yych == '\n') goto yy174; @@ -3737,18 +3627,18 @@ } } yy174: - YYDEBUG(174, *YYCURSOR); + YYDEBUG(174, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Get constant option value */ RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); } yy175: - YYDEBUG(175, *YYCURSOR); + YYDEBUG(175, yych); ++YYCURSOR; YYFILL(1); goto yy162; yy176: - YYDEBUG(176, *YYCURSOR); + YYDEBUG(176, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Variable/fallback end */ @@ -3756,7 +3646,7 @@ return '}'; } yy177: - YYDEBUG(177, *YYCURSOR); + YYDEBUG(177, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -3768,28 +3658,23 @@ if (yych != '{') goto yy162; } yy178: - YYDEBUG(178, *YYCURSOR); + YYDEBUG(178, yych); YYCURSOR = YYMARKER; if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy164; - } else { - goto yy172; - } + if (yyaccept == 0) goto yy164; + else goto yy172; } else { goto yy174; } yy179: - YYDEBUG(179, *YYCURSOR); + YYDEBUG(179, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VAR_FALLBACK[0+yych] & 128) { - goto yy179; - } + if (yybm_ST_VAR_FALLBACK[0+yych] & 128) goto yy179; goto yy162; yy180: - YYDEBUG(180, *YYCURSOR); + YYDEBUG(180, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Variable start */ @@ -3797,7 +3682,7 @@ return TC_DOLLAR_CURLY; } yy181: - YYDEBUG(181, *YYCURSOR); + YYDEBUG(181, yych); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -3838,9 +3723,9 @@ } /* *********************************** */ yyc_ST_VARNAME: - YYDEBUG(182, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; + YYDEBUG(182, yych); if (yych <= ')') { if (yych <= ' ') { if (yych <= '\n') { @@ -3877,17 +3762,17 @@ } } yy183: - YYDEBUG(183, *YYCURSOR); + YYDEBUG(183, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { return 0; } yy184: - YYDEBUG(184, *YYCURSOR); + YYDEBUG(184, yych); ++YYCURSOR; yy185: - YYDEBUG(185, *YYCURSOR); + YYDEBUG(185, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Variable name */ if (YYCURSOR[0] == ':' && YYCURSOR[1] == '-') { @@ -3941,12 +3826,12 @@ RETURN_TOKEN(TC_VARNAME, yytext, yyleng); } yy186: - YYDEBUG(186, *YYCURSOR); + YYDEBUG(186, yych); yych = *++YYCURSOR; if (yych == '-') goto yy188; goto yy185; yy187: - YYDEBUG(187, *YYCURSOR); + YYDEBUG(187, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* Variable/fallback end */ @@ -3954,7 +3839,7 @@ return '}'; } yy188: - YYDEBUG(188, *YYCURSOR); + YYDEBUG(188, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { /* End Variable name, fallback start */ @@ -3965,9 +3850,9 @@ } /* *********************************** */ yyc_ST_RAW: - YYDEBUG(189, *YYCURSOR); YYFILL(3); yych = *YYCURSOR; + YYDEBUG(189, yych); if (yych <= '\f') { if (yych <= 0x08) { if (yych >= 0x01) goto yy190; @@ -3993,10 +3878,10 @@ return END_OF_LINE; } yy190: - YYDEBUG(190, *YYCURSOR); + YYDEBUG(190, yych); ++YYCURSOR; yy191: - YYDEBUG(191, *YYCURSOR); + YYDEBUG(191, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ const unsigned char *sc = NULL; @@ -4042,7 +3927,7 @@ RETURN_TOKEN(TC_RAW, yytext, yyleng); } yy192: - YYDEBUG(192, *YYCURSOR); + YYDEBUG(192, yych); yych = *++YYCURSOR; if (yych <= '\r') { if (yych <= 0x08) goto yy191; @@ -4059,10 +3944,10 @@ } } yy193: - YYDEBUG(193, *YYCURSOR); + YYDEBUG(193, yych); ++YYCURSOR; yy194: - YYDEBUG(194, *YYCURSOR); + YYDEBUG(194, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* End of option value */ BEGIN(INITIAL); @@ -4070,30 +3955,26 @@ return END_OF_LINE; } yy195: - YYDEBUG(195, *YYCURSOR); + YYDEBUG(195, yych); yych = *++YYCURSOR; if (yych == '\n') goto yy193; goto yy194; yy196: - YYDEBUG(196, *YYCURSOR); + YYDEBUG(196, yych); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - if (yybm_ST_RAW[0+yych] & 64) { - goto yy196; - } + if (yybm_ST_RAW[0+yych] & 64) goto yy196; if (yych <= '\n') goto yy200; goto yy202; yy197: - YYDEBUG(197, *YYCURSOR); + YYDEBUG(197, yych); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; yy198: - YYDEBUG(198, *YYCURSOR); - if (yybm_ST_RAW[0+yych] & 128) { - goto yy197; - } + YYDEBUG(198, yych); + if (yybm_ST_RAW[0+yych] & 128) goto yy197; if (yych <= '\f') { if (yych <= 0x08) goto yy199; if (yych <= '\n') goto yy193; @@ -4102,17 +3983,17 @@ if (yych == ';') goto yy196; } yy199: - YYDEBUG(199, *YYCURSOR); + YYDEBUG(199, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* eat whitespace */ goto restart; } yy200: - YYDEBUG(200, *YYCURSOR); + YYDEBUG(200, yych); ++YYCURSOR; yy201: - YYDEBUG(201, *YYCURSOR); + YYDEBUG(201, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Comment */ BEGIN(INITIAL); @@ -4120,7 +4001,7 @@ return END_OF_LINE; } yy202: - YYDEBUG(202, *YYCURSOR); + YYDEBUG(202, yych); yych = *++YYCURSOR; if (yych == '\n') goto yy200; goto yy201; diff -Nru php8.4-8.4.16/Zend/zend_ini_scanner.l php8.4-8.4.21/Zend/zend_ini_scanner.l --- php8.4-8.4.16/Zend/zend_ini_scanner.l 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_ini_scanner.l 2026-05-05 16:34:12.000000000 +0000 @@ -145,10 +145,10 @@ if (SCNG(scanner_mode) == ZEND_INI_SCANNER_TYPED && \ (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW))) {\ zend_ini_copy_typed_value(ini_lval, type, str, len); \ - Z_EXTRA_P(ini_lval) = 0; \ } else { \ zend_ini_copy_value(ini_lval, str, len); \ } \ + Z_EXTRA_P(ini_lval) = 0; \ return type; \ } diff -Nru php8.4-8.4.16/Zend/zend_ini_scanner_defs.h php8.4-8.4.21/Zend/zend_ini_scanner_defs.h --- php8.4-8.4.16/Zend/zend_ini_scanner_defs.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_ini_scanner_defs.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 3.1 */ +/* Generated by re2c 4.3 */ enum YYCONDTYPE { yycINITIAL, diff -Nru php8.4-8.4.16/Zend/zend_language_scanner.c php8.4-8.4.21/Zend/zend_language_scanner.c --- php8.4-8.4.16/Zend/zend_language_scanner.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_language_scanner.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 3.1 */ +/* Generated by re2c 4.3 */ /* +----------------------------------------------------------------------+ | Zend Engine | @@ -1360,328 +1360,320 @@ { YYCTYPE yych; unsigned int yyaccept = 0; - static const unsigned char yybm_ST_IN_SCRIPTING[] = { - /* table 1 .. 8: 0 */ - 0, 134, 134, 134, 134, 134, 134, 134, - 134, 135, 4, 134, 134, 4, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 135, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 66, 134, 134, 134, 134, 134, - 190, 190, 182, 182, 182, 182, 182, 182, - 166, 166, 134, 134, 134, 134, 134, 134, - 134, 166, 166, 166, 166, 166, 166, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 166, 166, 166, 166, 166, 166, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - /* table 9 .. 11: 256 */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 32, 0, 0, 32, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, + static const unsigned char yybm_ST_IN_SCRIPTING[512] = { + 0, 134, 134, 134, 134, 134, 134, 134, + 134, 135, 4, 134, 134, 4, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 135, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 66, 134, 134, 134, 134, 134, + 190, 190, 182, 182, 182, 182, 182, 182, + 166, 166, 134, 134, 134, 134, 134, 134, + 134, 166, 166, 166, 166, 166, 166, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 166, 166, 166, 166, 166, 166, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 32, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128 }; - static const unsigned char yybm_ST_LOOKING_FOR_PROPERTY[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64, 64, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, + static const unsigned char yybm_ST_LOOKING_FOR_PROPERTY[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 64, 0, 0, 64, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 64, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128 }; - static const unsigned char yybm_ST_BACKQUOTE[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, + static const unsigned char yybm_ST_BACKQUOTE[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128 }; - static const unsigned char yybm_ST_DOUBLE_QUOTES[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, + static const unsigned char yybm_ST_DOUBLE_QUOTES[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128 }; - static const unsigned char yybm_ST_HEREDOC[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, + static const unsigned char yybm_ST_HEREDOC[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128 }; - static const unsigned char yybm_ST_LOOKING_FOR_VARNAME[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, + static const unsigned char yybm_ST_LOOKING_FOR_VARNAME[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128 }; - static const unsigned char yybm_ST_VAR_OFFSET[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 248, 248, 216, 216, 216, 216, 216, 216, - 152, 152, 0, 0, 0, 0, 0, 0, - 0, 144, 144, 144, 144, 144, 144, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 0, 0, 0, 0, 16, - 0, 144, 144, 144, 144, 144, 144, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, + static const unsigned char yybm_ST_VAR_OFFSET[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 248, 248, 216, 216, 216, 216, 216, 216, + 152, 152, 0, 0, 0, 0, 0, 0, + 0, 144, 144, 144, 144, 144, 144, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 16, + 0, 144, 144, 144, 144, 144, 144, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16 }; - static const unsigned char yybm_SHEBANG[] = { - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, + static const unsigned char yybm_SHEBANG[256] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128 }; if (YYGETCONDITION() < 5) { if (YYGETCONDITION() < 2) { - if (YYGETCONDITION() < 1) { - goto yyc_ST_IN_SCRIPTING; - } else { - goto yyc_ST_LOOKING_FOR_PROPERTY; - } + if (YYGETCONDITION() < 1) goto yyc_ST_IN_SCRIPTING; + else goto yyc_ST_LOOKING_FOR_PROPERTY; } else { if (YYGETCONDITION() < 3) { goto yyc_ST_BACKQUOTE; } else { - if (YYGETCONDITION() < 4) { - goto yyc_ST_DOUBLE_QUOTES; - } else { - goto yyc_ST_HEREDOC; - } + if (YYGETCONDITION() < 4) goto yyc_ST_DOUBLE_QUOTES; + else goto yyc_ST_HEREDOC; } } } else { @@ -1689,32 +1681,24 @@ if (YYGETCONDITION() < 6) { goto yyc_ST_LOOKING_FOR_VARNAME; } else { - if (YYGETCONDITION() < 7) { - goto yyc_ST_VAR_OFFSET; - } else { - goto yyc_SHEBANG; - } + if (YYGETCONDITION() < 7) goto yyc_ST_VAR_OFFSET; + else goto yyc_SHEBANG; } } else { if (YYGETCONDITION() < 9) { goto yyc_INITIAL; } else { - if (YYGETCONDITION() < 10) { - goto yyc_ST_END_HEREDOC; - } else { - goto yyc_ST_NOWDOC; - } + if (YYGETCONDITION() < 10) goto yyc_ST_END_HEREDOC; + else goto yyc_ST_NOWDOC; } } } /* *********************************** */ yyc_ST_IN_SCRIPTING: - YYDEBUG(0, *YYCURSOR); YYFILL(16); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[256+yych] & 32) { - goto yy2; - } + YYDEBUG(0, yych); + if (yybm_ST_IN_SCRIPTING[256+yych] & 32) goto yy2; switch (yych) { case 0x00: case 0x01: @@ -1837,7 +1821,7 @@ default: goto yy39; } yy1: - YYDEBUG(1, *YYCURSOR); + YYDEBUG(1, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -1848,29 +1832,27 @@ RETURN_TOKEN(T_BAD_CHARACTER); } yy2: - YYDEBUG(2, *YYCURSOR); + YYDEBUG(2, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[256+yych] & 32) { - goto yy2; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 32) goto yy2; yyleng = YYCURSOR - SCNG(yy_text); { goto return_whitespace; } yy3: - YYDEBUG(3, *YYCURSOR); + YYDEBUG(3, yych); yych = *++YYCURSOR; if (yych == '=') goto yy64; yy4: - YYDEBUG(4, *YYCURSOR); + YYDEBUG(4, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(yytext[0]); } yy5: - YYDEBUG(5, *YYCURSOR); + YYDEBUG(5, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -1918,11 +1900,11 @@ RETURN_TOKEN('"'); } yy6: - YYDEBUG(6, *YYCURSOR); + YYDEBUG(6, yych); yych = *++YYCURSOR; if (yych == '[') goto yy66; yy7: - YYDEBUG(7, *YYCURSOR); + YYDEBUG(7, yych); yyleng = YYCURSOR - SCNG(yy_text); { while (YYCURSOR < YYLIMIT) { @@ -1948,7 +1930,7 @@ RETURN_OR_SKIP_TOKEN(T_COMMENT); } yy8: - YYDEBUG(8, *YYCURSOR); + YYDEBUG(8, yych); yych = *++YYCURSOR; if (yych <= '_') { if (yych <= '@') goto yy4; @@ -1962,12 +1944,12 @@ goto yy67; } yy9: - YYDEBUG(9, *YYCURSOR); + YYDEBUG(9, yych); yych = *++YYCURSOR; if (yych == '=') goto yy69; goto yy4; yy10: - YYDEBUG(10, *YYCURSOR); + YYDEBUG(10, yych); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '"') { @@ -1988,13 +1970,13 @@ } } yy11: - YYDEBUG(11, *YYCURSOR); + YYDEBUG(11, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG); } yy12: - YYDEBUG(12, *YYCURSOR); + YYDEBUG(12, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -2092,7 +2074,7 @@ RETURN_TOKEN_WITH_VAL(T_CONSTANT_ENCAPSED_STRING); } yy13: - YYDEBUG(13, *YYCURSOR); + YYDEBUG(13, yych); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -2136,14 +2118,14 @@ } } yy14: - YYDEBUG(14, *YYCURSOR); + YYDEBUG(14, yych); yyleng = YYCURSOR - SCNG(yy_text); { enter_nesting(yytext[0]); RETURN_TOKEN(yytext[0]); } yy15: - YYDEBUG(15, *YYCURSOR); + YYDEBUG(15, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -2151,23 +2133,23 @@ RETURN_EXIT_NESTING_TOKEN(yytext[0]); } yy16: - YYDEBUG(16, *YYCURSOR); + YYDEBUG(16, yych); yych = *++YYCURSOR; if (yych == '*') goto yy91; if (yych == '=') goto yy92; goto yy4; yy17: - YYDEBUG(17, *YYCURSOR); + YYDEBUG(17, yych); yych = *++YYCURSOR; if (yych == '+') goto yy93; if (yych == '=') goto yy94; goto yy4; yy18: - YYDEBUG(18, *YYCURSOR); + YYDEBUG(18, yych); ++YYCURSOR; goto yy4; yy19: - YYDEBUG(19, *YYCURSOR); + YYDEBUG(19, yych); yych = *++YYCURSOR; if (yych <= '<') { if (yych == '-') goto yy95; @@ -2178,7 +2160,7 @@ goto yy4; } yy20: - YYDEBUG(20, *YYCURSOR); + YYDEBUG(20, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '/') { @@ -2190,7 +2172,7 @@ goto yy4; } yy21: - YYDEBUG(21, *YYCURSOR); + YYDEBUG(21, yych); yych = *++YYCURSOR; if (yych <= '.') { if (yych == '*') goto yy103; @@ -2201,7 +2183,7 @@ goto yy4; } yy22: - YYDEBUG(22, *YYCURSOR); + YYDEBUG(22, yych); yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'X') { @@ -2224,7 +2206,7 @@ } } yy23: - YYDEBUG(23, *YYCURSOR); + YYDEBUG(23, yych); yyleng = YYCURSOR - SCNG(yy_text); { size_t len = yyleng; @@ -2289,16 +2271,14 @@ RETURN_TOKEN_WITH_VAL(T_LNUMBER); } yy24: - YYDEBUG(24, *YYCURSOR); + YYDEBUG(24, yych); yyaccept = 3; YYMARKER = ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; yy25: - YYDEBUG(25, *YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 64) { - goto yy24; - } + YYDEBUG(25, yych); + if (yybm_ST_IN_SCRIPTING[256+yych] & 64) goto yy24; if (yych <= 'E') { if (yych == '.') goto yy107; if (yych <= 'D') goto yy23; @@ -2313,12 +2293,12 @@ } } yy26: - YYDEBUG(26, *YYCURSOR); + YYDEBUG(26, yych); yych = *++YYCURSOR; if (yych == ':') goto yy113; goto yy4; yy27: - YYDEBUG(27, *YYCURSOR); + YYDEBUG(27, yych); yych = *++YYCURSOR; if (yych <= ';') goto yy4; if (yych <= '<') goto yy114; @@ -2326,21 +2306,21 @@ if (yych <= '>') goto yy117; goto yy4; yy28: - YYDEBUG(28, *YYCURSOR); + YYDEBUG(28, yych); yych = *++YYCURSOR; if (yych <= '<') goto yy4; if (yych <= '=') goto yy118; if (yych <= '>') goto yy119; goto yy4; yy29: - YYDEBUG(29, *YYCURSOR); + YYDEBUG(29, yych); yych = *++YYCURSOR; if (yych <= '<') goto yy4; if (yych <= '=') goto yy120; if (yych <= '>') goto yy121; goto yy4; yy30: - YYDEBUG(30, *YYCURSOR); + YYDEBUG(30, yych); yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '=') { @@ -2352,7 +2332,7 @@ goto yy4; } yy31: - YYDEBUG(31, *YYCURSOR); + YYDEBUG(31, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -2378,13 +2358,13 @@ } } yy32: - YYDEBUG(32, *YYCURSOR); + YYDEBUG(32, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_STR(T_STRING, 0); } yy33: - YYDEBUG(33, *YYCURSOR); + YYDEBUG(33, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ';') { @@ -2406,7 +2386,7 @@ } } yy34: - YYDEBUG(34, *YYCURSOR); + YYDEBUG(34, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -2429,7 +2409,7 @@ } } yy35: - YYDEBUG(35, *YYCURSOR); + YYDEBUG(35, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -2452,7 +2432,7 @@ } } yy36: - YYDEBUG(36, *YYCURSOR); + YYDEBUG(36, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { @@ -2471,7 +2451,7 @@ default: goto yy40; } yy37: - YYDEBUG(37, *YYCURSOR); + YYDEBUG(37, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'U') { @@ -2496,7 +2476,7 @@ } } yy38: - YYDEBUG(38, *YYCURSOR); + YYDEBUG(38, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -2513,20 +2493,18 @@ } } yy39: - YYDEBUG(39, *YYCURSOR); + YYDEBUG(39, yych); yyaccept = 4; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; yy40: - YYDEBUG(40, *YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + YYDEBUG(40, yych); + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; goto yy32; yy41: - YYDEBUG(41, *YYCURSOR); + YYDEBUG(41, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -2551,21 +2529,21 @@ } } yy42: - YYDEBUG(42, *YYCURSOR); + YYDEBUG(42, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy159; if (yych == 'i') goto yy159; goto yy40; yy43: - YYDEBUG(43, *YYCURSOR); + YYDEBUG(43, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy160; if (yych == 'a') goto yy160; goto yy40; yy44: - YYDEBUG(44, *YYCURSOR); + YYDEBUG(44, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -2582,14 +2560,14 @@ } } yy45: - YYDEBUG(45, *YYCURSOR); + YYDEBUG(45, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy163; if (yych == 'r') goto yy163; goto yy40; yy46: - YYDEBUG(46, *YYCURSOR); + YYDEBUG(46, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'U') { @@ -2606,14 +2584,14 @@ } } yy47: - YYDEBUG(47, *YYCURSOR); + YYDEBUG(47, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy167; if (yych == 'e') goto yy167; goto yy40; yy48: - YYDEBUG(48, *YYCURSOR); + YYDEBUG(48, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'W') { @@ -2630,7 +2608,7 @@ } } yy49: - YYDEBUG(49, *YYCURSOR); + YYDEBUG(49, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'R') { @@ -2647,7 +2625,7 @@ } } yy50: - YYDEBUG(50, *YYCURSOR); + YYDEBUG(50, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { @@ -2664,39 +2642,39 @@ } } yy51: - YYDEBUG(51, *YYCURSOR); + YYDEBUG(51, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy174; if (yych == 'a') goto yy174; goto yy40; yy52: - YYDEBUG(52, *YYCURSOR); + YYDEBUG(52, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'H') goto yy175; if (yych == 'h') goto yy175; goto yy40; yy53: - YYDEBUG(53, *YYCURSOR); + YYDEBUG(53, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy176; if (yych == 'o') goto yy176; goto yy40; yy54: - YYDEBUG(54, *YYCURSOR); + YYDEBUG(54, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy177; if (yych == 'i') goto yy177; goto yy40; yy55: - YYDEBUG(55, *YYCURSOR); + YYDEBUG(55, yych); ++YYCURSOR; goto yy14; yy56: - YYDEBUG(56, *YYCURSOR); + YYDEBUG(56, yych); yych = *++YYCURSOR; if (yych <= '_') { if (yych <= '@') goto yy57; @@ -2708,24 +2686,24 @@ if (yych >= 0x80) goto yy178; } yy57: - YYDEBUG(57, *YYCURSOR); + YYDEBUG(57, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_NS_SEPARATOR); } yy58: - YYDEBUG(58, *YYCURSOR); + YYDEBUG(58, yych); yych = *++YYCURSOR; if (yych == '=') goto yy180; goto yy4; yy59: - YYDEBUG(59, *YYCURSOR); + YYDEBUG(59, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy181; goto yy40; yy60: - YYDEBUG(60, *YYCURSOR); + YYDEBUG(60, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -2733,7 +2711,7 @@ RETURN_TOKEN('`'); } yy61: - YYDEBUG(61, *YYCURSOR); + YYDEBUG(61, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -2742,13 +2720,13 @@ RETURN_TOKEN('{'); } yy62: - YYDEBUG(62, *YYCURSOR); + YYDEBUG(62, yych); yych = *++YYCURSOR; if (yych == '=') goto yy182; if (yych == '|') goto yy183; goto yy4; yy63: - YYDEBUG(63, *YYCURSOR); + YYDEBUG(63, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -2759,17 +2737,17 @@ RETURN_EXIT_NESTING_TOKEN('}'); } yy64: - YYDEBUG(64, *YYCURSOR); + YYDEBUG(64, yych); yych = *++YYCURSOR; if (yych == '=') goto yy184; yy65: - YYDEBUG(65, *YYCURSOR); + YYDEBUG(65, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_IS_NOT_EQUAL); } yy66: - YYDEBUG(66, *YYCURSOR); + YYDEBUG(66, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -2777,7 +2755,7 @@ RETURN_TOKEN(T_ATTRIBUTE); } yy67: - YYDEBUG(67, *YYCURSOR); + YYDEBUG(67, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -2797,25 +2775,25 @@ } } yy68: - YYDEBUG(68, *YYCURSOR); + YYDEBUG(68, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } yy69: - YYDEBUG(69, *YYCURSOR); + YYDEBUG(69, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_MOD_EQUAL); } yy70: - YYDEBUG(70, *YYCURSOR); + YYDEBUG(70, yych); ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; yy71: - YYDEBUG(71, *YYCURSOR); + YYDEBUG(71, yych); if (yych <= ' ') { if (yych <= '\f') { if (yych <= 0x08) goto yy72; @@ -2836,7 +2814,7 @@ } } yy72: - YYDEBUG(72, *YYCURSOR); + YYDEBUG(72, yych); YYCURSOR = YYMARKER; if (yyaccept <= 48) { if (yyaccept <= 24) { @@ -2844,25 +2822,16 @@ if (yyaccept <= 6) { if (yyaccept <= 3) { if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy11; - } else { - goto yy14; - } + if (yyaccept == 0) goto yy11; + else goto yy14; } else { - if (yyaccept == 2) { - goto yy4; - } else { - goto yy23; - } + if (yyaccept == 2) goto yy4; + else goto yy23; } } else { if (yyaccept <= 5) { - if (yyaccept == 4) { - goto yy32; - } else { - goto yy101; - } + if (yyaccept == 4) goto yy32; + else goto yy101; } else { goto yy104; } @@ -2870,21 +2839,15 @@ } else { if (yyaccept <= 9) { if (yyaccept <= 8) { - if (yyaccept == 7) { - goto yy115; - } else { - goto yy130; - } + if (yyaccept == 7) goto yy115; + else goto yy130; } else { goto yy140; } } else { if (yyaccept <= 11) { - if (yyaccept == 10) { - goto yy149; - } else { - goto yy155; - } + if (yyaccept == 10) goto yy149; + else goto yy155; } else { goto yy164; } @@ -2894,21 +2857,15 @@ if (yyaccept <= 18) { if (yyaccept <= 15) { if (yyaccept <= 14) { - if (yyaccept == 13) { - goto yy179; - } else { - goto yy204; - } + if (yyaccept == 13) goto yy179; + else goto yy204; } else { goto yy208; } } else { if (yyaccept <= 17) { - if (yyaccept == 16) { - goto yy210; - } else { - goto yy222; - } + if (yyaccept == 16) goto yy210; + else goto yy222; } else { goto yy225; } @@ -2916,21 +2873,15 @@ } else { if (yyaccept <= 21) { if (yyaccept <= 20) { - if (yyaccept == 19) { - goto yy237; - } else { - goto yy248; - } + if (yyaccept == 19) goto yy237; + else goto yy248; } else { goto yy261; } } else { if (yyaccept <= 23) { - if (yyaccept == 22) { - goto yy273; - } else { - goto yy276; - } + if (yyaccept == 22) goto yy273; + else goto yy276; } else { goto yy278; } @@ -2942,21 +2893,15 @@ if (yyaccept <= 30) { if (yyaccept <= 27) { if (yyaccept <= 26) { - if (yyaccept == 25) { - goto yy281; - } else { - goto yy75; - } + if (yyaccept == 25) goto yy281; + else goto yy75; } else { goto yy317; } } else { if (yyaccept <= 29) { - if (yyaccept == 28) { - goto yy326; - } else { - goto yy328; - } + if (yyaccept == 28) goto yy326; + else goto yy328; } else { goto yy337; } @@ -2964,21 +2909,15 @@ } else { if (yyaccept <= 33) { if (yyaccept <= 32) { - if (yyaccept == 31) { - goto yy339; - } else { - goto yy346; - } + if (yyaccept == 31) goto yy339; + else goto yy346; } else { goto yy353; } } else { if (yyaccept <= 35) { - if (yyaccept == 34) { - goto yy403; - } else { - goto yy405; - } + if (yyaccept == 34) goto yy403; + else goto yy405; } else { goto yy408; } @@ -2988,21 +2927,15 @@ if (yyaccept <= 42) { if (yyaccept <= 39) { if (yyaccept <= 38) { - if (yyaccept == 37) { - goto yy410; - } else { - goto yy412; - } + if (yyaccept == 37) goto yy410; + else goto yy412; } else { goto yy414; } } else { if (yyaccept <= 41) { - if (yyaccept == 40) { - goto yy420; - } else { - goto yy424; - } + if (yyaccept == 40) goto yy420; + else goto yy424; } else { goto yy432; } @@ -3010,21 +2943,15 @@ } else { if (yyaccept <= 45) { if (yyaccept <= 44) { - if (yyaccept == 43) { - goto yy442; - } else { - goto yy444; - } + if (yyaccept == 43) goto yy442; + else goto yy444; } else { goto yy447; } } else { if (yyaccept <= 47) { - if (yyaccept == 46) { - goto yy457; - } else { - goto yy459; - } + if (yyaccept == 46) goto yy457; + else goto yy459; } else { goto yy461; } @@ -3038,21 +2965,15 @@ if (yyaccept <= 54) { if (yyaccept <= 51) { if (yyaccept <= 50) { - if (yyaccept == 49) { - goto yy463; - } else { - goto yy465; - } + if (yyaccept == 49) goto yy463; + else goto yy465; } else { goto yy497; } } else { if (yyaccept <= 53) { - if (yyaccept == 52) { - goto yy500; - } else { - goto yy504; - } + if (yyaccept == 52) goto yy500; + else goto yy504; } else { goto yy515; } @@ -3060,21 +2981,15 @@ } else { if (yyaccept <= 57) { if (yyaccept <= 56) { - if (yyaccept == 55) { - goto yy525; - } else { - goto yy529; - } + if (yyaccept == 55) goto yy525; + else goto yy529; } else { goto yy531; } } else { if (yyaccept <= 59) { - if (yyaccept == 58) { - goto yy533; - } else { - goto yy562; - } + if (yyaccept == 58) goto yy533; + else goto yy562; } else { goto yy564; } @@ -3084,21 +2999,15 @@ if (yyaccept <= 66) { if (yyaccept <= 63) { if (yyaccept <= 62) { - if (yyaccept == 61) { - goto yy578; - } else { - goto yy580; - } + if (yyaccept == 61) goto yy578; + else goto yy580; } else { goto yy582; } } else { if (yyaccept <= 65) { - if (yyaccept == 64) { - goto yy586; - } else { - goto yy592; - } + if (yyaccept == 64) goto yy586; + else goto yy592; } else { goto yy597; } @@ -3106,21 +3015,15 @@ } else { if (yyaccept <= 69) { if (yyaccept <= 68) { - if (yyaccept == 67) { - goto yy604; - } else { - goto yy619; - } + if (yyaccept == 67) goto yy604; + else goto yy619; } else { goto yy621; } } else { if (yyaccept <= 71) { - if (yyaccept == 70) { - goto yy623; - } else { - goto yy628; - } + if (yyaccept == 70) goto yy623; + else goto yy628; } else { goto yy635; } @@ -3132,21 +3035,15 @@ if (yyaccept <= 78) { if (yyaccept <= 75) { if (yyaccept <= 74) { - if (yyaccept == 73) { - goto yy646; - } else { - goto yy655; - } + if (yyaccept == 73) goto yy646; + else goto yy655; } else { goto yy659; } } else { if (yyaccept <= 77) { - if (yyaccept == 76) { - goto yy671; - } else { - goto yy682; - } + if (yyaccept == 76) goto yy671; + else goto yy682; } else { goto yy684; } @@ -3154,21 +3051,15 @@ } else { if (yyaccept <= 81) { if (yyaccept <= 80) { - if (yyaccept == 79) { - goto yy686; - } else { - goto yy689; - } + if (yyaccept == 79) goto yy686; + else goto yy689; } else { goto yy696; } } else { if (yyaccept <= 83) { - if (yyaccept == 82) { - goto yy703; - } else { - goto yy707; - } + if (yyaccept == 82) goto yy703; + else goto yy707; } else { goto yy709; } @@ -3178,21 +3069,15 @@ if (yyaccept <= 90) { if (yyaccept <= 87) { if (yyaccept <= 86) { - if (yyaccept == 85) { - goto yy720; - } else { - goto yy723; - } + if (yyaccept == 85) goto yy720; + else goto yy723; } else { goto yy736; } } else { if (yyaccept <= 89) { - if (yyaccept == 88) { - goto yy749; - } else { - goto yy777; - } + if (yyaccept == 88) goto yy749; + else goto yy777; } else { goto yy781; } @@ -3200,21 +3085,15 @@ } else { if (yyaccept <= 93) { if (yyaccept <= 92) { - if (yyaccept == 91) { - goto yy755; - } else { - goto yy788; - } + if (yyaccept == 91) goto yy755; + else goto yy788; } else { goto yy792; } } else { if (yyaccept <= 95) { - if (yyaccept == 94) { - goto yy765; - } else { - goto yy808; - } + if (yyaccept == 94) goto yy765; + else goto yy808; } else { goto yy827; } @@ -3224,7 +3103,7 @@ } } yy73: - YYDEBUG(73, *YYCURSOR); + YYDEBUG(73, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -3238,29 +3117,29 @@ goto yy185; } yy74: - YYDEBUG(74, *YYCURSOR); + YYDEBUG(74, yych); ++YYCURSOR; yy75: - YYDEBUG(75, *YYCURSOR); + YYDEBUG(75, yych); yyleng = YYCURSOR - SCNG(yy_text); { yyless(1); RETURN_TOKEN(T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG); } yy76: - YYDEBUG(76, *YYCURSOR); + YYDEBUG(76, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_BOOLEAN_AND); } yy77: - YYDEBUG(77, *YYCURSOR); + YYDEBUG(77, yych); yych = *++YYCURSOR; if (yych == '.') goto yy187; goto yy72; yy78: - YYDEBUG(78, *YYCURSOR); + YYDEBUG(78, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -3268,22 +3147,20 @@ if (yych == '/') goto yy185; goto yy72; yy79: - YYDEBUG(79, *YYCURSOR); + YYDEBUG(79, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_AND_EQUAL); } yy80: - YYDEBUG(80, *YYCURSOR); + YYDEBUG(80, yych); ++YYCURSOR; YYFILL(7); yych = *YYCURSOR; yy81: - YYDEBUG(81, *YYCURSOR); - if (yybm_ST_IN_SCRIPTING[0+yych] & 1) { - goto yy80; - } + YYDEBUG(81, yych); + if (yybm_ST_IN_SCRIPTING[0+yych] & 1) goto yy80; switch (yych) { case 'A': case 'a': goto yy82; @@ -3306,13 +3183,13 @@ default: goto yy72; } yy82: - YYDEBUG(82, *YYCURSOR); + YYDEBUG(82, yych); yych = *++YYCURSOR; if (yych == 'R') goto yy189; if (yych == 'r') goto yy189; goto yy72; yy83: - YYDEBUG(83, *YYCURSOR); + YYDEBUG(83, yych); yych = *++YYCURSOR; if (yych <= 'O') { if (yych == 'I') goto yy190; @@ -3328,49 +3205,49 @@ } } yy84: - YYDEBUG(84, *YYCURSOR); + YYDEBUG(84, yych); yych = *++YYCURSOR; if (yych == 'O') goto yy192; if (yych == 'o') goto yy192; goto yy72; yy85: - YYDEBUG(85, *YYCURSOR); + YYDEBUG(85, yych); yych = *++YYCURSOR; if (yych == 'L') goto yy193; if (yych == 'l') goto yy193; goto yy72; yy86: - YYDEBUG(86, *YYCURSOR); + YYDEBUG(86, yych); yych = *++YYCURSOR; if (yych == 'N') goto yy194; if (yych == 'n') goto yy194; goto yy72; yy87: - YYDEBUG(87, *YYCURSOR); + YYDEBUG(87, yych); yych = *++YYCURSOR; if (yych == 'B') goto yy195; if (yych == 'b') goto yy195; goto yy72; yy88: - YYDEBUG(88, *YYCURSOR); + YYDEBUG(88, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy196; if (yych == 'e') goto yy196; goto yy72; yy89: - YYDEBUG(89, *YYCURSOR); + YYDEBUG(89, yych); yych = *++YYCURSOR; if (yych == 'T') goto yy197; if (yych == 't') goto yy197; goto yy72; yy90: - YYDEBUG(90, *YYCURSOR); + YYDEBUG(90, yych); yych = *++YYCURSOR; if (yych == 'N') goto yy198; if (yych == 'n') goto yy198; goto yy72; yy91: - YYDEBUG(91, *YYCURSOR); + YYDEBUG(91, yych); yych = *++YYCURSOR; if (yych == '=') goto yy199; yyleng = YYCURSOR - SCNG(yy_text); @@ -3378,42 +3255,42 @@ RETURN_TOKEN(T_POW); } yy92: - YYDEBUG(92, *YYCURSOR); + YYDEBUG(92, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_MUL_EQUAL); } yy93: - YYDEBUG(93, *YYCURSOR); + YYDEBUG(93, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_INC); } yy94: - YYDEBUG(94, *YYCURSOR); + YYDEBUG(94, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_PLUS_EQUAL); } yy95: - YYDEBUG(95, *YYCURSOR); + YYDEBUG(95, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_DEC); } yy96: - YYDEBUG(96, *YYCURSOR); + YYDEBUG(96, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_MINUS_EQUAL); } yy97: - YYDEBUG(97, *YYCURSOR); + YYDEBUG(97, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -3421,18 +3298,18 @@ RETURN_TOKEN(T_OBJECT_OPERATOR); } yy98: - YYDEBUG(98, *YYCURSOR); + YYDEBUG(98, yych); yych = *++YYCURSOR; if (yych == '.') goto yy200; goto yy72; yy99: - YYDEBUG(99, *YYCURSOR); + YYDEBUG(99, yych); yyaccept = 5; YYMARKER = ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; yy100: - YYDEBUG(100, *YYCURSOR); + YYDEBUG(100, yych); if (yych <= 'E') { if (yych <= '/') goto yy101; if (yych <= '9') goto yy99; @@ -3445,7 +3322,7 @@ } } yy101: - YYDEBUG(101, *YYCURSOR); + YYDEBUG(101, yych); yyleng = YYCURSOR - SCNG(yy_text); { const char *end; @@ -3467,19 +3344,19 @@ RETURN_TOKEN_WITH_VAL(T_DNUMBER); } yy102: - YYDEBUG(102, *YYCURSOR); + YYDEBUG(102, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_CONCAT_EQUAL); } yy103: - YYDEBUG(103, *YYCURSOR); + YYDEBUG(103, yych); yyaccept = 6; yych = *(YYMARKER = ++YYCURSOR); if (yych == '*') goto yy202; yy104: - YYDEBUG(104, *YYCURSOR); + YYDEBUG(104, yych); yyleng = YYCURSOR - SCNG(yy_text); { int doc_com; @@ -3517,33 +3394,31 @@ RETURN_OR_SKIP_TOKEN(T_COMMENT); } yy105: - YYDEBUG(105, *YYCURSOR); + YYDEBUG(105, yych); ++YYCURSOR; goto yy7; yy106: - YYDEBUG(106, *YYCURSOR); + YYDEBUG(106, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_DIV_EQUAL); } yy107: - YYDEBUG(107, *YYCURSOR); + YYDEBUG(107, yych); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy101; goto yy100; yy108: - YYDEBUG(108, *YYCURSOR); + YYDEBUG(108, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 8) { - goto yy203; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 8) goto yy203; goto yy72; yy109: - YYDEBUG(109, *YYCURSOR); + YYDEBUG(109, yych); yych = *++YYCURSOR; if (yych <= ',') { if (yych == '+') goto yy205; @@ -3555,54 +3430,48 @@ goto yy72; } yy110: - YYDEBUG(110, *YYCURSOR); + YYDEBUG(110, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 16) { - goto yy207; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 16) goto yy207; goto yy72; yy111: - YYDEBUG(111, *YYCURSOR); + YYDEBUG(111, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 32) { - goto yy209; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 32) goto yy209; goto yy72; yy112: - YYDEBUG(112, *YYCURSOR); + YYDEBUG(112, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[256+yych] & 64) { - goto yy24; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 64) goto yy24; goto yy72; yy113: - YYDEBUG(113, *YYCURSOR); + YYDEBUG(113, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_PAAMAYIM_NEKUDOTAYIM); } yy114: - YYDEBUG(114, *YYCURSOR); + YYDEBUG(114, yych); yyaccept = 7; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ';') goto yy115; if (yych <= '<') goto yy211; if (yych <= '=') goto yy212; yy115: - YYDEBUG(115, *YYCURSOR); + YYDEBUG(115, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_SL); } yy116: - YYDEBUG(116, *YYCURSOR); + YYDEBUG(116, yych); yych = *++YYCURSOR; if (yych == '>') goto yy213; yyleng = YYCURSOR - SCNG(yy_text); @@ -3610,11 +3479,11 @@ RETURN_TOKEN(T_IS_SMALLER_OR_EQUAL); } yy117: - YYDEBUG(117, *YYCURSOR); + YYDEBUG(117, yych); ++YYCURSOR; goto yy65; yy118: - YYDEBUG(118, *YYCURSOR); + YYDEBUG(118, yych); yych = *++YYCURSOR; if (yych == '=') goto yy214; yyleng = YYCURSOR - SCNG(yy_text); @@ -3622,21 +3491,21 @@ RETURN_TOKEN(T_IS_EQUAL); } yy119: - YYDEBUG(119, *YYCURSOR); + YYDEBUG(119, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_DOUBLE_ARROW); } yy120: - YYDEBUG(120, *YYCURSOR); + YYDEBUG(120, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_IS_GREATER_OR_EQUAL); } yy121: - YYDEBUG(121, *YYCURSOR); + YYDEBUG(121, yych); yych = *++YYCURSOR; if (yych == '=') goto yy215; yyleng = YYCURSOR - SCNG(yy_text); @@ -3644,17 +3513,17 @@ RETURN_TOKEN(T_SR); } yy122: - YYDEBUG(122, *YYCURSOR); + YYDEBUG(122, yych); yych = *++YYCURSOR; if (yych == '>') goto yy216; goto yy72; yy123: - YYDEBUG(123, *YYCURSOR); + YYDEBUG(123, yych); yych = *++YYCURSOR; if (yych == '\n') goto yy217; if (yych == '\r') goto yy218; yy124: - YYDEBUG(124, *YYCURSOR); + YYDEBUG(124, yych); yyleng = YYCURSOR - SCNG(yy_text); { BEGIN(INITIAL); @@ -3667,7 +3536,7 @@ RETURN_TOKEN(T_CLOSE_TAG); } yy125: - YYDEBUG(125, *YYCURSOR); + YYDEBUG(125, yych); yych = *++YYCURSOR; if (yych == '=') goto yy219; yyleng = YYCURSOR - SCNG(yy_text); @@ -3675,42 +3544,40 @@ RETURN_TOKEN(T_COALESCE); } yy126: - YYDEBUG(126, *YYCURSOR); + YYDEBUG(126, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy220; if (yych == 's') goto yy220; goto yy40; yy127: - YYDEBUG(127, *YYCURSOR); + YYDEBUG(127, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'D') goto yy221; if (yych == 'd') goto yy221; goto yy40; yy128: - YYDEBUG(128, *YYCURSOR); + YYDEBUG(128, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy223; if (yych == 'r') goto yy223; goto yy40; yy129: - YYDEBUG(129, *YYCURSOR); + YYDEBUG(129, yych); yyaccept = 8; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy130: - YYDEBUG(130, *YYCURSOR); + YYDEBUG(130, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_AS); } yy131: - YYDEBUG(131, *YYCURSOR); + YYDEBUG(131, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -3726,19 +3593,19 @@ goto yy224; } yy132: - YYDEBUG(132, *YYCURSOR); + YYDEBUG(132, yych); yych = *++YYCURSOR; if (yych == '<') goto yy226; goto yy72; yy133: - YYDEBUG(133, *YYCURSOR); + YYDEBUG(133, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy227; if (yych == 'e') goto yy227; goto yy40; yy134: - YYDEBUG(134, *YYCURSOR); + YYDEBUG(134, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -3761,7 +3628,7 @@ } } yy135: - YYDEBUG(135, *YYCURSOR); + YYDEBUG(135, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -3778,14 +3645,14 @@ } } yy136: - YYDEBUG(136, *YYCURSOR); + YYDEBUG(136, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy233; if (yych == 'n') goto yy233; goto yy40; yy137: - YYDEBUG(137, *YYCURSOR); + YYDEBUG(137, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'F') { @@ -3802,49 +3669,47 @@ } } yy138: - YYDEBUG(138, *YYCURSOR); + YYDEBUG(138, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy236; if (yych == 'e') goto yy236; goto yy40; yy139: - YYDEBUG(139, *YYCURSOR); + YYDEBUG(139, yych); yyaccept = 9; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy140: - YYDEBUG(140, *YYCURSOR); + YYDEBUG(140, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_DO); } yy141: - YYDEBUG(141, *YYCURSOR); + YYDEBUG(141, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'H') goto yy238; if (yych == 'h') goto yy238; goto yy40; yy142: - YYDEBUG(142, *YYCURSOR); + YYDEBUG(142, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy239; if (yych == 's') goto yy239; goto yy40; yy143: - YYDEBUG(143, *YYCURSOR); + YYDEBUG(143, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'P') goto yy240; if (yych == 'p') goto yy240; goto yy40; yy144: - YYDEBUG(144, *YYCURSOR); + YYDEBUG(144, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'U') { @@ -3861,14 +3726,14 @@ } } yy145: - YYDEBUG(145, *YYCURSOR); + YYDEBUG(145, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy243; if (yych == 'a') goto yy243; goto yy40; yy146: - YYDEBUG(146, *YYCURSOR); + YYDEBUG(146, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -3885,77 +3750,73 @@ } } yy147: - YYDEBUG(147, *YYCURSOR); + YYDEBUG(147, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy246; if (yych == 'n') goto yy246; goto yy40; yy148: - YYDEBUG(148, *YYCURSOR); + YYDEBUG(148, yych); yyaccept = 10; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy149: - YYDEBUG(149, *YYCURSOR); + YYDEBUG(149, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_FN); } yy150: - YYDEBUG(150, *YYCURSOR); + YYDEBUG(150, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy247; if (yych == 'r') goto yy247; goto yy40; yy151: - YYDEBUG(151, *YYCURSOR); + YYDEBUG(151, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy249; if (yych == 'n') goto yy249; goto yy40; yy152: - YYDEBUG(152, *YYCURSOR); + YYDEBUG(152, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy250; if (yych == 'o') goto yy250; goto yy40; yy153: - YYDEBUG(153, *YYCURSOR); + YYDEBUG(153, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy251; if (yych == 't') goto yy251; goto yy40; yy154: - YYDEBUG(154, *YYCURSOR); + YYDEBUG(154, yych); yyaccept = 11; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy155: - YYDEBUG(155, *YYCURSOR); + YYDEBUG(155, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_IF); } yy156: - YYDEBUG(156, *YYCURSOR); + YYDEBUG(156, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'P') goto yy252; if (yych == 'p') goto yy252; goto yy40; yy157: - YYDEBUG(157, *YYCURSOR); + YYDEBUG(157, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -3978,56 +3839,54 @@ } } yy158: - YYDEBUG(158, *YYCURSOR); + YYDEBUG(158, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy256; if (yych == 's') goto yy256; goto yy40; yy159: - YYDEBUG(159, *YYCURSOR); + YYDEBUG(159, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy257; if (yych == 's') goto yy257; goto yy40; yy160: - YYDEBUG(160, *YYCURSOR); + YYDEBUG(160, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy258; if (yych == 't') goto yy258; goto yy40; yy161: - YYDEBUG(161, *YYCURSOR); + YYDEBUG(161, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'M') goto yy259; if (yych == 'm') goto yy259; goto yy40; yy162: - YYDEBUG(162, *YYCURSOR); + YYDEBUG(162, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'W') goto yy260; if (yych == 'w') goto yy260; goto yy40; yy163: - YYDEBUG(163, *YYCURSOR); + YYDEBUG(163, yych); yyaccept = 12; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy164: - YYDEBUG(164, *YYCURSOR); + YYDEBUG(164, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_LOGICAL_OR); } yy165: - YYDEBUG(165, *YYCURSOR); + YYDEBUG(165, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'O') { @@ -4044,14 +3903,14 @@ } } yy166: - YYDEBUG(166, *YYCURSOR); + YYDEBUG(166, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'B') goto yy264; if (yych == 'b') goto yy264; goto yy40; yy167: - YYDEBUG(167, *YYCURSOR); + YYDEBUG(167, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -4074,28 +3933,28 @@ } } yy168: - YYDEBUG(168, *YYCURSOR); + YYDEBUG(168, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy268; if (yych == 'a') goto yy268; goto yy40; yy169: - YYDEBUG(169, *YYCURSOR); + YYDEBUG(169, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy269; if (yych == 'i') goto yy269; goto yy40; yy170: - YYDEBUG(170, *YYCURSOR); + YYDEBUG(170, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy270; if (yych == 'r') goto yy270; goto yy40; yy171: - YYDEBUG(171, *YYCURSOR); + YYDEBUG(171, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'Y') { @@ -4112,49 +3971,49 @@ } } yy172: - YYDEBUG(172, *YYCURSOR); + YYDEBUG(172, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy274; if (yych == 's') goto yy274; goto yy40; yy173: - YYDEBUG(173, *YYCURSOR); + YYDEBUG(173, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy275; if (yych == 'e') goto yy275; goto yy40; yy174: - YYDEBUG(174, *YYCURSOR); + YYDEBUG(174, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy277; if (yych == 'r') goto yy277; goto yy40; yy175: - YYDEBUG(175, *YYCURSOR); + YYDEBUG(175, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy279; if (yych == 'i') goto yy279; goto yy40; yy176: - YYDEBUG(176, *YYCURSOR); + YYDEBUG(176, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy280; if (yych == 'r') goto yy280; goto yy40; yy177: - YYDEBUG(177, *YYCURSOR); + YYDEBUG(177, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy282; if (yych == 'e') goto yy282; goto yy40; yy178: - YYDEBUG(178, *YYCURSOR); + YYDEBUG(178, yych); yyaccept = 13; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -4176,20 +4035,20 @@ } } yy179: - YYDEBUG(179, *YYCURSOR); + YYDEBUG(179, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_STR(T_NAME_FULLY_QUALIFIED, 1); } yy180: - YYDEBUG(180, *YYCURSOR); + YYDEBUG(180, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_XOR_EQUAL); } yy181: - YYDEBUG(181, *YYCURSOR); + YYDEBUG(181, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { @@ -4214,38 +4073,36 @@ default: goto yy40; } yy182: - YYDEBUG(182, *YYCURSOR); + YYDEBUG(182, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_OR_EQUAL); } yy183: - YYDEBUG(183, *YYCURSOR); + YYDEBUG(183, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_BOOLEAN_OR); } yy184: - YYDEBUG(184, *YYCURSOR); + YYDEBUG(184, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_IS_NOT_IDENTICAL); } yy185: - YYDEBUG(185, *YYCURSOR); + YYDEBUG(185, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 2) { - goto yy185; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 2) goto yy185; if (yych <= 0x00) goto yy72; goto yy70; yy186: - YYDEBUG(186, *YYCURSOR); + YYDEBUG(186, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -4273,96 +4130,94 @@ } } yy187: - YYDEBUG(187, *YYCURSOR); + YYDEBUG(187, yych); yych = *++YYCURSOR; if (yych == '.') goto yy74; goto yy72; yy188: - YYDEBUG(188, *YYCURSOR); + YYDEBUG(188, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 4) { - goto yy188; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 4) goto yy188; if (yych <= 0x00) goto yy72; goto yy297; yy189: - YYDEBUG(189, *YYCURSOR); + YYDEBUG(189, yych); yych = *++YYCURSOR; if (yych == 'R') goto yy298; if (yych == 'r') goto yy298; goto yy72; yy190: - YYDEBUG(190, *YYCURSOR); + YYDEBUG(190, yych); yych = *++YYCURSOR; if (yych == 'N') goto yy299; if (yych == 'n') goto yy299; goto yy72; yy191: - YYDEBUG(191, *YYCURSOR); + YYDEBUG(191, yych); yych = *++YYCURSOR; if (yych == 'O') goto yy300; if (yych == 'o') goto yy300; goto yy72; yy192: - YYDEBUG(192, *YYCURSOR); + YYDEBUG(192, yych); yych = *++YYCURSOR; if (yych == 'U') goto yy301; if (yych == 'u') goto yy301; goto yy72; yy193: - YYDEBUG(193, *YYCURSOR); + YYDEBUG(193, yych); yych = *++YYCURSOR; if (yych == 'O') goto yy302; if (yych == 'o') goto yy302; goto yy72; yy194: - YYDEBUG(194, *YYCURSOR); + YYDEBUG(194, yych); yych = *++YYCURSOR; if (yych == 'T') goto yy303; if (yych == 't') goto yy303; goto yy72; yy195: - YYDEBUG(195, *YYCURSOR); + YYDEBUG(195, yych); yych = *++YYCURSOR; if (yych == 'J') goto yy304; if (yych == 'j') goto yy304; goto yy72; yy196: - YYDEBUG(196, *YYCURSOR); + YYDEBUG(196, yych); yych = *++YYCURSOR; if (yych == 'A') goto yy305; if (yych == 'a') goto yy305; goto yy72; yy197: - YYDEBUG(197, *YYCURSOR); + YYDEBUG(197, yych); yych = *++YYCURSOR; if (yych == 'R') goto yy306; if (yych == 'r') goto yy306; goto yy72; yy198: - YYDEBUG(198, *YYCURSOR); + YYDEBUG(198, yych); yych = *++YYCURSOR; if (yych == 'S') goto yy307; if (yych == 's') goto yy307; goto yy72; yy199: - YYDEBUG(199, *YYCURSOR); + YYDEBUG(199, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_POW_EQUAL); } yy200: - YYDEBUG(200, *YYCURSOR); + YYDEBUG(200, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_ELLIPSIS); } yy201: - YYDEBUG(201, *YYCURSOR); + YYDEBUG(201, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -4370,7 +4225,7 @@ if (yych <= '9') goto yy99; goto yy72; yy202: - YYDEBUG(202, *YYCURSOR); + YYDEBUG(202, yych); yych = *++YYCURSOR; if (yych <= '\f') { if (yych <= 0x08) goto yy72; @@ -4382,17 +4237,15 @@ goto yy72; } yy203: - YYDEBUG(203, *YYCURSOR); + YYDEBUG(203, yych); yyaccept = 14; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 8) { - goto yy203; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 8) goto yy203; if (yych == '_') goto yy108; yy204: - YYDEBUG(204, *YYCURSOR); + YYDEBUG(204, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* The +/- 2 skips "0b" */ @@ -4436,14 +4289,14 @@ } } yy205: - YYDEBUG(205, *YYCURSOR); + YYDEBUG(205, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; if (yych <= '/') goto yy72; if (yych >= ':') goto yy72; yy206: - YYDEBUG(206, *YYCURSOR); + YYDEBUG(206, yych); yyaccept = 5; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -4453,17 +4306,15 @@ if (yych == '_') goto yy205; goto yy101; yy207: - YYDEBUG(207, *YYCURSOR); + YYDEBUG(207, yych); yyaccept = 15; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 16) { - goto yy207; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 16) goto yy207; if (yych == '_') goto yy110; yy208: - YYDEBUG(208, *YYCURSOR); + YYDEBUG(208, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* The +/- 2 skips "0o" */ @@ -4515,17 +4366,15 @@ RETURN_TOKEN_WITH_VAL(T_DNUMBER); } yy209: - YYDEBUG(209, *YYCURSOR); + YYDEBUG(209, yych); yyaccept = 16; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 32) { - goto yy209; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 32) goto yy209; if (yych == '_') goto yy111; yy210: - YYDEBUG(210, *YYCURSOR); + YYDEBUG(210, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* The +/- 2 skips "0x" */ @@ -4569,7 +4418,7 @@ } } yy211: - YYDEBUG(211, *YYCURSOR); + YYDEBUG(211, yych); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; @@ -4597,35 +4446,35 @@ } } yy212: - YYDEBUG(212, *YYCURSOR); + YYDEBUG(212, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_SL_EQUAL); } yy213: - YYDEBUG(213, *YYCURSOR); + YYDEBUG(213, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_SPACESHIP); } yy214: - YYDEBUG(214, *YYCURSOR); + YYDEBUG(214, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_IS_IDENTICAL); } yy215: - YYDEBUG(215, *YYCURSOR); + YYDEBUG(215, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_SR_EQUAL); } yy216: - YYDEBUG(216, *YYCURSOR); + YYDEBUG(216, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -4633,51 +4482,49 @@ RETURN_TOKEN(T_NULLSAFE_OBJECT_OPERATOR); } yy217: - YYDEBUG(217, *YYCURSOR); + YYDEBUG(217, yych); ++YYCURSOR; goto yy124; yy218: - YYDEBUG(218, *YYCURSOR); + YYDEBUG(218, yych); yych = *++YYCURSOR; if (yych == '\n') goto yy217; goto yy124; yy219: - YYDEBUG(219, *YYCURSOR); + YYDEBUG(219, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_COALESCE_EQUAL); } yy220: - YYDEBUG(220, *YYCURSOR); + YYDEBUG(220, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy312; if (yych == 't') goto yy312; goto yy40; yy221: - YYDEBUG(221, *YYCURSOR); + YYDEBUG(221, yych); yyaccept = 17; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy222: - YYDEBUG(222, *YYCURSOR); + YYDEBUG(222, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_LOGICAL_AND); } yy223: - YYDEBUG(223, *YYCURSOR); + YYDEBUG(223, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy313; if (yych == 'a') goto yy313; goto yy40; yy224: - YYDEBUG(224, *YYCURSOR); + YYDEBUG(224, yych); yyaccept = 18; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -4699,60 +4546,60 @@ } } yy225: - YYDEBUG(225, *YYCURSOR); + YYDEBUG(225, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_STR(T_NAME_QUALIFIED, 0); } yy226: - YYDEBUG(226, *YYCURSOR); + YYDEBUG(226, yych); yych = *++YYCURSOR; if (yych == '<') goto yy211; goto yy72; yy227: - YYDEBUG(227, *YYCURSOR); + YYDEBUG(227, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy314; if (yych == 'a') goto yy314; goto yy40; yy228: - YYDEBUG(228, *YYCURSOR); + YYDEBUG(228, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy315; if (yych == 'l') goto yy315; goto yy40; yy229: - YYDEBUG(229, *YYCURSOR); + YYDEBUG(229, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy316; if (yych == 'e') goto yy316; goto yy40; yy230: - YYDEBUG(230, *YYCURSOR); + YYDEBUG(230, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy318; if (yych == 'c') goto yy318; goto yy40; yy231: - YYDEBUG(231, *YYCURSOR); + YYDEBUG(231, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy319; if (yych == 's') goto yy319; goto yy40; yy232: - YYDEBUG(232, *YYCURSOR); + YYDEBUG(232, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy320; if (yych == 'n') goto yy320; goto yy40; yy233: - YYDEBUG(233, *YYCURSOR); + YYDEBUG(233, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'T') { @@ -4766,56 +4613,54 @@ goto yy40; } yy234: - YYDEBUG(234, *YYCURSOR); + YYDEBUG(234, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy323; if (yych == 'l') goto yy323; goto yy40; yy235: - YYDEBUG(235, *YYCURSOR); + YYDEBUG(235, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy324; if (yych == 'a') goto yy324; goto yy40; yy236: - YYDEBUG(236, *YYCURSOR); + YYDEBUG(236, yych); yyaccept = 19; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy237: - YYDEBUG(237, *YYCURSOR); + YYDEBUG(237, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_EXIT); } yy238: - YYDEBUG(238, *YYCURSOR); + YYDEBUG(238, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy325; if (yych == 'o') goto yy325; goto yy40; yy239: - YYDEBUG(239, *YYCURSOR); + YYDEBUG(239, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy327; if (yych == 'e') goto yy327; goto yy40; yy240: - YYDEBUG(240, *YYCURSOR); + YYDEBUG(240, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy329; if (yych == 't') goto yy329; goto yy40; yy241: - YYDEBUG(241, *YYCURSOR); + YYDEBUG(241, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { @@ -4832,42 +4677,42 @@ default: goto yy40; } yy242: - YYDEBUG(242, *YYCURSOR); + YYDEBUG(242, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'M') goto yy335; if (yych == 'm') goto yy335; goto yy40; yy243: - YYDEBUG(243, *YYCURSOR); + YYDEBUG(243, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy336; if (yych == 'l') goto yy336; goto yy40; yy244: - YYDEBUG(244, *YYCURSOR); + YYDEBUG(244, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy338; if (yych == 't') goto yy338; goto yy40; yy245: - YYDEBUG(245, *YYCURSOR); + YYDEBUG(245, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy340; if (yych == 'e') goto yy340; goto yy40; yy246: - YYDEBUG(246, *YYCURSOR); + YYDEBUG(246, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy341; if (yych == 'a') goto yy341; goto yy40; yy247: - YYDEBUG(247, *YYCURSOR); + YYDEBUG(247, yych); yyaccept = 20; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\\') { @@ -4891,104 +4736,102 @@ } } yy248: - YYDEBUG(248, *YYCURSOR); + YYDEBUG(248, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_FOR); } yy249: - YYDEBUG(249, *YYCURSOR); + YYDEBUG(249, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy343; if (yych == 'c') goto yy343; goto yy40; yy250: - YYDEBUG(250, *YYCURSOR); + YYDEBUG(250, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'B') goto yy344; if (yych == 'b') goto yy344; goto yy40; yy251: - YYDEBUG(251, *YYCURSOR); + YYDEBUG(251, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy345; if (yych == 'o') goto yy345; goto yy40; yy252: - YYDEBUG(252, *YYCURSOR); + YYDEBUG(252, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy347; if (yych == 'l') goto yy347; goto yy40; yy253: - YYDEBUG(253, *YYCURSOR); + YYDEBUG(253, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy348; if (yych == 'l') goto yy348; goto yy40; yy254: - YYDEBUG(254, *YYCURSOR); + YYDEBUG(254, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy349; if (yych == 't') goto yy349; goto yy40; yy255: - YYDEBUG(255, *YYCURSOR); + YYDEBUG(255, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy350; if (yych == 'e') goto yy350; goto yy40; yy256: - YYDEBUG(256, *YYCURSOR); + YYDEBUG(256, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy351; if (yych == 'e') goto yy351; goto yy40; yy257: - YYDEBUG(257, *YYCURSOR); + YYDEBUG(257, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy352; if (yych == 't') goto yy352; goto yy40; yy258: - YYDEBUG(258, *YYCURSOR); + YYDEBUG(258, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy354; if (yych == 'c') goto yy354; goto yy40; yy259: - YYDEBUG(259, *YYCURSOR); + YYDEBUG(259, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy355; if (yych == 'e') goto yy355; goto yy40; yy260: - YYDEBUG(260, *YYCURSOR); + YYDEBUG(260, yych); yyaccept = 21; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy261: - YYDEBUG(261, *YYCURSOR); + YYDEBUG(261, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_NEW); } yy262: - YYDEBUG(262, *YYCURSOR); + YYDEBUG(262, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'V') { @@ -5005,147 +4848,139 @@ } } yy263: - YYDEBUG(263, *YYCURSOR); + YYDEBUG(263, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy358; if (yych == 't') goto yy358; goto yy40; yy264: - YYDEBUG(264, *YYCURSOR); + YYDEBUG(264, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy359; if (yych == 'l') goto yy359; goto yy40; yy265: - YYDEBUG(265, *YYCURSOR); + YYDEBUG(265, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'D') goto yy360; if (yych == 'd') goto yy360; goto yy40; yy266: - YYDEBUG(266, *YYCURSOR); + YYDEBUG(266, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'U') goto yy361; if (yych == 'u') goto yy361; goto yy40; yy267: - YYDEBUG(267, *YYCURSOR); + YYDEBUG(267, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'U') goto yy362; if (yych == 'u') goto yy362; goto yy40; yy268: - YYDEBUG(268, *YYCURSOR); + YYDEBUG(268, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy363; if (yych == 't') goto yy363; goto yy40; yy269: - YYDEBUG(269, *YYCURSOR); + YYDEBUG(269, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy364; if (yych == 't') goto yy364; goto yy40; yy270: - YYDEBUG(270, *YYCURSOR); + YYDEBUG(270, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy365; if (yych == 'o') goto yy365; goto yy40; yy271: - YYDEBUG(271, *YYCURSOR); + YYDEBUG(271, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy366; if (yych == 'i') goto yy366; goto yy40; yy272: - YYDEBUG(272, *YYCURSOR); + YYDEBUG(272, yych); yyaccept = 22; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy273: - YYDEBUG(273, *YYCURSOR); + YYDEBUG(273, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_TRY); } yy274: - YYDEBUG(274, *YYCURSOR); + YYDEBUG(274, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy367; if (yych == 'e') goto yy367; goto yy40; yy275: - YYDEBUG(275, *YYCURSOR); + YYDEBUG(275, yych); yyaccept = 23; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy276: - YYDEBUG(276, *YYCURSOR); + YYDEBUG(276, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_USE); } yy277: - YYDEBUG(277, *YYCURSOR); + YYDEBUG(277, yych); yyaccept = 24; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy278: - YYDEBUG(278, *YYCURSOR); + YYDEBUG(278, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_VAR); } yy279: - YYDEBUG(279, *YYCURSOR); + YYDEBUG(279, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy368; if (yych == 'l') goto yy368; goto yy40; yy280: - YYDEBUG(280, *YYCURSOR); + YYDEBUG(280, yych); yyaccept = 25; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy281: - YYDEBUG(281, *YYCURSOR); + YYDEBUG(281, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_LOGICAL_XOR); } yy282: - YYDEBUG(282, *YYCURSOR); + YYDEBUG(282, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy369; if (yych == 'l') goto yy369; goto yy40; yy283: - YYDEBUG(283, *YYCURSOR); + YYDEBUG(283, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -5161,21 +4996,21 @@ goto yy178; } yy284: - YYDEBUG(284, *YYCURSOR); + YYDEBUG(284, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy370; if (yych == 'l') goto yy370; goto yy40; yy285: - YYDEBUG(285, *YYCURSOR); + YYDEBUG(285, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy371; if (yych == 'i') goto yy371; goto yy40; yy286: - YYDEBUG(286, *YYCURSOR); + YYDEBUG(286, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'U') { @@ -5192,70 +5027,66 @@ } } yy287: - YYDEBUG(287, *YYCURSOR); + YYDEBUG(287, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy374; if (yych == 'a') goto yy374; goto yy40; yy288: - YYDEBUG(288, *YYCURSOR); + YYDEBUG(288, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy375; if (yych == 'i') goto yy375; goto yy40; yy289: - YYDEBUG(289, *YYCURSOR); + YYDEBUG(289, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy376; if (yych == 'e') goto yy376; goto yy40; yy290: - YYDEBUG(290, *YYCURSOR); + YYDEBUG(290, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy377; if (yych == 'a') goto yy377; goto yy40; yy291: - YYDEBUG(291, *YYCURSOR); + YYDEBUG(291, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy378; if (yych == 'r') goto yy378; goto yy40; yy292: - YYDEBUG(292, *YYCURSOR); + YYDEBUG(292, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy379; if (yych == 'r') goto yy379; goto yy40; yy293: - YYDEBUG(293, *YYCURSOR); + YYDEBUG(293, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 2) { - goto yy185; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 2) goto yy185; if (yych <= 0x00) goto yy72; goto yy186; yy294: - YYDEBUG(294, *YYCURSOR); + YYDEBUG(294, yych); yyaccept = 26; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 2) { - goto yy185; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 2) goto yy185; if (yych <= 0x00) goto yy75; goto yy70; yy295: - YYDEBUG(295, *YYCURSOR); + YYDEBUG(295, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -5269,7 +5100,7 @@ goto yy185; } yy296: - YYDEBUG(296, *YYCURSOR); + YYDEBUG(296, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -5283,78 +5114,76 @@ goto yy185; } yy297: - YYDEBUG(297, *YYCURSOR); + YYDEBUG(297, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 64) { - goto yy297; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 64) goto yy297; if (yych <= 0x00) goto yy72; if (yych == '/') goto yy70; goto yy188; yy298: - YYDEBUG(298, *YYCURSOR); + YYDEBUG(298, yych); yych = *++YYCURSOR; if (yych == 'A') goto yy382; if (yych == 'a') goto yy382; goto yy72; yy299: - YYDEBUG(299, *YYCURSOR); + YYDEBUG(299, yych); yych = *++YYCURSOR; if (yych == 'A') goto yy383; if (yych == 'a') goto yy383; goto yy72; yy300: - YYDEBUG(300, *YYCURSOR); + YYDEBUG(300, yych); yych = *++YYCURSOR; if (yych == 'L') goto yy384; if (yych == 'l') goto yy384; goto yy72; yy301: - YYDEBUG(301, *YYCURSOR); + YYDEBUG(301, yych); yych = *++YYCURSOR; if (yych == 'B') goto yy385; if (yych == 'b') goto yy385; goto yy72; yy302: - YYDEBUG(302, *YYCURSOR); + YYDEBUG(302, yych); yych = *++YYCURSOR; if (yych == 'A') goto yy386; if (yych == 'a') goto yy386; goto yy72; yy303: - YYDEBUG(303, *YYCURSOR); + YYDEBUG(303, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy389; if (yych == 'e') goto yy389; goto yy388; yy304: - YYDEBUG(304, *YYCURSOR); + YYDEBUG(304, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy390; if (yych == 'e') goto yy390; goto yy72; yy305: - YYDEBUG(305, *YYCURSOR); + YYDEBUG(305, yych); yych = *++YYCURSOR; if (yych == 'L') goto yy391; if (yych == 'l') goto yy391; goto yy72; yy306: - YYDEBUG(306, *YYCURSOR); + YYDEBUG(306, yych); yych = *++YYCURSOR; if (yych == 'I') goto yy392; if (yych == 'i') goto yy392; goto yy72; yy307: - YYDEBUG(307, *YYCURSOR); + YYDEBUG(307, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy393; if (yych == 'e') goto yy393; goto yy72; yy308: - YYDEBUG(308, *YYCURSOR); + YYDEBUG(308, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -5368,21 +5197,21 @@ goto yy104; } yy309: - YYDEBUG(309, *YYCURSOR); + YYDEBUG(309, yych); yych = *++YYCURSOR; if (yych == '"') goto yy72; if (yych <= '/') goto yy395; if (yych <= '9') goto yy72; goto yy395; yy310: - YYDEBUG(310, *YYCURSOR); + YYDEBUG(310, yych); yych = *++YYCURSOR; if (yych == '\'') goto yy72; if (yych <= '/') goto yy397; if (yych <= '9') goto yy72; goto yy397; yy311: - YYDEBUG(311, *YYCURSOR); + YYDEBUG(311, yych); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; @@ -5409,112 +5238,108 @@ } } yy312: - YYDEBUG(312, *YYCURSOR); + YYDEBUG(312, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy401; if (yych == 'r') goto yy401; goto yy40; yy313: - YYDEBUG(313, *YYCURSOR); + YYDEBUG(313, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'Y') goto yy402; if (yych == 'y') goto yy402; goto yy40; yy314: - YYDEBUG(314, *YYCURSOR); + YYDEBUG(314, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'K') goto yy404; if (yych == 'k') goto yy404; goto yy40; yy315: - YYDEBUG(315, *YYCURSOR); + YYDEBUG(315, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy406; if (yych == 'a') goto yy406; goto yy40; yy316: - YYDEBUG(316, *YYCURSOR); + YYDEBUG(316, yych); yyaccept = 27; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy317: - YYDEBUG(317, *YYCURSOR); + YYDEBUG(317, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_CASE); } yy318: - YYDEBUG(318, *YYCURSOR); + YYDEBUG(318, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'H') goto yy407; if (yych == 'h') goto yy407; goto yy40; yy319: - YYDEBUG(319, *YYCURSOR); + YYDEBUG(319, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy409; if (yych == 's') goto yy409; goto yy40; yy320: - YYDEBUG(320, *YYCURSOR); + YYDEBUG(320, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy411; if (yych == 'e') goto yy411; goto yy40; yy321: - YYDEBUG(321, *YYCURSOR); + YYDEBUG(321, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy413; if (yych == 't') goto yy413; goto yy40; yy322: - YYDEBUG(322, *YYCURSOR); + YYDEBUG(322, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy415; if (yych == 'i') goto yy415; goto yy40; yy323: - YYDEBUG(323, *YYCURSOR); + YYDEBUG(323, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy416; if (yych == 'a') goto yy416; goto yy40; yy324: - YYDEBUG(324, *YYCURSOR); + YYDEBUG(324, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'U') goto yy417; if (yych == 'u') goto yy417; goto yy40; yy325: - YYDEBUG(325, *YYCURSOR); + YYDEBUG(325, yych); yyaccept = 28; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy326: - YYDEBUG(326, *YYCURSOR); + YYDEBUG(326, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_ECHO); } yy327: - YYDEBUG(327, *YYCURSOR); + YYDEBUG(327, yych); yyaccept = 29; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\\') { @@ -5538,55 +5363,55 @@ } } yy328: - YYDEBUG(328, *YYCURSOR); + YYDEBUG(328, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_ELSE); } yy329: - YYDEBUG(329, *YYCURSOR); + YYDEBUG(329, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'Y') goto yy419; if (yych == 'y') goto yy419; goto yy40; yy330: - YYDEBUG(330, *YYCURSOR); + YYDEBUG(330, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy421; if (yych == 'e') goto yy421; goto yy40; yy331: - YYDEBUG(331, *YYCURSOR); + YYDEBUG(331, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy422; if (yych == 'o') goto yy422; goto yy40; yy332: - YYDEBUG(332, *YYCURSOR); + YYDEBUG(332, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'F') goto yy423; if (yych == 'f') goto yy423; goto yy40; yy333: - YYDEBUG(333, *YYCURSOR); + YYDEBUG(333, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'W') goto yy425; if (yych == 'w') goto yy425; goto yy40; yy334: - YYDEBUG(334, *YYCURSOR); + YYDEBUG(334, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'H') goto yy426; if (yych == 'h') goto yy426; goto yy40; yy335: - YYDEBUG(335, *YYCURSOR); + YYDEBUG(335, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x1F) { @@ -5608,98 +5433,92 @@ } } yy336: - YYDEBUG(336, *YYCURSOR); + YYDEBUG(336, yych); yyaccept = 30; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy337: - YYDEBUG(337, *YYCURSOR); + YYDEBUG(337, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_EVAL); } yy338: - YYDEBUG(338, *YYCURSOR); + YYDEBUG(338, yych); yyaccept = 31; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy339: - YYDEBUG(339, *YYCURSOR); + YYDEBUG(339, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_EXIT); } yy340: - YYDEBUG(340, *YYCURSOR); + YYDEBUG(340, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy430; if (yych == 'n') goto yy430; goto yy40; yy341: - YYDEBUG(341, *YYCURSOR); + YYDEBUG(341, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy431; if (yych == 'l') goto yy431; goto yy40; yy342: - YYDEBUG(342, *YYCURSOR); + YYDEBUG(342, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy433; if (yych == 'a') goto yy433; goto yy40; yy343: - YYDEBUG(343, *YYCURSOR); + YYDEBUG(343, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy434; if (yych == 't') goto yy434; goto yy40; yy344: - YYDEBUG(344, *YYCURSOR); + YYDEBUG(344, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy435; if (yych == 'a') goto yy435; goto yy40; yy345: - YYDEBUG(345, *YYCURSOR); + YYDEBUG(345, yych); yyaccept = 32; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy346: - YYDEBUG(346, *YYCURSOR); + YYDEBUG(346, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_GOTO); } yy347: - YYDEBUG(347, *YYCURSOR); + YYDEBUG(347, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy436; if (yych == 'e') goto yy436; goto yy40; yy348: - YYDEBUG(348, *YYCURSOR); + YYDEBUG(348, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'U') goto yy437; if (yych == 'u') goto yy437; goto yy40; yy349: - YYDEBUG(349, *YYCURSOR); + YYDEBUG(349, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'E') { @@ -5716,217 +5535,215 @@ } } yy350: - YYDEBUG(350, *YYCURSOR); + YYDEBUG(350, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy440; if (yych == 'r') goto yy440; goto yy40; yy351: - YYDEBUG(351, *YYCURSOR); + YYDEBUG(351, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy441; if (yych == 't') goto yy441; goto yy40; yy352: - YYDEBUG(352, *YYCURSOR); + YYDEBUG(352, yych); yyaccept = 33; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy353: - YYDEBUG(353, *YYCURSOR); + YYDEBUG(353, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_LIST); } yy354: - YYDEBUG(354, *YYCURSOR); + YYDEBUG(354, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'H') goto yy443; if (yych == 'h') goto yy443; goto yy40; yy355: - YYDEBUG(355, *YYCURSOR); + YYDEBUG(355, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy445; if (yych == 's') goto yy445; goto yy40; yy356: - YYDEBUG(356, *YYCURSOR); + YYDEBUG(356, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy446; if (yych == 't') goto yy446; goto yy40; yy357: - YYDEBUG(357, *YYCURSOR); + YYDEBUG(357, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy448; if (yych == 'a') goto yy448; goto yy40; yy358: - YYDEBUG(358, *YYCURSOR); + YYDEBUG(358, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy449; if (yych == 'e') goto yy449; goto yy40; yy359: - YYDEBUG(359, *YYCURSOR); + YYDEBUG(359, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy450; if (yych == 'i') goto yy450; goto yy40; yy360: - YYDEBUG(360, *YYCURSOR); + YYDEBUG(360, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy451; if (yych == 'o') goto yy451; goto yy40; yy361: - YYDEBUG(361, *YYCURSOR); + YYDEBUG(361, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy452; if (yych == 'i') goto yy452; goto yy40; yy362: - YYDEBUG(362, *YYCURSOR); + YYDEBUG(362, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy453; if (yych == 'r') goto yy453; goto yy40; yy363: - YYDEBUG(363, *YYCURSOR); + YYDEBUG(363, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy454; if (yych == 'i') goto yy454; goto yy40; yy364: - YYDEBUG(364, *YYCURSOR); + YYDEBUG(364, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy455; if (yych == 'c') goto yy455; goto yy40; yy365: - YYDEBUG(365, *YYCURSOR); + YYDEBUG(365, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'W') goto yy456; if (yych == 'w') goto yy456; goto yy40; yy366: - YYDEBUG(366, *YYCURSOR); + YYDEBUG(366, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy458; if (yych == 't') goto yy458; goto yy40; yy367: - YYDEBUG(367, *YYCURSOR); + YYDEBUG(367, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy460; if (yych == 't') goto yy460; goto yy40; yy368: - YYDEBUG(368, *YYCURSOR); + YYDEBUG(368, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy462; if (yych == 'e') goto yy462; goto yy40; yy369: - YYDEBUG(369, *YYCURSOR); + YYDEBUG(369, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'D') goto yy464; if (yych == 'd') goto yy464; goto yy40; yy370: - YYDEBUG(370, *YYCURSOR); + YYDEBUG(370, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy466; if (yych == 'a') goto yy466; goto yy40; yy371: - YYDEBUG(371, *YYCURSOR); + YYDEBUG(371, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy467; if (yych == 'r') goto yy467; goto yy40; yy372: - YYDEBUG(372, *YYCURSOR); + YYDEBUG(372, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy468; if (yych == 'l') goto yy468; goto yy40; yy373: - YYDEBUG(373, *YYCURSOR); + YYDEBUG(373, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy469; if (yych == 'n') goto yy469; goto yy40; yy374: - YYDEBUG(374, *YYCURSOR); + YYDEBUG(374, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy470; if (yych == 'l') goto yy470; goto yy40; yy375: - YYDEBUG(375, *YYCURSOR); + YYDEBUG(375, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy471; if (yych == 'n') goto yy471; goto yy40; yy376: - YYDEBUG(376, *YYCURSOR); + YYDEBUG(376, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy472; if (yych == 't') goto yy472; goto yy40; yy377: - YYDEBUG(377, *YYCURSOR); + YYDEBUG(377, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'M') goto yy473; if (yych == 'm') goto yy473; goto yy40; yy378: - YYDEBUG(378, *YYCURSOR); + YYDEBUG(378, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy474; if (yych == 'o') goto yy474; goto yy40; yy379: - YYDEBUG(379, *YYCURSOR); + YYDEBUG(379, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy475; if (yych == 'a') goto yy475; goto yy40; yy380: - YYDEBUG(380, *YYCURSOR); + YYDEBUG(380, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -5940,53 +5757,51 @@ goto yy185; } yy381: - YYDEBUG(381, *YYCURSOR); + YYDEBUG(381, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 128) { - goto yy381; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 128) goto yy381; if (yych <= 0x00) goto yy72; if (yych <= '\r') goto yy476; goto yy477; yy382: - YYDEBUG(382, *YYCURSOR); + YYDEBUG(382, yych); yych = *++YYCURSOR; if (yych == 'Y') goto yy478; if (yych == 'y') goto yy478; goto yy72; yy383: - YYDEBUG(383, *YYCURSOR); + YYDEBUG(383, yych); yych = *++YYCURSOR; if (yych == 'R') goto yy479; if (yych == 'r') goto yy479; goto yy72; yy384: - YYDEBUG(384, *YYCURSOR); + YYDEBUG(384, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy482; if (yych == 'e') goto yy482; goto yy481; yy385: - YYDEBUG(385, *YYCURSOR); + YYDEBUG(385, yych); yych = *++YYCURSOR; if (yych == 'L') goto yy483; if (yych == 'l') goto yy483; goto yy72; yy386: - YYDEBUG(386, *YYCURSOR); + YYDEBUG(386, yych); yych = *++YYCURSOR; if (yych == 'T') goto yy484; if (yych == 't') goto yy484; goto yy72; yy387: - YYDEBUG(387, *YYCURSOR); + YYDEBUG(387, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; yy388: - YYDEBUG(388, *YYCURSOR); + YYDEBUG(388, yych); if (yych <= 0x1F) { if (yych == '\t') goto yy387; goto yy72; @@ -6000,19 +5815,19 @@ RETURN_TOKEN(T_INT_CAST); } yy389: - YYDEBUG(389, *YYCURSOR); + YYDEBUG(389, yych); yych = *++YYCURSOR; if (yych == 'G') goto yy485; if (yych == 'g') goto yy485; goto yy72; yy390: - YYDEBUG(390, *YYCURSOR); + YYDEBUG(390, yych); yych = *++YYCURSOR; if (yych == 'C') goto yy486; if (yych == 'c') goto yy486; goto yy72; yy391: - YYDEBUG(391, *YYCURSOR); + YYDEBUG(391, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -6025,24 +5840,24 @@ goto yy72; } yy392: - YYDEBUG(392, *YYCURSOR); + YYDEBUG(392, yych); yych = *++YYCURSOR; if (yych == 'N') goto yy488; if (yych == 'n') goto yy488; goto yy72; yy393: - YYDEBUG(393, *YYCURSOR); + YYDEBUG(393, yych); yych = *++YYCURSOR; if (yych == 'T') goto yy489; if (yych == 't') goto yy489; goto yy72; yy394: - YYDEBUG(394, *YYCURSOR); + YYDEBUG(394, yych); ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; yy395: - YYDEBUG(395, *YYCURSOR); + YYDEBUG(395, yych); if (yych <= 'Z') { if (yych <= '/') { if (yych == '"') goto yy490; @@ -6063,12 +5878,12 @@ } } yy396: - YYDEBUG(396, *YYCURSOR); + YYDEBUG(396, yych); ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; yy397: - YYDEBUG(397, *YYCURSOR); + YYDEBUG(397, yych); if (yych <= 'Z') { if (yych <= '/') { if (yych == '\'') goto yy490; @@ -6089,10 +5904,10 @@ } } yy398: - YYDEBUG(398, *YYCURSOR); + YYDEBUG(398, yych); ++YYCURSOR; yy399: - YYDEBUG(399, *YYCURSOR); + YYDEBUG(399, yych); yyleng = YYCURSOR - SCNG(yy_text); { char *s; @@ -6239,194 +6054,178 @@ RETURN_TOKEN(T_START_HEREDOC); } yy400: - YYDEBUG(400, *YYCURSOR); + YYDEBUG(400, yych); yych = *++YYCURSOR; if (yych == '\n') goto yy398; goto yy399; yy401: - YYDEBUG(401, *YYCURSOR); + YYDEBUG(401, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy491; if (yych == 'a') goto yy491; goto yy40; yy402: - YYDEBUG(402, *YYCURSOR); + YYDEBUG(402, yych); yyaccept = 34; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy403: - YYDEBUG(403, *YYCURSOR); + YYDEBUG(403, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_ARRAY); } yy404: - YYDEBUG(404, *YYCURSOR); + YYDEBUG(404, yych); yyaccept = 35; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy405: - YYDEBUG(405, *YYCURSOR); + YYDEBUG(405, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_BREAK); } yy406: - YYDEBUG(406, *YYCURSOR); + YYDEBUG(406, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'B') goto yy492; if (yych == 'b') goto yy492; goto yy40; yy407: - YYDEBUG(407, *YYCURSOR); + YYDEBUG(407, yych); yyaccept = 36; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy408: - YYDEBUG(408, *YYCURSOR); + YYDEBUG(408, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_CATCH); } yy409: - YYDEBUG(409, *YYCURSOR); + YYDEBUG(409, yych); yyaccept = 37; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy410: - YYDEBUG(410, *YYCURSOR); + YYDEBUG(410, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_CLASS); } yy411: - YYDEBUG(411, *YYCURSOR); + YYDEBUG(411, yych); yyaccept = 38; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy412: - YYDEBUG(412, *YYCURSOR); + YYDEBUG(412, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_CLONE); } yy413: - YYDEBUG(413, *YYCURSOR); + YYDEBUG(413, yych); yyaccept = 39; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy414: - YYDEBUG(414, *YYCURSOR); + YYDEBUG(414, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_CONST); } yy415: - YYDEBUG(415, *YYCURSOR); + YYDEBUG(415, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy493; if (yych == 'n') goto yy493; goto yy40; yy416: - YYDEBUG(416, *YYCURSOR); + YYDEBUG(416, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy494; if (yych == 'r') goto yy494; goto yy40; yy417: - YYDEBUG(417, *YYCURSOR); + YYDEBUG(417, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy495; if (yych == 'l') goto yy495; goto yy40; yy418: - YYDEBUG(418, *YYCURSOR); + YYDEBUG(418, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'F') goto yy496; if (yych == 'f') goto yy496; goto yy40; yy419: - YYDEBUG(419, *YYCURSOR); + YYDEBUG(419, yych); yyaccept = 40; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy420: - YYDEBUG(420, *YYCURSOR); + YYDEBUG(420, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_EMPTY); } yy421: - YYDEBUG(421, *YYCURSOR); + YYDEBUG(421, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy498; if (yych == 'c') goto yy498; goto yy40; yy422: - YYDEBUG(422, *YYCURSOR); + YYDEBUG(422, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy499; if (yych == 'r') goto yy499; goto yy40; yy423: - YYDEBUG(423, *YYCURSOR); + YYDEBUG(423, yych); yyaccept = 41; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy424: - YYDEBUG(424, *YYCURSOR); + YYDEBUG(424, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_ENDIF); } yy425: - YYDEBUG(425, *YYCURSOR); + YYDEBUG(425, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy501; if (yych == 'i') goto yy501; goto yy40; yy426: - YYDEBUG(426, *YYCURSOR); + YYDEBUG(426, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy502; if (yych == 'i') goto yy502; goto yy40; yy427: - YYDEBUG(427, *YYCURSOR); + YYDEBUG(427, yych); ++YYCURSOR; YYFILL(10); yych = *YYCURSOR; @@ -6473,7 +6272,7 @@ } } yy428: - YYDEBUG(428, *YYCURSOR); + YYDEBUG(428, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -6487,7 +6286,7 @@ goto yy507; } yy429: - YYDEBUG(429, *YYCURSOR); + YYDEBUG(429, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -6495,14 +6294,14 @@ if (yych == '/') goto yy507; goto yy72; yy430: - YYDEBUG(430, *YYCURSOR); + YYDEBUG(430, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'D') goto yy510; if (yych == 'd') goto yy510; goto yy40; yy431: - YYDEBUG(431, *YYCURSOR); + YYDEBUG(431, yych); yyaccept = 42; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\\') { @@ -6526,235 +6325,219 @@ } } yy432: - YYDEBUG(432, *YYCURSOR); + YYDEBUG(432, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_FINAL); } yy433: - YYDEBUG(433, *YYCURSOR); + YYDEBUG(433, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy512; if (yych == 'c') goto yy512; goto yy40; yy434: - YYDEBUG(434, *YYCURSOR); + YYDEBUG(434, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy513; if (yych == 'i') goto yy513; goto yy40; yy435: - YYDEBUG(435, *YYCURSOR); + YYDEBUG(435, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy514; if (yych == 'l') goto yy514; goto yy40; yy436: - YYDEBUG(436, *YYCURSOR); + YYDEBUG(436, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'M') goto yy516; if (yych == 'm') goto yy516; goto yy40; yy437: - YYDEBUG(437, *YYCURSOR); + YYDEBUG(437, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'D') goto yy517; if (yych == 'd') goto yy517; goto yy40; yy438: - YYDEBUG(438, *YYCURSOR); + YYDEBUG(438, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy518; if (yych == 'n') goto yy518; goto yy40; yy439: - YYDEBUG(439, *YYCURSOR); + YYDEBUG(439, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy519; if (yych == 'a') goto yy519; goto yy40; yy440: - YYDEBUG(440, *YYCURSOR); + YYDEBUG(440, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'F') goto yy520; if (yych == 'f') goto yy520; goto yy40; yy441: - YYDEBUG(441, *YYCURSOR); + YYDEBUG(441, yych); yyaccept = 43; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy442: - YYDEBUG(442, *YYCURSOR); + YYDEBUG(442, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_ISSET); } yy443: - YYDEBUG(443, *YYCURSOR); + YYDEBUG(443, yych); yyaccept = 44; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy444: - YYDEBUG(444, *YYCURSOR); + YYDEBUG(444, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_MATCH); } yy445: - YYDEBUG(445, *YYCURSOR); + YYDEBUG(445, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'P') goto yy521; if (yych == 'p') goto yy521; goto yy40; yy446: - YYDEBUG(446, *YYCURSOR); + YYDEBUG(446, yych); yyaccept = 45; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy447: - YYDEBUG(447, *YYCURSOR); + YYDEBUG(447, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_PRINT); } yy448: - YYDEBUG(448, *YYCURSOR); + YYDEBUG(448, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy522; if (yych == 't') goto yy522; goto yy40; yy449: - YYDEBUG(449, *YYCURSOR); + YYDEBUG(449, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy523; if (yych == 'c') goto yy523; goto yy40; yy450: - YYDEBUG(450, *YYCURSOR); + YYDEBUG(450, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy524; if (yych == 'c') goto yy524; goto yy40; yy451: - YYDEBUG(451, *YYCURSOR); + YYDEBUG(451, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy526; if (yych == 'n') goto yy526; goto yy40; yy452: - YYDEBUG(452, *YYCURSOR); + YYDEBUG(452, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy527; if (yych == 'r') goto yy527; goto yy40; yy453: - YYDEBUG(453, *YYCURSOR); + YYDEBUG(453, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy528; if (yych == 'n') goto yy528; goto yy40; yy454: - YYDEBUG(454, *YYCURSOR); + YYDEBUG(454, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy530; if (yych == 'c') goto yy530; goto yy40; yy455: - YYDEBUG(455, *YYCURSOR); + YYDEBUG(455, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'H') goto yy532; if (yych == 'h') goto yy532; goto yy40; yy456: - YYDEBUG(456, *YYCURSOR); + YYDEBUG(456, yych); yyaccept = 46; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy457: - YYDEBUG(457, *YYCURSOR); + YYDEBUG(457, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_THROW); } yy458: - YYDEBUG(458, *YYCURSOR); + YYDEBUG(458, yych); yyaccept = 47; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy459: - YYDEBUG(459, *YYCURSOR); + YYDEBUG(459, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_TRAIT); } yy460: - YYDEBUG(460, *YYCURSOR); + YYDEBUG(460, yych); yyaccept = 48; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy461: - YYDEBUG(461, *YYCURSOR); + YYDEBUG(461, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_UNSET); } yy462: - YYDEBUG(462, *YYCURSOR); + YYDEBUG(462, yych); yyaccept = 49; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy463: - YYDEBUG(463, *YYCURSOR); + YYDEBUG(463, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_WHILE); } yy464: - YYDEBUG(464, *YYCURSOR); + YYDEBUG(464, yych); yyaccept = 50; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych <= ' ') { if (yych <= '\f') { if (yych <= 0x08) goto yy465; @@ -6772,88 +6555,86 @@ } } yy465: - YYDEBUG(465, *YYCURSOR); + YYDEBUG(465, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_YIELD); } yy466: - YYDEBUG(466, *YYCURSOR); + YYDEBUG(466, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy537; if (yych == 's') goto yy537; goto yy40; yy467: - YYDEBUG(467, *YYCURSOR); + YYDEBUG(467, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy538; goto yy40; yy468: - YYDEBUG(468, *YYCURSOR); + YYDEBUG(468, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy539; if (yych == 'e') goto yy539; goto yy40; yy469: - YYDEBUG(469, *YYCURSOR); + YYDEBUG(469, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy540; if (yych == 'c') goto yy540; goto yy40; yy470: - YYDEBUG(470, *YYCURSOR); + YYDEBUG(470, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy541; if (yych == 't') goto yy541; goto yy40; yy471: - YYDEBUG(471, *YYCURSOR); + YYDEBUG(471, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy542; if (yych == 'e') goto yy542; goto yy40; yy472: - YYDEBUG(472, *YYCURSOR); + YYDEBUG(472, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'H') goto yy543; if (yych == 'h') goto yy543; goto yy40; yy473: - YYDEBUG(473, *YYCURSOR); + YYDEBUG(473, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy544; if (yych == 'e') goto yy544; goto yy40; yy474: - YYDEBUG(474, *YYCURSOR); + YYDEBUG(474, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'P') goto yy545; if (yych == 'p') goto yy545; goto yy40; yy475: - YYDEBUG(475, *YYCURSOR); + YYDEBUG(475, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy546; if (yych == 'i') goto yy546; goto yy40; yy476: - YYDEBUG(476, *YYCURSOR); + YYDEBUG(476, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 64) { - goto yy297; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 64) goto yy297; if (yych <= ' ') { if (yych <= '\n') { if (yych <= 0x00) goto yy72; @@ -6877,7 +6658,7 @@ } } yy477: - YYDEBUG(477, *YYCURSOR); + YYDEBUG(477, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -6900,7 +6681,7 @@ } } yy478: - YYDEBUG(478, *YYCURSOR); + YYDEBUG(478, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -6913,18 +6694,18 @@ goto yy72; } yy479: - YYDEBUG(479, *YYCURSOR); + YYDEBUG(479, yych); yych = *++YYCURSOR; if (yych == 'Y') goto yy552; if (yych == 'y') goto yy552; goto yy72; yy480: - YYDEBUG(480, *YYCURSOR); + YYDEBUG(480, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; yy481: - YYDEBUG(481, *YYCURSOR); + YYDEBUG(481, yych); if (yych <= 0x1F) { if (yych == '\t') goto yy480; goto yy72; @@ -6938,18 +6719,18 @@ RETURN_TOKEN(T_BOOL_CAST); } yy482: - YYDEBUG(482, *YYCURSOR); + YYDEBUG(482, yych); yych = *++YYCURSOR; if (yych == 'A') goto yy553; if (yych == 'a') goto yy553; goto yy72; yy483: - YYDEBUG(483, *YYCURSOR); + YYDEBUG(483, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy484; if (yych != 'e') goto yy72; yy484: - YYDEBUG(484, *YYCURSOR); + YYDEBUG(484, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -6962,19 +6743,19 @@ goto yy72; } yy485: - YYDEBUG(485, *YYCURSOR); + YYDEBUG(485, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy555; if (yych == 'e') goto yy555; goto yy72; yy486: - YYDEBUG(486, *YYCURSOR); + YYDEBUG(486, yych); yych = *++YYCURSOR; if (yych == 'T') goto yy556; if (yych == 't') goto yy556; goto yy72; yy487: - YYDEBUG(487, *YYCURSOR); + YYDEBUG(487, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -6985,13 +6766,13 @@ RETURN_TOKEN(T_DOUBLE_CAST); } yy488: - YYDEBUG(488, *YYCURSOR); + YYDEBUG(488, yych); yych = *++YYCURSOR; if (yych == 'G') goto yy552; if (yych == 'g') goto yy552; goto yy72; yy489: - YYDEBUG(489, *YYCURSOR); + YYDEBUG(489, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7004,69 +6785,67 @@ goto yy72; } yy490: - YYDEBUG(490, *YYCURSOR); + YYDEBUG(490, yych); yych = *++YYCURSOR; if (yych == '\n') goto yy398; if (yych == '\r') goto yy400; goto yy72; yy491: - YYDEBUG(491, *YYCURSOR); + YYDEBUG(491, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy558; if (yych == 'c') goto yy558; goto yy40; yy492: - YYDEBUG(492, *YYCURSOR); + YYDEBUG(492, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy559; if (yych == 'l') goto yy559; goto yy40; yy493: - YYDEBUG(493, *YYCURSOR); + YYDEBUG(493, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'U') goto yy560; if (yych == 'u') goto yy560; goto yy40; yy494: - YYDEBUG(494, *YYCURSOR); + YYDEBUG(494, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy561; if (yych == 'e') goto yy561; goto yy40; yy495: - YYDEBUG(495, *YYCURSOR); + YYDEBUG(495, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy563; if (yych == 't') goto yy563; goto yy40; yy496: - YYDEBUG(496, *YYCURSOR); + YYDEBUG(496, yych); yyaccept = 51; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy497: - YYDEBUG(497, *YYCURSOR); + YYDEBUG(497, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_ELSEIF); } yy498: - YYDEBUG(498, *YYCURSOR); + YYDEBUG(498, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy565; if (yych == 'l') goto yy565; goto yy40; yy499: - YYDEBUG(499, *YYCURSOR); + YYDEBUG(499, yych); yyaccept = 52; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\\') { @@ -7090,51 +6869,51 @@ } } yy500: - YYDEBUG(500, *YYCURSOR); + YYDEBUG(500, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_ENDFOR); } yy501: - YYDEBUG(501, *YYCURSOR); + YYDEBUG(501, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy567; if (yych == 't') goto yy567; goto yy40; yy502: - YYDEBUG(502, *YYCURSOR); + YYDEBUG(502, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy568; if (yych == 'l') goto yy568; goto yy40; yy503: - YYDEBUG(503, *YYCURSOR); + YYDEBUG(503, yych); ++YYCURSOR; yy504: - YYDEBUG(504, *YYCURSOR); + YYDEBUG(504, yych); yyleng = YYCURSOR - SCNG(yy_text); { yyless(4); RETURN_TOKEN_WITH_IDENT(T_ENUM); } yy505: - YYDEBUG(505, *YYCURSOR); + YYDEBUG(505, yych); yyaccept = 53; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'X') goto yy569; if (yych == 'x') goto yy569; goto yy504; yy506: - YYDEBUG(506, *YYCURSOR); + YYDEBUG(506, yych); yyaccept = 53; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'M') goto yy570; if (yych == 'm') goto yy570; goto yy504; yy507: - YYDEBUG(507, *YYCURSOR); + YYDEBUG(507, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7147,7 +6926,7 @@ goto yy507; } yy508: - YYDEBUG(508, *YYCURSOR); + YYDEBUG(508, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7197,7 +6976,7 @@ } } yy509: - YYDEBUG(509, *YYCURSOR); + YYDEBUG(509, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7205,176 +6984,166 @@ if (yych == '*') goto yy576; goto yy509; yy510: - YYDEBUG(510, *YYCURSOR); + YYDEBUG(510, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy577; if (yych == 's') goto yy577; goto yy40; yy511: - YYDEBUG(511, *YYCURSOR); + YYDEBUG(511, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'Y') goto yy579; if (yych == 'y') goto yy579; goto yy40; yy512: - YYDEBUG(512, *YYCURSOR); + YYDEBUG(512, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'H') goto yy581; if (yych == 'h') goto yy581; goto yy40; yy513: - YYDEBUG(513, *YYCURSOR); + YYDEBUG(513, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy583; if (yych == 'o') goto yy583; goto yy40; yy514: - YYDEBUG(514, *YYCURSOR); + YYDEBUG(514, yych); yyaccept = 54; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy515: - YYDEBUG(515, *YYCURSOR); + YYDEBUG(515, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_GLOBAL); } yy516: - YYDEBUG(516, *YYCURSOR); + YYDEBUG(516, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy584; if (yych == 'e') goto yy584; goto yy40; yy517: - YYDEBUG(517, *YYCURSOR); + YYDEBUG(517, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy585; if (yych == 'e') goto yy585; goto yy40; yy518: - YYDEBUG(518, *YYCURSOR); + YYDEBUG(518, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy587; if (yych == 'c') goto yy587; goto yy40; yy519: - YYDEBUG(519, *YYCURSOR); + YYDEBUG(519, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'D') goto yy588; if (yych == 'd') goto yy588; goto yy40; yy520: - YYDEBUG(520, *YYCURSOR); + YYDEBUG(520, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy589; if (yych == 'a') goto yy589; goto yy40; yy521: - YYDEBUG(521, *YYCURSOR); + YYDEBUG(521, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy590; if (yych == 'a') goto yy590; goto yy40; yy522: - YYDEBUG(522, *YYCURSOR); + YYDEBUG(522, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy591; if (yych == 'e') goto yy591; goto yy40; yy523: - YYDEBUG(523, *YYCURSOR); + YYDEBUG(523, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy593; if (yych == 't') goto yy593; goto yy40; yy524: - YYDEBUG(524, *YYCURSOR); + YYDEBUG(524, yych); yyaccept = 55; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '(') goto yy594; if (yych == '\\') goto yy131; yy525: - YYDEBUG(525, *YYCURSOR); + YYDEBUG(525, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_PUBLIC); } yy526: - YYDEBUG(526, *YYCURSOR); + YYDEBUG(526, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy595; if (yych == 'l') goto yy595; goto yy40; yy527: - YYDEBUG(527, *YYCURSOR); + YYDEBUG(527, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy596; if (yych == 'e') goto yy596; goto yy40; yy528: - YYDEBUG(528, *YYCURSOR); + YYDEBUG(528, yych); yyaccept = 56; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy529: - YYDEBUG(529, *YYCURSOR); + YYDEBUG(529, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_RETURN); } yy530: - YYDEBUG(530, *YYCURSOR); + YYDEBUG(530, yych); yyaccept = 57; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy531: - YYDEBUG(531, *YYCURSOR); + YYDEBUG(531, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_STATIC); } yy532: - YYDEBUG(532, *YYCURSOR); + YYDEBUG(532, yych); yyaccept = 58; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy533: - YYDEBUG(533, *YYCURSOR); + YYDEBUG(533, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_SWITCH); } yy534: - YYDEBUG(534, *YYCURSOR); + YYDEBUG(534, yych); ++YYCURSOR; YYFILL(5); yych = *YYCURSOR; @@ -7400,7 +7169,7 @@ } } yy535: - YYDEBUG(535, *YYCURSOR); + YYDEBUG(535, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7414,7 +7183,7 @@ goto yy599; } yy536: - YYDEBUG(536, *YYCURSOR); + YYDEBUG(536, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7422,73 +7191,73 @@ if (yych == '/') goto yy599; goto yy72; yy537: - YYDEBUG(537, *YYCURSOR); + YYDEBUG(537, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy602; if (yych == 's') goto yy602; goto yy40; yy538: - YYDEBUG(538, *YYCURSOR); + YYDEBUG(538, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy603; goto yy40; yy539: - YYDEBUG(539, *YYCURSOR); + YYDEBUG(539, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy605; goto yy40; yy540: - YYDEBUG(540, *YYCURSOR); + YYDEBUG(540, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy606; if (yych == 't') goto yy606; goto yy40; yy541: - YYDEBUG(541, *YYCURSOR); + YYDEBUG(541, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy607; goto yy40; yy542: - YYDEBUG(542, *YYCURSOR); + YYDEBUG(542, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy608; goto yy40; yy543: - YYDEBUG(543, *YYCURSOR); + YYDEBUG(543, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy609; if (yych == 'o') goto yy609; goto yy40; yy544: - YYDEBUG(544, *YYCURSOR); + YYDEBUG(544, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy610; if (yych == 's') goto yy610; goto yy40; yy545: - YYDEBUG(545, *YYCURSOR); + YYDEBUG(545, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy611; if (yych == 'e') goto yy611; goto yy40; yy546: - YYDEBUG(546, *YYCURSOR); + YYDEBUG(546, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy612; if (yych == 't') goto yy612; goto yy40; yy547: - YYDEBUG(547, *YYCURSOR); + YYDEBUG(547, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7511,29 +7280,25 @@ } } yy548: - YYDEBUG(548, *YYCURSOR); + YYDEBUG(548, yych); yyaccept = 26; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 4) { - goto yy188; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 4) goto yy188; if (yych <= 0x00) goto yy75; goto yy297; yy549: - YYDEBUG(549, *YYCURSOR); + YYDEBUG(549, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 64) { - goto yy297; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 64) goto yy297; if (yych <= 0x00) goto yy72; if (yych == '.') goto yy614; goto yy188; yy550: - YYDEBUG(550, *YYCURSOR); + YYDEBUG(550, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7546,14 +7311,14 @@ goto yy188; } yy551: - YYDEBUG(551, *YYCURSOR); + YYDEBUG(551, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_ARRAY_CAST); } yy552: - YYDEBUG(552, *YYCURSOR); + YYDEBUG(552, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7566,26 +7331,26 @@ goto yy72; } yy553: - YYDEBUG(553, *YYCURSOR); + YYDEBUG(553, yych); yych = *++YYCURSOR; if (yych == 'N') goto yy480; if (yych == 'n') goto yy480; goto yy72; yy554: - YYDEBUG(554, *YYCURSOR); + YYDEBUG(554, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_DOUBLE_CAST); } yy555: - YYDEBUG(555, *YYCURSOR); + YYDEBUG(555, yych); yych = *++YYCURSOR; if (yych == 'R') goto yy387; if (yych == 'r') goto yy387; goto yy72; yy556: - YYDEBUG(556, *YYCURSOR); + YYDEBUG(556, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7598,103 +7363,99 @@ goto yy72; } yy557: - YYDEBUG(557, *YYCURSOR); + YYDEBUG(557, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_UNSET_CAST); } yy558: - YYDEBUG(558, *YYCURSOR); + YYDEBUG(558, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy618; if (yych == 't') goto yy618; goto yy40; yy559: - YYDEBUG(559, *YYCURSOR); + YYDEBUG(559, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy620; if (yych == 'e') goto yy620; goto yy40; yy560: - YYDEBUG(560, *YYCURSOR); + YYDEBUG(560, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy622; if (yych == 'e') goto yy622; goto yy40; yy561: - YYDEBUG(561, *YYCURSOR); + YYDEBUG(561, yych); yyaccept = 59; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy562: - YYDEBUG(562, *YYCURSOR); + YYDEBUG(562, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_DECLARE); } yy563: - YYDEBUG(563, *YYCURSOR); + YYDEBUG(563, yych); yyaccept = 60; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy564: - YYDEBUG(564, *YYCURSOR); + YYDEBUG(564, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_DEFAULT); } yy565: - YYDEBUG(565, *YYCURSOR); + YYDEBUG(565, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy624; if (yych == 'a') goto yy624; goto yy40; yy566: - YYDEBUG(566, *YYCURSOR); + YYDEBUG(566, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy625; if (yych == 'a') goto yy625; goto yy40; yy567: - YYDEBUG(567, *YYCURSOR); + YYDEBUG(567, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy626; if (yych == 'c') goto yy626; goto yy40; yy568: - YYDEBUG(568, *YYCURSOR); + YYDEBUG(568, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy627; if (yych == 'e') goto yy627; goto yy40; yy569: - YYDEBUG(569, *YYCURSOR); + YYDEBUG(569, yych); yych = *++YYCURSOR; if (yych == 'T') goto yy629; if (yych == 't') goto yy629; goto yy72; yy570: - YYDEBUG(570, *YYCURSOR); + YYDEBUG(570, yych); yych = *++YYCURSOR; if (yych == 'P') goto yy630; if (yych == 'p') goto yy630; goto yy72; yy571: - YYDEBUG(571, *YYCURSOR); + YYDEBUG(571, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7707,7 +7468,7 @@ goto yy507; } yy572: - YYDEBUG(572, *YYCURSOR); + YYDEBUG(572, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7721,7 +7482,7 @@ goto yy507; } yy573: - YYDEBUG(573, *YYCURSOR); + YYDEBUG(573, yych); yyaccept = 53; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -7735,7 +7496,7 @@ goto yy507; } yy574: - YYDEBUG(574, *YYCURSOR); + YYDEBUG(574, yych); yyaccept = 53; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -7759,7 +7520,7 @@ } } yy575: - YYDEBUG(575, *YYCURSOR); + YYDEBUG(575, yych); yyaccept = 53; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -7783,7 +7544,7 @@ } } yy576: - YYDEBUG(576, *YYCURSOR); + YYDEBUG(576, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7796,63 +7557,57 @@ goto yy509; } yy577: - YYDEBUG(577, *YYCURSOR); + YYDEBUG(577, yych); yyaccept = 61; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy578: - YYDEBUG(578, *YYCURSOR); + YYDEBUG(578, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_EXTENDS); } yy579: - YYDEBUG(579, *YYCURSOR); + YYDEBUG(579, yych); yyaccept = 62; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy580: - YYDEBUG(580, *YYCURSOR); + YYDEBUG(580, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_FINALLY); } yy581: - YYDEBUG(581, *YYCURSOR); + YYDEBUG(581, yych); yyaccept = 63; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy582: - YYDEBUG(582, *YYCURSOR); + YYDEBUG(582, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_FOREACH); } yy583: - YYDEBUG(583, *YYCURSOR); + YYDEBUG(583, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy634; if (yych == 'n') goto yy634; goto yy40; yy584: - YYDEBUG(584, *YYCURSOR); + YYDEBUG(584, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy636; if (yych == 'n') goto yy636; goto yy40; yy585: - YYDEBUG(585, *YYCURSOR); + YYDEBUG(585, yych); yyaccept = 64; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\\') { @@ -7872,76 +7627,74 @@ } } yy586: - YYDEBUG(586, *YYCURSOR); + YYDEBUG(586, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_INCLUDE); } yy587: - YYDEBUG(587, *YYCURSOR); + YYDEBUG(587, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy638; if (yych == 'e') goto yy638; goto yy40; yy588: - YYDEBUG(588, *YYCURSOR); + YYDEBUG(588, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy639; if (yych == 'o') goto yy639; goto yy40; yy589: - YYDEBUG(589, *YYCURSOR); + YYDEBUG(589, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy640; if (yych == 'c') goto yy640; goto yy40; yy590: - YYDEBUG(590, *YYCURSOR); + YYDEBUG(590, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy641; if (yych == 'c') goto yy641; goto yy40; yy591: - YYDEBUG(591, *YYCURSOR); + YYDEBUG(591, yych); yyaccept = 65; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '(') goto yy642; if (yych == '\\') goto yy131; yy592: - YYDEBUG(592, *YYCURSOR); + YYDEBUG(592, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_PRIVATE); } yy593: - YYDEBUG(593, *YYCURSOR); + YYDEBUG(593, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy643; if (yych == 'e') goto yy643; goto yy40; yy594: - YYDEBUG(594, *YYCURSOR); + YYDEBUG(594, yych); yych = *++YYCURSOR; if (yych == 'S') goto yy644; if (yych == 's') goto yy644; goto yy72; yy595: - YYDEBUG(595, *YYCURSOR); + YYDEBUG(595, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'Y') goto yy645; if (yych == 'y') goto yy645; goto yy40; yy596: - YYDEBUG(596, *YYCURSOR); + YYDEBUG(596, yych); yyaccept = 66; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '\\') { @@ -7961,19 +7714,19 @@ } } yy597: - YYDEBUG(597, *YYCURSOR); + YYDEBUG(597, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_REQUIRE); } yy598: - YYDEBUG(598, *YYCURSOR); + YYDEBUG(598, yych); yych = *++YYCURSOR; if (yych == 'R') goto yy648; if (yych == 'r') goto yy648; goto yy72; yy599: - YYDEBUG(599, *YYCURSOR); + YYDEBUG(599, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -7986,7 +7739,7 @@ goto yy599; } yy600: - YYDEBUG(600, *YYCURSOR); + YYDEBUG(600, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8017,7 +7770,7 @@ } } yy601: - YYDEBUG(601, *YYCURSOR); + YYDEBUG(601, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8025,80 +7778,78 @@ if (yych == '*') goto yy652; goto yy601; yy602: - YYDEBUG(602, *YYCURSOR); + YYDEBUG(602, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy653; goto yy40; yy603: - YYDEBUG(603, *YYCURSOR); + YYDEBUG(603, yych); yyaccept = 67; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy604: - YYDEBUG(604, *YYCURSOR); + YYDEBUG(604, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_DIR); } yy605: - YYDEBUG(605, *YYCURSOR); + YYDEBUG(605, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy654; goto yy40; yy606: - YYDEBUG(606, *YYCURSOR); + YYDEBUG(606, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy656; if (yych == 'i') goto yy656; goto yy40; yy607: - YYDEBUG(607, *YYCURSOR); + YYDEBUG(607, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy657; if (yych == 'c') goto yy657; goto yy40; yy608: - YYDEBUG(608, *YYCURSOR); + YYDEBUG(608, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy658; goto yy40; yy609: - YYDEBUG(609, *YYCURSOR); + YYDEBUG(609, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'D') goto yy660; if (yych == 'd') goto yy660; goto yy40; yy610: - YYDEBUG(610, *YYCURSOR); + YYDEBUG(610, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'P') goto yy661; if (yych == 'p') goto yy661; goto yy40; yy611: - YYDEBUG(611, *YYCURSOR); + YYDEBUG(611, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy662; if (yych == 'r') goto yy662; goto yy40; yy612: - YYDEBUG(612, *YYCURSOR); + YYDEBUG(612, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy663; goto yy40; yy613: - YYDEBUG(613, *YYCURSOR); + YYDEBUG(613, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8131,132 +7882,120 @@ } } yy614: - YYDEBUG(614, *YYCURSOR); + YYDEBUG(614, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 64) { - goto yy297; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 64) goto yy297; if (yych <= 0x00) goto yy72; if (yych == '.') goto yy548; goto yy188; yy615: - YYDEBUG(615, *YYCURSOR); + YYDEBUG(615, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 64) { - goto yy297; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 64) goto yy297; if (yych <= 0x00) goto yy72; if (yych == '/') goto yy476; goto yy188; yy616: - YYDEBUG(616, *YYCURSOR); + YYDEBUG(616, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_STRING_CAST); } yy617: - YYDEBUG(617, *YYCURSOR); + YYDEBUG(617, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_OBJECT_CAST); } yy618: - YYDEBUG(618, *YYCURSOR); + YYDEBUG(618, yych); yyaccept = 68; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy619: - YYDEBUG(619, *YYCURSOR); + YYDEBUG(619, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_ABSTRACT); } yy620: - YYDEBUG(620, *YYCURSOR); + YYDEBUG(620, yych); yyaccept = 69; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy621: - YYDEBUG(621, *YYCURSOR); + YYDEBUG(621, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_CALLABLE); } yy622: - YYDEBUG(622, *YYCURSOR); + YYDEBUG(622, yych); yyaccept = 70; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy623: - YYDEBUG(623, *YYCURSOR); + YYDEBUG(623, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_CONTINUE); } yy624: - YYDEBUG(624, *YYCURSOR); + YYDEBUG(624, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy668; if (yych == 'r') goto yy668; goto yy40; yy625: - YYDEBUG(625, *YYCURSOR); + YYDEBUG(625, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy669; if (yych == 'c') goto yy669; goto yy40; yy626: - YYDEBUG(626, *YYCURSOR); + YYDEBUG(626, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'H') goto yy670; if (yych == 'h') goto yy670; goto yy40; yy627: - YYDEBUG(627, *YYCURSOR); + YYDEBUG(627, yych); yyaccept = 71; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy628: - YYDEBUG(628, *YYCURSOR); + YYDEBUG(628, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_ENDWHILE); } yy629: - YYDEBUG(629, *YYCURSOR); + YYDEBUG(629, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy672; if (yych == 'e') goto yy672; goto yy72; yy630: - YYDEBUG(630, *YYCURSOR); + YYDEBUG(630, yych); yych = *++YYCURSOR; if (yych == 'L') goto yy673; if (yych == 'l') goto yy673; goto yy72; yy631: - YYDEBUG(631, *YYCURSOR); + YYDEBUG(631, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8270,7 +8009,7 @@ goto yy631; } yy632: - YYDEBUG(632, *YYCURSOR); + YYDEBUG(632, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8293,7 +8032,7 @@ } } yy633: - YYDEBUG(633, *YYCURSOR); + YYDEBUG(633, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8316,109 +8055,105 @@ } } yy634: - YYDEBUG(634, *YYCURSOR); + YYDEBUG(634, yych); yyaccept = 72; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy635: - YYDEBUG(635, *YYCURSOR); + YYDEBUG(635, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_FUNCTION); } yy636: - YYDEBUG(636, *YYCURSOR); + YYDEBUG(636, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy678; if (yych == 't') goto yy678; goto yy40; yy637: - YYDEBUG(637, *YYCURSOR); + YYDEBUG(637, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy679; if (yych == 'o') goto yy679; goto yy40; yy638: - YYDEBUG(638, *YYCURSOR); + YYDEBUG(638, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy680; if (yych == 'o') goto yy680; goto yy40; yy639: - YYDEBUG(639, *YYCURSOR); + YYDEBUG(639, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'F') goto yy681; if (yych == 'f') goto yy681; goto yy40; yy640: - YYDEBUG(640, *YYCURSOR); + YYDEBUG(640, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy683; if (yych == 'e') goto yy683; goto yy40; yy641: - YYDEBUG(641, *YYCURSOR); + YYDEBUG(641, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy685; if (yych == 'e') goto yy685; goto yy40; yy642: - YYDEBUG(642, *YYCURSOR); + YYDEBUG(642, yych); yych = *++YYCURSOR; if (yych == 'S') goto yy687; if (yych == 's') goto yy687; goto yy72; yy643: - YYDEBUG(643, *YYCURSOR); + YYDEBUG(643, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'D') goto yy688; if (yych == 'd') goto yy688; goto yy40; yy644: - YYDEBUG(644, *YYCURSOR); + YYDEBUG(644, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy690; if (yych == 'e') goto yy690; goto yy72; yy645: - YYDEBUG(645, *YYCURSOR); + YYDEBUG(645, yych); yyaccept = 73; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy646: - YYDEBUG(646, *YYCURSOR); + YYDEBUG(646, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_READONLY); } yy647: - YYDEBUG(647, *YYCURSOR); + YYDEBUG(647, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy691; if (yych == 'o') goto yy691; goto yy40; yy648: - YYDEBUG(648, *YYCURSOR); + YYDEBUG(648, yych); yych = *++YYCURSOR; if (yych == 'O') goto yy692; if (yych == 'o') goto yy692; goto yy72; yy649: - YYDEBUG(649, *YYCURSOR); + YYDEBUG(649, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8431,7 +8166,7 @@ goto yy599; } yy650: - YYDEBUG(650, *YYCURSOR); + YYDEBUG(650, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8445,7 +8180,7 @@ goto yy599; } yy651: - YYDEBUG(651, *YYCURSOR); + YYDEBUG(651, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8468,7 +8203,7 @@ } } yy652: - YYDEBUG(652, *YYCURSOR); + YYDEBUG(652, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8481,104 +8216,96 @@ goto yy601; } yy653: - YYDEBUG(653, *YYCURSOR); + YYDEBUG(653, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy695; goto yy40; yy654: - YYDEBUG(654, *YYCURSOR); + YYDEBUG(654, yych); yyaccept = 74; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy655: - YYDEBUG(655, *YYCURSOR); + YYDEBUG(655, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_FILE); } yy656: - YYDEBUG(656, *YYCURSOR); + YYDEBUG(656, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy697; if (yych == 'o') goto yy697; goto yy40; yy657: - YYDEBUG(657, *YYCURSOR); + YYDEBUG(657, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'O') goto yy698; if (yych == 'o') goto yy698; goto yy40; yy658: - YYDEBUG(658, *YYCURSOR); + YYDEBUG(658, yych); yyaccept = 75; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy659: - YYDEBUG(659, *YYCURSOR); + YYDEBUG(659, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_LINE); } yy660: - YYDEBUG(660, *YYCURSOR); + YYDEBUG(660, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy699; goto yy40; yy661: - YYDEBUG(661, *YYCURSOR); + YYDEBUG(661, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'A') goto yy700; if (yych == 'a') goto yy700; goto yy40; yy662: - YYDEBUG(662, *YYCURSOR); + YYDEBUG(662, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'T') goto yy701; if (yych == 't') goto yy701; goto yy40; yy663: - YYDEBUG(663, *YYCURSOR); + YYDEBUG(663, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy702; goto yy40; yy664: - YYDEBUG(664, *YYCURSOR); + YYDEBUG(664, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 128) { - goto yy381; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 128) goto yy381; if (yych <= 0x00) goto yy72; if (yych <= '\r') goto yy613; goto yy477; yy665: - YYDEBUG(665, *YYCURSOR); + YYDEBUG(665, yych); yyaccept = 26; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 128) { - goto yy381; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 128) goto yy381; if (yych <= 0x00) goto yy75; if (yych <= '\r') goto yy476; goto yy477; yy666: - YYDEBUG(666, *YYCURSOR); + YYDEBUG(666, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8601,58 +8328,54 @@ } } yy667: - YYDEBUG(667, *YYCURSOR); + YYDEBUG(667, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_IN_SCRIPTING[0+yych] & 128) { - goto yy381; - } + if (yybm_ST_IN_SCRIPTING[0+yych] & 128) goto yy381; if (yych <= 0x00) goto yy72; if (yych <= '\r') goto yy476; goto yy705; yy668: - YYDEBUG(668, *YYCURSOR); + YYDEBUG(668, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy706; if (yych == 'e') goto yy706; goto yy40; yy669: - YYDEBUG(669, *YYCURSOR); + YYDEBUG(669, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'H') goto yy708; if (yych == 'h') goto yy708; goto yy40; yy670: - YYDEBUG(670, *YYCURSOR); + YYDEBUG(670, yych); yyaccept = 76; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy671: - YYDEBUG(671, *YYCURSOR); + YYDEBUG(671, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_ENDSWITCH); } yy672: - YYDEBUG(672, *YYCURSOR); + YYDEBUG(672, yych); yych = *++YYCURSOR; if (yych == 'N') goto yy710; if (yych == 'n') goto yy710; goto yy72; yy673: - YYDEBUG(673, *YYCURSOR); + YYDEBUG(673, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy711; if (yych == 'e') goto yy711; goto yy72; yy674: - YYDEBUG(674, *YYCURSOR); + YYDEBUG(674, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8702,7 +8425,7 @@ } } yy675: - YYDEBUG(675, *YYCURSOR); + YYDEBUG(675, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8725,7 +8448,7 @@ } } yy676: - YYDEBUG(676, *YYCURSOR); + YYDEBUG(676, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8748,7 +8471,7 @@ } } yy677: - YYDEBUG(677, *YYCURSOR); + YYDEBUG(677, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8771,110 +8494,102 @@ } } yy678: - YYDEBUG(678, *YYCURSOR); + YYDEBUG(678, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'S') goto yy719; if (yych == 's') goto yy719; goto yy40; yy679: - YYDEBUG(679, *YYCURSOR); + YYDEBUG(679, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy721; if (yych == 'n') goto yy721; goto yy40; yy680: - YYDEBUG(680, *YYCURSOR); + YYDEBUG(680, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'F') goto yy722; if (yych == 'f') goto yy722; goto yy40; yy681: - YYDEBUG(681, *YYCURSOR); + YYDEBUG(681, yych); yyaccept = 77; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy682: - YYDEBUG(682, *YYCURSOR); + YYDEBUG(682, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_INSTEADOF); } yy683: - YYDEBUG(683, *YYCURSOR); + YYDEBUG(683, yych); yyaccept = 78; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy684: - YYDEBUG(684, *YYCURSOR); + YYDEBUG(684, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_INTERFACE); } yy685: - YYDEBUG(685, *YYCURSOR); + YYDEBUG(685, yych); yyaccept = 79; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy724; yy686: - YYDEBUG(686, *YYCURSOR); + YYDEBUG(686, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_NAMESPACE); } yy687: - YYDEBUG(687, *YYCURSOR); + YYDEBUG(687, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy725; if (yych == 'e') goto yy725; goto yy72; yy688: - YYDEBUG(688, *YYCURSOR); + YYDEBUG(688, yych); yyaccept = 80; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '(') goto yy726; if (yych == '\\') goto yy131; yy689: - YYDEBUG(689, *YYCURSOR); + YYDEBUG(689, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_PROTECTED); } yy690: - YYDEBUG(690, *YYCURSOR); + YYDEBUG(690, yych); yych = *++YYCURSOR; if (yych == 'T') goto yy727; if (yych == 't') goto yy727; goto yy72; yy691: - YYDEBUG(691, *YYCURSOR); + YYDEBUG(691, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy728; if (yych == 'n') goto yy728; goto yy40; yy692: - YYDEBUG(692, *YYCURSOR); + YYDEBUG(692, yych); yych = *++YYCURSOR; if (yych == 'M') goto yy729; if (yych == 'm') goto yy729; goto yy72; yy693: - YYDEBUG(693, *YYCURSOR); + YYDEBUG(693, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8888,7 +8603,7 @@ goto yy693; } yy694: - YYDEBUG(694, *YYCURSOR); + YYDEBUG(694, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8911,69 +8626,65 @@ } } yy695: - YYDEBUG(695, *YYCURSOR); + YYDEBUG(695, yych); yyaccept = 81; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy696: - YYDEBUG(696, *YYCURSOR); + YYDEBUG(696, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_CLASS_C); } yy697: - YYDEBUG(697, *YYCURSOR); + YYDEBUG(697, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'N') goto yy733; if (yych == 'n') goto yy733; goto yy40; yy698: - YYDEBUG(698, *YYCURSOR); + YYDEBUG(698, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'M') goto yy734; if (yych == 'm') goto yy734; goto yy40; yy699: - YYDEBUG(699, *YYCURSOR); + YYDEBUG(699, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy735; goto yy40; yy700: - YYDEBUG(700, *YYCURSOR); + YYDEBUG(700, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy737; if (yych == 'c') goto yy737; goto yy40; yy701: - YYDEBUG(701, *YYCURSOR); + YYDEBUG(701, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'Y') goto yy738; if (yych == 'y') goto yy738; goto yy40; yy702: - YYDEBUG(702, *YYCURSOR); + YYDEBUG(702, yych); yyaccept = 82; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy703: - YYDEBUG(703, *YYCURSOR); + YYDEBUG(703, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_TRAIT_C); } yy704: - YYDEBUG(704, *YYCURSOR); + YYDEBUG(704, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -8996,7 +8707,7 @@ } } yy705: - YYDEBUG(705, *YYCURSOR); + YYDEBUG(705, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9019,47 +8730,43 @@ } } yy706: - YYDEBUG(706, *YYCURSOR); + YYDEBUG(706, yych); yyaccept = 83; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy707: - YYDEBUG(707, *YYCURSOR); + YYDEBUG(707, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_ENDDECLARE); } yy708: - YYDEBUG(708, *YYCURSOR); + YYDEBUG(708, yych); yyaccept = 84; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy709: - YYDEBUG(709, *YYCURSOR); + YYDEBUG(709, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_ENDFOREACH); } yy710: - YYDEBUG(710, *YYCURSOR); + YYDEBUG(710, yych); yych = *++YYCURSOR; if (yych == 'D') goto yy739; if (yych == 'd') goto yy739; goto yy72; yy711: - YYDEBUG(711, *YYCURSOR); + YYDEBUG(711, yych); yych = *++YYCURSOR; if (yych == 'M') goto yy740; if (yych == 'm') goto yy740; goto yy72; yy712: - YYDEBUG(712, *YYCURSOR); + YYDEBUG(712, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9082,7 +8789,7 @@ } } yy713: - YYDEBUG(713, *YYCURSOR); + YYDEBUG(713, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9095,7 +8802,7 @@ goto yy509; } yy714: - YYDEBUG(714, *YYCURSOR); + YYDEBUG(714, yych); yyaccept = 53; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -9104,7 +8811,7 @@ if (yych == '*') goto yy576; goto yy509; yy715: - YYDEBUG(715, *YYCURSOR); + YYDEBUG(715, yych); yyaccept = 53; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -9119,7 +8826,7 @@ goto yy509; } yy716: - YYDEBUG(716, *YYCURSOR); + YYDEBUG(716, yych); yyaccept = 53; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -9134,7 +8841,7 @@ goto yy509; } yy717: - YYDEBUG(717, *YYCURSOR); + YYDEBUG(717, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9157,7 +8864,7 @@ } } yy718: - YYDEBUG(718, *YYCURSOR); + YYDEBUG(718, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9180,42 +8887,38 @@ } } yy719: - YYDEBUG(719, *YYCURSOR); + YYDEBUG(719, yych); yyaccept = 85; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy720: - YYDEBUG(720, *YYCURSOR); + YYDEBUG(720, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_IMPLEMENTS); } yy721: - YYDEBUG(721, *YYCURSOR); + YYDEBUG(721, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy747; if (yych == 'c') goto yy747; goto yy40; yy722: - YYDEBUG(722, *YYCURSOR); + YYDEBUG(722, yych); yyaccept = 86; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy723: - YYDEBUG(723, *YYCURSOR); + YYDEBUG(723, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_INSTANCEOF); } yy724: - YYDEBUG(724, *YYCURSOR); + YYDEBUG(724, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9231,31 +8934,31 @@ goto yy748; } yy725: - YYDEBUG(725, *YYCURSOR); + YYDEBUG(725, yych); yych = *++YYCURSOR; if (yych == 'T') goto yy750; if (yych == 't') goto yy750; goto yy72; yy726: - YYDEBUG(726, *YYCURSOR); + YYDEBUG(726, yych); yych = *++YYCURSOR; if (yych == 'S') goto yy751; if (yych == 's') goto yy751; goto yy72; yy727: - YYDEBUG(727, *YYCURSOR); + YYDEBUG(727, yych); yych = *++YYCURSOR; if (yych == ')') goto yy752; goto yy72; yy728: - YYDEBUG(728, *YYCURSOR); + YYDEBUG(728, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'C') goto yy753; if (yych == 'c') goto yy753; goto yy40; yy729: - YYDEBUG(729, *YYCURSOR); + YYDEBUG(729, yych); yych = *++YYCURSOR; if (yych <= '^') { if (yych <= '9') { @@ -9277,7 +8980,7 @@ } } yy730: - YYDEBUG(730, *YYCURSOR); + YYDEBUG(730, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9313,7 +9016,7 @@ } } yy731: - YYDEBUG(731, *YYCURSOR); + YYDEBUG(731, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9336,7 +9039,7 @@ } } yy732: - YYDEBUG(732, *YYCURSOR); + YYDEBUG(732, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9359,59 +9062,57 @@ } } yy733: - YYDEBUG(733, *YYCURSOR); + YYDEBUG(733, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy760; goto yy40; yy734: - YYDEBUG(734, *YYCURSOR); + YYDEBUG(734, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'P') goto yy761; if (yych == 'p') goto yy761; goto yy40; yy735: - YYDEBUG(735, *YYCURSOR); + YYDEBUG(735, yych); yyaccept = 87; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy736: - YYDEBUG(736, *YYCURSOR); + YYDEBUG(736, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_METHOD_C); } yy737: - YYDEBUG(737, *YYCURSOR); + YYDEBUG(737, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy762; if (yych == 'e') goto yy762; goto yy40; yy738: - YYDEBUG(738, *YYCURSOR); + YYDEBUG(738, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy763; goto yy40; yy739: - YYDEBUG(739, *YYCURSOR); + YYDEBUG(739, yych); yych = *++YYCURSOR; if (yych == 'S') goto yy764; if (yych == 's') goto yy764; goto yy72; yy740: - YYDEBUG(740, *YYCURSOR); + YYDEBUG(740, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy766; if (yych == 'e') goto yy766; goto yy72; yy741: - YYDEBUG(741, *YYCURSOR); + YYDEBUG(741, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9462,7 +9163,7 @@ } } yy742: - YYDEBUG(742, *YYCURSOR); + YYDEBUG(742, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9475,7 +9176,7 @@ goto yy509; } yy743: - YYDEBUG(743, *YYCURSOR); + YYDEBUG(743, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9489,7 +9190,7 @@ goto yy509; } yy744: - YYDEBUG(744, *YYCURSOR); + YYDEBUG(744, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9503,7 +9204,7 @@ goto yy509; } yy745: - YYDEBUG(745, *YYCURSOR); + YYDEBUG(745, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9526,7 +9227,7 @@ } } yy746: - YYDEBUG(746, *YYCURSOR); + YYDEBUG(746, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9549,14 +9250,14 @@ } } yy747: - YYDEBUG(747, *YYCURSOR); + YYDEBUG(747, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy776; if (yych == 'e') goto yy776; goto yy40; yy748: - YYDEBUG(748, *YYCURSOR); + YYDEBUG(748, yych); yyaccept = 88; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -9578,41 +9279,41 @@ } } yy749: - YYDEBUG(749, *YYCURSOR); + YYDEBUG(749, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_STR(T_NAME_RELATIVE, sizeof("namespace\\") - 1); } yy750: - YYDEBUG(750, *YYCURSOR); + YYDEBUG(750, yych); yych = *++YYCURSOR; if (yych == ')') goto yy778; goto yy72; yy751: - YYDEBUG(751, *YYCURSOR); + YYDEBUG(751, yych); yych = *++YYCURSOR; if (yych == 'E') goto yy779; if (yych == 'e') goto yy779; goto yy72; yy752: - YYDEBUG(752, *YYCURSOR); + YYDEBUG(752, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_PUBLIC_SET); } yy753: - YYDEBUG(753, *YYCURSOR); + YYDEBUG(753, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy780; if (yych == 'e') goto yy780; goto yy40; yy754: - YYDEBUG(754, *YYCURSOR); + YYDEBUG(754, yych); ++YYCURSOR; yy755: - YYDEBUG(755, *YYCURSOR); + YYDEBUG(755, yych); yyleng = YYCURSOR - SCNG(yy_text); { yyless(yyleng - 1); @@ -9620,7 +9321,7 @@ RETURN_TOKEN_WITH_IDENT(T_YIELD_FROM); } yy756: - YYDEBUG(756, *YYCURSOR); + YYDEBUG(756, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9643,7 +9344,7 @@ } } yy757: - YYDEBUG(757, *YYCURSOR); + YYDEBUG(757, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9656,7 +9357,7 @@ goto yy601; } yy758: - YYDEBUG(758, *YYCURSOR); + YYDEBUG(758, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9670,7 +9371,7 @@ goto yy601; } yy759: - YYDEBUG(759, *YYCURSOR); + YYDEBUG(759, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9698,48 +9399,48 @@ } } yy760: - YYDEBUG(760, *YYCURSOR); + YYDEBUG(760, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy787; goto yy40; yy761: - YYDEBUG(761, *YYCURSOR); + YYDEBUG(761, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'I') goto yy789; if (yych == 'i') goto yy789; goto yy40; yy762: - YYDEBUG(762, *YYCURSOR); + YYDEBUG(762, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy790; goto yy40; yy763: - YYDEBUG(763, *YYCURSOR); + YYDEBUG(763, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy791; goto yy40; yy764: - YYDEBUG(764, *YYCURSOR); + YYDEBUG(764, yych); ++YYCURSOR; yy765: - YYDEBUG(765, *YYCURSOR); + YYDEBUG(765, yych); yyleng = YYCURSOR - SCNG(yy_text); { yyless(4); RETURN_TOKEN_WITH_STR(T_STRING, 0); } yy766: - YYDEBUG(766, *YYCURSOR); + YYDEBUG(766, yych); yych = *++YYCURSOR; if (yych == 'N') goto yy793; if (yych == 'n') goto yy793; goto yy72; yy767: - YYDEBUG(767, *YYCURSOR); + YYDEBUG(767, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9753,7 +9454,7 @@ goto yy631; } yy768: - YYDEBUG(768, *YYCURSOR); + YYDEBUG(768, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9767,7 +9468,7 @@ goto yy631; } yy769: - YYDEBUG(769, *YYCURSOR); + YYDEBUG(769, yych); yyaccept = 53; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -9782,7 +9483,7 @@ goto yy631; } yy770: - YYDEBUG(770, *YYCURSOR); + YYDEBUG(770, yych); yyaccept = 53; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -9807,7 +9508,7 @@ } } yy771: - YYDEBUG(771, *YYCURSOR); + YYDEBUG(771, yych); yyaccept = 53; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -9832,7 +9533,7 @@ } } yy772: - YYDEBUG(772, *YYCURSOR); + YYDEBUG(772, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9846,7 +9547,7 @@ goto yy509; } yy773: - YYDEBUG(773, *YYCURSOR); + YYDEBUG(773, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9860,7 +9561,7 @@ goto yy509; } yy774: - YYDEBUG(774, *YYCURSOR); + YYDEBUG(774, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9883,7 +9584,7 @@ } } yy775: - YYDEBUG(775, *YYCURSOR); + YYDEBUG(775, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9906,48 +9607,44 @@ } } yy776: - YYDEBUG(776, *YYCURSOR); + YYDEBUG(776, yych); yyaccept = 89; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy777: - YYDEBUG(777, *YYCURSOR); + YYDEBUG(777, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_INCLUDE_ONCE); } yy778: - YYDEBUG(778, *YYCURSOR); + YYDEBUG(778, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_PRIVATE_SET); } yy779: - YYDEBUG(779, *YYCURSOR); + YYDEBUG(779, yych); yych = *++YYCURSOR; if (yych == 'T') goto yy801; if (yych == 't') goto yy801; goto yy72; yy780: - YYDEBUG(780, *YYCURSOR); + YYDEBUG(780, yych); yyaccept = 90; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy781: - YYDEBUG(781, *YYCURSOR); + YYDEBUG(781, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_REQUIRE_ONCE); } yy782: - YYDEBUG(782, *YYCURSOR); + YYDEBUG(782, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -9987,7 +9684,7 @@ } } yy783: - YYDEBUG(783, *YYCURSOR); + YYDEBUG(783, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10000,7 +9697,7 @@ goto yy601; } yy784: - YYDEBUG(784, *YYCURSOR); + YYDEBUG(784, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10014,7 +9711,7 @@ goto yy601; } yy785: - YYDEBUG(785, *YYCURSOR); + YYDEBUG(785, yych); yyaccept = 91; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -10028,7 +9725,7 @@ goto yy599; } yy786: - YYDEBUG(786, *YYCURSOR); + YYDEBUG(786, yych); yyaccept = 91; YYMARKER = ++YYCURSOR; YYFILL(5); @@ -10055,54 +9752,50 @@ } } yy787: - YYDEBUG(787, *YYCURSOR); + YYDEBUG(787, yych); yyaccept = 92; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy788: - YYDEBUG(788, *YYCURSOR); + YYDEBUG(788, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_FUNC_C); } yy789: - YYDEBUG(789, *YYCURSOR); + YYDEBUG(789, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'L') goto yy806; if (yych == 'l') goto yy806; goto yy40; yy790: - YYDEBUG(790, *YYCURSOR); + YYDEBUG(790, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == '_') goto yy807; goto yy40; yy791: - YYDEBUG(791, *YYCURSOR); + YYDEBUG(791, yych); yyaccept = 93; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy792: - YYDEBUG(792, *YYCURSOR); + YYDEBUG(792, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_PROPERTY_C); } yy793: - YYDEBUG(793, *YYCURSOR); + YYDEBUG(793, yych); yych = *++YYCURSOR; if (yych == 'T') goto yy739; if (yych == 't') goto yy739; goto yy72; yy794: - YYDEBUG(794, *YYCURSOR); + YYDEBUG(794, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10125,7 +9818,7 @@ } } yy795: - YYDEBUG(795, *YYCURSOR); + YYDEBUG(795, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10149,7 +9842,7 @@ } } yy796: - YYDEBUG(796, *YYCURSOR); + YYDEBUG(796, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10173,7 +9866,7 @@ } } yy797: - YYDEBUG(797, *YYCURSOR); + YYDEBUG(797, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10187,7 +9880,7 @@ goto yy509; } yy798: - YYDEBUG(798, *YYCURSOR); + YYDEBUG(798, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10201,7 +9894,7 @@ goto yy509; } yy799: - YYDEBUG(799, *YYCURSOR); + YYDEBUG(799, yych); yyaccept = 94; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -10215,7 +9908,7 @@ goto yy507; } yy800: - YYDEBUG(800, *YYCURSOR); + YYDEBUG(800, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10238,12 +9931,12 @@ } } yy801: - YYDEBUG(801, *YYCURSOR); + YYDEBUG(801, yych); yych = *++YYCURSOR; if (yych == ')') goto yy814; goto yy72; yy802: - YYDEBUG(802, *YYCURSOR); + YYDEBUG(802, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10257,7 +9950,7 @@ goto yy693; } yy803: - YYDEBUG(803, *YYCURSOR); + YYDEBUG(803, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10271,7 +9964,7 @@ goto yy693; } yy804: - YYDEBUG(804, *YYCURSOR); + YYDEBUG(804, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10295,7 +9988,7 @@ } } yy805: - YYDEBUG(805, *YYCURSOR); + YYDEBUG(805, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10309,28 +10002,26 @@ goto yy601; } yy806: - YYDEBUG(806, *YYCURSOR); + YYDEBUG(806, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'E') goto yy818; if (yych == 'e') goto yy818; goto yy40; yy807: - YYDEBUG(807, *YYCURSOR); + YYDEBUG(807, yych); yyaccept = 95; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy808: - YYDEBUG(808, *YYCURSOR); + YYDEBUG(808, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_NS_C); } yy809: - YYDEBUG(809, *YYCURSOR); + YYDEBUG(809, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10354,7 +10045,7 @@ } } yy810: - YYDEBUG(810, *YYCURSOR); + YYDEBUG(810, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10378,7 +10069,7 @@ } } yy811: - YYDEBUG(811, *YYCURSOR); + YYDEBUG(811, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10392,7 +10083,7 @@ goto yy509; } yy812: - YYDEBUG(812, *YYCURSOR); + YYDEBUG(812, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10406,7 +10097,7 @@ goto yy509; } yy813: - YYDEBUG(813, *YYCURSOR); + YYDEBUG(813, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10429,14 +10120,14 @@ } } yy814: - YYDEBUG(814, *YYCURSOR); + YYDEBUG(814, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_PROTECTED_SET); } yy815: - YYDEBUG(815, *YYCURSOR); + YYDEBUG(815, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10459,7 +10150,7 @@ } } yy816: - YYDEBUG(816, *YYCURSOR); + YYDEBUG(816, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10483,7 +10174,7 @@ } } yy817: - YYDEBUG(817, *YYCURSOR); + YYDEBUG(817, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10510,14 +10201,14 @@ } } yy818: - YYDEBUG(818, *YYCURSOR); + YYDEBUG(818, yych); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); if (yych == 'R') goto yy826; if (yych == 'r') goto yy826; goto yy40; yy819: - YYDEBUG(819, *YYCURSOR); + YYDEBUG(819, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10541,7 +10232,7 @@ } } yy820: - YYDEBUG(820, *YYCURSOR); + YYDEBUG(820, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10565,7 +10256,7 @@ } } yy821: - YYDEBUG(821, *YYCURSOR); + YYDEBUG(821, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10579,7 +10270,7 @@ goto yy509; } yy822: - YYDEBUG(822, *YYCURSOR); + YYDEBUG(822, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10593,7 +10284,7 @@ goto yy509; } yy823: - YYDEBUG(823, *YYCURSOR); + YYDEBUG(823, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10617,7 +10308,7 @@ } } yy824: - YYDEBUG(824, *YYCURSOR); + YYDEBUG(824, yych); yyaccept = 91; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -10626,7 +10317,7 @@ if (yych == '*') goto yy652; goto yy601; yy825: - YYDEBUG(825, *YYCURSOR); + YYDEBUG(825, yych); yyaccept = 91; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -10640,21 +10331,19 @@ goto yy601; } yy826: - YYDEBUG(826, *YYCURSOR); + YYDEBUG(826, yych); yyaccept = 96; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_ST_IN_SCRIPTING[256+yych] & 128) { - goto yy39; - } + if (yybm_ST_IN_SCRIPTING[256+yych] & 128) goto yy39; if (yych == '\\') goto yy131; yy827: - YYDEBUG(827, *YYCURSOR); + YYDEBUG(827, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_IDENT(T_HALT_COMPILER); } yy828: - YYDEBUG(828, *YYCURSOR); + YYDEBUG(828, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10678,7 +10367,7 @@ } } yy829: - YYDEBUG(829, *YYCURSOR); + YYDEBUG(829, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10702,7 +10391,7 @@ } } yy830: - YYDEBUG(830, *YYCURSOR); + YYDEBUG(830, yych); yyaccept = 94; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -10711,7 +10400,7 @@ if (yych == '*') goto yy576; goto yy509; yy831: - YYDEBUG(831, *YYCURSOR); + YYDEBUG(831, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10725,7 +10414,7 @@ goto yy509; } yy832: - YYDEBUG(832, *YYCURSOR); + YYDEBUG(832, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10757,7 +10446,7 @@ } } yy833: - YYDEBUG(833, *YYCURSOR); + YYDEBUG(833, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10781,7 +10470,7 @@ } } yy834: - YYDEBUG(834, *YYCURSOR); + YYDEBUG(834, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10805,7 +10494,7 @@ } } yy835: - YYDEBUG(835, *YYCURSOR); + YYDEBUG(835, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10819,7 +10508,7 @@ goto yy509; } yy836: - YYDEBUG(836, *YYCURSOR); + YYDEBUG(836, yych); yyaccept = 91; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -10834,7 +10523,7 @@ goto yy693; } yy837: - YYDEBUG(837, *YYCURSOR); + YYDEBUG(837, yych); yyaccept = 91; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -10871,7 +10560,7 @@ } } yy838: - YYDEBUG(838, *YYCURSOR); + YYDEBUG(838, yych); yyaccept = 91; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -10895,7 +10584,7 @@ } } yy839: - YYDEBUG(839, *YYCURSOR); + YYDEBUG(839, yych); yyaccept = 94; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -10910,7 +10599,7 @@ goto yy631; } yy840: - YYDEBUG(840, *YYCURSOR); + YYDEBUG(840, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -10955,12 +10644,10 @@ } /* *********************************** */ yyc_ST_LOOKING_FOR_PROPERTY: - YYDEBUG(841, *YYCURSOR); YYFILL(4); yych = *YYCURSOR; - if (yybm_ST_LOOKING_FOR_PROPERTY[0+yych] & 64) { - goto yy844; - } + YYDEBUG(841, yych); + if (yybm_ST_LOOKING_FOR_PROPERTY[0+yych] & 64) goto yy844; if (yych <= '?') { if (yych <= '-') { if (yych == '#') goto yy845; @@ -10981,10 +10668,10 @@ } } yy842: - YYDEBUG(842, *YYCURSOR); + YYDEBUG(842, yych); ++YYCURSOR; yy843: - YYDEBUG(843, *YYCURSOR); + YYDEBUG(843, yych); yyleng = YYCURSOR - SCNG(yy_text); { yyless(0); @@ -10992,19 +10679,17 @@ goto restart; } yy844: - YYDEBUG(844, *YYCURSOR); + YYDEBUG(844, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_LOOKING_FOR_PROPERTY[0+yych] & 64) { - goto yy844; - } + if (yybm_ST_LOOKING_FOR_PROPERTY[0+yych] & 64) goto yy844; yyleng = YYCURSOR - SCNG(yy_text); { goto return_whitespace; } yy845: - YYDEBUG(845, *YYCURSOR); + YYDEBUG(845, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11031,49 +10716,47 @@ RETURN_OR_SKIP_TOKEN(T_COMMENT); } yy846: - YYDEBUG(846, *YYCURSOR); + YYDEBUG(846, yych); yych = *++YYCURSOR; if (yych == '>') goto yy850; goto yy843; yy847: - YYDEBUG(847, *YYCURSOR); + YYDEBUG(847, yych); yych = *++YYCURSOR; if (yych == '*') goto yy851; if (yych == '/') goto yy845; goto yy843; yy848: - YYDEBUG(848, *YYCURSOR); + YYDEBUG(848, yych); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych == '-') goto yy853; goto yy843; yy849: - YYDEBUG(849, *YYCURSOR); + YYDEBUG(849, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_LOOKING_FOR_PROPERTY[0+yych] & 128) { - goto yy849; - } + if (yybm_ST_LOOKING_FOR_PROPERTY[0+yych] & 128) goto yy849; yyleng = YYCURSOR - SCNG(yy_text); { yy_pop_state(); RETURN_TOKEN_WITH_STR(T_STRING, 0); } yy850: - YYDEBUG(850, *YYCURSOR); + YYDEBUG(850, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_OBJECT_OPERATOR); } yy851: - YYDEBUG(851, *YYCURSOR); + YYDEBUG(851, yych); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych == '*') goto yy855; yy852: - YYDEBUG(852, *YYCURSOR); + YYDEBUG(852, yych); yyleng = YYCURSOR - SCNG(yy_text); { int doc_com; @@ -11111,19 +10794,16 @@ RETURN_OR_SKIP_TOKEN(T_COMMENT); } yy853: - YYDEBUG(853, *YYCURSOR); + YYDEBUG(853, yych); yych = *++YYCURSOR; if (yych == '>') goto yy856; yy854: - YYDEBUG(854, *YYCURSOR); + YYDEBUG(854, yych); YYCURSOR = YYMARKER; - if (yyaccept == 0) { - goto yy843; - } else { - goto yy852; - } + if (yyaccept == 0) goto yy843; + else goto yy852; yy855: - YYDEBUG(855, *YYCURSOR); + YYDEBUG(855, yych); yych = *++YYCURSOR; if (yych <= '\f') { if (yych <= 0x08) goto yy854; @@ -11135,14 +10815,14 @@ goto yy854; } yy856: - YYDEBUG(856, *YYCURSOR); + YYDEBUG(856, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN(T_NULLSAFE_OBJECT_OPERATOR); } yy857: - YYDEBUG(857, *YYCURSOR); + YYDEBUG(857, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -11157,9 +10837,9 @@ } /* *********************************** */ yyc_ST_BACKQUOTE: - YYDEBUG(858, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; + YYDEBUG(858, yych); if (yych <= '_') { if (yych == '$') goto yy860; } else { @@ -11168,7 +10848,7 @@ } ++YYCURSOR; yy859: - YYDEBUG(859, *YYCURSOR); + YYDEBUG(859, yych); yyleng = YYCURSOR - SCNG(yy_text); { if (YYCURSOR > YYLIMIT) { @@ -11215,7 +10895,7 @@ } } yy860: - YYDEBUG(860, *YYCURSOR); + YYDEBUG(860, yych); yych = *++YYCURSOR; if (yych <= '_') { if (yych <= '@') goto yy859; @@ -11233,7 +10913,7 @@ } } yy861: - YYDEBUG(861, *YYCURSOR); + YYDEBUG(861, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11241,18 +10921,16 @@ RETURN_TOKEN('`'); } yy862: - YYDEBUG(862, *YYCURSOR); + YYDEBUG(862, yych); yych = *++YYCURSOR; if (yych == '$') goto yy866; goto yy859; yy863: - YYDEBUG(863, *YYCURSOR); + YYDEBUG(863, yych); YYMARKER = ++YYCURSOR; YYFILL(4); yych = *YYCURSOR; - if (yybm_ST_BACKQUOTE[0+yych] & 128) { - goto yy863; - } + if (yybm_ST_BACKQUOTE[0+yych] & 128) goto yy863; if (yych <= '>') { if (yych == '-') goto yy867; } else { @@ -11261,13 +10939,13 @@ if (yych <= '[') goto yy870; } yy864: - YYDEBUG(864, *YYCURSOR); + YYDEBUG(864, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } yy865: - YYDEBUG(865, *YYCURSOR); + YYDEBUG(865, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11276,7 +10954,7 @@ RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); } yy866: - YYDEBUG(866, *YYCURSOR); + YYDEBUG(866, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11286,20 +10964,20 @@ RETURN_TOKEN(T_CURLY_OPEN); } yy867: - YYDEBUG(867, *YYCURSOR); + YYDEBUG(867, yych); yych = *++YYCURSOR; if (yych == '>') goto yy871; yy868: - YYDEBUG(868, *YYCURSOR); + YYDEBUG(868, yych); YYCURSOR = YYMARKER; goto yy864; yy869: - YYDEBUG(869, *YYCURSOR); + YYDEBUG(869, yych); yych = *++YYCURSOR; if (yych == '-') goto yy872; goto yy868; yy870: - YYDEBUG(870, *YYCURSOR); + YYDEBUG(870, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11308,7 +10986,7 @@ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } yy871: - YYDEBUG(871, *YYCURSOR); + YYDEBUG(871, yych); yych = *++YYCURSOR; if (yych <= '_') { if (yych <= '@') goto yy868; @@ -11322,12 +11000,12 @@ goto yy873; } yy872: - YYDEBUG(872, *YYCURSOR); + YYDEBUG(872, yych); yych = *++YYCURSOR; if (yych == '>') goto yy874; goto yy868; yy873: - YYDEBUG(873, *YYCURSOR); + YYDEBUG(873, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11336,7 +11014,7 @@ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } yy874: - YYDEBUG(874, *YYCURSOR); + YYDEBUG(874, yych); yych = *++YYCURSOR; if (yych <= '_') { if (yych <= '@') goto yy868; @@ -11348,7 +11026,7 @@ if (yych <= 0x7F) goto yy868; } yy875: - YYDEBUG(875, *YYCURSOR); + YYDEBUG(875, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11358,9 +11036,9 @@ } /* *********************************** */ yyc_ST_DOUBLE_QUOTES: - YYDEBUG(876, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; + YYDEBUG(876, yych); if (yych <= '#') { if (yych == '"') goto yy878; } else { @@ -11369,7 +11047,7 @@ } ++YYCURSOR; yy877: - YYDEBUG(877, *YYCURSOR); + YYDEBUG(877, yych); yyleng = YYCURSOR - SCNG(yy_text); { if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) { @@ -11424,7 +11102,7 @@ } } yy878: - YYDEBUG(878, *YYCURSOR); + YYDEBUG(878, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11432,7 +11110,7 @@ RETURN_TOKEN('"'); } yy879: - YYDEBUG(879, *YYCURSOR); + YYDEBUG(879, yych); yych = *++YYCURSOR; if (yych <= '_') { if (yych <= '@') goto yy877; @@ -11450,18 +11128,16 @@ } } yy880: - YYDEBUG(880, *YYCURSOR); + YYDEBUG(880, yych); yych = *++YYCURSOR; if (yych == '$') goto yy884; goto yy877; yy881: - YYDEBUG(881, *YYCURSOR); + YYDEBUG(881, yych); YYMARKER = ++YYCURSOR; YYFILL(4); yych = *YYCURSOR; - if (yybm_ST_DOUBLE_QUOTES[0+yych] & 128) { - goto yy881; - } + if (yybm_ST_DOUBLE_QUOTES[0+yych] & 128) goto yy881; if (yych <= '>') { if (yych == '-') goto yy885; } else { @@ -11470,13 +11146,13 @@ if (yych <= '[') goto yy888; } yy882: - YYDEBUG(882, *YYCURSOR); + YYDEBUG(882, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } yy883: - YYDEBUG(883, *YYCURSOR); + YYDEBUG(883, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11485,7 +11161,7 @@ RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); } yy884: - YYDEBUG(884, *YYCURSOR); + YYDEBUG(884, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11495,20 +11171,20 @@ RETURN_TOKEN(T_CURLY_OPEN); } yy885: - YYDEBUG(885, *YYCURSOR); + YYDEBUG(885, yych); yych = *++YYCURSOR; if (yych == '>') goto yy889; yy886: - YYDEBUG(886, *YYCURSOR); + YYDEBUG(886, yych); YYCURSOR = YYMARKER; goto yy882; yy887: - YYDEBUG(887, *YYCURSOR); + YYDEBUG(887, yych); yych = *++YYCURSOR; if (yych == '-') goto yy890; goto yy886; yy888: - YYDEBUG(888, *YYCURSOR); + YYDEBUG(888, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11517,7 +11193,7 @@ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } yy889: - YYDEBUG(889, *YYCURSOR); + YYDEBUG(889, yych); yych = *++YYCURSOR; if (yych <= '_') { if (yych <= '@') goto yy886; @@ -11531,12 +11207,12 @@ goto yy891; } yy890: - YYDEBUG(890, *YYCURSOR); + YYDEBUG(890, yych); yych = *++YYCURSOR; if (yych == '>') goto yy892; goto yy886; yy891: - YYDEBUG(891, *YYCURSOR); + YYDEBUG(891, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11545,7 +11221,7 @@ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } yy892: - YYDEBUG(892, *YYCURSOR); + YYDEBUG(892, yych); yych = *++YYCURSOR; if (yych <= '_') { if (yych <= '@') goto yy886; @@ -11557,7 +11233,7 @@ if (yych <= 0x7F) goto yy886; } yy893: - YYDEBUG(893, *YYCURSOR); + YYDEBUG(893, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11567,14 +11243,14 @@ } /* *********************************** */ yyc_ST_HEREDOC: - YYDEBUG(894, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; + YYDEBUG(894, yych); if (yych == '$') goto yy896; if (yych == '{') goto yy897; ++YYCURSOR; yy895: - YYDEBUG(895, *YYCURSOR); + YYDEBUG(895, yych); yyleng = YYCURSOR - SCNG(yy_text); { zend_heredoc_label *heredoc_label = zend_ptr_stack_top(&SCNG(heredoc_label_stack)); @@ -11699,7 +11375,7 @@ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); } yy896: - YYDEBUG(896, *YYCURSOR); + YYDEBUG(896, yych); yych = *++YYCURSOR; if (yych <= '_') { if (yych <= '@') goto yy895; @@ -11717,18 +11393,16 @@ } } yy897: - YYDEBUG(897, *YYCURSOR); + YYDEBUG(897, yych); yych = *++YYCURSOR; if (yych == '$') goto yy901; goto yy895; yy898: - YYDEBUG(898, *YYCURSOR); + YYDEBUG(898, yych); YYMARKER = ++YYCURSOR; YYFILL(4); yych = *YYCURSOR; - if (yybm_ST_HEREDOC[0+yych] & 128) { - goto yy898; - } + if (yybm_ST_HEREDOC[0+yych] & 128) goto yy898; if (yych <= '>') { if (yych == '-') goto yy902; } else { @@ -11737,13 +11411,13 @@ if (yych <= '[') goto yy905; } yy899: - YYDEBUG(899, *YYCURSOR); + YYDEBUG(899, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } yy900: - YYDEBUG(900, *YYCURSOR); + YYDEBUG(900, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11752,7 +11426,7 @@ RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); } yy901: - YYDEBUG(901, *YYCURSOR); + YYDEBUG(901, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11762,20 +11436,20 @@ RETURN_TOKEN(T_CURLY_OPEN); } yy902: - YYDEBUG(902, *YYCURSOR); + YYDEBUG(902, yych); yych = *++YYCURSOR; if (yych == '>') goto yy906; yy903: - YYDEBUG(903, *YYCURSOR); + YYDEBUG(903, yych); YYCURSOR = YYMARKER; goto yy899; yy904: - YYDEBUG(904, *YYCURSOR); + YYDEBUG(904, yych); yych = *++YYCURSOR; if (yych == '-') goto yy907; goto yy903; yy905: - YYDEBUG(905, *YYCURSOR); + YYDEBUG(905, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11784,7 +11458,7 @@ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } yy906: - YYDEBUG(906, *YYCURSOR); + YYDEBUG(906, yych); yych = *++YYCURSOR; if (yych <= '_') { if (yych <= '@') goto yy903; @@ -11798,12 +11472,12 @@ goto yy908; } yy907: - YYDEBUG(907, *YYCURSOR); + YYDEBUG(907, yych); yych = *++YYCURSOR; if (yych == '>') goto yy909; goto yy903; yy908: - YYDEBUG(908, *YYCURSOR); + YYDEBUG(908, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11812,7 +11486,7 @@ RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } yy909: - YYDEBUG(909, *YYCURSOR); + YYDEBUG(909, yych); yych = *++YYCURSOR; if (yych <= '_') { if (yych <= '@') goto yy903; @@ -11824,7 +11498,7 @@ if (yych <= 0x7F) goto yy903; } yy910: - YYDEBUG(910, *YYCURSOR); + YYDEBUG(910, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11834,9 +11508,9 @@ } /* *********************************** */ yyc_ST_LOOKING_FOR_VARNAME: - YYDEBUG(911, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; + YYDEBUG(911, yych); if (yych <= '_') { if (yych <= '@') goto yy912; if (yych <= 'Z') goto yy914; @@ -11847,10 +11521,10 @@ if (yych >= 0x80) goto yy914; } yy912: - YYDEBUG(912, *YYCURSOR); + YYDEBUG(912, yych); ++YYCURSOR; yy913: - YYDEBUG(913, *YYCURSOR); + YYDEBUG(913, yych); yyleng = YYCURSOR - SCNG(yy_text); { yyless(0); @@ -11859,7 +11533,7 @@ goto restart; } yy914: - YYDEBUG(914, *YYCURSOR); + YYDEBUG(914, yych); yych = *(YYMARKER = ++YYCURSOR); if (yych <= '_') { if (yych <= '@') { @@ -11883,24 +11557,22 @@ } } yy915: - YYDEBUG(915, *YYCURSOR); + YYDEBUG(915, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; yy916: - YYDEBUG(916, *YYCURSOR); - if (yybm_ST_LOOKING_FOR_VARNAME[0+yych] & 128) { - goto yy915; - } + YYDEBUG(916, yych); + if (yybm_ST_LOOKING_FOR_VARNAME[0+yych] & 128) goto yy915; if (yych <= '@') goto yy917; if (yych <= '[') goto yy918; if (yych == '}') goto yy918; yy917: - YYDEBUG(917, *YYCURSOR); + YYDEBUG(917, yych); YYCURSOR = YYMARKER; goto yy913; yy918: - YYDEBUG(918, *YYCURSOR); + YYDEBUG(918, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11911,9 +11583,9 @@ } /* *********************************** */ yyc_ST_VAR_OFFSET: - YYDEBUG(919, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; + YYDEBUG(919, yych); if (yych <= '0') { if (yych <= ' ') { if (yych <= '\f') { @@ -11957,7 +11629,7 @@ } } yy920: - YYDEBUG(920, *YYCURSOR); + YYDEBUG(920, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11968,7 +11640,7 @@ RETURN_TOKEN(T_BAD_CHARACTER); } yy921: - YYDEBUG(921, *YYCURSOR); + YYDEBUG(921, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -11979,17 +11651,17 @@ RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); } yy922: - YYDEBUG(922, *YYCURSOR); + YYDEBUG(922, yych); ++YYCURSOR; yy923: - YYDEBUG(923, *YYCURSOR); + YYDEBUG(923, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Only '[' or '-' can be valid, but returning other tokens will allow a more explicit parse error */ RETURN_TOKEN(yytext[0]); } yy924: - YYDEBUG(924, *YYCURSOR); + YYDEBUG(924, yych); yych = *++YYCURSOR; if (yych <= '_') { if (yych <= '@') goto yy923; @@ -12003,7 +11675,7 @@ goto yy930; } yy925: - YYDEBUG(925, *YYCURSOR); + YYDEBUG(925, yych); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'X') { @@ -12028,7 +11700,7 @@ } } yy926: - YYDEBUG(926, *YYCURSOR); + YYDEBUG(926, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Offset could be treated as a long */ if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) { @@ -12046,30 +11718,26 @@ RETURN_TOKEN_WITH_VAL(T_NUM_STRING); } yy927: - YYDEBUG(927, *YYCURSOR); + YYDEBUG(927, yych); yyaccept = 0; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VAR_OFFSET[0+yych] & 8) { - goto yy927; - } + if (yybm_ST_VAR_OFFSET[0+yych] & 8) goto yy927; if (yych == '_') goto yy938; goto yy926; yy928: - YYDEBUG(928, *YYCURSOR); + YYDEBUG(928, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VAR_OFFSET[0+yych] & 16) { - goto yy928; - } + if (yybm_ST_VAR_OFFSET[0+yych] & 16) goto yy928; yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_STR(T_STRING, 0); } yy929: - YYDEBUG(929, *YYCURSOR); + YYDEBUG(929, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -12077,7 +11745,7 @@ RETURN_TOKEN(']'); } yy930: - YYDEBUG(930, *YYCURSOR); + YYDEBUG(930, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -12097,13 +11765,13 @@ } } yy931: - YYDEBUG(931, *YYCURSOR); + YYDEBUG(931, yych); yyleng = YYCURSOR - SCNG(yy_text); { RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } yy932: - YYDEBUG(932, *YYCURSOR); + YYDEBUG(932, yych); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(1); @@ -12112,7 +11780,7 @@ if (yych <= '9') goto yy932; if (yych == '_') goto yy938; yy933: - YYDEBUG(933, *YYCURSOR); + YYDEBUG(933, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Offset must be treated as a string */ if (yyleng == 1) { @@ -12123,41 +11791,32 @@ RETURN_TOKEN_WITH_VAL(T_NUM_STRING); } yy934: - YYDEBUG(934, *YYCURSOR); + YYDEBUG(934, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VAR_OFFSET[0+yych] & 32) { - goto yy939; - } + if (yybm_ST_VAR_OFFSET[0+yych] & 32) goto yy939; yy935: - YYDEBUG(935, *YYCURSOR); + YYDEBUG(935, yych); YYCURSOR = YYMARKER; - if (yyaccept == 0) { - goto yy926; - } else { - goto yy933; - } + if (yyaccept == 0) goto yy926; + else goto yy933; yy936: - YYDEBUG(936, *YYCURSOR); + YYDEBUG(936, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VAR_OFFSET[0+yych] & 64) { - goto yy940; - } + if (yybm_ST_VAR_OFFSET[0+yych] & 64) goto yy940; goto yy935; yy937: - YYDEBUG(937, *YYCURSOR); + YYDEBUG(937, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VAR_OFFSET[0+yych] & 128) { - goto yy941; - } + if (yybm_ST_VAR_OFFSET[0+yych] & 128) goto yy941; goto yy935; yy938: - YYDEBUG(938, *YYCURSOR); + YYDEBUG(938, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; @@ -12165,47 +11824,41 @@ if (yych <= '9') goto yy932; goto yy935; yy939: - YYDEBUG(939, *YYCURSOR); + YYDEBUG(939, yych); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VAR_OFFSET[0+yych] & 32) { - goto yy939; - } + if (yybm_ST_VAR_OFFSET[0+yych] & 32) goto yy939; if (yych == '_') goto yy934; goto yy933; yy940: - YYDEBUG(940, *YYCURSOR); + YYDEBUG(940, yych); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VAR_OFFSET[0+yych] & 64) { - goto yy940; - } + if (yybm_ST_VAR_OFFSET[0+yych] & 64) goto yy940; if (yych == '_') goto yy936; goto yy933; yy941: - YYDEBUG(941, *YYCURSOR); + YYDEBUG(941, yych); yyaccept = 1; YYMARKER = ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_ST_VAR_OFFSET[0+yych] & 128) { - goto yy941; - } + if (yybm_ST_VAR_OFFSET[0+yych] & 128) goto yy941; if (yych == '_') goto yy937; goto yy933; /* *********************************** */ yyc_SHEBANG: - YYDEBUG(942, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; + YYDEBUG(942, yych); if (yych == '#') goto yy944; ++YYCURSOR; yy943: - YYDEBUG(943, *YYCURSOR); + YYDEBUG(943, yych); yyleng = YYCURSOR - SCNG(yy_text); { yyless(0); @@ -12213,17 +11866,15 @@ goto restart; } yy944: - YYDEBUG(944, *YYCURSOR); + YYDEBUG(944, yych); yych = *++YYCURSOR; if (yych != '!') goto yy943; yy945: - YYDEBUG(945, *YYCURSOR); + YYDEBUG(945, yych); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - if (yybm_SHEBANG[0+yych] & 128) { - goto yy945; - } + if (yybm_SHEBANG[0+yych] & 128) goto yy945; ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -12233,13 +11884,13 @@ } /* *********************************** */ yyc_INITIAL: - YYDEBUG(946, *YYCURSOR); YYFILL(7); yych = *YYCURSOR; + YYDEBUG(946, yych); if (yych == '<') goto yy948; ++YYCURSOR; yy947: - YYDEBUG(947, *YYCURSOR); + YYDEBUG(947, yych); yyleng = YYCURSOR - SCNG(yy_text); { if (YYCURSOR > YYLIMIT) { @@ -12293,7 +11944,7 @@ RETURN_TOKEN_WITH_VAL(T_INLINE_HTML); } yy948: - YYDEBUG(948, *YYCURSOR); + YYDEBUG(948, yych); yych = *++YYCURSOR; if (yych != '?') goto yy947; yych = *(YYMARKER = ++YYCURSOR); @@ -12304,7 +11955,7 @@ if (yych == 'p') goto yy951; } yy949: - YYDEBUG(949, *YYCURSOR); + YYDEBUG(949, yych); yyleng = YYCURSOR - SCNG(yy_text); { if (CG(short_tags)) { @@ -12315,7 +11966,7 @@ } } yy950: - YYDEBUG(950, *YYCURSOR); + YYDEBUG(950, yych); ++YYCURSOR; yyleng = YYCURSOR - SCNG(yy_text); { @@ -12327,21 +11978,21 @@ RETURN_TOKEN(T_OPEN_TAG_WITH_ECHO); } yy951: - YYDEBUG(951, *YYCURSOR); + YYDEBUG(951, yych); yych = *++YYCURSOR; if (yych == 'H') goto yy953; if (yych == 'h') goto yy953; yy952: - YYDEBUG(952, *YYCURSOR); + YYDEBUG(952, yych); YYCURSOR = YYMARKER; goto yy949; yy953: - YYDEBUG(953, *YYCURSOR); + YYDEBUG(953, yych); yych = *++YYCURSOR; if (yych == 'P') goto yy954; if (yych != 'p') goto yy952; yy954: - YYDEBUG(954, *YYCURSOR); + YYDEBUG(954, yych); yych = *++YYCURSOR; if (yych <= '\f') { if (yych <= 0x08) goto yy955; @@ -12351,7 +12002,7 @@ if (yych == ' ') goto yy956; } yy955: - YYDEBUG(955, *YYCURSOR); + YYDEBUG(955, yych); yyleng = YYCURSOR - SCNG(yy_text); { /* Allow ce->default_properties_count; i++) { ZEND_ASSERT(!(Z_PROP_FLAG_P(&obj->properties_table[i]) & IS_PROP_LAZY)); @@ -687,6 +685,7 @@ #endif OBJ_EXTRA_FLAGS(obj) &= ~(IS_OBJ_LAZY_UNINITIALIZED | IS_OBJ_LAZY_PROXY); + zend_lazy_object_del_info(obj); } ZEND_API HashTable *zend_lazy_object_get_properties(zend_object *object) @@ -744,12 +743,11 @@ } } - OBJ_EXTRA_FLAGS(new_proxy) = OBJ_EXTRA_FLAGS(old_obj); - zend_lazy_object_info *new_info = emalloc(sizeof(*info)); *new_info = *info; new_info->u.instance = zend_objects_clone_obj(info->u.instance); + OBJ_EXTRA_FLAGS(new_proxy) = OBJ_EXTRA_FLAGS(old_obj); zend_lazy_object_set_info(new_proxy, new_info); return new_proxy; diff -Nru php8.4-8.4.16/Zend/zend_multiply.h php8.4-8.4.21/Zend/zend_multiply.h --- php8.4-8.4.16/Zend/zend_multiply.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_multiply.h 2026-05-05 16:34:12.000000000 +0000 @@ -267,7 +267,8 @@ : "=&r"(res), "=&r"(m_overflow) : "r"(nmemb), "r"(size), - "r"(offset)); + "r"(offset) + : "cc"); if (UNEXPECTED(m_overflow)) { *overflow = 1; @@ -291,7 +292,8 @@ : "=&r"(res), "=&r"(m_overflow) : "r"(nmemb), "r"(size), - "r"(offset)); + "r"(offset) + : "xer"); if (UNEXPECTED(m_overflow)) { *overflow = 1; diff -Nru php8.4-8.4.16/Zend/zend_object_handlers.c php8.4-8.4.21/Zend/zend_object_handlers.c --- php8.4-8.4.16/Zend/zend_object_handlers.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_object_handlers.c 2026-05-05 16:34:12.000000000 +0000 @@ -886,6 +886,28 @@ retval = &EG(uninitialized_zval); + /* For initialized lazy proxies: if the real instance's magic method + * guard is already set for this property, we are inside a recursive + * call from the real instance's __get/__isset. Forward directly to + * the real instance to avoid double invocation. (GH-21478) */ + if (UNEXPECTED(zend_object_is_lazy_proxy(zobj) + && zend_lazy_object_initialized(zobj))) { + zend_object *instance = zend_lazy_object_get_instance(zobj); + if (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS) { + uint32_t *instance_guard = zend_get_property_guard(instance, name); + uint32_t guard_type = ((type == BP_VAR_IS) && zobj->ce->__isset) + ? IN_ISSET : IN_GET; + if ((*instance_guard) & guard_type) { + retval = zend_std_read_property(instance, name, type, cache_slot, rv); + if (retval == &EG(uninitialized_zval)) { + ZVAL_NULL(rv); + retval = rv; + } + return retval; + } + } + } + /* magic isset */ if ((type == BP_VAR_IS) && zobj->ce->__isset) { zval tmp_result; @@ -956,25 +978,27 @@ uninit_error: if (UNEXPECTED(zend_lazy_object_must_init(zobj))) { if (!prop_info || (Z_PROP_FLAG_P(retval) & IS_PROP_LAZY)) { - zobj = zend_lazy_object_init(zobj); - if (!zobj) { + zend_object *instance = zend_lazy_object_init(zobj); + if (!instance) { retval = &EG(uninitialized_zval); goto exit; } - if (UNEXPECTED(guard)) { + if (UNEXPECTED(guard && (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS))) { + /* Find which guard was used on zobj, so we can set the same + * guard on instance. */ uint32_t guard_type = (type == BP_VAR_IS) && zobj->ce->__isset ? IN_ISSET : IN_GET; - guard = zend_get_property_guard(zobj, name); + guard = zend_get_property_guard(instance, name); if (!((*guard) & guard_type)) { (*guard) |= guard_type; - retval = zend_std_read_property(zobj, name, type, cache_slot, rv); + retval = zend_std_read_property(instance, name, type, cache_slot, rv); (*guard) &= ~guard_type; return retval; } } - return zend_std_read_property(zobj, name, type, cache_slot, rv); + return zend_std_read_property(instance, name, type, cache_slot, rv); } } if (type != BP_VAR_IS) { @@ -1013,7 +1037,7 @@ return &EG(error_zval); } - if (UNEXPECTED(guarded)) { + if (UNEXPECTED(guarded && (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS))) { uint32_t *guard = zend_get_property_guard(instance, name); if (!((*guard) & IN_SET)) { (*guard) |= IN_SET; @@ -1201,6 +1225,20 @@ goto exit; } + /* For initialized lazy proxies: if the real instance's __set guard + * is already set, we are inside a recursive call from the real + * instance's __set. Forward directly to avoid double invocation. */ + if (UNEXPECTED(zend_object_is_lazy_proxy(zobj) + && zend_lazy_object_initialized(zobj))) { + zend_object *instance = zend_lazy_object_get_instance(zobj); + if (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS) { + uint32_t *instance_guard = zend_get_property_guard(instance, name); + if ((*instance_guard) & IN_SET) { + return zend_std_write_property(instance, name, value, cache_slot); + } + } + } + /* magic set */ if (zobj->ce->__set) { if (!guard) { @@ -1392,18 +1430,31 @@ property_offset = zend_get_property_offset(zobj->ce, name, (zobj->ce->__get != NULL), cache_slot, &prop_info); if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) { +try_again: retval = OBJ_PROP(zobj, property_offset); if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) { if (EXPECTED(!zobj->ce->__get) || UNEXPECTED((*zend_get_property_guard(zobj, name)) & IN_GET) || UNEXPECTED(prop_info && (Z_PROP_FLAG_P(retval) & IS_PROP_UNINIT))) { if (UNEXPECTED(zend_lazy_object_must_init(zobj) && (Z_PROP_FLAG_P(retval) & IS_PROP_LAZY))) { - zobj = zend_lazy_object_init(zobj); - if (!zobj) { + bool guarded = zobj->ce->__get + && (*zend_get_property_guard(zobj, name) & IN_GET); + zend_object *instance = zend_lazy_object_init(zobj); + if (!instance) { return &EG(error_zval); } - return zend_std_get_property_ptr_ptr(zobj, name, type, cache_slot); + if (guarded && (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS)) { + uint32_t *guard = zend_get_property_guard(instance, name); + if (!(*guard & IN_GET)) { + (*guard) |= IN_GET; + retval = zend_std_get_property_ptr_ptr(instance, name, type, cache_slot); + (*guard) &= ~IN_GET; + return retval; + } + } + + return zend_std_get_property_ptr_ptr(instance, name, type, cache_slot); } if (UNEXPECTED(type == BP_VAR_RW || type == BP_VAR_R)) { if (prop_info) { @@ -1446,6 +1497,25 @@ } if (EXPECTED(!zobj->ce->__get) || UNEXPECTED((*zend_get_property_guard(zobj, name)) & IN_GET)) { + if (UNEXPECTED(zend_lazy_object_must_init(zobj))) { + bool guarded = (zobj->ce->__get != NULL); + zend_object *instance = zend_lazy_object_init(zobj); + if (!instance) { + return &EG(error_zval); + } + + if (guarded && (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS)) { + uint32_t *guard = zend_get_property_guard(instance, name); + if (!(*guard & IN_GET)) { + (*guard) |= IN_GET; + retval = zend_std_get_property_ptr_ptr(instance, name, type, cache_slot); + (*guard) &= ~IN_GET; + return retval; + } + } + + return zend_std_get_property_ptr_ptr(instance, name, type, cache_slot); + } if (UNEXPECTED(zobj->ce->ce_flags & ZEND_ACC_NO_DYNAMIC_PROPERTIES)) { zend_forbidden_dynamic_property(zobj->ce, name); return &EG(error_zval); @@ -1455,14 +1525,6 @@ return &EG(error_zval); } } - if (UNEXPECTED(zend_lazy_object_must_init(zobj))) { - zobj = zend_lazy_object_init(zobj); - if (!zobj) { - return &EG(error_zval); - } - - return zend_std_get_property_ptr_ptr(zobj, name, type, cache_slot); - } if (UNEXPECTED(!zobj->properties)) { rebuild_object_properties_internal(zobj); } @@ -1471,7 +1533,15 @@ } retval = zend_hash_add(zobj->properties, name, &EG(uninitialized_zval)); } - } else if (!IS_HOOKED_PROPERTY_OFFSET(property_offset) && zobj->ce->__get == NULL) { + } else if (IS_HOOKED_PROPERTY_OFFSET(property_offset)) { + if (!(prop_info->flags & ZEND_ACC_VIRTUAL) && !zend_should_call_hook(prop_info, zobj)) { + property_offset = prop_info->offset; + if (!ZEND_TYPE_IS_SET(prop_info->type)) { + prop_info = NULL; + } + goto try_again; + } + } else if (zobj->ce->__get == NULL) { retval = &EG(error_zval); } @@ -1561,6 +1631,21 @@ return; } + /* For initialized lazy proxies: if the real instance's __unset guard + * is already set, we are inside a recursive call from the real + * instance's __unset. Forward directly to avoid double invocation. */ + if (UNEXPECTED(zend_object_is_lazy_proxy(zobj) + && zend_lazy_object_initialized(zobj))) { + zend_object *instance = zend_lazy_object_get_instance(zobj); + if (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS) { + uint32_t *instance_guard = zend_get_property_guard(instance, name); + if ((*instance_guard) & IN_UNSET) { + zend_std_unset_property(instance, name, cache_slot); + return; + } + } + } + /* magic unset */ if (zobj->ce->__unset) { if (!guard) { @@ -1568,9 +1653,11 @@ } if (!((*guard) & IN_UNSET)) { /* have unsetter - try with it! */ + GC_ADDREF(zobj); (*guard) |= IN_UNSET; /* prevent circular unsetting */ zend_std_call_unsetter(zobj, name); (*guard) &= ~IN_UNSET; + OBJ_RELEASE(zobj); return; } else if (UNEXPECTED(IS_WRONG_PROPERTY_OFFSET(property_offset))) { /* Trigger the correct error */ @@ -1588,7 +1675,7 @@ return; } - if (UNEXPECTED(guard)) { + if (UNEXPECTED(guard && zobj->ce->ce_flags & ZEND_ACC_USE_GUARDS)) { guard = zend_get_property_guard(zobj, name); if (!((*guard) & IN_UNSET)) { (*guard) |= IN_UNSET; @@ -2378,6 +2465,20 @@ goto exit; } + /* For initialized lazy proxies: if the real instance's __isset guard + * is already set, we are inside a recursive call from the real + * instance's __isset. Forward directly to avoid double invocation. */ + if (UNEXPECTED(zend_object_is_lazy_proxy(zobj) + && zend_lazy_object_initialized(zobj))) { + zend_object *instance = zend_lazy_object_get_instance(zobj); + if (instance->ce->ce_flags & ZEND_ACC_USE_GUARDS) { + uint32_t *instance_guard = zend_get_property_guard(instance, name); + if ((*instance_guard) & IN_ISSET) { + return zend_std_has_property(instance, name, has_set_exists, cache_slot); + } + } + } + if (!zobj->ce->__isset) { goto lazy_init; } diff -Nru php8.4-8.4.16/Zend/zend_opcode.c php8.4-8.4.21/Zend/zend_opcode.c --- php8.4-8.4.16/Zend/zend_opcode.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_opcode.c 2026-05-05 16:34:12.000000000 +0000 @@ -981,6 +981,35 @@ /* OP_DATA is really part of the previous opcode. */ last_use[var_num] = opnum - (opline->opcode == ZEND_OP_DATA); } + } else if ((opline->opcode == ZEND_FREE || opline->opcode == ZEND_FE_FREE) && opline->extended_value & ZEND_FREE_ON_RETURN) { + int jump_offset = 1; + while (((opline + jump_offset)->opcode == ZEND_FREE || (opline + jump_offset)->opcode == ZEND_FE_FREE) + && (opline + jump_offset)->extended_value & ZEND_FREE_ON_RETURN) { + ++jump_offset; + } + // loop var frees directly precede the jump (or return) operand, except that ZEND_VERIFY_RETURN_TYPE may happen first. + if ((opline + jump_offset)->opcode == ZEND_VERIFY_RETURN_TYPE) { + ++jump_offset; + } + /* FREE with ZEND_FREE_ON_RETURN immediately followed by RETURN frees + * the loop variable on early return. We need to split the live range + * so GC doesn't access the freed variable after this FREE. */ + uint32_t opnum_last_use = last_use[var_num]; + zend_op *opline_last_use = op_array->opcodes + opnum_last_use; + ZEND_ASSERT(opline_last_use->opcode == opline->opcode); // any ZEND_FREE_ON_RETURN must be followed by a FREE without + if (opnum + jump_offset + 1 != opnum_last_use) { + emit_live_range_raw(op_array, var_num, opline->opcode == ZEND_FE_FREE ? ZEND_LIVE_LOOP : ZEND_LIVE_TMPVAR, + opnum + jump_offset + 1, opnum_last_use); + } + + /* Update last_use so next range includes this FREE */ + last_use[var_num] = opnum; + + /* Store opline offset to loop end */ + opline->op2.opline_num = opnum_last_use - opnum; + if (opline_last_use->extended_value & ZEND_FREE_ON_RETURN) { + opline->op2.opline_num += opline_last_use->op2.opline_num; + } } } if (opline->op2_type & (IS_TMP_VAR|IS_VAR)) { diff -Nru php8.4-8.4.16/Zend/zend_operators.c php8.4-8.4.21/Zend/zend_operators.c --- php8.4-8.4.16/Zend/zend_operators.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_operators.c 2026-05-05 16:34:12.000000000 +0000 @@ -3254,8 +3254,8 @@ len = MIN(len1, len2); while (len--) { - c1 = zend_tolower((int)*(unsigned char *)s1++); - c2 = zend_tolower((int)*(unsigned char *)s2++); + c1 = zend_tolower((unsigned char)*(s1++)); + c2 = zend_tolower((unsigned char)*(s2++)); if (c1 != c2) { return c1 - c2; } @@ -3275,8 +3275,8 @@ } len = MIN(length, MIN(len1, len2)); while (len--) { - c1 = zend_tolower((int)*(unsigned char *)s1++); - c2 = zend_tolower((int)*(unsigned char *)s2++); + c1 = zend_tolower((unsigned char)*(s1++)); + c2 = zend_tolower((unsigned char)*(s2++)); if (c1 != c2) { return c1 - c2; } diff -Nru php8.4-8.4.16/Zend/zend_property_hooks.c php8.4-8.4.21/Zend/zend_property_hooks.c --- php8.4-8.4.16/Zend/zend_property_hooks.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_property_hooks.c 2026-05-05 16:34:12.000000000 +0000 @@ -121,7 +121,7 @@ if (Z_TYPE_P(prop_value) == IS_INDIRECT) { continue; } - zval *tmp = _zend_hash_append(properties, prop_name, prop_value); + zval *tmp = zend_hash_add_new(properties, prop_name, prop_value); Z_TRY_ADDREF_P(tmp); } ZEND_HASH_FOREACH_END(); } diff -Nru php8.4-8.4.16/Zend/zend_virtual_cwd.c php8.4-8.4.21/Zend/zend_virtual_cwd.c --- php8.4-8.4.16/Zend/zend_virtual_cwd.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_virtual_cwd.c 2026-05-05 16:34:12.000000000 +0000 @@ -195,7 +195,7 @@ main_cwd_state.cwd_length = strlen(cwd); #ifdef ZEND_WIN32 if (main_cwd_state.cwd_length >= 2 && cwd[1] == ':') { - cwd[0] = toupper(cwd[0]); + cwd[0] = toupper((unsigned char)cwd[0]); } #endif main_cwd_state.cwd = strdup(cwd); @@ -271,7 +271,7 @@ *length = state->cwd_length+1; retval = (char *) emalloc(*length+1); memcpy(retval, state->cwd, *length); - retval[0] = toupper(retval[0]); + retval[0] = toupper((unsigned char)retval[0]); retval[*length-1] = DEFAULT_SLASH; retval[*length] = '\0'; return retval; @@ -1113,7 +1113,7 @@ if (resolved_path[start] == 0) { goto verify; } - resolved_path[start] = toupper(resolved_path[start]); + resolved_path[start] = toupper((unsigned char)resolved_path[start]); start++; } resolved_path[start++] = DEFAULT_SLASH; @@ -1121,13 +1121,13 @@ if (resolved_path[start] == 0) { goto verify; } - resolved_path[start] = toupper(resolved_path[start]); + resolved_path[start] = toupper((unsigned char)resolved_path[start]); start++; } resolved_path[start++] = DEFAULT_SLASH; } else if (IS_ABSOLUTE_PATH(resolved_path, path_length)) { /* skip DRIVE name */ - resolved_path[0] = toupper(resolved_path[0]); + resolved_path[0] = toupper((unsigned char)resolved_path[0]); resolved_path[2] = DEFAULT_SLASH; if (path_length == 2) { resolved_path[3] = '\0'; @@ -1417,7 +1417,7 @@ int ret; CWD_STATE_COPY(&new_state, &CWDG(cwd)); - if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH)) { + if (virtual_file_ex(&new_state, filename, NULL, link ? CWD_EXPAND : CWD_REALPATH)) { CWD_STATE_FREE_ERR(&new_state); return -1; } diff -Nru php8.4-8.4.16/Zend/zend_virtual_cwd.h php8.4-8.4.21/Zend/zend_virtual_cwd.h --- php8.4-8.4.16/Zend/zend_virtual_cwd.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_virtual_cwd.h 2026-05-05 16:34:12.000000000 +0000 @@ -87,7 +87,7 @@ #define IS_UNC_PATH(path, len) \ (len >= 2 && IS_SLASH(path[0]) && IS_SLASH(path[1])) #define IS_ABSOLUTE_PATH(path, len) \ - (len >= 2 && (/* is local */isalpha(path[0]) && path[1] == ':' || /* is UNC */IS_SLASH(path[0]) && IS_SLASH(path[1]))) + (len >= 2 && (/* is local */isalpha((unsigned char)(path)[0]) && path[1] == ':' || /* is UNC */IS_SLASH(path[0]) && IS_SLASH(path[1]))) #else #ifdef HAVE_DIRENT_H diff -Nru php8.4-8.4.16/Zend/zend_vm_def.h php8.4-8.4.21/Zend/zend_vm_def.h --- php8.4-8.4.16/Zend/zend_vm_def.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_vm_def.h 2026-05-05 16:34:12.000000000 +0000 @@ -1070,7 +1070,7 @@ } prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - if (prop_info) { + if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { /* special case for typed properties */ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC); } else { @@ -1326,7 +1326,8 @@ } } else { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); - zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -1394,7 +1395,8 @@ ZVAL_NULL(EX_VAR(opline->result.var)); } else { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -3193,7 +3195,7 @@ ZEND_VM_JMP(opline); } -ZEND_VM_HANDLER(70, ZEND_FREE, TMPVAR, ANY) +ZEND_VM_HANDLER(70, ZEND_FREE, TMPVAR, LOOP_END) { USE_OPLINE @@ -3202,7 +3204,7 @@ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -ZEND_VM_HOT_HANDLER(127, ZEND_FE_FREE, TMPVAR, ANY) +ZEND_VM_HOT_HANDLER(127, ZEND_FE_FREE, TMPVAR, LOOP_END) { zval *var; USE_OPLINE @@ -8140,24 +8142,11 @@ && throw_op->extended_value & ZEND_FREE_ON_RETURN) { /* exceptions thrown because of loop var destruction on return/break/... * are logically thrown at the end of the foreach loop, so adjust the - * throw_op_num. + * throw_op_num to the final loop variable FREE. */ - const zend_live_range *range = find_live_range( - &EX(func)->op_array, throw_op_num, throw_op->op1.var); - /* free op1 of the corresponding RETURN */ - for (i = throw_op_num; i < range->end; i++) { - if (EX(func)->op_array.opcodes[i].opcode == ZEND_FREE - || EX(func)->op_array.opcodes[i].opcode == ZEND_FE_FREE) { - /* pass */ - } else { - if (EX(func)->op_array.opcodes[i].opcode == ZEND_RETURN - && (EX(func)->op_array.opcodes[i].op1_type & (IS_VAR|IS_TMP_VAR))) { - zval_ptr_dtor(EX_VAR(EX(func)->op_array.opcodes[i].op1.var)); - } - break; - } - } - throw_op_num = range->end; + uint32_t new_throw_op_num = throw_op_num + throw_op->op2.opline_num; + cleanup_live_vars(execute_data, throw_op_num, new_throw_op_num); + throw_op_num = new_throw_op_num; } /* Find the innermost try/catch/finally the exception was thrown in */ @@ -8550,6 +8539,10 @@ zval *return_value = EX_VAR(EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2.var); zval_ptr_dtor(return_value); + /* Clear return value in case we hit both DISCARD_EXCEPTION and + * zend_dispatch_try_catch_finally_helper, which will free the return + * value again. See OSS-Fuzz #438780145. */ + ZVAL_NULL(return_value); } /* cleanup delayed exception */ @@ -9426,7 +9419,9 @@ zval retval; zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT)); + GC_ADDREF(zobj); zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval); + OBJ_RELEASE(zobj); count = zval_get_long(&retval); zval_ptr_dtor(&retval); break; diff -Nru php8.4-8.4.16/Zend/zend_vm_execute.h php8.4-8.4.21/Zend/zend_vm_execute.h --- php8.4-8.4.16/Zend/zend_vm_execute.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_vm_execute.h 2026-05-05 16:34:12.000000000 +0000 @@ -3265,24 +3265,11 @@ && throw_op->extended_value & ZEND_FREE_ON_RETURN) { /* exceptions thrown because of loop var destruction on return/break/... * are logically thrown at the end of the foreach loop, so adjust the - * throw_op_num. + * throw_op_num to the final loop variable FREE. */ - const zend_live_range *range = find_live_range( - &EX(func)->op_array, throw_op_num, throw_op->op1.var); - /* free op1 of the corresponding RETURN */ - for (i = throw_op_num; i < range->end; i++) { - if (EX(func)->op_array.opcodes[i].opcode == ZEND_FREE - || EX(func)->op_array.opcodes[i].opcode == ZEND_FE_FREE) { - /* pass */ - } else { - if (EX(func)->op_array.opcodes[i].opcode == ZEND_RETURN - && (EX(func)->op_array.opcodes[i].op1_type & (IS_VAR|IS_TMP_VAR))) { - zval_ptr_dtor(EX_VAR(EX(func)->op_array.opcodes[i].op1.var)); - } - break; - } - } - throw_op_num = range->end; + uint32_t new_throw_op_num = throw_op_num + throw_op->op2.opline_num; + cleanup_live_vars(execute_data, throw_op_num, new_throw_op_num); + throw_op_num = new_throw_op_num; } /* Find the innermost try/catch/finally the exception was thrown in */ @@ -3378,6 +3365,10 @@ zval *return_value = EX_VAR(EX(func)->op_array.opcodes[Z_OPLINE_NUM_P(fast_call)].op2.var); zval_ptr_dtor(return_value); + /* Clear return value in case we hit both DISCARD_EXCEPTION and + * zend_dispatch_try_catch_finally_helper, which will free the return + * value again. See OSS-Fuzz #438780145. */ + ZVAL_NULL(return_value); } /* cleanup delayed exception */ @@ -11356,7 +11347,9 @@ zval retval; zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT)); + GC_ADDREF(zobj); zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval); + OBJ_RELEASE(zobj); count = zval_get_long(&retval); zval_ptr_dtor(&retval); break; @@ -18835,7 +18828,9 @@ zval retval; zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT)); + GC_ADDREF(zobj); zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval); + OBJ_RELEASE(zobj); count = zval_get_long(&retval); zval_ptr_dtor(&retval); break; @@ -23599,7 +23594,7 @@ } prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - if (prop_info) { + if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { /* special case for typed properties */ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC); } else { @@ -23807,7 +23802,8 @@ } } else { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); - zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -23869,7 +23865,8 @@ ZVAL_NULL(EX_VAR(opline->result.var)); } else { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -26600,7 +26597,7 @@ } prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - if (prop_info) { + if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { /* special case for typed properties */ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC); } else { @@ -26810,7 +26807,8 @@ } } else { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); - zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -26873,7 +26871,8 @@ ZVAL_NULL(EX_VAR(opline->result.var)); } else { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -30960,7 +30959,7 @@ } prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - if (prop_info) { + if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { /* special case for typed properties */ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC); } else { @@ -31168,7 +31167,8 @@ } } else { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); - zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -31230,7 +31230,8 @@ ZVAL_NULL(EX_VAR(opline->result.var)); } else { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -33630,7 +33631,7 @@ } prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - if (prop_info) { + if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { /* special case for typed properties */ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC); } else { @@ -33708,7 +33709,8 @@ } } else { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); - zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -33770,7 +33772,8 @@ ZVAL_NULL(EX_VAR(opline->result.var)); } else { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -35816,7 +35819,7 @@ } prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - if (prop_info) { + if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { /* special case for typed properties */ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC); } else { @@ -35894,7 +35897,8 @@ } } else { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); - zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -35957,7 +35961,8 @@ ZVAL_NULL(EX_VAR(opline->result.var)); } else { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -38466,7 +38471,7 @@ } prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - if (prop_info) { + if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { /* special case for typed properties */ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC); } else { @@ -38544,7 +38549,8 @@ } } else { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); - zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -38606,7 +38612,8 @@ ZVAL_NULL(EX_VAR(opline->result.var)); } else { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -42621,7 +42628,7 @@ } prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - if (prop_info) { + if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { /* special case for typed properties */ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC); } else { @@ -42829,7 +42836,8 @@ } } else { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); - zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -42891,7 +42899,8 @@ ZVAL_NULL(EX_VAR(opline->result.var)); } else { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -46575,7 +46584,7 @@ } prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - if (prop_info) { + if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { /* special case for typed properties */ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC); } else { @@ -46785,7 +46794,8 @@ } } else { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); - zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -46848,7 +46858,8 @@ ZVAL_NULL(EX_VAR(opline->result.var)); } else { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -51383,7 +51394,9 @@ zval retval; zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT)); + GC_ADDREF(zobj); zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval); + OBJ_RELEASE(zobj); count = zval_get_long(&retval); zval_ptr_dtor(&retval); break; @@ -52080,7 +52093,7 @@ } prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - if (prop_info) { + if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { /* special case for typed properties */ zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC); } else { @@ -52288,7 +52301,8 @@ } } else { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); - zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_pre_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); @@ -52350,7 +52364,8 @@ ZVAL_NULL(EX_VAR(opline->result.var)); } else { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC); + zend_post_incdec_property_zval(zptr, + prop_info && ZEND_TYPE_IS_SET(prop_info->type) ? prop_info : NULL OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(zobj, name, cache_slot OPLINE_CC EXECUTE_DATA_CC); diff -Nru php8.4-8.4.16/Zend/zend_vm_gen.php php8.4-8.4.21/Zend/zend_vm_gen.php --- php8.4-8.4.16/Zend/zend_vm_gen.php 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_vm_gen.php 2026-05-05 16:34:12.000000000 +0000 @@ -63,7 +63,7 @@ "ZEND_VM_OP_NUM" => 0x10, "ZEND_VM_OP_JMP_ADDR" => 0x20, "ZEND_VM_OP_TRY_CATCH" => 0x30, - // unused 0x40 + "ZEND_VM_OP_LOOP_END" => 0x40, "ZEND_VM_OP_THIS" => 0x50, "ZEND_VM_OP_NEXT" => 0x60, "ZEND_VM_OP_CLASS_FETCH" => 0x70, @@ -111,6 +111,7 @@ "NUM" => ZEND_VM_OP_NUM, "JMP_ADDR" => ZEND_VM_OP_JMP_ADDR, "TRY_CATCH" => ZEND_VM_OP_TRY_CATCH, + "LOOP_END" => ZEND_VM_OP_LOOP_END, "THIS" => ZEND_VM_OP_THIS, "NEXT" => ZEND_VM_OP_NEXT, "CLASS_FETCH" => ZEND_VM_OP_CLASS_FETCH, @@ -841,7 +842,7 @@ $handler = $matches[1]; $opcode = $opcodes[$opnames[$handler]]; $inline = - ZEND_VM_KIND == ZEND_VM_KIND_HYBRID && + ZEND_VM_GEN_KIND == ZEND_VM_KIND_HYBRID && isset($opcode["use"]) && is_hot_handler($opcode["hot"], $op1, $op2, $extra_spec) && is_hot_handler($opcodes[$opnames[$name]]["hot"], $op1, $op2, $extra_spec) ? @@ -1079,7 +1080,7 @@ } return; case ZEND_VM_KIND_CALL: - if ($opcode["hot"] && ZEND_VM_KIND == ZEND_VM_KIND_HYBRID && is_hot_handler($opcode["hot"], $op1, $op2, $extra_spec)) { + if ($opcode["hot"] && ZEND_VM_GEN_KIND == ZEND_VM_KIND_HYBRID && is_hot_handler($opcode["hot"], $op1, $op2, $extra_spec)) { if (isset($opcode["use"])) { out($f,"static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_INLINE_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n"); $additional_func = true; @@ -2341,7 +2342,7 @@ $str .= "#define ZEND_VM_KIND_SWITCH\t" . ZEND_VM_KIND_SWITCH . "\n"; $str .= "#define ZEND_VM_KIND_GOTO\t" . ZEND_VM_KIND_GOTO . "\n"; $str .= "#define ZEND_VM_KIND_HYBRID\t" . ZEND_VM_KIND_HYBRID . "\n"; - if ($GLOBALS["vm_kind_name"][ZEND_VM_KIND] === "ZEND_VM_KIND_HYBRID") { + if ($GLOBALS["vm_kind_name"][ZEND_VM_GEN_KIND] === "ZEND_VM_KIND_HYBRID") { $str .= "/* HYBRID requires support for computed GOTO and global register variables*/\n"; $str .= "#if (defined(__GNUC__) && defined(HAVE_GCC_GLOBAL_REGS))\n"; $str .= "# define ZEND_VM_KIND\t\tZEND_VM_KIND_HYBRID\n"; @@ -2349,7 +2350,7 @@ $str .= "# define ZEND_VM_KIND\t\tZEND_VM_KIND_CALL\n"; $str .= "#endif\n"; } else { - $str .= "#define ZEND_VM_KIND\t\t" . $GLOBALS["vm_kind_name"][ZEND_VM_KIND] . "\n"; + $str .= "#define ZEND_VM_KIND\t\t" . $GLOBALS["vm_kind_name"][ZEND_VM_GEN_KIND] . "\n"; } $str .= "\n"; $str .= "#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) && !defined(__SANITIZE_ADDRESS__)\n"; @@ -2578,9 +2579,9 @@ } // Store parameters - if ((ZEND_VM_KIND == ZEND_VM_KIND_GOTO - || ZEND_VM_KIND == ZEND_VM_KIND_SWITCH - || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID && $hot)) + if ((ZEND_VM_GEN_KIND == ZEND_VM_KIND_GOTO + || ZEND_VM_GEN_KIND == ZEND_VM_KIND_SWITCH + || (ZEND_VM_GEN_KIND == ZEND_VM_KIND_HYBRID && $hot)) && $param) { foreach (explode(",", $param ) as $p) { $p = trim($p); @@ -2642,7 +2643,7 @@ die("ERROR ($def:$lineno): Opcode with name '$op' is not defined.\n"); } $opcodes[$opnames[$dsc['op']]]['alias'] = $op; - if (!ZEND_VM_SPEC && ZEND_VM_KIND == ZEND_VM_KIND_SWITCH) { + if (!ZEND_VM_SPEC && ZEND_VM_GEN_KIND == ZEND_VM_KIND_SWITCH) { $code = $opnames[$op]; $opcodes[$code]['use'] = 1; } @@ -2755,7 +2756,7 @@ out($f, "255\n};\n\n"); // Generate specialized executor - gen_executor($f, $skl, ZEND_VM_SPEC, ZEND_VM_KIND, "execute", "zend_vm_init"); + gen_executor($f, $skl, ZEND_VM_SPEC, ZEND_VM_GEN_KIND, "execute", "zend_vm_init"); out($f, "\n"); // Generate zend_vm_get_opcode_handler() function @@ -2849,7 +2850,7 @@ out($f, "}\n"); out($f, "#endif\n\n"); - if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) { + if (ZEND_VM_GEN_KIND == ZEND_VM_KIND_HYBRID) { // Generate zend_vm_get_opcode_handler_func() function out($f, "#if ZEND_VM_KIND == ZEND_VM_KIND_HYBRID\n"); out($f,"static const void *zend_vm_get_opcode_handler_func(uint8_t opcode, const zend_op* op)\n"); @@ -2960,10 +2961,10 @@ out($f, "}\n\n"); // Generate zend_vm_call_opcode_handler() function - if (ZEND_VM_KIND == ZEND_VM_KIND_CALL || ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) { + if (ZEND_VM_GEN_KIND == ZEND_VM_KIND_CALL || ZEND_VM_GEN_KIND == ZEND_VM_KIND_HYBRID) { out($f, "ZEND_API int ZEND_FASTCALL zend_vm_call_opcode_handler(zend_execute_data* ex)\n"); out($f, "{\n"); - if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) { + if (ZEND_VM_GEN_KIND == ZEND_VM_KIND_HYBRID) { out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n"); out($f, "\topcode_handler_t handler;\n"); out($f,"#endif\n"); @@ -2981,7 +2982,7 @@ out($f, "\n"); out($f, "\tLOAD_OPLINE();\n"); out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)\n"); - if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) { + if (ZEND_VM_GEN_KIND == ZEND_VM_KIND_HYBRID) { out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n"); out($f, "\thandler = (opcode_handler_t)zend_vm_get_opcode_handler_func(zend_user_opcodes[opline->opcode], opline);\n"); out($f, "\thandler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n"); @@ -2989,7 +2990,7 @@ out($f,"#else\n"); } out($f, "\t((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n"); - if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) { + if (ZEND_VM_GEN_KIND == ZEND_VM_KIND_HYBRID) { out($f, "\tif (EXPECTED(opline)) {\n"); out($f,"#endif\n"); } else { @@ -3051,16 +3052,16 @@ $kind = substr($argv[$i], strlen("--with-vm-kind=")); switch ($kind) { case "CALL": - define("ZEND_VM_KIND", ZEND_VM_KIND_CALL); + define("ZEND_VM_GEN_KIND", ZEND_VM_KIND_CALL); break; case "SWITCH": - define("ZEND_VM_KIND", ZEND_VM_KIND_SWITCH); + define("ZEND_VM_GEN_KIND", ZEND_VM_KIND_SWITCH); break; case "GOTO": - define("ZEND_VM_KIND", ZEND_VM_KIND_GOTO); + define("ZEND_VM_GEN_KIND", ZEND_VM_KIND_GOTO); break; case "HYBRID": - define("ZEND_VM_KIND", ZEND_VM_KIND_HYBRID); + define("ZEND_VM_GEN_KIND", ZEND_VM_KIND_HYBRID); break; default: echo("ERROR: Invalid vm kind '$kind'\n"); @@ -3084,9 +3085,9 @@ } // Using defaults -if (!defined("ZEND_VM_KIND")) { +if (!defined("ZEND_VM_GEN_KIND")) { // Using CALL threading by default - define("ZEND_VM_KIND", ZEND_VM_KIND_HYBRID); + define("ZEND_VM_GEN_KIND", ZEND_VM_KIND_HYBRID); } if (!defined("ZEND_VM_SPEC")) { // Using specialized executor by default diff -Nru php8.4-8.4.16/Zend/zend_vm_opcodes.c php8.4-8.4.21/Zend/zend_vm_opcodes.c --- php8.4-8.4.16/Zend/zend_vm_opcodes.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_vm_opcodes.c 2026-05-05 16:34:12.000000000 +0000 @@ -306,7 +306,7 @@ 0x00001301, 0x0100a173, 0x01040300, - 0x00000005, + 0x00004005, 0x00186703, 0x00106703, 0x08000007, @@ -363,7 +363,7 @@ 0x0000a103, 0x00002003, 0x03000001, - 0x00000005, + 0x00004005, 0x01000700, 0x00000000, 0x00000000, diff -Nru php8.4-8.4.16/Zend/zend_vm_opcodes.h php8.4-8.4.21/Zend/zend_vm_opcodes.h --- php8.4-8.4.16/Zend/zend_vm_opcodes.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/Zend/zend_vm_opcodes.h 2026-05-05 16:34:12.000000000 +0000 @@ -48,6 +48,7 @@ #define ZEND_VM_OP_NUM 0x00000010 #define ZEND_VM_OP_JMP_ADDR 0x00000020 #define ZEND_VM_OP_TRY_CATCH 0x00000030 +#define ZEND_VM_OP_LOOP_END 0x00000040 #define ZEND_VM_OP_THIS 0x00000050 #define ZEND_VM_OP_NEXT 0x00000060 #define ZEND_VM_OP_CLASS_FETCH 0x00000070 diff -Nru php8.4-8.4.16/build/gen_stub.php php8.4-8.4.21/build/gen_stub.php --- php8.4-8.4.16/build/gen_stub.php 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/build/gen_stub.php 2026-05-05 16:34:12.000000000 +0000 @@ -84,7 +84,7 @@ } /* Because exit() and die() are proper token/keywords we need to hack-around */ - $hasSpecialExitAsFunctionHandling = str_ends_with($stubFile, 'zend_builtin_functions.stub.php'); + $hasSpecialExitAsFunctionHandling = basename($stubFile) == 'zend_builtin_functions.stub.php'; if (!$fileInfo = $context->parsedFiles[$stubFile] ?? null) { initPhpParser(); $stubContent = $stubCode ?? file_get_contents($stubFile); @@ -4087,7 +4087,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); } @@ -4109,7 +4109,7 @@ if ($this->name === "param") { // Allow for parsing extended types like callable(string):mixed in docblocks - preg_match('/^\s*(?[\w\|\\\\]+(?\((?(?:(?&parens)|[^(){}[\]]*+))++\)|\{(?&inparens)\}|\[(?&inparens)\])*+(?::(?&type))?)\s*\$(?\w+).*$/', $value, $matches); + preg_match('/^\s*(?[\w\|\\\\]+(?\((?(?:(?&parens)|[^(){}[\]]*+))++\)|\{(?&inparens)\}|\[(?&inparens)\])*+(?::(?&type))?)\s*(\.\.\.)?\$(?\w+).*$/', $value, $matches); } elseif ($this->name === "prefer-ref") { preg_match('/^\s*\$(?\w+).*$/', $value, $matches); } @@ -5970,9 +5970,10 @@ chdir(__DIR__); $tarName = "v$version.tar.gz"; - passthru("wget https://github.com/nikic/PHP-Parser/archive/$tarName", $exit); + $downloadUrl = "https://github.com/nikic/PHP-Parser/archive/$tarName"; + passthru("wget -O $tarName $downloadUrl", $exit); if ($exit !== 0) { - passthru("curl -LO https://github.com/nikic/PHP-Parser/archive/$tarName", $exit); + passthru("curl -LO $downloadUrl", $exit); } if ($exit !== 0) { throw new Exception("Failed to download PHP-Parser tarball"); @@ -5982,6 +5983,7 @@ } passthru("tar xvzf $tarName -C PHP-Parser-$version --strip-components 1", $exit); if ($exit !== 0) { + rmdir($phpParserDir); throw new Exception("Failed to extract PHP-Parser tarball"); } unlink(__DIR__ . "/$tarName"); diff -Nru php8.4-8.4.16/configure php8.4-8.4.21/configure --- php8.4-8.4.16/configure 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/configure 2026-05-05 16:34:12.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for PHP 8.4.16. +# Generated by GNU Autoconf 2.72 for PHP 8.4.21. # # Report bugs to . # @@ -816,8 +816,8 @@ # Identity of this package. PACKAGE_NAME='PHP' PACKAGE_TARNAME='php' -PACKAGE_VERSION='8.4.16' -PACKAGE_STRING='PHP 8.4.16' +PACKAGE_VERSION='8.4.21' +PACKAGE_STRING='PHP 8.4.21' PACKAGE_BUGREPORT='https://github.com/php/php-src/issues' PACKAGE_URL='https://www.php.net' @@ -1872,7 +1872,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures PHP 8.4.16 to adapt to many kinds of systems. +'configure' configures PHP 8.4.21 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1944,7 +1944,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of PHP 8.4.16:";; + short | recursive ) echo "Configuration of PHP 8.4.21:";; esac cat <<\_ACEOF @@ -2449,7 +2449,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -PHP configure 8.4.16 +PHP configure 8.4.21 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -3206,7 +3206,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by PHP $as_me 8.4.16, which was +It was created by PHP $as_me 8.4.21, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -4628,7 +4628,7 @@ ac_IFS=$IFS; IFS="." -set $(echo 8.4.16 | "${SED}" 's/\([0-9\.]*\)\(.*\)/\1\.\2/') +set $(echo 8.4.21 | "${SED}" 's/\([0-9\.]*\)\(.*\)/\1\.\2/') IFS=$ac_IFS PHP_MAJOR_VERSION=$1 PHP_MINOR_VERSION=$2 @@ -31555,7 +31555,7 @@ PHP_LEXBOR_CFLAGS="-I@ext_srcdir@/lexbor -DLEXBOR_STATIC" LEXBOR_DIR="lexbor/lexbor" - LEXBOR_SOURCES=" $LEXBOR_DIR/core/array_obj.c $LEXBOR_DIR/core/array.c $LEXBOR_DIR/core/avl.c $LEXBOR_DIR/core/bst.c $LEXBOR_DIR/core/conv.c $LEXBOR_DIR/core/diyfp.c $LEXBOR_DIR/core/dobject.c $LEXBOR_DIR/core/dtoa.c $LEXBOR_DIR/core/hash.c $LEXBOR_DIR/core/mem.c $LEXBOR_DIR/core/mraw.c $LEXBOR_DIR/core/print.c $LEXBOR_DIR/core/serialize.c $LEXBOR_DIR/core/shs.c $LEXBOR_DIR/core/str.c $LEXBOR_DIR/core/strtod.c $LEXBOR_DIR/css/css.c $LEXBOR_DIR/css/log.c $LEXBOR_DIR/css/parser.c $LEXBOR_DIR/css/selectors/pseudo_state.c $LEXBOR_DIR/css/selectors/pseudo.c $LEXBOR_DIR/css/selectors/selector.c $LEXBOR_DIR/css/selectors/selectors.c $LEXBOR_DIR/css/selectors/state.c $LEXBOR_DIR/css/state.c $LEXBOR_DIR/css/syntax/anb.c $LEXBOR_DIR/css/syntax/parser.c $LEXBOR_DIR/css/syntax/state.c $LEXBOR_DIR/css/syntax/syntax.c $LEXBOR_DIR/css/syntax/token.c $LEXBOR_DIR/css/syntax/tokenizer.c $LEXBOR_DIR/css/syntax/tokenizer/error.c $LEXBOR_DIR/dom/interface.c $LEXBOR_DIR/dom/interfaces/attr.c $LEXBOR_DIR/dom/interfaces/cdata_section.c $LEXBOR_DIR/dom/interfaces/character_data.c $LEXBOR_DIR/dom/interfaces/comment.c $LEXBOR_DIR/dom/interfaces/document_fragment.c $LEXBOR_DIR/dom/interfaces/document_type.c $LEXBOR_DIR/dom/interfaces/document.c $LEXBOR_DIR/dom/interfaces/element.c $LEXBOR_DIR/dom/interfaces/node.c $LEXBOR_DIR/dom/interfaces/processing_instruction.c $LEXBOR_DIR/dom/interfaces/shadow_root.c $LEXBOR_DIR/dom/interfaces/text.c $LEXBOR_DIR/encoding/decode.c $LEXBOR_DIR/encoding/encode.c $LEXBOR_DIR/encoding/encoding.c $LEXBOR_DIR/encoding/multi.c $LEXBOR_DIR/encoding/range.c $LEXBOR_DIR/encoding/res.c $LEXBOR_DIR/encoding/single.c $LEXBOR_DIR/html/encoding.c $LEXBOR_DIR/html/interface.c $LEXBOR_DIR/html/interfaces/anchor_element.c $LEXBOR_DIR/html/interfaces/area_element.c $LEXBOR_DIR/html/interfaces/audio_element.c $LEXBOR_DIR/html/interfaces/base_element.c $LEXBOR_DIR/html/interfaces/body_element.c $LEXBOR_DIR/html/interfaces/br_element.c $LEXBOR_DIR/html/interfaces/button_element.c $LEXBOR_DIR/html/interfaces/canvas_element.c $LEXBOR_DIR/html/interfaces/d_list_element.c $LEXBOR_DIR/html/interfaces/data_element.c $LEXBOR_DIR/html/interfaces/data_list_element.c $LEXBOR_DIR/html/interfaces/details_element.c $LEXBOR_DIR/html/interfaces/dialog_element.c $LEXBOR_DIR/html/interfaces/directory_element.c $LEXBOR_DIR/html/interfaces/div_element.c $LEXBOR_DIR/html/interfaces/document.c $LEXBOR_DIR/html/interfaces/element.c $LEXBOR_DIR/html/interfaces/embed_element.c $LEXBOR_DIR/html/interfaces/field_set_element.c $LEXBOR_DIR/html/interfaces/font_element.c $LEXBOR_DIR/html/interfaces/form_element.c $LEXBOR_DIR/html/interfaces/frame_element.c $LEXBOR_DIR/html/interfaces/frame_set_element.c $LEXBOR_DIR/html/interfaces/head_element.c $LEXBOR_DIR/html/interfaces/heading_element.c $LEXBOR_DIR/html/interfaces/hr_element.c $LEXBOR_DIR/html/interfaces/html_element.c $LEXBOR_DIR/html/interfaces/iframe_element.c $LEXBOR_DIR/html/interfaces/image_element.c $LEXBOR_DIR/html/interfaces/input_element.c $LEXBOR_DIR/html/interfaces/label_element.c $LEXBOR_DIR/html/interfaces/legend_element.c $LEXBOR_DIR/html/interfaces/li_element.c $LEXBOR_DIR/html/interfaces/link_element.c $LEXBOR_DIR/html/interfaces/map_element.c $LEXBOR_DIR/html/interfaces/marquee_element.c $LEXBOR_DIR/html/interfaces/media_element.c $LEXBOR_DIR/html/interfaces/menu_element.c $LEXBOR_DIR/html/interfaces/meta_element.c $LEXBOR_DIR/html/interfaces/meter_element.c $LEXBOR_DIR/html/interfaces/mod_element.c $LEXBOR_DIR/html/interfaces/o_list_element.c $LEXBOR_DIR/html/interfaces/object_element.c $LEXBOR_DIR/html/interfaces/opt_group_element.c $LEXBOR_DIR/html/interfaces/option_element.c $LEXBOR_DIR/html/interfaces/output_element.c $LEXBOR_DIR/html/interfaces/paragraph_element.c $LEXBOR_DIR/html/interfaces/param_element.c $LEXBOR_DIR/html/interfaces/picture_element.c $LEXBOR_DIR/html/interfaces/pre_element.c $LEXBOR_DIR/html/interfaces/progress_element.c $LEXBOR_DIR/html/interfaces/quote_element.c $LEXBOR_DIR/html/interfaces/script_element.c $LEXBOR_DIR/html/interfaces/select_element.c $LEXBOR_DIR/html/interfaces/slot_element.c $LEXBOR_DIR/html/interfaces/source_element.c $LEXBOR_DIR/html/interfaces/span_element.c $LEXBOR_DIR/html/interfaces/style_element.c $LEXBOR_DIR/html/interfaces/table_caption_element.c $LEXBOR_DIR/html/interfaces/table_cell_element.c $LEXBOR_DIR/html/interfaces/table_col_element.c $LEXBOR_DIR/html/interfaces/table_element.c $LEXBOR_DIR/html/interfaces/table_row_element.c $LEXBOR_DIR/html/interfaces/table_section_element.c $LEXBOR_DIR/html/interfaces/template_element.c $LEXBOR_DIR/html/interfaces/text_area_element.c $LEXBOR_DIR/html/interfaces/time_element.c $LEXBOR_DIR/html/interfaces/title_element.c $LEXBOR_DIR/html/interfaces/track_element.c $LEXBOR_DIR/html/interfaces/u_list_element.c $LEXBOR_DIR/html/interfaces/unknown_element.c $LEXBOR_DIR/html/interfaces/video_element.c $LEXBOR_DIR/html/interfaces/window.c $LEXBOR_DIR/html/parser.c $LEXBOR_DIR/html/token_attr.c $LEXBOR_DIR/html/token.c $LEXBOR_DIR/html/tokenizer.c $LEXBOR_DIR/html/tokenizer/error.c $LEXBOR_DIR/html/tokenizer/state_comment.c $LEXBOR_DIR/html/tokenizer/state_doctype.c $LEXBOR_DIR/html/tokenizer/state_rawtext.c $LEXBOR_DIR/html/tokenizer/state_rcdata.c $LEXBOR_DIR/html/tokenizer/state_script.c $LEXBOR_DIR/html/tokenizer/state.c $LEXBOR_DIR/html/tree.c $LEXBOR_DIR/html/tree/active_formatting.c $LEXBOR_DIR/html/tree/error.c $LEXBOR_DIR/html/tree/insertion_mode/after_after_body.c $LEXBOR_DIR/html/tree/insertion_mode/after_after_frameset.c $LEXBOR_DIR/html/tree/insertion_mode/after_body.c $LEXBOR_DIR/html/tree/insertion_mode/after_frameset.c $LEXBOR_DIR/html/tree/insertion_mode/after_head.c $LEXBOR_DIR/html/tree/insertion_mode/before_head.c $LEXBOR_DIR/html/tree/insertion_mode/before_html.c $LEXBOR_DIR/html/tree/insertion_mode/foreign_content.c $LEXBOR_DIR/html/tree/insertion_mode/in_body.c $LEXBOR_DIR/html/tree/insertion_mode/in_caption.c $LEXBOR_DIR/html/tree/insertion_mode/in_cell.c $LEXBOR_DIR/html/tree/insertion_mode/in_column_group.c $LEXBOR_DIR/html/tree/insertion_mode/in_frameset.c $LEXBOR_DIR/html/tree/insertion_mode/in_head_noscript.c $LEXBOR_DIR/html/tree/insertion_mode/in_head.c $LEXBOR_DIR/html/tree/insertion_mode/in_row.c $LEXBOR_DIR/html/tree/insertion_mode/in_select_in_table.c $LEXBOR_DIR/html/tree/insertion_mode/in_select.c $LEXBOR_DIR/html/tree/insertion_mode/in_table_body.c $LEXBOR_DIR/html/tree/insertion_mode/in_table_text.c $LEXBOR_DIR/html/tree/insertion_mode/in_table.c $LEXBOR_DIR/html/tree/insertion_mode/in_template.c $LEXBOR_DIR/html/tree/insertion_mode/initial.c $LEXBOR_DIR/html/tree/insertion_mode/text.c $LEXBOR_DIR/html/tree/open_elements.c $LEXBOR_DIR/ns/ns.c $LEXBOR_DIR/ports/posix/lexbor/core/memory.c $LEXBOR_DIR/selectors-adapted/selectors.c $LEXBOR_DIR/tag/tag.c " + LEXBOR_SOURCES=" $LEXBOR_DIR/core/array_obj.c $LEXBOR_DIR/core/array.c $LEXBOR_DIR/core/avl.c $LEXBOR_DIR/core/bst.c $LEXBOR_DIR/core/conv.c $LEXBOR_DIR/core/diyfp.c $LEXBOR_DIR/core/dobject.c $LEXBOR_DIR/core/dtoa.c $LEXBOR_DIR/core/hash.c $LEXBOR_DIR/core/mem.c $LEXBOR_DIR/core/mraw.c $LEXBOR_DIR/core/print.c $LEXBOR_DIR/core/serialize.c $LEXBOR_DIR/core/shs.c $LEXBOR_DIR/core/str.c $LEXBOR_DIR/core/strtod.c $LEXBOR_DIR/css/at_rule.c $LEXBOR_DIR/css/at_rule/state.c $LEXBOR_DIR/css/blank.c $LEXBOR_DIR/css/css.c $LEXBOR_DIR/css/declaration.c $LEXBOR_DIR/css/log.c $LEXBOR_DIR/css/parser.c $LEXBOR_DIR/css/property.c $LEXBOR_DIR/css/property/state.c $LEXBOR_DIR/css/rule.c $LEXBOR_DIR/css/selectors/pseudo_state.c $LEXBOR_DIR/css/selectors/pseudo.c $LEXBOR_DIR/css/selectors/selector.c $LEXBOR_DIR/css/selectors/selectors.c $LEXBOR_DIR/css/selectors/state.c $LEXBOR_DIR/css/state.c $LEXBOR_DIR/css/stylesheet.c $LEXBOR_DIR/css/syntax/anb.c $LEXBOR_DIR/css/syntax/parser.c $LEXBOR_DIR/css/syntax/state.c $LEXBOR_DIR/css/syntax/syntax.c $LEXBOR_DIR/css/syntax/token.c $LEXBOR_DIR/css/syntax/tokenizer.c $LEXBOR_DIR/css/syntax/tokenizer/error.c $LEXBOR_DIR/css/unit.c $LEXBOR_DIR/css/value.c $LEXBOR_DIR/dom/interface.c $LEXBOR_DIR/dom/interfaces/attr.c $LEXBOR_DIR/dom/interfaces/cdata_section.c $LEXBOR_DIR/dom/interfaces/character_data.c $LEXBOR_DIR/dom/interfaces/comment.c $LEXBOR_DIR/dom/interfaces/document_fragment.c $LEXBOR_DIR/dom/interfaces/document_type.c $LEXBOR_DIR/dom/interfaces/document.c $LEXBOR_DIR/dom/interfaces/element.c $LEXBOR_DIR/dom/interfaces/node.c $LEXBOR_DIR/dom/interfaces/processing_instruction.c $LEXBOR_DIR/dom/interfaces/shadow_root.c $LEXBOR_DIR/dom/interfaces/text.c $LEXBOR_DIR/encoding/decode.c $LEXBOR_DIR/encoding/encode.c $LEXBOR_DIR/encoding/encoding.c $LEXBOR_DIR/encoding/multi.c $LEXBOR_DIR/encoding/range.c $LEXBOR_DIR/encoding/res.c $LEXBOR_DIR/encoding/single.c $LEXBOR_DIR/html/encoding.c $LEXBOR_DIR/html/interface.c $LEXBOR_DIR/html/interfaces/anchor_element.c $LEXBOR_DIR/html/interfaces/area_element.c $LEXBOR_DIR/html/interfaces/audio_element.c $LEXBOR_DIR/html/interfaces/base_element.c $LEXBOR_DIR/html/interfaces/body_element.c $LEXBOR_DIR/html/interfaces/br_element.c $LEXBOR_DIR/html/interfaces/button_element.c $LEXBOR_DIR/html/interfaces/canvas_element.c $LEXBOR_DIR/html/interfaces/d_list_element.c $LEXBOR_DIR/html/interfaces/data_element.c $LEXBOR_DIR/html/interfaces/data_list_element.c $LEXBOR_DIR/html/interfaces/details_element.c $LEXBOR_DIR/html/interfaces/dialog_element.c $LEXBOR_DIR/html/interfaces/directory_element.c $LEXBOR_DIR/html/interfaces/div_element.c $LEXBOR_DIR/html/interfaces/document.c $LEXBOR_DIR/html/interfaces/element.c $LEXBOR_DIR/html/interfaces/embed_element.c $LEXBOR_DIR/html/interfaces/field_set_element.c $LEXBOR_DIR/html/interfaces/font_element.c $LEXBOR_DIR/html/interfaces/form_element.c $LEXBOR_DIR/html/interfaces/frame_element.c $LEXBOR_DIR/html/interfaces/frame_set_element.c $LEXBOR_DIR/html/interfaces/head_element.c $LEXBOR_DIR/html/interfaces/heading_element.c $LEXBOR_DIR/html/interfaces/hr_element.c $LEXBOR_DIR/html/interfaces/html_element.c $LEXBOR_DIR/html/interfaces/iframe_element.c $LEXBOR_DIR/html/interfaces/image_element.c $LEXBOR_DIR/html/interfaces/input_element.c $LEXBOR_DIR/html/interfaces/label_element.c $LEXBOR_DIR/html/interfaces/legend_element.c $LEXBOR_DIR/html/interfaces/li_element.c $LEXBOR_DIR/html/interfaces/link_element.c $LEXBOR_DIR/html/interfaces/map_element.c $LEXBOR_DIR/html/interfaces/marquee_element.c $LEXBOR_DIR/html/interfaces/media_element.c $LEXBOR_DIR/html/interfaces/menu_element.c $LEXBOR_DIR/html/interfaces/meta_element.c $LEXBOR_DIR/html/interfaces/meter_element.c $LEXBOR_DIR/html/interfaces/mod_element.c $LEXBOR_DIR/html/interfaces/o_list_element.c $LEXBOR_DIR/html/interfaces/object_element.c $LEXBOR_DIR/html/interfaces/opt_group_element.c $LEXBOR_DIR/html/interfaces/option_element.c $LEXBOR_DIR/html/interfaces/output_element.c $LEXBOR_DIR/html/interfaces/paragraph_element.c $LEXBOR_DIR/html/interfaces/param_element.c $LEXBOR_DIR/html/interfaces/picture_element.c $LEXBOR_DIR/html/interfaces/pre_element.c $LEXBOR_DIR/html/interfaces/progress_element.c $LEXBOR_DIR/html/interfaces/quote_element.c $LEXBOR_DIR/html/interfaces/script_element.c $LEXBOR_DIR/html/interfaces/search_element.c $LEXBOR_DIR/html/interfaces/select_element.c $LEXBOR_DIR/html/interfaces/selectedcontent_element.c $LEXBOR_DIR/html/interfaces/slot_element.c $LEXBOR_DIR/html/interfaces/source_element.c $LEXBOR_DIR/html/interfaces/span_element.c $LEXBOR_DIR/html/interfaces/style_element.c $LEXBOR_DIR/html/interfaces/table_caption_element.c $LEXBOR_DIR/html/interfaces/table_cell_element.c $LEXBOR_DIR/html/interfaces/table_col_element.c $LEXBOR_DIR/html/interfaces/table_element.c $LEXBOR_DIR/html/interfaces/table_row_element.c $LEXBOR_DIR/html/interfaces/table_section_element.c $LEXBOR_DIR/html/interfaces/template_element.c $LEXBOR_DIR/html/interfaces/text_area_element.c $LEXBOR_DIR/html/interfaces/time_element.c $LEXBOR_DIR/html/interfaces/title_element.c $LEXBOR_DIR/html/interfaces/track_element.c $LEXBOR_DIR/html/interfaces/u_list_element.c $LEXBOR_DIR/html/interfaces/unknown_element.c $LEXBOR_DIR/html/interfaces/video_element.c $LEXBOR_DIR/html/interfaces/window.c $LEXBOR_DIR/html/parser.c $LEXBOR_DIR/html/tag.c $LEXBOR_DIR/html/token_attr.c $LEXBOR_DIR/html/token.c $LEXBOR_DIR/html/tokenizer.c $LEXBOR_DIR/html/tokenizer/error.c $LEXBOR_DIR/html/tokenizer/state_comment.c $LEXBOR_DIR/html/tokenizer/state_doctype.c $LEXBOR_DIR/html/tokenizer/state_rawtext.c $LEXBOR_DIR/html/tokenizer/state_rcdata.c $LEXBOR_DIR/html/tokenizer/state_script.c $LEXBOR_DIR/html/tokenizer/state.c $LEXBOR_DIR/html/tree.c $LEXBOR_DIR/html/tree/active_formatting.c $LEXBOR_DIR/html/tree/error.c $LEXBOR_DIR/html/tree/insertion_mode/after_after_body.c $LEXBOR_DIR/html/tree/insertion_mode/after_after_frameset.c $LEXBOR_DIR/html/tree/insertion_mode/after_body.c $LEXBOR_DIR/html/tree/insertion_mode/after_frameset.c $LEXBOR_DIR/html/tree/insertion_mode/after_head.c $LEXBOR_DIR/html/tree/insertion_mode/before_head.c $LEXBOR_DIR/html/tree/insertion_mode/before_html.c $LEXBOR_DIR/html/tree/insertion_mode/foreign_content.c $LEXBOR_DIR/html/tree/insertion_mode/in_body.c $LEXBOR_DIR/html/tree/insertion_mode/in_caption.c $LEXBOR_DIR/html/tree/insertion_mode/in_cell.c $LEXBOR_DIR/html/tree/insertion_mode/in_column_group.c $LEXBOR_DIR/html/tree/insertion_mode/in_frameset.c $LEXBOR_DIR/html/tree/insertion_mode/in_head_noscript.c $LEXBOR_DIR/html/tree/insertion_mode/in_head.c $LEXBOR_DIR/html/tree/insertion_mode/in_row.c $LEXBOR_DIR/html/tree/insertion_mode/in_table_body.c $LEXBOR_DIR/html/tree/insertion_mode/in_table_text.c $LEXBOR_DIR/html/tree/insertion_mode/in_table.c $LEXBOR_DIR/html/tree/insertion_mode/in_template.c $LEXBOR_DIR/html/tree/insertion_mode/initial.c $LEXBOR_DIR/html/tree/insertion_mode/text.c $LEXBOR_DIR/html/tree/open_elements.c $LEXBOR_DIR/ns/ns.c $LEXBOR_DIR/ports/posix/lexbor/core/memory.c $LEXBOR_DIR/selectors-adapted/selectors.c $LEXBOR_DIR/tag/tag.c " ext_builddir=ext/dom ext_srcdir=$abs_srcdir/ext/dom @@ -31809,7 +31809,7 @@ fi - as_fn_append BUILD_DIR " $ext_builddir/parentnode $ext_builddir/$LEXBOR_DIR/core $ext_builddir/$LEXBOR_DIR/css/selectors $ext_builddir/$LEXBOR_DIR/css/syntax/tokenizer $ext_builddir/$LEXBOR_DIR/css/tokenizer $ext_builddir/$LEXBOR_DIR/dom/interfaces $ext_builddir/$LEXBOR_DIR/encoding $ext_builddir/$LEXBOR_DIR/html/interfaces $ext_builddir/$LEXBOR_DIR/html/tokenizer $ext_builddir/$LEXBOR_DIR/html/tree/insertion_mode $ext_builddir/$LEXBOR_DIR/ns $ext_builddir/$LEXBOR_DIR/ports/posix/lexbor/core $ext_builddir/$LEXBOR_DIR/selectors-adapted $ext_builddir/$LEXBOR_DIR/tag" + as_fn_append BUILD_DIR " $ext_builddir/parentnode $ext_builddir/$LEXBOR_DIR/core $ext_builddir/$LEXBOR_DIR/css/at_rule $ext_builddir/$LEXBOR_DIR/css/property $ext_builddir/$LEXBOR_DIR/css/selectors $ext_builddir/$LEXBOR_DIR/css/syntax/tokenizer $ext_builddir/$LEXBOR_DIR/css/tokenizer $ext_builddir/$LEXBOR_DIR/dom/interfaces $ext_builddir/$LEXBOR_DIR/encoding $ext_builddir/$LEXBOR_DIR/html/interfaces $ext_builddir/$LEXBOR_DIR/html/tokenizer $ext_builddir/$LEXBOR_DIR/html/tree/insertion_mode $ext_builddir/$LEXBOR_DIR/ns $ext_builddir/$LEXBOR_DIR/ports/posix/lexbor/core $ext_builddir/$LEXBOR_DIR/selectors-adapted $ext_builddir/$LEXBOR_DIR/tag" PHP_VAR_SUBST="$PHP_VAR_SUBST DOM_SHARED_LIBADD" @@ -94509,7 +94509,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by PHP $as_me 8.4.16, which was +This file was extended by PHP $as_me 8.4.21, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -94578,7 +94578,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -PHP config.status 8.4.16 +PHP config.status 8.4.21 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" diff -Nru php8.4-8.4.16/configure.ac php8.4-8.4.21/configure.ac --- php8.4-8.4.16/configure.ac 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/configure.ac 2026-05-05 16:34:12.000000000 +0000 @@ -17,7 +17,7 @@ dnl ---------------------------------------------------------------------------- AC_PREREQ([2.68]) -AC_INIT([PHP],[8.4.16],[https://github.com/php/php-src/issues],[php],[https://www.php.net]) +AC_INIT([PHP],[8.4.21],[https://github.com/php/php-src/issues],[php],[https://www.php.net]) AC_CONFIG_SRCDIR([main/php_version.h]) AC_CONFIG_AUX_DIR([build]) AC_PRESERVE_HELP_ORDER diff -Nru php8.4-8.4.16/debian/changelog php8.4-8.4.21/debian/changelog --- php8.4-8.4.16/debian/changelog 2025-12-18 21:19:25.000000000 +0000 +++ php8.4-8.4.21/debian/changelog 2026-05-08 05:56:48.000000000 +0000 @@ -1,3 +1,23 @@ +php8.4 (8.4.21-1~deb13u1) trixie-security; urgency=high + + * New upstream version 8.4.21 + + [CVE-2026-7263]: Dom\XMLDocument::C14N() emits duplicate xmlns + declarations after setAttributeNS() + + [CVE-2026-29078, CVE-2026-29079]: Upgrade to lexbor v2.7.0 + + [CVE-2026-6735]: XSS within status endpoint + + [CVE-2026-7259]: Null pointer dereference in php_mb_check_encoding() + via mb_ereg_search_init() + + [CVE-2026-6104]: Out-of-bounds access in mbfl_name2encoding_ex() + + [CVE-2025-14179]: SQL injection via NUL bytes in quoted strings + + [CVE-2026-6722]: Stale SOAP_GLOBAL(ref_map) pointer with Apache Map + + [CVE-2026-7261]: Use-after-free after header parsing failure with + SOAP_PERSISTENCE_SESSION + + [CVE-2026-7262]: Broken Apache map value NULL check + + [CVE-2026-7568]: Signed integer overflow of char array offset + + [CVE-2026-7258]: Consistently pass unsigned char to ctype.h functions + + -- Ondřej Surý Fri, 08 May 2026 07:56:48 +0200 + php8.4 (8.4.16-1~deb13u1) trixie-security; urgency=high * New upstream version 8.4.16 diff -Nru php8.4-8.4.16/debian/gbp.conf php8.4-8.4.21/debian/gbp.conf --- php8.4-8.4.16/debian/gbp.conf 2025-12-18 21:19:25.000000000 +0000 +++ php8.4-8.4.21/debian/gbp.conf 2026-05-08 05:56:48.000000000 +0000 @@ -1,5 +1,5 @@ [DEFAULT] -debian-branch = debian/trixie +debian-branch = debian/trixie/8.4 upstream-branch = upstream/8.4 pristine-tar = True diff -Nru php8.4-8.4.16/ext/bz2/bz2.c php8.4-8.4.21/ext/bz2/bz2.c --- php8.4-8.4.16/ext/bz2/bz2.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/bz2/bz2.c 2026-05-05 16:34:12.000000000 +0000 @@ -458,7 +458,15 @@ + .01 x length of data + 600 which is the largest size the results of the compression could possibly be, at least that's what the libbz2 docs say (thanks to jeremy@nirvani.net for pointing this out). */ - dest_len = (unsigned int) (source_len + (0.01 * source_len) + 600); + size_t chunk_len = source_len + source_len / 100 + 600; + const size_t min = MIN(ZSTR_MAX_LEN, UINT_MAX); + + if (chunk_len < source_len || chunk_len > min) { + zend_argument_value_error(1, "must have a length less than or equal to %zu", min); + RETURN_THROWS(); + } + + dest_len = (unsigned int) chunk_len; /* Allocate the destination buffer */ dest = zend_string_alloc(dest_len, 0); @@ -494,11 +502,7 @@ size_t source_len; int error; bool small = 0; -#ifdef PHP_WIN32 - unsigned __int64 size = 0; -#else - unsigned long long size = 0; -#endif + uint64_t size = 0; bz_stream bzs; if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "s|b", &source, &source_len, &small)) { @@ -523,27 +527,22 @@ while ((error = BZ2_bzDecompress(&bzs)) == BZ_OK && bzs.avail_in > 0) { /* compression is better then 2:1, need to allocate more memory */ bzs.avail_out = source_len; - size = (bzs.total_out_hi32 * (unsigned int) -1) + bzs.total_out_lo32; -#ifndef ZEND_ENABLE_ZVAL_LONG64 + size = (((uint64_t) bzs.total_out_hi32) << 32U) + bzs.total_out_lo32; if (size > SIZE_MAX) { /* no reason to continue if we're going to drop it anyway */ break; } -#endif dest = zend_string_safe_realloc(dest, 1, bzs.avail_out+1, (size_t) size, 0); bzs.next_out = ZSTR_VAL(dest) + size; } if (error == BZ_STREAM_END || error == BZ_OK) { - size = (bzs.total_out_hi32 * (unsigned int) -1) + bzs.total_out_lo32; -#ifndef ZEND_ENABLE_ZVAL_LONG64 + size = (((uint64_t) bzs.total_out_hi32) << 32U) + bzs.total_out_lo32; if (UNEXPECTED(size > SIZE_MAX)) { php_error_docref(NULL, E_WARNING, "Decompressed size too big, max is %zd", SIZE_MAX); zend_string_efree(dest); RETVAL_LONG(BZ_MEM_ERROR); - } else -#endif - { + } else { dest = zend_string_safe_realloc(dest, 1, (size_t)size, 1, 0); ZSTR_LEN(dest) = (size_t)size; ZSTR_VAL(dest)[(size_t)size] = '\0'; diff -Nru php8.4-8.4.16/ext/bz2/tests/gh20620.phpt php8.4-8.4.21/ext/bz2/tests/gh20620.phpt --- php8.4-8.4.16/ext/bz2/tests/gh20620.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/bz2/tests/gh20620.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,22 @@ +--TEST-- +Bug GH-20620 (bzcompress with large source) +--EXTENSIONS-- +bz2 +--SKIPIF-- + +--INI-- +memory_limit=-1 +--FILE-- +getMessage(), PHP_EOL; +} +?> +--EXPECTF-- +bzcompress(): Argument #1 ($data) must have a length less than or equal to %d diff -Nru php8.4-8.4.16/ext/bz2/tests/gh20807.phpt php8.4-8.4.21/ext/bz2/tests/gh20807.phpt --- php8.4-8.4.16/ext/bz2/tests/gh20807.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/bz2/tests/gh20807.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,21 @@ +--TEST-- +Truncation of total output size causing erroneous size and data +--EXTENSIONS-- +bz2 +--INI-- +memory_limit=-1 +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(40) "d4b5e52ed34a774fa645f94369b0c61375436d30" diff -Nru php8.4-8.4.16/ext/calendar/jewish.c php8.4-8.4.21/ext/calendar/jewish.c --- php8.4-8.4.16/ext/calendar/jewish.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/calendar/jewish.c 2026-05-05 16:34:12.000000000 +0000 @@ -710,7 +710,7 @@ int yearLength; int lengthOfAdarIAndII; - if (year <= 0 || year >= 6000 || day <= 0 || day > 30) { + if (year <= 0 || year >= INT_MAX - 1 || day <= 0 || day > 30) { return (0); } switch (month) { diff -Nru php8.4-8.4.16/ext/calendar/tests/gh21557.phpt php8.4-8.4.21/ext/calendar/tests/gh21557.phpt --- php8.4-8.4.16/ext/calendar/tests/gh21557.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/calendar/tests/gh21557.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,24 @@ +--TEST-- +GH-21557 jewishtojd returns 0 for years >= 6000 +--CREDITS-- +oleibman +--EXTENSIONS-- +calendar +--FILE-- + +--EXPECT-- +yh=5995 rh=2537279 +yh=5996 rh=2537633 +yh=5997 rh=2538016 +yh=5998 rh=2538371 +yh=5999 rh=2538725 +yh=6000 rh=2539110 +yh=6001 rh=2539463 +yh=6002 rh=2539818 +yh=6003 rh=2540202 +yh=6004 rh=2540557 diff -Nru php8.4-8.4.16/ext/com_dotnet/com_extension.c php8.4-8.4.21/ext/com_dotnet/com_extension.c --- php8.4-8.4.16/ext/com_dotnet/com_extension.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/com_dotnet/com_extension.c 2026-05-05 16:34:12.000000000 +0000 @@ -118,11 +118,11 @@ } /* Remove leading/training white spaces on search_string */ - while (isspace(*typelib_name)) {/* Ends on '\0' in worst case */ + while (isspace((unsigned char)*typelib_name)) {/* Ends on '\0' in worst case */ typelib_name ++; } ptr = typelib_name + strlen(typelib_name) - 1; - while ((ptr != typelib_name) && isspace(*ptr)) { + while ((ptr != typelib_name) && isspace((unsigned char)*ptr)) { *ptr = '\0'; ptr--; } diff -Nru php8.4-8.4.16/ext/curl/config.w32 php8.4-8.4.21/ext/curl/config.w32 --- php8.4-8.4.16/ext/curl/config.w32 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/curl/config.w32 2026-05-05 16:34:12.000000000 +0000 @@ -24,7 +24,10 @@ !isNaN(ver_num) && (CHECK_LIB("normaliz.lib", "curl", PHP_CURL) && CHECK_LIB("libssh2.lib", "curl", PHP_CURL) && - CHECK_LIB("nghttp2.lib", "curl", PHP_CURL)) + CHECK_LIB("nghttp2.lib", "curl", PHP_CURL) && + CHECK_LIB("brotlidec.lib", "curl", PHP_CURL) && + CHECK_LIB("brotlicommon.lib", "curl", PHP_CURL) && + CHECK_LIB("libzstd.lib", "curl", PHP_CURL)) ) { EXTENSION("curl", "interface.c multi.c share.c curl_file.c"); AC_DEFINE('HAVE_CURL', 1, "Define to 1 if the PHP extension 'curl' is available."); diff -Nru php8.4-8.4.16/ext/curl/interface.c php8.4-8.4.21/ext/curl/interface.c --- php8.4-8.4.16/ext/curl/interface.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/curl/interface.c 2026-05-05 16:34:12.000000000 +0000 @@ -583,7 +583,7 @@ return fwrite(data, size, nmemb, write_handler->fp); case PHP_CURL_RETURN: if (length > 0) { - smart_str_appendl(&write_handler->buf, data, (int) length); + smart_str_appendl(&write_handler->buf, data, length); } break; case PHP_CURL_USER: { @@ -621,6 +621,10 @@ zval argv[3]; zval retval; + if (!ZEND_FCC_INITIALIZED(ch->handlers.fnmatch)) { + return rval; + } + GC_ADDREF(&ch->std); ZVAL_OBJ(&argv[0], &ch->std); ZVAL_STRING(&argv[1], pattern); @@ -652,6 +656,9 @@ fprintf(stderr, "curl_progress() called\n"); fprintf(stderr, "clientp = %x, dltotal = %f, dlnow = %f, ultotal = %f, ulnow = %f\n", clientp, dltotal, dlnow, ultotal, ulnow); #endif + if (!ZEND_FCC_INITIALIZED(ch->handlers.progress)) { + return rval; + } zval args[5]; zval retval; @@ -690,6 +697,9 @@ fprintf(stderr, "curl_xferinfo() called\n"); fprintf(stderr, "clientp = %x, dltotal = %ld, dlnow = %ld, ultotal = %ld, ulnow = %ld\n", clientp, dltotal, dlnow, ultotal, ulnow); #endif + if (!ZEND_FCC_INITIALIZED(ch->handlers.xferinfo)) { + return rval; + } zval argv[5]; zval retval; @@ -850,7 +860,7 @@ if (!Z_ISUNDEF(retval)) { _php_curl_verify_handlers(ch, /* reporterror */ true); if (Z_TYPE(retval) == IS_STRING) { - length = MIN((size * nmemb), Z_STRLEN(retval)); + length = MIN(size * nmemb, Z_STRLEN(retval)); memcpy(data, Z_STRVAL(retval), length); } else if (Z_TYPE(retval) == IS_LONG) { length = Z_LVAL_P(&retval); @@ -881,7 +891,7 @@ /* Handle special case write when we're returning the entire transfer */ if (ch->handlers.write->method == PHP_CURL_RETURN && length > 0) { - smart_str_appendl(&ch->handlers.write->buf, data, (int) length); + smart_str_appendl(&ch->handlers.write->buf, data, length); } else { PHPWRITE(data, length); } diff -Nru php8.4-8.4.16/ext/curl/tests/bug71523.phpt php8.4-8.4.21/ext/curl/tests/bug71523.phpt --- php8.4-8.4.16/ext/curl/tests/bug71523.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/curl/tests/bug71523.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -4,6 +4,7 @@ curl --SKIPIF-- No HTTPS_PROXY => Yes MULTI_SSL => %s -BROTLI => %s +BROTLI => Yes ALTSVC => Yes HTTP3 => No UNICODE => No -ZSTD => No +ZSTD => Yes HSTS => Yes GSASL => No Protocols => dict, file, ftp, ftps, gopher, %r(gophers, )?%rhttp, https, imap, imaps, ldap, ldaps, %r(mqtt, )?%rpop3, pop3s, rtsp, scp, sftp, smb, smbs, smtp, smtps, telnet, tftp%r(, ws)?(, wss)?%r diff -Nru php8.4-8.4.16/ext/curl/tests/curl_setopt_ssl.phpt php8.4-8.4.21/ext/curl/tests/curl_setopt_ssl.phpt --- php8.4-8.4.16/ext/curl/tests/curl_setopt_ssl.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/curl/tests/curl_setopt_ssl.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -37,6 +37,7 @@ } $clientCertSubject = "Subject: C=US, ST=TX, L=Clientlocation, O=Clientcompany, CN=clientname/emailAddress=test@example.com"; +$rejectsZeroLengthBlobs = curl_version()['version_number'] >= 0x081300; // load server cert $serverCertPath = __DIR__ . DIRECTORY_SEPARATOR . 'curl_setopt_ssl_servercert.pem'; @@ -91,7 +92,7 @@ echo "\n"; echo "case 2: empty client cert and key from string\n"; $ch = curl_init("https://127.0.0.1:$port/"); - var_dump(curl_setopt($ch, CURLOPT_SSLCERT_BLOB, '')); + var_dump(curl_setopt($ch, CURLOPT_SSLCERT_BLOB, '') === !$rejectsZeroLengthBlobs); var_dump(curl_setopt($ch, CURLOPT_SSLKEY_BLOB, $clientKey)); var_dump(curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false)); var_dump(curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false)); @@ -99,14 +100,14 @@ $response = curl_exec($ch); check_response($response, $clientCertSubject); - check_error($ch); + check_error($ch, $rejectsZeroLengthBlobs ? 56 : 58); curl_close($ch); echo "\n"; echo "case 3: client cert and empty key from string\n"; $ch = curl_init("https://127.0.0.1:$port/"); var_dump(curl_setopt($ch, CURLOPT_SSLCERT_BLOB, $clientCert)); - var_dump(curl_setopt($ch, CURLOPT_SSLKEY_BLOB, '')); + var_dump(curl_setopt($ch, CURLOPT_SSLKEY_BLOB, '') === !$rejectsZeroLengthBlobs); var_dump(curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false)); var_dump(curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); @@ -166,7 +167,7 @@ echo "case 7: empty issuer cert from string\n"; $ch = curl_init("https://127.0.0.1:$port/"); var_dump(curl_setopt($ch, CURLOPT_CAINFO, $serverCertPath)); - var_dump(curl_setopt($ch, CURLOPT_ISSUERCERT_BLOB, '')); + var_dump(curl_setopt($ch, CURLOPT_ISSUERCERT_BLOB, '') === !$rejectsZeroLengthBlobs); var_dump(curl_setopt($ch, CURLOPT_SSLCERT, $clientCertPath)); var_dump(curl_setopt($ch, CURLOPT_SSLKEY, $clientKeyPath)); var_dump(curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true)); @@ -174,8 +175,8 @@ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); - check_response($response, $clientCertSubject); - check_error($ch); + var_dump((is_string($response) && strpos($response, $clientCertSubject) !== false) === $rejectsZeroLengthBlobs); + var_dump(curl_errno($ch) === ($rejectsZeroLengthBlobs ? 0 : 83)); curl_close($ch); } finally { @@ -199,7 +200,7 @@ bool(true) bool(true) client cert subject not in response -CURL ERROR: 58 +CURL ERROR: EXPECTED case 3: client cert and empty key from string bool(true) @@ -241,5 +242,5 @@ bool(true) bool(true) bool(true) -client cert subject not in response -CURL ERROR: 83 +bool(true) +bool(true) diff -Nru php8.4-8.4.16/ext/curl/tests/gh21023.phpt php8.4-8.4.21/ext/curl/tests/gh21023.phpt --- php8.4-8.4.16/ext/curl/tests/gh21023.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/curl/tests/gh21023.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,27 @@ +--TEST-- +GH-21023 (crash with CURLOPT_XFERINFOFUNCTION set with an invalid callback) +--EXTENSIONS-- +curl +--FILE-- + +--EXPECT-- +OK diff -Nru php8.4-8.4.16/ext/date/lib/parse_date.c php8.4-8.4.21/ext/date/lib/parse_date.c --- php8.4-8.4.16/ext/date/lib/parse_date.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/date/lib/parse_date.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 1.0.3 on Mon Sep 15 10:38:03 2025 */ +/* Generated by re2c 1.0.3 on Wed Jan 14 14:20:50 2026 */ #line 1 "ext/date/lib/parse_date.re" /* * The MIT License (MIT) @@ -171,7 +171,14 @@ }; #if defined(_POSIX_TZNAME_MAX) -# define MAX_ABBR_LEN _POSIX_TZNAME_MAX +/* Solaris exposes _POSIX_TZNAME_MAX = 3 unless _XPG6 is defined. + * That is too small for real-world timezone abbreviations ("EDT", "CEST", ...). + */ +# if defined(__sun__) && _POSIX_TZNAME_MAX < 6 +# define MAX_ABBR_LEN 6 +# else +# define MAX_ABBR_LEN _POSIX_TZNAME_MAX +# endif #elif defined(TZNAME_MAX) # define MAX_ABBR_LEN TZNAME_MAX #else @@ -511,7 +518,7 @@ static void timelib_skip_day_suffix(const char **ptr) { - if (isspace(**ptr)) { + if (isspace((unsigned char)**ptr)) { return; } if (!timelib_strncasecmp(*ptr, "nd", 2) || !timelib_strncasecmp(*ptr, "rd", 2) ||!timelib_strncasecmp(*ptr, "st", 2) || !timelib_strncasecmp(*ptr, "th", 2)) { @@ -852,7 +859,7 @@ *tz_not_found = 1; - while (isdigit(**ptr) || **ptr == ':') { + while (isdigit((unsigned char)**ptr) || **ptr == ':') { ++*ptr; } end = *ptr; @@ -917,7 +924,7 @@ } ++*ptr; - while (isdigit(**ptr)) { + while (isdigit((unsigned char)**ptr)) { ++*ptr; } @@ -1021,11 +1028,11 @@ std: s->tok = cursor; s->len = 0; -#line 1154 "ext/date/lib/parse_date.re" +#line 1161 "ext/date/lib/parse_date.re" -#line 1029 "ext/date/lib/parse_date.c" +#line 1036 "ext/date/lib/parse_date.c" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -1206,23 +1213,23 @@ YYDEBUG(2, *YYCURSOR); ++YYCURSOR; YYDEBUG(3, *YYCURSOR); -#line 1987 "ext/date/lib/parse_date.re" +#line 1994 "ext/date/lib/parse_date.re" { s->pos = cursor; s->line++; goto std; } -#line 1215 "ext/date/lib/parse_date.c" +#line 1222 "ext/date/lib/parse_date.c" yy4: YYDEBUG(4, *YYCURSOR); ++YYCURSOR; yy5: YYDEBUG(5, *YYCURSOR); -#line 1993 "ext/date/lib/parse_date.re" +#line 2000 "ext/date/lib/parse_date.re" { add_error(s, TIMELIB_ERR_UNEXPECTED_CHARACTER, "Unexpected character"); goto std; } -#line 1226 "ext/date/lib/parse_date.c" +#line 1233 "ext/date/lib/parse_date.c" yy6: YYDEBUG(6, *YYCURSOR); yyaccept = 0; @@ -1237,11 +1244,11 @@ if (yych <= '9') goto yy58; yy8: YYDEBUG(8, *YYCURSOR); -#line 1982 "ext/date/lib/parse_date.re" +#line 1989 "ext/date/lib/parse_date.re" { goto std; } -#line 1245 "ext/date/lib/parse_date.c" +#line 1252 "ext/date/lib/parse_date.c" yy9: YYDEBUG(9, *YYCURSOR); yych = *++YYCURSOR; @@ -1275,11 +1282,11 @@ YYDEBUG(11, *YYCURSOR); ++YYCURSOR; YYDEBUG(12, *YYCURSOR); -#line 1977 "ext/date/lib/parse_date.re" +#line 1984 "ext/date/lib/parse_date.re" { goto std; } -#line 1283 "ext/date/lib/parse_date.c" +#line 1290 "ext/date/lib/parse_date.c" yy13: YYDEBUG(13, *YYCURSOR); yyaccept = 1; @@ -1780,7 +1787,7 @@ } yy20: YYDEBUG(20, *YYCURSOR); -#line 1892 "ext/date/lib/parse_date.re" +#line 1899 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("tzcorrection | tz"); @@ -1794,7 +1801,7 @@ TIMELIB_DEINIT; return TIMELIB_TIMEZONE; } -#line 1798 "ext/date/lib/parse_date.c" +#line 1805 "ext/date/lib/parse_date.c" yy21: YYDEBUG(21, *YYCURSOR); yych = *++YYCURSOR; @@ -3599,7 +3606,7 @@ } yy81: YYDEBUG(81, *YYCURSOR); -#line 1639 "ext/date/lib/parse_date.re" +#line 1646 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenoyearrev"); TIMELIB_INIT; @@ -3610,7 +3617,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 3614 "ext/date/lib/parse_date.c" +#line 3621 "ext/date/lib/parse_date.c" yy82: YYDEBUG(82, *YYCURSOR); yych = *++YYCURSOR; @@ -4125,7 +4132,7 @@ } if (yych == '.') goto yy289; YYDEBUG(114, *YYCURSOR); -#line 1214 "ext/date/lib/parse_date.re" +#line 1221 "ext/date/lib/parse_date.re" { timelib_ull i; @@ -4150,7 +4157,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 4154 "ext/date/lib/parse_date.c" +#line 4161 "ext/date/lib/parse_date.c" yy115: YYDEBUG(115, *YYCURSOR); ++YYCURSOR; @@ -5876,7 +5883,7 @@ } yy177: YYDEBUG(177, *YYCURSOR); -#line 1380 "ext/date/lib/parse_date.re" +#line 1387 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("timetiny24 | timeshort24 | timelong24 | iso8601long"); @@ -5903,7 +5910,7 @@ TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 5907 "ext/date/lib/parse_date.c" +#line 5914 "ext/date/lib/parse_date.c" yy178: YYDEBUG(178, *YYCURSOR); yyaccept = 4; @@ -6932,7 +6939,7 @@ } yy224: YYDEBUG(224, *YYCURSOR); -#line 1474 "ext/date/lib/parse_date.re" +#line 1481 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("americanshort | american"); @@ -6947,7 +6954,7 @@ TIMELIB_DEINIT; return TIMELIB_AMERICAN; } -#line 6951 "ext/date/lib/parse_date.c" +#line 6958 "ext/date/lib/parse_date.c" yy225: YYDEBUG(225, *YYCURSOR); yyaccept = 5; @@ -7190,7 +7197,7 @@ if (yych <= '9') goto yy431; yy251: YYDEBUG(251, *YYCURSOR); -#line 1556 "ext/date/lib/parse_date.re" +#line 1563 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datefull"); @@ -7204,7 +7211,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_FULL; } -#line 7208 "ext/date/lib/parse_date.c" +#line 7215 "ext/date/lib/parse_date.c" yy252: YYDEBUG(252, *YYCURSOR); yyaccept = 3; @@ -7318,7 +7325,7 @@ if (yych == 'e') goto yy440; yy260: YYDEBUG(260, *YYCURSOR); -#line 1961 "ext/date/lib/parse_date.re" +#line 1968 "ext/date/lib/parse_date.re" { timelib_ull i; DEBUG_OUTPUT("relative"); @@ -7333,7 +7340,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 7337 "ext/date/lib/parse_date.c" +#line 7344 "ext/date/lib/parse_date.c" yy261: YYDEBUG(261, *YYCURSOR); yych = *++YYCURSOR; @@ -7779,7 +7786,7 @@ if (yych <= '9') goto yy471; yy290: YYDEBUG(290, *YYCURSOR); -#line 1240 "ext/date/lib/parse_date.re" +#line 1247 "ext/date/lib/parse_date.re" { timelib_sll i; timelib_ull us; @@ -7818,7 +7825,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 7822 "ext/date/lib/parse_date.c" +#line 7829 "ext/date/lib/parse_date.c" yy291: YYDEBUG(291, *YYCURSOR); yych = *++YYCURSOR; @@ -7843,7 +7850,7 @@ } yy293: YYDEBUG(293, *YYCURSOR); -#line 1802 "ext/date/lib/parse_date.re" +#line 1809 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("ago"); TIMELIB_INIT; @@ -7863,7 +7870,7 @@ TIMELIB_DEINIT; return TIMELIB_AGO; } -#line 7867 "ext/date/lib/parse_date.c" +#line 7874 "ext/date/lib/parse_date.c" yy294: YYDEBUG(294, *YYCURSOR); yyaccept = 7; @@ -7902,7 +7909,7 @@ } yy295: YYDEBUG(295, *YYCURSOR); -#line 1882 "ext/date/lib/parse_date.re" +#line 1889 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("monthtext"); TIMELIB_INIT; @@ -7911,7 +7918,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 7915 "ext/date/lib/parse_date.c" +#line 7922 "ext/date/lib/parse_date.c" yy296: YYDEBUG(296, *YYCURSOR); yyaccept = 7; @@ -8486,7 +8493,7 @@ } yy315: YYDEBUG(315, *YYCURSOR); -#line 1823 "ext/date/lib/parse_date.re" +#line 1830 "ext/date/lib/parse_date.re" { const timelib_relunit* relunit; DEBUG_OUTPUT("daytext"); @@ -8503,7 +8510,7 @@ TIMELIB_DEINIT; return TIMELIB_WEEKDAY; } -#line 8507 "ext/date/lib/parse_date.c" +#line 8514 "ext/date/lib/parse_date.c" yy316: YYDEBUG(316, *YYCURSOR); yych = *++YYCURSOR; @@ -8771,7 +8778,7 @@ } yy325: YYDEBUG(325, *YYCURSOR); -#line 1625 "ext/date/lib/parse_date.re" +#line 1632 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datetextual | datenoyear"); @@ -8784,7 +8791,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 8788 "ext/date/lib/parse_date.c" +#line 8795 "ext/date/lib/parse_date.c" yy326: YYDEBUG(326, *YYCURSOR); yyaccept = 10; @@ -9478,7 +9485,7 @@ } yy351: YYDEBUG(351, *YYCURSOR); -#line 1171 "ext/date/lib/parse_date.re" +#line 1178 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("now"); TIMELIB_INIT; @@ -9486,7 +9493,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 9490 "ext/date/lib/parse_date.c" +#line 9497 "ext/date/lib/parse_date.c" yy352: YYDEBUG(352, *YYCURSOR); yyaccept = 2; @@ -10989,7 +10996,7 @@ } yy420: YYDEBUG(420, *YYCURSOR); -#line 1408 "ext/date/lib/parse_date.re" +#line 1415 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("gnunocolon"); TIMELIB_INIT; @@ -11011,7 +11018,7 @@ TIMELIB_DEINIT; return TIMELIB_GNU_NOCOLON; } -#line 11015 "ext/date/lib/parse_date.c" +#line 11022 "ext/date/lib/parse_date.c" yy421: YYDEBUG(421, *YYCURSOR); yyaccept = 13; @@ -11092,7 +11099,7 @@ } yy422: YYDEBUG(422, *YYCURSOR); -#line 1793 "ext/date/lib/parse_date.re" +#line 1800 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("year4"); TIMELIB_INIT; @@ -11100,7 +11107,7 @@ TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 11104 "ext/date/lib/parse_date.c" +#line 11111 "ext/date/lib/parse_date.c" yy423: YYDEBUG(423, *YYCURSOR); yyaccept = 3; @@ -11707,7 +11714,7 @@ YYDEBUG(456, *YYCURSOR); ++YYCURSOR; YYDEBUG(457, *YYCURSOR); -#line 1342 "ext/date/lib/parse_date.re" +#line 1349 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("timetiny12 | timeshort12 | timelong12"); TIMELIB_INIT; @@ -11724,7 +11731,7 @@ TIMELIB_DEINIT; return TIMELIB_TIME12; } -#line 11728 "ext/date/lib/parse_date.c" +#line 11735 "ext/date/lib/parse_date.c" yy458: YYDEBUG(458, *YYCURSOR); yych = *++YYCURSOR; @@ -13051,7 +13058,7 @@ } yy526: YYDEBUG(526, *YYCURSOR); -#line 1180 "ext/date/lib/parse_date.re" +#line 1187 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("noon"); TIMELIB_INIT; @@ -13062,7 +13069,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 13066 "ext/date/lib/parse_date.c" +#line 13073 "ext/date/lib/parse_date.c" yy527: YYDEBUG(527, *YYCURSOR); yyaccept = 2; @@ -14108,7 +14115,7 @@ } yy567: YYDEBUG(567, *YYCURSOR); -#line 1542 "ext/date/lib/parse_date.re" +#line 1549 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("gnudateshort"); @@ -14121,7 +14128,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 14125 "ext/date/lib/parse_date.c" +#line 14132 "ext/date/lib/parse_date.c" yy568: YYDEBUG(568, *YYCURSOR); yyaccept = 15; @@ -14572,7 +14579,7 @@ } yy600: YYDEBUG(600, *YYCURSOR); -#line 1611 "ext/date/lib/parse_date.re" +#line 1618 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datenodayrev"); @@ -14585,7 +14592,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 14589 "ext/date/lib/parse_date.c" +#line 14596 "ext/date/lib/parse_date.c" yy601: YYDEBUG(601, *YYCURSOR); yych = *++YYCURSOR; @@ -15960,7 +15967,7 @@ YYDEBUG(696, *YYCURSOR); ++YYCURSOR; YYDEBUG(697, *YYCURSOR); -#line 1597 "ext/date/lib/parse_date.re" +#line 1604 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datenoday"); @@ -15973,7 +15980,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 15977 "ext/date/lib/parse_date.c" +#line 15984 "ext/date/lib/parse_date.c" yy698: YYDEBUG(698, *YYCURSOR); yych = *++YYCURSOR; @@ -16534,7 +16541,7 @@ } yy722: YYDEBUG(722, *YYCURSOR); -#line 1192 "ext/date/lib/parse_date.re" +#line 1199 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("midnight | today"); TIMELIB_INIT; @@ -16543,7 +16550,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 16547 "ext/date/lib/parse_date.c" +#line 16554 "ext/date/lib/parse_date.c" yy723: YYDEBUG(723, *YYCURSOR); yych = *++YYCURSOR; @@ -16853,7 +16860,7 @@ if (yych <= '9') goto yy897; yy739: YYDEBUG(739, *YYCURSOR); -#line 1583 "ext/date/lib/parse_date.re" +#line 1590 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pointed date YY"); @@ -16866,7 +16873,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 16870 "ext/date/lib/parse_date.c" +#line 16877 "ext/date/lib/parse_date.c" yy740: YYDEBUG(740, *YYCURSOR); yyaccept = 15; @@ -16978,7 +16985,7 @@ } yy752: YYDEBUG(752, *YYCURSOR); -#line 1528 "ext/date/lib/parse_date.re" +#line 1535 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("gnudateshorter"); @@ -16991,7 +16998,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 16995 "ext/date/lib/parse_date.c" +#line 17002 "ext/date/lib/parse_date.c" yy753: YYDEBUG(753, *YYCURSOR); yyaccept = 18; @@ -17240,7 +17247,7 @@ } yy777: YYDEBUG(777, *YYCURSOR); -#line 1454 "ext/date/lib/parse_date.re" +#line 1461 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("iso8601nocolon"); @@ -17259,7 +17266,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_NOCOLON; } -#line 17263 "ext/date/lib/parse_date.c" +#line 17270 "ext/date/lib/parse_date.c" yy778: YYDEBUG(778, *YYCURSOR); yyaccept = 19; @@ -18487,7 +18494,7 @@ } yy849: YYDEBUG(849, *YYCURSOR); -#line 1931 "ext/date/lib/parse_date.re" +#line 1938 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz"); @@ -18516,7 +18523,7 @@ TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 18520 "ext/date/lib/parse_date.c" +#line 18527 "ext/date/lib/parse_date.c" yy850: YYDEBUG(850, *YYCURSOR); yyaccept = 20; @@ -19560,7 +19567,7 @@ } yy926: YYDEBUG(926, *YYCURSOR); -#line 1689 "ext/date/lib/parse_date.re" +#line 1696 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgydotd"); @@ -19573,7 +19580,7 @@ TIMELIB_DEINIT; return TIMELIB_PG_YEARDAY; } -#line 19577 "ext/date/lib/parse_date.c" +#line 19584 "ext/date/lib/parse_date.c" yy927: YYDEBUG(927, *YYCURSOR); yyaccept = 21; @@ -19827,7 +19834,7 @@ if (yych <= '7') goto yy1059; yy942: YYDEBUG(942, *YYCURSOR); -#line 1722 "ext/date/lib/parse_date.re" +#line 1729 "ext/date/lib/parse_date.re" { timelib_sll w, d; DEBUG_OUTPUT("isoweek"); @@ -19845,7 +19852,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 19849 "ext/date/lib/parse_date.c" +#line 19856 "ext/date/lib/parse_date.c" yy943: YYDEBUG(943, *YYCURSOR); yych = *++YYCURSOR; @@ -20321,7 +20328,7 @@ if (yych == 'e') goto yy1094; yy982: YYDEBUG(982, *YYCURSOR); -#line 1865 "ext/date/lib/parse_date.re" +#line 1872 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -20337,7 +20344,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 20341 "ext/date/lib/parse_date.c" +#line 20348 "ext/date/lib/parse_date.c" yy983: YYDEBUG(983, *YYCURSOR); yych = *++YYCURSOR; @@ -20684,7 +20691,7 @@ YYDEBUG(1020, *YYCURSOR); ++YYCURSOR; YYDEBUG(1021, *YYCURSOR); -#line 1571 "ext/date/lib/parse_date.re" +#line 1578 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("pointed date YYYY"); TIMELIB_INIT; @@ -20695,7 +20702,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 20699 "ext/date/lib/parse_date.c" +#line 20706 "ext/date/lib/parse_date.c" yy1022: YYDEBUG(1022, *YYCURSOR); ++YYCURSOR; @@ -20724,7 +20731,7 @@ } yy1025: YYDEBUG(1025, *YYCURSOR); -#line 1502 "ext/date/lib/parse_date.re" +#line 1509 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("iso8601date2"); @@ -20737,7 +20744,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 20741 "ext/date/lib/parse_date.c" +#line 20748 "ext/date/lib/parse_date.c" yy1026: YYDEBUG(1026, *YYCURSOR); yyaccept = 15; @@ -20957,7 +20964,7 @@ } yy1043: YYDEBUG(1043, *YYCURSOR); -#line 1490 "ext/date/lib/parse_date.re" +#line 1497 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("iso8601date4 | iso8601date2 | iso8601dateslash | dateslash"); TIMELIB_INIT; @@ -20968,7 +20975,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 20972 "ext/date/lib/parse_date.c" +#line 20979 "ext/date/lib/parse_date.c" yy1044: YYDEBUG(1044, *YYCURSOR); yyaccept = 26; @@ -21083,7 +21090,7 @@ } yy1048: YYDEBUG(1048, *YYCURSOR); -#line 1651 "ext/date/lib/parse_date.re" +#line 1658 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenocolon"); TIMELIB_INIT; @@ -21094,7 +21101,7 @@ TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 21098 "ext/date/lib/parse_date.c" +#line 21105 "ext/date/lib/parse_date.c" yy1049: YYDEBUG(1049, *YYCURSOR); yych = *++YYCURSOR; @@ -21164,7 +21171,7 @@ YYDEBUG(1059, *YYCURSOR); ++YYCURSOR; YYDEBUG(1060, *YYCURSOR); -#line 1703 "ext/date/lib/parse_date.re" +#line 1710 "ext/date/lib/parse_date.re" { timelib_sll w, d; DEBUG_OUTPUT("isoweekday"); @@ -21182,7 +21189,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 21186 "ext/date/lib/parse_date.c" +#line 21193 "ext/date/lib/parse_date.c" yy1061: YYDEBUG(1061, *YYCURSOR); yych = *++YYCURSOR; @@ -21245,7 +21252,7 @@ if (yych <= '9') goto yy1143; yy1070: YYDEBUG(1070, *YYCURSOR); -#line 1741 "ext/date/lib/parse_date.re" +#line 1748 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgtextshort"); @@ -21258,7 +21265,7 @@ TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 21262 "ext/date/lib/parse_date.c" +#line 21269 "ext/date/lib/parse_date.c" yy1071: YYDEBUG(1071, *YYCURSOR); yych = *++YYCURSOR; @@ -21731,7 +21738,7 @@ ++YYCURSOR; yy1107: YYDEBUG(1107, *YYCURSOR); -#line 1202 "ext/date/lib/parse_date.re" +#line 1209 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("tomorrow"); TIMELIB_INIT; @@ -21742,7 +21749,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 21746 "ext/date/lib/parse_date.c" +#line 21753 "ext/date/lib/parse_date.c" yy1108: YYDEBUG(1108, *YYCURSOR); yyaccept = 28; @@ -22079,7 +22086,7 @@ YYDEBUG(1140, *YYCURSOR); ++YYCURSOR; YYDEBUG(1141, *YYCURSOR); -#line 1755 "ext/date/lib/parse_date.re" +#line 1762 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgtextreverse"); @@ -22092,7 +22099,7 @@ TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 22096 "ext/date/lib/parse_date.c" +#line 22103 "ext/date/lib/parse_date.c" yy1142: YYDEBUG(1142, *YYCURSOR); ++YYCURSOR; @@ -22136,7 +22143,7 @@ } yy1145: YYDEBUG(1145, *YYCURSOR); -#line 1297 "ext/date/lib/parse_date.re" +#line 1304 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("backof | frontof"); TIMELIB_INIT; @@ -22158,7 +22165,7 @@ TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -#line 22162 "ext/date/lib/parse_date.c" +#line 22169 "ext/date/lib/parse_date.c" yy1146: YYDEBUG(1146, *YYCURSOR); yyaccept = 29; @@ -22482,7 +22489,7 @@ } yy1172: YYDEBUG(1172, *YYCURSOR); -#line 1841 "ext/date/lib/parse_date.re" +#line 1848 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -22505,7 +22512,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 22509 "ext/date/lib/parse_date.c" +#line 22516 "ext/date/lib/parse_date.c" yy1173: YYDEBUG(1173, *YYCURSOR); yych = *++YYCURSOR; @@ -22517,7 +22524,7 @@ ++YYCURSOR; yy1175: YYDEBUG(1175, *YYCURSOR); -#line 1159 "ext/date/lib/parse_date.re" +#line 1166 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("yesterday"); TIMELIB_INIT; @@ -22528,7 +22535,7 @@ TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 22532 "ext/date/lib/parse_date.c" +#line 22539 "ext/date/lib/parse_date.c" yy1176: YYDEBUG(1176, *YYCURSOR); yyaccept = 31; @@ -23021,7 +23028,7 @@ YYDEBUG(1222, *YYCURSOR); ++YYCURSOR; YYDEBUG(1223, *YYCURSOR); -#line 1907 "ext/date/lib/parse_date.re" +#line 1914 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("dateshortwithtimeshort12 | dateshortwithtimelong12"); TIMELIB_INIT; @@ -23044,7 +23051,7 @@ TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 23048 "ext/date/lib/parse_date.c" +#line 23055 "ext/date/lib/parse_date.c" yy1224: YYDEBUG(1224, *YYCURSOR); yych = *++YYCURSOR; @@ -23546,7 +23553,7 @@ YYDEBUG(1268, *YYCURSOR); ++YYCURSOR; YYDEBUG(1269, *YYCURSOR); -#line 1320 "ext/date/lib/parse_date.re" +#line 1327 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -23567,7 +23574,7 @@ TIMELIB_DEINIT; return TIMELIB_WEEK_DAY_OF_MONTH; } -#line 23571 "ext/date/lib/parse_date.c" +#line 23578 "ext/date/lib/parse_date.c" yy1270: YYDEBUG(1270, *YYCURSOR); yyaccept = 24; @@ -23614,7 +23621,7 @@ YYDEBUG(1273, *YYCURSOR); ++YYCURSOR; YYDEBUG(1274, *YYCURSOR); -#line 1280 "ext/date/lib/parse_date.re" +#line 1287 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("firstdayof | lastdayof"); TIMELIB_INIT; @@ -23630,12 +23637,12 @@ TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -#line 23634 "ext/date/lib/parse_date.c" +#line 23641 "ext/date/lib/parse_date.c" yy1275: YYDEBUG(1275, *YYCURSOR); ++YYCURSOR; YYDEBUG(1276, *YYCURSOR); -#line 1516 "ext/date/lib/parse_date.re" +#line 1523 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("iso8601datex"); TIMELIB_INIT; @@ -23646,7 +23653,7 @@ TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 23650 "ext/date/lib/parse_date.c" +#line 23657 "ext/date/lib/parse_date.c" yy1277: YYDEBUG(1277, *YYCURSOR); yych = *++YYCURSOR; @@ -23749,7 +23756,7 @@ YYDEBUG(1290, *YYCURSOR); ++YYCURSOR; YYDEBUG(1291, *YYCURSOR); -#line 1360 "ext/date/lib/parse_date.re" +#line 1367 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("mssqltime"); TIMELIB_INIT; @@ -23768,7 +23775,7 @@ TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 23772 "ext/date/lib/parse_date.c" +#line 23779 "ext/date/lib/parse_date.c" yy1292: YYDEBUG(1292, *YYCURSOR); yych = *++YYCURSOR; @@ -24192,7 +24199,7 @@ if (yych <= '9') goto yy1331; yy1329: YYDEBUG(1329, *YYCURSOR); -#line 1663 "ext/date/lib/parse_date.re" +#line 1670 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("xmlrpc | xmlrpcnocolon | soap | wddx | exif"); @@ -24217,7 +24224,7 @@ TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 24221 "ext/date/lib/parse_date.c" +#line 24228 "ext/date/lib/parse_date.c" yy1330: YYDEBUG(1330, *YYCURSOR); yych = *++YYCURSOR; @@ -24587,7 +24594,7 @@ if (yych <= ':') goto yy1383; yy1375: YYDEBUG(1375, *YYCURSOR); -#line 1769 "ext/date/lib/parse_date.re" +#line 1776 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("clf"); @@ -24610,7 +24617,7 @@ TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 24614 "ext/date/lib/parse_date.c" +#line 24621 "ext/date/lib/parse_date.c" yy1376: YYDEBUG(1376, *YYCURSOR); yyaccept = 33; @@ -24842,7 +24849,7 @@ if (yych == ':') goto yy1286; goto yy1329; } -#line 1997 "ext/date/lib/parse_date.re" +#line 2004 "ext/date/lib/parse_date.re" } @@ -24863,10 +24870,10 @@ in.errors->error_messages = NULL; if (len > 0) { - while (isspace(*s) && s < e) { + while (isspace((unsigned char)*s) && s < e) { s++; } - while (isspace(*e) && e > s) { + while (isspace((unsigned char)*e) && e > s) { e--; } } diff -Nru php8.4-8.4.16/ext/date/lib/parse_date.re php8.4-8.4.21/ext/date/lib/parse_date.re --- php8.4-8.4.16/ext/date/lib/parse_date.re 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/date/lib/parse_date.re 2026-05-05 16:34:12.000000000 +0000 @@ -169,7 +169,14 @@ }; #if defined(_POSIX_TZNAME_MAX) -# define MAX_ABBR_LEN _POSIX_TZNAME_MAX +/* Solaris exposes _POSIX_TZNAME_MAX = 3 unless _XPG6 is defined. + * That is too small for real-world timezone abbreviations ("EDT", "CEST", ...). + */ +# if defined(__sun__) && _POSIX_TZNAME_MAX < 6 +# define MAX_ABBR_LEN 6 +# else +# define MAX_ABBR_LEN _POSIX_TZNAME_MAX +# endif #elif defined(TZNAME_MAX) # define MAX_ABBR_LEN TZNAME_MAX #else @@ -509,7 +516,7 @@ static void timelib_skip_day_suffix(const char **ptr) { - if (isspace(**ptr)) { + if (isspace((unsigned char)**ptr)) { return; } if (!timelib_strncasecmp(*ptr, "nd", 2) || !timelib_strncasecmp(*ptr, "rd", 2) ||!timelib_strncasecmp(*ptr, "st", 2) || !timelib_strncasecmp(*ptr, "th", 2)) { @@ -850,7 +857,7 @@ *tz_not_found = 1; - while (isdigit(**ptr) || **ptr == ':') { + while (isdigit((unsigned char)**ptr) || **ptr == ':') { ++*ptr; } end = *ptr; @@ -915,7 +922,7 @@ } ++*ptr; - while (isdigit(**ptr)) { + while (isdigit((unsigned char)**ptr)) { ++*ptr; } @@ -2013,10 +2020,10 @@ in.errors->error_messages = NULL; if (len > 0) { - while (isspace(*s) && s < e) { + while (isspace((unsigned char)*s) && s < e) { s++; } - while (isspace(*e) && e > s) { + while (isspace((unsigned char)*e) && e > s) { e--; } } diff -Nru php8.4-8.4.16/ext/date/lib/parse_iso_intervals.c php8.4-8.4.21/ext/date/lib/parse_iso_intervals.c --- php8.4-8.4.16/ext/date/lib/parse_iso_intervals.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/date/lib/parse_iso_intervals.c 2026-05-05 16:34:12.000000000 +0000 @@ -985,10 +985,10 @@ in.errors->error_messages = NULL; if (len > 0) { - while (isspace(*s) && s < e) { + while (isspace((unsigned char)*s) && s < e) { s++; } - while (isspace(*e) && e > s) { + while (isspace((unsigned char)*e) && e > s) { e--; } } diff -Nru php8.4-8.4.16/ext/date/lib/parse_iso_intervals.re php8.4-8.4.21/ext/date/lib/parse_iso_intervals.re --- php8.4-8.4.16/ext/date/lib/parse_iso_intervals.re 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/date/lib/parse_iso_intervals.re 2026-05-05 16:34:12.000000000 +0000 @@ -343,10 +343,10 @@ in.errors->error_messages = NULL; if (len > 0) { - while (isspace(*s) && s < e) { + while (isspace((unsigned char)*s) && s < e) { s++; } - while (isspace(*e) && e > s) { + while (isspace((unsigned char)*e) && e > s) { e--; } } diff -Nru php8.4-8.4.16/ext/date/lib/timelib.c php8.4-8.4.21/ext/date/lib/timelib.c --- php8.4-8.4.16/ext/date/lib/timelib.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/date/lib/timelib.c 2026-05-05 16:34:12.000000000 +0000 @@ -126,7 +126,7 @@ TIMELIB_TIME_FREE(tm->tz_abbr); tm->tz_abbr = timelib_strdup(tz_abbr); for (i = 0; i < tz_abbr_len; i++) { - tm->tz_abbr[i] = toupper(tz_abbr[i]); + tm->tz_abbr[i] = toupper((unsigned char)tz_abbr[i]); } } diff -Nru php8.4-8.4.16/ext/date/lib/timelib.h php8.4-8.4.21/ext/date/lib/timelib.h --- php8.4-8.4.16/ext/date/lib/timelib.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/date/lib/timelib.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 2015-2025 Derick Rethans + * Copyright (c) 2015-2026 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 202214 -#define TIMELIB_EXTENDED_VERSION 20221401 -#define TIMELIB_ASCII_VERSION "2022.14" +#define TIMELIB_VERSION 202215 +#define TIMELIB_EXTENDED_VERSION 20221501 +#define TIMELIB_ASCII_VERSION "2022.15" #include #include diff -Nru php8.4-8.4.16/ext/date/lib/timezonedb.h php8.4-8.4.21/ext/date/lib/timezonedb.h --- php8.4-8.4.16/ext/date/lib/timezonedb.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/date/lib/timezonedb.h 2026-05-05 16:34:12.000000000 +0000 @@ -118,495 +118,495 @@ { (char*) "America/Eirunepe" , 0x00D1FE }, { (char*) "America/El_Salvador" , 0x00D3CD }, { (char*) "America/Ensenada" , 0x00D489 }, - { (char*) "America/Fort_Nelson" , 0x00D8CC }, - { (char*) "America/Fort_Wayne" , 0x00DE94 }, - { (char*) "America/Fortaleza" , 0x00E0B3 }, - { (char*) "America/Glace_Bay" , 0x00E2C9 }, - { (char*) "America/Godthab" , 0x00E660 }, - { (char*) "America/Goose_Bay" , 0x00EA31 }, - { (char*) "America/Grand_Turk" , 0x00F089 }, - { (char*) "America/Grenada" , 0x00F3EA }, - { (char*) "America/Guadeloupe" , 0x00F478 }, - { (char*) "America/Guatemala" , 0x00F506 }, - { (char*) "America/Guayaquil" , 0x00F5E6 }, - { (char*) "America/Guyana" , 0x00F6B7 }, - { (char*) "America/Halifax" , 0x00F778 }, - { (char*) "America/Havana" , 0x00FE2A }, - { (char*) "America/Hermosillo" , 0x010293 }, - { (char*) "America/Indiana/Indianapolis" , 0x0103A7 }, - { (char*) "America/Indiana/Knox" , 0x0105DF }, - { (char*) "America/Indiana/Marengo" , 0x0109F8 }, - { (char*) "America/Indiana/Petersburg" , 0x010C52 }, - { (char*) "America/Indiana/Tell_City" , 0x010F1C }, - { (char*) "America/Indiana/Vevay" , 0x011146 }, - { (char*) "America/Indiana/Vincennes" , 0x0112DD }, - { (char*) "America/Indiana/Winamac" , 0x011533 }, - { (char*) "America/Indianapolis" , 0x0117B0 }, - { (char*) "America/Inuvik" , 0x0119CF }, - { (char*) "America/Iqaluit" , 0x011D20 }, - { (char*) "America/Jamaica" , 0x01209C }, - { (char*) "America/Jujuy" , 0x0121FB }, - { (char*) "America/Juneau" , 0x0124B9 }, - { (char*) "America/Kentucky/Louisville" , 0x01289F }, - { (char*) "America/Kentucky/Monticello" , 0x012DA3 }, - { (char*) "America/Knox_IN" , 0x01318F }, - { (char*) "America/Kralendijk" , 0x013593 }, - { (char*) "America/La_Paz" , 0x013650 }, - { (char*) "America/Lima" , 0x013706 }, - { (char*) "America/Los_Angeles" , 0x01382D }, - { (char*) "America/Louisville" , 0x013D4E }, - { (char*) "America/Lower_Princes" , 0x014234 }, - { (char*) "America/Maceio" , 0x0142F1 }, - { (char*) "America/Managua" , 0x014503 }, - { (char*) "America/Manaus" , 0x014636 }, - { (char*) "America/Marigot" , 0x0147ED }, - { (char*) "America/Martinique" , 0x0148AA }, - { (char*) "America/Matamoros" , 0x014968 }, - { (char*) "America/Mazatlan" , 0x014B55 }, - { (char*) "America/Mendoza" , 0x014E45 }, - { (char*) "America/Menominee" , 0x015115 }, - { (char*) "America/Merida" , 0x0154D5 }, - { (char*) "America/Metlakatla" , 0x015780 }, - { (char*) "America/Mexico_City" , 0x0159ED }, - { (char*) "America/Miquelon" , 0x015D0C }, - { (char*) "America/Moncton" , 0x015F3E }, - { (char*) "America/Monterrey" , 0x016537 }, - { (char*) "America/Montevideo" , 0x01683E }, - { (char*) "America/Montreal" , 0x016C13 }, - { (char*) "America/Montserrat" , 0x0172D4 }, - { (char*) "America/Nassau" , 0x017362 }, - { (char*) "America/New_York" , 0x01775C }, - { (char*) "America/Nipigon" , 0x017E4C }, - { (char*) "America/Nome" , 0x01850D }, - { (char*) "America/Noronha" , 0x0188F5 }, - { (char*) "America/North_Dakota/Beulah" , 0x018AF5 }, - { (char*) "America/North_Dakota/Center" , 0x018F29 }, - { (char*) "America/North_Dakota/New_Salem" , 0x019328 }, - { (char*) "America/Nuuk" , 0x01972D }, - { (char*) "America/Ojinaga" , 0x019B0F }, - { (char*) "America/Panama" , 0x019E05 }, - { (char*) "America/Pangnirtung" , 0x019EA6 }, - { (char*) "America/Paramaribo" , 0x01A209 }, - { (char*) "America/Phoenix" , 0x01A2D0 }, - { (char*) "America/Port-au-Prince" , 0x01A3E4 }, - { (char*) "America/Port_of_Spain" , 0x01A625 }, - { (char*) "America/Porto_Acre" , 0x01A6B3 }, - { (char*) "America/Porto_Velho" , 0x01A861 }, - { (char*) "America/Puerto_Rico" , 0x01A9FF }, - { (char*) "America/Punta_Arenas" , 0x01AABC }, - { (char*) "America/Rainy_River" , 0x01AF9B }, - { (char*) "America/Rankin_Inlet" , 0x01B4B5 }, - { (char*) "America/Recife" , 0x01B7FE }, - { (char*) "America/Regina" , 0x01B9F8 }, - { (char*) "America/Resolute" , 0x01BC97 }, - { (char*) "America/Rio_Branco" , 0x01BFE1 }, - { (char*) "America/Rosario" , 0x01C193 }, - { (char*) "America/Santa_Isabel" , 0x01C463 }, - { (char*) "America/Santarem" , 0x01C8A6 }, - { (char*) "America/Santiago" , 0x01CA56 }, - { (char*) "America/Santo_Domingo" , 0x01CFB9 }, - { (char*) "America/Sao_Paulo" , 0x01D102 }, - { (char*) "America/Scoresbysund" , 0x01D4FC }, - { (char*) "America/Shiprock" , 0x01D8FD }, - { (char*) "America/Sitka" , 0x01DD1B }, - { (char*) "America/St_Barthelemy" , 0x01E0F6 }, - { (char*) "America/St_Johns" , 0x01E1B3 }, - { (char*) "America/St_Kitts" , 0x01E930 }, - { (char*) "America/St_Lucia" , 0x01E9BE }, - { (char*) "America/St_Thomas" , 0x01EA5F }, - { (char*) "America/St_Vincent" , 0x01EAED }, - { (char*) "America/Swift_Current" , 0x01EB8E }, - { (char*) "America/Tegucigalpa" , 0x01ED1C }, - { (char*) "America/Thule" , 0x01EDEA }, - { (char*) "America/Thunder_Bay" , 0x01EFCB }, - { (char*) "America/Tijuana" , 0x01F68C }, - { (char*) "America/Toronto" , 0x01FADE }, - { (char*) "America/Tortola" , 0x0201BD }, - { (char*) "America/Vancouver" , 0x02024B }, - { (char*) "America/Virgin" , 0x0207A2 }, - { (char*) "America/Whitehorse" , 0x02085F }, - { (char*) "America/Winnipeg" , 0x020C82 }, - { (char*) "America/Yakutat" , 0x0211B9 }, - { (char*) "America/Yellowknife" , 0x021587 }, - { (char*) "Antarctica/Casey" , 0x02195D }, - { (char*) "Antarctica/Davis" , 0x021A8D }, - { (char*) "Antarctica/DumontDUrville" , 0x021B63 }, - { (char*) "Antarctica/Macquarie" , 0x021C17 }, - { (char*) "Antarctica/Mawson" , 0x022003 }, - { (char*) "Antarctica/McMurdo" , 0x0220AD }, - { (char*) "Antarctica/Palmer" , 0x0223DF }, - { (char*) "Antarctica/Rothera" , 0x022768 }, - { (char*) "Antarctica/South_Pole" , 0x0227FF }, - { (char*) "Antarctica/Syowa" , 0x022C1E }, - { (char*) "Antarctica/Troll" , 0x022CB4 }, - { (char*) "Antarctica/Vostok" , 0x022D63 }, - { (char*) "Arctic/Longyearbyen" , 0x022E1F }, - { (char*) "Asia/Aden" , 0x0230EC }, - { (char*) "Asia/Almaty" , 0x02317D }, - { (char*) "Asia/Amman" , 0x023405 }, - { (char*) "Asia/Anadyr" , 0x0237B1 }, - { (char*) "Asia/Aqtau" , 0x023AB7 }, - { (char*) "Asia/Aqtobe" , 0x023D36 }, - { (char*) "Asia/Ashgabat" , 0x023FB6 }, - { (char*) "Asia/Ashkhabad" , 0x024139 }, - { (char*) "Asia/Atyrau" , 0x0242BC }, - { (char*) "Asia/Baghdad" , 0x024545 }, - { (char*) "Asia/Bahrain" , 0x0247C7 }, - { (char*) "Asia/Baku" , 0x024880 }, - { (char*) "Asia/Bangkok" , 0x024B74 }, - { (char*) "Asia/Barnaul" , 0x024C18 }, - { (char*) "Asia/Beirut" , 0x024F23 }, - { (char*) "Asia/Bishkek" , 0x02520B }, - { (char*) "Asia/Brunei" , 0x025481 }, - { (char*) "Asia/Calcutta" , 0x025527 }, - { (char*) "Asia/Chita" , 0x02560F }, - { (char*) "Asia/Choibalsan" , 0x02591D }, - { (char*) "Asia/Chongqing" , 0x025B7B }, - { (char*) "Asia/Chungking" , 0x025D10 }, - { (char*) "Asia/Colombo" , 0x025EA5 }, - { (char*) "Asia/Dacca" , 0x025FA8 }, - { (char*) "Asia/Damascus" , 0x02609B }, - { (char*) "Asia/Dhaka" , 0x026579 }, - { (char*) "Asia/Dili" , 0x02666C }, - { (char*) "Asia/Dubai" , 0x026722 }, - { (char*) "Asia/Dushanbe" , 0x0267B3 }, - { (char*) "Asia/Famagusta" , 0x02692D }, - { (char*) "Asia/Gaza" , 0x026CF4 }, - { (char*) "Asia/Harbin" , 0x027890 }, - { (char*) "Asia/Hebron" , 0x027A25 }, - { (char*) "Asia/Ho_Chi_Minh" , 0x0285D2 }, - { (char*) "Asia/Hong_Kong" , 0x0286CA }, - { (char*) "Asia/Hovd" , 0x0289DD }, - { (char*) "Asia/Irkutsk" , 0x028C51 }, - { (char*) "Asia/Istanbul" , 0x028F6F }, - { (char*) "Asia/Jakarta" , 0x02942B }, - { (char*) "Asia/Jayapura" , 0x02953C }, - { (char*) "Asia/Jerusalem" , 0x029629 }, - { (char*) "Asia/Kabul" , 0x029A67 }, - { (char*) "Asia/Kamchatka" , 0x029B12 }, - { (char*) "Asia/Karachi" , 0x029E07 }, - { (char*) "Asia/Kashgar" , 0x029F1D }, - { (char*) "Asia/Kathmandu" , 0x029FAE }, - { (char*) "Asia/Katmandu" , 0x02A05B }, - { (char*) "Asia/Khandyga" , 0x02A108 }, - { (char*) "Asia/Kolkata" , 0x02A439 }, - { (char*) "Asia/Krasnoyarsk" , 0x02A521 }, - { (char*) "Asia/Kuala_Lumpur" , 0x02A82B }, - { (char*) "Asia/Kuching" , 0x02A94B }, - { (char*) "Asia/Kuwait" , 0x02AAA5 }, - { (char*) "Asia/Macao" , 0x02AB36 }, - { (char*) "Asia/Macau" , 0x02AE59 }, - { (char*) "Asia/Magadan" , 0x02B17C }, - { (char*) "Asia/Makassar" , 0x02B487 }, - { (char*) "Asia/Manila" , 0x02B59A }, - { (char*) "Asia/Muscat" , 0x02B6B8 }, - { (char*) "Asia/Nicosia" , 0x02B749 }, - { (char*) "Asia/Novokuznetsk" , 0x02B9B8 }, - { (char*) "Asia/Novosibirsk" , 0x02BCAB }, - { (char*) "Asia/Omsk" , 0x02BFBC }, - { (char*) "Asia/Oral" , 0x02C2BA }, - { (char*) "Asia/Phnom_Penh" , 0x02C546 }, - { (char*) "Asia/Pontianak" , 0x02C61A }, - { (char*) "Asia/Pyongyang" , 0x02C733 }, - { (char*) "Asia/Qatar" , 0x02C7F6 }, - { (char*) "Asia/Qostanay" , 0x02C89A }, - { (char*) "Asia/Qyzylorda" , 0x02CB30 }, - { (char*) "Asia/Rangoon" , 0x02CDC9 }, - { (char*) "Asia/Riyadh" , 0x02CE90 }, - { (char*) "Asia/Saigon" , 0x02CF21 }, - { (char*) "Asia/Sakhalin" , 0x02D019 }, - { (char*) "Asia/Samarkand" , 0x02D330 }, - { (char*) "Asia/Seoul" , 0x02D4BB }, - { (char*) "Asia/Shanghai" , 0x02D666 }, - { (char*) "Asia/Singapore" , 0x02D807 }, - { (char*) "Asia/Srednekolymsk" , 0x02D913 }, - { (char*) "Asia/Taipei" , 0x02DC23 }, - { (char*) "Asia/Tashkent" , 0x02DE2E }, - { (char*) "Asia/Tbilisi" , 0x02DFB9 }, - { (char*) "Asia/Tehran" , 0x02E23A }, - { (char*) "Asia/Tel_Aviv" , 0x02E572 }, - { (char*) "Asia/Thimbu" , 0x02E9B0 }, - { (char*) "Asia/Thimphu" , 0x02EA56 }, - { (char*) "Asia/Tokyo" , 0x02EAFC }, - { (char*) "Asia/Tomsk" , 0x02EBDD }, - { (char*) "Asia/Ujung_Pandang" , 0x02EEE8 }, - { (char*) "Asia/Ulaanbaatar" , 0x02EFB2 }, - { (char*) "Asia/Ulan_Bator" , 0x02F220 }, - { (char*) "Asia/Urumqi" , 0x02F47E }, - { (char*) "Asia/Ust-Nera" , 0x02F51C }, - { (char*) "Asia/Vientiane" , 0x02F83F }, - { (char*) "Asia/Vladivostok" , 0x02F925 }, - { (char*) "Asia/Yakutsk" , 0x02FC2A }, - { (char*) "Asia/Yangon" , 0x02FF2E }, - { (char*) "Asia/Yekaterinburg" , 0x02FFF5 }, - { (char*) "Asia/Yerevan" , 0x030307 }, - { (char*) "Atlantic/Azores" , 0x0305D7 }, - { (char*) "Atlantic/Bermuda" , 0x030B62 }, - { (char*) "Atlantic/Canary" , 0x030F6E }, - { (char*) "Atlantic/Cape_Verde" , 0x031166 }, - { (char*) "Atlantic/Faeroe" , 0x031221 }, - { (char*) "Atlantic/Faroe" , 0x0313E6 }, - { (char*) "Atlantic/Jan_Mayen" , 0x0315AB }, - { (char*) "Atlantic/Madeira" , 0x031878 }, - { (char*) "Atlantic/Reykjavik" , 0x031DEF }, - { (char*) "Atlantic/South_Georgia" , 0x0320EC }, - { (char*) "Atlantic/St_Helena" , 0x03217C }, - { (char*) "Atlantic/Stanley" , 0x03221D }, - { (char*) "Australia/ACT" , 0x03253E }, - { (char*) "Australia/Adelaide" , 0x0328D2 }, - { (char*) "Australia/Brisbane" , 0x032C86 }, - { (char*) "Australia/Broken_Hill" , 0x032DCA }, - { (char*) "Australia/Canberra" , 0x03319F }, - { (char*) "Australia/Currie" , 0x033533 }, - { (char*) "Australia/Darwin" , 0x03392A }, - { (char*) "Australia/Eucla" , 0x033A32 }, - { (char*) "Australia/Hobart" , 0x033B91 }, - { (char*) "Australia/LHI" , 0x033F90 }, - { (char*) "Australia/Lindeman" , 0x034250 }, - { (char*) "Australia/Lord_Howe" , 0x0343C0 }, - { (char*) "Australia/Melbourne" , 0x034690 }, - { (char*) "Australia/North" , 0x034A2C }, - { (char*) "Australia/NSW" , 0x034B22 }, - { (char*) "Australia/Perth" , 0x034EB6 }, - { (char*) "Australia/Queensland" , 0x035012 }, - { (char*) "Australia/South" , 0x03513F }, - { (char*) "Australia/Sydney" , 0x0354E4 }, - { (char*) "Australia/Tasmania" , 0x035894 }, - { (char*) "Australia/Victoria" , 0x035C8B }, - { (char*) "Australia/West" , 0x03601F }, - { (char*) "Australia/Yancowinna" , 0x03615D }, - { (char*) "Brazil/Acre" , 0x036516 }, - { (char*) "Brazil/DeNoronha" , 0x0366C4 }, - { (char*) "Brazil/East" , 0x0368B4 }, - { (char*) "Brazil/West" , 0x036C78 }, - { (char*) "Canada/Atlantic" , 0x036E20 }, - { (char*) "Canada/Central" , 0x0374B4 }, - { (char*) "Canada/Eastern" , 0x0379CE }, - { (char*) "Canada/Mountain" , 0x03808F }, - { (char*) "Canada/Newfoundland" , 0x038465 }, - { (char*) "Canada/Pacific" , 0x038BC7 }, - { (char*) "Canada/Saskatchewan" , 0x039105 }, - { (char*) "Canada/Yukon" , 0x03938F }, - { (char*) "CET" , 0x0397A0 }, - { (char*) "Chile/Continental" , 0x039BFB }, - { (char*) "Chile/EasterIsland" , 0x03A151 }, - { (char*) "CST6CDT" , 0x03A5F3 }, - { (char*) "Cuba" , 0x03ACD9 }, - { (char*) "EET" , 0x03B142 }, - { (char*) "Egypt" , 0x03B3F8 }, - { (char*) "Eire" , 0x03B921 }, - { (char*) "EST" , 0x03BF05 }, - { (char*) "EST5EDT" , 0x03BFA6 }, - { (char*) "Etc/GMT" , 0x03C682 }, - { (char*) "Etc/GMT+0" , 0x03C6FD }, - { (char*) "Etc/GMT+1" , 0x03C778 }, - { (char*) "Etc/GMT+10" , 0x03C7F5 }, - { (char*) "Etc/GMT+11" , 0x03C873 }, - { (char*) "Etc/GMT+12" , 0x03C8F1 }, - { (char*) "Etc/GMT+2" , 0x03C96F }, - { (char*) "Etc/GMT+3" , 0x03C9EC }, - { (char*) "Etc/GMT+4" , 0x03CA69 }, - { (char*) "Etc/GMT+5" , 0x03CAE6 }, - { (char*) "Etc/GMT+6" , 0x03CB63 }, - { (char*) "Etc/GMT+7" , 0x03CBE0 }, - { (char*) "Etc/GMT+8" , 0x03CC5D }, - { (char*) "Etc/GMT+9" , 0x03CCDA }, - { (char*) "Etc/GMT-0" , 0x03CD57 }, - { (char*) "Etc/GMT-1" , 0x03CDD2 }, - { (char*) "Etc/GMT-10" , 0x03CE50 }, - { (char*) "Etc/GMT-11" , 0x03CECF }, - { (char*) "Etc/GMT-12" , 0x03CF4E }, - { (char*) "Etc/GMT-13" , 0x03CFCD }, - { (char*) "Etc/GMT-14" , 0x03D04C }, - { (char*) "Etc/GMT-2" , 0x03D0CB }, - { (char*) "Etc/GMT-3" , 0x03D149 }, - { (char*) "Etc/GMT-4" , 0x03D1C7 }, - { (char*) "Etc/GMT-5" , 0x03D245 }, - { (char*) "Etc/GMT-6" , 0x03D2C3 }, - { (char*) "Etc/GMT-7" , 0x03D341 }, - { (char*) "Etc/GMT-8" , 0x03D3BF }, - { (char*) "Etc/GMT-9" , 0x03D43D }, - { (char*) "Etc/GMT0" , 0x03D4BB }, - { (char*) "Etc/Greenwich" , 0x03D536 }, - { (char*) "Etc/UCT" , 0x03D5B1 }, - { (char*) "Etc/Universal" , 0x03D62C }, - { (char*) "Etc/UTC" , 0x03D6A7 }, - { (char*) "Etc/Zulu" , 0x03D722 }, - { (char*) "Europe/Amsterdam" , 0x03D79D }, - { (char*) "Europe/Andorra" , 0x03DBD8 }, - { (char*) "Europe/Astrakhan" , 0x03DD69 }, - { (char*) "Europe/Athens" , 0x03E05D }, - { (char*) "Europe/Belfast" , 0x03E313 }, - { (char*) "Europe/Belgrade" , 0x03E95E }, - { (char*) "Europe/Berlin" , 0x03EB48 }, - { (char*) "Europe/Bratislava" , 0x03EE24 }, - { (char*) "Europe/Brussels" , 0x03F103 }, - { (char*) "Europe/Bucharest" , 0x03F55E }, - { (char*) "Europe/Budapest" , 0x03F7FF }, - { (char*) "Europe/Busingen" , 0x03FB09 }, - { (char*) "Europe/Chisinau" , 0x03FD0E }, - { (char*) "Europe/Copenhagen" , 0x04000D }, - { (char*) "Europe/Dublin" , 0x040288 }, - { (char*) "Europe/Gibraltar" , 0x04086C }, - { (char*) "Europe/Guernsey" , 0x040D3C }, - { (char*) "Europe/Helsinki" , 0x041393 }, - { (char*) "Europe/Isle_of_Man" , 0x041580 }, - { (char*) "Europe/Istanbul" , 0x041BCB }, - { (char*) "Europe/Jersey" , 0x042087 }, - { (char*) "Europe/Kaliningrad" , 0x0426DE }, - { (char*) "Europe/Kiev" , 0x042A86 }, - { (char*) "Europe/Kirov" , 0x042CC0 }, - { (char*) "Europe/Kyiv" , 0x042FB9 }, - { (char*) "Europe/Lisbon" , 0x043202 }, - { (char*) "Europe/Ljubljana" , 0x0437D8 }, - { (char*) "Europe/London" , 0x0439C2 }, - { (char*) "Europe/Luxembourg" , 0x04400D }, - { (char*) "Europe/Madrid" , 0x044458 }, - { (char*) "Europe/Malta" , 0x0447F5 }, - { (char*) "Europe/Mariehamn" , 0x044BA1 }, - { (char*) "Europe/Minsk" , 0x044D8E }, - { (char*) "Europe/Monaco" , 0x0450C2 }, - { (char*) "Europe/Moscow" , 0x045528 }, - { (char*) "Europe/Nicosia" , 0x0458D4 }, - { (char*) "Europe/Oslo" , 0x045B35 }, - { (char*) "Europe/Paris" , 0x045DE5 }, - { (char*) "Europe/Podgorica" , 0x046242 }, - { (char*) "Europe/Prague" , 0x04642C }, - { (char*) "Europe/Riga" , 0x04670B }, - { (char*) "Europe/Rome" , 0x0469CD }, - { (char*) "Europe/Samara" , 0x046D8C }, - { (char*) "Europe/San_Marino" , 0x04708D }, - { (char*) "Europe/Sarajevo" , 0x04744C }, - { (char*) "Europe/Saratov" , 0x047636 }, - { (char*) "Europe/Simferopol" , 0x047928 }, - { (char*) "Europe/Skopje" , 0x047C9B }, - { (char*) "Europe/Sofia" , 0x047E85 }, - { (char*) "Europe/Stockholm" , 0x0480E1 }, - { (char*) "Europe/Tallinn" , 0x0482DE }, - { (char*) "Europe/Tirane" , 0x04858D }, - { (char*) "Europe/Tiraspol" , 0x0487F5 }, - { (char*) "Europe/Ulyanovsk" , 0x048AF4 }, - { (char*) "Europe/Uzhgorod" , 0x048E0A }, - { (char*) "Europe/Vaduz" , 0x049044 }, - { (char*) "Europe/Vatican" , 0x04922E }, - { (char*) "Europe/Vienna" , 0x0495ED }, - { (char*) "Europe/Vilnius" , 0x04988B }, - { (char*) "Europe/Volgograd" , 0x049B3B }, - { (char*) "Europe/Warsaw" , 0x049E4A }, - { (char*) "Europe/Zagreb" , 0x04A1F1 }, - { (char*) "Europe/Zaporozhye" , 0x04A3DB }, - { (char*) "Europe/Zurich" , 0x04A615 }, - { (char*) "Factory" , 0x04A812 }, - { (char*) "GB" , 0x04A88F }, - { (char*) "GB-Eire" , 0x04AEDA }, - { (char*) "GMT" , 0x04B525 }, - { (char*) "GMT+0" , 0x04B5A0 }, - { (char*) "GMT-0" , 0x04B61B }, - { (char*) "GMT0" , 0x04B696 }, - { (char*) "Greenwich" , 0x04B711 }, - { (char*) "Hongkong" , 0x04B78C }, - { (char*) "HST" , 0x04BA9F }, - { (char*) "Iceland" , 0x04BB88 }, - { (char*) "Indian/Antananarivo" , 0x04BC16 }, - { (char*) "Indian/Chagos" , 0x04BCC2 }, - { (char*) "Indian/Christmas" , 0x04BD66 }, - { (char*) "Indian/Cocos" , 0x04BDF7 }, - { (char*) "Indian/Comoro" , 0x04BE8F }, - { (char*) "Indian/Kerguelen" , 0x04BF1E }, - { (char*) "Indian/Mahe" , 0x04BFAF }, - { (char*) "Indian/Maldives" , 0x04C040 }, - { (char*) "Indian/Mauritius" , 0x04C0E4 }, - { (char*) "Indian/Mayotte" , 0x04C1A3 }, - { (char*) "Indian/Reunion" , 0x04C232 }, - { (char*) "Iran" , 0x04C2C3 }, - { (char*) "Israel" , 0x04C5FB }, - { (char*) "Jamaica" , 0x04CA39 }, - { (char*) "Japan" , 0x04CB98 }, - { (char*) "Kwajalein" , 0x04CC79 }, - { (char*) "Libya" , 0x04CD60 }, - { (char*) "MET" , 0x04CF1B }, - { (char*) "Mexico/BajaNorte" , 0x04D376 }, - { (char*) "Mexico/BajaSur" , 0x04D7B9 }, - { (char*) "Mexico/General" , 0x04DA77 }, - { (char*) "MST" , 0x04DD88 }, - { (char*) "MST7MDT" , 0x04DE84 }, - { (char*) "Navajo" , 0x04E2A2 }, - { (char*) "NZ" , 0x04E6C0 }, - { (char*) "NZ-CHAT" , 0x04EADF }, - { (char*) "Pacific/Apia" , 0x04EE13 }, - { (char*) "Pacific/Auckland" , 0x04EFB6 }, - { (char*) "Pacific/Bougainville" , 0x04F3E8 }, - { (char*) "Pacific/Chatham" , 0x04F4C9 }, - { (char*) "Pacific/Chuuk" , 0x04F80C }, - { (char*) "Pacific/Easter" , 0x04F8EA }, - { (char*) "Pacific/Efate" , 0x04FD99 }, - { (char*) "Pacific/Enderbury" , 0x04FEFB }, - { (char*) "Pacific/Fakaofo" , 0x04FFB3 }, - { (char*) "Pacific/Fiji" , 0x050058 }, - { (char*) "Pacific/Funafuti" , 0x0501F0 }, - { (char*) "Pacific/Galapagos" , 0x050282 }, - { (char*) "Pacific/Gambier" , 0x05034E }, - { (char*) "Pacific/Guadalcanal" , 0x0503ED }, - { (char*) "Pacific/Guam" , 0x05047F }, - { (char*) "Pacific/Honolulu" , 0x0505E9 }, - { (char*) "Pacific/Johnston" , 0x0506D8 }, - { (char*) "Pacific/Kanton" , 0x0507C1 }, - { (char*) "Pacific/Kiritimati" , 0x050888 }, - { (char*) "Pacific/Kosrae" , 0x05094E }, - { (char*) "Pacific/Kwajalein" , 0x050A52 }, - { (char*) "Pacific/Majuro" , 0x050B42 }, - { (char*) "Pacific/Marquesas" , 0x050C40 }, - { (char*) "Pacific/Midway" , 0x050CE8 }, - { (char*) "Pacific/Nauru" , 0x050DAB }, - { (char*) "Pacific/Niue" , 0x050E6E }, - { (char*) "Pacific/Norfolk" , 0x050F14 }, - { (char*) "Pacific/Noumea" , 0x05100D }, - { (char*) "Pacific/Pago_Pago" , 0x0510DF }, - { (char*) "Pacific/Palau" , 0x05117D }, - { (char*) "Pacific/Pitcairn" , 0x05121D }, - { (char*) "Pacific/Pohnpei" , 0x0512C2 }, - { (char*) "Pacific/Ponape" , 0x0513B2 }, - { (char*) "Pacific/Port_Moresby" , 0x051444 }, - { (char*) "Pacific/Rarotonga" , 0x051502 }, - { (char*) "Pacific/Saipan" , 0x0516A4 }, - { (char*) "Pacific/Samoa" , 0x051805 }, - { (char*) "Pacific/Tahiti" , 0x0518A3 }, - { (char*) "Pacific/Tarawa" , 0x051943 }, - { (char*) "Pacific/Tongatapu" , 0x0519E4 }, - { (char*) "Pacific/Truk" , 0x051ADD }, - { (char*) "Pacific/Wake" , 0x051B83 }, - { (char*) "Pacific/Wallis" , 0x051C20 }, - { (char*) "Pacific/Yap" , 0x051CB2 }, - { (char*) "Poland" , 0x051D58 }, - { (char*) "Portugal" , 0x0520FF }, - { (char*) "PRC" , 0x0526C2 }, - { (char*) "PST8PDT" , 0x052857 }, - { (char*) "ROC" , 0x052D71 }, - { (char*) "ROK" , 0x052F7C }, - { (char*) "Singapore" , 0x053127 }, - { (char*) "Turkey" , 0x053233 }, - { (char*) "UCT" , 0x0536EF }, - { (char*) "Universal" , 0x05376A }, - { (char*) "US/Alaska" , 0x0537E5 }, - { (char*) "US/Aleutian" , 0x053BC2 }, - { (char*) "US/Arizona" , 0x053F97 }, - { (char*) "US/Central" , 0x054093 }, - { (char*) "US/East-Indiana" , 0x054779 }, - { (char*) "US/Eastern" , 0x054998 }, - { (char*) "US/Hawaii" , 0x055074 }, - { (char*) "US/Indiana-Starke" , 0x05515D }, - { (char*) "US/Michigan" , 0x055561 }, - { (char*) "US/Mountain" , 0x0558F0 }, - { (char*) "US/Pacific" , 0x055D0E }, - { (char*) "US/Samoa" , 0x056228 }, - { (char*) "UTC" , 0x0562C6 }, - { (char*) "W-SU" , 0x056341 }, - { (char*) "WET" , 0x0566D9 }, - { (char*) "Zulu" , 0x056C9C }, + { (char*) "America/Fort_Nelson" , 0x00D9EC }, + { (char*) "America/Fort_Wayne" , 0x00DFB4 }, + { (char*) "America/Fortaleza" , 0x00E1D3 }, + { (char*) "America/Glace_Bay" , 0x00E3E9 }, + { (char*) "America/Godthab" , 0x00E780 }, + { (char*) "America/Goose_Bay" , 0x00EB51 }, + { (char*) "America/Grand_Turk" , 0x00F1A9 }, + { (char*) "America/Grenada" , 0x00F50A }, + { (char*) "America/Guadeloupe" , 0x00F598 }, + { (char*) "America/Guatemala" , 0x00F626 }, + { (char*) "America/Guayaquil" , 0x00F706 }, + { (char*) "America/Guyana" , 0x00F7D7 }, + { (char*) "America/Halifax" , 0x00F898 }, + { (char*) "America/Havana" , 0x00FF4A }, + { (char*) "America/Hermosillo" , 0x0103B3 }, + { (char*) "America/Indiana/Indianapolis" , 0x0104C7 }, + { (char*) "America/Indiana/Knox" , 0x0106FF }, + { (char*) "America/Indiana/Marengo" , 0x010B18 }, + { (char*) "America/Indiana/Petersburg" , 0x010D72 }, + { (char*) "America/Indiana/Tell_City" , 0x01103C }, + { (char*) "America/Indiana/Vevay" , 0x011266 }, + { (char*) "America/Indiana/Vincennes" , 0x0113FD }, + { (char*) "America/Indiana/Winamac" , 0x011653 }, + { (char*) "America/Indianapolis" , 0x0118D0 }, + { (char*) "America/Inuvik" , 0x011AEF }, + { (char*) "America/Iqaluit" , 0x011E40 }, + { (char*) "America/Jamaica" , 0x0121BC }, + { (char*) "America/Jujuy" , 0x01231B }, + { (char*) "America/Juneau" , 0x0125D9 }, + { (char*) "America/Kentucky/Louisville" , 0x0129BF }, + { (char*) "America/Kentucky/Monticello" , 0x012EC3 }, + { (char*) "America/Knox_IN" , 0x0132AF }, + { (char*) "America/Kralendijk" , 0x0136B3 }, + { (char*) "America/La_Paz" , 0x013770 }, + { (char*) "America/Lima" , 0x013826 }, + { (char*) "America/Los_Angeles" , 0x01394D }, + { (char*) "America/Louisville" , 0x013E6E }, + { (char*) "America/Lower_Princes" , 0x014354 }, + { (char*) "America/Maceio" , 0x014411 }, + { (char*) "America/Managua" , 0x014623 }, + { (char*) "America/Manaus" , 0x014756 }, + { (char*) "America/Marigot" , 0x01490D }, + { (char*) "America/Martinique" , 0x0149CA }, + { (char*) "America/Matamoros" , 0x014A88 }, + { (char*) "America/Mazatlan" , 0x014C75 }, + { (char*) "America/Mendoza" , 0x014F65 }, + { (char*) "America/Menominee" , 0x015235 }, + { (char*) "America/Merida" , 0x0155F5 }, + { (char*) "America/Metlakatla" , 0x0158A0 }, + { (char*) "America/Mexico_City" , 0x015B0D }, + { (char*) "America/Miquelon" , 0x015E2C }, + { (char*) "America/Moncton" , 0x01605E }, + { (char*) "America/Monterrey" , 0x016657 }, + { (char*) "America/Montevideo" , 0x01695E }, + { (char*) "America/Montreal" , 0x016D33 }, + { (char*) "America/Montserrat" , 0x0173F4 }, + { (char*) "America/Nassau" , 0x017482 }, + { (char*) "America/New_York" , 0x01787C }, + { (char*) "America/Nipigon" , 0x017F6C }, + { (char*) "America/Nome" , 0x01862D }, + { (char*) "America/Noronha" , 0x018A15 }, + { (char*) "America/North_Dakota/Beulah" , 0x018C15 }, + { (char*) "America/North_Dakota/Center" , 0x019049 }, + { (char*) "America/North_Dakota/New_Salem" , 0x019448 }, + { (char*) "America/Nuuk" , 0x01984D }, + { (char*) "America/Ojinaga" , 0x019C2F }, + { (char*) "America/Panama" , 0x019F25 }, + { (char*) "America/Pangnirtung" , 0x019FC6 }, + { (char*) "America/Paramaribo" , 0x01A329 }, + { (char*) "America/Phoenix" , 0x01A3F0 }, + { (char*) "America/Port-au-Prince" , 0x01A504 }, + { (char*) "America/Port_of_Spain" , 0x01A745 }, + { (char*) "America/Porto_Acre" , 0x01A7D3 }, + { (char*) "America/Porto_Velho" , 0x01A981 }, + { (char*) "America/Puerto_Rico" , 0x01AB1F }, + { (char*) "America/Punta_Arenas" , 0x01ABDC }, + { (char*) "America/Rainy_River" , 0x01B0BB }, + { (char*) "America/Rankin_Inlet" , 0x01B5D5 }, + { (char*) "America/Recife" , 0x01B91E }, + { (char*) "America/Regina" , 0x01BB18 }, + { (char*) "America/Resolute" , 0x01BDB7 }, + { (char*) "America/Rio_Branco" , 0x01C101 }, + { (char*) "America/Rosario" , 0x01C2B3 }, + { (char*) "America/Santa_Isabel" , 0x01C583 }, + { (char*) "America/Santarem" , 0x01CAE6 }, + { (char*) "America/Santiago" , 0x01CC96 }, + { (char*) "America/Santo_Domingo" , 0x01D1F9 }, + { (char*) "America/Sao_Paulo" , 0x01D342 }, + { (char*) "America/Scoresbysund" , 0x01D73C }, + { (char*) "America/Shiprock" , 0x01DB3D }, + { (char*) "America/Sitka" , 0x01DF5B }, + { (char*) "America/St_Barthelemy" , 0x01E336 }, + { (char*) "America/St_Johns" , 0x01E3F3 }, + { (char*) "America/St_Kitts" , 0x01EB70 }, + { (char*) "America/St_Lucia" , 0x01EBFE }, + { (char*) "America/St_Thomas" , 0x01EC9F }, + { (char*) "America/St_Vincent" , 0x01ED2D }, + { (char*) "America/Swift_Current" , 0x01EDCE }, + { (char*) "America/Tegucigalpa" , 0x01EF5C }, + { (char*) "America/Thule" , 0x01F02A }, + { (char*) "America/Thunder_Bay" , 0x01F20B }, + { (char*) "America/Tijuana" , 0x01F8CC }, + { (char*) "America/Toronto" , 0x01FE3E }, + { (char*) "America/Tortola" , 0x02051D }, + { (char*) "America/Vancouver" , 0x0205AB }, + { (char*) "America/Virgin" , 0x020B02 }, + { (char*) "America/Whitehorse" , 0x020BBF }, + { (char*) "America/Winnipeg" , 0x020FE2 }, + { (char*) "America/Yakutat" , 0x021519 }, + { (char*) "America/Yellowknife" , 0x0218E7 }, + { (char*) "Antarctica/Casey" , 0x021CBD }, + { (char*) "Antarctica/Davis" , 0x021DED }, + { (char*) "Antarctica/DumontDUrville" , 0x021EC3 }, + { (char*) "Antarctica/Macquarie" , 0x021F77 }, + { (char*) "Antarctica/Mawson" , 0x022363 }, + { (char*) "Antarctica/McMurdo" , 0x02240D }, + { (char*) "Antarctica/Palmer" , 0x02273F }, + { (char*) "Antarctica/Rothera" , 0x022AC8 }, + { (char*) "Antarctica/South_Pole" , 0x022B5F }, + { (char*) "Antarctica/Syowa" , 0x022F7E }, + { (char*) "Antarctica/Troll" , 0x023014 }, + { (char*) "Antarctica/Vostok" , 0x0230C3 }, + { (char*) "Arctic/Longyearbyen" , 0x02317F }, + { (char*) "Asia/Aden" , 0x02344C }, + { (char*) "Asia/Almaty" , 0x0234DD }, + { (char*) "Asia/Amman" , 0x023765 }, + { (char*) "Asia/Anadyr" , 0x023B11 }, + { (char*) "Asia/Aqtau" , 0x023E17 }, + { (char*) "Asia/Aqtobe" , 0x024096 }, + { (char*) "Asia/Ashgabat" , 0x024316 }, + { (char*) "Asia/Ashkhabad" , 0x024499 }, + { (char*) "Asia/Atyrau" , 0x02461C }, + { (char*) "Asia/Baghdad" , 0x0248A5 }, + { (char*) "Asia/Bahrain" , 0x024B27 }, + { (char*) "Asia/Baku" , 0x024BE0 }, + { (char*) "Asia/Bangkok" , 0x024ED4 }, + { (char*) "Asia/Barnaul" , 0x024F78 }, + { (char*) "Asia/Beirut" , 0x025283 }, + { (char*) "Asia/Bishkek" , 0x02556B }, + { (char*) "Asia/Brunei" , 0x0257E1 }, + { (char*) "Asia/Calcutta" , 0x025887 }, + { (char*) "Asia/Chita" , 0x02596F }, + { (char*) "Asia/Choibalsan" , 0x025C7D }, + { (char*) "Asia/Chongqing" , 0x025EDB }, + { (char*) "Asia/Chungking" , 0x026070 }, + { (char*) "Asia/Colombo" , 0x026205 }, + { (char*) "Asia/Dacca" , 0x026308 }, + { (char*) "Asia/Damascus" , 0x0263FB }, + { (char*) "Asia/Dhaka" , 0x0268D9 }, + { (char*) "Asia/Dili" , 0x0269CC }, + { (char*) "Asia/Dubai" , 0x026A82 }, + { (char*) "Asia/Dushanbe" , 0x026B13 }, + { (char*) "Asia/Famagusta" , 0x026C8D }, + { (char*) "Asia/Gaza" , 0x027054 }, + { (char*) "Asia/Harbin" , 0x027BF0 }, + { (char*) "Asia/Hebron" , 0x027D85 }, + { (char*) "Asia/Ho_Chi_Minh" , 0x028932 }, + { (char*) "Asia/Hong_Kong" , 0x028A2A }, + { (char*) "Asia/Hovd" , 0x028D3D }, + { (char*) "Asia/Irkutsk" , 0x028FB1 }, + { (char*) "Asia/Istanbul" , 0x0292CF }, + { (char*) "Asia/Jakarta" , 0x02978B }, + { (char*) "Asia/Jayapura" , 0x02989C }, + { (char*) "Asia/Jerusalem" , 0x029989 }, + { (char*) "Asia/Kabul" , 0x029DC7 }, + { (char*) "Asia/Kamchatka" , 0x029E72 }, + { (char*) "Asia/Karachi" , 0x02A167 }, + { (char*) "Asia/Kashgar" , 0x02A27D }, + { (char*) "Asia/Kathmandu" , 0x02A30E }, + { (char*) "Asia/Katmandu" , 0x02A3BB }, + { (char*) "Asia/Khandyga" , 0x02A468 }, + { (char*) "Asia/Kolkata" , 0x02A799 }, + { (char*) "Asia/Krasnoyarsk" , 0x02A881 }, + { (char*) "Asia/Kuala_Lumpur" , 0x02AB8B }, + { (char*) "Asia/Kuching" , 0x02ACAB }, + { (char*) "Asia/Kuwait" , 0x02AE05 }, + { (char*) "Asia/Macao" , 0x02AE96 }, + { (char*) "Asia/Macau" , 0x02B1B9 }, + { (char*) "Asia/Magadan" , 0x02B4DC }, + { (char*) "Asia/Makassar" , 0x02B7E7 }, + { (char*) "Asia/Manila" , 0x02B8FA }, + { (char*) "Asia/Muscat" , 0x02BA18 }, + { (char*) "Asia/Nicosia" , 0x02BAA9 }, + { (char*) "Asia/Novokuznetsk" , 0x02BD18 }, + { (char*) "Asia/Novosibirsk" , 0x02C00B }, + { (char*) "Asia/Omsk" , 0x02C31C }, + { (char*) "Asia/Oral" , 0x02C61A }, + { (char*) "Asia/Phnom_Penh" , 0x02C8A6 }, + { (char*) "Asia/Pontianak" , 0x02C97A }, + { (char*) "Asia/Pyongyang" , 0x02CA93 }, + { (char*) "Asia/Qatar" , 0x02CB56 }, + { (char*) "Asia/Qostanay" , 0x02CBFA }, + { (char*) "Asia/Qyzylorda" , 0x02CE90 }, + { (char*) "Asia/Rangoon" , 0x02D129 }, + { (char*) "Asia/Riyadh" , 0x02D1F0 }, + { (char*) "Asia/Saigon" , 0x02D281 }, + { (char*) "Asia/Sakhalin" , 0x02D379 }, + { (char*) "Asia/Samarkand" , 0x02D690 }, + { (char*) "Asia/Seoul" , 0x02D81B }, + { (char*) "Asia/Shanghai" , 0x02D9C6 }, + { (char*) "Asia/Singapore" , 0x02DB67 }, + { (char*) "Asia/Srednekolymsk" , 0x02DC73 }, + { (char*) "Asia/Taipei" , 0x02DF83 }, + { (char*) "Asia/Tashkent" , 0x02E18E }, + { (char*) "Asia/Tbilisi" , 0x02E319 }, + { (char*) "Asia/Tehran" , 0x02E591 }, + { (char*) "Asia/Tel_Aviv" , 0x02E8C9 }, + { (char*) "Asia/Thimbu" , 0x02ED07 }, + { (char*) "Asia/Thimphu" , 0x02EDAD }, + { (char*) "Asia/Tokyo" , 0x02EE53 }, + { (char*) "Asia/Tomsk" , 0x02EF34 }, + { (char*) "Asia/Ujung_Pandang" , 0x02F23F }, + { (char*) "Asia/Ulaanbaatar" , 0x02F309 }, + { (char*) "Asia/Ulan_Bator" , 0x02F577 }, + { (char*) "Asia/Urumqi" , 0x02F7D5 }, + { (char*) "Asia/Ust-Nera" , 0x02F873 }, + { (char*) "Asia/Vientiane" , 0x02FB96 }, + { (char*) "Asia/Vladivostok" , 0x02FC7C }, + { (char*) "Asia/Yakutsk" , 0x02FF81 }, + { (char*) "Asia/Yangon" , 0x030285 }, + { (char*) "Asia/Yekaterinburg" , 0x03034C }, + { (char*) "Asia/Yerevan" , 0x03065E }, + { (char*) "Atlantic/Azores" , 0x03092E }, + { (char*) "Atlantic/Bermuda" , 0x030EB9 }, + { (char*) "Atlantic/Canary" , 0x0312C5 }, + { (char*) "Atlantic/Cape_Verde" , 0x0314BD }, + { (char*) "Atlantic/Faeroe" , 0x031578 }, + { (char*) "Atlantic/Faroe" , 0x03173D }, + { (char*) "Atlantic/Jan_Mayen" , 0x031902 }, + { (char*) "Atlantic/Madeira" , 0x031BCF }, + { (char*) "Atlantic/Reykjavik" , 0x032146 }, + { (char*) "Atlantic/South_Georgia" , 0x032443 }, + { (char*) "Atlantic/St_Helena" , 0x0324D3 }, + { (char*) "Atlantic/Stanley" , 0x032574 }, + { (char*) "Australia/ACT" , 0x032895 }, + { (char*) "Australia/Adelaide" , 0x032C29 }, + { (char*) "Australia/Brisbane" , 0x032FDD }, + { (char*) "Australia/Broken_Hill" , 0x033121 }, + { (char*) "Australia/Canberra" , 0x0334F6 }, + { (char*) "Australia/Currie" , 0x03388A }, + { (char*) "Australia/Darwin" , 0x033C81 }, + { (char*) "Australia/Eucla" , 0x033D89 }, + { (char*) "Australia/Hobart" , 0x033EE8 }, + { (char*) "Australia/LHI" , 0x0342E7 }, + { (char*) "Australia/Lindeman" , 0x0345A7 }, + { (char*) "Australia/Lord_Howe" , 0x034717 }, + { (char*) "Australia/Melbourne" , 0x0349E7 }, + { (char*) "Australia/North" , 0x034D83 }, + { (char*) "Australia/NSW" , 0x034E79 }, + { (char*) "Australia/Perth" , 0x03520D }, + { (char*) "Australia/Queensland" , 0x035369 }, + { (char*) "Australia/South" , 0x035496 }, + { (char*) "Australia/Sydney" , 0x03583B }, + { (char*) "Australia/Tasmania" , 0x035BEB }, + { (char*) "Australia/Victoria" , 0x035FE2 }, + { (char*) "Australia/West" , 0x036376 }, + { (char*) "Australia/Yancowinna" , 0x0364B4 }, + { (char*) "Brazil/Acre" , 0x03686D }, + { (char*) "Brazil/DeNoronha" , 0x036A1B }, + { (char*) "Brazil/East" , 0x036C0B }, + { (char*) "Brazil/West" , 0x036FCF }, + { (char*) "Canada/Atlantic" , 0x037177 }, + { (char*) "Canada/Central" , 0x03780B }, + { (char*) "Canada/Eastern" , 0x037D25 }, + { (char*) "Canada/Mountain" , 0x0383E6 }, + { (char*) "Canada/Newfoundland" , 0x0387BC }, + { (char*) "Canada/Pacific" , 0x038F1E }, + { (char*) "Canada/Saskatchewan" , 0x03945C }, + { (char*) "Canada/Yukon" , 0x0396E6 }, + { (char*) "CET" , 0x039AF7 }, + { (char*) "Chile/Continental" , 0x039F52 }, + { (char*) "Chile/EasterIsland" , 0x03A4A8 }, + { (char*) "CST6CDT" , 0x03A94A }, + { (char*) "Cuba" , 0x03B030 }, + { (char*) "EET" , 0x03B499 }, + { (char*) "Egypt" , 0x03B74F }, + { (char*) "Eire" , 0x03BC78 }, + { (char*) "EST" , 0x03C25C }, + { (char*) "EST5EDT" , 0x03C2FD }, + { (char*) "Etc/GMT" , 0x03C9D9 }, + { (char*) "Etc/GMT+0" , 0x03CA54 }, + { (char*) "Etc/GMT+1" , 0x03CACF }, + { (char*) "Etc/GMT+10" , 0x03CB4C }, + { (char*) "Etc/GMT+11" , 0x03CBCA }, + { (char*) "Etc/GMT+12" , 0x03CC48 }, + { (char*) "Etc/GMT+2" , 0x03CCC6 }, + { (char*) "Etc/GMT+3" , 0x03CD43 }, + { (char*) "Etc/GMT+4" , 0x03CDC0 }, + { (char*) "Etc/GMT+5" , 0x03CE3D }, + { (char*) "Etc/GMT+6" , 0x03CEBA }, + { (char*) "Etc/GMT+7" , 0x03CF37 }, + { (char*) "Etc/GMT+8" , 0x03CFB4 }, + { (char*) "Etc/GMT+9" , 0x03D031 }, + { (char*) "Etc/GMT-0" , 0x03D0AE }, + { (char*) "Etc/GMT-1" , 0x03D129 }, + { (char*) "Etc/GMT-10" , 0x03D1A7 }, + { (char*) "Etc/GMT-11" , 0x03D226 }, + { (char*) "Etc/GMT-12" , 0x03D2A5 }, + { (char*) "Etc/GMT-13" , 0x03D324 }, + { (char*) "Etc/GMT-14" , 0x03D3A3 }, + { (char*) "Etc/GMT-2" , 0x03D422 }, + { (char*) "Etc/GMT-3" , 0x03D4A0 }, + { (char*) "Etc/GMT-4" , 0x03D51E }, + { (char*) "Etc/GMT-5" , 0x03D59C }, + { (char*) "Etc/GMT-6" , 0x03D61A }, + { (char*) "Etc/GMT-7" , 0x03D698 }, + { (char*) "Etc/GMT-8" , 0x03D716 }, + { (char*) "Etc/GMT-9" , 0x03D794 }, + { (char*) "Etc/GMT0" , 0x03D812 }, + { (char*) "Etc/Greenwich" , 0x03D88D }, + { (char*) "Etc/UCT" , 0x03D908 }, + { (char*) "Etc/Universal" , 0x03D983 }, + { (char*) "Etc/UTC" , 0x03D9FE }, + { (char*) "Etc/Zulu" , 0x03DA79 }, + { (char*) "Europe/Amsterdam" , 0x03DAF4 }, + { (char*) "Europe/Andorra" , 0x03DF2F }, + { (char*) "Europe/Astrakhan" , 0x03E0C0 }, + { (char*) "Europe/Athens" , 0x03E3B4 }, + { (char*) "Europe/Belfast" , 0x03E66A }, + { (char*) "Europe/Belgrade" , 0x03ECB5 }, + { (char*) "Europe/Berlin" , 0x03EE9F }, + { (char*) "Europe/Bratislava" , 0x03F17B }, + { (char*) "Europe/Brussels" , 0x03F45A }, + { (char*) "Europe/Bucharest" , 0x03F8B5 }, + { (char*) "Europe/Budapest" , 0x03FB56 }, + { (char*) "Europe/Busingen" , 0x03FE60 }, + { (char*) "Europe/Chisinau" , 0x040065 }, + { (char*) "Europe/Copenhagen" , 0x040528 }, + { (char*) "Europe/Dublin" , 0x0407A3 }, + { (char*) "Europe/Gibraltar" , 0x040D87 }, + { (char*) "Europe/Guernsey" , 0x041257 }, + { (char*) "Europe/Helsinki" , 0x0418AE }, + { (char*) "Europe/Isle_of_Man" , 0x041A9B }, + { (char*) "Europe/Istanbul" , 0x0420E6 }, + { (char*) "Europe/Jersey" , 0x0425A2 }, + { (char*) "Europe/Kaliningrad" , 0x042BF9 }, + { (char*) "Europe/Kiev" , 0x042FA1 }, + { (char*) "Europe/Kirov" , 0x0431DB }, + { (char*) "Europe/Kyiv" , 0x0434D4 }, + { (char*) "Europe/Lisbon" , 0x04371D }, + { (char*) "Europe/Ljubljana" , 0x043CF3 }, + { (char*) "Europe/London" , 0x043EDD }, + { (char*) "Europe/Luxembourg" , 0x044528 }, + { (char*) "Europe/Madrid" , 0x044973 }, + { (char*) "Europe/Malta" , 0x044D10 }, + { (char*) "Europe/Mariehamn" , 0x0450BC }, + { (char*) "Europe/Minsk" , 0x0452A9 }, + { (char*) "Europe/Monaco" , 0x0455DD }, + { (char*) "Europe/Moscow" , 0x045A43 }, + { (char*) "Europe/Nicosia" , 0x045DEF }, + { (char*) "Europe/Oslo" , 0x046050 }, + { (char*) "Europe/Paris" , 0x046300 }, + { (char*) "Europe/Podgorica" , 0x04675D }, + { (char*) "Europe/Prague" , 0x046947 }, + { (char*) "Europe/Riga" , 0x046C26 }, + { (char*) "Europe/Rome" , 0x046EE8 }, + { (char*) "Europe/Samara" , 0x0472A7 }, + { (char*) "Europe/San_Marino" , 0x0475A8 }, + { (char*) "Europe/Sarajevo" , 0x047967 }, + { (char*) "Europe/Saratov" , 0x047B51 }, + { (char*) "Europe/Simferopol" , 0x047E43 }, + { (char*) "Europe/Skopje" , 0x0481B6 }, + { (char*) "Europe/Sofia" , 0x0483A0 }, + { (char*) "Europe/Stockholm" , 0x0485FC }, + { (char*) "Europe/Tallinn" , 0x0487F9 }, + { (char*) "Europe/Tirane" , 0x048AA8 }, + { (char*) "Europe/Tiraspol" , 0x048D10 }, + { (char*) "Europe/Ulyanovsk" , 0x0491D3 }, + { (char*) "Europe/Uzhgorod" , 0x0494E9 }, + { (char*) "Europe/Vaduz" , 0x049723 }, + { (char*) "Europe/Vatican" , 0x04990D }, + { (char*) "Europe/Vienna" , 0x049CCC }, + { (char*) "Europe/Vilnius" , 0x049F6A }, + { (char*) "Europe/Volgograd" , 0x04A21A }, + { (char*) "Europe/Warsaw" , 0x04A529 }, + { (char*) "Europe/Zagreb" , 0x04A8D0 }, + { (char*) "Europe/Zaporozhye" , 0x04AABA }, + { (char*) "Europe/Zurich" , 0x04ACF4 }, + { (char*) "Factory" , 0x04AEF1 }, + { (char*) "GB" , 0x04AF6E }, + { (char*) "GB-Eire" , 0x04B5B9 }, + { (char*) "GMT" , 0x04BC04 }, + { (char*) "GMT+0" , 0x04BC7F }, + { (char*) "GMT-0" , 0x04BCFA }, + { (char*) "GMT0" , 0x04BD75 }, + { (char*) "Greenwich" , 0x04BDF0 }, + { (char*) "Hongkong" , 0x04BE6B }, + { (char*) "HST" , 0x04C17E }, + { (char*) "Iceland" , 0x04C267 }, + { (char*) "Indian/Antananarivo" , 0x04C2F5 }, + { (char*) "Indian/Chagos" , 0x04C3A1 }, + { (char*) "Indian/Christmas" , 0x04C445 }, + { (char*) "Indian/Cocos" , 0x04C4D6 }, + { (char*) "Indian/Comoro" , 0x04C56E }, + { (char*) "Indian/Kerguelen" , 0x04C5FD }, + { (char*) "Indian/Mahe" , 0x04C68E }, + { (char*) "Indian/Maldives" , 0x04C71F }, + { (char*) "Indian/Mauritius" , 0x04C7C3 }, + { (char*) "Indian/Mayotte" , 0x04C882 }, + { (char*) "Indian/Reunion" , 0x04C911 }, + { (char*) "Iran" , 0x04C9A2 }, + { (char*) "Israel" , 0x04CCDA }, + { (char*) "Jamaica" , 0x04D118 }, + { (char*) "Japan" , 0x04D277 }, + { (char*) "Kwajalein" , 0x04D358 }, + { (char*) "Libya" , 0x04D43F }, + { (char*) "MET" , 0x04D5FA }, + { (char*) "Mexico/BajaNorte" , 0x04DA55 }, + { (char*) "Mexico/BajaSur" , 0x04DFB8 }, + { (char*) "Mexico/General" , 0x04E276 }, + { (char*) "MST" , 0x04E587 }, + { (char*) "MST7MDT" , 0x04E683 }, + { (char*) "Navajo" , 0x04EAA1 }, + { (char*) "NZ" , 0x04EEBF }, + { (char*) "NZ-CHAT" , 0x04F2DE }, + { (char*) "Pacific/Apia" , 0x04F612 }, + { (char*) "Pacific/Auckland" , 0x04F7B5 }, + { (char*) "Pacific/Bougainville" , 0x04FBE7 }, + { (char*) "Pacific/Chatham" , 0x04FCC8 }, + { (char*) "Pacific/Chuuk" , 0x05000B }, + { (char*) "Pacific/Easter" , 0x0500E9 }, + { (char*) "Pacific/Efate" , 0x050598 }, + { (char*) "Pacific/Enderbury" , 0x0506FA }, + { (char*) "Pacific/Fakaofo" , 0x0507B2 }, + { (char*) "Pacific/Fiji" , 0x050857 }, + { (char*) "Pacific/Funafuti" , 0x0509EF }, + { (char*) "Pacific/Galapagos" , 0x050A81 }, + { (char*) "Pacific/Gambier" , 0x050B4D }, + { (char*) "Pacific/Guadalcanal" , 0x050BEC }, + { (char*) "Pacific/Guam" , 0x050C7E }, + { (char*) "Pacific/Honolulu" , 0x050DE8 }, + { (char*) "Pacific/Johnston" , 0x050ED7 }, + { (char*) "Pacific/Kanton" , 0x050FC0 }, + { (char*) "Pacific/Kiritimati" , 0x051087 }, + { (char*) "Pacific/Kosrae" , 0x05114D }, + { (char*) "Pacific/Kwajalein" , 0x051251 }, + { (char*) "Pacific/Majuro" , 0x051341 }, + { (char*) "Pacific/Marquesas" , 0x05143F }, + { (char*) "Pacific/Midway" , 0x0514E7 }, + { (char*) "Pacific/Nauru" , 0x0515AA }, + { (char*) "Pacific/Niue" , 0x05166D }, + { (char*) "Pacific/Norfolk" , 0x051713 }, + { (char*) "Pacific/Noumea" , 0x05180C }, + { (char*) "Pacific/Pago_Pago" , 0x0518DE }, + { (char*) "Pacific/Palau" , 0x05197C }, + { (char*) "Pacific/Pitcairn" , 0x051A1C }, + { (char*) "Pacific/Pohnpei" , 0x051AC1 }, + { (char*) "Pacific/Ponape" , 0x051BB1 }, + { (char*) "Pacific/Port_Moresby" , 0x051C43 }, + { (char*) "Pacific/Rarotonga" , 0x051D01 }, + { (char*) "Pacific/Saipan" , 0x051EA3 }, + { (char*) "Pacific/Samoa" , 0x052004 }, + { (char*) "Pacific/Tahiti" , 0x0520A2 }, + { (char*) "Pacific/Tarawa" , 0x052142 }, + { (char*) "Pacific/Tongatapu" , 0x0521E3 }, + { (char*) "Pacific/Truk" , 0x0522DC }, + { (char*) "Pacific/Wake" , 0x052382 }, + { (char*) "Pacific/Wallis" , 0x05241F }, + { (char*) "Pacific/Yap" , 0x0524B1 }, + { (char*) "Poland" , 0x052557 }, + { (char*) "Portugal" , 0x0528FE }, + { (char*) "PRC" , 0x052EC1 }, + { (char*) "PST8PDT" , 0x053056 }, + { (char*) "ROC" , 0x053570 }, + { (char*) "ROK" , 0x05377B }, + { (char*) "Singapore" , 0x053926 }, + { (char*) "Turkey" , 0x053A32 }, + { (char*) "UCT" , 0x053EEE }, + { (char*) "Universal" , 0x053F69 }, + { (char*) "US/Alaska" , 0x053FE4 }, + { (char*) "US/Aleutian" , 0x0543C1 }, + { (char*) "US/Arizona" , 0x054796 }, + { (char*) "US/Central" , 0x054892 }, + { (char*) "US/East-Indiana" , 0x054F78 }, + { (char*) "US/Eastern" , 0x055197 }, + { (char*) "US/Hawaii" , 0x055873 }, + { (char*) "US/Indiana-Starke" , 0x05595C }, + { (char*) "US/Michigan" , 0x055D60 }, + { (char*) "US/Mountain" , 0x0560EF }, + { (char*) "US/Pacific" , 0x05650D }, + { (char*) "US/Samoa" , 0x056A27 }, + { (char*) "UTC" , 0x056AC5 }, + { (char*) "W-SU" , 0x056B40 }, + { (char*) "WET" , 0x056ED8 }, + { (char*) "Zulu" , 0x05749B }, }; -const unsigned char timelib_timezone_db_data_builtin[355607] = { +const unsigned char timelib_timezone_db_data_builtin[357654] = { /* Africa/Abidjan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -4297,7 +4297,7 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x4F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF1, 0x39, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x64, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1B, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0A, 0xF2, 0xF0, 0xFF, @@ -4306,14 +4306,30 @@ 0xFF, 0xFF, 0xFF, 0xD8, 0x91, 0xB4, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC0, 0x73, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0xB3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0xAC, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x95, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x8E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x8E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x69, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x70, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x52, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x2D, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x34, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x4A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x51, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x2C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x33, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x0E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xD2, 0x15, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xB1, 0xF7, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, +0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xEE, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF0, 0x71, 0xBB, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xD0, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0xC1, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0xB2, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0xA3, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x94, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x85, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x76, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0xA2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x58, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x84, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x83, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x66, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x65, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x48, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x47, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x2A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x29, 0x20, 0x00, +0x00, 0x00, 0x00, 0x01, 0x88, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x78, 0x0B, 0x20, 0x00, +0x00, 0x00, 0x00, 0x03, 0x71, 0x28, 0x90, 0x00, 0x00, 0x00, 0x00, 0x04, 0x61, 0x27, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x05, 0x51, 0x0A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x06, 0x41, 0x09, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x07, 0x30, 0xEC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x07, 0x8D, 0x43, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x09, 0x10, 0xCE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0xAD, 0xBF, 0x20, 0x00, +0x00, 0x00, 0x00, 0x0A, 0xF0, 0xB0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xCD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x91, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0xAF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xAE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x91, 0x10, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x90, 0x20, 0x00, @@ -4354,6 +4370,8 @@ 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, @@ -8348,7 +8366,7 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x4F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF1, 0x39, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x64, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1B, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0A, 0xF2, 0xF0, 0xFF, @@ -8357,14 +8375,30 @@ 0xFF, 0xFF, 0xFF, 0xD8, 0x91, 0xB4, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC0, 0x73, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0xB3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0xAC, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x95, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x8E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x8E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x69, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x70, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x52, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x2D, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x34, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x4A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x51, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x2C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x33, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x0E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xD2, 0x15, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xB1, 0xF7, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, +0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xEE, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF0, 0x71, 0xBB, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xD0, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0xC1, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0xB2, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0xA3, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x94, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x85, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x76, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0xA2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x58, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x84, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x83, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x66, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x65, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x48, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x47, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x2A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x29, 0x20, 0x00, +0x00, 0x00, 0x00, 0x01, 0x88, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x78, 0x0B, 0x20, 0x00, +0x00, 0x00, 0x00, 0x03, 0x71, 0x28, 0x90, 0x00, 0x00, 0x00, 0x00, 0x04, 0x61, 0x27, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x05, 0x51, 0x0A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x06, 0x41, 0x09, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x07, 0x30, 0xEC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x07, 0x8D, 0x43, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x09, 0x10, 0xCE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0xAD, 0xBF, 0x20, 0x00, +0x00, 0x00, 0x00, 0x0A, 0xF0, 0xB0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xCD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x91, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0xAF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xAE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x91, 0x10, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x90, 0x20, 0x00, @@ -8405,6 +8439,8 @@ 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, @@ -9196,7 +9232,7 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x4F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF1, 0x39, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x64, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1B, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0A, 0xF2, 0xF0, 0xFF, @@ -9205,14 +9241,30 @@ 0xFF, 0xFF, 0xFF, 0xD8, 0x91, 0xB4, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC0, 0x73, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0xB3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0xAC, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x95, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x8E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x8E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x69, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x70, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x52, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x2D, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x34, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x4A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x51, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x2C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x33, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x0E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xD2, 0x15, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xB1, 0xF7, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, +0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xEE, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF0, 0x71, 0xBB, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xD0, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0xC1, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0xB2, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0xA3, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x94, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x85, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x76, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0xA2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x58, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x84, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x83, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x66, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x65, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x48, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x47, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x2A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x29, 0x20, 0x00, +0x00, 0x00, 0x00, 0x01, 0x88, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x78, 0x0B, 0x20, 0x00, +0x00, 0x00, 0x00, 0x03, 0x71, 0x28, 0x90, 0x00, 0x00, 0x00, 0x00, 0x04, 0x61, 0x27, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x05, 0x51, 0x0A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x06, 0x41, 0x09, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x07, 0x30, 0xEC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x07, 0x8D, 0x43, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x09, 0x10, 0xCE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0xAD, 0xBF, 0x20, 0x00, +0x00, 0x00, 0x00, 0x0A, 0xF0, 0xB0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xCD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x91, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0xAF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xAE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x91, 0x10, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x90, 0x20, 0x00, @@ -9253,6 +9305,8 @@ 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, @@ -13188,7 +13242,7 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xBA, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x9A, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xDA, 0x0C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, @@ -13206,24 +13260,23 @@ 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xA3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x59, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x92, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x33, 0x3D, 0x66, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x41, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x23, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x40, 0x30, 0x00, -0x00, 0x00, 0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x22, 0x30, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x04, 0x30, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xE6, 0x30, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xC8, 0x30, 0x00, -0x00, 0x00, 0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0xDD, 0xC7, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x01, -0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x04, 0x03, 0x04, -0x03, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x05, 0x02, 0x04, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x04, 0x00, -0x00, 0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, 0x00, -0x11, 0x00, 0x00, 0x38, 0x40, 0x01, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x42, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xC8, 0xFB, 0xD2, 0x01, 0x57, 0x0B, 0x02, 0x00, 0x00, 0x00, -0x00, +0x00, 0x00, 0x00, 0x34, 0x52, 0x41, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x36, 0x32, 0x23, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x38, 0x1B, 0x40, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x39, 0xFB, 0x22, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x3B, 0xDB, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBA, 0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9A, 0xC8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, +0x00, 0x00, 0x00, 0x40, 0xDD, 0xC7, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x05, 0x02, +0x05, 0x02, 0x05, 0x02, 0x05, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x02, 0x04, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x29, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x46, 0x50, +0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x00, 0x00, 0x38, 0x40, 0x01, 0x11, 0x4C, 0x4D, +0x54, 0x00, 0x54, 0x42, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, +0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xC8, 0xFB, 0xD2, +0x01, 0x57, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, /* Asia/Tehran */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x49, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -18053,7 +18106,7 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x26, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x26, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x6B, 0x9F, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xB0, 0xD2, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x3E, 0xF3, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xEF, 0x9C, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDF, 0x8D, 0x60, 0xFF, @@ -18083,19 +18136,48 @@ 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x75, 0x50, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xAE, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x32, 0x72, 0x7B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0xC9, 0x8C, 0xE0, 0x01, +0x00, 0x00, 0x00, 0x32, 0x72, 0x7B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xAD, 0x00, 0x00, +0x00, 0x00, 0x00, 0x34, 0x52, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x8F, 0x00, 0x00, +0x00, 0x00, 0x00, 0x36, 0x32, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x71, 0x00, 0x00, +0x00, 0x00, 0x00, 0x38, 0x1B, 0x86, 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x53, 0x00, 0x00, +0x00, 0x00, 0x00, 0x39, 0xFB, 0x68, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x35, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3B, 0xDB, 0x4A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x51, 0x80, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBB, 0x2C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x33, 0x80, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9B, 0x0E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x15, 0x80, 0x00, +0x00, 0x00, 0x00, 0x41, 0x84, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xF7, 0x80, 0x00, +0x00, 0x00, 0x00, 0x43, 0x64, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xD9, 0x80, 0x00, +0x00, 0x00, 0x00, 0x45, 0x43, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xBB, 0x80, 0x00, +0x00, 0x00, 0x00, 0x47, 0x23, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xD8, 0x00, 0x00, +0x00, 0x00, 0x00, 0x49, 0x03, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xBA, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xE3, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x9C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4C, 0xCC, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x7E, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4E, 0xAC, 0x93, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x60, 0x00, 0x00, +0x00, 0x00, 0x00, 0x50, 0x8C, 0x75, 0x80, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x7C, 0x80, 0x00, +0x00, 0x00, 0x00, 0x52, 0x6C, 0x57, 0x80, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x5E, 0x80, 0x00, +0x00, 0x00, 0x00, 0x54, 0x4C, 0x39, 0x80, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x40, 0x80, 0x00, +0x00, 0x00, 0x00, 0x56, 0x2C, 0x1B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x22, 0x80, 0x00, +0x00, 0x00, 0x00, 0x58, 0x15, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x04, 0x80, 0x00, +0x00, 0x00, 0x00, 0x59, 0xF5, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xE6, 0x80, 0x00, +0x00, 0x00, 0x00, 0x5B, 0xD4, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x03, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5D, 0xB4, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xE5, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5F, 0x94, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xC7, 0x00, 0x00, +0x00, 0x00, 0x00, 0x61, 0x7D, 0xDC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x61, 0xCF, 0x7D, 0x60, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x04, 0x00, 0x00, 0x1B, 0x08, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xF4, 0x00, 0x04, 0x00, 0x00, 0x18, 0x78, 0x00, 0x08, 0x00, 0x00, 0x2A, -0x30, 0x01, 0x0C, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x15, 0x00, -0x00, 0x1C, 0x20, 0x01, 0x19, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1E, 0x00, 0x00, 0x2A, 0x30, 0x00, -0x22, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, -0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, -0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, -0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, -0x2F, 0x33, 0x0A, 0x00, 0xD1, 0x0B, 0xA0, 0x01, 0x3E, 0xA7, 0x85, 0x00, 0x00, 0x00, 0x00, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x04, 0x00, 0x00, 0x1B, +0x08, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF4, 0x00, 0x04, 0x00, 0x00, 0x18, 0x78, 0x00, 0x08, 0x00, +0x00, 0x2A, 0x30, 0x01, 0x0C, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x00, 0x00, 0x0E, 0x10, 0x00, +0x15, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x19, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1E, 0x00, 0x00, 0x2A, +0x30, 0x00, 0x22, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x45, +0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, +0x00, 0x4D, 0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, +0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, +0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD1, 0x0B, 0xA0, 0x01, 0x3E, 0xA7, 0x85, 0x00, +0x00, 0x00, 0x00, /* Europe/Copenhagen */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x44, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -20373,7 +20455,7 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x26, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x26, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x6B, 0x9F, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xB0, 0xD2, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x3E, 0xF3, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xEF, 0x9C, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDF, 0x8D, 0x60, 0xFF, @@ -20403,19 +20485,48 @@ 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x75, 0x50, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xAE, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x32, 0x72, 0x7B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0xC9, 0x8C, 0xE0, 0x01, +0x00, 0x00, 0x00, 0x32, 0x72, 0x7B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xAD, 0x00, 0x00, +0x00, 0x00, 0x00, 0x34, 0x52, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x8F, 0x00, 0x00, +0x00, 0x00, 0x00, 0x36, 0x32, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x71, 0x00, 0x00, +0x00, 0x00, 0x00, 0x38, 0x1B, 0x86, 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x53, 0x00, 0x00, +0x00, 0x00, 0x00, 0x39, 0xFB, 0x68, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x35, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3B, 0xDB, 0x4A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x51, 0x80, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBB, 0x2C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x33, 0x80, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9B, 0x0E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x15, 0x80, 0x00, +0x00, 0x00, 0x00, 0x41, 0x84, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xF7, 0x80, 0x00, +0x00, 0x00, 0x00, 0x43, 0x64, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xD9, 0x80, 0x00, +0x00, 0x00, 0x00, 0x45, 0x43, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xBB, 0x80, 0x00, +0x00, 0x00, 0x00, 0x47, 0x23, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xD8, 0x00, 0x00, +0x00, 0x00, 0x00, 0x49, 0x03, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xBA, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xE3, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x9C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4C, 0xCC, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x7E, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4E, 0xAC, 0x93, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x60, 0x00, 0x00, +0x00, 0x00, 0x00, 0x50, 0x8C, 0x75, 0x80, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x7C, 0x80, 0x00, +0x00, 0x00, 0x00, 0x52, 0x6C, 0x57, 0x80, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x5E, 0x80, 0x00, +0x00, 0x00, 0x00, 0x54, 0x4C, 0x39, 0x80, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x40, 0x80, 0x00, +0x00, 0x00, 0x00, 0x56, 0x2C, 0x1B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x22, 0x80, 0x00, +0x00, 0x00, 0x00, 0x58, 0x15, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x04, 0x80, 0x00, +0x00, 0x00, 0x00, 0x59, 0xF5, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xE6, 0x80, 0x00, +0x00, 0x00, 0x00, 0x5B, 0xD4, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x03, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5D, 0xB4, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xE5, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5F, 0x94, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xC7, 0x00, 0x00, +0x00, 0x00, 0x00, 0x61, 0x7D, 0xDC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x61, 0xCF, 0x7D, 0x60, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x04, 0x00, 0x00, 0x1B, 0x08, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xF4, 0x00, 0x04, 0x00, 0x00, 0x18, 0x78, 0x00, 0x08, 0x00, 0x00, 0x2A, -0x30, 0x01, 0x0C, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x15, 0x00, -0x00, 0x1C, 0x20, 0x01, 0x19, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1E, 0x00, 0x00, 0x2A, 0x30, 0x00, -0x22, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, -0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, -0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, -0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, -0x2F, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x04, 0x00, 0x00, 0x1B, +0x08, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF4, 0x00, 0x04, 0x00, 0x00, 0x18, 0x78, 0x00, 0x08, 0x00, +0x00, 0x2A, 0x30, 0x01, 0x0C, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x00, 0x00, 0x0E, 0x10, 0x00, +0x15, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x19, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1E, 0x00, 0x00, 0x2A, +0x30, 0x00, 0x22, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x45, +0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, +0x00, 0x4D, 0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, +0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, +0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, /* Europe/Ulyanovsk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -21680,7 +21791,7 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x4F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF1, 0x39, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x64, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1B, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0A, 0xF2, 0xF0, 0xFF, @@ -21689,14 +21800,30 @@ 0xFF, 0xFF, 0xFF, 0xD8, 0x91, 0xB4, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC0, 0x73, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0xB3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0xAC, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x95, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x8E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x8E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x69, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x70, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x52, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x2D, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x34, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x4A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x51, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x2C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x33, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x0E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xD2, 0x15, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xB1, 0xF7, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, +0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xEE, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF0, 0x71, 0xBB, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xD0, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0xC1, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0xB2, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0xA3, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x94, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x85, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x76, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0xA2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x58, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x84, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x83, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x66, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x65, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x48, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x47, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x2A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x29, 0x20, 0x00, +0x00, 0x00, 0x00, 0x01, 0x88, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x78, 0x0B, 0x20, 0x00, +0x00, 0x00, 0x00, 0x03, 0x71, 0x28, 0x90, 0x00, 0x00, 0x00, 0x00, 0x04, 0x61, 0x27, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x05, 0x51, 0x0A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x06, 0x41, 0x09, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x07, 0x30, 0xEC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x07, 0x8D, 0x43, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x09, 0x10, 0xCE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0xAD, 0xBF, 0x20, 0x00, +0x00, 0x00, 0x00, 0x0A, 0xF0, 0xB0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xCD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x91, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0xAF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xAE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x91, 0x10, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x90, 0x20, 0x00, @@ -21737,6 +21864,8 @@ 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, @@ -24443,495 +24572,495 @@ { (char*) "America/Eirunepe" , 0x0154AA }, { (char*) "America/El_Salvador" , 0x015747 }, { (char*) "America/Ensenada" , 0x015833 }, - { (char*) "America/Fort_Nelson" , 0x0161D9 }, - { (char*) "America/Fort_Wayne" , 0x016AB9 }, - { (char*) "America/Fortaleza" , 0x017157 }, - { (char*) "America/Glace_Bay" , 0x017447 }, - { (char*) "America/Godthab" , 0x017CFE }, - { (char*) "America/Goose_Bay" , 0x01846B }, - { (char*) "America/Grand_Turk" , 0x019121 }, - { (char*) "America/Grenada" , 0x019857 }, - { (char*) "America/Guadeloupe" , 0x0198F7 }, - { (char*) "America/Guatemala" , 0x019997 }, - { (char*) "America/Guayaquil" , 0x019ABB }, - { (char*) "America/Guyana" , 0x019BC1 }, - { (char*) "America/Halifax" , 0x019CC5 }, - { (char*) "America/Havana" , 0x01AA4F }, - { (char*) "America/Hermosillo" , 0x01B3CB }, - { (char*) "America/Indiana/Indianapolis" , 0x01B561 }, - { (char*) "America/Indiana/Knox" , 0x01BC18 }, - { (char*) "America/Indiana/Marengo" , 0x01C5C5 }, - { (char*) "America/Indiana/Petersburg" , 0x01CCB2 }, - { (char*) "America/Indiana/Tell_City" , 0x01D451 }, - { (char*) "America/Indiana/Vevay" , 0x01DB15 }, - { (char*) "America/Indiana/Vincennes" , 0x01E0D1 }, - { (char*) "America/Indiana/Winamac" , 0x01E7A7 }, - { (char*) "America/Indianapolis" , 0x01EECB }, - { (char*) "America/Inuvik" , 0x01F569 }, - { (char*) "America/Iqaluit" , 0x01FDA3 }, - { (char*) "America/Jamaica" , 0x020662 }, - { (char*) "America/Jujuy" , 0x020850 }, - { (char*) "America/Juneau" , 0x020C66 }, - { (char*) "America/Kentucky/Louisville" , 0x0215B7 }, - { (char*) "America/Kentucky/Monticello" , 0x0220C5 }, - { (char*) "America/Knox_IN" , 0x022A25 }, - { (char*) "America/Kralendijk" , 0x0233BD }, - { (char*) "America/La_Paz" , 0x0234BF }, - { (char*) "America/Lima" , 0x0235A5 }, - { (char*) "America/Los_Angeles" , 0x023739 }, - { (char*) "America/Louisville" , 0x024270 }, - { (char*) "America/Lower_Princes" , 0x024D60 }, - { (char*) "America/Maceio" , 0x024E62 }, - { (char*) "America/Managua" , 0x025158 }, - { (char*) "America/Manaus" , 0x025312 }, - { (char*) "America/Marigot" , 0x02557B }, - { (char*) "America/Martinique" , 0x02567D }, - { (char*) "America/Matamoros" , 0x025771 }, - { (char*) "America/Mazatlan" , 0x025D33 }, - { (char*) "America/Mendoza" , 0x026195 }, - { (char*) "America/Menominee" , 0x0265C7 }, - { (char*) "America/Merida" , 0x026ED4 }, - { (char*) "America/Metlakatla" , 0x0272DD }, - { (char*) "America/Mexico_City" , 0x02788F }, - { (char*) "America/Miquelon" , 0x027D6F }, - { (char*) "America/Moncton" , 0x0283EF }, - { (char*) "America/Monterrey" , 0x029065 }, - { (char*) "America/Montevideo" , 0x029501 }, - { (char*) "America/Montreal" , 0x029AE5 }, - { (char*) "America/Montserrat" , 0x02A897 }, - { (char*) "America/Nassau" , 0x02A937 }, - { (char*) "America/New_York" , 0x02B297 }, - { (char*) "America/Nipigon" , 0x02C097 }, - { (char*) "America/Nome" , 0x02CE49 }, - { (char*) "America/Noronha" , 0x02D7A1 }, - { (char*) "America/North_Dakota/Beulah" , 0x02DA7B }, - { (char*) "America/North_Dakota/Center" , 0x02E3F8 }, - { (char*) "America/North_Dakota/New_Salem" , 0x02ED75 }, - { (char*) "America/Nuuk" , 0x02F6F8 }, - { (char*) "America/Ojinaga" , 0x02FE76 }, - { (char*) "America/Panama" , 0x030492 }, - { (char*) "America/Pangnirtung" , 0x030554 }, - { (char*) "America/Paramaribo" , 0x030DFA }, - { (char*) "America/Phoenix" , 0x030EFE }, - { (char*) "America/Port-au-Prince" , 0x03108A }, - { (char*) "America/Port_of_Spain" , 0x031630 }, - { (char*) "America/Porto_Acre" , 0x0316D0 }, - { (char*) "America/Porto_Velho" , 0x031942 }, - { (char*) "America/Puerto_Rico" , 0x031B88 }, - { (char*) "America/Punta_Arenas" , 0x031C8A }, - { (char*) "America/Rainy_River" , 0x032415 }, - { (char*) "America/Rankin_Inlet" , 0x032F55 }, - { (char*) "America/Recife" , 0x033789 }, - { (char*) "America/Regina" , 0x033A5D }, - { (char*) "America/Resolute" , 0x033E52 }, - { (char*) "America/Rio_Branco" , 0x034687 }, - { (char*) "America/Rosario" , 0x0348FD }, - { (char*) "America/Santa_Isabel" , 0x034D2F }, - { (char*) "America/Santarem" , 0x0356D5 }, - { (char*) "America/Santiago" , 0x035938 }, - { (char*) "America/Santo_Domingo" , 0x036324 }, - { (char*) "America/Sao_Paulo" , 0x0364FA }, - { (char*) "America/Scoresbysund" , 0x036AD2 }, - { (char*) "America/Shiprock" , 0x03728A }, - { (char*) "America/Sitka" , 0x037C32 }, - { (char*) "America/St_Barthelemy" , 0x03856A }, - { (char*) "America/St_Johns" , 0x03866C }, - { (char*) "America/St_Kitts" , 0x0394DA }, - { (char*) "America/St_Lucia" , 0x03957A }, - { (char*) "America/St_Thomas" , 0x03963C }, - { (char*) "America/St_Vincent" , 0x0396DC }, - { (char*) "America/Swift_Current" , 0x03979E }, - { (char*) "America/Tegucigalpa" , 0x0399EC }, - { (char*) "America/Thule" , 0x039AF4 }, - { (char*) "America/Thunder_Bay" , 0x03A0EC }, - { (char*) "America/Tijuana" , 0x03AE9E }, - { (char*) "America/Toronto" , 0x03B853 }, - { (char*) "America/Tortola" , 0x03C623 }, - { (char*) "America/Vancouver" , 0x03C6C3 }, - { (char*) "America/Virgin" , 0x03D234 }, - { (char*) "America/Whitehorse" , 0x03D336 }, - { (char*) "America/Winnipeg" , 0x03D9A2 }, - { (char*) "America/Yakutat" , 0x03E4FF }, - { (char*) "America/Yellowknife" , 0x03EE1C }, - { (char*) "Antarctica/Casey" , 0x03F744 }, - { (char*) "Antarctica/Davis" , 0x03F8FC }, - { (char*) "Antarctica/DumontDUrville" , 0x03FA28 }, - { (char*) "Antarctica/Macquarie" , 0x03FAF8 }, - { (char*) "Antarctica/Mawson" , 0x0403E8 }, - { (char*) "Antarctica/McMurdo" , 0x0404B3 }, - { (char*) "Antarctica/Palmer" , 0x040CAE }, - { (char*) "Antarctica/Rothera" , 0x04123C }, - { (char*) "Antarctica/South_Pole" , 0x0412E5 }, - { (char*) "Antarctica/Syowa" , 0x041C76 }, - { (char*) "Antarctica/Troll" , 0x041D1E }, - { (char*) "Antarctica/Vostok" , 0x0421AB }, - { (char*) "Arctic/Longyearbyen" , 0x042292 }, - { (char*) "Asia/Aden" , 0x042B98 }, - { (char*) "Asia/Almaty" , 0x042C3B }, - { (char*) "Asia/Amman" , 0x043030 }, - { (char*) "Asia/Anadyr" , 0x0435D5 }, - { (char*) "Asia/Aqtau" , 0x043A8A }, - { (char*) "Asia/Aqtobe" , 0x043E74 }, - { (char*) "Asia/Ashgabat" , 0x044272 }, - { (char*) "Asia/Ashkhabad" , 0x0444DB }, - { (char*) "Asia/Atyrau" , 0x044744 }, - { (char*) "Asia/Baghdad" , 0x044B36 }, - { (char*) "Asia/Bahrain" , 0x044F0B }, - { (char*) "Asia/Baku" , 0x044FF6 }, - { (char*) "Asia/Bangkok" , 0x0454BF }, - { (char*) "Asia/Barnaul" , 0x045584 }, - { (char*) "Asia/Beirut" , 0x045A55 }, - { (char*) "Asia/Bishkek" , 0x0462CB }, - { (char*) "Asia/Brunei" , 0x0466A0 }, - { (char*) "Asia/Calcutta" , 0x046769 }, - { (char*) "Asia/Chita" , 0x046892 }, - { (char*) "Asia/Choibalsan" , 0x046D69 }, - { (char*) "Asia/Chongqing" , 0x0470E2 }, - { (char*) "Asia/Chungking" , 0x04731F }, - { (char*) "Asia/Colombo" , 0x04755C }, - { (char*) "Asia/Dacca" , 0x0476CE }, - { (char*) "Asia/Damascus" , 0x04781D }, - { (char*) "Asia/Dhaka" , 0x047F7A }, - { (char*) "Asia/Dili" , 0x0480C9 }, - { (char*) "Asia/Dubai" , 0x0481D6 }, - { (char*) "Asia/Dushanbe" , 0x048279 }, - { (char*) "Asia/Famagusta" , 0x0484C6 }, - { (char*) "Asia/Gaza" , 0x048CCD }, - { (char*) "Asia/Harbin" , 0x049BE7 }, - { (char*) "Asia/Hebron" , 0x049E24 }, - { (char*) "Asia/Ho_Chi_Minh" , 0x04AD59 }, - { (char*) "Asia/Hong_Kong" , 0x04AEB6 }, - { (char*) "Asia/Hovd" , 0x04B393 }, - { (char*) "Asia/Irkutsk" , 0x04B722 }, - { (char*) "Asia/Istanbul" , 0x04BC15 }, - { (char*) "Asia/Jakarta" , 0x04C3AE }, - { (char*) "Asia/Jayapura" , 0x04C546 }, - { (char*) "Asia/Jerusalem" , 0x04C665 }, - { (char*) "Asia/Kabul" , 0x04CFC5 }, - { (char*) "Asia/Kamchatka" , 0x04D093 }, - { (char*) "Asia/Karachi" , 0x04D531 }, - { (char*) "Asia/Kashgar" , 0x04D6B8 }, - { (char*) "Asia/Kathmandu" , 0x04D75B }, - { (char*) "Asia/Katmandu" , 0x04D82D }, - { (char*) "Asia/Khandyga" , 0x04D8FF }, - { (char*) "Asia/Kolkata" , 0x04DE12 }, - { (char*) "Asia/Krasnoyarsk" , 0x04DF3B }, - { (char*) "Asia/Kuala_Lumpur" , 0x04E409 }, - { (char*) "Asia/Kuching" , 0x04E5BA }, - { (char*) "Asia/Kuwait" , 0x04E7A9 }, - { (char*) "Asia/Macao" , 0x04E84C }, - { (char*) "Asia/Macau" , 0x04ED23 }, - { (char*) "Asia/Magadan" , 0x04F1FA }, - { (char*) "Asia/Makassar" , 0x04F6CE }, - { (char*) "Asia/Manila" , 0x04F821 }, - { (char*) "Asia/Muscat" , 0x04F9D3 }, - { (char*) "Asia/Nicosia" , 0x04FA76 }, - { (char*) "Asia/Novokuznetsk" , 0x050262 }, - { (char*) "Asia/Novosibirsk" , 0x0506FE }, - { (char*) "Asia/Omsk" , 0x050BD5 }, - { (char*) "Asia/Oral" , 0x051097 }, - { (char*) "Asia/Phnom_Penh" , 0x051491 }, - { (char*) "Asia/Pontianak" , 0x0515B6 }, - { (char*) "Asia/Pyongyang" , 0x051739 }, - { (char*) "Asia/Qatar" , 0x051832 }, - { (char*) "Asia/Qostanay" , 0x0518F7 }, - { (char*) "Asia/Qyzylorda" , 0x051D1E }, - { (char*) "Asia/Rangoon" , 0x05213A }, - { (char*) "Asia/Riyadh" , 0x052244 }, - { (char*) "Asia/Saigon" , 0x0522E7 }, - { (char*) "Asia/Sakhalin" , 0x052444 }, - { (char*) "Asia/Samarkand" , 0x05290C }, - { (char*) "Asia/Seoul" , 0x052B5C }, - { (char*) "Asia/Shanghai" , 0x052DD1 }, - { (char*) "Asia/Singapore" , 0x05301A }, - { (char*) "Asia/Srednekolymsk" , 0x0531B7 }, - { (char*) "Asia/Taipei" , 0x05368B }, - { (char*) "Asia/Tashkent" , 0x053990 }, - { (char*) "Asia/Tbilisi" , 0x053BEE }, - { (char*) "Asia/Tehran" , 0x053FF7 }, - { (char*) "Asia/Tel_Aviv" , 0x0544E3 }, - { (char*) "Asia/Thimbu" , 0x054E43 }, - { (char*) "Asia/Thimphu" , 0x054F0C }, - { (char*) "Asia/Tokyo" , 0x054FD5 }, - { (char*) "Asia/Tomsk" , 0x055116 }, - { (char*) "Asia/Ujung_Pandang" , 0x0555E7 }, - { (char*) "Asia/Ulaanbaatar" , 0x0556F1 }, - { (char*) "Asia/Ulan_Bator" , 0x055A7A }, - { (char*) "Asia/Urumqi" , 0x055DF3 }, - { (char*) "Asia/Ust-Nera" , 0x055EA3 }, - { (char*) "Asia/Vientiane" , 0x056399 }, - { (char*) "Asia/Vladivostok" , 0x0564DA }, - { (char*) "Asia/Yakutsk" , 0x0569A3 }, - { (char*) "Asia/Yangon" , 0x056E6B }, - { (char*) "Asia/Yekaterinburg" , 0x056F75 }, - { (char*) "Asia/Yerevan" , 0x05745C }, - { (char*) "Atlantic/Azores" , 0x0578D9 }, - { (char*) "Atlantic/Bermuda" , 0x05865D }, - { (char*) "Atlantic/Canary" , 0x058FC5 }, - { (char*) "Atlantic/Cape_Verde" , 0x059748 }, - { (char*) "Atlantic/Faeroe" , 0x059854 }, - { (char*) "Atlantic/Faroe" , 0x059F77 }, - { (char*) "Atlantic/Jan_Mayen" , 0x05A69A }, - { (char*) "Atlantic/Madeira" , 0x05AFA0 }, - { (char*) "Atlantic/Reykjavik" , 0x05BCEC }, - { (char*) "Atlantic/South_Georgia" , 0x05C182 }, - { (char*) "Atlantic/St_Helena" , 0x05C224 }, - { (char*) "Atlantic/Stanley" , 0x05C2E6 }, - { (char*) "Australia/ACT" , 0x05C7A2 }, - { (char*) "Australia/Adelaide" , 0x05D03C }, - { (char*) "Australia/Brisbane" , 0x05D8F7 }, - { (char*) "Australia/Broken_Hill" , 0x05DABD }, - { (char*) "Australia/Canberra" , 0x05E39A }, - { (char*) "Australia/Currie" , 0x05EC34 }, - { (char*) "Australia/Darwin" , 0x05F576 }, - { (char*) "Australia/Eucla" , 0x05F6D9 }, - { (char*) "Australia/Hobart" , 0x05F8C6 }, - { (char*) "Australia/LHI" , 0x060210 }, - { (char*) "Australia/Lindeman" , 0x060952 }, - { (char*) "Australia/Lord_Howe" , 0x060B58 }, - { (char*) "Australia/Melbourne" , 0x0612AA }, - { (char*) "Australia/North" , 0x061B4C }, - { (char*) "Australia/NSW" , 0x061C9D }, - { (char*) "Australia/Perth" , 0x062537 }, - { (char*) "Australia/Queensland" , 0x06271F }, - { (char*) "Australia/South" , 0x0628CE }, - { (char*) "Australia/Sydney" , 0x06317A }, - { (char*) "Australia/Tasmania" , 0x063A30 }, - { (char*) "Australia/Victoria" , 0x064372 }, - { (char*) "Australia/West" , 0x064C0C }, - { (char*) "Australia/Yancowinna" , 0x064DD6 }, - { (char*) "Brazil/Acre" , 0x065697 }, - { (char*) "Brazil/DeNoronha" , 0x065909 }, - { (char*) "Brazil/East" , 0x065BD3 }, - { (char*) "Brazil/West" , 0x066175 }, - { (char*) "Canada/Atlantic" , 0x0663CF }, - { (char*) "Canada/Central" , 0x06713B }, - { (char*) "Canada/Eastern" , 0x067C7B }, - { (char*) "Canada/Mountain" , 0x068A2D }, - { (char*) "Canada/Newfoundland" , 0x069355 }, - { (char*) "Canada/Pacific" , 0x06A1A8 }, - { (char*) "Canada/Saskatchewan" , 0x06AD00 }, - { (char*) "Canada/Yukon" , 0x06B0E0 }, - { (char*) "CET" , 0x06B73A }, - { (char*) "Chile/Continental" , 0x06C2BB }, - { (char*) "Chile/EasterIsland" , 0x06CC9A }, - { (char*) "CST6CDT" , 0x06D551 }, - { (char*) "Cuba" , 0x06E365 }, - { (char*) "EET" , 0x06ECE1 }, - { (char*) "Egypt" , 0x06F5C3 }, - { (char*) "Eire" , 0x06FF2E }, - { (char*) "EST" , 0x070CDE }, - { (char*) "EST5EDT" , 0x070DA0 }, - { (char*) "Etc/GMT" , 0x071B8C }, - { (char*) "Etc/GMT+0" , 0x071C0A }, - { (char*) "Etc/GMT+1" , 0x071C88 }, - { (char*) "Etc/GMT+10" , 0x071D08 }, - { (char*) "Etc/GMT+11" , 0x071D89 }, - { (char*) "Etc/GMT+12" , 0x071E0A }, - { (char*) "Etc/GMT+2" , 0x071E8B }, - { (char*) "Etc/GMT+3" , 0x071F0B }, - { (char*) "Etc/GMT+4" , 0x071F8B }, - { (char*) "Etc/GMT+5" , 0x07200B }, - { (char*) "Etc/GMT+6" , 0x07208B }, - { (char*) "Etc/GMT+7" , 0x07210B }, - { (char*) "Etc/GMT+8" , 0x07218B }, - { (char*) "Etc/GMT+9" , 0x07220B }, - { (char*) "Etc/GMT-0" , 0x07228B }, - { (char*) "Etc/GMT-1" , 0x072309 }, - { (char*) "Etc/GMT-10" , 0x07238A }, - { (char*) "Etc/GMT-11" , 0x07240C }, - { (char*) "Etc/GMT-12" , 0x07248E }, - { (char*) "Etc/GMT-13" , 0x072510 }, - { (char*) "Etc/GMT-14" , 0x072592 }, - { (char*) "Etc/GMT-2" , 0x072614 }, - { (char*) "Etc/GMT-3" , 0x072695 }, - { (char*) "Etc/GMT-4" , 0x072716 }, - { (char*) "Etc/GMT-5" , 0x072797 }, - { (char*) "Etc/GMT-6" , 0x072818 }, - { (char*) "Etc/GMT-7" , 0x072899 }, - { (char*) "Etc/GMT-8" , 0x07291A }, - { (char*) "Etc/GMT-9" , 0x07299B }, - { (char*) "Etc/GMT0" , 0x072A1C }, - { (char*) "Etc/Greenwich" , 0x072A9A }, - { (char*) "Etc/UCT" , 0x072B18 }, - { (char*) "Etc/Universal" , 0x072B96 }, - { (char*) "Etc/UTC" , 0x072C14 }, - { (char*) "Etc/Zulu" , 0x072C92 }, - { (char*) "Europe/Amsterdam" , 0x072D10 }, - { (char*) "Europe/Andorra" , 0x07387A }, - { (char*) "Europe/Astrakhan" , 0x073F54 }, - { (char*) "Europe/Athens" , 0x0743F1 }, - { (char*) "Europe/Belfast" , 0x074CD3 }, - { (char*) "Europe/Belgrade" , 0x075B2F }, - { (char*) "Europe/Berlin" , 0x0762BB }, - { (char*) "Europe/Bratislava" , 0x076BD0 }, - { (char*) "Europe/Brussels" , 0x0774D9 }, - { (char*) "Europe/Bucharest" , 0x07805A }, - { (char*) "Europe/Budapest" , 0x0788EE }, - { (char*) "Europe/Busingen" , 0x07923A }, - { (char*) "Europe/Chisinau" , 0x0799C3 }, - { (char*) "Europe/Copenhagen" , 0x07A325 }, - { (char*) "Europe/Dublin" , 0x07AB8A }, - { (char*) "Europe/Gibraltar" , 0x07B93A }, - { (char*) "Europe/Guernsey" , 0x07C542 }, - { (char*) "Europe/Helsinki" , 0x07D3E2 }, - { (char*) "Europe/Isle_of_Man" , 0x07DB5A }, - { (char*) "Europe/Istanbul" , 0x07E9A6 }, - { (char*) "Europe/Jersey" , 0x07F13F }, - { (char*) "Europe/Kaliningrad" , 0x07FFDF }, - { (char*) "Europe/Kiev" , 0x0805D4 }, - { (char*) "Europe/Kirov" , 0x080E28 }, - { (char*) "Europe/Kyiv" , 0x0812E3 }, - { (char*) "Europe/Lisbon" , 0x081B46 }, - { (char*) "Europe/Ljubljana" , 0x08292C }, - { (char*) "Europe/London" , 0x0830B8 }, - { (char*) "Europe/Luxembourg" , 0x083F14 }, - { (char*) "Europe/Madrid" , 0x084AA2 }, - { (char*) "Europe/Malta" , 0x0854F4 }, - { (char*) "Europe/Mariehamn" , 0x085F3C }, - { (char*) "Europe/Minsk" , 0x0866B4 }, - { (char*) "Europe/Monaco" , 0x086BDB }, - { (char*) "Europe/Moscow" , 0x087767 }, - { (char*) "Europe/Nicosia" , 0x087D86 }, - { (char*) "Europe/Oslo" , 0x088564 }, - { (char*) "Europe/Paris" , 0x088E24 }, - { (char*) "Europe/Podgorica" , 0x0899C2 }, - { (char*) "Europe/Prague" , 0x08A14E }, - { (char*) "Europe/Riga" , 0x08AA57 }, - { (char*) "Europe/Rome" , 0x08B2F9 }, - { (char*) "Europe/Samara" , 0x08BD56 }, - { (char*) "Europe/San_Marino" , 0x08C22C }, - { (char*) "Europe/Sarajevo" , 0x08CC89 }, - { (char*) "Europe/Saratov" , 0x08D415 }, - { (char*) "Europe/Simferopol" , 0x08D8C2 }, - { (char*) "Europe/Skopje" , 0x08DE91 }, - { (char*) "Europe/Sofia" , 0x08E61D }, - { (char*) "Europe/Stockholm" , 0x08EE46 }, - { (char*) "Europe/Tallinn" , 0x08F5C7 }, - { (char*) "Europe/Tirane" , 0x08FE37 }, - { (char*) "Europe/Tiraspol" , 0x090667 }, - { (char*) "Europe/Ulyanovsk" , 0x090FC9 }, - { (char*) "Europe/Uzhgorod" , 0x0914CC }, - { (char*) "Europe/Vaduz" , 0x091D20 }, - { (char*) "Europe/Vatican" , 0x09248C }, - { (char*) "Europe/Vienna" , 0x092EE9 }, - { (char*) "Europe/Vilnius" , 0x09378D }, - { (char*) "Europe/Volgograd" , 0x09400B }, - { (char*) "Europe/Warsaw" , 0x0944D2 }, - { (char*) "Europe/Zagreb" , 0x094F3C }, - { (char*) "Europe/Zaporozhye" , 0x0956C8 }, - { (char*) "Europe/Zurich" , 0x095F1C }, - { (char*) "Factory" , 0x09669D }, - { (char*) "GB" , 0x09671D }, - { (char*) "GB-Eire" , 0x097579 }, - { (char*) "GMT" , 0x0983D5 }, - { (char*) "GMT+0" , 0x098453 }, - { (char*) "GMT-0" , 0x0984D1 }, - { (char*) "GMT0" , 0x09854F }, - { (char*) "Greenwich" , 0x0985CD }, - { (char*) "Hongkong" , 0x09864B }, - { (char*) "HST" , 0x098B28 }, - { (char*) "Iceland" , 0x098C7D }, - { (char*) "Indian/Antananarivo" , 0x098D1D }, - { (char*) "Indian/Chagos" , 0x098E04 }, - { (char*) "Indian/Christmas" , 0x098EC9 }, - { (char*) "Indian/Cocos" , 0x098F6C }, - { (char*) "Indian/Comoro" , 0x099018 }, - { (char*) "Indian/Kerguelen" , 0x0990B9 }, - { (char*) "Indian/Mahe" , 0x09915C }, - { (char*) "Indian/Maldives" , 0x0991FF }, - { (char*) "Indian/Mauritius" , 0x0992C4 }, - { (char*) "Indian/Mayotte" , 0x0993B3 }, - { (char*) "Indian/Reunion" , 0x099454 }, - { (char*) "Iran" , 0x0994F7 }, - { (char*) "Israel" , 0x0999E3 }, - { (char*) "Jamaica" , 0x09A343 }, - { (char*) "Japan" , 0x09A531 }, - { (char*) "Kwajalein" , 0x09A672 }, - { (char*) "Libya" , 0x09A7AC }, - { (char*) "MET" , 0x09AA29 }, - { (char*) "Mexico/BajaNorte" , 0x09B5AA }, - { (char*) "Mexico/BajaSur" , 0x09BF50 }, - { (char*) "Mexico/General" , 0x09C380 }, - { (char*) "MST" , 0x09C852 }, - { (char*) "MST7MDT" , 0x09C9C6 }, - { (char*) "Navajo" , 0x09D36E }, - { (char*) "NZ" , 0x09DD16 }, - { (char*) "NZ-CHAT" , 0x09E6A7 }, - { (char*) "Pacific/Apia" , 0x09EEB9 }, - { (char*) "Pacific/Auckland" , 0x09F11B }, - { (char*) "Pacific/Bougainville" , 0x09FABF }, - { (char*) "Pacific/Chatham" , 0x09FBD5 }, - { (char*) "Pacific/Chuuk" , 0x0A03F6 }, - { (char*) "Pacific/Easter" , 0x0A0510 }, - { (char*) "Pacific/Efate" , 0x0A0DD4 }, - { (char*) "Pacific/Enderbury" , 0x0A0FEC }, - { (char*) "Pacific/Fakaofo" , 0x0A10D4 }, - { (char*) "Pacific/Fiji" , 0x0A119A }, - { (char*) "Pacific/Funafuti" , 0x0A13DA }, - { (char*) "Pacific/Galapagos" , 0x0A147E }, - { (char*) "Pacific/Gambier" , 0x0A157B }, - { (char*) "Pacific/Guadalcanal" , 0x0A162C }, - { (char*) "Pacific/Guam" , 0x0A16D0 }, - { (char*) "Pacific/Honolulu" , 0x0A18CA }, - { (char*) "Pacific/Johnston" , 0x0A1A25 }, - { (char*) "Pacific/Kanton" , 0x0A1B7A }, - { (char*) "Pacific/Kiritimati" , 0x0A1C71 }, - { (char*) "Pacific/Kosrae" , 0x0A1D69 }, - { (char*) "Pacific/Kwajalein" , 0x0A1ECC }, - { (char*) "Pacific/Majuro" , 0x0A200F }, - { (char*) "Pacific/Marquesas" , 0x0A215B }, - { (char*) "Pacific/Midway" , 0x0A2217 }, - { (char*) "Pacific/Nauru" , 0x0A230A }, - { (char*) "Pacific/Niue" , 0x0A2404 }, - { (char*) "Pacific/Norfolk" , 0x0A24CD }, - { (char*) "Pacific/Noumea" , 0x0A283B }, - { (char*) "Pacific/Pago_Pago" , 0x0A2969 }, - { (char*) "Pacific/Palau" , 0x0A2A24 }, - { (char*) "Pacific/Pitcairn" , 0x0A2AD6 }, - { (char*) "Pacific/Pohnpei" , 0x0A2B9E }, - { (char*) "Pacific/Ponape" , 0x0A2CD9 }, - { (char*) "Pacific/Port_Moresby" , 0x0A2D7D }, - { (char*) "Pacific/Rarotonga" , 0x0A2E4D }, - { (char*) "Pacific/Saipan" , 0x0A30A6 }, - { (char*) "Pacific/Samoa" , 0x0A3292 }, - { (char*) "Pacific/Tahiti" , 0x0A334D }, - { (char*) "Pacific/Tarawa" , 0x0A33FF }, - { (char*) "Pacific/Tongatapu" , 0x0A34B2 }, - { (char*) "Pacific/Truk" , 0x0A3624 }, - { (char*) "Pacific/Wake" , 0x0A36DC }, - { (char*) "Pacific/Wallis" , 0x0A378B }, - { (char*) "Pacific/Yap" , 0x0A382F }, - { (char*) "Poland" , 0x0A38E7 }, - { (char*) "Portugal" , 0x0A4351 }, - { (char*) "PRC" , 0x0A5124 }, - { (char*) "PST8PDT" , 0x0A5361 }, - { (char*) "ROC" , 0x0A5E91 }, - { (char*) "ROK" , 0x0A6196 }, - { (char*) "Singapore" , 0x0A640B }, - { (char*) "Turkey" , 0x0A65A8 }, - { (char*) "UCT" , 0x0A6D41 }, - { (char*) "Universal" , 0x0A6DBF }, - { (char*) "US/Alaska" , 0x0A6E3D }, - { (char*) "US/Aleutian" , 0x0A778C }, - { (char*) "US/Arizona" , 0x0A80CC }, - { (char*) "US/Central" , 0x0A8240 }, - { (char*) "US/East-Indiana" , 0x0A9054 }, - { (char*) "US/Eastern" , 0x0A96F2 }, - { (char*) "US/Hawaii" , 0x0AA4DE }, - { (char*) "US/Indiana-Starke" , 0x0AA633 }, - { (char*) "US/Michigan" , 0x0AAFCB }, - { (char*) "US/Mountain" , 0x0AB88D }, - { (char*) "US/Pacific" , 0x0AC235 }, - { (char*) "US/Samoa" , 0x0ACD65 }, - { (char*) "UTC" , 0x0ACE20 }, - { (char*) "W-SU" , 0x0ACE9E }, - { (char*) "WET" , 0x0AD4A9 }, - { (char*) "Zulu" , 0x0AE27C }, + { (char*) "America/Fort_Nelson" , 0x016399 }, + { (char*) "America/Fort_Wayne" , 0x016C79 }, + { (char*) "America/Fortaleza" , 0x017317 }, + { (char*) "America/Glace_Bay" , 0x017607 }, + { (char*) "America/Godthab" , 0x017EBE }, + { (char*) "America/Goose_Bay" , 0x01862B }, + { (char*) "America/Grand_Turk" , 0x0192E1 }, + { (char*) "America/Grenada" , 0x019A17 }, + { (char*) "America/Guadeloupe" , 0x019AB7 }, + { (char*) "America/Guatemala" , 0x019B57 }, + { (char*) "America/Guayaquil" , 0x019C7B }, + { (char*) "America/Guyana" , 0x019D81 }, + { (char*) "America/Halifax" , 0x019E85 }, + { (char*) "America/Havana" , 0x01AC0F }, + { (char*) "America/Hermosillo" , 0x01B58B }, + { (char*) "America/Indiana/Indianapolis" , 0x01B721 }, + { (char*) "America/Indiana/Knox" , 0x01BDD8 }, + { (char*) "America/Indiana/Marengo" , 0x01C785 }, + { (char*) "America/Indiana/Petersburg" , 0x01CE72 }, + { (char*) "America/Indiana/Tell_City" , 0x01D611 }, + { (char*) "America/Indiana/Vevay" , 0x01DCD5 }, + { (char*) "America/Indiana/Vincennes" , 0x01E291 }, + { (char*) "America/Indiana/Winamac" , 0x01E967 }, + { (char*) "America/Indianapolis" , 0x01F08B }, + { (char*) "America/Inuvik" , 0x01F729 }, + { (char*) "America/Iqaluit" , 0x01FF63 }, + { (char*) "America/Jamaica" , 0x020822 }, + { (char*) "America/Jujuy" , 0x020A10 }, + { (char*) "America/Juneau" , 0x020E26 }, + { (char*) "America/Kentucky/Louisville" , 0x021777 }, + { (char*) "America/Kentucky/Monticello" , 0x022285 }, + { (char*) "America/Knox_IN" , 0x022BE5 }, + { (char*) "America/Kralendijk" , 0x02357D }, + { (char*) "America/La_Paz" , 0x02367F }, + { (char*) "America/Lima" , 0x023765 }, + { (char*) "America/Los_Angeles" , 0x0238F9 }, + { (char*) "America/Louisville" , 0x024430 }, + { (char*) "America/Lower_Princes" , 0x024F20 }, + { (char*) "America/Maceio" , 0x025022 }, + { (char*) "America/Managua" , 0x025318 }, + { (char*) "America/Manaus" , 0x0254D2 }, + { (char*) "America/Marigot" , 0x02573B }, + { (char*) "America/Martinique" , 0x02583D }, + { (char*) "America/Matamoros" , 0x025931 }, + { (char*) "America/Mazatlan" , 0x025EF3 }, + { (char*) "America/Mendoza" , 0x026355 }, + { (char*) "America/Menominee" , 0x026787 }, + { (char*) "America/Merida" , 0x027094 }, + { (char*) "America/Metlakatla" , 0x02749D }, + { (char*) "America/Mexico_City" , 0x027A4F }, + { (char*) "America/Miquelon" , 0x027F2F }, + { (char*) "America/Moncton" , 0x0285AF }, + { (char*) "America/Monterrey" , 0x029225 }, + { (char*) "America/Montevideo" , 0x0296C1 }, + { (char*) "America/Montreal" , 0x029CA5 }, + { (char*) "America/Montserrat" , 0x02AA57 }, + { (char*) "America/Nassau" , 0x02AAF7 }, + { (char*) "America/New_York" , 0x02B457 }, + { (char*) "America/Nipigon" , 0x02C257 }, + { (char*) "America/Nome" , 0x02D009 }, + { (char*) "America/Noronha" , 0x02D961 }, + { (char*) "America/North_Dakota/Beulah" , 0x02DC3B }, + { (char*) "America/North_Dakota/Center" , 0x02E5B8 }, + { (char*) "America/North_Dakota/New_Salem" , 0x02EF35 }, + { (char*) "America/Nuuk" , 0x02F8B8 }, + { (char*) "America/Ojinaga" , 0x030036 }, + { (char*) "America/Panama" , 0x030652 }, + { (char*) "America/Pangnirtung" , 0x030714 }, + { (char*) "America/Paramaribo" , 0x030FBA }, + { (char*) "America/Phoenix" , 0x0310BE }, + { (char*) "America/Port-au-Prince" , 0x03124A }, + { (char*) "America/Port_of_Spain" , 0x0317F0 }, + { (char*) "America/Porto_Acre" , 0x031890 }, + { (char*) "America/Porto_Velho" , 0x031B02 }, + { (char*) "America/Puerto_Rico" , 0x031D48 }, + { (char*) "America/Punta_Arenas" , 0x031E4A }, + { (char*) "America/Rainy_River" , 0x0325D5 }, + { (char*) "America/Rankin_Inlet" , 0x033115 }, + { (char*) "America/Recife" , 0x033949 }, + { (char*) "America/Regina" , 0x033C1D }, + { (char*) "America/Resolute" , 0x034012 }, + { (char*) "America/Rio_Branco" , 0x034847 }, + { (char*) "America/Rosario" , 0x034ABD }, + { (char*) "America/Santa_Isabel" , 0x034EEF }, + { (char*) "America/Santarem" , 0x035A55 }, + { (char*) "America/Santiago" , 0x035CB8 }, + { (char*) "America/Santo_Domingo" , 0x0366A4 }, + { (char*) "America/Sao_Paulo" , 0x03687A }, + { (char*) "America/Scoresbysund" , 0x036E52 }, + { (char*) "America/Shiprock" , 0x03760A }, + { (char*) "America/Sitka" , 0x037FB2 }, + { (char*) "America/St_Barthelemy" , 0x0388EA }, + { (char*) "America/St_Johns" , 0x0389EC }, + { (char*) "America/St_Kitts" , 0x03985A }, + { (char*) "America/St_Lucia" , 0x0398FA }, + { (char*) "America/St_Thomas" , 0x0399BC }, + { (char*) "America/St_Vincent" , 0x039A5C }, + { (char*) "America/Swift_Current" , 0x039B1E }, + { (char*) "America/Tegucigalpa" , 0x039D6C }, + { (char*) "America/Thule" , 0x039E74 }, + { (char*) "America/Thunder_Bay" , 0x03A46C }, + { (char*) "America/Tijuana" , 0x03B21E }, + { (char*) "America/Toronto" , 0x03BD93 }, + { (char*) "America/Tortola" , 0x03CB63 }, + { (char*) "America/Vancouver" , 0x03CC03 }, + { (char*) "America/Virgin" , 0x03D774 }, + { (char*) "America/Whitehorse" , 0x03D876 }, + { (char*) "America/Winnipeg" , 0x03DEE2 }, + { (char*) "America/Yakutat" , 0x03EA3F }, + { (char*) "America/Yellowknife" , 0x03F35C }, + { (char*) "Antarctica/Casey" , 0x03FC84 }, + { (char*) "Antarctica/Davis" , 0x03FE3C }, + { (char*) "Antarctica/DumontDUrville" , 0x03FF68 }, + { (char*) "Antarctica/Macquarie" , 0x040038 }, + { (char*) "Antarctica/Mawson" , 0x040928 }, + { (char*) "Antarctica/McMurdo" , 0x0409F3 }, + { (char*) "Antarctica/Palmer" , 0x0411EE }, + { (char*) "Antarctica/Rothera" , 0x04177C }, + { (char*) "Antarctica/South_Pole" , 0x041825 }, + { (char*) "Antarctica/Syowa" , 0x0421B6 }, + { (char*) "Antarctica/Troll" , 0x04225E }, + { (char*) "Antarctica/Vostok" , 0x0426EB }, + { (char*) "Arctic/Longyearbyen" , 0x0427D2 }, + { (char*) "Asia/Aden" , 0x0430D8 }, + { (char*) "Asia/Almaty" , 0x04317B }, + { (char*) "Asia/Amman" , 0x043570 }, + { (char*) "Asia/Anadyr" , 0x043B15 }, + { (char*) "Asia/Aqtau" , 0x043FCA }, + { (char*) "Asia/Aqtobe" , 0x0443B4 }, + { (char*) "Asia/Ashgabat" , 0x0447B2 }, + { (char*) "Asia/Ashkhabad" , 0x044A1B }, + { (char*) "Asia/Atyrau" , 0x044C84 }, + { (char*) "Asia/Baghdad" , 0x045076 }, + { (char*) "Asia/Bahrain" , 0x04544B }, + { (char*) "Asia/Baku" , 0x045536 }, + { (char*) "Asia/Bangkok" , 0x0459FF }, + { (char*) "Asia/Barnaul" , 0x045AC4 }, + { (char*) "Asia/Beirut" , 0x045F95 }, + { (char*) "Asia/Bishkek" , 0x04680B }, + { (char*) "Asia/Brunei" , 0x046BE0 }, + { (char*) "Asia/Calcutta" , 0x046CA9 }, + { (char*) "Asia/Chita" , 0x046DD2 }, + { (char*) "Asia/Choibalsan" , 0x0472A9 }, + { (char*) "Asia/Chongqing" , 0x047622 }, + { (char*) "Asia/Chungking" , 0x04785F }, + { (char*) "Asia/Colombo" , 0x047A9C }, + { (char*) "Asia/Dacca" , 0x047C0E }, + { (char*) "Asia/Damascus" , 0x047D5D }, + { (char*) "Asia/Dhaka" , 0x0484BA }, + { (char*) "Asia/Dili" , 0x048609 }, + { (char*) "Asia/Dubai" , 0x048716 }, + { (char*) "Asia/Dushanbe" , 0x0487B9 }, + { (char*) "Asia/Famagusta" , 0x048A06 }, + { (char*) "Asia/Gaza" , 0x04920D }, + { (char*) "Asia/Harbin" , 0x04A127 }, + { (char*) "Asia/Hebron" , 0x04A364 }, + { (char*) "Asia/Ho_Chi_Minh" , 0x04B299 }, + { (char*) "Asia/Hong_Kong" , 0x04B3F6 }, + { (char*) "Asia/Hovd" , 0x04B8D3 }, + { (char*) "Asia/Irkutsk" , 0x04BC62 }, + { (char*) "Asia/Istanbul" , 0x04C155 }, + { (char*) "Asia/Jakarta" , 0x04C8EE }, + { (char*) "Asia/Jayapura" , 0x04CA86 }, + { (char*) "Asia/Jerusalem" , 0x04CBA5 }, + { (char*) "Asia/Kabul" , 0x04D505 }, + { (char*) "Asia/Kamchatka" , 0x04D5D3 }, + { (char*) "Asia/Karachi" , 0x04DA71 }, + { (char*) "Asia/Kashgar" , 0x04DBF8 }, + { (char*) "Asia/Kathmandu" , 0x04DC9B }, + { (char*) "Asia/Katmandu" , 0x04DD6D }, + { (char*) "Asia/Khandyga" , 0x04DE3F }, + { (char*) "Asia/Kolkata" , 0x04E352 }, + { (char*) "Asia/Krasnoyarsk" , 0x04E47B }, + { (char*) "Asia/Kuala_Lumpur" , 0x04E949 }, + { (char*) "Asia/Kuching" , 0x04EAFA }, + { (char*) "Asia/Kuwait" , 0x04ECE9 }, + { (char*) "Asia/Macao" , 0x04ED8C }, + { (char*) "Asia/Macau" , 0x04F263 }, + { (char*) "Asia/Magadan" , 0x04F73A }, + { (char*) "Asia/Makassar" , 0x04FC0E }, + { (char*) "Asia/Manila" , 0x04FD61 }, + { (char*) "Asia/Muscat" , 0x04FF13 }, + { (char*) "Asia/Nicosia" , 0x04FFB6 }, + { (char*) "Asia/Novokuznetsk" , 0x0507A2 }, + { (char*) "Asia/Novosibirsk" , 0x050C3E }, + { (char*) "Asia/Omsk" , 0x051115 }, + { (char*) "Asia/Oral" , 0x0515D7 }, + { (char*) "Asia/Phnom_Penh" , 0x0519D1 }, + { (char*) "Asia/Pontianak" , 0x051AF6 }, + { (char*) "Asia/Pyongyang" , 0x051C79 }, + { (char*) "Asia/Qatar" , 0x051D72 }, + { (char*) "Asia/Qostanay" , 0x051E37 }, + { (char*) "Asia/Qyzylorda" , 0x05225E }, + { (char*) "Asia/Rangoon" , 0x05267A }, + { (char*) "Asia/Riyadh" , 0x052784 }, + { (char*) "Asia/Saigon" , 0x052827 }, + { (char*) "Asia/Sakhalin" , 0x052984 }, + { (char*) "Asia/Samarkand" , 0x052E4C }, + { (char*) "Asia/Seoul" , 0x05309C }, + { (char*) "Asia/Shanghai" , 0x053311 }, + { (char*) "Asia/Singapore" , 0x05355A }, + { (char*) "Asia/Srednekolymsk" , 0x0536F7 }, + { (char*) "Asia/Taipei" , 0x053BCB }, + { (char*) "Asia/Tashkent" , 0x053ED0 }, + { (char*) "Asia/Tbilisi" , 0x05412E }, + { (char*) "Asia/Tehran" , 0x054529 }, + { (char*) "Asia/Tel_Aviv" , 0x054A15 }, + { (char*) "Asia/Thimbu" , 0x055375 }, + { (char*) "Asia/Thimphu" , 0x05543E }, + { (char*) "Asia/Tokyo" , 0x055507 }, + { (char*) "Asia/Tomsk" , 0x055648 }, + { (char*) "Asia/Ujung_Pandang" , 0x055B19 }, + { (char*) "Asia/Ulaanbaatar" , 0x055C23 }, + { (char*) "Asia/Ulan_Bator" , 0x055FAC }, + { (char*) "Asia/Urumqi" , 0x056325 }, + { (char*) "Asia/Ust-Nera" , 0x0563D5 }, + { (char*) "Asia/Vientiane" , 0x0568CB }, + { (char*) "Asia/Vladivostok" , 0x056A0C }, + { (char*) "Asia/Yakutsk" , 0x056ED5 }, + { (char*) "Asia/Yangon" , 0x05739D }, + { (char*) "Asia/Yekaterinburg" , 0x0574A7 }, + { (char*) "Asia/Yerevan" , 0x05798E }, + { (char*) "Atlantic/Azores" , 0x057E0B }, + { (char*) "Atlantic/Bermuda" , 0x058B8F }, + { (char*) "Atlantic/Canary" , 0x0594F7 }, + { (char*) "Atlantic/Cape_Verde" , 0x059C7A }, + { (char*) "Atlantic/Faeroe" , 0x059D86 }, + { (char*) "Atlantic/Faroe" , 0x05A4A9 }, + { (char*) "Atlantic/Jan_Mayen" , 0x05ABCC }, + { (char*) "Atlantic/Madeira" , 0x05B4D2 }, + { (char*) "Atlantic/Reykjavik" , 0x05C21E }, + { (char*) "Atlantic/South_Georgia" , 0x05C6B4 }, + { (char*) "Atlantic/St_Helena" , 0x05C756 }, + { (char*) "Atlantic/Stanley" , 0x05C818 }, + { (char*) "Australia/ACT" , 0x05CCD4 }, + { (char*) "Australia/Adelaide" , 0x05D56E }, + { (char*) "Australia/Brisbane" , 0x05DE29 }, + { (char*) "Australia/Broken_Hill" , 0x05DFEF }, + { (char*) "Australia/Canberra" , 0x05E8CC }, + { (char*) "Australia/Currie" , 0x05F166 }, + { (char*) "Australia/Darwin" , 0x05FAA8 }, + { (char*) "Australia/Eucla" , 0x05FC0B }, + { (char*) "Australia/Hobart" , 0x05FDF8 }, + { (char*) "Australia/LHI" , 0x060742 }, + { (char*) "Australia/Lindeman" , 0x060E84 }, + { (char*) "Australia/Lord_Howe" , 0x06108A }, + { (char*) "Australia/Melbourne" , 0x0617DC }, + { (char*) "Australia/North" , 0x06207E }, + { (char*) "Australia/NSW" , 0x0621CF }, + { (char*) "Australia/Perth" , 0x062A69 }, + { (char*) "Australia/Queensland" , 0x062C51 }, + { (char*) "Australia/South" , 0x062E00 }, + { (char*) "Australia/Sydney" , 0x0636AC }, + { (char*) "Australia/Tasmania" , 0x063F62 }, + { (char*) "Australia/Victoria" , 0x0648A4 }, + { (char*) "Australia/West" , 0x06513E }, + { (char*) "Australia/Yancowinna" , 0x065308 }, + { (char*) "Brazil/Acre" , 0x065BC9 }, + { (char*) "Brazil/DeNoronha" , 0x065E3B }, + { (char*) "Brazil/East" , 0x066105 }, + { (char*) "Brazil/West" , 0x0666A7 }, + { (char*) "Canada/Atlantic" , 0x066901 }, + { (char*) "Canada/Central" , 0x06766D }, + { (char*) "Canada/Eastern" , 0x0681AD }, + { (char*) "Canada/Mountain" , 0x068F5F }, + { (char*) "Canada/Newfoundland" , 0x069887 }, + { (char*) "Canada/Pacific" , 0x06A6DA }, + { (char*) "Canada/Saskatchewan" , 0x06B232 }, + { (char*) "Canada/Yukon" , 0x06B612 }, + { (char*) "CET" , 0x06BC6C }, + { (char*) "Chile/Continental" , 0x06C7ED }, + { (char*) "Chile/EasterIsland" , 0x06D1CC }, + { (char*) "CST6CDT" , 0x06DA83 }, + { (char*) "Cuba" , 0x06E897 }, + { (char*) "EET" , 0x06F213 }, + { (char*) "Egypt" , 0x06FAF5 }, + { (char*) "Eire" , 0x070460 }, + { (char*) "EST" , 0x071210 }, + { (char*) "EST5EDT" , 0x0712D2 }, + { (char*) "Etc/GMT" , 0x0720BE }, + { (char*) "Etc/GMT+0" , 0x07213C }, + { (char*) "Etc/GMT+1" , 0x0721BA }, + { (char*) "Etc/GMT+10" , 0x07223A }, + { (char*) "Etc/GMT+11" , 0x0722BB }, + { (char*) "Etc/GMT+12" , 0x07233C }, + { (char*) "Etc/GMT+2" , 0x0723BD }, + { (char*) "Etc/GMT+3" , 0x07243D }, + { (char*) "Etc/GMT+4" , 0x0724BD }, + { (char*) "Etc/GMT+5" , 0x07253D }, + { (char*) "Etc/GMT+6" , 0x0725BD }, + { (char*) "Etc/GMT+7" , 0x07263D }, + { (char*) "Etc/GMT+8" , 0x0726BD }, + { (char*) "Etc/GMT+9" , 0x07273D }, + { (char*) "Etc/GMT-0" , 0x0727BD }, + { (char*) "Etc/GMT-1" , 0x07283B }, + { (char*) "Etc/GMT-10" , 0x0728BC }, + { (char*) "Etc/GMT-11" , 0x07293E }, + { (char*) "Etc/GMT-12" , 0x0729C0 }, + { (char*) "Etc/GMT-13" , 0x072A42 }, + { (char*) "Etc/GMT-14" , 0x072AC4 }, + { (char*) "Etc/GMT-2" , 0x072B46 }, + { (char*) "Etc/GMT-3" , 0x072BC7 }, + { (char*) "Etc/GMT-4" , 0x072C48 }, + { (char*) "Etc/GMT-5" , 0x072CC9 }, + { (char*) "Etc/GMT-6" , 0x072D4A }, + { (char*) "Etc/GMT-7" , 0x072DCB }, + { (char*) "Etc/GMT-8" , 0x072E4C }, + { (char*) "Etc/GMT-9" , 0x072ECD }, + { (char*) "Etc/GMT0" , 0x072F4E }, + { (char*) "Etc/Greenwich" , 0x072FCC }, + { (char*) "Etc/UCT" , 0x07304A }, + { (char*) "Etc/Universal" , 0x0730C8 }, + { (char*) "Etc/UTC" , 0x073146 }, + { (char*) "Etc/Zulu" , 0x0731C4 }, + { (char*) "Europe/Amsterdam" , 0x073242 }, + { (char*) "Europe/Andorra" , 0x073DAC }, + { (char*) "Europe/Astrakhan" , 0x074486 }, + { (char*) "Europe/Athens" , 0x074923 }, + { (char*) "Europe/Belfast" , 0x075205 }, + { (char*) "Europe/Belgrade" , 0x076061 }, + { (char*) "Europe/Berlin" , 0x0767ED }, + { (char*) "Europe/Bratislava" , 0x077102 }, + { (char*) "Europe/Brussels" , 0x077A0B }, + { (char*) "Europe/Bucharest" , 0x07858C }, + { (char*) "Europe/Budapest" , 0x078E20 }, + { (char*) "Europe/Busingen" , 0x07976C }, + { (char*) "Europe/Chisinau" , 0x079EF5 }, + { (char*) "Europe/Copenhagen" , 0x07A879 }, + { (char*) "Europe/Dublin" , 0x07B0DE }, + { (char*) "Europe/Gibraltar" , 0x07BE8E }, + { (char*) "Europe/Guernsey" , 0x07CA96 }, + { (char*) "Europe/Helsinki" , 0x07D936 }, + { (char*) "Europe/Isle_of_Man" , 0x07E0AE }, + { (char*) "Europe/Istanbul" , 0x07EEFA }, + { (char*) "Europe/Jersey" , 0x07F693 }, + { (char*) "Europe/Kaliningrad" , 0x080533 }, + { (char*) "Europe/Kiev" , 0x080B28 }, + { (char*) "Europe/Kirov" , 0x08137C }, + { (char*) "Europe/Kyiv" , 0x081837 }, + { (char*) "Europe/Lisbon" , 0x08209A }, + { (char*) "Europe/Ljubljana" , 0x082E80 }, + { (char*) "Europe/London" , 0x08360C }, + { (char*) "Europe/Luxembourg" , 0x084468 }, + { (char*) "Europe/Madrid" , 0x084FF6 }, + { (char*) "Europe/Malta" , 0x085A48 }, + { (char*) "Europe/Mariehamn" , 0x086490 }, + { (char*) "Europe/Minsk" , 0x086C08 }, + { (char*) "Europe/Monaco" , 0x08712F }, + { (char*) "Europe/Moscow" , 0x087CBB }, + { (char*) "Europe/Nicosia" , 0x0882DA }, + { (char*) "Europe/Oslo" , 0x088AB8 }, + { (char*) "Europe/Paris" , 0x089378 }, + { (char*) "Europe/Podgorica" , 0x089F16 }, + { (char*) "Europe/Prague" , 0x08A6A2 }, + { (char*) "Europe/Riga" , 0x08AFAB }, + { (char*) "Europe/Rome" , 0x08B84D }, + { (char*) "Europe/Samara" , 0x08C2AA }, + { (char*) "Europe/San_Marino" , 0x08C780 }, + { (char*) "Europe/Sarajevo" , 0x08D1DD }, + { (char*) "Europe/Saratov" , 0x08D969 }, + { (char*) "Europe/Simferopol" , 0x08DE16 }, + { (char*) "Europe/Skopje" , 0x08E3E5 }, + { (char*) "Europe/Sofia" , 0x08EB71 }, + { (char*) "Europe/Stockholm" , 0x08F39A }, + { (char*) "Europe/Tallinn" , 0x08FB1B }, + { (char*) "Europe/Tirane" , 0x09038B }, + { (char*) "Europe/Tiraspol" , 0x090BBB }, + { (char*) "Europe/Ulyanovsk" , 0x09153F }, + { (char*) "Europe/Uzhgorod" , 0x091A42 }, + { (char*) "Europe/Vaduz" , 0x092296 }, + { (char*) "Europe/Vatican" , 0x092A02 }, + { (char*) "Europe/Vienna" , 0x09345F }, + { (char*) "Europe/Vilnius" , 0x093D03 }, + { (char*) "Europe/Volgograd" , 0x094581 }, + { (char*) "Europe/Warsaw" , 0x094A48 }, + { (char*) "Europe/Zagreb" , 0x0954B2 }, + { (char*) "Europe/Zaporozhye" , 0x095C3E }, + { (char*) "Europe/Zurich" , 0x096492 }, + { (char*) "Factory" , 0x096C13 }, + { (char*) "GB" , 0x096C93 }, + { (char*) "GB-Eire" , 0x097AEF }, + { (char*) "GMT" , 0x09894B }, + { (char*) "GMT+0" , 0x0989C9 }, + { (char*) "GMT-0" , 0x098A47 }, + { (char*) "GMT0" , 0x098AC5 }, + { (char*) "Greenwich" , 0x098B43 }, + { (char*) "Hongkong" , 0x098BC1 }, + { (char*) "HST" , 0x09909E }, + { (char*) "Iceland" , 0x0991F3 }, + { (char*) "Indian/Antananarivo" , 0x099293 }, + { (char*) "Indian/Chagos" , 0x09937A }, + { (char*) "Indian/Christmas" , 0x09943F }, + { (char*) "Indian/Cocos" , 0x0994E2 }, + { (char*) "Indian/Comoro" , 0x09958E }, + { (char*) "Indian/Kerguelen" , 0x09962F }, + { (char*) "Indian/Mahe" , 0x0996D2 }, + { (char*) "Indian/Maldives" , 0x099775 }, + { (char*) "Indian/Mauritius" , 0x09983A }, + { (char*) "Indian/Mayotte" , 0x099929 }, + { (char*) "Indian/Reunion" , 0x0999CA }, + { (char*) "Iran" , 0x099A6D }, + { (char*) "Israel" , 0x099F59 }, + { (char*) "Jamaica" , 0x09A8B9 }, + { (char*) "Japan" , 0x09AAA7 }, + { (char*) "Kwajalein" , 0x09ABE8 }, + { (char*) "Libya" , 0x09AD22 }, + { (char*) "MET" , 0x09AF9F }, + { (char*) "Mexico/BajaNorte" , 0x09BB20 }, + { (char*) "Mexico/BajaSur" , 0x09C686 }, + { (char*) "Mexico/General" , 0x09CAB6 }, + { (char*) "MST" , 0x09CF88 }, + { (char*) "MST7MDT" , 0x09D0FC }, + { (char*) "Navajo" , 0x09DAA4 }, + { (char*) "NZ" , 0x09E44C }, + { (char*) "NZ-CHAT" , 0x09EDDD }, + { (char*) "Pacific/Apia" , 0x09F5EF }, + { (char*) "Pacific/Auckland" , 0x09F851 }, + { (char*) "Pacific/Bougainville" , 0x0A01F5 }, + { (char*) "Pacific/Chatham" , 0x0A030B }, + { (char*) "Pacific/Chuuk" , 0x0A0B2C }, + { (char*) "Pacific/Easter" , 0x0A0C46 }, + { (char*) "Pacific/Efate" , 0x0A150A }, + { (char*) "Pacific/Enderbury" , 0x0A1722 }, + { (char*) "Pacific/Fakaofo" , 0x0A180A }, + { (char*) "Pacific/Fiji" , 0x0A18D0 }, + { (char*) "Pacific/Funafuti" , 0x0A1B10 }, + { (char*) "Pacific/Galapagos" , 0x0A1BB4 }, + { (char*) "Pacific/Gambier" , 0x0A1CB1 }, + { (char*) "Pacific/Guadalcanal" , 0x0A1D62 }, + { (char*) "Pacific/Guam" , 0x0A1E06 }, + { (char*) "Pacific/Honolulu" , 0x0A2000 }, + { (char*) "Pacific/Johnston" , 0x0A215B }, + { (char*) "Pacific/Kanton" , 0x0A22B0 }, + { (char*) "Pacific/Kiritimati" , 0x0A23A7 }, + { (char*) "Pacific/Kosrae" , 0x0A249F }, + { (char*) "Pacific/Kwajalein" , 0x0A2602 }, + { (char*) "Pacific/Majuro" , 0x0A2745 }, + { (char*) "Pacific/Marquesas" , 0x0A2891 }, + { (char*) "Pacific/Midway" , 0x0A294D }, + { (char*) "Pacific/Nauru" , 0x0A2A40 }, + { (char*) "Pacific/Niue" , 0x0A2B3A }, + { (char*) "Pacific/Norfolk" , 0x0A2C03 }, + { (char*) "Pacific/Noumea" , 0x0A2F71 }, + { (char*) "Pacific/Pago_Pago" , 0x0A309F }, + { (char*) "Pacific/Palau" , 0x0A315A }, + { (char*) "Pacific/Pitcairn" , 0x0A320C }, + { (char*) "Pacific/Pohnpei" , 0x0A32D4 }, + { (char*) "Pacific/Ponape" , 0x0A340F }, + { (char*) "Pacific/Port_Moresby" , 0x0A34B3 }, + { (char*) "Pacific/Rarotonga" , 0x0A3583 }, + { (char*) "Pacific/Saipan" , 0x0A37DC }, + { (char*) "Pacific/Samoa" , 0x0A39C8 }, + { (char*) "Pacific/Tahiti" , 0x0A3A83 }, + { (char*) "Pacific/Tarawa" , 0x0A3B35 }, + { (char*) "Pacific/Tongatapu" , 0x0A3BE8 }, + { (char*) "Pacific/Truk" , 0x0A3D5A }, + { (char*) "Pacific/Wake" , 0x0A3E12 }, + { (char*) "Pacific/Wallis" , 0x0A3EC1 }, + { (char*) "Pacific/Yap" , 0x0A3F65 }, + { (char*) "Poland" , 0x0A401D }, + { (char*) "Portugal" , 0x0A4A87 }, + { (char*) "PRC" , 0x0A585A }, + { (char*) "PST8PDT" , 0x0A5A97 }, + { (char*) "ROC" , 0x0A65C7 }, + { (char*) "ROK" , 0x0A68CC }, + { (char*) "Singapore" , 0x0A6B41 }, + { (char*) "Turkey" , 0x0A6CDE }, + { (char*) "UCT" , 0x0A7477 }, + { (char*) "Universal" , 0x0A74F5 }, + { (char*) "US/Alaska" , 0x0A7573 }, + { (char*) "US/Aleutian" , 0x0A7EC2 }, + { (char*) "US/Arizona" , 0x0A8802 }, + { (char*) "US/Central" , 0x0A8976 }, + { (char*) "US/East-Indiana" , 0x0A978A }, + { (char*) "US/Eastern" , 0x0A9E28 }, + { (char*) "US/Hawaii" , 0x0AAC14 }, + { (char*) "US/Indiana-Starke" , 0x0AAD69 }, + { (char*) "US/Michigan" , 0x0AB701 }, + { (char*) "US/Mountain" , 0x0ABFC3 }, + { (char*) "US/Pacific" , 0x0AC96B }, + { (char*) "US/Samoa" , 0x0AD49B }, + { (char*) "UTC" , 0x0AD556 }, + { (char*) "W-SU" , 0x0AD5D4 }, + { (char*) "WET" , 0x0ADBDF }, + { (char*) "Zulu" , 0x0AE9B2 }, }; -const unsigned char timelib_timezone_db_data_builtin[713466] = { +const unsigned char timelib_timezone_db_data_builtin[715312] = { /* Africa/Abidjan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -30736,15 +30865,23 @@ /* America/Ensenada */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, +0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, 0xA9, 0x79, 0x4F, 0x70, 0xAF, 0xF1, 0x39, 0x80, 0xB6, 0x66, 0x64, 0x70, 0xB7, 0x1B, 0x10, 0x00, 0xB8, 0x0A, 0xF2, 0xF0, 0xCB, 0xEA, 0x8D, 0x80, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x9D, 0xAE, 0xF0, 0xD7, 0x1B, 0x59, 0x00, 0xD8, 0x91, 0xB4, 0xF0, 0xDB, 0x00, 0x07, 0x00, 0xDB, 0xC0, 0x73, 0xF0, 0xDC, 0xDE, 0xB3, 0xA0, 0xDD, 0xA9, 0xAC, 0x90, 0xDE, 0xBE, 0x95, 0xA0, 0xDF, 0x89, 0x8E, 0x90, -0xE2, 0x7E, 0x4B, 0x90, 0xE3, 0x49, 0x52, 0x90, 0xE4, 0x5E, 0x2D, 0x90, 0xE5, 0x29, 0x34, 0x90, -0xE6, 0x47, 0x4A, 0x10, 0xE7, 0x12, 0x51, 0x10, 0xE8, 0x27, 0x2C, 0x10, 0xE8, 0xF2, 0x33, 0x10, -0xEA, 0x07, 0x0E, 0x10, 0xEA, 0xD2, 0x15, 0x10, 0xEB, 0xE6, 0xF0, 0x10, 0xEC, 0xB1, 0xF7, 0x10, -0xED, 0xC6, 0xD2, 0x10, 0xEE, 0x91, 0xD9, 0x10, 0x0B, 0xE0, 0xAF, 0xA0, 0x0C, 0xD9, 0xCD, 0x10, +0xE0, 0x9E, 0x69, 0x90, 0xE1, 0x69, 0x70, 0x90, 0xE2, 0x7E, 0x4B, 0x90, 0xE3, 0x49, 0x52, 0x90, +0xE4, 0x5E, 0x2D, 0x90, 0xE5, 0x29, 0x34, 0x90, 0xE6, 0x47, 0x4A, 0x10, 0xE7, 0x12, 0x51, 0x10, +0xE8, 0x27, 0x2C, 0x10, 0xE8, 0xF2, 0x33, 0x10, 0xEA, 0x07, 0x0E, 0x10, 0xEA, 0xD2, 0x15, 0x10, +0xEB, 0xE6, 0xF0, 0x10, 0xEC, 0xB1, 0xF7, 0x10, 0xED, 0xC6, 0xD2, 0x10, 0xEE, 0x91, 0xD9, 0x10, +0xEF, 0xAF, 0xEE, 0x90, 0xF0, 0x71, 0xBB, 0x10, 0xF1, 0x8F, 0xD0, 0x90, 0xF2, 0x7F, 0xC1, 0x90, +0xF3, 0x6F, 0xB2, 0x90, 0xF4, 0x5F, 0xA3, 0x90, 0xF5, 0x4F, 0x94, 0x90, 0xF6, 0x3F, 0x85, 0x90, +0xF7, 0x2F, 0x76, 0x90, 0xF8, 0x28, 0xA2, 0x10, 0xF9, 0x0F, 0x58, 0x90, 0xFA, 0x08, 0x84, 0x10, +0xFA, 0xF8, 0x83, 0x20, 0xFB, 0xE8, 0x66, 0x10, 0xFC, 0xD8, 0x65, 0x20, 0xFD, 0xC8, 0x48, 0x10, +0xFE, 0xB8, 0x47, 0x20, 0xFF, 0xA8, 0x2A, 0x10, 0x00, 0x98, 0x29, 0x20, 0x01, 0x88, 0x0C, 0x10, +0x02, 0x78, 0x0B, 0x20, 0x03, 0x71, 0x28, 0x90, 0x04, 0x61, 0x27, 0xA0, 0x05, 0x51, 0x0A, 0x90, +0x06, 0x41, 0x09, 0xA0, 0x07, 0x30, 0xEC, 0x90, 0x07, 0x8D, 0x43, 0xA0, 0x09, 0x10, 0xCE, 0x90, +0x09, 0xAD, 0xBF, 0x20, 0x0A, 0xF0, 0xB0, 0x90, 0x0B, 0xE0, 0xAF, 0xA0, 0x0C, 0xD9, 0xCD, 0x10, 0x0D, 0xC0, 0x91, 0xA0, 0x0E, 0xB9, 0xAF, 0x10, 0x0F, 0xA9, 0xAE, 0x20, 0x10, 0x99, 0x91, 0x10, 0x11, 0x89, 0x90, 0x20, 0x12, 0x79, 0x73, 0x10, 0x13, 0x69, 0x72, 0x20, 0x14, 0x59, 0x55, 0x10, 0x15, 0x49, 0x54, 0x20, 0x16, 0x39, 0x37, 0x10, 0x17, 0x29, 0x36, 0x20, 0x18, 0x22, 0x53, 0x90, @@ -30785,6 +30922,8 @@ 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, 0xFF, 0xFF, 0x8F, @@ -30792,7 +30931,7 @@ 0x44, 0x54, 0x00, 0x50, 0x57, 0x54, 0x00, 0x50, 0x50, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x4F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF1, 0x39, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x64, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1B, 0x10, 0x00, 0xFF, @@ -30802,13 +30941,29 @@ 0xFF, 0xFF, 0xFF, 0xDB, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC0, 0x73, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0xB3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0xAC, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x95, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x8E, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x69, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x70, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x52, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x2D, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x34, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x4A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x51, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x2C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x33, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x0E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xD2, 0x15, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xB1, 0xF7, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0x00, +0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xEE, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x71, 0xBB, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xD0, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0xC1, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0xB2, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0xA3, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x94, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x85, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x76, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0xA2, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x58, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x84, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x83, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x66, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x65, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x48, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x47, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x2A, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x98, 0x29, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x88, 0x0C, 0x10, 0x00, +0x00, 0x00, 0x00, 0x02, 0x78, 0x0B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x71, 0x28, 0x90, 0x00, +0x00, 0x00, 0x00, 0x04, 0x61, 0x27, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x51, 0x0A, 0x90, 0x00, +0x00, 0x00, 0x00, 0x06, 0x41, 0x09, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x30, 0xEC, 0x90, 0x00, +0x00, 0x00, 0x00, 0x07, 0x8D, 0x43, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xCE, 0x90, 0x00, +0x00, 0x00, 0x00, 0x09, 0xAD, 0xBF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0xB0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xCD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x91, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0xAF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xAE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x91, 0x10, 0x00, @@ -30880,6 +31035,8 @@ 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, @@ -38972,15 +39129,23 @@ /* America/Santa_Isabel */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, +0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, 0xA9, 0x79, 0x4F, 0x70, 0xAF, 0xF1, 0x39, 0x80, 0xB6, 0x66, 0x64, 0x70, 0xB7, 0x1B, 0x10, 0x00, 0xB8, 0x0A, 0xF2, 0xF0, 0xCB, 0xEA, 0x8D, 0x80, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x9D, 0xAE, 0xF0, 0xD7, 0x1B, 0x59, 0x00, 0xD8, 0x91, 0xB4, 0xF0, 0xDB, 0x00, 0x07, 0x00, 0xDB, 0xC0, 0x73, 0xF0, 0xDC, 0xDE, 0xB3, 0xA0, 0xDD, 0xA9, 0xAC, 0x90, 0xDE, 0xBE, 0x95, 0xA0, 0xDF, 0x89, 0x8E, 0x90, -0xE2, 0x7E, 0x4B, 0x90, 0xE3, 0x49, 0x52, 0x90, 0xE4, 0x5E, 0x2D, 0x90, 0xE5, 0x29, 0x34, 0x90, -0xE6, 0x47, 0x4A, 0x10, 0xE7, 0x12, 0x51, 0x10, 0xE8, 0x27, 0x2C, 0x10, 0xE8, 0xF2, 0x33, 0x10, -0xEA, 0x07, 0x0E, 0x10, 0xEA, 0xD2, 0x15, 0x10, 0xEB, 0xE6, 0xF0, 0x10, 0xEC, 0xB1, 0xF7, 0x10, -0xED, 0xC6, 0xD2, 0x10, 0xEE, 0x91, 0xD9, 0x10, 0x0B, 0xE0, 0xAF, 0xA0, 0x0C, 0xD9, 0xCD, 0x10, +0xE0, 0x9E, 0x69, 0x90, 0xE1, 0x69, 0x70, 0x90, 0xE2, 0x7E, 0x4B, 0x90, 0xE3, 0x49, 0x52, 0x90, +0xE4, 0x5E, 0x2D, 0x90, 0xE5, 0x29, 0x34, 0x90, 0xE6, 0x47, 0x4A, 0x10, 0xE7, 0x12, 0x51, 0x10, +0xE8, 0x27, 0x2C, 0x10, 0xE8, 0xF2, 0x33, 0x10, 0xEA, 0x07, 0x0E, 0x10, 0xEA, 0xD2, 0x15, 0x10, +0xEB, 0xE6, 0xF0, 0x10, 0xEC, 0xB1, 0xF7, 0x10, 0xED, 0xC6, 0xD2, 0x10, 0xEE, 0x91, 0xD9, 0x10, +0xEF, 0xAF, 0xEE, 0x90, 0xF0, 0x71, 0xBB, 0x10, 0xF1, 0x8F, 0xD0, 0x90, 0xF2, 0x7F, 0xC1, 0x90, +0xF3, 0x6F, 0xB2, 0x90, 0xF4, 0x5F, 0xA3, 0x90, 0xF5, 0x4F, 0x94, 0x90, 0xF6, 0x3F, 0x85, 0x90, +0xF7, 0x2F, 0x76, 0x90, 0xF8, 0x28, 0xA2, 0x10, 0xF9, 0x0F, 0x58, 0x90, 0xFA, 0x08, 0x84, 0x10, +0xFA, 0xF8, 0x83, 0x20, 0xFB, 0xE8, 0x66, 0x10, 0xFC, 0xD8, 0x65, 0x20, 0xFD, 0xC8, 0x48, 0x10, +0xFE, 0xB8, 0x47, 0x20, 0xFF, 0xA8, 0x2A, 0x10, 0x00, 0x98, 0x29, 0x20, 0x01, 0x88, 0x0C, 0x10, +0x02, 0x78, 0x0B, 0x20, 0x03, 0x71, 0x28, 0x90, 0x04, 0x61, 0x27, 0xA0, 0x05, 0x51, 0x0A, 0x90, +0x06, 0x41, 0x09, 0xA0, 0x07, 0x30, 0xEC, 0x90, 0x07, 0x8D, 0x43, 0xA0, 0x09, 0x10, 0xCE, 0x90, +0x09, 0xAD, 0xBF, 0x20, 0x0A, 0xF0, 0xB0, 0x90, 0x0B, 0xE0, 0xAF, 0xA0, 0x0C, 0xD9, 0xCD, 0x10, 0x0D, 0xC0, 0x91, 0xA0, 0x0E, 0xB9, 0xAF, 0x10, 0x0F, 0xA9, 0xAE, 0x20, 0x10, 0x99, 0x91, 0x10, 0x11, 0x89, 0x90, 0x20, 0x12, 0x79, 0x73, 0x10, 0x13, 0x69, 0x72, 0x20, 0x14, 0x59, 0x55, 0x10, 0x15, 0x49, 0x54, 0x20, 0x16, 0x39, 0x37, 0x10, 0x17, 0x29, 0x36, 0x20, 0x18, 0x22, 0x53, 0x90, @@ -39021,6 +39186,8 @@ 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, 0xFF, 0xFF, 0x8F, @@ -39028,7 +39195,7 @@ 0x44, 0x54, 0x00, 0x50, 0x57, 0x54, 0x00, 0x50, 0x50, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x4F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF1, 0x39, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x64, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1B, 0x10, 0x00, 0xFF, @@ -39038,13 +39205,29 @@ 0xFF, 0xFF, 0xFF, 0xDB, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC0, 0x73, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0xB3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0xAC, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x95, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x8E, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x69, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x70, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x52, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x2D, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x34, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x4A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x51, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x2C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x33, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x0E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xD2, 0x15, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xB1, 0xF7, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0x00, +0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xEE, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x71, 0xBB, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xD0, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0xC1, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0xB2, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0xA3, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x94, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x85, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x76, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0xA2, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x58, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x84, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x83, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x66, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x65, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x48, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x47, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x2A, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x98, 0x29, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x88, 0x0C, 0x10, 0x00, +0x00, 0x00, 0x00, 0x02, 0x78, 0x0B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x71, 0x28, 0x90, 0x00, +0x00, 0x00, 0x00, 0x04, 0x61, 0x27, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x51, 0x0A, 0x90, 0x00, +0x00, 0x00, 0x00, 0x06, 0x41, 0x09, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x30, 0xEC, 0x90, 0x00, +0x00, 0x00, 0x00, 0x07, 0x8D, 0x43, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xCE, 0x90, 0x00, +0x00, 0x00, 0x00, 0x09, 0xAD, 0xBF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0xB0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xCD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x91, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0xAF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xAE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x91, 0x10, 0x00, @@ -39116,6 +39299,8 @@ 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, @@ -40578,15 +40763,23 @@ /* America/Tijuana */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, +0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, 0xA9, 0x79, 0x4F, 0x70, 0xAF, 0xF1, 0x39, 0x80, 0xB6, 0x66, 0x64, 0x70, 0xB7, 0x1B, 0x10, 0x00, 0xB8, 0x0A, 0xF2, 0xF0, 0xCB, 0xEA, 0x8D, 0x80, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x9D, 0xAE, 0xF0, 0xD7, 0x1B, 0x59, 0x00, 0xD8, 0x91, 0xB4, 0xF0, 0xDB, 0x00, 0x07, 0x00, 0xDB, 0xC0, 0x73, 0xF0, 0xDC, 0xDE, 0xB3, 0xA0, 0xDD, 0xA9, 0xAC, 0x90, 0xDE, 0xBE, 0x95, 0xA0, 0xDF, 0x89, 0x8E, 0x90, -0xE2, 0x7E, 0x4B, 0x90, 0xE3, 0x49, 0x52, 0x90, 0xE4, 0x5E, 0x2D, 0x90, 0xE5, 0x29, 0x34, 0x90, -0xE6, 0x47, 0x4A, 0x10, 0xE7, 0x12, 0x51, 0x10, 0xE8, 0x27, 0x2C, 0x10, 0xE8, 0xF2, 0x33, 0x10, -0xEA, 0x07, 0x0E, 0x10, 0xEA, 0xD2, 0x15, 0x10, 0xEB, 0xE6, 0xF0, 0x10, 0xEC, 0xB1, 0xF7, 0x10, -0xED, 0xC6, 0xD2, 0x10, 0xEE, 0x91, 0xD9, 0x10, 0x0B, 0xE0, 0xAF, 0xA0, 0x0C, 0xD9, 0xCD, 0x10, +0xE0, 0x9E, 0x69, 0x90, 0xE1, 0x69, 0x70, 0x90, 0xE2, 0x7E, 0x4B, 0x90, 0xE3, 0x49, 0x52, 0x90, +0xE4, 0x5E, 0x2D, 0x90, 0xE5, 0x29, 0x34, 0x90, 0xE6, 0x47, 0x4A, 0x10, 0xE7, 0x12, 0x51, 0x10, +0xE8, 0x27, 0x2C, 0x10, 0xE8, 0xF2, 0x33, 0x10, 0xEA, 0x07, 0x0E, 0x10, 0xEA, 0xD2, 0x15, 0x10, +0xEB, 0xE6, 0xF0, 0x10, 0xEC, 0xB1, 0xF7, 0x10, 0xED, 0xC6, 0xD2, 0x10, 0xEE, 0x91, 0xD9, 0x10, +0xEF, 0xAF, 0xEE, 0x90, 0xF0, 0x71, 0xBB, 0x10, 0xF1, 0x8F, 0xD0, 0x90, 0xF2, 0x7F, 0xC1, 0x90, +0xF3, 0x6F, 0xB2, 0x90, 0xF4, 0x5F, 0xA3, 0x90, 0xF5, 0x4F, 0x94, 0x90, 0xF6, 0x3F, 0x85, 0x90, +0xF7, 0x2F, 0x76, 0x90, 0xF8, 0x28, 0xA2, 0x10, 0xF9, 0x0F, 0x58, 0x90, 0xFA, 0x08, 0x84, 0x10, +0xFA, 0xF8, 0x83, 0x20, 0xFB, 0xE8, 0x66, 0x10, 0xFC, 0xD8, 0x65, 0x20, 0xFD, 0xC8, 0x48, 0x10, +0xFE, 0xB8, 0x47, 0x20, 0xFF, 0xA8, 0x2A, 0x10, 0x00, 0x98, 0x29, 0x20, 0x01, 0x88, 0x0C, 0x10, +0x02, 0x78, 0x0B, 0x20, 0x03, 0x71, 0x28, 0x90, 0x04, 0x61, 0x27, 0xA0, 0x05, 0x51, 0x0A, 0x90, +0x06, 0x41, 0x09, 0xA0, 0x07, 0x30, 0xEC, 0x90, 0x07, 0x8D, 0x43, 0xA0, 0x09, 0x10, 0xCE, 0x90, +0x09, 0xAD, 0xBF, 0x20, 0x0A, 0xF0, 0xB0, 0x90, 0x0B, 0xE0, 0xAF, 0xA0, 0x0C, 0xD9, 0xCD, 0x10, 0x0D, 0xC0, 0x91, 0xA0, 0x0E, 0xB9, 0xAF, 0x10, 0x0F, 0xA9, 0xAE, 0x20, 0x10, 0x99, 0x91, 0x10, 0x11, 0x89, 0x90, 0x20, 0x12, 0x79, 0x73, 0x10, 0x13, 0x69, 0x72, 0x20, 0x14, 0x59, 0x55, 0x10, 0x15, 0x49, 0x54, 0x20, 0x16, 0x39, 0x37, 0x10, 0x17, 0x29, 0x36, 0x20, 0x18, 0x22, 0x53, 0x90, @@ -40627,6 +40820,8 @@ 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, 0xFF, 0xFF, 0x8F, @@ -40634,7 +40829,7 @@ 0x44, 0x54, 0x00, 0x50, 0x57, 0x54, 0x00, 0x50, 0x50, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x4F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF1, 0x39, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x64, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1B, 0x10, 0x00, 0xFF, @@ -40644,13 +40839,29 @@ 0xFF, 0xFF, 0xFF, 0xDB, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC0, 0x73, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0xB3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0xAC, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x95, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x8E, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x69, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x70, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x52, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x2D, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x34, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x4A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x51, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x2C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x33, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x0E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xD2, 0x15, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xB1, 0xF7, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0x00, +0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xEE, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x71, 0xBB, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xD0, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0xC1, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0xB2, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0xA3, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x94, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x85, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x76, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0xA2, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x58, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x84, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x83, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x66, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x65, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x48, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x47, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x2A, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x98, 0x29, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x88, 0x0C, 0x10, 0x00, +0x00, 0x00, 0x00, 0x02, 0x78, 0x0B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x71, 0x28, 0x90, 0x00, +0x00, 0x00, 0x00, 0x04, 0x61, 0x27, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x51, 0x0A, 0x90, 0x00, +0x00, 0x00, 0x00, 0x06, 0x41, 0x09, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x30, 0xEC, 0x90, 0x00, +0x00, 0x00, 0x00, 0x07, 0x8D, 0x43, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xCE, 0x90, 0x00, +0x00, 0x00, 0x00, 0x09, 0xAD, 0xBF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0xB0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xCD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x91, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0xAF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xAE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x91, 0x10, 0x00, @@ -40722,6 +40933,8 @@ 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, @@ -47195,7 +47408,7 @@ /* Asia/Tbilisi */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x15, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x15, 0x80, 0x00, 0x00, 0x00, 0xAA, 0x19, 0x9A, 0x01, 0xE7, 0xDA, 0x0C, 0x50, 0x15, 0x27, 0x99, 0xC0, 0x16, 0x18, 0xCE, 0x30, 0x17, 0x08, 0xCD, 0x40, 0x17, 0xFA, 0x01, 0xB0, 0x18, 0xEA, 0x00, 0xC0, 0x19, 0xDB, 0x35, 0x30, 0x1A, 0xCC, 0x85, 0xC0, 0x1B, 0xBC, 0x92, 0xE0, 0x1C, 0xAC, 0x83, 0xE0, 0x1D, 0x9C, 0x74, 0xE0, @@ -47204,60 +47417,59 @@ 0x26, 0x0B, 0xED, 0xE0, 0x27, 0x05, 0x19, 0x60, 0x27, 0xF5, 0x0A, 0x60, 0x28, 0xE5, 0x09, 0x70, 0x29, 0xD4, 0xDE, 0x50, 0x2A, 0xC4, 0xC1, 0x40, 0x2B, 0xB4, 0xC0, 0x50, 0x2C, 0xA4, 0xA3, 0x40, 0x2D, 0x94, 0xA2, 0x50, 0x2E, 0x84, 0x85, 0x40, 0x2F, 0x74, 0x76, 0x40, 0x30, 0x64, 0x59, 0x30, -0x31, 0x5D, 0x92, 0xC0, 0x33, 0x3D, 0x66, 0xB0, 0x34, 0x52, 0x41, 0xB0, 0x35, 0x1D, 0x56, 0xC0, -0x36, 0x32, 0x23, 0xB0, 0x36, 0xFD, 0x38, 0xC0, 0x38, 0x1B, 0x40, 0x30, 0x38, 0xDD, 0x1A, 0xC0, -0x39, 0xFB, 0x22, 0x30, 0x3A, 0xBC, 0xFC, 0xC0, 0x3B, 0xDB, 0x04, 0x30, 0x3C, 0xA6, 0x19, 0x40, -0x3D, 0xBA, 0xE6, 0x30, 0x3E, 0x85, 0xFB, 0x40, 0x3F, 0x9A, 0xC8, 0x30, 0x40, 0x65, 0xDD, 0x40, -0x40, 0xDD, 0xC7, 0xB0, 0x41, 0x84, 0x1C, 0xF0, 0x42, 0x45, 0xE9, 0x70, 0x01, 0x02, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x07, 0x08, 0x09, 0x02, 0x09, 0x02, 0x09, 0x04, 0x03, 0x04, 0x03, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x09, 0x08, 0x04, -0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x09, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x00, 0x00, -0x38, 0x40, 0x00, 0x11, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, 0x01, 0x11, -0x00, 0x00, 0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x38, 0x40, 0x01, 0x11, 0x00, 0x00, 0x38, 0x40, -0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x42, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, -0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, -0xFF, 0xFF, 0x56, 0xB6, 0xBA, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x9A, 0x01, 0xFF, 0xFF, -0xFF, 0xFF, 0xE7, 0xDA, 0x0C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, -0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x1B, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xED, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x05, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x0A, 0x60, 0x00, 0x00, -0x00, 0x00, 0x28, 0xE5, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xDE, 0x50, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xC4, 0xC1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xC0, 0x50, 0x00, 0x00, -0x00, 0x00, 0x2C, 0xA4, 0xA3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, -0x00, 0x00, 0x2E, 0x84, 0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x76, 0x40, 0x00, 0x00, -0x00, 0x00, 0x30, 0x64, 0x59, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x92, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x33, 0x3D, 0x66, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x41, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x23, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x40, 0x30, 0x00, 0x00, -0x00, 0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x22, 0x30, 0x00, 0x00, -0x00, 0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x04, 0x30, 0x00, 0x00, -0x00, 0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xE6, 0x30, 0x00, 0x00, -0x00, 0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xC8, 0x30, 0x00, 0x00, -0x00, 0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0xDD, 0xC7, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x01, 0x02, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x09, 0x02, 0x09, 0x02, 0x09, 0x04, 0x03, 0x04, 0x03, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x09, -0x08, 0x04, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x04, 0x00, 0x00, -0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, -0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, -0x01, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x38, 0x40, 0x01, 0x11, 0x00, 0x00, -0x38, 0x40, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x42, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, -0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x01, 0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xC8, 0xFB, -0xD2, 0x01, 0x57, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, +0x31, 0x5D, 0x92, 0xC0, 0x34, 0x52, 0x41, 0xB0, 0x35, 0x1D, 0x56, 0xC0, 0x36, 0x32, 0x23, 0xB0, +0x36, 0xFD, 0x38, 0xC0, 0x38, 0x1B, 0x40, 0x30, 0x38, 0xDD, 0x1A, 0xC0, 0x39, 0xFB, 0x22, 0x30, +0x3A, 0xBC, 0xFC, 0xC0, 0x3B, 0xDB, 0x04, 0x30, 0x3C, 0xA6, 0x19, 0x40, 0x3D, 0xBA, 0xE6, 0x30, +0x3E, 0x85, 0xFB, 0x40, 0x3F, 0x9A, 0xC8, 0x30, 0x40, 0x65, 0xDD, 0x40, 0x40, 0xDD, 0xC7, 0xB0, +0x41, 0x84, 0x1C, 0xF0, 0x42, 0x45, 0xE9, 0x70, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, +0x08, 0x09, 0x02, 0x09, 0x02, 0x09, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x09, 0x08, 0x04, 0x00, 0x00, 0x29, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x46, +0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x00, +0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, 0x01, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x00, +0x09, 0x00, 0x00, 0x38, 0x40, 0x01, 0x11, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x4C, 0x4D, 0x54, +0x00, 0x54, 0x42, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, +0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, +0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x33, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xBA, +0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x9A, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xDA, 0x0C, +0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, +0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x01, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x35, +0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x92, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x74, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x56, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x38, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x1A, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xFC, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xED, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x19, +0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x0A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x09, +0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xDE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xC1, +0x40, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xC0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xA3, +0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x85, +0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x59, +0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x41, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x23, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x40, +0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x22, +0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x04, +0x30, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xE6, +0x30, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xC8, +0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0xDD, 0xC7, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, +0x70, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x09, 0x02, 0x09, 0x02, 0x09, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x09, 0x08, 0x04, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x04, +0x00, 0x00, 0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, +0x00, 0x11, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, +0x38, 0x40, 0x01, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x38, 0x40, 0x01, 0x11, +0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x42, 0x4D, 0x54, 0x00, 0x2B, +0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, +0xC8, 0xFB, 0xD2, 0x01, 0x57, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, /* Asia/Tehran */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x49, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -57207,7 +57419,7 @@ /* Europe/Chisinau */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x26, 0x80, 0x00, 0x00, 0x00, 0x9E, 0x6B, 0x9F, 0x0C, 0xB7, 0xB0, 0xD2, 0x08, 0xB9, 0x3E, 0xF3, 0x60, 0xB9, 0xEF, 0x9C, 0x60, 0xBA, 0xDF, 0x8D, 0x60, 0xBB, 0xCF, 0x7E, 0x60, 0xBC, 0xC8, 0xA9, 0xE0, 0xBD, 0xB8, 0x9A, 0xE0, @@ -57236,23 +57448,23 @@ 0x56, 0xF7, 0x22, 0x80, 0x58, 0x15, 0x38, 0x00, 0x58, 0xD7, 0x04, 0x80, 0x59, 0xF5, 0x1A, 0x00, 0x5A, 0xB6, 0xE6, 0x80, 0x5B, 0xD4, 0xFC, 0x00, 0x5C, 0xA0, 0x03, 0x00, 0x5D, 0xB4, 0xDE, 0x00, 0x5E, 0x7F, 0xE5, 0x00, 0x5F, 0x94, 0xC0, 0x00, 0x60, 0x5F, 0xC7, 0x00, 0x61, 0x7D, 0xDC, 0x80, -0x62, 0x3F, 0xA9, 0x00, 0x63, 0x5D, 0xBE, 0x80, 0x64, 0x1F, 0x8B, 0x00, 0x65, 0x3D, 0xA0, 0x80, -0x66, 0x08, 0xA7, 0x80, 0x67, 0x1D, 0x82, 0x80, 0x67, 0xE8, 0x89, 0x80, 0x68, 0xFD, 0x64, 0x80, -0x69, 0xC8, 0x6B, 0x80, 0x6A, 0xDD, 0x46, 0x80, 0x6B, 0xA8, 0x4D, 0x80, 0x6C, 0xC6, 0x63, 0x00, -0x6D, 0x88, 0x2F, 0x80, 0x6E, 0xA6, 0x45, 0x00, 0x6F, 0x68, 0x11, 0x80, 0x70, 0x86, 0x27, 0x00, -0x71, 0x51, 0x2E, 0x00, 0x72, 0x66, 0x09, 0x00, 0x73, 0x31, 0x10, 0x00, 0x74, 0x45, 0xEB, 0x00, -0x75, 0x10, 0xF2, 0x00, 0x76, 0x2F, 0x07, 0x80, 0x76, 0xF0, 0xD4, 0x00, 0x78, 0x0E, 0xE9, 0x80, -0x78, 0xD0, 0xB6, 0x00, 0x79, 0xEE, 0xCB, 0x80, 0x7A, 0xB0, 0x98, 0x00, 0x7B, 0xCE, 0xAD, 0x80, -0x7C, 0x99, 0xB4, 0x80, 0x7D, 0xAE, 0x8F, 0x80, 0x7E, 0x79, 0x96, 0x80, 0x7F, 0x8E, 0x71, 0x80, +0x62, 0x3F, 0xB7, 0x10, 0x63, 0x5D, 0xCC, 0x90, 0x64, 0x1F, 0x99, 0x10, 0x65, 0x3D, 0xAE, 0x90, +0x66, 0x08, 0xB5, 0x90, 0x67, 0x1D, 0x90, 0x90, 0x67, 0xE8, 0x97, 0x90, 0x68, 0xFD, 0x72, 0x90, +0x69, 0xC8, 0x79, 0x90, 0x6A, 0xDD, 0x54, 0x90, 0x6B, 0xA8, 0x5B, 0x90, 0x6C, 0xC6, 0x71, 0x10, +0x6D, 0x88, 0x3D, 0x90, 0x6E, 0xA6, 0x53, 0x10, 0x6F, 0x68, 0x1F, 0x90, 0x70, 0x86, 0x35, 0x10, +0x71, 0x51, 0x3C, 0x10, 0x72, 0x66, 0x17, 0x10, 0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, +0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, +0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, +0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x09, 0x07, 0x08, 0x07, 0x08, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x06, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x00, 0x00, 0x1B, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x0E, 0x0F, 0x0E, +0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, +0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x00, 0x00, 0x1B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF4, 0x00, 0x04, 0x00, 0x00, 0x18, 0x78, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0C, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x15, 0x00, 0x00, 0x1C, @@ -57262,8 +57474,9 @@ 0x00, 0x43, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, -0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x26, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x6B, 0x9F, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xB0, 0xD2, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x3E, 0xF3, 0x60, 0xFF, @@ -57319,32 +57532,32 @@ 0x00, 0x00, 0x00, 0x5B, 0xD4, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xC7, 0x00, 0x00, -0x00, 0x00, 0x00, 0x61, 0x7D, 0xDC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xA9, 0x00, 0x00, -0x00, 0x00, 0x00, 0x63, 0x5D, 0xBE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x8B, 0x00, 0x00, -0x00, 0x00, 0x00, 0x65, 0x3D, 0xA0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xA7, 0x80, 0x00, -0x00, 0x00, 0x00, 0x67, 0x1D, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x89, 0x80, 0x00, -0x00, 0x00, 0x00, 0x68, 0xFD, 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x6B, 0x80, 0x00, -0x00, 0x00, 0x00, 0x6A, 0xDD, 0x46, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x4D, 0x80, 0x00, -0x00, 0x00, 0x00, 0x6C, 0xC6, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x2F, 0x80, 0x00, -0x00, 0x00, 0x00, 0x6E, 0xA6, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x11, 0x80, 0x00, -0x00, 0x00, 0x00, 0x70, 0x86, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x2E, 0x00, 0x00, -0x00, 0x00, 0x00, 0x72, 0x66, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x10, 0x00, 0x00, -0x00, 0x00, 0x00, 0x74, 0x45, 0xEB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x10, 0xF2, 0x00, 0x00, -0x00, 0x00, 0x00, 0x76, 0x2F, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xD4, 0x00, 0x00, -0x00, 0x00, 0x00, 0x78, 0x0E, 0xE9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xB6, 0x00, 0x00, -0x00, 0x00, 0x00, 0x79, 0xEE, 0xCB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0x98, 0x00, 0x00, -0x00, 0x00, 0x00, 0x7B, 0xCE, 0xAD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xB4, 0x80, 0x00, -0x00, 0x00, 0x00, 0x7D, 0xAE, 0x8F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0x96, 0x80, 0x00, -0x00, 0x00, 0x00, 0x7F, 0x8E, 0x71, 0x80, 0x01, 0x02, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x00, 0x00, 0x00, 0x61, 0x7D, 0xDC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, +0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, +0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, +0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, +0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, +0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, +0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, +0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, +0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, +0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, +0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, +0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, +0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, +0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, +0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, +0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x09, 0x07, 0x08, 0x07, 0x08, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x06, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x00, 0x00, 0x1B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF4, 0x00, 0x04, +0x06, 0x05, 0x06, 0x05, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, +0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, +0x0E, 0x0F, 0x0E, 0x0F, 0x00, 0x00, 0x1B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF4, 0x00, 0x04, 0x00, 0x00, 0x18, 0x78, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0C, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x15, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x19, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x19, @@ -57353,10 +57566,11 @@ 0x1C, 0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, -0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, -0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, -0x35, 0x2E, 0x30, 0x2F, 0x33, 0x0A, 0x00, 0xD1, 0x0B, 0xA0, 0x01, 0x3E, 0xA7, 0x85, 0x00, 0x00, -0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, +0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, +0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD1, 0x0B, 0xA0, 0x01, 0x3E, 0xA7, 0x85, +0x00, 0x00, 0x00, 0x00, /* Europe/Copenhagen */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x44, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -63142,7 +63356,7 @@ /* Europe/Tiraspol */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x26, 0x80, 0x00, 0x00, 0x00, 0x9E, 0x6B, 0x9F, 0x0C, 0xB7, 0xB0, 0xD2, 0x08, 0xB9, 0x3E, 0xF3, 0x60, 0xB9, 0xEF, 0x9C, 0x60, 0xBA, 0xDF, 0x8D, 0x60, 0xBB, 0xCF, 0x7E, 0x60, 0xBC, 0xC8, 0xA9, 0xE0, 0xBD, 0xB8, 0x9A, 0xE0, @@ -63171,23 +63385,23 @@ 0x56, 0xF7, 0x22, 0x80, 0x58, 0x15, 0x38, 0x00, 0x58, 0xD7, 0x04, 0x80, 0x59, 0xF5, 0x1A, 0x00, 0x5A, 0xB6, 0xE6, 0x80, 0x5B, 0xD4, 0xFC, 0x00, 0x5C, 0xA0, 0x03, 0x00, 0x5D, 0xB4, 0xDE, 0x00, 0x5E, 0x7F, 0xE5, 0x00, 0x5F, 0x94, 0xC0, 0x00, 0x60, 0x5F, 0xC7, 0x00, 0x61, 0x7D, 0xDC, 0x80, -0x62, 0x3F, 0xA9, 0x00, 0x63, 0x5D, 0xBE, 0x80, 0x64, 0x1F, 0x8B, 0x00, 0x65, 0x3D, 0xA0, 0x80, -0x66, 0x08, 0xA7, 0x80, 0x67, 0x1D, 0x82, 0x80, 0x67, 0xE8, 0x89, 0x80, 0x68, 0xFD, 0x64, 0x80, -0x69, 0xC8, 0x6B, 0x80, 0x6A, 0xDD, 0x46, 0x80, 0x6B, 0xA8, 0x4D, 0x80, 0x6C, 0xC6, 0x63, 0x00, -0x6D, 0x88, 0x2F, 0x80, 0x6E, 0xA6, 0x45, 0x00, 0x6F, 0x68, 0x11, 0x80, 0x70, 0x86, 0x27, 0x00, -0x71, 0x51, 0x2E, 0x00, 0x72, 0x66, 0x09, 0x00, 0x73, 0x31, 0x10, 0x00, 0x74, 0x45, 0xEB, 0x00, -0x75, 0x10, 0xF2, 0x00, 0x76, 0x2F, 0x07, 0x80, 0x76, 0xF0, 0xD4, 0x00, 0x78, 0x0E, 0xE9, 0x80, -0x78, 0xD0, 0xB6, 0x00, 0x79, 0xEE, 0xCB, 0x80, 0x7A, 0xB0, 0x98, 0x00, 0x7B, 0xCE, 0xAD, 0x80, -0x7C, 0x99, 0xB4, 0x80, 0x7D, 0xAE, 0x8F, 0x80, 0x7E, 0x79, 0x96, 0x80, 0x7F, 0x8E, 0x71, 0x80, +0x62, 0x3F, 0xB7, 0x10, 0x63, 0x5D, 0xCC, 0x90, 0x64, 0x1F, 0x99, 0x10, 0x65, 0x3D, 0xAE, 0x90, +0x66, 0x08, 0xB5, 0x90, 0x67, 0x1D, 0x90, 0x90, 0x67, 0xE8, 0x97, 0x90, 0x68, 0xFD, 0x72, 0x90, +0x69, 0xC8, 0x79, 0x90, 0x6A, 0xDD, 0x54, 0x90, 0x6B, 0xA8, 0x5B, 0x90, 0x6C, 0xC6, 0x71, 0x10, +0x6D, 0x88, 0x3D, 0x90, 0x6E, 0xA6, 0x53, 0x10, 0x6F, 0x68, 0x1F, 0x90, 0x70, 0x86, 0x35, 0x10, +0x71, 0x51, 0x3C, 0x10, 0x72, 0x66, 0x17, 0x10, 0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, +0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, +0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, +0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x09, 0x07, 0x08, 0x07, 0x08, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x06, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x00, 0x00, 0x1B, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x0E, 0x0F, 0x0E, +0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, +0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x00, 0x00, 0x1B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF4, 0x00, 0x04, 0x00, 0x00, 0x18, 0x78, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0C, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x15, 0x00, 0x00, 0x1C, @@ -63197,8 +63411,9 @@ 0x00, 0x43, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, -0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x26, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x6B, 0x9F, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xB0, 0xD2, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x3E, 0xF3, 0x60, 0xFF, @@ -63254,32 +63469,32 @@ 0x00, 0x00, 0x00, 0x5B, 0xD4, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xC7, 0x00, 0x00, -0x00, 0x00, 0x00, 0x61, 0x7D, 0xDC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xA9, 0x00, 0x00, -0x00, 0x00, 0x00, 0x63, 0x5D, 0xBE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x8B, 0x00, 0x00, -0x00, 0x00, 0x00, 0x65, 0x3D, 0xA0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xA7, 0x80, 0x00, -0x00, 0x00, 0x00, 0x67, 0x1D, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x89, 0x80, 0x00, -0x00, 0x00, 0x00, 0x68, 0xFD, 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x6B, 0x80, 0x00, -0x00, 0x00, 0x00, 0x6A, 0xDD, 0x46, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x4D, 0x80, 0x00, -0x00, 0x00, 0x00, 0x6C, 0xC6, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x2F, 0x80, 0x00, -0x00, 0x00, 0x00, 0x6E, 0xA6, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x11, 0x80, 0x00, -0x00, 0x00, 0x00, 0x70, 0x86, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x2E, 0x00, 0x00, -0x00, 0x00, 0x00, 0x72, 0x66, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x10, 0x00, 0x00, -0x00, 0x00, 0x00, 0x74, 0x45, 0xEB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x10, 0xF2, 0x00, 0x00, -0x00, 0x00, 0x00, 0x76, 0x2F, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xD4, 0x00, 0x00, -0x00, 0x00, 0x00, 0x78, 0x0E, 0xE9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xB6, 0x00, 0x00, -0x00, 0x00, 0x00, 0x79, 0xEE, 0xCB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0x98, 0x00, 0x00, -0x00, 0x00, 0x00, 0x7B, 0xCE, 0xAD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xB4, 0x80, 0x00, -0x00, 0x00, 0x00, 0x7D, 0xAE, 0x8F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0x96, 0x80, 0x00, -0x00, 0x00, 0x00, 0x7F, 0x8E, 0x71, 0x80, 0x01, 0x02, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x00, 0x00, 0x00, 0x61, 0x7D, 0xDC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, +0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, +0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, +0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, +0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, +0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, +0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, +0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, +0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, +0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, +0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, +0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, +0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, +0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, +0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, +0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x09, 0x07, 0x08, 0x07, 0x08, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x06, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x00, 0x00, 0x1B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF4, 0x00, 0x04, +0x06, 0x05, 0x06, 0x05, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, +0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, 0x0E, 0x0F, +0x0E, 0x0F, 0x0E, 0x0F, 0x00, 0x00, 0x1B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF4, 0x00, 0x04, 0x00, 0x00, 0x18, 0x78, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0C, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x15, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x19, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x19, @@ -63288,10 +63503,11 @@ 0x1C, 0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, -0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, -0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, -0x35, 0x2E, 0x30, 0x2F, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, +0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, +0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, /* Europe/Ulyanovsk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -66051,15 +66267,23 @@ /* Mexico/BajaNorte */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, +0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, 0xA9, 0x79, 0x4F, 0x70, 0xAF, 0xF1, 0x39, 0x80, 0xB6, 0x66, 0x64, 0x70, 0xB7, 0x1B, 0x10, 0x00, 0xB8, 0x0A, 0xF2, 0xF0, 0xCB, 0xEA, 0x8D, 0x80, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x9D, 0xAE, 0xF0, 0xD7, 0x1B, 0x59, 0x00, 0xD8, 0x91, 0xB4, 0xF0, 0xDB, 0x00, 0x07, 0x00, 0xDB, 0xC0, 0x73, 0xF0, 0xDC, 0xDE, 0xB3, 0xA0, 0xDD, 0xA9, 0xAC, 0x90, 0xDE, 0xBE, 0x95, 0xA0, 0xDF, 0x89, 0x8E, 0x90, -0xE2, 0x7E, 0x4B, 0x90, 0xE3, 0x49, 0x52, 0x90, 0xE4, 0x5E, 0x2D, 0x90, 0xE5, 0x29, 0x34, 0x90, -0xE6, 0x47, 0x4A, 0x10, 0xE7, 0x12, 0x51, 0x10, 0xE8, 0x27, 0x2C, 0x10, 0xE8, 0xF2, 0x33, 0x10, -0xEA, 0x07, 0x0E, 0x10, 0xEA, 0xD2, 0x15, 0x10, 0xEB, 0xE6, 0xF0, 0x10, 0xEC, 0xB1, 0xF7, 0x10, -0xED, 0xC6, 0xD2, 0x10, 0xEE, 0x91, 0xD9, 0x10, 0x0B, 0xE0, 0xAF, 0xA0, 0x0C, 0xD9, 0xCD, 0x10, +0xE0, 0x9E, 0x69, 0x90, 0xE1, 0x69, 0x70, 0x90, 0xE2, 0x7E, 0x4B, 0x90, 0xE3, 0x49, 0x52, 0x90, +0xE4, 0x5E, 0x2D, 0x90, 0xE5, 0x29, 0x34, 0x90, 0xE6, 0x47, 0x4A, 0x10, 0xE7, 0x12, 0x51, 0x10, +0xE8, 0x27, 0x2C, 0x10, 0xE8, 0xF2, 0x33, 0x10, 0xEA, 0x07, 0x0E, 0x10, 0xEA, 0xD2, 0x15, 0x10, +0xEB, 0xE6, 0xF0, 0x10, 0xEC, 0xB1, 0xF7, 0x10, 0xED, 0xC6, 0xD2, 0x10, 0xEE, 0x91, 0xD9, 0x10, +0xEF, 0xAF, 0xEE, 0x90, 0xF0, 0x71, 0xBB, 0x10, 0xF1, 0x8F, 0xD0, 0x90, 0xF2, 0x7F, 0xC1, 0x90, +0xF3, 0x6F, 0xB2, 0x90, 0xF4, 0x5F, 0xA3, 0x90, 0xF5, 0x4F, 0x94, 0x90, 0xF6, 0x3F, 0x85, 0x90, +0xF7, 0x2F, 0x76, 0x90, 0xF8, 0x28, 0xA2, 0x10, 0xF9, 0x0F, 0x58, 0x90, 0xFA, 0x08, 0x84, 0x10, +0xFA, 0xF8, 0x83, 0x20, 0xFB, 0xE8, 0x66, 0x10, 0xFC, 0xD8, 0x65, 0x20, 0xFD, 0xC8, 0x48, 0x10, +0xFE, 0xB8, 0x47, 0x20, 0xFF, 0xA8, 0x2A, 0x10, 0x00, 0x98, 0x29, 0x20, 0x01, 0x88, 0x0C, 0x10, +0x02, 0x78, 0x0B, 0x20, 0x03, 0x71, 0x28, 0x90, 0x04, 0x61, 0x27, 0xA0, 0x05, 0x51, 0x0A, 0x90, +0x06, 0x41, 0x09, 0xA0, 0x07, 0x30, 0xEC, 0x90, 0x07, 0x8D, 0x43, 0xA0, 0x09, 0x10, 0xCE, 0x90, +0x09, 0xAD, 0xBF, 0x20, 0x0A, 0xF0, 0xB0, 0x90, 0x0B, 0xE0, 0xAF, 0xA0, 0x0C, 0xD9, 0xCD, 0x10, 0x0D, 0xC0, 0x91, 0xA0, 0x0E, 0xB9, 0xAF, 0x10, 0x0F, 0xA9, 0xAE, 0x20, 0x10, 0x99, 0x91, 0x10, 0x11, 0x89, 0x90, 0x20, 0x12, 0x79, 0x73, 0x10, 0x13, 0x69, 0x72, 0x20, 0x14, 0x59, 0x55, 0x10, 0x15, 0x49, 0x54, 0x20, 0x16, 0x39, 0x37, 0x10, 0x17, 0x29, 0x36, 0x20, 0x18, 0x22, 0x53, 0x90, @@ -66100,6 +66324,8 @@ 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, 0xFF, 0xFF, 0x8F, @@ -66107,7 +66333,7 @@ 0x44, 0x54, 0x00, 0x50, 0x57, 0x54, 0x00, 0x50, 0x50, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x4F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF1, 0x39, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x64, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1B, 0x10, 0x00, 0xFF, @@ -66117,13 +66343,29 @@ 0xFF, 0xFF, 0xFF, 0xDB, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC0, 0x73, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0xB3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0xAC, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x95, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x8E, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x69, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x70, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x52, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x2D, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x34, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x4A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x51, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x2C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x33, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x0E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xD2, 0x15, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xB1, 0xF7, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0x00, +0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xEE, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x71, 0xBB, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xD0, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0xC1, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0xB2, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0xA3, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x94, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x85, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x76, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0xA2, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x58, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x84, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x83, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x66, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x65, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x48, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x47, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x2A, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x98, 0x29, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x88, 0x0C, 0x10, 0x00, +0x00, 0x00, 0x00, 0x02, 0x78, 0x0B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x71, 0x28, 0x90, 0x00, +0x00, 0x00, 0x00, 0x04, 0x61, 0x27, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x51, 0x0A, 0x90, 0x00, +0x00, 0x00, 0x00, 0x06, 0x41, 0x09, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x30, 0xEC, 0x90, 0x00, +0x00, 0x00, 0x00, 0x07, 0x8D, 0x43, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xCE, 0x90, 0x00, +0x00, 0x00, 0x00, 0x09, 0xAD, 0xBF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0xB0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xCD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x91, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0xAF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xAE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x91, 0x10, 0x00, @@ -66195,6 +66437,8 @@ 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, @@ -71071,4 +71315,4 @@ }; #endif -const timelib_tzdb timezonedb_builtin = { "2025.2", 598, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2026.1", 598, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; diff -Nru php8.4-8.4.16/ext/date/php_date.c php8.4-8.4.21/ext/date/php_date.c --- php8.4-8.4.16/ext/date/php_date.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/date/php_date.c 2026-05-05 16:34:12.000000000 +0000 @@ -795,13 +795,24 @@ case TIMELIB_ZONETYPE_ABBR: length = slprintf(buffer, sizeof(buffer), "%s", offset->abbr); break; - case TIMELIB_ZONETYPE_OFFSET: - length = slprintf(buffer, sizeof(buffer), "%c%02d:%02d", - ((offset->offset < 0) ? '-' : '+'), - abs(offset->offset / 3600), - abs((offset->offset % 3600) / 60) - ); + case TIMELIB_ZONETYPE_OFFSET: { + int seconds = offset->offset % 60; + if (seconds == 0) { + length = slprintf(buffer, sizeof(buffer), "%c%02d:%02d", + ((offset->offset < 0) ? '-' : '+'), + abs(offset->offset / 3600), + abs((offset->offset % 3600) / 60) + ); + } else { + length = slprintf(buffer, sizeof(buffer), "%c%02d:%02d:%02d", + ((offset->offset < 0) ? '-' : '+'), + abs(offset->offset / 3600), + abs((offset->offset % 3600) / 60), + abs(seconds) + ); + } break; + } } } break; @@ -1930,6 +1941,32 @@ return zend_std_get_properties(object); } /* }}} */ +static zend_string *date_create_tz_offset_str(timelib_sll offset) +{ + int seconds = offset % 60; + size_t size; + const char *format; + + if (seconds == 0) { + size = sizeof("+05:00"); + format = "%c%02d:%02d"; + } else { + size = sizeof("+05:00:01"); + format = "%c%02d:%02d:%02d"; + } + + zend_string *tmpstr = zend_string_alloc(size - 1, 0); + + /* Note: if seconds == 0, the seconds argument will be excessive and therefore ignored. */ + ZSTR_LEN(tmpstr) = snprintf(ZSTR_VAL(tmpstr), size, format, + offset < 0 ? '-' : '+', + abs((int)(offset / 3600)), + abs((int)(offset % 3600) / 60), + abs(seconds)); + + return tmpstr; +} + static void date_object_to_hash(php_date_obj *dateobj, HashTable *props) { zval zv; @@ -1947,17 +1984,8 @@ case TIMELIB_ZONETYPE_ID: ZVAL_STRING(&zv, dateobj->time->tz_info->name); break; - case TIMELIB_ZONETYPE_OFFSET: { - zend_string *tmpstr = zend_string_alloc(sizeof("UTC+05:00")-1, 0); - int utc_offset = dateobj->time->z; - - ZSTR_LEN(tmpstr) = snprintf(ZSTR_VAL(tmpstr), sizeof("+05:00"), "%c%02d:%02d", - utc_offset < 0 ? '-' : '+', - abs(utc_offset / 3600), - abs(((utc_offset % 3600) / 60))); - - ZVAL_NEW_STR(&zv, tmpstr); - } + case TIMELIB_ZONETYPE_OFFSET: + ZVAL_NEW_STR(&zv, date_create_tz_offset_str(dateobj->time->z)); break; case TIMELIB_ZONETYPE_ABBR: ZVAL_STRING(&zv, dateobj->time->tz_abbr); @@ -2069,29 +2097,8 @@ case TIMELIB_ZONETYPE_ID: ZVAL_STRING(zv, tzobj->tzi.tz->name); break; - case TIMELIB_ZONETYPE_OFFSET: { - timelib_sll utc_offset = tzobj->tzi.utc_offset; - int seconds = utc_offset % 60; - size_t size; - const char *format; - if (seconds == 0) { - size = sizeof("+05:00"); - format = "%c%02d:%02d"; - } else { - size = sizeof("+05:00:01"); - format = "%c%02d:%02d:%02d"; - } - zend_string *tmpstr = zend_string_alloc(size - 1, 0); - - /* Note: if seconds == 0, the seconds argument will be excessive and therefore ignored. */ - ZSTR_LEN(tmpstr) = snprintf(ZSTR_VAL(tmpstr), size, format, - utc_offset < 0 ? '-' : '+', - abs((int)(utc_offset / 3600)), - abs((int)(utc_offset % 3600) / 60), - abs(seconds)); - - ZVAL_NEW_STR(zv, tmpstr); - } + case TIMELIB_ZONETYPE_OFFSET: + ZVAL_NEW_STR(zv, date_create_tz_offset_str(tzobj->tzi.utc_offset)); break; case TIMELIB_ZONETYPE_ABBR: ZVAL_STRING(zv, tzobj->tzi.z.abbr); @@ -5811,7 +5818,7 @@ php_date_obj *date_obj; date_obj = Z_PHPDATE_P(ht_entry); - if (!date_obj->time) { + if (!date_obj->time || !period_obj->start_ce) { return 0; } @@ -5832,7 +5839,7 @@ php_date_obj *date_obj; date_obj = Z_PHPDATE_P(ht_entry); - if (!date_obj->time) { + if (!date_obj->time || !period_obj->start_ce) { return 0; } diff -Nru php8.4-8.4.16/ext/date/tests/bug81565.phpt php8.4-8.4.21/ext/date/tests/bug81565.phpt --- php8.4-8.4.16/ext/date/tests/bug81565.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/date/tests/bug81565.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -15,6 +15,6 @@ \DateTime::__set_state(array( 'date' => '0021-08-21 00:00:00.000000', 'timezone_type' => 1, - 'timezone' => '+00:49', + 'timezone' => '+00:49:56', )) +01:45:30 diff -Nru php8.4-8.4.16/ext/date/tests/gh20764.phpt php8.4-8.4.21/ext/date/tests/gh20764.phpt --- php8.4-8.4.16/ext/date/tests/gh20764.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/date/tests/gh20764.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,53 @@ +--TEST-- +GH-20764 (Timezone offset with seconds loses precision) +--FILE-- +format('e')); + var_dump($dt); + var_dump(unserialize(serialize($dt))->getTimezone()); +} + +?> +--EXPECTF-- +--- Testing timezone +03:00:30 --- +string(9) "+03:00:30" +object(DateTimeImmutable)#%d (3) { + ["date"]=> + string(26) "2025-04-01 00:00:00.000000" + ["timezone_type"]=> + int(1) + ["timezone"]=> + string(9) "+03:00:30" +} +object(DateTimeZone)#%d (2) { + ["timezone_type"]=> + int(1) + ["timezone"]=> + string(9) "+03:00:30" +} +--- Testing timezone -03:00:30 --- +string(9) "-03:00:30" +object(DateTimeImmutable)#%d (3) { + ["date"]=> + string(26) "2025-04-01 00:00:00.000000" + ["timezone_type"]=> + int(1) + ["timezone"]=> + string(9) "-03:00:30" +} +object(DateTimeZone)#%d (2) { + ["timezone_type"]=> + int(1) + ["timezone"]=> + string(9) "-03:00:30" +} diff -Nru php8.4-8.4.16/ext/date/tests/gh20936.phpt php8.4-8.4.21/ext/date/tests/gh20936.phpt --- php8.4-8.4.16/ext/date/tests/gh20936.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/date/tests/gh20936.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,14 @@ +--TEST-- +GH-20936 (DatePeriod::__set_state() cannot handle null start) +--FILE-- + null, 'end' => $end, 'current' => null, 'interval' => $interval, 'recurrences' => 2, 'include_start_date' => false, 'include_end_date' => true]); +} catch (Throwable $e) { + echo $e::class, ": ", $e->getMessage(), "\n"; +} +?> +--EXPECT-- +Error: Invalid serialization data for DatePeriod object diff -Nru php8.4-8.4.16/ext/dba/tests/dba_db4_018.phpt php8.4-8.4.21/ext/dba/tests/dba_db4_018.phpt --- php8.4-8.4.16/ext/dba/tests/dba_db4_018.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dba/tests/dba_db4_018.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -28,7 +28,7 @@ if ($db_file1 === $db_file2) { echo "objects are the same\n"; } else { - echo "object are different\n"; + echo "objects are different\n"; } diff -Nru php8.4-8.4.16/ext/dom/config.m4 php8.4-8.4.21/ext/dom/config.m4 --- php8.4-8.4.16/ext/dom/config.m4 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/config.m4 2026-05-05 16:34:12.000000000 +0000 @@ -27,15 +27,23 @@ $LEXBOR_DIR/core/shs.c $LEXBOR_DIR/core/str.c $LEXBOR_DIR/core/strtod.c + $LEXBOR_DIR/css/at_rule.c + $LEXBOR_DIR/css/at_rule/state.c + $LEXBOR_DIR/css/blank.c $LEXBOR_DIR/css/css.c + $LEXBOR_DIR/css/declaration.c $LEXBOR_DIR/css/log.c $LEXBOR_DIR/css/parser.c + $LEXBOR_DIR/css/property.c + $LEXBOR_DIR/css/property/state.c + $LEXBOR_DIR/css/rule.c $LEXBOR_DIR/css/selectors/pseudo_state.c $LEXBOR_DIR/css/selectors/pseudo.c $LEXBOR_DIR/css/selectors/selector.c $LEXBOR_DIR/css/selectors/selectors.c $LEXBOR_DIR/css/selectors/state.c $LEXBOR_DIR/css/state.c + $LEXBOR_DIR/css/stylesheet.c $LEXBOR_DIR/css/syntax/anb.c $LEXBOR_DIR/css/syntax/parser.c $LEXBOR_DIR/css/syntax/state.c @@ -43,6 +51,8 @@ $LEXBOR_DIR/css/syntax/token.c $LEXBOR_DIR/css/syntax/tokenizer.c $LEXBOR_DIR/css/syntax/tokenizer/error.c + $LEXBOR_DIR/css/unit.c + $LEXBOR_DIR/css/value.c $LEXBOR_DIR/dom/interface.c $LEXBOR_DIR/dom/interfaces/attr.c $LEXBOR_DIR/dom/interfaces/cdata_section.c @@ -118,7 +128,9 @@ $LEXBOR_DIR/html/interfaces/progress_element.c $LEXBOR_DIR/html/interfaces/quote_element.c $LEXBOR_DIR/html/interfaces/script_element.c + $LEXBOR_DIR/html/interfaces/search_element.c $LEXBOR_DIR/html/interfaces/select_element.c + $LEXBOR_DIR/html/interfaces/selectedcontent_element.c $LEXBOR_DIR/html/interfaces/slot_element.c $LEXBOR_DIR/html/interfaces/source_element.c $LEXBOR_DIR/html/interfaces/span_element.c @@ -139,6 +151,7 @@ $LEXBOR_DIR/html/interfaces/video_element.c $LEXBOR_DIR/html/interfaces/window.c $LEXBOR_DIR/html/parser.c + $LEXBOR_DIR/html/tag.c $LEXBOR_DIR/html/token_attr.c $LEXBOR_DIR/html/token.c $LEXBOR_DIR/html/tokenizer.c @@ -168,8 +181,6 @@ $LEXBOR_DIR/html/tree/insertion_mode/in_head_noscript.c $LEXBOR_DIR/html/tree/insertion_mode/in_head.c $LEXBOR_DIR/html/tree/insertion_mode/in_row.c - $LEXBOR_DIR/html/tree/insertion_mode/in_select_in_table.c - $LEXBOR_DIR/html/tree/insertion_mode/in_select.c $LEXBOR_DIR/html/tree/insertion_mode/in_table_body.c $LEXBOR_DIR/html/tree/insertion_mode/in_table_text.c $LEXBOR_DIR/html/tree/insertion_mode/in_table.c @@ -225,6 +236,8 @@ PHP_ADD_BUILD_DIR([ $ext_builddir/parentnode $ext_builddir/$LEXBOR_DIR/core + $ext_builddir/$LEXBOR_DIR/css/at_rule + $ext_builddir/$LEXBOR_DIR/css/property $ext_builddir/$LEXBOR_DIR/css/selectors $ext_builddir/$LEXBOR_DIR/css/syntax/tokenizer $ext_builddir/$LEXBOR_DIR/css/tokenizer diff -Nru php8.4-8.4.16/ext/dom/config.w32 php8.4-8.4.21/ext/dom/config.w32 --- php8.4-8.4.16/ext/dom/config.w32 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/config.w32 2026-05-05 16:34:12.000000000 +0000 @@ -25,12 +25,14 @@ ADD_SOURCES("ext/dom/lexbor/lexbor/dom/interfaces", "attr.c cdata_section.c character_data.c comment.c document.c document_fragment.c document_type.c element.c node.c processing_instruction.c shadow_root.c text.c", "dom"); ADD_SOURCES("ext/dom/lexbor/lexbor/html/tokenizer", "error.c state_comment.c state_doctype.c state_rawtext.c state_rcdata.c state_script.c state.c", "dom"); ADD_SOURCES("ext/dom/lexbor/lexbor/html/tree", "active_formatting.c open_elements.c error.c", "dom"); - ADD_SOURCES("ext/dom/lexbor/lexbor/html/tree/insertion_mode", "after_after_body.c after_after_frameset.c after_body.c after_frameset.c after_head.c before_head.c before_html.c foreign_content.c in_body.c in_caption.c in_cell.c in_column_group.c in_frameset.c in_head.c in_head_noscript.c initial.c in_row.c in_select.c in_select_in_table.c in_table_body.c in_table.c in_table_text.c in_template.c text.c", "dom"); - ADD_SOURCES("ext/dom/lexbor/lexbor/html", "encoding.c interface.c parser.c token.c token_attr.c tokenizer.c tree.c", "dom"); + ADD_SOURCES("ext/dom/lexbor/lexbor/html/tree/insertion_mode", "after_after_body.c after_after_frameset.c after_body.c after_frameset.c after_head.c before_head.c before_html.c foreign_content.c in_body.c in_caption.c in_cell.c in_column_group.c in_frameset.c in_head.c in_head_noscript.c initial.c in_row.c in_table_body.c in_table.c in_table_text.c in_template.c text.c", "dom"); + ADD_SOURCES("ext/dom/lexbor/lexbor/html", "encoding.c interface.c parser.c tag.c token.c token_attr.c tokenizer.c tree.c", "dom"); ADD_SOURCES("ext/dom/lexbor/lexbor/encoding", "decode.c encode.c encoding.c multi.c range.c res.c single.c", "dom"); - ADD_SOURCES("ext/dom/lexbor/lexbor/html/interfaces", "anchor_element.c area_element.c audio_element.c base_element.c body_element.c br_element.c button_element.c canvas_element.c data_element.c data_list_element.c details_element.c dialog_element.c directory_element.c div_element.c d_list_element.c document.c element.c embed_element.c field_set_element.c font_element.c form_element.c frame_element.c frame_set_element.c head_element.c heading_element.c hr_element.c html_element.c iframe_element.c image_element.c input_element.c label_element.c legend_element.c li_element.c link_element.c map_element.c marquee_element.c media_element.c menu_element.c meta_element.c meter_element.c mod_element.c object_element.c o_list_element.c opt_group_element.c option_element.c output_element.c paragraph_element.c param_element.c picture_element.c pre_element.c progress_element.c quote_element.c script_element.c select_element.c slot_element.c source_element.c span_element.c style_element.c table_caption_element.c table_cell_element.c table_col_element.c table_element.c table_row_element.c table_section_element.c template_element.c text_area_element.c time_element.c title_element.c track_element.c u_list_element.c unknown_element.c video_element.c window.c", "dom"); + ADD_SOURCES("ext/dom/lexbor/lexbor/html/interfaces", "anchor_element.c area_element.c audio_element.c base_element.c body_element.c br_element.c button_element.c canvas_element.c data_element.c data_list_element.c details_element.c dialog_element.c directory_element.c div_element.c d_list_element.c document.c element.c embed_element.c field_set_element.c font_element.c form_element.c frame_element.c frame_set_element.c head_element.c heading_element.c hr_element.c html_element.c iframe_element.c image_element.c input_element.c label_element.c legend_element.c li_element.c link_element.c map_element.c marquee_element.c media_element.c menu_element.c meta_element.c meter_element.c mod_element.c object_element.c o_list_element.c opt_group_element.c option_element.c output_element.c paragraph_element.c param_element.c picture_element.c pre_element.c progress_element.c quote_element.c script_element.c search_element.c select_element.c selectedcontent_element.c slot_element.c source_element.c span_element.c style_element.c table_caption_element.c table_cell_element.c table_col_element.c table_element.c table_row_element.c table_section_element.c template_element.c text_area_element.c time_element.c title_element.c track_element.c u_list_element.c unknown_element.c video_element.c window.c", "dom"); ADD_SOURCES("ext/dom/lexbor/lexbor/selectors-adapted", "selectors.c", "dom"); - ADD_SOURCES("ext/dom/lexbor/lexbor/css", "state.c log.c parser.c css.c", "dom"); + ADD_SOURCES("ext/dom/lexbor/lexbor/css", "at_rule.c blank.c css.c declaration.c log.c parser.c property.c rule.c state.c stylesheet.c unit.c value.c", "dom"); + ADD_SOURCES("ext/dom/lexbor/lexbor/css/at_rule", "state.c", "dom"); + ADD_SOURCES("ext/dom/lexbor/lexbor/css/property", "state.c", "dom"); ADD_SOURCES("ext/dom/lexbor/lexbor/css/selectors", "state.c selectors.c selector.c pseudo_state.c pseudo.c", "dom"); ADD_SOURCES("ext/dom/lexbor/lexbor/css/syntax", "state.c parser.c syntax.c anb.c tokenizer.c token.c", "dom"); ADD_SOURCES("ext/dom/lexbor/lexbor/css/syntax/tokenizer", "error.c", "dom"); diff -Nru php8.4-8.4.16/ext/dom/documenttype.c php8.4-8.4.21/ext/dom/documenttype.c --- php8.4-8.4.16/ext/dom/documenttype.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/documenttype.c 2026-05-05 16:34:12.000000000 +0000 @@ -47,7 +47,7 @@ { DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj); - php_dom_create_iterator(retval, DOM_DTD_NAMEDNODEMAP, php_dom_follow_spec_intern(obj)); + php_dom_create_iterator(retval, DOM_DTD_NAMEDNODEMAP, instanceof_function(obj->std.ce, dom_modern_documenttype_class_entry)); xmlHashTable *entityht = (xmlHashTable *) dtdptr->entities; @@ -68,7 +68,7 @@ { DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj); - php_dom_create_iterator(retval, DOM_DTD_NAMEDNODEMAP, php_dom_follow_spec_intern(obj)); + php_dom_create_iterator(retval, DOM_DTD_NAMEDNODEMAP, instanceof_function(obj->std.ce, dom_modern_documenttype_class_entry)); xmlHashTable *notationht = (xmlHashTable *) dtdptr->notations; diff -Nru php8.4-8.4.16/ext/dom/dom_properties.h php8.4-8.4.21/ext/dom/dom_properties.h --- php8.4-8.4.16/ext/dom/dom_properties.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/dom_properties.h 2026-05-05 16:34:12.000000000 +0000 @@ -102,6 +102,7 @@ zend_result dom_entity_reference_child_read(dom_object *obj, zval *retval); zend_result dom_entity_reference_text_content_read(dom_object *obj, zval *retval); zend_result dom_entity_reference_child_nodes_read(dom_object *obj, zval *retval); +zend_result dom_modern_entity_reference_child_nodes_read(dom_object *obj, zval *retval); /* namednodemap properties */ zend_result dom_namednodemap_length_read(dom_object *obj, zval *retval); @@ -119,6 +120,7 @@ zend_result dom_node_parent_node_read(dom_object *obj, zval *retval); zend_result dom_node_parent_element_read(dom_object *obj, zval *retval); zend_result dom_node_child_nodes_read(dom_object *obj, zval *retval); +zend_result dom_modern_node_child_nodes_read(dom_object *obj, zval *retval); zend_result dom_node_first_child_read(dom_object *obj, zval *retval); zend_result dom_node_last_child_read(dom_object *obj, zval *retval); zend_result dom_node_previous_sibling_read(dom_object *obj, zval *retval); @@ -134,6 +136,7 @@ zend_result dom_node_prefix_write(dom_object *obj, zval *newval); zend_result dom_node_local_name_read(dom_object *obj, zval *retval); zend_result dom_node_base_uri_read(dom_object *obj, zval *retval); +zend_result dom_modern_node_base_uri_read(dom_object *obj, zval *retval); zend_result dom_node_text_content_read(dom_object *obj, zval *retval); zend_result dom_node_text_content_write(dom_object *obj, zval *newval); diff -Nru php8.4-8.4.16/ext/dom/entityreference.c php8.4-8.4.21/ext/dom/entityreference.c --- php8.4-8.4.16/ext/dom/entityreference.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/entityreference.c 2026-05-05 16:34:12.000000000 +0000 @@ -106,4 +106,12 @@ return dom_node_child_nodes_read(obj, retval); } +zend_result dom_modern_entity_reference_child_nodes_read(dom_object *obj, zval *retval) +{ + DOM_PROP_NODE(xmlNodePtr, nodep, obj); + + dom_entity_reference_fetch_and_sync_declaration(nodep); + return dom_modern_node_child_nodes_read(obj, retval); +} + #endif diff -Nru php8.4-8.4.16/ext/dom/html5_parser.c php8.4-8.4.21/ext/dom/html5_parser.c --- php8.4-8.4.16/ext/dom/html5_parser.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/html5_parser.c 2026-05-05 16:34:12.000000000 +0000 @@ -117,6 +117,7 @@ php_dom_libxml_ns_mapper *ns_mapper = php_dom_ns_mapper_from_private(private_data); xmlNsPtr html_ns = php_dom_libxml_ns_mapper_ensure_html_ns(ns_mapper); xmlNsPtr xlink_ns = NULL; + xmlNsPtr xml_ns = NULL; xmlNsPtr prefixed_xmlns_ns = NULL; lexbor_array_obj_t work_list; @@ -256,6 +257,12 @@ xlink_ns->_private = (void *) php_dom_ns_is_xlink_magic_token; } lxml_attr->ns = xlink_ns; + } else if (attr->node.ns == LXB_NS_XML) { + if (xml_ns == NULL) { + xml_ns = php_dom_libxml_ns_mapper_get_ns_raw_strings_nullsafe(ns_mapper, "xml", DOM_XML_NS_URI); + xml_ns->_private = (void *) php_dom_ns_is_xml_magic_token; + } + lxml_attr->ns = xml_ns; } if (last_added_attr == NULL) { diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/base.h php8.4-8.4.21/ext/dom/lexbor/lexbor/core/base.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/base.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/base.h 2026-05-05 16:34:12.000000000 +0000 @@ -27,7 +27,7 @@ #include "lexbor/core/lexbor.h" #define LEXBOR_VERSION_MAJOR 2 -#define LEXBOR_VERSION_MINOR 0 +#define LEXBOR_VERSION_MINOR 7 #define LEXBOR_VERSION_PATCH 0 #define LEXBOR_VERSION_STRING LEXBOR_STRINGIZE(LEXBOR_VERSION_MAJOR) "." \ @@ -39,6 +39,10 @@ #define lexbor_max(val1, val2) ((val1) > (val2) ? (val1) : (val2)) #define lexbor_min(val1, val2) ((val1) < (val2) ? (val1) : (val2)) +#define LEXBOR_STR_RES_MAP_CHAR_OTHER 0x00 +#define LEXBOR_STR_RES_MAP_CHAR_A_Z_a_z 0x01 +#define LEXBOR_STR_RES_MAP_CHAR_WHITESPACE 0x02 +#define LEXBOR_STR_RES_SLIP 0xFF /* * Very important!!! diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/def.h php8.4-8.4.21/ext/dom/lexbor/lexbor/core/def.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/def.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/def.h 2026-05-05 16:34:12.000000000 +0000 @@ -54,4 +54,6 @@ #define LXB_EXTERN extern LXB_API +#define lxb_size(_size) ((size_t) (_size)) + #endif /* LEXBOR_DEF_H */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/diyfp.c php8.4-8.4.21/ext/dom/lexbor/lexbor/core/diyfp.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/diyfp.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/diyfp.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,16 +1,44 @@ /* - * Copyright (C) Alexander Borisov + * Copyright (C) 2015-2019 NGINX, Inc. + * Copyright (C) 2019-2025 F5, Inc. + * Copyright (C) 2015-2021 Igor Sysoev + * Copyright (C) 2017-2025 Dmitry Volyntsev + * Copyright (C) 2019-2022 Alexander Borisov + * Copyright (C) 2022-2025 Vadim Zhestikov + * All rights reserved. * - * Based on nxt_diyfp.c from NGINX NJS project + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * Copyright (C) Dmitry Volyntsev - * Copyright (C) NGINX, Inc. + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (C) Alexander Borisov * + * Based on nxt_diyfp.h from NGINX NJS project * An internal diy_fp implementation. * For details, see Loitsch, Florian. "Printing floating-point numbers quickly * and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243. */ + #include "lexbor/core/diyfp.h" diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/diyfp.h php8.4-8.4.21/ext/dom/lexbor/lexbor/core/diyfp.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/diyfp.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/diyfp.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,11 +1,38 @@ /* - * Copyright (C) Alexander Borisov + * Copyright (C) 2015-2019 NGINX, Inc. + * Copyright (C) 2019-2025 F5, Inc. + * Copyright (C) 2015-2021 Igor Sysoev + * Copyright (C) 2017-2025 Dmitry Volyntsev + * Copyright (C) 2019-2022 Alexander Borisov + * Copyright (C) 2022-2025 Vadim Zhestikov + * All rights reserved. * - * Based on nxt_diyfp.h from NGINX NJS project + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * Copyright (C) Dmitry Volyntsev - * Copyright (C) NGINX, Inc. + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (C) Alexander Borisov * + * Based on nxt_diyfp.h from NGINX NJS project * An internal diy_fp implementation. * For details, see Loitsch, Florian. "Printing floating-point numbers quickly * and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243. diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/dtoa.c php8.4-8.4.21/ext/dom/lexbor/lexbor/core/dtoa.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/dtoa.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/dtoa.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,39 +1,36 @@ /* + * Copyright (C) 2015-2019 NGINX, Inc. + * Copyright (C) 2019-2025 F5, Inc. + * Copyright (C) 2015-2021 Igor Sysoev + * Copyright (C) 2017-2025 Dmitry Volyntsev + * Copyright (C) 2019-2022 Alexander Borisov + * Copyright (C) 2022-2025 Vadim Zhestikov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* * Copyright (C) Alexander Borisov - * - * Based on nxt_dtoa.c from NGINX NJS project - * - * Copyright (C) Dmitry Volyntsev - * Copyright (C) NGINX, Inc. - * - * Grisu2 algorithm implementation for printing floating-point numbers based - * upon the work of Milo Yip and Doug Currie. - * - * For algorithm information, see Loitsch, Florian. "Printing - * floating-point numbers quickly and accurately with integers." ACM Sigplan - * Notices 45.6 (2010): 233-243. - * - * Copyright (C) 2015 Doug Currie - * based on dtoa_milo.h - * Copyright (C) 2014 Milo Yip - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. */ #include "lexbor/core/str.h" diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/dtoa.h php8.4-8.4.21/ext/dom/lexbor/lexbor/core/dtoa.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/dtoa.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/dtoa.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,10 +1,36 @@ /* - * Copyright (C) Alexander Borisov + * Copyright (C) 2015-2019 NGINX, Inc. + * Copyright (C) 2019-2025 F5, Inc. + * Copyright (C) 2015-2021 Igor Sysoev + * Copyright (C) 2017-2025 Dmitry Volyntsev + * Copyright (C) 2019-2022 Alexander Borisov + * Copyright (C) 2022-2025 Vadim Zhestikov + * All rights reserved. * - * Based on nxt_dtoa.h from NGINX NJS project + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * Copyright (C) Dmitry Volyntsev - * Copyright (C) Nginx, Inc. + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (C) Alexander Borisov */ #ifndef LEXBOR_DTOA_H diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/hash.c php8.4-8.4.21/ext/dom/lexbor/lexbor/core/hash.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/hash.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/hash.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Alexander Borisov + * Copyright (C) 2019-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -10,9 +10,10 @@ #include "lexbor/core/str.h" -#define LEXBOR_STR_RES_MAP_LOWERCASE -#define LEXBOR_STR_RES_MAP_UPPERCASE -#include "lexbor/core/str_res.h" +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256]; + LXB_EXTERN const lxb_char_t lexbor_str_res_map_uppercase[256]; +#endif /* Insert variable. */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/in.c php8.4-8.4.21/ext/dom/lexbor/lexbor/core/in.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/in.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/in.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,11 +1,10 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ #include "lexbor/core/in.h" -#include "lexbor/core/str_res.h" lexbor_in_t * diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/shs.c php8.4-8.4.21/ext/dom/lexbor/lexbor/core/shs.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/shs.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/shs.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2019 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -7,10 +7,10 @@ #include "lexbor/core/shs.h" #include "lexbor/core/str.h" -#define LEXBOR_STR_RES_MAP_LOWERCASE -#define LEXBOR_STR_RES_MAP_UPPERCASE -#include "lexbor/core/str_res.h" - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256]; + LXB_EXTERN const lxb_char_t lexbor_str_res_map_uppercase[256]; +#endif #define lexbor_shs_make_id_m(key, size, table_size) \ (((((key[0] * key[size - 1]) * key[0]) + size) % table_size) + 0x01) diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/str.c php8.4-8.4.21/ext/dom/lexbor/lexbor/core/str.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/str.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/str.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,14 +1,10 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ #include "lexbor/core/str.h" - -#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER -#define LEXBOR_STR_RES_MAP_LOWERCASE -#define LEXBOR_STR_RES_MAP_UPPERCASE #include "lexbor/core/str_res.h" @@ -80,6 +76,7 @@ } if (str->data != NULL) { + lexbor_str_clean(str); str->data = lexbor_mraw_free(mraw, str->data); } @@ -380,6 +377,30 @@ return 0; } +lxb_char_t * +lexbor_str_copy_to(lexbor_str_t *str, const lxb_char_t *buff, size_t length) +{ + lxb_char_t *data_begin; + + data_begin = &str->data[str->length]; + memcpy(data_begin, buff, sizeof(lxb_char_t) * length); + + str->length += length; + + return data_begin; +} + +lxb_char_t * +lexbor_str_copy_to_with_null(lexbor_str_t *str, + const lxb_char_t *buff, size_t length) +{ + lxb_char_t *data_begin = lexbor_str_copy_to(str, buff, length); + + str->data[str->length] = '\0'; + + return data_begin; +} + /* * Data utils * TODO: All functions need optimization. diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/str.h php8.4-8.4.21/ext/dom/lexbor/lexbor/core/str.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/str.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/str.h 2026-05-05 16:34:12.000000000 +0000 @@ -21,7 +21,6 @@ #define lexbor_str_len(str) lexbor_str_get(str, length) #define lexbor_str(p) {.data = (lxb_char_t *) (p), sizeof(p) - 1} - #define lexbor_str_check_size_arg_m(str, size, mraw, plus_len, return_fail) \ do { \ void *tmp; \ @@ -117,6 +116,12 @@ LXB_API size_t lexbor_str_whitespace_from_end(lexbor_str_t *target); +LXB_API lxb_char_t * +lexbor_str_copy_to(lexbor_str_t *str, const lxb_char_t *buff, size_t length); + +LXB_API lxb_char_t * +lexbor_str_copy_to_with_null(lexbor_str_t *str, + const lxb_char_t *buff, size_t length); /* Data utils */ /* diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/str_res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/core/str_res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/str_res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/str_res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,32 +1,16 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ -#ifndef LEXBOR_STR_RES_H -#define LEXBOR_STR_RES_H -#define LEXBOR_STR_RES_MAP_CHAR_OTHER '\00' -#define LEXBOR_STR_RES_MAP_CHAR_A_Z_a_z '\01' -#define LEXBOR_STR_RES_MAP_CHAR_WHITESPACE '\02' - -#define LEXBOR_STR_RES_SLIP 0xFF - -#endif /* LEXBOR_STR_RES_H */ - -#ifdef LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER -#ifndef LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER_ENABLED -#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER_ENABLED -static const lxb_char_t -lexbor_str_res_ansi_replacement_character[] = "\xEF\xBF\xBD"; -#endif /* LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER_ENABLED */ -#endif /* LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER */ - -#ifdef LEXBOR_STR_RES_MAP_NUM -#ifndef LEXBOR_STR_RES_MAP_NUM_ENABLED -#define LEXBOR_STR_RES_MAP_NUM_ENABLED -static const lxb_char_t lexbor_str_res_map_num[] = { +LXB_API const lxb_char_t +lexbor_str_res_ansi_replacement_character[4] = "\xEF\xBF\xBD"; + +LXB_API const lxb_char_t +lexbor_str_res_map_num[256] = +{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -57,14 +41,10 @@ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -#endif /* LEXBOR_STR_RES_MAP_NUM_ENABLED */ -#endif /* LEXBOR_STR_RES_MAP_NUM */ - -#ifdef LEXBOR_STR_RES_MAP_HEX -#ifndef LEXBOR_STR_RES_MAP_HEX_ENABLED -#define LEXBOR_STR_RES_MAP_HEX_ENABLED -static const lxb_char_t lexbor_str_res_map_hex[] = { +LXB_API const lxb_char_t +lexbor_str_res_map_hex[256] = +{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -95,14 +75,10 @@ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -#endif /* LEXBOR_STR_RES_MAP_HEX_ENABLED */ -#endif /* LEXBOR_STR_RES_MAP_HEX */ - -#ifdef LEXBOR_STR_RES_MAP_LOWERCASE -#ifndef LEXBOR_STR_RES_MAP_LOWERCASE_ENABLED -#define LEXBOR_STR_RES_MAP_LOWERCASE_ENABLED -static const lxb_char_t lexbor_str_res_map_lowercase[] = { +LXB_API const lxb_char_t +lexbor_str_res_map_lowercase[256] = +{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, @@ -133,14 +109,10 @@ 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; -#endif /* LEXBOR_STR_RES_MAP_LOWERCASE_ENABLED */ -#endif /* LEXBOR_STR_RES_MAP_LOWERCASE */ - -#ifdef LEXBOR_STR_RES_MAP_UPPERCASE -#ifndef LEXBOR_STR_RES_MAP_UPPERCASE_ENABLED -#define LEXBOR_STR_RES_MAP_UPPERCASE_ENABLED -static const lxb_char_t lexbor_str_res_map_uppercase[] = { +LXB_API const lxb_char_t +lexbor_str_res_map_uppercase[256] = +{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, @@ -171,14 +143,10 @@ 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; -#endif /* LEXBOR_STR_RES_MAP_UPPERCASE_ENABLED */ -#endif /* LEXBOR_STR_RES_MAP_UPPERCASE */ - -#ifdef LEXBOR_STR_RES_REPLACEMENT_CHARACTER -#ifndef LEXBOR_STR_RES_REPLACEMENT_CHARACTER_ENABLED -#define LEXBOR_STR_RES_REPLACEMENT_CHARACTER_ENABLED -static const size_t lexbor_str_res_replacement_character[] = { +LXB_API const size_t +lexbor_str_res_replacement_character[160] = +{ 65533, 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, @@ -198,14 +166,10 @@ 144, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, 382, 376 }; -#endif /* LEXBOR_STR_RES_REPLACEMENT_CHARACTER_ENABLED */ -#endif /* LEXBOR_STR_RES_REPLACEMENT_CHARACTER */ - -#ifdef LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER -#ifndef LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER_ENABLED -#define LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER_ENABLED -static const size_t lexbor_str_res_alphanumeric_character[] = { +LXB_API const size_t +lexbor_str_res_alphanumeric_character[256] = +{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -236,14 +200,10 @@ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -#endif /* LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER_ENABLED */ -#endif /* LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER */ - -#ifdef LEXBOR_STR_RES_ALPHA_CHARACTER -#ifndef LEXBOR_STR_RES_ALPHA_CHARACTER_ENABLED -#define LEXBOR_STR_RES_ALPHA_CHARACTER_ENABLED -static const size_t lexbor_str_res_alpha_character[] = { +LXB_API const size_t +lexbor_str_res_alpha_character[256] = +{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -274,14 +234,10 @@ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -#endif /* LEXBOR_STR_RES_ALPHA_CHARACTER_ENABLED */ -#endif /* LEXBOR_STR_RES_ALPHA_CHARACTER */ - -#ifdef LEXBOR_TOKENIZER_CHARS_MAP -#ifndef LEXBOR_TOKENIZER_CHARS_MAP_ENABLED -#define LEXBOR_TOKENIZER_CHARS_MAP_ENABLED -static const unsigned char lexbor_tokenizer_chars_map[] = { +LXB_API const unsigned char +lexbor_tokenizer_chars_map[256] = +{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x02, 0xff, 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -312,35 +268,24 @@ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -#endif /* LEXBOR_TOKENIZER_CHARS_MAP_ENABLED */ -#endif /* LEXBOR_TOKENIZER_CHARS_MAP */ - -#ifdef LEXBOR_STR_RES_MAP_HEX_TO_CHAR -#ifndef LEXBOR_STR_RES_MAP_HEX_TO_CHAR_ENABLED -#define LEXBOR_STR_RES_MAP_HEX_TO_CHAR_ENABLED -static const lxb_char_t lexbor_str_res_map_hex_to_char[] = { +LXB_API const lxb_char_t +lexbor_str_res_map_hex_to_char[17] = +{ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00 }; -#endif /* LEXBOR_STR_RES_MAP_HEX_TO_CHAR_ENABLED */ -#endif /* LEXBOR_STR_RES_MAP_HEX_TO_CHAR */ -#ifdef LEXBOR_STR_RES_MAP_HEX_TO_CHAR_LOWERCASE -#ifndef LEXBOR_STR_RES_MAP_HEX_TO_CHAR_LOWERCASE_ENABLED -#define LEXBOR_STR_RES_MAP_HEX_TO_CHAR_LOWERCASE_ENABLED -static const lxb_char_t lexbor_str_res_map_hex_to_char_lowercase[] = { +LXB_API const lxb_char_t +lexbor_str_res_map_hex_to_char_lowercase[17] = +{ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x00 }; -#endif /* LEXBOR_STR_RES_MAP_HEX_TO_CHAR_LOWERCASE_ENABLED */ -#endif /* LEXBOR_STR_RES_MAP_HEX_TO_CHAR_LOWERCASE */ - -#ifdef LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE -#ifndef LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_ENABLED -#define LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_ENABLED -static const char * lexbor_str_res_char_to_two_hex_value[257] = { +LXB_API const char * +lexbor_str_res_char_to_two_hex_value[257] = +{ "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", "10", "11", "12", "13", "14", "15", "16", "17", @@ -375,13 +320,10 @@ "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF", NULL }; -#endif /* LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_ENABLED */ -#endif /* LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE */ -#ifdef LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_LOWERCASE -#ifndef LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_LOWERCASE_ENABLED -#define LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_LOWERCASE_ENABLED -static const char * lexbor_str_res_char_to_two_hex_value_lowercase[257] = { +LXB_API const char * +lexbor_str_res_char_to_two_hex_value_lowercase[257] = +{ "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0a", "0b", "0c", "0d", "0e", "0f", "10", "11", "12", "13", "14", "15", "16", "17", @@ -416,5 +358,3 @@ "f8", "f9", "fa", "fb", "fc", "fd", "fe", "ff", NULL }; -#endif /* LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_LOWERCASE_ENABLED */ -#endif /* LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_LOWERCASE */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/strtod.c php8.4-8.4.21/ext/dom/lexbor/lexbor/core/strtod.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/strtod.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/strtod.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,14 +1,36 @@ /* - * Copyright (C) Alexander Borisov - * - * Based on nxt_strtod.c from NGINX NJS project + * Copyright (C) 2015-2019 NGINX, Inc. + * Copyright (C) 2019-2025 F5, Inc. + * Copyright (C) 2015-2021 Igor Sysoev + * Copyright (C) 2017-2025 Dmitry Volyntsev + * Copyright (C) 2019-2022 Alexander Borisov + * Copyright (C) 2022-2025 Vadim Zhestikov + * All rights reserved. * - * An internal strtod() implementation based upon V8 src/strtod.cc - * without bignum support. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * Copyright 2012 the V8 project authors. All rights reserved. - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file. + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (C) Alexander Borisov */ #include diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/core/strtod.h php8.4-8.4.21/ext/dom/lexbor/lexbor/core/strtod.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/core/strtod.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/core/strtod.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,10 +1,36 @@ /* - * Copyright (C) Alexander Borisov + * Copyright (C) 2015-2019 NGINX, Inc. + * Copyright (C) 2019-2025 F5, Inc. + * Copyright (C) 2015-2021 Igor Sysoev + * Copyright (C) 2017-2025 Dmitry Volyntsev + * Copyright (C) 2019-2022 Alexander Borisov + * Copyright (C) 2022-2025 Vadim Zhestikov + * All rights reserved. * - * Based on nxt_strtod.h from NGINX NJS project + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * Copyright (C) Dmitry Volyntsev - * Copyright (C) Nginx, Inc. + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (C) Alexander Borisov */ #ifndef LEXBOR_STRTOD_H diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule/const.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule/const.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule/const.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule/const.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Alexander Borisov + * Copyright (C) 2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -21,9 +21,10 @@ enum { LXB_CSS_AT_RULE__UNDEF = 0x0000, LXB_CSS_AT_RULE__CUSTOM = 0x0001, - LXB_CSS_AT_RULE_MEDIA = 0x0002, - LXB_CSS_AT_RULE_NAMESPACE = 0x0003, - LXB_CSS_AT_RULE__LAST_ENTRY = 0x0004 + LXB_CSS_AT_RULE_FONT_FACE = 0x0002, + LXB_CSS_AT_RULE_MEDIA = 0x0003, + LXB_CSS_AT_RULE_NAMESPACE = 0x0004, + LXB_CSS_AT_RULE__LAST_ENTRY = 0x0005 }; typedef uintptr_t lxb_css_at_rule_type_t; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule/res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule/res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule/res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule/res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Alexander Borisov + * Copyright (C) 2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -18,16 +18,19 @@ #include "lexbor/css/at_rule/const.h" -static const lxb_css_entry_data_t lxb_css_at_rule_data[LXB_CSS_AT_RULE__LAST_ENTRY] = +static const lxb_css_entry_at_rule_data_t lxb_css_at_rule_data[LXB_CSS_AT_RULE__LAST_ENTRY] = { - {(lxb_char_t *) "#undef", 6, LXB_CSS_AT_RULE__UNDEF, lxb_css_at_rule_state__undef, + {(lxb_char_t *) "#undef", 6, LXB_CSS_AT_RULE__UNDEF, &lxb_css_at_rule__undef_cb, lxb_css_at_rule__undef_create, lxb_css_at_rule__undef_destroy, lxb_css_at_rule__undef_serialize, (void *) (uintptr_t) LXB_CSS_AT_RULE__UNDEF}, - {(lxb_char_t *) "#сustom", 7, LXB_CSS_AT_RULE__CUSTOM, lxb_css_at_rule_state__custom, + {(lxb_char_t *) "#сustom", 7, LXB_CSS_AT_RULE__CUSTOM, &lxb_css_at_rule__custom_cb, lxb_css_at_rule__custom_create, lxb_css_at_rule__custom_destroy, lxb_css_at_rule__custom_serialize, (void *) (uintptr_t) LXB_CSS_AT_RULE__CUSTOM}, - {(lxb_char_t *) "media", 5, LXB_CSS_AT_RULE_MEDIA, lxb_css_at_rule_state_media, + {(lxb_char_t *) "font-face", 9, LXB_CSS_AT_RULE_FONT_FACE, &lxb_css_at_rule_font_face_cb, + lxb_css_at_rule_font_face_create, lxb_css_at_rule_font_face_destroy, lxb_css_at_rule_font_face_serialize, + NULL}, + {(lxb_char_t *) "media", 5, LXB_CSS_AT_RULE_MEDIA, &lxb_css_at_rule_media_cb, lxb_css_at_rule_media_create, lxb_css_at_rule_media_destroy, lxb_css_at_rule_media_serialize, NULL}, - {(lxb_char_t *) "namespace", 9, LXB_CSS_AT_RULE_NAMESPACE, lxb_css_at_rule_state_namespace, + {(lxb_char_t *) "namespace", 9, LXB_CSS_AT_RULE_NAMESPACE, &lxb_css_at_rule_namespace_cb, lxb_css_at_rule_namespace_create, lxb_css_at_rule_namespace_destroy, lxb_css_at_rule_namespace_serialize, NULL} }; @@ -38,7 +41,7 @@ {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {"media", (void *) &lxb_css_at_rule_data[LXB_CSS_AT_RULE_MEDIA], 5, 0}, - {NULL, NULL, 0, 0}, + {"font-face", (void *) &lxb_css_at_rule_data[LXB_CSS_AT_RULE_FONT_FACE], 9, 0}, {"namespace", (void *) &lxb_css_at_rule_data[LXB_CSS_AT_RULE_NAMESPACE], 9, 0} }; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule/state.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule/state.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule/state.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule/state.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,374 @@ +/* + * Copyright (C) 2021-2026 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/css/css.h" +#include "lexbor/css/at_rule.h" +#include "lexbor/css/parser.h" +#include "lexbor/css/rule.h" +#include "lexbor/css/blank.h" +#include "lexbor/css/at_rule/state.h" + + +/* Undef */ + +bool +lxb_css_at_rule__undef_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_rule_at_t *at = ctx; + + at->prelude_begin = token->offset; + + /* Skip all prelude. */ + + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +lxb_status_t +lxb_css_at_rule__undef_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_status_t status; + lxb_css_rule_at_t *at = ctx; + + at->prelude_end = token->offset; + + status = lxb_css_make_data(parser, &at->u.undef->prelude, + at->prelude_begin, at->prelude_end); + if (status != LXB_STATUS_OK) { + return lxb_css_parser_memory_fail_status(parser); + } + + return LXB_STATUS_OK; +} + +const lxb_css_syntax_cb_block_t * +lxb_css_at_rule__undef_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + return lxb_css_state_at_rule_block_begin(parser, token, ctx, out_rule); +} + +bool +lxb_css_at_rule__undef_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + /* For _UNDEF and _CUSTOM, access here is not possible. */ + + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +lxb_status_t +lxb_css_at_rule__undef_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_css_rule_at_t *at = ctx; + lxb_css_rule_list_t *block = lxb_css_syntax_returned(parser); + + /* + * Here we do not check for failed because it cannot happen; we do not call + * failed anywhere in _UNDEF and _CUSTOM, we simply skip the tokens. + */ + + at->u.undef->block = block; + + lxb_css_syntax_set_return(parser, at); + + return LXB_STATUS_OK; +} + +/* Custom */ + +bool +lxb_css_at_rule__custom_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_at_rule__undef_prelude(parser, token, ctx); +} + +lxb_status_t +lxb_css_at_rule__custom_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_status_t status; + lxb_css_rule_at_t *at = ctx; + + at->prelude_end = token->offset; + + status = lxb_css_make_data(parser, &at->u.custom->prelude, + at->prelude_begin, at->prelude_end); + if (status != LXB_STATUS_OK) { + return lxb_css_parser_memory_fail_status(parser); + } + + return LXB_STATUS_OK; +} + +const lxb_css_syntax_cb_block_t * +lxb_css_at_rule__custom_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + return lxb_css_state_at_rule_block_begin(parser, token, ctx, out_rule); +} + +bool +lxb_css_at_rule__custom_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + return lxb_css_at_rule__undef_prelude_failed(parser, token, ctx); +} + +lxb_status_t +lxb_css_at_rule__custom_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_css_rule_at_t *at = ctx; + lxb_css_rule_list_t *block = lxb_css_syntax_returned(parser); + + /* + * Here we do not check for failed because it cannot happen; we do not call + * failed anywhere in _UNDEF and _CUSTOM, we simply skip the tokens. + */ + + at->u.custom->block = block; + + lxb_css_syntax_set_return(parser, at); + + return LXB_STATUS_OK; +} + +/* Namespace */ + +bool +lxb_css_at_rule_namespace_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + lxb_css_rule_at_t *at = ctx; + + at->prelude_begin = token->offset; + + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +lxb_status_t +lxb_css_at_rule_namespace_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_css_rule_at_t *at = ctx; + + at->prelude_end = token->offset; + + return LXB_STATUS_OK; +} + +const lxb_css_syntax_cb_block_t * +lxb_css_at_rule_namespace_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + lxb_css_parser_failed_set(parser, true); + + return lxb_css_state_at_rule_block_begin(parser, token, ctx, out_rule); +} + +bool +lxb_css_at_rule_namespace_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + return lxb_css_at_rule__undef_prelude_failed(parser, token, ctx); +} + +lxb_status_t +lxb_css_at_rule_namespace_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_status_t status; + lxb_css_rule_at_t *at = ctx; + + if (failed) { + status = lxb_css_at_rule_convert_to_undef(parser, at); + if (status != LXB_STATUS_OK) { + return status; + } + + at->u.undef->block = lxb_css_syntax_returned(parser); + } + + lxb_css_syntax_set_return(parser, at); + + return LXB_STATUS_OK; +} + +/* Media */ + +bool +lxb_css_at_rule_media_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_rule_at_t *at = ctx; + + at->prelude_begin = token->offset; + + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +lxb_status_t +lxb_css_at_rule_media_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_css_rule_at_t *at = ctx; + + at->prelude_end = token->offset; + + return LXB_STATUS_OK; +} + +const lxb_css_syntax_cb_block_t * +lxb_css_at_rule_media_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + return lxb_css_state_at_rule_block_begin(parser, token, ctx, out_rule); +} + +bool +lxb_css_at_rule_media_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + return lxb_css_at_rule__undef_prelude_failed(parser, token, ctx); +} + +lxb_status_t +lxb_css_at_rule_media_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_status_t status; + lxb_css_rule_at_t *at = ctx; + lxb_css_rule_list_t *list = lxb_css_syntax_returned(parser); + + if (list != NULL && !failed) { + at->u.media->block = list; + } + else { + status = lxb_css_at_rule_convert_to_undef(parser, at); + if (status != LXB_STATUS_OK) { + return status; + } + + at->u.undef->block = list; + } + + lxb_css_syntax_set_return(parser, at); + + return LXB_STATUS_OK; +} + +/* Font-face */ + +bool +lxb_css_at_rule_font_face_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + lxb_css_rule_at_t *at = ctx; + + at->prelude_begin = token->offset; + + if (token->type != LXB_CSS_SYNTAX_TOKEN__END) { + return lxb_css_parser_failed(parser); + } + + return lxb_css_parser_success(parser); +} + +lxb_status_t +lxb_css_at_rule_font_face_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_css_rule_at_t *at = ctx; + + at->prelude_end = token->offset; + + return LXB_STATUS_OK; +} + +const lxb_css_syntax_cb_block_t * +lxb_css_at_rule_font_face_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + return lxb_css_state_at_rule_block_begin(parser, token, ctx, out_rule); +} + +bool +lxb_css_at_rule_font_face_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + return lxb_css_at_rule__undef_prelude_failed(parser, token, ctx); +} + +lxb_status_t +lxb_css_at_rule_font_face_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_status_t status; + lxb_css_rule_at_t *at = ctx; + lxb_css_rule_list_t *block = lxb_css_syntax_returned(parser); + + if (!failed) { + at->u.font_face->block = block; + } + else { + status = lxb_css_at_rule_convert_to_undef(parser, at); + if (status != LXB_STATUS_OK) { + return status; + } + + at->u.undef->block = block; + } + + lxb_css_syntax_set_return(parser, at); + + return LXB_STATUS_OK; +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule/state.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule/state.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule/state.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule/state.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 Alexander Borisov + * Copyright (C) 2021-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -15,18 +15,110 @@ LXB_API bool -lxb_css_at_rule_state__undef(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, void *ctx); +lxb_css_at_rule__undef_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx); +LXB_API lxb_status_t +lxb_css_at_rule__undef_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +LXB_API const lxb_css_syntax_cb_block_t * +lxb_css_at_rule__undef_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); +LXB_API bool +lxb_css_at_rule__undef_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); +LXB_API lxb_status_t +lxb_css_at_rule__undef_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +LXB_API bool +lxb_css_at_rule__custom_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx); +LXB_API lxb_status_t +lxb_css_at_rule__custom_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +LXB_API const lxb_css_syntax_cb_block_t * +lxb_css_at_rule__custom_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); +LXB_API bool +lxb_css_at_rule__custom_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); +LXB_API lxb_status_t +lxb_css_at_rule__custom_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); LXB_API bool -lxb_css_at_rule_state__custom(lxb_css_parser_t *parser, +lxb_css_at_rule_namespace_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx); +LXB_API lxb_status_t +lxb_css_at_rule_namespace_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +LXB_API const lxb_css_syntax_cb_block_t * +lxb_css_at_rule_namespace_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); +LXB_API bool +lxb_css_at_rule_namespace_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); +LXB_API lxb_status_t +lxb_css_at_rule_namespace_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +LXB_API bool +lxb_css_at_rule_media_prelude(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx); +LXB_API lxb_status_t +lxb_css_at_rule_media_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +LXB_API const lxb_css_syntax_cb_block_t * +lxb_css_at_rule_media_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); LXB_API bool -lxb_css_at_rule_state_media(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, void *ctx); +lxb_css_at_rule_media_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); +LXB_API lxb_status_t +lxb_css_at_rule_media_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + LXB_API bool -lxb_css_at_rule_state_namespace(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, void *ctx); +lxb_css_at_rule_font_face_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); +LXB_API lxb_status_t +lxb_css_at_rule_font_face_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +LXB_API const lxb_css_syntax_cb_block_t * +lxb_css_at_rule_font_face_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); +LXB_API bool +lxb_css_at_rule_font_face_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); +LXB_API lxb_status_t +lxb_css_at_rule_font_face_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); #ifdef __cplusplus diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule/types.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule/types.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule/types.h 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule/types.h 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2026 Alexander Borisov + * + * Author: Alexander Borisov + */ + +/* + * Caution! + * This file generated by the script "utils/lexbor/css/names.py"! + * Do not change this file! + */ + + +#ifndef LXB_CSS_AT_RULE_TYPES_H +#define LXB_CSS_AT_RULE_TYPES_H + + +static const lxb_css_syntax_cb_at_rule_t lxb_css_at_rule__undef_cb = { + .prelude = lxb_css_at_rule__undef_prelude, + .prelude_end = lxb_css_at_rule__undef_prelude_end, + .block = lxb_css_at_rule__undef_block, + .cb.failed = lxb_css_at_rule__undef_prelude_failed, + .cb.end = lxb_css_at_rule__undef_end +}; + +static const lxb_css_syntax_cb_at_rule_t lxb_css_at_rule__custom_cb = { + .prelude = lxb_css_at_rule__custom_prelude, + .prelude_end = lxb_css_at_rule__custom_prelude_end, + .block = lxb_css_at_rule__custom_block, + .cb.failed = lxb_css_at_rule__custom_prelude_failed, + .cb.end = lxb_css_at_rule__custom_end +}; + +static const lxb_css_syntax_cb_at_rule_t lxb_css_at_rule_font_face_cb = { + .prelude = lxb_css_at_rule_font_face_prelude, + .prelude_end = lxb_css_at_rule_font_face_prelude_end, + .block = lxb_css_at_rule_font_face_block, + .cb.failed = lxb_css_at_rule_font_face_prelude_failed, + .cb.end = lxb_css_at_rule_font_face_end +}; + +static const lxb_css_syntax_cb_at_rule_t lxb_css_at_rule_media_cb = { + .prelude = lxb_css_at_rule_media_prelude, + .prelude_end = lxb_css_at_rule_media_prelude_end, + .block = lxb_css_at_rule_media_block, + .cb.failed = lxb_css_at_rule_media_prelude_failed, + .cb.end = lxb_css_at_rule_media_end +}; + +static const lxb_css_syntax_cb_at_rule_t lxb_css_at_rule_namespace_cb = { + .prelude = lxb_css_at_rule_namespace_prelude, + .prelude_end = lxb_css_at_rule_namespace_prelude_end, + .block = lxb_css_at_rule_namespace_block, + .cb.failed = lxb_css_at_rule_namespace_prelude_failed, + .cb.end = lxb_css_at_rule_namespace_end +}; + + + +#endif /* LXB_CSS_AT_RULE_TYPES_H */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,449 @@ +/* + * Copyright (C) 2021-2026 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/css/at_rule.h" +#include "lexbor/css/css.h" +#include "lexbor/css/parser.h" +#include "lexbor/css/stylesheet.h" +#include "lexbor/css/at_rule/state.h" +#include "lexbor/css/at_rule/types.h" +#include "lexbor/css/at_rule/res.h" +#include "lexbor/core/serialize.h" + + +const lxb_css_entry_at_rule_data_t * +lxb_css_at_rule_by_name(const lxb_char_t *name, size_t length) +{ + const lexbor_shs_entry_t *entry; + + entry = lexbor_shs_entry_get_lower_static(lxb_css_at_rule_shs, + name, length); + if (entry == NULL) { + return NULL; + } + + return entry->value; +} + +const lxb_css_entry_at_rule_data_t * +lxb_css_at_rule_by_id(uintptr_t id) +{ + return &lxb_css_at_rule_data[id]; +} + +lxb_css_rule_at_t * +lxb_css_at_rule_create(lxb_css_parser_t *parser, + const lxb_char_t *name, size_t length, + const lxb_css_entry_at_rule_data_t **out_entry) +{ + void *prop; + const lxb_css_entry_at_rule_data_t *entry; + lxb_css_at_rule__custom_t *custom; + lxb_css_rule_at_t *at; + + at = lxb_css_rule_at_create(parser->memory); + if (at == NULL) { + return NULL; + } + + entry = lxb_css_at_rule_by_name(name, length); + if (entry == NULL) { + entry = lxb_css_at_rule_by_id(LXB_CSS_AT_RULE__CUSTOM); + + prop = entry->create(parser->memory); + if (prop == NULL) { + goto failed; + } + + custom = prop; + + (void) lexbor_str_init(&custom->name, parser->memory->mraw, length); + if (custom->name.data == NULL) { + goto failed; + } + + memcpy(custom->name.data, name, length); + + custom->name.length = length; + custom->name.data[custom->name.length] = 0x00; + } + else { + prop = entry->create(parser->memory); + if (prop == NULL) { + goto failed; + } + } + + at->type = entry->unique; + at->u.user = prop; + + if (out_entry != NULL) { + *out_entry = entry; + } + + return at; + +failed: + + if (prop != NULL) { + (void) entry->destroy(parser->memory, prop, true); + } + + if (at != NULL) { + (void) lxb_css_rule_at_destroy(at, true); + } + + if (out_entry != NULL) { + *out_entry = NULL; + } + + return NULL; +} + +void * +lxb_css_at_rule_destroy(lxb_css_memory_t *memory, void *value, + lxb_css_at_rule_type_t type, bool self_destroy) +{ + const lxb_css_entry_at_rule_data_t *data; + + data = lxb_css_at_rule_by_id(type); + if (data == NULL) { + return value; + } + + return data->destroy(memory, value, self_destroy); +} + +lxb_status_t +lxb_css_at_rule_convert_to_undef(lxb_css_parser_t *parser, + lxb_css_rule_at_t *at) +{ + lxb_css_at_rule__undef_t *undef; + + undef = lxb_css_at_rule__undef_create(parser->memory); + if (undef == NULL) { + return LXB_STATUS_ERROR_MEMORY_ALLOCATION; + } + + undef->type = at->type; + + (void) lxb_css_at_rule_destroy(parser->memory, at, undef->type, false); + + at->type = LXB_CSS_AT_RULE__UNDEF; + at->u.undef = undef; + + return lxb_css_make_data(parser, &at->u.undef->prelude, + at->prelude_begin, at->prelude_end); +} + +lxb_status_t +lxb_css_at_rule_serialize(const void *style, lxb_css_at_rule_type_t type, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_entry_at_rule_data_t *data; + + data = lxb_css_at_rule_by_id(type); + if (data == NULL) { + return LXB_STATUS_ERROR_UNEXPECTED_DATA; + } + + return data->serialize(style, cb, ctx); +} + +lxb_status_t +lxb_css_at_rule_serialize_str(const void *style, lxb_css_at_rule_type_t type, + lexbor_mraw_t *mraw, lexbor_str_t *str) +{ + const lxb_css_entry_at_rule_data_t *data; + + data = lxb_css_at_rule_by_id(type); + if (data == NULL) { + return LXB_STATUS_ERROR_UNEXPECTED_DATA; + } + + return lxb_css_serialize_str_handler(style, str, mraw, data->serialize); +} + +lxb_status_t +lxb_css_at_rule_serialize_name(const void *style, lxb_css_at_rule_type_t type, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_entry_at_rule_data_t *data; + + if (type == LXB_CSS_AT_RULE__UNDEF) { + return lxb_css_at_rule__undef_serialize_name(style, cb, ctx); + } + else if (type == LXB_CSS_AT_RULE__CUSTOM) { + return lxb_css_at_rule__custom_serialize_name(style, cb, ctx); + } + + data = lxb_css_at_rule_by_id(type); + if (data == NULL) { + return LXB_STATUS_ERROR_UNEXPECTED_DATA; + } + + return cb(data->name, data->length, ctx); +} + +lxb_status_t +lxb_css_at_rule_serialize_name_str(const void *style, lxb_css_at_rule_type_t type, + lexbor_mraw_t *mraw, lexbor_str_t *str) +{ + const lxb_css_entry_at_rule_data_t *data; + + if (type == LXB_CSS_AT_RULE__UNDEF) { + return lxb_css_serialize_str_handler(style, str, mraw, + lxb_css_at_rule__undef_serialize_name); + } + else if (type == LXB_CSS_AT_RULE__CUSTOM) { + return lxb_css_serialize_str_handler(style, str, mraw, + lxb_css_at_rule__custom_serialize_name); + } + + data = lxb_css_at_rule_by_id(type); + if (data == NULL) { + return LXB_STATUS_ERROR_UNEXPECTED_DATA; + } + + if (str->data == NULL) { + lexbor_str_init(str, mraw, data->length); + if (str->data == NULL) { + return LXB_STATUS_ERROR_MEMORY_ALLOCATION; + } + } + + (void) lexbor_str_append(str, mraw, data->name, data->length); + + return LXB_STATUS_OK; +} + +/* _undef. */ + +void * +lxb_css_at_rule__undef_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_at_rule__undef_t)); +} + +void * +lxb_css_at_rule__undef_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + if (style == NULL) { + return NULL; + } + + if (self_destroy) { + return lexbor_mraw_free(memory->mraw, style); + } + + return style; +} + +lxb_status_t +lxb_css_at_rule__undef_serialize(const void *at, lexbor_serialize_cb_f cb, + void *ctx) +{ + lxb_status_t status; + const lxb_css_entry_at_rule_data_t *data; + const lxb_css_at_rule__undef_t *undef = at; + + static const lxb_char_t wc_str[] = " "; + static const lxb_char_t lb_str[] = "{"; + static const lxb_char_t rb_str[] = "}"; + static const lxb_char_t sm_str[] = ";"; + + data = lxb_css_at_rule_by_id(undef->type); + if (data == NULL) { + return LXB_STATUS_ERROR_UNEXPECTED_DATA; + } + + if (undef->prelude.data != NULL) { + lexbor_serialize_write(cb, wc_str, (sizeof(wc_str) - 1), ctx, status); + lexbor_serialize_write(cb, undef->prelude.data, undef->prelude.length, + ctx, status); + } + + if (undef->block != NULL) { + lexbor_serialize_write(cb, lb_str, (sizeof(lb_str) - 1), ctx, status); + + status = lxb_css_rule_list_serialize(undef->block, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + lexbor_serialize_write(cb, rb_str, (sizeof(rb_str) - 1), ctx, status); + } + else { + lexbor_serialize_write(cb, sm_str, (sizeof(sm_str) - 1), ctx, status); + } + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_at_rule__undef_serialize_name(const void *at, lexbor_serialize_cb_f cb, + void *ctx) +{ + const lxb_css_entry_at_rule_data_t *data; + const lxb_css_at_rule__undef_t *undef = at; + + data = lxb_css_at_rule_by_id(undef->type); + if (data == NULL) { + return LXB_STATUS_ERROR_UNEXPECTED_DATA; + } + + return cb(data->name, data->length, ctx); +} + +/* _custom. */ + +void * +lxb_css_at_rule__custom_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_at_rule__custom_t)); +} + +void * +lxb_css_at_rule__custom_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + if (style == NULL) { + return NULL; + } + + if (self_destroy) { + return lexbor_mraw_free(memory->mraw, style); + } + + return style; +} + +lxb_status_t +lxb_css_at_rule__custom_serialize(const void *at, lexbor_serialize_cb_f cb, + void *ctx) +{ + lxb_status_t status; + const lxb_css_at_rule__custom_t *custom = at; + + static const lxb_char_t ws_str[] = " "; + static const lxb_char_t lb_str[] = "{"; + static const lxb_char_t rb_str[] = "}"; + + + if (custom->prelude.data != NULL) { + lexbor_serialize_write(cb, ws_str, (sizeof(ws_str) - 1), ctx, status); + lexbor_serialize_write(cb, custom->prelude.data, custom->prelude.length, + ctx, status); + } + + if (custom->block != NULL) { + lexbor_serialize_write(cb, lb_str, (sizeof(lb_str) - 1), ctx, status); + + status = lxb_css_rule_list_serialize(custom->block, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + lexbor_serialize_write(cb, rb_str, (sizeof(rb_str) - 1), ctx, status); + } + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_at_rule__custom_serialize_name(const void *at, lexbor_serialize_cb_f cb, + void *ctx) +{ + const lxb_css_at_rule__custom_t *custom = at; + + return cb(custom->name.data, custom->name.length, ctx); +} + +/* Media. */ + +void * +lxb_css_at_rule_media_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_at_rule_media_t)); +} + +void * +lxb_css_at_rule_media_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_at_rule__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_at_rule_media_serialize(const void *style, lexbor_serialize_cb_f cb, + void *ctx) +{ + return LXB_STATUS_OK; +} + +/* Namespace. */ + +void * +lxb_css_at_rule_namespace_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_at_rule_namespace_t)); +} + +void * +lxb_css_at_rule_namespace_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_at_rule__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_at_rule_namespace_serialize(const void *style, lexbor_serialize_cb_f cb, + void *ctx) +{ + return LXB_STATUS_OK; +} + +/* Font-face. */ + +void * +lxb_css_at_rule_font_face_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_at_rule_font_face_t)); +} + +void * +lxb_css_at_rule_font_face_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_at_rule__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_at_rule_font_face_serialize(const void *font_face, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + const lxb_css_at_rule_font_face_t *ff = font_face; + + static const lxb_char_t lb_str[] = " {"; + static const lxb_char_t rb_str[] = "}"; + + if (ff->block != NULL) { + lexbor_serialize_write(cb, lb_str, (sizeof(lb_str) - 1), ctx, status); + + status = lxb_css_rule_list_serialize(ff->block, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + lexbor_serialize_write(cb, rb_str, (sizeof(rb_str) - 1), ctx, status); + } + + return LXB_STATUS_OK; +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/at_rule.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/at_rule.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 Alexander Borisov + * Copyright (C) 2021-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -19,19 +19,19 @@ typedef struct { lxb_css_at_rule_type_t type; lexbor_str_t prelude; - lexbor_str_t block; + lxb_css_rule_list_t *block; } lxb_css_at_rule__undef_t; typedef struct { - lexbor_str_t name; - lexbor_str_t prelude; - lexbor_str_t block; + lexbor_str_t name; + lexbor_str_t prelude; + lxb_css_rule_list_t *block; } lxb_css_at_rule__custom_t; typedef struct { - uintptr_t reserved; + lxb_css_rule_list_t *block; } lxb_css_at_rule_media_t; @@ -40,18 +40,32 @@ } lxb_css_at_rule_namespace_t; +typedef struct { + lxb_css_rule_list_t *block; +} +lxb_css_at_rule_font_face_t; -LXB_API const lxb_css_entry_data_t * + +LXB_API const lxb_css_entry_at_rule_data_t * lxb_css_at_rule_by_name(const lxb_char_t *name, size_t length); -LXB_API const lxb_css_entry_data_t * +LXB_API const lxb_css_entry_at_rule_data_t * lxb_css_at_rule_by_id(uintptr_t id); +LXB_API lxb_css_rule_at_t * +lxb_css_at_rule_create(lxb_css_parser_t *parser, + const lxb_char_t *name, size_t length, + const lxb_css_entry_at_rule_data_t **out_entry); + LXB_API void * lxb_css_at_rule_destroy(lxb_css_memory_t *memory, void *value, lxb_css_at_rule_type_t type, bool self_destroy); LXB_API lxb_status_t +lxb_css_at_rule_convert_to_undef(lxb_css_parser_t *parser, + lxb_css_rule_at_t *at); + +LXB_API lxb_status_t lxb_css_at_rule_serialize(const void *style, lxb_css_at_rule_type_t type, lexbor_serialize_cb_f cb, void *ctx); LXB_API lxb_status_t @@ -73,10 +87,6 @@ lxb_css_at_rule__undef_destroy(lxb_css_memory_t *memory, void *style, bool self_destroy); LXB_API lxb_status_t -lxb_css_at_rule__undef_make(lxb_css_parser_t *parser, - lxb_css_at_rule__undef_t *undef, - const lxb_css_syntax_at_rule_offset_t *at_rule); -LXB_API lxb_status_t lxb_css_at_rule__undef_serialize(const void *style, lexbor_serialize_cb_f cb, void *ctx); LXB_API lxb_status_t @@ -92,10 +102,6 @@ lxb_css_at_rule__custom_destroy(lxb_css_memory_t *memory, void *style, bool self_destroy); LXB_API lxb_status_t -lxb_css_at_rule__custom_make(lxb_css_parser_t *parser, - lxb_css_at_rule__custom_t *custom, - const lxb_css_syntax_at_rule_offset_t *at_rule); -LXB_API lxb_status_t lxb_css_at_rule__custom_serialize(const void *style, lexbor_serialize_cb_f cb, void *ctx); LXB_API lxb_status_t @@ -126,6 +132,18 @@ lxb_css_at_rule_namespace_serialize(const void *style, lexbor_serialize_cb_f cb, void *ctx); +/* Font-face. */ + +LXB_API void * +lxb_css_at_rule_font_face_create(lxb_css_memory_t *memory); + +LXB_API void * +lxb_css_at_rule_font_face_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy); + +LXB_API lxb_status_t +lxb_css_at_rule_font_face_serialize(const void *style, lexbor_serialize_cb_f cb, + void *ctx); #ifdef __cplusplus } /* extern "C" */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/base.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/base.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/base.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/base.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2025 Alexander Borisov + * Copyright (C) 2019-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -18,7 +18,7 @@ #define LXB_CSS_VERSION_MAJOR 1 -#define LXB_CSS_VERSION_MINOR 3 +#define LXB_CSS_VERSION_MINOR 4 #define LXB_CSS_VERSION_PATCH 0 #define LXB_CSS_VERSION_STRING \ @@ -45,6 +45,8 @@ typedef struct lxb_css_syntax_tokenizer lxb_css_syntax_tokenizer_t; typedef struct lxb_css_syntax_token lxb_css_syntax_token_t; +/* Callbacks. */ + typedef bool (*lxb_css_parser_state_f)(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx); @@ -83,6 +85,21 @@ lxb_css_entry_data_t; typedef struct { + lxb_char_t *name; + size_t length; + uintptr_t unique; + + /* const lxb_css_syntax_cb_at_rule_t */ + const void *cbs; + + lxb_css_style_create_f create; + lxb_css_style_destroy_f destroy; + lxb_css_style_serialize_f serialize; + void *initial; +} +lxb_css_entry_at_rule_data_t; + +typedef struct { lxb_char_t *name; size_t length; uintptr_t unique; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/blank.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/blank.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/blank.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/blank.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,389 @@ +/* + * Copyright (C) 2026 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/css/blank.h" +#include "lexbor/css/state.h" +#include "lexbor/css/css.h" +#include "lexbor/css/at_rule/state.h" + + +static bool +lxb_css_blank_list_rules_next(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx); + +static lxb_status_t +lxb_css_blank_list_rules_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +static const lxb_css_syntax_cb_at_rule_t * +lxb_css_blank_at_rule_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx, + void **out_rule); + +static bool +lxb_css_blank_at_rule_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); + +static lxb_status_t +lxb_css_blank_at_rule_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +static const lxb_css_syntax_cb_block_t * +lxb_css_blank_at_rule_block_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); +static bool +lxb_css_blank_at_rule_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); +static lxb_status_t +lxb_css_blank_at_rule_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +static const lxb_css_syntax_cb_qualified_rule_t * +lxb_css_blank_qualified_rule_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); + +static bool +lxb_css_blank_qualified_rule_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); + +static lxb_status_t +lxb_css_blank_qualified_rule_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +static const lxb_css_syntax_cb_block_t * +lxb_css_blank_qualified_rule_block_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); + +static bool +lxb_css_blank_qualified_rule_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); +static lxb_status_t +lxb_css_blank_qualified_rule_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); +static bool +lxb_css_blank_block_next(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx); + +static lxb_status_t +lxb_css_blank_block_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +static const lxb_css_syntax_cb_declarations_t * +lxb_css_blank_declarations_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); + +static lxb_css_parser_state_f +lxb_css_blank_declaration_name(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); +static bool +lxb_css_blank_declaration_value(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx); + +static lxb_status_t +lxb_css_blank_declaration_end(lxb_css_parser_t *parser, + void *declarations, void *ctx, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_declaration_offset_t *offset, + bool important, bool failed); + +static lxb_status_t +lxb_css_blank_declarations_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +static bool +lxb_css_blank_declarations_bad(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx); + + +static const lxb_css_syntax_cb_list_rules_t lxb_css_blank_list_rules = { + .at_rule = lxb_css_blank_at_rule_begin, + .qualified_rule = lxb_css_blank_qualified_rule_begin, + .next = lxb_css_blank_list_rules_next, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_blank_list_rules_end +}; + +static const lxb_css_syntax_cb_at_rule_t lxb_css_blank_at_rule = { + .prelude = lxb_css_blank_at_rule_prelude, + .prelude_end = lxb_css_blank_at_rule_prelude_end, + .block = lxb_css_blank_at_rule_block_begin, + .cb.failed = lxb_css_blank_at_rule_prelude_failed, + .cb.end = lxb_css_blank_at_rule_end +}; + +static const lxb_css_syntax_cb_qualified_rule_t lxb_css_blank_qualified_rule = { + .prelude = lxb_css_blank_qualified_rule_prelude, + .prelude_end = lxb_css_blank_qualified_rule_prelude_end, + .block = lxb_css_blank_qualified_rule_block_begin, + .cb.failed = lxb_css_blank_qualified_rule_prelude_failed, + .cb.end = lxb_css_blank_qualified_rule_end +}; + +static const lxb_css_syntax_cb_block_t lxb_css_blank_block = { + .at_rule = lxb_css_blank_at_rule_begin, + .declarations = lxb_css_blank_declarations_begin, + .qualified_rule = lxb_css_blank_qualified_rule_begin, + .next = lxb_css_blank_block_next, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_blank_block_end, +}; + +static const lxb_css_syntax_cb_declarations_t lxb_css_blank_declaration = { + .name = lxb_css_blank_declaration_name, + .end = lxb_css_blank_declaration_end, + .cb.failed = lxb_css_blank_declarations_bad, + .cb.end = lxb_css_blank_declarations_end +}; + + +const lxb_css_syntax_cb_list_rules_t * +lxb_css_blank_cb_list_rules(void) +{ + return &lxb_css_blank_list_rules; +} + +const lxb_css_syntax_cb_at_rule_t * +lxb_css_blank_cb_at_rule(void) +{ + return &lxb_css_blank_at_rule; +} + +const lxb_css_syntax_cb_qualified_rule_t * +lxb_css_blank_cb_qualified_rule(void) +{ + return &lxb_css_blank_qualified_rule; +} + +const lxb_css_syntax_cb_block_t * +lxb_css_blank_cb_block(void) +{ + return &lxb_css_blank_block; +} + +const lxb_css_syntax_cb_declarations_t * +lxb_css_blank_cb_declarations(void) +{ + return &lxb_css_blank_declaration; +} + +static bool +lxb_css_blank_list_rules_next(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_parser_success(parser); +} + +static lxb_status_t +lxb_css_blank_list_rules_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + return LXB_STATUS_OK; +} + +static const lxb_css_syntax_cb_at_rule_t * +lxb_css_blank_at_rule_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx, + void **out_rule) +{ + return &lxb_css_blank_at_rule; +} + +static bool +lxb_css_blank_at_rule_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +static lxb_status_t +lxb_css_blank_at_rule_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + return LXB_STATUS_OK; +} + +static const lxb_css_syntax_cb_block_t * +lxb_css_blank_at_rule_block_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + return &lxb_css_blank_block; +} + +static bool +lxb_css_blank_at_rule_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +static lxb_status_t +lxb_css_blank_at_rule_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + return LXB_STATUS_OK; +} + +static const lxb_css_syntax_cb_qualified_rule_t * +lxb_css_blank_qualified_rule_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + return &lxb_css_blank_qualified_rule; +} + +static bool +lxb_css_blank_qualified_rule_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +static lxb_status_t +lxb_css_blank_qualified_rule_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + return LXB_STATUS_OK; +} + +static const lxb_css_syntax_cb_block_t * +lxb_css_blank_qualified_rule_block_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + return &lxb_css_blank_block; +} + +static bool +lxb_css_blank_qualified_rule_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +static lxb_status_t +lxb_css_blank_qualified_rule_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + return LXB_STATUS_OK; +} + +static bool +lxb_css_blank_block_next(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_parser_success(parser); +} + +static lxb_status_t +lxb_css_blank_block_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + return LXB_STATUS_OK; +} + +static const lxb_css_syntax_cb_declarations_t * +lxb_css_blank_declarations_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + return &lxb_css_blank_declaration; +} + +static lxb_css_parser_state_f +lxb_css_blank_declaration_name(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + return lxb_css_blank_declaration_value; +} + +static bool +lxb_css_blank_declaration_value(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +static lxb_status_t +lxb_css_blank_declaration_end(lxb_css_parser_t *parser, + void *declarations, void *ctx, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_declaration_offset_t *offset, + bool important, bool failed) +{ + return LXB_STATUS_OK; +} + +static lxb_status_t +lxb_css_blank_declarations_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + return LXB_STATUS_OK; +} + +static bool +lxb_css_blank_declarations_bad(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/blank.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/blank.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/blank.h 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/blank.h 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2026 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#ifndef LXB_CSS_BLANK_H +#define LXB_CSS_BLANK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lexbor/css/base.h" +#include "lexbor/css/syntax/syntax.h" + + +LXB_API const lxb_css_syntax_cb_list_rules_t * +lxb_css_blank_cb_list_rules(void); + +LXB_API const lxb_css_syntax_cb_at_rule_t * +lxb_css_blank_cb_at_rule(void); + +LXB_API const lxb_css_syntax_cb_qualified_rule_t * +lxb_css_blank_cb_qualified_rule(void); + +LXB_API const lxb_css_syntax_cb_block_t * +lxb_css_blank_cb_block(void); + +LXB_API const lxb_css_syntax_cb_declarations_t * +lxb_css_blank_cb_declarations(void); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LXB_CSS_BLANK_H */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/css.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/css.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/css.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/css.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 Alexander Borisov + * Copyright (C) 2021-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -155,15 +155,12 @@ lxb_status_t lxb_css_make_data(lxb_css_parser_t *parser, lexbor_str_t *str, - uintptr_t begin, uintptr_t end) + size_t begin, size_t end) { - size_t length, offlen, len; - const lxb_char_t *pos; - const lexbor_str_t *tmp; + size_t length; + const lxb_char_t *p; - tmp = &parser->str; - - offlen = begin - parser->offset; + p = parser->tkz->in_begin; length = end - begin; if (str->data == NULL) { @@ -173,31 +170,9 @@ } } - if (tmp->length > offlen) { - len = tmp->length - offlen; - - if (len >= length) { - memcpy(str->data + str->length, tmp->data + offlen, length); - goto done; - } - else { - memcpy(str->data + str->length, tmp->data + offlen, len); - } - - str->length += len; - - pos = parser->pos; - length -= len; - } - else { - pos = parser->pos + (offlen - tmp->length); - } - - memcpy(str->data + str->length, pos, length); - -done: + memcpy(str->data, p + begin, length); - str->length += length; + str->length = length; str->data[str->length] = '\0'; return LXB_STATUS_OK; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/css.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/css.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/css.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/css.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2022 Alexander Borisov + * Copyright (C) 2020-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -35,7 +35,7 @@ LXB_API lxb_status_t lxb_css_make_data(lxb_css_parser_t *parser, lexbor_str_t *str, - uintptr_t begin, uintptr_t end); + size_t begin, size_t end); LXB_API lxb_char_t * lxb_css_serialize_char_handler(const void *style, lxb_css_style_serialize_f cb, diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/declaration.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/declaration.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/declaration.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/declaration.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2022-2026 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/css/declaration.h" + + +lxb_css_rule_declaration_t * +lxb_css_declaration_create(lxb_css_parser_t *parser, + const lxb_char_t *name, size_t length, + const lxb_css_entry_data_t **out_entry) +{ + void *prop; + const lxb_css_entry_data_t *entry; + lxb_css_property__custom_t *custom; + lxb_css_rule_declaration_t *declar; + + declar = lxb_css_rule_declaration_create(parser->memory); + if (declar == NULL) { + return NULL; + } + + entry = lxb_css_property_by_name(name, length); + if (entry == NULL) { + entry = lxb_css_property_by_id(LXB_CSS_PROPERTY__CUSTOM); + + prop = entry->create(parser->memory); + if (prop == NULL) { + goto failed; + } + + custom = prop; + + (void) lexbor_str_init(&custom->name, parser->memory->mraw, length); + if (custom->name.data == NULL) { + goto failed; + } + + memcpy(custom->name.data, name, length); + + custom->name.length = length; + custom->name.data[custom->name.length] = 0x00; + } + else { + prop = entry->create(parser->memory); + if (prop == NULL) { + goto failed; + } + } + + declar->type = entry->unique; + declar->u.user = prop; + + if (out_entry != NULL) { + *out_entry = entry; + } + + return declar; + +failed: + + if (prop != NULL) { + (void) entry->destroy(parser->memory, prop, true); + } + + if (declar != NULL) { + (void) lxb_css_rule_declaration_destroy(declar, true); + } + + if (out_entry != NULL) { + *out_entry = NULL; + } + + return NULL; +} + +lxb_css_rule_declaration_list_t * +lxb_css_declaration_list_parse(lxb_css_parser_t *parser, + const lxb_char_t *data, size_t length) +{ + return lxb_css_syntax_parse_declarations(parser, + lxb_css_state_cb_declarations(), + data, length); +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/declaration.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/declaration.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/declaration.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/declaration.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 Alexander Borisov + * Copyright (C) 2022-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -15,19 +15,14 @@ #include "lexbor/core/mraw.h" -LXB_API lxb_status_t -lxb_css_declaration_list_prepare(lxb_css_parser_t *parser, - lxb_css_memory_t *mem); +LXB_API lxb_css_rule_declaration_t * +lxb_css_declaration_create(lxb_css_parser_t *parser, + const lxb_char_t *name, size_t length, + const lxb_css_entry_data_t **out_entry); -LXB_API lxb_css_rule_declaration_list_t * -lxb_css_declaration_list_process(lxb_css_parser_t *parser, - const lxb_char_t *data, size_t length); - -LXB_API void -lxb_css_declaration_list_finish(lxb_css_parser_t *parser); LXB_API lxb_css_rule_declaration_list_t * -lxb_css_declaration_list_parse(lxb_css_parser_t *parser, lxb_css_memory_t *mem, +lxb_css_declaration_list_parse(lxb_css_parser_t *parser, const lxb_char_t *data, size_t length); diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/log.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/log.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/log.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/log.c 2026-05-05 16:34:12.000000000 +0000 @@ -152,7 +152,7 @@ return NULL; } - msg = lxb_css_log_push(log, LXB_CSS_LOG_SYNTAX_ERROR, psize); + msg = lxb_css_log_push(log, type, psize); if (msg == NULL) { return NULL; } diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/parser.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/parser.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/parser.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/parser.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 Alexander Borisov + * Copyright (C) 2021-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -73,7 +73,6 @@ parser->rules->context = NULL; /* Temp */ - parser->pos = NULL; parser->str.length = 0; parser->str_size = 4096; @@ -93,13 +92,35 @@ parser->types_pos = NULL; parser->types_end = NULL; parser->stage = LXB_CSS_PARSER_CLEAN; - parser->receive_endings = false; parser->status = LXB_STATUS_OK; parser->fake_null = false; + parser->token_end.type = LXB_CSS_SYNTAX_TOKEN__END; return LXB_STATUS_OK; } +lxb_status_t +lxb_css_parser_selectors_init(lxb_css_parser_t *parser) +{ + lxb_status_t status; + + parser->selectors = lxb_css_selectors_create(); + status = lxb_css_selectors_init(parser->selectors); + if (status != LXB_STATUS_OK) { + parser->selectors = lxb_css_selectors_destroy(parser->selectors, true); + } + + return status; +} + +void +lxb_css_parser_selectors_destroy(lxb_css_parser_t *parser) +{ + if (parser->selectors != NULL) { + parser->selectors = lxb_css_selectors_destroy(parser->selectors, true); + } +} + void lxb_css_parser_clean(lxb_css_parser_t *parser) { @@ -111,7 +132,6 @@ parser->types_pos = parser->types_begin; parser->stage = LXB_CSS_PARSER_CLEAN; parser->status = LXB_STATUS_OK; - parser->pos = NULL; parser->str.length = 0; parser->fake_null = false; } @@ -331,6 +351,14 @@ return LXB_STATUS_ERROR_UNEXPECTED_DATA; } +void * +lxb_css_parser_memory_fail_null(lxb_css_parser_t *parser) +{ + parser->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; + parser->loop = false; + return NULL; +} + bool lxb_css_parser_memory_fail(lxb_css_parser_t *parser) { @@ -347,3 +375,189 @@ return LXB_STATUS_ERROR_MEMORY_ALLOCATION; } + +/* + * No-inline functions for ABI. + */ +lxb_status_t +lxb_css_parser_status_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_status(parser); +} + +lxb_css_memory_t * +lxb_css_parser_memory_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_memory(parser); +} + +void +lxb_css_parser_memory_set_noi(lxb_css_parser_t *parser, lxb_css_memory_t *memory) +{ + lxb_css_parser_memory_set(parser, memory); +} + +lxb_css_selectors_t * +lxb_css_parser_selectors_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_selectors(parser); +} + +void +lxb_css_parser_selectors_set_noi(lxb_css_parser_t *parser, + lxb_css_selectors_t *selectors) +{ + lxb_css_parser_selectors_set(parser, selectors); +} + +bool +lxb_css_parser_is_running_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_is_running(parser); +} + +bool +lxb_css_parser_status_is_unexpected_data_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_status_is_unexpected_data(parser); +} + +void +lxb_css_parser_failed_set_noi(lxb_css_parser_t *parser, bool is) +{ + lxb_css_parser_failed_set(parser, is); +} + +void +lxb_css_parser_failed_set_by_id_noi(lxb_css_parser_t *parser, int idx, bool is) +{ + lxb_css_parser_failed_set_by_id(parser, idx, is); +} + +bool +lxb_css_parser_is_failed_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_is_failed(parser); +} + +void +lxb_css_parser_set_ok_noi(lxb_css_parser_t *parser) +{ + lxb_css_parser_set_ok(parser); +} + +const lxb_char_t * +lxb_css_parser_buffer_noi(lxb_css_parser_t *parser, size_t *length) +{ + return lxb_css_parser_buffer(parser, length); +} + +void +lxb_css_parser_buffer_set_noi(lxb_css_parser_t *parser, + const lxb_char_t *data, size_t length) +{ + lxb_css_parser_buffer_set(parser, data, length); +} + +lxb_css_parser_state_f +lxb_css_parser_state_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_state(parser); +} + +void +lxb_css_parser_state_set_noi(lxb_css_parser_t *parser, lxb_css_parser_state_f state) +{ + lxb_css_parser_state_set(parser, state); +} + +lxb_css_syntax_rule_t * +lxb_css_parser_current_rule_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_current_rule(parser); +} + +size_t +lxb_css_parser_rule_deep_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_rule_deep(parser); +} + +lxb_css_parser_state_t * +lxb_css_parser_states_pop_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_states_pop(parser); +} + +lxb_css_parser_state_t * +lxb_css_parser_states_to_root_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_states_to_root(parser); +} + +bool +lxb_css_parser_states_set_back_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_states_set_back(parser); +} + +void +lxb_css_parser_states_clean_noi(lxb_css_parser_t *parser) +{ + lxb_css_parser_states_clean(parser); +} + +lxb_css_parser_state_t * +lxb_css_parser_states_current_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_states_current(parser); +} + +void +lxb_css_parser_states_set_noi(lxb_css_parser_state_t *states, + lxb_css_parser_state_f state, void *context) +{ + lxb_css_parser_states_set(states, state, context); +} + +void +lxb_css_parser_states_up_noi(lxb_css_parser_t *parser) +{ + lxb_css_parser_states_up(parser); +} + +void +lxb_css_parser_states_down_noi(lxb_css_parser_t *parser) +{ + lxb_css_parser_states_down(parser); +} + +lxb_css_log_t * +lxb_css_parser_log_noi(lxb_css_parser_t *parser) +{ + return lxb_css_parser_log(parser); +} + +const lxb_css_syntax_token_t * +lxb_css_parser_token_end_noi(lxb_css_parser_t *parser, size_t offset) +{ + return lxb_css_parser_token_end(parser, offset); +} + +void +lxb_css_parser_set_context_noi(lxb_css_parser_t *parser, void *ctx) +{ + lxb_css_parser_set_context(parser, ctx); +} + +void +lxb_css_syntax_set_return_noi(lxb_css_parser_t *parser, void *value) +{ + lxb_css_syntax_set_return(parser, value); +} + +void * +lxb_css_syntax_returned_noi(lxb_css_parser_t *parser) +{ + return lxb_css_syntax_returned(parser); +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/parser.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/parser.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/parser.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/parser.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,6 +1,5 @@ /* - - * Copyright (C) 2021-2022 Alexander Borisov + * Copyright (C) 2021-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -70,7 +69,6 @@ } \ while (false) - #define lxb_css_parser_token_status_wo_ws_m(parser, token) \ do { \ if ((token = lxb_css_syntax_parser_token(parser)) == NULL) { \ @@ -129,49 +127,44 @@ lxb_css_parser_stage_t; struct lxb_css_parser { - lxb_css_parser_state_f block; - void *context; - /* Modules */ - lxb_css_syntax_tokenizer_t *tkz; - lxb_css_selectors_t *selectors; - lxb_css_selectors_t *old_selectors; + lxb_css_syntax_tokenizer_t *tkz; + lxb_css_selectors_t *selectors; /* Memory for all structures. */ - lxb_css_memory_t *memory; - lxb_css_memory_t *old_memory; + lxb_css_memory_t *memory; /* Syntax parse rules. */ - lxb_css_syntax_rule_t *rules_begin; - lxb_css_syntax_rule_t *rules_end; - lxb_css_syntax_rule_t *rules; + lxb_css_syntax_rule_t *rules_begin; + lxb_css_syntax_rule_t *rules_end; + lxb_css_syntax_rule_t *rules; /* States */ - lxb_css_parser_state_t *states_begin; - lxb_css_parser_state_t *states_end; - lxb_css_parser_state_t *states; + lxb_css_parser_state_t *states_begin; + lxb_css_parser_state_t *states_end; + lxb_css_parser_state_t *states; /* Types */ - lxb_css_syntax_token_type_t *types_begin; - lxb_css_syntax_token_type_t *types_end; - lxb_css_syntax_token_type_t *types_pos; + lxb_css_syntax_token_type_t *types_begin; + lxb_css_syntax_token_type_t *types_end; + lxb_css_syntax_token_type_t *types_pos; - const lxb_char_t *pos; - uintptr_t offset; + lxb_css_syntax_token_t token_end; - lexbor_str_t str; - size_t str_size; + lexbor_str_t str; + size_t str_size; - lxb_css_log_t *log; + lxb_css_log_t *log; - lxb_css_parser_stage_t stage; + lxb_css_parser_stage_t stage; - bool loop; - bool fake_null; - bool my_tkz; - bool receive_endings; + lxb_css_syntax_declaration_offset_t offset; - lxb_status_t status; + bool loop; + bool fake_null; + bool my_tkz; + + lxb_status_t status; }; struct lxb_css_parser_state { @@ -185,47 +178,197 @@ }; +/* + * Create a new CSS parser object. + * + * @return lxb_css_parser_t* if successful, otherwise NULL. + */ LXB_API lxb_css_parser_t * lxb_css_parser_create(void); +/* + * Initialize the CSS parser with a tokenizer. + * + * @param[in] parser Required. The CSS parser object. + * If NULL, the function returns + * LXB_STATUS_ERROR_OBJECT_IS_NULL. + * @param[in] tkz Optional. The tokenizer object. + * If NULL, a new tokenizer will be created and used. + * (In that case the parser manages the tokenizer lifetime.) + * + * @return LXB_STATUS_OK if successful, otherwise an error status value. + */ LXB_API lxb_status_t lxb_css_parser_init(lxb_css_parser_t *parser, lxb_css_syntax_tokenizer_t *tkz); +/* + * Initialize the Selectors module in the parser. + * + * Note: + * Be sure to destroy the Selectors object you created yourself using + * the lxb_css_parser_selectors_destroy() function. + * + * @param[in] parser Required. The CSS parser object. + * + * @return LXB_STATUS_OK if successful, otherwise an error status value. + */ +LXB_API lxb_status_t +lxb_css_parser_selectors_init(lxb_css_parser_t *parser); + +/* + * Destroy the selectors module in the parser. + * + * @param[in] parser Required. The CSS parser object. + */ +LXB_API void +lxb_css_parser_selectors_destroy(lxb_css_parser_t *parser); + +/* + * Clean the parser object. + * + * This resets internal parser state, but keeps allocated memory so the parser + * can be reused. + * + * @param[in] parser Required. The CSS parser object. + */ LXB_API void lxb_css_parser_clean(lxb_css_parser_t *parser); +/* + * Erase the parser object. + * + * This resets internal parser state and releases internal allocations owned by + * the parser so it can be re-initialized. + * + * @param[in] parser Required. The CSS parser object. + */ LXB_API void lxb_css_parser_erase(lxb_css_parser_t *parser); +/* + * Destroy the parser object. + * + * @param[in] parser Optional. The CSS parser object. + * If NULL, the function returns NULL. + * @param[in] self_destroy Optional flag. + * If true, also frees the parser object itself. + * If false, only inner resources are freed and the + * parser object remains valid. + * + * @return parser if self_destroy is false, otherwise NULL. + */ LXB_API lxb_css_parser_t * lxb_css_parser_destroy(lxb_css_parser_t *parser, bool self_destroy); -LXB_API lxb_css_parser_state_t * -lxb_css_parser_states_push(lxb_css_parser_t *parser, - lxb_css_parser_state_f state, - void *context, bool stop); - -LXB_API lxb_css_parser_state_t * -lxb_css_parser_states_next(lxb_css_parser_t *parser, - lxb_css_parser_state_f next, - lxb_css_parser_state_f back, void *ctx, bool root); - -LXB_API lxb_status_t -lxb_css_parser_types_push(lxb_css_parser_t *parser, - lxb_css_syntax_token_type_t type); - +/* + * Stop the parser main loop. + * + * This is a helper for state callbacks that want to immediately stop parsing + * without marking the current rule as failed. + * + * @param[in] parser Required. The CSS parser object. + * + * @return true (convenience return value, useful for state callbacks). + */ LXB_API bool lxb_css_parser_stop(lxb_css_parser_t *parser); +/* + * Fail the parser with a status and stop the main loop. + * + * This is used for hard errors (OOM, overflow, etc.). It sets parser->status + * and stops the parser loop. + * + * @param[in] parser Required. The CSS parser object. + * @param[in] status Required. Status code describing the failure. + * + * @return true (convenience return value, useful for state callbacks). + */ LXB_API bool lxb_css_parser_fail(lxb_css_parser_t *parser, lxb_status_t status); +/* + * Mark the current token as unexpected. + * + * This is a specialized helper for the common "unexpected data" parse error. + * It sets parser->status to LXB_STATUS_ERROR_UNEXPECTED_DATA and marks the + * current rule as failed. + * + * @param[in] parser Required. The CSS parser object. + * + * @return true (convenience return value, useful for state callbacks). + */ LXB_API bool lxb_css_parser_unexpected(lxb_css_parser_t *parser); +/* + * Mark parsing of the current grammar/rule as successful. + * + * Why this function exists: + * - Most callbacks in the CSS parser work as a state machine: each callback + * receives the current token and returns bool to decide what to do next. + * - "Success" is not just a bool. The parser must switch to a special + * lxb_css_state_success state to properly handle trailing whitespace and + * the end-of-input token. + * - If you don't consume all tokens up to LXB_CSS_SYNTAX_TOKEN__END in the + * current rule and call this function, the parser will switch to "failed" + * mode. This is the same as calling the lxb_css_parser_failed() function. + * The exception is the LXB_CSS_SYNTAX_TOKEN_WHITESPACE token. If you are + * sure that only this token remains, the parser will simply exclude it. + * + * What it does: + * - Sets the current rule state to lxb_css_state_success. + * - Does not stop the parser loop by itself. + * + * Typical usage: + * - In css/property/state.c, after you have parsed and consumed the last token + * of a property value, you do: + * return lxb_css_parser_success(parser); + * - That transfers control to lxb_css_state_success, which consumes any + * whitespace and completes on LXB_CSS_SYNTAX_TOKEN__END. + * + * @param[in] parser Required. The CSS parser object. + * + * @return true (convenience return value, useful for state callbacks). + */ LXB_API bool lxb_css_parser_success(lxb_css_parser_t *parser); +/* + * Mark parsing of the current grammar/rule as failed. + * + * Why this function exists: + * - In the state machine, failure is also not "just return false". The parser + * needs to switch to a rule-specific recovery state so it can safely skip + * input until it is allowed to stop (usually until end-of-input or a known + * synchronisation point). + * + * What it does: + * - Sets the current rule state to the rule-specific "failed" handler + * (rule->cbx.cb->failed). + * - Sets rule->failed = true. + * - Does not directly change parser->status. Use lxb_css_parser_fail() or + * lxb_css_parser_unexpected() when you need a concrete status code. + * + * Typical usage: + * - In css/property/state.c, if a token doesn't match the expected grammar, + * you do: + * return lxb_css_parser_failed(parser); + * - That switches the parser into the failed handler. For properties this lets + * the parser consume/skip tokens until it reaches LXB_CSS_SYNTAX_TOKEN__END. + * (See lxb_css_state_failed(): it consumes tokens until end, then calls + * lxb_css_parser_success() to finish.) + * + * Important! + * The user sets the callback to "failed" and must decide what to do in this + * situation. If the user does not consume all tokens before + * LXB_CSS_SYNTAX_TOKEN__END, there will be an infinite loop. + * + * @param[in] parser Required. The CSS parser object. + * + * @return true (convenience return value, useful for state callbacks). + */ + LXB_API bool lxb_css_parser_failed(lxb_css_parser_t *parser); @@ -240,13 +383,65 @@ lxb_css_parser_unexpected_data_status(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token); +LXB_API void * +lxb_css_parser_memory_fail_null(lxb_css_parser_t *parser); + LXB_API bool lxb_css_parser_memory_fail(lxb_css_parser_t *parser); -lxb_status_t +LXB_API lxb_status_t lxb_css_parser_memory_fail_status(lxb_css_parser_t *parser); /* + * Push a new state to the parser. + * + * @param[in] parser Required. The CSS parser object. + * @param[in] state Required. State callback to execute. + * @param[in] context Optional user pointer associated with this state. + * Stored as-is; the parser doesn't own it. + * @param[in] stop If true, the pushed state is marked as a "stop point". + * This is used by the parser to stop/return control when + * this state is reached. + * + * @return lxb_css_parser_state_t* if successful, otherwise NULL. + */ +LXB_API lxb_css_parser_state_t * +lxb_css_parser_states_push(lxb_css_parser_t *parser, + lxb_css_parser_state_f state, + void *context, bool stop); + +/* + * Go to the next state in the parser. + * + * @param[in] parser Required. The CSS parser object. + * @param[in] next Required. Next state callback. + * @param[in] back Required. State callback to return to. + * @param[in] ctx Optional user pointer for the next state. + * Stored as-is; the parser doesn't own it. + * @param[in] root If true, marks this state as a "root" state. Root states + * are used by helper functions (e.g. to rewind to root). + * + * @return lxb_css_parser_state_t* if successful, otherwise NULL. + */ +LXB_API lxb_css_parser_state_t * +lxb_css_parser_states_next(lxb_css_parser_t *parser, + lxb_css_parser_state_f next, + lxb_css_parser_state_f back, void *ctx, bool root); + +/* + * Push a token type to the parser. + * + * @param[in] parser Required. The CSS parser object. + * @param[in] type Required. Token type to push. + * + * @return LXB_STATUS_OK if successful, otherwise an error status value. + */ +LXB_API lxb_status_t +lxb_css_parser_types_push(lxb_css_parser_t *parser, + lxb_css_syntax_token_type_t type); + + +/* * Inline functions */ lxb_inline lxb_status_t @@ -350,32 +545,6 @@ parser->rules->state = state; } -lxb_inline void -lxb_css_parser_state_block_set(lxb_css_parser_t *parser, - lxb_css_parser_state_f state) -{ - parser->block = state; -} - -lxb_inline void -lxb_css_parser_state_value_set(lxb_css_parser_t *parser, - lxb_css_parser_state_f state) -{ - lxb_css_parser_state_block_set(parser, state); -} - -lxb_inline void * -lxb_css_parser_context(lxb_css_parser_t *parser) -{ - return parser->context; -} - -lxb_inline void -lxb_css_parser_context_set(lxb_css_parser_t *parser, void *context) -{ - parser->context = context; -} - lxb_inline lxb_css_syntax_rule_t * lxb_css_parser_current_rule(lxb_css_parser_t *parser) { @@ -421,13 +590,6 @@ } lxb_inline void -lxb_css_parser_states_change_back(lxb_css_parser_t *parser, - lxb_css_parser_state_f state) -{ - parser->rules->state_back = state; -} - -lxb_inline void lxb_css_parser_states_clean(lxb_css_parser_t *parser) { parser->states = parser->states_begin; @@ -465,47 +627,127 @@ return parser->log; } -lxb_inline void -lxb_css_parser_offset_set(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token) +lxb_inline const lxb_css_syntax_token_t * +lxb_css_parser_token_end(lxb_css_parser_t *parser, size_t offset) { - if (parser->pos == NULL) { - if (token == NULL) { - parser->pos = parser->tkz->in_begin; - parser->offset = 0; - } - else { - parser->pos = lxb_css_syntax_token_base(token)->begin - + lxb_css_syntax_token_base(token)->length; - parser->offset = token->offset + lxb_css_syntax_token_base(token)->length; - } - } + parser->token_end.offset = offset; + return &parser->token_end; } -lxb_inline const lxb_css_syntax_list_rules_offset_t * -lxb_css_parser_list_rules_offset(lxb_css_parser_t *parser) +lxb_inline void +lxb_css_parser_set_context(lxb_css_parser_t *parser, void *ctx) { - return &parser->rules->u.list_rules; + parser->rules->context = ctx; } -lxb_inline const lxb_css_syntax_at_rule_offset_t * -lxb_css_parser_at_rule_offset(lxb_css_parser_t *parser) +lxb_inline void +lxb_css_syntax_set_return(lxb_css_parser_t *parser, void *value) { - return &parser->rules->u.at_rule; + parser->rules[-1].returned = value; } -lxb_inline const lxb_css_syntax_qualified_offset_t * -lxb_css_parser_qualified_rule_offset(lxb_css_parser_t *parser) +lxb_inline void * +lxb_css_syntax_returned(lxb_css_parser_t *parser) { - return &parser->rules->u.qualified; + return parser->rules->returned; } -lxb_inline const lxb_css_syntax_declarations_offset_t * -lxb_css_parser_declarations_offset(lxb_css_parser_t *parser) -{ - return &parser->rules->u.declarations; -} +/* + * No-inline functions for ABI. + */ +LXB_API lxb_status_t +lxb_css_parser_status_noi(lxb_css_parser_t *parser); + +LXB_API lxb_css_memory_t * +lxb_css_parser_memory_noi(lxb_css_parser_t *parser); + +LXB_API void +lxb_css_parser_memory_set_noi(lxb_css_parser_t *parser, lxb_css_memory_t *memory); + +LXB_API lxb_css_selectors_t * +lxb_css_parser_selectors_noi(lxb_css_parser_t *parser); + +LXB_API void +lxb_css_parser_selectors_set_noi(lxb_css_parser_t *parser, + lxb_css_selectors_t *selectors); + +LXB_API bool +lxb_css_parser_is_running_noi(lxb_css_parser_t *parser); + +LXB_API bool +lxb_css_parser_status_is_unexpected_data_noi(lxb_css_parser_t *parser); + +LXB_API void +lxb_css_parser_failed_set_noi(lxb_css_parser_t *parser, bool is); + +LXB_API void +lxb_css_parser_failed_set_by_id_noi(lxb_css_parser_t *parser, int idx, bool is); + +LXB_API bool +lxb_css_parser_is_failed_noi(lxb_css_parser_t *parser); + +LXB_API void +lxb_css_parser_set_ok_noi(lxb_css_parser_t *parser); + +LXB_API const lxb_char_t * +lxb_css_parser_buffer_noi(lxb_css_parser_t *parser, size_t *length); + +LXB_API void +lxb_css_parser_buffer_set_noi(lxb_css_parser_t *parser, + const lxb_char_t *data, size_t length); + +LXB_API lxb_css_parser_state_f +lxb_css_parser_state_noi(lxb_css_parser_t *parser); + +LXB_API void +lxb_css_parser_state_set_noi(lxb_css_parser_t *parser, + lxb_css_parser_state_f state); + +LXB_API lxb_css_syntax_rule_t * +lxb_css_parser_current_rule_noi(lxb_css_parser_t *parser); + +LXB_API size_t +lxb_css_parser_rule_deep_noi(lxb_css_parser_t *parser); + +LXB_API lxb_css_parser_state_t * +lxb_css_parser_states_pop_noi(lxb_css_parser_t *parser); + +LXB_API lxb_css_parser_state_t * +lxb_css_parser_states_to_root_noi(lxb_css_parser_t *parser); + +LXB_API bool +lxb_css_parser_states_set_back_noi(lxb_css_parser_t *parser); + +LXB_API void +lxb_css_parser_states_clean_noi(lxb_css_parser_t *parser); + +LXB_API lxb_css_parser_state_t * +lxb_css_parser_states_current_noi(lxb_css_parser_t *parser); + +LXB_API void +lxb_css_parser_states_set_noi(lxb_css_parser_state_t *states, + lxb_css_parser_state_f state, void *context); + +LXB_API void +lxb_css_parser_states_up_noi(lxb_css_parser_t *parser); + +LXB_API void +lxb_css_parser_states_down_noi(lxb_css_parser_t *parser); + +LXB_API lxb_css_log_t * +lxb_css_parser_log_noi(lxb_css_parser_t *parser); + +LXB_API const lxb_css_syntax_token_t * +lxb_css_parser_token_end_noi(lxb_css_parser_t *parser, size_t offset); + +LXB_API void +lxb_css_parser_set_context_noi(lxb_css_parser_t *parser, void *ctx); + +LXB_API void +lxb_css_syntax_set_return_noi(lxb_css_parser_t *parser, void *value); +LXB_API void * +lxb_css_syntax_returned_noi(lxb_css_parser_t *parser); #ifdef __cplusplus } /* extern "C" */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/property/const.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/property/const.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/property/const.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/property/const.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Alexander Borisov + * Copyright (C) 2026 Alexander Borisov * * Author: Alexander Borisov */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/property/res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/property/res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/property/res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/property/res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Alexander Borisov + * Copyright (C) 2026 Alexander Borisov * * Author: Alexander Borisov */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/property/state.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/property/state.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/property/state.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/property/state.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,5343 @@ +/* + * Copyright (C) 2021-2026 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/css/property.h" +#include "lexbor/css/parser.h" +#include "lexbor/css/rule.h" +#include "lexbor/css/value.h" +#include "lexbor/css/unit.h" +#include "lexbor/css/property/state.h" +#include "lexbor/css/property/res.h" + + +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256]; + LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256]; +#endif + +#include "lexbor/core/conv.h" + + +#define lxb_css_property_state_check_token(parser, token) \ + if ((token) == NULL) { \ + return lxb_css_parser_memory_fail(parser); \ + } + +#define lxb_css_property_state_get_type(parser, token, type) \ + do { \ + lxb_css_syntax_parser_consume(parser); \ + \ + token = lxb_css_syntax_parser_token_wo_ws(parser); \ + lxb_css_property_state_check_token(parser, token); \ + \ + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { \ + return lxb_css_parser_success(parser); \ + } \ + \ + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, \ + lxb_css_syntax_token_ident(token)->length); \ + } \ + while (false) + +#define LXB_CSS_PROPERTY_STATE_HEX_MASK(n) \ + ((((uint32_t) 1 << (32 - (n))) - 1) << (n)) + + +static bool +lxb_css_property_state_color_rgba_old(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_color_t *color); +static bool +lxb_css_property_state_color_hsla_old(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_color_hsla_t *hsl); + +static bool +lxb_css_property_state_length(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_length_t *length) +{ + const lxb_css_data_t *unit; + + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN_DIMENSION: + unit = lxb_css_unit_absolute_relative_by_name(lxb_css_syntax_token_dimension(token)->str.data, + lxb_css_syntax_token_dimension(token)->str.length); + if (unit == NULL) { + return false; + } + + length->num = lxb_css_syntax_token_dimension(token)->num.num; + length->is_float = lxb_css_syntax_token_dimension(token)->num.is_float; + length->unit = (lxb_css_unit_t) unit->unique; + break; + + case LXB_CSS_SYNTAX_TOKEN_NUMBER: + if (lxb_css_syntax_token_number(token)->num != 0) { + return false; + } + + length->num = lxb_css_syntax_token_number(token)->num; + length->is_float = lxb_css_syntax_token_number(token)->is_float; + length->unit = LXB_CSS_UNIT__UNDEF; + break; + + default: + return false; + } + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_length_percentage(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_length_percentage_t *lp) +{ + const lxb_css_data_t *unit; + + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN_DIMENSION: + unit = lxb_css_unit_absolute_relative_by_name(lxb_css_syntax_token_dimension(token)->str.data, + lxb_css_syntax_token_dimension(token)->str.length); + if (unit == NULL) { + return false; + } + + lp->type = LXB_CSS_VALUE__LENGTH; + lp->u.length.num = lxb_css_syntax_token_dimension(token)->num.num; + lp->u.length.is_float = lxb_css_syntax_token_dimension(token)->num.is_float; + lp->u.length.unit = (lxb_css_unit_t) unit->unique; + break; + + case LXB_CSS_SYNTAX_TOKEN_NUMBER: + if (lxb_css_syntax_token_number(token)->num != 0) { + return false; + } + + lp->type = LXB_CSS_VALUE__NUMBER; + lp->u.length.num = lxb_css_syntax_token_number(token)->num; + lp->u.length.is_float = lxb_css_syntax_token_number(token)->is_float; + lp->u.length.unit = LXB_CSS_UNIT__UNDEF; + break; + + case LXB_CSS_SYNTAX_TOKEN_PERCENTAGE: + lp->type = LXB_CSS_VALUE__PERCENTAGE; + lp->u.percentage.num = lxb_css_syntax_token_percentage(token)->num; + lp->u.percentage.is_float = lxb_css_syntax_token_percentage(token)->is_float; + break; + + default: + return false; + } + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_number_length_percentage(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_number_length_percentage_t *nlp) +{ + const lxb_css_data_t *unit; + + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN_DIMENSION: + unit = lxb_css_unit_absolute_relative_by_name(lxb_css_syntax_token_dimension(token)->str.data, + lxb_css_syntax_token_dimension(token)->str.length); + if (unit == NULL) { + return false; + } + + nlp->type = LXB_CSS_VALUE__LENGTH; + nlp->u.length.num = lxb_css_syntax_token_dimension(token)->num.num; + nlp->u.length.is_float = lxb_css_syntax_token_dimension(token)->num.is_float; + nlp->u.length.unit = (lxb_css_unit_t) unit->unique; + break; + + case LXB_CSS_SYNTAX_TOKEN_NUMBER: + nlp->type = LXB_CSS_VALUE__NUMBER; + nlp->u.number.num = lxb_css_syntax_token_number(token)->num; + nlp->u.number.is_float = lxb_css_syntax_token_number(token)->is_float; + break; + + case LXB_CSS_SYNTAX_TOKEN_PERCENTAGE: + nlp->type = LXB_CSS_VALUE__PERCENTAGE; + nlp->u.percentage.num = lxb_css_syntax_token_percentage(token)->num; + nlp->u.percentage.is_float = lxb_css_syntax_token_percentage(token)->is_float; + break; + + default: + return false; + } + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_number_length(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_number_length_t *nl) +{ + const lxb_css_data_t *unit; + + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN_DIMENSION: + unit = lxb_css_unit_absolute_relative_by_name(lxb_css_syntax_token_dimension(token)->str.data, + lxb_css_syntax_token_dimension(token)->str.length); + if (unit == NULL) { + return false; + } + + nl->type = LXB_CSS_VALUE__LENGTH; + nl->u.length.num = lxb_css_syntax_token_dimension(token)->num.num; + nl->u.length.is_float = lxb_css_syntax_token_dimension(token)->num.is_float; + nl->u.length.unit = (lxb_css_unit_t) unit->unique; + break; + + case LXB_CSS_SYNTAX_TOKEN_NUMBER: + nl->type = LXB_CSS_VALUE__NUMBER; + nl->u.number.num = lxb_css_syntax_token_number(token)->num; + nl->u.number.is_float = lxb_css_syntax_token_number(token)->is_float; + break; + + default: + return false; + } + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_number(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_number_t *number) +{ + if (token->type != LXB_CSS_SYNTAX_TOKEN_NUMBER) { + return false; + } + + number->num = lxb_css_syntax_token_number(token)->num; + number->is_float = lxb_css_syntax_token_number(token)->is_float; + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_integer(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_integer_t *intg) +{ + long ln; + double num; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_NUMBER) { + return false; + } + + num = lxb_css_syntax_token_number(token)->num; + ln = lexbor_conv_double_to_long(num); + + num = num - (double) ln; + + if (num < 0.0 || num > 0.0) { + return false; + } + + intg->num = ln; + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_percentage(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_percentage_t *perc) +{ + if (token->type != LXB_CSS_SYNTAX_TOKEN_PERCENTAGE) { + return false; + } + + perc->num = lxb_css_syntax_token_percentage(token)->num; + perc->is_float = lxb_css_syntax_token_percentage(token)->is_float; + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_number_percentage_none(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_number_percentage_t *np) +{ + double num; + lxb_css_value_type_t type; + + if (token->type == LXB_CSS_SYNTAX_TOKEN_NUMBER) { + np->type = LXB_CSS_VALUE__NUMBER; + } + else if (token->type == LXB_CSS_SYNTAX_TOKEN_PERCENTAGE) { + np->type = LXB_CSS_VALUE__PERCENTAGE; + } + else if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) { + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + if (type != LXB_CSS_VALUE_NONE) { + return false; + } + + np->type = LXB_CSS_VALUE_NONE; + + lxb_css_syntax_parser_consume(parser); + + return true; + } + else { + return false; + } + + num = lxb_css_syntax_token_number(token)->num; + + np->u.number.num = num; + np->u.number.is_float = lxb_css_syntax_token_number(token)->is_float; + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_percentage_none(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_percentage_type_t *np) +{ + double num; + lxb_css_value_type_t type; + + if (token->type == LXB_CSS_SYNTAX_TOKEN_PERCENTAGE) { + np->type = LXB_CSS_VALUE__PERCENTAGE; + } + else if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) { + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + if (type != LXB_CSS_VALUE_NONE) { + return false; + } + + np->type = LXB_CSS_VALUE_NONE; + + lxb_css_syntax_parser_consume(parser); + + return true; + } + else { + return false; + } + + num = lxb_css_syntax_token_number(token)->num; + + np->percentage.num = num; + np->percentage.is_float = lxb_css_syntax_token_number(token)->is_float; + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_number_percentage(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_number_percentage_t *np) +{ + double num; + + if (token->type == LXB_CSS_SYNTAX_TOKEN_NUMBER) { + np->type = LXB_CSS_VALUE__NUMBER; + } + else if (token->type == LXB_CSS_SYNTAX_TOKEN_PERCENTAGE) { + np->type = LXB_CSS_VALUE__PERCENTAGE; + } + else { + return false; + } + + num = lxb_css_syntax_token_number(token)->num; + + np->u.number.num = num; + np->u.number.is_float = lxb_css_syntax_token_number(token)->is_float; + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_angle(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_angle_t *angle) +{ + const lxb_css_data_t *unit; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_DIMENSION) { + return false; + } + + unit = lxb_css_unit_angle_by_name(lxb_css_syntax_token_dimension(token)->str.data, + lxb_css_syntax_token_dimension(token)->str.length); + if (unit == NULL) { + return false; + } + + angle->num = lxb_css_syntax_token_dimension(token)->num.num; + angle->is_float = lxb_css_syntax_token_dimension(token)->num.is_float; + angle->unit = (lxb_css_unit_angle_t) unit->unique; + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +bool +lxb_css_property_state_width_handler(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_property_width_t *width) +{ + lxb_css_value_type_t type; + + if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) { + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_VALUE_AUTO: + case LXB_CSS_VALUE_MIN_CONTENT: + case LXB_CSS_VALUE_MAX_CONTENT: + width->type = type; + break; + + default: + return false; + } + + lxb_css_syntax_parser_consume(parser); + + return true; + } + + return lxb_css_property_state_length_percentage(parser, token, + (lxb_css_value_length_percentage_t *)width); +} + +static bool +lxb_css_property_state_hue(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_hue_t *hue) +{ + const lxb_css_data_t *unit; + + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN_DIMENSION: + unit = lxb_css_unit_angle_by_name(lxb_css_syntax_token_dimension(token)->str.data, + lxb_css_syntax_token_dimension(token)->str.length); + if (unit == NULL) { + return false; + } + + hue->type = LXB_CSS_VALUE__ANGLE; + hue->u.angle.num = lxb_css_syntax_token_dimension(token)->num.num; + hue->u.angle.is_float = lxb_css_syntax_token_dimension(token)->num.is_float; + hue->u.angle.unit = (lxb_css_unit_angle_t) unit->unique; + break; + + case LXB_CSS_SYNTAX_TOKEN_NUMBER: + hue->type = LXB_CSS_VALUE__NUMBER; + hue->u.number.num = lxb_css_syntax_token_number(token)->num; + hue->u.number.is_float = lxb_css_syntax_token_number(token)->is_float; + break; + + default: + return false; + } + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +lxb_inline bool +lxb_css_property_state_hue_none(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_hue_t *hue) +{ + lxb_css_value_type_t type; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_property_state_hue(parser, token, hue); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + if (type != LXB_CSS_VALUE_NONE) { + return false; + } + + hue->type = LXB_CSS_VALUE_NONE; + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_color_hex(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_color_t *color) +{ + size_t length; + uint32_t chex; + lxb_char_t ch; + const lxb_char_t *end, *p; + lxb_css_value_color_hex_rgba_t *rgba; + + length = token->types.hash.length; + + if (length > 8) { + return false; + } + + p = token->types.hash.data; + end = p + length; + + chex = 0; + + while (p < end) { + ch = lexbor_str_res_map_lowercase[lexbor_str_res_map_hex[*p]]; + + if (ch == 0xff) { + return false; + } + + chex = chex << 4 | ch; + + p++; + } + + rgba = &color->u.hex.rgba; + + switch (length) { + case 3: + rgba->r = chex >> 8; + rgba->g = chex >> 4 & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(4); + rgba->b = chex & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(4); + rgba->a = 0xff; + + color->u.hex.type = LXB_CSS_PROPERTY_COLOR_HEX_TYPE_3; + break; + + case 4: + rgba->r = chex >> 12; + rgba->g = chex >> 8 & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(4); + rgba->b = chex >> 4 & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(4); + rgba->a = chex & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(4); + + color->u.hex.type = LXB_CSS_PROPERTY_COLOR_HEX_TYPE_4; + break; + + case 6: + rgba->r = chex >> 16; + rgba->g = chex >> 8 & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(8); + rgba->b = chex & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(8); + rgba->a = 0xff; + + color->u.hex.type = LXB_CSS_PROPERTY_COLOR_HEX_TYPE_6; + break; + + case 8: + rgba->r = chex >> 24; + rgba->g = chex >> 16 & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(8); + rgba->b = chex >> 8 & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(8); + rgba->a = chex & ~LXB_CSS_PROPERTY_STATE_HEX_MASK(8); + + color->u.hex.type = LXB_CSS_PROPERTY_COLOR_HEX_TYPE_8; + break; + + default: + return false; + } + + color->type = LXB_CSS_COLOR_HEX; + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_color_rgba(lxb_css_parser_t *parser, + lxb_css_value_color_t *color) +{ + bool res; + lxb_css_color_type_t type; + lxb_css_value_color_rgba_t *rgb; + const lxb_css_syntax_token_t *token; + + rgb = &color->u.rgb; + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_number_percentage_none(parser, token, &rgb->r); + if (res == false) { + return false; + } + + type = rgb->r.type; + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN_COMMA) { + /* Deprecated format. */ + + if (type == LXB_CSS_VALUE_NONE) { + return false; + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + rgb->old = true; + + return lxb_css_property_state_color_rgba_old(parser, token, color); + } + + res = lxb_css_property_state_number_percentage_none(parser, token, &rgb->g); + if (res == false) { + return false; + } + + if (type != rgb->g.type) { + if (type == LXB_CSS_VALUE_NONE) { + type = rgb->g.type; + } + else if (rgb->g.type != LXB_CSS_VALUE_NONE) { + return false; + } + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_number_percentage_none(parser, token, &rgb->b); + if (res == false) { + return false; + } + + if (type != rgb->b.type && type != LXB_CSS_VALUE_NONE + && rgb->b.type != LXB_CSS_VALUE_NONE) + { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN_DELIM) { + if (lxb_css_syntax_token_delim(token)->character != '/') { + return false; + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + } + else if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + lxb_css_syntax_parser_consume(parser); + return true; + } + else { + return false; + } + + res = lxb_css_property_state_number_percentage_none(parser, token, &rgb->a); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + return false; + } + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_color_rgba_old(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_color_t *color) +{ + bool res; + lxb_css_value_color_rgba_t *rgb; + + rgb = &color->u.rgb; + + res = lxb_css_property_state_number_percentage(parser, token, &rgb->g); + if (res == false) { + return false; + } + + if (rgb->r.type != rgb->g.type) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_COMMA) { + return false; + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_number_percentage(parser, token, &rgb->b); + if (res == false) { + return false; + } + + if (rgb->r.type != rgb->b.type) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + lxb_css_syntax_parser_consume(parser); + return true; + } + else if (token->type != LXB_CSS_SYNTAX_TOKEN_COMMA) { + return false; + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_number_percentage(parser, token, &rgb->a); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + return false; + } + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_color_hsla(lxb_css_parser_t *parser, + lxb_css_value_color_t *color) +{ + bool res; + lxb_css_value_color_hsla_t *hsl; + const lxb_css_syntax_token_t *token; + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + hsl = &color->u.hsl; + + res = lxb_css_property_state_hue_none(parser, token, &hsl->h); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN_COMMA) { + /* Deprecated format. */ + + if (hsl->h.type == LXB_CSS_VALUE_NONE) { + return false; + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + hsl->old = true; + + return lxb_css_property_state_color_hsla_old(parser, token, hsl); + } + + res = lxb_css_property_state_percentage_none(parser, token, &hsl->s); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_percentage_none(parser, token, &hsl->l); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN_DELIM) { + if (lxb_css_syntax_token_delim(token)->character != '/') { + return false; + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + } + else if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + lxb_css_syntax_parser_consume(parser); + return true; + } + + res = lxb_css_property_state_number_percentage_none(parser, token, &hsl->a); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + return false; + } + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_color_hsla_old(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_color_hsla_t *hsl) +{ + bool res; + + res = lxb_css_property_state_percentage(parser, token, &hsl->s.percentage); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_COMMA) { + return false; + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_percentage(parser, token, &hsl->l.percentage); + if (res == false) { + return false; + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + goto done; + } + else if (token->type != LXB_CSS_SYNTAX_TOKEN_COMMA) { + return false; + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_number_percentage(parser, token, &hsl->a); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + return false; + } + +done: + + lxb_css_syntax_parser_consume(parser); + + hsl->s.type = LXB_CSS_VALUE__PERCENTAGE; + hsl->l.type = LXB_CSS_VALUE__PERCENTAGE; + + return true; +} + +static bool +lxb_css_property_state_color_lab(lxb_css_parser_t *parser, + lxb_css_value_color_t *color) +{ + bool res; + lxb_css_value_color_lab_t *lab; + const lxb_css_syntax_token_t *token; + + lab = &color->u.lab; + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_number_percentage_none(parser, token, &lab->l); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_number_percentage_none(parser, token, &lab->a); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_number_percentage_none(parser, token, &lab->b); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN_DELIM) { + if (lxb_css_syntax_token_delim(token)->character != '/') { + return false; + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + } + else if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + lxb_css_syntax_parser_consume(parser); + return true; + } + else { + return false; + } + + res = lxb_css_property_state_number_percentage_none(parser, token, + &lab->alpha); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + return false; + } + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +static bool +lxb_css_property_state_color_lch(lxb_css_parser_t *parser, + lxb_css_value_color_t *color) +{ + bool res; + lxb_css_value_color_lch_t *lch; + const lxb_css_syntax_token_t *token; + + lch = &color->u.lch; + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_number_percentage_none(parser, token, &lch->l); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_number_percentage_none(parser, token, &lch->c); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_hue_none(parser, token, &lch->h); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN_DELIM) { + if (lxb_css_syntax_token_delim(token)->character != '/') { + return false; + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + } + else if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + lxb_css_syntax_parser_consume(parser); + return true; + } + else { + return false; + } + + res = lxb_css_property_state_number_percentage_none(parser, token, &lch->a); + if (res == false) { + return false; + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + return false; + } + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +/* + * Return: + * true and status always LXB_STATUS_OK — token consumed, ok. + * false and status != LXB_STATUS_OK — token consumed, not ok. + * false and status == LXB_STATUS_OK — token not consumed, not ok. + */ +static bool +lxb_css_property_state_color_handler(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_value_color_t *color, + lxb_status_t *status) +{ + bool res; + lxb_css_value_type_t type; + + *status = LXB_STATUS_OK; + + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN_HASH: + color->type = LXB_CSS_VALUE_HEX; + + return lxb_css_property_state_color_hex(parser, token, color); + + case LXB_CSS_SYNTAX_TOKEN_FUNCTION: + type = lxb_css_value_by_name(lxb_css_syntax_token_function(token)->data, + lxb_css_syntax_token_function(token)->length); + color->type = type; + + switch (type) { + /* */ + case LXB_CSS_VALUE_RGB: + case LXB_CSS_VALUE_RGBA: + res = lxb_css_property_state_color_rgba(parser, color); + break; + + case LXB_CSS_VALUE_HSL: + case LXB_CSS_VALUE_HSLA: + case LXB_CSS_VALUE_HWB: + res = lxb_css_property_state_color_hsla(parser, color); + break; + + case LXB_CSS_VALUE_LAB: + case LXB_CSS_VALUE_OKLAB: + res = lxb_css_property_state_color_lab(parser, color); + break; + + case LXB_CSS_VALUE_LCH: + case LXB_CSS_VALUE_OKLCH: + res = lxb_css_property_state_color_lch(parser, color); + break; + + case LXB_CSS_VALUE_COLOR: + default: + *status = LXB_STATUS_OK; + return false; + } + + if (!res) { + *status = LXB_STATUS_ERROR_UNEXPECTED_DATA; + } + + return res; + + case LXB_CSS_SYNTAX_TOKEN_IDENT: + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* */ + case LXB_CSS_VALUE_CURRENTCOLOR: + /* */ + case LXB_CSS_VALUE_CANVAS: + case LXB_CSS_VALUE_CANVASTEXT: + case LXB_CSS_VALUE_LINKTEXT: + case LXB_CSS_VALUE_VISITEDTEXT: + case LXB_CSS_VALUE_ACTIVETEXT: + case LXB_CSS_VALUE_BUTTONFACE: + case LXB_CSS_VALUE_BUTTONTEXT: + case LXB_CSS_VALUE_BUTTONBORDER: + case LXB_CSS_VALUE_FIELD: + case LXB_CSS_VALUE_FIELDTEXT: + case LXB_CSS_VALUE_HIGHLIGHT: + case LXB_CSS_VALUE_HIGHLIGHTTEXT: + case LXB_CSS_VALUE_SELECTEDITEM: + case LXB_CSS_VALUE_SELECTEDITEMTEXT: + case LXB_CSS_VALUE_MARK: + case LXB_CSS_VALUE_MARKTEXT: + case LXB_CSS_VALUE_GRAYTEXT: + case LXB_CSS_VALUE_ACCENTCOLOR: + case LXB_CSS_VALUE_ACCENTCOLORTEXT: + /* */ + case LXB_CSS_VALUE_TRANSPARENT: + /* */ + case LXB_CSS_VALUE_ALICEBLUE: + case LXB_CSS_VALUE_ANTIQUEWHITE: + case LXB_CSS_VALUE_AQUA: + case LXB_CSS_VALUE_AQUAMARINE: + case LXB_CSS_VALUE_AZURE: + case LXB_CSS_VALUE_BEIGE: + case LXB_CSS_VALUE_BISQUE: + case LXB_CSS_VALUE_BLACK: + case LXB_CSS_VALUE_BLANCHEDALMOND: + case LXB_CSS_VALUE_BLUE: + case LXB_CSS_VALUE_BLUEVIOLET: + case LXB_CSS_VALUE_BROWN: + case LXB_CSS_VALUE_BURLYWOOD: + case LXB_CSS_VALUE_CADETBLUE: + case LXB_CSS_VALUE_CHARTREUSE: + case LXB_CSS_VALUE_CHOCOLATE: + case LXB_CSS_VALUE_CORAL: + case LXB_CSS_VALUE_CORNFLOWERBLUE: + case LXB_CSS_VALUE_CORNSILK: + case LXB_CSS_VALUE_CRIMSON: + case LXB_CSS_VALUE_CYAN: + case LXB_CSS_VALUE_DARKBLUE: + case LXB_CSS_VALUE_DARKCYAN: + case LXB_CSS_VALUE_DARKGOLDENROD: + case LXB_CSS_VALUE_DARKGRAY: + case LXB_CSS_VALUE_DARKGREEN: + case LXB_CSS_VALUE_DARKGREY: + case LXB_CSS_VALUE_DARKKHAKI: + case LXB_CSS_VALUE_DARKMAGENTA: + case LXB_CSS_VALUE_DARKOLIVEGREEN: + case LXB_CSS_VALUE_DARKORANGE: + case LXB_CSS_VALUE_DARKORCHID: + case LXB_CSS_VALUE_DARKRED: + case LXB_CSS_VALUE_DARKSALMON: + case LXB_CSS_VALUE_DARKSEAGREEN: + case LXB_CSS_VALUE_DARKSLATEBLUE: + case LXB_CSS_VALUE_DARKSLATEGRAY: + case LXB_CSS_VALUE_DARKSLATEGREY: + case LXB_CSS_VALUE_DARKTURQUOISE: + case LXB_CSS_VALUE_DARKVIOLET: + case LXB_CSS_VALUE_DEEPPINK: + case LXB_CSS_VALUE_DEEPSKYBLUE: + case LXB_CSS_VALUE_DIMGRAY: + case LXB_CSS_VALUE_DIMGREY: + case LXB_CSS_VALUE_DODGERBLUE: + case LXB_CSS_VALUE_FIREBRICK: + case LXB_CSS_VALUE_FLORALWHITE: + case LXB_CSS_VALUE_FORESTGREEN: + case LXB_CSS_VALUE_FUCHSIA: + case LXB_CSS_VALUE_GAINSBORO: + case LXB_CSS_VALUE_GHOSTWHITE: + case LXB_CSS_VALUE_GOLD: + case LXB_CSS_VALUE_GOLDENROD: + case LXB_CSS_VALUE_GRAY: + case LXB_CSS_VALUE_GREEN: + case LXB_CSS_VALUE_GREENYELLOW: + case LXB_CSS_VALUE_GREY: + case LXB_CSS_VALUE_HONEYDEW: + case LXB_CSS_VALUE_HOTPINK: + case LXB_CSS_VALUE_INDIANRED: + case LXB_CSS_VALUE_INDIGO: + case LXB_CSS_VALUE_IVORY: + case LXB_CSS_VALUE_KHAKI: + case LXB_CSS_VALUE_LAVENDER: + case LXB_CSS_VALUE_LAVENDERBLUSH: + case LXB_CSS_VALUE_LAWNGREEN: + case LXB_CSS_VALUE_LEMONCHIFFON: + case LXB_CSS_VALUE_LIGHTBLUE: + case LXB_CSS_VALUE_LIGHTCORAL: + case LXB_CSS_VALUE_LIGHTCYAN: + case LXB_CSS_VALUE_LIGHTGOLDENRODYELLOW: + case LXB_CSS_VALUE_LIGHTGRAY: + case LXB_CSS_VALUE_LIGHTGREEN: + case LXB_CSS_VALUE_LIGHTGREY: + case LXB_CSS_VALUE_LIGHTPINK: + case LXB_CSS_VALUE_LIGHTSALMON: + case LXB_CSS_VALUE_LIGHTSEAGREEN: + case LXB_CSS_VALUE_LIGHTSKYBLUE: + case LXB_CSS_VALUE_LIGHTSLATEGRAY: + case LXB_CSS_VALUE_LIGHTSLATEGREY: + case LXB_CSS_VALUE_LIGHTSTEELBLUE: + case LXB_CSS_VALUE_LIGHTYELLOW: + case LXB_CSS_VALUE_LIME: + case LXB_CSS_VALUE_LIMEGREEN: + case LXB_CSS_VALUE_LINEN: + case LXB_CSS_VALUE_MAGENTA: + case LXB_CSS_VALUE_MAROON: + case LXB_CSS_VALUE_MEDIUMAQUAMARINE: + case LXB_CSS_VALUE_MEDIUMBLUE: + case LXB_CSS_VALUE_MEDIUMORCHID: + case LXB_CSS_VALUE_MEDIUMPURPLE: + case LXB_CSS_VALUE_MEDIUMSEAGREEN: + case LXB_CSS_VALUE_MEDIUMSLATEBLUE: + case LXB_CSS_VALUE_MEDIUMSPRINGGREEN: + case LXB_CSS_VALUE_MEDIUMTURQUOISE: + case LXB_CSS_VALUE_MEDIUMVIOLETRED: + case LXB_CSS_VALUE_MIDNIGHTBLUE: + case LXB_CSS_VALUE_MINTCREAM: + case LXB_CSS_VALUE_MISTYROSE: + case LXB_CSS_VALUE_MOCCASIN: + case LXB_CSS_VALUE_NAVAJOWHITE: + case LXB_CSS_VALUE_NAVY: + case LXB_CSS_VALUE_OLDLACE: + case LXB_CSS_VALUE_OLIVE: + case LXB_CSS_VALUE_OLIVEDRAB: + case LXB_CSS_VALUE_ORANGE: + case LXB_CSS_VALUE_ORANGERED: + case LXB_CSS_VALUE_ORCHID: + case LXB_CSS_VALUE_PALEGOLDENROD: + case LXB_CSS_VALUE_PALEGREEN: + case LXB_CSS_VALUE_PALETURQUOISE: + case LXB_CSS_VALUE_PALEVIOLETRED: + case LXB_CSS_VALUE_PAPAYAWHIP: + case LXB_CSS_VALUE_PEACHPUFF: + case LXB_CSS_VALUE_PERU: + case LXB_CSS_VALUE_PINK: + case LXB_CSS_VALUE_PLUM: + case LXB_CSS_VALUE_POWDERBLUE: + case LXB_CSS_VALUE_PURPLE: + case LXB_CSS_VALUE_REBECCAPURPLE: + case LXB_CSS_VALUE_RED: + case LXB_CSS_VALUE_ROSYBROWN: + case LXB_CSS_VALUE_ROYALBLUE: + case LXB_CSS_VALUE_SADDLEBROWN: + case LXB_CSS_VALUE_SALMON: + case LXB_CSS_VALUE_SANDYBROWN: + case LXB_CSS_VALUE_SEAGREEN: + case LXB_CSS_VALUE_SEASHELL: + case LXB_CSS_VALUE_SIENNA: + case LXB_CSS_VALUE_SILVER: + case LXB_CSS_VALUE_SKYBLUE: + case LXB_CSS_VALUE_SLATEBLUE: + case LXB_CSS_VALUE_SLATEGRAY: + case LXB_CSS_VALUE_SLATEGREY: + case LXB_CSS_VALUE_SNOW: + case LXB_CSS_VALUE_SPRINGGREEN: + case LXB_CSS_VALUE_STEELBLUE: + case LXB_CSS_VALUE_TAN: + case LXB_CSS_VALUE_TEAL: + case LXB_CSS_VALUE_THISTLE: + case LXB_CSS_VALUE_TOMATO: + case LXB_CSS_VALUE_TURQUOISE: + case LXB_CSS_VALUE_VIOLET: + case LXB_CSS_VALUE_WHEAT: + case LXB_CSS_VALUE_WHITE: + case LXB_CSS_VALUE_WHITESMOKE: + case LXB_CSS_VALUE_YELLOW: + case LXB_CSS_VALUE_YELLOWGREEN: + color->type = type; + break; + + default: + return false; + } + + break; + + default: + return false; + } + + lxb_css_syntax_parser_consume(parser); + + return true; +} + +bool +lxb_css_property_state__undef(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_parser_failed(parser); +} + +bool +lxb_css_property_state__custom(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_status_t status; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property__custom_t *custom = declar->u.custom; + + (void) lexbor_str_init(&custom->value, parser->memory->mraw, 0); + if (custom->value.data == NULL) { + return lxb_css_parser_memory_fail(parser); + } + + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + status = lxb_css_syntax_token_serialize_str(token, &custom->value, + parser->memory->mraw); + if (status != LXB_STATUS_OK) { + return lxb_css_parser_memory_fail(parser); + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_display(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_property_display_t *display; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + display = declar->u.display; + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + + switch (type) { + /* */ + case LXB_CSS_DISPLAY_BLOCK: + case LXB_CSS_DISPLAY_INLINE: + case LXB_CSS_DISPLAY_RUN_IN: + display->a = type; + goto inside_listitem; + + /* */ + case LXB_CSS_DISPLAY_FLOW: + case LXB_CSS_DISPLAY_FLOW_ROOT: + display->a = type; + goto outside_listitem; + + case LXB_CSS_DISPLAY_TABLE: + case LXB_CSS_DISPLAY_FLEX: + case LXB_CSS_DISPLAY_GRID: + case LXB_CSS_DISPLAY_RUBY: + display->a = type; + goto outside; + + /* */ + case LXB_CSS_DISPLAY_LIST_ITEM: + display->a = type; + goto listitem_only; + + /* */ + case LXB_CSS_DISPLAY_TABLE_ROW_GROUP: + case LXB_CSS_DISPLAY_TABLE_HEADER_GROUP: + case LXB_CSS_DISPLAY_TABLE_FOOTER_GROUP: + case LXB_CSS_DISPLAY_TABLE_ROW: + case LXB_CSS_DISPLAY_TABLE_CELL: + case LXB_CSS_DISPLAY_TABLE_COLUMN_GROUP: + case LXB_CSS_DISPLAY_TABLE_COLUMN: + case LXB_CSS_DISPLAY_TABLE_CAPTION: + case LXB_CSS_DISPLAY_RUBY_BASE: + case LXB_CSS_DISPLAY_RUBY_TEXT: + case LXB_CSS_DISPLAY_RUBY_BASE_CONTAINER: + case LXB_CSS_DISPLAY_RUBY_TEXT_CONTAINER: + /* */ + case LXB_CSS_DISPLAY_CONTENTS: + case LXB_CSS_DISPLAY_NONE: + /* */ + case LXB_CSS_DISPLAY_INLINE_BLOCK: + case LXB_CSS_DISPLAY_INLINE_TABLE: + case LXB_CSS_DISPLAY_INLINE_FLEX: + case LXB_CSS_DISPLAY_INLINE_GRID: + display->a = type; + goto done; + + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + display->a = type; + goto done; + + default: + return lxb_css_parser_failed(parser); + } + +inside_listitem: + + lxb_css_property_state_get_type(parser, token, type); + + switch (type) { + /* */ + case LXB_CSS_DISPLAY_FLOW: + case LXB_CSS_DISPLAY_FLOW_ROOT: + display->b = type; + break; + + case LXB_CSS_DISPLAY_TABLE: + case LXB_CSS_DISPLAY_FLEX: + case LXB_CSS_DISPLAY_GRID: + case LXB_CSS_DISPLAY_RUBY: + display->b = type; + goto done; + + case LXB_CSS_DISPLAY_LIST_ITEM: + display->b = type; + goto flow_only; + + default: + return lxb_css_parser_failed(parser); + } + +listitem: + + lxb_css_property_state_get_type(parser, token, type); + + if (type == LXB_CSS_DISPLAY_LIST_ITEM) { + display->c = type; + goto done; + } + + return lxb_css_parser_failed(parser); + +outside: + + lxb_css_property_state_get_type(parser, token, type); + + switch (type) { + /* */ + case LXB_CSS_DISPLAY_BLOCK: + case LXB_CSS_DISPLAY_INLINE: + case LXB_CSS_DISPLAY_RUN_IN: + if (display->b == LXB_CSS_PROPERTY__UNDEF) { + display->b = type; + } + else { + display->c = type; + } + + goto done; + + default: + return lxb_css_parser_failed(parser); + } + +outside_listitem: + + lxb_css_property_state_get_type(parser, token, type); + + switch (type) { + /* */ + case LXB_CSS_DISPLAY_BLOCK: + case LXB_CSS_DISPLAY_INLINE: + case LXB_CSS_DISPLAY_RUN_IN: + display->b = type; + goto listitem; + + case LXB_CSS_DISPLAY_LIST_ITEM: + display->b = type; + goto outside; + + default: + return lxb_css_parser_failed(parser); + } + +listitem_only: + + lxb_css_property_state_get_type(parser, token, type); + + switch (type) { + /* */ + case LXB_CSS_DISPLAY_BLOCK: + case LXB_CSS_DISPLAY_INLINE: + case LXB_CSS_DISPLAY_RUN_IN: + display->b = type; + break; + + /* */ + case LXB_CSS_DISPLAY_FLOW: + case LXB_CSS_DISPLAY_FLOW_ROOT: + display->b = type; + goto outside; + + default: + return lxb_css_parser_failed(parser); + } + +flow_only: + + lxb_css_property_state_get_type(parser, token, type); + + switch (type) { + /* */ + case LXB_CSS_DISPLAY_FLOW: + case LXB_CSS_DISPLAY_FLOW_ROOT: + display->c = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + +done: + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_order(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + res = lxb_css_property_state_integer(parser, token, + &declar->u.order->integer); + if (res) { + declar->u.order->type = LXB_CSS_ORDER__INTEGER; + + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + declar->u.order->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_visibility(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_VISIBILITY_VISIBLE: + case LXB_CSS_VISIBILITY_HIDDEN: + case LXB_CSS_VISIBILITY_COLLAPSE: + declar->u.visibility->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_width(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) { + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + case LXB_CSS_VALUE_AUTO: + case LXB_CSS_VALUE_MIN_CONTENT: + case LXB_CSS_VALUE_MAX_CONTENT: + declar->u.width->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); + } + + if (!lxb_css_property_state_length_percentage(parser, token, + declar->u.user)) + { + return lxb_css_parser_failed(parser); + } + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_height(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_width(parser, token, ctx); +} + +bool +lxb_css_property_state_box_sizing(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + case LXB_CSS_VALUE_CONTENT_BOX: + case LXB_CSS_VALUE_BORDER_BOX: + declar->u.box_sizing->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_min_width(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_width(parser, token, ctx); +} + +bool +lxb_css_property_state_min_height(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_width(parser, token, ctx); +} + +bool +lxb_css_property_state_max_width(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) { + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + case LXB_CSS_VALUE_NONE: + case LXB_CSS_VALUE_MIN_CONTENT: + case LXB_CSS_VALUE_MAX_CONTENT: + declar->u.width->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); + } + + if (!lxb_css_property_state_length_percentage(parser, token, + declar->u.user)) + { + return lxb_css_parser_failed(parser); + } + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_max_height(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_max_width(parser, token, ctx); +} + +static bool +lxb_css_property_state_mp(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_rule_declaration_t *declar, bool with_auto) +{ + unsigned int state; + lxb_css_value_type_t type; + lxb_css_property_margin_top_t *top; + + state = 1; + +next: + + switch (state) { + case 1: + top = &declar->u.margin->top; + break; + + case 2: + top = &declar->u.margin->right; + break; + + case 3: + top = &declar->u.margin->bottom; + break; + + case 4: + top = &declar->u.margin->left; + break; + + default: + return lxb_css_parser_failed(parser); + } + + if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) { + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + top->type = type; + break; + + case LXB_CSS_VALUE_AUTO: + if (with_auto) { + top->type = type; + break; + } + + /* Fall through. */ + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + } + else if (!lxb_css_property_state_length_percentage(parser, token, + (lxb_css_value_length_percentage_t *) top)) + { + return lxb_css_parser_failed(parser); + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN__END) { + return lxb_css_parser_success(parser); + } + + state++; + + goto next; +} + +static bool +lxb_css_property_state_mp_top(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_rule_declaration_t *declar, bool with_auto) +{ + lxb_css_value_type_t type; + + if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) { + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + declar->u.margin_top->type = type; + break; + + case LXB_CSS_VALUE_AUTO: + if (with_auto) { + declar->u.margin_top->type = type; + break; + } + + /* Fall through. */ + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); + } + + if (!lxb_css_property_state_length_percentage(parser, token, + declar->u.user)) + { + return lxb_css_parser_failed(parser); + } + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_margin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_mp(parser, token, ctx, true); +} + +bool +lxb_css_property_state_margin_top(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_mp_top(parser, token, ctx, true); +} + +bool +lxb_css_property_state_margin_right(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_mp_top(parser, token, ctx, true); +} + +bool +lxb_css_property_state_margin_bottom(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_mp_top(parser, token, ctx, true); +} + +bool +lxb_css_property_state_margin_left(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_mp_top(parser, token, ctx, true); +} + +bool +lxb_css_property_state_padding(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_mp(parser, token, ctx, false); +} + +bool +lxb_css_property_state_padding_top(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_mp_top(parser, token, ctx, false); +} + +bool +lxb_css_property_state_padding_right(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_mp_top(parser, token, ctx, false); +} + +bool +lxb_css_property_state_padding_bottom(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_mp_top(parser, token, ctx, false); +} + +bool +lxb_css_property_state_padding_left(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_mp_top(parser, token, ctx, false); +} + +static bool +lxb_css_property_state_line_width_style_color(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_property_border_t *border) +{ + lxb_status_t status; + lxb_css_value_type_t type; + const lxb_css_data_t *unit; + lxb_css_value_length_t *length; + lxb_css_syntax_token_string_t *str; + + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN_DIMENSION: + if (border->width.type != LXB_CSS_VALUE__UNDEF) { + return false; + } + + str = &lxb_css_syntax_token_dimension(token)->str; + + unit = lxb_css_unit_absolute_relative_by_name(str->data, + str->length); + if (unit == NULL) { + return false; + } + + length = &border->width.length; + + border->width.type = LXB_CSS_VALUE__LENGTH; + length->num = lxb_css_syntax_token_dimension(token)->num.num; + length->is_float = lxb_css_syntax_token_dimension(token)->num.is_float; + length->unit = (lxb_css_unit_t) unit->unique; + break; + + case LXB_CSS_SYNTAX_TOKEN_NUMBER: + if (border->width.type != LXB_CSS_VALUE__UNDEF) { + return false; + } + + length = &border->width.length; + + border->width.type = LXB_CSS_VALUE__NUMBER; + length->num = lxb_css_syntax_token_number(token)->num; + length->is_float = lxb_css_syntax_token_number(token)->is_float; + break; + + case LXB_CSS_SYNTAX_TOKEN_IDENT: + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_VALUE_THIN: + case LXB_CSS_VALUE_MEDIUM: + case LXB_CSS_VALUE_THICK: + if (border->width.type != LXB_CSS_VALUE__UNDEF) { + return false; + } + + border->width.type = type; + break; + + case LXB_CSS_VALUE_NONE: + case LXB_CSS_VALUE_HIDDEN: + case LXB_CSS_VALUE_DOTTED: + case LXB_CSS_VALUE_DASHED: + case LXB_CSS_VALUE_SOLID: + case LXB_CSS_VALUE_DOUBLE: + case LXB_CSS_VALUE_GROOVE: + case LXB_CSS_VALUE_RIDGE: + case LXB_CSS_VALUE_INSET: + case LXB_CSS_VALUE_OUTSET: + if (border->style != LXB_CSS_VALUE__UNDEF) { + return false; + } + + border->style = type; + break; + + default: + goto color; + } + + break; + + default: + goto color; + } + + lxb_css_syntax_parser_consume(parser); + + return true; + +color: + + if (border->color.type != LXB_CSS_VALUE__UNDEF) { + return false; + } + + return lxb_css_property_state_color_handler(parser, token, &border->color, + &status); +} + +bool +lxb_css_property_state_border(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) { + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + declar->u.border->style = type; + + lxb_css_syntax_parser_consume(parser); + return lxb_css_parser_success(parser); + + default: + break; + } + } + + res = lxb_css_property_state_line_width_style_color(parser, token, + declar->u.border); + if (!res) { + return lxb_css_parser_failed(parser); + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN__END) { + return lxb_css_parser_success(parser); + } + + res = lxb_css_property_state_line_width_style_color(parser, token, + declar->u.border); + if (!res) { + return lxb_css_parser_failed(parser); + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN__END) { + return lxb_css_parser_success(parser); + } + + res = lxb_css_property_state_line_width_style_color(parser, token, + declar->u.border); + if (!res) { + return lxb_css_parser_failed(parser); + } + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_border_top(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_border(parser, token, ctx); +} + +bool +lxb_css_property_state_border_right(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_border(parser, token, ctx); +} + +bool +lxb_css_property_state_border_bottom(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_border(parser, token, ctx); +} + +bool +lxb_css_property_state_border_left(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_border(parser, token, ctx); +} + +bool +lxb_css_property_state_border_top_color(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_color(parser, token, ctx); +} + +bool +lxb_css_property_state_border_right_color(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_color(parser, token, ctx); +} + +bool +lxb_css_property_state_border_bottom_color(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_color(parser, token, ctx); +} + +bool +lxb_css_property_state_border_left_color(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_color(parser, token, ctx); +} + +bool +lxb_css_property_state_background_color(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_color(parser, token, ctx); +} + +bool +lxb_css_property_state_color(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_status_t status; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) { + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + declar->u.color->type = type; + + lxb_css_syntax_parser_consume(parser); + return lxb_css_parser_success(parser); + + default: + break; + } + } + + res = lxb_css_property_state_color_handler(parser, token, + (lxb_css_value_color_t *) declar->u.color, + &status); + if (!res) { + return lxb_css_parser_failed(parser); + } + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_opacity(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_opacity_t *opacity = declar->u.opacity; + + res = lxb_css_property_state_number_percentage(parser, token, + (lxb_css_value_number_percentage_t *) opacity); + if (res) { + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + opacity->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_position(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_POSITION_STATIC: + case LXB_CSS_POSITION_RELATIVE: + case LXB_CSS_POSITION_ABSOLUTE: + case LXB_CSS_POSITION_STICKY: + case LXB_CSS_POSITION_FIXED: + declar->u.position->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_top(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_mp_top(parser, token, ctx, true); +} + +bool +lxb_css_property_state_right(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_top(parser, token, ctx); +} + +bool +lxb_css_property_state_bottom(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_top(parser, token, ctx); +} + +bool +lxb_css_property_state_left(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_top(parser, token, ctx); +} + +bool +lxb_css_property_state_inset_block_start(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_top(parser, token, ctx); +} + +bool +lxb_css_property_state_inset_inline_start(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_top(parser, token, ctx); +} + +bool +lxb_css_property_state_inset_block_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_top(parser, token, ctx); +} + +bool +lxb_css_property_state_inset_inline_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_top(parser, token, ctx); +} + +bool +lxb_css_property_state_text_transform(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_text_transform_t *tt; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + tt = declar->u.text_transform; + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_TEXT_TRANSFORM_NONE: + tt->type_case = type; + break; + + case LXB_CSS_TEXT_TRANSFORM_CAPITALIZE: + case LXB_CSS_TEXT_TRANSFORM_UPPERCASE: + case LXB_CSS_TEXT_TRANSFORM_LOWERCASE: + tt->type_case = type; + goto next; + + case LXB_CSS_TEXT_TRANSFORM_FULL_WIDTH: + tt->full_width = type; + goto next; + + case LXB_CSS_TEXT_TRANSFORM_FULL_SIZE_KANA: + tt->full_size_kana = type; + goto next; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); + +next: + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_success(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + + switch (type) { + case LXB_CSS_TEXT_TRANSFORM_CAPITALIZE: + case LXB_CSS_TEXT_TRANSFORM_UPPERCASE: + case LXB_CSS_TEXT_TRANSFORM_LOWERCASE: + if (tt->type_case != LXB_CSS_VALUE__UNDEF) { + return lxb_css_parser_failed(parser); + } + + tt->type_case = type; + goto next; + + case LXB_CSS_TEXT_TRANSFORM_FULL_WIDTH: + if (tt->full_width != LXB_CSS_VALUE__UNDEF) { + return lxb_css_parser_failed(parser); + } + + tt->full_width = type; + goto next; + + case LXB_CSS_TEXT_TRANSFORM_FULL_SIZE_KANA: + if (tt->full_size_kana != LXB_CSS_VALUE__UNDEF) { + return lxb_css_parser_failed(parser); + } + + tt->full_size_kana = type; + goto next; + + default: + return lxb_css_parser_failed(parser); + } +} + +bool +lxb_css_property_state_text_align(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_TEXT_ALIGN_START: + case LXB_CSS_TEXT_ALIGN_END: + case LXB_CSS_TEXT_ALIGN_LEFT: + case LXB_CSS_TEXT_ALIGN_RIGHT: + case LXB_CSS_TEXT_ALIGN_CENTER: + case LXB_CSS_TEXT_ALIGN_JUSTIFY: + case LXB_CSS_TEXT_ALIGN_MATCH_PARENT: + case LXB_CSS_TEXT_ALIGN_JUSTIFY_ALL: + declar->u.text_align->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_text_align_all(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_TEXT_ALIGN_ALL_START: + case LXB_CSS_TEXT_ALIGN_ALL_END: + case LXB_CSS_TEXT_ALIGN_ALL_LEFT: + case LXB_CSS_TEXT_ALIGN_ALL_RIGHT: + case LXB_CSS_TEXT_ALIGN_ALL_CENTER: + case LXB_CSS_TEXT_ALIGN_ALL_JUSTIFY: + case LXB_CSS_TEXT_ALIGN_ALL_MATCH_PARENT: + declar->u.text_align_all->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_text_align_last(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_TEXT_ALIGN_LAST_AUTO: + case LXB_CSS_TEXT_ALIGN_LAST_START: + case LXB_CSS_TEXT_ALIGN_LAST_END: + case LXB_CSS_TEXT_ALIGN_LAST_LEFT: + case LXB_CSS_TEXT_ALIGN_LAST_RIGHT: + case LXB_CSS_TEXT_ALIGN_LAST_CENTER: + case LXB_CSS_TEXT_ALIGN_LAST_JUSTIFY: + case LXB_CSS_TEXT_ALIGN_LAST_MATCH_PARENT: + declar->u.text_align_last->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_text_justify(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_TEXT_JUSTIFY_AUTO: + case LXB_CSS_TEXT_JUSTIFY_NONE: + case LXB_CSS_TEXT_JUSTIFY_INTER_WORD: + case LXB_CSS_TEXT_JUSTIFY_INTER_CHARACTER: + declar->u.text_justify->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_text_indent(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_text_indent_t *text_indent; + + text_indent = declar->u.text_indent; + + res = lxb_css_property_state_length_percentage(parser, token, + &text_indent->length); + if (res) { + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + text_indent->type = LXB_CSS_VALUE__LENGTH; + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + if (!res) { + return lxb_css_parser_failed(parser); + } + + return lxb_css_parser_success(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + if (res) { + return lxb_css_parser_failed(parser); + } + + text_indent->type = type; + break; + + /* Local. */ + case LXB_CSS_TEXT_INDENT_HANGING: + text_indent->hanging = type; + goto next; + + case LXB_CSS_TEXT_INDENT_EACH_LINE: + text_indent->each_line = type; + goto next; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); + +next: + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_length_percentage(parser, token, + &text_indent->length); + if (res) { + if (text_indent->type != LXB_CSS_VALUE__UNDEF) { + return lxb_css_parser_failed(parser); + } + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + text_indent->type = LXB_CSS_VALUE__LENGTH; + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + if (text_indent->type == LXB_CSS_VALUE__UNDEF) { + return lxb_css_parser_failed(parser); + } + + return lxb_css_parser_success(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + + switch (type) { + case LXB_CSS_TEXT_INDENT_HANGING: + if (text_indent->hanging != LXB_CSS_VALUE__UNDEF) { + return lxb_css_parser_failed(parser); + } + + text_indent->hanging = type; + goto next; + + case LXB_CSS_TEXT_INDENT_EACH_LINE: + if (text_indent->each_line != LXB_CSS_VALUE__UNDEF) { + return lxb_css_parser_failed(parser); + } + + text_indent->each_line = type; + goto next; + + default: + return lxb_css_parser_failed(parser); + } +} + +bool +lxb_css_property_state_white_space(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_WHITE_SPACE_NORMAL: + case LXB_CSS_WHITE_SPACE_PRE: + case LXB_CSS_WHITE_SPACE_NOWRAP: + case LXB_CSS_WHITE_SPACE_PRE_WRAP: + case LXB_CSS_WHITE_SPACE_BREAK_SPACES: + case LXB_CSS_WHITE_SPACE_PRE_LINE: + declar->u.white_space->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_tab_size(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + res = lxb_css_property_state_number_length(parser, token, + (lxb_css_value_number_length_t *) declar->u.tab_size); + if (res) { + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + declar->u.tab_size->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_word_break(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_WORD_BREAK_NORMAL: + case LXB_CSS_WORD_BREAK_KEEP_ALL: + case LXB_CSS_WORD_BREAK_BREAK_ALL: + case LXB_CSS_WORD_BREAK_BREAK_WORD: + declar->u.word_break->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_line_break(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_LINE_BREAK_AUTO: + case LXB_CSS_LINE_BREAK_LOOSE: + case LXB_CSS_LINE_BREAK_NORMAL: + case LXB_CSS_LINE_BREAK_STRICT: + case LXB_CSS_LINE_BREAK_ANYWHERE: + declar->u.line_break->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_hyphens(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_HYPHENS_NONE: + case LXB_CSS_HYPHENS_MANUAL: + case LXB_CSS_HYPHENS_AUTO: + declar->u.hyphens->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_overflow_wrap(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_OVERFLOW_WRAP_NORMAL: + case LXB_CSS_OVERFLOW_WRAP_BREAK_WORD: + case LXB_CSS_OVERFLOW_WRAP_ANYWHERE: + declar->u.overflow_wrap->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_word_wrap(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_overflow_wrap(parser, token, ctx); +} + +bool +lxb_css_property_state_word_spacing(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + res = lxb_css_property_state_length(parser, token, + &declar->u.word_spacing->length); + if (res) { + declar->u.word_spacing->type = LXB_CSS_VALUE__LENGTH; + + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_WORD_SPACING_NORMAL: + declar->u.word_spacing->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_letter_spacing(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_word_spacing(parser, token, ctx); +} + +bool +lxb_css_property_state_hanging_punctuation(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_hanging_punctuation_t *hp; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + hp = declar->u.hanging_punctuation; + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_HANGING_PUNCTUATION_NONE: + hp->type_first = type; + break; + + case LXB_CSS_HANGING_PUNCTUATION_FIRST: + hp->type_first = type; + goto next; + + case LXB_CSS_HANGING_PUNCTUATION_FORCE_END: + case LXB_CSS_HANGING_PUNCTUATION_ALLOW_END: + hp->force_allow = type; + goto next; + + case LXB_CSS_HANGING_PUNCTUATION_LAST: + hp->last = type; + goto next; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); + +next: + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_success(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + + switch (type) { + case LXB_CSS_HANGING_PUNCTUATION_FIRST: + if (hp->type_first != LXB_CSS_VALUE__UNDEF) { + return lxb_css_parser_failed(parser); + } + + hp->type_first = type; + goto next; + + case LXB_CSS_HANGING_PUNCTUATION_FORCE_END: + case LXB_CSS_HANGING_PUNCTUATION_ALLOW_END: + if (hp->force_allow != LXB_CSS_VALUE__UNDEF) { + return lxb_css_parser_failed(parser); + } + + hp->force_allow = type; + goto next; + + case LXB_CSS_HANGING_PUNCTUATION_LAST: + if (hp->last != LXB_CSS_VALUE__UNDEF) { + return lxb_css_parser_failed(parser); + } + + hp->last = type; + goto next; + + default: + return lxb_css_parser_failed(parser); + } +} + +bool +lxb_css_property_state_font_family(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + size_t length; + const lxb_char_t *data; + lexbor_str_t *str; + lexbor_mraw_t *mraw; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_font_family_t *ff; + lxb_css_property_family_name_t *name; + + mraw = parser->memory->mraw; + ff = declar->u.font_family; + + while (token != NULL) { + name = lexbor_mraw_alloc(mraw, sizeof(lxb_css_property_family_name_t)); + if (name == NULL) { + return lxb_css_parser_memory_fail(parser); + } + + if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) { + data = lxb_css_syntax_token_ident(token)->data; + length = lxb_css_syntax_token_ident(token)->length; + + type = lxb_css_value_by_name(data, length); + if (type != LXB_CSS_VALUE__UNDEF) { + name->generic = true; + name->u.type = type; + + goto next; + } + } + else if (token->type == LXB_CSS_SYNTAX_TOKEN_STRING) { + data = lxb_css_syntax_token_string(token)->data; + length = lxb_css_syntax_token_string(token)->length; + } + else { + return lxb_css_parser_failed(parser); + } + + name->generic = false; + + str = &name->u.str; + + (void) lexbor_str_init(str, mraw, length); + if (name->u.str.data == NULL) { + return lxb_css_parser_memory_fail(parser); + } + + memcpy(str->data, data, length); + + str->data[length] = '\0'; + str->length = length; + + next: + + if (ff->first == NULL) { + ff->first = name; + } + else { + ff->last->next = name; + } + + name->next = NULL; + name->prev = ff->last; + ff->last = name; + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_COMMA) { + if (token->type == LXB_CSS_SYNTAX_TOKEN__END) { + return lxb_css_parser_success(parser); + } + + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + } + + lxb_css_property_state_check_token(parser, token); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_font_weight(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx)\ +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_font_weight_t *fw = declar->u.font_weight; + + res = lxb_css_property_state_number(parser, token, &fw->number); + + if (res) { + if (fw->number.num < 1 || fw->number.num > 1000) { + return lxb_css_parser_failed(parser); + } + + fw->type = LXB_CSS_FONT_WEIGHT__NUMBER; + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_FONT_WEIGHT_NORMAL: + case LXB_CSS_FONT_WEIGHT_BOLD: + case LXB_CSS_FONT_WEIGHT_BOLDER: + case LXB_CSS_FONT_WEIGHT_LIGHTER: + fw->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_font_stretch(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_font_stretch_t *fs = declar->u.font_stretch; + + res = lxb_css_property_state_percentage(parser, token, &fs->percentage); + + if (res) { + if (fs->percentage.num < 0) { + return lxb_css_parser_failed(parser); + } + + fs->type = LXB_CSS_FONT_STRETCH__PERCENTAGE; + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_FONT_STRETCH_NORMAL: + case LXB_CSS_FONT_STRETCH_ULTRA_CONDENSED: + case LXB_CSS_FONT_STRETCH_EXTRA_CONDENSED: + case LXB_CSS_FONT_STRETCH_CONDENSED: + case LXB_CSS_FONT_STRETCH_SEMI_CONDENSED: + case LXB_CSS_FONT_STRETCH_SEMI_EXPANDED: + case LXB_CSS_FONT_STRETCH_EXPANDED: + case LXB_CSS_FONT_STRETCH_EXTRA_EXPANDED: + case LXB_CSS_FONT_STRETCH_ULTRA_EXPANDED: + fs->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_font_style(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_font_style_t *fs = declar->u.font_style; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_FONT_STYLE_NORMAL: + case LXB_CSS_FONT_STYLE_ITALIC: + fs->type = type; + break; + + case LXB_CSS_FONT_STYLE_OBLIQUE: + fs->type = type; + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_angle(parser, token, &fs->angle); + + if (res) { + if (fs->angle.num < -90 || fs->angle.num > 90) { + return lxb_css_parser_failed(parser); + } + + return lxb_css_parser_success(parser); + } + else { + fs->angle.unit = (lxb_css_unit_angle_t) LXB_CSS_UNIT__UNDEF; + } + + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_font_size(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_font_size_t *fs = declar->u.font_size; + + res = lxb_css_property_state_length_percentage(parser, token, &fs->length); + + if (res) { + if (fs->length.u.length.num < 0) { + return lxb_css_parser_failed(parser); + } + + fs->type = LXB_CSS_FONT_SIZE__LENGTH; + + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_FONT_SIZE_XX_SMALL: + case LXB_CSS_FONT_SIZE_X_SMALL: + case LXB_CSS_FONT_SIZE_SMALL: + case LXB_CSS_FONT_SIZE_MEDIUM: + case LXB_CSS_FONT_SIZE_LARGE: + case LXB_CSS_FONT_SIZE_X_LARGE: + case LXB_CSS_FONT_SIZE_XX_LARGE: + case LXB_CSS_FONT_SIZE_XXX_LARGE: + case LXB_CSS_FONT_SIZE_MATH: + case LXB_CSS_FONT_SIZE_LARGER: + case LXB_CSS_FONT_SIZE_SMALLER: + fs->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_float_reference(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_FLOAT_REFERENCE_INLINE: + case LXB_CSS_FLOAT_REFERENCE_COLUMN: + case LXB_CSS_FLOAT_REFERENCE_REGION: + case LXB_CSS_FLOAT_REFERENCE_PAGE: + declar->u.float_reference->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_float(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_float_t *fp = declar->u.floatp; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + if (token->type == LXB_CSS_SYNTAX_TOKEN_FUNCTION) { + goto snap; + } + + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_FLOAT_BLOCK_START: + case LXB_CSS_FLOAT_BLOCK_END: + case LXB_CSS_FLOAT_INLINE_START: + case LXB_CSS_FLOAT_INLINE_END: + case LXB_CSS_FLOAT_SNAP_BLOCK: + case LXB_CSS_FLOAT_SNAP_INLINE: + case LXB_CSS_FLOAT_LEFT: + case LXB_CSS_FLOAT_RIGHT: + case LXB_CSS_FLOAT_TOP: + case LXB_CSS_FLOAT_BOTTOM: + case LXB_CSS_FLOAT_NONE: + fp->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); + +snap: + + type = lxb_css_value_by_name(lxb_css_syntax_token_function(token)->data, + lxb_css_syntax_token_function(token)->length); + + if (type != LXB_CSS_FLOAT_SNAP_BLOCK + && type != LXB_CSS_FLOAT_SNAP_INLINE) + { + return lxb_css_parser_failed(parser); + } + + fp->type = type; + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_length(parser, token, &fp->length.length); + if (!res) { + return lxb_css_parser_failed(parser); + } + + fp->length.type = LXB_CSS_VALUE__LENGTH; + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_COMMA) { + if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + fp->snap_type = LXB_CSS_VALUE__UNDEF; + + lxb_css_syntax_parser_consume(parser); + return lxb_css_parser_success(parser); + } + + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_FLOAT_START: + case LXB_CSS_FLOAT_END: + if (fp->type != LXB_CSS_FLOAT_SNAP_BLOCK) { + return lxb_css_parser_failed(parser); + } + + fp->snap_type = type; + break; + + case LXB_CSS_FLOAT_LEFT: + case LXB_CSS_FLOAT_RIGHT: + if (fp->type != LXB_CSS_FLOAT_SNAP_INLINE) { + return lxb_css_parser_failed(parser); + } + + fp->snap_type = type; + break; + + case LXB_CSS_FLOAT_NEAR: + fp->snap_type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) { + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); + } + + return lxb_css_parser_failed(parser); +} + +bool +lxb_css_property_state_clear(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_CLEAR_INLINE_START: + case LXB_CSS_CLEAR_INLINE_END: + case LXB_CSS_CLEAR_BLOCK_START: + case LXB_CSS_CLEAR_BLOCK_END: + case LXB_CSS_CLEAR_LEFT: + case LXB_CSS_CLEAR_RIGHT: + case LXB_CSS_CLEAR_TOP: + case LXB_CSS_CLEAR_BOTTOM: + case LXB_CSS_CLEAR_NONE: + declar->u.clear->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_float_defer(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_float_defer_t *fd = declar->u.float_defer; + + res = lxb_css_property_state_integer(parser, token, &fd->integer); + if (res) { + fd->type = LXB_CSS_FLOAT_DEFER__INTEGER; + + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_FLOAT_DEFER_LAST: + case LXB_CSS_FLOAT_DEFER_NONE: + fd->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_float_offset(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_float_offset_t *fo = declar->u.float_offset; + + res = lxb_css_property_state_length_percentage(parser, token, + (lxb_css_value_length_percentage_t *) fo); + if (res) { + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + fo->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_wrap_flow(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_WRAP_FLOW_AUTO: + case LXB_CSS_WRAP_FLOW_BOTH: + case LXB_CSS_WRAP_FLOW_START: + case LXB_CSS_WRAP_FLOW_END: + case LXB_CSS_WRAP_FLOW_MINIMUM: + case LXB_CSS_WRAP_FLOW_MAXIMUM: + case LXB_CSS_WRAP_FLOW_CLEAR: + declar->u.wrap_flow->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_wrap_through(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_WRAP_THROUGH_WRAP: + case LXB_CSS_WRAP_THROUGH_NONE: + declar->u.wrap_through->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_flex_direction(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_FLEX_DIRECTION_ROW: + case LXB_CSS_FLEX_DIRECTION_ROW_REVERSE: + case LXB_CSS_FLEX_DIRECTION_COLUMN: + case LXB_CSS_FLEX_DIRECTION_COLUMN_REVERSE: + declar->u.flex_direction->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_flex_wrap(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_FLEX_WRAP_NOWRAP: + case LXB_CSS_FLEX_WRAP_WRAP: + case LXB_CSS_FLEX_WRAP_WRAP_REVERSE: + declar->u.flex_wrap->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_flex_flow(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_flex_flow_t *ff = declar->u.flex_flow; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_FLEX_DIRECTION_ROW: + case LXB_CSS_FLEX_DIRECTION_ROW_REVERSE: + case LXB_CSS_FLEX_DIRECTION_COLUMN: + case LXB_CSS_FLEX_DIRECTION_COLUMN_REVERSE: + ff->type_direction = type; + goto direction; + + case LXB_CSS_FLEX_WRAP_NOWRAP: + case LXB_CSS_FLEX_WRAP_WRAP: + case LXB_CSS_FLEX_WRAP_WRAP_REVERSE: + ff->wrap = type; + goto wrap; + + default: + return lxb_css_parser_failed(parser); + } + +direction: + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_success(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_FLEX_WRAP_NOWRAP: + case LXB_CSS_FLEX_WRAP_WRAP: + case LXB_CSS_FLEX_WRAP_WRAP_REVERSE: + ff->wrap = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + goto done; + +wrap: + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_success(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_FLEX_DIRECTION_ROW: + case LXB_CSS_FLEX_DIRECTION_ROW_REVERSE: + case LXB_CSS_FLEX_DIRECTION_COLUMN: + case LXB_CSS_FLEX_DIRECTION_COLUMN_REVERSE: + ff->type_direction = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + +done: + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +lxb_inline bool +lxb_css_property_state_flex_grow_shrink(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_property_flex_t *flex) +{ + bool res; + + res = lxb_css_property_state_number(parser, token, &flex->grow.number); + if (!res) { + return false; + } + + flex->grow.type = LXB_CSS_FLEX_GROW__NUMBER; + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_number(parser, token, &flex->shrink.number); + if (res) { + flex->shrink.type = LXB_CSS_FLEX_SHRINK__NUMBER; + } + + return true; +} + +lxb_inline bool +lxb_css_property_state_flex_grow_basis(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_property_flex_t *flex) +{ + bool res; + lxb_css_value_type_t type; + + res = lxb_css_property_state_width_handler(parser, token, + (lxb_css_property_flex_basis_t *) &flex->basis); + if (res) { + return true; + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return false; + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + + if (type == LXB_CSS_FLEX_BASIS_CONTENT) { + flex->basis.type = type; + + lxb_css_syntax_parser_consume(parser); + return true; + } + + return false; +} + +bool +lxb_css_property_state_flex(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_flex_t *flex = declar->u.flex; + + res = lxb_css_property_state_flex_grow_shrink(parser, token, flex); + + if (res) { + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_flex_grow_basis(parser, token, flex); + + if (!res && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + flex->basis.type = LXB_CSS_VALUE__NUMBER; + flex->basis.u.length.num = flex->grow.number.num; + flex->basis.u.length.unit = LXB_CSS_UNIT__UNDEF; + flex->basis.u.length.is_float = flex->grow.number.is_float; + + flex->grow.type = LXB_CSS_VALUE__UNDEF; + + if (flex->shrink.type != LXB_CSS_VALUE__UNDEF) { + flex->grow = flex->shrink; + flex->shrink.type = LXB_CSS_VALUE__UNDEF; + + goto try_shrink_last; + } + + res = lxb_css_property_state_flex_grow_shrink(parser, token, flex); + if (!res) { + return lxb_css_parser_failed(parser); + } + } + + return lxb_css_parser_success(parser); + } + else { + res = lxb_css_property_state_flex_grow_basis(parser, token, flex); + + if (res) { + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + (void) lxb_css_property_state_flex_grow_shrink(parser, token, flex); + + return lxb_css_parser_success(parser); + } + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_FLEX_NONE: + flex->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); + +try_shrink_last: + + res = lxb_css_property_state_number(parser, token, &flex->shrink.number); + if (res) { + flex->shrink.type = LXB_CSS_FLEX_SHRINK__NUMBER; + } + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_flex_grow(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_flex_grow_t *fg = declar->u.flex_grow; + + res = lxb_css_property_state_number(parser, token, &fg->number); + if (res) { + if (fg->number.num < 0) { + return lxb_css_parser_failed(parser); + } + + fg->type = LXB_CSS_FLEX_GROW__NUMBER; + + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + fg->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_flex_shrink(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_flex_grow_t *fs = declar->u.flex_shrink; + + res = lxb_css_property_state_number(parser, token, &fs->number); + if (res) { + if (fs->number.num < 0) { + return lxb_css_parser_failed(parser); + } + + fs->type = LXB_CSS_FLEX_SHRINK__NUMBER; + + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + fs->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_flex_basis(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_flex_basis_t *fb = declar->u.flex_basis; + + res = lxb_css_property_state_width_handler(parser, token, + (lxb_css_property_width_t *) fb); + if (res) { + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + case LXB_CSS_FLEX_BASIS_CONTENT: + fb->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_justify_content(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_JUSTIFY_CONTENT_FLEX_START: + case LXB_CSS_JUSTIFY_CONTENT_FLEX_END: + case LXB_CSS_JUSTIFY_CONTENT_CENTER: + case LXB_CSS_JUSTIFY_CONTENT_SPACE_BETWEEN: + case LXB_CSS_JUSTIFY_CONTENT_SPACE_AROUND: + declar->u.justify_content->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_align_items(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_ALIGN_ITEMS_FLEX_START: + case LXB_CSS_ALIGN_ITEMS_FLEX_END: + case LXB_CSS_ALIGN_ITEMS_CENTER: + case LXB_CSS_ALIGN_ITEMS_BASELINE: + case LXB_CSS_ALIGN_ITEMS_STRETCH: + declar->u.align_items->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_align_self(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_ALIGN_SELF_AUTO: + case LXB_CSS_ALIGN_SELF_FLEX_START: + case LXB_CSS_ALIGN_SELF_FLEX_END: + case LXB_CSS_ALIGN_SELF_CENTER: + case LXB_CSS_ALIGN_SELF_BASELINE: + case LXB_CSS_ALIGN_SELF_STRETCH: + declar->u.align_self->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_align_content(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_ALIGN_CONTENT_FLEX_START: + case LXB_CSS_ALIGN_CONTENT_FLEX_END: + case LXB_CSS_ALIGN_CONTENT_CENTER: + case LXB_CSS_ALIGN_CONTENT_SPACE_BETWEEN: + case LXB_CSS_ALIGN_CONTENT_SPACE_AROUND: + case LXB_CSS_ALIGN_CONTENT_STRETCH: + declar->u.align_content->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_dominant_baseline(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_DOMINANT_BASELINE_AUTO: + case LXB_CSS_DOMINANT_BASELINE_TEXT_BOTTOM: + case LXB_CSS_DOMINANT_BASELINE_ALPHABETIC: + case LXB_CSS_DOMINANT_BASELINE_IDEOGRAPHIC: + case LXB_CSS_DOMINANT_BASELINE_MIDDLE: + case LXB_CSS_DOMINANT_BASELINE_CENTRAL: + case LXB_CSS_DOMINANT_BASELINE_MATHEMATICAL: + case LXB_CSS_DOMINANT_BASELINE_HANGING: + case LXB_CSS_DOMINANT_BASELINE_TEXT_TOP: + declar->u.dominant_baseline->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_alignment_baseline_h(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_property_alignment_baseline_t *ab) +{ + lxb_css_value_type_t type; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return false; + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_ALIGNMENT_BASELINE_BASELINE: + case LXB_CSS_ALIGNMENT_BASELINE_TEXT_BOTTOM: + case LXB_CSS_ALIGNMENT_BASELINE_ALPHABETIC: + case LXB_CSS_ALIGNMENT_BASELINE_IDEOGRAPHIC: + case LXB_CSS_ALIGNMENT_BASELINE_MIDDLE: + case LXB_CSS_ALIGNMENT_BASELINE_CENTRAL: + case LXB_CSS_ALIGNMENT_BASELINE_MATHEMATICAL: + case LXB_CSS_ALIGNMENT_BASELINE_TEXT_TOP: + ab->type = type; + + lxb_css_syntax_parser_consume(parser); + return true; + + default: + return false; + } +} + +bool +lxb_css_property_state_baseline_shift_h(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_property_baseline_shift_t *bs) +{ + bool res; + lxb_css_value_type_t type; + + res = lxb_css_property_state_length_percentage(parser, token, bs); + + if (res) { + return true; + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return false; + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_BASELINE_SHIFT_SUB: + case LXB_CSS_BASELINE_SHIFT_SUPER: + case LXB_CSS_BASELINE_SHIFT_TOP: + case LXB_CSS_BASELINE_SHIFT_CENTER: + case LXB_CSS_BASELINE_SHIFT_BOTTOM: + bs->type = type; + + lxb_css_syntax_parser_consume(parser); + return true; + + default: + return false; + } +} + +bool +lxb_css_property_state_vertical_align(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + uint8_t maps; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_vertical_align_t *va = declar->u.vertical_align; + + maps = 0; + +again: + + res = lxb_css_property_state_alignment_baseline_h(parser, token, + &va->alignment); + if (res) { + if (maps & 1 << 1) { + return lxb_css_parser_failed(parser); + } + + maps |= 1 << 1; + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_baseline_shift_h(parser, token, + &va->shift); + if (res) { + if (maps & 1 << 2) { + return lxb_css_parser_failed(parser); + } + + maps |= 1 << 2; + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + } + } + else { + res = lxb_css_property_state_baseline_shift_h(parser, token, + &va->shift); + if (res) { + if (maps & 1 << 2) { + return lxb_css_parser_failed(parser); + } + + maps |= 1 << 2; + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_alignment_baseline_h(parser, token, + &va->alignment); + if (res) { + if (maps & 1 << 1) { + return lxb_css_parser_failed(parser); + } + + maps |= 1 << 1; + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + } + } + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + if (maps != 0) { + return lxb_css_parser_success(parser); + } + + return lxb_css_parser_failed(parser); + } + + if (maps & 1 << 3) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_VERTICAL_ALIGN_FIRST: + case LXB_CSS_VERTICAL_ALIGN_LAST: + va->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + maps = 1 << 3; + + goto again; +} + +bool +lxb_css_property_state_baseline_source(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_BASELINE_SOURCE_AUTO: + case LXB_CSS_BASELINE_SOURCE_FIRST: + case LXB_CSS_BASELINE_SOURCE_LAST: + declar->u.baseline_source->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_alignment_baseline(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_ALIGNMENT_BASELINE_BASELINE: + case LXB_CSS_ALIGNMENT_BASELINE_TEXT_BOTTOM: + case LXB_CSS_ALIGNMENT_BASELINE_ALPHABETIC: + case LXB_CSS_ALIGNMENT_BASELINE_IDEOGRAPHIC: + case LXB_CSS_ALIGNMENT_BASELINE_MIDDLE: + case LXB_CSS_ALIGNMENT_BASELINE_CENTRAL: + case LXB_CSS_ALIGNMENT_BASELINE_MATHEMATICAL: + case LXB_CSS_ALIGNMENT_BASELINE_TEXT_TOP: + declar->u.alignment_baseline->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_baseline_shift(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + res = lxb_css_property_state_length_percentage(parser, token, + declar->u.baseline_shift); + if (res) { + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_BASELINE_SHIFT_SUB: + case LXB_CSS_BASELINE_SHIFT_SUPER: + case LXB_CSS_BASELINE_SHIFT_TOP: + case LXB_CSS_BASELINE_SHIFT_CENTER: + case LXB_CSS_BASELINE_SHIFT_BOTTOM: + declar->u.baseline_shift->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_line_height(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + res = lxb_css_property_state_number_length_percentage(parser, token, + declar->u.line_height); + if (res) { + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_LINE_HEIGHT_NORMAL: + declar->u.line_height->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_z_index(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + res = lxb_css_property_state_integer(parser, token, + &declar->u.z_index->integer); + if (res) { + declar->u.z_index->type = LXB_CSS_VALUE__INTEGER; + return lxb_css_parser_success(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_Z_INDEX_AUTO: + declar->u.line_height->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_direction(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_DIRECTION_LTR: + case LXB_CSS_DIRECTION_RTL: + declar->u.direction->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_unicode_bidi(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_UNICODE_BIDI_NORMAL: + case LXB_CSS_UNICODE_BIDI_EMBED: + case LXB_CSS_UNICODE_BIDI_ISOLATE: + case LXB_CSS_UNICODE_BIDI_BIDI_OVERRIDE: + case LXB_CSS_UNICODE_BIDI_ISOLATE_OVERRIDE: + case LXB_CSS_UNICODE_BIDI_PLAINTEXT: + declar->u.unicode_bidi->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_writing_mode(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_WRITING_MODE_HORIZONTAL_TB: + case LXB_CSS_WRITING_MODE_VERTICAL_RL: + case LXB_CSS_WRITING_MODE_VERTICAL_LR: + case LXB_CSS_WRITING_MODE_SIDEWAYS_RL: + case LXB_CSS_WRITING_MODE_SIDEWAYS_LR: + declar->u.writing_mode->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_text_orientation(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_TEXT_ORIENTATION_MIXED: + case LXB_CSS_TEXT_ORIENTATION_UPRIGHT: + case LXB_CSS_TEXT_ORIENTATION_SIDEWAYS: + declar->u.text_orientation->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_text_combine_upright(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_text_combine_upright_t *tcu = declar->u.text_combine_upright; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_TEXT_COMBINE_UPRIGHT_NONE: + case LXB_CSS_TEXT_COMBINE_UPRIGHT_ALL: + tcu->type = type; + break; + + case LXB_CSS_TEXT_COMBINE_UPRIGHT_DIGITS: + tcu->type = type; + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + res = lxb_css_property_state_integer(parser, token, + &tcu->digits); + if (res) { + if (tcu->digits.num != 2 && tcu->digits.num != 4) { + return lxb_css_parser_failed(parser); + } + } + + return lxb_css_parser_success(parser); + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_overflow_x(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_OVERFLOW_X_VISIBLE: + case LXB_CSS_OVERFLOW_X_HIDDEN: + case LXB_CSS_OVERFLOW_X_CLIP: + case LXB_CSS_OVERFLOW_X_SCROLL: + case LXB_CSS_OVERFLOW_X_AUTO: + declar->u.overflow_x->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_overflow_y(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_overflow_x(parser, token, ctx); +} + +bool +lxb_css_property_state_overflow_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_overflow_x(parser, token, ctx); +} + +bool +lxb_css_property_state_overflow_inline(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_overflow_x(parser, token, ctx); +} + +bool +lxb_css_property_state_text_overflow(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_TEXT_OVERFLOW_CLIP: + case LXB_CSS_TEXT_OVERFLOW_ELLIPSIS: + declar->u.text_overflow->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +lxb_status_t +lxb_css_property_state_text_decoration_line_h(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_property_text_decoration_line_t *tdl) +{ + lxb_css_value_type_t type; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return LXB_STATUS_NEXT; + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_TEXT_DECORATION_LINE_NONE: + tdl->type = type; + + lxb_css_syntax_parser_consume(parser); + return LXB_STATUS_OK; + + default: + goto first; + } + +next: + + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token_wo_ws(parser); + if (token == NULL) { + return LXB_STATUS_ERROR_MEMORY_ALLOCATION; + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return LXB_STATUS_OK; + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + +first: + + switch (type) { + case LXB_CSS_TEXT_DECORATION_LINE_UNDERLINE: + if (tdl->underline != LXB_CSS_VALUE__UNDEF) { + return LXB_STATUS_STOP; + } + + tdl->underline = type; + goto next; + + case LXB_CSS_TEXT_DECORATION_LINE_OVERLINE: + if (tdl->overline != LXB_CSS_VALUE__UNDEF) { + return LXB_STATUS_STOP; + } + + tdl->overline = type; + goto next; + + case LXB_CSS_TEXT_DECORATION_LINE_LINE_THROUGH: + if (tdl->line_through != LXB_CSS_VALUE__UNDEF) { + return LXB_STATUS_STOP; + } + + tdl->line_through = type; + goto next; + + case LXB_CSS_TEXT_DECORATION_LINE_BLINK: + if (tdl->blink != LXB_CSS_VALUE__UNDEF) { + return LXB_STATUS_STOP; + } + + tdl->blink = type; + goto next; + + default: + if (tdl->underline != LXB_CSS_VALUE__UNDEF + || tdl->overline != LXB_CSS_VALUE__UNDEF + || tdl->line_through != LXB_CSS_VALUE__UNDEF + || tdl->blink != LXB_CSS_VALUE__UNDEF) + { + return LXB_STATUS_OK; + } + + return LXB_STATUS_NEXT; + } +} + +bool +lxb_css_property_state_text_decoration_line(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_status_t status; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_text_decoration_line_t *tdl = declar->u.text_decoration_line; + + status = lxb_css_property_state_text_decoration_line_h(parser, token, tdl); + + if (status == LXB_STATUS_OK) { + return lxb_css_parser_success(parser); + } + else if (status == LXB_STATUS_STOP) { + return lxb_css_parser_failed(parser); + } + else if (status != LXB_STATUS_NEXT) { + return lxb_css_parser_memory_fail(parser); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + tdl->type = type; + + lxb_css_syntax_parser_consume(parser); + return lxb_css_parser_success(parser); + + default: + return lxb_css_parser_failed(parser); + } +} + +bool +lxb_css_property_state_text_decoration_style_h(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_property_text_decoration_style_t *tds) +{ + lxb_css_value_type_t type; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return false; + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + case LXB_CSS_TEXT_DECORATION_STYLE_SOLID: + case LXB_CSS_TEXT_DECORATION_STYLE_DOUBLE: + case LXB_CSS_TEXT_DECORATION_STYLE_DOTTED: + case LXB_CSS_TEXT_DECORATION_STYLE_DASHED: + case LXB_CSS_TEXT_DECORATION_STYLE_WAVY: + tds->type = type; + + lxb_css_syntax_parser_consume(parser); + return true; + + default: + return false; + } +} + +bool +lxb_css_property_state_text_decoration_style(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + return lxb_css_parser_failed(parser); + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + /* Local. */ + case LXB_CSS_TEXT_DECORATION_STYLE_SOLID: + case LXB_CSS_TEXT_DECORATION_STYLE_DOUBLE: + case LXB_CSS_TEXT_DECORATION_STYLE_DOTTED: + case LXB_CSS_TEXT_DECORATION_STYLE_DASHED: + case LXB_CSS_TEXT_DECORATION_STYLE_WAVY: + declar->u.text_decoration_style->type = type; + break; + + default: + return lxb_css_parser_failed(parser); + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_parser_success(parser); +} + +bool +lxb_css_property_state_text_decoration_color(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_property_state_color(parser, token, ctx); +} + +bool +lxb_css_property_state_text_decoration(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + bool res, line, style, color; + lxb_status_t status; + lxb_css_value_type_t type; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_property_text_decoration_t *td = declar->u.text_decoration; + + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) { + goto lsc; + } + + type = lxb_css_value_by_name(lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length); + switch (type) { + /* Global. */ + case LXB_CSS_VALUE_INITIAL: + case LXB_CSS_VALUE_INHERIT: + case LXB_CSS_VALUE_UNSET: + case LXB_CSS_VALUE_REVERT: + td->line.type = type; + + lxb_css_syntax_parser_consume(parser); + return lxb_css_parser_success(parser); + + default: + break; + } + +lsc: + + line = false; + style = false; + color = false; + + for (size_t i = 0; i < 3; i++) { + if (!line) { + status = lxb_css_property_state_text_decoration_line_h(parser, token, + &td->line); + if (status == LXB_STATUS_OK) { + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + line = true; + } + else if (status == LXB_STATUS_STOP) { + return lxb_css_parser_failed(parser); + } + else if (status != LXB_STATUS_NEXT) { + return lxb_css_parser_memory_fail(parser); + } + } + + if (!style) { + res = lxb_css_property_state_text_decoration_style_h(parser, token, + &td->style); + if (res) { + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + style = true; + } + } + + if (!color) { + res = lxb_css_property_state_color_handler(parser, token, + (lxb_css_value_color_t *) &td->color, + &status); + if (res) { + token = lxb_css_syntax_parser_token_wo_ws(parser); + lxb_css_property_state_check_token(parser, token); + + color = true; + } + else { + if (status != LXB_STATUS_OK) { + return lxb_css_parser_failed(parser); + } + } + } + } + + if (!line && !style && !color) { + return lxb_css_parser_failed(parser); + } + + return lxb_css_parser_success(parser); +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/property/types.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/property/types.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/property/types.h 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/property/types.h 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2025 Alexander Borisov + * + * Author: Alexander Borisov + */ + +/* + * Caution! + * This file generated by the script "utils/lexbor/css/names.py"! + * Do not change this file! + */ + + +#ifndef LXB_CSS_PROPERTY_TYPES_H +#define LXB_CSS_PROPERTY_TYPES_H + + + + + +#endif /* LXB_CSS_PROPERTY_TYPES_H */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/property.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/property.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/property.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/property.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,3171 @@ +/* + * Copyright (C) 2021-2023 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/css/css.h" +#include "lexbor/css/property.h" +#include "lexbor/css/parser.h" +#include "lexbor/css/stylesheet.h" +#include "lexbor/css/property/state.h" +#include "lexbor/css/property/res.h" +#include "lexbor/core/serialize.h" +#include "lexbor/core/conv.h" + + +const lxb_css_entry_data_t * +lxb_css_property_by_name(const lxb_char_t *name, size_t length) +{ + const lexbor_shs_entry_t *entry; + + entry = lexbor_shs_entry_get_lower_static(lxb_css_property_shs, + name, length); + if (entry == NULL) { + return NULL; + } + + return entry->value; +} + +const lxb_css_entry_data_t * +lxb_css_property_by_id(uintptr_t id) +{ + return &lxb_css_property_data[id]; +} + +const void * +lxb_css_property_initial_by_id(uintptr_t id) +{ + if (id >= LXB_CSS_PROPERTY__LAST_ENTRY) { + return NULL; + } + + return lxb_css_property_data[id].initial; +} + +void * +lxb_css_property_destroy(lxb_css_memory_t *memory, void *style, + lxb_css_property_type_t type, bool self_destroy) +{ + const lxb_css_entry_data_t *data; + + data = lxb_css_property_by_id(type); + if (data == NULL) { + return style; + } + + return data->destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_serialize(const void *style, lxb_css_property_type_t type, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_entry_data_t *data; + + data = lxb_css_property_by_id(type); + if (data == NULL) { + return LXB_STATUS_ERROR_NOT_EXISTS; + } + + return data->serialize(style, cb, ctx); +} + +lxb_status_t +lxb_css_property_serialize_str(const void *style, lxb_css_property_type_t type, + lexbor_mraw_t *mraw, lexbor_str_t *str) +{ + const lxb_css_entry_data_t *data; + + data = lxb_css_property_by_id(type); + if (data == NULL) { + return LXB_STATUS_ERROR_NOT_EXISTS; + } + + return lxb_css_serialize_str_handler(style, str, mraw, data->serialize); +} + +lxb_status_t +lxb_css_property_serialize_name(const void *style, lxb_css_property_type_t type, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_entry_data_t *data; + + switch (type) { + case LXB_CSS_PROPERTY__UNDEF: + return lxb_css_property__undef_serialize_name(style, cb, ctx); + + case LXB_CSS_PROPERTY__CUSTOM: + return lxb_css_property__custom_serialize_name(style, cb, ctx); + + default: + break; + } + + data = lxb_css_property_by_id(type); + if (data == NULL) { + return LXB_STATUS_ERROR_NOT_EXISTS; + } + + return cb(data->name, data->length, ctx); +} + +lxb_status_t +lxb_css_property_serialize_name_str(const void *style, lxb_css_property_type_t type, + lexbor_mraw_t *mraw, lexbor_str_t *str) +{ + const lxb_css_entry_data_t *data; + + switch (type) { + case LXB_CSS_PROPERTY__UNDEF: + return lxb_css_serialize_str_handler(style, str, mraw, + lxb_css_property__undef_serialize_name); + + case LXB_CSS_PROPERTY__CUSTOM: + return lxb_css_serialize_str_handler(style, str, mraw, + lxb_css_property__custom_serialize_name); + + default: + break; + } + + data = lxb_css_property_by_id(type); + if (data == NULL) { + return LXB_STATUS_ERROR_NOT_EXISTS; + } + + if (str->data == NULL) { + lexbor_str_init(str, mraw, data->length); + if (str->data == NULL) { + return LXB_STATUS_ERROR_MEMORY_ALLOCATION; + } + } + + (void) lexbor_str_append(str, mraw, data->name, data->length); + + return LXB_STATUS_OK; +} + +/* _undef. */ + +void * +lxb_css_property__undef_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property__undef_t)); +} + +void * +lxb_css_property__undef_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + if (style == NULL) { + return NULL; + } + + if (self_destroy) { + return lexbor_mraw_free(memory->mraw, style); + } + + return style; +} + +lxb_status_t +lxb_css_property__undef_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property__undef_t *undef = style; + + return cb(undef->value.data, undef->value.length, ctx); +} + +lxb_status_t +lxb_css_property__undef_serialize_name(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property__undef_t *undef = style; + const lxb_css_entry_data_t *data; + + if (undef->type == LXB_CSS_PROPERTY__UNDEF) { + return LXB_STATUS_OK; + } + + data = lxb_css_property_by_id(undef->type); + if (data == NULL) { + return LXB_STATUS_ERROR_NOT_EXISTS; + } + + return cb(data->name, data->length, ctx); +} + +lxb_status_t +lxb_css_property__undef_serialize_value(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property__undef_t *undef = style; + + if (undef->type == LXB_CSS_PROPERTY__UNDEF) { + return cb(undef->value.data, undef->value.length, ctx); + } + + return LXB_STATUS_OK; +} + +/* _custom. */ + +void * +lxb_css_property__custom_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property__custom_t)); +} + +void * +lxb_css_property__custom_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + if (style == NULL) { + return NULL; + } + + if (self_destroy) { + return lexbor_mraw_free(memory->mraw, style); + } + + return style; +} + +lxb_status_t +lxb_css_property__custom_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property__custom_t *custom = style; + + if (custom->value.data == NULL) { + return LXB_STATUS_OK; + } + + return cb(custom->value.data, custom->value.length, ctx); +} + +lxb_status_t +lxb_css_property__custom_serialize_name(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property__custom_t *custom = style; + + return cb(custom->name.data, custom->name.length, ctx); +} + +lxb_status_t +lxb_css_property__custom_serialize_value(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property__custom_t *custom = style; + + if (custom->value.data == NULL) { + return LXB_STATUS_OK; + } + + return cb(custom->value.data, custom->value.length, ctx); +} + +/* Display. */ + +void * +lxb_css_property_display_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_display_t)); +} + +void * +lxb_css_property_display_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_display_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + const lxb_css_data_t *data; + const lxb_css_property_display_t *display = property; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + data = lxb_css_value_by_id(display->a); + if (data == NULL) { + return LXB_STATUS_ERROR_NOT_EXISTS; + } + + lexbor_serialize_write(cb, data->name, data->length, ctx, status); + + if (display->b == LXB_CSS_PROPERTY__UNDEF) { + return LXB_STATUS_OK; + } + + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + + data = lxb_css_value_by_id(display->b); + if (data == NULL) { + return LXB_STATUS_ERROR_NOT_EXISTS; + } + + lexbor_serialize_write(cb, data->name, data->length, ctx, status); + + if (display->c == LXB_CSS_PROPERTY__UNDEF) { + return LXB_STATUS_OK; + } + + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + + data = lxb_css_value_by_id(display->c); + if (data == NULL) { + return LXB_STATUS_ERROR_NOT_EXISTS; + } + + lexbor_serialize_write(cb, data->name, data->length, ctx, status); + + return LXB_STATUS_OK; +} + +/* Order. */ + +void * +lxb_css_property_order_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_order_t)); +} + +void * +lxb_css_property_order_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_order_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_integer_type_sr(style, cb, ctx); +} + +/* Visibility. */ + +void * +lxb_css_property_visibility_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_visibility_t)); +} + +void * +lxb_css_property_visibility_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_visibility_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_visibility_t *vb = style; + + return lxb_css_value_serialize(vb->type, cb, ctx); +} + +/* Width. */ + +void * +lxb_css_property_width_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_width_t)); +} + +void * +lxb_css_property_width_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_width_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_width_t *width = property; + + switch (width->type) { + case LXB_CSS_VALUE__LENGTH: + case LXB_CSS_VALUE__NUMBER: + return lxb_css_value_length_sr(&width->u.length, cb, ctx); + + case LXB_CSS_VALUE__PERCENTAGE: + return lxb_css_value_percentage_sr(&width->u.percentage, cb, ctx); + + case LXB_CSS_VALUE__UNDEF: + /* FIXME: ???? */ + break; + + default: + return lxb_css_value_serialize(width->type, cb, ctx); + } + + return LXB_STATUS_OK; +} + +/* Height. */ + +void * +lxb_css_property_height_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_height_t)); +} + +void * +lxb_css_property_height_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_height_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_width_serialize(property, cb, ctx); +} + +/* Box-sizing. */ + +void * +lxb_css_property_box_sizing_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_box_sizing_t)); +} + +void * +lxb_css_property_box_sizing_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_box_sizing_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_box_sizing_t *bsize = property; + + return lxb_css_value_serialize(bsize->type, cb, ctx); +} + +/* Min-width. */ + +void * +lxb_css_property_min_width_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_min_width_t)); +} + +void * +lxb_css_property_min_width_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_min_width_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_width_serialize(property, cb, ctx); +} + +/* Min-height. */ + +void * +lxb_css_property_min_height_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_min_height_t)); +} + +void * +lxb_css_property_min_height_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_min_height_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_width_serialize(property, cb, ctx); +} + +/* Max-width. */ + +void * +lxb_css_property_max_width_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_max_width_t)); +} + +void * +lxb_css_property_max_width_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_max_width_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_width_serialize(property, cb, ctx); +} + +/* Max-height. */ + +void * +lxb_css_property_max_height_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_max_height_t)); +} + +void * +lxb_css_property_max_height_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_max_height_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_width_serialize(property, cb, ctx); +} + +/* Margin. */ + +void * +lxb_css_property_margin_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_margin_t)); +} + +void * +lxb_css_property_margin_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_margin_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + const lxb_css_property_margin_t *margin = property; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + /* Top. */ + + status = lxb_css_value_length_percentage_sr(&margin->top, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (margin->right.type == LXB_CSS_VALUE__UNDEF) { + return LXB_STATUS_OK; + } + + /* Right. */ + + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + + status = lxb_css_value_length_percentage_sr(&margin->right, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (margin->bottom.type == LXB_CSS_VALUE__UNDEF) { + return LXB_STATUS_OK; + } + + /* Bottom. */ + + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + + status = lxb_css_value_length_percentage_sr(&margin->bottom, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (margin->left.type == LXB_CSS_VALUE__UNDEF) { + return LXB_STATUS_OK; + } + + /* Left. */ + + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + + return lxb_css_value_length_percentage_sr(&margin->left, cb, ctx); +} + +/* Margin-top. */ + +void * +lxb_css_property_margin_top_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_margin_top_t)); +} + +void * +lxb_css_property_margin_top_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_margin_top_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_percentage_sr(property, cb, ctx); +} + +/* Margin-right. */ + +void * +lxb_css_property_margin_right_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_margin_right_t)); +} + +void * +lxb_css_property_margin_right_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_margin_right_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_percentage_sr(property, cb, ctx); +} + +/* Margin-bottom. */ + +void * +lxb_css_property_margin_bottom_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_margin_bottom_t)); +} + +void * +lxb_css_property_margin_bottom_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_margin_bottom_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_percentage_sr(property, cb, ctx); +} + +/* Margin-left. */ + +void * +lxb_css_property_margin_left_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_margin_left_t)); +} + +void * +lxb_css_property_margin_left_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_margin_left_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_percentage_sr(property, cb, ctx); +} + +/* Padding. */ + +void * +lxb_css_property_padding_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_padding_t)); +} + +void * +lxb_css_property_padding_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_padding_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_margin_serialize(property, cb, ctx); +} + +/* Padding-top. */ + +void * +lxb_css_property_padding_top_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_padding_top_t)); +} + +void * +lxb_css_property_padding_top_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_padding_top_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_percentage_sr(property, cb, ctx); +} + +/* Padding-right. */ + +void * +lxb_css_property_padding_right_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_padding_right_t)); +} + +void * +lxb_css_property_padding_right_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_padding_right_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_percentage_sr(property, cb, ctx); +} + +/* Padding-bottom. */ + +void * +lxb_css_property_padding_bottom_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_padding_bottom_t)); +} + +void * +lxb_css_property_padding_bottom_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_padding_bottom_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_percentage_sr(property, cb, ctx); +} + +/* Padding-left. */ + +void * +lxb_css_property_padding_left_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_padding_left_t)); +} + +void * +lxb_css_property_padding_left_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_padding_left_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_percentage_sr(property, cb, ctx); +} + +/* Border. */ + +void * +lxb_css_property_border_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_border_t)); +} + +void * +lxb_css_property_border_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_border_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + bool ws_print; + lxb_status_t status; + const lxb_css_property_border_t *border = property; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + ws_print = false; + + if (border->width.type != LXB_CSS_VALUE__UNDEF) { + status = lxb_css_value_length_type_sr(&border->width, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + ws_print = true; + } + + if (border->style != LXB_CSS_VALUE__UNDEF) { + if (ws_print) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + status = lxb_css_value_serialize(border->style, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + ws_print = true; + } + + if (border->color.type != LXB_CSS_VALUE__UNDEF) { + if (ws_print) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + return lxb_css_value_color_serialize(&border->color, cb, ctx); + } + + return LXB_STATUS_OK; +} + +/* Border-top. */ + +void * +lxb_css_property_border_top_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_border_top_t)); +} + +void * +lxb_css_property_border_top_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_border_top_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_border_serialize(property, cb, ctx); +} + +/* Border-right. */ + +void * +lxb_css_property_border_right_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_border_right_t)); +} + +void * +lxb_css_property_border_right_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_border_right_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_border_serialize(property, cb, ctx); +} + +/* Border-bottom. */ + +void * +lxb_css_property_border_bottom_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_border_bottom_t)); +} + +void * +lxb_css_property_border_bottom_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_border_bottom_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_border_serialize(property, cb, ctx); +} + +/* Border-left. */ + +void * +lxb_css_property_border_left_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_border_left_t)); +} + +void * +lxb_css_property_border_left_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_border_left_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_border_serialize(property, cb, ctx); +} + +void * +lxb_css_property_border_top_color_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_border_top_color_t)); +} + +void * +lxb_css_property_border_top_color_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_border_top_color_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_color_serialize(style, cb, ctx); +} + +void * +lxb_css_property_border_right_color_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_border_right_color_t)); +} + +void * +lxb_css_property_border_right_color_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_border_right_color_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_color_serialize(style, cb, ctx); +} + +void * +lxb_css_property_border_bottom_color_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_border_bottom_color_t)); +} + +void * +lxb_css_property_border_bottom_color_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_border_bottom_color_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_color_serialize(style, cb, ctx); +} + +void * +lxb_css_property_border_left_color_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_border_left_color_t)); +} + +void * +lxb_css_property_border_left_color_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_border_left_color_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_color_serialize(style, cb, ctx); +} + +void * +lxb_css_property_background_color_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_background_color_t)); +} + +void * +lxb_css_property_background_color_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_background_color_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_color_serialize(style, cb, ctx); +} + +/* Color. */ + +void * +lxb_css_property_color_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_color_t)); +} + +void * +lxb_css_property_color_destroy(lxb_css_memory_t *memory, + void *property, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, property, self_destroy); +} + +lxb_status_t +lxb_css_property_color_serialize(const void *property, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_color_serialize(property, cb, ctx); +} + +void * +lxb_css_property_opacity_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_opacity_t)); +} + +void * +lxb_css_property_opacity_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_opacity_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_number_percentage_sr(style, cb, ctx); +} + +void * +lxb_css_property_position_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_position_t)); +} + +void * +lxb_css_property_position_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_position_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_position_t *position = style; + + return lxb_css_value_serialize(position->type, cb, ctx); +} + +void * +lxb_css_property_top_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_top_t)); +} + +void * +lxb_css_property_top_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_top_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_percentage_sr(style, cb, ctx); +} + +void * +lxb_css_property_right_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_right_t)); +} + +void * +lxb_css_property_right_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_right_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_top_serialize(style, cb, ctx); +} + +void * +lxb_css_property_bottom_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_bottom_t)); +} + +void * +lxb_css_property_bottom_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_bottom_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_top_serialize(style, cb, ctx); +} + +void * +lxb_css_property_left_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_left_t)); +} + +void * +lxb_css_property_left_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_left_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_top_serialize(style, cb, ctx); +} + +void * +lxb_css_property_inset_block_start_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_inset_block_start_t)); +} + +void * +lxb_css_property_inset_block_start_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_inset_block_start_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_top_serialize(style, cb, ctx); +} + +void * +lxb_css_property_inset_inline_start_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_inset_inline_start_t)); +} + +void * +lxb_css_property_inset_inline_start_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_inset_inline_start_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_top_serialize(style, cb, ctx); +} + +void * +lxb_css_property_inset_block_end_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_inset_block_end_t)); +} + +void * +lxb_css_property_inset_block_end_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_inset_block_end_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_top_serialize(style, cb, ctx); +} + +void * +lxb_css_property_inset_inline_end_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_inset_inline_end_t)); +} + +void * +lxb_css_property_inset_inline_end_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_inset_inline_end_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_top_serialize(style, cb, ctx); +} + +/* Text-transform. */ + +LXB_API void * +lxb_css_property_text_transform_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_transform_t)); +} + +LXB_API void * +lxb_css_property_text_transform_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_transform_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + bool ws_print; + lxb_status_t status; + const lxb_css_property_text_transform_t *tt = style; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + ws_print = false; + + if (tt->type_case != LXB_CSS_VALUE__UNDEF) { + status = lxb_css_value_serialize(tt->type_case, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + ws_print = true; + } + + if (tt->full_width != LXB_CSS_VALUE__UNDEF) { + if (ws_print) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + status = lxb_css_value_serialize(tt->full_width, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + ws_print = true; + } + + if (tt->full_size_kana != LXB_CSS_VALUE__UNDEF) { + if (ws_print) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + return lxb_css_value_serialize(tt->full_size_kana, cb, ctx); + } + + return LXB_STATUS_OK; +} + +/* Text-align. */ + +LXB_API void * +lxb_css_property_text_align_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_align_t)); +} + +LXB_API void * +lxb_css_property_text_align_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_align_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_text_align_t *ta = style; + + return lxb_css_value_serialize(ta->type, cb, ctx); +} + +/* Text-align-all. */ + +LXB_API void * +lxb_css_property_text_align_all_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_align_all_t)); +} + +LXB_API void * +lxb_css_property_text_align_all_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_align_all_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_text_align_all_t *taa = style; + + return lxb_css_value_serialize(taa->type, cb, ctx); +} + +/* Text-align-last. */ + +LXB_API void * +lxb_css_property_text_align_last_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_align_last_t)); +} + +LXB_API void * +lxb_css_property_text_align_last_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_align_last_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_text_align_last_t *tal = style; + + return lxb_css_value_serialize(tal->type, cb, ctx); +} + +/* Text-justify. */ + +LXB_API void * +lxb_css_property_text_justify_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_justify_t)); +} + +LXB_API void * +lxb_css_property_text_justify_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_justify_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_text_justify_t *tj = style; + + return lxb_css_value_serialize(tj->type, cb, ctx); +} + +/* Text-indent. */ + +LXB_API void * +lxb_css_property_text_indent_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_indent_t)); +} + +LXB_API void * +lxb_css_property_text_indent_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_indent_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + const lxb_css_property_text_indent_t *ti = style; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + if (ti->type == LXB_CSS_VALUE__LENGTH) { + status = lxb_css_value_length_percentage_sr(&ti->length, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + } + else if (ti->type != LXB_CSS_VALUE__UNDEF) { + status = lxb_css_value_serialize(ti->type, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + } + + if (ti->hanging != LXB_CSS_VALUE__UNDEF) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + + status = lxb_css_value_serialize(ti->hanging, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + } + + if (ti->each_line != LXB_CSS_VALUE__UNDEF) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + + return lxb_css_value_serialize(ti->each_line, cb, ctx); + } + + return LXB_STATUS_OK; +} + +/* White-space. */ + +LXB_API void * +lxb_css_property_white_space_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_white_space_t)); +} + +LXB_API void * +lxb_css_property_white_space_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_white_space_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_white_space_t *ws = style; + + return lxb_css_value_serialize(ws->type, cb, ctx); +} + +/* Tab-size. */ + +LXB_API void * +lxb_css_property_tab_size_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_tab_size_t)); +} + +LXB_API void * +lxb_css_property_tab_size_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_tab_size_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_number_length_sr(style, cb, ctx); +} + +/* Word-break. */ + +LXB_API void * +lxb_css_property_word_break_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_word_break_t)); +} + +LXB_API void * +lxb_css_property_word_break_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_word_break_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_word_break_t *wb = style; + + return lxb_css_value_serialize(wb->type, cb, ctx); +} + +/* Line-break. */ + +LXB_API void * +lxb_css_property_line_break_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_line_break_t)); +} + +LXB_API void * +lxb_css_property_line_break_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_line_break_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_line_break_t *lb = style; + + return lxb_css_value_serialize(lb->type, cb, ctx); +} + +/* Hyphens. */ + +LXB_API void * +lxb_css_property_hyphens_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_hyphens_t)); +} + +LXB_API void * +lxb_css_property_hyphens_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_hyphens_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_hyphens_t *hpns = style; + + return lxb_css_value_serialize(hpns->type, cb, ctx); +} + +/* Overflow-wrap. */ + +LXB_API void * +lxb_css_property_overflow_wrap_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_overflow_wrap_t)); +} + +LXB_API void * +lxb_css_property_overflow_wrap_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_overflow_wrap_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_overflow_wrap_t *ow = style; + + return lxb_css_value_serialize(ow->type, cb, ctx); +} + +/* Word-wrap. */ + +LXB_API void * +lxb_css_property_word_wrap_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_word_wrap_t)); +} + +LXB_API void * +lxb_css_property_word_wrap_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_word_wrap_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_word_wrap_t *ww = style; + + return lxb_css_value_serialize(ww->type, cb, ctx); +} + +/* Word-spacing. */ + +LXB_API void * +lxb_css_property_word_spacing_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_word_spacing_t)); +} + +LXB_API void * +lxb_css_property_word_spacing_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_word_spacing_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_type_sr(style, cb, ctx); +} + +/* Letter-spacing. */ + +LXB_API void * +lxb_css_property_letter_spacing_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_letter_spacing_t)); +} + +LXB_API void * +lxb_css_property_letter_spacing_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_letter_spacing_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_type_sr(style, cb, ctx); +} + +/* Hanging-punctuation. */ + +LXB_API void * +lxb_css_property_hanging_punctuation_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_hanging_punctuation_t)); +} + +LXB_API void * +lxb_css_property_hanging_punctuation_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_hanging_punctuation_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + bool ws_print; + lxb_status_t status; + const lxb_css_property_hanging_punctuation_t *hp = style; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + ws_print = false; + + if (hp->type_first != LXB_CSS_VALUE__UNDEF) { + status = lxb_css_value_serialize(hp->type_first, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + ws_print = true; + } + + if (hp->force_allow != LXB_CSS_VALUE__UNDEF) { + if (ws_print) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + status = lxb_css_value_serialize(hp->force_allow, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + ws_print = true; + } + + if (hp->last != LXB_CSS_VALUE__UNDEF) { + if (ws_print) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + return lxb_css_value_serialize(hp->last, cb, ctx); + } + + return LXB_STATUS_OK; +} + +/* Font-family. */ + +void * +lxb_css_property_font_family_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_font_family_t)); +} + +void * +lxb_css_property_font_family_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + lxb_css_property_font_family_t *ff = style; + lxb_css_property_family_name_t *name, *next; + + name = ff->first; + + while (name != NULL) { + next = name->next; + + if (!name->generic) { + (void) lexbor_str_destroy(&name->u.str, memory->mraw, false); + } + + lexbor_mraw_free(memory->mraw, name); + + name = next; + } + + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_font_family_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + const lxb_css_property_font_family_t *ff = style; + const lxb_css_property_family_name_t *name; + + static const lexbor_str_t str_comma = lexbor_str(", "); + + name = ff->first; + + while (name != NULL) { + if (name->generic) { + status = lxb_css_value_serialize(name->u.type, cb, ctx); + } + else { + status = lxb_css_syntax_ident_or_string_serialize(name->u.str.data, + name->u.str.length, + cb, ctx); + } + + if (status != LXB_STATUS_OK) { + return status; + } + + name = name->next; + + if (name != NULL) { + lexbor_serialize_write(cb, str_comma.data, str_comma.length, + ctx, status); + } + } + + return LXB_STATUS_OK; +} + +/* Font-weight. */ + +void * +lxb_css_property_font_weight_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_font_weight_t)); +} + +void * +lxb_css_property_font_weight_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_font_weight_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_number_type_sr(style, cb, ctx); +} + +/* Font-stretch. */ + +void * +lxb_css_property_font_stretch_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_font_stretch_t)); +} + +void * +lxb_css_property_font_stretch_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_font_stretch_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_percentage_type_sr(style, cb, ctx); +} + +/* Font-style. */ + +void * +lxb_css_property_font_style_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_font_style_t)); +} + +void * +lxb_css_property_font_style_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +lxb_status_t +lxb_css_property_font_style_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + const lxb_css_property_font_style_t *fs = style; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + status = lxb_css_value_serialize(fs->type, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (fs->angle.unit != (lxb_css_unit_angle_t) LXB_CSS_UNIT__UNDEF) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + + status = lxb_css_value_angle_sr(&fs->angle, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + } + + return LXB_STATUS_OK; +} + +/* Font-size. */ + +LXB_API void * +lxb_css_property_font_size_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_font_size_t)); +} + +LXB_API void * +lxb_css_property_font_size_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_font_size_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_percentage_type_sr(style, cb, ctx); +} + +/* Float-reference. */ + +LXB_API void * +lxb_css_property_float_reference_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_float_reference_t)); +} + +LXB_API void * +lxb_css_property_float_reference_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_float_reference_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_float_reference_t *fr = style; + + return lxb_css_value_serialize(fr->type, cb, ctx); +} + +/* Float. */ + +LXB_API void * +lxb_css_property_float_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_float_t)); +} + +LXB_API void * +lxb_css_property_float_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_float_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + const lxb_css_property_float_t *flt = style; + + static const lexbor_str_t str_o = lexbor_str("("); + static const lexbor_str_t str_cm = lexbor_str(", "); + static const lexbor_str_t str_c = lexbor_str(")"); + + status = lxb_css_value_serialize(flt->type, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (flt->length.type != LXB_CSS_VALUE__LENGTH) { + return LXB_STATUS_OK; + } + + lexbor_serialize_write(cb, str_o.data, str_o.length, ctx, status); + + status = lxb_css_value_length_sr(&flt->length.length, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (flt->snap_type == LXB_CSS_VALUE__UNDEF) { + return cb(str_c.data, str_c.length, ctx); + } + + lexbor_serialize_write(cb, str_cm.data, str_cm.length, ctx, status); + + status = lxb_css_value_serialize(flt->snap_type, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + return cb(str_c.data, str_c.length, ctx); +} + +/* Clear. */ + +LXB_API void * +lxb_css_property_clear_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_clear_t)); +} + +LXB_API void * +lxb_css_property_clear_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_clear_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_clear_t *cls = style; + + return lxb_css_value_serialize(cls->type, cb, ctx); +} + +/* Float-defer. */ + +LXB_API void * +lxb_css_property_float_defer_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_float_defer_t)); +} + +LXB_API void * +lxb_css_property_float_defer_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_float_defer_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_float_defer_t *def = style; + + if (def->type == LXB_CSS_FLOAT_DEFER__INTEGER) { + return lxb_css_value_integer_sr(&def->integer, cb, ctx); + } + + return lxb_css_value_serialize(def->type, cb, ctx); +} + +/* Float-offset. */ + +LXB_API void * +lxb_css_property_float_offset_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_float_offset_t)); +} + +LXB_API void * +lxb_css_property_float_offset_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_float_offset_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_percentage_sr(style, cb, ctx); +} + +/* Wrap-flow. */ + +LXB_API void * +lxb_css_property_wrap_flow_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_wrap_flow_t)); +} + +LXB_API void * +lxb_css_property_wrap_flow_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_wrap_flow_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_wrap_flow_t *wf = style; + + return lxb_css_value_serialize(wf->type, cb, ctx); +} + +/* Wrap-through. */ + +LXB_API void * +lxb_css_property_wrap_through_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_wrap_through_t)); +} + +LXB_API void * +lxb_css_property_wrap_through_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_wrap_through_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_wrap_through_t *wt = style; + + return lxb_css_value_serialize(wt->type, cb, ctx); +} + +/* Flex-direction. */ + +LXB_API void * +lxb_css_property_flex_direction_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_flex_direction_t)); +} + +LXB_API void * +lxb_css_property_flex_direction_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_flex_direction_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_flex_direction_t *fd = style; + + return lxb_css_value_serialize(fd->type, cb, ctx); +} + +/* Flex-wrap. */ + +LXB_API void * +lxb_css_property_flex_wrap_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_flex_wrap_t)); +} + +LXB_API void * +lxb_css_property_flex_wrap_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_flex_wrap_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_flex_wrap_t *fw = style; + + return lxb_css_value_serialize(fw->type, cb, ctx); +} + +/* Flex-flow. */ + +LXB_API void * +lxb_css_property_flex_flow_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_flex_flow_t)); +} + +LXB_API void * +lxb_css_property_flex_flow_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_flex_flow_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + const lxb_css_property_flex_flow_t *ff = style; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + if (ff->type_direction != LXB_CSS_VALUE__UNDEF) { + status = lxb_css_value_serialize(ff->type_direction, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + } + + if (ff->wrap != LXB_CSS_VALUE__UNDEF) { + if (ff->type_direction != LXB_CSS_VALUE__UNDEF) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + return lxb_css_value_serialize(ff->wrap, cb, ctx); + } + + return LXB_STATUS_OK; +} + +/* Flex. */ + +LXB_API void * +lxb_css_property_flex_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_flex_t)); +} + +LXB_API void * +lxb_css_property_flex_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_flex_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + const lxb_css_property_flex_t *flex = style; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + if (flex->type != LXB_CSS_VALUE__UNDEF) { + return lxb_css_value_serialize(flex->type, cb, ctx); + } + + if (flex->grow.type != LXB_CSS_VALUE__UNDEF) { + status = lxb_css_value_number_sr(&flex->grow.number, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (flex->shrink.type != LXB_CSS_VALUE__UNDEF) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + + status = lxb_css_value_number_sr(&flex->shrink.number, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + } + } + + if (flex->basis.type == LXB_CSS_VALUE__UNDEF) { + return LXB_STATUS_OK; + } + + if (flex->grow.type != LXB_CSS_VALUE__UNDEF) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + return lxb_css_property_flex_basis_serialize(&flex->basis, cb, ctx); +} + +/* Flex-grow. */ + +LXB_API void * +lxb_css_property_flex_grow_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_flex_grow_t)); +} + +LXB_API void * +lxb_css_property_flex_grow_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_flex_grow_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_number_type_sr(style, cb, ctx); +} + +/* Flex-shrink. */ + +LXB_API void * +lxb_css_property_flex_shrink_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_flex_shrink_t)); +} + +LXB_API void * +lxb_css_property_flex_shrink_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_flex_shrink_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_number_type_sr(style, cb, ctx); +} + +/* Flex-basis. */ + +LXB_API void * +lxb_css_property_flex_basis_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_flex_basis_t)); +} + +LXB_API void * +lxb_css_property_flex_basis_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_flex_basis_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_width_serialize(style, cb, ctx); +} + +/* Justify-content. */ + +LXB_API void * +lxb_css_property_justify_content_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_justify_content_t)); +} + +LXB_API void * +lxb_css_property_justify_content_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_justify_content_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_justify_content_t *jc = style; + + return lxb_css_value_serialize(jc->type, cb, ctx); +} + +/* Align-items. */ + +LXB_API void * +lxb_css_property_align_items_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_align_items_t)); +} + +LXB_API void * +lxb_css_property_align_items_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_align_items_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_align_items_t *ai = style; + + return lxb_css_value_serialize(ai->type, cb, ctx); +} + +/* Align-self. */ + +LXB_API void * +lxb_css_property_align_self_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_align_self_t)); +} + +LXB_API void * +lxb_css_property_align_self_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_align_self_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_align_self_t *as = style; + + return lxb_css_value_serialize(as->type, cb, ctx); +} + +/* Align-content. */ + +LXB_API void * +lxb_css_property_align_content_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_align_content_t)); +} + +LXB_API void * +lxb_css_property_align_content_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_align_content_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_align_content_t *ac = style; + + return lxb_css_value_serialize(ac->type, cb, ctx); +} + +/* Dominant-baseline. */ + +LXB_API void * +lxb_css_property_dominant_baseline_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_dominant_baseline_t)); +} + +LXB_API void * +lxb_css_property_dominant_baseline_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_dominant_baseline_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_dominant_baseline_t *db = style; + + return lxb_css_value_serialize(db->type, cb, ctx); +} + +/* Vertical-align. */ + +LXB_API void * +lxb_css_property_vertical_align_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_vertical_align_t)); +} + +LXB_API void * +lxb_css_property_vertical_align_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_vertical_align_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + bool is; + lxb_status_t status; + const lxb_css_property_vertical_align_t *va = style; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + is = false; + + if (va->type != LXB_CSS_VALUE__UNDEF) { + status = lxb_css_value_serialize(va->type, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + is = true; + } + + if (va->alignment.type != LXB_CSS_VALUE__UNDEF) { + if (is) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + status = lxb_css_value_serialize(va->alignment.type, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + is = true; + } + + if (va->shift.type != LXB_CSS_VALUE__UNDEF) { + if (is) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + status = lxb_css_value_length_percentage_sr(&va->shift, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + } + + return LXB_STATUS_OK; +} + +/* Baseline-source. */ + +LXB_API void * +lxb_css_property_baseline_source_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_baseline_source_t)); +} + +LXB_API void * +lxb_css_property_baseline_source_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_baseline_source_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_baseline_source_t *bs = style; + + return lxb_css_value_serialize(bs->type, cb, ctx); +} + +/* Alignment-baseline. */ + +LXB_API void * +lxb_css_property_alignment_baseline_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_alignment_baseline_t)); +} + +LXB_API void * +lxb_css_property_alignment_baseline_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_alignment_baseline_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_alignment_baseline_t *ab = style; + + return lxb_css_value_serialize(ab->type, cb, ctx); +} + +/* Baseline-shift. */ + +LXB_API void * +lxb_css_property_baseline_shift_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_baseline_shift_t)); +} + +LXB_API void * +lxb_css_property_baseline_shift_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_baseline_shift_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_length_percentage_sr(style, cb, ctx); +} + +/* Line-height. */ + +LXB_API void * +lxb_css_property_line_height_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_line_height_t)); +} + +LXB_API void * +lxb_css_property_line_height_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_line_height_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_number_length_percentage_type_sr(style, cb, ctx); +} + +/* Z-index. */ + +LXB_API void * +lxb_css_property_z_index_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_property_z_index_t)); +} + +LXB_API void * +lxb_css_property_z_index_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_z_index_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_value_integer_type_sr(style, cb, ctx); +} + +/* Direction. */ + +LXB_API void * +lxb_css_property_direction_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_direction_t)); +} + +LXB_API void * +lxb_css_property_direction_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_direction_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_direction_t *dr = style; + + return lxb_css_value_serialize(dr->type, cb, ctx); +} + +/* Unicode-bidi. */ + +LXB_API void * +lxb_css_property_unicode_bidi_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_unicode_bidi_t)); +} + +LXB_API void * +lxb_css_property_unicode_bidi_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_unicode_bidi_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_unicode_bidi_t *ub = style; + + return lxb_css_value_serialize(ub->type, cb, ctx); +} + +/* Writing-mode. */ + +LXB_API void * +lxb_css_property_writing_mode_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_writing_mode_t)); +} + +LXB_API void * +lxb_css_property_writing_mode_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_writing_mode_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_writing_mode_t *wm = style; + + return lxb_css_value_serialize(wm->type, cb, ctx); +} + +/* Text-orientation. */ + +LXB_API void * +lxb_css_property_text_orientation_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_orientation_t)); +} + +LXB_API void * +lxb_css_property_text_orientation_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_orientation_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_text_orientation_t *to = style; + + return lxb_css_value_serialize(to->type, cb, ctx); +} + +/* Text-combine-upright. */ + +LXB_API void * +lxb_css_property_text_combine_upright_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_combine_upright_t)); +} + +LXB_API void * +lxb_css_property_text_combine_upright_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_combine_upright_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + const lxb_css_property_text_combine_upright_t *tcu = style; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + if (tcu->type == LXB_CSS_TEXT_COMBINE_UPRIGHT_DIGITS) { + status = lxb_css_value_serialize(tcu->type, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (tcu->digits.num != 0) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + + return lxb_css_value_integer_sr(&tcu->digits, cb, ctx); + } + + return LXB_STATUS_OK; + } + + return lxb_css_value_serialize(tcu->type, cb, ctx); +} + +/* Overflow-x. */ + +LXB_API void * +lxb_css_property_overflow_x_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_overflow_x_t)); +} + +LXB_API void * +lxb_css_property_overflow_x_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_overflow_x_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_overflow_x_t *ox = style; + + return lxb_css_value_serialize(ox->type, cb, ctx); +} + +/* Overflow-y. */ + +LXB_API void * +lxb_css_property_overflow_y_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_overflow_y_t)); +} + +LXB_API void * +lxb_css_property_overflow_y_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_overflow_y_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_overflow_y_t *oy = style; + + return lxb_css_value_serialize(oy->type, cb, ctx); +} + +/* Overflow-block. */ + +LXB_API void * +lxb_css_property_overflow_block_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_overflow_block_t)); +} + +LXB_API void * +lxb_css_property_overflow_block_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_overflow_block_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_overflow_block_t *ob = style; + + return lxb_css_value_serialize(ob->type, cb, ctx); +} + +/* Overflow-inline. */ + +LXB_API void * +lxb_css_property_overflow_inline_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_overflow_inline_t)); +} + +LXB_API void * +lxb_css_property_overflow_inline_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_overflow_inline_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_overflow_inline_t *oi = style; + + return lxb_css_value_serialize(oi->type, cb, ctx); +} + +/* Text-overflow. */ + +LXB_API void * +lxb_css_property_text_overflow_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_overflow_t)); +} + +LXB_API void * +lxb_css_property_text_overflow_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_overflow_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_text_overflow_t *to = style; + + return lxb_css_value_serialize(to->type, cb, ctx); +} + +/* Text-decoration-line. */ + +LXB_API void * +lxb_css_property_text_decoration_line_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_decoration_line_t)); +} + +LXB_API void * +lxb_css_property_text_decoration_line_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_decoration_line_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + bool itis; + lxb_status_t status; + const lxb_css_property_text_decoration_line_t *tdl = style; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + itis = false; + + if (tdl->underline != LXB_CSS_VALUE__UNDEF) { + status = lxb_css_value_serialize(tdl->underline, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + itis = true; + } + + if (tdl->overline != LXB_CSS_VALUE__UNDEF) { + if (itis) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + status = lxb_css_value_serialize(tdl->overline, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + itis = true; + } + + if (tdl->line_through != LXB_CSS_VALUE__UNDEF) { + if (itis) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + status = lxb_css_value_serialize(tdl->line_through, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + itis = true; + } + + if (tdl->blink != LXB_CSS_VALUE__UNDEF) { + if (itis) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + return lxb_css_value_serialize(tdl->blink, cb, ctx); + } + + if (itis) { + return LXB_STATUS_OK; + } + + return lxb_css_value_serialize(tdl->type, cb, ctx); +} + +/* Text-decoration-style. */ + +LXB_API void * +lxb_css_property_text_decoration_style_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_decoration_style_t)); +} + +LXB_API void * +lxb_css_property_text_decoration_style_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_decoration_style_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_property_text_decoration_style_t *tds = style; + + return lxb_css_value_serialize(tds->type, cb, ctx); +} + +/* Text-decoration-color. */ + +LXB_API void * +lxb_css_property_text_decoration_color_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_decoration_color_t)); +} + +LXB_API void * +lxb_css_property_text_decoration_color_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_decoration_color_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_color_serialize(style, cb, ctx); +} + +/* Text-decoration. */ + +LXB_API void * +lxb_css_property_text_decoration_create(lxb_css_memory_t *memory) +{ + return lexbor_mraw_calloc(memory->mraw, + sizeof(lxb_css_property_text_decoration_t)); +} + +LXB_API void * +lxb_css_property_text_decoration_destroy(lxb_css_memory_t *memory, + void *style, bool self_destroy) +{ + return lxb_css_property__undef_destroy(memory, style, self_destroy); +} + +LXB_API lxb_status_t +lxb_css_property_text_decoration_serialize(const void *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + bool itis; + lxb_status_t status; + const lxb_css_property_text_decoration_t *td = style; + + static const lexbor_str_t str_ws = lexbor_str(" "); + + itis = false; + + if (td->line.type != LXB_CSS_VALUE__UNDEF + || td->line.underline != LXB_CSS_VALUE__UNDEF + || td->line.overline != LXB_CSS_VALUE__UNDEF + || td->line.line_through != LXB_CSS_VALUE__UNDEF + || td->line.blink != LXB_CSS_VALUE__UNDEF) + { + status = lxb_css_property_text_decoration_line_serialize(&td->line, + cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + itis = true; + } + + if (td->style.type != LXB_CSS_VALUE__UNDEF) { + if (itis) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + status = lxb_css_property_text_decoration_style_serialize(&td->style, + cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + itis = true; + } + + if (td->color.type != LXB_CSS_VALUE__UNDEF) { + if (itis) { + lexbor_serialize_write(cb, str_ws.data, str_ws.length, ctx, status); + } + + return lxb_css_property_text_decoration_color_serialize(&td->color, + cb, ctx); + } + + return LXB_STATUS_OK; +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/rule.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/rule.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/rule.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/rule.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,598 @@ +/* + * Copyright (C) 2021-2026 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/css/rule.h" +#include "lexbor/css/parser.h" +#include "lexbor/core/serialize.h" +#include "lexbor/css/stylesheet.h" +#include "lexbor/css/selectors/selectors.h" + + +void * +lxb_css_rule_destroy(lxb_css_rule_t *rule, bool self_destroy) +{ + switch (rule->type) { + case LXB_CSS_RULE_LIST: + return lxb_css_rule_list_destroy(lxb_css_rule_list(rule), + self_destroy); + case LXB_CSS_RULE_AT_RULE: + return lxb_css_rule_at_destroy(lxb_css_rule_at(rule), + self_destroy); + case LXB_CSS_RULE_STYLE: + return lxb_css_rule_style_destroy(lxb_css_rule_style(rule), + self_destroy); + case LXB_CSS_RULE_BAD_STYLE: + return lxb_css_rule_bad_style_destroy(lxb_css_rule_bad_style(rule), + self_destroy); + case LXB_CSS_RULE_DECLARATION: + return lxb_css_rule_declaration_destroy(lxb_css_rule_declaration(rule), + self_destroy); + case LXB_CSS_RULE_DECLARATION_LIST: + return lxb_css_rule_declaration_list_destroy(lxb_css_rule_declaration_list(rule), + self_destroy); + case LXB_CSS_RULE_STYLESHEET: + case LXB_CSS_RULE_UNDEF: + return NULL; + } + + return NULL; +} + +lxb_status_t +lxb_css_rule_serialize(const lxb_css_rule_t *rule, + lexbor_serialize_cb_f cb, void *ctx) +{ + switch (rule->type) { + case LXB_CSS_RULE_LIST: + return lxb_css_rule_list_serialize(lxb_css_rule_list(rule), cb, ctx); + + case LXB_CSS_RULE_AT_RULE: + return lxb_css_rule_at_serialize(lxb_css_rule_at(rule), cb, ctx); + + case LXB_CSS_RULE_STYLE: + return lxb_css_rule_style_serialize(lxb_css_rule_style(rule), + cb, ctx); + case LXB_CSS_RULE_BAD_STYLE: + return lxb_css_rule_bad_style_serialize(lxb_css_rule_bad_style(rule), + cb, ctx); + case LXB_CSS_RULE_DECLARATION: + return lxb_css_rule_declaration_serialize(lxb_css_rule_declaration(rule), + cb, ctx); + case LXB_CSS_RULE_DECLARATION_LIST: + return lxb_css_rule_declaration_list_serialize(lxb_css_rule_declaration_list(rule), + cb, ctx); + case LXB_CSS_RULE_STYLESHEET: + case LXB_CSS_RULE_UNDEF: + break; + } + + return LXB_STATUS_ERROR_WRONG_ARGS; +} + +lxb_status_t +lxb_css_rule_serialize_chain(const lxb_css_rule_t *rule, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + + static const lxb_char_t ws_str[] = "\n"; + + status = lxb_css_rule_serialize(rule, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + rule = rule->next; + + while (rule != NULL) { + lexbor_serialize_write(cb, ws_str, (sizeof(ws_str) - 1), ctx, status); + + status = lxb_css_rule_serialize(rule, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + rule = rule->next; + } + + return LXB_STATUS_OK; +} + +lxb_css_rule_list_t * +lxb_css_rule_list_destroy(lxb_css_rule_list_t *list, bool self_destroy) +{ + lxb_css_rule_t *rule, *next, *parent; + lxb_css_rule_t *child_rule; + lxb_css_memory_t *memory; + lxb_css_rule_at_t *at; + lxb_css_rule_style_t *style; + lxb_css_rule_bad_style_t *bad; + lxb_css_rule_list_t *sub_list; + lxb_css_rule_declaration_list_t *declr_list; + + if (list == NULL) { + return NULL; + } + + rule = list->first; + memory = lxb_css_rule(list)->memory; + + while (rule != NULL) { + child_rule = NULL; + + switch (rule->type) { + case LXB_CSS_RULE_LIST: + sub_list = lxb_css_rule_list(rule); + + if (sub_list->first != NULL) { + child_rule = sub_list->first; + + sub_list->first = NULL; + sub_list->last = NULL; + } + break; + + case LXB_CSS_RULE_STYLE: + style = lxb_css_rule_style(rule); + + if (style->child != NULL) { + child_rule = lxb_css_rule(style->child); + style->child = NULL; + } + break; + + case LXB_CSS_RULE_BAD_STYLE: + bad = lxb_css_rule_bad_style(rule); + + if (bad->child != NULL) { + child_rule = lxb_css_rule(bad->child); + bad->child = NULL; + } + break; + + case LXB_CSS_RULE_AT_RULE: + at = lxb_css_rule_at(rule); + + if (at->type == LXB_CSS_AT_RULE_MEDIA) { + if (at->u.media != NULL && at->u.media->block != NULL) { + child_rule = lxb_css_rule(at->u.media->block); + at->u.media->block = NULL; + } + } + else if (at->type == LXB_CSS_AT_RULE__UNDEF) { + if (at->u.undef != NULL && at->u.undef->block != NULL) { + child_rule = lxb_css_rule(at->u.undef->block); + at->u.undef->block = NULL; + } + } + else if (at->type == LXB_CSS_AT_RULE__CUSTOM) { + if (at->u.custom != NULL && at->u.custom->block != NULL) { + child_rule = lxb_css_rule(at->u.custom->block); + at->u.custom->block = NULL; + } + } + else if (at->type == LXB_CSS_AT_RULE_FONT_FACE) { + if (at->u.font_face != NULL && at->u.font_face->block != NULL) { + child_rule = lxb_css_rule(at->u.font_face->block); + at->u.font_face->block = NULL; + } + } + break; + + case LXB_CSS_RULE_DECLARATION_LIST: + declr_list = lxb_css_rule_declaration_list(rule); + + if (declr_list->first != NULL) { + child_rule = declr_list->first; + + declr_list->first = NULL; + declr_list->last = NULL; + } + break; + + default: + break; + } + + if (child_rule != NULL) { + rule = child_rule; + continue; + } + + next = rule->next; + parent = rule->parent; + + (void) lxb_css_rule_destroy(rule, true); + + if (next != NULL) { + rule = next; + } + else { + if (parent == lxb_css_rule(list)) { + break; + } + + rule = parent; + } + } + + if (self_destroy) { + return lexbor_mraw_free(memory->tree, list); + } + + list->first = NULL; + list->last = NULL; + + return list; +} + +lxb_status_t +lxb_css_rule_list_serialize(const lxb_css_rule_list_t *list, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + lxb_css_rule_t *rule; + + static const lxb_char_t nl_str[] = "\n"; + + rule = list->first; + + if (rule == NULL) { + return LXB_STATUS_OK; + } + + status = lxb_css_rule_serialize(rule, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + rule = rule->next; + + while (rule != NULL) { + lexbor_serialize_write(cb, nl_str, (sizeof(nl_str) - 1), ctx, status); + + status = lxb_css_rule_serialize(rule, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + rule = rule->next; + } + + return LXB_STATUS_OK; +} + +lxb_css_rule_at_t * +lxb_css_rule_at_destroy(lxb_css_rule_at_t *at, bool self_destroy) +{ + lxb_css_memory_t *memory = lxb_css_rule(at)->memory; + + switch (at->type) { + case LXB_CSS_AT_RULE__UNDEF: + (void) lxb_css_at_rule__undef_destroy(memory, at->u.undef, true); + break; + + case LXB_CSS_AT_RULE_MEDIA: + (void) lxb_css_at_rule_media_destroy(memory, at->u.media, true); + break; + + case LXB_CSS_AT_RULE_NAMESPACE: + (void) lxb_css_at_rule_namespace_destroy(memory, at->u.ns, true); + break; + + case LXB_CSS_AT_RULE__LAST_ENTRY: + break; + } + + if (self_destroy) { + return lexbor_mraw_free(memory->tree, at); + } + + return at; +} + +lxb_status_t +lxb_css_rule_at_serialize(const lxb_css_rule_at_t *at, lexbor_serialize_cb_f cb, + void *ctx) +{ + lxb_status_t status; + const lxb_css_at_rule__undef_t *undef; + const lxb_css_at_rule__custom_t *custom; + const lxb_css_entry_at_rule_data_t *data, *undata; + + static const lxb_char_t at_str[] = "@"; + + data = lxb_css_at_rule_by_id(at->type); + if (data == NULL) { + return LXB_STATUS_ERROR_NOT_EXISTS; + } + + lexbor_serialize_write(cb, at_str, (sizeof(at_str) - 1), ctx, status); + + if (at->type == LXB_CSS_AT_RULE__UNDEF) { + undef = at->u.undef; + + undata = lxb_css_at_rule_by_id(undef->type); + if (undata == NULL) { + return LXB_STATUS_ERROR_NOT_EXISTS; + } + + lexbor_serialize_write(cb, undata->name, undata->length, ctx, status); + } + else if (at->type == LXB_CSS_AT_RULE__CUSTOM) { + custom = at->u.custom; + + lexbor_serialize_write(cb, custom->name.data, + custom->name.length, ctx, status); + } + else { + lexbor_serialize_write(cb, data->name, data->length, ctx, status); + } + + return data->serialize(at->u.user, cb, ctx); +} + +lxb_status_t +lxb_css_rule_at_serialize_name(const lxb_css_rule_at_t *at, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_at_rule_serialize_name(at->u.user, at->type, cb, ctx); +} + +lxb_css_rule_style_t * +lxb_css_rule_style_destroy(lxb_css_rule_style_t *style, bool self_destroy) +{ + lxb_css_memory_t *memory = lxb_css_rule(style)->memory; + + lxb_css_selector_list_destroy(style->selector); + (void) lxb_css_rule_declaration_list_destroy(style->declarations, true); + (void) lxb_css_rule_list_destroy(style->child, true); + + style->selector = NULL; + style->declarations = NULL; + style->child = NULL; + + if (self_destroy) { + return lexbor_mraw_free(memory->tree, style); + } + + return style; +} + +lxb_status_t +lxb_css_rule_style_serialize(const lxb_css_rule_style_t *style, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + + static const lxb_char_t lc_str[] = " {"; + static const lxb_char_t rc_str[] = "}"; + static const lxb_char_t cm_str[] = "; "; + + status = lxb_css_selector_serialize_list_chain(style->selector, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (style->declarations != NULL) { + lexbor_serialize_write(cb, lc_str, (sizeof(lc_str) - 1), ctx, status); + + status = lxb_css_rule_declaration_list_serialize(style->declarations, + cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (style->child == NULL) { + lexbor_serialize_write(cb, rc_str, (sizeof(rc_str) - 1), + ctx, status); + } + } + + if (style->child != NULL && style->child->first != NULL) { + lexbor_serialize_write(cb, cm_str, (sizeof(cm_str) - 1), ctx, status); + + status = lxb_css_rule_list_serialize(style->child, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + } + + if (style->declarations != NULL) { + lexbor_serialize_write(cb, rc_str, (sizeof(rc_str) - 1), ctx, status); + } + + return LXB_STATUS_OK; +} + +lxb_css_rule_bad_style_t * +lxb_css_rule_bad_style_destroy(lxb_css_rule_bad_style_t *bad, bool self_destroy) +{ + lxb_css_memory_t *memory = lxb_css_rule(bad)->memory; + + (void) lexbor_str_destroy(&bad->selectors, memory->mraw, false); + bad->declarations = lxb_css_rule_declaration_list_destroy(bad->declarations, + true); + bad->child = lxb_css_rule_list_destroy(bad->child, true); + + if (self_destroy) { + return lexbor_mraw_free(memory->tree, bad); + } + + return bad; +} + +lxb_status_t +lxb_css_rule_bad_style_serialize(const lxb_css_rule_bad_style_t *bad, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + + static const lxb_char_t lc_str[] = "{"; + static const lxb_char_t rc_str[] = "}"; + + if (bad->selectors.data != NULL) { + lexbor_serialize_write(cb, bad->selectors.data, bad->selectors.length, + ctx, status); + } + + if (bad->declarations != NULL) { + lexbor_serialize_write(cb, lc_str, (sizeof(lc_str) - 1), ctx, status); + + status = lxb_css_rule_declaration_list_serialize(bad->declarations, + cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + return cb(rc_str, (sizeof(rc_str) - 1), ctx); + } + + return LXB_STATUS_OK; +} + +lxb_css_rule_declaration_list_t * +lxb_css_rule_declaration_list_destroy(lxb_css_rule_declaration_list_t *list, + bool self_destroy) +{ + lxb_css_rule_t *declr, *next; + + if (list == NULL) { + return NULL; + } + + declr = list->first; + + while (declr != NULL) { + next = declr->next; + (void) lxb_css_rule_destroy(declr, true); + declr = next; + } + + if (self_destroy) { + return lexbor_mraw_free(lxb_css_rule(list)->memory->tree, list); + } + + list->first = NULL; + list->last = NULL; + + return list; +} + +lxb_status_t +lxb_css_rule_declaration_list_serialize(const lxb_css_rule_declaration_list_t *list, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + const lxb_css_rule_t *declr; + + static const lxb_char_t sm_str[] = "; "; + + declr = list->first; + + if (declr == NULL) { + return LXB_STATUS_OK; + } + + status = lxb_css_rule_serialize(declr, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + declr = declr->next; + + while (declr != NULL) { + lexbor_serialize_write(cb, sm_str, (sizeof(sm_str) - 1), ctx, status); + + status = lxb_css_rule_serialize(declr, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + declr = declr->next; + } + + return LXB_STATUS_OK; +} + +lxb_css_rule_declaration_t * +lxb_css_rule_declaration_destroy(lxb_css_rule_declaration_t *declr, + bool self_destroy) +{ + lxb_css_memory_t *memory = lxb_css_rule(declr)->memory; + + if (declr->u.user != NULL) { + declr->u.user = lxb_css_property_destroy(memory, declr->u.user, + declr->type, true); + } + + if (self_destroy) { + return lexbor_mraw_free(memory->tree, declr); + } + + return declr; +} + +lxb_status_t +lxb_css_rule_declaration_serialize(const lxb_css_rule_declaration_t *declaration, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + const lxb_css_entry_data_t *data, *undata; + const lxb_css_property__undef_t *undef; + const lxb_css_property__custom_t *custom; + + static const lxb_char_t cl_str[] = ": "; + static const lxb_char_t imp_str[] = " !important"; + + data = lxb_css_property_by_id(declaration->type); + if (data == NULL) { + return LXB_STATUS_ERROR_NOT_EXISTS; + } + + if (declaration->type == LXB_CSS_PROPERTY__UNDEF) { + undef = declaration->u.undef; + + if (undef->type > LXB_CSS_PROPERTY__CUSTOM) { + undata = lxb_css_property_by_id(undef->type); + if (undata == NULL) { + return LXB_STATUS_ERROR_NOT_EXISTS; + } + + lexbor_serialize_write(cb, undata->name, undata->length, ctx, status); + lexbor_serialize_write(cb, cl_str, (sizeof(cl_str) - 1), ctx, status); + } + } + else if (declaration->type == LXB_CSS_PROPERTY__CUSTOM) { + custom = declaration->u.custom; + + lexbor_serialize_write(cb, custom->name.data, custom->name.length, + ctx, status); + lexbor_serialize_write(cb, cl_str, (sizeof(cl_str) - 1), ctx, status); + } + else { + lexbor_serialize_write(cb, data->name, data->length, ctx, status); + lexbor_serialize_write(cb, cl_str, (sizeof(cl_str) - 1), ctx, status); + } + + status = data->serialize(declaration->u.user, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (declaration->important && declaration->type != LXB_CSS_PROPERTY__UNDEF) { + lexbor_serialize_write(cb, imp_str, (sizeof(imp_str) - 1), ctx, status); + } + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_rule_declaration_serialize_name(const lxb_css_rule_declaration_t *declr, + lexbor_serialize_cb_f cb, void *ctx) +{ + return lxb_css_property_serialize_name(declr->u.user, declr->type, cb, ctx); +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/rule.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/rule.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/rule.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/rule.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2023 Alexander Borisov + * Copyright (C) 2021-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -46,9 +46,6 @@ lxb_css_rule_t *prev; lxb_css_rule_t *parent; - const lxb_char_t *begin; - const lxb_char_t *end; - lxb_css_memory_t *memory; size_t ref_count; }; @@ -68,10 +65,15 @@ union { lxb_css_at_rule__undef_t *undef; lxb_css_at_rule__custom_t *custom; + lxb_css_at_rule_font_face_t *font_face; lxb_css_at_rule_media_t *media; lxb_css_at_rule_namespace_t *ns; void *user; } u; + + size_t name_begin; + size_t prelude_begin; + size_t prelude_end; }; struct lxb_css_rule_style { @@ -79,6 +81,10 @@ lxb_css_selector_list_t *selector; lxb_css_rule_declaration_list_t *declarations; + lxb_css_rule_list_t *child; + + size_t prelude_begin; + size_t prelude_end; }; struct lxb_css_rule_bad_style { @@ -86,6 +92,10 @@ lexbor_str_t selectors; lxb_css_rule_declaration_list_t *declarations; + lxb_css_rule_list_t *child; + + size_t prelude_begin; + size_t prelude_end; }; struct lxb_css_rule_declaration_list { @@ -97,6 +107,16 @@ size_t count; }; +typedef struct { + size_t name_begin; + size_t name_end; + size_t value_begin; + size_t value_end; + size_t important_begin; + size_t important_end; +} +lxb_css_rule_declaration_offset_t; + struct lxb_css_rule_declaration { lxb_css_rule_t rule; uintptr_t type; @@ -204,7 +224,9 @@ void *user; } u; - bool important; + lxb_css_rule_declaration_offset_t offset; + + bool important; }; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/base.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/base.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/base.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/base.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2024 Alexander Borisov + * Copyright (C) 2021-2025 Alexander Borisov * * Author: Alexander Borisov */ @@ -16,7 +16,7 @@ #define LXB_CSS_SELECTORS_VERSION_MAJOR 1 -#define LXB_CSS_SELECTORS_VERSION_MINOR 1 +#define LXB_CSS_SELECTORS_VERSION_MINOR 3 #define LXB_CSS_SELECTORS_VERSION_PATCH 0 #define LXB_CSS_SELECTORS_VERSION_STRING \ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/pseudo_const.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/pseudo_const.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/pseudo_const.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/pseudo_const.h 2026-05-05 16:34:12.000000000 +0000 @@ -69,15 +69,16 @@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_HAS = 0x0003, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_IS = 0x0004, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LANG = 0x0005, - LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT = 0x0006, - LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD = 0x0007, - LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL = 0x0008, - LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD = 0x0009, - LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL = 0x000a, - LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE = 0x000b, - LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE = 0x000c, - LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE = 0x000d, - LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION__LAST_ENTRY = 0x000e + LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LEXBOR_CONTAINS = 0x0006, + LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT = 0x0007, + LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD = 0x0008, + LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL = 0x0009, + LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD = 0x000a, + LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL = 0x000b, + LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE = 0x000c, + LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE = 0x000d, + LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE = 0x000e, + LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION__LAST_ENTRY = 0x000f } lxb_css_selector_pseudo_class_function_id_t; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/pseudo_res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/pseudo_res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/pseudo_res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/pseudo_res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2021 Alexander Borisov + * Copyright (C) 2020-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -68,60 +68,64 @@ { {(lxb_char_t *) "#undef", 6, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION__UNDEF, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function__undef, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false}, + {.value = lxb_css_selectors_state_pseudo_class_function__undef, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false}, {(lxb_char_t *) "current", 7, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_CURRENT, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function_current, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, true}, + {.value = lxb_css_selectors_state_pseudo_class_function_current, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, true}, {(lxb_char_t *) "dir", 3, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_DIR, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function_dir, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false}, + {.value = lxb_css_selectors_state_pseudo_class_function_dir, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false}, {(lxb_char_t *) "has", 3, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_HAS, false, LXB_CSS_SELECTOR_COMBINATOR_DESCENDANT, - {.state = lxb_css_selectors_state_pseudo_class_function_has, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_forgiving_relative}, true, true}, + {.value = lxb_css_selectors_state_pseudo_class_function_has, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_forgiving_relative}, true, true}, {(lxb_char_t *) "is", 2, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_IS, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function_is, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_forgiving}, true, true}, + {.value = lxb_css_selectors_state_pseudo_class_function_is, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_forgiving}, true, true}, {(lxb_char_t *) "lang", 4, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LANG, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function_lang, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false}, + {.value = lxb_css_selectors_state_pseudo_class_function_lang, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false}, + {(lxb_char_t *) "lexbor-contains", 15, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LEXBOR_CONTAINS, + false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, + {.value = lxb_css_selectors_state_pseudo_class_function_lexbor_contains, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false}, {(lxb_char_t *) "not", 3, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function_not, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, true}, + {.value = lxb_css_selectors_state_pseudo_class_function_not, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, true}, {(lxb_char_t *) "nth-child", 9, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function_nth_child, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, true}, + {.value = lxb_css_selectors_state_pseudo_class_function_nth_child, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, true}, {(lxb_char_t *) "nth-col", 7, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function_nth_col, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false}, + {.value = lxb_css_selectors_state_pseudo_class_function_nth_col, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false}, {(lxb_char_t *) "nth-last-child", 14, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function_nth_last_child, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, true}, + {.value = lxb_css_selectors_state_pseudo_class_function_nth_last_child, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, true}, {(lxb_char_t *) "nth-last-col", 12, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function_nth_last_col, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false}, + {.value = lxb_css_selectors_state_pseudo_class_function_nth_last_col, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false}, {(lxb_char_t *) "nth-last-of-type", 16, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function_nth_last_of_type, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false}, + {.value = lxb_css_selectors_state_pseudo_class_function_nth_last_of_type, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false}, {(lxb_char_t *) "nth-of-type", 11, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function_nth_of_type, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false}, + {.value = lxb_css_selectors_state_pseudo_class_function_nth_of_type, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false}, {(lxb_char_t *) "where", 5, LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_class_function_where, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_forgiving}, true, true} + {.value = lxb_css_selectors_state_pseudo_class_function_where, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_forgiving}, true, true} }; static const lxb_css_selectors_pseudo_data_t lxb_css_selectors_pseudo_data_pseudo_element[LXB_CSS_SELECTOR_PSEUDO_ELEMENT__LAST_ENTRY] = @@ -145,8 +149,8 @@ { {(lxb_char_t *) "#undef", 6, LXB_CSS_SELECTOR_PSEUDO_ELEMENT_FUNCTION__UNDEF, false, LXB_CSS_SELECTOR_COMBINATOR_CLOSE, - {.state = lxb_css_selectors_state_pseudo_element_function__undef, .block = NULL, - .failed = lxb_css_state_failed, .end = lxb_css_selectors_state_function_end}, false, false} + {.value = lxb_css_selectors_state_pseudo_element_function__undef, + .cb.failed = lxb_css_state_failed, .cb.end = lxb_css_selectors_state_function_end}, false, false} }; static const lexbor_shs_entry_t lxb_css_selectors_pseudo_class_shs[79] = @@ -232,46 +236,50 @@ {NULL, NULL, 0, 0} }; -static const lexbor_shs_entry_t lxb_css_selectors_pseudo_class_function_shs[39] = +static const lexbor_shs_entry_t lxb_css_selectors_pseudo_class_function_shs[43] = { - {NULL, NULL, 38, 0}, + {NULL, NULL, 42, 0}, + {"nth-last-of-type", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE], 16, 0}, {NULL, NULL, 0, 0}, - {"current", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_CURRENT], 7, 0}, {NULL, NULL, 0, 0}, - {"dir", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_DIR], 3, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, + {"not", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT], 3, 0}, {NULL, NULL, 0, 0}, - {"is", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_IS], 2, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, - {"nth-child", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD], 9, 0}, {NULL, NULL, 0, 0}, + {"has", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_HAS], 3, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, - {"nth-last-child", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD], 14, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, + {"nth-col", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL], 7, 0}, {NULL, NULL, 0, 0}, - {"where", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE], 5, 0}, + {"lexbor-contains", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LEXBOR_CONTAINS], 15, 0}, + {NULL, NULL, 0, 0}, + {"is", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_IS], 2, 0}, + {"nth-last-col", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL], 12, 0}, + {"current", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_CURRENT], 7, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, - {"nth-col", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL], 7, 0}, {"lang", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LANG], 4, 0}, - {"has", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_HAS], 3, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, - {"nth-last-col", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL], 12, 0}, - {"nth-of-type", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE], 11, 0}, + {"nth-child", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD], 9, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, - {"not", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT], 3, 0}, - {"nth-last-of-type", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE], 16, 0}, + {NULL, NULL, 0, 0}, + {"nth-last-child", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD], 14, 0}, + {"nth-of-type", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE], 11, 0}, + {NULL, NULL, 0, 0}, + {"dir", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_DIR], 3, 0}, + {"where", (void *) &lxb_css_selectors_pseudo_data_pseudo_class_function[LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE], 5, 0}, {NULL, NULL, 0, 0} }; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/pseudo_state.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/pseudo_state.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/pseudo_state.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/pseudo_state.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2022 Alexander Borisov + * Copyright (C) 2020-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -27,10 +27,9 @@ static const lxb_css_syntax_cb_components_t lxb_css_selectors_comp = { - .state = lxb_css_selectors_state_complex_list, - .block = NULL, - .failed = lxb_css_state_failed, - .end = lxb_css_selectors_state_pseudo_of_end + .prelude = lxb_css_selectors_state_complex_list, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_selectors_state_pseudo_of_end }; @@ -182,6 +181,117 @@ return true; } +bool +lxb_css_selectors_state_pseudo_class_function_lexbor_contains(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_selectors_t *selectors; + lxb_css_selector_t *selector; + lxb_css_selector_contains_t *contains; + lexbor_str_t *str; + const lxb_char_t *data; + size_t length; + + selectors = parser->selectors; + selector = selectors->list_last->last; + +again: + + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN_STRING: + data = token->types.string.data; + length = token->types.string.length; + break; + + case LXB_CSS_SYNTAX_TOKEN_IDENT: + data = token->types.ident.data; + length = token->types.ident.length; + break; + + case LXB_CSS_SYNTAX_TOKEN_WHITESPACE: + lxb_css_syntax_parser_consume(parser); + lxb_css_parser_token_status_m(parser, token); + goto again; + + default: + lxb_css_parser_unexpected_data(parser, token); + return lxb_css_parser_failed(parser); + } + + contains = lexbor_mraw_alloc(parser->memory->mraw, + sizeof(lxb_css_selector_contains_t)); + if (contains == NULL) { + return lxb_css_parser_memory_fail(parser); + } + + contains->insensitive = false; + str = &contains->str; + + str->data = lexbor_mraw_alloc(parser->memory->mraw, + sizeof(lexbor_str_t)); + if (str->data == NULL) { + return lxb_css_parser_memory_fail(parser); + } + + memcpy(str->data, data, length + 1); + + str->length = length; + str->data[length] = '\0'; + + selector->u.pseudo.data = contains; + +again_end: + + lxb_css_syntax_parser_consume(parser); + lxb_css_parser_token_status_m(parser, token); + + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN__END: + break; + + case LXB_CSS_SYNTAX_TOKEN_WHITESPACE: + goto again_end; + + case LXB_CSS_SYNTAX_TOKEN_IDENT: + data = token->types.ident.data; + length = token->types.ident.length; + + if (length == 1 && (*data == 'i' || *data == 'I')) { + contains->insensitive = true; + + lxb_css_syntax_parser_consume(parser); + lxb_css_parser_token_status_m(parser, token); + + if (token->type == LXB_CSS_SYNTAX_TOKEN_WHITESPACE) { + lxb_css_syntax_parser_consume(parser); + lxb_css_parser_token_status_m(parser, token); + } + + if (token->type != LXB_CSS_SYNTAX_TOKEN__END) { + goto failed; + } + + break; + } + /* Fall through. */ + + default: + goto failed; + } + + parser->selectors->list = NULL; + + return lxb_css_parser_success(parser); + +failed: + + lexbor_mraw_free(parser->memory->mraw, contains->str.data); + lexbor_mraw_free(parser->memory->mraw, contains); + + lxb_css_parser_unexpected_data(parser, token); + return lxb_css_parser_failed(parser); +} + static bool lxb_css_selectors_state_pseudo_anb(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, @@ -268,10 +378,14 @@ return lxb_css_parser_memory_fail(parser); } - rule = lxb_css_syntax_parser_components_push(parser, token, + rule = lxb_css_syntax_parser_components_push(parser, + &lxb_css_selectors_comp, lxb_css_selectors_state_pseudo_of_back, - &lxb_css_selectors_comp, list, - LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS); + list, LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS); +// rule = lxb_css_syntax_parser_components_push(parser, token, +// lxb_css_selectors_state_pseudo_of_back, +// &lxb_css_selectors_comp, list, +// LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS); if (rule == NULL) { lexbor_mraw_free(parser->memory->mraw, list->last->u.pseudo.data); diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/pseudo_state.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/pseudo_state.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/pseudo_state.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/pseudo_state.h 2026-05-05 16:34:12.000000000 +0000 @@ -77,6 +77,10 @@ lxb_css_selectors_state_pseudo_element_function__undef(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx); +LXB_API bool +lxb_css_selectors_state_pseudo_class_function_lexbor_contains(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx); + #ifdef __cplusplus } /* extern "C" */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/selector.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/selector.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/selector.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/selector.c 2026-05-05 16:34:12.000000000 +0000 @@ -639,10 +639,44 @@ } static lxb_status_t +lxb_css_selector_serialize_escape_write(lxb_char_t *p, lxb_char_t *end, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_char_t *begin; + lxb_status_t status; + + begin = p; + + lxb_css_selector_serialize_write("\"", 1); + + while (p < end) { + if (*p == '"') { + if (begin < p) { + lxb_css_selector_serialize_write(begin, p - begin); + } + + lxb_css_selector_serialize_write("\\000022", 7); + + begin = p + 1; + } + + p++; + } + + if (begin < p) { + lxb_css_selector_serialize_write(begin, p - begin); + } + + lxb_css_selector_serialize_write("\"", 1); + + return LXB_STATUS_OK; +} + +static lxb_status_t lxb_css_selector_serialize_attribute(lxb_css_selector_t *selector, lexbor_serialize_cb_f cb, void *ctx) { - lxb_char_t *p, *begin, *end; + lxb_char_t *p, *end; lxb_status_t status; lxb_css_selector_attribute_t *attr; @@ -686,30 +720,11 @@ p = attr->value.data; end = attr->value.data + attr->value.length; - begin = p; - - lxb_css_selector_serialize_write("\"", 1); - - while (p < end) { - if (*p == '"') { - if (begin < p) { - lxb_css_selector_serialize_write(begin, p - begin); - } - - lxb_css_selector_serialize_write("\\000022", 7); - - begin = p + 1; - } - - p++; - } - - if (begin < p) { - lxb_css_selector_serialize_write(begin, p - begin); + status = lxb_css_selector_serialize_escape_write(p, end, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; } - lxb_css_selector_serialize_write("\"", 1); - if (attr->modifier != LXB_CSS_SELECTOR_MODIFIER_UNSET) { switch (attr->modifier) { case LXB_CSS_SELECTOR_MODIFIER_I: @@ -740,7 +755,9 @@ lexbor_serialize_cb_f cb, void *ctx) { lxb_status_t status; + lxb_char_t *p, *end; lxb_css_selector_pseudo_t *pseudo; + lxb_css_selector_contains_t *contains; const lxb_css_selectors_pseudo_data_func_t *pfunc; pseudo = &selector->u.pseudo; @@ -789,6 +806,22 @@ cb, ctx); break; + case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LEXBOR_CONTAINS: + contains = pseudo->data; + p = contains->str.data; + end = p + contains->str.length; + + status = lxb_css_selector_serialize_escape_write(p, end, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (contains->insensitive) { + lxb_css_selector_serialize_write(" i", 2); + } + + break; + default: status = LXB_STATUS_OK; break; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/selector.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/selector.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/selector.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/selector.h 2026-05-05 16:34:12.000000000 +0000 @@ -80,6 +80,12 @@ } lxb_css_selector_anb_of_t; +typedef struct { + lexbor_str_t str; + bool insensitive; +} +lxb_css_selector_contains_t; + struct lxb_css_selector { lxb_css_selector_type_t type; lxb_css_selector_combinator_t combinator; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/selectors.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/selectors.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/selectors.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/selectors.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2022 Alexander Borisov + * Copyright (C) 2020-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -20,59 +20,51 @@ static const lxb_css_syntax_cb_components_t lxb_css_selectors_complex_list_cb = { - .state = lxb_css_selectors_state_complex_list, - .block = NULL, - .failed = lxb_css_state_failed, - .end = lxb_css_selectors_components_end + .prelude = lxb_css_selectors_state_complex_list, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_selectors_components_end }; static const lxb_css_syntax_cb_components_t lxb_css_selectors_compound_list_cb = { - .state = lxb_css_selectors_state_compound_list, - .block = NULL, - .failed = lxb_css_state_failed, - .end = lxb_css_selectors_components_end + .prelude = lxb_css_selectors_state_compound_list, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_selectors_components_end }; static const lxb_css_syntax_cb_components_t lxb_css_selectors_simple_list_cb = { - .state = lxb_css_selectors_state_simple_list, - .block = NULL, - .failed = lxb_css_state_failed, - .end = lxb_css_selectors_components_end + .prelude = lxb_css_selectors_state_simple_list, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_selectors_components_end }; static const lxb_css_syntax_cb_components_t lxb_css_selectors_relative_list_cb = { - .state = lxb_css_selectors_state_relative_list, - .block = NULL, - .failed = lxb_css_state_failed, - .end = lxb_css_selectors_components_end + .prelude = lxb_css_selectors_state_relative_list, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_selectors_components_end }; static const lxb_css_syntax_cb_components_t lxb_css_selectors_complex_cb = { - .state = lxb_css_selectors_state_complex, - .block = NULL, - .failed = lxb_css_state_failed, - .end = lxb_css_selectors_components_end + .prelude = lxb_css_selectors_state_complex, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_selectors_components_end }; static const lxb_css_syntax_cb_components_t lxb_css_selectors_compound_cb = { - .state = lxb_css_selectors_state_compound, - .block = NULL, - .failed = lxb_css_state_failed, - .end = lxb_css_selectors_components_end + .prelude = lxb_css_selectors_state_compound, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_selectors_components_end }; static const lxb_css_syntax_cb_components_t lxb_css_selectors_simple_cb = { - .state = lxb_css_selectors_state_simple, - .block = NULL, - .failed = lxb_css_state_failed, - .end = lxb_css_selectors_components_end + .prelude = lxb_css_selectors_state_simple, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_selectors_components_end }; static const lxb_css_syntax_cb_components_t lxb_css_selectors_relative_cb = { - .state = lxb_css_selectors_state_relative, - .block = NULL, - .failed = lxb_css_state_failed, - .end = lxb_css_selectors_components_end + .prelude = lxb_css_selectors_state_relative, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_selectors_components_end }; @@ -170,9 +162,7 @@ } static lxb_status_t -lxb_css_selectors_parse_prepare(lxb_css_parser_t *parser, - lxb_css_memory_t *memory, - lxb_css_selectors_t *selectors) +lxb_css_selectors_parse_prepare(lxb_css_parser_t *parser) { if (parser->stage != LXB_CSS_PARSER_CLEAN) { if (parser->stage == LXB_CSS_PARSER_RUN) { @@ -185,12 +175,6 @@ parser->tkz->with_comment = false; parser->stage = LXB_CSS_PARSER_RUN; - parser->old_memory = parser->memory; - parser->old_selectors = parser->selectors; - - parser->memory = memory; - parser->selectors = selectors; - return LXB_STATUS_OK; } @@ -203,8 +187,7 @@ lxb_css_parser_buffer_set(parser, data, length); - rule = lxb_css_syntax_parser_components_push(parser, NULL, NULL, - components, NULL, + rule = lxb_css_syntax_parser_components_push(parser, components, NULL, NULL, LXB_CSS_SYNTAX_TOKEN_UNDEF); if (rule == NULL) { return NULL; @@ -222,9 +205,6 @@ lxb_css_selectors_parse_finish(lxb_css_parser_t *parser) { parser->stage = LXB_CSS_PARSER_END; - - parser->memory = parser->old_memory; - parser->selectors = parser->old_selectors; } static lxb_css_selector_list_t * @@ -232,41 +212,45 @@ const lxb_css_syntax_cb_components_t *components, const lxb_char_t *data, size_t length) { - lxb_css_memory_t *memory; - lxb_css_selectors_t *selectors; + bool my_mem, my_selectors; lxb_css_selector_list_t *list; - memory = parser->memory; - selectors = parser->selectors; + my_mem = false; + my_selectors = false; - if (selectors == NULL) { - selectors = lxb_css_selectors_create(); - parser->status = lxb_css_selectors_init(selectors); + if (parser->selectors == NULL) { + parser->selectors = lxb_css_selectors_create(); + parser->status = lxb_css_selectors_init(parser->selectors); if (parser->status != LXB_STATUS_OK) { - (void) lxb_css_selectors_destroy(selectors, true); + (void) lxb_css_selectors_destroy(parser->selectors, true); return NULL; } + + my_selectors = true; } else { - lxb_css_selectors_clean(selectors); + lxb_css_selectors_clean(parser->selectors); } - if (memory == NULL) { - memory = lxb_css_memory_create(); - parser->status = lxb_css_memory_init(memory, 256); + if (parser->memory == NULL) { + parser->memory = lxb_css_memory_create(); + parser->status = lxb_css_memory_init(parser->memory, 256); if (parser->status != LXB_STATUS_OK) { - if (selectors != parser->selectors) { - (void) lxb_css_selectors_destroy(selectors, true); + if (my_selectors) { + parser->selectors = lxb_css_selectors_destroy(parser->selectors, + true); } - (void) lxb_css_memory_destroy(memory, true); + (void) lxb_css_memory_destroy(parser->memory, true); return NULL; } + + my_mem = true; } - parser->status = lxb_css_selectors_parse_prepare(parser, memory, selectors); + parser->status = lxb_css_selectors_parse_prepare(parser); if (parser->status != LXB_STATUS_OK) { list = NULL; goto end; @@ -278,12 +262,12 @@ end: - if (list == NULL && memory != parser->memory) { - (void) lxb_css_memory_destroy(memory, true); + if (list == NULL && my_mem) { + parser->memory = lxb_css_memory_destroy(parser->memory, true); } - if (selectors != parser->selectors) { - (void) lxb_css_selectors_destroy(selectors, true); + if (my_selectors) { + parser->selectors = lxb_css_selectors_destroy(parser->selectors, true); } return list; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/state.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/state.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/selectors/state.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/selectors/state.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2022 Alexander Borisov + * Copyright (C) 2020-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -1557,8 +1557,8 @@ selectors->comb_default = func->combinator; selectors->parent = selector; - rule = lxb_css_syntax_parser_function_push(parser, token, success, - &func->cb, selectors->list_last); + rule = lxb_css_syntax_consume_function(parser, token, &func->cb, + success, selectors->list_last); if (rule == NULL) { goto failed; } @@ -1663,8 +1663,8 @@ selectors->comb_default = func->combinator; selectors->parent = selector; - rule = lxb_css_syntax_parser_function_push(parser, token, success, - &func->cb, selectors->list_last); + rule = lxb_css_syntax_consume_function(parser, token, &func->cb, + success, selectors->list_last); if (rule == NULL) { (void) lxb_css_parser_memory_fail(parser); return parser->status; @@ -1711,7 +1711,7 @@ lxb_css_selectors_t *selectors = parser->selectors; if (token->type == LXB_CSS_SYNTAX_TOKEN__EOF) { - (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_ERROR, + (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_SYNTAX_ERROR, "%s. End Of File in pseudo function", lxb_css_selectors_module_name); } @@ -1737,7 +1737,7 @@ return LXB_STATUS_OK; } - (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_ERROR, + (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_SYNTAX_ERROR, "%s. Pseudo function can't be empty: %S()", lxb_css_selectors_module_name, &selector->name); @@ -1783,7 +1783,7 @@ lxb_css_parser_set_ok(parser); if (token->type == LXB_CSS_SYNTAX_TOKEN__EOF) { - (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_ERROR, + (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_SYNTAX_ERROR, "%s. End Of File in pseudo function", lxb_css_selectors_module_name); } @@ -1814,7 +1814,7 @@ return LXB_STATUS_OK; } - (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_ERROR, + (void) lxb_css_log_format(parser->log, LXB_CSS_LOG_SYNTAX_ERROR, "%s. Pseudo function can't be empty: %S()", lxb_css_selectors_module_name, &selector->name); diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/state.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/state.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/state.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/state.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 Alexander Borisov + * Copyright (C) 2021-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -9,6 +9,143 @@ #include "lexbor/css/at_rule/state.h" +static bool +lxb_css_state_list_rules_next(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx); + +static lxb_status_t +lxb_css_state_list_rules_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +static const lxb_css_syntax_cb_at_rule_t * +lxb_css_state_at_rule_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx, + void **out_rule); + +static bool +lxb_css_state_at_rule_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); + +static lxb_status_t +lxb_css_state_at_rule_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); +static bool +lxb_css_state_at_rule_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); +static lxb_status_t +lxb_css_state_at_rule_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +static const lxb_css_syntax_cb_qualified_rule_t * +lxb_css_state_qualified_rule_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); + +static bool +lxb_css_state_qualified_rule_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); + +static lxb_status_t +lxb_css_state_qualified_rule_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +static const lxb_css_syntax_cb_block_t * +lxb_css_state_qualified_rule_block_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); + +static bool +lxb_css_state_qualified_rule_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx); +static lxb_status_t +lxb_css_state_qualified_rule_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); +static bool +lxb_css_state_block_next(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx); + +static lxb_status_t +lxb_css_state_block_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +static const lxb_css_syntax_cb_declarations_t * +lxb_css_state_declarations_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); + +static lxb_css_parser_state_f +lxb_css_state_declaration_name(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); + +static lxb_status_t +lxb_css_state_declaration_end(lxb_css_parser_t *parser, + void *declarations, void *ctx, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_declaration_offset_t *offset, + bool important, bool failed); + +static lxb_status_t +lxb_css_state_declarations_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed); + +static bool +lxb_css_state_declarations_bad(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx); + + +static const lxb_css_syntax_cb_list_rules_t lxb_css_state_list_rules = { + .at_rule = lxb_css_state_at_rule_begin, + .qualified_rule = lxb_css_state_qualified_rule_begin, + .next = lxb_css_state_list_rules_next, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_state_list_rules_end +}; + +static const lxb_css_syntax_cb_at_rule_t lxb_css_state_at_rule = { + .prelude = lxb_css_state_at_rule_prelude, + .prelude_end = lxb_css_state_at_rule_prelude_end, + .block = lxb_css_state_at_rule_block_begin, + .cb.failed = lxb_css_state_at_rule_prelude_failed, + .cb.end = lxb_css_state_at_rule_end +}; + +static const lxb_css_syntax_cb_qualified_rule_t lxb_css_state_qualified_rule = { + .prelude = lxb_css_state_qualified_rule_prelude, + .prelude_end = lxb_css_state_qualified_rule_prelude_end, + .block = lxb_css_state_qualified_rule_block_begin, + .cb.failed = lxb_css_state_qualified_rule_prelude_failed, + .cb.end = lxb_css_state_qualified_rule_end +}; + +static const lxb_css_syntax_cb_block_t lxb_css_state_block = { + .at_rule = lxb_css_state_at_rule_begin, + .declarations = lxb_css_state_declarations_begin, + .qualified_rule = lxb_css_state_qualified_rule_begin, + .next = lxb_css_state_block_next, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_state_block_end, +}; + +static const lxb_css_syntax_cb_declarations_t lxb_css_state_declaration = { + .name = lxb_css_state_declaration_name, + .end = lxb_css_state_declaration_end, + .cb.failed = lxb_css_state_declarations_bad, + .cb.end = lxb_css_state_declarations_end +}; + + bool lxb_css_state_success(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx) @@ -49,3 +186,491 @@ { return lxb_css_parser_stop(parser); } + +bool +lxb_css_state_blank(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + return lxb_css_parser_success(parser); +} + +const lxb_css_syntax_cb_list_rules_t * +lxb_css_state_cb_list_rules(void) +{ + return &lxb_css_state_list_rules; +} + +const lxb_css_syntax_cb_at_rule_t * +lxb_css_state_cb_at_rule(void) +{ + return &lxb_css_state_at_rule; +} + +const lxb_css_syntax_cb_qualified_rule_t * +lxb_css_state_cb_qualified_rule(void) +{ + return &lxb_css_state_qualified_rule; +} + +const lxb_css_syntax_cb_block_t * +lxb_css_state_cb_block(void) +{ + return &lxb_css_state_block; +} + +const lxb_css_syntax_cb_declarations_t * +lxb_css_state_cb_declarations(void) +{ + return &lxb_css_state_declaration; +} + +static bool +lxb_css_state_list_rules_next(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + void *returned = lxb_css_syntax_returned(parser); + lxb_css_rule_list_t *list = ctx; + + if (returned != NULL) { + lxb_css_rule_list_append(list, returned); + } + + return lxb_css_parser_success(parser); +} + +static lxb_status_t +lxb_css_state_list_rules_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_css_rule_list_t *list = ctx; + + lxb_css_syntax_set_return(parser, list); + + return LXB_STATUS_OK; +} + +static const lxb_css_syntax_cb_at_rule_t * +lxb_css_state_at_rule_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx, + void **out_rule) +{ + lxb_css_rule_at_t *at; + const lxb_css_entry_at_rule_data_t *entry; + + at = lxb_css_at_rule_create(parser, lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length, + &entry); + if (at == NULL) { + return lxb_css_parser_memory_fail_null(parser); + } + + *out_rule = at; + + return entry->cbs; +} + +static bool +lxb_css_state_at_rule_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_rule_at_t *at = ctx; + + at->prelude_begin = token->offset; + + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +static lxb_status_t +lxb_css_state_at_rule_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_status_t status; + lxb_css_rule_at_t *at = ctx; + lxb_css_at_rule__custom_t *custom; + + at->prelude_end = token->offset; + + custom = at->u.custom; + + status = lxb_css_make_data(parser, &custom->prelude, at->prelude_begin, + at->prelude_end); + if (status != LXB_STATUS_OK) { + return lxb_css_parser_memory_fail_status(parser); + } + + return LXB_STATUS_OK; +} + +const lxb_css_syntax_cb_block_t * +lxb_css_state_at_rule_block_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + lxb_css_rule_list_t *list; + + list = lxb_css_rule_list_create(parser->memory); + if (list == NULL) { + return lxb_css_parser_memory_fail_null(parser); + } + + *out_rule = list; + + return &lxb_css_state_block; +} + +static bool +lxb_css_state_at_rule_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +static lxb_status_t +lxb_css_state_at_rule_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_css_rule_at_t *at = ctx; + lxb_css_rule_list_t *block = lxb_css_syntax_returned(parser); + + at->u.custom->block = block; + + lxb_css_syntax_set_return(parser, at); + + return LXB_STATUS_OK; +} + +static const lxb_css_syntax_cb_qualified_rule_t * +lxb_css_state_qualified_rule_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + lxb_css_rule_style_t *style; + + style = lxb_css_rule_style_create(parser->memory); + if (style == NULL) { + return lxb_css_parser_memory_fail_null(parser); + } + + *out_rule = style; + + return &lxb_css_state_qualified_rule; +} + +static bool +lxb_css_state_qualified_rule_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + lxb_css_rule_style_t *style = ctx; + + lxb_css_selectors_clean(parser->selectors); + lxb_css_parser_state_set(parser, lxb_css_selectors_state_complex_list); + + style->prelude_begin = token->offset; + + return false; +} + +static lxb_status_t +lxb_css_state_qualified_rule_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + size_t begin; + lxb_status_t status; + lxb_css_rule_style_t *style = ctx; + lxb_css_rule_bad_style_t *bad; + + if (!failed) { + style->selector = parser->selectors->list; + style->prelude_end = token->offset; + + return LXB_STATUS_OK; + } + + begin = style->prelude_begin; + + (void) lxb_css_rule_style_destroy(style, true); + + bad = lxb_css_rule_bad_style_create(parser->memory); + if (bad == NULL) { + return lxb_css_parser_memory_fail_status(parser); + } + + bad->prelude_begin = begin; + bad->prelude_end = token->offset; + + status = lxb_css_make_data(parser, &bad->selectors, bad->prelude_begin, + bad->prelude_end); + if (status != LXB_STATUS_OK) { + return lxb_css_parser_memory_fail_status(parser); + } + + lxb_css_parser_set_context(parser, bad); + + return LXB_STATUS_OK; +} + +static const lxb_css_syntax_cb_block_t * +lxb_css_state_qualified_rule_block_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + lxb_css_rule_list_t *list; + + list = lxb_css_rule_list_create(parser->memory); + if (list == NULL) { + return lxb_css_parser_memory_fail_null(parser); + } + + *out_rule = list; + + return &lxb_css_state_block; +} + +static bool +lxb_css_state_qualified_rule_prelude_failed(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx) +{ + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} + +static lxb_status_t +lxb_css_state_qualified_rule_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_css_rule_t *declrs; + lxb_css_rule_list_t *list; + lxb_css_rule_style_t *style; + lxb_css_rule_bad_style_t *bad; + + list = lxb_css_syntax_returned(parser); + + if (!failed) { + style = ctx; + + if (list != NULL && list->first != NULL + && list->first->type == LXB_CSS_RULE_DECLARATION_LIST) + { + declrs = list->first; + style->declarations = lxb_css_rule_declaration_list(declrs); + + declrs->parent = lxb_css_rule(style); + + if (list->first == list->last) { + list->last = NULL; + } + + if (declrs->next != NULL) { + declrs->next->prev = NULL; + } + + list->first = declrs->next; + declrs->next = NULL; + } + + style->child = list; + + lxb_css_syntax_set_return(parser, style); + } + else { + bad = ctx; + + if (list != NULL && list->first != NULL + && list->first->type == LXB_CSS_RULE_DECLARATION_LIST) + { + declrs = list->first; + bad->declarations = lxb_css_rule_declaration_list(declrs); + + declrs->parent = lxb_css_rule(bad); + + if (list->first == list->last) { + list->last = NULL; + } + + if (declrs->next != NULL) { + declrs->next->prev = NULL; + } + + list->first = declrs->next; + declrs->next = NULL; + } + + bad->child = list; + + lxb_css_syntax_set_return(parser, bad); + } + + return LXB_STATUS_OK; +} + +static bool +lxb_css_state_block_next(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + /* rule can be either a declaration list or an at rule. */ + + lxb_css_rule_t *rule = lxb_css_syntax_returned(parser); + lxb_css_rule_list_t *list = ctx; + + lxb_css_rule_list_append(list, rule); + + return lxb_css_parser_success(parser); +} + +static lxb_status_t +lxb_css_state_block_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_css_rule_list_t *list = ctx; + + lxb_css_syntax_set_return(parser, list); + + return LXB_STATUS_OK; +} + +static const lxb_css_syntax_cb_declarations_t * +lxb_css_state_declarations_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + lxb_css_rule_declaration_list_t *list; + + list = lxb_css_rule_declaration_list_create(parser->memory); + if (list == NULL) { + return lxb_css_parser_memory_fail_null(parser); + } + + *out_rule = list; + + return &lxb_css_state_declaration; +} + +static lxb_css_parser_state_f +lxb_css_state_declaration_name(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule) +{ + const lxb_css_entry_data_t *entry; + lxb_css_rule_declaration_t *declar; + + declar = lxb_css_declaration_create(parser, + lxb_css_syntax_token_ident(token)->data, + lxb_css_syntax_token_ident(token)->length, + &entry); + if (declar == NULL) { + (void) lxb_css_parser_memory_fail_null(parser); + return NULL; + } + + /* We present an original position. */ + + declar->offset.name_begin = token->offset; + declar->offset.name_end = token->offset + + lxb_css_syntax_token_base(token)->length; + *out_rule = declar; + + return entry->state; +} + +static lxb_status_t +lxb_css_state_declaration_end(lxb_css_parser_t *parser, + void *declarations, void *ctx, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_declaration_offset_t *offset, + bool important, bool failed) +{ + lxb_status_t status; + lxb_css_property__undef_t *undef; + lxb_css_rule_declaration_t *declar = ctx; + lxb_css_rule_declaration_list_t *list = declarations; + + declar->offset.value_begin = offset->value_begin; + declar->offset.value_end = offset->value_end; + declar->offset.important_begin = offset->important_begin; + declar->offset.important_end = offset->important_end; + declar->important = important; + + if (failed) { + lxb_css_rule_declaration_destroy(declar, false); + + undef = lxb_css_property__undef_create(parser->memory); + if (undef == NULL) { + return lxb_css_parser_memory_fail_status(parser); + } + + undef->type = declar->type; + + status = lxb_css_make_data(parser, &undef->value, + declar->offset.value_begin, + declar->offset.value_end); + if (status != LXB_STATUS_OK) { + return lxb_css_parser_memory_fail_status(parser); + } + + declar->u.undef = undef; + declar->type = LXB_CSS_PROPERTY__UNDEF; + } + + lxb_css_rule_declaration_list_append(list, lxb_css_rule(declar)); + + return LXB_STATUS_OK; +} + +static lxb_status_t +lxb_css_state_declarations_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, bool failed) +{ + lxb_css_rule_declaration_list_t *list = ctx; + + lxb_css_syntax_set_return(parser, list); + + return LXB_STATUS_OK; +} + +static bool +lxb_css_state_declarations_bad(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx) +{ + lxb_css_rule_declaration_t *declar; + + if (ctx == NULL) { + declar = lxb_css_rule_declaration_create(parser->memory); + if (declar == NULL) { + return lxb_css_parser_memory_fail(parser); + } + + lxb_css_parser_current_rule(parser)->context = declar; + declar->type = LXB_CSS_PROPERTY__UNDEF; + } + + while (token != NULL && token->type != LXB_CSS_SYNTAX_TOKEN__END) { + lxb_css_syntax_parser_consume(parser); + token = lxb_css_syntax_parser_token(parser); + } + + return lxb_css_parser_success(parser); +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/state.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/state.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/state.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/state.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 Alexander Borisov + * Copyright (C) 2021-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -12,6 +12,7 @@ #endif #include "lexbor/css/base.h" +#include "lexbor/css/syntax/syntax.h" LXB_API bool @@ -26,6 +27,30 @@ lxb_css_state_stop(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx); +LXB_API bool +lxb_css_state_blank(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, void *ctx); + +LXB_API const lxb_css_syntax_cb_list_rules_t * +lxb_css_state_cb_list_rules(void); + +LXB_API const lxb_css_syntax_cb_at_rule_t * +lxb_css_state_cb_at_rule(void); + +LXB_API const lxb_css_syntax_cb_qualified_rule_t * +lxb_css_state_cb_qualified_rule(void); + +LXB_API const lxb_css_syntax_cb_block_t * +lxb_css_state_cb_block(void); + +LXB_API const lxb_css_syntax_cb_declarations_t * +lxb_css_state_cb_declarations(void); + +const lxb_css_syntax_cb_block_t * +lxb_css_state_at_rule_block_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); + #ifdef __cplusplus } /* extern "C" */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/stylesheet.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/stylesheet.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/stylesheet.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/stylesheet.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2021-2026 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/css/css.h" +#include "lexbor/css/stylesheet.h" +#include "lexbor/css/parser.h" +#include "lexbor/css/at_rule.h" +#include "lexbor/css/property.h" +#include "lexbor/css/rule.h" +#include "lexbor/css/state.h" +#include "lexbor/css/selectors/selectors.h" +#include "lexbor/css/selectors/state.h" + + +lxb_css_stylesheet_t * +lxb_css_stylesheet_create(lxb_css_memory_t *memory) +{ + lxb_status_t status; + lxb_css_stylesheet_t *stylesheet; + + if (memory == NULL) { + memory = lxb_css_memory_create(); + status = lxb_css_memory_init(memory, 1024); + + if (status != LXB_STATUS_OK) { + (void) lxb_css_memory_destroy(memory, true); + return NULL; + } + } + else { + (void) lxb_css_memory_ref_inc(memory); + } + + stylesheet = lexbor_mraw_calloc(memory->mraw, sizeof(lxb_css_stylesheet_t)); + if (stylesheet == NULL) { + return NULL; + } + + stylesheet->memory = memory; + + return stylesheet; +} + +lxb_css_stylesheet_t * +lxb_css_stylesheet_destroy(lxb_css_stylesheet_t *sst, bool destroy_memory) +{ + if (sst == NULL) { + return NULL; + } + + if (destroy_memory) { + (void) lxb_css_memory_ref_dec_destroy(sst->memory); + return NULL; + } + + if (sst->root != NULL) { + (void) lxb_css_rule_destroy(sst->root, true); + } + + (void) lexbor_mraw_free(sst->memory->mraw, sst); + + return NULL; +} + +lxb_status_t +lxb_css_stylesheet_parse(lxb_css_stylesheet_t *sst, lxb_css_parser_t *parser, + const lxb_char_t *data, size_t length) +{ + lxb_status_t status; + lxb_css_rule_list_t *list; + lxb_css_selectors_t selectors; + + if (sst == NULL || parser == NULL) { + return LXB_STATUS_ERROR_WRONG_ARGS; + } + + if (parser->selectors == NULL) { + status = lxb_css_selectors_init(&selectors); + if (status != LXB_STATUS_OK) { + return status; + } + + parser->selectors = &selectors; + } + else { + lxb_css_selectors_clean(parser->selectors); + } + + parser->memory = sst->memory; + + list = lxb_css_syntax_parse_list_rules(parser, + lxb_css_state_cb_list_rules(), + data, length); + + if (parser->selectors == &selectors) { + parser->selectors = lxb_css_selectors_destroy(&selectors, false); + } + + if (list == NULL) { + sst->root = NULL; + return parser->status; + } + + sst->root = &list->rule; + + return LXB_STATUS_OK; +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/stylesheet.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/stylesheet.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/stylesheet.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/stylesheet.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2023 Alexander Borisov + * Copyright (C) 2020-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -25,26 +25,62 @@ void *element; /* lxb_html_style_element_t * */ }; +/* + * Create a new CSS stylesheet object. + * + * This function creates a stylesheet object which holds the parsed CSS rules. + * + * @param[in] memory Optional. A memory pool to use for allocations. + * If NULL, a new internal memory pool is created/managed + * by the stylesheet. + * + * @return A new lxb_css_stylesheet_t * or NULL on failure. + */ LXB_API lxb_css_stylesheet_t * lxb_css_stylesheet_create(lxb_css_memory_t *memory); +/* + * Destroy a CSS stylesheet object. + * + * @param[in] sst Optional. The stylesheet object to destroy. + * If NULL, the function returns NULL. + * @param[in] destroy_memory If true, the memory pool attached to + * the stylesheet is also destroyed. + * + * @return Always NULL. + */ LXB_API lxb_css_stylesheet_t * lxb_css_stylesheet_destroy(lxb_css_stylesheet_t *sst, bool destroy_memory); -LXB_API lxb_css_stylesheet_t * -lxb_css_stylesheet_parse(lxb_css_parser_t *parser, - const lxb_char_t *data, size_t length); - +/* + * Parse CSS content into the stylesheet. + * + * This function takes CSS text and builds the rule tree in the stylesheet. + * + * The function returns an error only in extremely unforeseen circumstances, + * such as the inability to allocate memory for objects. Any broken CSS will + * not cause an error. + * + * Selectors note: + * If the provided parser does not have an initialized selectors module, one + * will be created temporarily for this call. For better performance when + * parsing multiple stylesheets, initialize the selectors module in + * the parser once: + * + * lxb_css_parser_t *parser = lxb_css_parser_create(); + * lxb_css_parser_init(parser, NULL); + * lxb_css_parser_selectors_init(parser); + * + * @param[in] sst Required. The target stylesheet. + * @param[in] parser Required. An initialized CSS parser. + * @param[in] data Optional. The CSS text data. + * @param[in] length Required. Length of the data in bytes. + * + * @return LXB_STATUS_OK on success, or an error code on failure. + */ LXB_API lxb_status_t -lxb_css_stylesheet_prepare(lxb_css_parser_t *parser, lxb_css_memory_t *memory, - lxb_css_selectors_t *selectors); - -LXB_API lxb_css_stylesheet_t * -lxb_css_stylesheet_process(lxb_css_parser_t *parser, - const lxb_char_t *data, size_t length); - -LXB_API void -lxb_css_stylesheet_finish(lxb_css_parser_t *parser); +lxb_css_stylesheet_parse(lxb_css_stylesheet_t *sst, lxb_css_parser_t *parser, + const lxb_char_t *data, size_t length); #ifdef __cplusplus diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/anb.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/anb.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/anb.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/anb.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 Alexander Borisov + * Copyright (C) 2021-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -38,10 +38,9 @@ static const lxb_css_syntax_cb_pipe_t lxb_css_syntax_anb_pipe = { - .state = lxb_css_syntax_anb_state, - .block = NULL, - .failed = lxb_css_state_failed, - .end = lxb_css_syntax_anb_end + .prelude = lxb_css_syntax_anb_state, + .cb.failed = lxb_css_state_failed, + .cb.end = lxb_css_syntax_anb_end }; @@ -66,8 +65,8 @@ lxb_css_parser_buffer_set(parser, data, length); - rule = lxb_css_syntax_parser_pipe_push(parser, NULL, - &lxb_css_syntax_anb_pipe, &anb, + rule = lxb_css_syntax_parser_pipe_push(parser, &lxb_css_syntax_anb_pipe, + NULL, &anb, LXB_CSS_SYNTAX_TOKEN_UNDEF); if (rule == NULL) { return anb; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/base.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/base.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/base.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/base.h 2026-05-05 16:34:12.000000000 +0000 @@ -17,7 +17,7 @@ #define LXB_CSS_SYNTAX_VERSION_MAJOR 1 -#define LXB_CSS_SYNTAX_VERSION_MINOR 3 +#define LXB_CSS_SYNTAX_VERSION_MINOR 4 #define LXB_CSS_SYNTAX_VERSION_PATCH 0 #define LXB_CSS_SYNTAX_VERSION_STRING \ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/parser.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/parser.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/parser.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/parser.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2025 Alexander Borisov + * Copyright (C) 2020-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -11,14 +11,11 @@ #include "lexbor/css/at_rule/state.h" -static const lxb_css_syntax_token_t lxb_css_syntax_token_terminated = -{ - .types.terminated = {.begin = NULL, .length = 0, .user_id = 0}, - .type = LXB_CSS_SYNTAX_TOKEN__END, - .offset = 0, - .cloned = false -}; +static const lexbor_str_t lxb_css_err_rc = lexbor_str("Unexpected token in " + "qualified rule: RC_BRACKET"); +static lxb_css_syntax_rule_t * +lxb_css_syntax_parser_stack_pop(lxb_css_parser_t *parser); static const lxb_css_syntax_token_t * lxb_css_syntax_parser_list_rules(lxb_css_parser_t *parser, @@ -35,9 +32,18 @@ const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule); -static bool +static const lxb_css_syntax_token_t * lxb_css_syntax_parser_list_rules_back(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, void *ctx); + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_at_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule, + lxb_css_parser_state_f back_state, + lxb_css_syntax_begin_at_rule_f cb, + bool nested); static const lxb_css_syntax_token_t * lxb_css_syntax_parser_at_rule(lxb_css_parser_t *parser, @@ -45,18 +51,86 @@ lxb_css_syntax_rule_t *rule); static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_at_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_at_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_at_prelude_end_consule_token(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_at_back_to_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * lxb_css_syntax_parser_qualified_rule(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule); static const lxb_css_syntax_token_t * -lxb_css_syntax_parser_declarations(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_syntax_rule_t *rule); - -static bool -lxb_css_syntax_parser_declarations_back(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, void *ctx); +lxb_css_syntax_parser_qualified_rule_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_qualified_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_qualified_back_to_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_block_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule, + lxb_css_parser_state_f back_state, + lxb_css_syntax_begin_block_f cb); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_block_at(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_block_declarations(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_block_qualified(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_block_back(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declarations_validate(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declarations_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); static const lxb_css_syntax_token_t * lxb_css_syntax_parser_declarations_name(lxb_css_parser_t *parser, @@ -69,40 +143,77 @@ lxb_css_syntax_rule_t *rule); static const lxb_css_syntax_token_t * -lxb_css_syntax_parser_declarations_next(lxb_css_parser_t *parser, +lxb_css_syntax_parser_declarations_drop(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule); static const lxb_css_syntax_token_t * -lxb_css_syntax_parser_declarations_drop(lxb_css_parser_t *parser, +lxb_css_syntax_parser_declarations_next(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule); static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declaration_back_to_value(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declaration_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declaration_end_handler(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule, + bool skip_token); + +static const lxb_css_syntax_token_t * lxb_css_syntax_parser_declarations_end(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule); static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declarations_end_h(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule, + bool skip_token); + +static const lxb_css_syntax_token_t * lxb_css_syntax_parser_components(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule); static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_components_back_to_value(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * lxb_css_syntax_parser_function(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule); static const lxb_css_syntax_token_t * -lxb_css_syntax_parser_block(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_syntax_rule_t *rule); +lxb_css_syntax_parser_function_back(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); static const lxb_css_syntax_token_t * lxb_css_syntax_parser_pipe(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule); +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_pipe_back(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_end_back(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + lxb_inline const lxb_css_syntax_token_t * lxb_css_syntax_parser_failed(lxb_css_parser_t *parser, lxb_status_t status) @@ -111,6 +222,31 @@ return NULL; } +lxb_inline const lxb_css_syntax_token_t * +lxb_css_syntax_token_parser_do_phase_again(lxb_css_parser_t *parser) +{ + parser->fake_null = true; + return NULL; +} + +lxb_inline const lxb_css_syntax_token_t * +lxb_css_syntax_parser_call_back(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token) +{ + lxb_css_syntax_rule_t *rules; + + (void) lxb_css_syntax_parser_stack_pop(parser); + + rules = parser->rules; + + if (parser->rules <= parser->rules_begin) { + rules->state = lxb_css_state_stop; + return token; + } + + return rules->back(parser, token, rules); +} + lxb_status_t lxb_css_syntax_parser_run(lxb_css_parser_t *parser) @@ -177,369 +313,259 @@ lxb_css_syntax_rule_t * lxb_css_syntax_parser_list_rules_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, const lxb_css_syntax_cb_list_rules_t *cb_rules, - void *ctx, bool top_level, - lxb_css_syntax_token_type_t stop) + lxb_css_parser_state_f back, + void *ctx, lxb_css_syntax_token_type_t stop) { - lxb_status_t status; lxb_css_syntax_rule_t *rule; - lxb_css_parser_offset_set(parser, token); - - status = lxb_css_syntax_stack_expand(parser, 1); - if (status != LXB_STATUS_OK) { - parser->status = status; - return NULL; + if ((parser->rules + 1) >= parser->rules_end) { + parser->status = lxb_css_syntax_stack_expand(parser, 1); + if (parser->status != LXB_STATUS_OK) { + return NULL; + } } - - parser->rules->state = lxb_css_state_success; + + parser->rules->back_state = back; rule = ++parser->rules; - memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t)); - - rule->phase = lxb_css_syntax_parser_list_rules; - rule->state = cb_rules->cb.state; - rule->state_back = state_back; - rule->back = lxb_css_syntax_parser_list_rules; - rule->cbx.list_rules = cb_rules; - rule->context = ctx; - rule->block_end = stop; - rule->top_level = top_level; - - if (token != NULL) { - rule->u.list_rules.begin = token->offset; - } - - parser->context = NULL; + *rule = (lxb_css_syntax_rule_t) { + .phase = lxb_css_syntax_parser_list_rules, + .state = lxb_css_state_blank, + .back = lxb_css_syntax_parser_list_rules_back, + .cbx.list_rules = cb_rules, + .context = ctx, + .block_end = stop + }; return rule; } lxb_css_syntax_rule_t * lxb_css_syntax_parser_at_rule_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, const lxb_css_syntax_cb_at_rule_t *at_rule, - void *ctx, lxb_css_syntax_token_type_t stop) + lxb_css_parser_state_f back, void *ctx, + lxb_css_syntax_token_type_t stop, + bool nested) { - lxb_status_t status; - lxb_css_syntax_at_rule_offset_t *at; lxb_css_syntax_rule_t *rule; - lxb_css_parser_offset_set(parser, token); - - status = lxb_css_syntax_stack_expand(parser, 1); - if (status != LXB_STATUS_OK) { - parser->status = status; - return NULL; + if ((parser->rules + 1) >= parser->rules_end) { + parser->status = lxb_css_syntax_stack_expand(parser, 1); + if (parser->status != LXB_STATUS_OK) { + return NULL; + } } - parser->rules->state = lxb_css_state_success; + parser->rules->back_state = back; rule = ++parser->rules; - memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t)); - - rule->phase = lxb_css_syntax_parser_at_rule; - rule->state = at_rule->state; - rule->state_back = state_back; - rule->back = lxb_css_syntax_parser_at_rule; - rule->cbx.at_rule = at_rule; - rule->context = ctx; - rule->block_end = stop; - - if (token != NULL) { - at = &rule->u.at_rule; - - at->name = token->offset; - at->prelude = token->offset + lxb_css_syntax_token_base(token)->length; - } - - parser->context = NULL; + *rule = (lxb_css_syntax_rule_t) { + .phase = lxb_css_syntax_parser_at_rule, + .state = at_rule->prelude, + .back = lxb_css_syntax_parser_at_back_to_prelude, + .cbx.at_rule = at_rule, + .context = ctx, + .block_end = stop, + .nested = nested + }; return rule; } lxb_css_syntax_rule_t * lxb_css_syntax_parser_qualified_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, const lxb_css_syntax_cb_qualified_rule_t *qualified, - void *ctx, lxb_css_syntax_token_type_t stop) + lxb_css_parser_state_f back, void *ctx, + lxb_css_syntax_token_type_t stop, + bool nested) { - lxb_status_t status; lxb_css_syntax_rule_t *rule; - lxb_css_parser_offset_set(parser, token); - - status = lxb_css_syntax_stack_expand(parser, 1); - if (status != LXB_STATUS_OK) { - parser->status = status; - return NULL; + if ((parser->rules + 1) >= parser->rules_end) { + parser->status = lxb_css_syntax_stack_expand(parser, 1); + if (parser->status != LXB_STATUS_OK) { + return NULL; + } } - parser->rules->state = lxb_css_state_success; + parser->rules->back_state = back; rule = ++parser->rules; - memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t)); - - rule->phase = lxb_css_syntax_parser_qualified_rule; - rule->state = qualified->state; - rule->state_back = state_back; - rule->back = lxb_css_syntax_parser_qualified_rule; - rule->cbx.qualified_rule = qualified; - rule->context = ctx; - rule->block_end = stop; - - if (token != NULL) { - rule->u.qualified.prelude = token->offset; - } - - parser->context = NULL; + *rule = (lxb_css_syntax_rule_t) { + .phase = lxb_css_syntax_parser_qualified_rule, + .state = qualified->prelude, + .back = lxb_css_syntax_parser_qualified_back_to_prelude, + .cbx.qualified_rule = qualified, + .context = ctx, + .block_end = stop, + .nested = nested + }; return rule; } lxb_css_syntax_rule_t * -lxb_css_syntax_parser_declarations_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, - const lxb_css_syntax_cb_declarations_t *declarations, - void *ctx, lxb_css_syntax_token_type_t stop) +lxb_css_syntax_parser_block_push(lxb_css_parser_t *parser, + const lxb_css_syntax_cb_block_t *block, + lxb_css_parser_state_f back, void *ctx) { - lxb_status_t status; lxb_css_syntax_rule_t *rule; - lxb_css_parser_offset_set(parser, token); - - status = lxb_css_syntax_stack_expand(parser, 1); - if (status != LXB_STATUS_OK) { - parser->status = status; - return NULL; + if ((parser->rules + 1) >= parser->rules_end) { + parser->status = lxb_css_syntax_stack_expand(parser, 1); + if (parser->status != LXB_STATUS_OK) { + return NULL; + } } - parser->rules->state = lxb_css_state_success; + parser->rules->back_state = back; rule = ++parser->rules; - memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t)); - - rule->phase = lxb_css_syntax_parser_declarations; - rule->state = declarations->cb.state; - rule->state_back = state_back; - rule->back = lxb_css_syntax_parser_declarations; - rule->cbx.declarations = declarations; - rule->context = ctx; - rule->block_end = stop; - - if (token != NULL) { - rule->u.declarations.begin = token->offset; - } - - parser->context = NULL; + *rule = (lxb_css_syntax_rule_t) { + .phase = lxb_css_syntax_parser_block, + .state = lxb_css_state_blank, + .back = lxb_css_syntax_parser_block_back, + .cbx.block = block, + .context = ctx + }; return rule; } lxb_css_syntax_rule_t * -lxb_css_syntax_parser_components_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, - const lxb_css_syntax_cb_components_t *comp, - void *ctx, lxb_css_syntax_token_type_t stop) +lxb_css_syntax_parser_declarations_push(lxb_css_parser_t *parser, + const lxb_css_syntax_cb_declarations_t *declr, + lxb_css_parser_state_f back, void *ctx, + lxb_css_syntax_token_type_t stop, + bool name_validate, bool nested) { - lxb_status_t status; lxb_css_syntax_rule_t *rule; + lxb_css_syntax_state_f phase; - lxb_css_parser_offset_set(parser, token); - - status = lxb_css_syntax_stack_expand(parser, 1); - if (status != LXB_STATUS_OK) { - parser->status = status; - return NULL; + if ((parser->rules + 1) >= parser->rules_end) { + parser->status = lxb_css_syntax_stack_expand(parser, 1); + if (parser->status != LXB_STATUS_OK) { + return NULL; + } } - parser->rules->state = lxb_css_state_success; + parser->rules->back_state = back; rule = ++parser->rules; - memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t)); - - rule->phase = lxb_css_syntax_parser_components; - rule->state = comp->state; - rule->state_back = state_back; - rule->back = lxb_css_syntax_parser_components; - rule->cbx.components = comp; - rule->context = ctx; - rule->block_end = stop; + phase = (!name_validate) ? lxb_css_syntax_parser_declarations_begin + : lxb_css_syntax_parser_declarations_validate; - parser->context = NULL; + *rule = (lxb_css_syntax_rule_t) { + .phase = phase, + .state = lxb_css_state_blank, + .back = lxb_css_syntax_parser_declaration_back_to_value, + .cbx.declarations = declr, + .context = ctx, + .block_end = stop, + .nested = nested + }; return rule; } lxb_css_syntax_rule_t * -lxb_css_syntax_parser_function_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, - const lxb_css_syntax_cb_function_t *func, - void *ctx) +lxb_css_syntax_parser_components_push(lxb_css_parser_t *parser, + const lxb_css_syntax_cb_components_t *comp, + lxb_css_parser_state_f back, void *ctx, + lxb_css_syntax_token_type_t stop) { - lxb_status_t status; lxb_css_syntax_rule_t *rule; - if (token == NULL || token->type != LXB_CSS_SYNTAX_TOKEN_FUNCTION) { - parser->status = LXB_STATUS_ERROR_WRONG_ARGS; - return NULL; - } - - if (parser->rules > parser->rules_begin) { - rule = parser->rules; - - if (rule->deep != 0 - && parser->types_pos[-1] == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) - { - rule->deep--; - parser->types_pos--; + if ((parser->rules + 1) >= parser->rules_end) { + parser->status = lxb_css_syntax_stack_expand(parser, 1); + if (parser->status != LXB_STATUS_OK) { + return NULL; } } - parser->rules->state = lxb_css_state_success; - - lxb_css_parser_offset_set(parser, token); - - status = lxb_css_syntax_stack_expand(parser, 1); - if (status != LXB_STATUS_OK) { - parser->status = status; - return NULL; - } + parser->rules->back_state = back; rule = ++parser->rules; - memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t)); - - rule->phase = lxb_css_syntax_parser_function; - rule->state = func->state; - rule->state_back = state_back; - rule->back = lxb_css_syntax_parser_function; - rule->cbx.func = func; - rule->context = ctx; - - parser->context = NULL; + *rule = (lxb_css_syntax_rule_t) { + .phase = lxb_css_syntax_parser_components, + .state = comp->prelude, + .back = lxb_css_syntax_parser_components_back_to_value, + .cbx.components = comp, + .context = ctx, + .block_end = stop + }; return rule; } lxb_css_syntax_rule_t * -lxb_css_syntax_parser_block_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, - const lxb_css_syntax_cb_block_t *block, - void *ctx) +lxb_css_syntax_parser_function_push(lxb_css_parser_t *parser, + const lxb_css_syntax_cb_function_t *func, + lxb_css_parser_state_f back, void *ctx) { - lxb_status_t status; lxb_css_syntax_rule_t *rule; - lxb_css_syntax_token_type_t block_end; - - if (token == NULL) { - parser->status = LXB_STATUS_ERROR_WRONG_ARGS; - return NULL; - } - - switch (token->type) { - case LXB_CSS_SYNTAX_TOKEN_LS_BRACKET: - block_end = LXB_CSS_SYNTAX_TOKEN_RS_BRACKET; - break; - case LXB_CSS_SYNTAX_TOKEN_FUNCTION: - case LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS: - block_end = LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS; - break; - - case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET: - block_end = LXB_CSS_SYNTAX_TOKEN_RC_BRACKET; - break; - - default: - parser->status = LXB_STATUS_ERROR_WRONG_ARGS; + if ((parser->rules + 1) >= parser->rules_end) { + parser->status = lxb_css_syntax_stack_expand(parser, 1); + if (parser->status != LXB_STATUS_OK) { return NULL; - } - - if (parser->rules > parser->rules_begin) { - rule = parser->rules; - - if (rule->deep != 0 && parser->types_pos[-1] == block_end) { - rule->deep--; - parser->types_pos--; } } - parser->rules->state = lxb_css_state_success; - - lxb_css_parser_offset_set(parser, token); - - status = lxb_css_syntax_stack_expand(parser, 1); - if (status != LXB_STATUS_OK) { - parser->status = status; - return NULL; - } + parser->rules->back_state = back; rule = ++parser->rules; - memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t)); - - rule->phase = lxb_css_syntax_parser_block; - rule->state = block->state; - rule->state_back = state_back; - rule->back = lxb_css_syntax_parser_block; - rule->cbx.block = block; - rule->context = ctx; - rule->block_end = block_end; - - parser->context = NULL; + *rule = (lxb_css_syntax_rule_t) { + .phase = lxb_css_syntax_parser_function, + .state = func->value, + .back = lxb_css_syntax_parser_function_back, + .cbx.func = func, + .context = ctx + }; return rule; } lxb_css_syntax_rule_t * lxb_css_syntax_parser_pipe_push(lxb_css_parser_t *parser, - lxb_css_parser_state_f state_back, const lxb_css_syntax_cb_pipe_t *pipe, - void *ctx, lxb_css_syntax_token_type_t stop) + lxb_css_parser_state_f back, void *ctx, + lxb_css_syntax_token_type_t stop) { - lxb_status_t status; lxb_css_syntax_rule_t *rule; - status = lxb_css_syntax_stack_expand(parser, 1); - if (status != LXB_STATUS_OK) { - parser->status = status; - return NULL; + if ((parser->rules + 1) >= parser->rules_end) { + parser->status = lxb_css_syntax_stack_expand(parser, 1); + if (parser->status != LXB_STATUS_OK) { + return NULL; + } } - parser->rules->state = lxb_css_state_success; + parser->rules->back_state = back; rule = ++parser->rules; - memset(rule, 0x00, sizeof(lxb_css_syntax_rule_t)); - - rule->phase = lxb_css_syntax_parser_pipe; - rule->state = pipe->state; - rule->state_back = state_back; - rule->back = lxb_css_syntax_parser_pipe; - rule->cbx.pipe = pipe; - rule->context = ctx; - rule->block_end = stop; - - parser->context = NULL; + *rule = (lxb_css_syntax_rule_t) { + .phase = lxb_css_syntax_parser_pipe, + .state = pipe->prelude, + .back = lxb_css_syntax_parser_pipe_back, + .cbx.pipe = pipe, + .context = ctx, + .block_end = stop + }; return rule; } -lxb_css_syntax_rule_t * +static lxb_css_syntax_rule_t * lxb_css_syntax_parser_stack_pop(lxb_css_parser_t *parser) { return parser->rules--; @@ -554,12 +580,16 @@ return token; } + rule->skip_consume = true; + begin: rule->offset = token->offset + lxb_css_syntax_token_base(token)->length; switch (token->type) { case LXB_CSS_SYNTAX_TOKEN_WHITESPACE: + case LXB_CSS_SYNTAX_TOKEN_CDC: + case LXB_CSS_SYNTAX_TOKEN_CDO: lxb_css_syntax_token_consume(parser->tkz); token = lxb_css_syntax_token(parser->tkz); @@ -577,22 +607,6 @@ case LXB_CSS_SYNTAX_TOKEN__EOF: goto done; - case LXB_CSS_SYNTAX_TOKEN_CDC: - case LXB_CSS_SYNTAX_TOKEN_CDO: - if (rule->top_level) { - lxb_css_syntax_token_consume(parser->tkz); - - token = lxb_css_syntax_token(parser->tkz); - if (token == NULL) { - return lxb_css_syntax_parser_failed(parser, - parser->tkz->status); - } - - goto begin; - } - - /* fall through */ - default: if (rule->block_end == token->type && rule->deep == 0) { goto done; @@ -607,79 +621,136 @@ done: rule->phase = lxb_css_syntax_parser_end; - rule->skip_consume = true; - rule->u.list_rules.end = token->offset; - - return &lxb_css_syntax_token_terminated; + return lxb_css_parser_token_end(parser, 0); } +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ static const lxb_css_syntax_token_t * lxb_css_syntax_parser_list_rules_at(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule) { - if (rule->state != lxb_css_state_success) { - return token; - } - - rule = lxb_css_syntax_parser_at_rule_push(parser, token, - lxb_css_syntax_parser_list_rules_back, - rule->cbx.list_rules->at_rule, - rule->context, rule->block_end); - if (rule == NULL) { - return NULL; - } - - parser->fake_null = true; + const lxb_css_syntax_cb_list_rules_t *list_rules = rule->cbx.list_rules; - return NULL; + return lxb_css_syntax_parser_at_begin(parser, token, rule, list_rules->next, + list_rules->at_rule, false); } +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ static const lxb_css_syntax_token_t * lxb_css_syntax_parser_list_rules_qualified(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule) { - if (rule->state != lxb_css_state_success) { - return token; - } + void *qualified_ctx; + lxb_css_syntax_rule_t *qualified; + lxb_css_syntax_begin_qualified_rule_f cb; + const lxb_css_syntax_cb_list_rules_t *list_rules; + const lxb_css_syntax_cb_qualified_rule_t *cb_qualified; + + qualified_ctx = NULL; + list_rules = rule->cbx.list_rules; + cb = list_rules->qualified_rule; - rule = lxb_css_syntax_parser_qualified_push(parser, token, - lxb_css_syntax_parser_list_rules_back, - rule->cbx.list_rules->qualified_rule, - rule->context, rule->block_end); - if (rule == NULL) { - return NULL; - } + rule->skip_consume = false; - parser->fake_null = true; + cb_qualified = cb(parser, token, rule->context, &qualified_ctx); + if (cb_qualified == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_UNEXPECTED_DATA); + } + + qualified = lxb_css_syntax_parser_qualified_push(parser, cb_qualified, + list_rules->next, + qualified_ctx, + rule->block_end, + false); + if (qualified == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_MEMORY_ALLOCATION); + } - return NULL; + return lxb_css_syntax_token_parser_do_phase_again(parser); } -static bool +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * lxb_css_syntax_parser_list_rules_back(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, void *ctx) + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) { - lxb_css_syntax_rule_t *rule; + rule->phase = lxb_css_syntax_parser_list_rules; + rule->state = rule->back_state; + rule->skip_consume = true; + + return token; +} + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_at_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule, + lxb_css_parser_state_f back_state, + lxb_css_syntax_begin_at_rule_f cb, + bool nested) +{ + void *at_rule_ctx; + lxb_css_syntax_rule_t *at_rule; + const lxb_css_syntax_cb_at_rule_t *cb_at_rule; + + at_rule_ctx = NULL; + rule->skip_consume = false; + + cb_at_rule = cb(parser, token, rule->context, &at_rule_ctx); + if (cb_at_rule == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_UNEXPECTED_DATA); + } + + at_rule = lxb_css_syntax_parser_at_rule_push(parser, cb_at_rule, + back_state, at_rule_ctx, + rule->block_end, nested); + if (at_rule == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_MEMORY_ALLOCATION); + } - if (token->type == LXB_CSS_SYNTAX_TOKEN__END) { - return lxb_css_parser_success(parser); + lxb_css_syntax_token_consume(parser->tkz); + + token = lxb_css_syntax_token(parser->tkz); + if (token == NULL) { + return lxb_css_syntax_parser_failed(parser, parser->tkz->status); } - rule = parser->rules; - rule->state = rule->cbx.list_rules->next; + if (token->type == LXB_CSS_SYNTAX_TOKEN_WHITESPACE) { + lxb_css_syntax_token_consume(parser->tkz); + } - return false; + return lxb_css_syntax_token_parser_do_phase_again(parser); } +/* + * First call for this code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + * Rule -- lxb_css_syntax_rule_t with at_rule callbacks. + */ static const lxb_css_syntax_token_t * lxb_css_syntax_parser_at_rule(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule) { lxb_status_t status; + const lxb_css_log_message_t *msg; if (rule->offset > token->offset) { return token; @@ -688,7 +759,7 @@ rule->offset = token->offset + lxb_css_syntax_token_base(token)->length; if (rule->block_end == token->type && rule->deep == 0) { - rule->skip_ending = true; + rule->phase = lxb_css_syntax_parser_at_prelude_end; goto done; } @@ -706,25 +777,11 @@ case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET: if (rule->deep == 0) { - rule->phase = lxb_css_syntax_parser_start_block; - - rule->u.at_rule.prelude_end = token->offset; - rule->u.at_rule.block = token->offset - + lxb_css_syntax_token_base(token)->length; - + rule->phase = lxb_css_syntax_parser_at_block; + rule->back = lxb_css_syntax_parser_end_back; rule->skip_consume = true; - parser->block = rule->cbx.cb->block; - - lxb_css_syntax_token_consume(parser->tkz); - - token = lxb_css_syntax_token(parser->tkz); - if (token == NULL) { - return lxb_css_syntax_parser_failed(parser, - parser->tkz->status); - } - - token = &lxb_css_syntax_token_terminated; + return lxb_css_parser_token_end(parser, token->offset); } status = lxb_css_parser_types_push(parser, @@ -732,13 +789,25 @@ break; case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET: - if (rule->deep != 0 && parser->types_pos[-1] == token->type) { - if (rule->deep == 1) { - goto done; + if (rule->deep != 0) { + if (parser->types_pos[-1] == token->type) { + parser->types_pos--; + rule->deep--; + } + } + else { + msg = lxb_css_log_format(parser->log, + LXB_CSS_LOG_SYNTAX_ERROR, + "%S", &lxb_css_err_rc); + if (msg == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_MEMORY_ALLOCATION); } - parser->types_pos--; - rule->deep--; + if (rule->nested) { + rule->phase = lxb_css_syntax_parser_at_prelude_end; + goto done; + } } return token; @@ -754,12 +823,14 @@ case LXB_CSS_SYNTAX_TOKEN_SEMICOLON: if (rule->deep == 0) { + rule->phase = lxb_css_syntax_parser_at_prelude_end_consule_token; goto done; } return token; case LXB_CSS_SYNTAX_TOKEN__EOF: + rule->phase = lxb_css_syntax_parser_at_prelude_end; goto done; default: @@ -776,17 +847,91 @@ done: - rule->phase = lxb_css_syntax_parser_end; rule->skip_consume = true; - if (rule->u.at_rule.prelude_end != 0) { - rule->u.at_rule.block_end = token->offset; + return lxb_css_parser_token_end(parser, token->offset); +} + +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_at_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + lxb_status_t status; + const lxb_css_syntax_cb_at_rule_t *at_rule = rule->cbx.at_rule; + + status = at_rule->prelude_end(parser, token, rule->context, rule->failed); + if (status != LXB_STATUS_OK) { + return lxb_css_syntax_parser_failed(parser, status); } - else { - rule->u.at_rule.prelude_end = token->offset; + + return lxb_css_syntax_parser_block_begin(parser, token, rule, + at_rule->prelude, at_rule->block); +} + +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_at_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + lxb_status_t status; + const lxb_css_syntax_cb_at_rule_t *at_rule = rule->cbx.at_rule; + + rule->phase = lxb_css_syntax_parser_end; + rule->state = lxb_css_state_success; + + status = at_rule->prelude_end(parser, token, rule->context, rule->failed); + if (status != LXB_STATUS_OK) { + return lxb_css_syntax_parser_failed(parser, status); } - return &lxb_css_syntax_token_terminated; + return lxb_css_syntax_token_parser_do_phase_again(parser); +} + +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_at_prelude_end_consule_token(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + lxb_status_t status; + const lxb_css_syntax_cb_at_rule_t *at_rule = rule->cbx.at_rule; + + rule->phase = lxb_css_syntax_parser_end_consume_token; + + status = at_rule->prelude_end(parser, token, rule->context, rule->failed); + if (status != LXB_STATUS_OK) { + return lxb_css_syntax_parser_failed(parser, status); + } + + return lxb_css_syntax_token_parser_do_phase_again(parser); +} + +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_at_back_to_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + rule->phase = lxb_css_syntax_parser_at_rule; + rule->state = rule->back_state; + rule->skip_consume = false; + + return token; } static const lxb_css_syntax_token_t * @@ -795,8 +940,7 @@ lxb_css_syntax_rule_t *rule) { lxb_status_t status; - - /* It is necessary to avoid re-entry of the token into the phase. */ + const lxb_css_log_message_t *msg; if (rule->offset > token->offset) { return token; @@ -805,7 +949,6 @@ rule->offset = token->offset + lxb_css_syntax_token_base(token)->length; if (rule->block_end == token->type && rule->deep == 0) { - rule->skip_ending = true; goto done; } @@ -823,25 +966,11 @@ case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET: if (rule->deep == 0) { - rule->phase = lxb_css_syntax_parser_start_block; - - rule->u.qualified.prelude_end = token->offset; - rule->u.qualified.block = token->offset - + lxb_css_syntax_token_base(token)->length; - + rule->phase = lxb_css_syntax_parser_qualified_rule_block; + rule->back = lxb_css_syntax_parser_end_back; rule->skip_consume = true; - parser->block = rule->cbx.cb->block; - - lxb_css_syntax_token_consume(parser->tkz); - - token = lxb_css_syntax_token(parser->tkz); - if (token == NULL) { - return lxb_css_syntax_parser_failed(parser, - parser->tkz->status); - } - - token = &lxb_css_syntax_token_terminated; + return lxb_css_parser_token_end(parser, token->offset); } status = lxb_css_parser_types_push(parser, @@ -849,13 +978,24 @@ break; case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET: - if (rule->deep != 0 && parser->types_pos[-1] == token->type) { - if (rule->deep == 1) { - goto done; + if (rule->deep != 0) { + if (parser->types_pos[-1] == token->type) { + parser->types_pos--; + rule->deep--; + } + } + else { + msg = lxb_css_log_format(parser->log, + LXB_CSS_LOG_SYNTAX_ERROR, + "%S", &lxb_css_err_rc); + if (msg == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_MEMORY_ALLOCATION); } - parser->types_pos--; - rule->deep--; + if (rule->nested) { + goto done; + } } return token; @@ -868,7 +1008,7 @@ } return token; - + case LXB_CSS_SYNTAX_TOKEN__EOF: goto done; @@ -886,23 +1026,113 @@ done: - rule->phase = lxb_css_syntax_parser_end; + rule->phase = lxb_css_syntax_parser_qualified_prelude_end; rule->skip_consume = true; - if (rule->u.qualified.block != 0) { - rule->u.qualified.block_end = token->offset; + return lxb_css_parser_token_end(parser, token->offset); +} + +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_qualified_rule_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + const lxb_css_syntax_cb_qualified_rule_t *qualified_rule; + + qualified_rule = rule->cbx.qualified_rule; + + parser->status = qualified_rule->prelude_end(parser, token, + rule->context, rule->failed); + if (parser->status != LXB_STATUS_OK) { + return NULL; + } + + return lxb_css_syntax_parser_block_begin(parser, token, rule, + qualified_rule->prelude, + qualified_rule->block); +} + +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_qualified_prelude_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + const lxb_css_syntax_cb_qualified_rule_t *qualified_rule; + + qualified_rule = rule->cbx.qualified_rule; + + parser->status = qualified_rule->prelude_end(parser, token, + rule->context, rule->failed); + if (parser->status != LXB_STATUS_OK) { + return NULL; + } + + rule->phase = lxb_css_syntax_parser_end; + rule->state = lxb_css_state_success; + + return lxb_css_syntax_token_parser_do_phase_again(parser); +} + +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_qualified_back_to_prelude(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + rule->phase = lxb_css_syntax_parser_qualified_rule; + rule->state = rule->back_state; + rule->skip_consume = false; + + return token; +} + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_block_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule, + lxb_css_parser_state_f back_state, + lxb_css_syntax_begin_block_f cb) +{ + void *block_ctx; + lxb_css_syntax_rule_t *block; + const lxb_css_syntax_cb_block_t *cb_block; + + block_ctx = NULL; + rule->skip_consume = false; + + cb_block = cb(parser, token, rule->context, &block_ctx); + if (cb_block == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_UNEXPECTED_DATA); } - else { - rule->u.qualified.prelude_end = token->offset; + + block = lxb_css_syntax_parser_block_push(parser, cb_block, back_state, + block_ctx); + if (block == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_MEMORY_ALLOCATION); } - return &lxb_css_syntax_token_terminated; + lxb_css_syntax_token_consume(parser->tkz); + + return lxb_css_syntax_token_parser_do_phase_again(parser); } static const lxb_css_syntax_token_t * -lxb_css_syntax_parser_declarations(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_syntax_rule_t *rule) +lxb_css_syntax_parser_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) { if (rule->offset > token->offset) { return token; @@ -912,11 +1142,6 @@ rule->offset = token->offset + lxb_css_syntax_token_base(token)->length; - if (rule->block_end == token->type && rule->deep == 0) { - rule->skip_ending = true; - goto done; - } - switch (token->type) { case LXB_CSS_SYNTAX_TOKEN_SEMICOLON: case LXB_CSS_SYNTAX_TOKEN_WHITESPACE: @@ -930,93 +1155,221 @@ goto begin; - case LXB_CSS_SYNTAX_TOKEN_IDENT: - rule->u.declarations.name_begin = token->offset; - - if (lxb_css_syntax_tokenizer_lookup_colon(parser->tkz)) { - rule->phase = lxb_css_syntax_parser_declarations_name; - parser->block = rule->cbx.cb->block; + case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET: + if (rule->deep == 0) { + rule->phase = lxb_css_syntax_parser_end_consume_token; + break; + } - return token; + if (parser->types_pos[-1] == token->type) { + parser->types_pos--; + rule->deep--; } - rule->state = rule->cbx.cb->failed; - rule->phase = lxb_css_syntax_parser_declarations_drop; - rule->failed = true; + return token; + case LXB_CSS_SYNTAX_TOKEN__EOF: + rule->phase = lxb_css_syntax_parser_end; break; case LXB_CSS_SYNTAX_TOKEN_AT_KEYWORD: - rule->u.declarations.name_begin = 0; + rule->phase = lxb_css_syntax_parser_block_at; + break; - rule = lxb_css_syntax_parser_at_rule_push(parser, token, - lxb_css_syntax_parser_declarations_back, - rule->cbx.declarations->at_rule, rule->context, - rule->block_end); - if (rule != NULL) { - parser->fake_null = true; + case LXB_CSS_SYNTAX_TOKEN_IDENT: + if (lxb_css_syntax_tokenizer_lookup_colon(parser->tkz)) { + rule->phase = lxb_css_syntax_parser_block_declarations; + break; } - return NULL; - - case LXB_CSS_SYNTAX_TOKEN__EOF: - goto done; + /* Fall Through. */ default: - rule->state = rule->cbx.cb->failed; - rule->phase = lxb_css_syntax_parser_declarations_drop; - rule->failed = true; - - rule->u.declarations.name_begin = token->offset; + rule->phase = lxb_css_syntax_parser_block_qualified; break; } - parser->fake_null = true; + rule->skip_consume = true; - return NULL; + return lxb_css_parser_token_end(parser, 0); +} -done: +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_block_at(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + const lxb_css_syntax_cb_block_t *block = rule->cbx.block; - rule->phase = lxb_css_syntax_parser_end; - rule->state = lxb_css_state_success; - rule->skip_consume = true; + return lxb_css_syntax_parser_at_begin(parser, token, rule, + block->next, block->at_rule, true); +} - rule->u.declarations.name_begin = 0; - rule->u.declarations.end = token->offset; +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_block_declarations(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + void *declr_ctx; + lxb_css_syntax_rule_t *declr_rule; + lxb_css_syntax_begin_declarations_f cb; + const lxb_css_syntax_cb_block_t *block; + const lxb_css_syntax_cb_declarations_t *cb_declr; + + declr_ctx = NULL; + block = rule->cbx.block; + cb = block->declarations; - parser->fake_null = true; + rule->skip_consume = false; - return NULL; + cb_declr = cb(parser, token, rule->context, &declr_ctx); + if (cb_declr == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_UNEXPECTED_DATA); + } + + declr_rule = lxb_css_syntax_parser_declarations_push(parser, cb_declr, + block->next, declr_ctx, + LXB_CSS_SYNTAX_TOKEN_RC_BRACKET, + false, true); + if (declr_rule == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_MEMORY_ALLOCATION); + } + + return lxb_css_syntax_token_parser_do_phase_again(parser); } -static bool -lxb_css_syntax_parser_declarations_back(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, void *ctx) +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_block_qualified(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) { - lxb_css_syntax_rule_t *rules = parser->rules; + void *qualified_ctx; + lxb_css_syntax_rule_t *qualified; + const lxb_css_syntax_cb_block_t *block; + lxb_css_syntax_begin_qualified_rule_f cb; + const lxb_css_syntax_cb_qualified_rule_t *cb_qualified; + + qualified_ctx = NULL; + block = rule->cbx.block; + cb = block->qualified_rule; + + rule->skip_consume = false; - rules->state = rules->cbx.declarations->cb.state; + cb_qualified = cb(parser, token, rule->context, &qualified_ctx); + if (cb_qualified == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_UNEXPECTED_DATA); + } + + qualified = lxb_css_syntax_parser_qualified_push(parser, cb_qualified, + block->next, qualified_ctx, + LXB_CSS_SYNTAX_TOKEN_SEMICOLON, + true); + if (qualified == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_MEMORY_ALLOCATION); + } - return rules->state(parser, token, ctx); + return lxb_css_syntax_token_parser_do_phase_again(parser); } +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ static const lxb_css_syntax_token_t * -lxb_css_syntax_parser_declarations_name(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_syntax_rule_t *rule) +lxb_css_syntax_parser_block_back(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) { - if (rule->offset > token->offset) { - return token; + rule->phase = lxb_css_syntax_parser_block; + rule->state = rule->back_state; + rule->skip_consume = true; + + return token; +} + +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declarations_validate(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT + || !lxb_css_syntax_tokenizer_lookup_colon(parser->tkz)) + { + rule->phase = lxb_css_syntax_parser_declarations_drop; + rule->state = rule->cbx.cb->failed; + rule->begin = token->offset; + rule->context_old = rule->context; + rule->context = NULL; + rule->failed = true; + + parser->offset.value_end = 0; + + return lxb_css_syntax_token_parser_do_phase_again(parser); } - if (rule->state != lxb_css_state_success) { - rule->skip_consume = true; + return lxb_css_syntax_parser_declarations_begin(parser, token, rule); +} - return &lxb_css_syntax_token_terminated; +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declarations_begin(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + void *declr_ctx; + lxb_css_syntax_declaration_name_f cb; + + declr_ctx = NULL; + cb = rule->cbx.declarations->name; + + rule->state = cb(parser, token, rule->context, &declr_ctx); + if (rule->state == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_UNEXPECTED_DATA); } + rule->phase = lxb_css_syntax_parser_declarations_name; + rule->context_old = rule->context; + rule->context = declr_ctx; rule->skip_consume = false; + lxb_css_syntax_token_consume(parser->tkz); + + return lxb_css_syntax_token_parser_do_phase_again(parser); +} + +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declarations_name(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ /* 1. */ if (token->type == LXB_CSS_SYNTAX_TOKEN_WHITESPACE) { @@ -1049,8 +1402,6 @@ return NULL; } - rule->u.declarations.name_end = token->offset; - lxb_css_syntax_token_consume(parser->tkz); token = lxb_css_syntax_token(parser->tkz); @@ -1069,12 +1420,12 @@ } } - rule->u.declarations.value_begin = token->offset; + rule->begin = token->offset; + parser->offset.value_end = 0; /* 4. */ rule->phase = lxb_css_syntax_parser_declarations_value; - rule->state = parser->block; return lxb_css_syntax_parser_declarations_value(parser, token, rule); } @@ -1085,7 +1436,7 @@ lxb_css_syntax_rule_t *rule) { bool imp; - uintptr_t before_important; + size_t offset; lxb_status_t status; if (rule->offset > token->offset) { @@ -1097,7 +1448,6 @@ rule->offset = token->offset + lxb_css_syntax_token_base(token)->length; if (rule->block_end == token->type && rule->deep == 0) { - rule->skip_ending = true; goto done; } @@ -1115,7 +1465,7 @@ return token; } - before_important = token->offset; + parser->offset.value_end = token->offset; lxb_css_syntax_token_consume(parser->tkz); @@ -1128,7 +1478,7 @@ if (token->type == LXB_CSS_SYNTAX_TOKEN_DELIM) { rule->important = true; - rule->u.declarations.before_important = before_important; + parser->offset.important_begin = token->offset; lxb_css_syntax_token_consume(parser->tkz); @@ -1138,6 +1488,10 @@ if (token == NULL) { return lxb_css_syntax_parser_failed(parser, parser->tkz->status); } + + parser->offset.important_end = token->offset + + lxb_css_syntax_token_base(token)->length; + lxb_css_syntax_token_consume(parser->tkz); token = lxb_css_syntax_token(parser->tkz); @@ -1155,6 +1509,10 @@ } } } + else { + parser->offset.important_begin = 0; + parser->offset.important_end = 0; + } goto again; @@ -1162,17 +1520,20 @@ if (rule->deep == 0) { rule->phase = lxb_css_syntax_parser_declarations_next; - rule->u.declarations.value_end = token->offset; + offset = token->offset; - lxb_css_syntax_token_consume(parser->tkz); + parser->offset.value_begin = rule->begin; + parser->offset.end = offset; - token = lxb_css_syntax_token(parser->tkz); - if (token == NULL) { - return lxb_css_syntax_parser_failed(parser, - parser->tkz->status); + if (parser->offset.value_end == 0) { + parser->offset.value_end = offset; + parser->offset.important_begin = 0; + parser->offset.important_end = 0; } - return &lxb_css_syntax_token_terminated; + lxb_css_syntax_token_consume(parser->tkz); + + return lxb_css_parser_token_end(parser, offset); } return token; @@ -1190,9 +1551,11 @@ return token; } - rule->u.declarations.before_important = token->offset; rule->important = true; + parser->offset.value_end = token->offset; + parser->offset.important_begin = token->offset; + lxb_css_syntax_token_consume(parser->tkz); token = lxb_css_syntax_token(parser->tkz); @@ -1200,6 +1563,9 @@ return lxb_css_syntax_parser_failed(parser, parser->tkz->status); } + parser->offset.important_end = token->offset + + lxb_css_syntax_token_base(token)->length; + lxb_css_syntax_token_consume(parser->tkz); token = lxb_css_syntax_token(parser->tkz); @@ -1262,52 +1628,19 @@ done: - rule->phase = lxb_css_syntax_parser_declarations_end; - rule->skip_consume = true; - - rule->u.declarations.value_end = token->offset; - rule->u.declarations.end = token->offset; + parser->offset.value_begin = rule->begin; + parser->offset.end = token->offset; - return &lxb_css_syntax_token_terminated; -} - -static const lxb_css_syntax_token_t * -lxb_css_syntax_parser_declarations_next(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_syntax_rule_t *rule) -{ - lxb_status_t status; - lxb_css_syntax_declarations_offset_t *decl; - - if (rule->state != lxb_css_state_success) { - rule->skip_consume = true; - - return &lxb_css_syntax_token_terminated; + if (parser->offset.value_end == 0) { + parser->offset.value_end = token->offset; + parser->offset.important_begin = 0; + parser->offset.important_end = 0; } - status = rule->cbx.declarations->declaration_end(parser, rule->context, - rule->important, - rule->failed); - if (status != LXB_STATUS_OK) { - return lxb_css_syntax_parser_failed(parser, status); - } - - rule->phase = lxb_css_syntax_parser_declarations; - rule->state = rule->cbx.cb->state; - - rule->skip_consume = false; - rule->important = false; - rule->failed = false; - - decl = &rule->u.declarations; - - decl->name_begin = 0; - decl->name_end = 0; - decl->value_begin = 0; - decl->before_important = 0; - decl->value_end = 0; + rule->phase = lxb_css_syntax_parser_declaration_end; + rule->skip_consume = true; - return lxb_css_syntax_parser_declarations(parser, token, rule); + return lxb_css_parser_token_end(parser, token->offset); } static const lxb_css_syntax_token_t * @@ -1315,10 +1648,9 @@ const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule) { + size_t offset; lxb_status_t status; - /* It is necessary to avoid re-entry of the token into the phase. */ - if (rule->offset > token->offset) { return token; } @@ -1326,7 +1658,6 @@ rule->offset = token->offset + lxb_css_syntax_token_base(token)->length; if (rule->block_end == token->type && rule->deep == 0) { - rule->skip_ending = true; goto done; } @@ -1335,19 +1666,20 @@ if (rule->deep == 0) { rule->phase = lxb_css_syntax_parser_declarations_next; - rule->u.declarations.name_end = token->offset; + offset = token->offset; - lxb_css_syntax_token_consume(parser->tkz); + parser->offset.value_begin = rule->begin; + parser->offset.end = offset; - token = lxb_css_syntax_token(parser->tkz); - if (token == NULL) { - return lxb_css_syntax_parser_failed(parser, - parser->tkz->status); + if (parser->offset.value_end == 0) { + parser->offset.value_end = offset; + parser->offset.important_begin = 0; + parser->offset.important_end = 0; } - rule->skip_consume = true; + lxb_css_syntax_token_consume(parser->tkz); - return &lxb_css_syntax_token_terminated; + return lxb_css_parser_token_end(parser, offset); } return token; @@ -1369,6 +1701,18 @@ break; case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET: + if (rule->deep == 0) { + if (rule->nested) { + goto done; + } + } + else if (parser->types_pos[-1] == token->type) { + parser->types_pos--; + rule->deep--; + } + + return token; + case LXB_CSS_SYNTAX_TOKEN_RS_BRACKET: case LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS: if (rule->deep != 0 && parser->types_pos[-1] == token->type) { @@ -1395,44 +1739,193 @@ done: - rule->phase = lxb_css_syntax_parser_declarations_end; + parser->offset.value_begin = rule->begin; + parser->offset.end = token->offset; + + if (parser->offset.value_end == 0) { + parser->offset.value_end = token->offset; + parser->offset.important_begin = 0; + parser->offset.important_end = 0; + } + + rule->phase = lxb_css_syntax_parser_declaration_end; rule->skip_consume = true; - rule->u.declarations.name_end = token->offset; - rule->u.declarations.end = token->offset; + return lxb_css_parser_token_end(parser, token->offset); +} + +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declarations_next(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + void *out_rule; + lxb_status_t status; + lxb_css_syntax_declaration_name_f name; + + if (rule->state != lxb_css_state_success) { + rule->skip_consume = true; + + return lxb_css_parser_token_end(parser, token->offset); + } + + status = rule->cbx.declarations->end(parser, rule->context_old, + rule->context, token, &parser->offset, + rule->important, rule->failed); + if (status != LXB_STATUS_OK) { + return lxb_css_syntax_parser_failed(parser, status); + } + +begin: + + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN_SEMICOLON: + case LXB_CSS_SYNTAX_TOKEN_WHITESPACE: + lxb_css_syntax_token_consume(parser->tkz); + + token = lxb_css_syntax_token(parser->tkz); + if (token == NULL) { + return lxb_css_syntax_parser_failed(parser, + parser->tkz->status); + } + + goto begin; + + case LXB_CSS_SYNTAX_TOKEN__EOF: + rule->phase = lxb_css_syntax_parser_declarations_end; + break; + + case LXB_CSS_SYNTAX_TOKEN_IDENT: + if (lxb_css_syntax_tokenizer_lookup_colon(parser->tkz)) { + out_rule = NULL; + name = rule->cbx.declarations->name; + rule->skip_consume = true; + + rule->state = name(parser, token, rule->context, &out_rule); + if (rule->state == NULL) { + return lxb_css_syntax_parser_failed(parser, + LXB_STATUS_ERROR_UNEXPECTED_DATA); + } + + rule->context = out_rule; + + lxb_css_syntax_token_consume(parser->tkz); + + rule->phase = lxb_css_syntax_parser_declarations_name; + rule->context = out_rule; + + break; + } + + /* Fall through. */ + + default: + if (rule->nested) { + rule->phase = lxb_css_syntax_parser_declarations_end; + } + else { + rule->phase = lxb_css_syntax_parser_declarations_drop; + rule->state = rule->cbx.cb->failed; + rule->begin = token->offset; + rule->context = NULL; + rule->failed = true; - return &lxb_css_syntax_token_terminated; + parser->offset.value_end = 0; + + return lxb_css_syntax_token_parser_do_phase_again(parser); + } + + break; + } + + rule->skip_consume = false; + rule->important = false; + rule->failed = false; + + return lxb_css_syntax_token_parser_do_phase_again(parser); } +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ static const lxb_css_syntax_token_t * -lxb_css_syntax_parser_declarations_end(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_syntax_rule_t *rule) +lxb_css_syntax_parser_declaration_back_to_value(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + rule->phase = lxb_css_syntax_parser_declarations_value; + rule->state = rule->back_state; + rule->skip_consume = false; + + return token; +} + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declaration_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + return lxb_css_syntax_parser_declaration_end_handler(parser, token, + rule, false); +} + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declaration_end_handler(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule, + bool skip_token) { lxb_status_t status; - lxb_css_syntax_rule_t *rules; if (rule->state != lxb_css_state_success) { rule->skip_consume = true; - return &lxb_css_syntax_token_terminated; + return lxb_css_parser_token_end(parser, token->offset); } - status = rule->cbx.declarations->declaration_end(parser, rule->context, - rule->important, - rule->failed); + status = rule->cbx.declarations->end(parser, rule->context_old, + rule->context, token, &parser->offset, + rule->important, rule->failed); if (status != LXB_STATUS_OK) { return lxb_css_syntax_parser_failed(parser, status); } + return lxb_css_syntax_parser_declarations_end_h(parser, token, + rule, skip_token); +} + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declarations_end(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + return lxb_css_syntax_parser_declarations_end_h(parser, token, + rule, false); +} + +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_declarations_end_h(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule, + bool skip_token) +{ + lxb_status_t status; + /* This code will be called exclusively from the lxb_css_parser_run(...). */ + rule->context = rule->context_old; + status = rule->cbx.cb->end(parser, token, rule->context, false); if (status != LXB_STATUS_OK) { return lxb_css_syntax_parser_failed(parser, status); } - if (!rule->skip_ending) { + if (skip_token) { lxb_css_syntax_token_consume(parser->tkz); token = lxb_css_syntax_token(parser->tkz); @@ -1442,18 +1935,7 @@ } } - (void) lxb_css_syntax_parser_stack_pop(parser); - - rules = parser->rules; - - if (parser->rules <= parser->rules_begin) { - rules->state = lxb_css_state_stop; - return token; - } - - rules->phase = rules->back; - - return rules->phase(parser, token, rules); + return lxb_css_syntax_parser_call_back(parser, token); } static const lxb_css_syntax_token_t * @@ -1470,7 +1952,6 @@ rule->offset = token->offset + lxb_css_syntax_token_base(token)->length; if (rule->block_end == token->type && rule->deep == 0) { - rule->skip_ending = true; goto done; } @@ -1521,7 +2002,23 @@ rule->phase = lxb_css_syntax_parser_end; rule->skip_consume = true; - return &lxb_css_syntax_token_terminated; + return lxb_css_parser_token_end(parser, token->offset); +} + +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_components_back_to_value(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + rule->phase = lxb_css_syntax_parser_components; + rule->state = rule->back_state; + rule->skip_consume = false; + + return token; } static const lxb_css_syntax_token_t * @@ -1555,16 +2052,16 @@ break; case LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS: - if (rule->deep != 0) { - if (parser->types_pos[-1] == token->type) { - parser->types_pos--; - rule->deep--; - } - } - else { + if (rule->deep == 0) { + rule->phase = lxb_css_syntax_parser_end_consume_token; goto done; } + if (parser->types_pos[-1] == token->type) { + parser->types_pos--; + rule->deep--; + } + return token; case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET: @@ -1577,6 +2074,7 @@ return token; case LXB_CSS_SYNTAX_TOKEN__EOF: + rule->phase = lxb_css_syntax_parser_end; goto done; default: @@ -1593,77 +2091,25 @@ done: - rule->phase = lxb_css_syntax_parser_end; rule->skip_consume = true; - return &lxb_css_syntax_token_terminated; + return lxb_css_parser_token_end(parser, token->offset); } +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ static const lxb_css_syntax_token_t * -lxb_css_syntax_parser_block(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_syntax_rule_t *rule) +lxb_css_syntax_parser_function_back(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) { - lxb_status_t status; - - if (rule->offset > token->offset) { - return token; - } - - rule->offset = token->offset + lxb_css_syntax_token_base(token)->length; - - if (rule->block_end == token->type && rule->deep == 0) { - goto done; - } - - switch (token->type) { - case LXB_CSS_SYNTAX_TOKEN_LS_BRACKET: - status = lxb_css_parser_types_push(parser, - LXB_CSS_SYNTAX_TOKEN_RS_BRACKET); - break; - - case LXB_CSS_SYNTAX_TOKEN_FUNCTION: - case LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS: - status = lxb_css_parser_types_push(parser, - LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS); - break; - - case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET: - status = lxb_css_parser_types_push(parser, - LXB_CSS_SYNTAX_TOKEN_RC_BRACKET); - break; - - case LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS: - case LXB_CSS_SYNTAX_TOKEN_RS_BRACKET: - case LXB_CSS_SYNTAX_TOKEN_RC_BRACKET: - if (rule->deep != 0 && parser->types_pos[-1] == token->type) { - parser->types_pos--; - rule->deep--; - } - - return token; - - case LXB_CSS_SYNTAX_TOKEN__EOF: - goto done; - - default: - return token; - } - - if (status != LXB_STATUS_OK) { - return lxb_css_syntax_parser_failed(parser, status); - } - - rule->deep++; + rule->phase = lxb_css_syntax_parser_function; + rule->state = rule->back_state; + rule->skip_consume = false; return token; - -done: - - rule->phase = lxb_css_syntax_parser_end; - rule->skip_consume = true; - - return &lxb_css_syntax_token_terminated; } static const lxb_css_syntax_token_t * @@ -1677,31 +2123,41 @@ rule->phase = lxb_css_syntax_parser_end; rule->skip_consume = true; - return &lxb_css_syntax_token_terminated; + return lxb_css_parser_token_end(parser, token->offset); } return token; } -const lxb_css_syntax_token_t * -lxb_css_syntax_parser_start_block(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_syntax_rule_t *rule) +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_pipe_back(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) { - if (rule->state != lxb_css_state_success) { - rule->skip_consume = true; - - return &lxb_css_syntax_token_terminated; - } - - /* This code will be called exclusively from the lxb_css_parser_run(...). */ - + rule->phase = lxb_css_syntax_parser_pipe; + rule->state = rule->back_state; rule->skip_consume = false; - rule->phase = rule->back; - rule->state = parser->block; + return token; +} + +/* + * This code will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ +static const lxb_css_syntax_token_t * +lxb_css_syntax_parser_end_back(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + rule->phase = lxb_css_syntax_parser_end; + rule->state = lxb_css_state_blank; - return rule->back(parser, token, rule); + return token; } const lxb_css_syntax_token_t * @@ -1710,13 +2166,12 @@ lxb_css_syntax_rule_t *rule) { lxb_status_t status; - lxb_css_syntax_rule_t *rules; lxb_css_syntax_cb_base_t *base; - if (rule->state != lxb_css_state_success) { - rule->skip_consume = true; + rule->skip_consume = true; - return &lxb_css_syntax_token_terminated; + if (rule->state != lxb_css_state_success) { + return lxb_css_parser_token_end(parser, token->offset); } /* This code will be called exclusively from the lxb_css_parser_run(...). */ @@ -1728,27 +2183,43 @@ return lxb_css_syntax_parser_failed(parser, status); } - if (!rule->skip_ending) { - lxb_css_syntax_token_consume(parser->tkz); + rule->skip_consume = false; - token = lxb_css_syntax_token(parser->tkz); - if (token == NULL) { - return lxb_css_syntax_parser_failed(parser, - parser->tkz->status); - } + return lxb_css_syntax_parser_call_back(parser, token); +} + +const lxb_css_syntax_token_t * +lxb_css_syntax_parser_end_consume_token(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule) +{ + lxb_status_t status; + lxb_css_syntax_cb_base_t *base; + + rule->skip_consume = true; + + if (rule->state != lxb_css_state_success) { + return lxb_css_parser_token_end(parser, token->offset); } - (void) lxb_css_syntax_parser_stack_pop(parser); + /* This code will be called exclusively from the lxb_css_parser_run(...). */ - rules = parser->rules; + base = rule->cbx.user; - if (parser->rules <= parser->rules_begin) { - rules->state = lxb_css_state_stop; - return token; + status = base->end(parser, token, rule->context, rule->failed); + if (status != LXB_STATUS_OK) { + return lxb_css_syntax_parser_failed(parser, status); } - rules->phase = rules->back; - rules->state = rule->state_back; + rule->skip_consume = false; + + lxb_css_syntax_token_consume(parser->tkz); + + token = lxb_css_syntax_token(parser->tkz); + if (token == NULL) { + return lxb_css_syntax_parser_failed(parser, + parser->tkz->status); + } - return rules->phase(parser, token, rules); + return lxb_css_syntax_parser_call_back(parser, token); } diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/parser.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/parser.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/parser.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/parser.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2025 Alexander Borisov + * Copyright (C) 2020-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -30,70 +30,63 @@ LXB_API lxb_css_syntax_rule_t * lxb_css_syntax_parser_list_rules_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, const lxb_css_syntax_cb_list_rules_t *list_rules, - void *ctx, bool top_level, - lxb_css_syntax_token_type_t stop); + lxb_css_parser_state_f back, + void *ctx, lxb_css_syntax_token_type_t stop); LXB_API lxb_css_syntax_rule_t * lxb_css_syntax_parser_at_rule_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, const lxb_css_syntax_cb_at_rule_t *at_rule, - void *ctx, lxb_css_syntax_token_type_t stop); + lxb_css_parser_state_f back, + void *ctx, lxb_css_syntax_token_type_t stop, + bool nested); LXB_API lxb_css_syntax_rule_t * lxb_css_syntax_parser_qualified_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, const lxb_css_syntax_cb_qualified_rule_t *qualified, - void *ctx, lxb_css_syntax_token_type_t stop); + lxb_css_parser_state_f back, + void *ctx, lxb_css_syntax_token_type_t stop, + bool nested); + +LXB_API lxb_css_syntax_rule_t * +lxb_css_syntax_parser_block_push(lxb_css_parser_t *parser, + const lxb_css_syntax_cb_block_t *block, + lxb_css_parser_state_f back, void *ctx); LXB_API lxb_css_syntax_rule_t * lxb_css_syntax_parser_declarations_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, - const lxb_css_syntax_cb_declarations_t *declarations, - void *ctx, lxb_css_syntax_token_type_t stop); + const lxb_css_syntax_cb_declarations_t *declr, + lxb_css_parser_state_f back, void *ctx, + lxb_css_syntax_token_type_t stop, + bool name_validate, bool nested); LXB_API lxb_css_syntax_rule_t * lxb_css_syntax_parser_components_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, const lxb_css_syntax_cb_components_t *comp, + lxb_css_parser_state_f back, void *ctx, lxb_css_syntax_token_type_t stop); LXB_API lxb_css_syntax_rule_t * lxb_css_syntax_parser_function_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, const lxb_css_syntax_cb_function_t *func, - void *ctx); - -LXB_API lxb_css_syntax_rule_t * -lxb_css_syntax_parser_block_push(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_parser_state_f state_back, - const lxb_css_syntax_cb_block_t *block, - void *ctx); + lxb_css_parser_state_f back, void *ctx); LXB_API lxb_css_syntax_rule_t * lxb_css_syntax_parser_pipe_push(lxb_css_parser_t *parser, - lxb_css_parser_state_f state_back, const lxb_css_syntax_cb_pipe_t *pipe, - void *ctx, lxb_css_syntax_token_type_t stop); - -LXB_API const lxb_css_syntax_token_t * -lxb_css_syntax_parser_start_block(lxb_css_parser_t *parser, - const lxb_css_syntax_token_t *token, - lxb_css_syntax_rule_t *rule); + lxb_css_parser_state_f back, void *ctx, + lxb_css_syntax_token_type_t stop); LXB_API const lxb_css_syntax_token_t * lxb_css_syntax_parser_end(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule); +LXB_API const lxb_css_syntax_token_t * +lxb_css_syntax_parser_end_consume_token(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_rule_t *rule); + #ifdef __cplusplus } /* extern "C" */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2025 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -7,12 +7,9 @@ #ifndef LEXBOR_CSS_SYNTAX_RES_H #define LEXBOR_CSS_SYNTAX_RES_H -#ifdef LXB_CSS_SYNTAX_RES_NAME_MAP -#ifndef LXB_CSS_SYNTAX_RES_NAME_MAP_ENABLED -#define LXB_CSS_SYNTAX_RES_NAME_MAP_ENABLED #define LXB_CSS_SYNTAX_RES_NAME_START 0x01 -static const lxb_char_t lxb_css_syntax_res_name_map[256] = +LXB_API const lxb_char_t lxb_css_syntax_res_name_map[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -42,7 +39,4 @@ 0x01, 0x01, 0x01, 0x01, 0x01 }; -#endif /* LXB_CSS_SYNTAX_RES_NAME_MAP_ENABLED */ -#endif /* LXB_CSS_SYNTAX_RES_NAME_MAP */ - #endif /* LEXBOR_CSS_SYNTAX_RES_H */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/state.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/state.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/state.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/state.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2025 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -14,12 +14,11 @@ #include "lexbor/css/syntax/syntax.h" #include "lexbor/css/syntax/tokenizer/error.h" -#define LXB_CSS_SYNTAX_RES_NAME_MAP #include "lexbor/css/syntax/res.h" -#define LEXBOR_STR_RES_MAP_HEX -#include "lexbor/core/str_res.h" - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256]; +#endif #define LXB_CSS_SYNTAX_ERROR_CODEPOINT 0x1FFFFF @@ -1101,7 +1100,9 @@ /* U+0030 DIGIT ZERO (0) and U+0039 DIGIT NINE (9) */ do { - e_digit = (*data - 0x30) + e_digit * 0x0A; + if (e_digit < INT_MAX / 10) { + e_digit = (*data - 0x30) + e_digit * 0x0A; + } data += 1; @@ -1523,7 +1524,7 @@ lxb_css_syntax_tokenizer_error_add(tkz->parse_errors, data, LXB_CSS_SYNTAX_TOKENIZER_ERROR_EOINUR); - return lxb_css_syntax_state_string_set(tkz, token, data); + goto done; default: if (*data >= 0x80) { diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/state_res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/state_res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/state_res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/state_res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2025 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/syntax.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/syntax.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/syntax.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/syntax.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2023 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -9,58 +9,315 @@ #include "lexbor/core/str.h" -#define LEXBOR_STR_RES_MAP_HEX -#define LEXBOR_STR_RES_MAP_HEX_TO_CHAR_LOWERCASE -#define LEXBOR_STR_RES_CHAR_TO_TWO_HEX_VALUE_LOWERCASE -#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER -#include "lexbor/core/str_res.h" +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4]; + LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256]; + LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex_to_char_lowercase[17]; + LXB_EXTERN const char *lexbor_str_res_char_to_two_hex_value_lowercase[257]; + LXB_EXTERN const lxb_char_t lxb_css_syntax_res_name_map[256]; +#endif -#define LXB_CSS_SYNTAX_RES_NAME_MAP -#include "lexbor/css/syntax/res.h" +static const lexbor_str_t lxb_css_syntax_str_ws = lexbor_str(" "); -static const lexbor_str_t lxb_str_ws = lexbor_str(" "); - - -lxb_status_t +lxb_css_rule_list_t * lxb_css_syntax_parse_list_rules(lxb_css_parser_t *parser, const lxb_css_syntax_cb_list_rules_t *cb, - const lxb_char_t *data, size_t length, - void *ctx, bool top_level) + const lxb_char_t *data, size_t length) { - lxb_status_t status; + lxb_css_rule_list_t *list; lxb_css_syntax_rule_t *rule; if (lxb_css_parser_is_running(parser)) { parser->status = LXB_STATUS_ERROR_WRONG_STAGE; - return parser->status; + return NULL; } lxb_css_parser_clean(parser); - lxb_css_parser_buffer_set(parser, data, length); - rule = lxb_css_syntax_parser_list_rules_push(parser, NULL, NULL, cb, - ctx, top_level, + list = lxb_css_rule_list_create(parser->memory); + if (list == NULL) { + parser->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; + goto failed; + } + + rule = lxb_css_syntax_parser_list_rules_push(parser, cb, NULL, list, LXB_CSS_SYNTAX_TOKEN_UNDEF); if (rule == NULL) { - status = parser->status; - goto end; + goto failed; } parser->tkz->with_comment = false; parser->stage = LXB_CSS_PARSER_RUN; - status = lxb_css_syntax_parser_run(parser); - if (status != LXB_STATUS_OK) { - /* Destroy StyleSheet. */ + parser->status = lxb_css_syntax_parser_run(parser); + if (parser->status != LXB_STATUS_OK) { + goto failed; } -end: + parser->stage = LXB_CSS_PARSER_END; + + return list; + +failed: + + if (list != NULL) { + lxb_css_rule_list_destroy(list, true); + } parser->stage = LXB_CSS_PARSER_END; - return status; + return NULL; +} + +lxb_css_rule_declaration_list_t * +lxb_css_syntax_parse_declarations(lxb_css_parser_t *parser, + const lxb_css_syntax_cb_declarations_t *cb, + const lxb_char_t *data, size_t length) +{ + lxb_css_rule_declaration_list_t *list; + lxb_css_syntax_rule_t *rule; + + if (lxb_css_parser_is_running(parser)) { + parser->status = LXB_STATUS_ERROR_WRONG_STAGE; + return NULL; + } + + lxb_css_parser_clean(parser); + lxb_css_parser_buffer_set(parser, data, length); + + list = lxb_css_rule_declaration_list_create(parser->memory); + if (list == NULL) { + parser->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; + goto failed; + } + + rule = lxb_css_syntax_parser_declarations_push(parser, cb, NULL, list, + LXB_CSS_SYNTAX_TOKEN_UNDEF, + true, false); + if (rule == NULL) { + goto failed; + } + + parser->tkz->with_comment = false; + parser->stage = LXB_CSS_PARSER_RUN; + + parser->status = lxb_css_syntax_parser_run(parser); + if (parser->status != LXB_STATUS_OK) { + goto failed; + } + + parser->stage = LXB_CSS_PARSER_END; + + return list; + +failed: + + if (list != NULL) { + lxb_css_rule_declaration_list_destroy(list, true); + } + + parser->stage = LXB_CSS_PARSER_END; + + return NULL; +} + +lxb_css_syntax_rule_t * +lxb_css_syntax_consume_list_rules(lxb_css_parser_t *parser, + const lxb_css_syntax_cb_list_rules_t *list_rules, + lxb_css_parser_state_f back, + void *ctx, lxb_css_syntax_token_type_t stop) +{ + return lxb_css_syntax_parser_list_rules_push(parser, list_rules, back, + ctx, stop); +} + +lxb_css_syntax_rule_t * +lxb_css_syntax_consume_at_rule(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + const lxb_css_syntax_cb_at_rule_t *at_rule, + lxb_css_parser_state_f back, + void *ctx, lxb_css_syntax_token_type_t stop) +{ + if (token->type != LXB_CSS_SYNTAX_TOKEN_AT_KEYWORD) { + return NULL; + } + + if (parser->rules > parser->rules_begin && parser->rules->deep != 0 + && parser->types_pos[-1] == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) + { + parser->types_pos -= 1; + parser->rules->deep -= 1; + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_syntax_parser_at_rule_push(parser, at_rule, back, ctx, + stop, false); +} + +lxb_css_syntax_rule_t * +lxb_css_syntax_consume_qualified_rule(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + const lxb_css_syntax_cb_qualified_rule_t *qualified, + lxb_css_parser_state_f back, + void *ctx, lxb_css_syntax_token_type_t stop) +{ + lxb_css_syntax_token_type_t type; + + if (parser->rules > parser->rules_begin && parser->rules->deep != 0) { + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN_LS_BRACKET: + type = LXB_CSS_SYNTAX_TOKEN_RS_BRACKET; + break; + + case LXB_CSS_SYNTAX_TOKEN_FUNCTION: + case LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS: + type = LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS; + break; + + case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET: + type = LXB_CSS_SYNTAX_TOKEN_RC_BRACKET; + break; + + default: + type = LXB_CSS_SYNTAX_TOKEN_UNDEF; + break; + } + + + if (parser->types_pos[-1] == type) { + parser->types_pos -= 1; + parser->rules->deep -= 1; + } + } + + return lxb_css_syntax_parser_qualified_push(parser, qualified, back, + ctx, stop, false); +} + +lxb_css_syntax_rule_t * +lxb_css_syntax_consume_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + const lxb_css_syntax_cb_block_t *block, + lxb_css_parser_state_f back, void *ctx) +{ + if (token->type != LXB_CSS_SYNTAX_TOKEN_LC_BRACKET) { + return NULL; + } + + if (parser->rules > parser->rules_begin && parser->rules->deep != 0 + && parser->types_pos[-1] == LXB_CSS_SYNTAX_TOKEN_RC_BRACKET) + { + parser->types_pos -= 1; + parser->rules->deep -= 1; + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_syntax_parser_block_push(parser, block, back, ctx); +} + +lxb_css_syntax_rule_t * +lxb_css_syntax_consume_declarations(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + const lxb_css_syntax_cb_declarations_t *declr, + lxb_css_parser_state_f back, void *ctx, + lxb_css_syntax_token_type_t stop) +{ + lxb_css_syntax_token_type_t type; + + if (parser->rules > parser->rules_begin && parser->rules->deep != 0) { + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN_LS_BRACKET: + type = LXB_CSS_SYNTAX_TOKEN_RS_BRACKET; + break; + + case LXB_CSS_SYNTAX_TOKEN_FUNCTION: + case LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS: + type = LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS; + break; + + case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET: + type = LXB_CSS_SYNTAX_TOKEN_RC_BRACKET; + break; + + default: + type = LXB_CSS_SYNTAX_TOKEN_UNDEF; + break; + } + + + if (parser->types_pos[-1] == type) { + parser->types_pos -= 1; + parser->rules->deep -= 1; + } + } + + return lxb_css_syntax_parser_declarations_push(parser, declr, back, + ctx, stop, true, false); +} + +lxb_css_syntax_rule_t * +lxb_css_syntax_consume_components(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + const lxb_css_syntax_cb_components_t *comp, + lxb_css_parser_state_f back, + void *ctx, lxb_css_syntax_token_type_t stop) +{ + lxb_css_syntax_token_type_t type; + + if (parser->rules > parser->rules_begin && parser->rules->deep != 0) { + switch (token->type) { + case LXB_CSS_SYNTAX_TOKEN_LS_BRACKET: + type = LXB_CSS_SYNTAX_TOKEN_RS_BRACKET; + break; + + case LXB_CSS_SYNTAX_TOKEN_FUNCTION: + case LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS: + type = LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS; + break; + + case LXB_CSS_SYNTAX_TOKEN_LC_BRACKET: + type = LXB_CSS_SYNTAX_TOKEN_RC_BRACKET; + break; + + default: + type = LXB_CSS_SYNTAX_TOKEN_UNDEF; + break; + } + + + if (parser->types_pos[-1] == type) { + parser->types_pos -= 1; + parser->rules->deep -= 1; + } + } + + return lxb_css_syntax_parser_components_push(parser, comp, back, ctx, stop); +} + +lxb_css_syntax_rule_t * +lxb_css_syntax_consume_function(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + const lxb_css_syntax_cb_function_t *func, + lxb_css_parser_state_f back, void *ctx) +{ + if (token->type != LXB_CSS_SYNTAX_TOKEN_FUNCTION) { + return NULL; + } + + if (parser->rules > parser->rules_begin && parser->rules->deep != 0 + && parser->types_pos[-1] == LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS) + { + parser->types_pos -= 1; + parser->rules->deep -= 1; + } + + lxb_css_syntax_parser_consume(parser); + + return lxb_css_syntax_parser_function_push(parser, func, back, ctx); } lxb_status_t @@ -69,22 +326,20 @@ size_t length, cur_len, size; lxb_css_syntax_rule_t *p; - if ((parser->rules + count) >= parser->rules_end) { - cur_len = parser->rules - parser->rules_begin; + cur_len = parser->rules - parser->rules_begin; - length = cur_len + count + 1024; - size = length * sizeof(lxb_css_syntax_rule_t); + length = cur_len + count + 1024; + size = length * sizeof(lxb_css_syntax_rule_t); - p = lexbor_realloc(parser->rules_begin, size); - if (p == NULL) { - return LXB_STATUS_ERROR_MEMORY_ALLOCATION; - } - - parser->rules_begin = p; - parser->rules_end = p + length; - parser->rules = p + cur_len; + p = lexbor_realloc(parser->rules_begin, size); + if (p == NULL) { + return LXB_STATUS_ERROR_MEMORY_ALLOCATION; } + parser->rules_begin = p; + parser->rules_end = p + length; + parser->rules = p + cur_len; + return LXB_STATUS_OK; } @@ -166,8 +421,9 @@ data = ++p; if (p < end && lexbor_str_res_map_hex[*p] != 0xff) { - lexbor_serialize_write(cb, lxb_str_ws.data, - lxb_str_ws.length, ctx, status); + lexbor_serialize_write(cb, lxb_css_syntax_str_ws.data, + lxb_css_syntax_str_ws.length, + ctx, status); } continue; @@ -231,8 +487,9 @@ p++; if (p < end && lexbor_str_res_map_hex[*p] != 0xff) { - lexbor_serialize_write(cb, lxb_str_ws.data, - lxb_str_ws.length, ctx, status); + lexbor_serialize_write(cb, lxb_css_syntax_str_ws.data, + lxb_css_syntax_str_ws.length, + ctx, status); } data = p; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/syntax.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/syntax.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/syntax.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/syntax.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 Alexander Borisov + * Copyright (C) 2022-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -12,6 +12,7 @@ #endif #include "lexbor/css/syntax/tokenizer.h" +#include "lexbor/css/syntax/tokenizer.h" typedef struct lxb_css_syntax_rule lxb_css_syntax_rule_t; @@ -21,124 +22,211 @@ const lxb_css_syntax_token_t *token, lxb_css_syntax_rule_t *rule); -typedef lxb_status_t -(*lxb_css_syntax_declaration_end_f)(lxb_css_parser_t *parser, void *ctx, - bool important, bool failed); + +typedef struct lxb_css_syntax_cb_base lxb_css_syntax_cb_base_t; +typedef struct lxb_css_syntax_cb_list_rules lxb_css_syntax_cb_list_rules_t; +typedef struct lxb_css_syntax_cb_at_rule lxb_css_syntax_cb_at_rule_t; +typedef struct lxb_css_syntax_cb_qualified_rule lxb_css_syntax_cb_qualified_rule_t; +typedef struct lxb_css_syntax_cb_block lxb_css_syntax_cb_block_t; +typedef struct lxb_css_syntax_cb_declarations lxb_css_syntax_cb_declarations_t; +typedef struct lxb_css_syntax_cb_function lxb_css_syntax_cb_function_t; +typedef struct lxb_css_syntax_cb_components lxb_css_syntax_cb_components_t; +typedef struct lxb_css_syntax_cb_pipe lxb_css_syntax_cb_pipe_t; + +typedef struct lxb_css_syntax_declaration_offset lxb_css_syntax_declaration_offset_t; typedef lxb_status_t (*lxb_css_syntax_cb_done_f)(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx, bool failed); -typedef struct { - uintptr_t begin; - uintptr_t end; -} -lxb_css_syntax_list_rules_offset_t; - -typedef struct { - uintptr_t name; - uintptr_t prelude; - uintptr_t prelude_end; - uintptr_t block; - uintptr_t block_end; -} -lxb_css_syntax_at_rule_offset_t; - -typedef struct { - uintptr_t prelude; - uintptr_t prelude_end; - uintptr_t block; - uintptr_t block_end; -} -lxb_css_syntax_qualified_offset_t; - -typedef struct { - uintptr_t begin; - uintptr_t end; - uintptr_t name_begin; - uintptr_t name_end; - uintptr_t value_begin; - uintptr_t before_important; - uintptr_t value_end; -} -lxb_css_syntax_declarations_offset_t; - -typedef struct { - lxb_css_parser_state_f state; - lxb_css_parser_state_f block; +typedef const lxb_css_syntax_cb_at_rule_t * +(*lxb_css_syntax_begin_at_rule_f)(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); + +typedef const lxb_css_syntax_cb_qualified_rule_t * +(*lxb_css_syntax_begin_qualified_rule_f)(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); + +typedef const lxb_css_syntax_cb_block_t * +(*lxb_css_syntax_begin_block_f)(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); + +typedef const lxb_css_syntax_cb_declarations_t * +(*lxb_css_syntax_begin_declarations_f)(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); +typedef lxb_css_parser_state_f +(*lxb_css_syntax_declaration_name_f)(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + void *ctx, void **out_rule); +typedef lxb_status_t +(*lxb_css_syntax_declaration_end_f)(lxb_css_parser_t *parser, + void *declaration, void *ctx, + const lxb_css_syntax_token_t *token, + lxb_css_syntax_declaration_offset_t *offset, + bool important, bool failed); + +struct lxb_css_syntax_cb_base { lxb_css_parser_state_f failed; lxb_css_syntax_cb_done_f end; -} -lxb_css_syntax_cb_base_t; +}; -typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_pipe_t; -typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_block_t; -typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_function_t; -typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_components_t; -typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_at_rule_t; -typedef lxb_css_syntax_cb_base_t lxb_css_syntax_cb_qualified_rule_t; +struct lxb_css_syntax_cb_list_rules { + lxb_css_syntax_cb_base_t cb; + lxb_css_parser_state_f next; + lxb_css_syntax_begin_at_rule_f at_rule; + lxb_css_syntax_begin_qualified_rule_f qualified_rule; +}; + +struct lxb_css_syntax_cb_at_rule { + lxb_css_syntax_cb_base_t cb; + lxb_css_parser_state_f prelude; + lxb_css_syntax_cb_done_f prelude_end; + lxb_css_syntax_begin_block_f block; +}; + +struct lxb_css_syntax_cb_qualified_rule { + lxb_css_syntax_cb_base_t cb; + lxb_css_parser_state_f prelude; + lxb_css_syntax_cb_done_f prelude_end; + lxb_css_syntax_begin_block_f block; +}; -typedef struct { +struct lxb_css_syntax_cb_block { + lxb_css_syntax_cb_base_t cb; + lxb_css_parser_state_f next; + lxb_css_syntax_begin_at_rule_f at_rule; + lxb_css_syntax_begin_declarations_f declarations; + lxb_css_syntax_begin_qualified_rule_f qualified_rule; +}; + +struct lxb_css_syntax_cb_declarations { lxb_css_syntax_cb_base_t cb; - lxb_css_syntax_declaration_end_f declaration_end; - const lxb_css_syntax_cb_at_rule_t *at_rule; -} -lxb_css_syntax_cb_declarations_t; - -typedef struct { - lxb_css_syntax_cb_base_t cb; - lxb_css_parser_state_f next; - const lxb_css_syntax_cb_at_rule_t *at_rule; - const lxb_css_syntax_cb_qualified_rule_t *qualified_rule; -} -lxb_css_syntax_cb_list_rules_t; + lxb_css_syntax_declaration_name_f name; + lxb_css_syntax_declaration_end_f end; +}; + +struct lxb_css_syntax_cb_function { + lxb_css_syntax_cb_base_t cb; + lxb_css_parser_state_f value; +}; + +struct lxb_css_syntax_cb_components { + lxb_css_syntax_cb_base_t cb; + lxb_css_parser_state_f prelude; +}; + +struct lxb_css_syntax_cb_pipe { + lxb_css_syntax_cb_base_t cb; + lxb_css_parser_state_f prelude; +}; + +struct lxb_css_syntax_declaration_offset { + size_t value_begin; + size_t value_end; + size_t important_begin; + size_t important_end; + size_t end; +}; struct lxb_css_syntax_rule { lxb_css_syntax_state_f phase; lxb_css_parser_state_f state; - lxb_css_parser_state_f state_back; + + /* + * This callback will be called before rule->state is called. + * Exclusively from the lxb_css_parser_run(...). + */ lxb_css_syntax_state_f back; + lxb_css_parser_state_f back_state; + void *context; + void *context_old; + void *returned; union { const lxb_css_syntax_cb_base_t *cb; const lxb_css_syntax_cb_list_rules_t *list_rules; const lxb_css_syntax_cb_at_rule_t *at_rule; const lxb_css_syntax_cb_qualified_rule_t *qualified_rule; - const lxb_css_syntax_cb_declarations_t *declarations; const lxb_css_syntax_cb_components_t *components; + const lxb_css_syntax_cb_declarations_t *declarations; const lxb_css_syntax_cb_function_t *func; const lxb_css_syntax_cb_block_t *block; const lxb_css_syntax_cb_pipe_t *pipe; void *user; } cbx; - void *context; - - uintptr_t offset; - size_t deep; - lxb_css_syntax_token_type_t block_end; - bool skip_ending; - bool skip_consume; - bool important; - bool failed; - bool top_level; - - union { - lxb_css_syntax_list_rules_offset_t list_rules; - lxb_css_syntax_at_rule_offset_t at_rule; - lxb_css_syntax_qualified_offset_t qualified; - lxb_css_syntax_declarations_offset_t declarations; - void *user; - } u; + size_t offset; + size_t deep; + size_t begin; + lxb_css_syntax_token_type_t block_end; + bool nested; + bool skip_consume; + bool important; + bool failed; }; -LXB_API lxb_status_t +LXB_API lxb_css_rule_list_t * lxb_css_syntax_parse_list_rules(lxb_css_parser_t *parser, const lxb_css_syntax_cb_list_rules_t *cb, - const lxb_char_t *data, size_t length, - void *ctx, bool top_level); + const lxb_char_t *data, size_t length); + +LXB_API lxb_css_rule_declaration_list_t * +lxb_css_syntax_parse_declarations(lxb_css_parser_t *parser, + const lxb_css_syntax_cb_declarations_t *cb, + const lxb_char_t *data, size_t length); + +LXB_API lxb_css_syntax_rule_t * +lxb_css_syntax_consume_list_rules(lxb_css_parser_t *parser, + const lxb_css_syntax_cb_list_rules_t *list_rules, + lxb_css_parser_state_f back, + void *ctx, lxb_css_syntax_token_type_t stop); + +LXB_API lxb_css_syntax_rule_t * +lxb_css_syntax_consume_at_rule(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + const lxb_css_syntax_cb_at_rule_t *at_rule, + lxb_css_parser_state_f back, + void *ctx, lxb_css_syntax_token_type_t stop); + +LXB_API lxb_css_syntax_rule_t * +lxb_css_syntax_consume_qualified_rule(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + const lxb_css_syntax_cb_qualified_rule_t *qualified, + lxb_css_parser_state_f back, + void *ctx, lxb_css_syntax_token_type_t stop); + +LXB_API lxb_css_syntax_rule_t * +lxb_css_syntax_consume_block(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + const lxb_css_syntax_cb_block_t *block, + lxb_css_parser_state_f back, void *ctx); + +LXB_API lxb_css_syntax_rule_t * +lxb_css_syntax_consume_declarations(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + const lxb_css_syntax_cb_declarations_t *declr, + lxb_css_parser_state_f back, void *ctx, + lxb_css_syntax_token_type_t stop); + +LXB_API lxb_css_syntax_rule_t * +lxb_css_syntax_consume_components(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + const lxb_css_syntax_cb_components_t *comp, + lxb_css_parser_state_f back, + void *ctx, lxb_css_syntax_token_type_t stop); + +LXB_API lxb_css_syntax_rule_t * +lxb_css_syntax_consume_function(lxb_css_parser_t *parser, + const lxb_css_syntax_token_t *token, + const lxb_css_syntax_cb_function_t *func, + lxb_css_parser_state_f back, void *ctx); + LXB_API lxb_status_t lxb_css_syntax_stack_expand(lxb_css_parser_t *parser, size_t count); @@ -159,6 +247,7 @@ lxb_css_syntax_ident_or_string_serialize(const lxb_char_t *data, size_t length, lexbor_serialize_cb_f cb, void *ctx); + #ifdef __cplusplus } /* extern "C" */ #endif diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/token.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/token.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/token.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/token.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2025 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -12,15 +12,12 @@ #include "lexbor/css/parser.h" #include "lexbor/css/syntax/token.h" #include "lexbor/css/syntax/state.h" -#include "lexbor/css/syntax/state_res.h" - -#define LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP #include "lexbor/css/syntax/token_res.h" -#define LEXBOR_STR_RES_MAP_HEX -#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER -#include "lexbor/core/str_res.h" - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4]; + LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256]; +#endif lxb_css_syntax_token_t * lxb_css_syntax_tokenizer_token(lxb_css_syntax_tokenizer_t *tkz); diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/token_res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/token_res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/token_res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/token_res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2025 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -7,10 +7,6 @@ #ifndef LEXBOR_CSS_SYNTAX_TOKEN_RES_H #define LEXBOR_CSS_SYNTAX_TOKEN_RES_H - -#ifdef LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP -#ifndef LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP_ENABLED -#define LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP_ENABLED static const lexbor_shs_entry_t lxb_css_syntax_token_res_name_shs_map[136] = { {NULL, NULL, 135, 0}, {NULL, NULL, 0, 0}, @@ -83,8 +79,4 @@ {NULL, NULL, 0, 0}, {"semicolon", (void *) LXB_CSS_SYNTAX_TOKEN_SEMICOLON, 9, 0} }; -#endif /* LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP_ENABLED */ -#endif /* LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP */ - - #endif /* LEXBOR_CSS_SYNTAX_TOKEN_RES_H */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/tokenizer.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/tokenizer.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/syntax/tokenizer.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/syntax/tokenizer.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2025 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -12,9 +12,10 @@ #include "lexbor/core/array.h" -#define LEXBOR_STR_RES_MAP_LOWERCASE -#include "lexbor/core/str_res.h" +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256]; +#endif static const lxb_char_t lxb_css_syntax_tokenizer_important[] = "important"; @@ -297,7 +298,7 @@ { static const size_t length = sizeof(lxb_css_syntax_tokenizer_important) - 1; - if (!(end - p >= length + if (!(lxb_size(end - p) >= length && lexbor_str_data_ncasecmp(p, lxb_css_syntax_tokenizer_important, length))) { diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/unit/const.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/unit/const.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/unit/const.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/unit/const.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Alexander Borisov + * Copyright (C) 2026 Alexander Borisov * * Author: Alexander Borisov */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/unit/res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/unit/res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/unit/res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/unit/res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Alexander Borisov + * Copyright (C) 2026 Alexander Borisov * * Author: Alexander Borisov */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/unit.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/unit.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/unit.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/unit.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2021 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/css/css.h" +#include "lexbor/css/unit/res.h" + + +const lxb_css_data_t * +lxb_css_unit_absolute_relative_by_name(const lxb_char_t *name, size_t length) +{ + const lexbor_shs_entry_t *entry; + + entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_absolute_relative_shs, + name, length); + if (entry == NULL) { + return NULL; + } + + return entry->value; +} + +const lxb_css_data_t * +lxb_css_unit_absolute_by_name(const lxb_char_t *name, size_t length) +{ + const lexbor_shs_entry_t *entry; + + entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_absolute_shs, + name, length); + if (entry == NULL) { + return NULL; + } + + return entry->value; +} + +const lxb_css_data_t * +lxb_css_unit_relative_by_name(const lxb_char_t *name, size_t length) +{ + const lexbor_shs_entry_t *entry; + + entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_relative_shs, + name, length); + if (entry == NULL) { + return NULL; + } + + return entry->value; +} + +const lxb_css_data_t * +lxb_css_unit_angle_by_name(const lxb_char_t *name, size_t length) +{ + const lexbor_shs_entry_t *entry; + + entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_angle_shs, + name, length); + if (entry == NULL) { + return NULL; + } + + return entry->value; +} + +const lxb_css_data_t * +lxb_css_unit_frequency_by_name(const lxb_char_t *name, size_t length) +{ + const lexbor_shs_entry_t *entry; + + entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_frequency_shs, + name, length); + if (entry == NULL) { + return NULL; + } + + return entry->value; +} + +const lxb_css_data_t * +lxb_css_unit_resolution_by_name(const lxb_char_t *name, size_t length) +{ + const lexbor_shs_entry_t *entry; + + entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_resolution_shs, + name, length); + if (entry == NULL) { + return NULL; + } + + return entry->value; +} + +const lxb_css_data_t * +lxb_css_unit_duration_by_name(const lxb_char_t *name, size_t length) +{ + const lexbor_shs_entry_t *entry; + + entry = lexbor_shs_entry_get_lower_static(lxb_css_unit_duration_shs, + name, length); + if (entry == NULL) { + return NULL; + } + + return entry->value; +} + +const lxb_css_data_t * +lxb_css_unit_by_id(lxb_css_type_t id) +{ + return &lxb_css_unit_data[id]; +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/value/const.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/value/const.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/value/const.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/value/const.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Alexander Borisov + * Copyright (C) 2026 Alexander Borisov * * Author: Alexander Borisov */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/value/res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/css/value/res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/value/res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/value/res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Alexander Borisov + * Copyright (C) 2026 Alexander Borisov * * Author: Alexander Borisov */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/css/value.c php8.4-8.4.21/ext/dom/lexbor/lexbor/css/value.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/css/value.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/css/value.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,678 @@ +/* + * Copyright (C) 2022-2026 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/css/css.h" +#include "lexbor/css/value/res.h" + +#include "lexbor/core/serialize.h" +#include "lexbor/core/conv.h" + + +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex_to_char_lowercase[17]; + LXB_EXTERN const char *lexbor_str_res_char_to_two_hex_value_lowercase[257]; +#endif + +static const lexbor_str_t lxb_css_value_str_ws = lexbor_str(" "); +static const lexbor_str_t lxb_str_comma = lexbor_str(", "); +static const lexbor_str_t lxb_str_alpha = lexbor_str(" / "); +static const lexbor_str_t lxb_str_rp = lexbor_str(")"); + + +const lxb_css_data_t * +lxb_css_value_by_id(uintptr_t id) +{ + if (id < LXB_CSS_VALUE__LAST_ENTRY) { + return &lxb_css_value_data[id]; + } + + return NULL; +} + +lxb_css_value_type_t +lxb_css_value_by_name(const lxb_char_t *name, size_t length) +{ + const lexbor_shs_entry_t *entry; + + entry = lexbor_shs_entry_get_lower_static(lxb_css_value_shs, name, length); + if (entry == NULL) { + return LXB_CSS_VALUE__UNDEF; + } + + return (lxb_css_value_type_t) (uintptr_t) entry->value; +} + +lxb_status_t +lxb_css_value_serialize(lxb_css_value_type_t type, + lexbor_serialize_cb_f cb, void *ctx) +{ + const lxb_css_data_t *data; + + if (type >= LXB_CSS_VALUE__LAST_ENTRY) { + return LXB_STATUS_ERROR_WRONG_ARGS; + } + + data = &lxb_css_value_data[type]; + + return cb(data->name, data->length, ctx); +} + +lxb_status_t +lxb_css_value_percentage_sr(const lxb_css_value_percentage_t *percent, + lexbor_serialize_cb_f cb, void *ctx) +{ + size_t length; + lxb_char_t buf[128]; + lxb_status_t status; + + static const lexbor_str_t str_per = lexbor_str("%"); + + /* FIXME: If length != sizeof(buf)? */ + length = lexbor_conv_float_to_data(percent->num, buf, sizeof(buf)); + + lexbor_serialize_write(cb, buf, length, ctx, status); + lexbor_serialize_write(cb, str_per.data, str_per.length, ctx, status); + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_length_sr(const lxb_css_value_length_t *len, + lexbor_serialize_cb_f cb, void *ctx) +{ + size_t length; + lxb_char_t buf[128]; + lxb_status_t status; + const lxb_css_data_t *unit; + + /* FIXME: If length != sizeof(buf)? */ + length = lexbor_conv_float_to_data(len->num, buf, sizeof(buf)); + + lexbor_serialize_write(cb, buf, length, ctx, status); + + if (len->unit == LXB_CSS_UNIT__UNDEF) { + return LXB_STATUS_OK; + } + + unit = lxb_css_unit_by_id(len->unit); + if (unit == NULL) { + return LXB_STATUS_OK; + } + + lexbor_serialize_write(cb, unit->name, unit->length, ctx, status); + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_number_sr(const lxb_css_value_number_t *number, + lexbor_serialize_cb_f cb, void *ctx) +{ + size_t length; + lxb_char_t buf[128]; + lxb_status_t status; + + /* FIXME: If length != sizeof(buf)? */ + length = lexbor_conv_float_to_data(number->num, buf, sizeof(buf)); + + lexbor_serialize_write(cb, buf, length, ctx, status); + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_integer_sr(const lxb_css_value_integer_t *integer, + lexbor_serialize_cb_f cb, void *ctx) +{ + size_t length; + lxb_char_t buf[128]; + lxb_status_t status; + + /* FIXME: If length != sizeof(buf)? */ + length = lexbor_conv_long_to_data(integer->num, buf, sizeof(buf)); + + lexbor_serialize_write(cb, buf, length, ctx, status); + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_length_percentage_sr(const lxb_css_value_length_percentage_t *lp, + lexbor_serialize_cb_f cb, void *ctx) +{ + switch (lp->type) { + case LXB_CSS_VALUE__LENGTH: + case LXB_CSS_VALUE__NUMBER: + return lxb_css_value_length_sr(&lp->u.length, cb, ctx); + + case LXB_CSS_VALUE__PERCENTAGE: + return lxb_css_value_percentage_sr(&lp->u.percentage, cb, ctx); + + case LXB_CSS_VALUE__UNDEF: + /* FIXME: ???? */ + break; + + default: + return lxb_css_value_serialize(lp->type, cb, ctx); + } + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_number_length_sr(const lxb_css_value_number_length_t *nl, + lexbor_serialize_cb_f cb, void *ctx) +{ + switch (nl->type) { + case LXB_CSS_VALUE__LENGTH: + case LXB_CSS_VALUE__NUMBER: + return lxb_css_value_length_sr(&nl->u.length, cb, ctx); + + default: + return lxb_css_value_serialize(nl->type, cb, ctx); + } + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_number_percentage_sr(const lxb_css_value_number_percentage_t *np, + lexbor_serialize_cb_f cb, void *ctx) +{ + switch (np->type) { + case LXB_CSS_VALUE__NUMBER: + return lxb_css_value_number_sr(&np->u.number, cb, ctx); + + case LXB_CSS_VALUE__PERCENTAGE: + return lxb_css_value_percentage_sr(&np->u.percentage, cb, ctx); + + case LXB_CSS_VALUE__UNDEF: + /* FIXME: ???? */ + break; + + default: + return lxb_css_value_serialize(np->type, cb, ctx); + } + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_length_type_sr(const lxb_css_value_length_type_t *lt, + lexbor_serialize_cb_f cb, void *ctx) +{ + switch (lt->type) { + case LXB_CSS_VALUE__LENGTH: + case LXB_CSS_VALUE__NUMBER: + return lxb_css_value_length_sr(<->length, cb, ctx); + + case LXB_CSS_VALUE__UNDEF: + /* FIXME: ???? */ + break; + + default: + return lxb_css_value_serialize(lt->type, cb, ctx); + } + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_percentage_type_sr(const lxb_css_value_percentage_type_t *pt, + lexbor_serialize_cb_f cb, void *ctx) +{ + switch (pt->type) { + case LXB_CSS_VALUE__PERCENTAGE: + return lxb_css_value_percentage_sr(&pt->percentage, cb, ctx); + + case LXB_CSS_VALUE__UNDEF: + /* FIXME: ???? */ + break; + + default: + return lxb_css_value_serialize(pt->type, cb, ctx); + } + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_number_type_sr(const lxb_css_value_number_type_t *num, + lexbor_serialize_cb_f cb, void *ctx) +{ + switch (num->type) { + case LXB_CSS_VALUE__NUMBER: + return lxb_css_value_number_sr(&num->number, cb, ctx); + + default: + return lxb_css_value_serialize(num->type, cb, ctx); + } + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_integer_type_sr(const lxb_css_value_integer_type_t *num, + lexbor_serialize_cb_f cb, void *ctx) +{ + switch (num->type) { + case LXB_CSS_VALUE__INTEGER: + return lxb_css_value_integer_sr(&num->integer, cb, ctx); + + default: + return lxb_css_value_serialize(num->type, cb, ctx); + } + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_length_percentage_type_sr(const lxb_css_value_length_percentage_type_t *lpt, + lexbor_serialize_cb_f cb, void *ctx) +{ + switch (lpt->type) { + case LXB_CSS_VALUE__LENGTH: + return lxb_css_value_length_percentage_sr(&lpt->length, cb, ctx); + + default: + return lxb_css_value_serialize(lpt->type, cb, ctx); + } + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_number_length_percentage_type_sr(const lxb_css_value_number_length_percentage_t *nlp, + lexbor_serialize_cb_f cb, void *ctx) +{ + switch (nlp->type) { + case LXB_CSS_VALUE__NUMBER: + return lxb_css_value_number_sr(&nlp->u.number, cb, ctx); + + case LXB_CSS_VALUE__LENGTH: + return lxb_css_value_length_sr(&nlp->u.length, cb, ctx); + + case LXB_CSS_VALUE__PERCENTAGE: + return lxb_css_value_percentage_sr(&nlp->u.percentage, cb, ctx); + + default: + return lxb_css_value_serialize(nlp->type, cb, ctx); + } + + return LXB_STATUS_OK; +} + +lxb_status_t +lxb_css_value_angle_sr(const lxb_css_value_angle_t *angle, + lexbor_serialize_cb_f cb, void *ctx) +{ + size_t length; + lxb_char_t buf[128]; + lxb_status_t status; + const lxb_css_data_t *data; + + /* FIXME: If length != sizeof(buf)? */ + length = lexbor_conv_float_to_data(angle->num, buf, sizeof(buf)); + + lexbor_serialize_write(cb, buf, length, ctx, status); + + data = lxb_css_unit_by_id(angle->unit); + + return cb(data->name, data->length, ctx); +} + +lxb_status_t +lxb_css_value_hue_sr(const lxb_css_value_hue_t *hue, + lexbor_serialize_cb_f cb, void *ctx) +{ + switch (hue->type) { + case LXB_CSS_VALUE__NUMBER: + return lxb_css_value_number_sr(&hue->u.number, cb, ctx); + + case LXB_CSS_VALUE__ANGLE: + return lxb_css_value_angle_sr(&hue->u.angle, cb, ctx); + + case LXB_CSS_VALUE__UNDEF: + /* FIXME: ???? */ + break; + + default: + return lxb_css_value_serialize(hue->type, cb, ctx); + } + + return LXB_STATUS_OK; +} + +static lxb_status_t +lxb_css_value_color_hex_sr(const lxb_css_value_color_hex_t *hex, + lexbor_serialize_cb_f cb, void *ctx) +{ + lxb_status_t status; + static const lexbor_str_t str_hash = lexbor_str("#"); + const lxb_css_value_color_hex_rgba_t *rgba = &hex->rgba; + + const lxb_char_t *hmo = lexbor_str_res_map_hex_to_char_lowercase; + const char **hmt = lexbor_str_res_char_to_two_hex_value_lowercase; + + lexbor_serialize_write(cb, str_hash.data, str_hash.length, ctx, status); + + switch (hex->type) { + case LXB_CSS_PROPERTY_COLOR_HEX_TYPE_3: + case LXB_CSS_PROPERTY_COLOR_HEX_TYPE_4: + lexbor_serialize_write(cb, &hmo[rgba->r], 1, ctx, status); + lexbor_serialize_write(cb, &hmo[rgba->g], 1, ctx, status); + lexbor_serialize_write(cb, &hmo[rgba->b], 1, ctx, status); + + if (hex->type == LXB_CSS_PROPERTY_COLOR_HEX_TYPE_4) { + lexbor_serialize_write(cb, &hmo[rgba->a], 1, ctx, status); + } + + break; + + case LXB_CSS_PROPERTY_COLOR_HEX_TYPE_6: + case LXB_CSS_PROPERTY_COLOR_HEX_TYPE_8: + lexbor_serialize_write(cb, hmt[rgba->r], 2, ctx, status); + lexbor_serialize_write(cb, hmt[rgba->g], 2, ctx, status); + lexbor_serialize_write(cb, hmt[rgba->b], 2, ctx, status); + + if (hex->type == LXB_CSS_PROPERTY_COLOR_HEX_TYPE_8) { + lexbor_serialize_write(cb, hmt[rgba->a], 2, ctx, status); + } + + break; + + default: + break; + } + + return LXB_STATUS_OK; +} + +static lxb_status_t +lxb_css_value_color_rgb_sr(const lxb_css_value_color_rgba_t *rgb, + lexbor_serialize_cb_f cb, void *ctx, + lxb_css_value_type_t type) +{ + lxb_status_t status; + const lexbor_str_t *sep; + static const lexbor_str_t str_rgb = lexbor_str("rgb("); + static const lexbor_str_t str_rgba = lexbor_str("rgba("); + + if (type == LXB_CSS_COLOR_RGB) { + lexbor_serialize_write(cb, str_rgb.data, str_rgb.length, ctx, status); + } + else { + lexbor_serialize_write(cb, str_rgba.data, str_rgba.length, ctx, status); + } + + sep = (rgb->old) ? &lxb_str_comma : &lxb_css_value_str_ws; + + status = lxb_css_value_number_percentage_sr(&rgb->r, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + lexbor_serialize_write(cb, sep->data, sep->length, ctx, status); + + status = lxb_css_value_number_percentage_sr(&rgb->g, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + lexbor_serialize_write(cb, sep->data, sep->length, ctx, status); + + status = lxb_css_value_number_percentage_sr(&rgb->b, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (rgb->a.type == LXB_CSS_VALUE__UNDEF) { + return cb(lxb_str_rp.data, lxb_str_rp.length, ctx); + } + + sep = (rgb->old) ? &lxb_str_comma : &lxb_str_alpha; + + lexbor_serialize_write(cb, sep->data, sep->length, ctx, status); + + status = lxb_css_value_number_percentage_sr(&rgb->a, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + return cb(lxb_str_rp.data, lxb_str_rp.length, ctx); +} + +static lxb_status_t +lxb_css_value_color_hsl_sr(const lxb_css_value_color_hsla_t *hsl, + lexbor_serialize_cb_f cb, void *ctx, + lxb_css_value_type_t type) +{ + lxb_status_t status; + const lexbor_str_t *sep; + static const lexbor_str_t str_hsl = lexbor_str("hsl("); + static const lexbor_str_t str_hsla = lexbor_str("hsla("); + static const lexbor_str_t str_hwb = lexbor_str("hwb("); + + switch (type) { + case LXB_CSS_COLOR_HSL: + status = cb(str_hsl.data, str_hsl.length, ctx); + break; + + case LXB_CSS_COLOR_HSLA: + status = cb(str_hsla.data, str_hsla.length, ctx); + break; + + case LXB_CSS_COLOR_HWB: + status = cb(str_hwb.data, str_hwb.length, ctx); + break; + + default: + return LXB_STATUS_ERROR_WRONG_ARGS; + } + + if (status != LXB_STATUS_OK) { + return status; + } + + sep = (hsl->old) ? &lxb_str_comma : &lxb_css_value_str_ws; + + status = lxb_css_value_hue_sr(&hsl->h, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + lexbor_serialize_write(cb, sep->data, sep->length, ctx, status); + + status = lxb_css_value_percentage_type_sr(&hsl->s, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + lexbor_serialize_write(cb, sep->data, sep->length, ctx, status); + + status = lxb_css_value_percentage_type_sr(&hsl->l, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (hsl->a.type == LXB_CSS_VALUE__UNDEF) { + return cb(lxb_str_rp.data, lxb_str_rp.length, ctx); + } + + sep = (hsl->old) ? &lxb_str_comma : &lxb_str_alpha; + + lexbor_serialize_write(cb, sep->data, sep->length, ctx, status); + + status = lxb_css_value_number_percentage_sr(&hsl->a, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + return cb(lxb_str_rp.data, lxb_str_rp.length, ctx); +} + +static lxb_status_t +lxb_css_value_color_lab_sr(const lxb_css_value_color_lab_t *lab, + lexbor_serialize_cb_f cb, void *ctx, + lxb_css_value_type_t type) +{ + lxb_status_t status; + static const lexbor_str_t str_lab = lexbor_str("lab("); + static const lexbor_str_t str_oklab = lexbor_str("oklab("); + + switch (type) { + case LXB_CSS_COLOR_LAB: + status = cb(str_lab.data, str_lab.length, ctx); + break; + + case LXB_CSS_COLOR_OKLAB: + status = cb(str_oklab.data, str_oklab.length, ctx); + break; + + default: + return LXB_STATUS_ERROR_WRONG_ARGS; + } + + if (status != LXB_STATUS_OK) { + return status; + } + + status = lxb_css_value_number_percentage_sr(&lab->l, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + lexbor_serialize_write(cb, lxb_css_value_str_ws.data, + lxb_css_value_str_ws.length, ctx, status); + + status = lxb_css_value_number_percentage_sr(&lab->a, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + lexbor_serialize_write(cb, lxb_css_value_str_ws.data, + lxb_css_value_str_ws.length, ctx, status); + + status = lxb_css_value_number_percentage_sr(&lab->b, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (lab->alpha.type == LXB_CSS_VALUE__UNDEF) { + return cb(lxb_str_rp.data, lxb_str_rp.length, ctx); + } + + lexbor_serialize_write(cb, lxb_str_alpha.data, lxb_str_alpha.length, + ctx, status); + + status = lxb_css_value_number_percentage_sr(&lab->alpha, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + return cb(lxb_str_rp.data, lxb_str_rp.length, ctx); +} + +static lxb_status_t +lxb_css_value_color_lch_sr(const lxb_css_value_color_lch_t *lch, + lexbor_serialize_cb_f cb, void *ctx, + lxb_css_value_type_t type) +{ + lxb_status_t status; + static const lexbor_str_t str_lch = lexbor_str("lch("); + static const lexbor_str_t str_oklch = lexbor_str("oklch("); + + switch (type) { + case LXB_CSS_COLOR_LCH: + status = cb(str_lch.data, str_lch.length, ctx); + break; + + case LXB_CSS_COLOR_OKLCH: + status = cb(str_oklch.data, str_oklch.length, ctx); + break; + + default: + return LXB_STATUS_ERROR_WRONG_ARGS; + } + + if (status != LXB_STATUS_OK) { + return status; + } + + status = lxb_css_value_number_percentage_sr(&lch->l, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + lexbor_serialize_write(cb, lxb_css_value_str_ws.data, + lxb_css_value_str_ws.length, ctx, status); + + status = lxb_css_value_number_percentage_sr(&lch->c, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + lexbor_serialize_write(cb, lxb_css_value_str_ws.data, + lxb_css_value_str_ws.length, ctx, status); + + status = lxb_css_value_hue_sr(&lch->h, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + if (lch->a.type == LXB_CSS_VALUE__UNDEF) { + return cb(lxb_str_rp.data, lxb_str_rp.length, ctx); + } + + lexbor_serialize_write(cb, lxb_str_alpha.data, lxb_str_alpha.length, + ctx, status); + + status = lxb_css_value_number_percentage_sr(&lch->a, cb, ctx); + if (status != LXB_STATUS_OK) { + return status; + } + + return cb(lxb_str_rp.data, lxb_str_rp.length, ctx); +} + +lxb_status_t +lxb_css_value_color_serialize(const lxb_css_value_color_t *color, + lexbor_serialize_cb_f cb, void *ctx) +{ + switch (color->type) { + case LXB_CSS_COLOR_HEX: + return lxb_css_value_color_hex_sr(&color->u.hex, cb, ctx); + + case LXB_CSS_COLOR_RGB: + case LXB_CSS_COLOR_RGBA: + return lxb_css_value_color_rgb_sr(&color->u.rgb, cb, ctx, + color->type); + + case LXB_CSS_COLOR_HSL: + case LXB_CSS_COLOR_HSLA: + case LXB_CSS_COLOR_HWB: + return lxb_css_value_color_hsl_sr(&color->u.hsl, cb, ctx, + color->type); + + case LXB_CSS_COLOR_LAB: + case LXB_CSS_COLOR_OKLAB: + return lxb_css_value_color_lab_sr(&color->u.lab, cb, ctx, + color->type); + + case LXB_CSS_COLOR_LCH: + case LXB_CSS_COLOR_OKLCH: + return lxb_css_value_color_lch_sr(&color->u.lch, cb, ctx, + color->type); + + case LXB_CSS_VALUE__UNDEF: + break; + + default: + return lxb_css_value_serialize(color->type, cb, ctx); + } + + return LXB_STATUS_OK; +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/base.h php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/base.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/base.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/base.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 Alexander Borisov + * Copyright (C) 2019-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -15,8 +15,8 @@ #include "lexbor/core/base.h" -#define LXB_DOM_VERSION_MAJOR 1 -#define LXB_DOM_VERSION_MINOR 8 +#define LXB_DOM_VERSION_MAJOR 2 +#define LXB_DOM_VERSION_MINOR 0 #define LXB_DOM_VERSION_PATCH 0 #define LXB_DOM_VERSION_STRING \ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/exception.c php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/exception.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/exception.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/exception.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,18 +1,372 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2025 Alexander Borisov * * Author: Alexander Borisov */ #include "lexbor/dom/exception.h" +#include "lexbor/dom/interfaces/document.h" -/* - * No inline functions for ABI. - */ -void * -lxb_dom_exception_code_ref_set_noi(lxb_dom_exception_code_t *var, - lxb_dom_exception_code_t code) +typedef struct { + lexbor_str_t name; + lexbor_str_t message; +} +lxb_dom_exception_data_t; + + +static const lxb_dom_exception_data_t lxb_dom_exception_data[LXB_DOM_EXCEPTION__LAST_ENTRY] = +{ + { + lexbor_str("Error"), + lexbor_str("") + }, + { + lexbor_str("IndexSizeError"), + lexbor_str("Deprecated. Use RangeError instead.") + }, + { + lexbor_str("DOMStringSizeError"), + lexbor_str("") + }, + { + lexbor_str("HierarchyRequestError"), + lexbor_str("The operation would yield an incorrect node tree.") + }, + { + lexbor_str("WrongDocumentError"), + lexbor_str("The object is in the wrong document.") + }, + { + lexbor_str("InvalidCharacterError"), + lexbor_str("The string contains invalid characters.") + }, + { + lexbor_str("NoDataAllowedError"), + lexbor_str("") + }, + { + lexbor_str("NoModificationAllowedError"), + lexbor_str("The object can not be modified.") + }, + { + lexbor_str("NotFoundError"), + lexbor_str("The object can not be found here.") + }, + { + lexbor_str("NotSupportedError"), + lexbor_str("The operation is not supported.") + }, + { + lexbor_str("InUseAttributeError"), + lexbor_str("The attribute is in use by another element.") + }, + { + lexbor_str("InvalidStateError"), + lexbor_str("The object is in an invalid state.") + }, + { + lexbor_str("SyntaxError"), + lexbor_str("The string did not match the expected pattern.") + }, + { + lexbor_str("InvalidModificationError"), + lexbor_str("The object can not be modified in this way.") + }, + { + lexbor_str("NamespaceError"), + lexbor_str("The operation is not allowed by Namespaces in XML.") + }, + { + lexbor_str("InvalidAccessError"), + lexbor_str("Deprecated. Use TypeError for invalid arguments, " + "\"NotSupportedError\" DOMException for unsupported operations, " + "and \"NotAllowedError\" DOMException for denied requests instead.") + }, + { + lexbor_str("ValidationError"), + lexbor_str("") + }, + { + lexbor_str("TypeMismatchError"), + lexbor_str("Deprecated. Use TypeError instead.") + }, + { + lexbor_str("SecurityError"), + lexbor_str("The operation is insecure.") + }, + { + lexbor_str("NetworkError"), + lexbor_str("A network error occurred.") + }, + { + lexbor_str("AbortError"), + lexbor_str("The operation was aborted.") + }, + { + lexbor_str("URLMismatchError"), + lexbor_str("Deprecated.") + }, + { + lexbor_str("QuotaExceededError"), + lexbor_str("Deprecated. Use the QuotaExceededError DOMException-derived " + "interface instead.") + }, + { + lexbor_str("TimeoutError"), + lexbor_str("The operation timed out.") + }, + { + lexbor_str("InvalidNodeTypeError"), + lexbor_str("The supplied node is incorrect or has an incorrect ancestor " + "for this operation.") + }, + { + lexbor_str("DataCloneError"), + lexbor_str("The object can not be cloned.") + }, + { + lexbor_str("EncodingError"), + lexbor_str("The encoding operation (either encoded or decoding) failed.") + }, + { + lexbor_str("NotReadableError"), + lexbor_str("The I/O read operation failed.") + }, + { + lexbor_str("UnknownError"), + lexbor_str("The operation failed for an unknown transient reason " + "(e.g. out of memory).") + }, + { + lexbor_str("ConstraintError"), + lexbor_str("A mutation operation in a transaction failed because a " + "constraint was not satisfied.") + }, + { + lexbor_str("DataError"), + lexbor_str("Provided data is inadequate.") + }, + { + lexbor_str("TransactionInactiveError"), + lexbor_str("A request was placed against a transaction which is currently" + " not active, or which is finished.") + }, + { + lexbor_str("ReadOnlyError"), + lexbor_str("The mutating operation was attempted in a \"readonly\" transaction.") + }, + { + lexbor_str("VersionError"), + lexbor_str("An attempt was made to open a database using a lower version" + " than the existing version.") + }, + { + lexbor_str("OperationError"), + lexbor_str("The operation failed for an operation-specific reason.") + }, + { + lexbor_str("NotAllowedError"), + lexbor_str("The request is not allowed by the user agent or the platform" + " in the current context, possibly because the user denied permission.") + }, + { + lexbor_str("OptOutError"), + lexbor_str("The user opted out of the process.") + } +}; + + +lxb_dom_exception_t * +lxb_dom_exception_create(lxb_dom_document_t *document, + const lxb_char_t *message, size_t message_length, + const lxb_char_t *name, size_t name_length) +{ + lexbor_str_t *str; + const lxb_dom_exception_data_t *data; + lxb_dom_exception_t *exception; + + exception = lexbor_mraw_alloc(document->mraw, sizeof(lxb_dom_exception_t)); + if (exception == NULL) { + return NULL; + } + + exception->document = document; + + if (name != NULL && name_length > 0) { + exception->code = lxb_dom_exception_code_by_name(name, name_length); + } + else { + exception->code = LXB_DOM_EXCEPTION_ERR; + } + + /* Message. */ + + if (message == NULL || message_length == 0) { + data = &lxb_dom_exception_data[exception->code]; + exception->message = *((lexbor_str_t *) &data->message); + } + else { + str = &exception->message; + str->data = lexbor_mraw_alloc(document->mraw, message_length + 1); + if (str->data == NULL) { + goto failed; + } + + memcpy(str->data, message, message_length); + + str->data[message_length] = '\0'; + str->length = message_length; + } + + /* Name. */ + + if (exception->code != LXB_DOM_EXCEPTION_ERR + || name == NULL || name_length == 0) + { + data = &lxb_dom_exception_data[exception->code]; + exception->name = *((lexbor_str_t *) &data->name); + } + else { + str = &exception->name; + str->data = lexbor_mraw_alloc(document->mraw, name_length + 1); + if (str->data == NULL) { + if (exception->message.length != 0) { + lexbor_mraw_free(document->mraw, exception->message.data); + } + + goto failed; + } + + memcpy(str->data, name, name_length); + + str->data[name_length] = '\0'; + str->length = name_length; + } + + return exception; + +failed: + + lexbor_mraw_free(document->mraw, exception); + + return NULL; +} + +lxb_dom_exception_t * +lxb_dom_exception_create_by_code(lxb_dom_document_t *document, + const lxb_char_t *message, size_t length, + lxb_dom_exception_code_t code) { - return lxb_dom_exception_code_ref_set(var, code); + lexbor_str_t *str; + const lxb_dom_exception_data_t *data; + lxb_dom_exception_t *exception; + + if (code <= LXB_DOM_EXCEPTION_OK || code >= LXB_DOM_EXCEPTION__LAST_ENTRY) { + return NULL; + } + + exception = lexbor_mraw_alloc(document->mraw, sizeof(lxb_dom_exception_t)); + if (exception == NULL) { + return NULL; + } + + exception->document = document; + exception->code = code; + + data = &lxb_dom_exception_data[code]; + + /* Message. */ + + if (message == NULL || length == 0) { + exception->message = *((lexbor_str_t *) &data->message); + } + else { + str = &exception->message; + str->data = lexbor_mraw_alloc(document->mraw, length + 1); + if (str->data == NULL) { + goto failed; + } + + memcpy(str->data, message, length); + + str->data[length] = '\0'; + str->length = length; + } + + /* Name. */ + + exception->name = *((lexbor_str_t *) &data->name); + + return exception; + +failed: + + lexbor_mraw_free(document->mraw, exception); + + return NULL; +} + +lxb_dom_exception_t * +lxb_dom_exception_destroy(lxb_dom_exception_t *exception) +{ + const lxb_dom_exception_data_t *data; + lxb_dom_document_t *document = exception->document; + + data = &lxb_dom_exception_data[exception->code]; + + if (exception->message.data != NULL + && exception->message.data != data->message.data) + { + lexbor_mraw_free(document->mraw, exception->message.data); + } + + if (exception->name.data != NULL + && exception->name.data != data->name.data) + { + lexbor_mraw_free(document->mraw, exception->name.data); + } + + lexbor_mraw_free(document->mraw, exception); + + return NULL; +} + +const lexbor_str_t * +lxb_dom_exception_message_by_code(lxb_dom_exception_code_t code) +{ + if (code <= LXB_DOM_EXCEPTION_OK || code >= LXB_DOM_EXCEPTION__LAST_ENTRY) { + return NULL; + } + + return &lxb_dom_exception_data[code].message; +} + +const lexbor_str_t * +lxb_dom_exception_name_by_code(lxb_dom_exception_code_t code) +{ + if (code <= LXB_DOM_EXCEPTION_OK || code >= LXB_DOM_EXCEPTION__LAST_ENTRY) { + return NULL; + } + + return &lxb_dom_exception_data[code].name; +} + +lxb_dom_exception_code_t +lxb_dom_exception_code_by_name(const lxb_char_t *name, size_t length) +{ + const lexbor_str_t *str; + lxb_dom_exception_code_t code; + + for (code = 0; code < LXB_DOM_EXCEPTION__LAST_ENTRY; code++) { + str = &lxb_dom_exception_data[code].name; + + if (length == str->length + && lexbor_str_data_ncasecmp(str->data, name, length)) + { + return code; + } + } + + return LXB_DOM_EXCEPTION_ERR; } diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/exception.h php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/exception.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/exception.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/exception.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2025 Alexander Borisov * * Author: Alexander Borisov */ @@ -12,58 +12,84 @@ #endif #include "lexbor/core/base.h" +#include "lexbor/core/str.h" +#include "lexbor/dom/interface.h" typedef enum { - LXB_DOM_INDEX_SIZE_ERR = 0x00, - LXB_DOM_DOMSTRING_SIZE_ERR, - LXB_DOM_HIERARCHY_REQUEST_ERR, - LXB_DOM_WRONG_DOCUMENT_ERR, - LXB_DOM_INVALID_CHARACTER_ERR, - LXB_DOM_NO_DATA_ALLOWED_ERR, - LXB_DOM_NO_MODIFICATION_ALLOWED_ERR, - LXB_DOM_NOT_FOUND_ERR, - LXB_DOM_NOT_SUPPORTED_ERR, - LXB_DOM_INUSE_ATTRIBUTE_ERR, - LXB_DOM_INVALID_STATE_ERR, - LXB_DOM_SYNTAX_ERR, - LXB_DOM_INVALID_MODIFICATION_ERR, - LXB_DOM_NAMESPACE_ERR, - LXB_DOM_INVALID_ACCESS_ERR, - LXB_DOM_VALIDATION_ERR, - LXB_DOM_TYPE_MISMATCH_ERR, - LXB_DOM_SECURITY_ERR, - LXB_DOM_NETWORK_ERR, - LXB_DOM_ABORT_ERR, - LXB_DOM_URL_MISMATCH_ERR, - LXB_DOM_QUOTA_EXCEEDED_ERR, - LXB_DOM_TIMEOUT_ERR, - LXB_DOM_INVALID_NODE_TYPE_ERR, - LXB_DOM_DATA_CLONE_ERR + LXB_DOM_EXCEPTION_OK = -1, + LXB_DOM_EXCEPTION_ERR = 0, + LXB_DOM_EXCEPTION_INDEX_SIZE_ERR = 1, /* Deprecated. */ + LXB_DOM_EXCEPTION_DOMSTRING_SIZE_ERR, + LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR, + LXB_DOM_EXCEPTION_WRONG_DOCUMENT_ERR, + LXB_DOM_EXCEPTION_INVALID_CHARACTER_ERR, + LXB_DOM_EXCEPTION_NO_DATA_ALLOWED_ERR, + LXB_DOM_EXCEPTION_NO_MODIFICATION_ALLOWED_ERR, + LXB_DOM_EXCEPTION_NOT_FOUND_ERR, + LXB_DOM_EXCEPTION_NOT_SUPPORTED_ERR, + LXB_DOM_EXCEPTION_INUSE_ATTRIBUTE_ERR, + LXB_DOM_EXCEPTION_INVALID_STATE_ERR, + LXB_DOM_EXCEPTION_SYNTAX_ERR, + LXB_DOM_EXCEPTION_INVALID_MODIFICATION_ERR, + LXB_DOM_EXCEPTION_NAMESPACE_ERR, + LXB_DOM_EXCEPTION_INVALID_ACCESS_ERR, /* Deprecated. */ + LXB_DOM_EXCEPTION_VALIDATION_ERR, + LXB_DOM_EXCEPTION_TYPE_MISMATCH_ERR, /* Deprecated. */ + LXB_DOM_EXCEPTION_SECURITY_ERR, + LXB_DOM_EXCEPTION_NETWORK_ERR, + LXB_DOM_EXCEPTION_ABORT_ERR, + LXB_DOM_EXCEPTION_URL_MISMATCH_ERR, /* Deprecated. */ + LXB_DOM_EXCEPTION_QUOTA_EXCEEDED_ERR, /* Deprecated. */ + LXB_DOM_EXCEPTION_TIMEOUT_ERR, + LXB_DOM_EXCEPTION_INVALID_NODE_TYPE_ERR, + LXB_DOM_EXCEPTION_DATA_CLONE_ERR, + LXB_DOM_EXCEPTION_ENCODING_ERR, + LXB_DOM_EXCEPTION_NOT_READABLE_ERR, + LXB_DOM_EXCEPTION_UNKNOWN_ERR, + LXB_DOM_EXCEPTION_CONSTRAINT_ERR, + LXB_DOM_EXCEPTION_DATA_ERR, + LXB_DOM_EXCEPTION_TRANSACTION_INACTIVE_ERR, + LXB_DOM_EXCEPTION_READ_ONLY_ERR, + LXB_DOM_EXCEPTION_VERSION_ERR, + LXB_DOM_EXCEPTION_OPERATION_ERR, + LXB_DOM_EXCEPTION_NOT_ALLOWED_ERR, + LXB_DOM_EXCEPTION_OPT_OUT_ERR, + LXB_DOM_EXCEPTION__LAST_ENTRY } lxb_dom_exception_code_t; +typedef struct { + lexbor_str_t name; + lexbor_str_t message; + lxb_dom_exception_code_t code; + lxb_dom_document_t *document; +} +lxb_dom_exception_t; -/* - * Inline functions - */ -lxb_inline void * -lxb_dom_exception_code_ref_set(lxb_dom_exception_code_t *var, - lxb_dom_exception_code_t code) -{ - if (var != NULL) { - *var = code; - } - return NULL; -} +LXB_API lxb_dom_exception_t * +lxb_dom_exception_create(lxb_dom_document_t *document, + const lxb_char_t *message, size_t message_length, + const lxb_char_t *name, size_t name_length); -/* - * No inline functions for ABI. - */ -LXB_API void * -lxb_dom_exception_code_ref_set_noi(lxb_dom_exception_code_t *var, - lxb_dom_exception_code_t code); +LXB_API lxb_dom_exception_t * +lxb_dom_exception_create_by_code(lxb_dom_document_t *document, + const lxb_char_t *message, size_t length, + lxb_dom_exception_code_t code); + +LXB_API lxb_dom_exception_t * +lxb_dom_exception_destroy(lxb_dom_exception_t *exception); + + +LXB_API const lexbor_str_t * +lxb_dom_exception_message_by_code(lxb_dom_exception_code_t code); + +LXB_API const lexbor_str_t * +lxb_dom_exception_name_by_code(lxb_dom_exception_code_t code); + +LXB_API lxb_dom_exception_code_t +lxb_dom_exception_code_by_name(const lxb_char_t *name, size_t length); #ifdef __cplusplus diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interface.h php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interface.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interface.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interface.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2021 Alexander Borisov + * Copyright (C) 2018-2025 Alexander Borisov * * Author: Alexander Borisov */ @@ -16,8 +16,6 @@ #include "lexbor/tag/const.h" #include "lexbor/ns/const.h" -#include "lexbor/dom/exception.h" - #define lxb_dom_interface_cdata_section(obj) ((lxb_dom_cdata_section_t *) (obj)) #define lxb_dom_interface_character_data(obj) ((lxb_dom_character_data_t *) (obj)) diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/attr_const.h php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/attr_const.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/attr_const.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/attr_const.h 2026-05-05 16:34:12.000000000 +0000 @@ -39,22 +39,23 @@ LXB_DOM_ATTR_ID = 0x0012, LXB_DOM_ATTR_IS = 0x0013, LXB_DOM_ATTR_MAXLENGTH = 0x0014, - LXB_DOM_ATTR_PLACEHOLDER = 0x0015, - LXB_DOM_ATTR_POOL = 0x0016, - LXB_DOM_ATTR_PUBLIC = 0x0017, - LXB_DOM_ATTR_READONLY = 0x0018, - LXB_DOM_ATTR_REQUIRED = 0x0019, - LXB_DOM_ATTR_SCHEME = 0x001a, - LXB_DOM_ATTR_SELECTED = 0x001b, - LXB_DOM_ATTR_SIZE = 0x001c, - LXB_DOM_ATTR_SLOT = 0x001d, - LXB_DOM_ATTR_SRC = 0x001e, - LXB_DOM_ATTR_STYLE = 0x001f, - LXB_DOM_ATTR_SYSTEM = 0x0020, - LXB_DOM_ATTR_TITLE = 0x0021, - LXB_DOM_ATTR_TYPE = 0x0022, - LXB_DOM_ATTR_WIDTH = 0x0023, - LXB_DOM_ATTR__LAST_ENTRY = 0x0024 + LXB_DOM_ATTR_MULTIPLE = 0x0015, + LXB_DOM_ATTR_PLACEHOLDER = 0x0016, + LXB_DOM_ATTR_POOL = 0x0017, + LXB_DOM_ATTR_PUBLIC = 0x0018, + LXB_DOM_ATTR_READONLY = 0x0019, + LXB_DOM_ATTR_REQUIRED = 0x001a, + LXB_DOM_ATTR_SCHEME = 0x001b, + LXB_DOM_ATTR_SELECTED = 0x001c, + LXB_DOM_ATTR_SIZE = 0x001d, + LXB_DOM_ATTR_SLOT = 0x001e, + LXB_DOM_ATTR_SRC = 0x001f, + LXB_DOM_ATTR_STYLE = 0x0020, + LXB_DOM_ATTR_SYSTEM = 0x0021, + LXB_DOM_ATTR_TITLE = 0x0022, + LXB_DOM_ATTR_TYPE = 0x0023, + LXB_DOM_ATTR_WIDTH = 0x0024, + LXB_DOM_ATTR__LAST_ENTRY = 0x0025 } lxb_dom_attr_id_enum_t; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/attr_res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/attr_res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/attr_res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/attr_res.h 2026-05-05 16:34:12.000000000 +0000 @@ -63,6 +63,8 @@ LXB_DOM_ATTR_IS, 1, true}, {{.u.short_str = "maxlength", .length = 9, .next = NULL}, LXB_DOM_ATTR_MAXLENGTH, 1, true}, + {{.u.short_str = "multiple", .length = 8, .next = NULL}, + LXB_DOM_ATTR_MULTIPLE, 1, true}, {{.u.short_str = "placeholder", .length = 11, .next = NULL}, LXB_DOM_ATTR_PLACEHOLDER, 1, true}, {{.u.short_str = "pool", .length = 4, .next = NULL}, @@ -127,7 +129,7 @@ {"is", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_IS], 2, 0}, {"type", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_TYPE], 4, 0}, {"title", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_TITLE], 5, 0}, - {NULL, NULL, 0, 0}, + {"multiple", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_MULTIPLE], 8, 0}, {"for", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_FOR], 3, 0}, {"face", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_FACE], 4, 22}, {"alt", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_ALT], 3, 23}, @@ -135,7 +137,7 @@ {"charset", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_CHARSET], 7, 26}, {"maxlength", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_MAXLENGTH], 9, 0}, {NULL, NULL, 0, 0}, - {"checked", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_CHECKED], 7, 0}, + {"checked", (void *) &lxb_dom_attr_res_data_default[LXB_DOM_ATTR_CHECKED], 7, 30}, {NULL, NULL, 0, 0} }; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/character_data.c php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/character_data.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/character_data.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/character_data.c 2026-05-05 16:34:12.000000000 +0000 @@ -22,7 +22,7 @@ lxb_dom_node_t *node = lxb_dom_interface_node(element); node->owner_document = lxb_dom_document_owner(document); - node->type = LXB_DOM_NODE_TYPE_UNDEF; + node->type = LXB_DOM_NODE_TYPE_CHARACTER_DATA; return element; } diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/document_type.c php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/document_type.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/document_type.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/document_type.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2021 Alexander Borisov + * Copyright (C) 2018-2025 Alexander Borisov * * Author: Alexander Borisov */ @@ -12,6 +12,10 @@ lxb_dom_attr_qualified_name_append(lexbor_hash_t *hash, const lxb_char_t *name, size_t length); +LXB_API lxb_dom_attr_data_t * +lxb_dom_attr_local_name_append(lexbor_hash_t *hash, + const lxb_char_t *name, size_t length); + lxb_dom_document_type_t * lxb_dom_document_type_interface_create(lxb_dom_document_t *document) @@ -29,6 +33,8 @@ node->owner_document = lxb_dom_document_owner(document); node->type = LXB_DOM_NODE_TYPE_DOCUMENT_TYPE; + element->name = LXB_DOM_ATTR_HTML; + return element; } @@ -105,6 +111,103 @@ return NULL; } +lxb_dom_document_type_t * +lxb_dom_document_type_create(lxb_dom_document_t *document, + const lxb_char_t *name, size_t name_len, + const lxb_char_t *pub, size_t pub_len, + const lxb_char_t *sys, size_t sys_len, + lxb_dom_exception_code_t *code) +{ + lxb_dom_attr_data_t *data; + lxb_dom_document_type_t *doctype; + + if (!lxb_dom_document_type_valid_name(name, name_len)) { + if (code != NULL) { + *code = LXB_DOM_EXCEPTION_INVALID_CHARACTER_ERR; + } + + return NULL; + } + + doctype = lxb_dom_document_type_interface_create(document); + if (doctype == NULL) { + goto failed; + } + + data = lxb_dom_attr_local_name_append(document->attrs, name, name_len); + if (data == NULL) { + goto failed; + } + + doctype->name = data->attr_id; + + if (pub != NULL && pub_len != 0) { + doctype->public_id.data = lxb_dom_document_create_text(document, + pub_len + 1); + if (doctype->public_id.data == NULL) { + goto failed; + } + + (void) lexbor_str_copy_to_with_null(&doctype->public_id, pub, pub_len); + } + + if (sys != NULL && sys_len != 0) { + doctype->system_id.data = lxb_dom_document_create_text(document, + sys_len + 1); + if (doctype->system_id.data == NULL) { + goto failed; + } + + (void) lexbor_str_copy_to_with_null(&doctype->system_id, sys, sys_len); + } + + if (code != NULL) { + *code = LXB_DOM_EXCEPTION_OK; + } + + return doctype; + +failed: + + if (doctype != NULL && doctype->public_id.data != NULL) { + lxb_dom_document_destroy_text(document, doctype->public_id.data); + } + + if (code != NULL) { + *code = LXB_DOM_EXCEPTION_ERR; + } + + return NULL; +} + +bool +lxb_dom_document_type_valid_name(const lxb_char_t *name, size_t length) +{ + lxb_char_t c; + const lxb_char_t *end; + + if (name == NULL || length == 0) { + return false; + } + + end = name + length; + + while (name < end) { + c = *name++; + /* + * U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, or U+0020 SPACE, + * or U+0000 NULL, or U+003E (>) + */ + if (c == 0x09 || c == 0x0A || c == 0x0C || c == 0x0D || c == 0x20 + || c == 0x00 || c == 0x3E) + { + return false; + } + } + + return true; +} + /* * No inline functions for ABI. */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/document_type.h php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/document_type.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/document_type.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/document_type.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2021 Alexander Borisov + * Copyright (C) 2018-2025 Alexander Borisov * * Author: Alexander Borisov */ @@ -37,6 +37,34 @@ LXB_API lxb_dom_document_type_t * lxb_dom_document_type_interface_destroy(lxb_dom_document_type_t *document_type); +/* + * Create DocumentType by specification. + * + * https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype + * + * @param[in] lxb_dom_document_t *. Not NULL. + * @param[in] const lxb_char_t *. Name. May be NULL, but then the return value + * will be NULL and an exception code will be recorded. + * @param[in] size_t. Length of name. May be 0, but then the return value + * will be NULL and an exception code will be recorded. + * @param[in] const lxb_char_t *. PublicID. Can be NULL. + * @param[in] size_t. Length of PublicID. Can be 0. + * @param[in] const lxb_char_t *. SystemID. Can be NULL. + * @param[in] size_t. Length of SystemID. Can be 0. + * @param[out] lxb_dom_exception_code_t. Can be NULL. If the variable is passed, + * the code will definitely be assigned. LXB_DOM_EXCEPTION_OK + * if successful. + * + * @return lxb_dom_document_type_t * if successful, otherwise NULL. + */ +LXB_API lxb_dom_document_type_t * +lxb_dom_document_type_create(lxb_dom_document_t *document, + const lxb_char_t *name, size_t name_len, + const lxb_char_t *pub, size_t pub_len, + const lxb_char_t *sys, size_t sys_len, + lxb_dom_exception_code_t *code); +LXB_API bool +lxb_dom_document_type_valid_name(const lxb_char_t *ame, size_t name_len); /* * Inline functions diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/element.c php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/element.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/element.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/element.c 2026-05-05 16:34:12.000000000 +0000 @@ -581,6 +581,18 @@ return LXB_STATUS_OK; } +lxb_dom_element_t * +lxb_dom_element_by_id(lxb_dom_element_t *root, + const lxb_char_t *qualified_name, size_t len) +{ + lxb_dom_node_t *node; + + node = lxb_dom_node_by_id(lxb_dom_interface_node(root), + qualified_name, len); + + return lxb_dom_interface_element(node); +} + lxb_status_t lxb_dom_elements_by_tag_name(lxb_dom_element_t *root, lxb_dom_collection_t *collection, diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/element.h php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/element.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/element.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/element.h 2026-05-05 16:34:12.000000000 +0000 @@ -135,6 +135,10 @@ lxb_dom_element_is_set(lxb_dom_element_t *element, const lxb_char_t *is, size_t is_len); +LXB_API lxb_dom_element_t * +lxb_dom_element_by_id(lxb_dom_element_t *root, + const lxb_char_t *qualified_name, size_t len); + LXB_API lxb_status_t lxb_dom_elements_by_tag_name(lxb_dom_element_t *root, lxb_dom_collection_t *collection, diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/node.c php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/node.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/node.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/node.c 2026-05-05 16:34:12.000000000 +0000 @@ -10,6 +10,7 @@ #include "lexbor/dom/interfaces/document_type.h" #include "lexbor/dom/interfaces/element.h" #include "lexbor/dom/interfaces/processing_instruction.h" +#include "lexbor/dom/interfaces/shadow_root.h" typedef struct lxb_dom_node_cb_ctx lxb_dom_node_cb_ctx_t; @@ -29,6 +30,13 @@ size_t value_length; }; +typedef struct { + lxb_dom_node_t *node; + const lxb_char_t *value; + size_t length; +} +lxb_dom_node_id_cb_ctx_t; + LXB_API lxb_dom_attr_data_t * lxb_dom_attr_local_name_append(lexbor_hash_t *hash, @@ -45,6 +53,9 @@ lxb_dom_node_by_tag_name_cb(lxb_dom_node_t *node, void *ctx); static lexbor_action_t +lxb_dom_node_by_id_cb(lxb_dom_node_t *node, void *ctx); + +static lexbor_action_t lxb_dom_node_by_tag_name_cb_all(lxb_dom_node_t *node, void *ctx); static lexbor_action_t @@ -443,6 +454,373 @@ } } +lxb_dom_exception_code_t +lxb_dom_node_pre_insert_validity(lxb_dom_node_t *parent, lxb_dom_node_t *node, + lxb_dom_node_t *child) +{ + size_t count; + lxb_dom_node_t *tmp; + + /* + * If parent is not a Document, DocumentFragment, or Element node, then + * throw a "HierarchyRequestError" DOMException. + */ + if (parent == NULL) { + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + + switch (parent->type) { + case LXB_DOM_NODE_TYPE_ELEMENT: + case LXB_DOM_NODE_TYPE_DOCUMENT: + case LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT: + break; + + default: + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + + if (lxb_dom_node_host_including_inclusive_ancestor(node, parent)) { + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + + /* + * If child is non-null and its parent is not parent, + * then throw a "NotFoundError" DOMException. + */ + if (child != NULL && parent != child->parent) { + return LXB_DOM_EXCEPTION_NOT_FOUND_ERR; + } + + /* + * If node is not a DocumentFragment, DocumentType, Element, + * or CharacterData node, then throw a "HierarchyRequestError" DOMException. + */ + if (node == NULL) { + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + + switch (parent->type) { + case LXB_DOM_NODE_TYPE_ELEMENT: + case LXB_DOM_NODE_TYPE_DOCUMENT: + case LXB_DOM_NODE_TYPE_DOCUMENT_TYPE: + case LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT: + case LXB_DOM_NODE_TYPE_CHARACTER_DATA: + case LXB_DOM_NODE_TYPE_TEXT: + break; + + default: + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + + /* + * If either node is a Text node and parent is a document, or node is + * a doctype and parent is not a document, then throw + * a "HierarchyRequestError" DOMException. + */ + if ((node->type == LXB_DOM_NODE_TYPE_TEXT + && parent->type == LXB_DOM_NODE_TYPE_DOCUMENT) + || (node->type == LXB_DOM_NODE_TYPE_DOCUMENT_TYPE + && parent->type != LXB_DOM_NODE_TYPE_DOCUMENT)) + { + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + + if (parent->type != LXB_DOM_NODE_TYPE_DOCUMENT) { + return LXB_DOM_EXCEPTION_OK; + } + + switch (node->type) { + case LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT: + tmp = node->first_child; + + if (tmp == NULL) { + return LXB_DOM_EXCEPTION_OK; + } + + count = 0; + + do { + if (tmp->type == LXB_DOM_NODE_TYPE_TEXT) { + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + else if (tmp->type == LXB_DOM_NODE_TYPE_ELEMENT) { + count += 1; + + if (count > 1) { + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + } + + tmp = tmp->next; + } + while (tmp != NULL); + + if (count != 1) { + return LXB_DOM_EXCEPTION_OK; + } + + /* Fall Through. */ + + case LXB_DOM_NODE_TYPE_ELEMENT: + tmp = parent->first_child; + + while (tmp != NULL) { + if (tmp->type == LXB_DOM_NODE_TYPE_ELEMENT) { + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + + tmp = tmp->next; + } + + if (child == NULL) { + return LXB_DOM_EXCEPTION_OK; + } + + if (child->type == LXB_DOM_NODE_TYPE_DOCUMENT_TYPE) { + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + + tmp = child->next; + + while (tmp != NULL) { + if (tmp->type == LXB_DOM_NODE_TYPE_DOCUMENT_TYPE) { + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + + tmp = tmp->next; + } + + break; + + case LXB_DOM_NODE_TYPE_DOCUMENT_TYPE: + tmp = parent->first_child; + + while (tmp != NULL) { + if (tmp->type == LXB_DOM_NODE_TYPE_DOCUMENT_TYPE) { + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + else if (tmp->type == LXB_DOM_NODE_TYPE_ELEMENT + && child == NULL) + { + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + + tmp = tmp->next; + } + + if (child == NULL) { + return LXB_DOM_EXCEPTION_OK; + } + + tmp = child->prev; + + while (tmp != NULL) { + if (tmp->type == LXB_DOM_NODE_TYPE_ELEMENT) { + return LXB_DOM_EXCEPTION_HIERARCHY_REQUEST_ERR; + } + + tmp = tmp->prev; + } + + break; + + default: + break; + } + + return LXB_DOM_EXCEPTION_OK; +} + +lxb_dom_exception_code_t +lxb_dom_node_pre_insert(lxb_dom_node_t *parent, lxb_dom_node_t *node, + lxb_dom_node_t *child) +{ + lxb_dom_exception_code_t ex_code; + + ex_code = lxb_dom_node_pre_insert_validity(parent, node, child); + if (ex_code != LXB_DOM_EXCEPTION_OK) { + return ex_code; + } + + if (child == node) { + child = node->next; + } + + return lxb_dom_node_insert(parent, node, child, false); +} + +lxb_inline lxb_dom_exception_code_t +lxb_dom_node_insert_node(lxb_dom_node_t *parent, lxb_dom_node_t *node, + lxb_dom_node_t *child, bool suppress_observers) +{ + lxb_dom_exception_code_t code; + + code = lxb_dom_node_adopt(node); + if (code != LXB_DOM_EXCEPTION_OK) { + return code; + } + + if (child == NULL) { + lxb_dom_node_insert_child(parent, node); + } + else { + lxb_dom_node_insert_before(child, node); + } + + return LXB_DOM_EXCEPTION_OK; +} + +lxb_dom_exception_code_t +lxb_dom_node_insert(lxb_dom_node_t *parent, lxb_dom_node_t *node, + lxb_dom_node_t *child, bool suppress_observers) +{ + lxb_dom_node_t *tmp, *next; + lxb_dom_exception_code_t code; + + if (node->type == LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT) { + if (node->first_child == NULL) { + return LXB_DOM_EXCEPTION_OK; + } + } + + /* TODO: live range. */ + + if (node->type != LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT) { + return lxb_dom_node_insert_node(parent, node, child, + suppress_observers); + } + + tmp = node->first_child; + + while (tmp != NULL) { + next = tmp->next; + + code = lxb_dom_node_insert_node(parent, tmp, child, + suppress_observers); + if (code != LXB_DOM_EXCEPTION_OK) { + return code; + } + + tmp = next; + } + + /* TODO: Shadow and queue a tree mutation record. */ + + return LXB_DOM_EXCEPTION_OK; +} + +lxb_dom_exception_code_t +lxb_dom_node_insert_before_spec(lxb_dom_node_t *dst, lxb_dom_node_t *node, + lxb_dom_node_t *child) +{ + return lxb_dom_node_pre_insert(dst, node, child); +} + +lxb_dom_exception_code_t +lxb_dom_node_append_child(lxb_dom_node_t *parent, lxb_dom_node_t *node) +{ + return lxb_dom_node_pre_insert(parent, node, NULL); +} + +lxb_dom_exception_code_t +lxb_dom_node_remove_child(lxb_dom_node_t *parent, lxb_dom_node_t *child) +{ + if (parent != child->parent) { + return LXB_DOM_EXCEPTION_NOT_FOUND_ERR; + } + + return lxb_dom_node_remove_spec(child, false); +} + +lxb_dom_exception_code_t +lxb_dom_node_replace_child(lxb_dom_node_t *parent, lxb_dom_node_t *node, + lxb_dom_node_t *child) +{ + lxb_dom_node_t *tmp, *next; + lxb_dom_node_t *before; + lxb_dom_exception_code_t code; + + code = lxb_dom_node_pre_insert_validity(parent, node, child); + if (code != LXB_DOM_EXCEPTION_OK) { + return code; + } + + before = child->prev; + if (before == NULL) { + before = child->next; + } + + if (child->parent != NULL) { + code = lxb_dom_node_remove_spec(child, true); + if (code != LXB_DOM_EXCEPTION_OK) { + return code; + } + } + + if (node->type != LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT) { + return lxb_dom_node_insert_node(parent, node, before, true); + } + + tmp = node->first_child; + + while (tmp != NULL) { + next = tmp->next; + + code = lxb_dom_node_insert_node(parent, tmp, before, true); + if (code != LXB_DOM_EXCEPTION_OK) { + return code; + } + + tmp = next; + } + + return LXB_DOM_EXCEPTION_OK; +} + +lxb_dom_exception_code_t +lxb_dom_node_replace_all_spec(lxb_dom_node_t *parent, lxb_dom_node_t *node) +{ + lxb_dom_node_t *child, *next; + lxb_dom_exception_code_t code; + + child = parent->first_child; + + while (child != NULL) { + next = child->next; + + code = lxb_dom_node_remove_spec(child, true); + if (code != LXB_DOM_EXCEPTION_OK) { + return code; + } + + child = next; + } + + return lxb_dom_node_append_child(parent, node); +} + +lxb_dom_exception_code_t +lxb_dom_node_remove_spec(lxb_dom_node_t *node, bool suppress_observers) +{ + if (node->parent == NULL) { + return LXB_DOM_EXCEPTION_OK; + } + + /* TODO: 3. Run the live range pre-remove steps, given node. */ + + /* + * TODO: For each NodeIterator object iterator whose root’s node document + * is node’s node document, run the NodeIterator pre-remove steps given + * node and iterator. + */ + + lxb_dom_node_remove(node); + + /* TODO: finish everything else. */ + + return LXB_DOM_EXCEPTION_OK; +} + void lxb_dom_node_remove_wo_events(lxb_dom_node_t *node) { @@ -617,6 +995,52 @@ return LXB_STATUS_OK; } +lxb_dom_node_t * +lxb_dom_node_by_id(lxb_dom_node_t *root, + const lxb_char_t *qualified_name, size_t len) +{ + lxb_dom_node_id_cb_ctx_t ctx; + + ctx.node = NULL; + ctx.value = qualified_name; + ctx.length = len; + + lxb_dom_node_simple_walk(root, lxb_dom_node_by_id_cb, &ctx); + + return ctx.node; +} + +static lexbor_action_t +lxb_dom_node_by_id_cb(lxb_dom_node_t *node, void *ctx) +{ + lxb_dom_node_id_cb_ctx_t *context; + const lxb_dom_attr_t *attr_id; + + if (node->type != LXB_DOM_NODE_TYPE_ELEMENT) { + return LEXBOR_ACTION_OK; + } + + context = ctx; + attr_id = lxb_dom_interface_element(node)->attr_id; + + if (attr_id == NULL + || attr_id->value == NULL + || attr_id->value->length != context->length) + { + return LEXBOR_ACTION_OK; + } + + const lxb_char_t *data = attr_id->value->data; + size_t length = attr_id->value->length; + + if (lexbor_str_data_ncmp(context->value, data, length)) { + context->node = node; + return LEXBOR_ACTION_STOP; + } + + return LEXBOR_ACTION_OK; +} + lxb_status_t lxb_dom_node_by_tag_name(lxb_dom_node_t *root, lxb_dom_collection_t *collection, @@ -1278,6 +1702,47 @@ return true; } +bool +lxb_dom_node_host_including_inclusive_ancestor(const lxb_dom_node_t *node, + const lxb_dom_node_t *parent) +{ + const lxb_dom_shadow_root_t *root; + + while (parent != NULL) { + if (parent == node) { + return true; + } + + if (parent->type == LXB_DOM_NODE_TYPE_SHADOW_ROOT) { + root = lxb_dom_interface_shadow_root(parent); + parent = &root->host->node; + + continue; + } + + parent = parent->parent; + } + + return false; +} + +lxb_dom_exception_code_t +lxb_dom_node_adopt(lxb_dom_node_t *node) +{ + lxb_dom_exception_code_t code; + + if (node->parent != NULL) { + code = lxb_dom_node_remove_spec(node, false); + if (code != LXB_DOM_EXCEPTION_OK) { + return code; + } + } + + /* TODO: If document is not oldDocument steps. */ + + return LXB_DOM_EXCEPTION_OK; +} + lxb_tag_id_t lxb_dom_node_tag_id_noi(lxb_dom_node_t *node) { @@ -1313,3 +1778,9 @@ { return lxb_dom_node_last_child(node); } + +lxb_dom_node_type_t +lxb_dom_node_type_noi(lxb_dom_node_t *node) +{ + return lxb_dom_node_type(node); +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/node.h php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/node.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/node.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/node.h 2026-05-05 16:34:12.000000000 +0000 @@ -13,6 +13,7 @@ #include "lexbor/dom/interface.h" #include "lexbor/dom/collection.h" +#include "lexbor/dom/exception.h" #include "lexbor/dom/interfaces/event_target.h" @@ -59,7 +60,9 @@ LXB_DOM_NODE_TYPE_DOCUMENT_TYPE = 0x0A, LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT = 0x0B, LXB_DOM_NODE_TYPE_NOTATION = 0x0C, // historical - LXB_DOM_NODE_TYPE_LAST_ENTRY = 0x0D + LXB_DOM_NODE_TYPE_CHARACTER_DATA, + LXB_DOM_NODE_TYPE_SHADOW_ROOT, + LXB_DOM_NODE_TYPE_LAST_ENTRY } lxb_dom_node_type_t; @@ -135,12 +138,106 @@ LXB_API void lxb_dom_node_insert_after(lxb_dom_node_t *to, lxb_dom_node_t *node); +LXB_API lxb_dom_exception_code_t +lxb_dom_node_pre_insert_validity(lxb_dom_node_t *parent, lxb_dom_node_t *node, + lxb_dom_node_t *child); + +LXB_API lxb_dom_exception_code_t +lxb_dom_node_pre_insert(lxb_dom_node_t *parent, lxb_dom_node_t *node, + lxb_dom_node_t *child); + +LXB_API lxb_dom_exception_code_t +lxb_dom_node_insert(lxb_dom_node_t *parent, lxb_dom_node_t *node, + lxb_dom_node_t *child, bool suppress_observers); + +/* + * Add a node as a child. + * + * Function according to specification. Node.appendChild(node). + * + * The function not only adds a node as a child, but also validates + * the possibility of adding it. + * For example, the lxb_dom_node_insert_child() function does not perform + * any validation. + * + * @param[in] lxb_dom_node_t *. Where to add. Not NULL. + * @param[in] lxb_dom_node_t *. Who to add. Not NULL. + * + * @return LXB_DOM_EXCEPTION_OK if successful, otherwise an error exception code. + */ +LXB_API lxb_dom_exception_code_t +lxb_dom_node_append_child(lxb_dom_node_t *parent, lxb_dom_node_t *node); + +/* + * Insert before child. + * + * Function according to specification. Node.insertBefore(node, child). + * + * The function not only insert a node as a child, but also validates + * the possibility of adding it. + * For example, the lxb_dom_node_insert_before() function does not perform + * any validation. + * + * @param[in] lxb_dom_node_t *. Where to add. Not NULL. + * @param[in] lxb_dom_node_t *. Who to add. Not NULL. + * @param[in] lxb_dom_node_t *. The child before need to insert. Not NULL. + * + * @return LXB_DOM_EXCEPTION_OK if successful, otherwise an error exception code. + */ +LXB_API lxb_dom_exception_code_t +lxb_dom_node_insert_before_spec(lxb_dom_node_t *dst, lxb_dom_node_t *node, + lxb_dom_node_t *child); + +LXB_API lxb_dom_exception_code_t +lxb_dom_node_remove_spec(lxb_dom_node_t *node, bool suppress_observers); + LXB_API void lxb_dom_node_remove_wo_events(lxb_dom_node_t *node); LXB_API void lxb_dom_node_remove(lxb_dom_node_t *node); +/* + * Removing a node. + * + * Function according to specification. Node.removeChild(node). + * + * The function not only removing a node, but also validates the possibility + * of adding it. + * For example, the lxb_dom_node_remove() function does not perform + * any validation. + * + * @param[in] lxb_dom_node_t *. Where remove. Not NULL. + * @param[in] lxb_dom_node_t *. Who remove. Not NULL. + * + * @return LXB_DOM_EXCEPTION_OK if successful, otherwise an error exception code. + */ +LXB_API lxb_dom_exception_code_t +lxb_dom_node_remove_child(lxb_dom_node_t *parent, lxb_dom_node_t *child); + +/* + * The function replaces the child with a node. + * + * Function according to specification. Node.replaceChild(node, child). + * + * The function not only replace a node, but also validates the possibility + * of adding it. + * For example, the lxb_dom_node_replace_all() function does not perform + * any validation. + * + * @param[in] lxb_dom_node_t *. Where replace. Not NULL. + * @param[in] lxb_dom_node_t *. Who replace. Not NULL. + * @param[in] lxb_dom_node_t *. Replaceable child. Not NULL. + * + * @return LXB_DOM_EXCEPTION_OK if successful, otherwise an error exception code. + */ +LXB_API lxb_dom_exception_code_t +lxb_dom_node_replace_child(lxb_dom_node_t *parent, lxb_dom_node_t *node, + lxb_dom_node_t *child); + +LXB_API lxb_dom_exception_code_t +lxb_dom_node_replace_all_spec(lxb_dom_node_t *parent, lxb_dom_node_t *node); + LXB_API lxb_status_t lxb_dom_node_replace_all(lxb_dom_node_t *parent, lxb_dom_node_t *node); @@ -148,6 +245,10 @@ lxb_dom_node_simple_walk(lxb_dom_node_t *root, lxb_dom_node_simple_walker_f walker_cb, void *ctx); +LXB_API lxb_dom_node_t * +lxb_dom_node_by_id(lxb_dom_node_t *root, + const lxb_char_t *qualified_name, size_t len); + LXB_API lxb_status_t lxb_dom_node_by_tag_name(lxb_dom_node_t *root, lxb_dom_collection_t *collection, const lxb_char_t *qualified_name, size_t len); @@ -193,6 +294,12 @@ LXB_API bool lxb_dom_node_is_empty(const lxb_dom_node_t *root); +LXB_API bool +lxb_dom_node_host_including_inclusive_ancestor(const lxb_dom_node_t *node, + const lxb_dom_node_t *parent); + +LXB_API lxb_dom_exception_code_t +lxb_dom_node_adopt(lxb_dom_node_t *node); /* * Inline functions @@ -233,6 +340,12 @@ return node->last_child; } +lxb_inline lxb_dom_node_type_t +lxb_dom_node_type(lxb_dom_node_t *node) +{ + return node->type; +} + /* * No inline functions for ABI. */ @@ -254,6 +367,9 @@ LXB_API lxb_dom_node_t * lxb_dom_node_last_child_noi(lxb_dom_node_t *node); +LXB_API lxb_dom_node_type_t +lxb_dom_node_type_noi(lxb_dom_node_t *node); + #ifdef __cplusplus } /* extern "C" */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/shadow_root.c php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/shadow_root.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/dom/interfaces/shadow_root.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/dom/interfaces/shadow_root.c 2026-05-05 16:34:12.000000000 +0000 @@ -22,7 +22,7 @@ lxb_dom_node_t *node = lxb_dom_interface_node(element); node->owner_document = lxb_dom_document_owner(document); - node->type = LXB_DOM_NODE_TYPE_UNDEF; + node->type = LXB_DOM_NODE_TYPE_SHADOW_ROOT; return element; } diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/base.h php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/base.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/base.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/base.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 Alexander Borisov + * Copyright (C) 2019-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -16,7 +16,7 @@ #define LXB_ENCODING_VERSION_MAJOR 2 -#define LXB_ENCODING_VERSION_MINOR 2 +#define LXB_ENCODING_VERSION_MINOR 3 #define LXB_ENCODING_VERSION_PATCH 0 #define LXB_ENCODING_VERSION_STRING \ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/encode.c php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/encode.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/encode.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/encode.c 2026-05-05 16:34:12.000000000 +0000 @@ -111,6 +111,122 @@ return 1 +lxb_inline uint16_t +lxb_encoding_multi_big5_index(lxb_codepoint_t cp) +{ + if (cp > 0x2F8A7) { + return UINT16_MAX; + } + + if (cp < 65518) { + if (cp >= 167 && cp < 1106) { + return lxb_encoding_multi_big5_167_1106_map[cp - 167]; + } + else if (cp >= 8211) { + if (cp < 40882) { + return lxb_encoding_multi_big5_8211_40882_map[cp - 8211]; + } + else if (cp >= 64012) { + return lxb_encoding_multi_big5_64012_65518_map[cp - 64012]; + } + } + } + else if (cp >= 131210) { + if (cp < 172369) { + return lxb_encoding_multi_big5_131210_172369_map[cp - 131210]; + } + else if (cp >= 194708) { + if (cp < 194727) { + return lxb_encoding_multi_big5_194708_194727_map[cp - 194708]; + } + } + } + + return UINT16_MAX; +} + +lxb_inline uint16_t +lxb_encoding_multi_euc_kr_index(lxb_codepoint_t cp) +{ + if (cp > 0xFFE7) { + return UINT16_MAX; + } + + if (cp < 13278) { + if (cp >= 161 && cp < 1106) { + return lxb_encoding_multi_euc_kr_161_1106_map[cp - 161]; + } + else if (cp >= 8213) { + return lxb_encoding_multi_euc_kr_8213_13278_map[cp - 8213]; + } + } + else if (cp >= 19968) { + if (cp < 55204) { + return lxb_encoding_multi_euc_kr_19968_55204_map[cp - 19968]; + } + else if (cp >= 63744) { + if (cp < 65511) { + return lxb_encoding_multi_euc_kr_63744_65511_map[cp - 63744]; + } + } + } + + return UINT16_MAX; +} + +lxb_inline uint16_t +lxb_encoding_multi_gb18030_index(lxb_codepoint_t cp) +{ + if (cp > 0xFFE6) { + return UINT16_MAX; + } + + if (cp < 40892) { + if (cp >= 164 && cp < 1106) { + return lxb_encoding_multi_gb18030_164_1106_map[cp - 164]; + } + else if (cp >= 7743) { + return lxb_encoding_multi_gb18030_7743_40892_map[cp - 7743]; + } + } + else if (cp >= 57344) { + if (cp < 65510) { + return lxb_encoding_multi_gb18030_57344_65510_map[cp - 57344]; + } + } + + return UINT16_MAX; +} + +lxb_inline uint16_t +lxb_encoding_multi_jis0208_index(lxb_codepoint_t cp) +{ + if (cp > 0xFFE6) { + return UINT16_MAX; + } + + if (cp < 13262) { + if (cp >= 167 && cp < 1106) { + return lxb_encoding_multi_jis0208_167_1106_map[cp - 167]; + } + else if (cp >= 8208) { + return lxb_encoding_multi_jis0208_8208_13262_map[cp - 8208]; + } + } + else if (cp >= 19968) { + if (cp < 40865) { + return lxb_encoding_multi_jis0208_19968_40865_map[cp - 19968]; + } + else if (cp >= 63785) { + if (cp < 65510) { + return lxb_encoding_multi_jis0208_63785_65510_map[cp - 63785]; + } + } + } + + return UINT16_MAX; +} + lxb_status_t lxb_encoding_encode_default(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **cps, const lxb_codepoint_t *end) @@ -327,10 +443,10 @@ unsigned state; lxb_codepoint_t cp; - size = 0; state = ctx->state; for (; *cps < end; (*cps)++) { + size = 0; cp = **cps; begin: diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/encoding.c php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/encoding.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/encoding.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/encoding.c 2026-05-05 16:34:12.000000000 +0000 @@ -55,6 +55,74 @@ return entry->value; } +lxb_encoding_t +lxb_encoding_prescan_validate(const lxb_char_t *name, size_t length) +{ + const lxb_encoding_data_t *data; + + data = lxb_encoding_data_by_pre_name(name, length); + if (data == NULL) { + return LXB_ENCODING_DEFAULT; + } + + if (data->encoding == LXB_ENCODING_UTF_16BE + || data->encoding == LXB_ENCODING_UTF_16LE) + { + return LXB_ENCODING_UTF_8; + } + + if (data->encoding == LXB_ENCODING_X_USER_DEFINED) { + return LXB_ENCODING_WINDOWS_1252; + } + + return data->encoding; +} + +const lxb_encoding_data_t * +lxb_encoding_data_prescan_validate(const lxb_char_t *name, size_t length) +{ + const lxb_encoding_data_t *data; + + data = lxb_encoding_data_by_pre_name(name, length); + if (data == NULL) { + return NULL; + } + + if (data->encoding == LXB_ENCODING_UTF_16BE + || data->encoding == LXB_ENCODING_UTF_16LE) + { + return lxb_encoding_data(LXB_ENCODING_UTF_8); + } + + if (data->encoding == LXB_ENCODING_X_USER_DEFINED) { + return lxb_encoding_data(LXB_ENCODING_WINDOWS_1252); + } + + return data; +} + +lxb_encoding_t +lxb_encoding_bom_sniff(const lxb_char_t *begin, size_t length) +{ + if (length >= 3) { + if (begin[0] == 0xEF && begin[1] == 0xBB && begin[2] == 0xBF) { + return LXB_ENCODING_UTF_8; + } + } + + if (length >= 2) { + if (begin[0] == 0xFE && begin[1] == 0xFF) { + return LXB_ENCODING_UTF_16BE; + } + + if (begin[0] == 0xFF && begin[1] == 0xFE) { + return LXB_ENCODING_UTF_16LE; + } + } + + return LXB_ENCODING_DEFAULT; +} + void lxb_encoding_utf_8_skip_bom(const lxb_char_t **begin, size_t *length) { @@ -100,6 +168,54 @@ } } +const lxb_encoding_data_t * +lxb_encoding_data_by_name(const lxb_char_t *name, size_t length) +{ + const lexbor_shs_entry_t *entry; + + if (length == 0) { + return NULL; + } + + entry = lexbor_shs_entry_get_lower_static(lxb_encoding_res_shs_entities, + name, length); + if (entry == NULL) { + return NULL; + } + + return (const lxb_encoding_data_t *) entry->value; +} + +const lxb_encoding_data_t * +lxb_encoding_data(lxb_encoding_t encoding) +{ + if (encoding >= LXB_ENCODING_LAST_ENTRY) { + return NULL; + } + + return &lxb_encoding_res_map[encoding]; +} + +lxb_encoding_encode_f +lxb_encoding_encode_function(lxb_encoding_t encoding) +{ + if (encoding >= LXB_ENCODING_LAST_ENTRY) { + return NULL; + } + + return lxb_encoding_res_map[encoding].encode; +} + +lxb_encoding_decode_f +lxb_encoding_decode_function(lxb_encoding_t encoding) +{ + if (encoding >= LXB_ENCODING_LAST_ENTRY) { + return NULL; + } + + return lxb_encoding_res_map[encoding].decode; +} + /* * No inline functions for ABI. */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/encoding.h php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/encoding.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/encoding.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/encoding.h 2026-05-05 16:34:12.000000000 +0000 @@ -27,9 +27,18 @@ LXB_API const lxb_encoding_data_t * lxb_encoding_data_by_pre_name(const lxb_char_t *name, size_t length); +LXB_API lxb_encoding_t +lxb_encoding_prescan_validate(const lxb_char_t *name, size_t length); + +LXB_API const lxb_encoding_data_t * +lxb_encoding_data_prescan_validate(const lxb_char_t *name, size_t length); + /* * To skip BOM. */ +LXB_API lxb_encoding_t +lxb_encoding_bom_sniff(const lxb_char_t *begin, size_t length); + LXB_API void lxb_encoding_utf_8_skip_bom(const lxb_char_t **begin, size_t *length); @@ -39,6 +48,20 @@ LXB_API void lxb_encoding_utf_16le_skip_bom(const lxb_char_t **begin, size_t *length); +/* + * Encoding data. + */ +LXB_API const lxb_encoding_data_t * +lxb_encoding_data_by_name(const lxb_char_t *name, size_t length); + +LXB_API const lxb_encoding_data_t * +lxb_encoding_data(lxb_encoding_t encoding); + +LXB_API lxb_encoding_encode_f +lxb_encoding_encode_function(lxb_encoding_t encoding); + +LXB_API lxb_encoding_decode_f +lxb_encoding_decode_function(lxb_encoding_t encoding); /* * Inline functions @@ -305,54 +328,6 @@ /* * Encoding data. */ -lxb_inline const lxb_encoding_data_t * -lxb_encoding_data_by_name(const lxb_char_t *name, size_t length) -{ - const lexbor_shs_entry_t *entry; - - if (length == 0) { - return NULL; - } - - entry = lexbor_shs_entry_get_lower_static(lxb_encoding_res_shs_entities, - name, length); - if (entry == NULL) { - return NULL; - } - - return (const lxb_encoding_data_t *) entry->value; -} - -lxb_inline const lxb_encoding_data_t * -lxb_encoding_data(lxb_encoding_t encoding) -{ - if (encoding >= LXB_ENCODING_LAST_ENTRY) { - return NULL; - } - - return &lxb_encoding_res_map[encoding]; -} - -lxb_inline lxb_encoding_encode_f -lxb_encoding_encode_function(lxb_encoding_t encoding) -{ - if (encoding >= LXB_ENCODING_LAST_ENTRY) { - return NULL; - } - - return lxb_encoding_res_map[encoding].encode; -} - -lxb_inline lxb_encoding_decode_f -lxb_encoding_decode_function(lxb_encoding_t encoding) -{ - if (encoding >= LXB_ENCODING_LAST_ENTRY) { - return NULL; - } - - return lxb_encoding_res_map[encoding].decode; -} - lxb_inline lxb_status_t lxb_encoding_data_call_encode(lxb_encoding_data_t *encoding_data, lxb_encoding_encode_t *ctx, const lxb_codepoint_t **cp, const lxb_codepoint_t *end) diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/multi.c php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/multi.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/multi.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/multi.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 Alexander Borisov + * Copyright (C) 2026 Alexander Borisov * * Author: Alexander Borisov */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/multi.h php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/multi.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/multi.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/multi.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 Alexander Borisov + * Copyright (C) 2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -19,7 +19,7 @@ #include "lexbor/encoding/base.h" - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN LXB_EXTERN lxb_codepoint_t lxb_encoding_multi_big5_map[19782]; LXB_EXTERN lxb_codepoint_t lxb_encoding_multi_euc_kr_map[23750]; LXB_EXTERN lxb_codepoint_t lxb_encoding_multi_gb18030_map[23940]; @@ -53,161 +53,7 @@ LXB_EXTERN uint16_t lxb_encoding_multi_jis0208_8208_13262_map[5054]; LXB_EXTERN uint16_t lxb_encoding_multi_jis0208_19968_40865_map[20897]; LXB_EXTERN uint16_t lxb_encoding_multi_jis0208_63785_65510_map[1725]; - -lxb_inline uint16_t -lxb_encoding_multi_big5_index(lxb_codepoint_t cp) -{ - if (cp > 0x2F8A7) { - return UINT16_MAX; - } - - if (cp < 65518) { - if (cp >= 167 && cp < 1106) { - return lxb_encoding_multi_big5_167_1106_map[cp - 167]; - } - else if (cp >= 8211) { - if (cp < 40882) { - return lxb_encoding_multi_big5_8211_40882_map[cp - 8211]; - } - else if (cp >= 64012) { - return lxb_encoding_multi_big5_64012_65518_map[cp - 64012]; - } - } - } - else if (cp >= 131210) { - if (cp < 172369) { - return lxb_encoding_multi_big5_131210_172369_map[cp - 131210]; - } - else if (cp >= 194708) { - if (cp < 194727) { - return lxb_encoding_multi_big5_194708_194727_map[cp - 194708]; - } - } - } - - return UINT16_MAX; -} - -lxb_inline uint16_t -lxb_encoding_multi_euc_kr_index(lxb_codepoint_t cp) -{ - if (cp > 0xFFE7) { - return UINT16_MAX; - } - - if (cp < 13278) { - if (cp >= 161 && cp < 1106) { - return lxb_encoding_multi_euc_kr_161_1106_map[cp - 161]; - } - else if (cp >= 8213) { - return lxb_encoding_multi_euc_kr_8213_13278_map[cp - 8213]; - } - } - else if (cp >= 19968) { - if (cp < 55204) { - return lxb_encoding_multi_euc_kr_19968_55204_map[cp - 19968]; - } - else if (cp >= 63744) { - if (cp < 65511) { - return lxb_encoding_multi_euc_kr_63744_65511_map[cp - 63744]; - } - } - } - - return UINT16_MAX; -} - -lxb_inline uint16_t -lxb_encoding_multi_gb18030_index(lxb_codepoint_t cp) -{ - if (cp > 0xFFE6) { - return UINT16_MAX; - } - - if (cp < 40892) { - if (cp >= 164 && cp < 1106) { - return lxb_encoding_multi_gb18030_164_1106_map[cp - 164]; - } - else if (cp >= 7743) { - return lxb_encoding_multi_gb18030_7743_40892_map[cp - 7743]; - } - } - else if (cp >= 57344) { - if (cp < 65510) { - return lxb_encoding_multi_gb18030_57344_65510_map[cp - 57344]; - } - } - - return UINT16_MAX; -} - -lxb_inline uint16_t -lxb_encoding_multi_iso_2022_jp_katakana_index(lxb_codepoint_t cp) -{ - if (cp >= 12289 && cp < 12541) { - return lxb_encoding_multi_iso_2022_jp_katakana_12289_12541_map[cp - 12289]; - } - - return UINT16_MAX; -} - -lxb_inline uint16_t -lxb_encoding_multi_jis0212_index(lxb_codepoint_t cp) -{ - if (cp > 0xFF5F) { - return UINT16_MAX; - } - - if (cp < 8483) { - if (cp >= 161 && cp < 1120) { - return lxb_encoding_multi_jis0212_161_1120_map[cp - 161]; - } - else if (cp >= 8470) { - return lxb_encoding_multi_jis0212_8470_8483_map[cp - 8470]; - } - } - else if (cp >= 19970) { - if (cp < 40870) { - return lxb_encoding_multi_jis0212_19970_40870_map[cp - 19970]; - } - else if (cp >= 65374) { - if (cp < 65375) { - return lxb_encoding_multi_jis0212_65374_65375_map[cp - 65374]; - } - } - } - - return UINT16_MAX; -} - -lxb_inline uint16_t -lxb_encoding_multi_jis0208_index(lxb_codepoint_t cp) -{ - if (cp > 0xFFE6) { - return UINT16_MAX; - } - - if (cp < 13262) { - if (cp >= 167 && cp < 1106) { - return lxb_encoding_multi_jis0208_167_1106_map[cp - 167]; - } - else if (cp >= 8208) { - return lxb_encoding_multi_jis0208_8208_13262_map[cp - 8208]; - } - } - else if (cp >= 19968) { - if (cp < 40865) { - return lxb_encoding_multi_jis0208_19968_40865_map[cp - 19968]; - } - else if (cp >= 63785) { - if (cp < 65510) { - return lxb_encoding_multi_jis0208_63785_65510_map[cp - 63785]; - } - } - } - - return UINT16_MAX; -} +#endif /* !LEXBOR_DISABLE_INTERNAL_EXTERN */ #ifdef __cplusplus diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/range.h php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/range.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/range.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/range.h 2026-05-05 16:34:12.000000000 +0000 @@ -23,8 +23,9 @@ #define LXB_ENCODING_RANGE_INDEX_GB18030_SIZE 207 - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN LXB_EXTERN const lxb_encoding_range_index_t lxb_encoding_range_index_gb18030[207]; +#endif /* !LEXBOR_DISABLE_INTERNAL_EXTERN */ #ifdef __cplusplus diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/res.h 2026-05-05 16:34:12.000000000 +0000 @@ -22,10 +22,10 @@ #include "lexbor/encoding/base.h" #include "lexbor/core/shs.h" - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN LXB_EXTERN const lxb_encoding_data_t lxb_encoding_res_map[LXB_ENCODING_LAST_ENTRY]; LXB_EXTERN const lexbor_shs_entry_t lxb_encoding_res_shs_entities[220]; - +#endif /* !LEXBOR_DISABLE_INTERNAL_EXTERN */ #ifdef __cplusplus } /* extern "C" */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/single.h php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/single.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/encoding/single.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/encoding/single.h 2026-05-05 16:34:12.000000000 +0000 @@ -51,7 +51,7 @@ #define LXB_ENCODING_SINGLE_HASH_WINDOWS_874_SIZE 359 #define LXB_ENCODING_SINGLE_HASH_X_MAC_CYRILLIC_SIZE 373 - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN LXB_EXTERN const lxb_encoding_single_index_t lxb_encoding_single_index_ibm866[128]; LXB_EXTERN const lxb_encoding_single_index_t lxb_encoding_single_index_iso_8859_10[128]; LXB_EXTERN const lxb_encoding_single_index_t lxb_encoding_single_index_iso_8859_13[128]; @@ -107,6 +107,7 @@ LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_single_hash_windows_1258[406]; LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_single_hash_windows_874[360]; LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_single_hash_x_mac_cyrillic[374]; +#endif /* !LEXBOR_DISABLE_INTERNAL_EXTERN */ #ifdef __cplusplus diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/base.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/base.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/base.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/base.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2024 Alexander Borisov + * Copyright (C) 2018-2025 Alexander Borisov * * Author: Alexander Borisov */ @@ -15,7 +15,7 @@ #define LXB_HTML_VERSION_MAJOR 2 -#define LXB_HTML_VERSION_MINOR 6 +#define LXB_HTML_VERSION_MINOR 8 #define LXB_HTML_VERSION_PATCH 0 #define LXB_HTML_VERSION_STRING LEXBOR_STRINGIZE(LXB_HTML_VERSION_MAJOR) "." \ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/encoding.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/encoding.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/encoding.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/encoding.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Alexander Borisov + * Copyright (C) 2019-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -9,6 +9,31 @@ #include "lexbor/core/str.h" +typedef struct { + lexbor_str_t alias; + lexbor_str_t name; +} +lxb_html_encoding_name_t; + +static const lxb_html_encoding_name_t lxb_html_encoding_names[] = { + /* UTF-16BE */ + { lexbor_str("unicodefffe"), lexbor_str("UTF-8") }, + { lexbor_str("utf-16be"), lexbor_str("UTF-8") }, + + /* UTF-16LE */ + { lexbor_str("csunicode"), lexbor_str("UTF-8") }, + { lexbor_str("iso-10646-ucs-2"), lexbor_str("UTF-8") }, + { lexbor_str("ucs-2"), lexbor_str("UTF-8") }, + { lexbor_str("unicode"), lexbor_str("UTF-8") }, + { lexbor_str("unicodefeff"), lexbor_str("UTF-8") }, + { lexbor_str("utf-16"), lexbor_str("UTF-8") }, + { lexbor_str("utf-16le"), lexbor_str("UTF-8") }, + + /* x-user-defined */ + { lexbor_str("x-user-defined"), lexbor_str("windows-1252") } +}; + + static const lxb_char_t * lxb_html_encoding_meta(lxb_html_encoding_t *em, const lxb_char_t *data, const lxb_char_t *end); @@ -99,6 +124,73 @@ return em; } +const lxb_char_t * +lxb_html_encoding_prescan(lxb_html_encoding_t *em, const lxb_char_t *data, + const lxb_char_t *end, size_t *out_length) +{ + size_t len, length; + lxb_status_t status; + lxb_html_encoding_entry_t *entry; + const lxb_html_encoding_name_t *name; + + static const lexbor_str_t lxb_html_encoding_utf_16le = lexbor_str("UTF-16LE"); + static const lexbor_str_t lxb_html_encoding_utf_16be = lexbor_str("UTF-16BE"); + + len = end - data; + + /* Prescan for UTF-16 XML declarations: If position points to. */ + if (len >= 6) { + if (data[0] == 0x3C && data[1] == 0x00 && data[2] == 0x3F + && data[3] == 0x00 && data[4] == 0x78 && data[5] == 0x00) + { + *out_length = lxb_html_encoding_utf_16le.length; + return lxb_html_encoding_utf_16le.data; + } + + if (data[0] == 0x00 && data[1] == 0x3C && data[2] == 0x00 + && data[3] == 0x3F && data[4] == 0x00 && data[5] == 0x78) + { + *out_length = lxb_html_encoding_utf_16be.length; + return lxb_html_encoding_utf_16be.data; + } + } + + status = lxb_html_encoding_determine(em, data, end); + if (status != LXB_STATUS_OK) { + goto EMPTY; + } + + if (lxb_html_encoding_meta_length(em) == 0) { + goto EMPTY; + } + + entry = lxb_html_encoding_meta_entry(em, 0); + len = entry->end - entry->name; + length = sizeof(lxb_html_encoding_names) / sizeof(lxb_html_encoding_name_t); + + for (size_t i = 0; i < length; i++) { + name = &lxb_html_encoding_names[i]; + + if (len == name->alias.length + && lexbor_str_data_ncasecmp(entry->name, name->alias.data, + name->alias.length)) + { + *out_length = lxb_html_encoding_names[i].name.length; + return lxb_html_encoding_names[i].name.data; + } + } + + *out_length = entry->end - entry->name; + + return entry->name; + +EMPTY: + + *out_length = 0; + + return NULL; +} + lxb_status_t lxb_html_encoding_determine(lxb_html_encoding_t *em, const lxb_char_t *data, const lxb_char_t *end) @@ -381,12 +473,12 @@ for (; data < end; data++) { if (*data == **name_end) { - break; + *name_end = data; + goto done; } } - *name_end = data; - goto done; + return NULL; } name = data; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/encoding.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/encoding.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/encoding.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/encoding.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,14 @@ /* - * Copyright (C) 2019 Alexander Borisov + * Copyright (C) 2019-2026 Alexander Borisov + * + * Functions for detecting encoding in an HTML byte stream. + * + * The HTML parser accepts only UTF-8 input. The detected encoding can be used + * with the Encoding module to convert the original byte stream from its + * encoding to UTF-8 before passing it to the parser. + * + * By specification: + * https://html.spec.whatwg.org/#determining-the-character-encoding * * Author: Alexander Borisov */ @@ -12,12 +21,13 @@ #endif #include "lexbor/html/base.h" - #include "lexbor/core/array_obj.h" typedef struct { + /* Pointer to the beginning of the encoding name in the original data. */ const lxb_char_t *name; + /* Pointer to the end of the encoding name in the original data. */ const lxb_char_t *end; } lxb_html_encoding_entry_t; @@ -29,17 +39,101 @@ lxb_html_encoding_t; +/* + * Initialization of the lxb_html_encoding_t object. + * + * The object can be allocated on the stack or created using + * lxb_html_encoding_create() function. + * + * @param[in] lxb_html_encoding_t * + * + * @return LXB_STATUS_OK if successful, otherwise an error status value. + */ LXB_API lxb_status_t lxb_html_encoding_init(lxb_html_encoding_t *em); +/* + * Destruction of the lxb_html_encoding_t object. + * + * Releases internal resources of the object. + * If the object was created using lxb_html_encoding_create(), set self_destroy + * to true. + * + * @param[in] lxb_html_encoding_t * + * @param[in] If true, the object itself will be freed. + * + * @return NULL if self_destroy is true. Pointer to the object if false. + */ LXB_API lxb_html_encoding_t * lxb_html_encoding_destroy(lxb_html_encoding_t *em, bool self_destroy); +/* + * Prescan a byte stream to determine its encoding. + * + * By specification: + * https://html.spec.whatwg.org/#prescan-a-byte-stream-to-determine-its-encoding + * + * Returns the validated encoding name if found, or NULL otherwise. + * + * Important: + * The returned pointer is not guaranteed to point into the input data stream. + * It may reference an internal static string (e.g. when the found encoding name + * is matched against a known alias). Do not assume the returned pointer lies + * within the [data, end) range. + * + * @param[in] lxb_html_encoding_t *. Not NULL. + * @param[in] Pointer to the beginning of the data. Not NULL. + * @param[in] Pointer to the end of the data. Not NULL. + * @param[out] Length of the returned encoding name. Not NULL. + * + * @return Pointer to the encoding name, or NULL if no encoding was found. + */ +LXB_API const lxb_char_t * +lxb_html_encoding_prescan(lxb_html_encoding_t *em, const lxb_char_t *data, + const lxb_char_t *end, size_t *out_length); +/* + * Prescan a byte stream to determine its encoding. + * + * Implementation of the HTML specification algorithm for extracting encoding + * from tags. Scans raw HTML bytes looking for and + * declarations. + * + * Results can be retrieved using lxb_html_encoding_meta_entry() and + * lxb_html_encoding_meta_length() functions. + * + * Important: + * The HTML specification requires that if the determined charset is + * UTF-16BE/LE, it must be replaced with UTF-8, and if it is x-user-defined, + * it must be replaced with windows-1252. This function does not perform these + * replacements because it returns pointers to the original data (start and end + * of the found encoding name), which can be useful for developers. To get the + * validated encoding according to the specification, use the + * lxb_encoding_data_prescan_validate()/lxb_encoding_prescan_validate() + * functions from the Encoding module, or handle these cases manually. + * + * @param[in] lxb_html_encoding_t *. Not NULL. + * @param[in] Pointer to the beginning of the data. Not NULL. + * @param[in] Pointer to the end of the data. Not NULL. + * + * @return LXB_STATUS_OK if successful, otherwise an error status value. + */ LXB_API lxb_status_t lxb_html_encoding_determine(lxb_html_encoding_t *em, const lxb_char_t *data, const lxb_char_t *end); +/* + * Extract encoding name from a Content-Type string. + * + * Parses the value of a content attribute looking for "charset=" + * pattern. For example, from "text/html; charset=utf-8" extracts "utf-8". + * + * @param[in] Pointer to the beginning of the content string. Not NULL. + * @param[in] Pointer to the end of the content string. Not NULL. + * @param[out] Pointer to the end of the encoding name. Not NULL. + * + * @return Pointer to the beginning of the encoding name, or NULL if not found. + */ LXB_API const lxb_char_t * lxb_html_encoding_content(const lxb_char_t *data, const lxb_char_t *end, const lxb_char_t **name_end); @@ -48,6 +142,14 @@ /* * Inline functions */ + +/* + * Create an lxb_html_encoding_t object on the heap. + * + * The object must be initialized using lxb_html_encoding_init() after creation. + * + * @return Pointer to a new object, or NULL if memory allocation failed. + */ lxb_inline lxb_html_encoding_t * lxb_html_encoding_create(void) { @@ -55,6 +157,14 @@ sizeof(lxb_html_encoding_t)); } +/* + * Clean the lxb_html_encoding_t object for reuse. + * + * Resets internal state so the object can be used for a new prescan without + * reallocation. Does not free memory. + * + * @param[in] lxb_html_encoding_t *. Not NULL. + */ lxb_inline void lxb_html_encoding_clean(lxb_html_encoding_t *em) { @@ -62,18 +172,45 @@ lexbor_array_obj_clean(&em->result); } +/* + * Get an encoding entry from the results by index. + * + * Returns a pointer to the lxb_html_encoding_entry_t which contains pointers + * to the beginning and end of the encoding name in the original data. + * + * @param[in] lxb_html_encoding_t *. Not NULL. + * @param[in] Index of the entry. + * + * @return Pointer to the entry, or NULL if the index is out of bounds. + */ lxb_inline lxb_html_encoding_entry_t * lxb_html_encoding_meta_entry(lxb_html_encoding_t *em, size_t idx) { return (lxb_html_encoding_entry_t *) lexbor_array_obj_get(&em->result, idx); } +/* + * Get the number of encoding entries found. + * + * @param[in] lxb_html_encoding_t *. Not NULL. + * + * @return Number of entries in the result. + */ lxb_inline size_t lxb_html_encoding_meta_length(lxb_html_encoding_t *em) { return lexbor_array_obj_length(&em->result); } +/* + * Get the result array object directly. + * + * Returns the internal array of lxb_html_encoding_entry_t entries. + * + * @param[in] lxb_html_encoding_t *. Not NULL. + * + * @return Pointer to the lexbor_array_obj_t with results. + */ lxb_inline lexbor_array_obj_t * lxb_html_encoding_meta_result(lxb_html_encoding_t *em) { diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interface.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interface.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interface.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interface.c 2026-05-05 16:34:12.000000000 +0000 @@ -26,30 +26,33 @@ lxb_ns_id_t ns) { lxb_dom_node_t *node; + lxb_dom_element_t *domel; + lxb_html_unknown_element_t *unel; if (tag_id >= LXB_TAG__LAST_ENTRY) { if (ns == LXB_NS_HTML) { - lxb_html_unknown_element_t *unel; - unel = lxb_html_unknown_element_interface_create(document); node = lxb_dom_interface_node(unel); } else if (ns == LXB_NS_SVG) { /* TODO: For this need implement SVGElement */ - lxb_dom_element_t *domel; domel = lxb_dom_element_interface_create(&document->dom_document); node = lxb_dom_interface_node(domel); } else { - lxb_dom_element_t *domel; - domel = lxb_dom_element_interface_create(&document->dom_document); node = lxb_dom_interface_node(domel); } } else { - node = lxb_html_interface_res_constructors[tag_id][ns](document); + if (ns < LXB_NS__LAST_ENTRY) { + node = lxb_html_interface_res_constructors[tag_id][ns](document); + } + else { + domel = lxb_dom_element_interface_create(&document->dom_document); + node = lxb_dom_interface_node(domel); + } } if (node == NULL) { diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interface.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interface.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interface.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interface.h 2026-05-05 16:34:12.000000000 +0000 @@ -71,6 +71,7 @@ #define lxb_html_interface_quote(obj) ((lxb_html_quote_element_t *) (obj)) #define lxb_html_interface_script(obj) ((lxb_html_script_element_t *) (obj)) #define lxb_html_interface_select(obj) ((lxb_html_select_element_t *) (obj)) +#define lxb_html_interface_selectedcontent(obj) ((lxb_html_selectedcontent_element_t *) obj) #define lxb_html_interface_slot(obj) ((lxb_html_slot_element_t *) (obj)) #define lxb_html_interface_source(obj) ((lxb_html_source_element_t *) (obj)) #define lxb_html_interface_span(obj) ((lxb_html_span_element_t *) (obj)) @@ -146,6 +147,8 @@ typedef struct lxb_html_quote_element lxb_html_quote_element_t; typedef struct lxb_html_script_element lxb_html_script_element_t; typedef struct lxb_html_select_element lxb_html_select_element_t; +typedef struct lxb_html_selectedcontent_element lxb_html_selectedcontent_element_t; +typedef struct lxb_html_search_element lxb_html_search_element_t; typedef struct lxb_html_slot_element lxb_html_slot_element_t; typedef struct lxb_html_source_element lxb_html_source_element_t; typedef struct lxb_html_span_element lxb_html_span_element_t; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interface_res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interface_res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interface_res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interface_res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2025 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -14,12 +14,10 @@ #ifndef LXB_HTML_INTERFACE_RES_H #define LXB_HTML_INTERFACE_RES_H -#endif /* LXB_HTML_INTERFACE_RES_H */ - #ifdef LXB_TAG_CONST_VERSION -#ifndef LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86 +#ifndef LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715 #error Mismatched tags version! See "lexbor/tag/const.h". -#endif /* LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86 */ +#endif /* LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715 */ #else #error You need to include "lexbor/tag/const.h". #endif /* LXB_TAG_CONST_VERSION */ @@ -97,7 +95,9 @@ #include "lexbor/html/interfaces/progress_element.h" #include "lexbor/html/interfaces/quote_element.h" #include "lexbor/html/interfaces/script_element.h" +#include "lexbor/html/interfaces/search_element.h" #include "lexbor/html/interfaces/select_element.h" +#include "lexbor/html/interfaces/selectedcontent_element.h" #include "lexbor/html/interfaces/slot_element.h" #include "lexbor/html/interfaces/source_element.h" #include "lexbor/html/interfaces/span_element.h" @@ -131,18 +131,6 @@ } lxb_inline void * -lxb_html_unknown_element_interface_create_wrapper(void *interface) -{ - return lxb_html_unknown_element_interface_create(interface); -} - -lxb_inline void * -lxb_html_unknown_element_interface_destroy_wrapper(void *interface) -{ - return lxb_html_unknown_element_interface_destroy(interface); -} - -lxb_inline void * lxb_html_element_interface_create_wrapper(void *interface) { return lxb_html_element_interface_create(interface); @@ -167,6 +155,18 @@ } lxb_inline void * +lxb_dom_document_interface_create_wrapper(void *interface) +{ + return lxb_dom_document_interface_create(interface); +} + +lxb_inline void * +lxb_dom_document_interface_destroy_wrapper(void *interface) +{ + return lxb_dom_document_interface_destroy(interface); +} + +lxb_inline void * lxb_html_document_interface_create_wrapper(void *interface) { return lxb_html_document_interface_create(interface); @@ -215,6 +215,18 @@ } lxb_inline void * +lxb_html_unknown_element_interface_create_wrapper(void *interface) +{ + return lxb_html_unknown_element_interface_create(interface); +} + +lxb_inline void * +lxb_html_unknown_element_interface_destroy_wrapper(void *interface) +{ + return lxb_html_unknown_element_interface_destroy(interface); +} + +lxb_inline void * lxb_html_area_element_interface_create_wrapper(void *interface) { return lxb_html_area_element_interface_create(interface); @@ -827,6 +839,18 @@ } lxb_inline void * +lxb_html_search_element_interface_create_wrapper(void *interface) +{ + return lxb_html_search_element_interface_create(interface); +} + +lxb_inline void * +lxb_html_search_element_interface_destroy_wrapper(void *interface) +{ + return lxb_html_search_element_interface_destroy(interface); +} + +lxb_inline void * lxb_html_select_element_interface_create_wrapper(void *interface) { return lxb_html_select_element_interface_create(interface); @@ -839,6 +863,18 @@ } lxb_inline void * +lxb_html_selectedcontent_element_interface_create_wrapper(void *interface) +{ + return lxb_html_selectedcontent_element_interface_create(interface); +} + +lxb_inline void * +lxb_html_selectedcontent_element_interface_destroy_wrapper(void *interface) +{ + return lxb_html_selectedcontent_element_interface_destroy(interface); +} + +lxb_inline void * lxb_html_slot_element_interface_create_wrapper(void *interface) { return lxb_html_slot_element_interface_create(interface); @@ -1019,15 +1055,12 @@ } -#ifdef LXB_HTML_INTERFACE_RES_CONSTRUCTORS -#ifndef LXB_HTML_INTERFACE_RES_CONSTRUCTORS_ENABLED -#define LXB_HTML_INTERFACE_RES_CONSTRUCTORS_ENABLED static lxb_dom_interface_constructor_f lxb_html_interface_res_constructors[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY] = { /* LXB_TAG__UNDEF */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1037,8 +1070,8 @@ }, /* LXB_TAG__END_OF_FILE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1048,52 +1081,52 @@ }, /* LXB_TAG__TEXT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper + (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_text_interface_create_wrapper }, /* LXB_TAG__DOCUMENT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_document_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper + (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_document_interface_create_wrapper }, /* LXB_TAG__EM_COMMENT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper + (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_comment_interface_create_wrapper }, /* LXB_TAG__EM_DOCTYPE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper + (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_document_type_interface_create_wrapper }, /* LXB_TAG_A */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_anchor_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1103,8 +1136,8 @@ }, /* LXB_TAG_ABBR */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1114,8 +1147,8 @@ }, /* LXB_TAG_ACRONYM */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1125,8 +1158,8 @@ }, /* LXB_TAG_ADDRESS */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1136,8 +1169,8 @@ }, /* LXB_TAG_ALTGLYPH */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1147,8 +1180,8 @@ }, /* LXB_TAG_ALTGLYPHDEF */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1158,8 +1191,8 @@ }, /* LXB_TAG_ALTGLYPHITEM */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1169,8 +1202,8 @@ }, /* LXB_TAG_ANIMATECOLOR */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1180,8 +1213,8 @@ }, /* LXB_TAG_ANIMATEMOTION */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1191,8 +1224,8 @@ }, /* LXB_TAG_ANIMATETRANSFORM */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1202,8 +1235,8 @@ }, /* LXB_TAG_ANNOTATION_XML */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1213,8 +1246,8 @@ }, /* LXB_TAG_APPLET */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1224,8 +1257,8 @@ }, /* LXB_TAG_AREA */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_area_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1235,8 +1268,8 @@ }, /* LXB_TAG_ARTICLE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1246,8 +1279,8 @@ }, /* LXB_TAG_ASIDE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1257,8 +1290,8 @@ }, /* LXB_TAG_AUDIO */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_audio_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1268,8 +1301,8 @@ }, /* LXB_TAG_B */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1279,8 +1312,8 @@ }, /* LXB_TAG_BASE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_base_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1290,8 +1323,8 @@ }, /* LXB_TAG_BASEFONT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1301,8 +1334,8 @@ }, /* LXB_TAG_BDI */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1312,8 +1345,8 @@ }, /* LXB_TAG_BDO */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1323,8 +1356,8 @@ }, /* LXB_TAG_BGSOUND */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1334,8 +1367,8 @@ }, /* LXB_TAG_BIG */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1345,8 +1378,8 @@ }, /* LXB_TAG_BLINK */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1356,8 +1389,8 @@ }, /* LXB_TAG_BLOCKQUOTE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_quote_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1367,8 +1400,8 @@ }, /* LXB_TAG_BODY */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_body_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1378,8 +1411,8 @@ }, /* LXB_TAG_BR */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_br_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1389,8 +1422,8 @@ }, /* LXB_TAG_BUTTON */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_button_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1400,8 +1433,8 @@ }, /* LXB_TAG_CANVAS */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_canvas_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1411,8 +1444,8 @@ }, /* LXB_TAG_CAPTION */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_table_caption_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1422,8 +1455,8 @@ }, /* LXB_TAG_CENTER */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1433,8 +1466,8 @@ }, /* LXB_TAG_CITE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1444,8 +1477,8 @@ }, /* LXB_TAG_CLIPPATH */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1455,8 +1488,8 @@ }, /* LXB_TAG_CODE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1466,8 +1499,8 @@ }, /* LXB_TAG_COL */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_table_col_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1477,8 +1510,8 @@ }, /* LXB_TAG_COLGROUP */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_table_col_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1488,8 +1521,8 @@ }, /* LXB_TAG_DATA */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_data_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1499,8 +1532,8 @@ }, /* LXB_TAG_DATALIST */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_data_list_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1510,8 +1543,8 @@ }, /* LXB_TAG_DD */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1521,8 +1554,8 @@ }, /* LXB_TAG_DEL */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_mod_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1532,8 +1565,8 @@ }, /* LXB_TAG_DESC */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1543,8 +1576,8 @@ }, /* LXB_TAG_DETAILS */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_details_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1554,8 +1587,8 @@ }, /* LXB_TAG_DFN */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1565,8 +1598,8 @@ }, /* LXB_TAG_DIALOG */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_dialog_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1576,8 +1609,8 @@ }, /* LXB_TAG_DIR */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_directory_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1587,8 +1620,8 @@ }, /* LXB_TAG_DIV */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_div_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1598,8 +1631,8 @@ }, /* LXB_TAG_DL */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_d_list_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1609,8 +1642,8 @@ }, /* LXB_TAG_DT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1620,8 +1653,8 @@ }, /* LXB_TAG_EM */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1631,8 +1664,8 @@ }, /* LXB_TAG_EMBED */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_embed_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1642,8 +1675,8 @@ }, /* LXB_TAG_FEBLEND */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1653,8 +1686,8 @@ }, /* LXB_TAG_FECOLORMATRIX */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1664,8 +1697,8 @@ }, /* LXB_TAG_FECOMPONENTTRANSFER */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1675,8 +1708,8 @@ }, /* LXB_TAG_FECOMPOSITE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1686,8 +1719,8 @@ }, /* LXB_TAG_FECONVOLVEMATRIX */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1697,8 +1730,8 @@ }, /* LXB_TAG_FEDIFFUSELIGHTING */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1708,8 +1741,8 @@ }, /* LXB_TAG_FEDISPLACEMENTMAP */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1719,8 +1752,8 @@ }, /* LXB_TAG_FEDISTANTLIGHT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1730,8 +1763,8 @@ }, /* LXB_TAG_FEDROPSHADOW */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1741,8 +1774,8 @@ }, /* LXB_TAG_FEFLOOD */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1752,8 +1785,8 @@ }, /* LXB_TAG_FEFUNCA */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1763,8 +1796,8 @@ }, /* LXB_TAG_FEFUNCB */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1774,8 +1807,8 @@ }, /* LXB_TAG_FEFUNCG */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1785,8 +1818,8 @@ }, /* LXB_TAG_FEFUNCR */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1796,8 +1829,8 @@ }, /* LXB_TAG_FEGAUSSIANBLUR */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1807,8 +1840,8 @@ }, /* LXB_TAG_FEIMAGE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1818,8 +1851,8 @@ }, /* LXB_TAG_FEMERGE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1829,8 +1862,8 @@ }, /* LXB_TAG_FEMERGENODE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1840,8 +1873,8 @@ }, /* LXB_TAG_FEMORPHOLOGY */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1851,8 +1884,8 @@ }, /* LXB_TAG_FEOFFSET */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1862,8 +1895,8 @@ }, /* LXB_TAG_FEPOINTLIGHT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1873,8 +1906,8 @@ }, /* LXB_TAG_FESPECULARLIGHTING */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1884,8 +1917,8 @@ }, /* LXB_TAG_FESPOTLIGHT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1895,8 +1928,8 @@ }, /* LXB_TAG_FETILE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1906,8 +1939,8 @@ }, /* LXB_TAG_FETURBULENCE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1917,8 +1950,8 @@ }, /* LXB_TAG_FIELDSET */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_field_set_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1928,8 +1961,8 @@ }, /* LXB_TAG_FIGCAPTION */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1939,8 +1972,8 @@ }, /* LXB_TAG_FIGURE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1950,8 +1983,8 @@ }, /* LXB_TAG_FONT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_font_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1961,8 +1994,8 @@ }, /* LXB_TAG_FOOTER */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1972,8 +2005,8 @@ }, /* LXB_TAG_FOREIGNOBJECT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1983,8 +2016,8 @@ }, /* LXB_TAG_FORM */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_form_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -1994,8 +2027,8 @@ }, /* LXB_TAG_FRAME */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_frame_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2005,8 +2038,8 @@ }, /* LXB_TAG_FRAMESET */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_frame_set_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2016,8 +2049,8 @@ }, /* LXB_TAG_GLYPHREF */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2027,8 +2060,8 @@ }, /* LXB_TAG_H1 */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_heading_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2038,8 +2071,8 @@ }, /* LXB_TAG_H2 */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_heading_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2049,8 +2082,8 @@ }, /* LXB_TAG_H3 */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_heading_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2060,8 +2093,8 @@ }, /* LXB_TAG_H4 */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_heading_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2071,8 +2104,8 @@ }, /* LXB_TAG_H5 */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_heading_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2082,8 +2115,8 @@ }, /* LXB_TAG_H6 */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_heading_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2093,8 +2126,8 @@ }, /* LXB_TAG_HEAD */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_head_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2104,8 +2137,8 @@ }, /* LXB_TAG_HEADER */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2115,8 +2148,8 @@ }, /* LXB_TAG_HGROUP */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2126,8 +2159,8 @@ }, /* LXB_TAG_HR */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_hr_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2137,8 +2170,8 @@ }, /* LXB_TAG_HTML */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2148,8 +2181,8 @@ }, /* LXB_TAG_I */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2159,8 +2192,8 @@ }, /* LXB_TAG_IFRAME */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_iframe_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2170,8 +2203,8 @@ }, /* LXB_TAG_IMAGE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_image_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2181,8 +2214,8 @@ }, /* LXB_TAG_IMG */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_image_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2192,8 +2225,8 @@ }, /* LXB_TAG_INPUT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_input_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2203,8 +2236,8 @@ }, /* LXB_TAG_INS */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_mod_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2214,8 +2247,8 @@ }, /* LXB_TAG_ISINDEX */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2225,8 +2258,8 @@ }, /* LXB_TAG_KBD */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2236,8 +2269,8 @@ }, /* LXB_TAG_KEYGEN */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2247,8 +2280,8 @@ }, /* LXB_TAG_LABEL */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_label_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2258,8 +2291,8 @@ }, /* LXB_TAG_LEGEND */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_legend_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2269,8 +2302,8 @@ }, /* LXB_TAG_LI */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_li_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2280,8 +2313,8 @@ }, /* LXB_TAG_LINEARGRADIENT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2291,8 +2324,8 @@ }, /* LXB_TAG_LINK */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_link_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2302,8 +2335,8 @@ }, /* LXB_TAG_LISTING */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_pre_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2313,8 +2346,8 @@ }, /* LXB_TAG_MAIN */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2324,8 +2357,8 @@ }, /* LXB_TAG_MALIGNMARK */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2335,8 +2368,8 @@ }, /* LXB_TAG_MAP */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_map_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2346,8 +2379,8 @@ }, /* LXB_TAG_MARK */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2357,8 +2390,8 @@ }, /* LXB_TAG_MARQUEE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_marquee_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2368,8 +2401,8 @@ }, /* LXB_TAG_MATH */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2379,8 +2412,8 @@ }, /* LXB_TAG_MENU */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_menu_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2390,8 +2423,8 @@ }, /* LXB_TAG_META */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_meta_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2401,8 +2434,8 @@ }, /* LXB_TAG_METER */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_meter_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2412,8 +2445,8 @@ }, /* LXB_TAG_MFENCED */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2423,8 +2456,8 @@ }, /* LXB_TAG_MGLYPH */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2434,8 +2467,8 @@ }, /* LXB_TAG_MI */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2445,8 +2478,8 @@ }, /* LXB_TAG_MN */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2456,8 +2489,8 @@ }, /* LXB_TAG_MO */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2467,8 +2500,8 @@ }, /* LXB_TAG_MS */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2478,8 +2511,8 @@ }, /* LXB_TAG_MTEXT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2489,8 +2522,8 @@ }, /* LXB_TAG_MULTICOL */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2500,8 +2533,8 @@ }, /* LXB_TAG_NAV */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2511,8 +2544,8 @@ }, /* LXB_TAG_NEXTID */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2522,8 +2555,8 @@ }, /* LXB_TAG_NOBR */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2533,8 +2566,8 @@ }, /* LXB_TAG_NOEMBED */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2544,8 +2577,8 @@ }, /* LXB_TAG_NOFRAMES */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2555,8 +2588,8 @@ }, /* LXB_TAG_NOSCRIPT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2566,8 +2599,8 @@ }, /* LXB_TAG_OBJECT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_object_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2577,8 +2610,8 @@ }, /* LXB_TAG_OL */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_o_list_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2588,8 +2621,8 @@ }, /* LXB_TAG_OPTGROUP */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_opt_group_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2599,8 +2632,8 @@ }, /* LXB_TAG_OPTION */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_option_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2610,8 +2643,8 @@ }, /* LXB_TAG_OUTPUT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_output_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2621,8 +2654,8 @@ }, /* LXB_TAG_P */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_paragraph_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2632,8 +2665,8 @@ }, /* LXB_TAG_PARAM */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_param_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2643,8 +2676,8 @@ }, /* LXB_TAG_PATH */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2654,8 +2687,8 @@ }, /* LXB_TAG_PICTURE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_picture_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2665,8 +2698,8 @@ }, /* LXB_TAG_PLAINTEXT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2676,8 +2709,8 @@ }, /* LXB_TAG_PRE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_pre_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2687,8 +2720,8 @@ }, /* LXB_TAG_PROGRESS */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_progress_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2698,8 +2731,8 @@ }, /* LXB_TAG_Q */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_quote_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2709,8 +2742,8 @@ }, /* LXB_TAG_RADIALGRADIENT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2720,8 +2753,8 @@ }, /* LXB_TAG_RB */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2731,8 +2764,8 @@ }, /* LXB_TAG_RP */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2742,8 +2775,8 @@ }, /* LXB_TAG_RT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2753,8 +2786,8 @@ }, /* LXB_TAG_RTC */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2764,8 +2797,8 @@ }, /* LXB_TAG_RUBY */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2775,8 +2808,8 @@ }, /* LXB_TAG_S */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2786,8 +2819,8 @@ }, /* LXB_TAG_SAMP */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2797,8 +2830,8 @@ }, /* LXB_TAG_SCRIPT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_script_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2806,10 +2839,21 @@ (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper }, + /* LXB_TAG_SEARCH */ + { + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_html_search_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper + }, /* LXB_TAG_SECTION */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2819,8 +2863,8 @@ }, /* LXB_TAG_SELECT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_select_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2828,10 +2872,21 @@ (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper }, + /* LXB_TAG_SELECTEDCONTENT */ + { + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_html_selectedcontent_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper + }, /* LXB_TAG_SLOT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_slot_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2841,8 +2896,8 @@ }, /* LXB_TAG_SMALL */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2852,8 +2907,8 @@ }, /* LXB_TAG_SOURCE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_source_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2863,8 +2918,8 @@ }, /* LXB_TAG_SPACER */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2874,8 +2929,8 @@ }, /* LXB_TAG_SPAN */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_span_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2885,8 +2940,8 @@ }, /* LXB_TAG_STRIKE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2896,8 +2951,8 @@ }, /* LXB_TAG_STRONG */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2907,8 +2962,8 @@ }, /* LXB_TAG_STYLE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_style_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2918,8 +2973,8 @@ }, /* LXB_TAG_SUB */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2929,8 +2984,8 @@ }, /* LXB_TAG_SUMMARY */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2940,8 +2995,8 @@ }, /* LXB_TAG_SUP */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2951,8 +3006,8 @@ }, /* LXB_TAG_SVG */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2962,8 +3017,8 @@ }, /* LXB_TAG_TABLE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_table_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2973,8 +3028,8 @@ }, /* LXB_TAG_TBODY */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_table_section_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2984,8 +3039,8 @@ }, /* LXB_TAG_TD */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_table_cell_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -2995,8 +3050,8 @@ }, /* LXB_TAG_TEMPLATE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_template_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3006,8 +3061,8 @@ }, /* LXB_TAG_TEXTAREA */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_text_area_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3017,8 +3072,8 @@ }, /* LXB_TAG_TEXTPATH */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3028,8 +3083,8 @@ }, /* LXB_TAG_TFOOT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_table_section_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3039,8 +3094,8 @@ }, /* LXB_TAG_TH */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_table_cell_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3050,8 +3105,8 @@ }, /* LXB_TAG_THEAD */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_table_section_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3061,8 +3116,8 @@ }, /* LXB_TAG_TIME */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_time_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3072,8 +3127,8 @@ }, /* LXB_TAG_TITLE */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_title_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3083,8 +3138,8 @@ }, /* LXB_TAG_TR */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_table_row_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3094,8 +3149,8 @@ }, /* LXB_TAG_TRACK */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_track_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3105,8 +3160,8 @@ }, /* LXB_TAG_TT */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3116,8 +3171,8 @@ }, /* LXB_TAG_U */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3127,8 +3182,8 @@ }, /* LXB_TAG_UL */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_u_list_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3138,8 +3193,8 @@ }, /* LXB_TAG_VAR */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3149,8 +3204,8 @@ }, /* LXB_TAG_VIDEO */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_video_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3160,8 +3215,8 @@ }, /* LXB_TAG_WBR */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3171,8 +3226,8 @@ }, /* LXB_TAG_XMP */ { - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, - (lxb_dom_interface_constructor_f) lxb_html_unknown_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, + (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_html_pre_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper, @@ -3181,18 +3236,13 @@ (lxb_dom_interface_constructor_f) lxb_dom_element_interface_create_wrapper } }; -#endif /* LXB_HTML_INTERFACE_RES_CONSTRUCTORS_ENABLED */ -#endif /* LXB_HTML_INTERFACE_RES_CONSTRUCTORS */ -#ifdef LXB_HTML_INTERFACE_RES_DESTRUCTOR -#ifndef LXB_HTML_INTERFACE_RES_DESTRUCTOR_ENABLED -#define LXB_HTML_INTERFACE_RES_DESTRUCTOR_ENABLED static lxb_dom_interface_destructor_f lxb_html_interface_res_destructor[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY] = { /* LXB_TAG__UNDEF */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3202,8 +3252,8 @@ }, /* LXB_TAG__END_OF_FILE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3213,52 +3263,52 @@ }, /* LXB_TAG__TEXT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper + (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_text_interface_destroy_wrapper }, /* LXB_TAG__DOCUMENT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_document_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper + (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_document_interface_destroy_wrapper }, /* LXB_TAG__EM_COMMENT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper + (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_comment_interface_destroy_wrapper }, /* LXB_TAG__EM_DOCTYPE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper + (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_document_type_interface_destroy_wrapper }, /* LXB_TAG_A */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_anchor_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3268,8 +3318,8 @@ }, /* LXB_TAG_ABBR */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3279,8 +3329,8 @@ }, /* LXB_TAG_ACRONYM */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3290,8 +3340,8 @@ }, /* LXB_TAG_ADDRESS */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3301,8 +3351,8 @@ }, /* LXB_TAG_ALTGLYPH */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3312,8 +3362,8 @@ }, /* LXB_TAG_ALTGLYPHDEF */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3323,8 +3373,8 @@ }, /* LXB_TAG_ALTGLYPHITEM */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3334,8 +3384,8 @@ }, /* LXB_TAG_ANIMATECOLOR */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3345,8 +3395,8 @@ }, /* LXB_TAG_ANIMATEMOTION */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3356,8 +3406,8 @@ }, /* LXB_TAG_ANIMATETRANSFORM */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3367,8 +3417,8 @@ }, /* LXB_TAG_ANNOTATION_XML */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3378,8 +3428,8 @@ }, /* LXB_TAG_APPLET */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3389,8 +3439,8 @@ }, /* LXB_TAG_AREA */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_area_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3400,8 +3450,8 @@ }, /* LXB_TAG_ARTICLE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3411,8 +3461,8 @@ }, /* LXB_TAG_ASIDE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3422,8 +3472,8 @@ }, /* LXB_TAG_AUDIO */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_audio_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3433,8 +3483,8 @@ }, /* LXB_TAG_B */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3444,8 +3494,8 @@ }, /* LXB_TAG_BASE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_base_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3455,8 +3505,8 @@ }, /* LXB_TAG_BASEFONT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3466,8 +3516,8 @@ }, /* LXB_TAG_BDI */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3477,8 +3527,8 @@ }, /* LXB_TAG_BDO */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3488,8 +3538,8 @@ }, /* LXB_TAG_BGSOUND */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3499,8 +3549,8 @@ }, /* LXB_TAG_BIG */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3510,8 +3560,8 @@ }, /* LXB_TAG_BLINK */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3521,8 +3571,8 @@ }, /* LXB_TAG_BLOCKQUOTE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_quote_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3532,8 +3582,8 @@ }, /* LXB_TAG_BODY */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_body_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3543,8 +3593,8 @@ }, /* LXB_TAG_BR */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_br_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3554,8 +3604,8 @@ }, /* LXB_TAG_BUTTON */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_button_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3565,8 +3615,8 @@ }, /* LXB_TAG_CANVAS */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_canvas_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3576,8 +3626,8 @@ }, /* LXB_TAG_CAPTION */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_table_caption_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3587,8 +3637,8 @@ }, /* LXB_TAG_CENTER */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3598,8 +3648,8 @@ }, /* LXB_TAG_CITE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3609,8 +3659,8 @@ }, /* LXB_TAG_CLIPPATH */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3620,8 +3670,8 @@ }, /* LXB_TAG_CODE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3631,8 +3681,8 @@ }, /* LXB_TAG_COL */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_table_col_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3642,8 +3692,8 @@ }, /* LXB_TAG_COLGROUP */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_table_col_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3653,8 +3703,8 @@ }, /* LXB_TAG_DATA */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_data_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3664,8 +3714,8 @@ }, /* LXB_TAG_DATALIST */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_data_list_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3675,8 +3725,8 @@ }, /* LXB_TAG_DD */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3686,8 +3736,8 @@ }, /* LXB_TAG_DEL */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_mod_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3697,8 +3747,8 @@ }, /* LXB_TAG_DESC */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3708,8 +3758,8 @@ }, /* LXB_TAG_DETAILS */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_details_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3719,8 +3769,8 @@ }, /* LXB_TAG_DFN */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3730,8 +3780,8 @@ }, /* LXB_TAG_DIALOG */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_dialog_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3741,8 +3791,8 @@ }, /* LXB_TAG_DIR */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_directory_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3752,8 +3802,8 @@ }, /* LXB_TAG_DIV */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_div_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3763,8 +3813,8 @@ }, /* LXB_TAG_DL */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_d_list_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3774,8 +3824,8 @@ }, /* LXB_TAG_DT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3785,8 +3835,8 @@ }, /* LXB_TAG_EM */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3796,8 +3846,8 @@ }, /* LXB_TAG_EMBED */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_embed_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3807,8 +3857,8 @@ }, /* LXB_TAG_FEBLEND */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3818,8 +3868,8 @@ }, /* LXB_TAG_FECOLORMATRIX */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3829,8 +3879,8 @@ }, /* LXB_TAG_FECOMPONENTTRANSFER */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3840,8 +3890,8 @@ }, /* LXB_TAG_FECOMPOSITE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3851,8 +3901,8 @@ }, /* LXB_TAG_FECONVOLVEMATRIX */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3862,8 +3912,8 @@ }, /* LXB_TAG_FEDIFFUSELIGHTING */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3873,8 +3923,8 @@ }, /* LXB_TAG_FEDISPLACEMENTMAP */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3884,8 +3934,8 @@ }, /* LXB_TAG_FEDISTANTLIGHT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3895,8 +3945,8 @@ }, /* LXB_TAG_FEDROPSHADOW */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3906,8 +3956,8 @@ }, /* LXB_TAG_FEFLOOD */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3917,8 +3967,8 @@ }, /* LXB_TAG_FEFUNCA */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3928,8 +3978,8 @@ }, /* LXB_TAG_FEFUNCB */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3939,8 +3989,8 @@ }, /* LXB_TAG_FEFUNCG */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3950,8 +4000,8 @@ }, /* LXB_TAG_FEFUNCR */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3961,8 +4011,8 @@ }, /* LXB_TAG_FEGAUSSIANBLUR */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3972,8 +4022,8 @@ }, /* LXB_TAG_FEIMAGE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3983,8 +4033,8 @@ }, /* LXB_TAG_FEMERGE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -3994,8 +4044,8 @@ }, /* LXB_TAG_FEMERGENODE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4005,8 +4055,8 @@ }, /* LXB_TAG_FEMORPHOLOGY */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4016,8 +4066,8 @@ }, /* LXB_TAG_FEOFFSET */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4027,8 +4077,8 @@ }, /* LXB_TAG_FEPOINTLIGHT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4038,8 +4088,8 @@ }, /* LXB_TAG_FESPECULARLIGHTING */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4049,8 +4099,8 @@ }, /* LXB_TAG_FESPOTLIGHT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4060,8 +4110,8 @@ }, /* LXB_TAG_FETILE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4071,8 +4121,8 @@ }, /* LXB_TAG_FETURBULENCE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4082,8 +4132,8 @@ }, /* LXB_TAG_FIELDSET */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_field_set_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4093,8 +4143,8 @@ }, /* LXB_TAG_FIGCAPTION */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4104,8 +4154,8 @@ }, /* LXB_TAG_FIGURE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4115,8 +4165,8 @@ }, /* LXB_TAG_FONT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_font_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4126,8 +4176,8 @@ }, /* LXB_TAG_FOOTER */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4137,8 +4187,8 @@ }, /* LXB_TAG_FOREIGNOBJECT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4148,8 +4198,8 @@ }, /* LXB_TAG_FORM */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_form_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4159,8 +4209,8 @@ }, /* LXB_TAG_FRAME */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_frame_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4170,8 +4220,8 @@ }, /* LXB_TAG_FRAMESET */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_frame_set_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4181,8 +4231,8 @@ }, /* LXB_TAG_GLYPHREF */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4192,8 +4242,8 @@ }, /* LXB_TAG_H1 */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_heading_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4203,8 +4253,8 @@ }, /* LXB_TAG_H2 */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_heading_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4214,8 +4264,8 @@ }, /* LXB_TAG_H3 */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_heading_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4225,8 +4275,8 @@ }, /* LXB_TAG_H4 */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_heading_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4236,8 +4286,8 @@ }, /* LXB_TAG_H5 */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_heading_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4247,8 +4297,8 @@ }, /* LXB_TAG_H6 */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_heading_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4258,8 +4308,8 @@ }, /* LXB_TAG_HEAD */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_head_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4269,8 +4319,8 @@ }, /* LXB_TAG_HEADER */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4280,8 +4330,8 @@ }, /* LXB_TAG_HGROUP */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4291,8 +4341,8 @@ }, /* LXB_TAG_HR */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_hr_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4302,8 +4352,8 @@ }, /* LXB_TAG_HTML */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4313,8 +4363,8 @@ }, /* LXB_TAG_I */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4324,8 +4374,8 @@ }, /* LXB_TAG_IFRAME */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_iframe_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4335,8 +4385,8 @@ }, /* LXB_TAG_IMAGE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_image_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4346,8 +4396,8 @@ }, /* LXB_TAG_IMG */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_image_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4357,8 +4407,8 @@ }, /* LXB_TAG_INPUT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_input_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4368,8 +4418,8 @@ }, /* LXB_TAG_INS */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_mod_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4379,8 +4429,8 @@ }, /* LXB_TAG_ISINDEX */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4390,8 +4440,8 @@ }, /* LXB_TAG_KBD */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4401,8 +4451,8 @@ }, /* LXB_TAG_KEYGEN */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4412,8 +4462,8 @@ }, /* LXB_TAG_LABEL */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_label_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4423,8 +4473,8 @@ }, /* LXB_TAG_LEGEND */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_legend_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4434,8 +4484,8 @@ }, /* LXB_TAG_LI */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_li_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4445,8 +4495,8 @@ }, /* LXB_TAG_LINEARGRADIENT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4456,8 +4506,8 @@ }, /* LXB_TAG_LINK */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_link_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4467,8 +4517,8 @@ }, /* LXB_TAG_LISTING */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_pre_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4478,8 +4528,8 @@ }, /* LXB_TAG_MAIN */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4489,8 +4539,8 @@ }, /* LXB_TAG_MALIGNMARK */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4500,8 +4550,8 @@ }, /* LXB_TAG_MAP */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_map_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4511,8 +4561,8 @@ }, /* LXB_TAG_MARK */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4522,8 +4572,8 @@ }, /* LXB_TAG_MARQUEE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_marquee_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4533,8 +4583,8 @@ }, /* LXB_TAG_MATH */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4544,8 +4594,8 @@ }, /* LXB_TAG_MENU */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_menu_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4555,8 +4605,8 @@ }, /* LXB_TAG_META */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_meta_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4566,8 +4616,8 @@ }, /* LXB_TAG_METER */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_meter_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4577,8 +4627,8 @@ }, /* LXB_TAG_MFENCED */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4588,8 +4638,8 @@ }, /* LXB_TAG_MGLYPH */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4599,8 +4649,8 @@ }, /* LXB_TAG_MI */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4610,8 +4660,8 @@ }, /* LXB_TAG_MN */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4621,8 +4671,8 @@ }, /* LXB_TAG_MO */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4632,8 +4682,8 @@ }, /* LXB_TAG_MS */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4643,8 +4693,8 @@ }, /* LXB_TAG_MTEXT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4654,8 +4704,8 @@ }, /* LXB_TAG_MULTICOL */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4665,8 +4715,8 @@ }, /* LXB_TAG_NAV */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4676,8 +4726,8 @@ }, /* LXB_TAG_NEXTID */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4687,8 +4737,8 @@ }, /* LXB_TAG_NOBR */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4698,8 +4748,8 @@ }, /* LXB_TAG_NOEMBED */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4709,8 +4759,8 @@ }, /* LXB_TAG_NOFRAMES */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4720,8 +4770,8 @@ }, /* LXB_TAG_NOSCRIPT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4731,8 +4781,8 @@ }, /* LXB_TAG_OBJECT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_object_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4742,8 +4792,8 @@ }, /* LXB_TAG_OL */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_o_list_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4753,8 +4803,8 @@ }, /* LXB_TAG_OPTGROUP */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_opt_group_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4764,8 +4814,8 @@ }, /* LXB_TAG_OPTION */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_option_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4775,8 +4825,8 @@ }, /* LXB_TAG_OUTPUT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_output_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4786,8 +4836,8 @@ }, /* LXB_TAG_P */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_paragraph_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4797,8 +4847,8 @@ }, /* LXB_TAG_PARAM */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_param_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4808,8 +4858,8 @@ }, /* LXB_TAG_PATH */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4819,8 +4869,8 @@ }, /* LXB_TAG_PICTURE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_picture_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4830,8 +4880,8 @@ }, /* LXB_TAG_PLAINTEXT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4841,8 +4891,8 @@ }, /* LXB_TAG_PRE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_pre_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4852,8 +4902,8 @@ }, /* LXB_TAG_PROGRESS */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_progress_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4863,8 +4913,8 @@ }, /* LXB_TAG_Q */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_quote_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4874,8 +4924,8 @@ }, /* LXB_TAG_RADIALGRADIENT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4885,8 +4935,8 @@ }, /* LXB_TAG_RB */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4896,8 +4946,8 @@ }, /* LXB_TAG_RP */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4907,8 +4957,8 @@ }, /* LXB_TAG_RT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4918,8 +4968,8 @@ }, /* LXB_TAG_RTC */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4929,8 +4979,8 @@ }, /* LXB_TAG_RUBY */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4940,8 +4990,8 @@ }, /* LXB_TAG_S */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4951,8 +5001,8 @@ }, /* LXB_TAG_SAMP */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4962,8 +5012,8 @@ }, /* LXB_TAG_SCRIPT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_script_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4971,10 +5021,21 @@ (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper }, + /* LXB_TAG_SEARCH */ + { + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_html_search_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper + }, /* LXB_TAG_SECTION */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4984,8 +5045,8 @@ }, /* LXB_TAG_SELECT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_select_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -4993,10 +5054,21 @@ (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper }, + /* LXB_TAG_SELECTEDCONTENT */ + { + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_html_selectedcontent_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper + }, /* LXB_TAG_SLOT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_slot_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5006,8 +5078,8 @@ }, /* LXB_TAG_SMALL */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5017,8 +5089,8 @@ }, /* LXB_TAG_SOURCE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_source_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5028,8 +5100,8 @@ }, /* LXB_TAG_SPACER */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5039,8 +5111,8 @@ }, /* LXB_TAG_SPAN */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_span_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5050,8 +5122,8 @@ }, /* LXB_TAG_STRIKE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5061,8 +5133,8 @@ }, /* LXB_TAG_STRONG */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5072,8 +5144,8 @@ }, /* LXB_TAG_STYLE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_style_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5083,8 +5155,8 @@ }, /* LXB_TAG_SUB */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5094,8 +5166,8 @@ }, /* LXB_TAG_SUMMARY */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5105,8 +5177,8 @@ }, /* LXB_TAG_SUP */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5116,8 +5188,8 @@ }, /* LXB_TAG_SVG */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5127,8 +5199,8 @@ }, /* LXB_TAG_TABLE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_table_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5138,8 +5210,8 @@ }, /* LXB_TAG_TBODY */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_table_section_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5149,8 +5221,8 @@ }, /* LXB_TAG_TD */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_table_cell_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5160,8 +5232,8 @@ }, /* LXB_TAG_TEMPLATE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_template_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5171,8 +5243,8 @@ }, /* LXB_TAG_TEXTAREA */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_text_area_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5182,8 +5254,8 @@ }, /* LXB_TAG_TEXTPATH */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5193,8 +5265,8 @@ }, /* LXB_TAG_TFOOT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_table_section_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5204,8 +5276,8 @@ }, /* LXB_TAG_TH */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_table_cell_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5215,8 +5287,8 @@ }, /* LXB_TAG_THEAD */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_table_section_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5226,8 +5298,8 @@ }, /* LXB_TAG_TIME */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_time_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5237,8 +5309,8 @@ }, /* LXB_TAG_TITLE */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_title_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5248,8 +5320,8 @@ }, /* LXB_TAG_TR */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_table_row_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5259,8 +5331,8 @@ }, /* LXB_TAG_TRACK */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_track_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5270,8 +5342,8 @@ }, /* LXB_TAG_TT */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5281,8 +5353,8 @@ }, /* LXB_TAG_U */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5292,8 +5364,8 @@ }, /* LXB_TAG_UL */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_u_list_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5303,8 +5375,8 @@ }, /* LXB_TAG_VAR */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5314,8 +5386,8 @@ }, /* LXB_TAG_VIDEO */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_video_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5325,8 +5397,8 @@ }, /* LXB_TAG_WBR */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5336,8 +5408,8 @@ }, /* LXB_TAG_XMP */ { - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, - (lxb_dom_interface_destructor_f) lxb_html_unknown_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, + (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_html_pre_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper, @@ -5346,5 +5418,5 @@ (lxb_dom_interface_destructor_f) lxb_dom_element_interface_destroy_wrapper } }; -#endif /* LXB_HTML_INTERFACE_RES_DESTRUCTOR_ENABLED */ -#endif /* LXB_HTML_INTERFACE_RES_DESTRUCTOR */ + +#endif /* LXB_HTML_INTERFACE_RES_H */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/document.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/document.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/document.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/document.c 2026-05-05 16:34:12.000000000 +0000 @@ -11,16 +11,18 @@ #include "lexbor/html/interfaces/style_element.h" #include "lexbor/html/node.h" #include "lexbor/html/parser.h" +#include "lexbor/html/tokenizer.h" #include "lexbor/tag/tag.h" #include "lexbor/dom/interfaces/text.h" #include "lexbor/dom/interfaces/element.h" -#define LXB_HTML_TAG_RES_DATA -#define LXB_HTML_TAG_RES_SHS_DATA -#include "lexbor/html/tag_res.h" +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN lxb_html_tag_category_t lxb_html_tag_res_cats[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY]; + LXB_EXTERN lxb_html_tag_fixname_t lxb_html_tag_res_fixname_svg[LXB_TAG__LAST_ENTRY]; +#endif lxb_status_t lxb_html_parse_chunk_prepare(lxb_html_parser_t *parser, @@ -34,7 +36,7 @@ lxb_inline lxb_dom_interface_t * -lxb_html_document_interface_create_wrapper(lxb_dom_document_t *document, +lxb_html_document_interface_create_handler(lxb_dom_document_t *document, lxb_tag_id_t tag_id, lxb_ns_id_t ns) { return lxb_html_interface_create(lxb_html_interface_document(document), @@ -60,7 +62,7 @@ } status = lxb_dom_document_init(doc, lxb_dom_interface_document(document), - lxb_html_document_interface_create_wrapper, + lxb_html_document_interface_create_handler, lxb_html_interface_clone, lxb_html_interface_destroy, LXB_DOM_DOCUMENT_DTYPE_HTML, LXB_NS_HTML); @@ -267,6 +269,7 @@ { lxb_status_t status; lxb_dom_document_t *doc; + lxb_html_parser_t *parser; doc = lxb_dom_interface_document(document); @@ -278,6 +281,10 @@ lxb_html_parser_destroy(doc->parser); return status; } + + parser = doc->parser; + + lxb_html_tokenizer_keep_duplicate_set(parser->tkz, true); } else if (lxb_html_parser_state(doc->parser) != LXB_HTML_PARSER_STATE_BEGIN) { lxb_html_parser_clean(doc->parser); diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/option_element.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/option_element.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/option_element.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/option_element.c 2026-05-05 16:34:12.000000000 +0000 @@ -5,6 +5,8 @@ */ #include "lexbor/html/interfaces/option_element.h" +#include "lexbor/html/interfaces/select_element.h" +#include "lexbor/html/interfaces/selectedcontent_element.h" #include "lexbor/html/interfaces/document.h" @@ -33,3 +35,48 @@ (void) lxb_dom_node_interface_destroy(lxb_dom_interface_node(option_element)); return NULL; } + +lxb_dom_exception_code_t +lxb_html_option_maybe_clone_to_selectedcontent(lxb_html_option_element_t *option) +{ + bool is; + lxb_dom_node_t *select; + lxb_html_select_element_t *select_el; + lxb_html_selectedcontent_element_t *sel_content; + + is = lxb_html_option_element_selectedness(lxb_html_interface_option(option)); + if (!is) { + return LXB_DOM_EXCEPTION_OK; + } + + select = lxb_dom_interface_node(option); + + do { + select = select->parent; + + if (select == NULL) { + return LXB_DOM_EXCEPTION_OK; + } + } + while (select->local_name != LXB_TAG_SELECT || select->ns != LXB_NS_HTML); + + select_el = lxb_html_interface_select(select); + + sel_content = lxb_html_select_get_enabled_selectedcontent(select_el); + if (sel_content == NULL) { + return LXB_DOM_EXCEPTION_OK; + } + + return lxb_html_selectedcontent_clone_option(sel_content, option); +} + +bool +lxb_html_option_element_selectedness(lxb_html_option_element_t *option) +{ + lxb_dom_attr_t *selected; + + selected = lxb_dom_element_attr_by_id(lxb_dom_interface_element(option), + LXB_DOM_ATTR_SELECTED); + + return selected != NULL; +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/option_element.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/option_element.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/option_element.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/option_element.h 2026-05-05 16:34:12.000000000 +0000 @@ -27,6 +27,13 @@ lxb_html_option_element_interface_destroy(lxb_html_option_element_t *option_element); +LXB_API lxb_dom_exception_code_t +lxb_html_option_maybe_clone_to_selectedcontent(lxb_html_option_element_t *option); + +LXB_API bool +lxb_html_option_element_selectedness(lxb_html_option_element_t *option); + + #ifdef __cplusplus } /* extern "C" */ #endif diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/search_element.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/search_element.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/search_element.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/search_element.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2018 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/html/interfaces/search_element.h" +#include "lexbor/html/interfaces/document.h" + + +lxb_html_search_element_t * +lxb_html_search_element_interface_create(lxb_html_document_t *document) +{ + lxb_html_search_element_t *element; + + element = lexbor_mraw_calloc(document->dom_document.mraw, + sizeof(lxb_html_search_element_t)); + if (element == NULL) { + return NULL; + } + + lxb_dom_node_t *node = lxb_dom_interface_node(element); + + node->owner_document = lxb_html_document_original_ref(document); + node->type = LXB_DOM_NODE_TYPE_ELEMENT; + + return element; +} + +lxb_html_search_element_t * +lxb_html_search_element_interface_destroy(lxb_html_search_element_t *search_element) +{ + (void) lxb_dom_node_interface_destroy(lxb_dom_interface_node(search_element)); + return NULL; +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/search_element.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/search_element.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/search_element.h 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/search_element.h 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2018 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#ifndef LEXBOR_HTML_SEARCH_ELEMENT_H +#define LEXBOR_HTML_SEARCH_ELEMENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lexbor/html/interface.h" +#include "lexbor/html/interfaces/element.h" + + +struct lxb_html_search_element { + lxb_html_element_t element; +}; + + +LXB_API lxb_html_search_element_t * +lxb_html_search_element_interface_create(lxb_html_document_t *document); + +LXB_API lxb_html_search_element_t * +lxb_html_search_element_interface_destroy(lxb_html_search_element_t *search_element); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LEXBOR_HTML_SEARCH_ELEMENT_H */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/select_element.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/select_element.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/select_element.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/select_element.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2025 Alexander Borisov * * Author: Alexander Borisov */ @@ -8,6 +8,10 @@ #include "lexbor/html/interfaces/document.h" +static lexbor_action_t +lxb_html_select_find_selectedcontent_cb(lxb_dom_node_t *node, void *ctx); + + lxb_html_select_element_t * lxb_html_select_element_interface_create(lxb_html_document_t *document) { @@ -33,3 +37,44 @@ (void) lxb_dom_node_interface_destroy(lxb_dom_interface_node(select_element)); return NULL; } + +lxb_html_selectedcontent_element_t * +lxb_html_select_get_enabled_selectedcontent(lxb_html_select_element_t *el) +{ + lxb_dom_attr_t *multiple; + lxb_dom_node_t *selectedcontent, *node; + + multiple = lxb_dom_element_attr_by_id(lxb_dom_interface_element(el), + LXB_DOM_ATTR_MULTIPLE); + if (multiple != NULL) { + return NULL; + } + + selectedcontent = NULL; + node = lxb_dom_interface_node(el); + + lxb_dom_node_simple_walk(node, lxb_html_select_find_selectedcontent_cb, + &selectedcontent); + if (selectedcontent == NULL) { + return NULL; + } + + return lxb_html_interface_selectedcontent(selectedcontent); +} + +static lexbor_action_t +lxb_html_select_find_selectedcontent_cb(lxb_dom_node_t *node, void *ctx) +{ + lxb_dom_node_t **selectedcontent; + + if (node->local_name == LXB_TAG_SELECTEDCONTENT + && node->ns == LXB_NS_HTML) + { + selectedcontent = ctx; + *selectedcontent = node; + + return LEXBOR_ACTION_STOP; + } + + return LEXBOR_ACTION_OK; +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/select_element.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/select_element.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/select_element.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/select_element.h 2026-05-05 16:34:12.000000000 +0000 @@ -26,6 +26,8 @@ LXB_API lxb_html_select_element_t * lxb_html_select_element_interface_destroy(lxb_html_select_element_t *select_element); +LXB_API lxb_html_selectedcontent_element_t * +lxb_html_select_get_enabled_selectedcontent(lxb_html_select_element_t *el); #ifdef __cplusplus } /* extern "C" */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/selectedcontent_element.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/selectedcontent_element.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/selectedcontent_element.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/selectedcontent_element.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2025 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/dom/interfaces/document_fragment.h" +#include "lexbor/html/interfaces/selectedcontent_element.h" +#include "lexbor/html/interfaces/document.h" + + +lxb_html_selectedcontent_element_t * +lxb_html_selectedcontent_element_interface_create(lxb_html_document_t *document) +{ + lxb_html_selectedcontent_element_t *element; + + element = lexbor_mraw_calloc(document->dom_document.mraw, + sizeof(lxb_html_selectedcontent_element_t)); + if (element == NULL) { + return NULL; + } + + lxb_dom_node_t *node = lxb_dom_interface_node(element); + + node->owner_document = lxb_html_document_original_ref(document); + node->type = LXB_DOM_NODE_TYPE_ELEMENT; + + return element; +} + +lxb_html_selectedcontent_element_t * +lxb_html_selectedcontent_element_interface_destroy(lxb_html_selectedcontent_element_t *selectedcontent_element) +{ + (void) lxb_dom_node_interface_destroy(lxb_dom_interface_node(selectedcontent_element)); + return NULL; +} + +lxb_dom_exception_code_t +lxb_html_selectedcontent_clone_option(lxb_html_selectedcontent_element_t *sc, + lxb_html_option_element_t *option) +{ + lxb_dom_node_t *node, *child, *opt_node; + lxb_dom_document_fragment_t fragment; + + memset(&fragment, 0x00, sizeof(lxb_dom_document_fragment_t)); + + opt_node = lxb_dom_interface_node(option); + + fragment.node.type = LXB_DOM_NODE_TYPE_DOCUMENT_FRAGMENT; + fragment.node.owner_document = opt_node->owner_document; + + node = opt_node->first_child; + + while (node != NULL) { + child = lxb_dom_node_clone(node, true); + if (child == NULL) { + return LXB_DOM_EXCEPTION_ERR; + } + + lxb_dom_node_insert_child_wo_events(lxb_dom_interface_node(&fragment), + child); + node = node->next; + } + + return lxb_dom_node_replace_all_spec(lxb_dom_interface_node(sc), + lxb_dom_interface_node(&fragment)); +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/selectedcontent_element.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/selectedcontent_element.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/interfaces/selectedcontent_element.h 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/interfaces/selectedcontent_element.h 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#ifndef LEXBOR_HTML_SELECTEDCONTENT_ELEMENT_H +#define LEXBOR_HTML_SELECTEDCONTENT_ELEMENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lexbor/html/interface.h" +#include "lexbor/html/interfaces/element.h" + + +struct lxb_html_selectedcontent_element { + lxb_html_element_t element; +}; + + +LXB_API lxb_html_selectedcontent_element_t * +lxb_html_selectedcontent_element_interface_create(lxb_html_document_t *document); + +LXB_API lxb_html_selectedcontent_element_t * +lxb_html_selectedcontent_element_interface_destroy(lxb_html_selectedcontent_element_t *selectedcontent_element); + +LXB_API lxb_dom_exception_code_t +lxb_html_selectedcontent_clone_option(lxb_html_selectedcontent_element_t *sc, + lxb_html_option_element_t *option); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LEXBOR_HTML_SELECTEDCONTENT_ELEMENT_H */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/parser.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/parser.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/parser.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/parser.c 2026-05-05 16:34:12.000000000 +0000 @@ -13,9 +13,10 @@ #include "lexbor/html/tree/template_insertion.h" #include "lexbor/html/tree/insertion_mode.h" -#define LXB_HTML_TAG_RES_DATA -#define LXB_HTML_TAG_RES_SHS_DATA -#include "lexbor/html/tag_res.h" +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN lxb_html_tag_category_t lxb_html_tag_res_cats[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY]; + LXB_EXTERN lxb_html_tag_fixname_t lxb_html_tag_res_fixname_svg[LXB_TAG__LAST_ENTRY]; +#endif static void @@ -43,6 +44,8 @@ return status; } + lxb_html_tokenizer_keep_duplicate_set(parser->tkz, true); + /* Tree */ parser->tree = lxb_html_tree_create(); status = lxb_html_tree_init(parser->tree, parser->tkz); @@ -339,7 +342,9 @@ parser->tree->fragment = NULL; } - if (lxb_html_document_is_original(parser->tree->document) == false) { + if (parser->tree->document != NULL + && lxb_html_document_is_original(parser->tree->document) == false) + { if (parser->root != NULL) { doc = lxb_dom_interface_node(parser->tree->document)->owner_document; parser->root->parent = &doc->node; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/style.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/style.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/style.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/style.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2022-2023 Alexander Borisov - * - * Author: Alexander Borisov - */ - -#include "lexbor/html/style.h" - - -uintptr_t -lxb_html_style_id_by_name(lxb_html_document_t *doc, - const lxb_char_t *name, size_t size) -{ - const lxb_css_entry_data_t *data; - - data = lxb_css_property_by_name(name, size); - - if (data == NULL) { - return lxb_html_document_css_customs_find_id(doc, name, size); - } - - return data->unique; -} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/style.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/style.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/style.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/style.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2022-2023 Alexander Borisov - * - * Author: Alexander Borisov - */ - -#ifndef LEXBOR_HTML_STYLE_H -#define LEXBOR_HTML_STYLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "lexbor/core/avl.h" -#include "lexbor/css/selectors/selector.h" -#include "lexbor/html/interfaces/document.h" - - -typedef struct lxb_html_style_weak lxb_html_style_weak_t; - -struct lxb_html_style_weak { - void *value; - lxb_css_selector_specificity_t sp; - - lxb_html_style_weak_t *next; -}; - -typedef struct { - lexbor_avl_node_t entry; - lxb_html_style_weak_t *weak; - - lxb_css_selector_specificity_t sp; -} -lxb_html_style_node_t; - - -LXB_API uintptr_t -lxb_html_style_id_by_name(lxb_html_document_t *doc, - const lxb_char_t *name, size_t size); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LEXBOR_HTML_STYLE_H */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tag.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tag.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tag.c 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tag.c 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2026 Alexander Borisov + * + * Author: Alexander Borisov + */ + +#include "lexbor/html/tag.h" +#include "lexbor/html/tag_res.h" + + +bool +lxb_html_tag_is_category(lxb_tag_id_t tag_id, lxb_ns_id_t ns, + lxb_html_tag_category_t cat) +{ + if (tag_id < LXB_TAG__LAST_ENTRY && ns < LXB_NS__LAST_ENTRY) { + return lxb_html_tag_res_cats[tag_id][ns] & cat; + } + + return (LXB_HTML_TAG_CATEGORY_ORDINARY) & cat; +} + +const lxb_html_tag_fixname_t * +lxb_html_tag_fixname_svg(lxb_tag_id_t tag_id) +{ + if (tag_id >= LXB_TAG__LAST_ENTRY) { + return NULL; + } + + return &lxb_html_tag_res_fixname_svg[tag_id]; +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tag.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tag.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tag.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tag.h 2026-05-05 16:34:12.000000000 +0000 @@ -28,8 +28,7 @@ LXB_HTML_TAG_CATEGORY_SCOPE = 0x0008, LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM = 0x0010, LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON = 0x0020, - LXB_HTML_TAG_CATEGORY_SCOPE_TABLE = 0x0040, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT = 0x0080, + LXB_HTML_TAG_CATEGORY_SCOPE_TABLE = 0x0040 }; typedef struct { @@ -39,36 +38,18 @@ lxb_html_tag_fixname_t; -#define LXB_HTML_TAG_RES_CATS -#define LXB_HTML_TAG_RES_FIXNAME_SVG -#include "lexbor/html/tag_res.h" +LXB_API bool +lxb_html_tag_is_category(lxb_tag_id_t tag_id, lxb_ns_id_t ns, + lxb_html_tag_category_t cat); + +LXB_API const lxb_html_tag_fixname_t * +lxb_html_tag_fixname_svg(lxb_tag_id_t tag_id); /* * Inline functions */ lxb_inline bool -lxb_html_tag_is_category(lxb_tag_id_t tag_id, lxb_ns_id_t ns, - lxb_html_tag_category_t cat) -{ - if (tag_id < LXB_TAG__LAST_ENTRY && ns < LXB_NS__LAST_ENTRY) { - return lxb_html_tag_res_cats[tag_id][ns] & cat; - } - - return (LXB_HTML_TAG_CATEGORY_ORDINARY|LXB_HTML_TAG_CATEGORY_SCOPE_SELECT) & cat; -} - -lxb_inline const lxb_html_tag_fixname_t * -lxb_html_tag_fixname_svg(lxb_tag_id_t tag_id) -{ - if (tag_id >= LXB_TAG__LAST_ENTRY) { - return NULL; - } - - return &lxb_html_tag_res_fixname_svg[tag_id]; -} - -lxb_inline bool lxb_html_tag_is_void(lxb_tag_id_t tag_id) { switch (tag_id) { diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tag_res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tag_res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tag_res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tag_res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -14,14 +14,10 @@ #ifndef LXB_HTML_TAG_RES_H #define LXB_HTML_TAG_RES_H -#include "lexbor/html/tag.h" - -#endif /* LXB_HTML_TAG_RES_H */ - #ifdef LXB_TAG_CONST_VERSION -#ifndef LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86 +#ifndef LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715 #error Mismatched tags version! See "lexbor/tag/const.h". -#endif /* LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86 */ +#endif /* LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715 */ #else #error You need to include "lexbor/tag/const.h". #endif /* LXB_TAG_CONST_VERSION */ @@ -34,1835 +30,1476 @@ #error You need to include "lexbor/ns/const.h". #endif /* LXB_NS_CONST_VERSION */ -#ifdef LXB_HTML_TAG_RES_CATS -#ifndef LXB_HTML_TAG_RES_CATS_ENABLED -#define LXB_HTML_TAG_RES_CATS_ENABLED -static lxb_html_tag_category_t lxb_html_tag_res_cats[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY] = +LXB_API lxb_html_tag_category_t lxb_html_tag_res_cats[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY] = { /* LXB_TAG__UNDEF */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG__END_OF_FILE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG__TEXT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY }, /* LXB_TAG__DOCUMENT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY }, /* LXB_TAG__EM_COMMENT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY }, /* LXB_TAG__EM_DOCTYPE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY_ORDINARY }, /* LXB_TAG_A */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ABBR */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ACRONYM */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ADDRESS */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ALTGLYPH */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ALTGLYPHDEF */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ALTGLYPHITEM */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ANIMATECOLOR */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ANIMATEMOTION */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ANIMATETRANSFORM */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ANNOTATION_XML */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_APPLET */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_AREA */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ARTICLE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ASIDE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_AUDIO */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_B */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_BASE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_BASEFONT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_BDI */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_BDO */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_BGSOUND */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_BIG */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_BLINK */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_BLOCKQUOTE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_BODY */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_BR */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_BUTTON */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_CANVAS */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_CAPTION */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_CENTER */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_CITE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_CLIPPATH */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_CODE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_COL */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_COLGROUP */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_DATA */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_DATALIST */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_DD */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_DEL */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_DESC */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_DETAILS */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_DFN */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_DIALOG */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_DIR */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_DIV */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_DL */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_DT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_EM */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_EMBED */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEBLEND */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FECOLORMATRIX */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FECOMPONENTTRANSFER */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FECOMPOSITE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FECONVOLVEMATRIX */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEDIFFUSELIGHTING */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEDISPLACEMENTMAP */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEDISTANTLIGHT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEDROPSHADOW */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEFLOOD */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEFUNCA */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEFUNCB */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEFUNCG */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEFUNCR */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEGAUSSIANBLUR */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEIMAGE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEMERGE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEMERGENODE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEMORPHOLOGY */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEOFFSET */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FEPOINTLIGHT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FESPECULARLIGHTING */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FESPOTLIGHT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FETILE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FETURBULENCE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FIELDSET */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FIGCAPTION */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FIGURE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FONT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FOOTER */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FOREIGNOBJECT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FORM */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FRAME */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_FRAMESET */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_GLYPHREF */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_H1 */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_H2 */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_H3 */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_H4 */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_H5 */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_H6 */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_HEAD */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_HEADER */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_HGROUP */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_HR */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_HTML */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SCOPE_TABLE |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_I */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_IFRAME */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_IMAGE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_IMG */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_INPUT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_INS */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_ISINDEX */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_KBD */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_KEYGEN */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_LABEL */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_LEGEND */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_LI */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_LINEARGRADIENT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_LINK */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_LISTING */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MAIN */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MALIGNMARK */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_ORDINARY, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MAP */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MARK */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MARQUEE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MATH */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MENU */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_META */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_METER */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MFENCED */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MGLYPH */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_ORDINARY, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_ORDINARY, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MI */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MN */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MO */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MS */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MTEXT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_MULTICOL */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_NAV */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_NEXTID */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_NOBR */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_NOEMBED */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_NOFRAMES */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_NOSCRIPT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_OBJECT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_OL */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_OPTGROUP */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_OPTION */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_OUTPUT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_P */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_PARAM */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_PATH */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_PICTURE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_PLAINTEXT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_PRE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_PROGRESS */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_Q */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_RADIALGRADIENT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_RB */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_RP */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_RT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_RTC */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_RUBY */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_S */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SAMP */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SCRIPT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF + }, + /* LXB_TAG_SEARCH */ + { + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SECTION */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SELECT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SCOPE + |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON + |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF + }, + /* LXB_TAG_SELECTEDCONTENT */ + { + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SLOT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SMALL */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SOURCE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SPACER */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SPAN */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_STRIKE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_STRONG */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_STYLE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SUB */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SUMMARY */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SUP */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_SVG */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TABLE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SCOPE_TABLE |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TBODY */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TD */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TEMPLATE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SCOPE_TABLE |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TEXTAREA */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TEXTPATH */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TFOOT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TH */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_THEAD */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TIME */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TITLE */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE |LXB_HTML_TAG_CATEGORY_SCOPE_BUTTON |LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TR */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TRACK */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_TT */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_U */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_FORMATTING - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_FORMATTING,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_UL */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY_SCOPE_LIST_ITEM - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_VAR */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_VIDEO */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_ORDINARY - |LXB_HTML_TAG_CATEGORY_SCOPE_SELECT, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_ORDINARY,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_WBR */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF }, /* LXB_TAG_XMP */ { - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT - |LXB_HTML_TAG_CATEGORY_SPECIAL, - LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF, - LXB_HTML_TAG_CATEGORY__UNDEF, LXB_HTML_TAG_CATEGORY__UNDEF + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY_SPECIAL,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF, + LXB_HTML_TAG_CATEGORY__UNDEF,LXB_HTML_TAG_CATEGORY__UNDEF } }; -#endif /* LXB_HTML_TAG_RES_CATS_ENABLED */ -#endif /* LXB_HTML_TAG_RES_CATS */ -#ifdef LXB_HTML_TAG_RES_FIXNAME_SVG -#ifndef LXB_HTML_TAG_RES_FIXNAME_SVG_ENABLED -#define LXB_HTML_TAG_RES_FIXNAME_SVG_ENABLED -static lxb_html_tag_fixname_t lxb_html_tag_res_fixname_svg[LXB_TAG__LAST_ENTRY] = +LXB_API lxb_html_tag_fixname_t lxb_html_tag_res_fixname_svg[LXB_TAG__LAST_ENTRY] = { /* LXB_TAG__UNDEF */ {NULL, 0}, @@ -2188,10 +1825,14 @@ {NULL, 0}, /* LXB_TAG_SCRIPT */ {NULL, 0}, + /* LXB_TAG_SEARCH */ + {NULL, 0}, /* LXB_TAG_SECTION */ {NULL, 0}, /* LXB_TAG_SELECT */ {NULL, 0}, + /* LXB_TAG_SELECTEDCONTENT */ + {NULL, 0}, /* LXB_TAG_SLOT */ {NULL, 0}, /* LXB_TAG_SMALL */ @@ -2256,7 +1897,7 @@ {NULL, 0}, /* LXB_TAG_XMP */ {NULL, 0}, - + }; -#endif /* LXB_HTML_TAG_RES_FIXNAME_SVG_ENABLED */ -#endif /* LXB_HTML_TAG_RES_FIXNAME_SVG */ + +#endif /* LXB_HTML_TAG_RES_H */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/token.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/token.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/token.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/token.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -7,11 +7,12 @@ #include "lexbor/html/token.h" #include "lexbor/html/tokenizer.h" -#define LEXBOR_STR_RES_MAP_LOWERCASE -#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER -#define LEXBOR_STR_RES_MAP_HEX -#define LEXBOR_STR_RES_MAP_NUM -#include "lexbor/core/str_res.h" +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256]; + LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4]; + LXB_EXTERN const lxb_char_t lexbor_str_res_map_num[256]; + LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256]; +#endif #include "lexbor/dom/interfaces/document_type.h" diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/error.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/error.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/error.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/error.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,9 +1,10 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ +#include "lexbor/core/str.h" #include "lexbor/html/tokenizer/error.h" @@ -26,3 +27,76 @@ return entry; } + +const lxb_char_t * +lxb_html_tokenizer_error_to_string(lxb_html_tokenizer_error_id_t id, + size_t *len) +{ + static const lexbor_str_t unknown = lexbor_str("unknown error"); + + static const lexbor_str_t errors[LXB_HTML_TOKENIZER_ERROR_LAST_ENTRY] = { + lexbor_str("abrupt closing of empty comment"), + lexbor_str("abrupt doctype public identifier"), + lexbor_str("abrupt doctype system identifier"), + lexbor_str("absence of digits in numeric character reference"), + lexbor_str("cdata in html content"), + lexbor_str("character reference outside unicode range"), + lexbor_str("control character in input stream"), + lexbor_str("control character reference"), + lexbor_str("end tag with attributes"), + lexbor_str("duplicate attribute"), + lexbor_str("end tag with trailing solidus"), + lexbor_str("eof before tag name"), + lexbor_str("eof in cdata"), + lexbor_str("eof in comment"), + lexbor_str("eof in doctype"), + lexbor_str("eof in script html comment like text"), + lexbor_str("eof in tag"), + lexbor_str("incorrectly closed comment"), + lexbor_str("incorrectly opened comment"), + lexbor_str("invalid character sequence after doctype name"), + lexbor_str("invalid first character of tag name"), + lexbor_str("missing attribute value"), + lexbor_str("missing doctype name"), + lexbor_str("missing doctype public identifier"), + lexbor_str("missing doctype system identifier"), + lexbor_str("missing end tag name"), + lexbor_str("missing quote before doctype public identifier"), + lexbor_str("missing quote before doctype system identifier"), + lexbor_str("missing semicolon after character reference"), + lexbor_str("missing whitespace after doctype public keyword"), + lexbor_str("missing whitespace after doctype system keyword"), + lexbor_str("missing whitespace before doctype name"), + lexbor_str("missing whitespace between attributes"), + lexbor_str("missing whitespace between doctype public and system identifiers"), + lexbor_str("nested comment"), + lexbor_str("noncharacter character reference"), + lexbor_str("noncharacter in input stream"), + lexbor_str("non void html element start tag with trailing solidus"), + lexbor_str("null character reference"), + lexbor_str("surrogate character reference"), + lexbor_str("surrogate in input stream"), + lexbor_str("unexpected character after doctype system identifier"), + lexbor_str("unexpected character in attribute name"), + lexbor_str("unexpected character in unquoted attribute value"), + lexbor_str("unexpected equals sign before attribute name"), + lexbor_str("unexpected null character"), + lexbor_str("unexpected question mark instead of tag name"), + lexbor_str("unexpected solidus in tag"), + lexbor_str("unknown named character reference") + }; + + if (id >= (sizeof(errors) / sizeof(lexbor_str_t))) { + if (len != NULL) { + *len = unknown.length; + } + + return unknown.data; + } + + if (len != NULL) { + *len = errors[id].length; + } + + return errors[id].data; +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/error.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/error.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/error.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/error.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -21,102 +21,103 @@ /* abrupt-closing-of-empty-comment */ LXB_HTML_TOKENIZER_ERROR_ABCLOFEMCO = 0x0000, /* abrupt-doctype-public-identifier */ - LXB_HTML_TOKENIZER_ERROR_ABDOPUID = 0x0001, + LXB_HTML_TOKENIZER_ERROR_ABDOPUID, /* abrupt-doctype-system-identifier */ - LXB_HTML_TOKENIZER_ERROR_ABDOSYID = 0x0002, + LXB_HTML_TOKENIZER_ERROR_ABDOSYID, /* absence-of-digits-in-numeric-character-reference */ - LXB_HTML_TOKENIZER_ERROR_ABOFDIINNUCHRE = 0x0003, + LXB_HTML_TOKENIZER_ERROR_ABOFDIINNUCHRE, /* cdata-in-html-content */ - LXB_HTML_TOKENIZER_ERROR_CDINHTCO = 0x0004, + LXB_HTML_TOKENIZER_ERROR_CDINHTCO, /* character-reference-outside-unicode-range */ - LXB_HTML_TOKENIZER_ERROR_CHREOUUNRA = 0x0005, + LXB_HTML_TOKENIZER_ERROR_CHREOUUNRA, /* control-character-in-input-stream */ - LXB_HTML_TOKENIZER_ERROR_COCHININST = 0x0006, + LXB_HTML_TOKENIZER_ERROR_COCHININST, /* control-character-reference */ - LXB_HTML_TOKENIZER_ERROR_COCHRE = 0x0007, + LXB_HTML_TOKENIZER_ERROR_COCHRE, /* end-tag-with-attributes */ - LXB_HTML_TOKENIZER_ERROR_ENTAWIAT = 0x0008, + LXB_HTML_TOKENIZER_ERROR_ENTAWIAT, /* duplicate-attribute */ - LXB_HTML_TOKENIZER_ERROR_DUAT = 0x0009, + LXB_HTML_TOKENIZER_ERROR_DUAT, /* end-tag-with-trailing-solidus */ - LXB_HTML_TOKENIZER_ERROR_ENTAWITRSO = 0x000A, + LXB_HTML_TOKENIZER_ERROR_ENTAWITRSO, /* eof-before-tag-name */ - LXB_HTML_TOKENIZER_ERROR_EOBETANA = 0x000B, + LXB_HTML_TOKENIZER_ERROR_EOBETANA, /* eof-in-cdata */ - LXB_HTML_TOKENIZER_ERROR_EOINCD = 0x000C, + LXB_HTML_TOKENIZER_ERROR_EOINCD, /* eof-in-comment */ - LXB_HTML_TOKENIZER_ERROR_EOINCO = 0x000D, + LXB_HTML_TOKENIZER_ERROR_EOINCO, /* eof-in-doctype */ - LXB_HTML_TOKENIZER_ERROR_EOINDO = 0x000E, + LXB_HTML_TOKENIZER_ERROR_EOINDO, /* eof-in-script-html-comment-like-text */ - LXB_HTML_TOKENIZER_ERROR_EOINSCHTCOLITE = 0x000F, + LXB_HTML_TOKENIZER_ERROR_EOINSCHTCOLITE, /* eof-in-tag */ - LXB_HTML_TOKENIZER_ERROR_EOINTA = 0x0010, + LXB_HTML_TOKENIZER_ERROR_EOINTA, /* incorrectly-closed-comment */ - LXB_HTML_TOKENIZER_ERROR_INCLCO = 0x0011, + LXB_HTML_TOKENIZER_ERROR_INCLCO, /* incorrectly-opened-comment */ - LXB_HTML_TOKENIZER_ERROR_INOPCO = 0x0012, + LXB_HTML_TOKENIZER_ERROR_INOPCO, /* invalid-character-sequence-after-doctype-name */ - LXB_HTML_TOKENIZER_ERROR_INCHSEAFDONA = 0x0013, + LXB_HTML_TOKENIZER_ERROR_INCHSEAFDONA, /* invalid-first-character-of-tag-name */ - LXB_HTML_TOKENIZER_ERROR_INFICHOFTANA = 0x0014, + LXB_HTML_TOKENIZER_ERROR_INFICHOFTANA, /* missing-attribute-value */ - LXB_HTML_TOKENIZER_ERROR_MIATVA = 0x0015, + LXB_HTML_TOKENIZER_ERROR_MIATVA, /* missing-doctype-name */ - LXB_HTML_TOKENIZER_ERROR_MIDONA = 0x0016, + LXB_HTML_TOKENIZER_ERROR_MIDONA, /* missing-doctype-public-identifier */ - LXB_HTML_TOKENIZER_ERROR_MIDOPUID = 0x0017, + LXB_HTML_TOKENIZER_ERROR_MIDOPUID, /* missing-doctype-system-identifier */ - LXB_HTML_TOKENIZER_ERROR_MIDOSYID = 0x0018, + LXB_HTML_TOKENIZER_ERROR_MIDOSYID, /* missing-end-tag-name */ - LXB_HTML_TOKENIZER_ERROR_MIENTANA = 0x0019, + LXB_HTML_TOKENIZER_ERROR_MIENTANA, /* missing-quote-before-doctype-public-identifier */ - LXB_HTML_TOKENIZER_ERROR_MIQUBEDOPUID = 0x001A, + LXB_HTML_TOKENIZER_ERROR_MIQUBEDOPUID, /* missing-quote-before-doctype-system-identifier */ - LXB_HTML_TOKENIZER_ERROR_MIQUBEDOSYID = 0x001B, + LXB_HTML_TOKENIZER_ERROR_MIQUBEDOSYID, /* missing-semicolon-after-character-reference */ - LXB_HTML_TOKENIZER_ERROR_MISEAFCHRE = 0x001C, + LXB_HTML_TOKENIZER_ERROR_MISEAFCHRE, /* missing-whitespace-after-doctype-public-keyword */ - LXB_HTML_TOKENIZER_ERROR_MIWHAFDOPUKE = 0x001D, + LXB_HTML_TOKENIZER_ERROR_MIWHAFDOPUKE, /* missing-whitespace-after-doctype-system-keyword */ - LXB_HTML_TOKENIZER_ERROR_MIWHAFDOSYKE = 0x001E, + LXB_HTML_TOKENIZER_ERROR_MIWHAFDOSYKE, /* missing-whitespace-before-doctype-name */ - LXB_HTML_TOKENIZER_ERROR_MIWHBEDONA = 0x001F, + LXB_HTML_TOKENIZER_ERROR_MIWHBEDONA, /* missing-whitespace-between-attributes */ - LXB_HTML_TOKENIZER_ERROR_MIWHBEAT = 0x0020, + LXB_HTML_TOKENIZER_ERROR_MIWHBEAT, /* missing-whitespace-between-doctype-public-and-system-identifiers */ - LXB_HTML_TOKENIZER_ERROR_MIWHBEDOPUANSYID = 0x0021, + LXB_HTML_TOKENIZER_ERROR_MIWHBEDOPUANSYID, /* nested-comment */ - LXB_HTML_TOKENIZER_ERROR_NECO = 0x0022, + LXB_HTML_TOKENIZER_ERROR_NECO, /* noncharacter-character-reference */ - LXB_HTML_TOKENIZER_ERROR_NOCHRE = 0x0023, + LXB_HTML_TOKENIZER_ERROR_NOCHRE, /* noncharacter-in-input-stream */ - LXB_HTML_TOKENIZER_ERROR_NOININST = 0x0024, + LXB_HTML_TOKENIZER_ERROR_NOININST, /* non-void-html-element-start-tag-with-trailing-solidus */ - LXB_HTML_TOKENIZER_ERROR_NOVOHTELSTTAWITRSO = 0x0025, + LXB_HTML_TOKENIZER_ERROR_NOVOHTELSTTAWITRSO, /* null-character-reference */ - LXB_HTML_TOKENIZER_ERROR_NUCHRE = 0x0026, + LXB_HTML_TOKENIZER_ERROR_NUCHRE, /* surrogate-character-reference */ - LXB_HTML_TOKENIZER_ERROR_SUCHRE = 0x0027, + LXB_HTML_TOKENIZER_ERROR_SUCHRE, /* surrogate-in-input-stream */ - LXB_HTML_TOKENIZER_ERROR_SUININST = 0x0028, + LXB_HTML_TOKENIZER_ERROR_SUININST, /* unexpected-character-after-doctype-system-identifier */ - LXB_HTML_TOKENIZER_ERROR_UNCHAFDOSYID = 0x0029, + LXB_HTML_TOKENIZER_ERROR_UNCHAFDOSYID, /* unexpected-character-in-attribute-name */ - LXB_HTML_TOKENIZER_ERROR_UNCHINATNA = 0x002A, + LXB_HTML_TOKENIZER_ERROR_UNCHINATNA, /* unexpected-character-in-unquoted-attribute-value */ - LXB_HTML_TOKENIZER_ERROR_UNCHINUNATVA = 0x002B, + LXB_HTML_TOKENIZER_ERROR_UNCHINUNATVA, /* unexpected-equals-sign-before-attribute-name */ - LXB_HTML_TOKENIZER_ERROR_UNEQSIBEATNA = 0x002C, + LXB_HTML_TOKENIZER_ERROR_UNEQSIBEATNA, /* unexpected-null-character */ - LXB_HTML_TOKENIZER_ERROR_UNNUCH = 0x002D, + LXB_HTML_TOKENIZER_ERROR_UNNUCH, /* unexpected-question-mark-instead-of-tag-name */ - LXB_HTML_TOKENIZER_ERROR_UNQUMAINOFTANA = 0x002E, + LXB_HTML_TOKENIZER_ERROR_UNQUMAINOFTANA, /* unexpected-solidus-in-tag */ - LXB_HTML_TOKENIZER_ERROR_UNSOINTA = 0x002F, + LXB_HTML_TOKENIZER_ERROR_UNSOINTA, /* unknown-named-character-reference */ - LXB_HTML_TOKENIZER_ERROR_UNNACHRE = 0x0030, - LXB_HTML_TOKENIZER_ERROR_LAST_ENTRY = 0x0031, + LXB_HTML_TOKENIZER_ERROR_UNNACHRE, + + LXB_HTML_TOKENIZER_ERROR_LAST_ENTRY } lxb_html_tokenizer_error_id_t; @@ -132,10 +133,13 @@ const lxb_char_t *pos, lxb_html_tokenizer_error_id_t id); +LXB_API const lxb_char_t * +lxb_html_tokenizer_error_to_string(lxb_html_tokenizer_error_id_t id, + size_t *len); + #ifdef __cplusplus } /* extern "C" */ #endif #endif /* LEXBOR_HTML_TOKENIZER_ERROR_H */ - diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,12 +1,12 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ /* - * Caution!!! Important!!! - * This file is generated by the script + * Important! + * This file generated by the script * "utils/lexbor/html/tokenizer_entities_bst.py"! * Do not change this file! */ @@ -15,12 +15,6 @@ #ifndef LXB_HTML_TOKENIZER_RES_H #define LXB_HTML_TOKENIZER_RES_H -#endif /* LXB_HTML_TOKENIZER_RES */ - - -#ifdef LXB_HTML_TOKENIZER_RES_ENTITIES_SBST -#ifndef LXB_HTML_TOKENIZER_RES_ENTITIES_SBST_ENABLED -#define LXB_HTML_TOKENIZER_RES_ENTITIES_SBST_ENABLED static const lexbor_sbst_entry_static_t lxb_html_tokenizer_res_entities_sbst[] = { {0x00, {0}, 0, 0, 0, 0}, {0x61, {0}, 0, 3, 2, 53}, @@ -4951,6 +4945,6 @@ {0x3b, "\xd1\x8e", 2, 0, 0, 0}, {0x70, {0}, 0, 0, 0, 9852}, {0x66, {0}, 0, 0, 0, 9853}, {0x3b, "\xf0\x9d\x95\xaa", 4, 0, 0, 0} }; -#endif /* LXB_HTML_TOKENIZER_RES_ENTITIES_SBST_ENABLED */ -#endif /* LXB_HTML_TOKENIZER_RES_ENTITIES_SBST */ + +#endif /* LXB_HTML_TOKENIZER_RES */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -8,16 +8,16 @@ #include "lexbor/html/tokenizer/state_comment.h" #include "lexbor/html/tokenizer/state_doctype.h" -#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER -#define LEXBOR_STR_RES_ALPHANUMERIC_CHARACTER -#define LEXBOR_STR_RES_REPLACEMENT_CHARACTER -#define LEXBOR_STR_RES_ALPHA_CHARACTER -#define LEXBOR_STR_RES_MAP_HEX -#define LEXBOR_STR_RES_MAP_NUM -#include "lexbor/core/str_res.h" -#include "lexbor/core/swar.h" +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_map_num[256]; + LXB_EXTERN const lxb_char_t lexbor_str_res_map_hex[256]; + LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4]; + LXB_EXTERN const size_t lexbor_str_res_alphanumeric_character[256]; + LXB_EXTERN const size_t lexbor_str_res_alpha_character[256]; + LXB_EXTERN const size_t lexbor_str_res_replacement_character[160]; +#endif -#define LXB_HTML_TOKENIZER_RES_ENTITIES_SBST +#include "lexbor/core/swar.h" #include "lexbor/html/tokenizer/res.h" @@ -124,11 +124,6 @@ /* CDATA Section */ static const lxb_char_t * -lxb_html_tokenizer_state_cdata_section_before(lxb_html_tokenizer_t *tkz, - const lxb_char_t *data, - const lxb_char_t *end); - -static const lxb_char_t * lxb_html_tokenizer_state_cdata_section(lxb_html_tokenizer_t *tkz, const lxb_char_t *data, const lxb_char_t *end); @@ -282,7 +277,7 @@ lxb_html_tokenizer_state_token_set_end_eof(tkz); } - if (tkz->token->begin != tkz->token->end) { + if (tkz->pos != tkz->start) { tkz->token->tag_id = LXB_TAG__TEXT; lxb_html_tokenizer_state_append_data_m(tkz, data); @@ -381,7 +376,7 @@ } lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); return end; } @@ -1451,8 +1446,8 @@ else if (*data == 0x5B) { if ((end - data) < 7) { tkz->markup = (lxb_char_t *) "[CDATA["; - tkz->state = lxb_html_tokenizer_state_markup_declaration_cdata; + return data; } @@ -1469,6 +1464,9 @@ return data; } + lxb_html_tokenizer_error_add(tkz->parse_errors, data, + LXB_HTML_TOKENIZER_ERROR_CDINHTCO); + tkz->state = lxb_html_tokenizer_state_bogus_comment_before; return data; @@ -1504,6 +1502,8 @@ return (data + 1); } + lxb_html_tokenizer_state_append_m(tkz, "-", 1); + lxb_html_tokenizer_error_add(tkz->parse_errors, data, LXB_HTML_TOKENIZER_ERROR_INOPCO); @@ -1538,6 +1538,8 @@ return data; } + lxb_html_tokenizer_state_append_m(tkz, data, (end - data)); + tkz->markup = pos; return end; @@ -1575,6 +1577,9 @@ lxb_html_tokenizer_state_append_m(tkz, "[CDATA", 6); + lxb_html_tokenizer_error_add(tkz->parse_errors, data, + LXB_HTML_TOKENIZER_ERROR_CDINHTCO); + tkz->state = lxb_html_tokenizer_state_bogus_comment_before; return data; } @@ -1587,7 +1592,7 @@ /* * Helper function. No in the specification. For 12.2.5.69 */ -static const lxb_char_t * +const lxb_char_t * lxb_html_tokenizer_state_cdata_section_before(lxb_html_tokenizer_t *tkz, const lxb_char_t *data, const lxb_char_t *end) @@ -1661,7 +1666,7 @@ } lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); return end; } @@ -1726,7 +1731,7 @@ tkz->state = lxb_html_tokenizer_state_data_before; lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); return (data + 1); } @@ -1857,9 +1862,28 @@ */ /* U+003B SEMICOLON character (;) */ if (tkz->is_attribute && tkz->entity_match->key != 0x3B) { + lxb_char_t ch; + + /* + * The "next input character" per the spec is the character immediately + * after the matched entity, not the character that broke the SBST + * lookup. For example, for "¬i;" the match is "¬" + * and the next input character is 'i', not ';'. + * + * If there are trailing characters in the buffer after the match, + * the next input character is the first one after entity_end. + * Otherwise it is *data (the character that terminated the SBST). + */ + if (&tkz->start[tkz->entity_end + 1] < tkz->pos) { + ch = tkz->start[tkz->entity_end + 1]; + } + else { + ch = *data; + } + /* U+003D EQUALS SIGN character (=) or ASCII alphanumeric */ - if (*data == 0x3D - || lexbor_str_res_alphanumeric_character[*data] != LEXBOR_STR_RES_SLIP) + if (ch == 0x3D + || lexbor_str_res_alphanumeric_character[ch] != LEXBOR_STR_RES_SLIP) { return data; } @@ -1902,16 +1926,30 @@ const lxb_char_t *data, const lxb_char_t *end) { - /* ASCII alphanumeric */ - /* Skipped, not need */ + const lxb_char_t *begin = data; - /* U+003B SEMICOLON (;) */ - if (*data == 0x3B) { - lxb_html_tokenizer_error_add(tkz->parse_errors, data, - LXB_HTML_TOKENIZER_ERROR_UNNACHRE); + while (data < end) { + /* Not ASCII alphanumeric */ + if (lexbor_str_res_alphanumeric_character[ *data ] == LEXBOR_STR_RES_SLIP) { + lxb_html_tokenizer_state_append_m(tkz, begin, (data - begin)); + + /* U+003B SEMICOLON (;) */ + if (*data == 0x3B) { + lxb_html_tokenizer_error_add(tkz->parse_errors, data, + LXB_HTML_TOKENIZER_ERROR_UNNACHRE); + } + + tkz->state = tkz->state_return; + + return data; + } + + data += 1; } - tkz->state = tkz->state_return; + if (begin < data) { + lxb_html_tokenizer_state_append_m(tkz, begin, (data - begin)); + } return data; } @@ -2002,6 +2040,10 @@ if (*data == ';') { data++; } + else { + lxb_html_tokenizer_error_add(tkz->parse_errors, data, + LXB_HTML_TOKENIZER_ERROR_MISEAFCHRE); + } return lxb_html_tokenizer_state_char_ref_numeric_end(tkz, data, end); } @@ -2032,6 +2074,10 @@ if (*data == ';') { data++; } + else { + lxb_html_tokenizer_error_add(tkz->parse_errors, data, + LXB_HTML_TOKENIZER_ERROR_MISEAFCHRE); + } return lxb_html_tokenizer_state_char_ref_numeric_end(tkz, data, end); } diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state.h 2026-05-05 16:34:12.000000000 +0000 @@ -110,6 +110,10 @@ #define lxb_html_tokenizer_state_token_attr_add_m(tkz, attr, v_return) \ do { \ + if (!(tkz->opt & LXB_HTML_TOKENIZER_OPT_ATTR_KEEP_DUPLICATE)) { \ + lxb_html_tokenizer_attr_last_duplicate(tkz); \ + } \ + \ attr = lxb_html_token_attr_append(tkz->token, tkz->dobj_token_attr); \ if (attr == NULL) { \ tkz->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; \ @@ -145,6 +149,14 @@ (tkz->token->attr_last->value_end = tkz->last) #define _lxb_html_tokenizer_state_token_done_m(tkz, v_end) \ + if (!(tkz->opt & LXB_HTML_TOKENIZER_OPT_ATTR_KEEP_DUPLICATE)) { \ + lxb_html_tokenizer_attr_last_duplicate(tkz); \ + } \ + \ + if (tkz->token->type & LXB_HTML_TOKEN_TYPE_CLOSE) { \ + lxb_html_tokenizer_validate_close_tag(tkz); \ + } \ + \ tkz->token = tkz->callback_token_done(tkz, tkz->token, \ tkz->callback_token_ctx); \ if (tkz->token == NULL) { \ @@ -154,23 +166,32 @@ return v_end; \ } -#define lxb_html_tokenizer_state_token_done_m(tkz, v_end) \ +#define lxb_html_tokenizer_state_token_text_done_m(tkz, v_end) \ do { \ - if (tkz->token->begin != tkz->token->end) { \ - _lxb_html_tokenizer_state_token_done_m(tkz, v_end) \ + if (tkz->token->text_start != tkz->token->text_end) { \ + _lxb_html_tokenizer_state_token_done_m(tkz, v_end); \ } \ lxb_html_token_clean(tkz->token); \ tkz->pos = tkz->start; \ } \ while (0) -#define lxb_html_tokenizer_state_token_done_wo_check_m(tkz, v_end) \ +#define lxb_html_tokenizer_state_token_done_m(tkz, v_end) \ do { \ _lxb_html_tokenizer_state_token_done_m(tkz, v_end) \ lxb_html_token_clean(tkz->token); \ + tkz->pos = tkz->start; \ } \ while (0) +/* + * This macro is alias; it serves to ensure that when reading the code, + * we clearly understand where checks are not necessary, i.e., we are 100% sure + * that the token has been collected and is ready to be sent. + */ +#define lxb_html_tokenizer_state_token_done_wo_check_m(tkz, v_end) \ + lxb_html_tokenizer_state_token_done_m(tkz, v_end) + #define lxb_html_tokenizer_state_set_text(tkz) \ do { \ tkz->token->text_start = tkz->start; \ @@ -180,7 +201,7 @@ #define lxb_html_tokenizer_state_token_emit_text_not_empty_m(tkz, v_end) \ do { \ - if (tkz->token->begin != tkz->token->end) { \ + if (tkz->start != tkz->pos) { \ tkz->token->tag_id = LXB_TAG__TEXT; \ \ lxb_html_tokenizer_state_set_text(tkz); \ @@ -212,6 +233,11 @@ const lxb_char_t *end); LXB_API const lxb_char_t * +lxb_html_tokenizer_state_cdata_section_before(lxb_html_tokenizer_t *tkz, + const lxb_char_t *data, + const lxb_char_t *end); + +LXB_API const lxb_char_t * lxb_html_tokenizer_state_cr(lxb_html_tokenizer_t *tkz, const lxb_char_t *data, const lxb_char_t *end); diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state_comment.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state_comment.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state_comment.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state_comment.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -7,9 +7,9 @@ #include "lexbor/html/tokenizer/state_comment.h" #include "lexbor/html/tokenizer/state.h" -#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER -#include "lexbor/core/str_res.h" - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN +LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4]; +#endif static const lxb_char_t * lxb_html_tokenizer_state_comment_start(lxb_html_tokenizer_t *tkz, @@ -143,8 +143,6 @@ /* EOF */ else if (*data == 0x00) { if (tkz->is_eof) { - lxb_html_tokenizer_state_append_m(tkz, "-", 1); - lxb_html_tokenizer_error_add(tkz->parse_errors, tkz->last, LXB_HTML_TOKENIZER_ERROR_EOINCO); @@ -452,8 +450,12 @@ const lxb_char_t *data, const lxb_char_t *end) { + static const lexbor_str_t two = lexbor_str("--!"); + /* U+002D HYPHEN-MINUS (-) */ if (*data == 0x2D) { + lxb_html_tokenizer_state_append_m(tkz, two.data, two.length); + tkz->state = lxb_html_tokenizer_state_comment_end_dash; return (data + 1); @@ -481,6 +483,11 @@ return end; } + + lxb_html_tokenizer_state_append_m(tkz, two.data, two.length); + } + else { + lxb_html_tokenizer_state_append_m(tkz, two.data, two.length); } tkz->state = lxb_html_tokenizer_state_comment; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state_doctype.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state_doctype.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state_doctype.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state_doctype.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -7,10 +7,9 @@ #include "lexbor/html/tokenizer/state_doctype.h" #include "lexbor/html/tokenizer/state.h" - -#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER -#include "lexbor/core/str_res.h" - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4]; +#endif lxb_dom_attr_data_t * lxb_dom_attr_local_name_append(lexbor_hash_t *hash, @@ -527,6 +526,7 @@ lxb_html_tokenizer_error_add(tkz->parse_errors, data, LXB_HTML_TOKENIZER_ERROR_INCHSEAFDONA); + tkz->token->type |= LXB_HTML_TOKEN_TYPE_FORCE_QUIRKS; tkz->state = lxb_html_tokenizer_state_doctype_bogus; return data; @@ -577,6 +577,7 @@ lxb_html_tokenizer_error_add(tkz->parse_errors, data, LXB_HTML_TOKENIZER_ERROR_INCHSEAFDONA); + tkz->token->type |= LXB_HTML_TOKEN_TYPE_FORCE_QUIRKS; tkz->state = lxb_html_tokenizer_state_doctype_bogus; return data; @@ -797,6 +798,7 @@ /* U+003E GREATER-THAN SIGN (>) */ case 0x3E: tkz->state = lxb_html_tokenizer_state_data_before; + tkz->token->type |= LXB_HTML_TOKEN_TYPE_FORCE_QUIRKS; lxb_html_tokenizer_error_add(tkz->parse_errors, data, LXB_HTML_TOKENIZER_ERROR_ABDOPUID); @@ -912,6 +914,7 @@ /* U+003E GREATER-THAN SIGN (>) */ case 0x3E: tkz->state = lxb_html_tokenizer_state_data_before; + tkz->token->type |= LXB_HTML_TOKEN_TYPE_FORCE_QUIRKS; lxb_html_tokenizer_error_add(tkz->parse_errors, data, LXB_HTML_TOKENIZER_ERROR_ABDOPUID); @@ -1350,6 +1353,7 @@ /* U+003E GREATER-THAN SIGN (>) */ case 0x3E: tkz->state = lxb_html_tokenizer_state_data_before; + tkz->token->type |= LXB_HTML_TOKEN_TYPE_FORCE_QUIRKS; lxb_html_tokenizer_error_add(tkz->parse_errors, data, LXB_HTML_TOKENIZER_ERROR_ABDOSYID); @@ -1465,6 +1469,7 @@ /* U+003E GREATER-THAN SIGN (>) */ case 0x3E: tkz->state = lxb_html_tokenizer_state_data_before; + tkz->token->type |= LXB_HTML_TOKEN_TYPE_FORCE_QUIRKS; lxb_html_tokenizer_error_add(tkz->parse_errors, data, LXB_HTML_TOKENIZER_ERROR_ABDOSYID); diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state_rawtext.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state_rawtext.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state_rawtext.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state_rawtext.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -7,10 +7,10 @@ #include "lexbor/html/tokenizer/state_rawtext.h" #include "lexbor/html/tokenizer/state.h" -#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER -#define LEXBOR_STR_RES_ALPHA_CHARACTER -#include "lexbor/core/str_res.h" - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4]; + LXB_EXTERN const size_t lexbor_str_res_alpha_character[256]; +#endif const lxb_tag_data_t * lxb_tag_append_lower(lexbor_hash_t *hash, @@ -114,7 +114,7 @@ tkz->token->tag_id = LXB_TAG__TEXT; lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); return end; } @@ -246,7 +246,7 @@ tkz->pos = &tkz->start[tkz->entity_start]; lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); /* Init close token */ tkz->token->tag_id = tkz->tmp_tag_id; @@ -291,7 +291,7 @@ tkz->pos = &tkz->start[tkz->entity_start]; lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); /* Init close token */ tkz->token->tag_id = tkz->tmp_tag_id; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state_rcdata.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state_rcdata.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state_rcdata.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state_rcdata.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -7,10 +7,10 @@ #include "lexbor/html/tokenizer/state_rcdata.h" #include "lexbor/html/tokenizer/state.h" -#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER -#define LEXBOR_STR_RES_ALPHA_CHARACTER -#include "lexbor/core/str_res.h" - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4]; + LXB_EXTERN const size_t lexbor_str_res_alpha_character[256]; +#endif const lxb_tag_data_t * lxb_tag_append_lower(lexbor_hash_t *hash, @@ -123,7 +123,7 @@ tkz->token->tag_id = LXB_TAG__TEXT; lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); return end; } @@ -255,7 +255,7 @@ tkz->pos = &tkz->start[tkz->entity_start]; lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); /* Init close token */ tkz->token->tag_id = tkz->tmp_tag_id; @@ -300,7 +300,7 @@ tkz->pos = &tkz->start[tkz->entity_start]; lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); /* Init close token */ tkz->token->tag_id = tkz->tmp_tag_id; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state_script.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state_script.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer/state_script.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer/state_script.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -7,12 +7,11 @@ #include "lexbor/html/tokenizer/state_script.h" #include "lexbor/html/tokenizer/state.h" -#define LEXBOR_STR_RES_ALPHA_CHARACTER -#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER -#include "lexbor/core/str_res.h" - -#include "lexbor/core/str_res.h" - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const size_t lexbor_str_res_alpha_character[256]; + LXB_EXTERN const size_t lexbor_str_res_replacement_character[160]; + LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4]; +#endif const lxb_tag_data_t * lxb_tag_append_lower(lexbor_hash_t *hash, @@ -203,7 +202,7 @@ tkz->token->tag_id = LXB_TAG__TEXT; lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); return end; } @@ -347,7 +346,7 @@ tkz->pos = &tkz->start[tkz->entity_start]; lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); /* Init close token */ tkz->token->tag_id = tkz->tmp_tag_id; @@ -364,6 +363,7 @@ if (lexbor_str_res_alpha_character[*data] == LEXBOR_STR_RES_SLIP) { + lxb_html_tokenizer_state_append_data_m(tkz, data); goto anything_else; } @@ -390,7 +390,7 @@ tkz->pos = &tkz->start[tkz->entity_start]; lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); /* Init close token */ tkz->token->tag_id = tkz->tmp_tag_id; @@ -516,7 +516,7 @@ lxb_html_tokenizer_state_set_text(tkz); lxb_html_tokenizer_state_token_set_end_eof(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); return end; } @@ -580,7 +580,7 @@ lxb_html_tokenizer_state_set_text(tkz); lxb_html_tokenizer_state_token_set_end_eof(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); return end; } @@ -757,7 +757,7 @@ tkz->pos = &tkz->start[tkz->entity_start]; lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); /* Init close token */ tkz->token->tag_id = tkz->tmp_tag_id; @@ -801,7 +801,7 @@ tkz->pos = &tkz->start[tkz->entity_start]; lxb_html_tokenizer_state_set_text(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); /* Init close token */ tkz->token->tag_id = tkz->tmp_tag_id; @@ -946,7 +946,7 @@ lxb_html_tokenizer_state_set_text(tkz); lxb_html_tokenizer_state_token_set_end_eof(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); return end; } @@ -1010,7 +1010,7 @@ lxb_html_tokenizer_state_set_text(tkz); lxb_html_tokenizer_state_token_set_end_eof(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); return end; } @@ -1076,7 +1076,7 @@ lxb_html_tokenizer_state_set_text(tkz); lxb_html_tokenizer_state_token_set_end_eof(tkz); - lxb_html_tokenizer_state_token_done_m(tkz, end); + lxb_html_tokenizer_state_token_text_done_m(tkz, end); return end; } diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer.c 2026-05-05 16:34:12.000000000 +0000 @@ -11,19 +11,20 @@ #include "lexbor/html/tokenizer/state_script.h" #include "lexbor/html/tree.h" -#define LXB_HTML_TAG_RES_DATA -#define LXB_HTML_TAG_RES_SHS_DATA -#include "lexbor/html/tag_res.h" + +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN lxb_html_tag_category_t lxb_html_tag_res_cats[LXB_TAG__LAST_ENTRY][LXB_NS__LAST_ENTRY]; + LXB_EXTERN lxb_html_tag_fixname_t lxb_html_tag_res_fixname_svg[LXB_TAG__LAST_ENTRY]; +#endif #define LXB_HTML_TKZ_TEMP_SIZE (4096 * 4) enum { - LXB_HTML_TOKENIZER_OPT_UNDEF = 0x00, - LXB_HTML_TOKENIZER_OPT_TAGS_SELF = 0x01, - LXB_HTML_TOKENIZER_OPT_ATTRS_SELF = 0x02, - LXB_HTML_TOKENIZER_OPT_ATTRS_MRAW_SELF = 0x04 + LXB_HTML_TOKENIZER_OPT_TAGS_SELF = 1 << 0, + LXB_HTML_TOKENIZER_OPT_ATTRS_SELF = 1 << 1, + LXB_HTML_TOKENIZER_OPT_ATTRS_MRAW_SELF = 1 << 2 }; @@ -206,6 +207,8 @@ tkz->is_eof = false; tkz->status = LXB_STATUS_OK; + tkz->utf8_buf_len = 0; + tkz->pos = tkz->start; lexbor_mraw_clean(tkz->mraw); @@ -304,12 +307,268 @@ return LXB_STATUS_OK; } +/* + * Input stream validation. + * + * Per the HTML spec §13.2.3.5: surrogates, noncharacters, and controls + * (other than ASCII whitespace and NULL) in the input stream are parse errors. + * + * This is a fast linear scan that only fires when + * LXB_HTML_TOKENIZER_OPT_VALIDATE_INPUT is set. + */ + +/* + * Lookup: 1 if the byte is a single-byte control that needs reporting. + * Covers 0x01–0x08, 0x0B, 0x0E–0x1F, 0x7F. + * Excludes 0x00 (handled by tokenizer as UNNUCH), 0x09 (TAB), 0x0A (LF), + * 0x0C (FF), 0x0D (CR), 0x20 (SPACE). + */ +static const lxb_char_t +lxb_html_tkz_validate_ctl[256] = +{ +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ +/* 0 */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, +/* 1 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* 2 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 3 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 4 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 5 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, +/* 8+ */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static void +lxb_html_tokenizer_validate_codepoint(lxb_html_tokenizer_t *tkz, + uint32_t cp, const lxb_char_t *pos) +{ + /* C1 controls: U+0080–U+009F */ + if (cp >= 0x0080 && cp <= 0x009F) { + lxb_html_tokenizer_error_add(tkz->parse_errors, pos, + LXB_HTML_TOKENIZER_ERROR_COCHININST); + return; + } + + /* Surrogates: U+D800–U+DFFF */ + if (cp >= 0xD800 && cp <= 0xDFFF) { + lxb_html_tokenizer_error_add(tkz->parse_errors, pos, + LXB_HTML_TOKENIZER_ERROR_SUININST); + return; + } + + /* Noncharacters: U+FDD0–U+FDEF */ + if (cp >= 0xFDD0 && cp <= 0xFDEF) { + lxb_html_tokenizer_error_add(tkz->parse_errors, pos, + LXB_HTML_TOKENIZER_ERROR_NOININST); + return; + } + + /* Noncharacters: U+xFFFE and U+xFFFF on every plane */ + if ((cp & 0xFFFE) == 0xFFFE && cp <= 0x10FFFF) { + lxb_html_tokenizer_error_add(tkz->parse_errors, pos, + LXB_HTML_TOKENIZER_ERROR_NOININST); + } +} + +static void +lxb_html_tokenizer_validate_flush_utf8(lxb_html_tokenizer_t *tkz, + const lxb_char_t *pos) +{ + uint32_t cp; + unsigned len = tkz->utf8_buf_len; + const lxb_char_t *b = tkz->utf8_buf; + + if (len < 2) { + goto done; + } + + if ((b[0] & 0xE0) == 0xC0) { + cp = ((uint32_t)(b[0] & 0x1F) << 6) | (b[1] & 0x3F); + lxb_html_tokenizer_validate_codepoint(tkz, cp, pos); + goto done; + } + + if (len < 3) { + goto done; + } + + if ((b[0] & 0xF0) == 0xE0) { + cp = ((uint32_t)(b[0] & 0x0F) << 12) + | ((uint32_t)(b[1] & 0x3F) << 6) + | (b[2] & 0x3F); + lxb_html_tokenizer_validate_codepoint(tkz, cp, pos); + goto done; + } + + if (len < 4) { + goto done; + } + + if ((b[0] & 0xF8) == 0xF0) { + cp = ((uint32_t)(b[0] & 0x07) << 18) + | ((uint32_t)(b[1] & 0x3F) << 12) + | ((uint32_t)(b[2] & 0x3F) << 6) + | (b[3] & 0x3F); + lxb_html_tokenizer_validate_codepoint(tkz, cp, pos); + } + +done: + + tkz->utf8_buf_len = 0; +} + +static void +lxb_html_tokenizer_validate_input(lxb_html_tokenizer_t *tkz, + const lxb_char_t *data, size_t size) +{ + uint32_t cp; + unsigned need, len; + const lxb_char_t *p, *end; + + p = data; + end = data + size; + + /* Continue incomplete UTF-8 sequence from previous chunk. */ + if (tkz->utf8_buf_len > 0) { + lxb_char_t lead = tkz->utf8_buf[0]; + + if ((lead & 0xE0) == 0xC0) { + need = 2; + } + else if ((lead & 0xF0) == 0xE0) { + need = 3; + } + else { + need = 4; + } + + while (tkz->utf8_buf_len < need && p < end) { + if ((*p & 0xC0) != 0x80) { + /* Broken sequence, skip. */ + tkz->utf8_buf_len = 0; + break; + } + + tkz->utf8_buf[tkz->utf8_buf_len++] = *p++; + } + + if (tkz->utf8_buf_len == need) { + lxb_html_tokenizer_validate_flush_utf8(tkz, data); + } + else if (p >= end) { + /* Still incomplete, wait for more data. */ + return; + } + else { + /* Broken sequence was reset above. */ + } + } + + while (p < end) { + lxb_char_t b = *p; + + /* Fast path: printable ASCII (0x20–0x7E), TAB, LF, FF, CR, NULL. */ + if (b < 0x80) { + if (lxb_html_tkz_validate_ctl[b]) { + lxb_html_tokenizer_error_add(tkz->parse_errors, p, + LXB_HTML_TOKENIZER_ERROR_COCHININST); + } + + p++; + continue; + } + + /* Multi-byte UTF-8. Determine expected length. */ + if ((b & 0xE0) == 0xC0) { + need = 2; + } + else if ((b & 0xF0) == 0xE0) { + need = 3; + } + else if ((b & 0xF8) == 0xF0) { + need = 4; + } + else { + /* Invalid lead byte or continuation byte, skip. */ + p++; + continue; + } + + /* Check if the full sequence is available in this chunk. */ + if ((unsigned)(end - p) < need) { + /* Save partial sequence for next chunk. */ + len = (unsigned)(end - p); + memcpy(tkz->utf8_buf, p, len); + tkz->utf8_buf_len = len; + return; + } + + /* Quick filter: only decode if lead byte can start a bad codepoint. + * + * 0xC2 -> C1 controls (U+0080–U+009F): second byte 0x80–0x9F + * 0xED -> surrogates (U+D800–U+DFFF): second byte 0xA0–0xBF + * 0xEF -> nonchars U+FDD0–U+FDEF (0xEF 0xB7 0x90–0xAF) + * and U+FFFE/U+FFFF (0xEF 0xBF 0xBE/0xBF) + * 0xF0–0xF4 -> nonchars U+xFFFE/U+xFFFF on planes 1–16 + */ + if (b == 0xC2) { + if (p[1] <= 0x9F) { + cp = ((uint32_t)(b & 0x1F) << 6) | (p[1] & 0x3F); + lxb_html_tokenizer_validate_codepoint(tkz, cp, p); + } + } + else if (b == 0xED) { + if (p[1] >= 0xA0) { + cp = ((uint32_t)(b & 0x0F) << 12) + | ((uint32_t)(p[1] & 0x3F) << 6) + | (p[2] & 0x3F); + lxb_html_tokenizer_validate_codepoint(tkz, cp, p); + } + } + else if (b == 0xEF) { + if (p[1] == 0xB7 && p[2] >= 0x90 && p[2] <= 0xAF) { + /* U+FDD0–U+FDEF */ + lxb_html_tokenizer_error_add(tkz->parse_errors, p, + LXB_HTML_TOKENIZER_ERROR_NOININST); + } + else if (p[1] == 0xBF && (p[2] == 0xBE || p[2] == 0xBF)) { + /* U+FFFE, U+FFFF */ + lxb_html_tokenizer_error_add(tkz->parse_errors, p, + LXB_HTML_TOKENIZER_ERROR_NOININST); + } + } + else if (b >= 0xF0 && b <= 0xF4) { + /* 4-byte: check for xFFFE/xFFFF. */ + if (p[2] == 0xBF && (p[3] == 0xBE || p[3] == 0xBF)) { + cp = ((uint32_t)(b & 0x07) << 18) + | ((uint32_t)(p[1] & 0x3F) << 12) + | ((uint32_t)(p[2] & 0x3F) << 6) + | (p[3] & 0x3F); + lxb_html_tokenizer_validate_codepoint(tkz, cp, p); + } + } + + p += need; + } +} + lxb_status_t lxb_html_tokenizer_chunk(lxb_html_tokenizer_t *tkz, const lxb_char_t *data, size_t size) { const lxb_char_t *end = data + size; + if (tkz->opt & LXB_HTML_TOKENIZER_OPT_VALIDATE_INPUT) { + lxb_html_tokenizer_validate_input(tkz, data, size); + } + tkz->is_eof = false; tkz->status = LXB_STATUS_OK; tkz->last = end; @@ -457,6 +716,46 @@ } } +void +lxb_html_tokenizer_attr_last_duplicate(lxb_html_tokenizer_t *tkz) +{ + lxb_html_token_t *token; + lxb_html_token_attr_t *attr, *last; + + token = tkz->token; + attr = token->attr_first; + last = token->attr_last; + + while (attr != last) { + if (attr->name == last->name) { + lxb_html_tokenizer_error_add(tkz->parse_errors, last->name_begin, + LXB_HTML_TOKENIZER_ERROR_DUAT); + + lxb_html_token_attr_remove(token, last); + lxb_html_token_attr_destroy(last, tkz->dobj_token_attr); + return; + } + + attr = attr->next; + } +} + +void +lxb_html_tokenizer_validate_close_tag(lxb_html_tokenizer_t *tkz) +{ + if (tkz->token->attr_last != NULL) { + lxb_html_tokenizer_error_add(tkz->parse_errors, + tkz->token->attr_last->name_begin, + LXB_HTML_TOKENIZER_ERROR_ENTAWIAT); + } + + if (tkz->token->type & LXB_HTML_TOKEN_TYPE_CLOSE_SELF) { + lxb_html_tokenizer_error_add(tkz->parse_errors, tkz->token->end, + LXB_HTML_TOKENIZER_ERROR_ENTAWITRSO); + } +} + + /* * No inline functions for ABI. */ @@ -508,6 +807,13 @@ lxb_html_tokenizer_tree_set(tkz, tree); } +void +lxb_html_tokenizer_input_validation_set_noi(lxb_html_tokenizer_t *tkz, + bool enabled) +{ + lxb_html_tokenizer_input_validation_set(tkz, enabled); +} + lexbor_mraw_t * lxb_html_tokenizer_mraw_noi(lxb_html_tokenizer_t *tkz) { @@ -519,3 +825,10 @@ { return lxb_html_tokenizer_tags(tkz); } + +void +lxb_html_tokenizer_keep_duplicate_set_noi(lxb_html_tokenizer_t *tkz, + bool keep) +{ + lxb_html_tokenizer_keep_duplicate_set(tkz, keep); +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tokenizer.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tokenizer.h 2026-05-05 16:34:12.000000000 +0000 @@ -21,6 +21,12 @@ #include "lexbor/ns/ns.h" +enum { + LXB_HTML_TOKENIZER_OPT_UNDEF = 0x00, + LXB_HTML_TOKENIZER_OPT_VALIDATE_INPUT = 1 << 3, + LXB_HTML_TOKENIZER_OPT_ATTR_KEEP_DUPLICATE = 1 << 4 +}; + /* State */ typedef const lxb_char_t * (*lxb_html_tokenizer_state_f)(lxb_html_tokenizer_t *tkz, @@ -90,6 +96,10 @@ lxb_status_t status; bool is_eof; + /* Input stream validation (for cross-chunk UTF-8). */ + lxb_char_t utf8_buf[4]; + unsigned utf8_buf_len; + lxb_html_tokenizer_t *base; size_t ref_count; }; @@ -97,8 +107,9 @@ #include "lexbor/html/tokenizer/error.h" - -extern const lxb_char_t *lxb_html_tokenizer_eof; +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t *lxb_html_tokenizer_eof; +#endif LXB_API lxb_html_tokenizer_t * lxb_html_tokenizer_create(void); @@ -156,6 +167,11 @@ lxb_html_tokenizer_set_state_by_tag(lxb_html_tokenizer_t *tkz, bool scripting, lxb_tag_id_t tag_id, lxb_ns_id_t ns); +LXB_API void +lxb_html_tokenizer_attr_last_duplicate(lxb_html_tokenizer_t *tkz); + +LXB_API void +lxb_html_tokenizer_validate_close_tag(lxb_html_tokenizer_t *tkz); /* * Inline functions @@ -250,6 +266,28 @@ return tkz->mraw; } +lxb_inline void +lxb_html_tokenizer_input_validation_set(lxb_html_tokenizer_t *tkz, bool enabled) +{ + if (enabled) { + tkz->opt |= LXB_HTML_TOKENIZER_OPT_VALIDATE_INPUT; + } + else { + tkz->opt &= ~LXB_HTML_TOKENIZER_OPT_VALIDATE_INPUT; + } +} + +lxb_inline void +lxb_html_tokenizer_keep_duplicate_set(lxb_html_tokenizer_t *tkz, bool keep) +{ + if (keep) { + tkz->opt |= LXB_HTML_TOKENIZER_OPT_ATTR_KEEP_DUPLICATE; + } + else { + tkz->opt &= ~LXB_HTML_TOKENIZER_OPT_ATTR_KEEP_DUPLICATE; + } +} + lxb_inline lxb_status_t lxb_html_tokenizer_temp_realloc(lxb_html_tokenizer_t *tkz, size_t size) { @@ -331,12 +369,20 @@ lxb_html_tokenizer_tree_set_noi(lxb_html_tokenizer_t *tkz, lxb_html_tree_t *tree); +LXB_API void +lxb_html_tokenizer_input_validation_set_noi(lxb_html_tokenizer_t *tkz, + bool enabled); + LXB_API lexbor_mraw_t * lxb_html_tokenizer_mraw_noi(lxb_html_tokenizer_t *tkz); LXB_API lexbor_hash_t * lxb_html_tokenizer_tags_noi(lxb_html_tokenizer_t *tkz); +LXB_API void +lxb_html_tokenizer_keep_duplicate_set_noi(lxb_html_tokenizer_t *tkz, + bool keep); + #ifdef __cplusplus } /* extern "C" */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/error.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/error.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/error.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/error.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,9 +1,10 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ +#include "lexbor/core/str.h" #include "lexbor/html/tree/error.h" @@ -27,3 +28,68 @@ return entry; } + +const lxb_char_t * +lxb_html_tree_error_to_string(lxb_html_tree_error_id_t id, size_t *len) +{ + static const lexbor_str_t unknown = lexbor_str("unknown error"); + + static const lexbor_str_t errors[LXB_HTML_RULES_ERROR_LAST_ENTRY] = { + lexbor_str("unexpected token"), + lexbor_str("unexpected closed token"), + lexbor_str("null character"), + lexbor_str("unexpected character token"), + lexbor_str("unexpected token in initial mode"), + lexbor_str("bad doctype token in initial mode"), + lexbor_str("doctype token in before html mode"), + lexbor_str("unexpected closed token in before html mode"), + lexbor_str("doctype token in before head mode"), + lexbor_str("unexpected closed token in before head mode"), + lexbor_str("doctype token in head mode"), + lexbor_str("non void html element start tag with trailing solidus"), + lexbor_str("head token in head mode"), + lexbor_str("unexpected closed token in head mode"), + lexbor_str("template closed token without opening in head mode"), + lexbor_str("template element is not current in head mode"), + lexbor_str("doctype token in head noscript mode"), + lexbor_str("doctype token after head mode"), + lexbor_str("head token after head mode"), + lexbor_str("doctype token in body mode"), + lexbor_str("bad ending open elements is wrong"), + lexbor_str("open elements is wrong"), + lexbor_str("unexpected element in open elements stack"), + lexbor_str("missing element in open elements stack"), + lexbor_str("no body element in scope"), + lexbor_str("missing element in scope"), + lexbor_str("unexpected element in scope"), + lexbor_str("unexpected element in active formatting stack"), + lexbor_str("unexpected end of file"), + lexbor_str("characters in table text"), + lexbor_str("doctype token in table mode"), + lexbor_str("doctype token in select mode"), + lexbor_str("doctype token after body mode"), + lexbor_str("doctype token in frameset mode"), + lexbor_str("doctype token after frameset mode"), + lexbor_str("doctype token foreign content mode"), + lexbor_str("select in scope"), + lexbor_str("fragment parsing select in context parse input"), + lexbor_str("fragment parsing select in context parse select"), + lexbor_str("hr parsing select option optgroup in scope"), + lexbor_str("option parsing option in scope"), + lexbor_str("optgroup parsing option optgroup in scope") + }; + + if (id >= (sizeof(errors) / sizeof(lexbor_str_t))) { + if (len != NULL) { + *len = unknown.length; + } + + return unknown.data; + } + + if (len != NULL) { + *len = errors[id].length; + } + + return errors[id].data; +} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/error.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/error.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/error.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/error.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -90,6 +90,18 @@ LXB_HTML_RULES_ERROR_DOTOAFFRMO, /* doctype-token-foreign-content-mode */ LXB_HTML_RULES_ERROR_DOTOFOCOMO, + /* select-in-scope */ + LXB_HTML_RULES_ERROR_SEINSC, + /* fragment-parsing-select-in-context-parse-input */ + LXB_HTML_RULES_ERROR_FRPASEINCOPAIN, + /* fragment-parsing-select-in-context-parse-select */ + LXB_HTML_RULES_ERROR_FRPASEINCOPASE, + /* hr-parsing-select-option-optgroup-in-scope */ + LXB_HTML_RULES_ERROR_HRPASEOPOPINSC, + /* option-parsing-option-in-scope */ + LXB_HTML_RULES_ERROR_OPPAOPINSC, + /* optgroup-parsing-option-optgroup-in-scope */ + LXB_HTML_RULES_ERROR_OPPAOPOPINSC, LXB_HTML_RULES_ERROR_LAST_ENTRY } @@ -108,10 +120,12 @@ lxb_html_tree_error_add(lexbor_array_obj_t *parse_errors, lxb_html_token_t *token, lxb_html_tree_error_id_t id); +LXB_API const lxb_char_t * +lxb_html_tree_error_to_string(lxb_html_tree_error_id_t id, size_t *len); + #ifdef __cplusplus } /* extern "C" */ #endif #endif /* LEXBOR_HTML_TREE_ERROR_H */ - diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/insertion_mode/foreign_content.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/insertion_mode/foreign_content.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/insertion_mode/foreign_content.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/insertion_mode/foreign_content.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -8,10 +8,10 @@ #include "lexbor/html/tree/open_elements.h" #include "lexbor/html/interfaces/element.h" -#define LEXBOR_TOKENIZER_CHARS_MAP -#define LEXBOR_STR_RES_ANSI_REPLACEMENT_CHARACTER -#include "lexbor/core/str_res.h" - +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_ansi_replacement_character[4]; + LXB_EXTERN const unsigned char lexbor_tokenizer_chars_map[256]; +#endif lxb_status_t lxb_dom_element_qualified_name_set(lxb_dom_element_t *element, @@ -87,7 +87,8 @@ tree->before_append_attr = lxb_html_tree_adjust_attributes_svg; } - element = lxb_html_tree_insert_foreign_element(tree, token, node->ns); + element = lxb_html_tree_insert_foreign_element(tree, token, node->ns, + false); if (element == NULL) { tree->before_append_attr = NULL; tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; @@ -259,22 +260,19 @@ lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO); - if (tree->fragment != NULL) { - return lxb_html_tree_insertion_mode_foreign_content_anything_else(tree, - token); - } + node = lxb_html_tree_current_node(tree); - do { + while (node != NULL && + !(lxb_html_tree_mathml_text_integration_point(node) + || lxb_html_tree_html_integration_point(node) + || node->ns == LXB_NS_HTML)) + { lxb_html_tree_open_elements_pop(tree); node = lxb_html_tree_current_node(tree); } - while (node && - !(lxb_html_tree_mathml_text_integration_point(node) - || lxb_html_tree_html_integration_point(node) - || node->ns == LXB_NS_HTML)); - return false; + return tree->mode(tree, token); } bool @@ -286,6 +284,10 @@ case LXB_TAG_SCRIPT: return lxb_html_tree_insertion_mode_foreign_content_script_closed(tree, token); + case LXB_TAG_P: + case LXB_TAG_BR: + return lxb_html_tree_insertion_mode_foreign_content_all(tree, + token); default: return lxb_html_tree_insertion_mode_foreign_content_anything_else_closed(tree, token); diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_body.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_body.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_body.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_body.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,19 +1,25 @@ /* - * Copyright (C) 2018-2020 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ -#define LEXBOR_TOKENIZER_CHARS_MAP -#include "lexbor/core/str_res.h" - #include "lexbor/html/tree/insertion_mode.h" #include "lexbor/html/tree/open_elements.h" #include "lexbor/html/tree/active_formatting.h" #include "lexbor/html/interfaces/head_element.h" +#include "lexbor/html/interfaces/option_element.h" #include "lexbor/html/tokenizer/state.h" +#include "lexbor/html/parser.h" #include "lexbor/html/tokenizer/state_rcdata.h" +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const unsigned char lexbor_tokenizer_chars_map[256]; +#endif + +static bool +lxb_html_tree_insertion_mode_in_body_anything_else_closed(lxb_html_tree_t *tree, + lxb_html_token_t *token); /* * User case insertion mode. @@ -691,7 +697,7 @@ * "address", "article", "aside", "blockquote", "button", "center", "details", * "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", "footer", * "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", "section", - * "summary", "ul" + * "select", "summary", "ul" */ lxb_inline bool lxb_html_tree_insertion_mode_in_body_abcdfhlmnopsu_closed(lxb_html_tree_t *tree, @@ -1205,12 +1211,62 @@ } lxb_inline bool +lxb_html_tree_insertion_mode_in_body_option_closed(lxb_html_tree_t *tree, + lxb_html_token_t *token) +{ + bool is; + size_t index; + lxb_dom_node_t *node; + lxb_html_option_element_t *option; + lxb_dom_exception_code_t code; + + node = lxb_html_tree_open_elements_find_reverse(tree, LXB_TAG_OPTION, + LXB_NS_HTML, &index); + + lxb_html_tree_insertion_mode_in_body_anything_else_closed(tree, token); + + if (node != NULL) { + is = lxb_html_tree_open_elements_find_by_node(tree, node, &index); + + if (!is) { + option = lxb_html_interface_option(node); + + code = lxb_html_option_maybe_clone_to_selectedcontent(option); + if (code != LXB_DOM_EXCEPTION_OK) { + tree->status = LXB_STATUS_ERROR; + + return lxb_html_tree_process_abort(tree); + } + } + } + + return true; +} + +lxb_inline bool lxb_html_tree_insertion_mode_in_body_input(lxb_html_tree_t *tree, lxb_html_token_t *token) { + bool is; + lxb_dom_node_t *node; lxb_dom_attr_t *attr; lxb_html_element_t *element; + is = lxb_html_tree_is_fragment_element(tree, LXB_TAG_SELECT, LXB_NS_HTML); + if (is) { + lxb_html_tree_parse_error(tree, token, + LXB_HTML_RULES_ERROR_FRPASEINCOPAIN); + return true; + } + + node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML, + LXB_HTML_TAG_CATEGORY_SCOPE); + if (node != NULL) { + lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_SEINSC); + lxb_html_tree_open_elements_pop_until_node(tree, node, true); + } + + tree->status = lxb_html_tree_active_formatting_reconstruct_elements(tree); if (tree->status != LXB_STATUS_OK) { return lxb_html_tree_process_abort(tree); @@ -1277,6 +1333,19 @@ lxb_html_tree_close_p_element(tree, token); } + node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML, + LXB_HTML_TAG_CATEGORY_SCOPE); + if (node != NULL) { + lxb_html_tree_generate_implied_end_tags(tree, LXB_TAG__UNDEF, + LXB_NS__UNDEF); + + node = lxb_html_tree_element_in_scope_option_optgroup(tree); + if (node != NULL) { + lxb_html_tree_parse_error(tree, token, + LXB_HTML_RULES_ERROR_HRPASEOPOPINSC); + } + } + element = lxb_html_tree_insert_html_element(tree, token); if (element == NULL) { tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; @@ -1396,8 +1465,25 @@ lxb_html_tree_insertion_mode_in_body_select(lxb_html_tree_t *tree, lxb_html_token_t *token) { + bool is; + lxb_dom_node_t *node; lxb_html_element_t *element; + is = lxb_html_tree_is_fragment_element(tree, LXB_TAG_SELECT, LXB_NS_HTML); + if (is) { + lxb_html_tree_parse_error(tree, token, + LXB_HTML_RULES_ERROR_FRPASEINCOPASE); + return true; + } + + node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML, + LXB_HTML_TAG_CATEGORY_SCOPE); + if (node != NULL) { + lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_SEINSC); + lxb_html_tree_open_elements_pop_until_node(tree, node, true); + return true; + } + tree->status = lxb_html_tree_active_formatting_reconstruct_elements(tree); if (tree->status != LXB_STATUS_OK) { return lxb_html_tree_process_abort(tree); @@ -1412,34 +1498,81 @@ tree->frameset_ok = false; - if (tree->mode == lxb_html_tree_insertion_mode_in_table - || tree->mode == lxb_html_tree_insertion_mode_in_caption - || tree->mode == lxb_html_tree_insertion_mode_in_table_body - || tree->mode == lxb_html_tree_insertion_mode_in_row - || tree->mode == lxb_html_tree_insertion_mode_in_cell) - { - tree->mode = lxb_html_tree_insertion_mode_in_select_in_table; + return true; +} + +/* + * "option" + */ +lxb_inline bool +lxb_html_tree_insertion_mode_in_body_option(lxb_html_tree_t *tree, + lxb_html_token_t *token) +{ + lxb_dom_node_t *node; + lxb_html_element_t *element; + + node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML, + LXB_HTML_TAG_CATEGORY_SCOPE); + if (node != NULL) { + lxb_html_tree_generate_implied_end_tags(tree, LXB_TAG_OPTGROUP, + LXB_NS_HTML); + + node = lxb_html_tree_element_in_scope(tree, LXB_TAG_OPTION, LXB_NS_HTML, + LXB_HTML_TAG_CATEGORY_SCOPE); + if (node != NULL) { + lxb_html_tree_parse_error(tree, token, + LXB_HTML_RULES_ERROR_OPPAOPINSC); + } } else { - tree->mode = lxb_html_tree_insertion_mode_in_select; + node = lxb_html_tree_current_node(tree); + if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)) { + lxb_html_tree_open_elements_pop(tree); + } + } + + tree->status = lxb_html_tree_active_formatting_reconstruct_elements(tree); + if (tree->status != LXB_STATUS_OK) { + return lxb_html_tree_process_abort(tree); + } + + element = lxb_html_tree_insert_html_element(tree, token); + if (element == NULL) { + tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; + + return lxb_html_tree_process_abort(tree); } return true; } /* - * "optgroup", "option" + * "optgroup" */ lxb_inline bool -lxb_html_tree_insertion_mode_in_body_optopt(lxb_html_tree_t *tree, - lxb_html_token_t *token) +lxb_html_tree_insertion_mode_in_body_optgroup(lxb_html_tree_t *tree, + lxb_html_token_t *token) { lxb_dom_node_t *node; lxb_html_element_t *element; - node = lxb_html_tree_current_node(tree); - if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)) { - lxb_html_tree_open_elements_pop(tree); + node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML, + LXB_HTML_TAG_CATEGORY_SCOPE); + if (node != NULL) { + lxb_html_tree_generate_implied_end_tags(tree, LXB_TAG__UNDEF, + LXB_NS__UNDEF); + + node = lxb_html_tree_element_in_scope_option_optgroup(tree); + if (node != NULL) { + lxb_html_tree_parse_error(tree, token, + LXB_HTML_RULES_ERROR_OPPAOPOPINSC); + } + } + else { + node = lxb_html_tree_current_node(tree); + if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)) { + lxb_html_tree_open_elements_pop(tree); + } } tree->status = lxb_html_tree_active_formatting_reconstruct_elements(tree); @@ -1539,7 +1672,8 @@ tree->before_append_attr = lxb_html_tree_adjust_attributes_mathml; - element = lxb_html_tree_insert_foreign_element(tree, token, LXB_NS_MATH); + element = lxb_html_tree_insert_foreign_element(tree, token, LXB_NS_MATH, + false); if (element == NULL) { tree->before_append_attr = NULL; tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; @@ -1570,7 +1704,8 @@ tree->before_append_attr = lxb_html_tree_adjust_attributes_svg; - element = lxb_html_tree_insert_foreign_element(tree, token, LXB_NS_SVG); + element = lxb_html_tree_insert_foreign_element(tree, token, LXB_NS_SVG, + false); if (element == NULL) { tree->before_append_attr = NULL; tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; @@ -1643,7 +1778,7 @@ return true; } -lxb_inline bool +static bool lxb_html_tree_insertion_mode_in_body_anything_else_closed(lxb_html_tree_t *tree, lxb_html_token_t *token) { @@ -1719,7 +1854,9 @@ case LXB_TAG_NAV: case LXB_TAG_OL: case LXB_TAG_PRE: + case LXB_TAG_SEARCH: case LXB_TAG_SECTION: + case LXB_TAG_SELECT: case LXB_TAG_SUMMARY: case LXB_TAG_UL: return lxb_html_tree_insertion_mode_in_body_abcdfhlmnopsu_closed(tree, @@ -1770,6 +1907,10 @@ return lxb_html_tree_insertion_mode_in_body_br_closed(tree, token); + case LXB_TAG_OPTION: + return lxb_html_tree_insertion_mode_in_body_option_closed(tree, + token); + default: return lxb_html_tree_insertion_mode_in_body_anything_else_closed(tree, token); @@ -1831,6 +1972,7 @@ case LXB_TAG_NAV: case LXB_TAG_OL: case LXB_TAG_P: + case LXB_TAG_SEARCH: case LXB_TAG_SECTION: case LXB_TAG_SUMMARY: case LXB_TAG_UL: @@ -1934,9 +2076,11 @@ case LXB_TAG_SELECT: return lxb_html_tree_insertion_mode_in_body_select(tree, token); - case LXB_TAG_OPTGROUP: case LXB_TAG_OPTION: - return lxb_html_tree_insertion_mode_in_body_optopt(tree, token); + return lxb_html_tree_insertion_mode_in_body_option(tree, token); + + case LXB_TAG_OPTGROUP: + return lxb_html_tree_insertion_mode_in_body_optgroup(tree, token); case LXB_TAG_RB: case LXB_TAG_RTC: diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_head_noscript.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_head_noscript.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_head_noscript.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_head_noscript.c 2026-05-05 16:34:12.000000000 +0000 @@ -101,6 +101,13 @@ token); } + if (token->tag_id == LXB_TAG_NOSCRIPT) { + lxb_html_tree_open_elements_pop(tree); + tree->mode = lxb_html_tree_insertion_mode_in_head; + + return true; + } + lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO); return true; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_select.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_select.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_select.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_select.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,375 +0,0 @@ -/* - * Copyright (C) 2018-2020 Alexander Borisov - * - * Author: Alexander Borisov - */ - -#include "lexbor/html/tree/insertion_mode.h" -#include "lexbor/html/tree/open_elements.h" - - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_text(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lexbor_str_t str; - - if (token->null_count != 0) { - lxb_html_tree_parse_error(tree, token, - LXB_HTML_RULES_ERROR_NUCH); - - tree->status = lxb_html_token_make_text_drop_null(token, &str, - tree->document->dom_document.text); - } - else { - tree->status = lxb_html_token_make_text(token, &str, - tree->document->dom_document.text); - } - - if (tree->status != LXB_STATUS_OK) { - return lxb_html_tree_process_abort(tree); - } - - /* Can be zero only if all NULL are gone */ - if (str.length == 0) { - lexbor_str_destroy(&str, tree->document->dom_document.text, false); - - return true; - } - - tree->status = lxb_html_tree_insert_character_for_data(tree, &str, NULL); - if (tree->status != LXB_STATUS_OK) { - return lxb_html_tree_process_abort(tree); - } - - return true; -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_comment(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_dom_comment_t *comment; - - comment = lxb_html_tree_insert_comment(tree, token, NULL); - if (comment == NULL) { - tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; - - return lxb_html_tree_process_abort(tree); - } - - return true; -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_doctype(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_DOTOINSEMO); - - return true; -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_html(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - return lxb_html_tree_insertion_mode_in_body(tree, token); -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_option(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_html_element_t *element; - lxb_dom_node_t *node = lxb_html_tree_current_node(tree); - - if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)) { - lxb_html_tree_open_elements_pop(tree); - } - - element = lxb_html_tree_insert_html_element(tree, token); - if (element == NULL) { - tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; - - return lxb_html_tree_process_abort(tree); - } - - return true; -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_optgroup(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_html_element_t *element; - lxb_dom_node_t *node = lxb_html_tree_current_node(tree); - - if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)) { - lxb_html_tree_open_elements_pop(tree); - } - - node = lxb_html_tree_current_node(tree); - - if (lxb_html_tree_node_is(node, LXB_TAG_OPTGROUP)) { - lxb_html_tree_open_elements_pop(tree); - } - - element = lxb_html_tree_insert_html_element(tree, token); - if (element == NULL) { - tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; - - return lxb_html_tree_process_abort(tree); - } - - return true; -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_hr(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_html_element_t *element; - lxb_dom_node_t *node = lxb_html_tree_current_node(tree); - - if (lxb_html_tree_node_is(node, LXB_TAG_OPTION)) { - lxb_html_tree_open_elements_pop(tree); - } - - node = lxb_html_tree_current_node(tree); - - if (lxb_html_tree_node_is(node, LXB_TAG_OPTGROUP)) { - lxb_html_tree_open_elements_pop(tree); - } - - element = lxb_html_tree_insert_html_element(tree, token); - if (element == NULL) { - tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; - - return lxb_html_tree_process_abort(tree); - } - - lxb_html_tree_open_elements_pop(tree); - - lxb_html_tree_acknowledge_token_self_closing(tree, token); - - return true; -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_optgroup_closed(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_dom_node_t *node = lxb_html_tree_current_node(tree); - - if (lxb_html_tree_node_is(node, LXB_TAG_OPTION) - && tree->open_elements->length > 1) - { - node = lxb_html_tree_open_elements_get(tree, - tree->open_elements->length - 2); - if (node != NULL && lxb_html_tree_node_is(node, LXB_TAG_OPTGROUP)) { - lxb_html_tree_open_elements_pop(tree); - } - } - - node = lxb_html_tree_current_node(tree); - - if (lxb_html_tree_node_is(node, LXB_TAG_OPTGROUP) == false) { - lxb_html_tree_parse_error(tree, token, - LXB_HTML_RULES_ERROR_UNELINOPELST); - return true; - } - - lxb_html_tree_open_elements_pop(tree); - - return true; -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_option_closed(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_dom_node_t *node = lxb_html_tree_current_node(tree); - - if (lxb_html_tree_node_is(node, LXB_TAG_OPTION) == false) { - lxb_html_tree_parse_error(tree, token, - LXB_HTML_RULES_ERROR_UNELINOPELST); - return true; - } - - lxb_html_tree_open_elements_pop(tree); - - return true; -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_select_closed(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_dom_node_t *node; - - node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT); - if (node == NULL) { - lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNCLTO); - - return true; - } - - lxb_html_tree_open_elements_pop_until_tag_id(tree, LXB_TAG_SELECT, - LXB_NS_HTML, true); - - lxb_html_tree_reset_insertion_mode_appropriately(tree); - - return true; -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_select(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_dom_node_t *node; - - lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO); - - node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT); - if (node == NULL) { - return true; - } - - lxb_html_tree_open_elements_pop_until_tag_id(tree, LXB_TAG_SELECT, - LXB_NS_HTML, true); - - lxb_html_tree_reset_insertion_mode_appropriately(tree); - - return true; -} - -/* - * "input", "keygen", "textarea" - */ -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_ikt(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_dom_node_t *node; - - lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO); - - node = lxb_html_tree_element_in_scope(tree, LXB_TAG_SELECT, LXB_NS_HTML, - LXB_HTML_TAG_CATEGORY_SCOPE_SELECT); - if (node == NULL) { - return true; - } - - lxb_html_tree_open_elements_pop_until_tag_id(tree, LXB_TAG_SELECT, - LXB_NS_HTML, true); - - lxb_html_tree_reset_insertion_mode_appropriately(tree); - - return false; -} - -/* - * A start tag whose tag name is one of: "script", "template" - * An end tag whose tag name is "template" - */ -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_st_open_closed(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - return lxb_html_tree_insertion_mode_in_head(tree, token); -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_end_of_file(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - return lxb_html_tree_insertion_mode_in_body(tree, token); -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_anything_else(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO); - - return true; -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_anything_else_closed(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNCLTO); - - return true; -} - -bool -lxb_html_tree_insertion_mode_in_select(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - if (token->type & LXB_HTML_TOKEN_TYPE_CLOSE) { - switch (token->tag_id) { - case LXB_TAG_OPTGROUP: - return lxb_html_tree_insertion_mode_in_select_optgroup_closed(tree, - token); - case LXB_TAG_OPTION: - return lxb_html_tree_insertion_mode_in_select_option_closed(tree, - token); - case LXB_TAG_SELECT: - return lxb_html_tree_insertion_mode_in_select_select_closed(tree, - token); - case LXB_TAG_TEMPLATE: - return lxb_html_tree_insertion_mode_in_select_st_open_closed(tree, - token); - default: - return lxb_html_tree_insertion_mode_in_select_anything_else_closed(tree, - token); - } - } - - switch (token->tag_id) { - case LXB_TAG__TEXT: - return lxb_html_tree_insertion_mode_in_select_text(tree, token); - - case LXB_TAG__EM_COMMENT: - return lxb_html_tree_insertion_mode_in_select_comment(tree, token); - - case LXB_TAG__EM_DOCTYPE: - return lxb_html_tree_insertion_mode_in_select_doctype(tree, token); - - case LXB_TAG_HTML: - return lxb_html_tree_insertion_mode_in_select_html(tree, token); - - case LXB_TAG_OPTION: - return lxb_html_tree_insertion_mode_in_select_option(tree, token); - - case LXB_TAG_OPTGROUP: - return lxb_html_tree_insertion_mode_in_select_optgroup(tree, token); - - case LXB_TAG_HR: - return lxb_html_tree_insertion_mode_in_select_hr(tree, token); - - case LXB_TAG_SELECT: - return lxb_html_tree_insertion_mode_in_select_select(tree, token); - - case LXB_TAG_INPUT: - case LXB_TAG_KEYGEN: - case LXB_TAG_TEXTAREA: - return lxb_html_tree_insertion_mode_in_select_ikt(tree, token); - - case LXB_TAG_SCRIPT: - case LXB_TAG_TEMPLATE: - return lxb_html_tree_insertion_mode_in_select_st_open_closed(tree, - token); - case LXB_TAG__END_OF_FILE: - return lxb_html_tree_insertion_mode_in_select_end_of_file(tree, - token); - default: - return lxb_html_tree_insertion_mode_in_select_anything_else(tree, - token); - } -} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_select_in_table.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_select_in_table.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_select_in_table.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/insertion_mode/in_select_in_table.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2018-2019 Alexander Borisov - * - * Author: Alexander Borisov - */ - -#include "lexbor/html/tree/insertion_mode.h" -#include "lexbor/html/tree/open_elements.h" - - -/* - * "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th" - */ -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_in_table_ct(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO); - - lxb_html_tree_open_elements_pop_until_tag_id(tree, LXB_TAG_SELECT, - LXB_NS_HTML, true); - - lxb_html_tree_reset_insertion_mode_appropriately(tree); - - return false; -} - -/* - * "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th" - */ -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_in_table_ct_closed(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - lxb_dom_node_t *node; - - lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNCLTO); - - node = lxb_html_tree_element_in_scope(tree, token->tag_id, LXB_NS_HTML, - LXB_HTML_TAG_CATEGORY_SCOPE_TABLE); - if (node == NULL) { - return true; - } - - lxb_html_tree_open_elements_pop_until_tag_id(tree, LXB_TAG_SELECT, - LXB_NS_HTML, true); - - lxb_html_tree_reset_insertion_mode_appropriately(tree); - - return false; -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_in_table_anything_else(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - return lxb_html_tree_insertion_mode_in_select(tree, token); -} - -lxb_inline bool -lxb_html_tree_insertion_mode_in_select_in_table_anything_else_closed(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - return lxb_html_tree_insertion_mode_in_select_in_table_anything_else(tree, - token); -} - -bool -lxb_html_tree_insertion_mode_in_select_in_table(lxb_html_tree_t *tree, - lxb_html_token_t *token) -{ - if (token->tag_id >= LXB_TAG__LAST_ENTRY) { - if (token->type & LXB_HTML_TOKEN_TYPE_CLOSE) { - return lxb_html_tree_insertion_mode_in_select_in_table_anything_else_closed(tree, - token); - } - - return lxb_html_tree_insertion_mode_in_select_in_table_anything_else(tree, - token); - } - - if (token->type & LXB_HTML_TOKEN_TYPE_CLOSE) { - switch (token->tag_id) { - case LXB_TAG_CAPTION: - case LXB_TAG_TABLE: - case LXB_TAG_TBODY: - case LXB_TAG_TFOOT: - case LXB_TAG_THEAD: - case LXB_TAG_TR: - case LXB_TAG_TH: - case LXB_TAG_TD: - return lxb_html_tree_insertion_mode_in_select_in_table_ct_closed(tree, - token); - default: - return lxb_html_tree_insertion_mode_in_select_in_table_anything_else_closed(tree, - token); - } - } - - switch (token->tag_id) { - case LXB_TAG_CAPTION: - case LXB_TAG_TABLE: - case LXB_TAG_TBODY: - case LXB_TAG_TFOOT: - case LXB_TAG_THEAD: - case LXB_TAG_TR: - case LXB_TAG_TH: - case LXB_TAG_TD: - return lxb_html_tree_insertion_mode_in_select_in_table_ct(tree, - token); - default: - return lxb_html_tree_insertion_mode_in_select_in_table_anything_else(tree, - token); - } -} diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/insertion_mode.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/insertion_mode.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree/insertion_mode.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree/insertion_mode.h 2026-05-05 16:34:12.000000000 +0000 @@ -92,14 +92,6 @@ lxb_html_token_t *token); LXB_API bool -lxb_html_tree_insertion_mode_in_select(lxb_html_tree_t *tree, - lxb_html_token_t *token); - -LXB_API bool -lxb_html_tree_insertion_mode_in_select_in_table(lxb_html_tree_t *tree, - lxb_html_token_t *token); - -LXB_API bool lxb_html_tree_insertion_mode_in_template(lxb_html_tree_t *tree, lxb_html_token_t *token); diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree.c php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree.c 2026-05-05 16:34:12.000000000 +0000 @@ -19,6 +19,7 @@ #include "lexbor/html/interface.h" #include "lexbor/html/interfaces/template_element.h" #include "lexbor/html/interfaces/unknown_element.h" +#include "lexbor/html/interfaces/option_element.h" #include "lexbor/html/tokenizer/state_rawtext.h" #include "lexbor/html/tokenizer/state_rcdata.h" @@ -390,7 +391,8 @@ lxb_html_element_t * lxb_html_tree_insert_foreign_element(lxb_html_tree_t *tree, - lxb_html_token_t *token, lxb_ns_id_t ns) + lxb_html_token_t *token, lxb_ns_id_t ns, + bool only_add_stack) { lxb_status_t status; lxb_dom_node_t *pos; @@ -407,7 +409,9 @@ return NULL; } - lxb_html_tree_insert_node(pos, lxb_dom_interface_node(element), ipos); + if (only_add_stack == false) { + lxb_html_tree_insert_node(pos, lxb_dom_interface_node(element), ipos); + } status = lxb_html_tree_open_elements_push(tree, lxb_dom_interface_node(element)); @@ -1033,44 +1037,7 @@ continue; } - /* Step 4 */ - if (node->local_name == LXB_TAG_SELECT) { - /* Step 4.1 */ - if (last) { - tree->mode = lxb_html_tree_insertion_mode_in_select; - return; - } - - /* Step 4.2 */ - size_t ancestor = idx; - - for (;;) { - /* Step 4.3 */ - if (ancestor == 0) { - tree->mode = lxb_html_tree_insertion_mode_in_select; - return; - } - - /* Step 4.4 */ - ancestor--; - - /* Step 4.5 */ - lxb_dom_node_t *ancestor_node = list[ancestor]; - - if(lxb_html_tree_node_is(ancestor_node, LXB_TAG_TEMPLATE)) { - tree->mode = lxb_html_tree_insertion_mode_in_select; - return; - } - - /* Step 4.6 */ - else if(lxb_html_tree_node_is(ancestor_node, LXB_TAG_TABLE)) { - tree->mode = lxb_html_tree_insertion_mode_in_select_in_table; - return; - } - } - } - - /* Step 5-15 */ + /* Step 4-15 */ switch (node->local_name) { case LXB_TAG_TD: case LXB_TAG_TH: @@ -1309,6 +1276,41 @@ return NULL; } +lxb_dom_node_t * +lxb_html_tree_element_in_scope_option_optgroup(lxb_html_tree_t *tree) +{ + lxb_dom_node_t *node; + + size_t idx = tree->open_elements->length; + void **list = tree->open_elements->list; + + while (idx != 0) { + idx--; + node = list[idx]; + + switch (node->local_name) { + case LXB_TAG_OPTION: + case LXB_TAG_OPTGROUP: + if (node->ns == LXB_NS_HTML) { + return node; + } + + break; + + default: + break; + } + + if (lxb_html_tag_is_category(node->local_name, LXB_NS_HTML, + LXB_HTML_TAG_CATEGORY_SCOPE)) + { + return NULL; + } + } + + return NULL; +} + bool lxb_html_tree_check_scope_element(lxb_html_tree_t *tree) { @@ -1362,8 +1364,6 @@ true); } -#include "lexbor/html/serialize.h" - bool lxb_html_tree_adoption_agency_algorithm(lxb_html_tree_t *tree, lxb_html_token_t *token, diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree.h php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/html/tree.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/html/tree.h 2026-05-05 16:34:12.000000000 +0000 @@ -114,7 +114,8 @@ LXB_API lxb_html_element_t * lxb_html_tree_insert_foreign_element(lxb_html_tree_t *tree, - lxb_html_token_t *token, lxb_ns_id_t ns); + lxb_html_token_t *token, lxb_ns_id_t ns, + bool only_add_stack); LXB_API lxb_html_element_t * lxb_html_tree_create_element_for_token(lxb_html_tree_t *tree, @@ -201,6 +202,9 @@ LXB_API lxb_dom_node_t * lxb_html_tree_element_in_scope_td_th(lxb_html_tree_t *tree); +LXB_API lxb_dom_node_t * +lxb_html_tree_element_in_scope_option_optgroup(lxb_html_tree_t *tree); + LXB_API bool lxb_html_tree_check_scope_element(lxb_html_tree_t *tree); @@ -307,7 +311,8 @@ lxb_html_tree_insert_html_element(lxb_html_tree_t *tree, lxb_html_token_t *token) { - return lxb_html_tree_insert_foreign_element(tree, token, LXB_NS_HTML); + return lxb_html_tree_insert_foreign_element(tree, token, LXB_NS_HTML, + false); } lxb_inline void @@ -374,6 +379,21 @@ tree->document = doc; } +lxb_inline bool +lxb_html_tree_is_fragment(lxb_html_tree_t *tree) +{ + return tree->fragment != NULL; +} + +lxb_inline bool +lxb_html_tree_is_fragment_element(lxb_html_tree_t *tree, + lxb_tag_id_t tag_id, lxb_ns_id_t ns) +{ + lxb_dom_node_t *fragment = tree->fragment; + + return lxb_html_tree_is_fragment(tree) + && fragment->local_name == tag_id && fragment->ns == ns; +} #ifdef __cplusplus } /* extern "C" */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/ns/base.h php8.4-8.4.21/ext/dom/lexbor/lexbor/ns/base.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/ns/base.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/ns/base.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Alexander Borisov + * Copyright (C) 2019-2025 Alexander Borisov * * Author: Alexander Borisov */ @@ -16,7 +16,7 @@ #define LXB_NS_VERSION_MAJOR 1 -#define LXB_NS_VERSION_MINOR 2 +#define LXB_NS_VERSION_MINOR 4 #define LXB_NS_VERSION_PATCH 0 #define LXB_NS_VERSION_STRING \ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/ns/const.h php8.4-8.4.21/ext/dom/lexbor/lexbor/ns/const.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/ns/const.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/ns/const.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/ns/ns.c php8.4-8.4.21/ext/dom/lexbor/lexbor/ns/ns.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/ns/ns.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/ns/ns.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,13 +1,14 @@ /* - * Copyright (C) 2018-2019 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ #include "lexbor/core/shs.h" -#define LEXBOR_STR_RES_MAP_LOWERCASE -#include "lexbor/core/str_res.h" +#ifndef LEXBOR_DISABLE_INTERNAL_EXTERN + LXB_EXTERN const lxb_char_t lexbor_str_res_map_lowercase[256]; +#endif #include "lexbor/ns/ns.h" #include "lexbor/ns/res.h" diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/ns/res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/ns/res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/ns/res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/ns/res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2019 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -50,7 +50,7 @@ {{.u.short_str = "xmlns", .length = 5, .next = NULL}, LXB_NS_XMLNS, 1, true} }; -static const lexbor_shs_entry_t lxb_ns_res_shs_data[] = +static const lexbor_shs_entry_t lxb_ns_res_shs_data[29] = { {NULL, NULL, 28, 0}, {"html", (void *) &lxb_ns_prefix_res_data[2], 4, 0}, {"xmlns", (void *) &lxb_ns_prefix_res_data[7], 5, 0}, {NULL, NULL, 0, 0}, @@ -69,7 +69,7 @@ {"xml", (void *) &lxb_ns_prefix_res_data[6], 3, 0} }; -static const lexbor_shs_entry_t lxb_ns_res_shs_link_data[] = +static const lexbor_shs_entry_t lxb_ns_res_shs_link_data[23] = { {NULL, NULL, 22, 0}, {"http://www.w3.org/1999/xhtml", (void *) &lxb_ns_res_data[2], 28, 0}, diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/selectors/base.h php8.4-8.4.21/ext/dom/lexbor/lexbor/selectors/base.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/selectors/base.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/selectors/base.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2023 Alexander Borisov + * Copyright (C) 2021-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -15,7 +15,7 @@ #define LXB_SELECTORS_VERSION_MAJOR 0 -#define LXB_SELECTORS_VERSION_MINOR 3 +#define LXB_SELECTORS_VERSION_MINOR 6 #define LXB_SELECTORS_VERSION_PATCH 0 #define LXB_SELECTORS_VERSION_STRING LEXBOR_STRINGIZE(LXB_SELECTORS_VERSION_MAJOR) "." \ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/selectors/selectors.c php8.4-8.4.21/ext/dom/lexbor/lexbor/selectors/selectors.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/selectors/selectors.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/selectors/selectors.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2024 Alexander Borisov + * Copyright (C) 2021-2025 Alexander Borisov * * Author: Alexander Borisov */ @@ -10,48 +10,74 @@ static lxb_status_t -lxb_selectors_state_tree(lxb_selectors_t *selectors, lxb_dom_node_t *root, - const lxb_css_selector_list_t *list); +lxb_selectors_tree(lxb_selectors_t *selectors, lxb_dom_node_t *root); static lxb_status_t -lxb_selectors_state_run(lxb_selectors_t *selectors, lxb_dom_node_t *node, - const lxb_css_selector_list_t *list); +lxb_selectors_run(lxb_selectors_t *selectors, lxb_dom_node_t *node); static lxb_selectors_entry_t * lxb_selectors_state_find(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry); static lxb_selectors_entry_t * -lxb_selectors_state_find_check(lxb_selectors_t *selectors, lxb_dom_node_t *node, - const lxb_css_selector_t *selector, - lxb_selectors_entry_t *entry); +lxb_selectors_state_found_check(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry); + +static lxb_selectors_entry_t * +lxb_selectors_state_found_check_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry); + +static lxb_selectors_entry_t * +lxb_selectors_state_found(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry); + +static lxb_selectors_entry_t * +lxb_selectors_state_found_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry); + +static lxb_selectors_entry_t * +lxb_selectors_state_not_found(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry); static lxb_selectors_entry_t * -lxb_selectors_state_pseudo_class_function(lxb_selectors_t *selectors, - lxb_selectors_entry_t *entry); +lxb_selectors_state_not_found_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry); -static lxb_dom_node_t * -lxb_selectors_next_node(lxb_selectors_nested_t *main); +static lxb_selectors_entry_t * +lxb_selectors_next_list(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry); -static lxb_dom_node_t * -lxb_selectors_state_has_relative(lxb_dom_node_t *node, - const lxb_css_selector_t *selector); +static lxb_selectors_entry_t * +lxb_selectors_next_list_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry); static lxb_selectors_entry_t * -lxb_selectors_state_after_find_has(lxb_selectors_t *selectors, - lxb_selectors_entry_t *entry); +lxb_selectors_make_following(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry); + +static lxb_selectors_entry_t * +lxb_selectors_make_following_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry); static lxb_selectors_entry_t * lxb_selectors_state_after_find(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry); static lxb_selectors_entry_t * +lxb_selectors_state_after_not(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry); + +static lxb_selectors_entry_t * lxb_selectors_state_after_nth_child(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry); +static lxb_selectors_entry_t * +lxb_selectors_state_nth_child_found(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry); + static bool lxb_selectors_match(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry, - const lxb_css_selector_t *selector, lxb_dom_node_t *node); + lxb_dom_node_t *node); static bool lxb_selectors_match_element(const lxb_css_selector_t *selector, @@ -73,7 +99,8 @@ const lxb_dom_node_t *node); static bool -lxb_selectors_pseudo_class_function(const lxb_css_selector_t *selector, +lxb_selectors_pseudo_class_function(lxb_selectors_t *selectors, + const lxb_css_selector_t *selector, lxb_dom_node_t *node); static bool @@ -109,6 +136,10 @@ lxb_selectors_cb_not(lxb_dom_node_t *node, lxb_css_selector_specificity_t spec, void *ctx); +static lxb_status_t +lxb_selectors_cb_nth_ok(lxb_dom_node_t *node, + lxb_css_selector_specificity_t spec, void *ctx); + lxb_selectors_t * lxb_selectors_create(void) @@ -168,17 +199,118 @@ return selectors; } +static lxb_selectors_entry_t * +lxb_selectors_state_entry_create(lxb_selectors_t *selectors, + const lxb_css_selector_t *selector, + lxb_selectors_entry_t *root, + lxb_dom_node_t *node) +{ + lxb_selectors_entry_t *entry; + lxb_css_selector_combinator_t combinator; + + combinator = selector->combinator; + + do { + selector = selector->prev; + + entry = lexbor_dobject_calloc(selectors->objs); + if (entry == NULL) { + selectors->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; + return NULL; + } + + entry->combinator = selector->combinator; + entry->selector = selector; + entry->node = node; + + if (root->prev != NULL) { + root->prev->next = entry; + entry->prev = root->prev; + } + + entry->next = root; + root->prev = entry; + } + while (selector->combinator == LXB_CSS_SELECTOR_COMBINATOR_CLOSE + && selector->prev != NULL); + + entry->combinator = combinator; + + return entry; +} + +static lxb_selectors_entry_t * +lxb_selectors_state_entry_create_forward(lxb_selectors_t *selectors, + const lxb_css_selector_t *selector, + lxb_selectors_entry_t *root, + lxb_dom_node_t *node) +{ + lxb_selectors_entry_t *entry; + + selector = selector->next; + + entry = lexbor_dobject_calloc(selectors->objs); + if (entry == NULL) { + selectors->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; + return NULL; + } + + entry->combinator = selector->combinator; + entry->selector = selector; + entry->node = node; + + entry->prev = root; + root->next = entry; + + return entry; +} + +static lxb_selectors_entry_t * +lxb_selectors_entry_make_first(lxb_selectors_t *selectors, + lxb_css_selector_t *selector) +{ + lxb_selectors_entry_t *entry, *prev; + + prev = NULL; + + do { + entry = lexbor_dobject_calloc(selectors->objs); + if (entry == NULL) { + return NULL; + } + + entry->selector = selector; + entry->combinator = LXB_CSS_SELECTOR_COMBINATOR_CLOSE; + + if (prev != NULL) { + prev->next = entry; + entry->prev = prev; + } + + if (selector->combinator != LXB_CSS_SELECTOR_COMBINATOR_CLOSE + || selector->prev == NULL) + { + break; + } + + prev = entry; + selector = selector->prev; + } + while (true); + + return entry; +} + lxb_inline lxb_dom_node_t * lxb_selectors_descendant(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry, - const lxb_css_selector_t *selector, lxb_dom_node_t *node) { node = node->parent; while (node != NULL) { if (node->type == LXB_DOM_NODE_TYPE_ELEMENT - && lxb_selectors_match(selectors, entry, selector, node)) + && lxb_selectors_match(selectors, entry, node)) { return node; } @@ -190,10 +322,68 @@ } lxb_inline lxb_dom_node_t * +lxb_selectors_descendant_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry, + lxb_dom_node_t *node) +{ + lxb_dom_node_t *root; + lxb_selectors_nested_t *current = selectors->current; + + if (entry->prev != NULL) { + root = entry->prev->node; + } + else { + root = current->root; + } + + do { + if (node->first_child != NULL) { + node = node->first_child; + } + else { + + next: + + while (node != root && node->next == NULL) { + node = node->parent; + } + + if (node == root) { + break; + } + + node = node->next; + } + + if (node->type != LXB_DOM_NODE_TYPE_ELEMENT) { + goto next; + } + + if (lxb_selectors_match(selectors, entry, node)) { + return node; + } + } + while (node != NULL); + + return NULL; +} + +lxb_inline lxb_dom_node_t * lxb_selectors_close(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry, - const lxb_css_selector_t *selector, lxb_dom_node_t *node) + lxb_dom_node_t *node) +{ + if (lxb_selectors_match(selectors, entry, node)) { + return node; + } + + return NULL; +} + +lxb_inline lxb_dom_node_t * +lxb_selectors_close_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry, lxb_dom_node_t *node) { - if (lxb_selectors_match(selectors, entry, selector, node)) { + if (lxb_selectors_match(selectors, entry, node)) { return node; } @@ -202,12 +392,12 @@ lxb_inline lxb_dom_node_t * lxb_selectors_child(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry, - const lxb_css_selector_t *selector, lxb_dom_node_t *root) + lxb_dom_node_t *root) { root = root->parent; if (root != NULL && root->type == LXB_DOM_NODE_TYPE_ELEMENT - && lxb_selectors_match(selectors, entry, selector, root)) + && lxb_selectors_match(selectors, entry, root)) { return root; } @@ -216,14 +406,46 @@ } lxb_inline lxb_dom_node_t * +lxb_selectors_child_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry, lxb_dom_node_t *root) +{ + if (entry->prev != NULL) { + if (entry->prev->node == root) { + root = root->first_child; + } + else { + root = root->next; + } + } + else if (selectors->current->root == root) { + root = root->first_child; + } + else { + root = root->next; + } + + while (root != NULL) { + if (root->type == LXB_DOM_NODE_TYPE_ELEMENT + && lxb_selectors_match(selectors, entry, root)) + { + return root; + } + + root = root->next; + } + + return NULL; +} + +lxb_inline lxb_dom_node_t * lxb_selectors_sibling(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry, - const lxb_css_selector_t *selector, lxb_dom_node_t *node) + lxb_dom_node_t *node) { node = node->prev; while (node != NULL) { if (node->type == LXB_DOM_NODE_TYPE_ELEMENT) { - if (lxb_selectors_match(selectors, entry, selector, node)) { + if (lxb_selectors_match(selectors, entry, node)) { return node; } @@ -237,14 +459,35 @@ } lxb_inline lxb_dom_node_t * +lxb_selectors_sibling_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry, lxb_dom_node_t *node) +{ + node = node->next; + + while (node != NULL) { + if (node->type == LXB_DOM_NODE_TYPE_ELEMENT) { + if (lxb_selectors_match(selectors, entry, node)) { + return node; + } + + return NULL; + } + + node = node->next; + } + + return NULL; +} + +lxb_inline lxb_dom_node_t * lxb_selectors_following(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry, - const lxb_css_selector_t *selector, lxb_dom_node_t *node) + lxb_dom_node_t *node) { node = node->prev; while (node != NULL) { if (node->type == LXB_DOM_NODE_TYPE_ELEMENT && - lxb_selectors_match(selectors, entry, selector, node)) + lxb_selectors_match(selectors, entry, node)) { return node; } @@ -255,6 +498,57 @@ return NULL; } +lxb_inline lxb_dom_node_t * +lxb_selectors_following_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry, + lxb_dom_node_t *node) +{ + node = node->next; + + while (node != NULL) { + if (node->type == LXB_DOM_NODE_TYPE_ELEMENT && + lxb_selectors_match(selectors, entry, node)) + { + return node; + } + + node = node->next; + } + + return NULL; +} + +lxb_inline void +lxb_selectors_switch_to_found_check(lxb_selectors_t *selectors, + lxb_selectors_nested_t *current) +{ + if (current->forward) { + selectors->state = lxb_selectors_state_found_check_forward; + } + else { + selectors->state = lxb_selectors_state_found_check; + } +} + +lxb_inline void +lxb_selectors_switch_to_not_found(lxb_selectors_t *selectors, + lxb_selectors_nested_t *current) +{ + if (current->forward) { + selectors->state = lxb_selectors_state_not_found_forward; + } + else { + selectors->state = lxb_selectors_state_not_found; + } +} + +static lxb_selectors_entry_t * +lxb_selectors_state_failed(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) +{ + return NULL; +} + lxb_status_t lxb_selectors_find(lxb_selectors_t *selectors, lxb_dom_node_t *root, const lxb_css_selector_list_t *list, @@ -263,23 +557,23 @@ lxb_selectors_entry_t *entry; lxb_selectors_nested_t nested; - entry = lexbor_dobject_calloc(selectors->objs); + entry = lxb_selectors_entry_make_first(selectors, list->last); if (entry == NULL) { return LXB_STATUS_ERROR_MEMORY_ALLOCATION; } - entry->combinator = LXB_CSS_SELECTOR_COMBINATOR_CLOSE; - entry->selector = list->last; - nested.parent = NULL; nested.entry = entry; + nested.first = entry; + nested.top = entry; nested.cb = cb; nested.ctx = ctx; + nested.forward = false; selectors->current = &nested; selectors->status = LXB_STATUS_OK; - return lxb_selectors_state_tree(selectors, root, list); + return lxb_selectors_tree(selectors, root); } lxb_status_t @@ -295,23 +589,23 @@ return LXB_STATUS_OK; } - entry = lexbor_dobject_calloc(selectors->objs); + entry = lxb_selectors_entry_make_first(selectors, list->last); if (entry == NULL) { return LXB_STATUS_ERROR_MEMORY_ALLOCATION; } - entry->combinator = LXB_CSS_SELECTOR_COMBINATOR_CLOSE; - entry->selector = list->last; - nested.parent = NULL; nested.entry = entry; + nested.first = entry; + nested.top = entry; nested.cb = cb; nested.ctx = ctx; + nested.forward = false; selectors->current = &nested; selectors->status = LXB_STATUS_OK; - status = lxb_selectors_state_run(selectors, node, list); + status = lxb_selectors_run(selectors, node); lxb_selectors_clean(selectors); @@ -320,15 +614,14 @@ lxb_status_t lxb_selectors_find_reverse(lxb_selectors_t *selectors, lxb_dom_node_t *root, - lxb_css_selector_list_t *list, + const lxb_css_selector_list_t *list, lxb_selectors_cb_f cb, void *ctx) { return lxb_selectors_find(selectors, root, list, cb, ctx); } static lxb_status_t -lxb_selectors_state_tree(lxb_selectors_t *selectors, lxb_dom_node_t *root, - const lxb_css_selector_list_t *list) +lxb_selectors_tree(lxb_selectors_t *selectors, lxb_dom_node_t *root) { lxb_status_t status; lxb_dom_node_t *node; @@ -353,7 +646,7 @@ goto next; } - status = lxb_selectors_state_run(selectors, node, list); + status = lxb_selectors_run(selectors, node); if (status != LXB_STATUS_OK) { if (status == LXB_STATUS_STOP) { break; @@ -391,32 +684,24 @@ } static lxb_status_t -lxb_selectors_state_run(lxb_selectors_t *selectors, lxb_dom_node_t *node, - const lxb_css_selector_list_t *list) +lxb_selectors_run(lxb_selectors_t *selectors, lxb_dom_node_t *node) { lxb_selectors_entry_t *entry; + lxb_selectors_nested_t *current = selectors->current; - entry = selectors->current->entry; + entry = current->entry; entry->node = node; + current->root = node; selectors->state = lxb_selectors_state_find; - selectors->first = entry; - -again: do { entry = selectors->state(selectors, entry); } while (entry != NULL); - if (selectors->current->parent != NULL - && selectors->status == LXB_STATUS_OK) - { - entry = selectors->current->entry; - selectors->state = selectors->current->return_state; - - goto again; - } + current->first = current->top; + current->entry = current->top; return selectors->status; } @@ -426,92 +711,28 @@ lxb_selectors_entry_t *entry) { lxb_dom_node_t *node; - lxb_selectors_entry_t *next; - const lxb_css_selector_t *selector; - const lxb_css_selector_anb_of_t *anb; - const lxb_css_selector_pseudo_t *pseudo; - selector = entry->selector; - - if (selector->type == LXB_CSS_SELECTOR_TYPE_PSEUDO_CLASS_FUNCTION) { - pseudo = &selector->u.pseudo; - - /* Optimizing. */ - - switch (pseudo->type) { - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD: - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD: - anb = pseudo->data; - - if (anb->of != NULL) { - break; - } - - goto godoit; - - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE: - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE: - goto godoit; - - default: - break; - } - - if (entry->nested == NULL) { - next = lexbor_dobject_calloc(selectors->objs); - if (next == NULL) { - selectors->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; - return NULL; - } - - next->combinator = LXB_CSS_SELECTOR_COMBINATOR_CLOSE; - - entry->nested = lexbor_dobject_calloc(selectors->nested); - if (entry->nested == NULL) { - selectors->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; - return NULL; - } - - entry->nested->entry = next; - entry->nested->parent = selectors->current; - } - - selectors->state = lxb_selectors_state_pseudo_class_function; - selectors->current->last = entry; - selectors->current = entry->nested; - - next = entry->nested->entry; - next->node = entry->node; - - return next; - } - -godoit: + selectors->state = lxb_selectors_state_found_check; switch (entry->combinator) { case LXB_CSS_SELECTOR_COMBINATOR_DESCENDANT: - node = lxb_selectors_descendant(selectors, entry, - selector, entry->node); + node = lxb_selectors_descendant(selectors, entry, entry->node); break; case LXB_CSS_SELECTOR_COMBINATOR_CLOSE: - node = lxb_selectors_close(selectors, entry, - selector, entry->node); + node = lxb_selectors_close(selectors, entry, entry->node); break; case LXB_CSS_SELECTOR_COMBINATOR_CHILD: - node = lxb_selectors_child(selectors, entry, - selector, entry->node); + node = lxb_selectors_child(selectors, entry, entry->node); break; case LXB_CSS_SELECTOR_COMBINATOR_SIBLING: - node = lxb_selectors_sibling(selectors, entry, - selector, entry->node); + node = lxb_selectors_sibling(selectors, entry, entry->node); break; case LXB_CSS_SELECTOR_COMBINATOR_FOLLOWING: - node = lxb_selectors_following(selectors, entry, - selector, entry->node); + node = lxb_selectors_following(selectors, entry, entry->node); break; case LXB_CSS_SELECTOR_COMBINATOR_CELL: @@ -520,599 +741,564 @@ return NULL; } - return lxb_selectors_state_find_check(selectors, node, selector, entry); + if (node == NULL) { + selectors->state = lxb_selectors_state_not_found; + } + else { + selectors->current->entry->node = node; + } + + return selectors->current->entry; } static lxb_selectors_entry_t * -lxb_selectors_state_find_check(lxb_selectors_t *selectors, lxb_dom_node_t *node, - const lxb_css_selector_t *selector, - lxb_selectors_entry_t *entry) +lxb_selectors_state_find_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) { - lxb_selectors_entry_t *next; - lxb_selectors_nested_t *current; - - if (node == NULL) { + lxb_dom_node_t *node; - try_next: + selectors->state = lxb_selectors_state_found_check_forward; - if (entry->next == NULL) { + switch (entry->combinator) { + case LXB_CSS_SELECTOR_COMBINATOR_DESCENDANT: + node = lxb_selectors_descendant_forward(selectors, entry, + entry->node); + break; - try_next_list: + case LXB_CSS_SELECTOR_COMBINATOR_CLOSE: + node = lxb_selectors_close_forward(selectors, entry, + entry->node); + break; - if (selector->list->next == NULL) { - return NULL; - } + case LXB_CSS_SELECTOR_COMBINATOR_CHILD: + node = lxb_selectors_child_forward(selectors, entry, entry->node); + break; - /* - * Try the following selectors from the selector list. - */ + case LXB_CSS_SELECTOR_COMBINATOR_SIBLING: + node = lxb_selectors_sibling_forward(selectors, entry, entry->node); + break; - if (entry->following != NULL) { - entry->following->node = entry->node; + case LXB_CSS_SELECTOR_COMBINATOR_FOLLOWING: + node = lxb_selectors_following_forward(selectors, entry, + entry->node); + break; - if (selectors->current->parent == NULL) { - selectors->first = entry->following; - } + case LXB_CSS_SELECTOR_COMBINATOR_CELL: + default: + selectors->status = LXB_STATUS_ERROR; + return NULL; + } - return entry->following; - } + if (node == NULL) { + try_next: - next = lexbor_dobject_calloc(selectors->objs); - if (next == NULL) { - selectors->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; - return NULL; + do { + if (entry->prev == NULL) { + return lxb_selectors_next_list_forward(selectors, entry); } - next->combinator = LXB_CSS_SELECTOR_COMBINATOR_CLOSE; - next->selector = selector->list->next->last; - next->node = entry->node; - - entry->following = next; - - if (selectors->current->parent == NULL) { - selectors->first = next; - } + entry = entry->prev; + } + while (entry->combinator == LXB_CSS_SELECTOR_COMBINATOR_CLOSE); - return next; + if (entry->combinator == LXB_CSS_SELECTOR_COMBINATOR_SIBLING) { + goto try_next; } - do { - entry = entry->next; + selectors->current->entry = entry; + selectors->state = lxb_selectors_state_find_forward; + } + else { + selectors->current->entry->node = node; + } - while (entry->combinator == LXB_CSS_SELECTOR_COMBINATOR_CLOSE) { - if (entry->next == NULL) { - selector = entry->selector; - goto try_next; - } + return selectors->current->entry; +} - entry = entry->next; - } +lxb_inline lxb_selectors_entry_t * +lxb_selectors_done(lxb_selectors_t *selectors) +{ + lxb_selectors_nested_t *current = selectors->current; - switch (entry->combinator) { - case LXB_CSS_SELECTOR_COMBINATOR_DESCENDANT: - node = entry->node->parent; + if (current->parent == NULL) { + return NULL; + } - if (node == NULL - || node->type != LXB_DOM_NODE_TYPE_ELEMENT) - { - node = NULL; - } + selectors->current = current->parent; - break; + return selectors->current->entry; +} - case LXB_CSS_SELECTOR_COMBINATOR_FOLLOWING: - node = entry->node->prev; - break; +lxb_inline lxb_selectors_entry_t * +lxb_selectors_exit(lxb_selectors_t *selectors) +{ + lxb_selectors_nested_t *current = selectors->current; - case LXB_CSS_SELECTOR_COMBINATOR_SIBLING: - case LXB_CSS_SELECTOR_COMBINATOR_CHILD: - case LXB_CSS_SELECTOR_COMBINATOR_CLOSE: - node = NULL; - break; + if (current->parent == NULL) { + return NULL; + } - case LXB_CSS_SELECTOR_COMBINATOR_CELL: - default: - selectors->status = LXB_STATUS_ERROR; - return NULL; - } - } - while (node == NULL); + selectors->state = current->return_state; - entry->node = node; + return current->entry; +} - return entry; - } +static lxb_selectors_entry_t * +lxb_selectors_state_found_check(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) +{ + lxb_selectors_nested_t *current; + lxb_dom_node_t *node; + lxb_selectors_entry_t *prev; + const lxb_css_selector_t *selector; - if (selector->prev == NULL) { - current = selectors->current; + current = selectors->current; + entry = current->entry; + node = entry->node; - selectors->status = current->cb(current->entry->node, - selector->list->specificity, - current->ctx); + if (entry->prev == NULL) { + selector = entry->selector; - if ((selectors->options & LXB_SELECTORS_OPT_MATCH_FIRST) == 0 - && current->parent == NULL) + while (selector->combinator == LXB_CSS_SELECTOR_COMBINATOR_CLOSE + && selector->prev != NULL) { - if (selectors->status == LXB_STATUS_OK) { - entry = selectors->first; - goto try_next_list; - } + selector = selector->prev; } - return NULL; - } - - if (entry->prev == NULL) { - next = lexbor_dobject_calloc(selectors->objs); - if (next == NULL) { - selectors->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; - return NULL; + if (selector->prev == NULL) { + return lxb_selectors_state_found(selectors, entry); } - next->combinator = selector->combinator; - next->selector = selector->prev; - next->node = node; - - next->next = entry; - entry->prev = next; + prev = lxb_selectors_state_entry_create(selectors, selector, + entry, node); + current->entry = prev; + selectors->state = lxb_selectors_state_find; - return next; + return prev; } + selectors->state = lxb_selectors_state_find; + + current->entry = entry->prev; entry->prev->node = node; return entry->prev; } static lxb_selectors_entry_t * -lxb_selectors_state_pseudo_class_function(lxb_selectors_t *selectors, - lxb_selectors_entry_t *entry) +lxb_selectors_state_found_check_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) { - lxb_dom_node_t *node, *base; lxb_selectors_nested_t *current; - const lxb_css_selector_list_t *list; - lxb_css_selector_anb_of_t *anb; - const lxb_css_selector_pseudo_t *pseudo; + lxb_dom_node_t *node; + lxb_selectors_entry_t *next; + const lxb_css_selector_t *selector; current = selectors->current; + entry = current->entry; + node = entry->node; - base = lxb_selectors_next_node(current); - if (base == NULL) { - goto not_found; - } + if (entry->next == NULL) { + selector = entry->selector; - pseudo = ¤t->parent->last->selector->u.pseudo; + if (selector->next == NULL) { + return lxb_selectors_state_found_forward(selectors, entry); + } - switch (pseudo->type) { - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_HAS: - list = (lxb_css_selector_list_t *) pseudo->data; - node = lxb_selectors_state_has_relative(base, list->first); + next = lxb_selectors_state_entry_create_forward(selectors, selector, + entry, node); + current->entry = next; + selectors->state = lxb_selectors_state_find_forward; - if (node == NULL) { - selectors->current = selectors->current->parent; - entry = selectors->current->last; + return next; + } - selectors->state = lxb_selectors_state_find; + selectors->state = lxb_selectors_state_find_forward; - return lxb_selectors_state_find_check(selectors, NULL, - entry->selector, entry); - } + current->entry = entry->next; + entry->next->node = node; - current->root = base; + return entry->next; +} - current->entry->selector = list->last; - current->entry->node = node; - current->return_state = lxb_selectors_state_after_find_has; - current->cb = lxb_selectors_cb_ok; - current->ctx = ¤t->found; - current->found = false; +static lxb_selectors_entry_t * +lxb_selectors_state_found(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) +{ + lxb_selectors_nested_t *current; + const lxb_css_selector_t *selector; - selectors->state = lxb_selectors_state_find; + current = selectors->current; + selector = current->entry->selector; - return entry; + selectors->state = lxb_selectors_state_find; - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_CURRENT: - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_IS: - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE: - current->entry->selector = ((lxb_css_selector_list_t *) pseudo->data)->last; - current->entry->node = base; - current->return_state = lxb_selectors_state_after_find; - current->cb = lxb_selectors_cb_ok; - current->ctx = ¤t->found; - current->found = false; + selectors->status = current->cb(current->root, + selector->list->specificity, + current->ctx); - selectors->state = lxb_selectors_state_find; + if ((selectors->options & LXB_SELECTORS_OPT_MATCH_FIRST) == 0 + && current->parent == NULL) + { + if (selectors->status == LXB_STATUS_OK) { + entry = selectors->current->first; + return lxb_selectors_next_list(selectors, entry); + } + } - return entry; + return lxb_selectors_done(selectors); +} - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT: - current->entry->selector = ((lxb_css_selector_list_t *) pseudo->data)->last; - current->entry->node = base; - current->return_state = lxb_selectors_state_after_find; - current->cb = lxb_selectors_cb_not; - current->ctx = ¤t->found; - current->found = true; +static lxb_selectors_entry_t * +lxb_selectors_state_found_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) +{ + lxb_selectors_nested_t *current; + const lxb_css_selector_t *selector; - selectors->state = lxb_selectors_state_find; + current = selectors->current; + selector = current->entry->selector; - return entry; + selectors->state = lxb_selectors_state_find_forward; - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD: - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD: - anb = pseudo->data; + selectors->status = current->cb(current->root, + selector->list->specificity, + current->ctx); - current->entry->selector = anb->of->last; - current->entry->node = base; - current->return_state = lxb_selectors_state_after_nth_child; - current->cb = lxb_selectors_cb_ok; - current->ctx = ¤t->found; - current->root = base; - current->index = 0; - current->found = false; + if ((selectors->options & LXB_SELECTORS_OPT_MATCH_FIRST) == 0 + && current->parent == NULL) + { + if (selectors->status == LXB_STATUS_OK) { + entry = selectors->current->first; + return lxb_selectors_next_list_forward(selectors, entry); + } + } - selectors->state = lxb_selectors_state_find; + return lxb_selectors_done(selectors); +} - return entry; - /* - * This one can only happen if the user has somehow messed up the - * selector. - */ +static lxb_selectors_entry_t * +lxb_selectors_state_not_found(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) +{ + lxb_selectors_nested_t *current; - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE: - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE: - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_DIR: - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LANG: - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL: - case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL: - default: - break; - } + current = selectors->current; + entry = current->entry; -not_found: +try_next: - selectors->current = selectors->current->parent; - entry = selectors->current->last; + if (entry->next == NULL) { + return lxb_selectors_next_list(selectors, entry); + } - selectors->state = lxb_selectors_state_find; + entry = entry->next; - return lxb_selectors_state_find_check(selectors, NULL, - entry->selector, entry); -} + while (entry->combinator == LXB_CSS_SELECTOR_COMBINATOR_CLOSE) { + if (entry->next == NULL) { + goto try_next; + } -static lxb_dom_node_t * -lxb_selectors_next_node(lxb_selectors_nested_t *main) -{ - lxb_dom_node_t *node = main->entry->node; + entry = entry->next; + } - switch (main->parent->last->combinator) { - case LXB_CSS_SELECTOR_COMBINATOR_DESCENDANT: + switch (entry->combinator) { + case LXB_CSS_SELECTOR_COMBINATOR_SIBLING: case LXB_CSS_SELECTOR_COMBINATOR_CHILD: - if (node->parent == NULL - || node->parent->type != LXB_DOM_NODE_TYPE_ELEMENT) - { - return NULL; - } - - return node->parent; - case LXB_CSS_SELECTOR_COMBINATOR_CLOSE: - return node; - - case LXB_CSS_SELECTOR_COMBINATOR_SIBLING: - case LXB_CSS_SELECTOR_COMBINATOR_FOLLOWING: - node = node->prev; - break; + goto try_next; default: - return NULL; - } - - while (node != NULL) { - if (node->type == LXB_DOM_NODE_TYPE_ELEMENT) { break; - } - - node = node->prev; } - return node; + current->entry = entry; + selectors->state = lxb_selectors_state_find; + + return entry; } -static lxb_dom_node_t * -lxb_selectors_state_has_relative(lxb_dom_node_t *node, - const lxb_css_selector_t *selector) +static lxb_selectors_entry_t * +lxb_selectors_state_not_found_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) { - lxb_dom_node_t *root = node; +try_next: - switch (selector->combinator) { - case LXB_CSS_SELECTOR_COMBINATOR_DESCENDANT: - case LXB_CSS_SELECTOR_COMBINATOR_CHILD: - node = node->first_child; - break; - - case LXB_CSS_SELECTOR_COMBINATOR_SIBLING: - case LXB_CSS_SELECTOR_COMBINATOR_FOLLOWING: - node = node->next; - break; - - default: - return NULL; + if (entry->prev == NULL) { + return lxb_selectors_next_list_forward(selectors, entry); } - while (node != NULL) { - if (node->type == LXB_DOM_NODE_TYPE_ELEMENT) { - break; + while (entry->combinator == LXB_CSS_SELECTOR_COMBINATOR_CLOSE) { + if (entry->prev == NULL) { + goto try_next; } - while (node !=root && node->next == NULL) { - node = node->parent; - } + entry = entry->prev; + } - if (node == root) { - return NULL; + if (entry->combinator == LXB_CSS_SELECTOR_COMBINATOR_SIBLING) { + if (entry->prev != NULL) { + entry = entry->prev; } - node = node->next; + goto try_next; } - return node; + selectors->current->entry = entry; + selectors->state = lxb_selectors_state_find_forward; + + return entry; } static lxb_selectors_entry_t * -lxb_selectors_state_after_find_has(lxb_selectors_t *selectors, - lxb_selectors_entry_t *entry) +lxb_selectors_next_list(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) { - lxb_dom_node_t *node; - lxb_selectors_entry_t *parent; - lxb_selectors_nested_t *current; + if (entry->selector->list->next == NULL) { + return lxb_selectors_exit(selectors); + } - if (selectors->current->found) { - node = selectors->current->root; + selectors->state = lxb_selectors_state_find; - selectors->current = selectors->current->parent; - parent = selectors->current->last; + /* + * Try the following selectors from the selector list. + */ - selectors->state = lxb_selectors_state_find; + return lxb_selectors_make_following(selectors, entry); +} - return lxb_selectors_state_find_check(selectors, node, - parent->selector, parent); +static lxb_selectors_entry_t * +lxb_selectors_next_list_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) +{ + if (entry->selector->list->next == NULL) { + return lxb_selectors_exit(selectors); } - current = selectors->current; - node = entry->node; + selectors->state = lxb_selectors_state_find_forward; - switch (entry->selector->list->first->combinator) { - case LXB_CSS_SELECTOR_COMBINATOR_DESCENDANT: - if (node->first_child != NULL) { - node = node->first_child; - } - else { + /* + * Try the following selectors from the selector list. + */ - next: + return lxb_selectors_make_following_forward(selectors, entry); +} - while (node != current->root && node->next == NULL) { - node = node->parent; - } +static lxb_selectors_entry_t * +lxb_selectors_make_following(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) +{ + lxb_selectors_entry_t *next; + lxb_selectors_nested_t *current; + const lxb_css_selector_t *selector; - if (node == current->root) { - goto failed; - } + selector = entry->selector; + current = selectors->current; - node = node->next; - } + if (entry->following != NULL) { + entry->following->node = current->root; + current->first = entry->following; + current->entry = entry->following; + + return entry->following; + } - if (node->type != LXB_DOM_NODE_TYPE_ELEMENT) { - goto next; - } + next = lxb_selectors_entry_make_first(selectors, + selector->list->next->last); + if (next == NULL) { + selectors->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; + return NULL; + } - break; + next->node = current->root; - case LXB_CSS_SELECTOR_COMBINATOR_CHILD: - case LXB_CSS_SELECTOR_COMBINATOR_FOLLOWING: - node = node->next; + entry->following = next; + current->first = next; + current->entry = next; - while (node != NULL && node->type != LXB_DOM_NODE_TYPE_ELEMENT) { - node = node->next; - } + return next; +} - if (node == NULL) { - goto failed; - } +static lxb_selectors_entry_t * +lxb_selectors_make_following_forward(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) +{ + lxb_selectors_entry_t *next; + lxb_selectors_nested_t *current; + const lxb_css_selector_t *selector; - break; + selector = entry->selector; + current = selectors->current; - case LXB_CSS_SELECTOR_COMBINATOR_SIBLING: - goto failed; + if (entry->following != NULL) { + entry->following->node = current->root; + current->first = entry->following; + current->entry = entry->following; - case LXB_CSS_SELECTOR_COMBINATOR_CLOSE: - case LXB_CSS_SELECTOR_COMBINATOR_CELL: - default: - selectors->status = LXB_STATUS_ERROR; - return NULL; + return entry->following; } - entry->node = node; - selectors->state = lxb_selectors_state_find; - - return entry; - -failed: - - selectors->current = selectors->current->parent; - parent = selectors->current->last; + next = lexbor_dobject_calloc(selectors->objs); + if (next == NULL) { + selectors->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; + return NULL; + } - selectors->state = lxb_selectors_state_find; + next->selector = selector->list->next->first; + next->node = current->root; + next->combinator = next->selector->combinator; + + entry->following = next; + current->first = next; + current->entry = next; - return lxb_selectors_state_find_check(selectors, NULL, - parent->selector, parent); + return next; } - static lxb_selectors_entry_t * lxb_selectors_state_after_find(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry) { - lxb_dom_node_t *node; - lxb_selectors_entry_t *parent; - lxb_selectors_nested_t *current; + selectors->current = selectors->current->parent; - current = selectors->current; + lxb_selectors_switch_to_not_found(selectors, selectors->current); - if (current->found) { - node = entry->node; + return selectors->current->entry; +} - selectors->current = current->parent; - parent = selectors->current->last; +static lxb_selectors_entry_t * +lxb_selectors_state_after_not(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) +{ + selectors->current = selectors->current->parent; - selectors->state = lxb_selectors_state_find; + lxb_selectors_switch_to_found_check(selectors, selectors->current); - return lxb_selectors_state_find_check(selectors, node, - parent->selector, parent); - } + return selectors->current->entry; +} - node = entry->node; +lxb_inline lxb_dom_node_t * +lxb_selectors_state_nth_child_node(const lxb_css_selector_pseudo_t *pseudo, + lxb_dom_node_t *node) +{ + if (pseudo->type == LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD) { + node = node->prev; - switch (current->parent->last->combinator) { - case LXB_CSS_SELECTOR_COMBINATOR_DESCENDANT: - if (node->parent != NULL - && node->parent->type == LXB_DOM_NODE_TYPE_ELEMENT) - { - node = node->parent; - } - else { - node = NULL; + while (node != NULL) { + if (node->type == LXB_DOM_NODE_TYPE_ELEMENT) { + break; } - break; - - case LXB_CSS_SELECTOR_COMBINATOR_FOLLOWING: node = node->prev; + } + } + else { + node = node->next; - while (node != NULL && node->type != LXB_DOM_NODE_TYPE_ELEMENT) { - node = node->prev; + while (node != NULL) { + if (node->type == LXB_DOM_NODE_TYPE_ELEMENT) { + break; } - break; - - case LXB_CSS_SELECTOR_COMBINATOR_CHILD: - case LXB_CSS_SELECTOR_COMBINATOR_SIBLING: - case LXB_CSS_SELECTOR_COMBINATOR_CLOSE: - node = NULL; - break; - - case LXB_CSS_SELECTOR_COMBINATOR_CELL: - default: - selectors->status = LXB_STATUS_ERROR; - return NULL; + node = node->next; + } } - if (node == NULL) { - selectors->current = current->parent; - parent = selectors->current->last; - - selectors->state = lxb_selectors_state_find; + return node; +} - return lxb_selectors_state_find_check(selectors, node, - parent->selector, parent); +lxb_inline lxb_selectors_entry_t * +lxb_selectors_state_nth_child_done(lxb_selectors_t *selectors, + const lxb_css_selector_pseudo_t *pseudo, + size_t index) +{ + if (lxb_selectors_anb_calc(pseudo->data, index)) { + lxb_selectors_switch_to_found_check(selectors, selectors->current); + } + else { + lxb_selectors_switch_to_not_found(selectors, selectors->current); } - entry->node = node; - selectors->state = lxb_selectors_state_find; - - return entry; + return selectors->current->entry; } static lxb_selectors_entry_t * lxb_selectors_state_after_nth_child(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry) { - bool found; lxb_dom_node_t *node; - lxb_selectors_entry_t *parent; lxb_selectors_nested_t *current; - const lxb_css_selector_t *selector; const lxb_css_selector_pseudo_t *pseudo; current = selectors->current; - selector = current->parent->last->selector; - pseudo = &selector->u.pseudo; - node = entry->node; + if (current->index == 0) { + selectors->current = selectors->current->parent; + lxb_selectors_switch_to_not_found(selectors, selectors->current); - if (current->found) { - current->index += 1; - } - else if (current->root == node) { - node = NULL; - goto done; + return selectors->current->entry; } - if (pseudo->type == LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD) { - node = node->prev; + pseudo = ¤t->parent->entry->selector->u.pseudo; + node = lxb_selectors_state_nth_child_node(pseudo, current->root); - while (node != NULL) { - if (node->type == LXB_DOM_NODE_TYPE_ELEMENT) { - break; - } - - node = node->prev; - } - } - else { - node = node->next; - - while (node != NULL) { - if (node->type == LXB_DOM_NODE_TYPE_ELEMENT) { - break; - } + if (node == NULL) { + selectors->current = selectors->current->parent; - node = node->next; - } + return lxb_selectors_state_nth_child_done(selectors, pseudo, + current->index); } - if (node == NULL) { - goto done; - } + current->root = node; + current->entry->node = node; - entry->node = node; - current->found = false; selectors->state = lxb_selectors_state_find; return entry; +} -done: +static lxb_selectors_entry_t * +lxb_selectors_state_nth_child_found(lxb_selectors_t *selectors, + lxb_selectors_entry_t *entry) +{ + lxb_dom_node_t *node; + lxb_selectors_nested_t *current; + const lxb_css_selector_pseudo_t *pseudo; - if (current->index > 0) { - found = lxb_selectors_anb_calc(pseudo->data, current->index); + current = entry->nested; + pseudo = &entry->selector->u.pseudo; + node = lxb_selectors_state_nth_child_node(pseudo, current->root); - node = (found) ? current->root : NULL; + if (node == NULL) { + return lxb_selectors_state_nth_child_done(selectors, pseudo, + current->index); } - selectors->state = lxb_selectors_state_find; - selectors->current = selectors->current->parent; + current->root = node; + current->entry->node = node; - parent = selectors->current->last; + selectors->current = current; + selectors->state = lxb_selectors_state_find; - return lxb_selectors_state_find_check(selectors, node, - parent->selector, parent); + return current->entry; } static bool lxb_selectors_match(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry, - const lxb_css_selector_t *selector, lxb_dom_node_t *node) + lxb_dom_node_t *node) { lxb_dom_element_t *element; - switch (selector->type) { + switch (entry->selector->type) { case LXB_CSS_SELECTOR_TYPE_ANY: return true; case LXB_CSS_SELECTOR_TYPE_ELEMENT: - return lxb_selectors_match_element(selector, node, entry); + return lxb_selectors_match_element(entry->selector, node, entry); case LXB_CSS_SELECTOR_TYPE_ID: - return lxb_selectors_match_id(selector, node); + return lxb_selectors_match_id(entry->selector, node); case LXB_CSS_SELECTOR_TYPE_CLASS: element = lxb_dom_interface_element(node); @@ -1124,19 +1310,19 @@ } return lxb_selectors_match_class(element->attr_class->value, - &selector->name, true); + &entry->selector->name, true); case LXB_CSS_SELECTOR_TYPE_ATTRIBUTE: - return lxb_selectors_match_attribute(selector, node, entry); + return lxb_selectors_match_attribute(entry->selector, node, entry); case LXB_CSS_SELECTOR_TYPE_PSEUDO_CLASS: - return lxb_selectors_pseudo_class(selector, node); + return lxb_selectors_pseudo_class(entry->selector, node); case LXB_CSS_SELECTOR_TYPE_PSEUDO_CLASS_FUNCTION: - return lxb_selectors_pseudo_class_function(selector, node); - + return lxb_selectors_pseudo_class_function(selectors, + entry->selector, node); case LXB_CSS_SELECTOR_TYPE_PSEUDO_ELEMENT: - return lxb_selectors_pseudo_element(selector, node); + return lxb_selectors_pseudo_element(entry->selector, node); case LXB_CSS_SELECTOR_TYPE_PSEUDO_ELEMENT_FUNCTION: return false; @@ -1641,19 +1827,141 @@ return false; } +static lxb_selectors_nested_t * +lxb_selectors_nested_make(lxb_selectors_t *selectors, lxb_dom_node_t *node, + lxb_css_selector_t *selector, bool forward) +{ + lxb_selectors_entry_t *next; + lxb_selectors_entry_t *entry; + + entry = selectors->current->entry; + entry->node = node; + + if (entry->nested == NULL) { + if (!forward) { + next = lxb_selectors_entry_make_first(selectors, selector); + if (next == NULL) { + selectors->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; + return NULL; + } + } + else { + next = lexbor_dobject_calloc(selectors->objs); + if (next == NULL) { + selectors->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; + return NULL; + } + + next->combinator = selector->combinator; + next->selector = selector; + } + + entry->nested = lexbor_dobject_calloc(selectors->nested); + if (entry->nested == NULL) { + selectors->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; + return NULL; + } + + entry->nested->top = next; + entry->nested->parent = selectors->current; + entry->nested->forward = forward; + } + + selectors->current = entry->nested; + entry->nested->entry = entry->nested->top; + entry->nested->first = entry->nested->top; + + selectors->current->root = node; + selectors->current->ctx = selectors; + + return selectors->current; +} + static bool -lxb_selectors_pseudo_class_function(const lxb_css_selector_t *selector, +lxb_selectors_pseudo_class_function(lxb_selectors_t *selectors, + const lxb_css_selector_t *selector, lxb_dom_node_t *node) { + bool is; size_t index; lxb_dom_node_t *base; + lxb_selectors_nested_t *current; + const lexbor_str_t *str; + const lxb_dom_text_t *text; + const lxb_css_selector_list_t *list; + const lxb_css_selector_anb_of_t *anb; const lxb_css_selector_pseudo_t *pseudo; + const lxb_css_selector_contains_t *contains; pseudo = &selector->u.pseudo; switch (pseudo->type) { + case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_HAS: + list = (lxb_css_selector_list_t *) pseudo->data; + + current = lxb_selectors_nested_make(selectors, node, + list->first, true); + if (current == NULL) { + goto failed; + } + + current->cb = lxb_selectors_cb_ok; + current->return_state = lxb_selectors_state_after_find; + selectors->state = lxb_selectors_state_find_forward; + + break; + + case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_CURRENT: + case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_IS: + case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE: + list = (lxb_css_selector_list_t *) pseudo->data; + + current = lxb_selectors_nested_make(selectors, node, list->last, + false); + if (current == NULL) { + goto failed; + } + + current->cb = lxb_selectors_cb_ok; + current->return_state = lxb_selectors_state_after_find; + selectors->state = lxb_selectors_state_find; + + break; + + case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT: + list = (lxb_css_selector_list_t *) pseudo->data; + + current = lxb_selectors_nested_make(selectors, node, list->last, + false); + if (current == NULL) { + goto failed; + } + + current->cb = lxb_selectors_cb_not; + current->return_state = lxb_selectors_state_after_not; + selectors->state = lxb_selectors_state_find; + + break; + case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD: case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD: + anb = pseudo->data; + + if (anb->of != NULL) { + current = lxb_selectors_nested_make(selectors, node, + anb->of->last, false); + if (current == NULL) { + goto failed; + } + + current->return_state = lxb_selectors_state_after_nth_child; + current->cb = lxb_selectors_cb_nth_ok; + current->index = 0; + selectors->state = lxb_selectors_state_find; + + return true; + } + index = 0; if (pseudo->type == LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD) { @@ -1711,15 +2019,52 @@ return lxb_selectors_anb_calc(pseudo->data, index); + case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LEXBOR_CONTAINS: + contains = pseudo->data; + + node = node->first_child; + while (node != NULL) { + if (node->type == LXB_DOM_NODE_TYPE_TEXT) { + text = lxb_dom_interface_text(node); + str = &text->char_data.data; + + if (contains->insensitive) { + is = lexbor_str_data_ncasecmp_contain(str->data, str->length, + contains->str.data, + contains->str.length); + } + else { + is = lexbor_str_data_ncmp_contain(str->data, str->length, + contains->str.data, + contains->str.length); + } + + if (is) { + return true; + } + } + + node = node->next; + } + + return false; + case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_DIR: case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LANG: case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL: case LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL: default: - break; + return false; } - return false; + return true; + +failed: + + selectors->state = lxb_selectors_state_failed; + selectors->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION; + + return true; } static bool @@ -1900,7 +2245,10 @@ lxb_selectors_cb_ok(lxb_dom_node_t *node, lxb_css_selector_specificity_t spec, void *ctx) { - *((bool *) ctx) = true; + lxb_selectors_t *selectors = ctx; + + lxb_selectors_switch_to_found_check(selectors, selectors->current->parent); + return LXB_STATUS_OK; } @@ -1908,7 +2256,22 @@ lxb_selectors_cb_not(lxb_dom_node_t *node, lxb_css_selector_specificity_t spec, void *ctx) { - *((bool *) ctx) = false; + lxb_selectors_t *selectors = ctx; + + lxb_selectors_switch_to_not_found(selectors, selectors->current->parent); + + return LXB_STATUS_OK; +} + +static lxb_status_t +lxb_selectors_cb_nth_ok(lxb_dom_node_t *node, + lxb_css_selector_specificity_t spec, void *ctx) +{ + lxb_selectors_t *selectors = ctx; + + selectors->current->index += 1; + selectors->state = lxb_selectors_state_nth_child_found; + return LXB_STATUS_OK; } diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/selectors/selectors.h php8.4-8.4.21/ext/dom/lexbor/lexbor/selectors/selectors.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/selectors/selectors.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/selectors/selectors.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2024 Alexander Borisov + * Copyright (C) 2021-2025 Alexander Borisov * * Author: Alexander Borisov */ @@ -89,11 +89,13 @@ void *ctx; lxb_dom_node_t *root; - lxb_selectors_entry_t *last; lxb_selectors_nested_t *parent; + lxb_selectors_entry_t *first; + lxb_selectors_entry_t *top; size_t index; - bool found; + + bool forward; }; struct lxb_selectors { @@ -102,7 +104,6 @@ lexbor_dobject_t *nested; lxb_selectors_nested_t *current; - lxb_selectors_entry_t *first; lxb_selectors_opt_t options; lxb_status_t status; @@ -220,7 +221,7 @@ */ LXB_API LXB_DEPRECATED(lxb_status_t lxb_selectors_find_reverse(lxb_selectors_t *selectors, lxb_dom_node_t *root, - lxb_css_selector_list_t *list, + const lxb_css_selector_list_t *list, lxb_selectors_cb_f cb, void *ctx)); /* diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/selectors-adapted/selectors.c php8.4-8.4.21/ext/dom/lexbor/lexbor/selectors-adapted/selectors.c --- php8.4-8.4.16/ext/dom/lexbor/lexbor/selectors-adapted/selectors.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/selectors-adapted/selectors.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,9 +1,9 @@ /* - * Copyright (C) 2021-2025 Alexander Borisov + * Copyright (C) 2021-2026 Alexander Borisov * * Author: Alexander Borisov * Adapted for PHP + libxml2 by: Niels Dossche - * Based on Lexbor (upstream commit 971faf11a5f45433b9193a143e2897d8c0fd5611) + * Based on Lexbor (upstream commit 5291cde0d40f77e7c4ea364b7cd726269e0bf1f9) */ #include @@ -1356,8 +1356,8 @@ current = selectors->current; if (current->index == 0) { - selectors->state = lxb_selectors_state_not_found; selectors->current = selectors->current->parent; + lxb_selectors_switch_to_not_found(selectors, selectors->current); return selectors->current->entry; } diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/tag/base.h php8.4-8.4.21/ext/dom/lexbor/lexbor/tag/base.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/tag/base.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/tag/base.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2024 Alexander Borisov + * Copyright (C) 2019-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -16,7 +16,7 @@ #define LXB_TAG_VERSION_MAJOR 1 -#define LXB_TAG_VERSION_MINOR 3 +#define LXB_TAG_VERSION_MINOR 5 #define LXB_TAG_VERSION_PATCH 0 #define LXB_TAG_VERSION_STRING \ diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/tag/const.h php8.4-8.4.21/ext/dom/lexbor/lexbor/tag/const.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/tag/const.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/tag/const.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -14,8 +14,8 @@ #ifndef LXB_TAG_CONST_H #define LXB_TAG_CONST_H -#define LXB_TAG_CONST_VERSION "A161EC911182C3254E7A972D5C51DF86" -#define LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86 +#define LXB_TAG_CONST_VERSION "5AB3094FB370521074947DC082575715" +#define LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715 typedef uintptr_t lxb_tag_id_t; @@ -183,41 +183,43 @@ LXB_TAG_S = 0x009f, LXB_TAG_SAMP = 0x00a0, LXB_TAG_SCRIPT = 0x00a1, - LXB_TAG_SECTION = 0x00a2, - LXB_TAG_SELECT = 0x00a3, - LXB_TAG_SLOT = 0x00a4, - LXB_TAG_SMALL = 0x00a5, - LXB_TAG_SOURCE = 0x00a6, - LXB_TAG_SPACER = 0x00a7, - LXB_TAG_SPAN = 0x00a8, - LXB_TAG_STRIKE = 0x00a9, - LXB_TAG_STRONG = 0x00aa, - LXB_TAG_STYLE = 0x00ab, - LXB_TAG_SUB = 0x00ac, - LXB_TAG_SUMMARY = 0x00ad, - LXB_TAG_SUP = 0x00ae, - LXB_TAG_SVG = 0x00af, - LXB_TAG_TABLE = 0x00b0, - LXB_TAG_TBODY = 0x00b1, - LXB_TAG_TD = 0x00b2, - LXB_TAG_TEMPLATE = 0x00b3, - LXB_TAG_TEXTAREA = 0x00b4, - LXB_TAG_TEXTPATH = 0x00b5, - LXB_TAG_TFOOT = 0x00b6, - LXB_TAG_TH = 0x00b7, - LXB_TAG_THEAD = 0x00b8, - LXB_TAG_TIME = 0x00b9, - LXB_TAG_TITLE = 0x00ba, - LXB_TAG_TR = 0x00bb, - LXB_TAG_TRACK = 0x00bc, - LXB_TAG_TT = 0x00bd, - LXB_TAG_U = 0x00be, - LXB_TAG_UL = 0x00bf, - LXB_TAG_VAR = 0x00c0, - LXB_TAG_VIDEO = 0x00c1, - LXB_TAG_WBR = 0x00c2, - LXB_TAG_XMP = 0x00c3, - LXB_TAG__LAST_ENTRY = 0x00c4 + LXB_TAG_SEARCH = 0x00a2, + LXB_TAG_SECTION = 0x00a3, + LXB_TAG_SELECT = 0x00a4, + LXB_TAG_SELECTEDCONTENT = 0x00a5, + LXB_TAG_SLOT = 0x00a6, + LXB_TAG_SMALL = 0x00a7, + LXB_TAG_SOURCE = 0x00a8, + LXB_TAG_SPACER = 0x00a9, + LXB_TAG_SPAN = 0x00aa, + LXB_TAG_STRIKE = 0x00ab, + LXB_TAG_STRONG = 0x00ac, + LXB_TAG_STYLE = 0x00ad, + LXB_TAG_SUB = 0x00ae, + LXB_TAG_SUMMARY = 0x00af, + LXB_TAG_SUP = 0x00b0, + LXB_TAG_SVG = 0x00b1, + LXB_TAG_TABLE = 0x00b2, + LXB_TAG_TBODY = 0x00b3, + LXB_TAG_TD = 0x00b4, + LXB_TAG_TEMPLATE = 0x00b5, + LXB_TAG_TEXTAREA = 0x00b6, + LXB_TAG_TEXTPATH = 0x00b7, + LXB_TAG_TFOOT = 0x00b8, + LXB_TAG_TH = 0x00b9, + LXB_TAG_THEAD = 0x00ba, + LXB_TAG_TIME = 0x00bb, + LXB_TAG_TITLE = 0x00bc, + LXB_TAG_TR = 0x00bd, + LXB_TAG_TRACK = 0x00be, + LXB_TAG_TT = 0x00bf, + LXB_TAG_U = 0x00c0, + LXB_TAG_UL = 0x00c1, + LXB_TAG_VAR = 0x00c2, + LXB_TAG_VIDEO = 0x00c3, + LXB_TAG_WBR = 0x00c4, + LXB_TAG_XMP = 0x00c5, + LXB_TAG__LAST_ENTRY = 0x00c6 } lxb_tag_id_enum_t; diff -Nru php8.4-8.4.16/ext/dom/lexbor/lexbor/tag/res.h php8.4-8.4.21/ext/dom/lexbor/lexbor/tag/res.h --- php8.4-8.4.16/ext/dom/lexbor/lexbor/tag/res.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/lexbor/tag/res.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Alexander Borisov + * Copyright (C) 2018-2026 Alexander Borisov * * Author: Alexander Borisov */ @@ -17,9 +17,9 @@ #endif /* LXB_TAG_RES_H */ #ifdef LXB_TAG_CONST_VERSION -#ifndef LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86 +#ifndef LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715 #error Mismatched tags version! See "lexbor/tag/const.h". -#endif /* LXB_TAG_CONST_VERSION_A161EC911182C3254E7A972D5C51DF86 */ +#endif /* LXB_TAG_CONST_VERSION_5AB3094FB370521074947DC082575715 */ #else #error You need to include "lexbor/tag/const.h". #endif /* LXB_TAG_CONST_VERSION */ @@ -188,8 +188,10 @@ {{.u.short_str = "s", .length = 1, .next = NULL}, LXB_TAG_S, 1, true}, {{.u.short_str = "samp", .length = 4, .next = NULL}, LXB_TAG_SAMP, 1, true}, {{.u.short_str = "script", .length = 6, .next = NULL}, LXB_TAG_SCRIPT, 1, true}, + {{.u.short_str = "search", .length = 6, .next = NULL}, LXB_TAG_SEARCH, 1, true}, {{.u.short_str = "section", .length = 7, .next = NULL}, LXB_TAG_SECTION, 1, true}, {{.u.short_str = "select", .length = 6, .next = NULL}, LXB_TAG_SELECT, 1, true}, + {{.u.short_str = "selectedcontent", .length = 15, .next = NULL}, LXB_TAG_SELECTEDCONTENT, 1, true}, {{.u.short_str = "slot", .length = 4, .next = NULL}, LXB_TAG_SLOT, 1, true}, {{.u.short_str = "small", .length = 5, .next = NULL}, LXB_TAG_SMALL, 1, true}, {{.u.short_str = "source", .length = 6, .next = NULL}, LXB_TAG_SOURCE, 1, true}, @@ -389,8 +391,10 @@ {{.u.short_str = "S", .length = 1, .next = NULL}, LXB_TAG_S, 1, true}, {{.u.short_str = "SAMP", .length = 4, .next = NULL}, LXB_TAG_SAMP, 1, true}, {{.u.short_str = "SCRIPT", .length = 6, .next = NULL}, LXB_TAG_SCRIPT, 1, true}, + {{.u.short_str = "SEARCH", .length = 6, .next = NULL}, LXB_TAG_SEARCH, 1, true}, {{.u.short_str = "SECTION", .length = 7, .next = NULL}, LXB_TAG_SECTION, 1, true}, {{.u.short_str = "SELECT", .length = 6, .next = NULL}, LXB_TAG_SELECT, 1, true}, + {{.u.short_str = "SELECTEDCONTENT", .length = 15, .next = NULL}, LXB_TAG_SELECTEDCONTENT, 1, true}, {{.u.short_str = "SLOT", .length = 4, .next = NULL}, LXB_TAG_SLOT, 1, true}, {{.u.short_str = "SMALL", .length = 5, .next = NULL}, LXB_TAG_SMALL, 1, true}, {{.u.short_str = "SOURCE", .length = 6, .next = NULL}, LXB_TAG_SOURCE, 1, true}, @@ -426,81 +430,81 @@ }; #endif -static const lexbor_shs_entry_t lxb_tag_res_shs_data_default[] = +static const lexbor_shs_entry_t lxb_tag_res_shs_data_default[263] = { {NULL, NULL, 262, 0}, {"radialgradient", (void *) &lxb_tag_res_data_default[153], 14, 0}, {"fecomponenttransfer", (void *) &lxb_tag_res_data_default[58], 19, 0}, {"abbr", (void *) &lxb_tag_res_data_default[7], 4, 1}, {"feflood", (void *) &lxb_tag_res_data_default[65], 7, 0}, {"marquee", (void *) &lxb_tag_res_data_default[121], 7, 0}, {"feblend", (void *) &lxb_tag_res_data_default[56], 7, 4}, {"optgroup", (void *) &lxb_tag_res_data_default[142], 8, 0}, - {"video", (void *) &lxb_tag_res_data_default[193], 5, 10}, {"u", (void *) &lxb_tag_res_data_default[190], 1, 0}, + {"video", (void *) &lxb_tag_res_data_default[195], 5, 10}, {"u", (void *) &lxb_tag_res_data_default[192], 1, 0}, {"iframe", (void *) &lxb_tag_res_data_default[103], 6, 0}, {"animatecolor", (void *) &lxb_tag_res_data_default[13], 12, 0}, {"output", (void *) &lxb_tag_res_data_default[144], 6, 0}, {"figcaption", (void *) &lxb_tag_res_data_default[82], 10, 0}, {"mglyph", (void *) &lxb_tag_res_data_default[127], 6, 0}, {"!--", (void *) &lxb_tag_res_data_default[4], 3, 0}, {"fefuncg", (void *) &lxb_tag_res_data_default[68], 7, 0}, {"aside", (void *) &lxb_tag_res_data_default[20], 5, 0}, - {"style", (void *) &lxb_tag_res_data_default[171], 5, 0}, {"strike", (void *) &lxb_tag_res_data_default[169], 6, 0}, + {"style", (void *) &lxb_tag_res_data_default[173], 5, 0}, {"strike", (void *) &lxb_tag_res_data_default[171], 6, 0}, {"header", (void *) &lxb_tag_res_data_default[98], 6, 0}, {"glyphref", (void *) &lxb_tag_res_data_default[90], 8, 23}, {"label", (void *) &lxb_tag_res_data_default[111], 5, 0}, {"feconvolvematrix", (void *) &lxb_tag_res_data_default[60], 16, 0}, - {"altglyphdef", (void *) &lxb_tag_res_data_default[11], 11, 0}, {"title", (void *) &lxb_tag_res_data_default[186], 5, 0}, + {"altglyphdef", (void *) &lxb_tag_res_data_default[11], 11, 0}, {"title", (void *) &lxb_tag_res_data_default[188], 5, 0}, {"head", (void *) &lxb_tag_res_data_default[97], 4, 0}, {"noframes", (void *) &lxb_tag_res_data_default[138], 8, 0}, {"code", (void *) &lxb_tag_res_data_default[39], 4, 30}, {"rb", (void *) &lxb_tag_res_data_default[154], 2, 5}, {"blink", (void *) &lxb_tag_res_data_default[29], 5, 0}, {"image", (void *) &lxb_tag_res_data_default[104], 5, 0}, {"col", (void *) &lxb_tag_res_data_default[40], 3, 8}, {"object", (void *) &lxb_tag_res_data_default[140], 6, 12}, - {"template", (void *) &lxb_tag_res_data_default[179], 8, 36}, {"h2", (void *) &lxb_tag_res_data_default[92], 2, 13}, + {"template", (void *) &lxb_tag_res_data_default[181], 8, 36}, {"h2", (void *) &lxb_tag_res_data_default[92], 2, 13}, {"lineargradient", (void *) &lxb_tag_res_data_default[114], 14, 0}, {"math", (void *) &lxb_tag_res_data_default[122], 4, 0}, {"base", (void *) &lxb_tag_res_data_default[23], 4, 45}, {"dl", (void *) &lxb_tag_res_data_default[52], 2, 14}, - {"del", (void *) &lxb_tag_res_data_default[45], 3, 16}, {"svg", (void *) &lxb_tag_res_data_default[175], 3, 17}, + {"del", (void *) &lxb_tag_res_data_default[45], 3, 16}, {"svg", (void *) &lxb_tag_res_data_default[177], 3, 17}, {"dir", (void *) &lxb_tag_res_data_default[50], 3, 0}, {"article", (void *) &lxb_tag_res_data_default[19], 7, 0}, - {"strong", (void *) &lxb_tag_res_data_default[170], 6, 0}, {"dialog", (void *) &lxb_tag_res_data_default[49], 6, 0}, - {"details", (void *) &lxb_tag_res_data_default[47], 7, 0}, {"textpath", (void *) &lxb_tag_res_data_default[181], 8, 52}, + {"strong", (void *) &lxb_tag_res_data_default[172], 6, 0}, {"dialog", (void *) &lxb_tag_res_data_default[49], 6, 0}, + {"details", (void *) &lxb_tag_res_data_default[47], 7, 0}, {"textpath", (void *) &lxb_tag_res_data_default[183], 8, 52}, {"mark", (void *) &lxb_tag_res_data_default[120], 4, 0}, {"basefont", (void *) &lxb_tag_res_data_default[24], 8, 0}, {"fediffuselighting", (void *) &lxb_tag_res_data_default[61], 17, 0}, {"fespecularlighting", (void *) &lxb_tag_res_data_default[77], 18, 0}, {"blockquote", (void *) &lxb_tag_res_data_default[30], 10, 0}, {"script", (void *) &lxb_tag_res_data_default[161], 6, 58}, {"malignmark", (void *) &lxb_tag_res_data_default[118], 10, 0}, {"hr", (void *) &lxb_tag_res_data_default[100], 2, 18}, - {"source", (void *) &lxb_tag_res_data_default[166], 6, 19}, {"mn", (void *) &lxb_tag_res_data_default[129], 2, 0}, - {"select", (void *) &lxb_tag_res_data_default[163], 6, 0}, {"main", (void *) &lxb_tag_res_data_default[117], 4, 20}, + {"source", (void *) &lxb_tag_res_data_default[168], 6, 19}, {"mn", (void *) &lxb_tag_res_data_default[129], 2, 0}, + {"select", (void *) &lxb_tag_res_data_default[164], 6, 0}, {"main", (void *) &lxb_tag_res_data_default[117], 4, 20}, {"fieldset", (void *) &lxb_tag_res_data_default[81], 8, 62}, {"ins", (void *) &lxb_tag_res_data_default[107], 3, 0}, {"frameset", (void *) &lxb_tag_res_data_default[89], 8, 0}, {"button", (void *) &lxb_tag_res_data_default[33], 6, 0}, {"fecolormatrix", (void *) &lxb_tag_res_data_default[57], 13, 0}, {"q", (void *) &lxb_tag_res_data_default[152], 1, 0}, - {"animatemotion", (void *) &lxb_tag_res_data_default[14], 13, 0}, {"time", (void *) &lxb_tag_res_data_default[185], 4, 21}, - {"table", (void *) &lxb_tag_res_data_default[176], 5, 25}, {"h6", (void *) &lxb_tag_res_data_default[96], 2, 26}, + {"animatemotion", (void *) &lxb_tag_res_data_default[14], 13, 0}, {"time", (void *) &lxb_tag_res_data_default[187], 4, 21}, + {"table", (void *) &lxb_tag_res_data_default[178], 5, 25}, {"h6", (void *) &lxb_tag_res_data_default[96], 2, 26}, {"cite", (void *) &lxb_tag_res_data_default[37], 4, 28}, {"img", (void *) &lxb_tag_res_data_default[105], 3, 34}, {"fepointlight", (void *) &lxb_tag_res_data_default[76], 12, 0}, {"audio", (void *) &lxb_tag_res_data_default[21], 5, 0}, {"#end-of-file", (void *) &lxb_tag_res_data_default[1], 12, 0}, {"noscript", (void *) &lxb_tag_res_data_default[139], 8, 0}, - {"foreignobject", (void *) &lxb_tag_res_data_default[86], 13, 0}, {"spacer", (void *) &lxb_tag_res_data_default[167], 6, 0}, - {"samp", (void *) &lxb_tag_res_data_default[160], 4, 0}, {"altglyphitem", (void *) &lxb_tag_res_data_default[12], 12, 0}, - {"dt", (void *) &lxb_tag_res_data_default[53], 2, 0}, {"data", (void *) &lxb_tag_res_data_default[42], 4, 0}, + {"foreignobject", (void *) &lxb_tag_res_data_default[86], 13, 77}, {"selectedcontent", (void *) &lxb_tag_res_data_default[165], 15, 0}, + {"spacer", (void *) &lxb_tag_res_data_default[169], 6, 0}, {"samp", (void *) &lxb_tag_res_data_default[160], 4, 0}, + {"altglyphitem", (void *) &lxb_tag_res_data_default[12], 12, 0}, {"data", (void *) &lxb_tag_res_data_default[42], 4, 0}, {"mtext", (void *) &lxb_tag_res_data_default[132], 5, 0}, {"path", (void *) &lxb_tag_res_data_default[147], 4, 0}, - {"input", (void *) &lxb_tag_res_data_default[106], 5, 0}, {"th", (void *) &lxb_tag_res_data_default[183], 2, 38}, - {"p", (void *) &lxb_tag_res_data_default[145], 1, 0}, {"animatetransform", (void *) &lxb_tag_res_data_default[15], 16, 0}, - {"datalist", (void *) &lxb_tag_res_data_default[43], 8, 0}, {"small", (void *) &lxb_tag_res_data_default[165], 5, 0}, + {"input", (void *) &lxb_tag_res_data_default[106], 5, 0}, {"th", (void *) &lxb_tag_res_data_default[185], 2, 38}, + {"p", (void *) &lxb_tag_res_data_default[145], 1, 0}, {"dt", (void *) &lxb_tag_res_data_default[53], 2, 0}, + {"animatetransform", (void *) &lxb_tag_res_data_default[15], 16, 0}, {"datalist", (void *) &lxb_tag_res_data_default[43], 8, 0}, {"b", (void *) &lxb_tag_res_data_default[22], 1, 46}, {"nextid", (void *) &lxb_tag_res_data_default[135], 6, 47}, - {"noembed", (void *) &lxb_tag_res_data_default[137], 7, 0}, {"nav", (void *) &lxb_tag_res_data_default[134], 3, 0}, - {"bgsound", (void *) &lxb_tag_res_data_default[27], 7, 0}, {"slot", (void *) &lxb_tag_res_data_default[164], 4, 0}, - {"param", (void *) &lxb_tag_res_data_default[146], 5, 0}, {"font", (void *) &lxb_tag_res_data_default[84], 4, 53}, - {"figure", (void *) &lxb_tag_res_data_default[83], 6, 0}, {"femerge", (void *) &lxb_tag_res_data_default[72], 7, 0}, - {"femergenode", (void *) &lxb_tag_res_data_default[73], 11, 0}, {"feoffset", (void *) &lxb_tag_res_data_default[75], 8, 60}, - {"#text", (void *) &lxb_tag_res_data_default[2], 5, 0}, {"ul", (void *) &lxb_tag_res_data_default[191], 2, 0}, + {"noembed", (void *) &lxb_tag_res_data_default[137], 7, 0}, {"small", (void *) &lxb_tag_res_data_default[167], 5, 0}, + {"nav", (void *) &lxb_tag_res_data_default[134], 3, 0}, {"slot", (void *) &lxb_tag_res_data_default[166], 4, 0}, + {"search", (void *) &lxb_tag_res_data_default[162], 6, 0}, {"font", (void *) &lxb_tag_res_data_default[84], 4, 53}, + {"bgsound", (void *) &lxb_tag_res_data_default[27], 7, 0}, {"param", (void *) &lxb_tag_res_data_default[146], 5, 0}, + {"figure", (void *) &lxb_tag_res_data_default[83], 6, 0}, {"feoffset", (void *) &lxb_tag_res_data_default[75], 8, 60}, + {"#text", (void *) &lxb_tag_res_data_default[2], 5, 0}, {"femerge", (void *) &lxb_tag_res_data_default[72], 7, 0}, {"fespotlight", (void *) &lxb_tag_res_data_default[78], 11, 66}, {"form", (void *) &lxb_tag_res_data_default[87], 4, 72}, {"#document", (void *) &lxb_tag_res_data_default[3], 9, 76}, {"fedistantlight", (void *) &lxb_tag_res_data_default[63], 14, 0}, - {"track", (void *) &lxb_tag_res_data_default[188], 5, 0}, {"h3", (void *) &lxb_tag_res_data_default[93], 2, 77}, - {"h1", (void *) &lxb_tag_res_data_default[91], 2, 0}, {"i", (void *) &lxb_tag_res_data_default[102], 1, 0}, - {"altglyph", (void *) &lxb_tag_res_data_default[10], 8, 0}, {"legend", (void *) &lxb_tag_res_data_default[112], 6, 115}, - {"tbody", (void *) &lxb_tag_res_data_default[177], 5, 0}, {"address", (void *) &lxb_tag_res_data_default[9], 7, 0}, - {"caption", (void *) &lxb_tag_res_data_default[35], 7, 0}, {"option", (void *) &lxb_tag_res_data_default[143], 6, 0}, - {"sup", (void *) &lxb_tag_res_data_default[174], 3, 0}, {"body", (void *) &lxb_tag_res_data_default[31], 4, 78}, - {"progress", (void *) &lxb_tag_res_data_default[151], 8, 122}, {"acronym", (void *) &lxb_tag_res_data_default[8], 7, 0}, + {"track", (void *) &lxb_tag_res_data_default[190], 5, 0}, {"h3", (void *) &lxb_tag_res_data_default[93], 2, 78}, + {"femergenode", (void *) &lxb_tag_res_data_default[73], 11, 0}, {"i", (void *) &lxb_tag_res_data_default[102], 1, 0}, + {"ul", (void *) &lxb_tag_res_data_default[193], 2, 0}, {"h1", (void *) &lxb_tag_res_data_default[91], 2, 0}, + {"tbody", (void *) &lxb_tag_res_data_default[179], 5, 0}, {"altglyph", (void *) &lxb_tag_res_data_default[10], 8, 0}, + {"legend", (void *) &lxb_tag_res_data_default[112], 6, 117}, {"address", (void *) &lxb_tag_res_data_default[9], 7, 0}, + {"sup", (void *) &lxb_tag_res_data_default[176], 3, 0}, {"body", (void *) &lxb_tag_res_data_default[31], 4, 79}, + {"caption", (void *) &lxb_tag_res_data_default[35], 7, 0}, {"acronym", (void *) &lxb_tag_res_data_default[8], 7, 0}, + {"option", (void *) &lxb_tag_res_data_default[143], 6, 0}, {"progress", (void *) &lxb_tag_res_data_default[151], 8, 124}, {"fegaussianblur", (void *) &lxb_tag_res_data_default[70], 14, 0}, {NULL, NULL, 0, 0}, - {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, - {"mi", (void *) &lxb_tag_res_data_default[128], 2, 79}, {NULL, NULL, 0, 0}, - {"dfn", (void *) &lxb_tag_res_data_default[48], 3, 0}, {"a", (void *) &lxb_tag_res_data_default[6], 1, 80}, - {"listing", (void *) &lxb_tag_res_data_default[116], 7, 87}, {"span", (void *) &lxb_tag_res_data_default[168], 4, 0}, + {"mi", (void *) &lxb_tag_res_data_default[128], 2, 80}, {NULL, NULL, 0, 0}, + {"dfn", (void *) &lxb_tag_res_data_default[48], 3, 0}, {"a", (void *) &lxb_tag_res_data_default[6], 1, 87}, + {"listing", (void *) &lxb_tag_res_data_default[116], 7, 88}, {"span", (void *) &lxb_tag_res_data_default[170], 4, 0}, {"area", (void *) &lxb_tag_res_data_default[18], 4, 0}, {"clippath", (void *) &lxb_tag_res_data_default[38], 8, 0}, - {"section", (void *) &lxb_tag_res_data_default[162], 7, 0}, {"li", (void *) &lxb_tag_res_data_default[113], 2, 88}, + {"section", (void *) &lxb_tag_res_data_default[163], 7, 0}, {"li", (void *) &lxb_tag_res_data_default[113], 2, 89}, {NULL, NULL, 0, 0}, {"html", (void *) &lxb_tag_res_data_default[101], 4, 0}, {NULL, NULL, 0, 0}, {"fedropshadow", (void *) &lxb_tag_res_data_default[64], 12, 0}, {"embed", (void *) &lxb_tag_res_data_default[55], 5, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {"multicol", (void *) &lxb_tag_res_data_default[133], 8, 0}, - {"var", (void *) &lxb_tag_res_data_default[192], 3, 89}, {"rp", (void *) &lxb_tag_res_data_default[155], 2, 0}, + {"var", (void *) &lxb_tag_res_data_default[194], 3, 93}, {"rp", (void *) &lxb_tag_res_data_default[155], 2, 0}, {NULL, NULL, 0, 0}, {"link", (void *) &lxb_tag_res_data_default[115], 4, 0}, {"mo", (void *) &lxb_tag_res_data_default[130], 2, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {"annotation-xml", (void *) &lxb_tag_res_data_default[16], 14, 0}, @@ -510,54 +514,54 @@ {"fefuncb", (void *) &lxb_tag_res_data_default[67], 7, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {"meter", (void *) &lxb_tag_res_data_default[125], 5, 0}, {NULL, NULL, 0, 0}, - {NULL, NULL, 0, 0}, {"tt", (void *) &lxb_tag_res_data_default[189], 2, 0}, - {"big", (void *) &lxb_tag_res_data_default[28], 3, 93}, {NULL, NULL, 0, 0}, - {"tfoot", (void *) &lxb_tag_res_data_default[182], 5, 0}, {"desc", (void *) &lxb_tag_res_data_default[46], 4, 0}, + {NULL, NULL, 0, 0}, {"tt", (void *) &lxb_tag_res_data_default[191], 2, 0}, + {"big", (void *) &lxb_tag_res_data_default[28], 3, 94}, {NULL, NULL, 0, 0}, + {"tfoot", (void *) &lxb_tag_res_data_default[184], 5, 0}, {"desc", (void *) &lxb_tag_res_data_default[46], 4, 96}, {"isindex", (void *) &lxb_tag_res_data_default[108], 7, 0}, {NULL, NULL, 0, 0}, {"menu", (void *) &lxb_tag_res_data_default[123], 4, 0}, {"hgroup", (void *) &lxb_tag_res_data_default[99], 6, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, - {"wbr", (void *) &lxb_tag_res_data_default[194], 3, 0}, {NULL, NULL, 0, 0}, - {"pre", (void *) &lxb_tag_res_data_default[150], 3, 94}, {NULL, NULL, 0, 0}, + {"wbr", (void *) &lxb_tag_res_data_default[196], 3, 0}, {NULL, NULL, 0, 0}, + {"pre", (void *) &lxb_tag_res_data_default[150], 3, 98}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {"picture", (void *) &lxb_tag_res_data_default[148], 7, 0}, {"h4", (void *) &lxb_tag_res_data_default[94], 2, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, - {"meta", (void *) &lxb_tag_res_data_default[124], 4, 96}, {NULL, NULL, 0, 0}, + {"meta", (void *) &lxb_tag_res_data_default[124], 4, 99}, {NULL, NULL, 0, 0}, {"rtc", (void *) &lxb_tag_res_data_default[157], 3, 0}, {NULL, NULL, 0, 0}, - {"frame", (void *) &lxb_tag_res_data_default[88], 5, 0}, {"fetile", (void *) &lxb_tag_res_data_default[79], 6, 98}, - {"feimage", (void *) &lxb_tag_res_data_default[71], 7, 99}, {NULL, NULL, 0, 0}, - {"xmp", (void *) &lxb_tag_res_data_default[195], 3, 0}, {NULL, NULL, 0, 0}, - {"fecomposite", (void *) &lxb_tag_res_data_default[59], 11, 100}, {"feturbulence", (void *) &lxb_tag_res_data_default[80], 12, 0}, - {NULL, NULL, 0, 0}, {"summary", (void *) &lxb_tag_res_data_default[173], 7, 0}, + {"frame", (void *) &lxb_tag_res_data_default[88], 5, 0}, {"fetile", (void *) &lxb_tag_res_data_default[79], 6, 100}, + {"feimage", (void *) &lxb_tag_res_data_default[71], 7, 103}, {NULL, NULL, 0, 0}, + {"xmp", (void *) &lxb_tag_res_data_default[197], 3, 0}, {NULL, NULL, 0, 0}, + {"fecomposite", (void *) &lxb_tag_res_data_default[59], 11, 110}, {"feturbulence", (void *) &lxb_tag_res_data_default[80], 12, 0}, + {NULL, NULL, 0, 0}, {"summary", (void *) &lxb_tag_res_data_default[175], 7, 0}, {"mfenced", (void *) &lxb_tag_res_data_default[126], 7, 0}, {NULL, NULL, 0, 0}, - {"sub", (void *) &lxb_tag_res_data_default[172], 3, 0}, {"colgroup", (void *) &lxb_tag_res_data_default[41], 8, 0}, + {"sub", (void *) &lxb_tag_res_data_default[174], 3, 0}, {"colgroup", (void *) &lxb_tag_res_data_default[41], 8, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, - {NULL, NULL, 0, 0}, {"dd", (void *) &lxb_tag_res_data_default[44], 2, 103}, + {NULL, NULL, 0, 0}, {"dd", (void *) &lxb_tag_res_data_default[44], 2, 112}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, - {"div", (void *) &lxb_tag_res_data_default[51], 3, 0}, {"textarea", (void *) &lxb_tag_res_data_default[180], 8, 0}, + {"div", (void *) &lxb_tag_res_data_default[51], 3, 0}, {"textarea", (void *) &lxb_tag_res_data_default[182], 8, 0}, {"!doctype", (void *) &lxb_tag_res_data_default[5], 8, 0}, {"applet", (void *) &lxb_tag_res_data_default[17], 6, 0}, - {NULL, NULL, 0, 0}, {"br", (void *) &lxb_tag_res_data_default[32], 2, 110}, + {NULL, NULL, 0, 0}, {"br", (void *) &lxb_tag_res_data_default[32], 2, 113}, {NULL, NULL, 0, 0}, {"keygen", (void *) &lxb_tag_res_data_default[110], 6, 0}, {"kbd", (void *) &lxb_tag_res_data_default[109], 3, 0}, {NULL, NULL, 0, 0}, {"plaintext", (void *) &lxb_tag_res_data_default[149], 9, 0}, {"s", (void *) &lxb_tag_res_data_default[159], 1, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, - {"bdo", (void *) &lxb_tag_res_data_default[26], 3, 0}, {"td", (void *) &lxb_tag_res_data_default[178], 2, 0}, + {"bdo", (void *) &lxb_tag_res_data_default[26], 3, 0}, {"td", (void *) &lxb_tag_res_data_default[180], 2, 0}, {"fefunca", (void *) &lxb_tag_res_data_default[66], 7, 0}, {"ol", (void *) &lxb_tag_res_data_default[141], 2, 0}, - {"thead", (void *) &lxb_tag_res_data_default[184], 5, 0}, {"nobr", (void *) &lxb_tag_res_data_default[136], 4, 112}, - {NULL, NULL, 0, 0}, {"tr", (void *) &lxb_tag_res_data_default[187], 2, 0}, + {"thead", (void *) &lxb_tag_res_data_default[186], 5, 0}, {"nobr", (void *) &lxb_tag_res_data_default[136], 4, 115}, + {NULL, NULL, 0, 0}, {"tr", (void *) &lxb_tag_res_data_default[189], 2, 0}, {"map", (void *) &lxb_tag_res_data_default[119], 3, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, - {NULL, NULL, 0, 0}, {"#undef", (void *) &lxb_tag_res_data_default[0], 6, 113}, + {NULL, NULL, 0, 0}, {"#undef", (void *) &lxb_tag_res_data_default[0], 6, 116}, {"em", (void *) &lxb_tag_res_data_default[54], 2, 0}, {NULL, NULL, 0, 0}, {"bdi", (void *) &lxb_tag_res_data_default[25], 3, 0}, {"femorphology", (void *) &lxb_tag_res_data_default[74], 12, 0}, - {"ms", (void *) &lxb_tag_res_data_default[131], 2, 116}, {"footer", (void *) &lxb_tag_res_data_default[85], 6, 0}, - {"fefuncr", (void *) &lxb_tag_res_data_default[69], 7, 0}, {"rt", (void *) &lxb_tag_res_data_default[156], 2, 117}, + {"ms", (void *) &lxb_tag_res_data_default[131], 2, 120}, {"footer", (void *) &lxb_tag_res_data_default[85], 6, 0}, + {"fefuncr", (void *) &lxb_tag_res_data_default[69], 7, 0}, {"rt", (void *) &lxb_tag_res_data_default[156], 2, 122}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0}, {"h5", (void *) &lxb_tag_res_data_default[95], 2, 0}, - {NULL, NULL, 0, 0}, {"ruby", (void *) &lxb_tag_res_data_default[158], 4, 120}, + {NULL, NULL, 0, 0}, {"ruby", (void *) &lxb_tag_res_data_default[158], 4, 123}, {"canvas", (void *) &lxb_tag_res_data_default[34], 6, 0}, {NULL, NULL, 0, 0}, {NULL, NULL, 0, 0} }; diff -Nru php8.4-8.4.16/ext/dom/lexbor/patches/0001-Expose-line-and-column-information-for-use-in-PHP.patch php8.4-8.4.21/ext/dom/lexbor/patches/0001-Expose-line-and-column-information-for-use-in-PHP.patch --- php8.4-8.4.16/ext/dom/lexbor/patches/0001-Expose-line-and-column-information-for-use-in-PHP.patch 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/patches/0001-Expose-line-and-column-information-for-use-in-PHP.patch 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -From 4c133fe5adfe4b8ccdd8b014d884b685143b9e66 Mon Sep 17 00:00:00 2001 +From 0cd2add6c46400b808329442f81451b369863983 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Sat, 26 Aug 2023 15:08:59 +0200 Subject: [PATCH 1/6] Expose line and column information for use in PHP @@ -15,10 +15,10 @@ 8 files changed, 48 insertions(+), 5 deletions(-) diff --git a/source/lexbor/dom/interfaces/node.h b/source/lexbor/dom/interfaces/node.h -index b052cf5..b5d2c50 100644 +index 6c74ac5..b95373c 100644 --- a/source/lexbor/dom/interfaces/node.h +++ b/source/lexbor/dom/interfaces/node.h -@@ -83,6 +83,8 @@ struct lxb_dom_node { +@@ -86,6 +86,8 @@ struct lxb_dom_node { lxb_dom_node_type_t type; @@ -41,10 +41,10 @@ const lxb_char_t *text_start; const lxb_char_t *text_end; diff --git a/source/lexbor/html/tokenizer.c b/source/lexbor/html/tokenizer.c -index 741bced..0bd9aec 100644 +index 22b88ed..1d9f378 100644 --- a/source/lexbor/html/tokenizer.c +++ b/source/lexbor/html/tokenizer.c -@@ -91,6 +91,7 @@ lxb_html_tokenizer_init(lxb_html_tokenizer_t *tkz) +@@ -92,6 +92,7 @@ lxb_html_tokenizer_init(lxb_html_tokenizer_t *tkz) tkz->pos = tkz->start; tkz->end = tkz->start + LXB_HTML_TKZ_TEMP_SIZE; @@ -52,7 +52,7 @@ tkz->tree = NULL; tkz->tags = NULL; -@@ -152,6 +153,8 @@ lxb_html_tokenizer_inherit(lxb_html_tokenizer_t *tkz_to, +@@ -153,6 +154,8 @@ lxb_html_tokenizer_inherit(lxb_html_tokenizer_t *tkz_to, tkz_to->start = tkz_from->start; tkz_to->end = tkz_from->end; tkz_to->pos = tkz_to->start; @@ -61,7 +61,7 @@ return LXB_STATUS_OK; } -@@ -312,7 +315,26 @@ lxb_html_tokenizer_chunk(lxb_html_tokenizer_t *tkz, const lxb_char_t *data, +@@ -571,7 +574,26 @@ lxb_html_tokenizer_chunk(lxb_html_tokenizer_t *tkz, const lxb_char_t *data, tkz->last = end; while (data < end) { @@ -90,10 +90,10 @@ return tkz->status; diff --git a/source/lexbor/html/tokenizer.h b/source/lexbor/html/tokenizer.h -index ba9602f..74bb55e 100644 +index 12b7c81..aa1ac37 100644 --- a/source/lexbor/html/tokenizer.h +++ b/source/lexbor/html/tokenizer.h -@@ -73,6 +73,8 @@ struct lxb_html_tokenizer { +@@ -79,6 +79,8 @@ struct lxb_html_tokenizer { const lxb_char_t *end; const lxb_char_t *begin; const lxb_char_t *last; @@ -103,7 +103,7 @@ /* Entities */ const lexbor_sbst_entry_static_t *entity; diff --git a/source/lexbor/html/tokenizer/state.h b/source/lexbor/html/tokenizer/state.h -index 17939b9..5b095b4 100644 +index 5e91444..52eaa9a 100644 --- a/source/lexbor/html/tokenizer/state.h +++ b/source/lexbor/html/tokenizer/state.h @@ -90,6 +90,8 @@ extern "C" { @@ -116,10 +116,10 @@ while (0) diff --git a/source/lexbor/html/tree.c b/source/lexbor/html/tree.c -index ece26e9..91bfd17 100644 +index 062ea56..3f4c18d 100644 --- a/source/lexbor/html/tree.c +++ b/source/lexbor/html/tree.c -@@ -427,6 +427,9 @@ lxb_html_tree_create_element_for_token(lxb_html_tree_t *tree, +@@ -431,6 +431,9 @@ lxb_html_tree_create_element_for_token(lxb_html_tree_t *tree, return NULL; } @@ -129,7 +129,7 @@ lxb_status_t status; lxb_dom_element_t *element = lxb_dom_interface_element(node); -@@ -763,6 +766,11 @@ lxb_html_tree_insert_character_for_data(lxb_html_tree_t *tree, +@@ -767,6 +770,11 @@ lxb_html_tree_insert_character_for_data(lxb_html_tree_t *tree, lxb_dom_interface_text(text)->char_data.data = *str; @@ -141,7 +141,7 @@ if (ret_node != NULL) { *ret_node = text; } -@@ -802,6 +810,9 @@ lxb_html_tree_insert_comment(lxb_html_tree_t *tree, +@@ -806,6 +814,9 @@ lxb_html_tree_insert_comment(lxb_html_tree_t *tree, return NULL; } @@ -152,10 +152,10 @@ tree->document->dom_document.text); if (tree->status != LXB_STATUS_OK) { diff --git a/source/lexbor/html/tree/error.c b/source/lexbor/html/tree/error.c -index e6e43f4..88ad8c4 100644 +index ffdc55c..ef36eab 100644 --- a/source/lexbor/html/tree/error.c +++ b/source/lexbor/html/tree/error.c -@@ -21,8 +21,9 @@ lxb_html_tree_error_add(lexbor_array_obj_t *parse_errors, +@@ -22,8 +22,9 @@ lxb_html_tree_error_add(lexbor_array_obj_t *parse_errors, } entry->id = id; @@ -168,10 +168,10 @@ return entry; } diff --git a/source/lexbor/html/tree/error.h b/source/lexbor/html/tree/error.h -index 2fd06cb..ed1859f 100644 +index 7a212af..b186772 100644 --- a/source/lexbor/html/tree/error.h +++ b/source/lexbor/html/tree/error.h -@@ -97,8 +97,9 @@ lxb_html_tree_error_id_t; +@@ -109,8 +109,9 @@ lxb_html_tree_error_id_t; typedef struct { lxb_html_tree_error_id_t id; @@ -184,5 +184,5 @@ lxb_html_tree_error_t; -- -2.49.0 +2.51.2 diff -Nru php8.4-8.4.16/ext/dom/lexbor/patches/0002-Track-implied-added-nodes-for-options-use-in-PHP.patch php8.4-8.4.21/ext/dom/lexbor/patches/0002-Track-implied-added-nodes-for-options-use-in-PHP.patch --- php8.4-8.4.16/ext/dom/lexbor/patches/0002-Track-implied-added-nodes-for-options-use-in-PHP.patch 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/patches/0002-Track-implied-added-nodes-for-options-use-in-PHP.patch 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -From eb5e3769950cd9c0bc59066d94d6da9291f43af8 Mon Sep 17 00:00:00 2001 +From a4c29ba8d1ea1065ce6bd4a34382d53140cf1924 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Mon, 14 Aug 2023 20:18:51 +0200 Subject: [PATCH 2/6] Track implied added nodes for options use in PHP @@ -11,7 +11,7 @@ 4 files changed, 8 insertions(+) diff --git a/source/lexbor/html/tree.h b/source/lexbor/html/tree.h -index 9564608..8ad32a4 100644 +index 4912efb..7b2c620 100644 --- a/source/lexbor/html/tree.h +++ b/source/lexbor/html/tree.h @@ -55,6 +55,9 @@ struct lxb_html_tree { @@ -63,5 +63,5 @@ break; -- -2.49.0 +2.51.2 diff -Nru php8.4-8.4.16/ext/dom/lexbor/patches/0003-Patch-utilities-and-data-structure-to-be-able-to-gen.patch php8.4-8.4.21/ext/dom/lexbor/patches/0003-Patch-utilities-and-data-structure-to-be-able-to-gen.patch --- php8.4-8.4.16/ext/dom/lexbor/patches/0003-Patch-utilities-and-data-structure-to-be-able-to-gen.patch 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/patches/0003-Patch-utilities-and-data-structure-to-be-able-to-gen.patch 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -From de74c24d95342280266ebdac6f8dabc70ccfacab Mon Sep 17 00:00:00 2001 +From 46fc776449252e74795569759a19d13857a59069 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Thu, 24 Aug 2023 22:57:48 +0200 Subject: [PATCH 3/6] Patch utilities and data structure to be able to generate @@ -8,10 +8,10 @@ And change the actual field types to 32-bits. This decreases the hash tables in size. --- - source/lexbor/core/shs.h | 4 +- - utils/lexbor/encoding/single-byte.py | 2 +- - utils/lexbor/lexbor/LXB.py | 12 +- - 3 files changed, 12 insertions(+), 6 deletions(-) + source/lexbor/core/shs.h | 4 ++-- + utils/lexbor/encoding/single-byte.py | 4 ++-- + utils/lexbor/lexbor/LXB.py | 12 +++++++++--- + 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/source/lexbor/core/shs.h b/source/lexbor/core/shs.h index 7a63a07..c84dfaa 100644 @@ -30,7 +30,7 @@ lexbor_shs_hash_t; diff --git a/utils/lexbor/encoding/single-byte.py b/utils/lexbor/encoding/single-byte.py -index 9a85d54..ec2023c 100755 +index d7d1bb2..5420c16 100755 --- a/utils/lexbor/encoding/single-byte.py +++ b/utils/lexbor/encoding/single-byte.py @@ -128,7 +128,7 @@ class SingleByte: @@ -42,6 +42,15 @@ return hash_key.create(rate = 1) +@@ -161,7 +161,7 @@ def toHex(s): + lst = [] + + for ch in bytes(s, 'utf-8'): +- hv = hex(ch).replace('0x', '\\\\x') ++ hv = hex(ch).replace('0x', '\\x') + lst.append("'{}'".format(hv)) + + return ', '.join(lst) diff --git a/utils/lexbor/lexbor/LXB.py b/utils/lexbor/lexbor/LXB.py index 3e75812..2370c66 100755 --- a/utils/lexbor/lexbor/LXB.py @@ -84,5 +93,5 @@ result.append("};") -- -2.49.0 +2.51.2 diff -Nru php8.4-8.4.16/ext/dom/lexbor/patches/0004-Remove-unused-upper-case-tag-static-data.patch php8.4-8.4.21/ext/dom/lexbor/patches/0004-Remove-unused-upper-case-tag-static-data.patch --- php8.4-8.4.16/ext/dom/lexbor/patches/0004-Remove-unused-upper-case-tag-static-data.patch 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/patches/0004-Remove-unused-upper-case-tag-static-data.patch 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -From 1837e6a296a2bac71e37e566435542f208b4fa23 Mon Sep 17 00:00:00 2001 +From ae9d7254ac129cc3be34de6fd34af27baf3bb396 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Wed, 29 Nov 2023 21:26:47 +0100 Subject: [PATCH 4/6] Remove unused upper case tag static data @@ -9,10 +9,10 @@ 2 files changed, 4 insertions(+) diff --git a/source/lexbor/tag/res.h b/source/lexbor/tag/res.h -index c7190c5..4ad1f37 100644 +index 604757f..5672d4a 100644 --- a/source/lexbor/tag/res.h +++ b/source/lexbor/tag/res.h -@@ -224,6 +224,7 @@ static const lxb_tag_data_t lxb_tag_res_data_default[LXB_TAG__LAST_ENTRY] = +@@ -226,6 +226,7 @@ static const lxb_tag_data_t lxb_tag_res_data_default[LXB_TAG__LAST_ENTRY] = {{.u.short_str = "xmp", .length = 3, .next = NULL}, LXB_TAG_XMP, 1, true} }; @@ -20,13 +20,13 @@ static const lxb_tag_data_t lxb_tag_res_data_upper_default[LXB_TAG__LAST_ENTRY] = { {{.u.short_str = "#UNDEF", .length = 6, .next = NULL}, LXB_TAG__UNDEF, 1, true}, -@@ -423,6 +424,7 @@ static const lxb_tag_data_t lxb_tag_res_data_upper_default[LXB_TAG__LAST_ENTRY] +@@ -427,6 +428,7 @@ static const lxb_tag_data_t lxb_tag_res_data_upper_default[LXB_TAG__LAST_ENTRY] {{.u.short_str = "WBR", .length = 3, .next = NULL}, LXB_TAG_WBR, 1, true}, {{.u.short_str = "XMP", .length = 3, .next = NULL}, LXB_TAG_XMP, 1, true} }; +#endif - static const lexbor_shs_entry_t lxb_tag_res_shs_data_default[] = + static const lexbor_shs_entry_t lxb_tag_res_shs_data_default[263] = { diff --git a/source/lexbor/tag/tag.c b/source/lexbor/tag/tag.c index 780bc47..be5bb30 100644 @@ -49,5 +49,5 @@ /* * No inline functions for ABI. -- -2.49.0 +2.51.2 diff -Nru php8.4-8.4.16/ext/dom/lexbor/patches/0005-Shrink-size-of-static-binary-search-tree.patch php8.4-8.4.21/ext/dom/lexbor/patches/0005-Shrink-size-of-static-binary-search-tree.patch --- php8.4-8.4.16/ext/dom/lexbor/patches/0005-Shrink-size-of-static-binary-search-tree.patch 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/patches/0005-Shrink-size-of-static-binary-search-tree.patch 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -From 065923a993a004b8891ad3992c99e7e63e77bad3 Mon Sep 17 00:00:00 2001 +From 19cf6183813e013dfe0eb2303c15eaf6e01b9faf Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Wed, 29 Nov 2023 21:29:31 +0100 Subject: [PATCH 5/6] Shrink size of static binary search tree @@ -7,10 +7,9 @@ --- source/lexbor/core/sbst.h | 19 ++++++++++++++----- source/lexbor/html/tokenizer/state.c | 2 +- - utils/lexbor/html/tmp/tokenizer_res.h | 2 +- - utils/lexbor/html/tokenizer_entities_bst.py | 10 +++++----- + utils/lexbor/html/tokenizer_entities_bst.py | 8 ++++---- utils/lexbor/lexbor/LXB.py | 2 +- - 5 files changed, 21 insertions(+), 12 deletions(-) + 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/source/lexbor/core/sbst.h b/source/lexbor/core/sbst.h index b0fbc54..15a1d40 100644 @@ -48,10 +47,10 @@ lexbor_sbst_entry_static_t; diff --git a/source/lexbor/html/tokenizer/state.c b/source/lexbor/html/tokenizer/state.c -index 158aade..207b909 100644 +index db362c6..6c3cbeb 100644 --- a/source/lexbor/html/tokenizer/state.c +++ b/source/lexbor/html/tokenizer/state.c -@@ -1820,7 +1820,7 @@ lxb_html_tokenizer_state_char_ref_named(lxb_html_tokenizer_t *tkz, +@@ -1825,7 +1825,7 @@ lxb_html_tokenizer_state_char_ref_named(lxb_html_tokenizer_t *tkz, goto done; } @@ -60,21 +59,8 @@ tkz->entity_end = (tkz->pos + (data - begin)) - tkz->start; tkz->entity_match = entry; } -diff --git a/utils/lexbor/html/tmp/tokenizer_res.h b/utils/lexbor/html/tmp/tokenizer_res.h -index b3701d5..73ab66e 100644 ---- a/utils/lexbor/html/tmp/tokenizer_res.h -+++ b/utils/lexbor/html/tmp/tokenizer_res.h -@@ -6,7 +6,7 @@ - - /* - * Caution!!! Important!!! -- * This file generated by the script -+ * This file is generated by the script - * "utils/lexbor/html/tokenizer_entities_bst.py"! - * Do not change this file! - */ diff --git a/utils/lexbor/html/tokenizer_entities_bst.py b/utils/lexbor/html/tokenizer_entities_bst.py -index 4fa0999..8bd83b2 100755 +index b34bca1..2bfea81 100755 --- a/utils/lexbor/html/tokenizer_entities_bst.py +++ b/utils/lexbor/html/tokenizer_entities_bst.py @@ -1,6 +1,6 @@ @@ -112,15 +98,8 @@ lst.append(hv) return ''.join(lst) -@@ -210,5 +210,5 @@ def entities_bst_print(bst): - - if __name__ == "__main__": - entities_bst("tmp/tokenizer_res.h", -- "../../../source/lexbor/html/tokenizer_res.h", -+ "../../../source/lexbor/html/tokenizer/res.h", - "data/entities.json"); diff --git a/utils/lexbor/lexbor/LXB.py b/utils/lexbor/lexbor/LXB.py -index 3e75812..b068ea3 100755 +index 2370c66..c41e645 100755 --- a/utils/lexbor/lexbor/LXB.py +++ b/utils/lexbor/lexbor/LXB.py @@ -27,7 +27,7 @@ class Temp: @@ -133,5 +112,5 @@ fh.close() -- -2.49.0 +2.51.2 diff -Nru php8.4-8.4.16/ext/dom/lexbor/patches/0006-Patch-out-unused-CSS-style-code.patch php8.4-8.4.21/ext/dom/lexbor/patches/0006-Patch-out-unused-CSS-style-code.patch --- php8.4-8.4.16/ext/dom/lexbor/patches/0006-Patch-out-unused-CSS-style-code.patch 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/patches/0006-Patch-out-unused-CSS-style-code.patch 2026-05-05 16:34:12.000000000 +0000 @@ -1,19 +1,17 @@ -From fbb1e8945c4b12d43e7fddc3c34670b5792e2dca Mon Sep 17 00:00:00 2001 +From 54399ee441d922d89c32909e2028f899f6091cd6 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Sun, 7 Jan 2024 21:59:28 +0100 Subject: [PATCH 6/6] Patch out unused CSS style code --- - source/lexbor/css/rule.h | 2 ++ - source/lexbor/style/dom/interfaces/document.c | 12 ++++++++---- - source/lexbor/style/html/interfaces/document.h | 2 ++ - 3 files changed, 12 insertions(+), 4 deletions(-) + source/lexbor/css/rule.h | 2 ++ + 1 file changed, 2 insertions(+) diff --git a/source/lexbor/css/rule.h b/source/lexbor/css/rule.h -index 7cc4f0b..bd191f9 100644 +index 308dced..d192a01 100644 --- a/source/lexbor/css/rule.h +++ b/source/lexbor/css/rule.h -@@ -339,6 +339,7 @@ lxb_css_rule_ref_dec(lxb_css_rule_t *rule) +@@ -361,6 +361,7 @@ lxb_css_rule_ref_dec(lxb_css_rule_t *rule) lxb_inline void lxb_css_rule_ref_dec_destroy(lxb_css_rule_t *rule) { @@ -21,7 +19,7 @@ if (rule->ref_count > 0) { rule->ref_count--; } -@@ -346,6 +347,7 @@ lxb_css_rule_ref_dec_destroy(lxb_css_rule_t *rule) +@@ -368,6 +369,7 @@ lxb_css_rule_ref_dec_destroy(lxb_css_rule_t *rule) if (rule->ref_count == 0) { (void) lxb_css_rule_destroy(rule, true); } @@ -29,96 +27,6 @@ } lxb_inline void -diff --git a/source/lexbor/style/dom/interfaces/document.c b/source/lexbor/style/dom/interfaces/document.c -index 8a63e8e..f885dc3 100644 ---- a/source/lexbor/style/dom/interfaces/document.c -+++ b/source/lexbor/style/dom/interfaces/document.c -@@ -280,6 +280,7 @@ lxb_status_t - lxb_dom_document_stylesheet_apply(lxb_dom_document_t *document, - lxb_css_stylesheet_t *sst) - { -+#if 0 - lxb_status_t status = LXB_STATUS_OK; - lxb_css_rule_t *rule; - lxb_css_rule_list_t *list; -@@ -310,7 +311,7 @@ lxb_dom_document_stylesheet_apply(lxb_dom_document_t *document, - - rule = rule->next; - } -- -+#endif - return LXB_STATUS_OK; - } - -@@ -329,6 +330,7 @@ lxb_status_t - lxb_dom_document_stylesheet_remove(lxb_dom_document_t *document, - lxb_css_stylesheet_t *sst) - { -+#if 0 - size_t i, length; - lxb_status_t status = LXB_STATUS_OK; - lxb_css_rule_t *rule; -@@ -372,13 +374,14 @@ lxb_dom_document_stylesheet_remove(lxb_dom_document_t *document, - length = lexbor_array_length(document->css->stylesheets); - } - } -- -+#endif - return LXB_STATUS_OK; - } - - lxb_status_t - lxb_dom_document_element_styles_attach(lxb_dom_element_t *element) - { -+#if 0 - lxb_status_t status = LXB_STATUS_OK; - lxb_css_rule_t *rule; - lexbor_array_t *ssts; -@@ -413,7 +416,7 @@ lxb_dom_document_element_styles_attach(lxb_dom_element_t *element) - rule = rule->next; - } - } -- -+#endif - return LXB_STATUS_OK; - } - -@@ -521,6 +524,7 @@ lxb_dom_document_style_attach_cb(lxb_dom_node_t *node, - lxb_status_t - lxb_document_apply_stylesheets(lxb_dom_document_t *document) - { -+#if 0 - size_t i, length; - lxb_status_t status; - lxb_css_stylesheet_t *sst; -@@ -539,6 +543,6 @@ lxb_document_apply_stylesheets(lxb_dom_document_t *document) - return status; - } - } -- -+#endif - return LXB_STATUS_OK; - } -diff --git a/source/lexbor/style/html/interfaces/document.h b/source/lexbor/style/html/interfaces/document.h -index 0307cd9..127c4cd 100644 ---- a/source/lexbor/style/html/interfaces/document.h -+++ b/source/lexbor/style/html/interfaces/document.h -@@ -134,6 +134,7 @@ lxb_html_document_stylesheet_destroy_all(lxb_html_document_t *document, - destroy_memory); - } - -+#if 0 - lxb_inline lxb_status_t - lxb_html_document_style_attach(lxb_html_document_t *document, - lxb_css_rule_style_t *style) -@@ -158,6 +159,7 @@ lxb_html_document_style_attach_by_element(lxb_html_document_t *document, - return lxb_dom_document_style_attach_by_element(lxb_dom_interface_document(document), - element, style); - } -+#endif - - lxb_inline lxb_status_t - lxb_html_document_apply_stylesheets(lxb_html_document_t *document) -- -2.49.0 +2.51.2 diff -Nru php8.4-8.4.16/ext/dom/lexbor/patches/README.md php8.4-8.4.21/ext/dom/lexbor/patches/README.md --- php8.4-8.4.16/ext/dom/lexbor/patches/README.md 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/patches/README.md 2026-05-05 16:34:12.000000000 +0000 @@ -1,7 +1,10 @@ # Lexbor patches +> [!IMPORTANT] +> This process was largely automated in update-lexbor.sh. + Upon syncing the Lexbor sources, the patches in this directory need to be applied. -The current Lexbor version is 2.5.0. +The current Lexbor version is 2.7.0. ## Overview diff -Nru php8.4-8.4.16/ext/dom/lexbor/patches/update-lexbor.sh php8.4-8.4.21/ext/dom/lexbor/patches/update-lexbor.sh --- php8.4-8.4.16/ext/dom/lexbor/patches/update-lexbor.sh 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/lexbor/patches/update-lexbor.sh 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,63 @@ +#!/usr/bin/env bash + +set -e + +PATCHES_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +LEXBOR_REPO="https://github.com/lexbor/lexbor" +LEXBOR_REF="v2.7.0" +LEXBOR_BASE="$(cd "$PATCHES_DIR/.." && pwd)" +LEXBOR_DIR="$LEXBOR_BASE/lexbor" +LEXBOR_TMP_DIR="$LEXBOR_BASE/lexbor_tmp" +LEXBOR_COMPONENTS=(core css dom encoding html ns ports selectors tag) +LEXBOR_PRESERVED_FILES=( + selectors-adapted/selectors.c + selectors-adapted/selectors.h +) + +# Clone +git clone "$LEXBOR_REPO" "$LEXBOR_TMP_DIR" +(cd "$LEXBOR_TMP_DIR" && git checkout "$LEXBOR_REF") + +# Apply patches +mapfile -t patches < <(ls "$PATCHES_DIR"/*.patch) +cd "$LEXBOR_TMP_DIR" +for patch in "${patches[@]}"; do + if ! git am -3 "$patch"; then + read -p "Patch $(basename "$patch") did not apply cleanly. Resolve, stage and press Enter to continue. " + git am --continue + fi +done + +# Refresh patches +NUM_PATCHES=${#patches[@]} +git format-patch "HEAD~$NUM_PATCHES" -o "$PATCHES_DIR" + +# Run code-generation tools +(cd "$LEXBOR_TMP_DIR/utils/lexbor/encoding" && python3 single-byte.py) +(cd "$LEXBOR_TMP_DIR/utils/lexbor/html" && python3 tokenizer_entities_bst.py) + +# (Re)move files +mv source/lexbor/encoding/multi_res.c source/lexbor/encoding/multi.c +mv source/lexbor/encoding/range_res.c source/lexbor/encoding/range.c +mv source/lexbor/encoding/single_res.c source/lexbor/encoding/single.c +rm source/lexbor/html/serialize.c +rm source/lexbor/ports/posix/lexbor/core/fs.c +rm source/lexbor/ports/posix/lexbor/core/perf.c +rm source/lexbor/ports/windows_nt/lexbor/core/fs.c +rm source/lexbor/ports/windows_nt/lexbor/core/perf.c +find . -name "*.cmake" -delete + +# Copy preserved files +for f in "${LEXBOR_PRESERVED_FILES[@]}"; do + dst="source/lexbor/$f" + mkdir -p "$(dirname "$dst")" + cp "$LEXBOR_DIR/$f" "$dst" +done + +# Replace components +for dir in "${LEXBOR_COMPONENTS[@]}"; do + dst="$LEXBOR_DIR/$dir" + rm -rf "$dst" + cp -r "source/lexbor/$dir" "$dst" +done +rm -rf "$LEXBOR_TMP_DIR" diff -Nru php8.4-8.4.16/ext/dom/node.c php8.4-8.4.21/ext/dom/node.c --- php8.4-8.4.16/ext/dom/node.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/node.c 2026-05-05 16:34:12.000000000 +0000 @@ -287,7 +287,18 @@ { DOM_PROP_NODE(xmlNodePtr, nodep, obj); - php_dom_create_iterator(retval, DOM_NODELIST, php_dom_follow_spec_intern(obj)); + php_dom_create_iterator(retval, DOM_NODELIST, false); + dom_object *intern = Z_DOMOBJ_P(retval); + dom_namednode_iter(obj, XML_ELEMENT_NODE, intern, NULL, NULL, 0, NULL, 0); + + return SUCCESS; +} + +zend_result dom_modern_node_child_nodes_read(dom_object *obj, zval *retval) +{ + DOM_PROP_NODE(xmlNodePtr, nodep, obj); + + php_dom_create_iterator(retval, DOM_NODELIST, true); dom_object *intern = Z_DOMOBJ_P(retval); dom_namednode_iter(obj, XML_ELEMENT_NODE, intern, NULL, NULL, 0, NULL, 0); @@ -659,14 +670,25 @@ ZVAL_STRING(retval, (const char *) baseuri); xmlFree(baseuri); } else { - if (php_dom_follow_spec_intern(obj)) { - if (nodep->doc->URL) { - ZVAL_STRING(retval, (const char *) nodep->doc->URL); - } else { - ZVAL_STRING(retval, "about:blank"); - } + ZVAL_NULL(retval); + } + + return SUCCESS; +} + +zend_result dom_modern_node_base_uri_read(dom_object *obj, zval *retval) +{ + DOM_PROP_NODE(xmlNodePtr, nodep, obj); + + xmlChar *baseuri = xmlNodeGetBase(nodep->doc, nodep); + if (baseuri) { + ZVAL_STRING(retval, (const char *) baseuri); + xmlFree(baseuri); + } else { + if (nodep->doc && nodep->doc->URL) { + ZVAL_STRING(retval, (const char *) nodep->doc->URL); } else { - ZVAL_NULL(retval); + ZVAL_STRING(retval, "about:blank"); } } @@ -2081,6 +2103,97 @@ } /* }}} end dom_node_lookup_namespace_uri */ +static void dom_relink_ns_decls_element(HashTable *links, xmlNodePtr node) +{ + if (node->type == XML_ELEMENT_NODE) { + for (xmlAttrPtr attr = node->properties; attr; attr = attr->next) { + if (php_dom_ns_is_fast((const xmlNode *) attr, php_dom_ns_is_xmlns_magic_token)) { + xmlNsPtr ns = xmlMalloc(sizeof(*ns)); + if (!ns) { + return; + } + + zval *zv = zend_hash_index_lookup(links, (zend_ulong) node); + if (Z_ISNULL_P(zv)) { + ZVAL_LONG(zv, 1); + } else { + Z_LVAL_P(zv)++; + } + + bool should_free; + xmlChar *attr_value = php_libxml_attr_value(attr, &should_free); + + memset(ns, 0, sizeof(*ns)); + ns->type = XML_LOCAL_NAMESPACE; + ns->href = should_free ? attr_value : xmlStrdup(attr_value); + ns->prefix = attr->ns->prefix ? xmlStrdup(attr->name) : NULL; + ns->next = node->nsDef; + node->nsDef = ns; + + ns->_private = attr; + if (attr->prev) { + attr->prev->next = attr->next; + } else { + node->properties = attr->next; + } + if (attr->next) { + attr->next->prev = attr->prev; + } + } + } + + /* The default namespace is handled separately from the other namespaces in C14N. + * The default namespace is explicitly looked up while the other namespaces are + * deduplicated and compared to a list of visible namespaces. */ + if (node->ns && !node->ns->prefix) { + /* Workaround for the behaviour where the xmlSearchNs() call inside c14n.c + * can return the current namespace. */ + zend_hash_index_add_new_ptr(links, (zend_ulong) node | 1, node->ns); + node->ns = xmlSearchNs(node->doc, node, NULL); + } + } +} + +static void dom_relink_ns_decls(HashTable *links, xmlNodePtr root) +{ + dom_relink_ns_decls_element(links, root); + + xmlNodePtr base = root; + xmlNodePtr node = base->children; + while (node != NULL) { + dom_relink_ns_decls_element(links, node); + node = php_dom_next_in_tree_order(node, base); + } +} + +static void dom_unlink_ns_decls(HashTable *links) +{ + ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(links, zend_ulong h, zval *data) { + if (h & 1) { + xmlNodePtr node = (xmlNodePtr) (h ^ 1); + node->ns = Z_PTR_P(data); + } else { + xmlNodePtr node = (xmlNodePtr) h; + while (Z_LVAL_P(data)-- > 0) { + xmlNsPtr ns = node->nsDef; + node->nsDef = ns->next; + + xmlAttrPtr attr = ns->_private; + if (attr->prev) { + attr->prev->next = attr; + } else { + node->properties = attr; + } + if (attr->next) { + attr->next->prev = attr; + } + + xmlFreeNs(ns); + } + } + } ZEND_HASH_FOREACH_END(); +} + static int dom_canonicalize_node_parent_lookup_cb(void *user_data, xmlNodePtr node, xmlNodePtr parent) { xmlNodePtr root = user_data; @@ -2136,7 +2249,27 @@ docp = nodep->doc; - if (! docp) { + HashTable links; + bool modern = php_dom_follow_spec_node(nodep); + if (modern) { + xmlNodePtr root = nodep; + while (root->parent) { + root = root->parent; + } + + if (UNEXPECTED(root->type != XML_DOCUMENT_NODE && root->type != XML_HTML_DOCUMENT_NODE)) { + php_dom_throw_error_with_message(HIERARCHY_REQUEST_ERR, "Canonicalization can only happen on nodes attached to a document.", /* strict */ true); + RETURN_THROWS(); + } + + zend_hash_init(&links, 0, NULL, NULL, false); + xmlNodePtr root_element = xmlDocGetRootElement(docp); + + if (root_element) { + dom_relink_ns_decls(&links, root_element); + } + } else if (!docp) { + /* Note: not triggerable with modern DOM */ zend_throw_error(NULL, "Node must be associated with a document"); RETURN_THROWS(); } @@ -2158,12 +2291,12 @@ if (!tmp) { /* if mode == 0 then $xpath arg is 3, if mode == 1 then $xpath is 4 */ zend_argument_value_error(3 + mode, "must have a \"query\" key"); - RETURN_THROWS(); + goto clean_links; } if (Z_TYPE_P(tmp) != IS_STRING) { /* if mode == 0 then $xpath arg is 3, if mode == 1 then $xpath is 4 */ zend_argument_type_error(3 + mode, "\"query\" option must be a string, %s given", zend_zval_value_name(tmp)); - RETURN_THROWS(); + goto clean_links; } xquery = Z_STRVAL_P(tmp); @@ -2195,7 +2328,7 @@ } xmlXPathFreeContext(ctxp); zend_throw_error(NULL, "XPath query did not return a nodeset"); - RETURN_THROWS(); + goto clean_links; } } @@ -2264,6 +2397,12 @@ RETURN_LONG(bytes); } } + +clean_links: + if (modern) { + dom_unlink_ns_decls(&links); + zend_hash_destroy(&links); + } } /* }}} */ diff -Nru php8.4-8.4.16/ext/dom/php_dom.c php8.4-8.4.21/ext/dom/php_dom.c --- php8.4-8.4.16/ext/dom/php_dom.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/php_dom.c 2026-05-05 16:34:12.000000000 +0000 @@ -697,15 +697,17 @@ zend_object *clone = dom_objects_namespace_node_new(intern->dom.std.ce); dom_object_namespace_node *clone_intern = php_dom_namespace_node_obj_from_obj(clone); - xmlNodePtr original_node = dom_object_get_node(&intern->dom); - ZEND_ASSERT(original_node->type == XML_NAMESPACE_DECL); - xmlNodePtr cloned_node = php_dom_create_fake_namespace_decl_node_ptr(original_node->parent, original_node->ns); - if (intern->parent_intern) { clone_intern->parent_intern = intern->parent_intern; GC_ADDREF(&clone_intern->parent_intern->std); } - dom_update_refcount_after_clone(&intern->dom, original_node, &clone_intern->dom, cloned_node); + + xmlNodePtr original_node = dom_object_get_node(&intern->dom); + if (original_node != NULL) { + ZEND_ASSERT(original_node->type == XML_NAMESPACE_DECL); + xmlNodePtr cloned_node = php_dom_create_fake_namespace_decl_node_ptr(original_node->parent, original_node->ns); + dom_update_refcount_after_clone(&intern->dom, original_node, &clone_intern->dom, cloned_node); + } zend_objects_clone_members(clone, &intern->dom.std); return clone; @@ -890,12 +892,12 @@ zend_hash_init(&dom_modern_node_prop_handlers, 0, NULL, NULL, true); DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "nodeType", dom_node_node_type_read, NULL); DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "nodeName", dom_node_node_name_read, NULL); - DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "baseURI", dom_node_base_uri_read, NULL); + DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "baseURI", dom_modern_node_base_uri_read, NULL); DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "isConnected", dom_node_is_connected_read, NULL); DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "ownerDocument", dom_node_owner_document_read, NULL); DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "parentNode", dom_node_parent_node_read, NULL); DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "parentElement", dom_node_parent_element_read, NULL); - DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "childNodes", dom_node_child_nodes_read, NULL); + DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "childNodes", dom_modern_node_child_nodes_read, NULL); DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "firstChild", dom_node_first_child_read, NULL); DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "lastChild", dom_node_last_child_read, NULL); DOM_REGISTER_PROP_HANDLER(&dom_modern_node_prop_handlers, "previousSibling", dom_node_previous_sibling_read, NULL); @@ -1292,7 +1294,7 @@ DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "firstChild", dom_entity_reference_child_read, NULL); DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "lastChild", dom_entity_reference_child_read, NULL); DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "textContent", dom_entity_reference_text_content_read, NULL); - DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "childNodes", dom_entity_reference_child_nodes_read, NULL); + DOM_OVERWRITE_PROP_HANDLER(&dom_modern_entity_reference_prop_handlers, "childNodes", dom_modern_entity_reference_child_nodes_read, NULL); zend_hash_add_new_ptr(&classes, dom_modern_entityreference_class_entry->name, &dom_modern_entity_reference_prop_handlers); dom_processinginstruction_class_entry = register_class_DOMProcessingInstruction(dom_node_class_entry); diff -Nru php8.4-8.4.16/ext/dom/tests/canonicalization.phpt php8.4-8.4.21/ext/dom/tests/canonicalization.phpt --- php8.4-8.4.16/ext/dom/tests/canonicalization.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/canonicalization.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -21,32 +21,46 @@ $dom->loadXML($xml); $doc = $dom->documentElement->firstChild; +$newDom = Dom\XMLDocument::createFromString($xml); +$newDoc = $newDom->documentElement->firstChild; +$counter = 0; + +function check($doc, $newDoc, ...$args) { + global $counter; + $counter++; + echo $doc->C14N(...$args)."\n\n"; + if ($doc->C14N(...$args) !== $newDoc->C14N(...$args)) { + var_dump($doc->C14N(...$args), $newDoc->C14N(...$args)); + throw new Error("mismatch: $counter"); + } +} + /* inclusive/without comments first child element of doc element is context. */ -echo $doc->C14N()."\n\n"; +check($doc, $newDoc); /* exclusive/without comments first child element of doc element is context. */ -echo $doc->c14N(TRUE)."\n\n"; +check($doc, $newDoc, TRUE); /* inclusive/with comments first child element of doc element is context. */ -echo $doc->C14N(FALSE, TRUE)."\n\n"; +check($doc, $newDoc, FALSE, TRUE); /* exclusive/with comments first child element of doc element is context. */ -echo $doc->C14N(TRUE, TRUE)."\n\n"; +check($doc, $newDoc, TRUE, TRUE); /* exclusive/without comments using xpath query. */ -echo $doc->c14N(TRUE, FALSE, array('query'=>'(//. | //@* | //namespace::*)'))."\n\n"; +check($doc, $newDoc, TRUE, FALSE, array('query'=>'(//. | //@* | //namespace::*)'))."\n\n"; /* exclusive/without comments first child element of doc element is context. using xpath query with registered namespace. test namespace prefix is also included. */ -echo $doc->c14N(TRUE, FALSE, +check($doc, $newDoc, TRUE, FALSE, array('query'=>'(//a:contain | //a:bar | .//namespace::*)', 'namespaces'=>array('a'=>'http://www.example.com/ns/foo')), - array('test'))."\n\n"; + array('test')); /* exclusive/without comments first child element of doc element is context. test namespace prefix is also included */ -echo $doc->C14N(TRUE, FALSE, NULL, array('test')); +check($doc, $newDoc, TRUE, FALSE, NULL, array('test')); ?> --EXPECT-- diff -Nru php8.4-8.4.16/ext/dom/tests/gh20722.phpt php8.4-8.4.21/ext/dom/tests/gh20722.phpt --- php8.4-8.4.16/ext/dom/tests/gh20722.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/gh20722.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,13 @@ +--TEST-- +GH-20722 (Null pointer dereference in DOM namespace node cloning via clone on malformed objects) +--EXTENSIONS-- +dom +--FILE-- + +--EXPECT-- +Done diff -Nru php8.4-8.4.16/ext/dom/tests/modern/common/gh21077.phpt php8.4-8.4.21/ext/dom/tests/modern/common/gh21077.phpt --- php8.4-8.4.16/ext/dom/tests/modern/common/gh21077.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/modern/common/gh21077.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,28 @@ +--TEST-- +GH-21077 (Accessing Dom\Node::baseURI can throw TypeError) +--EXTENSIONS-- +dom +--CREDITS-- +mbeccati +--FILE-- +createDocumentType('html', 'publicId', 'systemId'); + +var_dump($node->baseURI); + +$dom = Dom\XMLDocument::createEmpty(); +$dom->append($node = $dom->importNode($node)); + +var_dump($dom->saveXML()); + +var_dump($node->baseURI); + +?> +--EXPECT-- +string(11) "about:blank" +string(84) " + +" +string(11) "about:blank" diff -Nru php8.4-8.4.16/ext/dom/tests/modern/common/gh21097.phpt php8.4-8.4.21/ext/dom/tests/modern/common/gh21097.phpt --- php8.4-8.4.16/ext/dom/tests/modern/common/gh21097.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/modern/common/gh21097.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,49 @@ +--TEST-- +GH-21097 (Accessing Dom\Node properties can can throw TypeError(s)) +--EXTENSIONS-- +dom +--CREDITS-- +mbeccati +--FILE-- +createDocumentType('html', 'publicId', 'systemId'); + +$r = new \ReflectionClass($node); +foreach ($r->getProperties(\ReflectionProperty::IS_PUBLIC) as $p) { + echo $p->getName(), ": "; + var_dump($node->{$p->getName()}); +} + +?> +--EXPECT-- +nodeType: int(10) +nodeName: string(4) "html" +baseURI: string(11) "about:blank" +isConnected: bool(false) +ownerDocument: NULL +parentNode: NULL +parentElement: NULL +childNodes: object(Dom\NodeList)#24 (1) { + ["length"]=> + int(0) +} +firstChild: NULL +lastChild: NULL +previousSibling: NULL +nextSibling: NULL +nodeValue: NULL +textContent: string(0) "" +name: string(4) "html" +entities: object(Dom\DtdNamedNodeMap)#24 (1) { + ["length"]=> + int(0) +} +notations: object(Dom\DtdNamedNodeMap)#24 (1) { + ["length"]=> + int(0) +} +publicId: string(8) "publicId" +systemId: string(8) "systemId" +internalSubset: NULL diff -Nru php8.4-8.4.16/ext/dom/tests/modern/html/gh21688.phpt php8.4-8.4.21/ext/dom/tests/modern/html/gh21688.phpt --- php8.4-8.4.16/ext/dom/tests/modern/html/gh21688.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/modern/html/gh21688.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,13 @@ +--TEST-- +GH-21688 (SEGV in C14N on empty HTMLDocument) +--CREDITS-- +YuanchengJiang +--EXTENSIONS-- +dom +--FILE-- +C14N()); +?> +--EXPECT-- +string(0) "" diff -Nru php8.4-8.4.16/ext/dom/tests/modern/html/parser/Element_innerHTML.phpt php8.4-8.4.21/ext/dom/tests/modern/html/parser/Element_innerHTML.phpt --- php8.4-8.4.16/ext/dom/tests/modern/html/parser/Element_innerHTML.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/modern/html/parser/Element_innerHTML.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -60,6 +60,6 @@ - + diff -Nru php8.4-8.4.16/ext/dom/tests/modern/html/parser/gh21486.phpt php8.4-8.4.21/ext/dom/tests/modern/html/parser/gh21486.phpt --- php8.4-8.4.16/ext/dom/tests/modern/html/parser/gh21486.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/modern/html/parser/gh21486.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,18 @@ +--TEST-- +GH-21486 (Dom\HTMLDocument parser mangles xml:space and xml:lang attributes) +--EXTENSIONS-- +dom +--CREDITS-- +JKingweb +--FILE-- +"); +$e = $d->getElementsByTagName("div")[0]; +$e->innerHTML = ''; +$svg = $d->querySelector("svg"); +echo $e->innerHTML."\n"; +echo $svg->attributes[0]->localName." ".var_export($svg->attributes[0]->namespaceURI, true)."\n"; +?> +--EXPECT-- + +space 'http://www.w3.org/XML/1998/namespace' diff -Nru php8.4-8.4.16/ext/dom/tests/modern/spec/Document_implementation_createDocumentType.phpt php8.4-8.4.21/ext/dom/tests/modern/spec/Document_implementation_createDocumentType.phpt --- php8.4-8.4.16/ext/dom/tests/modern/spec/Document_implementation_createDocumentType.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/modern/spec/Document_implementation_createDocumentType.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -43,7 +43,7 @@ ["nodeName"]=> string(5) "qname" ["baseURI"]=> - NULL + string(11) "about:blank" ["isConnected"]=> bool(false) ["parentNode"]=> @@ -86,7 +86,7 @@ ["nodeName"]=> string(5) "qname" ["baseURI"]=> - NULL + string(11) "about:blank" ["isConnected"]=> bool(false) ["parentNode"]=> @@ -129,7 +129,7 @@ ["nodeName"]=> string(5) "qname" ["baseURI"]=> - NULL + string(11) "about:blank" ["isConnected"]=> bool(false) ["parentNode"]=> @@ -172,7 +172,7 @@ ["nodeName"]=> string(5) "qname" ["baseURI"]=> - NULL + string(11) "about:blank" ["isConnected"]=> bool(false) ["parentNode"]=> diff -Nru php8.4-8.4.16/ext/dom/tests/modern/xml/DTDNamedNodeMap.phpt php8.4-8.4.21/ext/dom/tests/modern/xml/DTDNamedNodeMap.phpt --- php8.4-8.4.16/ext/dom/tests/modern/xml/DTDNamedNodeMap.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/modern/xml/DTDNamedNodeMap.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -148,7 +148,7 @@ ["nodeName"]=> string(3) "GIF" ["baseURI"]=> - NULL + string(11) "about:blank" ["isConnected"]=> bool(false) ["parentNode"]=> diff -Nru php8.4-8.4.16/ext/dom/tests/modern/xml/canonicalize_unattached.phpt php8.4-8.4.21/ext/dom/tests/modern/xml/canonicalize_unattached.phpt --- php8.4-8.4.16/ext/dom/tests/modern/xml/canonicalize_unattached.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/modern/xml/canonicalize_unattached.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,20 @@ +--TEST-- +Canonicalize unattached node should fail +--EXTENSIONS-- +dom +--FILE-- +'); +$child = $d->documentElement->firstChild; +$child->remove(); + +try { + $child->C14N(); +} catch (Dom\DOMException $e) { + echo $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +Canonicalization can only happen on nodes attached to a document. diff -Nru php8.4-8.4.16/ext/dom/tests/modern/xml/gh20444.phpt php8.4-8.4.21/ext/dom/tests/modern/xml/gh20444.phpt --- php8.4-8.4.16/ext/dom/tests/modern/xml/gh20444.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/modern/xml/gh20444.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,43 @@ +--TEST-- +GH-20444 (Dom\XMLDocument::C14N() seems broken compared to DOMDocument::C14N()) +--EXTENSIONS-- +dom +--FILE-- + + + + abc + +EOF; + +$d = \Dom\XMLDocument::createFromString($xml); +var_dump($d->C14N(true)); + +$xml = << + + + + 123 + + +EOF; + +$d = \Dom\XMLDocument::createFromString($xml); +var_dump($d->C14N()); + +?> +--EXPECT-- +string(128) " + + abc +" +string(134) " + + + 123 + +" diff -Nru php8.4-8.4.16/ext/dom/tests/modern/xml/gh21548.phpt php8.4-8.4.21/ext/dom/tests/modern/xml/gh21548.phpt --- php8.4-8.4.16/ext/dom/tests/modern/xml/gh21548.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/modern/xml/gh21548.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,17 @@ +--TEST-- +GH-21548 (Dom\XMLDocument::C14N() emits duplicate xmlns declarations after setAttributeNS()) +--CREDITS-- +Toon Verwerft (veewee) +--EXTENSIONS-- +dom +--FILE-- +'); +$doc->documentElement->setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:ns1", "urn:a"); + +echo $doc->C14N() . PHP_EOL; + +?> +--EXPECT-- + diff -Nru php8.4-8.4.16/ext/dom/tests/parentnode_childnode_too_long_text.phpt php8.4-8.4.21/ext/dom/tests/parentnode_childnode_too_long_text.phpt --- php8.4-8.4.16/ext/dom/tests/parentnode_childnode_too_long_text.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/dom/tests/parentnode_childnode_too_long_text.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -6,6 +6,7 @@ memory_limit=-1 --SKIPIF-- pointer.type); } if (UNEXPECTED(type->kind != ZEND_FFI_TYPE_STRUCT)) { - if (UNEXPECTED(type->kind != ZEND_FFI_TYPE_STRUCT)) { - zend_throw_error(zend_ffi_exception_ce, "Attempt to read field '%s' of non C struct/union", ZSTR_VAL(field_name)); - return &EG(uninitialized_zval); - } + zend_throw_error(zend_ffi_exception_ce, "Attempt to read field '%s' of non C struct/union", ZSTR_VAL(field_name)); + return &EG(uninitialized_zval); } field = zend_hash_find_ptr(&type->record.fields, field_name); @@ -1334,10 +1332,8 @@ type = ZEND_FFI_TYPE(type->pointer.type); } if (UNEXPECTED(type->kind != ZEND_FFI_TYPE_STRUCT)) { - if (UNEXPECTED(type->kind != ZEND_FFI_TYPE_STRUCT)) { - zend_throw_error(zend_ffi_exception_ce, "Attempt to assign field '%s' of non C struct/union", ZSTR_VAL(field_name)); - return value; - } + zend_throw_error(zend_ffi_exception_ce, "Attempt to assign field '%s' of non C struct/union", ZSTR_VAL(field_name)); + return value; } field = zend_hash_find_ptr(&type->record.fields, field_name); @@ -3069,17 +3065,7 @@ FFI_G(default_type_attr) = ZEND_FFI_ATTR_STORED; if (zend_ffi_parse_decl(ZSTR_VAL(code), ZSTR_LEN(code)) == FAILURE) { - if (FFI_G(symbols)) { - zend_hash_destroy(FFI_G(symbols)); - efree(FFI_G(symbols)); - FFI_G(symbols) = NULL; - } - if (FFI_G(tags)) { - zend_hash_destroy(FFI_G(tags)); - efree(FFI_G(tags)); - FFI_G(tags) = NULL; - } - RETURN_THROWS(); + goto cleanup; } if (FFI_G(symbols)) { @@ -3091,7 +3077,7 @@ addr = DL_FETCH_SYMBOL(handle, ZSTR_VAL(name)); if (!addr) { zend_throw_error(zend_ffi_exception_ce, "Failed resolving C variable '%s'", ZSTR_VAL(name)); - RETURN_THROWS(); + goto cleanup; } sym->addr = addr; } else if (sym->kind == ZEND_FFI_SYM_FUNC) { @@ -3101,7 +3087,7 @@ zend_string_release(mangled_name); if (!addr) { zend_throw_error(zend_ffi_exception_ce, "Failed resolving C function '%s'", ZSTR_VAL(name)); - RETURN_THROWS(); + goto cleanup; } sym->addr = addr; } @@ -3118,6 +3104,22 @@ FFI_G(tags) = NULL; RETURN_OBJ(&ffi->std); + +cleanup: + if (lib && handle) { + DL_UNLOAD(handle); + } + if (FFI_G(symbols)) { + zend_hash_destroy(FFI_G(symbols)); + efree(FFI_G(symbols)); + FFI_G(symbols) = NULL; + } + if (FFI_G(tags)) { + zend_hash_destroy(FFI_G(tags)); + efree(FFI_G(tags)); + FFI_G(tags) = NULL; + } + RETURN_THROWS(); } /* }}} */ diff -Nru php8.4-8.4.16/ext/ffi/tests/gh14286_2.phpt php8.4-8.4.21/ext/ffi/tests/gh14286_2.phpt --- php8.4-8.4.16/ext/ffi/tests/gh14286_2.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/ffi/tests/gh14286_2.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -2,10 +2,6 @@ GH-14286 (ffi enum type (when enum has no name) make memory leak) --EXTENSIONS-- ffi ---SKIPIF-- - --INI-- ffi.enable=1 --FILE-- diff -Nru php8.4-8.4.16/ext/ffi/tests/gh18629_cdef_resolve_func.phpt php8.4-8.4.21/ext/ffi/tests/gh18629_cdef_resolve_func.phpt --- php8.4-8.4.16/ext/ffi/tests/gh18629_cdef_resolve_func.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/ffi/tests/gh18629_cdef_resolve_func.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,16 @@ +--TEST-- +GH-18629 (FFI::cdef() leaks on function resolution failure) +--EXTENSIONS-- +ffi +--INI-- +ffi.enable=1 +--FILE-- +getMessage() . "\n"; +} +?> +--EXPECT-- +Failed resolving C function 'nonexistent_ffi_test_func' diff -Nru php8.4-8.4.16/ext/ffi/tests/gh18629_read_field_non_struct.phpt php8.4-8.4.21/ext/ffi/tests/gh18629_read_field_non_struct.phpt --- php8.4-8.4.16/ext/ffi/tests/gh18629_read_field_non_struct.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/ffi/tests/gh18629_read_field_non_struct.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,17 @@ +--TEST-- +GH-18629 (Read field of non C struct/union) +--EXTENSIONS-- +ffi +--INI-- +ffi.enable=1 +--FILE-- +new("int*"); +try { + $y = $x->foo; +} catch (\FFI\Exception $e) { + echo $e->getMessage() . "\n"; +} +?> +--EXPECT-- +Attempt to read field 'foo' of non C struct/union diff -Nru php8.4-8.4.16/ext/filter/logical_filters.c php8.4-8.4.21/ext/filter/logical_filters.c --- php8.4-8.4.16/ext/filter/logical_filters.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/filter/logical_filters.c 2026-05-05 16:34:12.000000000 +0000 @@ -528,21 +528,21 @@ } /* First char must be alphanumeric */ - if(*s == '.' || (hostname && !isalnum((int)*(unsigned char *)s))) { + if(*s == '.' || (hostname && !isalnum((unsigned char)*s))) { return 0; } while (s < e) { if (*s == '.') { /* The first and the last character of a label must be alphanumeric */ - if (*(s + 1) == '.' || (hostname && (!isalnum((int)*(unsigned char *)(s - 1)) || !isalnum((int)*(unsigned char *)(s + 1))))) { + if (*(s + 1) == '.' || (hostname && (!isalnum((unsigned char)s[-1]) || !isalnum((unsigned char)s[1])))) { return 0; } /* Reset label length counter */ i = 1; } else { - if (i > 63 || (hostname && (*s != '-' || *(s + 1) == '\0') && !isalnum((int)*(unsigned char *)s))) { + if (i > 63 || (hostname && (*s != '-' || *(s + 1) == '\0') && !isalnum((unsigned char)*s))) { return 0; } @@ -569,9 +569,9 @@ const char *valid = "-._~!$&'()*+,;=:"; const char *p = ZSTR_VAL(str); while (p - ZSTR_VAL(str) < ZSTR_LEN(str)) { - if (isalpha(*p) || isdigit(*p) || strchr(valid, *p)) { + if (isalpha((unsigned char)*p) || isdigit((unsigned char)*p) || strchr(valid, *p)) { p++; - } else if (*p == '%' && p - ZSTR_VAL(str) <= ZSTR_LEN(str) - 3 && isdigit(*(p+1)) && isxdigit(*(p+2))) { + } else if (*p == '%' && p - ZSTR_VAL(str) <= ZSTR_LEN(str) - 3 && isdigit((unsigned char)p[1]) && isxdigit((unsigned char)p[2])) { p += 3; } else { return 0; @@ -723,7 +723,7 @@ } /* }}} */ -static int _php_filter_validate_ipv4(char *str, size_t str_len, int *ip) /* {{{ */ +static int _php_filter_validate_ipv4(const char *str, size_t str_len, int *ip) /* {{{ */ { const char *end = str + str_len; int num, m; @@ -764,7 +764,7 @@ int blocks = 0; unsigned int num, n; int i; - char *ipv4; + const char *ipv4; const char *end; int ip4elm[4]; const char *s = str; diff -Nru php8.4-8.4.16/ext/ftp/ftp.c php8.4-8.4.21/ext/ftp/ftp.c --- php8.4-8.4.16/ext/ftp/ftp.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/ftp/ftp.c 2026-05-05 16:34:12.000000000 +0000 @@ -519,7 +519,7 @@ array_init(return_value); while (ftp_readline(ftp)) { add_next_index_string(return_value, ftp->inbuf); - if (isdigit(ftp->inbuf[0]) && isdigit(ftp->inbuf[1]) && isdigit(ftp->inbuf[2]) && ftp->inbuf[3] == ' ') { + if (isdigit((unsigned char)ftp->inbuf[0]) && isdigit((unsigned char)ftp->inbuf[1]) && isdigit((unsigned char)ftp->inbuf[2]) && ftp->inbuf[3] == ' ') { return; } } @@ -861,7 +861,7 @@ return 0; } /* parse out the IP and port */ - for (ptr = ftp->inbuf; *ptr && !isdigit(*ptr); ptr++); + for (ptr = ftp->inbuf; *ptr && !isdigit((unsigned char)*ptr); ptr++); n = sscanf(ptr, "%lu,%lu,%lu,%lu,%lu,%lu", &b[0], &b[1], &b[2], &b[3], &b[4], &b[5]); if (n != 6) { return 0; @@ -1188,7 +1188,7 @@ return -1; } /* parse out the timestamp */ - for (ptr = ftp->inbuf; *ptr && !isdigit(*ptr); ptr++); + for (ptr = ftp->inbuf; *ptr && !isdigit((unsigned char)*ptr); ptr++); n = sscanf(ptr, "%4d%2d%2d%2d%2d%2d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec); if (n != 6) { return -1; @@ -1386,13 +1386,13 @@ } /* Break out when the end-tag is found */ - if (isdigit(ftp->inbuf[0]) && isdigit(ftp->inbuf[1]) && isdigit(ftp->inbuf[2]) && ftp->inbuf[3] == ' ') { + if (isdigit((unsigned char)ftp->inbuf[0]) && isdigit((unsigned char)ftp->inbuf[1]) && isdigit((unsigned char)ftp->inbuf[2]) && ftp->inbuf[3] == ' ') { break; } } /* translate the tag */ - if (!isdigit(ftp->inbuf[0]) || !isdigit(ftp->inbuf[1]) || !isdigit(ftp->inbuf[2])) { + if (!isdigit((unsigned char)ftp->inbuf[0]) || !isdigit((unsigned char)ftp->inbuf[1]) || !isdigit((unsigned char)ftp->inbuf[2])) { return 0; } diff -Nru php8.4-8.4.16/ext/ftp/php_ftp.c php8.4-8.4.21/ext/ftp/php_ftp.c --- php8.4-8.4.16/ext/ftp/php_ftp.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/ftp/php_ftp.c 2026-05-05 16:34:12.000000000 +0000 @@ -147,7 +147,7 @@ RETURN_THROWS(); } - const zend_long timeoutmax = (zend_long)((double) PHP_TIMEOUT_ULL_MAX / 1000000.0); + const uint64_t timeoutmax = (uint64_t)((double) PHP_TIMEOUT_ULL_MAX / 1000000.0); if (timeout_sec <= 0) { zend_argument_value_error(3, "must be greater than 0"); @@ -155,7 +155,7 @@ } if (timeout_sec >= timeoutmax) { - zend_argument_value_error(3, "must be less than " ZEND_LONG_FMT, timeoutmax); + zend_argument_value_error(3, "must be less than " ZEND_ULONG_FMT, timeoutmax); RETURN_THROWS(); } diff -Nru php8.4-8.4.16/ext/gd/gd.c php8.4-8.4.21/ext/gd/gd.c --- php8.4-8.4.16/ext/gd/gd.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/gd/gd.c 2026-05-05 16:34:12.000000000 +0000 @@ -3023,7 +3023,8 @@ zend_long X, Y, COL; zend_string *C; gdImagePtr im; - int ch = 0, col, x, y, i, l = 0; + int ch = 0, col, i, l = 0; + unsigned int x, y; unsigned char *str = NULL; zend_object *font_obj = NULL; zend_long font_int = 0; @@ -3055,21 +3056,21 @@ switch (mode) { case 0: - gdImageChar(im, font, x, y, ch, col); + gdImageChar(im, font, (int)x, (int)y, ch, col); break; case 1: php_gdimagecharup(im, font, x, y, ch, col); break; case 2: for (i = 0; (i < l); i++) { - gdImageChar(im, font, x, y, (int) ((unsigned char) str[i]), col); + gdImageChar(im, font, (int)x, (int)y, (int) ((unsigned char) str[i]), col); x += font->w; } break; case 3: { for (i = 0; (i < l); i++) { /* php_gdimagecharup(im, font, x, y, (int) str[i], col); */ - gdImageCharUp(im, font, x, y, (int) str[i], col); + gdImageCharUp(im, font, (int)x, (int)y, (int) str[i], col); y -= font->w; } break; diff -Nru php8.4-8.4.16/ext/gd/libgd/gd_jpeg.c php8.4-8.4.21/ext/gd/libgd/gd_jpeg.c --- php8.4-8.4.16/ext/gd/libgd/gd_jpeg.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/gd/libgd/gd_jpeg.c 2026-05-05 16:34:12.000000000 +0000 @@ -125,6 +125,10 @@ return "9 compatible"; break; + case 100: + return "10 compatible"; + break; + default: return "unknown"; } diff -Nru php8.4-8.4.16/ext/gd/libgd/gd_xbm.c php8.4-8.4.21/ext/gd/libgd/gd_xbm.c --- php8.4-8.4.16/ext/gd/libgd/gd_xbm.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/gd/libgd/gd_xbm.c 2026-05-05 16:34:12.000000000 +0000 @@ -191,7 +191,7 @@ } else { for (i=0; i --INI-- diff -Nru php8.4-8.4.16/ext/gd/tests/gh16322.phpt php8.4-8.4.21/ext/gd/tests/gh16322.phpt --- php8.4-8.4.16/ext/gd/tests/gh16322.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/gd/tests/gh16322.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -2,8 +2,6 @@ GH-16322 (imageaffine overflow/underflow on affine matrix) --EXTENSIONS-- gd ---INI-- -memory_limit=-1 --FILE-- +--EXPECT-- +OK diff -Nru php8.4-8.4.16/ext/gmp/gmp.c php8.4-8.4.21/ext/gmp/gmp.c --- php8.4-8.4.16/ext/gmp/gmp.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/gmp/gmp.c 2026-05-05 16:34:12.000000000 +0000 @@ -652,7 +652,7 @@ bool skip_lead = false; size_t num_len = ZSTR_LEN(val); - while (isspace(*num_str)) { + while (isspace((unsigned char)*num_str)) { ++num_str; --num_len; } diff -Nru php8.4-8.4.16/ext/iconv/iconv.c php8.4-8.4.21/ext/iconv/iconv.c --- php8.4-8.4.16/ext/iconv/iconv.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/iconv/iconv.c 2026-05-05 16:34:12.000000000 +0000 @@ -320,7 +320,7 @@ if (mimetype != NULL && (!(output_context->op & PHP_OUTPUT_HANDLER_CLEAN) || ((output_context->op & PHP_OUTPUT_HANDLER_START) && !(output_context->op & PHP_OUTPUT_HANDLER_FINAL)))) { size_t len; - char *p = strstr(get_output_encoding(), "//"); + const char *p = strstr(get_output_encoding(), "//"); if (p) { len = spprintf(&content_type, 0, "Content-Type:%.*s; charset=%.*s", mimetype_len ? mimetype_len : (int) strlen(mimetype), mimetype, (int) (p - get_output_encoding()), get_output_encoding()); @@ -459,59 +459,65 @@ out_left = in_len + 32; /* Avoid realloc() most cases */ out_size = 0; bsz = out_left; - out_buf = zend_string_alloc(bsz, 0); - out_p = ZSTR_VAL(out_buf); - while (in_left > 0) { - result = iconv(cd, (ICONV_CONST char **) &in_p, &in_left, (char **) &out_p, &out_left); - out_size = bsz - out_left; - if (result == (size_t)(-1)) { - if (ignore_ilseq && errno == EILSEQ) { - if (in_left <= 1) { - result = 0; - } else { - errno = 0; - in_p++; - in_left--; - continue; - } - } + zend_try { + out_buf = zend_string_alloc(bsz, 0); + out_p = ZSTR_VAL(out_buf); - if (errno == E2BIG && in_left > 0) { - /* converted string is longer than out buffer */ - bsz += in_len; + while (in_left > 0) { + result = iconv(cd, (ICONV_CONST char **) &in_p, &in_left, (char **) &out_p, &out_left); + out_size = bsz - out_left; + if (result == (size_t)(-1)) { + if (ignore_ilseq && errno == EILSEQ) { + if (in_left <= 1) { + result = 0; + } else { + errno = 0; + in_p++; + in_left--; + continue; + } + } - out_buf = zend_string_extend(out_buf, bsz, 0); - out_p = ZSTR_VAL(out_buf); - out_p += out_size; - out_left = bsz - out_size; - continue; + if (errno == E2BIG && in_left > 0) { + /* converted string is longer than out buffer */ + bsz += in_len; + + out_buf = zend_string_extend(out_buf, bsz, 0); + out_p = ZSTR_VAL(out_buf); + out_p += out_size; + out_left = bsz - out_size; + continue; + } } + break; } - break; - } - if (result != (size_t)(-1)) { - /* flush the shift-out sequences */ - for (;;) { - result = iconv(cd, NULL, NULL, (char **) &out_p, &out_left); - out_size = bsz - out_left; + if (result != (size_t)(-1)) { + /* flush the shift-out sequences */ + for (;;) { + result = iconv(cd, NULL, NULL, (char **) &out_p, &out_left); + out_size = bsz - out_left; - if (result != (size_t)(-1)) { - break; - } + if (result != (size_t)(-1)) { + break; + } - if (errno == E2BIG) { - bsz += 16; - out_buf = zend_string_extend(out_buf, bsz, 0); - out_p = ZSTR_VAL(out_buf); - out_p += out_size; - out_left = bsz - out_size; - } else { - break; + if (errno == E2BIG) { + bsz += 16; + out_buf = zend_string_extend(out_buf, bsz, 0); + out_p = ZSTR_VAL(out_buf); + out_p += out_size; + out_left = bsz - out_size; + } else { + break; + } } } - } + } zend_catch { + iconv_close(cd); + zend_bailout(); + } zend_end_try(); iconv_close(cd); @@ -684,58 +690,63 @@ errno = 0; more = nbytes > 0 && len > 0; - for (in_p = str, in_left = nbytes, cnt = 0; more; ++cnt) { - out_p = buf; - out_left = sizeof(buf); + bool bailout = false; + zend_try { + for (in_p = str, in_left = nbytes, cnt = 0; more; ++cnt) { + out_p = buf; + out_left = sizeof(buf); - more = in_left > 0 && len > 0; + more = in_left > 0 && len > 0; - iconv(cd1, more ? (ICONV_CONST char **)&in_p : NULL, more ? &in_left : NULL, (char **) &out_p, &out_left); - if (out_left == sizeof(buf)) { - break; - } + iconv(cd1, more ? (ICONV_CONST char **)&in_p : NULL, more ? &in_left : NULL, (char **) &out_p, &out_left); + if (out_left == sizeof(buf)) { + break; + } - if ((zend_long)cnt >= offset) { - if (cd2 == (iconv_t)NULL) { - cd2 = iconv_open(enc, GENERIC_SUPERSET_NAME); - - if (cd2 == (iconv_t)(-1)) { - cd2 = (iconv_t)NULL; - if (errno == EINVAL) { - err = PHP_ICONV_ERR_WRONG_CHARSET; - } else { - err = PHP_ICONV_ERR_CONVERTER; + if ((zend_long)cnt >= offset) { + if (cd2 == (iconv_t)NULL) { + cd2 = iconv_open(enc, GENERIC_SUPERSET_NAME); + + if (cd2 == (iconv_t)(-1)) { + cd2 = (iconv_t)NULL; + if (errno == EINVAL) { + err = PHP_ICONV_ERR_WRONG_CHARSET; + } else { + err = PHP_ICONV_ERR_CONVERTER; + } + break; } + } + + if (_php_iconv_appendl(pretval, buf, sizeof(buf), cd2) != PHP_ICONV_ERR_SUCCESS) { break; } + --len; } - if (_php_iconv_appendl(pretval, buf, sizeof(buf), cd2) != PHP_ICONV_ERR_SUCCESS) { - break; - } - --len; } - } - - switch (errno) { - case EINVAL: - err = PHP_ICONV_ERR_ILLEGAL_CHAR; - break; + switch (errno) { + case EINVAL: + err = PHP_ICONV_ERR_ILLEGAL_CHAR; + break; - case EILSEQ: - err = PHP_ICONV_ERR_ILLEGAL_SEQ; - break; + case EILSEQ: + err = PHP_ICONV_ERR_ILLEGAL_SEQ; + break; - case E2BIG: - break; - } - if (err == PHP_ICONV_ERR_SUCCESS) { - if (cd2 != (iconv_t)NULL) { - _php_iconv_appendl(pretval, NULL, 0, cd2); + case E2BIG: + break; } - smart_str_0(pretval); - } + if (err == PHP_ICONV_ERR_SUCCESS) { + if (cd2 != (iconv_t)NULL) { + _php_iconv_appendl(pretval, NULL, 0, cd2); + } + smart_str_0(pretval); + } + } zend_catch { + bailout = true; + } zend_end_try(); if (cd1 != (iconv_t)NULL) { iconv_close(cd1); @@ -744,6 +755,9 @@ if (cd2 != (iconv_t)NULL) { iconv_close(cd2); } + if (bailout) { + zend_bailout(); + } return err; } @@ -904,6 +918,7 @@ { php_iconv_err_t err = PHP_ICONV_ERR_SUCCESS; iconv_t cd = (iconv_t)(-1), cd_pl = (iconv_t)(-1); + bool bailout = false; size_t char_cnt = 0; size_t out_charset_len; size_t lfchars_len; @@ -962,215 +977,221 @@ goto out; } - buf = safe_emalloc(1, max_line_len, 5); + zend_try { + buf = safe_emalloc(1, max_line_len, 5); - char_cnt = max_line_len; + char_cnt = max_line_len; - _php_iconv_appendl(pretval, fname, fname_nbytes, cd_pl); - char_cnt -= fname_nbytes; - smart_str_appendl(pretval, ": ", sizeof(": ") - 1); - char_cnt -= 2; + _php_iconv_appendl(pretval, fname, fname_nbytes, cd_pl); + char_cnt -= fname_nbytes; + smart_str_appendl(pretval, ": ", sizeof(": ") - 1); + char_cnt -= 2; - in_p = fval; - in_left = fval_nbytes; + in_p = fval; + in_left = fval_nbytes; - do { - size_t prev_in_left; - size_t out_size; - size_t encoded_word_min_len = sizeof("=\?\?X\?\?=")-1 + out_charset_len + (enc_scheme == PHP_ICONV_ENC_SCHEME_BASE64 ? 4 : 3); + do { + size_t prev_in_left; + size_t out_size; + size_t encoded_word_min_len = sizeof("=\?\?X\?\?=")-1 + out_charset_len + (enc_scheme == PHP_ICONV_ENC_SCHEME_BASE64 ? 4 : 3); + + if (char_cnt < encoded_word_min_len + lfchars_len + 1) { + /* lfchars must be encoded in ASCII here*/ + smart_str_appendl(pretval, lfchars, lfchars_len); + smart_str_appendc(pretval, ' '); + char_cnt = max_line_len - 1; + } + + smart_str_appendl(pretval, "=?", sizeof("=?") - 1); + char_cnt -= 2; + smart_str_appendl(pretval, out_charset, out_charset_len); + char_cnt -= out_charset_len; + smart_str_appendc(pretval, '?'); + char_cnt --; + + switch (enc_scheme) { + case PHP_ICONV_ENC_SCHEME_BASE64: { + size_t ini_in_left; + const char *ini_in_p; + size_t out_reserved = 4; + + smart_str_appendc(pretval, 'B'); + char_cnt--; + smart_str_appendc(pretval, '?'); + char_cnt--; + + prev_in_left = ini_in_left = in_left; + ini_in_p = in_p; + + out_size = (char_cnt - 2) / 4 * 3; + + for (;;) { + out_p = buf; + + if (out_size <= out_reserved) { + err = PHP_ICONV_ERR_TOO_BIG; + goto out_try; + } + + out_left = out_size - out_reserved; + + if (iconv(cd, (ICONV_CONST char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) { + switch (errno) { + case EINVAL: + err = PHP_ICONV_ERR_ILLEGAL_CHAR; + goto out_try; + + case EILSEQ: + err = PHP_ICONV_ERR_ILLEGAL_SEQ; + goto out_try; + + case E2BIG: + if (prev_in_left == in_left) { + err = PHP_ICONV_ERR_TOO_BIG; + goto out_try; + } + break; - if (char_cnt < encoded_word_min_len + lfchars_len + 1) { - /* lfchars must be encoded in ASCII here*/ - smart_str_appendl(pretval, lfchars, lfchars_len); - smart_str_appendc(pretval, ' '); - char_cnt = max_line_len - 1; - } + default: + err = PHP_ICONV_ERR_UNKNOWN; + goto out_try; + } + } - smart_str_appendl(pretval, "=?", sizeof("=?") - 1); - char_cnt -= 2; - smart_str_appendl(pretval, out_charset, out_charset_len); - char_cnt -= out_charset_len; - smart_str_appendc(pretval, '?'); - char_cnt --; - - switch (enc_scheme) { - case PHP_ICONV_ENC_SCHEME_BASE64: { - size_t ini_in_left; - const char *ini_in_p; - size_t out_reserved = 4; - - smart_str_appendc(pretval, 'B'); - char_cnt--; - smart_str_appendc(pretval, '?'); - char_cnt--; - - prev_in_left = ini_in_left = in_left; - ini_in_p = in_p; - - out_size = (char_cnt - 2) / 4 * 3; - - for (;;) { - out_p = buf; - - if (out_size <= out_reserved) { - err = PHP_ICONV_ERR_TOO_BIG; - goto out; - } - - out_left = out_size - out_reserved; - - if (iconv(cd, (ICONV_CONST char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) { - switch (errno) { - case EINVAL: - err = PHP_ICONV_ERR_ILLEGAL_CHAR; - goto out; - - case EILSEQ: - err = PHP_ICONV_ERR_ILLEGAL_SEQ; - goto out; - - case E2BIG: - if (prev_in_left == in_left) { - err = PHP_ICONV_ERR_TOO_BIG; - goto out; - } - break; + out_left += out_reserved; - default: + if (iconv(cd, NULL, NULL, (char **) &out_p, &out_left) == (size_t)-1) { + if (errno != E2BIG) { err = PHP_ICONV_ERR_UNKNOWN; - goto out; + goto out_try; + } + } else { + break; } - } - - out_left += out_reserved; - if (iconv(cd, NULL, NULL, (char **) &out_p, &out_left) == (size_t)-1) { - if (errno != E2BIG) { + if (iconv(cd, NULL, NULL, NULL, NULL) == (size_t)-1) { err = PHP_ICONV_ERR_UNKNOWN; - goto out; + goto out_try; } - } else { - break; - } - if (iconv(cd, NULL, NULL, NULL, NULL) == (size_t)-1) { - err = PHP_ICONV_ERR_UNKNOWN; - goto out; + out_reserved += 4; + in_left = ini_in_left; + in_p = ini_in_p; } - out_reserved += 4; - in_left = ini_in_left; - in_p = ini_in_p; - } - - prev_in_left = in_left; + prev_in_left = in_left; - encoded = php_base64_encode((unsigned char *) buf, (out_size - out_left)); + encoded = php_base64_encode((unsigned char *) buf, (out_size - out_left)); - if (char_cnt < ZSTR_LEN(encoded)) { - /* something went wrong! */ - err = PHP_ICONV_ERR_UNKNOWN; - goto out; - } + if (char_cnt < ZSTR_LEN(encoded)) { + /* something went wrong! */ + err = PHP_ICONV_ERR_UNKNOWN; + goto out_try; + } - smart_str_appendl(pretval, ZSTR_VAL(encoded), ZSTR_LEN(encoded)); - char_cnt -= ZSTR_LEN(encoded); - smart_str_appendl(pretval, "?=", sizeof("?=") - 1); - char_cnt -= 2; - - zend_string_release_ex(encoded, 0); - encoded = NULL; - } break; /* case PHP_ICONV_ENC_SCHEME_BASE64: */ - - case PHP_ICONV_ENC_SCHEME_QPRINT: { - size_t ini_in_left; - const char *ini_in_p; - const unsigned char *p; - size_t nbytes_required; - - smart_str_appendc(pretval, 'Q'); - char_cnt--; - smart_str_appendc(pretval, '?'); - char_cnt--; - - prev_in_left = ini_in_left = in_left; - ini_in_p = in_p; - - for (out_size = (char_cnt - 2); out_size > 0;) { - - nbytes_required = 0; - - out_p = buf; - out_left = out_size; - - if (iconv(cd, (ICONV_CONST char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) { - switch (errno) { - case EINVAL: - err = PHP_ICONV_ERR_ILLEGAL_CHAR; - goto out; - - case EILSEQ: - err = PHP_ICONV_ERR_ILLEGAL_SEQ; - goto out; + smart_str_appendl(pretval, ZSTR_VAL(encoded), ZSTR_LEN(encoded)); + char_cnt -= ZSTR_LEN(encoded); + smart_str_appendl(pretval, "?=", sizeof("?=") - 1); + char_cnt -= 2; + + zend_string_release_ex(encoded, 0); + encoded = NULL; + } break; /* case PHP_ICONV_ENC_SCHEME_BASE64: */ + + case PHP_ICONV_ENC_SCHEME_QPRINT: { + size_t ini_in_left; + const char *ini_in_p; + const unsigned char *p; + size_t nbytes_required; + + smart_str_appendc(pretval, 'Q'); + char_cnt--; + smart_str_appendc(pretval, '?'); + char_cnt--; + + prev_in_left = ini_in_left = in_left; + ini_in_p = in_p; + + for (out_size = (char_cnt - 2); out_size > 0;) { + + nbytes_required = 0; + + out_p = buf; + out_left = out_size; + + if (iconv(cd, (ICONV_CONST char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) { + switch (errno) { + case EINVAL: + err = PHP_ICONV_ERR_ILLEGAL_CHAR; + goto out_try; + + case EILSEQ: + err = PHP_ICONV_ERR_ILLEGAL_SEQ; + goto out_try; + + case E2BIG: + if (prev_in_left == in_left) { + err = PHP_ICONV_ERR_UNKNOWN; + goto out_try; + } + break; - case E2BIG: - if (prev_in_left == in_left) { + default: err = PHP_ICONV_ERR_UNKNOWN; - goto out; - } - break; - - default: + goto out_try; + } + } + if (iconv(cd, NULL, NULL, (char **) &out_p, &out_left) == (size_t)-1) { + if (errno != E2BIG) { err = PHP_ICONV_ERR_UNKNOWN; - goto out; + goto out_try; + } } - } - if (iconv(cd, NULL, NULL, (char **) &out_p, &out_left) == (size_t)-1) { - if (errno != E2BIG) { - err = PHP_ICONV_ERR_UNKNOWN; - goto out; + + for (p = (unsigned char *)buf; p < (unsigned char *)out_p; p++) { + nbytes_required += qp_table[*p]; } - } - for (p = (unsigned char *)buf; p < (unsigned char *)out_p; p++) { - nbytes_required += qp_table[*p]; + if (nbytes_required <= char_cnt - 2) { + break; + } + + out_size -= ((nbytes_required - (char_cnt - 2)) + 2) / 3; + in_left = ini_in_left; + in_p = ini_in_p; } - if (nbytes_required <= char_cnt - 2) { - break; + for (p = (unsigned char *)buf; p < (unsigned char *)out_p; p++) { + if (qp_table[*p] == 1) { + smart_str_appendc(pretval, *(char *)p); + char_cnt--; + } else { + static const char qp_digits[] = "0123456789ABCDEF"; + smart_str_appendc(pretval, '='); + smart_str_appendc(pretval, qp_digits[(*p >> 4) & 0x0f]); + smart_str_appendc(pretval, qp_digits[(*p & 0x0f)]); + char_cnt -= 3; + } } - out_size -= ((nbytes_required - (char_cnt - 2)) + 2) / 3; - in_left = ini_in_left; - in_p = ini_in_p; - } + smart_str_appendl(pretval, "?=", sizeof("?=") - 1); + char_cnt -= 2; - for (p = (unsigned char *)buf; p < (unsigned char *)out_p; p++) { - if (qp_table[*p] == 1) { - smart_str_appendc(pretval, *(char *)p); - char_cnt--; - } else { - static const char qp_digits[] = "0123456789ABCDEF"; - smart_str_appendc(pretval, '='); - smart_str_appendc(pretval, qp_digits[(*p >> 4) & 0x0f]); - smart_str_appendc(pretval, qp_digits[(*p & 0x0f)]); - char_cnt -= 3; + if (iconv(cd, NULL, NULL, NULL, NULL) == (size_t)-1) { + err = PHP_ICONV_ERR_UNKNOWN; + goto out_try; } - } - - smart_str_appendl(pretval, "?=", sizeof("?=") - 1); - char_cnt -= 2; - if (iconv(cd, NULL, NULL, NULL, NULL) == (size_t)-1) { - err = PHP_ICONV_ERR_UNKNOWN; - goto out; - } + } break; /* case PHP_ICONV_ENC_SCHEME_QPRINT: */ + } + } while (in_left > 0); - } break; /* case PHP_ICONV_ENC_SCHEME_QPRINT: */ - } - } while (in_left > 0); + smart_str_0(pretval); - smart_str_0(pretval); +out_try: ; + } zend_catch { + bailout = true; + } zend_end_try(); out: if (cd != (iconv_t)(-1)) { @@ -1185,6 +1206,9 @@ if (buf != NULL) { efree(buf); } + if (bailout) { + zend_bailout(); + } return err; } /* }}} */ @@ -1193,6 +1217,7 @@ static php_iconv_err_t _php_iconv_mime_decode(smart_str *pretval, const char *str, size_t str_nbytes, const char *enc, const char **next_pos, int mode) { php_iconv_err_t err = PHP_ICONV_ERR_SUCCESS; + bool bailout = false; iconv_t cd = (iconv_t)(-1), cd_pl = (iconv_t)(-1); @@ -1224,206 +1249,229 @@ } p1 = str; - for (str_left = str_nbytes; str_left > 0; str_left--, p1++) { - int eos = 0; - - switch (scan_stat) { - case 0: /* expecting any character */ - switch (*p1) { - case '\r': /* part of an EOL sequence? */ - scan_stat = 7; - break; + zend_try { + for (str_left = str_nbytes; str_left > 0; str_left--, p1++) { + int eos = 0; + + switch (scan_stat) { + case 0: /* expecting any character */ + switch (*p1) { + case '\r': /* part of an EOL sequence? */ + scan_stat = 7; + break; - case '\n': - scan_stat = 8; - break; + case '\n': + scan_stat = 8; + break; - case '=': /* first letter of an encoded chunk */ - encoded_word = p1; - scan_stat = 1; - break; + case '=': /* first letter of an encoded chunk */ + encoded_word = p1; + scan_stat = 1; + break; - case ' ': case '\t': /* a chunk of whitespaces */ - spaces = p1; - scan_stat = 11; - break; + case ' ': case '\t': /* a chunk of whitespaces */ + spaces = p1; + scan_stat = 11; + break; - default: /* first letter of a non-encoded word */ - err = _php_iconv_appendc(pretval, *p1, cd_pl); - if (err != PHP_ICONV_ERR_SUCCESS) { - if (mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR) { - err = PHP_ICONV_ERR_SUCCESS; - } else { - goto out; + default: /* first letter of a non-encoded word */ + err = _php_iconv_appendc(pretval, *p1, cd_pl); + if (err != PHP_ICONV_ERR_SUCCESS) { + if (mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR) { + err = PHP_ICONV_ERR_SUCCESS; + } else { + goto out_try; + } } - } - encoded_word = NULL; - if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { - scan_stat = 12; - } - break; - } - break; - - case 1: /* expecting a delimiter */ - if (*p1 != '?') { - if (*p1 == '\r' || *p1 == '\n') { - --p1; - } - err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); - if (err != PHP_ICONV_ERR_SUCCESS) { - goto out; - } - encoded_word = NULL; - if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { - scan_stat = 12; - } else { - scan_stat = 0; + encoded_word = NULL; + if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { + scan_stat = 12; + } + break; } break; - } - csname = p1 + 1; - scan_stat = 2; - break; - case 2: /* expecting a charset name */ - switch (*p1) { - case '?': /* normal delimiter: encoding scheme follows */ - scan_stat = 3; - break; - - case '*': /* new style delimiter: locale id follows */ - scan_stat = 10; - break; - - case '\r': case '\n': /* not an encoded-word */ - --p1; - _php_iconv_appendc(pretval, '=', cd_pl); - _php_iconv_appendc(pretval, '?', cd_pl); - err = _php_iconv_appendl(pretval, csname, (size_t)((p1 + 1) - csname), cd_pl); + case 1: /* expecting a delimiter */ + if (*p1 != '?') { + if (*p1 == '\r' || *p1 == '\n') { + --p1; + } + err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); if (err != PHP_ICONV_ERR_SUCCESS) { - goto out; + goto out_try; } - csname = NULL; + encoded_word = NULL; if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { scan_stat = 12; - } - else { + } else { scan_stat = 0; } - continue; - } - if (scan_stat != 2) { - char tmpbuf[80]; - - if (csname == NULL) { - err = PHP_ICONV_ERR_MALFORMED; - goto out; + break; } + csname = p1 + 1; + scan_stat = 2; + break; - csname_len = (size_t)(p1 - csname); + case 2: /* expecting a charset name */ + switch (*p1) { + case '?': /* normal delimiter: encoding scheme follows */ + scan_stat = 3; + break; - if (csname_len > sizeof(tmpbuf) - 1) { - if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { - err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); + case '*': /* new style delimiter: locale id follows */ + scan_stat = 10; + break; + + case '\r': case '\n': /* not an encoded-word */ + --p1; + _php_iconv_appendc(pretval, '=', cd_pl); + _php_iconv_appendc(pretval, '?', cd_pl); + err = _php_iconv_appendl(pretval, csname, (size_t)((p1 + 1) - csname), cd_pl); if (err != PHP_ICONV_ERR_SUCCESS) { - goto out; + goto out_try; } - encoded_word = NULL; + csname = NULL; if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { scan_stat = 12; - } else { + } + else { scan_stat = 0; } - break; - } else { - err = PHP_ICONV_ERR_MALFORMED; - goto out; - } + continue; } + if (scan_stat != 2) { + char tmpbuf[80]; - memcpy(tmpbuf, csname, csname_len); - tmpbuf[csname_len] = '\0'; - - if (cd != (iconv_t)(-1)) { - iconv_close(cd); - } + if (csname == NULL) { + err = PHP_ICONV_ERR_MALFORMED; + goto out_try; + } - cd = iconv_open(enc, tmpbuf); + csname_len = (size_t)(p1 - csname); - if (cd == (iconv_t)(-1)) { - if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { - /* Bad character set, but the user wants us to - * press on. In this case, we'll just insert the - * undecoded encoded word, since there isn't really - * a more sensible behaviour available; the only - * other options are to swallow the encoded word - * entirely or decode it with an arbitrarily chosen - * single byte encoding, both of which seem to have - * a higher WTF factor than leaving it undecoded. - * - * Given this approach, we need to skip ahead to - * the end of the encoded word. */ - int qmarks = 2; - while (qmarks > 0 && str_left > 1) { - if (*(++p1) == '?') { - --qmarks; + if (csname_len > sizeof(tmpbuf) - 1) { + if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { + err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); + if (err != PHP_ICONV_ERR_SUCCESS) { + goto out_try; + } + encoded_word = NULL; + if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { + scan_stat = 12; + } else { + scan_stat = 0; } - --str_left; + break; + } else { + err = PHP_ICONV_ERR_MALFORMED; + goto out_try; } + } + + memcpy(tmpbuf, csname, csname_len); + tmpbuf[csname_len] = '\0'; - /* Look ahead to check for the terminating = that - * should be there as well; if it's there, we'll - * also include that. If it's not, there isn't much - * we can do at this point. */ - if (*(p1 + 1) == '=') { - ++p1; - if (str_left > 1) { + if (cd != (iconv_t)(-1)) { + iconv_close(cd); + } + + cd = iconv_open(enc, tmpbuf); + + if (cd == (iconv_t)(-1)) { + if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { + /* Bad character set, but the user wants us to + * press on. In this case, we'll just insert the + * undecoded encoded word, since there isn't really + * a more sensible behaviour available; the only + * other options are to swallow the encoded word + * entirely or decode it with an arbitrarily chosen + * single byte encoding, both of which seem to have + * a higher WTF factor than leaving it undecoded. + * + * Given this approach, we need to skip ahead to + * the end of the encoded word. */ + int qmarks = 2; + while (qmarks > 0 && str_left > 1) { + if (*(++p1) == '?') { + --qmarks; + } --str_left; } - } - err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); - if (err != PHP_ICONV_ERR_SUCCESS) { - goto out; - } + /* Look ahead to check for the terminating = that + * should be there as well; if it's there, we'll + * also include that. If it's not, there isn't much + * we can do at this point. */ + if (*(p1 + 1) == '=') { + ++p1; + if (str_left > 1) { + --str_left; + } + } - /* Let's go back and see if there are further - * encoded words or bare content, and hope they - * might actually have a valid character set. */ - scan_stat = 12; - break; - } else { - if (errno == EINVAL) { - err = PHP_ICONV_ERR_WRONG_CHARSET; + err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); + if (err != PHP_ICONV_ERR_SUCCESS) { + goto out_try; + } + + /* Let's go back and see if there are further + * encoded words or bare content, and hope they + * might actually have a valid character set. */ + scan_stat = 12; + break; } else { - err = PHP_ICONV_ERR_CONVERTER; + if (errno == EINVAL) { + err = PHP_ICONV_ERR_WRONG_CHARSET; + } else { + err = PHP_ICONV_ERR_CONVERTER; + } + goto out_try; } - goto out; } } - } - break; + break; - case 3: /* expecting a encoding scheme specifier */ - switch (*p1) { - case 'b': - case 'B': - enc_scheme = PHP_ICONV_ENC_SCHEME_BASE64; - scan_stat = 4; - break; + case 3: /* expecting a encoding scheme specifier */ + switch (*p1) { + case 'b': + case 'B': + enc_scheme = PHP_ICONV_ENC_SCHEME_BASE64; + scan_stat = 4; + break; - case 'q': - case 'Q': - enc_scheme = PHP_ICONV_ENC_SCHEME_QPRINT; - scan_stat = 4; - break; + case 'q': + case 'Q': + enc_scheme = PHP_ICONV_ENC_SCHEME_QPRINT; + scan_stat = 4; + break; - default: + default: + if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { + err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); + if (err != PHP_ICONV_ERR_SUCCESS) { + goto out_try; + } + encoded_word = NULL; + if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { + scan_stat = 12; + } else { + scan_stat = 0; + } + break; + } else { + err = PHP_ICONV_ERR_MALFORMED; + goto out_try; + } + } + break; + + case 4: /* expecting a delimiter */ + if (*p1 != '?') { if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { + /* pass the entire chunk through the converter */ err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); if (err != PHP_ICONV_ERR_SUCCESS) { - goto out; + goto out_try; } encoded_word = NULL; if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { @@ -1434,301 +1482,285 @@ break; } else { err = PHP_ICONV_ERR_MALFORMED; - goto out; - } - } - break; - - case 4: /* expecting a delimiter */ - if (*p1 != '?') { - if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { - /* pass the entire chunk through the converter */ - err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); - if (err != PHP_ICONV_ERR_SUCCESS) { - goto out; - } - encoded_word = NULL; - if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { - scan_stat = 12; - } else { - scan_stat = 0; + goto out_try; } - break; - } else { - err = PHP_ICONV_ERR_MALFORMED; - goto out; } - } - encoded_text = p1 + 1; - scan_stat = 5; - break; - - case 5: /* expecting an encoded portion */ - if (*p1 == '?') { - encoded_text_len = (size_t)(p1 - encoded_text); - scan_stat = 6; - } - break; + encoded_text = p1 + 1; + scan_stat = 5; + break; - case 7: /* expecting a "\n" character */ - if (*p1 == '\n') { - scan_stat = 8; - } else { - /* bare CR */ - _php_iconv_appendc(pretval, '\r', cd_pl); - _php_iconv_appendc(pretval, *p1, cd_pl); - scan_stat = 0; - } - break; + case 5: /* expecting an encoded portion */ + if (*p1 == '?') { + encoded_text_len = (size_t)(p1 - encoded_text); + scan_stat = 6; + } + break; - case 8: /* checking whether the following line is part of a - folded header */ - if (*p1 != ' ' && *p1 != '\t') { - --p1; - str_left = 1; /* quit_loop */ + case 7: /* expecting a "\n" character */ + if (*p1 == '\n') { + scan_stat = 8; + } else { + /* bare CR */ + _php_iconv_appendc(pretval, '\r', cd_pl); + _php_iconv_appendc(pretval, *p1, cd_pl); + scan_stat = 0; + } break; - } - if (encoded_word == NULL) { - _php_iconv_appendc(pretval, ' ', cd_pl); - } - spaces = NULL; - scan_stat = 11; - break; - case 6: /* expecting a End-Of-Chunk character "=" */ - if (*p1 != '=') { - if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { - /* pass the entire chunk through the converter */ - err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); - if (err != PHP_ICONV_ERR_SUCCESS) { - goto out; - } - encoded_word = NULL; - if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { - scan_stat = 12; - } else { - scan_stat = 0; - } + case 8: /* checking whether the following line is part of a + folded header */ + if (*p1 != ' ' && *p1 != '\t') { + --p1; + str_left = 1; /* quit_loop */ break; - } else { - err = PHP_ICONV_ERR_MALFORMED; - goto out; } - } - scan_stat = 9; - if (str_left == 1) { - eos = 1; - } else { + if (encoded_word == NULL) { + _php_iconv_appendc(pretval, ' ', cd_pl); + } + spaces = NULL; + scan_stat = 11; break; - } - /* TODO might want to rearrange logic so this is more obvious */ - ZEND_FALLTHROUGH; - case 9: /* choice point, seeing what to do next.*/ - switch (*p1) { - default: - /* Handle non-RFC-compliant formats - * - * RFC2047 requires the character that comes right - * after an encoded word (chunk) to be a whitespace, - * while there are lots of broken implementations that - * generate such malformed headers that don't fulfill - * that requirement. - */ - if (!eos) { + case 6: /* expecting a End-Of-Chunk character "=" */ + if (*p1 != '=') { + if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { + /* pass the entire chunk through the converter */ + err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); + if (err != PHP_ICONV_ERR_SUCCESS) { + goto out_try; + } + encoded_word = NULL; if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { - /* pass the entire chunk through the converter */ - err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); - if (err != PHP_ICONV_ERR_SUCCESS) { - goto out; - } scan_stat = 12; - break; + } else { + scan_stat = 0; } + break; + } else { + err = PHP_ICONV_ERR_MALFORMED; + goto out_try; } - ZEND_FALLTHROUGH; - - case '\r': case '\n': case ' ': case '\t': { - zend_string *decoded_text; - - switch (enc_scheme) { - case PHP_ICONV_ENC_SCHEME_BASE64: - decoded_text = php_base64_decode((unsigned char*)encoded_text, encoded_text_len); - break; - - case PHP_ICONV_ENC_SCHEME_QPRINT: - decoded_text = php_quot_print_decode((unsigned char*)encoded_text, encoded_text_len, 1); - break; - default: - decoded_text = NULL; - break; - } + } + scan_stat = 9; + if (str_left == 1) { + eos = 1; + } else { + break; + } + /* TODO might want to rearrange logic so this is more obvious */ + ZEND_FALLTHROUGH; - if (decoded_text == NULL) { - if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { - /* pass the entire chunk through the converter */ - err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); - if (err != PHP_ICONV_ERR_SUCCESS) { - goto out; - } - encoded_word = NULL; + case 9: /* choice point, seeing what to do next.*/ + switch (*p1) { + default: + /* Handle non-RFC-compliant formats + * + * RFC2047 requires the character that comes right + * after an encoded word (chunk) to be a whitespace, + * while there are lots of broken implementations that + * generate such malformed headers that don't fulfill + * that requirement. + */ + if (!eos) { if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { + /* pass the entire chunk through the converter */ + err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); + if (err != PHP_ICONV_ERR_SUCCESS) { + goto out_try; + } scan_stat = 12; - } else { - scan_stat = 0; + break; } - break; - } else { - err = PHP_ICONV_ERR_UNKNOWN; - goto out; } - } + ZEND_FALLTHROUGH; - err = _php_iconv_appendl(pretval, ZSTR_VAL(decoded_text), ZSTR_LEN(decoded_text), cd); - if (err == PHP_ICONV_ERR_SUCCESS) { - err = _php_iconv_appendl(pretval, NULL, 0, cd); - } - zend_string_release_ex(decoded_text, 0); + case '\r': case '\n': case ' ': case '\t': { + zend_string *decoded_text; - if (err != PHP_ICONV_ERR_SUCCESS) { - if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { - /* pass the entire chunk through the converter */ - err = _php_iconv_appendl(pretval, encoded_word, (size_t)(p1 - encoded_word), cd_pl); - encoded_word = NULL; - if (err != PHP_ICONV_ERR_SUCCESS) { + switch (enc_scheme) { + case PHP_ICONV_ENC_SCHEME_BASE64: + decoded_text = php_base64_decode((unsigned char*)encoded_text, encoded_text_len); + break; + + case PHP_ICONV_ENC_SCHEME_QPRINT: + decoded_text = php_quot_print_decode((unsigned char*)encoded_text, encoded_text_len, 1); + break; + default: + decoded_text = NULL; + break; + } + + if (decoded_text == NULL) { + if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { + /* pass the entire chunk through the converter */ + err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl); + if (err != PHP_ICONV_ERR_SUCCESS) { + goto out_try; + } + encoded_word = NULL; + if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { + scan_stat = 12; + } else { + scan_stat = 0; + } break; + } else { + err = PHP_ICONV_ERR_UNKNOWN; + goto out_try; } - } else { - goto out; } - } - if (eos) { /* reached end-of-string. done. */ - scan_stat = 0; - break; - } + err = _php_iconv_appendl(pretval, ZSTR_VAL(decoded_text), ZSTR_LEN(decoded_text), cd); + if (err == PHP_ICONV_ERR_SUCCESS) { + err = _php_iconv_appendl(pretval, NULL, 0, cd); + } + zend_string_release_ex(decoded_text, 0); - switch (*p1) { - case '\r': /* part of an EOL sequence? */ - scan_stat = 7; - break; + if (err != PHP_ICONV_ERR_SUCCESS) { + if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { + /* pass the entire chunk through the converter */ + err = _php_iconv_appendl(pretval, encoded_word, (size_t)(p1 - encoded_word), cd_pl); + encoded_word = NULL; + if (err != PHP_ICONV_ERR_SUCCESS) { + break; + } + } else { + goto out_try; + } + } - case '\n': - scan_stat = 8; + if (eos) { /* reached end-of-string. done. */ + scan_stat = 0; break; + } - case '=': /* first letter of an encoded chunk */ - scan_stat = 1; - break; + switch (*p1) { + case '\r': /* part of an EOL sequence? */ + scan_stat = 7; + break; - case ' ': case '\t': /* medial whitespaces */ - spaces = p1; - scan_stat = 11; - break; + case '\n': + scan_stat = 8; + break; - default: /* first letter of a non-encoded word */ - _php_iconv_appendc(pretval, *p1, cd_pl); - scan_stat = 12; - break; - } - } break; - } - break; + case '=': /* first letter of an encoded chunk */ + scan_stat = 1; + break; - case 10: /* expects a language specifier. dismiss it for now */ - if (*p1 == '?') { - scan_stat = 3; - } - break; + case ' ': case '\t': /* medial whitespaces */ + spaces = p1; + scan_stat = 11; + break; - case 11: /* expecting a chunk of whitespaces */ - switch (*p1) { - case '\r': /* part of an EOL sequence? */ - scan_stat = 7; - break; + default: /* first letter of a non-encoded word */ + _php_iconv_appendc(pretval, *p1, cd_pl); + scan_stat = 12; + break; + } + } break; + } + break; - case '\n': - scan_stat = 8; - break; + case 10: /* expects a language specifier. dismiss it for now */ + if (*p1 == '?') { + scan_stat = 3; + } + break; - case '=': /* first letter of an encoded chunk */ - if (spaces != NULL && encoded_word == NULL) { - _php_iconv_appendl(pretval, spaces, (size_t)(p1 - spaces), cd_pl); - spaces = NULL; - } - encoded_word = p1; - scan_stat = 1; - break; + case 11: /* expecting a chunk of whitespaces */ + switch (*p1) { + case '\r': /* part of an EOL sequence? */ + scan_stat = 7; + break; - case ' ': case '\t': - break; + case '\n': + scan_stat = 8; + break; - default: /* first letter of a non-encoded word */ - if (spaces != NULL) { - _php_iconv_appendl(pretval, spaces, (size_t)(p1 - spaces), cd_pl); - spaces = NULL; - } - _php_iconv_appendc(pretval, *p1, cd_pl); - encoded_word = NULL; - if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { - scan_stat = 12; - } else { - scan_stat = 0; - } - break; - } - break; + case '=': /* first letter of an encoded chunk */ + if (spaces != NULL && encoded_word == NULL) { + _php_iconv_appendl(pretval, spaces, (size_t)(p1 - spaces), cd_pl); + spaces = NULL; + } + encoded_word = p1; + scan_stat = 1; + break; - case 12: /* expecting a non-encoded word */ - switch (*p1) { - case '\r': /* part of an EOL sequence? */ - scan_stat = 7; - break; + case ' ': case '\t': + break; - case '\n': - scan_stat = 8; - break; + default: /* first letter of a non-encoded word */ + if (spaces != NULL) { + _php_iconv_appendl(pretval, spaces, (size_t)(p1 - spaces), cd_pl); + spaces = NULL; + } + _php_iconv_appendc(pretval, *p1, cd_pl); + encoded_word = NULL; + if ((mode & PHP_ICONV_MIME_DECODE_STRICT)) { + scan_stat = 12; + } else { + scan_stat = 0; + } + break; + } + break; - case ' ': case '\t': - spaces = p1; - scan_stat = 11; - break; + case 12: /* expecting a non-encoded word */ + switch (*p1) { + case '\r': /* part of an EOL sequence? */ + scan_stat = 7; + break; - case '=': /* first letter of an encoded chunk */ - if (!(mode & PHP_ICONV_MIME_DECODE_STRICT)) { - encoded_word = p1; - scan_stat = 1; + case '\n': + scan_stat = 8; break; - } - ZEND_FALLTHROUGH; - default: - _php_iconv_appendc(pretval, *p1, cd_pl); - break; - } - break; + case ' ': case '\t': + spaces = p1; + scan_stat = 11; + break; + + case '=': /* first letter of an encoded chunk */ + if (!(mode & PHP_ICONV_MIME_DECODE_STRICT)) { + encoded_word = p1; + scan_stat = 1; + break; + } + ZEND_FALLTHROUGH; + + default: + _php_iconv_appendc(pretval, *p1, cd_pl); + break; + } + break; + } } - } - switch (scan_stat) { - case 0: case 8: case 11: case 12: - break; - default: - if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { - if (scan_stat == 1) { - _php_iconv_appendc(pretval, '=', cd_pl); + switch (scan_stat) { + case 0: case 8: case 11: case 12: + break; + default: + if ((mode & PHP_ICONV_MIME_DECODE_CONTINUE_ON_ERROR)) { + if (scan_stat == 1) { + _php_iconv_appendc(pretval, '=', cd_pl); + } + err = PHP_ICONV_ERR_SUCCESS; + } else { + err = PHP_ICONV_ERR_MALFORMED; + goto out_try; } - err = PHP_ICONV_ERR_SUCCESS; - } else { - err = PHP_ICONV_ERR_MALFORMED; - goto out; - } - } + } - if (next_pos != NULL) { - *next_pos = p1; - } + if (next_pos != NULL) { + *next_pos = p1; + } + + smart_str_0(pretval); + +out_try: ; + } zend_catch { + bailout = true; + } zend_end_try(); - smart_str_0(pretval); out: if (cd != (iconv_t)(-1)) { iconv_close(cd); @@ -1736,6 +1768,9 @@ if (cd_pl != (iconv_t)(-1)) { iconv_close(cd_pl); } + if (bailout) { + zend_bailout(); + } return err; } /* }}} */ @@ -2577,7 +2612,7 @@ { php_stream_filter *retval = NULL; php_iconv_stream_filter *inst; - char *from_charset = NULL, *to_charset = NULL; + const char *from_charset = NULL, *to_charset = NULL; size_t from_charset_len, to_charset_len; if ((from_charset = strchr(name, '.')) == NULL) { diff -Nru php8.4-8.4.16/ext/iconv/tests/gh17399.phpt php8.4-8.4.21/ext/iconv/tests/gh17399.phpt --- php8.4-8.4.16/ext/iconv/tests/gh17399.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/iconv/tests/gh17399.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,13 @@ +--TEST-- +GH-17399 (iconv memory leak with large line-length in iconv_mime_encode) +--EXTENSIONS-- +iconv +--FILE-- + PHP_INT_MAX, +]; +iconv_mime_encode('Subject', 'test', $options); +?> +--EXPECTF-- +Fatal error: Allowed memory size of %d bytes exhausted %s in %s on line %d diff -Nru php8.4-8.4.16/ext/iconv/tests/gh17399_iconv.phpt php8.4-8.4.21/ext/iconv/tests/gh17399_iconv.phpt --- php8.4-8.4.16/ext/iconv/tests/gh17399_iconv.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/iconv/tests/gh17399_iconv.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,13 @@ +--TEST-- +GH-17399 (iconv() leak on bailout) +--EXTENSIONS-- +iconv +--INI-- +memory_limit=2M +--FILE-- + +--EXPECTF-- +Fatal error: Allowed memory size of %d bytes exhausted %s in %s on line %d diff -Nru php8.4-8.4.16/ext/iconv/tests/gh17399_mime_decode.phpt php8.4-8.4.21/ext/iconv/tests/gh17399_mime_decode.phpt --- php8.4-8.4.16/ext/iconv/tests/gh17399_mime_decode.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/iconv/tests/gh17399_mime_decode.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,13 @@ +--TEST-- +GH-17399 (iconv_mime_decode() leak on bailout) +--EXTENSIONS-- +iconv +--INI-- +memory_limit=2M +--FILE-- + +--EXPECTF-- +Fatal error: Allowed memory size of %d bytes exhausted %s in %s on line %d diff -Nru php8.4-8.4.16/ext/iconv/tests/gh17399_substr.phpt php8.4-8.4.21/ext/iconv/tests/gh17399_substr.phpt --- php8.4-8.4.16/ext/iconv/tests/gh17399_substr.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/iconv/tests/gh17399_substr.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,17 @@ +--TEST-- +GH-17399 (iconv_substr() leak on bailout) +--EXTENSIONS-- +iconv +--INI-- +memory_limit=2M +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Fatal error: Allowed memory size of %d bytes exhausted %s in %s on line %d diff -Nru php8.4-8.4.16/ext/iconv/tests/gh21664.phpt php8.4-8.4.21/ext/iconv/tests/gh21664.phpt --- php8.4-8.4.16/ext/iconv/tests/gh21664.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/iconv/tests/gh21664.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,21 @@ +--TEST-- +GH-21664 (iconv_mime_decode/iconv_mime_encode bailout corruption) +--EXTENSIONS-- +iconv +--FILE-- + "UTF-8", "output-charset" => "UTF-8"]); +var_dump($r); + +echo "Done\n"; +?> +--EXPECTF-- +Notice: iconv_mime_decode(): Detected an illegal character in input string in %s on line %d +bool(false) + +Notice: iconv_mime_encode(): Detected an illegal character in input string in %s on line %d +bool(false) +Done diff -Nru php8.4-8.4.16/ext/intl/locale/locale_methods.c php8.4-8.4.21/ext/intl/locale/locale_methods.c --- php8.4-8.4.16/ext/intl/locale/locale_methods.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/intl/locale/locale_methods.c 2026-05-05 16:34:12.000000000 +0000 @@ -1219,7 +1219,7 @@ if( *str == '-' ){ *retstr = '_'; } else { - *retstr = tolower(*str); + *retstr = tolower((unsigned char)*str); } str++; retstr++; diff -Nru php8.4-8.4.16/ext/intl/msgformat/msgformat_helpers.cpp php8.4-8.4.21/ext/intl/msgformat/msgformat_helpers.cpp --- php8.4-8.4.16/ext/intl/msgformat/msgformat_helpers.cpp 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/intl/msgformat/msgformat_helpers.cpp 2026-05-05 16:34:12.000000000 +0000 @@ -457,6 +457,7 @@ char *message; spprintf(&message, 0, "Invalid UTF-8 data in string argument: " "'%s'", ZSTR_VAL(str)); + zend_tmp_string_release(tmp_str); intl_errors_set(&err, err.code, message, 1); efree(message); delete text; diff -Nru php8.4-8.4.16/ext/intl/tests/msgfmt_format_error4.phpt php8.4-8.4.21/ext/intl/tests/msgfmt_format_error4.phpt --- php8.4-8.4.16/ext/intl/tests/msgfmt_format_error4.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/intl/tests/msgfmt_format_error4.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -14,10 +14,19 @@ var_dump($mf->format(array("foo" => 7, "\x80" => "bar"))); var_dump($mf->format(array("foo" => "\x80"))); + +var_dump($mf->format(array("foo" => new class { + function __toString(): string { + return str_repeat("\x80", random_int(1, 1)); + } +}))); ?> --EXPECTF-- Warning: MessageFormatter::format(): Invalid UTF-8 data in argument key: '' in %s on line %d bool(false) Warning: MessageFormatter::format(): Invalid UTF-8 data in string argument: '' in %s on line %d +bool(false) + +Warning: MessageFormatter::format(): Invalid UTF-8 data in string argument: '' in %s on line %d bool(false) diff -Nru php8.4-8.4.16/ext/json/json_scanner.c php8.4-8.4.21/ext/json/json_scanner.c --- php8.4-8.4.16/ext/json/json_scanner.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/json/json_scanner.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 3.1 */ +/* Generated by re2c 4.3 */ /* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | @@ -111,52 +111,46 @@ { YYCTYPE yych; unsigned int yyaccept = 0; - static const unsigned char yybm_JS[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64, 0, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + static const unsigned char yybm_JS[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 0, 0, 0, 64, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 64, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }; if (YYGETCONDITION() < 2) { - if (YYGETCONDITION() < 1) { - goto yyc_JS; - } else { - goto yyc_STR_P1; - } + if (YYGETCONDITION() < 1) goto yyc_JS; + else goto yyc_STR_P1; } else { - if (YYGETCONDITION() < 3) { - goto yyc_STR_P2_BIN; - } else { - goto yyc_STR_P2_UTF; - } + if (YYGETCONDITION() < 3) goto yyc_STR_P2_BIN; + else goto yyc_STR_P2_UTF; } /* *********************************** */ yyc_JS: @@ -264,9 +258,7 @@ yy2: yych = *++YYCURSOR; yy3: - if (yybm_JS[0+yych] & 64) { - goto yy2; - } + if (yybm_JS[0+yych] & 64) goto yy2; yy4: { goto std; } yy5: @@ -338,9 +330,7 @@ yy14: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if (yybm_JS[0+yych] & 128) { - goto yy14; - } + if (yybm_JS[0+yych] & 128) goto yy14; if (yych <= 'D') { if (yych == '.') goto yy32; goto yy13; @@ -434,17 +424,11 @@ yy33: YYCURSOR = YYMARKER; if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy13; - } else { - goto yy8; - } + if (yyaccept == 0) goto yy13; + else goto yy8; } else { - if (yyaccept == 2) { - goto yy24; - } else { - goto yy41; - } + if (yyaccept == 2) goto yy24; + else goto yy41; } yy34: yych = *++YYCURSOR; @@ -718,11 +702,8 @@ yy68: YYCURSOR = YYMARKER; if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy56; - } else { - goto yy58; - } + if (yyaccept == 0) goto yy56; + else goto yy58; } else { goto yy88; } @@ -1125,11 +1106,8 @@ } yy110: YYCURSOR = YYMARKER; - if (yyaccept == 0) { - goto yy99; - } else { - goto yy101; - } + if (yyaccept == 0) goto yy99; + else goto yy101; yy111: yych = *++YYCURSOR; if (yych <= 0x7F) goto yy110; diff -Nru php8.4-8.4.16/ext/json/php_json_scanner_defs.h php8.4-8.4.21/ext/json/php_json_scanner_defs.h --- php8.4-8.4.16/ext/json/php_json_scanner_defs.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/json/php_json_scanner_defs.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 3.1 */ +/* Generated by re2c 4.3 */ enum YYCONDTYPE { yycJS, diff -Nru php8.4-8.4.16/ext/ldap/ldap.c php8.4-8.4.21/ext/ldap/ldap.c --- php8.4-8.4.16/ext/ldap/ldap.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/ldap/ldap.c 2026-05-05 16:34:12.000000000 +0000 @@ -663,14 +663,15 @@ goto failure; } + zend_string *context_str = NULL; if ((tmp = zend_hash_str_find(Z_ARRVAL_P(val), "context", sizeof("context") - 1)) != NULL) { - tmpstring = zval_get_string(tmp); + context_str = zval_get_string(tmp); if (EG(exception)) { rc = -1; goto failure; } - context.bv_val = ZSTR_VAL(tmpstring); - context.bv_len = ZSTR_LEN(tmpstring); + context.bv_val = ZSTR_VAL(context_str); + context.bv_len = ZSTR_LEN(context_str); vlvInfo.ldvlv_context = &context; } else { vlvInfo.ldvlv_context = NULL; @@ -682,6 +683,9 @@ if (rc != LDAP_SUCCESS) { php_error_docref(NULL, E_WARNING, "Failed to create VLV control value: %s (%d)", ldap_err2string(rc), rc); } + if (context_str) { + zend_string_release_ex(context_str, false); + } } else { zend_type_error("%s(): Control OID %s cannot be of type array", get_active_function_name(), ZSTR_VAL(control_oid)); rc = -1; diff -Nru php8.4-8.4.16/ext/ldap/tests/GHSA-g665-fm4p-vhff-1.phpt php8.4-8.4.21/ext/ldap/tests/GHSA-g665-fm4p-vhff-1.phpt --- php8.4-8.4.16/ext/ldap/tests/GHSA-g665-fm4p-vhff-1.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/ldap/tests/GHSA-g665-fm4p-vhff-1.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -6,6 +6,7 @@ memory_limit=-1 --SKIPIF-- diff -Nru php8.4-8.4.16/ext/ldap/tests/GHSA-g665-fm4p-vhff-2.phpt php8.4-8.4.21/ext/ldap/tests/GHSA-g665-fm4p-vhff-2.phpt --- php8.4-8.4.16/ext/ldap/tests/GHSA-g665-fm4p-vhff-2.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/ldap/tests/GHSA-g665-fm4p-vhff-2.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -6,6 +6,7 @@ memory_limit=-1 --SKIPIF-- diff -Nru php8.4-8.4.16/ext/ldap/tests/ldap_set_option_leak_attrvalue_context.phpt php8.4-8.4.21/ext/ldap/tests/ldap_set_option_leak_attrvalue_context.phpt --- php8.4-8.4.16/ext/ldap/tests/ldap_set_option_leak_attrvalue_context.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/ldap/tests/ldap_set_option_leak_attrvalue_context.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,34 @@ +--TEST-- +ldap_set_option() - Leaks attrvalue and context +--EXTENSIONS-- +ldap +--FILE-- + "2.16.840.1.113730.3.4.9", "value" => ["attrvalue" => $attrvalue, "context" => $context, "before" => 0, "after" => 0]], +]; + +ldap_set_option($link, LDAP_OPT_CLIENT_CONTROLS, $controls); +ldap_get_option($link, LDAP_OPT_CLIENT_CONTROLS, $controls_out); + +var_dump($controls_out); +?> +--EXPECTF-- +array(1) { + ["2.16.840.1.113730.3.4.9"]=> + array(3) { + ["oid"]=> + string(23) "2.16.840.1.113730.3.4.9" + ["iscritical"]=> + bool(false) + ["value"]=> + string(28) "0%0%0 attrvaluecontext" + } +} diff -Nru php8.4-8.4.16/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c php8.4-8.4.21/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c --- php8.4-8.4.16/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c 2026-05-05 16:34:12.000000000 +0000 @@ -349,7 +349,8 @@ /* search MIME charset name */ for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) { if ((*encoding)->mime_name) { - if (strncasecmp((*encoding)->mime_name, name, name_len) == 0 && (*encoding)->mime_name[name_len] == '\0') { + size_t mime_len = strlen((*encoding)->mime_name); + if (mime_len == name_len && strncasecmp((*encoding)->mime_name, name, name_len) == 0) { return *encoding; } } @@ -359,7 +360,8 @@ for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) { if ((*encoding)->aliases) { for (const char **alias = (*encoding)->aliases; *alias; alias++) { - if (strncasecmp(name, *alias, name_len) == 0 && (*alias)[name_len] == '\0') { + size_t alias_len = strlen(*alias); + if (alias_len == name_len && strncasecmp(name, *alias, name_len) == 0) { return *encoding; } } diff -Nru php8.4-8.4.16/ext/mbstring/mbstring.c php8.4-8.4.21/ext/mbstring/mbstring.c --- php8.4-8.4.16/ext/mbstring/mbstring.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/mbstring/mbstring.c 2026-05-05 16:34:12.000000000 +0000 @@ -630,7 +630,7 @@ static char *php_mb_rfc1867_getword_conf(const zend_encoding *encoding, char *str) /* {{{ */ { - while (*str && isspace(*(unsigned char *)str)) { + while (*str && isspace((unsigned char)*str)) { ++str; } @@ -646,7 +646,7 @@ } else { char *strend = str; - while (*strend && !isspace(*(unsigned char *)strend)) { + while (*strend && !isspace((unsigned char)*strend)) { ++strend; } return php_mb_rfc1867_substring_conf(encoding, str, strend - str, 0); @@ -3376,8 +3376,9 @@ return *elist; } - /* Allocate on stack; when we return, this array is automatically freed */ - struct candidate *array = alloca(elist_size * sizeof(struct candidate)); + /* Allocate on stack or heap */ + ALLOCA_FLAG(use_heap) + struct candidate *array = do_alloca(elist_size * sizeof(struct candidate), use_heap); elist_size = init_candidate_array(array, elist_size, elist, strings, str_lengths, n, strict, order_significant); while (n--) { @@ -3385,6 +3386,7 @@ elist_size = count_demerits(array, elist_size, strict); if (elist_size == 0) { /* All candidates were eliminated */ + free_alloca(array, use_heap); return NULL; } } @@ -3396,7 +3398,10 @@ best = i; } } - return array[best].enc; + + const mbfl_encoding *result = array[best].enc; + free_alloca(array, use_heap); + return result; } /* When doing 'strict' detection, any string which is invalid in the candidate encoding @@ -3691,11 +3696,26 @@ RETVAL_STR(jp_kana_convert(str, enc, opt)); } +static zend_always_inline bool mb_check_stack_limit(void) +{ +#ifdef ZEND_CHECK_STACK_LIMIT + if (UNEXPECTED(zend_call_stack_overflowed(EG(stack_limit)))) { + zend_call_stack_size_error(); + return true; + } +#endif + return false; +} + static unsigned int mb_recursive_count_strings(zval *var) { unsigned int count = 0; ZVAL_DEREF(var); + if (mb_check_stack_limit()) { + return 0; + } + if (Z_TYPE_P(var) == IS_STRING) { count++; } else if (Z_TYPE_P(var) == IS_ARRAY || Z_TYPE_P(var) == IS_OBJECT) { @@ -3726,6 +3746,10 @@ { ZVAL_DEREF(var); + if (mb_check_stack_limit()) { + return true; + } + if (Z_TYPE_P(var) == IS_STRING) { val_list[*count] = (const unsigned char*)Z_STRVAL_P(var); len_list[*count] = Z_STRLEN_P(var); @@ -3763,6 +3787,10 @@ { zval *entry, *orig_var; + if (mb_check_stack_limit()) { + return true; + } + orig_var = var; ZVAL_DEREF(var); @@ -3771,17 +3799,25 @@ zval_ptr_dtor(orig_var); ZVAL_STR(orig_var, ret); } else if (Z_TYPE_P(var) == IS_ARRAY || Z_TYPE_P(var) == IS_OBJECT) { - if (Z_TYPE_P(var) == IS_ARRAY) { - SEPARATE_ARRAY(var); - } - if (Z_REFCOUNTED_P(var)) { - if (Z_IS_RECURSIVE_P(var)) { + HashTable *ht = HASH_OF(var); + HashTable *orig_ht = ht; + + if (ht) { + if (GC_IS_RECURSIVE(ht)) { return true; } - Z_PROTECT_RECURSION_P(var); + + GC_TRY_PROTECT_RECURSION(ht); } - HashTable *ht = HASH_OF(var); + if (Z_TYPE_P(var) == IS_ARRAY) { + SEPARATE_ARRAY(var); + ht = Z_ARRVAL_P(var); + + if (ht && ht != orig_ht && !GC_IS_RECURSIVE(ht)) { + GC_TRY_PROTECT_RECURSION(ht); + } + } if (ht != NULL) { ZEND_HASH_FOREACH_VAL(ht, entry) { /* Can be a typed property declaration, in which case we need to remove the reference from the source list. @@ -3800,16 +3836,22 @@ } if (mb_recursive_convert_variable(entry, from_encoding, to_encoding)) { - if (Z_REFCOUNTED_P(var)) { - Z_UNPROTECT_RECURSION_P(var); + if (ht && ht != orig_ht) { + GC_TRY_UNPROTECT_RECURSION(ht); + } + if (orig_ht) { + GC_TRY_UNPROTECT_RECURSION(orig_ht); } return true; } } ZEND_HASH_FOREACH_END(); } - if (Z_REFCOUNTED_P(var)) { - Z_UNPROTECT_RECURSION_P(var); + if (ht && ht != orig_ht) { + GC_TRY_UNPROTECT_RECURSION(ht); + } + if (orig_ht) { + GC_TRY_UNPROTECT_RECURSION(orig_ht); } } @@ -3883,7 +3925,9 @@ efree(ZEND_VOIDP(elist)); efree(ZEND_VOIDP(val_list)); efree(len_list); - php_error_docref(NULL, E_WARNING, "Cannot handle recursive references"); + if (!EG(exception)) { + php_error_docref(NULL, E_WARNING, "Cannot handle recursive references"); + } RETURN_FALSE; } } @@ -3905,7 +3949,9 @@ zval *zv = &args[n]; ZVAL_DEREF(zv); if (mb_recursive_convert_variable(zv, from_encoding, to_encoding)) { - php_error_docref(NULL, E_WARNING, "Cannot handle recursive references"); + if (!EG(exception)) { + php_error_docref(NULL, E_WARNING, "Cannot handle recursive references"); + } RETURN_FALSE; } } @@ -5848,6 +5894,11 @@ } size_t pad_length = mb_get_strlen(pad, encoding); + if (pad_length == 0) { + /* Possible with invalidly encoded padding string. */ + zend_argument_must_not_be_empty_error(3); + RETURN_THROWS(); + } size_t num_mb_pad_chars = pad_to_length - input_length; @@ -6662,13 +6713,15 @@ p = temp; /* Decoding of MIME encoded word was successful; * Try to collapse a run of whitespace */ - if (p < e && (*p == '\n' || *p == '\r')) { + if (p < e && (*p == '\n' || *p == '\r' || *p == '\t' || *p == ' ')) { do { p++; } while (p < e && (*p == '\n' || *p == '\r' || *p == '\t' || *p == ' ')); /* We will only actually output a space if this is not immediately followed * by another valid encoded word */ space_pending = true; + } else { + space_pending = false; } continue; } diff -Nru php8.4-8.4.16/ext/mbstring/php_mbregex.c php8.4-8.4.21/ext/mbstring/php_mbregex.c --- php8.4-8.4.16/ext/mbstring/php_mbregex.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/mbstring/php_mbregex.c 2026-05-05 16:34:12.000000000 +0000 @@ -409,8 +409,13 @@ if (mbctype == ONIG_ENCODING_UNDEF) { return FAILURE; } + const mbfl_encoding *mbfl_enc = mbfl_name2encoding(encname); + if (mbfl_enc == NULL) { + /* Encoding supported by Oniguruma but not by mbfl */ + return FAILURE; + } MBREX(current_mbctype) = mbctype; - MBREX(current_mbctype_mbfl_encoding) = mbfl_name2encoding(encname); + MBREX(current_mbctype_mbfl_encoding) = mbfl_enc; return SUCCESS; } /* }}} */ @@ -779,7 +784,7 @@ continue; } if (name_end[0] == delim) break; - if (maybe_num && !isdigit(name_end[0])) maybe_num = 0; + if (maybe_num && !isdigit((unsigned char)name_end[0])) maybe_num = 0; name_end++; } p = name_end + 1; diff -Nru php8.4-8.4.16/ext/mbstring/tests/GHSA-74r9-qxhc-fx53.phpt php8.4-8.4.21/ext/mbstring/tests/GHSA-74r9-qxhc-fx53.phpt --- php8.4-8.4.16/ext/mbstring/tests/GHSA-74r9-qxhc-fx53.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/mbstring/tests/GHSA-74r9-qxhc-fx53.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,50 @@ +--TEST-- +GHSA-74r9-qxhc-fx53: Out-of-bounds access in mbfl_name2encoding_ex() +--CREDITS-- +Akshay Jain (AkshayJainG) +--EXTENSIONS-- +mbstring +--FILE-- +getMessage(), "\n"; + } +} + +ini_set('mbstring.detect_order', $encoding); +ini_set('mbstring.detect_order', $alias); +ini_set('mbstring.http_output', $encoding); +ini_set('mbstring.http_output', $alias); + +test(fn () => mb_convert_encoding('foo', $encoding, $encoding)); +test(fn () => mb_convert_encoding('foo', $alias, $alias)); +test(fn () => mb_detect_encoding('foo', $encoding)); +test(fn () => mb_detect_encoding('foo', $alias)); +test(fn () => mb_convert_variables($encoding, $alias, $var)); +test(fn () => mb_detect_order($encoding)); +test(fn () => mb_detect_order($alias)); + +?> +--EXPECTF-- +Warning: ini_set(): INI setting contains invalid encoding "UTF-8" in %s on line %d + +Warning: ini_set(): INI setting contains invalid encoding "binary" in %s on line %d + +Deprecated: ini_set(): Use of mbstring.http_output is deprecated in %s on line %d + +Deprecated: ini_set(): Use of mbstring.http_output is deprecated in %s on line %d +ValueError: mb_convert_encoding(): Argument #3 ($from_encoding) contains invalid encoding "UTF-8" +ValueError: mb_convert_encoding(): Argument #3 ($from_encoding) contains invalid encoding "binary" +ValueError: mb_detect_encoding(): Argument #2 ($encodings) contains invalid encoding "UTF-8" +ValueError: mb_detect_encoding(): Argument #2 ($encodings) contains invalid encoding "binary" +ValueError: mb_convert_variables(): Argument #2 ($from_encoding) contains invalid encoding "binary" +ValueError: mb_detect_order(): Argument #1 ($encoding) contains invalid encoding "UTF-8" +ValueError: mb_detect_order(): Argument #1 ($encoding) contains invalid encoding "binary" diff -Nru php8.4-8.4.16/ext/mbstring/tests/gh20674.phpt php8.4-8.4.21/ext/mbstring/tests/gh20674.phpt --- php8.4-8.4.16/ext/mbstring/tests/gh20674.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/mbstring/tests/gh20674.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,40 @@ +--TEST-- +GH-20674 (mb_decode_mimeheader does not handle separator) +--EXTENSIONS-- +mbstring +--FILE-- + +--EXPECTF-- +string(11) "The PHP 8.5" +string(11) "The PHP 8.5" +string(11) "The PHP 8.5" +string(11) "The PHP 8.5" +string(3) "(a)" +string(5) "(a b)" +string(5) "(a b)" +string(4) "(ab)" +string(4) "(ab)" +string(4) "(ab)" diff -Nru php8.4-8.4.16/ext/mbstring/tests/gh20833.phpt php8.4-8.4.21/ext/mbstring/tests/gh20833.phpt --- php8.4-8.4.16/ext/mbstring/tests/gh20833.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/mbstring/tests/gh20833.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,16 @@ +--TEST-- +GH-20833 (mb_str_pad() divide by zero if padding string is invalid in the encoding) +--EXTENSIONS-- +mbstring +--FILE-- +getMessage(), "\n"; +} +?> +--EXPECT-- +ValueError: mb_str_pad(): Argument #3 ($pad_string) must not be empty diff -Nru php8.4-8.4.16/ext/mbstring/tests/gh20836.phpt php8.4-8.4.21/ext/mbstring/tests/gh20836.phpt --- php8.4-8.4.16/ext/mbstring/tests/gh20836.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/mbstring/tests/gh20836.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,33 @@ +--TEST-- +GH-20836 (Stack overflow in mb_convert_variables with recursive array references) +--EXTENSIONS-- +mbstring +--FILE-- + ['level2' => ['level3' => 'data']]]; +var_dump(mb_convert_variables('utf-8', 'utf-8', $d)); + +echo "Done\n"; +?> +--EXPECTF-- +Warning: mb_convert_variables(): Cannot handle recursive references in %s on line %d +bool(false) + +Warning: mb_convert_variables(): Cannot handle recursive references in %s on line %d +bool(false) +string(5) "UTF-8" +string(5) "UTF-8" +Done diff -Nru php8.4-8.4.16/ext/mbstring/tests/gh20836_stack_limit.phpt php8.4-8.4.21/ext/mbstring/tests/gh20836_stack_limit.phpt --- php8.4-8.4.16/ext/mbstring/tests/gh20836_stack_limit.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/mbstring/tests/gh20836_stack_limit.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,38 @@ +--TEST-- +GH-20836 (Stack overflow in mb_convert_variables with recursive array references, stack limit case) +--EXTENSIONS-- +mbstring +--SKIPIF-- + +--INI-- +zend.max_allowed_stack_size=256K +--FILE-- + createDeepArray($depth - 1)]; +} + +// Create a deeply nested array that will trigger stack limit +$deepArray = createDeepArray(15000); + +mb_convert_variables('utf-8', 'utf-8', $deepArray); + +echo "Done\n"; +?> +--EXPECTF-- +Fatal error: Uncaught Error: Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? in %s:%d +Stack trace: +#0 %s(%d): mb_convert_variables('utf-8', 'utf-8', Array) +#1 {main} + thrown in %s on line %d diff -Nru php8.4-8.4.16/ext/mbstring/tests/gh21223.phpt php8.4-8.4.21/ext/mbstring/tests/gh21223.phpt --- php8.4-8.4.16/ext/mbstring/tests/gh21223.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/mbstring/tests/gh21223.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,19 @@ +--TEST-- +GH-21223 (Stack overflow in mb_guess_encoding called via mb_detect_encoding) +--EXTENSIONS-- +mbstring +--FILE-- + +--EXPECT-- +string(5) "UTF-8" +Done diff -Nru php8.4-8.4.16/ext/mysqli/mysqli_nonapi.c php8.4-8.4.21/ext/mysqli/mysqli_nonapi.c --- php8.4-8.4.16/ext/mysqli/mysqli_nonapi.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/mysqli/mysqli_nonapi.c 2026-05-05 16:34:12.000000000 +0000 @@ -1018,6 +1018,7 @@ } if (FAIL == mysqlnd_begin_transaction(mysql->mysql, flags, name)) { + MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; } RETURN_TRUE; @@ -1042,6 +1043,7 @@ } if (FAIL == mysqlnd_savepoint(mysql->mysql, name)) { + MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; } RETURN_TRUE; @@ -1065,6 +1067,7 @@ RETURN_THROWS(); } if (FAIL == mysqlnd_release_savepoint(mysql->mysql, name)) { + MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; } RETURN_TRUE; diff -Nru php8.4-8.4.16/ext/mysqli/tests/mysqli_begin_transaction_error.phpt php8.4-8.4.21/ext/mysqli/tests/mysqli_begin_transaction_error.phpt --- php8.4-8.4.16/ext/mysqli/tests/mysqli_begin_transaction_error.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/mysqli/tests/mysqli_begin_transaction_error.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,42 @@ +--TEST-- +mysqli_begin_transaction() +--EXTENSIONS-- +mysqli +--SKIPIF-- +errno, $link->error)); +?> +--FILE-- + +--CLEAN-- + +--EXPECT-- +Expecting an exception. +done! diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir.c php8.4-8.4.21/ext/opcache/jit/ir/ir.c --- php8.4-8.4.16/ext/opcache/jit/ir/ir.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir.c 2026-05-05 16:34:12.000000000 +0000 @@ -118,7 +118,7 @@ { char buf[128]; - if (insn->op == IR_FUNC || insn->op == IR_SYM) { + if (insn->op == IR_FUNC || insn->op == IR_SYM || insn->op == IR_LABEL) { fprintf(f, "%s", ir_get_str(ctx, insn->val.name)); return; } else if (insn->op == IR_STR) { @@ -290,6 +290,7 @@ #define ir_op_kind_prb IR_OPND_PROB #define ir_op_kind_opt IR_OPND_PROB #define ir_op_kind_pro IR_OPND_PROTO +#define ir_op_kind_lbl IR_OPND_LABEL_REF #define _IR_OP_FLAGS(name, flags, op1, op2, op3) \ IR_OP_FLAGS(ir_op_flag_ ## flags, ir_op_kind_ ## op1, ir_op_kind_ ## op2, ir_op_kind_ ## op3), @@ -689,6 +690,13 @@ return ir_const_ex(ctx, val, IR_ADDR, IR_OPTX(IR_STR, IR_ADDR, 0)); } +ir_ref ir_const_label(ir_ctx *ctx, ir_ref str) +{ + ir_val val; + val.u64 = str; + return ir_const_ex(ctx, val, IR_ADDR, IR_OPTX(IR_LABEL, IR_ADDR, 0)); +} + ir_ref ir_str(ir_ctx *ctx, const char *s) { size_t len; @@ -850,7 +858,7 @@ static ir_ref _ir_fold_cse(ir_ctx *ctx, uint32_t opt, ir_ref op1, ir_ref op2, ir_ref op3) { ir_ref ref = ctx->prev_insn_chain[opt & IR_OPT_OP_MASK]; - ir_insn *insn; + const ir_insn *insn; if (ref) { ir_ref limit = ctx->fold_cse_limit; @@ -879,6 +887,17 @@ return IR_UNUSED; } +IR_ALWAYS_INLINE ir_ref _ir_fold_cast(ir_ctx *ctx, ir_ref ref, ir_type type) +{ + if (ctx->ir_base[ref].type == type) { + return ref; + } else if (IR_IS_CONST_REF(ref) && !IR_IS_SYM_CONST(ctx->ir_base[ref].op)) { + return ir_const(ctx, ctx->ir_base[ref].val, type); + } else { + return ir_emit1(ctx, IR_OPT(IR_BITCAST, type), ref); + } +} + #define IR_FOLD(X) IR_FOLD1(X, __LINE__) #define IR_FOLD1(X, Y) IR_FOLD2(X, Y) #define IR_FOLD2(X, Y) case IR_RULE_ ## Y: @@ -935,7 +954,8 @@ * ANY and UNUSED ops are represented by 0 */ -ir_ref ir_folding(ir_ctx *ctx, uint32_t opt, ir_ref op1, ir_ref op2, ir_ref op3, ir_insn *op1_insn, ir_insn *op2_insn, ir_insn *op3_insn) +ir_ref ir_folding(ir_ctx *ctx, uint32_t opt, ir_ref op1, ir_ref op2, ir_ref op3, + const ir_insn *op1_insn, const ir_insn *op2_insn, const ir_insn *op3_insn) { uint8_t op; ir_ref ref; @@ -1117,9 +1137,9 @@ ir_insn_set_op(insn, n, val); } -ir_ref ir_get_op(ir_ctx *ctx, ir_ref ref, int32_t n) +ir_ref ir_get_op(const ir_ctx *ctx, ir_ref ref, int32_t n) { - ir_insn *insn = &ctx->ir_base[ref]; + const ir_insn *insn = &ctx->ir_base[ref]; #ifdef IR_DEBUG if (n > 3) { @@ -1158,7 +1178,7 @@ IR_ASSERT(var < 0); if (!ir_hashtab_add(ctx->binding, def, var)) { /* Add a copy with different binding */ - def = ir_emit2(ctx, IR_OPT(IR_COPY, ctx->ir_base[def].type), def, 1); + def = ir_emit2(ctx, IR_OPT(IR_COPY, ctx->ir_base[def].type), def, IR_COPY_HARD); ir_hashtab_add(ctx->binding, def, var); } return def; @@ -1400,13 +1420,21 @@ if (old_size < new_size) { /* Reallocate the whole edges buffer (this is inefficient) */ ctx->use_edges = ir_mem_realloc(ctx->use_edges, new_size); + if (n == ctx->use_edges_count) { + ctx->use_edges[n] = ref; + use_list->count++; + ctx->use_edges_count++; + return 1; + } } else if (n == ctx->use_edges_count) { ctx->use_edges[n] = ref; use_list->count++; ctx->use_edges_count++; return 0; } - memcpy(ctx->use_edges + ctx->use_edges_count, ctx->use_edges + use_list->refs, use_list->count * sizeof(ir_ref)); + if (use_list->count) { + memcpy(ctx->use_edges + ctx->use_edges_count, ctx->use_edges + use_list->refs, use_list->count * sizeof(ir_ref)); + } use_list->refs = ctx->use_edges_count; ctx->use_edges[use_list->refs + use_list->count] = ref; use_list->count++; @@ -1415,24 +1443,6 @@ } } -static int ir_ref_cmp(const void *p1, const void *p2) -{ - return *(ir_ref*)p1 - *(ir_ref*)p2; -} - -void ir_use_list_sort(ir_ctx *ctx, ir_ref ref) -{ - ir_use_list *use_list; - uint32_t n; - - IR_ASSERT(ref > 0); - use_list = &ctx->use_lists[ref]; - n = use_list->count; - if (n > 1) { - qsort(ctx->use_edges + use_list->refs, n, sizeof(ir_ref), ir_ref_cmp); - } -} - void ir_replace(ir_ctx *ctx, ir_ref ref, ir_ref new_ref) { int i, j, n, *p, use; @@ -1836,8 +1846,49 @@ return 1; } #else + +#if defined(__linux__) && defined(__x86_64__) && defined(PKEY_DISABLE_WRITE) +# define HAVE_PKEY_MPROTECT 1 +#endif + +#ifdef HAVE_PKEY_MPROTECT + +#ifndef PKEY_DISABLE_EXECUTE +# define PKEY_DISABLE_EXECUTE 0 +#endif + +int pkey_mprotect(void* addr, size_t len, int prot, int pkey) __attribute__((weak)); +int pkey_alloc(unsigned int, unsigned int) __attribute__((weak)); +int pkey_free(int) __attribute__((weak)); +int pkey_set(int, unsigned) __attribute__((weak)); + +static int ir_pkey = 0; +#endif + void *ir_mem_mmap(size_t size) { +#ifdef HAVE_PKEY_MPROTECT + if (!ir_pkey && pkey_mprotect) { + int key = pkey_alloc(0, PKEY_DISABLE_WRITE); + if (key > 0) { + ir_pkey = key; + } + } + if (ir_pkey > 0) { + void *ret = mmap(NULL, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (ret == MAP_FAILED) { + return NULL; + } + if (pkey_mprotect(ret, size, PROT_EXEC|PROT_READ|PROT_WRITE, ir_pkey) != 0) { +#ifdef IR_DEBUG + fprintf(stderr, "pkey_mprotect() failed\n"); +#endif + munmap(ret, size); + return NULL; + } + return ret; + } +#endif int prot_flags = PROT_EXEC; #if defined(__NetBSD__) prot_flags |= PROT_MPROTECT(PROT_READ|PROT_WRITE); @@ -1852,11 +1903,28 @@ int ir_mem_unmap(void *ptr, size_t size) { munmap(ptr, size); +#ifdef HAVE_PKEY_MPROTECT +// if (ir_pkey > 0) { +// pkey_free(ir_pkey); +// ir_pkey = 0; +// } +#endif return 1; } int ir_mem_protect(void *ptr, size_t size) { +#ifdef HAVE_PKEY_MPROTECT + if (ir_pkey > 0) { + if (pkey_set(ir_pkey, PKEY_DISABLE_WRITE)) { +#ifdef IR_DEBUG + fprintf(stderr, "mprotect() failed\n"); +#endif + return 0; + } + return 1; + } +#endif if (mprotect(ptr, size, PROT_READ | PROT_EXEC) != 0) { #ifdef IR_DEBUG fprintf(stderr, "mprotect() failed\n"); @@ -1868,6 +1936,17 @@ int ir_mem_unprotect(void *ptr, size_t size) { +#ifdef HAVE_PKEY_MPROTECT + if (ir_pkey > 0) { + if (pkey_set(ir_pkey, PKEY_DISABLE_EXECUTE)) { +#ifdef IR_DEBUG + fprintf(stderr, "mprotect() failed\n"); +#endif + return 0; + } + return 1; + } +#endif if (mprotect(ptr, size, PROT_READ | PROT_WRITE) != 0) { #ifdef IR_DEBUG fprintf(stderr, "mprotect() failed\n"); @@ -1937,7 +2016,7 @@ ir_alias ir_check_partial_aliasing(const ir_ctx *ctx, ir_ref addr1, ir_ref addr2, ir_type type1, ir_type type2) { - ir_insn *insn1, *insn2; + const ir_insn *insn1, *insn2; ir_ref base1, base2, off1, off2; /* this must be already check */ @@ -2029,9 +2108,9 @@ return IR_MAY_ALIAS; } -IR_ALWAYS_INLINE ir_ref ir_find_aliasing_load_i(ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref addr, ir_ref limit) +IR_ALWAYS_INLINE ir_ref ir_find_aliasing_load_i(const ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref addr, ir_ref limit) { - ir_insn *insn; + const ir_insn *insn; uint32_t modified_regset = 0; while (ref > limit) { @@ -2070,7 +2149,26 @@ } } else if (insn->op == IR_RSTORE) { modified_regset |= (1 << insn->op3); - } else if (insn->op == IR_MERGE || insn->op == IR_LOOP_BEGIN || insn->op == IR_CALL || insn->op == IR_VSTORE) { + } else if (insn->op == IR_CALL) { + const ir_insn *func = &ctx->ir_base[insn->op2]; + ir_ref func_proto; + const ir_proto_t *proto; + + if (func->op == IR_FUNC || func->op == IR_FUNC_ADDR) { + func_proto = func->proto; + } else if (func->op == IR_PROTO) { + func_proto = func->op2; + } else { + break; + } + if (!func_proto) { + break; + } + proto = (const ir_proto_t *)ir_get_str(ctx, func_proto); + if (!(proto->flags & (IR_CONST_FUNC|IR_PURE_FUNC))) { + break; + } + } else if (insn->op == IR_MERGE || insn->op == IR_LOOP_BEGIN || insn->op == IR_VSTORE) { return IR_UNUSED; } ref = insn->op1; @@ -2079,14 +2177,14 @@ return IR_UNUSED; } -ir_ref ir_find_aliasing_load(ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref addr) +ir_ref ir_find_aliasing_load(const ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref addr) { return ir_find_aliasing_load_i(ctx, ref, type, addr, (addr > 0 && addr < ref) ? addr : 1); } -IR_ALWAYS_INLINE ir_ref ir_find_aliasing_vload_i(ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref var) +IR_ALWAYS_INLINE ir_ref ir_find_aliasing_vload_i(const ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref var) { - ir_insn *insn; + const ir_insn *insn; while (ref > var) { insn = &ctx->ir_base[ref]; @@ -2116,7 +2214,26 @@ break; } } - } else if (insn->op == IR_MERGE || insn->op == IR_LOOP_BEGIN || insn->op == IR_CALL || insn->op == IR_STORE) { + } else if (insn->op == IR_CALL) { + const ir_insn *func = &ctx->ir_base[insn->op2]; + ir_ref func_proto; + const ir_proto_t *proto; + + if (func->op == IR_FUNC || func->op == IR_FUNC_ADDR) { + func_proto = func->proto; + } else if (func->op == IR_PROTO) { + func_proto = func->op2; + } else { + break; + } + if (!func_proto) { + break; + } + proto = (const ir_proto_t *)ir_get_str(ctx, func_proto); + if (!(proto->flags & (IR_CONST_FUNC|IR_PURE_FUNC))) { + break; + } + } else if (insn->op == IR_MERGE || insn->op == IR_LOOP_BEGIN || insn->op == IR_STORE) { break; } ref = insn->op1; @@ -2125,7 +2242,7 @@ return IR_UNUSED; } -ir_ref ir_find_aliasing_vload(ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref var) +ir_ref ir_find_aliasing_vload(const ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref var) { return ir_find_aliasing_vload_i(ctx, ref, type, var); } @@ -2421,12 +2538,12 @@ } } -static ir_ref _ir_fold_condition(ir_ctx *ctx, ir_ref ref) +static ir_ref _ir_fold_condition(const ir_ctx *ctx, ir_ref ref) { - ir_insn *insn = &ctx->ir_base[ref]; + const ir_insn *insn = &ctx->ir_base[ref]; if (insn->op == IR_NE && IR_IS_CONST_REF(insn->op2)) { - ir_insn *op2_insn = &ctx->ir_base[insn->op2]; + const ir_insn *op2_insn = &ctx->ir_base[insn->op2]; if (IR_IS_TYPE_INT(op2_insn->type) && op2_insn->val.u64 == 0) { ref = insn->op1; @@ -2439,7 +2556,7 @@ ref = insn->op1; insn = &ctx->ir_base[ref]; } else if (insn->op == IR_EQ && insn->op2 == IR_NULL) { - ir_insn *op1_insn = &ctx->ir_base[insn->op1]; + const ir_insn *op1_insn = &ctx->ir_base[insn->op1]; if (op1_insn->op == IR_ALLOCA || op1_insn->op == IR_VADDR) { return IR_FALSE; } @@ -2451,10 +2568,10 @@ return ref; } -IR_ALWAYS_INLINE ir_ref ir_check_dominating_predicates_i(ir_ctx *ctx, ir_ref ref, ir_ref condition, ir_ref limit) +IR_ALWAYS_INLINE ir_ref ir_check_dominating_predicates_i(const ir_ctx *ctx, ir_ref ref, ir_ref condition, ir_ref limit) { - ir_insn *prev = NULL; - ir_insn *insn; + const ir_insn *prev = NULL; + const ir_insn *insn; while (ref > limit) { insn = &ctx->ir_base[ref]; @@ -2484,7 +2601,7 @@ return condition; } -ir_ref ir_check_dominating_predicates(ir_ctx *ctx, ir_ref ref, ir_ref condition) +ir_ref ir_check_dominating_predicates(const ir_ctx *ctx, ir_ref ref, ir_ref condition) { IR_ASSERT(!IR_IS_CONST_REF(condition)); return ir_check_dominating_predicates_i(ctx, ref, condition, (condition < ref) ? condition : 1); @@ -2625,7 +2742,7 @@ /* count inputs count */ do { - ir_insn *insn = &ctx->ir_base[ref]; + const ir_insn *insn = &ctx->ir_base[ref]; IR_ASSERT(insn->op == IR_END); ref = insn->op2; @@ -2655,8 +2772,10 @@ ir_ref _ir_PHI_LIST(ir_ctx *ctx, ir_ref list) { - ir_insn *merge, *end; - ir_ref phi, *ops, i; + const ir_insn *merge; + const ir_ref *ops; + ir_insn *end; + ir_ref phi, i; ir_type type; if (list == IR_UNUSED) { @@ -3013,6 +3132,16 @@ ctx->control = IR_UNUSED; } +ir_ref _ir_IGOTO(ir_ctx *ctx, ir_ref addr) +{ + ir_ref ref; + + IR_ASSERT(ctx->control); + ctx->control = ref = ir_emit2(ctx, IR_IGOTO, ctx->control, addr); + ctx->control = IR_UNUSED; + return ref; +} + ir_ref _ir_ADD_OFFSET(ir_ctx *ctx, ir_ref addr, uintptr_t offset) { if (offset) { @@ -3110,7 +3239,8 @@ if (EXPECTED(ctx->flags & IR_OPT_FOLDING)) { ref = ir_find_aliasing_vload_i(ctx, ctx->control, type, var); if (ref) { - ir_insn *insn = &ctx->ir_base[ref]; + const ir_insn *insn = &ctx->ir_base[ref]; + if (insn->type == type) { return ref; } else if (ir_type_size[insn->type] == ir_type_size[type]) { @@ -3135,6 +3265,18 @@ ctx->control = ir_emit3(ctx, IR_VSTORE, ctx->control, var, val); } +ir_ref _ir_VLOAD_v(ir_ctx *ctx, ir_type type, ir_ref var) +{ + IR_ASSERT(ctx->control); + return ctx->control = ir_emit2(ctx, IR_OPT(IR_VLOAD_v, type), ctx->control, var); +} + +void _ir_VSTORE_v(ir_ctx *ctx, ir_ref var, ir_ref val) +{ + IR_ASSERT(ctx->control); + ctx->control = ir_emit3(ctx, IR_VSTORE_v, ctx->control, var, val); +} + ir_ref _ir_TLS(ir_ctx *ctx, ir_ref index, ir_ref offset) { IR_ASSERT(ctx->control); @@ -3164,7 +3306,8 @@ } ref = ir_find_aliasing_load_i(ctx, ctx->control, type, addr, (addr > 0) ? addr : 1); if (ref) { - ir_insn *insn = &ctx->ir_base[ref]; + const ir_insn *insn = &ctx->ir_base[ref]; + if (insn->type == type) { return ref; } else if (ir_type_size[insn->type] == ir_type_size[type]) { @@ -3193,6 +3336,18 @@ ctx->control = ir_emit3(ctx, IR_STORE, ctx->control, addr, val); } +ir_ref _ir_LOAD_v(ir_ctx *ctx, ir_type type, ir_ref addr) +{ + IR_ASSERT(ctx->control); + return ctx->control = ir_emit2(ctx, IR_OPT(IR_LOAD_v, type), ctx->control, addr); +} + +void _ir_STORE_v(ir_ctx *ctx, ir_ref addr, ir_ref val) +{ + IR_ASSERT(ctx->control); + ctx->control = ir_emit3(ctx, IR_STORE_v, ctx->control, addr, val); +} + void _ir_VA_START(ir_ctx *ctx, ir_ref list) { IR_ASSERT(ctx->control); @@ -3217,11 +3372,13 @@ return ctx->control = ir_emit2(ctx, IR_OPT(IR_VA_ARG, type), ctx->control, list); } -ir_ref _ir_VA_ARG_EX(ir_ctx *ctx, ir_type type, ir_ref list, size_t size) +ir_ref _ir_VA_ARG_EX(ir_ctx *ctx, ir_type type, ir_ref list, size_t size, size_t align) { IR_ASSERT(ctx->control); - IR_ASSERT(size <= 0x7fffffff); - return ctx->control = ir_emit3(ctx, IR_OPT(IR_VA_ARG, type), ctx->control, list, (ir_ref)size); + IR_ASSERT(size <= 0x0fffffff); + IR_ASSERT(align != 0 && ((align & (align - 1)) == 0) && align <= 128); + return ctx->control = ir_emit3(ctx, IR_OPT(IR_VA_ARG, type), ctx->control, list, + (ir_ref)IR_VA_ARG_OP3(size, align)); } ir_ref _ir_BLOCK_BEGIN(ir_ctx *ctx) diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir.h php8.4-8.4.21/ext/opcache/jit/ir/ir.h --- php8.4-8.4.16/ext/opcache/jit/ir/ir.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir.h 2026-05-05 16:34:12.000000000 +0000 @@ -216,6 +216,7 @@ * prb - branch probability 1-99 (0 - unspecified): (IF_TRUE, IF_FALSE, CASE_VAL, CASE_DEFAULT) * opt - optional number * pro - function prototype + * lbl - label used as value (a reference to constant): (BEGIN) * * The order of IR opcodes is carefully selected for efficient folding. * - foldable instruction go first @@ -322,6 +323,7 @@ _(FUNC_ADDR, r0, ___, ___, ___) /* constant func ref */ \ _(FUNC, r0, ___, ___, ___) /* constant func ref */ \ _(SYM, r0, ___, ___, ___) /* constant symbol ref */ \ + _(LABEL, r0, ___, ___, ___) /* label address ref */ \ _(STR, r0, ___, ___, ___) /* constant str ref */ \ \ /* call ops */ \ @@ -334,11 +336,15 @@ _(BLOCK_BEGIN, a1, src, ___, ___) /* stacksave */ \ _(BLOCK_END, a2, src, def, ___) /* stackrestore */ \ _(VLOAD, l2, src, var, ___) /* load value of local var */ \ + _(VLOAD_v, l2, src, var, ___) /* volatile variant of VLOAD */ \ _(VSTORE, s3, src, var, def) /* store value to local var */ \ + _(VSTORE_v, s3, src, var, def) /* volatile variant of VSTORE */ \ _(RLOAD, l1X2, src, num, opt) /* load value from register */ \ _(RSTORE, s2X1, src, def, num) /* store value into register */ \ _(LOAD, l2, src, ref, ___) /* load from memory */ \ + _(LOAD_v, l2, src, ref, ___) /* volatile variant of VLOAD */ \ _(STORE, s3, src, ref, def) /* store to memory */ \ + _(STORE_v, s3, src, ref, def) /* volatile variant of VSTORE */ \ _(TLS, l1X2, src, num, num) /* thread local variable */ \ _(TRAP, x1, src, ___, ___) /* DebugBreak */ \ /* memory reference ops (A, H, U, S, TMP, STR, NEW, X, V) ??? */ \ @@ -360,7 +366,7 @@ /* control-flow nodes */ \ _(START, S0X1, ret, ___, ___) /* function start */ \ _(ENTRY, S1X1, src, num, ___) /* entry with a fake src edge */ \ - _(BEGIN, S1, src, ___, ___) /* block start */ \ + _(BEGIN, S1X1, src, lbl, ___) /* block start, optional &&lbl */ \ _(IF_TRUE, S1X1, src, prb, ___) /* IF TRUE proj. */ \ _(IF_FALSE, S1X1, src, prb, ___) /* IF FALSE proj. */ \ _(CASE_VAL, S2X1, src, def, prb) /* switch proj. */ \ @@ -372,8 +378,9 @@ _(LOOP_END, E1, src, ___, ___) /* loop end */ \ _(IF, E2, src, def, ___) /* conditional control split */ \ _(SWITCH, E2, src, def, ___) /* multi-way control split */ \ + _(IGOTO, E2, src, def, ___) /* computed goto (internal) */ \ + _(IJMP, T2X1, src, def, ret) /* computed goto (terminating) */ \ _(RETURN, T2X1, src, def, ret) /* function return */ \ - _(IJMP, T2X1, src, def, ret) /* computed goto */ \ _(UNREACHABLE, T1X2, src, ___, ret) /* unreachable (tailcall, etc) */ \ \ /* deoptimization helper */ \ @@ -400,6 +407,13 @@ #define IR_OPTX(op, type, n) ((uint32_t)(op) | ((uint32_t)(type) << IR_OPT_TYPE_SHIFT) | ((uint32_t)(n) << IR_OPT_INPUTS_SHIFT)) #define IR_OPT_TYPE(opt) (((opt) & IR_OPT_TYPE_MASK) >> IR_OPT_TYPE_SHIFT) +/* "opt" modifiers */ +#define IR_COPY_HARD (1<<0) + +#define IR_VA_ARG_SIZE(op3) (((uint32_t)(op3) >> 3)) +#define IR_VA_ARG_ALIGN(op3) (1U << ((uint32_t)(op3) & 0x7)) +#define IR_VA_ARG_OP3(s, a) (((s) << 3) | ir_ntzl(a)) + /* IR References */ typedef int32_t ir_ref; @@ -525,35 +539,36 @@ void ir_strtab_free(ir_strtab *strtab); /* IR Context Flags */ -#define IR_FUNCTION (1<<0) /* Generate a function. */ -#define IR_FASTCALL_FUNC (1<<1) /* Generate a function with fastcall calling convention, x86 32-bit only. */ -#define IR_VARARG_FUNC (1<<2) -#define IR_BUILTIN_FUNC (1<<3) -#define IR_STATIC (1<<4) -#define IR_EXTERN (1<<5) -#define IR_CONST (1<<6) - -#define IR_INITIALIZED (1<<7) /* sym data flag: constant or an initialized variable */ -#define IR_CONST_STRING (1<<8) /* sym data flag: constant string */ - -#define IR_SKIP_PROLOGUE (1<<8) /* Don't generate function prologue. */ -#define IR_USE_FRAME_POINTER (1<<9) -#define IR_PREALLOCATED_STACK (1<<10) -#define IR_NO_STACK_COMBINE (1<<11) -#define IR_START_BR_TARGET (1<<12) -#define IR_ENTRY_BR_TARGET (1<<13) -#define IR_GEN_ENDBR (1<<14) -#define IR_MERGE_EMPTY_ENTRIES (1<<15) - -#define IR_OPT_INLINE (1<<16) -#define IR_OPT_FOLDING (1<<17) -#define IR_OPT_CFG (1<<18) /* merge BBs, by remove END->BEGIN nodes during CFG construction */ -#define IR_OPT_MEM2SSA (1<<19) -#define IR_OPT_CODEGEN (1<<20) -#define IR_GEN_NATIVE (1<<21) -#define IR_GEN_CODE (1<<22) /* C or LLVM */ +#define IR_PROTO_MASK 0xff +#define IR_CALL_CONV_MASK 0x0f -#define IR_GEN_CACHE_DEMOTE (1<<23) /* Demote the generated code from closest CPU caches */ +#define IR_VARARG_FUNC (1<<4) +#define IR_CONST_FUNC (1<<5) +#define IR_PURE_FUNC (1<<6) + +#define IR_CONST (1<<5) +#define IR_INITIALIZED (1<<6) /* sym data flag: constant or an initialized variable */ +#define IR_CONST_STRING (1<<7) /* sym data flag: constant string */ + +#define IR_FUNCTION (1<<8) /* Generate a function. */ +#define IR_STATIC (1<<9) +#define IR_EXTERN (1<<10) + +#define IR_USE_FRAME_POINTER (1<<11) +#define IR_NO_STACK_COMBINE (1<<12) +#define IR_GEN_ENDBR (1<<13) +#define IR_GEN_CACHE_DEMOTE (1<<14) /* Demote the generated code from closest CPU caches */ + +#define IR_SKIP_PROLOGUE (1<<15) /* Don't generate function prologue. */ +#define IR_START_BR_TARGET (1<<16) +#define IR_ENTRY_BR_TARGET (1<<17) +#define IR_MERGE_EMPTY_ENTRIES (1<<18) + +#define IR_OPT_INLINE (1<<19) +#define IR_OPT_FOLDING (1<<20) +#define IR_OPT_CFG (1<<21) /* merge BBs, by remove END->BEGIN nodes during CFG construction */ +#define IR_OPT_MEM2SSA (1<<22) +#define IR_OPT_CODEGEN (1<<23) /* debug related */ #ifdef IR_DEBUG @@ -565,6 +580,24 @@ # define IR_DEBUG_BB_SCHEDULE (1U<<31) #endif +/* Calling Conventions */ +#define IR_CC_DEFAULT 0x00 +#define IR_CC_BUILTIN 0x01 +#define IR_CC_FASTCALL 0x02 +#define IR_CC_PRESERVE_NONE 0x03 + +#if defined(IR_TARGET_X64) +# define IR_CC_X86_64_SYSV 0x08 +# define IR_CC_X86_64_MS 0x09 +#elif defined(IR_TARGET_AARCH64) +# define IR_CC_AARCH64_SYSV 0x08 +# define IR_CC_AARCH64_DARWIN 0x09 +#endif + +/* Deprecated constants */ +#define IR_BUILTIN_FUNC IR_CC_BUILTIN +#define IR_FASTCALL_FUNC IR_CC_FASTCALL + typedef struct _ir_ctx ir_ctx; typedef struct _ir_use_list ir_use_list; typedef struct _ir_block ir_block; @@ -648,7 +681,6 @@ ir_ref vars; /* list of VARs (used by register allocator) */ }; ir_snapshot_create_t snapshot_create; - int32_t stack_frame_alignment; int32_t stack_frame_size; /* spill stack frame size (used by register allocator and code generator) */ int32_t call_stack_size; /* stack for parameter passing (used by register allocator and code generator) */ uint64_t used_preserved_regs; @@ -698,6 +730,7 @@ ir_ref ir_const_func(ir_ctx *ctx, ir_ref str, ir_ref proto); ir_ref ir_const_sym(ir_ctx *ctx, ir_ref str); ir_ref ir_const_str(ir_ctx *ctx, ir_ref str); +ir_ref ir_const_label(ir_ctx *ctx, ir_ref str); ir_ref ir_unique_const_addr(ir_ctx *ctx, uintptr_t c); @@ -711,7 +744,7 @@ #define IR_MAX_PROTO_PARAMS 255 typedef struct _ir_proto_t { - uint8_t flags; + uint8_t flags; /* first 8 bits of ir_ctx.flags */ uint8_t ret_type; uint8_t params_count; uint8_t param_types[5]; @@ -736,7 +769,7 @@ ir_ref ir_emit_N(ir_ctx *ctx, uint32_t opt, int32_t count); void ir_set_op(ir_ctx *ctx, ir_ref ref, int32_t n, ir_ref val); -ir_ref ir_get_op(ir_ctx *ctx, ir_ref ref, int32_t n); +ir_ref ir_get_op(const ir_ctx *ctx, ir_ref ref, int32_t n); IR_ALWAYS_INLINE void ir_set_op1(ir_ctx *ctx, ir_ref ref, ir_ref val) { @@ -830,13 +863,13 @@ int ir_regs_number(void); bool ir_reg_is_int(int32_t reg); const char *ir_reg_name(int8_t reg, ir_type type); -int32_t ir_get_spill_slot_offset(ir_ctx *ctx, ir_ref ref); +int32_t ir_get_spill_slot_offset(const ir_ctx *ctx, ir_ref ref); /* Target CPU instruction selection and code generation (see ir_x86.c) */ int ir_match(ir_ctx *ctx); void *ir_emit_code(ir_ctx *ctx, size_t *size); -bool ir_needs_thunk(ir_code_buffer *code_buffer, void *addr); +bool ir_needs_thunk(const ir_code_buffer *code_buffer, void *addr); void *ir_emit_thunk(ir_code_buffer *code_buffer, void *addr, size_t *size_ptr); void ir_fix_thunk(void *thunk_entry, void *addr); @@ -893,6 +926,7 @@ void*(*resolve_sym_name) (ir_loader *loader, const char *name, uint32_t flags); bool (*has_sym) (ir_loader *loader, const char *name); bool (*add_sym) (ir_loader *loader, const char *name, void *addr); + bool (*add_label) (ir_loader *loader, const char *name, void *addr); }; void ir_loader_init(void); @@ -911,13 +945,14 @@ #define IR_SAVE_REGS (1<<4) /* add info about selected registers */ #define IR_SAVE_SAFE_NAMES (1<<5) /* add '@' prefix to symbol names */ +void ir_print_func_proto(const ir_ctx *ctx, const char *name, bool prefix, FILE *f); void ir_print_proto(const ir_ctx *ctx, ir_ref proto, FILE *f); void ir_print_proto_ex(uint8_t flags, ir_type ret_type, uint32_t params_count, const uint8_t *param_types, FILE *f); void ir_save(const ir_ctx *ctx, uint32_t save_flags, FILE *f); /* IR debug dump API (implementation in ir_dump.c) */ void ir_dump(const ir_ctx *ctx, FILE *f); -void ir_dump_dot(const ir_ctx *ctx, const char *name, FILE *f); +void ir_dump_dot(const ir_ctx *ctx, const char *name, const char *comments, FILE *f); void ir_dump_use_lists(const ir_ctx *ctx, FILE *f); void ir_dump_cfg(ir_ctx *ctx, FILE *f); void ir_dump_cfg_map(const ir_ctx *ctx, FILE *f); diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_aarch64.dasc php8.4-8.4.21/ext/opcache/jit/ir/ir_aarch64.dasc --- php8.4-8.4.16/ext/opcache/jit/ir/ir_aarch64.dasc 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_aarch64.dasc 2026-05-05 16:34:12.000000000 +0000 @@ -60,7 +60,7 @@ #define ADR_IMM (1<<20) // signed imm21 #define ADRP_IMM (1LL<<32) // signed imm21 * 4096 -static bool aarch64_may_use_b(ir_code_buffer *code_buffer, const void *addr) +static bool aarch64_may_use_b(const ir_code_buffer *code_buffer, const void *addr) { if (code_buffer) { if (addr >= code_buffer->start && (char*)addr < (char*)code_buffer->end) { @@ -213,13 +213,21 @@ |.endmacro typedef struct _ir_backend_data { - ir_reg_alloc_data ra_data; - uint32_t dessa_from_block; + ir_reg_alloc_data ra_data; dasm_State *dasm_state; ir_bitset emit_constants; int rodata_label, jmp_table_label; + bool resolved_label_syms; } ir_backend_data; +typedef struct _ir_aarch64_sysv_va_list { + void *stack; + void *gr_top; + void *vr_top; + int32_t gr_offset; + int32_t vr_offset; +} ir_aarch64_sysv_va_list; + #define IR_GP_REG_NAME(code, name64, name32) \ #name64, #define IR_GP_REG_NAME32(code, name64, name32) \ @@ -229,9 +237,11 @@ #define IR_FP_REG_NAME32(code, name64, name32, name16, name8) \ #name32, -static const char *_ir_reg_name[IR_REG_NUM] = { +static const char *_ir_reg_name[] = { IR_GP_REGS(IR_GP_REG_NAME) IR_FP_REGS(IR_FP_REG_NAME) + "ALL", + "SCRATCH", }; static const char *_ir_reg_name32[IR_REG_NUM] = { @@ -239,38 +249,11 @@ IR_FP_REGS(IR_FP_REG_NAME32) }; -/* Calling Convention */ -static const int8_t _ir_int_reg_params[IR_REG_INT_ARGS] = { - IR_REG_INT_ARG1, - IR_REG_INT_ARG2, - IR_REG_INT_ARG3, - IR_REG_INT_ARG4, - IR_REG_INT_ARG5, - IR_REG_INT_ARG6, - IR_REG_INT_ARG7, - IR_REG_INT_ARG8, -}; - -static const int8_t _ir_fp_reg_params[IR_REG_FP_ARGS] = { - IR_REG_FP_ARG1, - IR_REG_FP_ARG2, - IR_REG_FP_ARG3, - IR_REG_FP_ARG4, - IR_REG_FP_ARG5, - IR_REG_FP_ARG6, - IR_REG_FP_ARG7, - IR_REG_FP_ARG8, -}; - const char *ir_reg_name(int8_t reg, ir_type type) { if (reg >= IR_REG_NUM) { - if (reg == IR_REG_SCRATCH) { - return "SCRATCH"; - } else { - IR_ASSERT(reg == IR_REG_ALL); - return "ALL"; - } + IR_ASSERT((uint8_t)reg < sizeof(_ir_reg_name) / sizeof(_ir_reg_name[0])); + return _ir_reg_name[reg]; } IR_ASSERT(reg >= 0 && reg < IR_REG_NUM); if (type == IR_VOID) { @@ -283,6 +266,82 @@ } } +/* Calling Conventions */ +#define IR_REG_SCRATCH_AARCH64 IR_REG_SET_1 + +#define IR_REGSET_SCRATCH_AARCH64 \ + (IR_REGSET_INTERVAL(IR_REG_X0, IR_REG_X18) | \ + IR_REGSET_INTERVAL(IR_REG_V0, IR_REG_V7) | \ + IR_REGSET_INTERVAL(IR_REG_V16, IR_REG_V31)) + +const ir_regset ir_scratch_regset[] = { + IR_REGSET_GP | IR_REGSET_FP, + IR_REGSET_SCRATCH_AARCH64, +}; + +const ir_call_conv_dsc ir_call_conv_aarch64_sysv = { + 0, /* cleanup_stack_by_callee */ + 0, /* pass_struct_by_val */ + 1, /* sysv_varargs */ + 0, /* shadow_param_regs */ + 0, /* shadow_store_size */ + 8, /* int_param_regs_count */ + 8, /* fp_param_regs_count */ + IR_REG_X0 , /* int_ret_reg */ + IR_REG_V0, /* fp_ret_reg */ + IR_REG_NONE, /* fp_varargs_reg */ + IR_REG_SCRATCH_AARCH64, + (const int8_t[8]){IR_REG_X0, IR_REG_X1, IR_REG_X2, IR_REG_X3, IR_REG_X4, IR_REG_X5, IR_REG_X6, IR_REG_X7}, + (const int8_t[8]){IR_REG_V0, IR_REG_V1, IR_REG_V2, IR_REG_V3, IR_REG_V4, IR_REG_V5, IR_REG_V6, IR_REG_V7}, + IR_REGSET_INTERVAL(IR_REG_X19, IR_REG_X30) | IR_REGSET_INTERVAL(IR_REG_V8, IR_REG_V15), + +}; + +const ir_call_conv_dsc ir_call_conv_aarch64_darwin = { + 0, /* cleanup_stack_by_callee */ + 0, /* pass_struct_by_val */ + 0, /* sysv_varargs */ + 0, /* shadow_param_regs */ + 0, /* shadow_store_size */ + 8, /* int_param_regs_count */ + 8, /* fp_param_regs_count */ + IR_REG_X0 , /* int_ret_reg */ + IR_REG_V0, /* fp_ret_reg */ + IR_REG_NONE, /* fp_varargs_reg */ + IR_REG_SCRATCH_AARCH64, + (const int8_t[8]){IR_REG_X0, IR_REG_X1, IR_REG_X2, IR_REG_X3, IR_REG_X4, IR_REG_X5, IR_REG_X6, IR_REG_X7}, + (const int8_t[8]){IR_REG_V0, IR_REG_V1, IR_REG_V2, IR_REG_V3, IR_REG_V4, IR_REG_V5, IR_REG_V6, IR_REG_V7}, + IR_REGSET_INTERVAL(IR_REG_X19, IR_REG_X30) | IR_REGSET_INTERVAL(IR_REG_V8, IR_REG_V15), + +}; + +const ir_call_conv_dsc ir_call_conv_aarch64_preserve_none = { + 0, /* cleanup_stack_by_callee */ + 0, /* pass_struct_by_val */ + 1, /* sysv_varargs */ + 0, /* shadow_param_regs */ + 0, /* shadow_store_size */ + 23, /* int_param_regs_count */ + 8, /* fp_param_regs_count */ + IR_REG_X0 , /* int_ret_reg */ + IR_REG_V0, /* fp_ret_reg */ + IR_REG_NONE, /* fp_varargs_reg */ + IR_REG_ALL, + (const int8_t[23]){IR_REG_X20, IR_REG_X21, IR_REG_X22, IR_REG_X23, IR_REG_X24, IR_REG_X25, IR_REG_X26, IR_REG_X27, + IR_REG_X28, + IR_REG_X0, IR_REG_X1, IR_REG_X2, IR_REG_X3, IR_REG_X4, IR_REG_X5, IR_REG_X6, IR_REG_X7, + IR_REG_X10, IR_REG_X11, IR_REG_X12, IR_REG_X13, IR_REG_X14, IR_REG_X9}, + (const int8_t[8]){IR_REG_V0, IR_REG_V1, IR_REG_V2, IR_REG_V3, IR_REG_V4, IR_REG_V5, IR_REG_V6, IR_REG_V7}, + IR_REGSET_EMPTY, + +}; + +#ifdef __APPLE__ +# define ir_call_conv_default ir_call_conv_aarch64_darwin +#else +# define ir_call_conv_default ir_call_conv_aarch64_sysv +#endif + #define IR_RULES(_) \ _(CMP_INT) \ _(CMP_FP) \ @@ -315,6 +374,7 @@ _(RETURN_VOID) \ _(RETURN_INT) \ _(RETURN_FP) \ + _(IGOTO_DUP) \ #define IR_RULE_ENUM(name) IR_ ## name, @@ -340,6 +400,8 @@ const ir_insn *insn; int n = 0; int flags = IR_USE_MUST_BE_IN_REG | IR_OP1_MUST_BE_IN_REG | IR_OP2_MUST_BE_IN_REG | IR_OP3_MUST_BE_IN_REG; + const ir_proto_t *proto; + const ir_call_conv_dsc *cc; constraints->def_reg = IR_REG_NONE; constraints->hints_count = 0; @@ -385,7 +447,7 @@ n++; break; } - } else if (ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA) { + } else if (!IR_IS_CONST_REF(insn->op2) && ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA) { constraints->tmp_regs[n] = IR_TMP_REG(2, IR_ADDR, IR_LOAD_SUB_REF, IR_DEF_SUB_REF); n++; } @@ -478,10 +540,16 @@ if (IR_IS_CONST_REF(insn->op1)) { constraints->tmp_regs[n] = IR_TMP_REG(1, insn->type, IR_LOAD_SUB_REF, IR_DEF_SUB_REF); n++; + } else if (ir_rule(ctx, insn->op1) == IR_STATIC_ALLOCA) { + constraints->tmp_regs[n] = IR_TMP_REG(1, insn->type, IR_LOAD_SUB_REF, IR_DEF_SUB_REF); + n++; } if (IR_IS_CONST_REF(insn->op2) && insn->op1 != insn->op2) { constraints->tmp_regs[n] = IR_TMP_REG(2, insn->type, IR_LOAD_SUB_REF, IR_DEF_SUB_REF); n++; + } else if (!IR_IS_CONST_REF(insn->op2) && ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA) { + constraints->tmp_regs[n] = IR_TMP_REG(2, insn->type, IR_LOAD_SUB_REF, IR_DEF_SUB_REF); + n++; } break; case IR_CMP_INT: @@ -520,6 +588,7 @@ } break; case IR_VSTORE: + case IR_VSTORE_v: insn = &ctx->ir_base[ref]; if (IR_IS_CONST_REF(insn->op3)) { insn = &ctx->ir_base[insn->op3]; @@ -575,20 +644,33 @@ n++; break; case IR_ARGVAL: - constraints->tmp_regs[0] = IR_SCRATCH_REG(IR_REG_SCRATCH, IR_DEF_SUB_REF - IR_SUB_REFS_COUNT, IR_USE_SUB_REF); + /* memcpy() clobbers all scratch registers */ + constraints->tmp_regs[0] = IR_SCRATCH_REG(IR_REG_SCRATCH_AARCH64, IR_DEF_SUB_REF - IR_SUB_REFS_COUNT, IR_USE_SUB_REF); n = 1; break; case IR_CALL: insn = &ctx->ir_base[ref]; - constraints->def_reg = (IR_IS_TYPE_INT(insn->type)) ? IR_REG_INT_RET1 : IR_REG_FP_RET1; - constraints->tmp_regs[0] = IR_SCRATCH_REG(IR_REG_SCRATCH, IR_USE_SUB_REF, IR_DEF_SUB_REF); + proto = ir_call_proto(ctx, insn); + cc = ir_get_call_conv_dsc(proto ? proto->flags : IR_CC_DEFAULT); + if (insn->type != IR_VOID) { + constraints->def_reg = (IR_IS_TYPE_INT(insn->type)) ? + cc->int_ret_reg : cc->fp_ret_reg; + } + constraints->tmp_regs[0] = IR_SCRATCH_REG(cc->scratch_reg, IR_USE_SUB_REF, IR_DEF_SUB_REF); n = 1; - IR_FALLTHROUGH; + if (insn->inputs_count > 2) { + goto get_arg_hints; + } + flags = IR_USE_SHOULD_BE_IN_REG | IR_OP2_MUST_BE_IN_REG | IR_OP3_SHOULD_BE_IN_REG; + break; case IR_TAILCALL: insn = &ctx->ir_base[ref]; if (insn->inputs_count > 2) { + proto = ir_call_proto(ctx, insn); + cc = ir_get_call_conv_dsc(proto ? proto->flags : IR_CC_DEFAULT); +get_arg_hints: constraints->hints[2] = IR_REG_NONE; - constraints->hints_count = ir_get_args_regs(ctx, insn, constraints->hints); + constraints->hints_count = ir_get_args_regs(ctx, insn, cc, constraints->hints); if (!IR_IS_CONST_REF(insn->op2)) { constraints->tmp_regs[n] = IR_TMP_REG(1, IR_ADDR, IR_LOAD_SUB_REF, IR_USE_SUB_REF); n++; @@ -596,6 +678,19 @@ } flags = IR_USE_SHOULD_BE_IN_REG | IR_OP2_MUST_BE_IN_REG | IR_OP3_SHOULD_BE_IN_REG; break; + case IR_IGOTO: + insn = &ctx->ir_base[ref]; + if (ctx->ir_base[insn->op1].op == IR_MERGE || ctx->ir_base[insn->op1].op == IR_LOOP_BEGIN) { + ir_insn *merge = &ctx->ir_base[insn->op1]; + ir_ref *p, n = merge->inputs_count; + + for (p = merge->ops + 1; n > 0; p++, n--) { + ir_ref input = *p; + IR_ASSERT(ctx->ir_base[input].op == IR_END || ctx->ir_base[input].op == IR_LOOP_END); + ctx->rules[input] = IR_IGOTO_DUP; + } + } + return insn->op; case IR_COND: insn = &ctx->ir_base[ref]; n = 0; @@ -625,7 +720,7 @@ break; case IR_PARAM: constraints->def_reg = ir_get_param_reg(ctx, ref); - flags = 0; + flags = (constraints->def_reg != IR_REG_NONE) ? IR_USE_SHOULD_BE_IN_REG : 0; break; case IR_PI: case IR_PHI: @@ -636,19 +731,22 @@ flags = IR_USE_SHOULD_BE_IN_REG; break; case IR_EXITCALL: - constraints->def_reg = IR_REG_INT_RET1; + cc = ir_get_call_conv_dsc(ctx->flags); + constraints->def_reg = cc->int_ret_reg; break; case IR_RSTORE: flags = IR_OP3_SHOULD_BE_IN_REG; break; case IR_RETURN_INT: + cc = ir_get_call_conv_dsc(ctx->flags); flags = IR_OP2_SHOULD_BE_IN_REG; - constraints->hints[2] = IR_REG_INT_RET1; + constraints->hints[2] = cc->int_ret_reg; constraints->hints_count = 3; break; case IR_RETURN_FP: + cc = ir_get_call_conv_dsc(ctx->flags); flags = IR_OP2_SHOULD_BE_IN_REG; - constraints->hints[2] = IR_REG_FP_RET1; + constraints->hints[2] = cc->fp_ret_reg; constraints->hints_count = 3; break; case IR_SNAPSHOT: @@ -665,7 +763,7 @@ } break; case IR_VA_ARG: - flags = IR_USE_MUST_BE_IN_REG | IR_OP2_MUST_BE_IN_REG; + flags = IR_USE_MUST_BE_IN_REG | IR_OP2_MUST_BE_IN_REG | IR_DEF_CONFLICTS_WITH_INPUT_REGS; constraints->tmp_regs[0] = IR_TMP_REG(3, IR_ADDR, IR_LOAD_SUB_REF, IR_SAVE_SUB_REF); n = 1; insn = &ctx->ir_base[ref]; @@ -714,7 +812,8 @@ do { ir_insn *insn = &ctx->ir_base[*p]; - if (insn->op != IR_LOAD && (insn->op != IR_STORE || insn->op3 == addr_ref)) { + if (insn->op != IR_LOAD && insn->op != IR_LOAD_v + && ((insn->op != IR_STORE && insn->op != IR_STORE_v) || insn->op3 == addr_ref)) { return; } p++; @@ -725,6 +824,34 @@ } } +static bool all_usages_are_fusable(ir_ctx *ctx, ir_ref ref) +{ + ir_insn *insn = &ctx->ir_base[ref]; + + if (insn->op >= IR_EQ && insn->op <= IR_UNORDERED) { + ir_use_list *use_list = &ctx->use_lists[ref]; + ir_ref n = use_list->count; + + if (n > 0) { + ir_ref *p = ctx->use_edges + use_list->refs; + + do { + insn = &ctx->ir_base[*p]; + if (insn->op != IR_IF + && insn->op != IR_GUARD + && insn->op != IR_GUARD_NOT) { + return 0; + } + p++; + n--; + } while (n); + return 1; + } + } + return 0; +} + + static uint32_t ir_match_insn(ir_ctx *ctx, ir_ref ref) { ir_insn *op2_insn; @@ -961,7 +1088,7 @@ ctx->flags2 |= IR_HAS_CALLS; return IR_CALL; case IR_VAR: - return IR_SKIPPED | IR_VAR; + return IR_STATIC_ALLOCA; case IR_PARAM: return ctx->use_lists[ref].count > 0 ? IR_PARAM : IR_SKIPPED | IR_PARAM; case IR_ALLOCA: @@ -978,6 +1105,7 @@ } return IR_ALLOCA; case IR_LOAD: + case IR_LOAD_v: ir_match_fuse_addr(ctx, insn->op2, insn->type); if (IR_IS_TYPE_INT(insn->type)) { return IR_LOAD_INT; @@ -986,6 +1114,7 @@ } break; case IR_STORE: + case IR_STORE_v: ir_match_fuse_addr(ctx, insn->op2, ctx->ir_base[insn->op3].type); if (IR_IS_TYPE_INT(ctx->ir_base[insn->op3].type)) { return IR_STORE_INT; @@ -1044,7 +1173,7 @@ return IR_RETURN_FP; } case IR_IF: - if (!IR_IS_CONST_REF(insn->op2) && ctx->use_lists[insn->op2].count == 1) { + if (!IR_IS_CONST_REF(insn->op2) && (ctx->use_lists[insn->op2].count == 1 || all_usages_are_fusable(ctx, insn->op2))) { op2_insn = &ctx->ir_base[insn->op2]; if (op2_insn->op >= IR_EQ && op2_insn->op <= IR_UNORDERED) { if (IR_IS_TYPE_INT(ctx->ir_base[op2_insn->op1].type)) { @@ -1067,13 +1196,13 @@ } case IR_GUARD: case IR_GUARD_NOT: - if (!IR_IS_CONST_REF(insn->op2) && ctx->use_lists[insn->op2].count == 1) { + if (!IR_IS_CONST_REF(insn->op2) && (ctx->use_lists[insn->op2].count == 1 || all_usages_are_fusable(ctx, insn->op2))) { op2_insn = &ctx->ir_base[insn->op2]; - if (op2_insn->op >= IR_EQ && op2_insn->op <= IR_UNORDERED + if (op2_insn->op >= IR_EQ && op2_insn->op <= IR_UNORDERED) { // TODO: register allocator may clobber operands of CMP before they are used in the GUARD_CMP - && (insn->op2 == ref - 1 || - (insn->op2 == ctx->prev_ref[ref] - 1 - && ctx->ir_base[ctx->prev_ref[ref]].op == IR_SNAPSHOT))) { +//??? && (insn->op2 == ref - 1 || +//??? (insn->op2 == ctx->prev_ref[ref] - 1 +//??? && ctx->ir_base[ctx->prev_ref[ref]].op == IR_SNAPSHOT))) { if (IR_IS_TYPE_INT(ctx->ir_base[op2_insn->op1].type)) { ctx->rules[insn->op2] = IR_FUSED | IR_CMP_INT; return IR_GUARD_CMP_INT; @@ -1364,7 +1493,7 @@ } else if (type == IR_DOUBLE && insn->val.u64 == 0) { | fmov Rd(reg-IR_REG_FP_FIRST), xzr } else { - label = ir_const_label(ctx, src); + label = ir_get_const_label(ctx, src); if (type == IR_DOUBLE) { | ldr Rd(reg-IR_REG_FP_FIRST), =>label } else { @@ -1441,10 +1570,41 @@ | add Rx(reg), Rx(base), #offset } else { ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); - | add Rx(reg), sp, Rx(IR_REG_INT_TMP) + | add Rx(reg), Rx(base), Rx(IR_REG_INT_TMP) } } +static void ir_resolve_label_syms(ir_ctx *ctx) +{ + uint32_t b; + ir_block *bb; + + for (b = 1, bb = &ctx->cfg_blocks[b]; b <= ctx->cfg_blocks_count; bb++, b++) { + ir_insn *insn = &ctx->ir_base[bb->start]; + + if (insn->op == IR_BEGIN && insn->op2) { + IR_ASSERT(ctx->ir_base[insn->op2].op == IR_LABEL); + ctx->ir_base[insn->op2].val.u32_hi = b; + } + } +} + +static void ir_emit_load_label_addr(ir_ctx *ctx, ir_reg reg, ir_insn *label) +{ + ir_backend_data *data = ctx->data; + dasm_State **Dst = &data->dasm_state; + + if (!data->resolved_label_syms) { + data->resolved_label_syms = 1; + ir_resolve_label_syms(ctx); + } + + IR_ASSERT(label->op == IR_LABEL); + int b = label->val.u32_hi; + + b = ir_skip_empty_target_blocks(ctx, b); + | adr Rx(reg), =>b +} static void ir_emit_load(ir_ctx *ctx, ir_type type, ir_reg reg, ir_ref src) { @@ -1459,9 +1619,11 @@ } else if (insn->op == IR_STR) { ir_backend_data *data = ctx->data; dasm_State **Dst = &data->dasm_state; - int label = ir_const_label(ctx, src); + int label = ir_get_const_label(ctx, src); | adr Rx(reg), =>label + } else if (insn->op == IR_LABEL) { + ir_emit_load_label_addr(ctx, reg, insn); } else { ir_emit_load_imm_int(ctx, type, reg, insn->val.i64); } @@ -1697,6 +1859,7 @@ | str Rd(i-IR_REG_FP_FIRST), [Rx(fp), #offset] } else { ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + offset -= sizeof(void*); | str Rx(prev), [Rx(fp), Rx(IR_REG_INT_TMP)] | sub Rx(IR_REG_INT_TMP), Rx(IR_REG_INT_TMP), #8 | str Rd(i-IR_REG_FP_FIRST), [Rx(fp), Rx(IR_REG_INT_TMP)] @@ -1739,67 +1902,73 @@ } } } + if ((ctx->flags & IR_VARARG_FUNC) && (ctx->flags2 & IR_HAS_VA_START)) { -#ifndef __APPLE__ - const int8_t *int_reg_params = _ir_int_reg_params; - const int8_t *fp_reg_params = _ir_fp_reg_params; - ir_reg fp; - int offset; - int i; + const ir_call_conv_dsc *cc = data->ra_data.cc; - if (ctx->flags & IR_USE_FRAME_POINTER) { - fp = IR_REG_FRAME_POINTER; + if (cc->sysv_varargs) { + ir_reg fp; + int offset; + int i; - offset = ctx->locals_area_size + sizeof(void*) * 2; - } else { - fp = IR_REG_STACK_POINTER; - offset = ctx->locals_area_size + ctx->call_stack_size; - } + if (ctx->flags & IR_USE_FRAME_POINTER) { + fp = IR_REG_FRAME_POINTER; + + offset = ctx->locals_area_size + sizeof(void*) * 2; + } else { + fp = IR_REG_STACK_POINTER; + offset = ctx->locals_area_size + ctx->call_stack_size; + } - if ((ctx->flags2 & (IR_HAS_VA_ARG_GP|IR_HAS_VA_COPY)) && ctx->gp_reg_params < IR_REG_INT_ARGS) { - ir_reg prev = IR_REG_NONE; + if ((ctx->flags2 & (IR_HAS_VA_ARG_GP|IR_HAS_VA_COPY)) && ctx->gp_reg_params < cc->int_param_regs_count) { + ir_reg prev = IR_REG_NONE; - /* skip named args */ - offset += sizeof(void*) * ctx->gp_reg_params; - for (i = ctx->gp_reg_params; i < IR_REG_INT_ARGS; i++) { + /* skip named args */ + offset += sizeof(void*) * ctx->gp_reg_params; + for (i = ctx->gp_reg_params; i < cc->int_param_regs_count; i++) { + if (prev != IR_REG_NONE) { + if (aarch64_may_encode_imm7_addr_offset(offset, 8)) { + | stp Rx(prev), Rx(cc->int_param_regs[i]), [Rx(fp), #offset] + } else if (aarch64_may_encode_addr_offset(offset + 8, 8)) { + | str Rx(prev), [Rx(fp), #offset] + | str Rx(cc->int_param_regs[i]), [Rx(fp), #(offset+8)] + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + | str Rx(prev), [Rx(fp), Rx(IR_REG_INT_TMP)] + | add Rx(IR_REG_INT_TMP), Rx(IR_REG_INT_TMP), #8 + | str Rx(cc->int_param_regs[i]), [Rx(fp), Rx(IR_REG_INT_TMP)] + } + prev = IR_REG_NONE; + offset += sizeof(void*) * 2; + } else { + prev = cc->int_param_regs[i]; + } + } if (prev != IR_REG_NONE) { - if (aarch64_may_encode_imm7_addr_offset(offset, 8)) { - | stp Rx(prev), Rx(int_reg_params[i]), [Rx(fp), #offset] - } else if (aarch64_may_encode_addr_offset(offset + 8, 8)) { + if (aarch64_may_encode_addr_offset(offset + 8, 8)) { | str Rx(prev), [Rx(fp), #offset] - | str Rx(int_reg_params[i]), [Rx(fp), #(offset+8)] } else { ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); | str Rx(prev), [Rx(fp), Rx(IR_REG_INT_TMP)] - | add Rx(IR_REG_INT_TMP), Rx(IR_REG_INT_TMP), #8 - | str Rx(int_reg_params[i]), [Rx(fp), Rx(IR_REG_INT_TMP)] } - prev = IR_REG_NONE; - offset += sizeof(void*) * 2; - } else { - prev = int_reg_params[i]; + offset += sizeof(void*); } } - if (prev != IR_REG_NONE) { - if (aarch64_may_encode_addr_offset(offset + 8, 8)) { - | str Rx(prev), [Rx(fp), #offset] - } else { - ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); - | str Rx(prev), [Rx(fp), Rx(IR_REG_INT_TMP)] + if ((ctx->flags2 & (IR_HAS_VA_ARG_FP|IR_HAS_VA_COPY)) && ctx->fp_reg_params < cc->fp_param_regs_count) { + /* skip named args */ + offset += 16 * ctx->fp_reg_params; + for (i = ctx->fp_reg_params; i < cc->fp_param_regs_count; i++) { + // TODO: Rd->Rq stur->str ??? + if (aarch64_may_encode_addr_offset(offset, 8)) { + | str Rd(cc->fp_param_regs[i]-IR_REG_FP_FIRST), [Rx(fp), #offset] + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + | str Rd(cc->fp_param_regs[i]-IR_REG_FP_FIRST), [Rx(fp), Rx(IR_REG_INT_TMP)] + } + offset += 16; } - offset += sizeof(void*); } } - if ((ctx->flags2 & (IR_HAS_VA_ARG_FP|IR_HAS_VA_COPY)) && ctx->fp_reg_params < IR_REG_FP_ARGS) { - /* skip named args */ - offset += 16 * ctx->fp_reg_params; - for (i = ctx->fp_reg_params; i < IR_REG_FP_ARGS; i++) { - // TODO: Rd->Rq stur->str ??? - | str Rd(fp_reg_params[i]-IR_REG_FP_FIRST), [Rx(fp), #offset] - offset += 16; - } - } -#endif } } @@ -1828,26 +1997,44 @@ offset -= sizeof(void*) * 2; if (aarch64_may_encode_imm7_addr_offset(offset, 8)) { | ldp Rx(prev), Rx(i), [Rx(fp), #offset] - } else { - IR_ASSERT(aarch64_may_encode_addr_offset(offset, 8)); + } else if (aarch64_may_encode_addr_offset(offset + 8, 8)) { | ldr Rx(prev), [Rx(fp), #offset] | ldr Rx(i), [Rx(fp), #(offset+8)] + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + | ldr Rx(prev), [Rx(fp), Rx(IR_REG_INT_TMP)] + | add Rx(IR_REG_INT_TMP), Rx(IR_REG_INT_TMP), #8 + | ldr Rx(i), [Rx(fp), Rx(IR_REG_INT_TMP)] } prev = IR_REG_NONE; } else { if (prev < IR_REG_FP_FIRST) { offset -= sizeof(void*); - | ldr Rx(prev), [Rx(fp), #offset] + if (aarch64_may_encode_addr_offset(offset, 8)) { + | ldr Rx(prev), [Rx(fp), #offset] + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + | ldr Rx(prev), [Rx(fp), Rx(IR_REG_INT_TMP)] + } offset -= sizeof(void*); - | ldr Rd(i-IR_REG_FP_FIRST), [Rx(fp), #offset] + if (aarch64_may_encode_addr_offset(offset, 8)) { + | ldr Rd(i-IR_REG_FP_FIRST), [Rx(fp), #offset] + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + | ldr Rd(i-IR_REG_FP_FIRST), [Rx(fp), Rx(IR_REG_INT_TMP)] + } } else { offset -= sizeof(void*) * 2; if (aarch64_may_encode_imm7_addr_offset(offset, 8)) { | ldp Rd(prev-IR_REG_FP_FIRST), Rd(i-IR_REG_FP_FIRST), [Rx(fp), #offset] - } else { - IR_ASSERT(aarch64_may_encode_addr_offset(offset, 8)); + } else if (aarch64_may_encode_addr_offset(offset + 8, 8)) { | ldr Rd(prev-IR_REG_FP_FIRST), [Rx(fp), #offset] | ldr Rd(i-IR_REG_FP_FIRST), [Rx(fp), #(offset+8)] + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + | ldr Rx(prev-IR_REG_FP_FIRST), [Rx(fp), Rx(IR_REG_INT_TMP)] + | add Rx(IR_REG_INT_TMP), Rx(IR_REG_INT_TMP), #8 + | ldr Rx(i-IR_REG_FP_FIRST), [Rx(fp), Rx(IR_REG_INT_TMP)] } } prev = IR_REG_NONE; @@ -1857,10 +2044,20 @@ if (prev != IR_REG_NONE) { if (prev < IR_REG_FP_FIRST) { offset -= sizeof(void*); - | ldr Rx(prev), [Rx(fp), #offset] + if (aarch64_may_encode_addr_offset(offset, 8)) { + | ldr Rx(prev), [Rx(fp), #offset] + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + | ldr Rx(prev), [Rx(fp), Rx(IR_REG_INT_TMP)] + } } else { offset -= sizeof(void*); - | ldr Rd(prev-IR_REG_FP_FIRST), [Rx(fp), #offset] + if (aarch64_may_encode_addr_offset(offset, 8)) { + | ldr Rd(prev-IR_REG_FP_FIRST), [Rx(fp), #offset] + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + | ldr Rd(prev-IR_REG_FP_FIRST), [Rx(fp), Rx(IR_REG_INT_TMP)] + } } } } @@ -1909,6 +2106,9 @@ op1_reg = IR_REG_NUM(op1_reg); ir_emit_load(ctx, type, op1_reg, op1); } + if (op2_reg == IR_REG_NONE && op1 == op2) { + op2_reg = op1_reg; + } if (op2_reg != IR_REG_NONE) { if (IR_REG_SPILLED(op2_reg)) { op2_reg = IR_REG_NUM(op2_reg); @@ -2912,7 +3112,7 @@ } } -static ir_op ir_emit_cmp_fp_common(ir_ctx *ctx, ir_ref cmp_ref, ir_insn *cmp_insn) +static ir_op ir_emit_cmp_fp_common(ir_ctx *ctx, ir_ref root, ir_ref cmp_ref, ir_insn *cmp_insn) { ir_backend_data *data = ctx->data; dasm_State **Dst = &data->dasm_state; @@ -2921,16 +3121,12 @@ ir_ref op1, op2; ir_reg op1_reg, op2_reg; - if (op == IR_LT || op == IR_LE) { - /* swap operands to avoid P flag check */ - op ^= 3; - op1 = cmp_insn->op2; - op2 = cmp_insn->op1; - op1_reg = ctx->regs[cmp_ref][2]; - op2_reg = ctx->regs[cmp_ref][1]; + op1 = cmp_insn->op1; + op2 = cmp_insn->op2; + if (UNEXPECTED(ctx->rules[cmp_ref] & IR_FUSED_REG)) { + op1_reg = ir_get_fused_reg(ctx, root, cmp_ref * sizeof(ir_ref) + 1); + op2_reg = ir_get_fused_reg(ctx, root, cmp_ref * sizeof(ir_ref) + 2); } else { - op1 = cmp_insn->op1; - op2 = cmp_insn->op2; op1_reg = ctx->regs[cmp_ref][1]; op2_reg = ctx->regs[cmp_ref][2]; } @@ -2959,7 +3155,7 @@ { ir_backend_data *data = ctx->data; dasm_State **Dst = &data->dasm_state; - ir_op op = ir_emit_cmp_fp_common(ctx, def, insn); + ir_op op = ir_emit_cmp_fp_common(ctx, def, def, insn); ir_reg def_reg = IR_REG_NUM(ctx->regs[def][0]); //??? ir_reg tmp_reg = ctx->regs[def][3]; // TODO: take into account vs flag @@ -3162,10 +3358,6 @@ break; case IR_UNORDERED: | bvs =>true_block -// case IR_ULT: fprintf(stderr, "\tjb .LL%d\n", true_block); break; -// case IR_UGE: fprintf(stderr, "\tjae .LL%d\n", true_block); break; -// case IR_ULE: fprintf(stderr, "\tjbe .LL%d\n", true_block); break; -// case IR_UGT: fprintf(stderr, "\tja .LL%d\n", true_block); break; } } if (false_block) { @@ -3180,8 +3372,15 @@ ir_type type = ctx->ir_base[cmp_insn->op1].type; ir_ref op1 = cmp_insn->op1; ir_ref op2 = cmp_insn->op2; - ir_reg op1_reg = ctx->regs[insn->op2][1]; - ir_reg op2_reg = ctx->regs[insn->op2][2]; + ir_reg op1_reg, op2_reg; + + if (UNEXPECTED(ctx->rules[insn->op2] & IR_FUSED_REG)) { + op1_reg = ir_get_fused_reg(ctx, def, insn->op2 * sizeof(ir_ref) + 1); + op2_reg = ir_get_fused_reg(ctx, def, insn->op2 * sizeof(ir_ref) + 2); + } else { + op1_reg = ctx->regs[insn->op2][1]; + op2_reg = ctx->regs[insn->op2][2]; + } if (op1_reg != IR_REG_NONE && IR_REG_SPILLED(op1_reg)) { op1_reg = IR_REG_NUM(op1_reg); @@ -3222,7 +3421,7 @@ static void ir_emit_cmp_and_branch_fp(ir_ctx *ctx, uint32_t b, ir_ref def, ir_insn *insn, uint32_t next_block) { - ir_op op = ir_emit_cmp_fp_common(ctx, insn->op2, &ctx->ir_base[insn->op2]); + ir_op op = ir_emit_cmp_fp_common(ctx, def, insn->op2, &ctx->ir_base[insn->op2]); ir_emit_jcc(ctx, b, def, insn, next_block, op, 0); } @@ -3291,14 +3490,14 @@ op3_reg = op2_reg; } } - if (op3 != op2 && IR_REG_SPILLED(op3_reg)) { + if (IR_REG_SPILLED(op3_reg)) { op3_reg = IR_REG_NUM(op3_reg); ir_emit_load(ctx, type, op3_reg, op3); - if (op1 == op2) { + if (op1 == op3) { op1_reg = op3_reg; } } - if (op1 != op2 && op1 != op3 && IR_REG_SPILLED(op1_reg)) { + if (IR_REG_SPILLED(op1_reg)) { op1_reg = IR_REG_NUM(op1_reg); ir_emit_load(ctx, op1_type, op1_reg, op1); } @@ -3339,15 +3538,17 @@ static void ir_emit_return_int(ir_ctx *ctx, ir_ref ref, ir_insn *insn) { + ir_backend_data *data = ctx->data; + ir_reg ret_reg = data->ra_data.cc->int_ret_reg; ir_reg op2_reg = ctx->regs[ref][2]; - if (op2_reg != IR_REG_INT_RET1) { + if (op2_reg != ret_reg) { ir_type type = ctx->ir_base[insn->op2].type; if (op2_reg != IR_REG_NONE && !IR_REG_SPILLED(op2_reg)) { - ir_emit_mov(ctx, type, IR_REG_INT_RET1, op2_reg); + ir_emit_mov(ctx, type, ret_reg, op2_reg); } else { - ir_emit_load(ctx, type, IR_REG_INT_RET1, insn->op2); + ir_emit_load(ctx, type, ret_reg, insn->op2); } } ir_emit_return_void(ctx); @@ -3355,14 +3556,16 @@ static void ir_emit_return_fp(ir_ctx *ctx, ir_ref ref, ir_insn *insn) { + ir_backend_data *data = ctx->data; + ir_reg ret_reg = data->ra_data.cc->fp_ret_reg; ir_reg op2_reg = ctx->regs[ref][2]; ir_type type = ctx->ir_base[insn->op2].type; - if (op2_reg != IR_REG_FP_RET1) { + if (op2_reg != ret_reg) { if (op2_reg != IR_REG_NONE && !IR_REG_SPILLED(op2_reg)) { - ir_emit_fp_mov(ctx, type, IR_REG_FP_RET1, op2_reg); + ir_emit_fp_mov(ctx, type, ret_reg, op2_reg); } else { - ir_emit_load(ctx, type, IR_REG_FP_RET1, insn->op2); + ir_emit_load(ctx, type, ret_reg, insn->op2); } } ir_emit_return_void(ctx); @@ -3415,25 +3618,52 @@ int32_t offset = ir_ref_spill_slot_offset(ctx, insn->op1, &fp); if (ir_type_size[src_type] == 1) { - if (ir_type_size[dst_type] == 2) { - | ldrsb Rw(def_reg), [Rx(fp), #offset] - } else if (ir_type_size[dst_type] == 4) { - | ldrsb Rw(def_reg), [Rx(fp), #offset] + if (aarch64_may_encode_addr_offset(offset, ir_type_size[src_type])) { + if (ir_type_size[dst_type] == 2) { + | ldrsb Rw(def_reg), [Rx(fp), #offset] + } else if (ir_type_size[dst_type] == 4) { + | ldrsb Rw(def_reg), [Rx(fp), #offset] + } else { + IR_ASSERT(ir_type_size[dst_type] == 8); + | ldrsb Rx(def_reg), [Rx(fp), #offset] + } } else { - IR_ASSERT(ir_type_size[dst_type] == 8); - | ldrsb Rx(def_reg), [Rx(fp), #offset] + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + if (ir_type_size[dst_type] == 2) { + | ldrsb Rw(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } else if (ir_type_size[dst_type] == 4) { + | ldrsb Rw(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } else { + IR_ASSERT(ir_type_size[dst_type] == 8); + | ldrsb Rx(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } } } else if (ir_type_size[src_type] == 2) { - if (ir_type_size[dst_type] == 4) { - | ldrsh Rw(def_reg), [Rx(fp), #offset] + if (aarch64_may_encode_addr_offset(offset, ir_type_size[src_type])) { + if (ir_type_size[dst_type] == 4) { + | ldrsh Rw(def_reg), [Rx(fp), #offset] + } else { + IR_ASSERT(ir_type_size[dst_type] == 8); + | ldrsh Rx(def_reg), [Rx(fp), #offset] + } } else { - IR_ASSERT(ir_type_size[dst_type] == 8); - | ldrsh Rx(def_reg), [Rx(fp), #offset] + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + if (ir_type_size[dst_type] == 4) { + | ldrsh Rw(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } else { + IR_ASSERT(ir_type_size[dst_type] == 8); + | ldrsh Rx(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } } } else { IR_ASSERT(ir_type_size[src_type] == 4); IR_ASSERT(ir_type_size[dst_type] == 8); - | ldrsw Rx(def_reg), [Rx(fp), #offset] + if (aarch64_may_encode_addr_offset(offset, ir_type_size[src_type])) { + | ldrsw Rx(def_reg), [Rx(fp), #offset] + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + | ldrsw Rx(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } } } if (IR_REG_SPILLED(ctx->regs[def][0])) { @@ -3473,14 +3703,27 @@ ir_reg fp; int32_t offset = ir_ref_spill_slot_offset(ctx, insn->op1, &fp); - if (ir_type_size[src_type] == 1) { - | ldrb Rw(def_reg), [Rx(fp), #offset] - } else if (ir_type_size[src_type] == 2) { - | ldrh Rw(def_reg), [Rx(fp), #offset] + if (aarch64_may_encode_addr_offset(offset, ir_type_size[src_type])) { + if (ir_type_size[src_type] == 1) { + | ldrb Rw(def_reg), [Rx(fp), #offset] + } else if (ir_type_size[src_type] == 2) { + | ldrh Rw(def_reg), [Rx(fp), #offset] + } else { + IR_ASSERT(ir_type_size[src_type] == 4); + IR_ASSERT(ir_type_size[dst_type] == 8); + | ldr Rw(def_reg), [Rx(fp), #offset] + } } else { - IR_ASSERT(ir_type_size[src_type] == 4); - IR_ASSERT(ir_type_size[dst_type] == 8); - | ldr Rw(def_reg), [Rx(fp), #offset] + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + if (ir_type_size[src_type] == 1) { + | ldrb Rw(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } else if (ir_type_size[src_type] == 2) { + | ldrh Rw(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } else { + IR_ASSERT(ir_type_size[src_type] == 4); + IR_ASSERT(ir_type_size[dst_type] == 8); + | ldr Rw(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } } } if (IR_REG_SPILLED(ctx->regs[def][0])) { @@ -3579,11 +3822,21 @@ ir_reg fp; int32_t offset = ir_ref_spill_slot_offset(ctx, insn->op1, &fp); - if (src_type == IR_DOUBLE) { - | ldr Rx(def_reg), [Rx(fp), #offset] + if (aarch64_may_encode_addr_offset(offset, ir_type_size[src_type])) { + if (src_type == IR_DOUBLE) { + | ldr Rx(def_reg), [Rx(fp), #offset] + } else { + IR_ASSERT(src_type == IR_FLOAT); + | ldr Rw(def_reg), [Rx(fp), #offset] + } } else { - IR_ASSERT(src_type == IR_FLOAT); - | ldr Rw(def_reg), [Rx(fp), #offset] + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + if (src_type == IR_DOUBLE) { + | ldr Rx(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } else { + IR_ASSERT(src_type == IR_FLOAT); + | ldr Rw(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } } } } else if (IR_IS_TYPE_FP(dst_type)) { @@ -3605,12 +3858,22 @@ ir_reg fp; int32_t offset = ir_ref_spill_slot_offset(ctx, insn->op1, &fp); - if (dst_type == IR_DOUBLE) { - | ldr Rd(def_reg), [Rx(fp), #offset] - } else { - IR_ASSERT(src_type == IR_FLOAT); - | ldr Rs(def_reg), [Rx(fp), #offset] - } + if (aarch64_may_encode_addr_offset(offset, ir_type_size[src_type])) { + if (dst_type == IR_DOUBLE) { + | ldr Rd(def_reg), [Rx(fp), #offset] + } else { + IR_ASSERT(dst_type == IR_FLOAT); + | ldr Rs(def_reg), [Rx(fp), #offset] + } + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + if (dst_type == IR_DOUBLE) { + | ldr Rd(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } else { + IR_ASSERT(dst_type == IR_FLOAT); + | ldr Rs(def_reg), [Rx(fp), Rx(IR_REG_INT_TMP)] + } + } } } if (IR_REG_SPILLED(ctx->regs[def][0])) { @@ -3833,7 +4096,12 @@ IR_ASSERT(def_reg != IR_REG_NONE); offset = ir_var_spill_slot(ctx, insn->op1, &fp); - | add Rx(def_reg), Rx(fp), #offset + if (aarch64_may_encode_imm12(offset)) { + | add Rx(def_reg), Rx(fp), #offset + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, offset); + | add Rx(def_reg), Rx(fp), Rx(IR_REG_INT_TMP) + } if (IR_REG_SPILLED(ctx->regs[def][0])) { ir_emit_store(ctx, type, def, def_reg); } @@ -4221,7 +4489,12 @@ /* Stack must be 16 byte aligned */ size = IR_ALIGNED_SIZE(size, 16); - | add sp, sp, #size + if (aarch64_may_encode_imm12(size)) { + | add sp, sp, #size + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, size); + | add sp, sp, Rx(IR_REG_INT_TMP) + } if (!(ctx->flags & IR_USE_FRAME_POINTER)) { ctx->call_stack_size -= size; } @@ -4283,8 +4556,11 @@ if (ctx->flags & IR_USE_FRAME_POINTER) { | mov Rx(def_reg), Rx(IR_REG_X29) - } else { + } else if (aarch64_may_encode_imm12(ctx->stack_frame_size + ctx->call_stack_size)) { | add Rx(def_reg), Rx(IR_REG_X31), #(ctx->stack_frame_size + ctx->call_stack_size) + } else { + ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_TMP, ctx->stack_frame_size + ctx->call_stack_size); + | add Rx(def_reg), Rx(IR_REG_X31), Rx(IR_REG_INT_TMP) } if (IR_REG_SPILLED(ctx->regs[def][0])) { ir_emit_store(ctx, IR_ADDR, def, def_reg); @@ -4293,281 +4569,281 @@ static void ir_emit_va_start(ir_ctx *ctx, ir_ref def, ir_insn *insn) { -#ifdef __APPLE__ ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; dasm_State **Dst = &data->dasm_state; - ir_reg fp; - int arg_area_offset; - ir_reg op2_reg = ctx->regs[def][2]; - ir_reg tmp_reg = ctx->regs[def][3]; - int32_t offset; - IR_ASSERT(tmp_reg != IR_REG_NONE); - if (op2_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + if (!cc->sysv_varargs) { + ir_reg fp; + int arg_area_offset; + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg tmp_reg = ctx->regs[def][3]; + int32_t offset; + + IR_ASSERT(tmp_reg != IR_REG_NONE); + if (op2_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + } + offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); + op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); } - offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); - op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); - } - if (ctx->flags & IR_USE_FRAME_POINTER) { - fp = IR_REG_FRAME_POINTER; - arg_area_offset = ctx->stack_frame_size + sizeof(void*) * 2 + ctx->param_stack_size; + if (ctx->flags & IR_USE_FRAME_POINTER) { + fp = IR_REG_FRAME_POINTER; + arg_area_offset = ctx->stack_frame_size + sizeof(void*) * 2 + ctx->param_stack_size; + } else { + fp = IR_REG_STACK_POINTER; + arg_area_offset = ctx->call_stack_size + ctx->stack_frame_size + ctx->param_stack_size; + } + | add Rx(tmp_reg), Rx(fp), #arg_area_offset + | str Rx(tmp_reg), [Rx(op2_reg), #offset] } else { - fp = IR_REG_STACK_POINTER; - arg_area_offset = ctx->call_stack_size + ctx->stack_frame_size + ctx->param_stack_size; - } - | add Rx(tmp_reg), Rx(fp), #arg_area_offset - | str Rx(tmp_reg), [Rx(op2_reg), #offset] -#else - ir_backend_data *data = ctx->data; - dasm_State **Dst = &data->dasm_state; - ir_reg fp; - int reg_save_area_offset; - int overflow_arg_area_offset; - ir_reg op2_reg = ctx->regs[def][2]; - ir_reg tmp_reg = ctx->regs[def][3]; - int32_t offset; + ir_reg fp; + int reg_save_area_offset; + int overflow_arg_area_offset; + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg tmp_reg = ctx->regs[def][3]; + int32_t offset; - IR_ASSERT(tmp_reg != IR_REG_NONE); - if (op2_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + IR_ASSERT(tmp_reg != IR_REG_NONE); + if (op2_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + } + offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); + op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); } - offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); - op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); - } - if (ctx->flags & IR_USE_FRAME_POINTER) { - fp = IR_REG_FRAME_POINTER; - reg_save_area_offset = ctx->locals_area_size + sizeof(void*) * 2; - overflow_arg_area_offset = ctx->stack_frame_size + sizeof(void*) * 2 + ctx->param_stack_size; - } else { - fp = IR_REG_STACK_POINTER; - reg_save_area_offset = ctx->locals_area_size + ctx->call_stack_size; - overflow_arg_area_offset = ctx->call_stack_size + ctx->stack_frame_size + ctx->param_stack_size; - } - - /* Set va_list.stack */ - | add Rx(tmp_reg), Rx(fp), #overflow_arg_area_offset - | str Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, stack))] - if ((ctx->flags2 & (IR_HAS_VA_ARG_GP|IR_HAS_VA_COPY)) && ctx->gp_reg_params < IR_REG_INT_ARGS) { - reg_save_area_offset += sizeof(void*) * IR_REG_INT_ARGS; - /* Set va_list.gr_top */ - if (overflow_arg_area_offset != reg_save_area_offset) { - | add Rx(tmp_reg), Rx(fp), #reg_save_area_offset - } - | str Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, gr_top))] - /* Set va_list.gr_offset */ - | movn Rw(tmp_reg), #~(0 - (sizeof(void*) * (IR_REG_INT_ARGS - ctx->gp_reg_params))) - | str Rw(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, gr_offset))] - } else { - /* Set va_list.gr_offset */ - | str wzr, [Rx(op2_reg), #(offset+offsetof(ir_va_list, gr_offset))] - } - if ((ctx->flags2 & (IR_HAS_VA_ARG_FP|IR_HAS_VA_COPY)) && ctx->fp_reg_params < IR_REG_FP_ARGS) { - reg_save_area_offset += 16 * IR_REG_FP_ARGS; - /* Set va_list.vr_top */ - if (overflow_arg_area_offset != reg_save_area_offset) { - | add Rx(tmp_reg), Rx(fp), #reg_save_area_offset - } - | str Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, vr_top))] - /* Set va_list.vr_offset */ - | movn Rw(tmp_reg), #~(0 - (16 * (IR_REG_FP_ARGS - ctx->fp_reg_params))) - | str Rw(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, vr_offset))] - } else { - /* Set va_list.vr_offset */ - | str wzr, [Rx(op2_reg), #(offset+offsetof(ir_va_list, vr_offset))] + if (ctx->flags & IR_USE_FRAME_POINTER) { + fp = IR_REG_FRAME_POINTER; + reg_save_area_offset = ctx->locals_area_size + sizeof(void*) * 2; + overflow_arg_area_offset = ctx->stack_frame_size + sizeof(void*) * 2 + ctx->param_stack_size; + } else { + fp = IR_REG_STACK_POINTER; + reg_save_area_offset = ctx->locals_area_size + ctx->call_stack_size; + overflow_arg_area_offset = ctx->call_stack_size + ctx->stack_frame_size + ctx->param_stack_size; + } + + /* Set va_list.stack */ + | add Rx(tmp_reg), Rx(fp), #overflow_arg_area_offset + | str Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, stack))] + if ((ctx->flags2 & (IR_HAS_VA_ARG_GP|IR_HAS_VA_COPY)) && ctx->gp_reg_params < cc->int_param_regs_count) { + reg_save_area_offset += sizeof(void*) * cc->int_param_regs_count; + /* Set va_list.gr_top */ + if (overflow_arg_area_offset != reg_save_area_offset) { + | add Rx(tmp_reg), Rx(fp), #reg_save_area_offset + } + | str Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, gr_top))] + /* Set va_list.gr_offset */ + | movn Rw(tmp_reg), #~(0 - (sizeof(void*) * (cc->int_param_regs_count - ctx->gp_reg_params))) + | str Rw(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, gr_offset))] + } else { + /* Set va_list.gr_offset */ + | str wzr, [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, gr_offset))] + } + if ((ctx->flags2 & (IR_HAS_VA_ARG_FP|IR_HAS_VA_COPY)) && ctx->fp_reg_params < cc->fp_param_regs_count) { + reg_save_area_offset += 16 * cc->fp_param_regs_count; + /* Set va_list.vr_top */ + if (overflow_arg_area_offset != reg_save_area_offset || ctx->gp_reg_params < cc->int_param_regs_count) { + | add Rx(tmp_reg), Rx(fp), #reg_save_area_offset + } + | str Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, vr_top))] + /* Set va_list.vr_offset */ + | movn Rw(tmp_reg), #~(0 - (16 * (cc->fp_param_regs_count - ctx->fp_reg_params))) + | str Rw(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, vr_offset))] + } else { + /* Set va_list.vr_offset */ + | str wzr, [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, vr_offset))] + } } -#endif } static void ir_emit_va_copy(ir_ctx *ctx, ir_ref def, ir_insn *insn) { -#ifdef __APPLE__ ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; dasm_State **Dst = &data->dasm_state; - ir_reg tmp_reg = ctx->regs[def][1]; - ir_reg op2_reg = ctx->regs[def][2]; - ir_reg op3_reg = ctx->regs[def][3]; - int32_t op2_offset, op3_offset; - IR_ASSERT(tmp_reg != IR_REG_NONE); - if (op2_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + if (!cc->sysv_varargs) { + ir_reg tmp_reg = ctx->regs[def][1]; + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg op3_reg = ctx->regs[def][3]; + int32_t op2_offset, op3_offset; + + IR_ASSERT(tmp_reg != IR_REG_NONE); + if (op2_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + } + op2_offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); + op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + op2_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); } - op2_offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); - op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - op2_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); - } - if (op3_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op3_reg)) { - op3_reg = IR_REG_NUM(op3_reg); - ir_emit_load(ctx, IR_ADDR, op3_reg, insn->op3); + if (op3_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op3_reg)) { + op3_reg = IR_REG_NUM(op3_reg); + ir_emit_load(ctx, IR_ADDR, op3_reg, insn->op3); + } + op3_offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op3) == IR_STATIC_ALLOCA); + op3_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + op3_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op3]); } - op3_offset = 0; + | ldr Rx(tmp_reg), [Rx(op3_reg), #op3_offset] + | str Rx(tmp_reg), [Rx(op2_reg), #op2_offset] } else { - IR_ASSERT(ir_rule(ctx, insn->op3) == IR_STATIC_ALLOCA); - op3_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - op3_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op3]); - } - | ldr Rx(tmp_reg), [Rx(op3_reg), #op3_offset] - | str Rx(tmp_reg), [Rx(op2_reg), #op2_offset] -#else - ir_backend_data *data = ctx->data; - dasm_State **Dst = &data->dasm_state; - ir_reg tmp_reg = ctx->regs[def][1]; - ir_reg op2_reg = ctx->regs[def][2]; - ir_reg op3_reg = ctx->regs[def][3]; - int32_t op2_offset, op3_offset; + ir_reg tmp_reg = ctx->regs[def][1]; + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg op3_reg = ctx->regs[def][3]; + int32_t op2_offset, op3_offset; - IR_ASSERT(tmp_reg != IR_REG_NONE); - if (op2_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + IR_ASSERT(tmp_reg != IR_REG_NONE); + if (op2_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + } + op2_offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); + op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + op2_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); } - op2_offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); - op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - op2_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); + if (op3_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op3_reg)) { + op3_reg = IR_REG_NUM(op3_reg); + ir_emit_load(ctx, IR_ADDR, op3_reg, insn->op3); + } + op3_offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op3) == IR_STATIC_ALLOCA); + op3_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + op3_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op3]); + } + | ldr Rx(tmp_reg), [Rx(op3_reg), #op3_offset] + | str Rx(tmp_reg), [Rx(op2_reg), #op2_offset] + | ldr Rx(tmp_reg), [Rx(op3_reg), #(op3_offset+8)] + | str Rx(tmp_reg), [Rx(op2_reg), #(op2_offset+8)] + | ldr Rx(tmp_reg), [Rx(op3_reg), #(op3_offset+16)] + | str Rx(tmp_reg), [Rx(op2_reg), #(op2_offset+16)] + | ldr Rx(tmp_reg), [Rx(op3_reg), #(op3_offset+24)] + | str Rx(tmp_reg), [Rx(op2_reg), #(op2_offset+24)] } - if (op3_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op3_reg)) { - op3_reg = IR_REG_NUM(op3_reg); - ir_emit_load(ctx, IR_ADDR, op3_reg, insn->op3); - } - op3_offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op3) == IR_STATIC_ALLOCA); - op3_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - op3_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op3]); - } - | ldr Rx(tmp_reg), [Rx(op3_reg), #op3_offset] - | str Rx(tmp_reg), [Rx(op2_reg), #op2_offset] - | ldr Rx(tmp_reg), [Rx(op3_reg), #(op3_offset+8)] - | str Rx(tmp_reg), [Rx(op2_reg), #(op2_offset+8)] - | ldr Rx(tmp_reg), [Rx(op3_reg), #(op3_offset+16)] - | str Rx(tmp_reg), [Rx(op2_reg), #(op2_offset+16)] - | ldr Rx(tmp_reg), [Rx(op3_reg), #(op3_offset+24)] - | str Rx(tmp_reg), [Rx(op2_reg), #(op2_offset+24)] -#endif } static void ir_emit_va_arg(ir_ctx *ctx, ir_ref def, ir_insn *insn) { -#ifdef __APPLE__ ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; dasm_State **Dst = &data->dasm_state; - ir_type type = insn->type; - ir_reg def_reg = IR_REG_NUM(ctx->regs[def][0]); - ir_reg op2_reg = ctx->regs[def][2]; - ir_reg tmp_reg = ctx->regs[def][3]; - int32_t offset; - IR_ASSERT((def_reg != IR_REG_NONE || ctx->use_lists[def].count == 1) && tmp_reg != IR_REG_NONE); - if (op2_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); - } - offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); - op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); - } - | ldr Rx(tmp_reg), [Rx(op2_reg), #offset] - if (def_reg != IR_REG_NONE) { - ir_emit_load_mem(ctx, type, def_reg, IR_MEM_BO(tmp_reg, 0)); - } - | add Rx(tmp_reg), Rx(tmp_reg), #IR_MAX(ir_type_size[type], sizeof(void*)) - | str Rx(tmp_reg), [Rx(op2_reg), #offset] - if (def_reg != IR_REG_NONE && IR_REG_SPILLED(ctx->regs[def][0])) { - ir_emit_store(ctx, type, def, def_reg); - } -#else - ir_backend_data *data = ctx->data; - dasm_State **Dst = &data->dasm_state; - ir_type type = insn->type; - ir_reg def_reg = IR_REG_NUM(ctx->regs[def][0]); - ir_reg op2_reg = ctx->regs[def][2]; - ir_reg tmp_reg = ctx->regs[def][3]; - int32_t offset; + if (!cc->sysv_varargs) { + ir_type type = insn->type; + ir_reg def_reg = IR_REG_NUM(ctx->regs[def][0]); + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg tmp_reg = ctx->regs[def][3]; + int32_t offset; - IR_ASSERT((def_reg != IR_REG_NONE || ctx->use_lists[def].count == 1) && tmp_reg != IR_REG_NONE); - if (op2_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + IR_ASSERT((def_reg != IR_REG_NONE || ctx->use_lists[def].count == 1) && tmp_reg != IR_REG_NONE); + if (op2_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + } + offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); + op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); } - offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); - op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); - } - if (IR_IS_TYPE_INT(type)) { - | ldr Rw(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, gr_offset))] - | cmp Rw(tmp_reg), wzr - | bge >1 - | ldr Rx(IR_REG_INT_TMP), [Rx(op2_reg), #(offset+offsetof(ir_va_list, gr_top))] - | sxtw Rx(tmp_reg), Rw(tmp_reg) - | add Rx(IR_REG_INT_TMP), Rx(tmp_reg), Rx(IR_REG_INT_TMP) + | ldr Rx(tmp_reg), [Rx(op2_reg), #offset] if (def_reg != IR_REG_NONE) { - | ldr Rx(def_reg), [Rx(IR_REG_INT_TMP)] + ir_emit_load_mem(ctx, type, def_reg, IR_MEM_BO(tmp_reg, 0)); } - | add Rw(tmp_reg), Rw(tmp_reg), #sizeof(void*) - | str Rw(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, gr_offset))] - | b >2 - |1: - | ldr Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, stack))] - if (def_reg != IR_REG_NONE) { - | ldr Rx(def_reg), [Rx(tmp_reg)] + | add Rx(tmp_reg), Rx(tmp_reg), #IR_MAX(ir_type_size[type], sizeof(void*)) + | str Rx(tmp_reg), [Rx(op2_reg), #offset] + if (def_reg != IR_REG_NONE && IR_REG_SPILLED(ctx->regs[def][0])) { + ir_emit_store(ctx, type, def, def_reg); } - | add Rx(tmp_reg), Rx(tmp_reg), #sizeof(void*) - | str Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, stack))] - |2: - } else { - | ldr Rw(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, vr_offset))] - | cmp Rw(tmp_reg), wzr - | bge >1 - | ldr Rx(IR_REG_INT_TMP), [Rx(op2_reg), #(offset+offsetof(ir_va_list, vr_top))] - | sxtw Rx(tmp_reg), Rw(tmp_reg) - | add Rx(IR_REG_INT_TMP), Rx(tmp_reg), Rx(IR_REG_INT_TMP) - if (def_reg != IR_REG_NONE) { - | ldr Rd(def_reg-IR_REG_FP_FIRST), [Rx(IR_REG_INT_TMP)] + } else { + ir_type type = insn->type; + ir_reg def_reg = IR_REG_NUM(ctx->regs[def][0]); + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg tmp_reg = ctx->regs[def][3]; + int32_t offset; + + IR_ASSERT((def_reg != IR_REG_NONE || ctx->use_lists[def].count == 1) && tmp_reg != IR_REG_NONE); + if (op2_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + } + offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); + op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); } - | add Rw(tmp_reg), Rw(tmp_reg), #16 - | str Rw(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, vr_offset))] - | b >2 - |1: - | ldr Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, stack))] - if (def_reg != IR_REG_NONE) { - | ldr Rd(def_reg-IR_REG_FP_FIRST), [Rx(tmp_reg)] + if (IR_IS_TYPE_INT(type)) { + | ldr Rw(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, gr_offset))] + | cmp Rw(tmp_reg), wzr + | bge >1 + | ldr Rx(IR_REG_INT_TMP), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, gr_top))] + | sxtw Rx(tmp_reg), Rw(tmp_reg) + | add Rx(IR_REG_INT_TMP), Rx(tmp_reg), Rx(IR_REG_INT_TMP) + if (def_reg != IR_REG_NONE) { + | ldr Rx(def_reg), [Rx(IR_REG_INT_TMP)] + } + | add Rw(tmp_reg), Rw(tmp_reg), #sizeof(void*) + | str Rw(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, gr_offset))] + | b >2 + |1: + | ldr Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, stack))] + if (def_reg != IR_REG_NONE) { + | ldr Rx(def_reg), [Rx(tmp_reg)] + } + | add Rx(tmp_reg), Rx(tmp_reg), #sizeof(void*) + | str Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, stack))] + |2: + } else { + | ldr Rw(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, vr_offset))] + | cmp Rw(tmp_reg), wzr + | bge >1 + | ldr Rx(IR_REG_INT_TMP), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, vr_top))] + | sxtw Rx(tmp_reg), Rw(tmp_reg) + | add Rx(IR_REG_INT_TMP), Rx(tmp_reg), Rx(IR_REG_INT_TMP) + if (def_reg != IR_REG_NONE) { + | ldr Rd(def_reg-IR_REG_FP_FIRST), [Rx(IR_REG_INT_TMP)] + } + | add Rw(tmp_reg), Rw(tmp_reg), #16 + | str Rw(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, vr_offset))] + | b >2 + |1: + | ldr Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, stack))] + if (def_reg != IR_REG_NONE) { + | ldr Rd(def_reg-IR_REG_FP_FIRST), [Rx(tmp_reg)] + } + | add Rx(tmp_reg), Rx(tmp_reg), #sizeof(void*) + | str Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_aarch64_sysv_va_list, stack))] + |2: + } + if (def_reg != IR_REG_NONE && IR_REG_SPILLED(ctx->regs[def][0])) { + ir_emit_store(ctx, type, def, def_reg); } - | add Rx(tmp_reg), Rx(tmp_reg), #sizeof(void*) - | str Rx(tmp_reg), [Rx(op2_reg), #(offset+offsetof(ir_va_list, stack))] - |2: - } - if (def_reg != IR_REG_NONE && IR_REG_SPILLED(ctx->regs[def][0])) { - ir_emit_store(ctx, type, def, def_reg); } -#endif } static void ir_emit_switch(ir_ctx *ctx, uint32_t b, ir_ref def, ir_insn *insn) @@ -4790,19 +5066,23 @@ } } -static int32_t ir_call_used_stack(ir_ctx *ctx, ir_insn *insn, int32_t *copy_stack_ptr) +static int32_t ir_call_used_stack(ir_ctx *ctx, ir_insn *insn, const ir_call_conv_dsc *cc, int32_t *copy_stack_ptr) { int j, n; ir_type type; int int_param = 0; int fp_param = 0; - int int_reg_params_count = IR_REG_INT_ARGS; - int fp_reg_params_count = IR_REG_FP_ARGS; int32_t used_stack = 0, copy_stack = 0; -#ifdef __APPLE__ - const ir_proto_t *proto = ir_call_proto(ctx, insn); - int last_named_input = (proto && (proto->flags & IR_VARARG_FUNC)) ? proto->params_count + 2 : insn->inputs_count; -#endif + + /* On APPLE "unnamed" arguments always passed through stack */ + int last_named_input; + + if (!cc->sysv_varargs) { + const ir_proto_t *proto = ir_call_proto(ctx, insn); + last_named_input = (proto && (proto->flags & IR_VARARG_FUNC)) ? proto->params_count + 2 : insn->inputs_count; + } else { + last_named_input = insn->inputs_count; + } n = insn->inputs_count; for (j = 3; j <= n; j++) { @@ -4816,19 +5096,16 @@ copy_stack = IR_ALIGNED_SIZE(copy_stack, align); type = IR_ADDR; } -#ifdef __APPLE__ if (j > last_named_input) { used_stack += IR_MAX(sizeof(void*), ir_type_size[type]); - } else -#endif - if (IR_IS_TYPE_INT(type)) { - if (int_param >= int_reg_params_count) { + } else if (IR_IS_TYPE_INT(type)) { + if (int_param >= cc->int_param_regs_count) { used_stack += IR_MAX(sizeof(void*), ir_type_size[type]); } int_param++; } else { IR_ASSERT(IR_IS_TYPE_FP(type)); - if (fp_param >= fp_reg_params_count) { + if (fp_param >= cc->fp_param_regs_count) { used_stack += IR_MAX(sizeof(void*), ir_type_size[type]); } fp_param++; @@ -4840,7 +5117,7 @@ return used_stack + copy_stack; } -static int32_t ir_emit_arguments(ir_ctx *ctx, ir_ref def, ir_insn *insn, ir_reg tmp_reg) +static int32_t ir_emit_arguments(ir_ctx *ctx, ir_ref def, ir_insn *insn, const ir_call_conv_dsc *cc, ir_reg tmp_reg) { ir_backend_data *data = ctx->data; dasm_State **Dst = &data->dasm_state; @@ -4852,10 +5129,6 @@ int int_param = 0; int fp_param = 0; int count = 0; - int int_reg_params_count = IR_REG_INT_ARGS; - int fp_reg_params_count = IR_REG_FP_ARGS; - const int8_t *int_reg_params = _ir_int_reg_params; - const int8_t *fp_reg_params = _ir_fp_reg_params; int32_t used_stack, copy_stack = 0, stack_offset = 0, copy_stack_offset = 0; ir_copy *copies; bool do_pass3 = 0; @@ -4875,7 +5148,7 @@ // TODO: support for preallocated stack used_stack = 0; } else { - used_stack = ir_call_used_stack(ctx, insn, ©_stack); + used_stack = ir_call_used_stack(ctx, insn, cc, ©_stack); /* Stack must be 16 byte aligned */ used_stack = IR_ALIGNED_SIZE(used_stack, 16); if (ctx->fixed_call_stack_size && used_stack <= ctx->fixed_call_stack_size) { @@ -4893,10 +5166,15 @@ } } -#ifdef __APPLE__ - const ir_proto_t *proto = ir_call_proto(ctx, insn); - int last_named_input = (proto && (proto->flags & IR_VARARG_FUNC)) ? proto->params_count + 2 : insn->inputs_count; -#endif + /* On APPLE "unnamed" arguments always passed through stack */ + int last_named_input; + + if (!cc->sysv_varargs) { + const ir_proto_t *proto = ir_call_proto(ctx, insn); + last_named_input = (proto && (proto->flags & IR_VARARG_FUNC)) ? proto->params_count + 2 : insn->inputs_count; + } else { + last_named_input = insn->inputs_count; + } if (copy_stack) { /* Copy struct arguments */ @@ -4917,17 +5195,17 @@ copy_stack_offset = IR_ALIGNED_SIZE(copy_stack_offset, align); src_reg = ctx->regs[arg][1]; - | add Rx(IR_REG_INT_ARG1), sp, #(used_stack - copy_stack_offset) + | add Rx(ir_call_conv_default.int_param_regs[0]), sp, #(used_stack - copy_stack_offset) if (src_reg != IR_REG_NONE) { if (IR_REG_SPILLED(src_reg)) { src_reg = IR_REG_NUM(src_reg); ir_emit_load(ctx, IR_ADDR, src_reg, arg_insn->op1); } - | mov Rx(IR_REG_INT_ARG2), Rx(src_reg) + | mov Rx(ir_call_conv_default.int_param_regs[1]), Rx(src_reg) } else { - ir_emit_load(ctx, IR_ADDR, IR_REG_INT_ARG2, arg_insn->op1); + ir_emit_load(ctx, IR_ADDR, ir_call_conv_default.int_param_regs[1], arg_insn->op1); } - ir_emit_load_imm_int(ctx, IR_ADDR, IR_REG_INT_ARG3, size); + ir_emit_load_imm_int(ctx, IR_ADDR, ir_call_conv_default.int_param_regs[2], size); if (aarch64_may_use_b(ctx->code_buffer, addr)) { | bl &addr @@ -4949,18 +5227,15 @@ arg_insn = &ctx->ir_base[arg]; type = arg_insn->type; -#ifdef __APPLE__ if (j > last_named_input) { if (arg_insn->op == IR_ARGVAL) { do_pass3 = 1; continue; } dst_reg = IR_REG_NONE; /* pass argument through stack */ - } else -#endif - if (IR_IS_TYPE_INT(type)) { - if (int_param < int_reg_params_count) { - dst_reg = int_reg_params[int_param]; + } else if (IR_IS_TYPE_INT(type)) { + if (int_param < cc->int_param_regs_count) { + dst_reg = cc->int_param_regs[int_param]; } else { dst_reg = IR_REG_NONE; /* pass argument through stack */ } @@ -4971,8 +5246,8 @@ } } else { IR_ASSERT(IR_IS_TYPE_FP(type)); - if (fp_param < fp_reg_params_count) { - dst_reg = fp_reg_params[fp_param]; + if (fp_param < cc->fp_param_regs_count) { + dst_reg = cc->fp_param_regs[fp_param]; } else { dst_reg = IR_REG_NONE; /* pass argument through stack */ } @@ -4981,7 +5256,7 @@ if (dst_reg != IR_REG_NONE) { if (IR_IS_CONST_REF(arg) || src_reg == IR_REG_NONE || - (IR_REG_SPILLED(src_reg) && !IR_REGSET_IN(IR_REGSET_PRESERVED, IR_REG_NUM(src_reg)))) { + (IR_REG_SPILLED(src_reg) && !IR_REGSET_IN(cc->preserved_regs, IR_REG_NUM(src_reg)))) { /* delay CONST->REG and MEM->REG moves to third pass */ do_pass3 = 1; } else { @@ -5033,14 +5308,11 @@ copy_stack_offset += size; align = IR_MAX((int)sizeof(void*), align); copy_stack_offset = IR_ALIGNED_SIZE(copy_stack_offset, align); -#ifdef __APPLE__ if (j > last_named_input) { | add Rx(tmp_reg), sp, #(used_stack - copy_stack_offset) ir_emit_store_mem_int(ctx, IR_ADDR, IR_MEM_BO(IR_REG_STACK_POINTER, stack_offset), tmp_reg); - } else -#endif - if (int_param < int_reg_params_count) { - dst_reg = int_reg_params[int_param]; + } else if (int_param < cc->int_param_regs_count) { + dst_reg = cc->int_param_regs[int_param]; | add Rx(dst_reg), sp, #(used_stack - copy_stack_offset) } else { | add Rx(tmp_reg), sp, #(used_stack - copy_stack_offset) @@ -5050,22 +5322,19 @@ int_param++; continue; } -#ifdef __APPLE__ if (j > last_named_input) { dst_reg = IR_REG_NONE; /* pass argument through stack */ - } else -#endif - if (IR_IS_TYPE_INT(type)) { - if (int_param < int_reg_params_count) { - dst_reg = int_reg_params[int_param]; + } else if (IR_IS_TYPE_INT(type)) { + if (int_param < cc->int_param_regs_count) { + dst_reg = cc->int_param_regs[int_param]; } else { dst_reg = IR_REG_NONE; /* argument already passed through stack */ } int_param++; } else { IR_ASSERT(IR_IS_TYPE_FP(type)); - if (fp_param < fp_reg_params_count) { - dst_reg = fp_reg_params[fp_param]; + if (fp_param < cc->fp_param_regs_count) { + dst_reg = cc->fp_param_regs[fp_param]; } else { dst_reg = IR_REG_NONE; /* argument already passed through stack */ } @@ -5074,7 +5343,7 @@ if (dst_reg != IR_REG_NONE) { if (IR_IS_CONST_REF(arg) || src_reg == IR_REG_NONE || - (IR_REG_SPILLED(src_reg) && !IR_REGSET_IN(IR_REGSET_PRESERVED, IR_REG_NUM(src_reg)))) { + (IR_REG_SPILLED(src_reg) && !IR_REGSET_IN(cc->preserved_regs, IR_REG_NUM(src_reg)))) { if (IR_IS_CONST_REF(arg) && IR_IS_TYPE_INT(type)) { if (ir_type_size[type] == 1) { type = IR_ADDR; @@ -5114,7 +5383,7 @@ return used_stack; } -static void ir_emit_call_ex(ir_ctx *ctx, ir_ref def, ir_insn *insn, int32_t used_stack) +static void ir_emit_call_ex(ir_ctx *ctx, ir_ref def, ir_insn *insn, const ir_call_conv_dsc *cc, int32_t used_stack) { ir_backend_data *data = ctx->data; dasm_State **Dst = &data->dasm_state; @@ -5149,27 +5418,27 @@ if (IR_IS_TYPE_INT(insn->type)) { def_reg = IR_REG_NUM(ctx->regs[def][0]); if (def_reg != IR_REG_NONE) { - if (def_reg != IR_REG_INT_RET1) { - ir_emit_mov(ctx, insn->type, def_reg, IR_REG_INT_RET1); + if (def_reg != cc->int_ret_reg) { + ir_emit_mov(ctx, insn->type, def_reg, cc->int_ret_reg); } if (IR_REG_SPILLED(ctx->regs[def][0])) { ir_emit_store(ctx, insn->type, def, def_reg); } } else if (ctx->use_lists[def].count > 1) { - ir_emit_store(ctx, insn->type, def, IR_REG_INT_RET1); + ir_emit_store(ctx, insn->type, def, cc->int_ret_reg); } } else { IR_ASSERT(IR_IS_TYPE_FP(insn->type)); def_reg = IR_REG_NUM(ctx->regs[def][0]); if (def_reg != IR_REG_NONE) { - if (def_reg != IR_REG_FP_RET1) { - ir_emit_fp_mov(ctx, insn->type, def_reg, IR_REG_FP_RET1); + if (def_reg != cc->fp_ret_reg) { + ir_emit_fp_mov(ctx, insn->type, def_reg, cc->fp_ret_reg); } if (IR_REG_SPILLED(ctx->regs[def][0])) { ir_emit_store(ctx, insn->type, def, def_reg); } } else if (ctx->use_lists[def].count > 1) { - ir_emit_store(ctx, insn->type, def, IR_REG_FP_RET1); + ir_emit_store(ctx, insn->type, def, cc->fp_ret_reg); } } } @@ -5177,18 +5446,22 @@ static void ir_emit_call(ir_ctx *ctx, ir_ref def, ir_insn *insn) { - int32_t used_stack = ir_emit_arguments(ctx, def, insn, ctx->regs[def][1]); - ir_emit_call_ex(ctx, def, insn, used_stack); + const ir_proto_t *proto = ir_call_proto(ctx, insn); + const ir_call_conv_dsc *cc = ir_get_call_conv_dsc(proto ? proto->flags : IR_CC_DEFAULT); + int32_t used_stack = ir_emit_arguments(ctx, def, insn, cc, ctx->regs[def][1]); + ir_emit_call_ex(ctx, def, insn, cc, used_stack); } static void ir_emit_tailcall(ir_ctx *ctx, ir_ref def, ir_insn *insn) { ir_backend_data *data = ctx->data; dasm_State **Dst = &data->dasm_state; - int32_t used_stack = ir_emit_arguments(ctx, def, insn, ctx->regs[def][1]); + const ir_proto_t *proto = ir_call_proto(ctx, insn); + const ir_call_conv_dsc *cc = ir_get_call_conv_dsc(proto ? proto->flags : IR_CC_DEFAULT); + int32_t used_stack = ir_emit_arguments(ctx, def, insn, cc, ctx->regs[def][1]); if (used_stack != 0) { - ir_emit_call_ex(ctx, def, insn, used_stack); + ir_emit_call_ex(ctx, def, insn, cc, used_stack); ir_emit_return_void(ctx); return; } @@ -5246,6 +5519,19 @@ } | br Rx(op2_reg) } else if (IR_IS_CONST_REF(insn->op2)) { + if (ctx->ir_base[insn->op2].op == IR_LABEL) { + if (!data->resolved_label_syms) { + data->resolved_label_syms = 1; + ir_resolve_label_syms(ctx); + } + + uint32_t target = ctx->ir_base[insn->op2].val.u32_hi; + target = ir_skip_empty_target_blocks(ctx, target); + + | b =>target + return; + } + void *addr = ir_jmp_addr(ctx, insn, &ctx->ir_base[insn->op2]); if (aarch64_may_use_b(ctx->code_buffer, addr)) { @@ -5397,15 +5683,23 @@ case IR_GT: | bgt &addr break; + case IR_ULT: + | blt &addr + break; + case IR_UGE: + | bhs &addr + break; + case IR_ULE: + | ble &addr + break; + case IR_UGT: + | bhi &addr + break; case IR_ORDERED: | bvc &addr break; case IR_UNORDERED: | bvs &addr -// case IR_ULT: fprintf(stderr, "\tjb .LL%d\n", true_block); break; -// case IR_UGE: fprintf(stderr, "\tjae .LL%d\n", true_block); break; -// case IR_ULE: fprintf(stderr, "\tjbe .LL%d\n", true_block); break; -// case IR_UGT: fprintf(stderr, "\tja .LL%d\n", true_block); break; } } } @@ -5419,9 +5713,16 @@ ir_type type = ctx->ir_base[cmp_insn->op1].type; ir_ref op1 = cmp_insn->op1; ir_ref op2 = cmp_insn->op2; - ir_reg op1_reg = ctx->regs[insn->op2][1]; - ir_reg op2_reg = ctx->regs[insn->op2][2]; void *addr; + ir_reg op1_reg, op2_reg; + + if (UNEXPECTED(ctx->rules[insn->op2] & IR_FUSED_REG)) { + op1_reg = ir_get_fused_reg(ctx, def, insn->op2 * sizeof(ir_ref) + 1); + op2_reg = ir_get_fused_reg(ctx, def, insn->op2 * sizeof(ir_ref) + 2); + } else { + op1_reg = ctx->regs[insn->op2][1]; + op2_reg = ctx->regs[insn->op2][2]; + } if (op1_reg != IR_REG_NONE && IR_REG_SPILLED(op1_reg)) { op1_reg = IR_REG_NUM(op1_reg); @@ -5475,11 +5776,15 @@ static void ir_emit_guard_cmp_fp(ir_ctx *ctx, uint32_t b, ir_ref def, ir_insn *insn) { - ir_op op = ir_emit_cmp_fp_common(ctx, insn->op2, &ctx->ir_base[insn->op2]); + ir_op op = ir_emit_cmp_fp_common(ctx, def, insn->op2, &ctx->ir_base[insn->op2]); void *addr = ir_jmp_addr(ctx, insn, &ctx->ir_base[insn->op3]); if (insn->op == IR_GUARD) { - op ^= 1; // reverse + if (op == IR_EQ || op == IR_NE || op == IR_ORDERED || op == IR_UNORDERED) { + op ^= 1; // reverse + } else { + op ^= 5; // reverse + } } ir_emit_guard_jcc(ctx, op, addr, 0); } @@ -5565,6 +5870,7 @@ static void ir_emit_exitcall(ir_ctx *ctx, ir_ref def, ir_insn *insn) { ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = &ir_call_conv_default; dasm_State **Dst = &data->dasm_state; ir_reg def_reg = IR_REG_NUM(ctx->regs[def][0]); @@ -5604,10 +5910,10 @@ | stp x2, x3, [sp, #-16]! | stp x0, x1, [sp, #-16]! - | mov Rx(IR_REG_INT_ARG2), sp - | add Rx(IR_REG_INT_ARG1), Rx(IR_REG_INT_ARG2), #(32*8+32*8) - | str Rx(IR_REG_INT_ARG1), [sp, #(31*8)] - | mov Rx(IR_REG_INT_ARG1), Rx(IR_REG_INT_TMP) + | mov Rx(cc->int_param_regs[1]), sp + | add Rx(cc->int_param_regs[0]), Rx(cc->int_param_regs[1]), #(32*8+32*8) + | str Rx(cc->int_param_regs[0]), [sp, #(31*8)] + | mov Rx(cc->int_param_regs[0]), Rx(IR_REG_INT_TMP) if (IR_IS_CONST_REF(insn->op2)) { void *addr = ir_call_addr(ctx, insn, &ctx->ir_base[insn->op2]); @@ -5624,8 +5930,8 @@ | add sp, sp, #(32*8+32*8) - if (def_reg != IR_REG_INT_RET1) { - ir_emit_mov(ctx, insn->type, def_reg, IR_REG_INT_RET1); + if (def_reg != cc->int_ret_reg) { + ir_emit_mov(ctx, insn->type, def_reg, cc->int_ret_reg); } if (IR_REG_SPILLED(ctx->regs[def][0])) { ir_emit_store(ctx, insn->type, def, def_reg); @@ -5636,6 +5942,7 @@ { ir_reg fp = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + offset = IR_SPILL_POS_TO_OFFSET(offset); IR_ASSERT(from_reg != IR_REG_NONE || to_reg != IR_REG_NONE); if (IR_IS_TYPE_INT(type)) { @@ -5670,34 +5977,26 @@ int fp_param_num = 0; ir_reg src_reg; ir_reg dst_reg; - // TODO: Calling convention specific - int int_reg_params_count = IR_REG_INT_ARGS; - int fp_reg_params_count = IR_REG_FP_ARGS; - const int8_t *int_reg_params = _ir_int_reg_params; - const int8_t *fp_reg_params = _ir_fp_reg_params; + ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; int32_t stack_offset = 0; + int32_t stack_start = ctx->stack_frame_size; - if (ctx->flags & IR_USE_FRAME_POINTER) { - /* skip old frame pointer and return address */ - stack_offset = sizeof(void*) * 2 + ctx->stack_frame_size + ctx->call_stack_size; - } else { - stack_offset = ctx->stack_frame_size + ctx->call_stack_size; - } n = use_list->count; for (i = 0, p = &ctx->use_edges[use_list->refs]; i < n; i++, p++) { use = *p; insn = &ctx->ir_base[use]; if (insn->op == IR_PARAM) { if (IR_IS_TYPE_INT(insn->type)) { - if (int_param_num < int_reg_params_count) { - src_reg = int_reg_params[int_param_num]; + if (int_param_num < cc->int_param_regs_count) { + src_reg = cc->int_param_regs[int_param_num]; } else { src_reg = IR_REG_NONE; } int_param_num++; } else { - if (fp_param_num < fp_reg_params_count) { - src_reg = fp_reg_params[fp_param_num]; + if (fp_param_num < cc->fp_param_regs_count) { + src_reg = cc->fp_param_regs[fp_param_num]; } else { src_reg = IR_REG_NONE; } @@ -5706,12 +6005,9 @@ if (ctx->vregs[use]) { dst_reg = IR_REG_NUM(ctx->regs[use][0]); IR_ASSERT(src_reg != IR_REG_NONE || dst_reg != IR_REG_NONE || - stack_offset == ctx->live_intervals[ctx->vregs[use]]->stack_spill_pos + - ((ctx->flags & IR_USE_FRAME_POINTER) ? - -(ctx->stack_frame_size - ctx->stack_frame_alignment) : - ctx->call_stack_size)); + stack_start + stack_offset == ctx->live_intervals[ctx->vregs[use]]->stack_spill_pos); if (src_reg != dst_reg) { - ir_emit_param_move(ctx, insn->type, src_reg, dst_reg, use, stack_offset); + ir_emit_param_move(ctx, insn->type, src_reg, dst_reg, use, stack_start + stack_offset); } if (dst_reg != IR_REG_NONE && IR_REG_SPILLED(ctx->regs[use][0])) { ir_emit_store(ctx, insn->type, use, dst_reg); @@ -5740,10 +6036,9 @@ return IR_REGSET_FIRST(available); } -static int ir_fix_dessa_tmps(ir_ctx *ctx, uint8_t type, ir_ref from, ir_ref to) +static int ir_fix_dessa_tmps(ir_ctx *ctx, uint8_t type, ir_ref from, ir_ref to, void *dessa_from_block) { - ir_backend_data *data = ctx->data; - ir_ref ref = ctx->cfg_blocks[data->dessa_from_block].end; + ir_ref ref = ctx->cfg_blocks[(intptr_t)dessa_from_block].end; if (to == 0) { if (IR_IS_TYPE_INT(type)) { @@ -5779,35 +6074,26 @@ int int_param_num = 0; int fp_param_num = 0; ir_reg src_reg; - // TODO: Calling convention specific - int int_reg_params_count = IR_REG_INT_ARGS; - int fp_reg_params_count = IR_REG_FP_ARGS; - const int8_t *int_reg_params = _ir_int_reg_params; - const int8_t *fp_reg_params = _ir_fp_reg_params; + ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; int32_t stack_offset = 0; - int32_t param_stack_size = 0; + int32_t stack_start = ctx->stack_frame_size; - if (ctx->flags & IR_USE_FRAME_POINTER) { - /* skip old frame pointer and return address */ - stack_offset = sizeof(void*) * 2 + (ctx->stack_frame_size - ctx->stack_frame_alignment); - } else { - stack_offset = ctx->stack_frame_size; - } n = use_list->count; for (i = 0, p = &ctx->use_edges[use_list->refs]; i < n; i++, p++) { use = *p; insn = &ctx->ir_base[use]; if (insn->op == IR_PARAM) { if (IR_IS_TYPE_INT(insn->type)) { - if (int_param_num < int_reg_params_count) { - src_reg = int_reg_params[int_param_num]; + if (int_param_num < cc->int_param_regs_count) { + src_reg = cc->int_param_regs[int_param_num]; } else { src_reg = IR_REG_NONE; } int_param_num++; } else { - if (fp_param_num < fp_reg_params_count) { - src_reg = fp_reg_params[fp_param_num]; + if (fp_param_num < cc->fp_param_regs_count) { + src_reg = cc->fp_param_regs[fp_param_num]; } else { src_reg = IR_REG_NONE; } @@ -5819,23 +6105,21 @@ if ((ival->flags & IR_LIVE_INTERVAL_MEM_PARAM) && ival->stack_spill_pos == -1 && (ival->next || ival->reg == IR_REG_NONE)) { - ival->stack_spill_pos = stack_offset; + ival->stack_spill_pos = stack_start + stack_offset; } } if (sizeof(void*) == 8) { stack_offset += sizeof(void*); - param_stack_size += sizeof(void*); } else { stack_offset += IR_MAX(sizeof(void*), ir_type_size[insn->type]); - param_stack_size += IR_MAX(sizeof(void*), ir_type_size[insn->type]); } } } } - ctx->gp_reg_params = IR_MIN(int_param_num, int_reg_params_count); - ctx->fp_reg_params = IR_MIN(fp_param_num, fp_reg_params_count); - ctx->param_stack_size = param_stack_size; + ctx->gp_reg_params = IR_MIN(int_param_num, cc->int_param_regs_count); + ctx->fp_reg_params = IR_MIN(fp_param_num, cc->fp_param_regs_count); + ctx->param_stack_size = stack_offset; } static void ir_allocate_unique_spill_slots(ir_ctx *ctx) @@ -5845,11 +6129,13 @@ ir_insn *insn; ir_ref i, n, j, *p; uint32_t *rule, insn_flags; - ir_backend_data *data = ctx->data; ir_regset available = 0; ir_target_constraints constraints; uint32_t def_flags; ir_reg reg; + ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; + ir_regset scratch = ir_scratch_regset[cc->scratch_reg - IR_REG_NUM]; ctx->regs = ir_mem_malloc(sizeof(ir_regs) * ctx->insns_count); memset(ctx->regs, IR_REG_NONE, sizeof(ir_regs) * ctx->insns_count); @@ -5876,6 +6162,7 @@ case IR_MERGE: case IR_LOOP_BEGIN: case IR_LOOP_END: + case IR_IGOTO_DUP: break; default: def_flags = ir_get_target_constraints(ctx, i, &constraints); @@ -5884,7 +6171,7 @@ && *rule != IR_CMP_AND_BRANCH_FP && *rule != IR_GUARD_CMP_INT && *rule != IR_GUARD_CMP_FP) { - available = IR_REGSET_SCRATCH; + available = scratch; } if (ctx->vregs[i]) { reg = constraints.def_reg; @@ -5892,7 +6179,7 @@ IR_REGSET_EXCL(available, reg); ctx->regs[i][0] = reg | IR_REG_SPILL_STORE; } else if (def_flags & IR_USE_MUST_BE_IN_REG) { - if (insn->op == IR_VLOAD + if ((insn->op == IR_VLOAD || insn->op == IR_VLOAD_v) && ctx->live_intervals[ctx->vregs[i]] && ctx->live_intervals[ctx->vregs[i]]->stack_spill_pos != -1 && ir_is_same_mem_var(ctx, i, ctx->ir_base[insn->op2].op3)) { @@ -5914,7 +6201,7 @@ if (insn->op == IR_PARAM && reg == IR_REG_NONE) { ival->flags |= IR_LIVE_INTERVAL_MEM_PARAM; } else { - ival->stack_spill_pos = ir_allocate_spill_slot(ctx, ival->type, &data->ra_data); + ival->stack_spill_pos = ir_allocate_spill_slot(ctx, ival->type); } } else if (insn->op == IR_PARAM) { IR_ASSERT(0 && "unexpected PARAM"); @@ -5925,14 +6212,14 @@ ir_ref n = use_list->count; if (n > 0) { - int32_t stack_spill_pos = insn->op3 = ir_allocate_spill_slot(ctx, insn->type, &data->ra_data); + int32_t stack_spill_pos = insn->op3 = ir_allocate_spill_slot(ctx, insn->type); ir_ref i, *p, use; ir_insn *use_insn; for (i = 0, p = &ctx->use_edges[use_list->refs]; i < n; i++, p++) { use = *p; use_insn = &ctx->ir_base[use]; - if (use_insn->op == IR_VLOAD) { + if (use_insn->op == IR_VLOAD || use_insn->op == IR_VLOAD_v) { if (ctx->vregs[use] && !ctx->live_intervals[ctx->vregs[use]]) { ir_live_interval *ival = ir_arena_alloc(&ctx->arena, sizeof(ir_live_interval)); @@ -5943,7 +6230,7 @@ ival->vreg = ctx->vregs[use]; ival->stack_spill_pos = stack_spill_pos; } - } else if (use_insn->op == IR_VSTORE) { + } else if (use_insn->op == IR_VSTORE || use_insn->op == IR_STORE_v) { if (!IR_IS_CONST_REF(use_insn->op3) && ctx->vregs[use_insn->op3] && !ctx->live_intervals[ctx->vregs[use_insn->op3]]) { @@ -5980,10 +6267,13 @@ } } ctx->regs[i][constraints.tmp_regs[n].num] = reg; - } else if (constraints.tmp_regs[n].reg == IR_REG_SCRATCH) { - available = IR_REGSET_DIFFERENCE(available, IR_REGSET_SCRATCH); } else { - IR_REGSET_EXCL(available, constraints.tmp_regs[n].reg); + reg = constraints.tmp_regs[n].reg; + if (reg >= IR_REG_NUM) { + available = IR_REGSET_DIFFERENCE(available, ir_scratch_regset[reg - IR_REG_NUM]); + } else { + IR_REGSET_EXCL(available, reg); + } } } while (n); } @@ -6019,8 +6309,7 @@ rule += n; } if (bb->flags & IR_BB_DESSA_MOVES) { - data->dessa_from_block = b; - ir_gen_dessa_moves(ctx, b, ir_fix_dessa_tmps); + ir_gen_dessa_moves(ctx, b, ir_fix_dessa_tmps, (void*)(intptr_t)b); } } @@ -6037,8 +6326,11 @@ for (i = 1, insn = ctx->ir_base + 1; i < ctx->insns_count;) { if (insn->op == IR_CALL) { + const ir_proto_t *proto = ir_call_proto(ctx, insn); + const ir_call_conv_dsc *cc = ir_get_call_conv_dsc(proto ? proto->flags : IR_CC_DEFAULT); int32_t copy_stack; - call_stack_size = ir_call_used_stack(ctx, insn, ©_stack); + + call_stack_size = ir_call_used_stack(ctx, insn, cc, ©_stack); if (call_stack_size > peak_call_stack_size) { peak_call_stack_size = call_stack_size; } @@ -6070,35 +6362,34 @@ } if ((ctx->flags & IR_VARARG_FUNC) && (ctx->flags2 & IR_HAS_VA_START)) { - if ((ctx->flags2 & (IR_HAS_VA_ARG_GP|IR_HAS_VA_COPY)) && ctx->gp_reg_params < IR_REG_INT_ARGS) { - additional_size += sizeof(void*) * IR_REG_INT_ARGS; + ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; + + if ((ctx->flags2 & (IR_HAS_VA_ARG_GP|IR_HAS_VA_COPY)) && ctx->gp_reg_params < cc->int_param_regs_count) { + additional_size += sizeof(void*) * cc->int_param_regs_count; } - if ((ctx->flags2 & (IR_HAS_VA_ARG_FP|IR_HAS_VA_COPY)) && ctx->fp_reg_params < IR_REG_FP_ARGS) { - additional_size += 16 * IR_REG_FP_ARGS; + if ((ctx->flags2 & (IR_HAS_VA_ARG_FP|IR_HAS_VA_COPY)) && ctx->fp_reg_params < cc->fp_param_regs_count) { + additional_size += 16 * cc->int_param_regs_count; } } ctx->stack_frame_size = IR_ALIGNED_SIZE(ctx->stack_frame_size, sizeof(void*)); ctx->stack_frame_size += additional_size; - ctx->stack_frame_alignment = 0; ctx->call_stack_size = 0; if (!(ctx->flags & IR_FUNCTION)) { while (IR_ALIGNED_SIZE(ctx->stack_frame_size, 16) != ctx->stack_frame_size) { ctx->stack_frame_size += sizeof(void*); - ctx->stack_frame_alignment += sizeof(void*); } } else { /* Stack must be 16 byte aligned */ if (!(ctx->flags & IR_FUNCTION)) { while (IR_ALIGNED_SIZE(ctx->stack_frame_size, 16) != ctx->stack_frame_size) { ctx->stack_frame_size += sizeof(void*); - ctx->stack_frame_alignment += sizeof(void*); } } else if (ctx->flags & IR_USE_FRAME_POINTER) { while (IR_ALIGNED_SIZE(ctx->stack_frame_size + sizeof(void*) * 2, 16) != ctx->stack_frame_size + sizeof(void*) * 2) { ctx->stack_frame_size += sizeof(void*); - ctx->stack_frame_alignment += sizeof(void*); } } else { if (!(ctx->flags & IR_NO_STACK_COMBINE)) { @@ -6107,7 +6398,6 @@ while (IR_ALIGNED_SIZE(ctx->stack_frame_size + ctx->call_stack_size, 16) != ctx->stack_frame_size + ctx->call_stack_size) { ctx->stack_frame_size += sizeof(void*); - ctx->stack_frame_alignment += sizeof(void*); } } } @@ -6143,18 +6433,21 @@ int ret; void *entry; size_t size; + ir_ref igoto_dup_ref = IR_UNUSED; + uint32_t igoto_dup_block = 0; + data.ra_data.cc = ir_get_call_conv_dsc(ctx->flags); data.ra_data.unused_slot_4 = 0; data.ra_data.unused_slot_2 = 0; data.ra_data.unused_slot_1 = 0; data.ra_data.handled = NULL; data.rodata_label = 0; data.jmp_table_label = 0; + data.resolved_label_syms = 0; ctx->data = &data; if (!ctx->live_intervals) { ctx->stack_frame_size = 0; - ctx->stack_frame_alignment = 0; ctx->call_stack_size = 0; ctx->used_preserved_regs = 0; ir_allocate_unique_spill_slots(ctx); @@ -6176,7 +6469,6 @@ } ctx->stack_frame_size = ctx->fixed_stack_frame_size; ctx->call_stack_size = ctx->fixed_call_stack_size; - ctx->stack_frame_alignment = 0; } Dst = &data.dasm_state; @@ -6386,6 +6678,35 @@ case IR_TAILCALL: ir_emit_tailcall(ctx, i, insn); break; + case IR_IGOTO_DUP: + if (bb->flags & IR_BB_DESSA_MOVES) { + ir_emit_dessa_moves(ctx, b, bb); + } + IR_ASSERT(!igoto_dup_ref && !igoto_dup_block); + igoto_dup_ref = i; + igoto_dup_block = b; + b = ctx->cfg_edges[bb->successors]; + bb = &ctx->cfg_blocks[b]; + i = bb->start; + insn = &ctx->ir_base[i]; + rule = &ctx->rules[i]; + break; + case IR_IGOTO: + if ((ctx->ir_base[insn->op1].op == IR_MERGE || ctx->ir_base[insn->op1].op == IR_LOOP_BEGIN) + && (ctx->rules[ctx->ir_base[insn->op1].op1] & IR_RULE_MASK) == IR_IGOTO_DUP + && igoto_dup_ref) { + ir_emit_ijmp(ctx, i, insn); + b = igoto_dup_block; + bb = &ctx->cfg_blocks[b]; + i = igoto_dup_ref; + insn = &ctx->ir_base[i]; + rule = &ctx->rules[i]; + igoto_dup_block= 0; + igoto_dup_ref = 0; + break; + } + IR_ASSERT(!igoto_dup_ref && !igoto_dup_block); + IR_FALLTHROUGH; case IR_IJMP: ir_emit_ijmp(ctx, i, insn); break; @@ -6396,9 +6717,11 @@ ir_emit_vaddr(ctx, i, insn); break; case IR_VLOAD: + case IR_VLOAD_v: ir_emit_vload(ctx, i, insn); break; case IR_VSTORE: + case IR_VSTORE_v: ir_emit_vstore(ctx, i, insn); break; case IR_RLOAD: @@ -6645,6 +6968,28 @@ } while (i != 0); } + if ((ctx->flags2 & IR_HAS_BLOCK_ADDR) && ctx->loader && ctx->loader->add_label) { + for (b = 1, bb = &ctx->cfg_blocks[b]; b <= ctx->cfg_blocks_count; bb++, b++) { + ir_insn *insn = &ctx->ir_base[bb->start]; + + if (insn->op == IR_BEGIN && insn->op2) { + IR_ASSERT(ctx->ir_base[insn->op2].op == IR_LABEL); + ctx->ir_base[insn->op2].val.u32_hi = 0; + ctx->loader->add_label(ctx->loader, ir_get_str(ctx, ctx->ir_base[insn->op2].val.str), + (char*)entry + dasm_getpclabel(&data.dasm_state, ir_skip_empty_target_blocks(ctx, b))); + } + } + } else if (data.resolved_label_syms) { + for (b = 1, bb = &ctx->cfg_blocks[b]; b <= ctx->cfg_blocks_count; bb++, b++) { + ir_insn *insn = &ctx->ir_base[bb->start]; + + if (insn->op == IR_BEGIN && insn->op2) { + IR_ASSERT(ctx->ir_base[insn->op2].op == IR_LABEL); + ctx->ir_base[insn->op2].val.u32_hi = 0; + } + } + } + dasm_free(&data.dasm_state); if (ctx->code_buffer) { @@ -6836,7 +7181,7 @@ return n; } -bool ir_needs_thunk(ir_code_buffer *code_buffer, void *addr) +bool ir_needs_thunk(const ir_code_buffer *code_buffer, void *addr) { return !aarch64_may_use_b(code_buffer, addr); } diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_aarch64.h php8.4-8.4.21/ext/opcache/jit/ir/ir_aarch64.h --- php8.4-8.4.16/ext/opcache/jit/ir/ir_aarch64.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_aarch64.h 2026-05-05 16:34:12.000000000 +0000 @@ -87,14 +87,15 @@ IR_GP_REGS(IR_GP_REG_ENUM) IR_FP_REGS(IR_FP_REG_ENUM) IR_REG_NUM, + IR_REG_ALL = IR_REG_NUM, /* special name for regset */ + IR_REG_SET_1, /* special name for regset */ + IR_REG_SET_NUM, }; #define IR_REG_GP_FIRST IR_REG_X0 #define IR_REG_FP_FIRST IR_REG_V0 #define IR_REG_GP_LAST (IR_REG_FP_FIRST - 1) #define IR_REG_FP_LAST (IR_REG_NUM - 1) -#define IR_REG_SCRATCH (IR_REG_NUM) /* special name for regset */ -#define IR_REG_ALL (IR_REG_NUM + 1) /* special name for regset */ #define IR_REGSET_64BIT 1 @@ -125,65 +126,4 @@ #define IR_REG_LR IR_REG_X30 #define IR_REG_ZR IR_REG_X31 -/* Calling Convention */ -#define IR_REG_INT_RET1 IR_REG_X0 -#define IR_REG_FP_RET1 IR_REG_V0 -#define IR_REG_INT_ARGS 8 -#define IR_REG_FP_ARGS 8 -#define IR_REG_INT_ARG1 IR_REG_X0 -#define IR_REG_INT_ARG2 IR_REG_X1 -#define IR_REG_INT_ARG3 IR_REG_X2 -#define IR_REG_INT_ARG4 IR_REG_X3 -#define IR_REG_INT_ARG5 IR_REG_X4 -#define IR_REG_INT_ARG6 IR_REG_X5 -#define IR_REG_INT_ARG7 IR_REG_X6 -#define IR_REG_INT_ARG8 IR_REG_X7 -#define IR_REG_FP_ARG1 IR_REG_V0 -#define IR_REG_FP_ARG2 IR_REG_V1 -#define IR_REG_FP_ARG3 IR_REG_V2 -#define IR_REG_FP_ARG4 IR_REG_V3 -#define IR_REG_FP_ARG5 IR_REG_V4 -#define IR_REG_FP_ARG6 IR_REG_V5 -#define IR_REG_FP_ARG7 IR_REG_V6 -#define IR_REG_FP_ARG8 IR_REG_V7 -#define IR_MAX_REG_ARGS 16 -#define IR_SHADOW_ARGS 0 - -# define IR_REGSET_SCRATCH \ - (IR_REGSET_INTERVAL(IR_REG_X0, IR_REG_X18) \ - | IR_REGSET_INTERVAL(IR_REG_V0, IR_REG_V7) \ - | IR_REGSET_INTERVAL(IR_REG_V16, IR_REG_V31)) - -# define IR_REGSET_PRESERVED \ - (IR_REGSET_INTERVAL(IR_REG_X19, IR_REG_X30) \ - | IR_REGSET_INTERVAL(IR_REG_V8, IR_REG_V15)) - -#ifndef __APPLE__ -typedef struct _ir_va_list { - void *stack; - void *gr_top; - void *vr_top; - int32_t gr_offset; - int32_t vr_offset; -} ir_va_list; -#endif - -typedef struct _ir_tmp_reg { - union { - uint8_t num; - int8_t reg; - }; - uint8_t type; - int8_t start; - int8_t end; -} ir_tmp_reg; - -struct _ir_target_constraints { - int8_t def_reg; - uint8_t tmps_count; - uint8_t hints_count; - ir_tmp_reg tmp_regs[3]; - int8_t hints[IR_MAX_REG_ARGS + 3]; -}; - #endif /* IR_AARCH64_H */ diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_builder.h php8.4-8.4.21/ext/opcache/jit/ir/ir_builder.h --- php8.4-8.4.16/ext/opcache/jit/ir/ir_builder.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_builder.h 2026-05-05 16:34:12.000000000 +0000 @@ -490,7 +490,7 @@ #define ir_ADD_OFFSET(_addr, _offset) _ir_ADD_OFFSET(_ir_CTX, (_addr), (_offset)) /* Unfoldable variant of COPY */ -#define ir_HARD_COPY(_type, _op1) ir_emit2(_ir_CTX, IR_OPT(IR_COPY, (_type)), (_op1), 1) +#define ir_HARD_COPY(_type, _op1) ir_emit2(_ir_CTX, IR_OPT(IR_COPY, (_type)), (_op1), IR_COPY_HARD) #define ir_HARD_COPY_B(_op1) ir_HARD_COPY(IR_BOOL, _op1) #define ir_HARD_COPY_U8(_op1) ir_HARD_COPY(IR_U8, _op1) #define ir_HARD_COPY_U16(_op1) ir_HARD_COPY(IR_U16, _op1) @@ -544,6 +544,8 @@ #define ir_VLOAD_D(_var) _ir_VLOAD(_ir_CTX, IR_DOUBLE, (_var)) #define ir_VLOAD_F(_var) _ir_VLOAD(_ir_CTX, IR_FLOAT, (_var)) #define ir_VSTORE(_var, _val) _ir_VSTORE(_ir_CTX, (_var), (_val)) +#define ir_VLOAD_v(_type, _var) _ir_VLOAD_v(_ir_CTX, (_type), (_var)) +#define ir_VSTORE_v(_var, _val) _ir_VSTORE_v(_ir_CTX, (_var), (_val)) #define ir_RLOAD(_type, _reg) _ir_RLOAD(_ir_CTX, (_type), (_reg)) #define ir_RLOAD_B(_reg) _ir_RLOAD(_ir_CTX, IR_BOOL, (_reg)) #define ir_RLOAD_U8(_reg) _ir_RLOAD(_ir_CTX, IR_U8, (_reg)) @@ -574,6 +576,8 @@ #define ir_LOAD_D(_addr) _ir_LOAD(_ir_CTX, IR_DOUBLE, (_addr)) #define ir_LOAD_F(_addr) _ir_LOAD(_ir_CTX, IR_FLOAT, (_addr)) #define ir_STORE(_addr, _val) _ir_STORE(_ir_CTX, (_addr), (_val)) +#define ir_LOAD_v(_type, _addr) _ir_LOAD_v(_ir_CTX, (_type), (_addr)) +#define ir_STORE_v(_addr, _val) _ir_STORE_v(_ir_CTX, (_addr), (_val)) #define ir_TLS(_index, _offset) _ir_TLS(_ir_CTX, (_index), (_offset)) #define ir_TRAP() do {_ir_CTX->control = ir_emit1(_ir_CTX, IR_TRAP, _ir_CTX->control);} while (0) @@ -586,7 +590,7 @@ #define ir_VA_END(_list) _ir_VA_END(_ir_CTX, _list) #define ir_VA_COPY(_dst, _src) _ir_VA_COPY(_ir_CTX, _dst, _src) #define ir_VA_ARG(_list, _type) _ir_VA_ARG(_ir_CTX, _type, _list) -#define ir_VA_ARG_EX(_list, _type, size) _ir_VA_ARG_EX(_ir_CTX, _type, _list, size) +#define ir_VA_ARG_EX(_list, _type, s, a) _ir_VA_ARG_EX(_ir_CTX, _type, _list, s, a) #define ir_START() _ir_START(_ir_CTX) #define ir_ENTRY(_src, _num) _ir_ENTRY(_ir_CTX, (_src), (_num)) @@ -607,6 +611,7 @@ #define ir_CASE_RANGE(_switch, _v1, _v2) _ir_CASE_RANGE(_ir_CTX, (_switch), (_v1), (_v2)) #define ir_CASE_DEFAULT(_switch) _ir_CASE_DEFAULT(_ir_CTX, (_switch)) #define ir_RETURN(_val) _ir_RETURN(_ir_CTX, (_val)) +#define ir_IGOTO(_addr) _ir_IGOTO(_ir_CTX, (_addr)) #define ir_IJMP(_addr) _ir_IJMP(_ir_CTX, (_addr)) #define ir_UNREACHABLE() _ir_UNREACHABLE(_ir_CTX) @@ -649,20 +654,24 @@ void _ir_TAILCALL_4(ir_ctx *ctx, ir_type type, ir_ref func, ir_ref arg1, ir_ref arg2, ir_ref arg3, ir_ref arg4); void _ir_TAILCALL_5(ir_ctx *ctx, ir_type type, ir_ref func, ir_ref arg1, ir_ref arg2, ir_ref arg3, ir_ref arg4, ir_ref arg5); void _ir_TAILCALL_6(ir_ctx *ctx, ir_type type, ir_ref func, ir_ref arg1, ir_ref arg2, ir_ref arg3, ir_ref arg4, ir_ref arg5, ir_ref arg6); -ir_ref _ir_TAILCALL_N(ir_ctx *ctx, ir_type type, ir_ref func, uint32_t count, ir_ref *args); +void _ir_TAILCALL_N(ir_ctx *ctx, ir_type type, ir_ref func, uint32_t count, ir_ref *args); ir_ref _ir_ALLOCA(ir_ctx *ctx, ir_ref size); void _ir_AFREE(ir_ctx *ctx, ir_ref size); ir_ref _ir_VLOAD(ir_ctx *ctx, ir_type type, ir_ref var); void _ir_VSTORE(ir_ctx *ctx, ir_ref var, ir_ref val); +ir_ref _ir_VLOAD_v(ir_ctx *ctx, ir_type type, ir_ref var); +void _ir_VSTORE_v(ir_ctx *ctx, ir_ref var, ir_ref val); ir_ref _ir_RLOAD(ir_ctx *ctx, ir_type type, ir_ref reg); void _ir_RSTORE(ir_ctx *ctx, ir_ref reg, ir_ref val); ir_ref _ir_LOAD(ir_ctx *ctx, ir_type type, ir_ref addr); void _ir_STORE(ir_ctx *ctx, ir_ref addr, ir_ref val); +ir_ref _ir_LOAD_v(ir_ctx *ctx, ir_type type, ir_ref addr); +void _ir_STORE_v(ir_ctx *ctx, ir_ref addr, ir_ref val); void _ir_VA_START(ir_ctx *ctx, ir_ref list); void _ir_VA_END(ir_ctx *ctx, ir_ref list); void _ir_VA_COPY(ir_ctx *ctx, ir_ref dst, ir_ref src); ir_ref _ir_VA_ARG(ir_ctx *ctx, ir_type type, ir_ref list); -ir_ref _ir_VA_ARG_EX(ir_ctx *ctx, ir_type type, ir_ref list, size_t size); +ir_ref _ir_VA_ARG_EX(ir_ctx *ctx, ir_type type, ir_ref list, size_t size, size_t align); void _ir_START(ir_ctx *ctx); void _ir_ENTRY(ir_ctx *ctx, ir_ref src, ir_ref num); void _ir_BEGIN(ir_ctx *ctx, ir_ref src); @@ -688,6 +697,7 @@ void _ir_CASE_RANGE(ir_ctx *ctx, ir_ref switch_ref, ir_ref v1, ir_ref v2); void _ir_CASE_DEFAULT(ir_ctx *ctx, ir_ref switch_ref); void _ir_RETURN(ir_ctx *ctx, ir_ref val); +ir_ref _ir_IGOTO(ir_ctx *ctx, ir_ref addr); void _ir_IJMP(ir_ctx *ctx, ir_ref addr); void _ir_GUARD(ir_ctx *ctx, ir_ref condition, ir_ref addr); void _ir_GUARD_NOT(ir_ctx *ctx, ir_ref condition, ir_ref addr); diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_cfg.c php8.4-8.4.21/ext/opcache/jit/ir/ir_cfg.c --- php8.4-8.4.16/ext/opcache/jit/ir/ir_cfg.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_cfg.c 2026-05-05 16:34:12.000000000 +0000 @@ -5,6 +5,10 @@ * Authors: Dmitry Stogov */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + #include "ir.h" #include "ir_private.h" @@ -77,12 +81,86 @@ } } +static void ir_remove_phis_inputs(ir_ctx *ctx, ir_use_list *use_list, int new_inputs_count, ir_bitset life_inputs) +{ + ir_ref i, j, n, k, *p, *q, use; + ir_insn *use_insn; + + if (new_inputs_count == 1) { + for (k = use_list->count, p = q = &ctx->use_edges[use_list->refs]; k > 0; p++, k--) { + use = *p; + use_insn = &ctx->ir_base[use]; + if (use_insn->op == IR_PHI) { + /* Convert PHI to COPY */ + n = use_insn->inputs_count; + i = 2; + for (j = 2; j <= n; j++) { + ir_ref input = ir_insn_op(use_insn, j); + + if (ir_bitset_in(life_inputs, j - 1)) { + use_insn->op1 = ir_insn_op(use_insn, j); + } else if (input > 0) { + ir_use_list_remove_one(ctx, input, use); + } + } + use_insn->op = IR_COPY; + use_insn->inputs_count = 1; + for (j = 2; j <= n; j++) { + ir_insn_set_op(use_insn, j, IR_UNUSED); + } + continue; + } + + /*compact use list */ + if (p != q){ + *q = use; + } + q++; + } + + if (p != q) { + use_list->count -= (p - q); + do { + *q = IR_UNUSED; /* clenu-op the removed tail */ + q++; + } while (p != q); + } + } else { + for (k = use_list->count, p = &ctx->use_edges[use_list->refs]; k > 0; p++, k--) { + use = *p; + use_insn = &ctx->ir_base[use]; + if (use_insn->op == IR_PHI) { + n = use_insn->inputs_count; + i = 2; + for (j = 2; j <= n; j++) { + ir_ref input = ir_insn_op(use_insn, j); + + if (ir_bitset_in(life_inputs, j - 1)) { + IR_ASSERT(input); + if (i != j) { + ir_insn_set_op(use_insn, i, input); + } + i++; + } else if (input > 0) { + ir_use_list_remove_one(ctx, input, use); + } + } + use_insn->inputs_count = i - 1; + for (j = i; j <= n; j++) { + ir_insn_set_op(use_insn, j, IR_UNUSED); + } + } + } + } +} + static uint32_t IR_NEVER_INLINE ir_cfg_remove_dead_inputs(ir_ctx *ctx, uint32_t *_blocks, ir_block *blocks, uint32_t bb_count) { uint32_t b, count = 0; ir_block *bb = blocks + 1; ir_insn *insn; ir_ref i, j, n, *ops, input; + ir_bitset life_inputs = NULL; for (b = 1; b <= bb_count; b++, bb++) { bb->successors = count; @@ -96,12 +174,27 @@ for (i = 1, j = 1; i <= n; i++) { input = ops[i]; if (_blocks[input]) { + if (life_inputs) { + ir_bitset_incl(life_inputs, i); + } if (i != j) { ops[j] = ops[i]; } j++; - } else if (input > 0) { - ir_use_list_remove_one(ctx, input, bb->start); + } else { + if (ctx->use_lists[bb->start].count > 1) { + /* Some inputs of this MERGE are deleted and we have to update the depended PHIs */ + if (!life_inputs) { + int k; + life_inputs = ir_bitset_malloc(n + 1); + for (k = 1; k < i; k++) { + ir_bitset_incl(life_inputs, k); + } + } + } + IR_ASSERT(input > 0); + IR_ASSERT(ctx->use_lists[input].count == 1 && ctx->use_edges[ctx->use_lists[input].refs] == bb->start); + CLEAR_USES(input); } } j--; @@ -115,6 +208,11 @@ for (;j <= n; j++) { ops[j] = IR_UNUSED; } + if (life_inputs) { + ir_remove_phis_inputs(ctx, &ctx->use_lists[bb->start], insn->inputs_count, life_inputs); + ir_mem_free(life_inputs); + life_inputs = NULL; + } } } count += bb->predecessors_count; @@ -375,8 +473,7 @@ static void ir_remove_merge_input(ir_ctx *ctx, ir_ref merge, ir_ref from) { - ir_ref i, j, n, k, *p, *q, use; - ir_insn *use_insn; + ir_ref i, j, n; ir_use_list *use_list; ir_bitset life_inputs; ir_insn *insn = &ctx->ir_base[merge]; @@ -402,82 +499,17 @@ } if (i == 1) { insn->op = IR_BEGIN; - insn->inputs_count = 1; - use_list = &ctx->use_lists[merge]; - if (use_list->count > 1) { - n++; - for (k = use_list->count, p = q = &ctx->use_edges[use_list->refs]; k > 0; p++, k--) { - use = *p; - use_insn = &ctx->ir_base[use]; - if (use_insn->op == IR_PHI) { - /* Convert PHI to COPY */ - i = 2; - for (j = 2; j <= n; j++) { - ir_ref input = ir_insn_op(use_insn, j); - - if (ir_bitset_in(life_inputs, j - 1)) { - use_insn->op1 = ir_insn_op(use_insn, j); - } else if (input > 0) { - ir_use_list_remove_one(ctx, input, use); - } - } - use_insn->op = IR_COPY; - use_insn->inputs_count = 1; - for (j = 2; j <= n; j++) { - ir_insn_set_op(use_insn, j, IR_UNUSED); - } - continue; - } - - /*compact use list */ - if (p != q){ - *q = use; - } - q++; - } - - if (p != q) { - use_list->count -= (p - q); - do { - *q = IR_UNUSED; /* clenu-op the removed tail */ - q++; - } while (p != q); - } - } - } else { - insn->inputs_count = i; + } + insn->inputs_count = i; - use_list = &ctx->use_lists[merge]; - if (use_list->count > 1) { - n++; - for (k = use_list->count, p = &ctx->use_edges[use_list->refs]; k > 0; p++, k--) { - use = *p; - use_insn = &ctx->ir_base[use]; - if (use_insn->op == IR_PHI) { - i = 2; - for (j = 2; j <= n; j++) { - ir_ref input = ir_insn_op(use_insn, j); - - if (ir_bitset_in(life_inputs, j - 1)) { - IR_ASSERT(input); - if (i != j) { - ir_insn_set_op(use_insn, i, input); - } - i++; - } else if (input > 0) { - ir_use_list_remove_one(ctx, input, use); - } - } - use_insn->inputs_count = i - 1; - for (j = i; j <= n; j++) { - ir_insn_set_op(use_insn, j, IR_UNUSED); - } - } - } - } + use_list = &ctx->use_lists[merge]; + if (use_list->count > 1) { + ir_remove_phis_inputs(ctx, use_list, i, life_inputs); } + ir_mem_free(life_inputs); - ir_use_list_remove_all(ctx, from, merge); + IR_ASSERT(ctx->use_lists[from].count == 1 && ctx->use_edges[ctx->use_lists[from].refs] == merge); + CLEAR_USES(from); } /* CFG constructed after SCCP pass doesn't have unreachable BBs, otherwise they should be removed */ @@ -582,59 +614,64 @@ return 1; } -static void compute_postnum(const ir_ctx *ctx, uint32_t *cur, uint32_t b) -{ - uint32_t i, *p; - ir_block *bb = &ctx->cfg_blocks[b]; - - if (bb->postnum != 0) { - return; - } - - if (bb->successors_count) { - bb->postnum = -1; /* Marker for "currently visiting" */ - p = ctx->cfg_edges + bb->successors; - i = bb->successors_count; - do { - compute_postnum(ctx, cur, *p); - p++; - } while (--i); - } - bb->postnum = (*cur)++; -} - /* Computes dominator tree using algorithm from "A Simple, Fast Dominance Algorithm" by * Cooper, Harvey and Kennedy. */ static IR_NEVER_INLINE int ir_build_dominators_tree_slow(ir_ctx *ctx) { - uint32_t blocks_count, b, postnum; + uint32_t blocks_count, b, postnum, i; ir_block *blocks, *bb; uint32_t *edges; + uint32_t *rpo = ir_mem_malloc((ctx->cfg_blocks_count + 1) * sizeof(uint32_t)); bool changed; blocks = ctx->cfg_blocks; edges = ctx->cfg_edges; blocks_count = ctx->cfg_blocks_count; - /* Clear the dominators tree */ - for (b = 0, bb = &blocks[0]; b <= blocks_count; b++, bb++) { - bb->idom = 0; - bb->dom_depth = 0; - bb->dom_child = 0; - bb->dom_next_child = 0; - } - ctx->flags2 &= ~IR_NO_LOOPS; postnum = 1; - compute_postnum(ctx, &postnum, 1); + ir_worklist work; + ir_worklist_init(&work, ctx->cfg_blocks_count + 1); + ir_worklist_push(&work, 1); + IR_ASSERT(blocks[1].next_succ == 0); + while (ir_worklist_len(&work)) { +next: + b = ir_worklist_peek(&work); + bb = &blocks[b]; + uint32_t n = bb->successors_count - bb->next_succ; + if (n) { + uint32_t *p = edges + bb->successors + bb->next_succ; + for (; n > 0; p++, n--) { + uint32_t succ = *p; + if (ir_worklist_push(&work, succ)) { + bb->next_succ = bb->successors_count - n + 1; + IR_ASSERT(blocks[succ].next_succ == 0); + goto next; + } + } + } + + /* Start from bb->idom calculated by the fast dominators algorithm */ + // bb->idom = 0; + bb->next_succ = 0; + rpo[postnum] = b; + bb->postnum = postnum++; + ir_worklist_pop(&work); + } + ir_worklist_free(&work); + + IR_ASSERT(rpo[blocks_count] == 1); /* Find immediate dominators by iterative fixed-point algorithm */ blocks[1].idom = 1; do { changed = 0; + /* Iterating in Reverse Post Order */ - for (b = 2, bb = &blocks[2]; b <= blocks_count; b++, bb++) { + for (i = blocks_count - 1; i > 0; i--) { + b = rpo[i]; + bb = &blocks[b]; IR_ASSERT(!(bb->flags & IR_BB_UNREACHABLE)); IR_ASSERT(bb->predecessors_count > 0); if (bb->predecessors_count == 1) { @@ -687,6 +724,8 @@ } } while (changed); + ir_mem_free(rpo); + /* Build dominators tree */ blocks[1].idom = 0; blocks[1].dom_depth = 0; @@ -740,7 +779,7 @@ blocks[1].idom = 1; blocks[1].dom_depth = 0; - /* Iterating in Reverse Post Order */ + /* Iterating in Reverse Post Order (relay on existing BB order and fall-back to slow algorithm) */ for (b = 2, bb = &blocks[2]; b <= blocks_count; b++, bb++) { IR_ASSERT(!(bb->flags & IR_BB_UNREACHABLE)); IR_ASSERT(bb->predecessors_count > 0); @@ -752,8 +791,8 @@ if (UNEXPECTED(idom >= b)) { /* In rare cases, LOOP_BEGIN.op1 may be a back-edge. Skip back-edges. */ ctx->flags2 &= ~IR_NO_LOOPS; -// IR_ASSERT(k > 1 && "Wrong blocks order: BB is before its single predecessor"); if (UNEXPECTED(k <= 1)) { + // IR_ASSERT(k > 1 && "Wrong blocks order: BB is before its single predecessor"); slow_case: ir_list_free(&worklist); return ir_build_dominators_tree_slow(ctx); @@ -767,6 +806,7 @@ break; } if (UNEXPECTED(k == 0)) { + // IR_ASSERT(0 && "Wrong blocks order: BB is before all its predecessors"); goto slow_case; } ir_list_push(&worklist, idom); @@ -799,13 +839,6 @@ bb->dom_depth = idom_bb->dom_depth + 1; } - /* Construct children lists sorted by block number */ - for (b = blocks_count, bb = &blocks[b]; b >= 2; b--, bb--) { - ir_block *idom_bb = &blocks[bb->idom]; - bb->dom_next_child = idom_bb->dom_child; - idom_bb->dom_child = b; - } - blocks[1].idom = 0; if (ir_list_len(&worklist) != 0) { @@ -820,11 +853,14 @@ succ_b = ctx->cfg_edges[bb->successors]; if (bb->successors_count != 1) { /* LOOP_END/END may be linked with the following ENTRY by a fake edge */ - IR_ASSERT(bb->successors_count == 2); - if (blocks[succ_b].flags & IR_BB_ENTRY) { + if (bb->successors_count != 2) { + complete = 0; + break; + } else if (blocks[succ_b].flags & IR_BB_ENTRY) { succ_b = ctx->cfg_edges[bb->successors + 1]; - } else { - IR_ASSERT(blocks[ctx->cfg_edges[bb->successors + 1]].flags & IR_BB_ENTRY); + } else if (!(blocks[ctx->cfg_edges[bb->successors + 1]].flags & IR_BB_ENTRY)) { + complete = 0; + break; } } dom_depth = blocks[succ_b].dom_depth;; @@ -840,10 +876,18 @@ if (UNEXPECTED(!complete)) { ir_list_free(&worklist); + // TODO: this algorithm may be incorrect. Prove and/or switch to ir_build_dominators_tree_slow() ??? return ir_build_dominators_tree_iterative(ctx); } } + /* Construct children lists sorted by block number */ + for (b = blocks_count, bb = &blocks[b]; b >= 2; b--, bb--) { + ir_block *idom_bb = &blocks[bb->idom]; + bb->dom_next_child = idom_bb->dom_child; + idom_bb->dom_child = b; + } + ir_list_free(&worklist); return 1; @@ -864,8 +908,6 @@ /* Clear the dominators tree, but keep already found dominators */ for (b = 0, bb = &blocks[0]; b <= blocks_count; b++, bb++) { bb->dom_depth = 0; - bb->dom_child = 0; - bb->dom_next_child = 0; } /* Find immediate dominators by iterative fixed-point algorithm */ @@ -883,20 +925,20 @@ if (blocks[idom].idom == 0) { while (1) { k--; + if (UNEXPECTED(k == 0)) break; p++; idom = *p; if (blocks[idom].idom > 0) { break; } - IR_ASSERT(k > 0); } + if (UNEXPECTED(k == 0)) continue; } IR_ASSERT(k != 0); while (--k > 0) { uint32_t pred_b = *(++p); if (blocks[pred_b].idom > 0) { - IR_ASSERT(blocks[pred_b].idom > 0); while (idom != pred_b) { while (pred_b > idom) { pred_b = blocks[pred_b].idom; @@ -946,10 +988,107 @@ return b1 == b2; } +/* Identify loops. See Sreedhar et al, "Identifying Loops Using DJ Graphs" and + * G. Ramalingam "Identifying Loops In Almost Linear Time". */ + +#define ENTRY_TIME(b) times[(b) * 2] +#define EXIT_TIME(b) times[(b) * 2 + 1] + +static IR_NEVER_INLINE void ir_collect_irreducible_loops(ir_ctx *ctx, uint32_t *times, ir_worklist *work, ir_list *list) +{ + ir_block *blocks = ctx->cfg_blocks; + uint32_t *edges = ctx->cfg_edges; + + IR_ASSERT(ir_list_len(list) != 0); + if (ir_list_len(list) > 1) { + /* Sort list to process irreducible loops in DFS order (insertion sort) */ + ir_ref *a = list->a.refs; + uint32_t n = ir_list_len(list); + uint32_t i = 1; + while (i < n) { + uint32_t j = i; + while (j > 0 && ENTRY_TIME(a[j-1]) > ENTRY_TIME(a[j])) { + ir_ref tmp = a[j]; + a[j] = a[j-1]; + a[j-1] = tmp; + j--; + } + i++; + } + } + while (ir_list_len(list)) { + uint32_t hdr = ir_list_pop(list); + ir_block *bb = &blocks[hdr]; + + IR_ASSERT(bb->flags & IR_BB_IRREDUCIBLE_LOOP); + IR_ASSERT(!bb->loop_depth); + if (!bb->loop_depth) { + /* process irreducible loop */ + + bb->flags |= IR_BB_LOOP_HEADER; + bb->loop_depth = 1; + if (ctx->ir_base[bb->start].op == IR_MERGE) { + ctx->ir_base[bb->start].op = IR_LOOP_BEGIN; + } + + /* find the closing edge(s) of the irreucible loop */ + IR_ASSERT(bb->predecessors_count > 1); + IR_ASSERT(ir_worklist_len(work) == 0); + ir_bitset_clear(work->visited, ir_bitset_len(ir_worklist_capasity(work))); + ir_bitset_incl(work->visited, hdr); + + uint32_t *p = &edges[bb->predecessors]; + uint32_t n = bb->predecessors_count; + do { + uint32_t pred = *p; + if (ENTRY_TIME(pred) > ENTRY_TIME(hdr) && EXIT_TIME(pred) < EXIT_TIME(hdr)) { + ir_worklist_push(work, pred); + } + p++; + } while (--n); + + /* collect members of the irreducible loop */ + while (ir_worklist_len(work)) { + uint32_t b = ir_worklist_pop(work); + + bb = &blocks[b]; + if (!bb->loop_header) { + bb->loop_header = hdr; + } + + uint32_t *p = &edges[bb->predecessors]; + uint32_t n = bb->predecessors_count; + + for (; n > 0; p++, n--) { + uint32_t pred = *p; + if (!ir_bitset_in(work->visited, pred)) { + if (blocks[pred].loop_header) { + if (blocks[pred].loop_header == b) continue; + do { + pred = blocks[pred].loop_header; + } while (blocks[pred].loop_header > 0); + } + if (ENTRY_TIME(pred) > ENTRY_TIME(hdr) && EXIT_TIME(pred) < EXIT_TIME(hdr)) { + /* "pred" is a descendant of "hdr" */ + ir_worklist_push(work, pred); + } else if (bb->predecessors_count > 1) { + /* another entry to the irreducible loop */ + bb->flags |= IR_BB_IRREDUCIBLE_LOOP; + if (ctx->ir_base[bb->start].op == IR_MERGE) { + ctx->ir_base[bb->start].op = IR_LOOP_BEGIN; + } + } + } + } + } + } + } +} + int ir_find_loops(ir_ctx *ctx) { - uint32_t b, j, n, count; - uint32_t *entry_times, *exit_times, *sorted_blocks, time = 1; + uint32_t b, j, n; + uint32_t *times, *sorted_blocks, time = 1; ir_block *blocks = ctx->cfg_blocks; uint32_t *edges = ctx->cfg_edges; ir_worklist work; @@ -958,52 +1097,44 @@ return 1; } - /* We don't materialize the DJ spanning tree explicitly, as we are only interested in ancestor - * queries. These are implemented by checking entry/exit times of the DFS search. */ + /* Compute entry/exit times for the CFG DFS spanning tree to perform ancestor and back-edge queries. */ ir_worklist_init(&work, ctx->cfg_blocks_count + 1); - entry_times = ir_mem_malloc((ctx->cfg_blocks_count + 1) * 3 * sizeof(uint32_t)); - exit_times = entry_times + ctx->cfg_blocks_count + 1; - sorted_blocks = exit_times + ctx->cfg_blocks_count + 1; - - memset(entry_times, 0, (ctx->cfg_blocks_count + 1) * sizeof(uint32_t)); + times = ir_mem_malloc((ctx->cfg_blocks_count + 1) * 3 * sizeof(uint32_t)); + sorted_blocks = times + (ctx->cfg_blocks_count + 1) * 2; + ir_bitset visited = ir_bitset_malloc(ctx->cfg_blocks_count + 1); ir_worklist_push(&work, 1); while (ir_worklist_len(&work)) { - ir_block *bb; - int child; - next: b = ir_worklist_peek(&work); - if (!entry_times[b]) { - entry_times[b] = time++; - } + ir_block *bb = &blocks[b]; - /* Visit blocks immediately dominated by "b". */ - bb = &blocks[b]; - for (child = bb->dom_child; child > 0; child = blocks[child].dom_next_child) { - if (ir_worklist_push(&work, child)) { - goto next; - } + if (!ir_bitset_in(visited, b)) { + ir_bitset_incl(visited, b); + ENTRY_TIME(b) = time++; } - /* Visit join edges. */ - if (bb->successors_count) { - uint32_t *p = edges + bb->successors; - for (j = 0; j < bb->successors_count; j++, p++) { + uint32_t n = bb->successors_count - bb->next_succ; + if (n) { + uint32_t *p = edges + bb->successors + bb->next_succ; + for (; n > 0; p++, n--) { uint32_t succ = *p; - - if (blocks[succ].idom == b) { - continue; - } else if (ir_worklist_push(&work, succ)) { + if (ir_worklist_push(&work, succ)) { + bb->next_succ = bb->successors_count - n + 1; + IR_ASSERT(blocks[succ].next_succ == 0); goto next; } } } - exit_times[b] = time++; + + bb->next_succ = 0; + EXIT_TIME(b) = time++; ir_worklist_pop(&work); } + ir_mem_free(visited); /* Sort blocks by level, which is the opposite order in which we want to process them */ + /* (Breadth First Search using "sorted_blocks" as a queue) */ sorted_blocks[1] = 1; j = 1; n = 2; @@ -1017,127 +1148,62 @@ } } } - count = n; + IR_ASSERT(n == ctx->cfg_blocks_count + 1); - /* Identify loops. See Sreedhar et al, "Identifying Loops Using DJ Graphs". */ +#if IR_DEBUG uint32_t prev_dom_depth = blocks[sorted_blocks[n - 1]].dom_depth; - uint32_t prev_irreducible = 0; +#endif + uint32_t irreducible_depth = 0; + ir_list irreducible_list = {0}; + while (n > 1) { b = sorted_blocks[--n]; ir_block *bb = &blocks[b]; IR_ASSERT(bb->dom_depth <= prev_dom_depth); - if (UNEXPECTED(prev_irreducible) && bb->dom_depth != prev_dom_depth) { - /* process delyed irreducible loops */ - do { - b = sorted_blocks[prev_irreducible]; - bb = &blocks[b]; - if ((bb->flags & IR_BB_IRREDUCIBLE_LOOP) && !bb->loop_depth) { - /* process irreducible loop */ - uint32_t hdr = b; - - bb->loop_depth = 1; - if (ctx->ir_base[bb->start].op == IR_MERGE) { - ctx->ir_base[bb->start].op = IR_LOOP_BEGIN; - } - /* find the closing edge(s) of the irreucible loop */ - IR_ASSERT(bb->predecessors_count > 1); - uint32_t *p = &edges[bb->predecessors]; - j = bb->predecessors_count; - do { - uint32_t pred = *p; - - if (entry_times[pred] > entry_times[b] && exit_times[pred] < exit_times[b]) { - if (!ir_worklist_len(&work)) { - ir_bitset_clear(work.visited, ir_bitset_len(ir_worklist_capasity(&work))); - } - blocks[pred].loop_header = 0; /* support for merged loops */ - ir_worklist_push(&work, pred); - } - p++; - } while (--j); - if (ir_worklist_len(&work) == 0) continue; - - /* collect members of the irreducible loop */ - while (ir_worklist_len(&work)) { - b = ir_worklist_pop(&work); - if (b != hdr) { - ir_block *bb = &blocks[b]; - bb->loop_header = hdr; - if (bb->predecessors_count) { - uint32_t *p = &edges[bb->predecessors]; - uint32_t n = bb->predecessors_count; - do { - uint32_t pred = *p; - while (blocks[pred].loop_header > 0) { - pred = blocks[pred].loop_header; - } - if (pred != hdr) { - if (entry_times[pred] > entry_times[hdr] && exit_times[pred] < exit_times[hdr]) { - /* "pred" is a descendant of "hdr" */ - ir_worklist_push(&work, pred); - } else { - /* another entry to the irreducible loop */ - bb->flags |= IR_BB_IRREDUCIBLE_LOOP; - if (ctx->ir_base[bb->start].op == IR_MERGE) { - ctx->ir_base[bb->start].op = IR_LOOP_BEGIN; - } - } - } - p++; - } while (--n); - } - } - } - } - } while (--prev_irreducible != n); - prev_irreducible = 0; - b = sorted_blocks[n]; - bb = &blocks[b]; + if (UNEXPECTED(bb->dom_depth < irreducible_depth)) { + ir_collect_irreducible_loops(ctx, times, &work, &irreducible_list); + irreducible_depth = 0; } if (bb->predecessors_count > 1) { bool irreducible = 0; + uint32_t b_entry_time = ENTRY_TIME(b); + uint32_t b_exit_time = EXIT_TIME(b); uint32_t *p = &edges[bb->predecessors]; - j = bb->predecessors_count; - do { + for (j = bb->predecessors_count; j > 0; p++, j--) { uint32_t pred = *p; - /* A join edge is one for which the predecessor does not - immediately dominate the successor. */ - if (bb->idom != pred) { - /* In a loop back-edge (back-join edge), the successor dominates - the predecessor. */ + /* Check back-edges */ + if (ENTRY_TIME(pred) >= b_entry_time && EXIT_TIME(pred) <= b_exit_time) { if (ir_dominates(blocks, b, pred)) { + /* In a loop back-edge (back-join edge), the successor dominates + the predecessor. */ if (!ir_worklist_len(&work)) { ir_bitset_clear(work.visited, ir_bitset_len(ir_worklist_capasity(&work))); } - blocks[pred].loop_header = 0; /* support for merged loops */ ir_worklist_push(&work, pred); } else { - /* Otherwise it's a cross-join edge. See if it's a branch - to an ancestor on the DJ spanning tree. */ - if (entry_times[pred] > entry_times[b] && exit_times[pred] < exit_times[b]) { - irreducible = 1; - break; - } + /* Otherwise it's a back-edge of irreducible loop. */ + irreducible = 1; + break; } } - p++; - } while (--j); + } if (UNEXPECTED(irreducible)) { - bb->flags |= IR_BB_LOOP_HEADER | IR_BB_IRREDUCIBLE_LOOP; + bb->flags |= IR_BB_IRREDUCIBLE_LOOP; ctx->flags2 |= IR_CFG_HAS_LOOPS | IR_IRREDUCIBLE_CFG; - /* Remember the position of the first irreducible loop to process all the irreducible loops - * after the reducible loops with the same dominator tree depth + /* Delay processing of all irreducible loops + * after all reducible loops with the same dominator tree depth */ - if (!prev_irreducible) { - prev_irreducible = n; - prev_dom_depth = bb->dom_depth; + irreducible_depth = bb->dom_depth; + if (!ir_list_capasity(&irreducible_list)) { + ir_list_init(&irreducible_list, 16); } + ir_list_push(&irreducible_list, b); ir_list_clear(&work.l); } else if (ir_worklist_len(&work)) { /* collect members of the reducible loop */ @@ -1149,35 +1215,48 @@ if (ctx->ir_base[bb->start].op == IR_MERGE) { ctx->ir_base[bb->start].op = IR_LOOP_BEGIN; } + ir_bitset_incl(work.visited, hdr); while (ir_worklist_len(&work)) { b = ir_worklist_pop(&work); if (b != hdr) { ir_block *bb = &blocks[b]; - bb->loop_header = hdr; - if (bb->predecessors_count) { - uint32_t *p = &edges[bb->predecessors]; - uint32_t n = bb->predecessors_count; - do { - uint32_t pred = *p; - while (blocks[pred].loop_header > 0) { - pred = blocks[pred].loop_header; - } - if (pred != hdr) { + + if (!bb->loop_header) { + bb->loop_header = hdr; + } + + uint32_t *p = &edges[bb->predecessors]; + uint32_t n = bb->predecessors_count; + for (; n > 0; p++, n--) { + uint32_t pred = *p; + if (!ir_bitset_in(work.visited, pred)) { + if (blocks[pred].loop_header) { + if (blocks[pred].loop_header == b) continue; + do { + pred = blocks[pred].loop_header; + } while (blocks[pred].loop_header > 0); ir_worklist_push(&work, pred); + } else { + ir_bitset_incl(work.visited, pred); + ir_list_push_unchecked(&work.l, pred); } - p++; - } while (--n); + } } } } } } } - IR_ASSERT(!prev_irreducible); + + IR_ASSERT(!irreducible_depth); + if (ir_list_capasity(&irreducible_list)) { + ir_list_free(&irreducible_list); + } if (ctx->flags2 & IR_CFG_HAS_LOOPS) { - for (n = 1; n < count; n++) { - b = sorted_blocks[n]; + n = ctx->cfg_blocks_count + 1; + for (j = 1; j < n; j++) { + b = sorted_blocks[j]; ir_block *bb = &blocks[b]; if (bb->loop_header > 0) { ir_block *loop = &blocks[bb->loop_header]; @@ -1208,7 +1287,7 @@ } } - ir_mem_free(entry_times); + ir_mem_free(times); ir_worklist_free(&work); return 1; @@ -1408,6 +1487,19 @@ } } } + +static bool ir_is_merged_loop_back_edge(ir_ctx *ctx, uint32_t hdr, uint32_t b) +{ + if (ctx->cfg_blocks[hdr].flags & IR_BB_LOOP_HEADER) { + uint32_t loop_depth = ctx->cfg_blocks[hdr].loop_depth; + + while (ctx->cfg_blocks[b].loop_depth > loop_depth) { + b = ctx->cfg_blocks[b].loop_header; + } + return b == hdr; + } + return 0; +} #endif static int ir_schedule_blocks_bottom_up(ir_ctx *ctx) @@ -1464,7 +1556,8 @@ } } else if (b != predecessor && ctx->cfg_blocks[predecessor].loop_header != b) { /* not a loop back-edge */ - IR_ASSERT(b == predecessor || ctx->cfg_blocks[predecessor].loop_header == b); + IR_ASSERT(b == predecessor || ctx->cfg_blocks[predecessor].loop_header == b || + ir_is_merged_loop_back_edge(ctx, b, predecessor)); } } } diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_check.c php8.4-8.4.21/ext/opcache/jit/ir/ir_check.c --- php8.4-8.4.16/ext/opcache/jit/ir/ir_check.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_check.c 2026-05-05 16:34:12.000000000 +0000 @@ -328,7 +328,9 @@ } break; case IR_LOAD: + case IR_LOAD_v: case IR_STORE: + case IR_STORE_v: type = ctx->ir_base[insn->op2].type; if (type != IR_ADDR && (!IR_IS_TYPE_INT(type) || ir_type_size[type] != ir_type_size[IR_ADDR])) { @@ -338,7 +340,9 @@ } break; case IR_VLOAD: + case IR_VLOAD_v: case IR_VSTORE: + case IR_VSTORE_v: if (ctx->ir_base[insn->op2].op != IR_VAR) { fprintf(stderr, "ir_base[%d].op2 must be 'VAR' (%s)\n", i, ir_op_name[ctx->ir_base[insn->op2].op]); @@ -408,6 +412,8 @@ ok = 0; } break; + case IR_IGOTO: + break; default: /* skip data references */ count = n = use_list->count; diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_dump.c php8.4-8.4.21/ext/opcache/jit/ir/ir_dump.c --- php8.4-8.4.16/ext/opcache/jit/ir/ir_dump.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_dump.c 2026-05-05 16:34:12.000000000 +0000 @@ -8,6 +8,14 @@ #include "ir.h" #include "ir_private.h" +#if defined(IR_TARGET_X86) || defined(IR_TARGET_X64) +# include "ir_x86.h" +#elif defined(IR_TARGET_AARCH64) +# include "ir_aarch64.h" +#else +# error "Unknown IR target" +#endif + void ir_dump(const ir_ctx *ctx, FILE *f) { ir_ref i, j, n, ref, *p; @@ -52,7 +60,7 @@ } } -void ir_dump_dot(const ir_ctx *ctx, const char *name, FILE *f) +void ir_dump_dot(const ir_ctx *ctx, const char *name, const char *comments, FILE *f) { int DATA_WEIGHT = 0; int CONTROL_WEIGHT = 5; @@ -62,6 +70,13 @@ uint32_t flags; fprintf(f, "digraph %s {\n", name); + fprintf(f, "\tlabelloc=t;\n"); + fprintf(f, "\tlabel=\""); + ir_print_func_proto(ctx, name, 0, f); + if (comments) { + fprintf(f, " # %s", comments); + } + fprintf(f, "\"\n"); fprintf(f, "\trankdir=TB;\n"); for (i = 1 - ctx->consts_count, insn = ctx->ir_base + i; i < IR_UNUSED; i++, insn++) { fprintf(f, "\tc%d [label=\"C%d: CONST %s(", -i, -i, ir_type_name[insn->type]); @@ -129,6 +144,11 @@ case IR_OPND_CONTROL_REF: fprintf(f, "\tn%d -> n%d [style=dashed,dir=back,weight=%d];\n", ref, i, REF_WEIGHT); break; + case IR_OPND_LABEL_REF: + if (ref) { + fprintf(f, "\tc%d -> n%d [color=blue,weight=%d];\n", -ref, i, REF_WEIGHT); + } + break; } } } @@ -451,8 +471,8 @@ } } #if 1 - n = ctx->vregs_count + ir_regs_number() + 2; - for (i = ctx->vregs_count + 1; i <= n; i++) { + n = ctx->vregs_count + 1 + IR_REG_SET_NUM; + for (i = ctx->vregs_count + 1; i < n; i++) { ir_live_interval *ival = ctx->live_intervals[i]; if (ival) { @@ -491,6 +511,8 @@ ir_print_proto(ctx, insn->proto, f); } else if (insn->op == IR_SYM) { fprintf(f, "sym(%s)", ir_get_str(ctx, insn->val.name)); + } else if (insn->op == IR_LABEL) { + fprintf(f, "label(%s)", ir_get_str(ctx, insn->val.name)); } else if (insn->op == IR_FUNC_ADDR) { fprintf(f, "func *"); ir_print_const(ctx, insn, f, true); @@ -648,6 +670,12 @@ fprintf(f, "%s%d", first ? "(" : ", ", ref); first = 0; break; + case IR_OPND_LABEL_REF: + if (ref) { + IR_ASSERT(IR_IS_CONST_REF(ref)); + fprintf(f, "%sc_%d", first ? "(" : ", ", -ref); + } + break; } } else if (opnd_kind == IR_OPND_NUM) { fprintf(f, "%s%d", first ? "(" : ", ", ref); diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_emit.c php8.4-8.4.21/ext/opcache/jit/ir/ir_emit.c --- php8.4-8.4.16/ext/opcache/jit/ir/ir_emit.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_emit.c 2026-05-05 16:34:12.000000000 +0000 @@ -5,6 +5,10 @@ * Authors: Dmitry Stogov */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + #include "ir.h" #if defined(IR_TARGET_X86) || defined(IR_TARGET_X64) @@ -63,18 +67,7 @@ int32_t to; /* [0..IR_REG_NUM) - CPU reg, [IR_REG_NUM...) - virtual reg */ } ir_dessa_copy; -#if IR_REG_INT_ARGS -static const int8_t _ir_int_reg_params[IR_REG_INT_ARGS]; -#else -static const int8_t *_ir_int_reg_params; -#endif -#if IR_REG_FP_ARGS -static const int8_t _ir_fp_reg_params[IR_REG_FP_ARGS]; -#else -static const int8_t *_ir_fp_reg_params; -#endif - -static const ir_proto_t *ir_call_proto(const ir_ctx *ctx, ir_insn *insn) +const ir_proto_t *ir_call_proto(const ir_ctx *ctx, const ir_insn *insn) { if (IR_IS_CONST_REF(insn->op2)) { const ir_insn *func = &ctx->ir_base[insn->op2]; @@ -90,49 +83,6 @@ return NULL; } -#ifdef IR_HAVE_FASTCALL -static const int8_t _ir_int_fc_reg_params[IR_REG_INT_FCARGS]; -static const int8_t *_ir_fp_fc_reg_params; - -bool ir_is_fastcall(const ir_ctx *ctx, const ir_insn *insn) -{ - if (sizeof(void*) == 4) { - if (IR_IS_CONST_REF(insn->op2)) { - const ir_insn *func = &ctx->ir_base[insn->op2]; - - if (func->op == IR_FUNC || func->op == IR_FUNC_ADDR) { - if (func->proto) { - const ir_proto_t *proto = (const ir_proto_t *)ir_get_str(ctx, func->proto); - - return (proto->flags & IR_FASTCALL_FUNC) != 0; - } - } - } else if (ctx->ir_base[insn->op2].op == IR_PROTO) { - const ir_proto_t *proto = (const ir_proto_t *)ir_get_str(ctx, ctx->ir_base[insn->op2].op2); - - return (proto->flags & IR_FASTCALL_FUNC) != 0; - } - return 0; - } - return 0; -} -#else -bool ir_is_fastcall(const ir_ctx *ctx, const ir_insn *insn) -{ - return 0; -} -#endif - -bool ir_is_vararg(const ir_ctx *ctx, ir_insn *insn) -{ - const ir_proto_t *proto = ir_call_proto(ctx, insn); - - if (proto) { - return (proto->flags & IR_VARARG_FUNC) != 0; - } - return 0; -} - IR_ALWAYS_INLINE uint32_t ir_rule(const ir_ctx *ctx, ir_ref ref) { IR_ASSERT(!IR_IS_CONST_REF(ref)); @@ -153,19 +103,7 @@ ir_insn *insn; int int_param = 0; int fp_param = 0; - int int_reg_params_count = IR_REG_INT_ARGS; - int fp_reg_params_count = IR_REG_FP_ARGS; - const int8_t *int_reg_params = _ir_int_reg_params; - const int8_t *fp_reg_params = _ir_fp_reg_params; - -#ifdef IR_HAVE_FASTCALL - if (sizeof(void*) == 4 && (ctx->flags & IR_FASTCALL_FUNC)) { - int_reg_params_count = IR_REG_INT_FCARGS; - fp_reg_params_count = IR_REG_FP_FCARGS; - int_reg_params = _ir_int_fc_reg_params; - fp_reg_params = _ir_fp_fc_reg_params; - } -#endif + const ir_call_conv_dsc *cc = ir_get_call_conv_dsc(ctx->flags); for (i = use_list->count, p = &ctx->use_edges[use_list->refs]; i > 0; p++, i--) { use = *p; @@ -173,70 +111,48 @@ if (insn->op == IR_PARAM) { if (IR_IS_TYPE_INT(insn->type)) { if (use == ref) { -#if defined(IR_TARGET_X64) || defined(IR_TARGET_X86) - if (ctx->value_params && ctx->value_params[insn->op3 - 1].align) { + if (ctx->value_params && ctx->value_params[insn->op3 - 1].align && cc->pass_struct_by_val) { /* struct passed by value on stack */ return IR_REG_NONE; - } else -#endif - if (int_param < int_reg_params_count) { - return int_reg_params[int_param]; + } else if (int_param < cc->int_param_regs_count) { + return cc->int_param_regs[int_param]; } else { return IR_REG_NONE; } -#if defined(IR_TARGET_X64) || defined(IR_TARGET_X86) - } else { - if (ctx->value_params && ctx->value_params[insn->op3 - 1].align) { - /* struct passed by value on stack */ - continue; - } -#endif + } else if (ctx->value_params && ctx->value_params[insn->op3 - 1].align && cc->pass_struct_by_val) { + /* struct passed by value on stack */ + continue; } int_param++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - fp_param++; -#endif + if (cc->shadow_param_regs) { + fp_param++; + } } else { IR_ASSERT(IR_IS_TYPE_FP(insn->type)); if (use == ref) { - if (fp_param < fp_reg_params_count) { - return fp_reg_params[fp_param]; + if (fp_param < cc->fp_param_regs_count) { + return cc->fp_param_regs[fp_param]; } else { return IR_REG_NONE; } } fp_param++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - int_param++; -#endif + if (cc->shadow_param_regs) { + int_param++; + } } } } return IR_REG_NONE; } -static int ir_get_args_regs(const ir_ctx *ctx, const ir_insn *insn, int8_t *regs) +static int ir_get_args_regs(const ir_ctx *ctx, const ir_insn *insn, const ir_call_conv_dsc *cc, int8_t *regs) { int j, n; ir_type type; int int_param = 0; int fp_param = 0; int count = 0; - int int_reg_params_count = IR_REG_INT_ARGS; - int fp_reg_params_count = IR_REG_FP_ARGS; - const int8_t *int_reg_params = _ir_int_reg_params; - const int8_t *fp_reg_params = _ir_fp_reg_params; - -#ifdef IR_HAVE_FASTCALL - if (sizeof(void*) == 4 && ir_is_fastcall(ctx, insn)) { - int_reg_params_count = IR_REG_INT_FCARGS; - fp_reg_params_count = IR_REG_FP_FCARGS; - int_reg_params = _ir_int_fc_reg_params; - fp_reg_params = _ir_fp_fc_reg_params; - } -#endif n = insn->inputs_count; n = IR_MIN(n, IR_MAX_REG_ARGS + 2); @@ -244,32 +160,28 @@ ir_insn *arg = &ctx->ir_base[ir_insn_op(insn, j)]; type = arg->type; if (IR_IS_TYPE_INT(type)) { - if (arg->op == IR_ARGVAL) { - continue; - } else if (int_param < int_reg_params_count) { - regs[j] = int_reg_params[int_param]; + if (int_param < cc->int_param_regs_count && arg->op != IR_ARGVAL) { + regs[j] = cc->int_param_regs[int_param]; count = j + 1; + int_param++; + if (cc->shadow_param_regs) { + fp_param++; + } } else { regs[j] = IR_REG_NONE; } - int_param++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - fp_param++; -#endif } else { IR_ASSERT(IR_IS_TYPE_FP(type)); - if (fp_param < fp_reg_params_count) { - regs[j] = fp_reg_params[fp_param]; + if (fp_param < cc->fp_param_regs_count) { + regs[j] = cc->fp_param_regs[fp_param]; count = j + 1; + fp_param++; + if (cc->shadow_param_regs) { + int_param++; + } } else { regs[j] = IR_REG_NONE; } - fp_param++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - int_param++; -#endif } } return count; @@ -421,12 +333,11 @@ typedef struct _ir_common_backend_data { ir_reg_alloc_data ra_data; - uint32_t dessa_from_block; dasm_State *dasm_state; ir_bitset emit_constants; } ir_common_backend_data; -static int ir_const_label(ir_ctx *ctx, ir_ref ref) +static int ir_get_const_label(ir_ctx *ctx, ir_ref ref) { ir_common_backend_data *data = ctx->data; int label = ctx->cfg_blocks_count - ref; @@ -1015,11 +926,16 @@ entries_count++; } ctx->rules[start] = IR_SKIPPED | IR_NOP; + if (ctx->ir_base[start].op == IR_BEGIN && ctx->ir_base[start].op2) { + ctx->flags2 |= IR_HAS_BLOCK_ADDR; + } ref = bb->end; if (bb->successors_count == 1) { insn = &ctx->ir_base[ref]; if (insn->op == IR_END || insn->op == IR_LOOP_END) { - ctx->rules[ref] = insn->op; + if (!ctx->rules[ref]) { + ctx->rules[ref] = insn->op; + } ref = prev_ref[ref]; if (ref == start && ctx->cfg_edges[bb->successors] != b) { if (EXPECTED(!(bb->flags & IR_BB_ENTRY))) { @@ -1059,7 +975,7 @@ return 1; } -int32_t ir_get_spill_slot_offset(ir_ctx *ctx, ir_ref ref) +int32_t ir_get_spill_slot_offset(const ir_ctx *ctx, ir_ref ref) { int32_t offset; @@ -1068,3 +984,32 @@ IR_ASSERT(offset != -1); return IR_SPILL_POS_TO_OFFSET(offset); } + +const ir_call_conv_dsc *ir_get_call_conv_dsc(uint32_t flags) +{ +#ifdef IR_TARGET_X86 + if ((flags & IR_CALL_CONV_MASK) == IR_CC_FASTCALL) { + return &ir_call_conv_x86_fastcall; + } +#elif defined(IR_TARGET_X64) + switch (flags & IR_CALL_CONV_MASK) { + case IR_CC_DEFAULT: return &ir_call_conv_default; + case IR_CC_FASTCALL: return &ir_call_conv_default; + case IR_CC_PRESERVE_NONE: return &ir_call_conv_x86_64_preserve_none; + case IR_CC_X86_64_SYSV: return &ir_call_conv_x86_64_sysv; + case IR_CC_X86_64_MS: return &ir_call_conv_x86_64_ms; + default: break; + } +#elif defined(IR_TARGET_AARCH64) + switch (flags & IR_CALL_CONV_MASK) { + case IR_CC_DEFAULT: return &ir_call_conv_default; + case IR_CC_FASTCALL: return &ir_call_conv_default; + case IR_CC_PRESERVE_NONE: return &ir_call_conv_aarch64_preserve_none; + case IR_CC_AARCH64_SYSV: return &ir_call_conv_aarch64_sysv; + case IR_CC_AARCH64_DARWIN: return &ir_call_conv_aarch64_darwin; + default: break; + } +#endif + IR_ASSERT((flags & IR_CALL_CONV_MASK) == IR_CC_DEFAULT || (flags & IR_CALL_CONV_MASK) == IR_CC_BUILTIN); + return &ir_call_conv_default; +} diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_fold.h php8.4-8.4.21/ext/opcache/jit/ir/ir_fold.h --- php8.4-8.4.16/ext/opcache/jit/ir/ir_fold.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_fold.h 2026-05-05 16:34:12.000000000 +0000 @@ -755,8 +755,35 @@ } IR_FOLD(ABS(C_I8)) +{ + IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); + if (op1_insn->val.i64 >= 0) { + IR_FOLD_COPY(op1); + } else { + IR_FOLD_CONST_I(-op1_insn->val.i8); + } +} + IR_FOLD(ABS(C_I16)) +{ + IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); + if (op1_insn->val.i64 >= 0) { + IR_FOLD_COPY(op1); + } else { + IR_FOLD_CONST_I(-op1_insn->val.i16); + } +} + IR_FOLD(ABS(C_I32)) +{ + IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); + if (op1_insn->val.i64 >= 0) { + IR_FOLD_COPY(op1); + } else { + IR_FOLD_CONST_I((int32_t)-op1_insn->val.u32); + } +} + IR_FOLD(ABS(C_I64)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); @@ -847,7 +874,7 @@ uint64_t res; IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); res = op1_insn->val.u64 * op2_insn->val.u64; - if (op1_insn->val.u64 != 0 && res / op1_insn->val.u64 != op2_insn->val.u64 && res <= max) { + if ((op1_insn->val.u64 != 0 && res / op1_insn->val.u64 != op2_insn->val.u64) || res > max) { IR_FOLD_NEXT; } IR_FOLD_CONST_U(res); @@ -864,7 +891,7 @@ int64_t res; IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); res = op1_insn->val.u64 * op2_insn->val.u64; - if (op1_insn->val.i64 != 0 && res / op1_insn->val.i64 != op2_insn->val.i64 && res >= min && res <= max) { + if ((op1_insn->val.i64 != 0 && res / op1_insn->val.i64 != op2_insn->val.i64) || res < min || res > max) { IR_FOLD_NEXT; } IR_FOLD_CONST_U(res); @@ -1037,220 +1064,220 @@ IR_FOLD(SHL(C_CHAR, C_CHAR)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(op1_insn->val.u8 << op2_insn->val.u8); + IR_FOLD_CONST_U(op1_insn->val.u8 << (op2_insn->val.u8 & 0x7)); } IR_FOLD(SHL(C_I8, C_I8)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I((int8_t)(op1_insn->val.u8 << op2_insn->val.u8)); + IR_FOLD_CONST_I((int8_t)(op1_insn->val.u8 << (op2_insn->val.u8 & 0x7))); } IR_FOLD(SHL(C_U16, C_U16)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(op1_insn->val.u16 << op2_insn->val.u16); + IR_FOLD_CONST_U(op1_insn->val.u16 << (op2_insn->val.u16 & 0xf)); } IR_FOLD(SHL(C_I16, C_I16)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I((int16_t)(op1_insn->val.u16 << op2_insn->val.u16)); + IR_FOLD_CONST_I((int16_t)(op1_insn->val.u16 << (op2_insn->val.u16 & 0xf))); } IR_FOLD(SHL(C_U32, C_U32)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(op1_insn->val.u32 << op2_insn->val.u32); + IR_FOLD_CONST_U(op1_insn->val.u32 << (op2_insn->val.u32 & 0x1f)); } IR_FOLD(SHL(C_I32, C_I32)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I((int32_t)(op1_insn->val.u32 << op2_insn->val.u32)); + IR_FOLD_CONST_I((int32_t)(op1_insn->val.u32 << (op2_insn->val.u32 & 0x1f))); } IR_FOLD(SHL(C_U64, C_U64)) IR_FOLD(SHL(C_I64, C_I64)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(op1_insn->val.u64 << op2_insn->val.u64); + IR_FOLD_CONST_U(op1_insn->val.u64 << (op2_insn->val.u64 & 0x3f)); } IR_FOLD(SHR(C_U8, C_U8)) IR_FOLD(SHR(C_CHAR, C_CHAR)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(op1_insn->val.u8 >> op2_insn->val.u8); + IR_FOLD_CONST_U(op1_insn->val.u8 >> (op2_insn->val.u8 & 0x7)); } IR_FOLD(SHR(C_I8, C_I8)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I((int8_t)(op1_insn->val.u8 >> op2_insn->val.u8)); + IR_FOLD_CONST_I((int8_t)(op1_insn->val.u8 >> (op2_insn->val.u8 & 0x7))); } IR_FOLD(SHR(C_U16, C_U16)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(op1_insn->val.u16 >> op2_insn->val.u16); + IR_FOLD_CONST_U(op1_insn->val.u16 >> (op2_insn->val.u16 & 0xf)); } IR_FOLD(SHR(C_I16, C_I16)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I((int16_t)(op1_insn->val.u16 >> op2_insn->val.u16)); + IR_FOLD_CONST_I((int16_t)(op1_insn->val.u16 >> (op2_insn->val.u16 & 0xf))); } IR_FOLD(SHR(C_U32, C_U32)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(op1_insn->val.u32 >> op2_insn->val.u32); + IR_FOLD_CONST_U(op1_insn->val.u32 >> (op2_insn->val.u32 & 0x1f)); } IR_FOLD(SHR(C_I32, C_I32)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I((int32_t)(op1_insn->val.u32 >> op2_insn->val.u32)); + IR_FOLD_CONST_I((int32_t)(op1_insn->val.u32 >> (op2_insn->val.u32 & 0x1f))); } IR_FOLD(SHR(C_U64, C_U64)) IR_FOLD(SHR(C_I64, C_I64)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(op1_insn->val.u64 >> op2_insn->val.u64); + IR_FOLD_CONST_U(op1_insn->val.u64 >> (op2_insn->val.u64 & 0x3f)); } IR_FOLD(SAR(C_U8, C_U8)) IR_FOLD(SAR(C_CHAR, C_CHAR)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U((uint8_t)(op1_insn->val.i8 >> op2_insn->val.i8)); + IR_FOLD_CONST_U((uint8_t)(op1_insn->val.i8 >> (op2_insn->val.i8 & 0x7))); } IR_FOLD(SAR(C_I8, C_I8)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I(op1_insn->val.i8 >> op2_insn->val.i8); + IR_FOLD_CONST_I(op1_insn->val.i8 >> (op2_insn->val.i8 & 0x7)); } IR_FOLD(SAR(C_U16, C_U16)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U((uint16_t)(op1_insn->val.i16 >> op2_insn->val.i16)); + IR_FOLD_CONST_U((uint16_t)(op1_insn->val.i16 >> (op2_insn->val.i16 & 0xf))); } IR_FOLD(SAR(C_I16, C_I16)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I(op1_insn->val.i16 >> op2_insn->val.i16); + IR_FOLD_CONST_I(op1_insn->val.i16 >> (op2_insn->val.i16 & 0xf)); } IR_FOLD(SAR(C_U32, C_U32)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U((uint32_t)(op1_insn->val.i32 >> op2_insn->val.i32)); + IR_FOLD_CONST_U((uint32_t)(op1_insn->val.i32 >> (op2_insn->val.i32 & 0x1f))); } IR_FOLD(SAR(C_I32, C_I32)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I(op1_insn->val.i32 >> op2_insn->val.i32); + IR_FOLD_CONST_I(op1_insn->val.i32 >> (op2_insn->val.i32 & 0x1f)); } IR_FOLD(SAR(C_U64, C_U64)) IR_FOLD(SAR(C_I64, C_I64)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I(op1_insn->val.i64 >> op2_insn->val.i64); + IR_FOLD_CONST_I(op1_insn->val.i64 >> (op2_insn->val.i64 & 0x3f)); } IR_FOLD(ROL(C_U8, C_U8)) IR_FOLD(ROL(C_CHAR, C_CHAR)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(ir_rol8(op1_insn->val.u8, op2_insn->val.u8)); + IR_FOLD_CONST_U(ir_rol8(op1_insn->val.u8, (op2_insn->val.u8 & 0x7))); } IR_FOLD(ROL(C_I8, C_I8)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I((int8_t)ir_rol8(op1_insn->val.u8, op2_insn->val.u8)); + IR_FOLD_CONST_I((int8_t)ir_rol8(op1_insn->val.u8, (op2_insn->val.u8 & 0x7))); } IR_FOLD(ROL(C_U16, C_U16)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(ir_rol16(op1_insn->val.u16, op2_insn->val.u16)); + IR_FOLD_CONST_U(ir_rol16(op1_insn->val.u16, (op2_insn->val.u16 & 0xf))); } IR_FOLD(ROL(C_I16, C_I16)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I((int16_t)ir_rol16(op1_insn->val.u16, op2_insn->val.u16)); + IR_FOLD_CONST_I((int16_t)ir_rol16(op1_insn->val.u16, (op2_insn->val.u16 & 0xf))); } IR_FOLD(ROL(C_U32, C_U32)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(ir_rol32(op1_insn->val.u32, op2_insn->val.u32)); + IR_FOLD_CONST_U(ir_rol32(op1_insn->val.u32, (op2_insn->val.u32 & 0x1f))); } IR_FOLD(ROL(C_I32, C_I32)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I((int32_t)ir_rol32(op1_insn->val.u32, op2_insn->val.u32)); + IR_FOLD_CONST_I((int32_t)ir_rol32(op1_insn->val.u32, (op2_insn->val.u32 & 0x1f))); } IR_FOLD(ROL(C_U64, C_U64)) IR_FOLD(ROL(C_I64, C_I64)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(ir_rol64(op1_insn->val.u64, op2_insn->val.u64)); + IR_FOLD_CONST_U(ir_rol64(op1_insn->val.u64, (op2_insn->val.u64 & 0x3f))); } IR_FOLD(ROR(C_U8, C_U8)) IR_FOLD(ROR(C_CHAR, C_CHAR)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(ir_ror8(op1_insn->val.u8, op2_insn->val.u8)); + IR_FOLD_CONST_U(ir_ror8(op1_insn->val.u8, (op2_insn->val.u8 & 0x7))); } IR_FOLD(ROR(C_I8, C_I8)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I((int8_t)ir_ror8(op1_insn->val.u8, op2_insn->val.u8)); + IR_FOLD_CONST_I((int8_t)ir_ror8(op1_insn->val.u8, (op2_insn->val.u8 & 0x7))); } IR_FOLD(ROR(C_U16, C_U16)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(ir_ror16(op1_insn->val.u16, op2_insn->val.u16)); + IR_FOLD_CONST_U(ir_ror16(op1_insn->val.u16, (op2_insn->val.u16 & 0xf))); } IR_FOLD(ROR(C_I16, C_I16)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I((int16_t)ir_ror16(op1_insn->val.u16, op2_insn->val.u16)); + IR_FOLD_CONST_I((int16_t)ir_ror16(op1_insn->val.u16, (op2_insn->val.u16 & 0xf))); } IR_FOLD(ROR(C_U32, C_U32)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(ir_ror32(op1_insn->val.u32, op2_insn->val.u32)); + IR_FOLD_CONST_U(ir_ror32(op1_insn->val.u32, (op2_insn->val.u32 & 0x1f))); } IR_FOLD(ROR(C_I32, C_I32)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_I((int32_t)ir_ror32(op1_insn->val.u32, op2_insn->val.u32)); + IR_FOLD_CONST_I((int32_t)ir_ror32(op1_insn->val.u32, (op2_insn->val.u32 & 0x1f))); } IR_FOLD(ROR(C_U64, C_U64)) IR_FOLD(ROR(C_I64, C_I64)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - IR_FOLD_CONST_U(ir_ror64(op1_insn->val.u64, op2_insn->val.u64)); + IR_FOLD_CONST_U(ir_ror64(op1_insn->val.u64, (op2_insn->val.u64 & 0x3f))); } //IR_FOLD(BSWAP(CONST)) @@ -1392,6 +1419,9 @@ IR_FOLD_CONST_U(op1_insn->val.u16); case IR_U32: IR_FOLD_CONST_U(op1_insn->val.u32); + case IR_ADDR: + IR_ASSERT(sizeof(void*) == 4); + IR_FOLD_CONST_U(op1_insn->val.u32); } } @@ -1545,7 +1575,7 @@ IR_FOLD(COPY(_)) { IR_ASSERT(IR_OPT_TYPE(opt) == op1_insn->type); - if (!op2) { + if (!(op2 & IR_COPY_HARD)) { IR_FOLD_COPY(op1); } /* skip CSE */ @@ -2075,23 +2105,23 @@ IR_FOLD_CONST_U(0); } else if (op1_insn->op1 == op2_insn->op1) { /* (a + b) - (a + c) => b - c */ - op1 = op1_insn->op2; - op2 = op2_insn->op2; + op1 = _ir_fold_cast(ctx, op1_insn->op2, IR_OPT_TYPE(opt)); + op2 = _ir_fold_cast(ctx, op2_insn->op2, IR_OPT_TYPE(opt)); IR_FOLD_RESTART; } else if (op1_insn->op1 == op2_insn->op2) { /* (a + b) - (c + a) => b - c */ - op1 = op1_insn->op2; - op2 = op2_insn->op1; + op1 = _ir_fold_cast(ctx, op1_insn->op2, IR_OPT_TYPE(opt)); + op2 = _ir_fold_cast(ctx, op2_insn->op1, IR_OPT_TYPE(opt)); IR_FOLD_RESTART; } else if (op1_insn->op2 == op2_insn->op1) { /* (a + b) - (b + c) => a - c */ - op1 = op1_insn->op1; - op2 = op2_insn->op2; + op1 = _ir_fold_cast(ctx, op1_insn->op1, IR_OPT_TYPE(opt)); + op2 = _ir_fold_cast(ctx, op2_insn->op2, IR_OPT_TYPE(opt)); IR_FOLD_RESTART; } else if (op1_insn->op2 == op2_insn->op2) { /* (a + b) - (c + b) => a - c */ - op1 = op1_insn->op1; - op2 = op2_insn->op1; + op1 = _ir_fold_cast(ctx, op1_insn->op1, IR_OPT_TYPE(opt)); + op2 = _ir_fold_cast(ctx, op2_insn->op1, IR_OPT_TYPE(opt)); IR_FOLD_RESTART; } } @@ -3409,5 +3439,84 @@ if (op2 == op3) { IR_FOLD_COPY(op2); } + + if (op1_insn->type == IR_BOOL) { + if (op2 == IR_TRUE) { + if (op3 == IR_FALSE) { + /* a ? true : false => a */ + IR_FOLD_COPY(op1); + } else { + /* a ? true : b => a | b */ + opt = IR_OPT(IR_OR, IR_BOOL); + op2 = op3; + op3 = IR_UNUSED; + IR_FOLD_RESTART; + } + } else if (op3 == IR_FALSE) { + /* a ? b : false => a & b */ + opt = IR_OPT(IR_AND, IR_BOOL); + op3 = IR_UNUSED; + IR_FOLD_RESTART; + } else if (op2 == IR_FALSE) { + if (op3 == IR_TRUE) { + /* a ? flase : true => !a */ + opt = IR_OPT(IR_NOT, IR_BOOL); + op2 = IR_UNUSED; + op3 = IR_UNUSED; + IR_FOLD_RESTART; + } + } else if (IR_IS_TYPE_INT(IR_OPT_TYPE(opt)) + && IR_IS_CONST_REF(op2) + && IR_IS_CONST_REF(op3) + && op2_insn->val.u64 == 1 + && op3_insn->val.u64 == 0) { + if (ir_type_size[IR_OPT_TYPE(opt)] > 1) { + /* a ? 1 : 0 => ZEXT(a) */ + opt = IR_OPT(IR_ZEXT, IR_OPT_TYPE(opt)); + } else { + /* a ? 1 : 0 => BITCAST(a) */ + opt = IR_OPT(IR_BITCAST, IR_OPT_TYPE(opt)); + } + op2 = IR_UNUSED; + op3 = IR_UNUSED; + IR_FOLD_RESTART; + } + } else if (IR_IS_TYPE_INT(op1_insn->type)) { + if (op2 == IR_TRUE) { + if (op3 == IR_FALSE) { + opt = IR_OPT(IR_NE, IR_BOOL); + val.u64 = 0; + op2 = ir_const(ctx, val, op1_insn->type); + op3 = IR_UNUSED; + IR_FOLD_RESTART; + } + } else if (op2 == IR_FALSE) { + if (op3 == IR_TRUE) { + opt = IR_OPT(IR_EQ, IR_BOOL); + val.u64 = 0; + op2 = ir_const(ctx, val, op1_insn->type); + op3 = IR_UNUSED; + IR_FOLD_RESTART; + } + } + } + + if (op1_insn->op == IR_NE) { + if (IR_IS_CONST_REF(op1_insn->op2) + && IR_IS_TYPE_INT(ctx->ir_base[op1_insn->op2].type) + && ctx->ir_base[op1_insn->op2].val.u64 == 0) { + op1 = op1_insn->op1; + IR_FOLD_RESTART; + } + } else if (op1_insn->op == IR_EQ) { + if (IR_IS_CONST_REF(op1_insn->op2) + && IR_IS_TYPE_INT(ctx->ir_base[op1_insn->op2].type) + && ctx->ir_base[op1_insn->op2].val.u64 == 0) { + op1 = op1_insn->op1; + SWAP_REFS(op2, op3); + IR_FOLD_RESTART; + } + } + IR_FOLD_NEXT; } diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_gcm.c php8.4-8.4.21/ext/opcache/jit/ir/ir_gcm.c --- php8.4-8.4.16/ext/opcache/jit/ir/ir_gcm.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_gcm.c 2026-05-05 16:34:12.000000000 +0000 @@ -262,7 +262,7 @@ #endif /* 1.2. Iteratively check the predecessors of already found TOTALLY_USEFUL blocks and - * add them into TOTALLY_USEFUL set if all of their sucessors are already there. + * add them into TOTALLY_USEFUL set if all of their successors are already there. */ IR_SPARSE_SET_FOREACH(&data->totally_useful, i) { _push_predecessors(ctx, &ctx->cfg_blocks[i], data); @@ -408,12 +408,11 @@ } /* Reconstruct IR: Update DEF->USE lists, CFG mapping and etc */ - ctx->use_lists = ir_mem_realloc(ctx->use_lists, ctx->insns_count * sizeof(ir_use_list)); - ctx->cfg_map = ir_mem_realloc(ctx->cfg_map, ctx->insns_count * sizeof(uint32_t)); n = ctx->use_lists[ref].refs; for (i = 0; i < clones_count; i++) { clone = clones[i].ref; - if (clones[i].use_count == 1 + if (clones[i].block + && clones[i].use_count == 1 && ctx->cfg_blocks[clones[i].block].loop_depth >= ctx->cfg_blocks[uses[clones[i].use].block].loop_depth) { /* TOTALLY_USEFUL block may be a head of a diamond above the real usage. * Sink it down to the real usage block. @@ -427,6 +426,7 @@ uint32_t u = clones[i].use; while (u != (uint32_t)-1) { + uint32_t src = uses[u].block; use = uses[u].ref; ctx->use_edges[n++] = use; u = uses[u].next; @@ -436,9 +436,11 @@ ir_ref k, l = insn->inputs_count; if (insn->op == IR_PHI) { - for (k = 1; k <= l; k++) { - if (ir_insn_op(insn, k) == ref) { - j = ctx->cfg_map[ir_insn_op(&ctx->ir_base[insn->op1], k - 1)]; + ir_insn *merge = &ctx->ir_base[insn->op1]; + for (k = 2; k <= l; k++) { + j = ctx->cfg_map[ir_insn_op(merge, k - 1)]; + if (j == src) { + IR_ASSERT(ir_insn_op(insn, k) == ref); if (j != clones[i].block) { uint32_t dom_depth = ctx->cfg_blocks[clones[i].block].dom_depth; while (ctx->cfg_blocks[j].dom_depth > dom_depth) { @@ -787,7 +789,7 @@ IR_ALWAYS_INLINE bool ir_is_good_bb_order(ir_ctx *ctx, uint32_t b, ir_block *bb, ir_ref start) { - ir_insn *insn = &ctx->ir_base[start]; + ir_insn *insn = &ctx->ir_base[start]; uint32_t n = insn->inputs_count; ir_ref *p = insn->ops + 1; @@ -841,6 +843,7 @@ xlat = ir_mem_malloc(count * sizeof(uint32_t)); ir_worklist_init(&worklist, count); ir_worklist_push(&worklist, 1); + /* Schedule blocks bottom-up. Place block only after all its successurs (except back-edges) are placed. */ while (ir_worklist_len(&worklist) != 0) { next: b = ir_worklist_peek(&worklist); @@ -848,7 +851,14 @@ n = bb->successors_count; if (n == 1) { succ = ctx->cfg_edges[bb->successors]; - if (ir_worklist_push(&worklist, succ)) { + if (ir_bitset_in(worklist.visited, succ)) { + /* already processed */ + } else if ((ctx->cfg_blocks[succ].flags & IR_BB_IRREDUCIBLE_LOOP) + && ((ctx->cfg_blocks[b].flags & IR_BB_LOOP_HEADER) ? + (ctx->cfg_blocks[succ].loop_header != b) : + (ctx->cfg_blocks[succ].loop_header != ctx->cfg_blocks[b].loop_header))) { + /* "side" entry of irreducible loop (ignore) */ + } else if (ir_worklist_push(&worklist, succ)) { goto next; } } else if (n > 1) { @@ -861,12 +871,11 @@ succ = *q; if (ir_bitset_in(worklist.visited, succ)) { /* already processed */ - } else if ((ctx->cfg_blocks[succ].flags & IR_BB_LOOP_HEADER) - && (succ == b || ctx->cfg_blocks[b].loop_header == succ)) { - /* back-edge of reducible loop */ } else if ((ctx->cfg_blocks[succ].flags & IR_BB_IRREDUCIBLE_LOOP) - && (ctx->cfg_blocks[succ].loop_header == ctx->cfg_blocks[b].loop_header)) { - /* closing edge of irreducible loop */ + && ((ctx->cfg_blocks[b].flags & IR_BB_LOOP_HEADER) ? + (ctx->cfg_blocks[succ].loop_header != b) : + (ctx->cfg_blocks[succ].loop_header != ctx->cfg_blocks[b].loop_header))) { + /* "side" entry of irreducible loop (ignore) */ } else if (!best) { best = succ; best_loop_depth = ctx->cfg_blocks[best].loop_depth; @@ -882,6 +891,8 @@ goto next; } } + + /* All successors of "b" are placed. Now we can place "b" itself. */ ir_worklist_pop(&worklist); count--; new_blocks[count] = *bb; @@ -923,25 +934,120 @@ ctx->cfg_blocks = new_blocks; } +#if IR_DEBUG +static void ir_schedule_print_list(const ir_ctx *ctx, uint32_t b, const ir_ref *_next, + ir_ref start, ir_ref end, const char *label) +{ + ir_ref ref; + + fprintf(stderr, " %s [%d", label, start); + ref = _next[start]; + while (ref != end) { + fprintf(stderr, ",%d", ref); + ref = _next[ref]; + } + fprintf(stderr, ",%d]\n", ref); +} +#endif + +/* Simple Stable Topological Sort */ +static void ir_schedule_topsort(const ir_ctx *ctx, uint32_t b, const ir_block *bb, + ir_ref *_xlat, ir_ref *_next, ir_ref *_prev, + ir_ref ref, ir_ref end, + ir_ref *insns_count, ir_ref *consts_count) +{ + ir_ref i = ref; + const ir_insn *insn; + + if (bb->successors_count > 1) { + ir_ref input, j = bb->end; + ir_insn *end = &ctx->ir_base[j]; + + if (end->op == IR_IF) { + /* Move condition closer to IF */ + input = end->op2; + if (input > 0 + && ctx->cfg_map[input] == b + && !_xlat[input] + && _prev[j] != input + && (!(ir_op_flags[ctx->ir_base[input].op] & IR_OP_FLAG_CONTROL) || end->op1 == input)) { + if (input == i) { + i = _next[i]; + insn = &ctx->ir_base[i]; + } + /* remove "input" */ + _prev[_next[input]] = _prev[input]; + _next[_prev[input]] = _next[input]; + /* insert before "j" */ + _prev[input] = _prev[j]; + _next[input] = j; + _next[_prev[j]] = input; + _prev[j] = input; + } + } + } + + while (i != end) { + ir_ref n, j, input; + const ir_ref *p; + +restart: + IR_ASSERT(ctx->cfg_map[i] == b); + insn = &ctx->ir_base[i]; + n = insn->inputs_count; + for (j = n, p = insn->ops + 1; j > 0; p++, j--) { + input = *p; + if (!_xlat[input]) { + /* input is not scheduled yet */ + if (input > 0) { + if (ctx->cfg_map[input] == b) { + /* "input" should be before "i" to satisfy dependency */ +#ifdef IR_DEBUG + if (ctx->flags & IR_DEBUG_SCHEDULE) { + fprintf(stderr, "Wrong dependency %d:%d -> %d\n", b, input, i); + } +#endif + /* remove "input" */ + _prev[_next[input]] = _prev[input]; + _next[_prev[input]] = _next[input]; + /* insert before "i" */ + _prev[input] = _prev[i]; + _next[input] = i; + _next[_prev[i]] = input; + _prev[i] = input; + /* restart from "input" */ + i = input; + goto restart; + } + } else if (input < IR_TRUE) { + *consts_count += ir_count_constant(_xlat, input); + } + } + } + + _xlat[i] = *insns_count; + *insns_count += ir_insn_inputs_to_len(n); + IR_ASSERT(_next[i] != IR_UNUSED); + i = _next[i]; + } +} + int ir_schedule(ir_ctx *ctx) { - ir_ctx new_ctx; ir_ref i, j, k, n, *p, *q, ref, new_ref, prev_ref, insns_count, consts_count, use_edges_count; ir_ref *_xlat; ir_ref *edges; ir_ref prev_b_end; uint32_t b; - uint32_t *_blocks = ctx->cfg_map; ir_ref *_next = ir_mem_malloc(ctx->insns_count * sizeof(ir_ref)); ir_ref *_prev = ir_mem_malloc(ctx->insns_count * sizeof(ir_ref)); ir_block *bb; - ir_insn *insn, *new_insn; + ir_insn *insn, *new_insn, *base; ir_use_list *lists, *use_list, *new_list; bool bad_bb_order = 0; - /* Create a double-linked list of nodes ordered by BB, respecting BB->start and BB->end */ - IR_ASSERT(_blocks[1] == 1); + IR_ASSERT(ctx->cfg_map[1] == 1); /* link BB boundaries */ _prev[1] = 0; @@ -949,30 +1055,34 @@ _next[1] = prev_b_end; _prev[prev_b_end] = 1; for (b = 2, bb = ctx->cfg_blocks + 2; b <= ctx->cfg_blocks_count; b++, bb++) { - _next[prev_b_end] = bb->start; - _prev[bb->start] = prev_b_end; - _next[bb->start] = bb->end; - _prev[bb->end] = bb->start; - prev_b_end = bb->end; - if (!ir_is_good_bb_order(ctx, b, bb, bb->start)) { + ir_ref start = bb->start; + ir_ref end = bb->end; + _next[prev_b_end] = start; + _prev[start] = prev_b_end; + _next[start] = end; + _prev[end] = start; + prev_b_end = end; + if (!ir_is_good_bb_order(ctx, b, bb, start)) { bad_bb_order = 1; } } _next[prev_b_end] = 0; /* insert intermediate BB nodes */ - for (i = 2, j = 1; i < ctx->insns_count; i++) { - b = _blocks[i]; + use_edges_count = ctx->use_lists[1].count; + for (i = 2, use_list = &ctx->use_lists[i]; i < ctx->insns_count; use_list++, i++) { + b = ctx->cfg_map[i]; if (!b) continue; + use_edges_count += use_list->count; bb = &ctx->cfg_blocks[b]; if (i != bb->start && i != bb->end) { /* insert before "end" */ - ir_ref n = bb->end; - ir_ref p = _prev[n]; - _prev[i] = p; - _next[i] = n; - _next[p] = i; - _prev[n] = i; + ir_ref next = bb->end; + ir_ref prev = _prev[next]; + _prev[i] = prev; + _next[i] = next; + _next[prev] = i; + _prev[next] = i; } } @@ -980,15 +1090,6 @@ ir_fix_bb_order(ctx, _prev, _next); } -#ifdef IR_DEBUG - if (ctx->flags & IR_DEBUG_SCHEDULE) { - fprintf(stderr, "Before Schedule\n"); - for (i = 1; i != 0; i = _next[i]) { - fprintf(stderr, "%d -> %d\n", i, _blocks[i]); - } - } -#endif - _xlat = ir_mem_calloc((ctx->consts_count + ctx->insns_count), sizeof(ir_ref)); _xlat += ctx->consts_count; _xlat[IR_TRUE] = IR_TRUE; @@ -998,16 +1099,27 @@ insns_count = 1; consts_count = -(IR_TRUE - 1); - /* Topological sort according dependencies inside each basic block */ + /* Schedule instructions inside each BB (now just topological sort according to dependencies) */ for (b = 1, bb = ctx->cfg_blocks + 1; b <= ctx->cfg_blocks_count; b++, bb++) { ir_ref start; +#ifdef IR_DEBUG + if (ctx->flags & IR_DEBUG_SCHEDULE) { + fprintf(stderr, "BB%d\n", b); + ir_schedule_print_list(ctx, b, _next, bb->start, bb->end, "INITIAL"); + } +#endif + IR_ASSERT(!(bb->flags & IR_BB_UNREACHABLE)); /* Schedule BB start */ start = i = bb->start; _xlat[i] = bb->start = insns_count; insn = &ctx->ir_base[i]; - if (insn->op == IR_CASE_VAL) { + if (insn->op == IR_BEGIN) { + if (insn->op2) { + consts_count += ir_count_constant(_xlat, insn->op2); + } + } else if (insn->op == IR_CASE_VAL) { IR_ASSERT(insn->op2 < IR_TRUE); consts_count += ir_count_constant(_xlat, insn->op2); } else if (insn->op == IR_CASE_RANGE) { @@ -1057,8 +1169,8 @@ for (p = &ctx->use_edges[use_list->refs]; count > 0; p++, count--) { ir_ref use = *p; ir_insn *use_insn = &ctx->ir_base[use]; - if (!_xlat[use] && (_blocks[use] || use_insn->op == IR_PARAM)) { - IR_ASSERT(_blocks[use] == b || use_insn->op == IR_PARAM); + if (!_xlat[use] && ctx->cfg_map[use]) { + IR_ASSERT(ctx->cfg_map[use] == b); if (use_insn->op == IR_PARAM || use_insn->op == IR_VAR || use_insn->op == IR_PI @@ -1095,76 +1207,20 @@ insn = &ctx->ir_base[i]; } } - if (bb->successors_count > 1) { - ir_ref input, j = bb->end; - ir_insn *end = &ctx->ir_base[j]; - - if (end->op == IR_IF) { - /* Move condition closer to IF */ - input = end->op2; - if (input > 0 - && _blocks[input] == b - && !_xlat[input] - && _prev[j] != input - && (!(ir_op_flags[ctx->ir_base[input].op] & IR_OP_FLAG_CONTROL) || end->op1 == input)) { - if (input == i) { - i = _next[i]; - insn = &ctx->ir_base[i]; - } - /* remove "input" */ - _prev[_next[input]] = _prev[input]; - _next[_prev[input]] = _next[input]; - /* insert before "j" */ - _prev[input] = _prev[j]; - _next[input] = j; - _next[_prev[j]] = input; - _prev[j] = input; - } - } + + if (i != bb->end) { + ir_schedule_topsort(ctx, b, bb, _xlat, _next, _prev, i, bb->end, &insns_count, &consts_count); } - while (i != bb->end) { - ir_ref n, j, *p, input; -restart: - IR_ASSERT(_blocks[i] == b); - n = insn->inputs_count; - for (j = n, p = insn->ops + 1; j > 0; p++, j--) { - input = *p; - if (!_xlat[input]) { - /* input is not scheduled yet */ - if (input > 0) { - if (_blocks[input] == b) { - /* "input" should be before "i" to satisfy dependency */ #ifdef IR_DEBUG - if (ctx->flags & IR_DEBUG_SCHEDULE) { - fprintf(stderr, "Wrong dependency %d:%d -> %d\n", b, input, i); - } -#endif - /* remove "input" */ - _prev[_next[input]] = _prev[input]; - _next[_prev[input]] = _next[input]; - /* insert before "i" */ - _prev[input] = _prev[i]; - _next[input] = i; - _next[_prev[i]] = input; - _prev[i] = input; - /* restart from "input" */ - i = input; - insn = &ctx->ir_base[i]; - goto restart; - } - } else if (input < IR_TRUE) { - consts_count += ir_count_constant(_xlat, input); - } - } - } - _xlat[i] = insns_count; - insns_count += ir_insn_inputs_to_len(n); - IR_ASSERT(_next[i] != IR_UNUSED); - i = _next[i]; - insn = &ctx->ir_base[i]; + if (ctx->flags & IR_DEBUG_SCHEDULE) { + ir_schedule_print_list(ctx, b, _next, start, bb->end, " FINAL"); } +#endif + /* Schedule BB end */ + i = bb->end; + insn = &ctx->ir_base[i]; _xlat[i] = bb->end = insns_count; insns_count++; if (IR_INPUT_EDGES_COUNT(ir_op_flags[insn->op]) == 2) { @@ -1174,15 +1230,6 @@ } } -#ifdef IR_DEBUG - if (ctx->flags & IR_DEBUG_SCHEDULE) { - fprintf(stderr, "After Schedule\n"); - for (i = 1; i != 0; i = _next[i]) { - fprintf(stderr, "%d -> %d (%d)\n", i, _blocks[i], _xlat[i]); - } - } -#endif - #if 1 /* Check if scheduling didn't make any modifications */ if (consts_count == ctx->consts_count && insns_count == ctx->insns_count) { @@ -1210,113 +1257,55 @@ ir_mem_free(_prev); - ir_init(&new_ctx, ctx->flags, consts_count, insns_count); - new_ctx.insns_count = insns_count; - new_ctx.flags2 = ctx->flags2; - new_ctx.ret_type = ctx->ret_type; - new_ctx.value_params = ctx->value_params; - new_ctx.mflags = ctx->mflags; - new_ctx.spill_base = ctx->spill_base; - new_ctx.fixed_stack_red_zone = ctx->fixed_stack_red_zone; - new_ctx.fixed_stack_frame_size = ctx->fixed_stack_frame_size; - new_ctx.fixed_call_stack_size = ctx->fixed_call_stack_size; - new_ctx.fixed_regset = ctx->fixed_regset; - new_ctx.fixed_save_regset = ctx->fixed_save_regset; - new_ctx.entries_count = ctx->entries_count; -#if defined(IR_TARGET_AARCH64) - new_ctx.deoptimization_exits = ctx->deoptimization_exits; - new_ctx.get_exit_addr = ctx->get_exit_addr; - new_ctx.get_veneer = ctx->get_veneer; - new_ctx.set_veneer = ctx->set_veneer; -#endif - new_ctx.loader = ctx->loader; + uint32_t *map = ir_mem_calloc(insns_count, sizeof(uint32_t)); + _prev = ir_mem_malloc(insns_count * sizeof(ir_ref)); + lists = ir_mem_malloc(insns_count * sizeof(ir_use_list)); + ir_ref *use_edges = edges = ir_mem_malloc(use_edges_count * sizeof(ir_ref)); + base = ir_mem_malloc((consts_count + insns_count) * sizeof(ir_insn)); + base += consts_count; /* Copy constants */ - if (consts_count == ctx->consts_count) { - new_ctx.consts_count = consts_count; - ref = 1 - consts_count; - insn = &ctx->ir_base[ref]; - new_insn = &new_ctx.ir_base[ref]; - - memcpy(new_insn, insn, sizeof(ir_insn) * (IR_TRUE - ref)); - if (ctx->strtab.data) { - while (ref != IR_TRUE) { - if (new_insn->op == IR_FUNC_ADDR) { - if (new_insn->proto) { - size_t len; - const char *proto = ir_get_strl(ctx, new_insn->proto, &len); - new_insn->proto = ir_strl(&new_ctx, proto, len); - } - } else if (new_insn->op == IR_FUNC) { - size_t len; - const char *name = ir_get_strl(ctx, new_insn->val.name, &len); - new_insn->val.u64 = ir_strl(&new_ctx, name, len); - if (new_insn->proto) { - const char *proto = ir_get_strl(ctx, new_insn->proto, &len); - new_insn->proto = ir_strl(&new_ctx, proto, len); - } - } else if (new_insn->op == IR_SYM || new_insn->op == IR_STR) { - size_t len; - const char *str = ir_get_strl(ctx, new_insn->val.name, &len); - new_insn->val.u64 = ir_strl(&new_ctx, str, len); - } - new_insn++; - ref++; - } + if (ctx->consts_count == consts_count) { + memcpy(base - consts_count + 1, ctx->ir_base - consts_count + 1, sizeof(ir_insn) * consts_count); + for (j = -consts_count + 1; j < IR_TRUE; j++) { + _xlat[j] = j; } } else { - new_ref = -new_ctx.consts_count; - new_insn = &new_ctx.ir_base[new_ref]; - for (ref = IR_TRUE - 1, insn = &ctx->ir_base[ref]; ref > -ctx->consts_count; insn--, ref--) { - if (!_xlat[ref]) { - continue; - } - new_insn->optx = insn->optx; - new_insn->prev_const = 0; - if (insn->op == IR_FUNC_ADDR) { - new_insn->val.u64 = insn->val.u64; - if (insn->proto) { - size_t len; - const char *proto = ir_get_strl(ctx, insn->proto, &len); - new_insn->proto = ir_strl(&new_ctx, proto, len); - } else { - new_insn->proto = 0; - } - } else if (insn->op == IR_FUNC) { - size_t len; - const char *name = ir_get_strl(ctx, insn->val.name, &len); - new_insn->val.u64 = ir_strl(&new_ctx, name, len); - if (insn->proto) { - const char *proto = ir_get_strl(ctx, insn->proto, &len); - new_insn->proto = ir_strl(&new_ctx, proto, len); - } else { - new_insn->proto = 0; - } - } else if (insn->op == IR_SYM || insn->op == IR_STR) { - size_t len; - const char *str = ir_get_strl(ctx, insn->val.name, &len); - new_insn->val.u64 = ir_strl(&new_ctx, str, len); - } else { - new_insn->val.u64 = insn->val.u64; - } - _xlat[ref] = new_ref; - new_ref--; - new_insn--; - } - new_ctx.consts_count = -new_ref; - } + ir_insn *src = ctx->ir_base - ctx->consts_count + 1; + ir_insn *dst = base - consts_count + 1; - new_ctx.cfg_map = ir_mem_calloc(ctx->insns_count, sizeof(uint32_t)); - new_ctx.prev_ref = _prev = ir_mem_malloc(insns_count * sizeof(ir_ref)); - new_ctx.use_lists = lists = ir_mem_malloc(insns_count * sizeof(ir_use_list)); - new_ctx.use_edges = edges = ir_mem_malloc(ctx->use_edges_count * sizeof(ir_ref)); + i = -ctx->consts_count + 1; + j = -consts_count + 1; + while (i < IR_TRUE) { + if (_xlat[i]) { + *dst = *src; + dst->prev_const = 0; + _xlat[i] = j; + dst++; + j++; + } + src++; + i++; + } + IR_ASSERT(j == IR_TRUE); + base[IR_TRUE].optx = IR_OPT(IR_C_BOOL, IR_BOOL); + base[IR_TRUE].val.u64 = 1; + base[IR_FALSE].optx = IR_OPT(IR_C_BOOL, IR_BOOL); + base[IR_FALSE].val.u64 = 0; + base[IR_NULL].optx = IR_OPT(IR_C_ADDR, IR_ADDR); + base[IR_NULL].val.u64 = 0; + MAKE_NOP(&base[IR_UNUSED]); + } /* Copy instructions, use lists and use edges */ +#ifdef IR_DEBUG + ir_ref orig_use_edges_count = use_edges_count; +#endif prev_ref = 0; use_edges_count = 0; for (i = 1; i != 0; i = _next[i]) { new_ref = _xlat[i]; - new_ctx.cfg_map[new_ref] = _blocks[i]; + map[new_ref] = ctx->cfg_map[i]; _prev[new_ref] = prev_ref; prev_ref = new_ref; @@ -1325,7 +1314,7 @@ k = 0; if (n == 1) { ref = ctx->use_edges[use_list->refs]; - if (_xlat[ref]) { + if (EXPECTED(_xlat[ref])) { *edges = _xlat[ref]; edges++; k = 1; @@ -1334,7 +1323,7 @@ p = &ctx->use_edges[use_list->refs]; while (n--) { ref = *p; - if (_xlat[ref]) { + if (EXPECTED(_xlat[ref])) { *edges = _xlat[ref]; edges++; k++; @@ -1348,7 +1337,7 @@ new_list->count = k; insn = &ctx->ir_base[i]; - new_insn = &new_ctx.ir_base[new_ref]; + new_insn = &base[new_ref]; new_insn->optx = insn->optx; n = new_insn->inputs_count; @@ -1360,10 +1349,8 @@ break; case 1: new_insn->op1 = _xlat[insn->op1]; - if (new_insn->op == IR_PARAM || new_insn->op == IR_VAR || new_insn->op == IR_PROTO) { - size_t len; - const char *str = ir_get_strl(ctx, insn->op2, &len); - new_insn->op2 = ir_strl(&new_ctx, str, len); + if (new_insn->op == IR_BEGIN && insn->op2) { + new_insn->op2 = _xlat[insn->op2]; } else { new_insn->op2 = insn->op2; } @@ -1421,12 +1408,12 @@ } /* Update list of terminators (IR_OPND_CONTROL_REF) */ - insn = &new_ctx.ir_base[1]; + insn = &base[1]; ref = insn->op1; if (ref) { insn->op1 = ref = _xlat[ref]; while (1) { - insn = &new_ctx.ir_base[ref]; + insn = &base[ref]; ref = insn->op3; if (!ref) { break; @@ -1435,36 +1422,33 @@ } } - IR_ASSERT(ctx->use_edges_count >= use_edges_count); - new_ctx.use_edges_count = use_edges_count; - new_ctx.use_edges = ir_mem_realloc(new_ctx.use_edges, use_edges_count * sizeof(ir_ref)); - if (ctx->binding) { ir_xlat_binding(ctx, _xlat); - new_ctx.binding = ctx->binding; - ctx->binding = NULL; } _xlat -= ctx->consts_count; ir_mem_free(_xlat); + ir_mem_free(_next); - new_ctx.cfg_blocks_count = ctx->cfg_blocks_count; - new_ctx.cfg_edges_count = ctx->cfg_edges_count; - new_ctx.cfg_blocks = ctx->cfg_blocks; - new_ctx.cfg_edges = ctx->cfg_edges; - ctx->cfg_blocks = NULL; - ctx->cfg_edges = NULL; - ctx->value_params = NULL; - ir_code_buffer *saved_code_buffer = ctx->code_buffer; - - ir_free(ctx); - IR_ASSERT(new_ctx.consts_count == new_ctx.consts_limit); - IR_ASSERT(new_ctx.insns_count == new_ctx.insns_limit); - memcpy(ctx, &new_ctx, sizeof(ir_ctx)); - ctx->code_buffer = saved_code_buffer; - ctx->flags2 |= IR_LINEAR; + /* Switch to new IR buffer */ + ir_mem_free(ctx->ir_base - ctx->consts_limit); + ctx->ir_base = base; + ctx->insns_count = ctx->insns_limit = insns_count; + ctx->consts_count = ctx->consts_limit = consts_count; + + ir_mem_free(ctx->use_lists); + ir_mem_free(ctx->use_edges); + IR_ASSERT(orig_use_edges_count >= use_edges_count); + ctx->use_lists = lists; + ctx->use_edges = use_edges; + ctx->use_edges_count = use_edges_count; - ir_mem_free(_next); + ir_mem_free(ctx->cfg_map); + ctx->cfg_map = map; + + ctx->prev_ref = _prev; + + ctx->flags2 |= IR_LINEAR; return 1; } diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_gdb.c php8.4-8.4.21/ext/opcache/jit/ir/ir_gdb.c --- php8.4-8.4.16/ext/opcache/jit/ir/ir_gdb.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_gdb.c 2026-05-05 16:34:12.000000000 +0000 @@ -7,6 +7,10 @@ * Based on Mike Pall's implementation of GDB interface for LuaJIT. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + #include #include #include @@ -517,6 +521,8 @@ static bool ir_gdb_register_code(const void *object, size_t size) { ir_gdbjit_code_entry *entry; + ir_elf_header *elf_header; + ir_elf_sectheader *elf_section, *elf_section_end; entry = malloc(sizeof(ir_gdbjit_code_entry) + size); if (entry == NULL) { @@ -528,6 +534,17 @@ memcpy((char *)entry->symfile_addr, object, size); + elf_header = (ir_elf_header*)entry->symfile_addr; + elf_section = (ir_elf_sectheader*)(entry->symfile_addr + elf_header->shofs); + elf_section_end = (ir_elf_sectheader*)((char*)elf_section + (elf_header->shentsize * elf_header->shnum)); + + while (elf_section < elf_section_end) { + if ((elf_section->flags & ELFSECT_FLAGS_ALLOC) && elf_section->addr == 0) { + elf_section->addr = (uintptr_t)(entry->symfile_addr + elf_section->ofs); + } + elf_section = (ir_elf_sectheader*)((char*)elf_section + elf_header->shentsize); + } + entry->prev_entry = NULL; entry->next_entry = __jit_debug_descriptor.first_entry; diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_perf.c php8.4-8.4.21/ext/opcache/jit/ir/ir_perf.c --- php8.4-8.4.16/ext/opcache/jit/ir/ir_perf.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_perf.c 2026-05-05 16:34:12.000000000 +0000 @@ -14,6 +14,10 @@ * perf report -i perf.data.jitted */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + #include #include #include @@ -26,7 +30,7 @@ #if defined(__linux__) #include -#elif defined(__darwin__) +#elif defined(__APPLE__) # include #elif defined(__FreeBSD__) # include @@ -211,7 +215,7 @@ uint32_t thread_id = 0; #if defined(__linux__) thread_id = syscall(SYS_gettid); -#elif defined(__darwin__) +#elif defined(__APPLE__) uint64_t thread_id_u64; pthread_threadid_np(NULL, &thread_id_u64); thread_id = (uint32_t) thread_id_u64; diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_private.h php8.4-8.4.21/ext/opcache/jit/ir/ir_private.h --- php8.4-8.4.16/ext/opcache/jit/ir/ir_private.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_private.h 2026-05-05 16:34:12.000000000 +0000 @@ -887,7 +887,7 @@ #define IR_IS_CONST_OP(op) ((op) > IR_NOP && (op) <= IR_C_FLOAT) #define IR_IS_FOLDABLE_OP(op) ((op) <= IR_LAST_FOLDABLE_OP) -#define IR_IS_SYM_CONST(op) ((op) == IR_STR || (op) == IR_SYM || (op) == IR_FUNC) +#define IR_IS_SYM_CONST(op) ((op) == IR_STR || (op) == IR_SYM || (op) == IR_FUNC || (op) == IR_LABEL) ir_ref ir_const_ex(ir_ctx *ctx, ir_val val, uint8_t type, uint32_t optx); @@ -908,7 +908,7 @@ return 0; } -IR_ALWAYS_INLINE bool ir_ref_is_true(ir_ctx *ctx, ir_ref ref) +IR_ALWAYS_INLINE bool ir_ref_is_true(const ir_ctx *ctx, ir_ref ref) { if (ref == IR_TRUE) { return 1; @@ -946,12 +946,13 @@ #define IR_OPND_UNUSED 0x0 #define IR_OPND_DATA 0x1 #define IR_OPND_CONTROL 0x2 -#define IR_OPND_CONTROL_DEP 0x3 -#define IR_OPND_CONTROL_REF 0x4 -#define IR_OPND_STR 0x5 -#define IR_OPND_NUM 0x6 -#define IR_OPND_PROB 0x7 -#define IR_OPND_PROTO 0x8 +#define IR_OPND_LABEL_REF 0x3 +#define IR_OPND_CONTROL_DEP 0x4 +#define IR_OPND_CONTROL_REF 0x5 +#define IR_OPND_STR 0x6 +#define IR_OPND_NUM 0x7 +#define IR_OPND_PROB 0x8 +#define IR_OPND_PROTO 0x9 #define IR_OP_FLAGS(op_flags, op1_flags, op2_flags, op3_flags) \ ((op_flags) | ((op1_flags) << 20) | ((op2_flags) << 24) | ((op3_flags) << 28)) @@ -1013,6 +1014,9 @@ #define IR_HAS_VA_ARG_FP (1<<9) #define IR_HAS_FP_RET_SLOT (1<<10) #define IR_16B_FRAME_ALIGNMENT (1<<11) +#define IR_HAS_BLOCK_ADDR (1<<12) +#define IR_PREALLOCATED_STACK (1<<13) + /* Temporary: MEM2SSA -> SCCP */ #define IR_MEM2SSA_VARS (1<<25) @@ -1043,7 +1047,6 @@ void ir_use_list_replace_all(ir_ctx *ctx, ir_ref def, ir_ref use, ir_ref new_use); void ir_use_list_replace_one(ir_ctx *ctx, ir_ref def, ir_ref use, ir_ref new_use); bool ir_use_list_add(ir_ctx *ctx, ir_ref def, ir_ref use); -void ir_use_list_sort(ir_ctx *ctx, ir_ref def); IR_ALWAYS_INLINE ir_ref ir_next_control(const ir_ctx *ctx, ir_ref ref) { @@ -1092,9 +1095,11 @@ void ir_update_op(ir_ctx *ctx, ir_ref ref, uint32_t idx, ir_ref new_val); /*** Iterative Optimization ***/ +void ir_iter_add_uses(ir_ctx *ctx, ir_ref ref, ir_bitqueue *worklist); void ir_iter_replace(ir_ctx *ctx, ir_ref ref, ir_ref new_ref, ir_bitqueue *worklist); void ir_iter_update_op(ir_ctx *ctx, ir_ref ref, uint32_t idx, ir_ref new_val, ir_bitqueue *worklist); void ir_iter_opt(ir_ctx *ctx, ir_bitqueue *worklist); +void ir_iter_cleanup(ir_ctx *ctx); /*** IR Basic Blocks info ***/ #define IR_IS_BB_START(op) \ @@ -1140,12 +1145,15 @@ }; union { uint32_t dom_depth; /* depth from the root of the dominators tree */ - uint32_t postnum; /* used temporary during tree constructon */ + uint32_t postnum; /* used temporary for iterative Post Ordering */ }; uint32_t dom_child; /* first dominated blocks */ uint32_t dom_next_child; /* next dominated block (linked list) */ uint32_t loop_header; - uint32_t loop_depth; + union { + uint32_t loop_depth; + uint32_t next_succ; /* used temporary for iterative Post Ordering */ + }; }; void ir_build_prev_refs(ir_ctx *ctx); @@ -1175,16 +1183,17 @@ IR_FOLD_DO_CONST } ir_fold_action; -ir_ref ir_folding(ir_ctx *ctx, uint32_t opt, ir_ref op1, ir_ref op2, ir_ref op3, ir_insn *op1_insn, ir_insn *op2_insn, ir_insn *op3_insn); +ir_ref ir_folding(ir_ctx *ctx, uint32_t opt, ir_ref op1, ir_ref op2, ir_ref op3, + const ir_insn *op1_insn, const ir_insn *op2_insn, const ir_insn *op3_insn); /*** Alias Analyzes (see ir.c) ***/ -ir_ref ir_find_aliasing_load(ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref addr); -ir_ref ir_find_aliasing_vload(ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref var); +ir_ref ir_find_aliasing_load(const ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref addr); +ir_ref ir_find_aliasing_vload(const ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref var); ir_ref ir_find_aliasing_store(ir_ctx *ctx, ir_ref ref, ir_ref addr, ir_ref val); ir_ref ir_find_aliasing_vstore(ir_ctx *ctx, ir_ref ref, ir_ref addr, ir_ref val); /*** Predicates (see ir.c) ***/ -ir_ref ir_check_dominating_predicates(ir_ctx *ctx, ir_ref ref, ir_ref condition); +ir_ref ir_check_dominating_predicates(const ir_ctx *ctx, ir_ref ref, ir_ref condition); /*** IR Live Info ***/ typedef ir_ref ir_live_pos; @@ -1248,11 +1257,10 @@ #define IR_LIVE_INTERVAL_HAS_HINT_REGS (1<<2) #define IR_LIVE_INTERVAL_HAS_HINT_REFS (1<<3) #define IR_LIVE_INTERVAL_MEM_PARAM (1<<4) -#define IR_LIVE_INTERVAL_MEM_LOAD (1<<5) -#define IR_LIVE_INTERVAL_COALESCED (1<<6) -#define IR_LIVE_INTERVAL_SPILL_SPECIAL (1<<7) /* spill slot is pre-allocated in a special area (see ir_ctx.spill_reserved_base) */ -#define IR_LIVE_INTERVAL_SPILLED (1<<8) -#define IR_LIVE_INTERVAL_SPLIT_CHILD (1<<9) +#define IR_LIVE_INTERVAL_COALESCED (1<<5) +#define IR_LIVE_INTERVAL_SPILL_SPECIAL (1<<6) /* spill slot is pre-allocated in a special area (see ir_ctx.spill_reserved_base) */ +#define IR_LIVE_INTERVAL_SPILLED (1<<7) +#define IR_LIVE_INTERVAL_SPLIT_CHILD (1<<8) struct _ir_live_interval { uint8_t type; @@ -1274,9 +1282,9 @@ ir_live_interval *list_next; /* linked list of active, inactive or unhandled intervals */ }; -typedef int (*emit_copy_t)(ir_ctx *ctx, uint8_t type, ir_ref from, ir_ref to); +typedef int (*emit_copy_t)(ir_ctx *ctx, uint8_t type, ir_ref from, ir_ref to, void *data); -int ir_gen_dessa_moves(ir_ctx *ctx, uint32_t b, emit_copy_t emit_copy); +int ir_gen_dessa_moves(ir_ctx *ctx, uint32_t b, emit_copy_t emit_copy, void *data); #if defined(IR_REGSET_64BIT) @@ -1362,16 +1370,44 @@ #endif /* defined(IR_REGSET_64BIT) */ +/*** Calling Conventions ***/ +#if defined(IR_REGSET_64BIT) +struct _ir_call_conv_dsc { + bool cleanup_stack_by_callee: 1; /* use "retn $size" to return */ + bool pass_struct_by_val: 1; /* pass aggreagate by value, otherwise their copies are passed by ref */ + bool sysv_varargs: 1; /* Use SysV varargs ABI */ + bool shadow_param_regs: 1; /* registers for INT and FP parametrs shadow each other */ + /* (WIN64: 1-st arg is passed in %rcx/%xmm0, 2-nd in %rdx/%xmm1) */ + uint8_t shadow_store_size; /* reserved stack space to keep arguemnts passed in registers (WIN64) */ + uint8_t int_param_regs_count; /* number of registers for INT parameters */ + uint8_t fp_param_regs_count; /* number of registers for FP parameters */ + int8_t int_ret_reg; /* register to return INT value */ + int8_t fp_ret_reg; /* register to return FP value */ + int8_t fp_varargs_reg; /* register to pass number of fp register arguments into vararg func */ + int8_t scratch_reg; /* pseudo register to reffer srcatch regset (clobbered by call) */ + const int8_t *int_param_regs; /* registers for INT parameters */ + const int8_t *fp_param_regs; /* registers for FP parameters */ + ir_regset preserved_regs; /* preserved or callee-saved registers */ +}; + +extern const ir_regset ir_scratch_regset[]; +#endif + +typedef struct _ir_call_conv_dsc ir_call_conv_dsc; + +const ir_call_conv_dsc *ir_get_call_conv_dsc(uint32_t flags); + /*** IR Register Allocation ***/ /* Flags for ctx->regs[][] (low bits are used for register number itself) */ typedef struct _ir_reg_alloc_data { + const ir_call_conv_dsc *cc; int32_t unused_slot_4; int32_t unused_slot_2; int32_t unused_slot_1; ir_live_interval **handled; } ir_reg_alloc_data; -int32_t ir_allocate_spill_slot(ir_ctx *ctx, ir_type type, ir_reg_alloc_data *data); +int32_t ir_allocate_spill_slot(ir_ctx *ctx, ir_type type); IR_ALWAYS_INLINE void ir_set_alocated_reg(ir_ctx *ctx, ir_ref ref, int op_num, int8_t reg) { @@ -1405,9 +1441,27 @@ #define IR_RULE_MASK 0xff +#define IR_MAX_REG_ARGS 64 + extern const char *ir_rule_name[]; -typedef struct _ir_target_constraints ir_target_constraints; +typedef struct _ir_tmp_reg { + union { + uint8_t num; + int8_t reg; + }; + uint8_t type; + int8_t start; + int8_t end; +} ir_tmp_reg; + +typedef struct { + int8_t def_reg; + uint8_t tmps_count; + uint8_t hints_count; + ir_tmp_reg tmp_regs[3]; + int8_t hints[IR_MAX_REG_ARGS + 3]; +} ir_target_constraints; #define IR_TMP_REG(_num, _type, _start, _end) \ (ir_tmp_reg){.num=(_num), .type=(_type), .start=(_start), .end=(_end)} @@ -1419,9 +1473,7 @@ void ir_fix_stack_frame(ir_ctx *ctx); /* Utility */ -ir_type ir_get_return_type(ir_ctx *ctx); -bool ir_is_fastcall(const ir_ctx *ctx, const ir_insn *insn); -bool ir_is_vararg(const ir_ctx *ctx, ir_insn *insn); +const ir_proto_t *ir_call_proto(const ir_ctx *ctx, const ir_insn *insn); //#define IR_BITSET_LIVENESS diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_ra.c php8.4-8.4.21/ext/opcache/jit/ir/ir_ra.c --- php8.4-8.4.16/ext/opcache/jit/ir/ir_ra.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_ra.c 2026-05-05 16:34:12.000000000 +0000 @@ -610,8 +610,8 @@ len = ir_bitset_len(ctx->vregs_count + 1); bb_live = ir_mem_malloc((ctx->cfg_blocks_count + 1) * len * sizeof(ir_bitset_base_t)); - /* vregs + tmp + fixed + SRATCH + ALL */ - ctx->live_intervals = ir_mem_calloc(ctx->vregs_count + 1 + IR_REG_NUM + 2, sizeof(ir_live_interval*)); + /* vregs + tmp + fixed + ALL + SCRATCH_N */ + ctx->live_intervals = ir_mem_calloc(ctx->vregs_count + 1 + IR_REG_SET_NUM, sizeof(ir_live_interval*)); #ifdef IR_DEBUG visited = ir_bitset_malloc(ctx->cfg_blocks_count + 1); @@ -776,9 +776,6 @@ if (insn->op == IR_PARAM) { /* We may reuse parameter stack slot for spilling */ ctx->live_intervals[v]->flags |= IR_LIVE_INTERVAL_MEM_PARAM; - } else if (insn->op == IR_VLOAD) { - /* Load may be fused into the usage instruction */ - ctx->live_intervals[v]->flags |= IR_LIVE_INTERVAL_MEM_LOAD; } def_pos = IR_DEF_LIVE_POS_FROM_REF(ref); } @@ -845,11 +842,17 @@ ival = ctx->live_intervals[v]; } ir_add_use(ctx, ival, j, use_pos, reg, IR_USE_FLAGS(def_flags, j), hint_ref); - } else if (ctx->rules) { - if (ctx->rules[input] & IR_FUSED) { - ir_add_fusion_ranges(ctx, ref, input, bb, live); - } else if (ctx->rules[input] == (IR_SKIPPED|IR_RLOAD)) { - ir_set_alocated_reg(ctx, ref, j, ctx->ir_base[input].op2); + } else { + if (ctx->rules) { + if ((ctx->rules[input] & (IR_FUSED|IR_SKIPPED)) == IR_FUSED) { + ir_add_fusion_ranges(ctx, ref, input, bb, live); + } else if (ctx->rules[input] == (IR_SKIPPED|IR_RLOAD)) { + ir_set_alocated_reg(ctx, ref, j, ctx->ir_base[input].op2); + } + } + if (reg != IR_REG_NONE) { + use_pos = IR_LOAD_LIVE_POS_FROM_REF(ref); + ir_add_fixed_live_range(ctx, reg, use_pos, use_pos + IR_USE_SUB_REF); } } } else if (reg != IR_REG_NONE) { @@ -1262,8 +1265,8 @@ /* Compute Live Ranges */ ctx->flags2 &= ~IR_LR_HAVE_DESSA_MOVES; - /* vregs + tmp + fixed + SRATCH + ALL */ - ctx->live_intervals = ir_mem_calloc(ctx->vregs_count + 1 + IR_REG_NUM + 2, sizeof(ir_live_interval*)); + /* vregs + tmp + fixed + ALL + SCRATCH_N */ + ctx->live_intervals = ir_mem_calloc(ctx->vregs_count + 1 + IR_REG_SET_NUM, sizeof(ir_live_interval*)); if (!ctx->arena) { ctx->arena = ir_arena_create(16 * 1024); @@ -1396,9 +1399,6 @@ if (insn->op == IR_PARAM) { /* We may reuse parameter stack slot for spilling */ ctx->live_intervals[v]->flags |= IR_LIVE_INTERVAL_MEM_PARAM; - } else if (insn->op == IR_VLOAD) { - /* Load may be fused into the usage instruction */ - ctx->live_intervals[v]->flags |= IR_LIVE_INTERVAL_MEM_LOAD; } def_pos = IR_DEF_LIVE_POS_FROM_REF(ref); } @@ -1465,17 +1465,17 @@ ival = ctx->live_intervals[v]; } ir_add_use(ctx, ival, j, use_pos, reg, IR_USE_FLAGS(def_flags, j), hint_ref); - } else if (ctx->rules) { - if (ctx->rules[input] & IR_FUSED) { - ir_add_fusion_ranges(ctx, ref, input, bb, live_in_block, b); - } else { - if (ctx->rules[input] == (IR_SKIPPED|IR_RLOAD)) { + } else { + if (ctx->rules) { + if ((ctx->rules[input] & (IR_FUSED|IR_SKIPPED)) == IR_FUSED) { + ir_add_fusion_ranges(ctx, ref, input, bb, live_in_block, b); + } else if (ctx->rules[input] == (IR_SKIPPED|IR_RLOAD)) { ir_set_alocated_reg(ctx, ref, j, ctx->ir_base[input].op2); } - if (reg != IR_REG_NONE) { - use_pos = IR_LOAD_LIVE_POS_FROM_REF(ref); - ir_add_fixed_live_range(ctx, reg, use_pos, use_pos + IR_USE_SUB_REF); - } + } + if (reg != IR_REG_NONE) { + use_pos = IR_LOAD_LIVE_POS_FROM_REF(ref); + ir_add_fixed_live_range(ctx, reg, use_pos, use_pos + IR_USE_SUB_REF); } } } else if (reg != IR_REG_NONE) { @@ -1605,7 +1605,7 @@ } while (*prev && ((*prev)->pos < use_pos->pos || ((*prev)->pos == use_pos->pos && - (use_pos->op_num == 0 || (*prev)->op_num < use_pos->op_num)))) { + (use_pos->op_num == 0 || ((*prev)->op_num != 0 && (*prev)->op_num < use_pos->op_num))))) { if ((*prev)->hint_ref > 0 && ctx->vregs[(*prev)->hint_ref] == r2) { (*prev)->hint_ref = 0; } @@ -1627,9 +1627,6 @@ ctx->live_intervals[r1]->flags |= IR_LIVE_INTERVAL_COALESCED | (ival->flags & (IR_LIVE_INTERVAL_HAS_HINT_REGS|IR_LIVE_INTERVAL_HAS_HINT_REFS)); - if (ctx->ir_base[IR_LIVE_POS_TO_REF(ctx->live_intervals[r1]->use_pos->pos)].op != IR_VLOAD) { - ctx->live_intervals[r1]->flags &= ~IR_LIVE_INTERVAL_MEM_LOAD; - } if (ival->flags & IR_LIVE_INTERVAL_MEM_PARAM) { IR_ASSERT(!(ctx->live_intervals[r1]->flags & IR_LIVE_INTERVAL_MEM_PARAM)); ctx->live_intervals[r1]->flags |= IR_LIVE_INTERVAL_MEM_PARAM; @@ -2040,8 +2037,8 @@ n--; if (n != ctx->vregs_count) { j = ctx->vregs_count - n; - /* vregs + tmp + fixed + SRATCH + ALL */ - for (i = n + 1; i <= n + IR_REG_NUM + 2; i++) { + /* vregs + tmp + fixed + ALL + SCRATCH_N */ + for (i = n + 1; i <= n + IR_REG_SET_NUM; i++) { ctx->live_intervals[i] = ctx->live_intervals[i + j]; if (ctx->live_intervals[i]) { ctx->live_intervals[i]->vreg = i; @@ -2108,7 +2105,7 @@ * 2009 International Symposium on Code Generation and Optimization, Seattle, WA, USA, 2009, * pp. 114-125, doi: 10.1109/CGO.2009.19. */ -int ir_gen_dessa_moves(ir_ctx *ctx, uint32_t b, emit_copy_t emit_copy) +int ir_gen_dessa_moves(ir_ctx *ctx, uint32_t b, emit_copy_t emit_copy, void *data) { uint32_t succ, k, n = 0; ir_block *bb, *succ_bb; @@ -2183,7 +2180,7 @@ while ((b = ir_bitset_pop_first(ready, len)) >= 0) { a = pred[b]; c = loc[a]; - emit_copy(ctx, ctx->ir_base[dst[b]].type, src[c], dst[b]); + emit_copy(ctx, ctx->ir_base[dst[b]].type, src[c], dst[b], data); ir_bitset_excl(todo, b); loc[a] = b; src[b] = dst[b]; @@ -2196,7 +2193,7 @@ break; } IR_ASSERT(b != loc[pred[b]]); - emit_copy(ctx, ctx->ir_base[src[b]].type, src[b], 0); + emit_copy(ctx, ctx->ir_base[src[b]].type, src[b], 0, data); loc[b] = 0; ir_bitset_incl(ready, b); } @@ -2214,7 +2211,7 @@ if (insn->op == IR_PHI) { input = ir_insn_op(insn, k); if (IR_IS_CONST_REF(input) || !ctx->vregs[input]) { - emit_copy(ctx, insn->type, input, ref); + emit_copy(ctx, insn->type, input, ref, data); } } } @@ -2343,16 +2340,6 @@ return p ? p->pos : 0x7fffffff; } -static ir_live_pos ir_first_use_pos(ir_live_interval *ival, uint8_t flags) -{ - ir_use_pos *p = ival->use_pos; - - while (p && !(p->flags & flags)) { - p = p->next; - } - return p ? p->pos : 0x7fffffff; -} - static ir_block *ir_block_from_live_pos(ir_ctx *ctx, ir_live_pos pos) { ir_ref ref = IR_LIVE_POS_TO_REF(pos); @@ -2514,8 +2501,9 @@ return child; } -static int32_t ir_allocate_small_spill_slot(ir_ctx *ctx, size_t size, ir_reg_alloc_data *data) +static int32_t ir_allocate_small_spill_slot(ir_ctx *ctx, size_t size) { + ir_reg_alloc_data *data = ctx->data; int32_t ret; IR_ASSERT(size == 0 || size == 1 || size == 2 || size == 4 || size == 8); @@ -2614,12 +2602,12 @@ return ret; } -int32_t ir_allocate_spill_slot(ir_ctx *ctx, ir_type type, ir_reg_alloc_data *data) +int32_t ir_allocate_spill_slot(ir_ctx *ctx, ir_type type) { - return ir_allocate_small_spill_slot(ctx, ir_type_size[type], data); + return ir_allocate_small_spill_slot(ctx, ir_type_size[type]); } -static int32_t ir_allocate_big_spill_slot(ir_ctx *ctx, int32_t size, ir_reg_alloc_data *data) +static int32_t ir_allocate_big_spill_slot(ir_ctx *ctx, int32_t size) { int32_t ret; @@ -2629,7 +2617,7 @@ } else if (size > 4 && size < 8) { size = 8; } - return ir_allocate_small_spill_slot(ctx, size, data); + return ir_allocate_small_spill_slot(ctx, size); } /* Align stack allocated data to 16 byte */ @@ -2849,13 +2837,8 @@ /* freeUntilPos[it.reg] = 0 */ reg = other->reg; IR_ASSERT(reg >= 0); - if (reg >= IR_REG_SCRATCH) { - if (reg == IR_REG_SCRATCH) { - available = IR_REGSET_DIFFERENCE(available, IR_REGSET_SCRATCH); - } else { - IR_ASSERT(reg == IR_REG_ALL); - available = IR_REGSET_EMPTY; - } + if (reg >= IR_REG_NUM) { + available = IR_REGSET_DIFFERENCE(available, ir_scratch_regset[reg - IR_REG_NUM]); } else { IR_REGSET_EXCL(available, reg); } @@ -2877,15 +2860,8 @@ if (next) { reg = other->reg; IR_ASSERT(reg >= 0); - if (reg >= IR_REG_SCRATCH) { - ir_regset regset; - - if (reg == IR_REG_SCRATCH) { - regset = IR_REGSET_INTERSECTION(available, IR_REGSET_SCRATCH); - } else { - IR_ASSERT(reg == IR_REG_ALL); - regset = available; - } + if (reg >= IR_REG_NUM) { + ir_regset regset = IR_REGSET_INTERSECTION(available, ir_scratch_regset[reg - IR_REG_NUM]); overlapped = IR_REGSET_UNION(overlapped, regset); IR_REGSET_FOREACH(regset, reg) { if (next < freeUntilPos[reg]) { @@ -2935,7 +2911,8 @@ } /* prefer caller-saved registers to avoid save/restore in prologue/epilogue */ - scratch = IR_REGSET_INTERSECTION(available, IR_REGSET_SCRATCH); + scratch = IR_REGSET_INTERSECTION(available, + ir_scratch_regset[((ir_reg_alloc_data*)(ctx->data))->cc->scratch_reg - IR_REG_NUM]); if (scratch != IR_REGSET_EMPTY) { /* prefer registers that don't conflict with the hints for the following unhandled intervals */ if (1) { @@ -2983,8 +2960,8 @@ pos = freeUntilPos[i]; reg = i; } else if (freeUntilPos[i] == pos - && !IR_REGSET_IN(IR_REGSET_SCRATCH, reg) - && IR_REGSET_IN(IR_REGSET_SCRATCH, i)) { + && !IR_REGSET_IN(ir_scratch_regset[((ir_reg_alloc_data*)(ctx->data))->cc->scratch_reg - IR_REG_NUM], reg) + && IR_REGSET_IN(ir_scratch_regset[((ir_reg_alloc_data*)(ctx->data))->cc->scratch_reg - IR_REG_NUM], i)) { /* prefer caller-saved registers to avoid save/restore in prologue/epilogue */ pos = freeUntilPos[i]; reg = i; @@ -3090,15 +3067,8 @@ /* nextUsePos[it.reg] = next use of it after start of current */ reg = other->reg; IR_ASSERT(reg >= 0); - if (reg >= IR_REG_SCRATCH) { - ir_regset regset; - - if (reg == IR_REG_SCRATCH) { - regset = IR_REGSET_INTERSECTION(available, IR_REGSET_SCRATCH); - } else { - IR_ASSERT(reg == IR_REG_ALL); - regset = available; - } + if (reg >= IR_REG_NUM) { + ir_regset regset = IR_REGSET_INTERSECTION(available, ir_scratch_regset[reg - IR_REG_NUM]); IR_REGSET_FOREACH(regset, reg) { blockPos[reg] = nextUsePos[reg] = 0; } IR_REGSET_FOREACH_END(); @@ -3122,18 +3092,11 @@ /* freeUntilPos[it.reg] = next intersection of it with current */ reg = other->reg; IR_ASSERT(reg >= 0); - if (reg >= IR_REG_SCRATCH) { + if (reg >= IR_REG_NUM) { ir_live_pos overlap = ir_ivals_overlap(&ival->range, other->current_range); if (overlap) { - ir_regset regset; - - if (reg == IR_REG_SCRATCH) { - regset = IR_REGSET_INTERSECTION(available, IR_REGSET_SCRATCH); - } else { - IR_ASSERT(reg == IR_REG_ALL); - regset = available; - } + ir_regset regset = IR_REGSET_INTERSECTION(available, ir_scratch_regset[reg - IR_REG_NUM]); IR_REGSET_FOREACH(regset, reg) { if (overlap < nextUsePos[reg]) { nextUsePos[reg] = overlap; @@ -3194,7 +3157,6 @@ /* split current before its first use position that requires a register */ ir_live_pos split_pos; -spill_current: if (next_use_pos == ival->range.start) { IR_ASSERT(ival->use_pos && ival->use_pos->op_num == 0); /* split right after definition */ @@ -3261,48 +3223,33 @@ IR_LOG_LSRA_CONFLICT(" ---- Conflict with active", other, overlap); split_pos = ir_last_use_pos_before(other, ival->range.start, IR_USE_MUST_BE_IN_REG | IR_USE_SHOULD_BE_IN_REG); - if (split_pos == 0) { - split_pos = ival->range.start; - } - split_pos = ir_find_optimal_split_position(ctx, other, split_pos, ival->range.start, 1); - if (split_pos > other->range.start) { - child = ir_split_interval_at(ctx, other, split_pos); - if (prev) { - prev->list_next = other->list_next; - } else { - *active = other->list_next; - } - IR_LOG_LSRA(" ---- Finish", other, ""); - } else { - if (ir_first_use_pos(other, IR_USE_MUST_BE_IN_REG) <= other->end) { - if (!(ival->flags & IR_LIVE_INTERVAL_TEMP)) { - next_use_pos = ir_first_use_pos(ival, IR_USE_MUST_BE_IN_REG); - if (next_use_pos == ival->range.start) { - IR_ASSERT(ival->use_pos && ival->use_pos->op_num == 0); - /* split right after definition */ - split_pos = next_use_pos + 1; - } else { - split_pos = ir_find_optimal_split_position(ctx, ival, ival->range.start, next_use_pos - 1, 1); - } - - if (split_pos > ival->range.start) { - goto spill_current; - } + if (split_pos) { + split_pos = ir_find_optimal_split_position(ctx, other, split_pos, ival->range.start, 1); + if (split_pos > other->range.start) { + child = ir_split_interval_at(ctx, other, split_pos); + if (prev) { + prev->list_next = other->list_next; + } else { + *active = other->list_next; } + IR_LOG_LSRA(" ---- Finish", other, ""); + } else { goto try_next_available_register; } + } else { child = other; - other->reg = IR_REG_NONE; - if (prev) { - prev->list_next = other->list_next; - } else { - *active = other->list_next; - } - IR_LOG_LSRA(" ---- Spill and Finish", other, " (it must not be in reg)"); } split_pos = ir_first_use_pos_after(child, ival->range.start, IR_USE_MUST_BE_IN_REG | IR_USE_SHOULD_BE_IN_REG) - 1; // TODO: ??? if (split_pos > child->range.start && split_pos < child->end) { + if (child == other) { + other->reg = IR_REG_NONE; + if (prev) { + prev->list_next = other->list_next; + } else { + *active = other->list_next; + } + } ir_live_pos opt_split_pos = ir_find_optimal_split_position(ctx, child, ival->range.start, split_pos, 1); if (opt_split_pos > child->range.start) { split_pos = opt_split_pos; @@ -3315,6 +3262,8 @@ // TODO: this may cause endless loop ir_add_to_unhandled(unhandled, child); IR_LOG_LSRA(" ---- Queue", child, ""); + } else { + goto try_next_available_register; } } break; @@ -3357,9 +3306,9 @@ return reg; } -static int ir_fix_dessa_tmps(ir_ctx *ctx, uint8_t type, ir_ref from, ir_ref to) +static int ir_fix_dessa_tmps(ir_ctx *ctx, uint8_t type, ir_ref from, ir_ref to, void *data) { - ir_block *bb = ctx->data; + ir_block *bb = data; ir_tmp_reg tmp_reg; if (to == 0) { @@ -3397,15 +3346,16 @@ return 1; } -static bool ir_ival_spill_for_fuse_load(ir_ctx *ctx, ir_live_interval *ival, ir_reg_alloc_data *data) +static bool ir_ival_spill_for_fuse_load(ir_ctx *ctx, ir_live_interval *ival) { ir_use_pos *use_pos = ival->use_pos; - ir_insn *insn; if (ival->flags & IR_LIVE_INTERVAL_MEM_PARAM) { IR_ASSERT(!ival->next && use_pos && use_pos->op_num == 0); - insn = &ctx->ir_base[IR_LIVE_POS_TO_REF(use_pos->pos)]; +#if IR_DEBUG + ir_insn *insn = &ctx->ir_base[IR_LIVE_POS_TO_REF(use_pos->pos)]; IR_ASSERT(insn->op == IR_PARAM); +#endif use_pos = use_pos->next; if (use_pos && (use_pos->next || (use_pos->flags & IR_USE_MUST_BE_IN_REG))) { return 0; @@ -3419,38 +3369,6 @@ } return 1; - } else if (ival->flags & IR_LIVE_INTERVAL_MEM_LOAD) { - insn = &ctx->ir_base[IR_LIVE_POS_TO_REF(use_pos->pos)]; - IR_ASSERT(insn->op == IR_VLOAD); - IR_ASSERT(ctx->ir_base[insn->op2].op == IR_VAR); - use_pos = use_pos->next; - if (use_pos && (use_pos->next || (use_pos->flags & IR_USE_MUST_BE_IN_REG))) { - return 0; - } - - if (use_pos) { - ir_block *bb = ir_block_from_live_pos(ctx, use_pos->pos); - if (bb->loop_depth && bb != ir_block_from_live_pos(ctx, ival->use_pos->pos)) { - return 0; - } - /* check if VAR may be clobbered between VLOAD and use */ - ir_use_list *use_list = &ctx->use_lists[insn->op2]; - ir_ref n = use_list->count; - ir_ref *p = &ctx->use_edges[use_list->refs]; - for (; n > 0; p++, n--) { - ir_ref use = *p; - if (ctx->ir_base[use].op == IR_VSTORE) { - if (use > IR_LIVE_POS_TO_REF(ival->use_pos->pos) && use < IR_LIVE_POS_TO_REF(use_pos->pos)) { - return 0; - } - } else if (ctx->ir_base[use].op == IR_VADDR) { - return 0; - } - } - } - ival->stack_spill_pos = ctx->ir_base[insn->op2].op3; - - return 1; } return 0; } @@ -3480,7 +3398,7 @@ } } -static int ir_linear_scan(ir_ctx *ctx) +static int ir_linear_scan(ir_ctx *ctx, ir_ref vars) { uint32_t b; ir_block *bb; @@ -3491,8 +3409,6 @@ int j; ir_live_pos position; ir_reg reg; - ir_reg_alloc_data data; - ir_ref vars = ctx->vars; if (!ctx->live_intervals) { return 0; @@ -3503,19 +3419,11 @@ for (b = 1, bb = &ctx->cfg_blocks[1]; b <= ctx->cfg_blocks_count; b++, bb++) { IR_ASSERT(!(bb->flags & IR_BB_UNREACHABLE)); if (bb->flags & IR_BB_DESSA_MOVES) { - ctx->data = bb; - ir_gen_dessa_moves(ctx, b, ir_fix_dessa_tmps); + ir_gen_dessa_moves(ctx, b, ir_fix_dessa_tmps, bb); } } } - ctx->data = &data; - ctx->stack_frame_size = 0; - data.unused_slot_4 = 0; - data.unused_slot_2 = 0; - data.unused_slot_1 = 0; - data.handled = NULL; - while (vars) { ir_ref var = vars; ir_insn *insn = &ctx->ir_base[var]; @@ -3524,7 +3432,7 @@ vars = insn->op3; /* list next */ if (insn->op == IR_VAR) { - ir_ref slot = ir_allocate_spill_slot(ctx, insn->type, &data);; + ir_ref slot = ir_allocate_spill_slot(ctx, insn->type); ir_use_list *use_list; ir_ref n, *p; @@ -3547,15 +3455,15 @@ IR_ASSERT(IR_IS_TYPE_UNSIGNED(val->type) || val->val.i64 >= 0); IR_ASSERT(val->val.i64 < 0x7fffffff); - insn->op3 = ir_allocate_big_spill_slot(ctx, val->val.i32, &data); + insn->op3 = ir_allocate_big_spill_slot(ctx, val->val.i32); } } for (j = ctx->vregs_count; j != 0; j--) { ival = ctx->live_intervals[j]; if (ival) { - if (!(ival->flags & (IR_LIVE_INTERVAL_MEM_PARAM|IR_LIVE_INTERVAL_MEM_LOAD)) - || !ir_ival_spill_for_fuse_load(ctx, ival, &data)) { + if (!(ival->flags & IR_LIVE_INTERVAL_MEM_PARAM) + || !ir_ival_spill_for_fuse_load(ctx, ival)) { ir_add_to_unhandled(&unhandled, ival); } } @@ -3566,8 +3474,8 @@ ir_merge_to_unhandled(&unhandled, ival); } - /* vregs + tmp + fixed + SRATCH + ALL */ - for (j = ctx->vregs_count + 1; j <= ctx->vregs_count + IR_REG_NUM + 2; j++) { + /* vregs + tmp + fixed + ALL + SCRATCH_N */ + for (j = ctx->vregs_count + 1; j <= ctx->vregs_count + IR_REG_SET_NUM; j++) { ival = ctx->live_intervals[j]; if (ival) { ival->current_range = &ival->range; @@ -3726,7 +3634,7 @@ ir_live_interval *handled[9] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; ir_live_interval *old; - data.handled = handled; + ((ir_reg_alloc_data*)(ctx->data))->handled = handled; active = NULL; while (unhandled) { ival = unhandled; @@ -3764,7 +3672,7 @@ other = prev ? prev->list_next : active; } - ival->stack_spill_pos = ir_allocate_spill_slot(ctx, ival->type, &data); + ival->stack_spill_pos = ir_allocate_spill_slot(ctx, ival->type); if (unhandled && ival->end > unhandled->range.start) { ival->list_next = active; active = ival; @@ -3784,15 +3692,16 @@ } } } - data.handled = NULL; + ((ir_reg_alloc_data*)(ctx->data))->handled = NULL; } } #ifdef IR_TARGET_X86 if (ctx->flags2 & IR_HAS_FP_RET_SLOT) { - ctx->ret_slot = ir_allocate_spill_slot(ctx, IR_DOUBLE, &data); - } else if (ctx->ret_type == IR_FLOAT || ctx->ret_type == IR_DOUBLE) { - ctx->ret_slot = ir_allocate_spill_slot(ctx, ctx->ret_type, &data); + ctx->ret_slot = ir_allocate_spill_slot(ctx, IR_DOUBLE); + } else if ((ctx->ret_type == IR_FLOAT || ctx->ret_type == IR_DOUBLE) + && ((ir_reg_alloc_data*)(ctx->data))->cc->fp_ret_reg == IR_REG_NONE) { + ctx->ret_slot = ir_allocate_spill_slot(ctx, ctx->ret_type); } else { ctx->ret_slot = -1; } @@ -3857,14 +3766,13 @@ { char key[10]; - IR_ASSERT(reg != IR_REG_NONE); if (!ctx->fused_regs) { ctx->fused_regs = ir_mem_malloc(sizeof(ir_strtab)); ir_strtab_init(ctx->fused_regs, 8, 128); } memcpy(key, &root, sizeof(ir_ref)); memcpy(key + 4, &ref_and_op, sizeof(ir_ref)); - ir_strtab_lookup(ctx->fused_regs, key, 8, 0x10000000 | reg); + ir_strtab_lookup(ctx->fused_regs, key, 8, 0x10000000 | (uint8_t)reg); } static void assign_regs(ir_ctx *ctx) @@ -3970,93 +3878,88 @@ } prev_use_ref = ref; } - } else if ((!prev_use_ref || ctx->cfg_map[prev_use_ref] != ctx->cfg_map[ref]) - && needs_spill_reload(ctx, ival, ctx->cfg_map[ref], available)) { - if (!(use_pos->flags & IR_USE_MUST_BE_IN_REG) - && use_pos->hint != reg -// && ctx->ir_base[ref].op != IR_CALL -// && ctx->ir_base[ref].op != IR_TAILCALL) { - && ctx->ir_base[ref].op != IR_SNAPSHOT - && !needs_spill_load(ctx, ival, use_pos)) { - /* fuse spill load (valid only when register is not reused) */ - reg = IR_REG_NONE; - if (use_pos->next - && use_pos->op_num == 1 - && use_pos->next->pos == use_pos->pos - && !(use_pos->next->flags & IR_USE_MUST_BE_IN_REG)) { - /* Support for R2 = BINOP(R1, R1) */ - if (use_pos->hint_ref < 0) { - ref = -use_pos->hint_ref; + } else { + if ((!prev_use_ref || ctx->cfg_map[prev_use_ref] != ctx->cfg_map[ref]) + && needs_spill_reload(ctx, ival, ctx->cfg_map[ref], available)) { + if (!(use_pos->flags & IR_USE_MUST_BE_IN_REG) + && use_pos->hint != reg +// && ctx->ir_base[ref].op != IR_CALL +// && ctx->ir_base[ref].op != IR_TAILCALL) { + && ctx->ir_base[ref].op != IR_SNAPSHOT + && !needs_spill_load(ctx, ival, use_pos)) { + /* fuse spill load (valid only when register is not reused) */ + reg = IR_REG_NONE; + if (use_pos->next + && use_pos->op_num == 1 + && use_pos->next->pos == use_pos->pos + && !(use_pos->next->flags & IR_USE_MUST_BE_IN_REG)) { + /* Support for R2 = BINOP(R1, R1) */ + if (use_pos->hint_ref < 0) { + ref = -use_pos->hint_ref; + } + ir_set_alocated_reg(ctx, ref, use_pos->op_num, reg); + use_pos = use_pos->next; } - ir_set_alocated_reg(ctx, ref, use_pos->op_num, reg); - use_pos = use_pos->next; - } - } else { - if (top_ival->flags & IR_LIVE_INTERVAL_SPILL_SPECIAL) { - reg |= IR_REG_SPILL_SPECIAL; } else { - reg |= IR_REG_SPILL_LOAD; - } - if (ctx->ir_base[ref].op != IR_SNAPSHOT && !(use_pos->flags & IR_PHI_USE)) { - uint32_t use_b = ctx->cfg_map[ref]; + if (top_ival->flags & IR_LIVE_INTERVAL_SPILL_SPECIAL) { + reg |= IR_REG_SPILL_SPECIAL; + } else { + reg |= IR_REG_SPILL_LOAD; + } + if (ctx->ir_base[ref].op != IR_SNAPSHOT && !(use_pos->flags & IR_PHI_USE)) { + uint32_t use_b = ctx->cfg_map[ref]; - if (ir_ival_covers(ival, IR_SAVE_LIVE_POS_FROM_REF(ctx->cfg_blocks[use_b].end))) { - ir_bitset_incl(available, use_b); + if (ir_ival_covers(ival, IR_SAVE_LIVE_POS_FROM_REF(ctx->cfg_blocks[use_b].end))) { + ir_bitset_incl(available, use_b); + } + prev_use_ref = ref; } - prev_use_ref = ref; } + } else { + /* reuse register without spill load */ } - if (use_pos->hint_ref < 0 - && (old_reg = ir_get_alocated_reg(ctx, -use_pos->hint_ref, use_pos->op_num)) != IR_REG_NONE) { - if (top_ival->flags & IR_LIVE_INTERVAL_SPILL_SPECIAL) { - reg |= IR_REG_SPILL_SPECIAL; + + if (use_pos->hint_ref < 0) { + if (use_pos->flags & IR_PHI_USE) { + IR_ASSERT(use_pos->hint_ref < 0); + IR_ASSERT(ctx->vregs[-use_pos->hint_ref]); + IR_ASSERT(ctx->live_intervals[ctx->vregs[-use_pos->hint_ref]]); + if (ctx->live_intervals[ctx->vregs[-use_pos->hint_ref]]->flags & IR_LIVE_INTERVAL_SPILLED) { + /* Spilled PHI var is passed through memory */ + reg = IR_REG_NONE; + } } else { - reg |= IR_REG_SPILL_LOAD; - } - if (reg != old_reg) { IR_ASSERT(ctx->rules[-use_pos->hint_ref] & IR_FUSED); - ctx->rules[-use_pos->hint_ref] |= IR_FUSED_REG; - ir_set_fused_reg(ctx, ref, -use_pos->hint_ref * sizeof(ir_ref) + use_pos->op_num, reg); - use_pos = use_pos->next; - continue; + old_reg = ir_get_alocated_reg(ctx, -use_pos->hint_ref, use_pos->op_num); + if ((old_reg != IR_REG_NONE && reg != old_reg) || reg == IR_REG_NONE) { + ctx->rules[-use_pos->hint_ref] |= IR_FUSED_REG; + ir_set_fused_reg(ctx, ref, -use_pos->hint_ref * sizeof(ir_ref) + use_pos->op_num, reg); + use_pos = use_pos->next; + continue; + } } + ref = -use_pos->hint_ref; } - } else if (use_pos->flags & IR_PHI_USE) { - IR_ASSERT(use_pos->hint_ref < 0); - IR_ASSERT(ctx->vregs[-use_pos->hint_ref]); - IR_ASSERT(ctx->live_intervals[ctx->vregs[-use_pos->hint_ref]]); - if (ctx->live_intervals[ctx->vregs[-use_pos->hint_ref]]->flags & IR_LIVE_INTERVAL_SPILLED) { - /* Spilled PHI var is passed through memory */ - reg = IR_REG_NONE; - } - } else if (use_pos->hint_ref < 0 - && (old_reg = ir_get_alocated_reg(ctx, -use_pos->hint_ref, use_pos->op_num)) != IR_REG_NONE) { - if (reg != old_reg) { - IR_ASSERT(ctx->rules[-use_pos->hint_ref] & IR_FUSED); - ctx->rules[-use_pos->hint_ref] |= IR_FUSED_REG; - ir_set_fused_reg(ctx, ref, -use_pos->hint_ref * sizeof(ir_ref) + use_pos->op_num, reg); - use_pos = use_pos->next; - continue; - } - } else { - /* reuse register without spill load */ - } - if (use_pos->hint_ref < 0) { - ref = -use_pos->hint_ref; } + ir_set_alocated_reg(ctx, ref, use_pos->op_num, reg); use_pos = use_pos->next; } - } else if (!(top_ival->flags & IR_LIVE_INTERVAL_SPILL_SPECIAL)) { + } else { use_pos = ival->use_pos; while (use_pos) { ref = IR_LIVE_POS_TO_REF(use_pos->pos); - if (ctx->ir_base[ref].op == IR_SNAPSHOT) { + if (ctx->ir_base[ref].op == IR_SNAPSHOT + && !(top_ival->flags & IR_LIVE_INTERVAL_SPILL_SPECIAL)) { IR_ASSERT(use_pos->hint_ref >= 0); /* A reference to a CPU spill slot */ reg = IR_REG_SPILL_STORE | IR_REG_STACK_POINTER; ir_set_alocated_reg(ctx, ref, use_pos->op_num, reg); + } else if (use_pos->hint_ref < 0 && !(use_pos->flags & IR_PHI_USE)) { + IR_ASSERT(ctx->rules[-use_pos->hint_ref] & IR_FUSED); + ctx->rules[-use_pos->hint_ref] |= IR_FUSED_REG; + ir_set_fused_reg(ctx, ref, -use_pos->hint_ref * sizeof(ir_ref) + use_pos->op_num, IR_REG_NONE); } use_pos = use_pos->next; } @@ -4096,17 +3999,18 @@ } while (ival); } + const ir_call_conv_dsc *cc = ((ir_reg_alloc_data*)(ctx->data))->cc; if (ctx->fixed_stack_frame_size != -1) { ctx->used_preserved_regs = (ir_regset)ctx->fixed_save_regset; - if (IR_REGSET_DIFFERENCE(IR_REGSET_INTERSECTION(used_regs, IR_REGSET_PRESERVED), + if (IR_REGSET_DIFFERENCE(IR_REGSET_INTERSECTION(used_regs, cc->preserved_regs), ctx->used_preserved_regs)) { // TODO: Preserved reg and fixed frame conflict ??? // IR_ASSERT(0 && "Preserved reg and fixed frame conflict"); } } else { ctx->used_preserved_regs = IR_REGSET_UNION((ir_regset)ctx->fixed_save_regset, - IR_REGSET_DIFFERENCE(IR_REGSET_INTERSECTION(used_regs, IR_REGSET_PRESERVED), - (ctx->flags & IR_FUNCTION) ? (ir_regset)ctx->fixed_regset : IR_REGSET_PRESERVED)); + IR_REGSET_DIFFERENCE(IR_REGSET_INTERSECTION(used_regs, cc->preserved_regs), + (ctx->flags & IR_FUNCTION) ? (ir_regset)ctx->fixed_regset : cc->preserved_regs)); } ir_fix_stack_frame(ctx); @@ -4114,9 +4018,24 @@ int ir_reg_alloc(ir_ctx *ctx) { - if (ir_linear_scan(ctx)) { + ir_reg_alloc_data data; + ir_ref vars = ctx->vars; + + data.cc = ir_get_call_conv_dsc(ctx->flags); + data.unused_slot_4 = 0; + data.unused_slot_2 = 0; + data.unused_slot_1 = 0; + data.handled = NULL; + + ctx->data = &data; + ctx->stack_frame_size = 0; + + if (ir_linear_scan(ctx, vars)) { assign_regs(ctx); + ctx->data = NULL; return 1; } + + ctx->data = NULL; return 0; } diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_save.c php8.4-8.4.21/ext/opcache/jit/ir/ir_save.c --- php8.4-8.4.16/ext/opcache/jit/ir/ir_save.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_save.c 2026-05-05 16:34:12.000000000 +0000 @@ -18,6 +18,38 @@ } } +static void ir_print_call_conv(uint32_t flags, FILE *f) +{ + switch (flags & IR_CALL_CONV_MASK) { + case IR_CC_BUILTIN: + fprintf(f, " __builtin"); + break; + case IR_CC_FASTCALL: + fprintf(f, " __fastcall"); + break; + case IR_CC_PRESERVE_NONE: + fprintf(f, " __preserve_none"); + break; +#if defined(IR_TARGET_X64) + case IR_CC_X86_64_SYSV: + fprintf(f, " __sysv"); + break; + case IR_CC_X86_64_MS: + fprintf(f, " __win64"); + break; +#elif defined(IR_TARGET_AARCH64) + case IR_CC_AARCH64_SYSV: + fprintf(f, " __sysv"); + break; + case IR_CC_AARCH64_DARWIN: + fprintf(f, " __darwin"); + break; +#endif + default: + IR_ASSERT((flags & IR_CALL_CONV_MASK) == IR_CC_DEFAULT); + } +} + void ir_print_proto_ex(uint8_t flags, ir_type ret_type, uint32_t params_count, const uint8_t *param_types, FILE *f) { uint32_t j; @@ -35,10 +67,43 @@ fprintf(f, "..."); } fprintf(f, "): %s", ir_type_cname[ret_type]); - if (flags & IR_FASTCALL_FUNC) { - fprintf(f, " __fastcall"); - } else if (flags & IR_BUILTIN_FUNC) { - fprintf(f, " __builtin"); + ir_print_call_conv(flags, f); + if (flags & IR_CONST_FUNC) { + fprintf(f, " __const"); + } else if (flags & IR_PURE_FUNC) { + fprintf(f, " __pure"); + } +} + +void ir_print_func_proto(const ir_ctx *ctx, const char *name, bool prefix, FILE *f) +{ + if (ctx->flags & IR_STATIC) { + fprintf(f, "static "); + } + fprintf(f, "func %s%s(", + prefix ? "@" : "", + name); + if (ctx->ir_base[2].op == IR_PARAM) { + ir_insn *insn = &ctx->ir_base[2]; + + fprintf(f, "%s", ir_type_cname[insn->type]); + insn++; + while (insn->op == IR_PARAM) { + fprintf(f, ", %s", ir_type_cname[insn->type]); + insn++;; + } + if (ctx->flags & IR_VARARG_FUNC) { + fprintf(f, ", ..."); + } + } else if (ctx->flags & IR_VARARG_FUNC) { + fprintf(f, "..."); + } + fprintf(f, "): %s", ir_type_cname[ctx->ret_type != (ir_type)-1 ? ctx->ret_type : IR_VOID]); + ir_print_call_conv(ctx->flags, f); + if (ctx->flags & IR_CONST_FUNC) { + fprintf(f, " __const"); + } else if (ctx->flags & IR_PURE_FUNC) { + fprintf(f, " __pure"); } } @@ -109,6 +174,10 @@ fprintf(f, "sym(%s%s)", (save_flags & IR_SAVE_SAFE_NAMES) ? "@" : "", ir_get_str(ctx, insn->val.name)); + } else if (insn->op == IR_LABEL) { + fprintf(f, "label(%s%s)", + (save_flags & IR_SAVE_SAFE_NAMES) ? "@" : "", + ir_get_str(ctx, insn->val.name)); } else if (insn->op == IR_FUNC_ADDR) { fprintf(f, "func *"); ir_print_const(ctx, insn, f, true); @@ -272,6 +341,13 @@ fprintf(f, "%s%d", first ? "(" : ", ", ref); first = 0; break; + case IR_OPND_LABEL_REF: + if (ref) { + IR_ASSERT(IR_IS_CONST_REF(ref)); + fprintf(f, "%sc_%d", first ? "(" : ", ", -ref); + first = 0; + } + break; } } else if (opnd_kind == IR_OPND_NUM) { fprintf(f, "%s%d", first ? "(" : ", ", ref); diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_sccp.c php8.4-8.4.21/ext/opcache/jit/ir/ir_sccp.c --- php8.4-8.4.16/ext/opcache/jit/ir/ir_sccp.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_sccp.c 2026-05-05 16:34:12.000000000 +0000 @@ -19,7 +19,6 @@ #define IR_TOP IR_UNUSED #define IR_BOTTOM IR_LAST_OP -#define IR_MAKE_TOP(ref) do {IR_ASSERT(ref > 0); _values[ref].optx = IR_TOP;} while (0) #define IR_MAKE_BOTTOM(ref) do {IR_ASSERT(ref > 0); _values[ref].optx = IR_BOTTOM;} while (0) #define IR_IS_TOP(ref) (ref >= 0 && _values[ref].op == IR_TOP) @@ -27,17 +26,57 @@ #define IR_IS_REACHABLE(ref) _ir_is_reachable_ctrl(ctx, _values, ref) #define IR_IS_CONST(ref) (IR_IS_CONST_REF(ref) || IR_IS_CONST_OP(_values[ref].op)) -IR_ALWAYS_INLINE bool _ir_is_reachable_ctrl(ir_ctx *ctx, ir_insn *_values, ir_ref ref) +typedef struct { + union { + struct { + IR_STRUCT_LOHI( + union { + IR_STRUCT_LOHI( + union { + IR_STRUCT_LOHI( + uint8_t op, /* [IR_TOP - unreachable, IR_BOTTOM - reachable} for control */ + /* {IR_TOP | IR_COPY() | IR_CONST() | IR_BOTTOM} for data */ + /* {IR_TOP | IR_MERGE() | IR_BOTTOM} for IR_MERGE */ + /* {IR_TOP | IR_IF() | IR_BOTTOM} for IR_IF and IR_SWITCH */ + uint8_t type + ); + uint16_t opt; + }, + uint16_t _space_1 + ); + uint32_t optx; + }, + union { + ir_ref copy; /* identity for IR_COPY */ + ir_ref unfeasible_inputs; /* number of unfeasible inputs for IR_MERGE */ + ir_ref single_output; /* reachable output for IR_IF */ + ir_ref visited; /* for IR_TOP */ + } + ); + union { + struct { + ir_ref next; /* double-linked identities list for IR_COPY */ + ir_ref prev; /* double-linked identities list for IR_COPY */ + }; + ir_val val; /* constant value for IR_CONST */ + }; + }; + ir_insn insn; /* constant insn for IR_CONST */ + }; +} ir_sccp_val; + +IR_ALWAYS_INLINE bool _ir_is_reachable_ctrl(const ir_ctx *ctx, const ir_sccp_val *_values, ir_ref ref) { IR_ASSERT(!IR_IS_CONST_REF(ref)); IR_ASSERT(ir_op_flags[ctx->ir_base[ref].op] & IR_OP_FLAG_CONTROL); return _values[ref].op != IR_TOP; /* BOTTOM, IF or MERGE */ } -IR_ALWAYS_INLINE void ir_sccp_add_uses(ir_ctx *ctx, ir_insn *_values, ir_bitqueue *worklist, ir_ref ref) +IR_ALWAYS_INLINE void ir_sccp_add_uses(const ir_ctx *ctx, const ir_sccp_val *_values, ir_bitqueue *worklist, ir_ref ref) { - ir_use_list *use_list; - ir_ref n, *p, use; + const ir_use_list *use_list; + const ir_ref *p; + ir_ref n, use; IR_ASSERT(!IR_IS_CONST_REF(ref)); use_list = &ctx->use_lists[ref]; @@ -50,23 +89,23 @@ } } -IR_ALWAYS_INLINE void ir_sccp_add_input(ir_ctx *ctx, ir_insn *_values, ir_bitqueue *worklist, ir_ref ref) +IR_ALWAYS_INLINE void ir_sccp_add_input(const ir_ctx *ctx, ir_sccp_val *_values, ir_bitqueue *worklist, ir_ref ref) { IR_ASSERT(!IR_IS_CONST_REF(ref)); IR_ASSERT(_values[ref].op == IR_TOP); /* do backward propagaton only once */ - if (!_values[ref].op1) { - _values[ref].op1 = 1; + if (!_values[ref].visited) { + _values[ref].visited = 1; ir_bitqueue_add(worklist, ref); } } #if IR_COMBO_COPY_PROPAGATION -IR_ALWAYS_INLINE ir_ref ir_sccp_identity(ir_ctx *ctx, ir_insn *_values, ir_ref a) +IR_ALWAYS_INLINE ir_ref ir_sccp_identity(const ir_ctx *ctx, const ir_sccp_val *_values, ir_ref a) { if (a > 0 && _values[a].op == IR_COPY) { do { - a = _values[a].op1; + a = _values[a].copy; IR_ASSERT(a > 0); } while (_values[a].op == IR_COPY); IR_ASSERT(_values[a].op == IR_BOTTOM); @@ -75,7 +114,7 @@ } #if 0 -static void CHECK_LIST(ir_insn *_values, ir_ref ref) +static void CHECK_LIST(ir_sccp_val *_values, ir_ref ref) { ir_ref member = _values[ref].op2; while (member != ref) { @@ -88,44 +127,44 @@ # define CHECK_LIST(_values, ref) #endif -static void ir_sccp_add_identity(ir_ctx *ctx, ir_insn *_values, ir_ref src, ir_ref dst) +static void ir_sccp_add_identity(const ir_ctx *ctx, ir_sccp_val *_values, ir_ref src, ir_ref dst) { IR_ASSERT(dst > 0 && _values[dst].op != IR_BOTTOM && _values[dst].op != IR_COPY); IR_ASSERT((src > 0 && (_values[src].op == IR_BOTTOM || _values[src].op == IR_COPY))); IR_ASSERT(ir_sccp_identity(ctx, _values, src) != dst); _values[dst].optx = IR_COPY; - _values[dst].op1 = src; + _values[dst].copy = src; if (_values[src].op == IR_BOTTOM) { /* initialize empty double-linked list */ - if (_values[src].op1 != src) { - _values[src].op1 = src; - _values[src].op2 = src; - _values[src].op3 = src; + if (_values[src].copy != src) { + _values[src].copy = src; + _values[src].next = src; + _values[src].prev = src; } } else { src = ir_sccp_identity(ctx, _values, src); } /* insert into circular double-linked list */ - ir_ref prev = _values[src].op3; - _values[dst].op2 = src; - _values[dst].op3 = prev; - _values[src].op3 = dst; - _values[prev].op2 = dst; + ir_ref prev = _values[src].prev; + _values[dst].next = src; + _values[dst].prev = prev; + _values[src].prev = dst; + _values[prev].next = dst; CHECK_LIST(_values, dst); } -static void ir_sccp_split_partition(ir_ctx *ctx, ir_insn *_values, ir_bitqueue *worklist, ir_ref ref) +static void ir_sccp_split_partition(const ir_ctx *ctx, ir_sccp_val *_values, ir_bitqueue *worklist, ir_ref ref) { ir_ref member, head, tail, next, prev; CHECK_LIST(_values, ref); IR_MAKE_BOTTOM(ref); - _values[ref].op1 = ref; + _values[ref].copy = ref; - member = _values[ref].op2; + member = _values[ref].next; head = tail = IR_UNUSED; while (member != ref) { if (_values[member].op != IR_BOTTOM) { @@ -133,19 +172,19 @@ } ir_sccp_add_uses(ctx, _values, worklist, member); - next = _values[member].op2; + next = _values[member].next; if (ir_sccp_identity(ctx, _values, member) == ref) { /* remove "member" from the old circular double-linked list */ - prev = _values[member].op3; - _values[prev].op2 = next; - _values[next].op3 = prev; + prev = _values[member].prev; + _values[prev].next = next; + _values[next].prev = prev; /* insert "member" into the new double-linked list */ if (!head) { head = tail = member; } else { - _values[tail].op2 = member; - _values[member].op3 = tail; + _values[tail].next = member; + _values[member].prev = tail; tail = member; } } @@ -153,26 +192,26 @@ } /* remove "ref" from the old circular double-linked list */ - next = _values[ref].op2; - prev = _values[ref].op3; - _values[prev].op2 = next; - _values[next].op3 = prev; + next = _values[ref].next; + prev = _values[ref].prev; + _values[prev].next = next; + _values[next].prev = prev; CHECK_LIST(_values, next); /* close the new circle */ if (head) { - _values[ref].op2 = head; - _values[ref].op3 = tail; - _values[tail].op2 = ref; - _values[head].op3 = ref; + _values[ref].next = head; + _values[ref].prev = tail; + _values[tail].next = ref; + _values[head].prev = ref; } else { - _values[ref].op2 = ref; - _values[ref].op3 = ref; + _values[ref].next = ref; + _values[ref].prev = ref; } CHECK_LIST(_values, ref); } -IR_ALWAYS_INLINE void ir_sccp_make_bottom_ex(ir_ctx *ctx, ir_insn *_values, ir_bitqueue *worklist, ir_ref ref) +IR_ALWAYS_INLINE void ir_sccp_make_bottom_ex(const ir_ctx *ctx, ir_sccp_val *_values, ir_bitqueue *worklist, ir_ref ref) { if (_values[ref].op == IR_COPY) { ir_sccp_split_partition(ctx, _values, worklist, ref); @@ -187,7 +226,7 @@ # define IR_MAKE_BOTTOM_EX(ref) IR_MAKE_BOTTOM(ref) #endif -IR_ALWAYS_INLINE bool ir_sccp_meet_const(ir_ctx *ctx, ir_insn *_values, ir_bitqueue *worklist, ir_ref ref, ir_insn *val_insn) +IR_ALWAYS_INLINE bool ir_sccp_meet_const(const ir_ctx *ctx, ir_sccp_val *_values, ir_bitqueue *worklist, ir_ref ref, const ir_insn *val_insn) { IR_ASSERT(IR_IS_CONST_OP(val_insn->op) || IR_IS_SYM_CONST(val_insn->op)); @@ -207,46 +246,51 @@ return 1; } -IR_ALWAYS_INLINE bool ir_sccp_meet(ir_ctx *ctx, ir_insn *_values, ir_bitqueue *worklist, ir_ref ref, ir_ref val) +IR_ALWAYS_INLINE bool ir_sccp_meet_copy(const ir_ctx *ctx, ir_sccp_val *_values, ir_bitqueue *worklist, ir_ref ref, ir_ref val) { - ir_ref val_identity = ir_sccp_identity(ctx, _values, val); - ir_insn *val_insn; +#if IR_COMBO_COPY_PROPAGATION + if (_values[ref].op == IR_COPY) { + /* COPY(OLD_VAL) meet COPY(NEW_VAL) => + * (IDENTITY(OLD_VAL) == IDENTITY(NEW_VAL) ? COPY(OLD_VAL) ? BOTTOM */ + if (ir_sccp_identity(ctx, _values, ref) == ir_sccp_identity(ctx, _values, val)) { + return 0; /* not changed */ + } + ir_sccp_split_partition(ctx, _values, worklist, ref); + return 1; + } else { + IR_ASSERT(_values[ref].op != IR_BOTTOM); + /* TOP meet COPY(NEW_VAL) -> COPY(NEW_VAL) */ + /* OLD_CONST meet COPY(NEW_VAL) -> COPY(NEW_VAL) */ + ir_sccp_add_identity(ctx, _values, val, ref); + return 1; + } +#endif + IR_MAKE_BOTTOM(ref); + return 1; +} - if (IR_IS_CONST_REF(val_identity)) { - val_insn = &ctx->ir_base[val_identity]; +#if 0 +IR_ALWAYS_INLINE bool ir_sccp_meet(const ir_ctx *ctx, ir_sccp_val *_values, ir_bitqueue *worklist, ir_ref ref, ir_ref val) +{ + const ir_insn *val_insn; + + if (IR_IS_CONST_REF(val)) { + val_insn = &ctx->ir_base[val]; } else { - val_insn = &_values[val_identity]; + val_insn = &_values[val].insn; if (!IR_IS_CONST_OP(val_insn->op) && !IR_IS_SYM_CONST(val_insn->op)) { -#if IR_COMBO_COPY_PROPAGATION - if (_values[ref].op == IR_COPY) { - /* COPY(OLD_VAL) meet COPY(NEW_VAL) => - * (IDENTITY(OLD_VAL) == IDENTITY(NEW_VAL) ? COPY(OLD_VAL) ? BOTTOM */ - if (ir_sccp_identity(ctx, _values, ref) == val_identity) { - return 0; /* not changed */ - } - ir_sccp_split_partition(ctx, _values, worklist, ref); - return 1; - } else { - IR_ASSERT(_values[ref].op != IR_BOTTOM); - /* TOP meet COPY(NEW_VAL) -> COPY(NEW_VAL) */ - /* OLD_CONST meet COPY(NEW_VAL) -> COPY(NEW_VAL) */ - ir_sccp_add_identity(ctx, _values, val, ref); - return 1; - } -#endif - - IR_MAKE_BOTTOM(ref); - return 1; + return ir_sccp_meet_copy(ctx, _values, worklist, ref, val); } } return ir_sccp_meet_const(ctx, _values, worklist, ref, val_insn); } +#endif -static ir_ref ir_sccp_fold(ir_ctx *ctx, ir_insn *_values, ir_bitqueue *worklist, ir_ref ref, ir_insn *insn) +static ir_ref ir_sccp_fold(const ir_ctx *ctx, ir_sccp_val *_values, ir_bitqueue *worklist, ir_ref ref, const ir_insn *insn) { - ir_insn *op1_insn, *op2_insn, *op3_insn; + const ir_insn *op1_insn, *op2_insn, *op3_insn; ir_ref op1, op2, op3, copy; uint32_t opt = insn->opt; @@ -255,11 +299,11 @@ op3 = ir_sccp_identity(ctx, _values, insn->op3); restart: - op1_insn = (op1 > 0 && IR_IS_CONST_OP(_values[op1].op)) ? _values + op1 : ctx->ir_base + op1; - op2_insn = (op2 > 0 && IR_IS_CONST_OP(_values[op2].op)) ? _values + op2 : ctx->ir_base + op2; - op3_insn = (op3 > 0 && IR_IS_CONST_OP(_values[op3].op)) ? _values + op3 : ctx->ir_base + op3; + op1_insn = (op1 > 0 && IR_IS_CONST_OP(_values[op1].op)) ? &_values[op1].insn : ctx->ir_base + op1; + op2_insn = (op2 > 0 && IR_IS_CONST_OP(_values[op2].op)) ? &_values[op2].insn : ctx->ir_base + op2; + op3_insn = (op3 > 0 && IR_IS_CONST_OP(_values[op3].op)) ? &_values[op3].insn : ctx->ir_base + op3; - switch (ir_folding(ctx, opt, op1, op2, op3, op1_insn, op2_insn, op3_insn)) { + switch (ir_folding((ir_ctx*)ctx, opt, op1, op2, op3, op1_insn, op2_insn, op3_insn)) { case IR_FOLD_DO_RESTART: opt = ctx->fold_insn.optx; op1 = ctx->fold_insn.op1; @@ -272,19 +316,30 @@ return 1; case IR_FOLD_DO_COPY: copy = ctx->fold_insn.op1; - return ir_sccp_meet(ctx, _values, worklist, ref, copy); + if (IR_IS_CONST_REF(copy)) { + insn = &ctx->ir_base[copy]; + } else { + insn = &_values[copy].insn; + if (!IR_IS_CONST_OP(insn->op) && !IR_IS_SYM_CONST(insn->op)) { + return ir_sccp_meet_copy(ctx, _values, worklist, ref, copy); + } + } + goto meet_const; case IR_FOLD_DO_CONST: - return ir_sccp_meet_const(ctx, _values, worklist, ref, &ctx->fold_insn); + insn = &ctx->fold_insn; +meet_const: + return ir_sccp_meet_const(ctx, _values, worklist, ref, insn); default: IR_ASSERT(0); return 0; } } -static bool ir_sccp_analyze_phi(ir_ctx *ctx, ir_insn *_values, ir_bitqueue *worklist, ir_ref i, ir_insn *insn) +static bool ir_sccp_analyze_phi(const ir_ctx *ctx, ir_sccp_val *_values, ir_bitqueue *worklist, ir_ref i, const ir_insn *insn) { - ir_ref j, n, input, *merge_input, *p; - ir_insn *v, *new_const = NULL; + ir_ref j, n, input; + const ir_ref *merge_input, *p; + const ir_insn *v, *new_const = NULL; #if IR_COMBO_COPY_PROPAGATION ir_ref new_copy = IR_UNUSED; ir_ref new_copy_identity = IR_UNUSED; @@ -315,7 +370,7 @@ } else if (input == i) { continue; } else { - v = &_values[input]; + v = &_values[input].insn; if (v->op == IR_TOP) { ir_sccp_add_input(ctx, _values, worklist, input); continue; @@ -369,7 +424,7 @@ } else if (input == i) { continue; } else { - v = &_values[input]; + v = &_values[input].insn; if (v->op == IR_TOP) { ir_sccp_add_input(ctx, _values, worklist, input); continue; @@ -398,7 +453,9 @@ #if IR_COMBO_COPY_PROPAGATION if (new_copy) { - return ir_sccp_meet(ctx, _values, worklist, i, new_copy); + IR_ASSERT(!IR_IS_CONST_REF(new_copy)); + IR_ASSERT(!IR_IS_CONST_OP(_values[new_copy].op) && !IR_IS_SYM_CONST(_values[new_copy].op)); + return ir_sccp_meet_copy(ctx, _values, worklist, i, new_copy); } #endif @@ -409,7 +466,7 @@ return 1; } -static bool ir_is_dead_load_ex(ir_ctx *ctx, ir_ref ref, uint32_t flags, ir_insn *insn) +static bool ir_is_dead_load_ex(const ir_ctx *ctx, ir_ref ref, uint32_t flags, const ir_insn *insn) { if ((flags & (IR_OP_FLAG_MEM|IR_OP_FLAG_MEM_MASK)) == (IR_OP_FLAG_MEM|IR_OP_FLAG_MEM_LOAD)) { return ctx->use_lists[ref].count == 1; @@ -419,10 +476,10 @@ return 0; } -static bool ir_is_dead_load(ir_ctx *ctx, ir_ref ref) +static bool ir_is_dead_load(const ir_ctx *ctx, ir_ref ref) { if (ctx->use_lists[ref].count == 1) { - ir_insn *insn = &ctx->ir_base[ref]; + const ir_insn *insn = &ctx->ir_base[ref]; uint32_t flags = ir_op_flags[insn->op]; if ((flags & (IR_OP_FLAG_MEM|IR_OP_FLAG_MEM_MASK)) == (IR_OP_FLAG_MEM|IR_OP_FLAG_MEM_LOAD)) { @@ -434,7 +491,7 @@ return 0; } -static bool ir_is_dead(ir_ctx *ctx, ir_ref ref) +static bool ir_is_dead(const ir_ctx *ctx, ir_ref ref) { if (ctx->use_lists[ref].count == 0) { return IR_IS_FOLDABLE_OP(ctx->ir_base[ref].op); @@ -444,28 +501,28 @@ return 0; } -static bool ir_sccp_is_true(ir_ctx *ctx, ir_insn *_values, ir_ref a) +static bool ir_sccp_is_true(const ir_ctx *ctx, const ir_sccp_val *_values, ir_ref a) { - ir_insn *v = IR_IS_CONST_REF(a) ? &ctx->ir_base[a] : &_values[a]; + const ir_insn *v = IR_IS_CONST_REF(a) ? &ctx->ir_base[a] : &_values[a].insn; return ir_const_is_true(v); } -static bool ir_sccp_is_equal(ir_ctx *ctx, ir_insn *_values, ir_ref a, ir_ref b) +static bool ir_sccp_is_equal(const ir_ctx *ctx, const ir_sccp_val *_values, ir_ref a, ir_ref b) { - ir_insn *v1 = IR_IS_CONST_REF(a) ? &ctx->ir_base[a] : &_values[a]; - ir_insn *v2 = IR_IS_CONST_REF(b) ? &ctx->ir_base[b] : &_values[b]; + const ir_insn *v1 = IR_IS_CONST_REF(a) ? &ctx->ir_base[a] : &_values[a].insn; + const ir_insn *v2 = IR_IS_CONST_REF(b) ? &ctx->ir_base[b] : &_values[b].insn; IR_ASSERT(!IR_IS_SYM_CONST(v1->op)); IR_ASSERT(!IR_IS_SYM_CONST(v2->op)); return v1->val.u64 == v2->val.u64; } -static bool ir_sccp_in_range(ir_ctx *ctx, ir_insn *_values, ir_ref a, ir_ref b, ir_ref c) +static bool ir_sccp_in_range(const ir_ctx *ctx, const ir_sccp_val *_values, ir_ref a, ir_ref b, ir_ref c) { - ir_insn *v1 = IR_IS_CONST_REF(a) ? &ctx->ir_base[a] : &_values[a]; - ir_insn *v2 = IR_IS_CONST_REF(b) ? &ctx->ir_base[b] : &_values[b]; - ir_insn *v3 = IR_IS_CONST_REF(c) ? &ctx->ir_base[c] : &_values[c]; + const ir_insn *v1 = IR_IS_CONST_REF(a) ? &ctx->ir_base[a] : &_values[a].insn; + const ir_insn *v2 = IR_IS_CONST_REF(b) ? &ctx->ir_base[b] : &_values[b].insn; + const ir_insn *v3 = IR_IS_CONST_REF(c) ? &ctx->ir_base[c] : &_values[c].insn; IR_ASSERT(!IR_IS_SYM_CONST(v1->op)); IR_ASSERT(!IR_IS_SYM_CONST(v2->op)); @@ -478,13 +535,13 @@ } #ifdef IR_SCCP_TRACE -static void ir_sccp_trace_val(ir_ctx *ctx, ir_insn *_values, ir_ref i) +static void ir_sccp_trace_val(const ir_ctx *ctx, const ir_sccp_val *_values, ir_ref i) { if (IR_IS_BOTTOM(i)) { fprintf(stderr, "BOTTOM"); } else if (IR_IS_CONST_OP(_values[i].op) || IR_IS_SYM_CONST(_values[i].op)) { fprintf(stderr, "CONST("); - ir_print_const(ctx, &_values[i], stderr, true); + ir_print_const(ctx, &_values[i].insn, stderr, true); fprintf(stderr, ")"); #if IR_COMBO_COPY_PROPAGATION } else if (_values[i].op == IR_COPY) { @@ -501,13 +558,13 @@ } } -static void ir_sccp_trace_start(ir_ctx *ctx, ir_insn *_values, ir_ref i) +static void ir_sccp_trace_start(const ir_ctx *ctx, const ir_sccp_val *_values, ir_ref i) { fprintf(stderr, "%d. ", i); ir_sccp_trace_val(ctx, _values, i); } -static void ir_sccp_trace_end(ir_ctx *ctx, ir_insn *_values, ir_ref i) +static void ir_sccp_trace_end(const ir_ctx *ctx, const ir_sccp_val *_values, ir_ref i) { fprintf(stderr, " -> "); ir_sccp_trace_val(ctx, _values, i); @@ -518,11 +575,12 @@ # define ir_sccp_trace_end(c, v, i) #endif -static IR_NEVER_INLINE void ir_sccp_analyze(ir_ctx *ctx, ir_insn *_values, ir_bitqueue *worklist, ir_bitqueue *iter_worklist) +static IR_NEVER_INLINE void ir_sccp_analyze(const ir_ctx *ctx, ir_sccp_val *_values, ir_bitqueue *worklist, ir_bitqueue *iter_worklist) { - ir_ref i, j, n, *p, use; - ir_use_list *use_list; - ir_insn *insn, *use_insn; + ir_ref i, j, n, use; + const ir_ref *p; + const ir_use_list *use_list; + const ir_insn *insn, *use_insn; uint32_t flags; /* A bit modified SCCP algorithm of M. N. Wegman and F. K. Zadeck */ @@ -545,7 +603,7 @@ bool may_benefit = 0; bool has_top = 0; - if (_values[i].op != IR_TOP) { + if (_values[i].op != IR_TOP || insn->op == IR_COPY) { may_benefit = 1; } @@ -610,7 +668,7 @@ } } for (p = insn->ops + 1; n > 0; p++, n--) { - ir_ref input = *p; + const ir_ref input = *p; IR_ASSERT(input > 0); if (!IR_IS_REACHABLE(input)) { unfeasible_inputs++; @@ -618,9 +676,9 @@ } if (unfeasible_inputs == 0) { IR_MAKE_BOTTOM(i); - } else if (_values[i].op != IR_MERGE || _values[i].op1 != unfeasible_inputs) { + } else if (_values[i].op != IR_MERGE || _values[i].unfeasible_inputs != unfeasible_inputs) { _values[i].optx = IR_MERGE; - _values[i].op1 = unfeasible_inputs; + _values[i].unfeasible_inputs = unfeasible_inputs; } else { continue; } @@ -674,10 +732,10 @@ } if (_values[i].op == IR_TOP) { _values[i].optx = IR_IF; - _values[i].op1 = use; + _values[i].single_output = use; ir_bitqueue_add(worklist, use); continue; - } else if (_values[i].op == IR_IF && _values[i].op1 == use) { + } else if (_values[i].op == IR_IF && _values[i].single_output == use) { continue; } } @@ -715,10 +773,10 @@ use_insn = &ctx->ir_base[use_case]; if (_values[i].op == IR_TOP) { _values[i].optx = IR_IF; - _values[i].op1 = use_case; + _values[i].single_output = use_case; ir_bitqueue_add(worklist, use_case); continue; - } else if (_values[i].op == IR_IF || _values[i].op1 == use_case) { + } else if (_values[i].op == IR_IF || _values[i].single_output == use_case) { continue; } } @@ -768,18 +826,20 @@ for (i = 1; i < ctx->insns_count; i++) { if (IR_IS_CONST_OP(_values[i].op) || IR_IS_SYM_CONST(_values[i].op)) { fprintf(stderr, "%d. CONST(", i); - ir_print_const(ctx, &_values[i], stderr, true); + ir_print_const(ctx, &_values[i].insn, stderr, true); fprintf(stderr, ")\n"); #if IR_COMBO_COPY_PROPAGATION } else if (_values[i].op == IR_COPY) { - fprintf(stderr, "%d. COPY(%d)\n", i, _values[i].op1); + fprintf(stderr, "%d. COPY(%d)\n", i, _values[i].copy); #endif } else if (IR_IS_TOP(i)) { - fprintf(stderr, "%d. TOP\n", i); + if (ctx->ir_base[i].op != IR_TOP) { + fprintf(stderr, "%d. TOP\n", i); + } } else if (_values[i].op == IR_IF) { - fprintf(stderr, "%d. IF(%d)\n", i, _values[i].op1); + fprintf(stderr, "%d. IF(%d)\n", i, _values[i].single_output); } else if (_values[i].op == IR_MERGE) { - fprintf(stderr, "%d. MERGE(%d)\n", i, _values[i].op1); + fprintf(stderr, "%d. MERGE(%d)\n", i, _values[i].unfeasible_inputs); } else if (!IR_IS_BOTTOM(i)) { fprintf(stderr, "%d. %d\n", i, _values[i].op); } @@ -806,7 +866,7 @@ } } -static void ir_sccp_remove_insn(ir_ctx *ctx, ir_insn *_values, ir_ref ref, ir_bitqueue *worklist) +static void ir_sccp_remove_insn(ir_ctx *ctx, const ir_sccp_val *_values, ir_ref ref, ir_bitqueue *worklist) { ir_ref j, n, *p; ir_insn *insn; @@ -820,7 +880,7 @@ *p = IR_UNUSED; /* we may skip nodes that are going to be removed by SCCP (TOP, CONST and COPY) */ if (input > 0 && _values[input].op > IR_COPY) { - ir_use_list_remove_all(ctx, input, ref); + ir_use_list_remove_one(ctx, input, ref); if (ir_is_dead(ctx, input)) { /* schedule DCE */ ir_bitqueue_add(worklist, input); @@ -829,7 +889,7 @@ } } -static void ir_sccp_replace_insn(ir_ctx *ctx, ir_insn *_values, ir_ref ref, ir_ref new_ref, ir_bitqueue *worklist) +static void ir_sccp_replace_insn(ir_ctx *ctx, const ir_sccp_val *_values, ir_ref ref, ir_ref new_ref, ir_bitqueue *worklist) { ir_ref j, n, *p, use, i; ir_insn *insn; @@ -858,7 +918,7 @@ *p = IR_UNUSED; /* we may skip nodes that are going to be removed by SCCP (TOP, CONST and COPY) */ if (input > 0 && _values[input].op > IR_COPY) { - ir_use_list_remove_all(ctx, input, ref); + ir_use_list_remove_one(ctx, input, ref); if (ir_is_dead(ctx, input)) { /* schedule DCE */ ir_bitqueue_add(worklist, input); @@ -907,7 +967,7 @@ CLEAR_USES(ref); } -static void ir_sccp_remove_if(ir_ctx *ctx, ir_insn *_values, ir_ref ref, ir_ref dst) +static void ir_sccp_remove_if(ir_ctx *ctx, const ir_sccp_val *_values, ir_ref ref, ir_ref dst) { ir_ref next; ir_insn *insn, *next_insn; @@ -927,6 +987,7 @@ insn->optx = IR_OPTX(IR_END, IR_VOID, 1); next_insn = &ctx->ir_base[dst]; next_insn->op = IR_BEGIN; + next_insn->op2 = IR_UNUSED; } } @@ -1054,10 +1115,10 @@ return 1; } -static IR_NEVER_INLINE void ir_sccp_transform(ir_ctx *ctx, ir_insn *_values, ir_bitqueue *worklist, ir_bitqueue *iter_worklist) +static IR_NEVER_INLINE void ir_sccp_transform(ir_ctx *ctx, const ir_sccp_val *_values, ir_bitqueue *worklist, ir_bitqueue *iter_worklist) { ir_ref i, j; - ir_insn *value; + const ir_sccp_val *value; for (i = 1, value = _values + i; i < ctx->insns_count; value++, i++) { if (value->op == IR_BOTTOM) { @@ -1072,7 +1133,7 @@ ir_sccp_replace_insn(ctx, _values, i, j, iter_worklist); #if IR_COMBO_COPY_PROPAGATION } else if (value->op == IR_COPY) { - ir_sccp_replace_insn(ctx, _values, i, ir_sccp_identity(ctx, _values, value->op1), iter_worklist); + ir_sccp_replace_insn(ctx, _values, i, ir_sccp_identity(ctx, _values, value->copy), iter_worklist); #endif } else if (value->op == IR_TOP) { /* remove unreachable instruction */ @@ -1104,7 +1165,7 @@ } } else if (value->op == IR_IF) { /* remove one way IF/SWITCH */ - ir_sccp_remove_if(ctx, _values, i, value->op1); + ir_sccp_remove_if(ctx, _values, i, value->single_output); } else if (value->op == IR_MERGE) { /* schedule merge to remove unfeasible MERGE inputs */ ir_bitqueue_add(worklist, i); @@ -1121,6 +1182,16 @@ /* Iterative Optimizations */ /***************************/ +void ir_iter_add_uses(ir_ctx *ctx, ir_ref ref, ir_bitqueue *worklist) +{ + ir_use_list *use_list = &ctx->use_lists[ref]; + ir_ref *p, n = use_list->count; + + for (p = &ctx->use_edges[use_list->refs]; n > 0; p++, n--) { + ir_bitqueue_add(worklist, *p); + } +} + /* Modification of some instruction may open new optimization oprtunities for other * instructions that use this one. * @@ -1132,16 +1203,16 @@ * * TODO: Think abput a more general solution ??? */ -static void ir_iter_add_related_uses(ir_ctx *ctx, ir_ref ref, ir_bitqueue *worklist) +static void ir_iter_add_related_uses(const ir_ctx *ctx, ir_ref ref, ir_bitqueue *worklist) { - ir_insn *insn = &ctx->ir_base[ref]; + const ir_insn *insn = &ctx->ir_base[ref]; if (insn->op == IR_ADD || insn->op == IR_SUB) { - ir_use_list *use_list = &ctx->use_lists[ref]; + const ir_use_list *use_list = &ctx->use_lists[ref]; if (use_list->count == 1) { ir_ref use = ctx->use_edges[use_list->refs]; - ir_insn *use_insn = &ctx->ir_base[ref]; + const ir_insn *use_insn = &ctx->ir_base[ref]; if (use_insn->op == IR_ADD || use_insn->op == IR_SUB) { ir_bitqueue_add(worklist, use); @@ -1163,7 +1234,7 @@ ir_ref input = *p; *p = IR_UNUSED; if (input > 0) { - ir_use_list_remove_all(ctx, input, ref); + ir_use_list_remove_one(ctx, input, ref); if (ir_is_dead(ctx, input)) { /* schedule DCE */ ir_bitqueue_add(worklist, input); @@ -1231,7 +1302,7 @@ ir_ref input = *p; *p = IR_UNUSED; if (input > 0) { - ir_use_list_remove_all(ctx, input, ref); + ir_use_list_remove_one(ctx, input, ref); if (ir_is_dead(ctx, input)) { /* schedule DCE */ ir_bitqueue_add(worklist, input); @@ -1266,16 +1337,17 @@ } } -static ir_ref ir_iter_find_cse1(ir_ctx *ctx, uint32_t optx, ir_ref op1) +static ir_ref ir_iter_find_cse1(const ir_ctx *ctx, uint32_t optx, ir_ref op1) { IR_ASSERT(!IR_IS_CONST_REF(op1)); - ir_use_list *use_list = &ctx->use_lists[op1]; - ir_ref *p, n = use_list->count; + const ir_use_list *use_list = &ctx->use_lists[op1]; + const ir_ref *p; + ir_ref n = use_list->count; for (p = ctx->use_edges + use_list->refs; n > 0; p++, n--) { ir_ref use = *p; - ir_insn *use_insn = &ctx->ir_base[use]; + const ir_insn *use_insn = &ctx->ir_base[use]; if (use_insn->optx == optx) { IR_ASSERT(use_insn->op1 == op1); @@ -1285,12 +1357,13 @@ return IR_UNUSED; } -static ir_ref ir_iter_find_cse(ir_ctx *ctx, ir_ref ref, uint32_t opt, ir_ref op1, ir_ref op2, ir_ref op3, ir_bitqueue *worklist) +static ir_ref ir_iter_find_cse(const ir_ctx *ctx, ir_ref ref, uint32_t opt, ir_ref op1, ir_ref op2, ir_ref op3, ir_bitqueue *worklist) { uint32_t n = IR_INPUT_EDGES_COUNT(ir_op_flags[opt & IR_OPT_OP_MASK]); - ir_use_list *use_list = NULL; - ir_ref *p, use; - ir_insn *use_insn; + const ir_use_list *use_list = NULL; + const ir_ref *p; + ir_ref use; + const ir_insn *use_insn; if (n == 2) { if (!IR_IS_CONST_REF(op1)) { @@ -1373,7 +1446,8 @@ { uint32_t opt; ir_ref op1, op2, op3, copy; - ir_insn *op1_insn, *op2_insn, *op3_insn, *insn; + const ir_insn *op1_insn, *op2_insn, *op3_insn; + ir_insn *insn; insn = &ctx->ir_base[ref]; opt = insn->opt; @@ -1408,9 +1482,6 @@ || insn->op2 != ctx->fold_insn.op2 || insn->op3 != ctx->fold_insn.op3) { - ir_use_list *use_list; - ir_ref n, j, *p, use; - insn->optx = ctx->fold_insn.opt; IR_ASSERT(!IR_OP_HAS_VAR_INPUTS(ir_op_flags[opt & IR_OPT_OP_MASK])); insn->inputs_count = IR_INPUT_EDGES_COUNT(ir_op_flags[opt & IR_OPT_OP_MASK]); @@ -1442,12 +1513,7 @@ insn->op2 = ctx->fold_insn.op2; insn->op3 = ctx->fold_insn.op3; - use_list = &ctx->use_lists[ref]; - n = use_list->count; - for (j = 0, p = &ctx->use_edges[use_list->refs]; j < n; j++, p++) { - use = *p; - ir_bitqueue_add(worklist, use); - } + ir_iter_add_uses(ctx, ref, worklist); } break; case IR_FOLD_DO_COPY: @@ -1464,9 +1530,9 @@ } } -static bool ir_may_promote_d2f(ir_ctx *ctx, ir_ref ref) +static bool ir_may_promote_d2f(const ir_ctx *ctx, ir_ref ref) { - ir_insn *insn = &ctx->ir_base[ref]; + const ir_insn *insn = &ctx->ir_base[ref]; IR_ASSERT(insn->type == IR_DOUBLE); if (IR_IS_CONST_REF(ref)) { @@ -1497,9 +1563,9 @@ return 0; } -static bool ir_may_promote_f2d(ir_ctx *ctx, ir_ref ref) +static bool ir_may_promote_f2d(const ir_ctx *ctx, ir_ref ref) { - ir_insn *insn = &ctx->ir_base[ref]; + const ir_insn *insn = &ctx->ir_base[ref]; IR_ASSERT(insn->type == IR_FLOAT); if (IR_IS_CONST_REF(ref)) { @@ -1508,8 +1574,8 @@ switch (insn->op) { case IR_FP2FP: return 1; - case IR_INT2FP: - return ctx->use_lists[ref].count == 1; +// case IR_INT2FP: +// return ctx->use_lists[ref].count == 1; case IR_NEG: case IR_ABS: return ctx->use_lists[ref].count == 1 && @@ -1668,10 +1734,11 @@ return ref; } -static bool ir_may_promote_trunc(ir_ctx *ctx, ir_type type, ir_ref ref) +static bool ir_may_promote_trunc(const ir_ctx *ctx, ir_type type, ir_ref ref) { - ir_insn *insn = &ctx->ir_base[ref]; - ir_ref *p, n, input; + const ir_insn *insn = &ctx->ir_base[ref]; + const ir_ref *p; + ir_ref n, input; if (IR_IS_CONST_REF(ref)) { return !IR_IS_SYM_CONST(insn->op); @@ -1777,6 +1844,7 @@ } } insn->type = type; + ir_iter_add_uses(ctx, ref, worklist); return ref; } @@ -1857,7 +1925,7 @@ return ref; } -static ir_ref ir_ext_const(ir_ctx *ctx, ir_insn *val_insn, ir_op op, ir_type type) +static ir_ref ir_ext_const(ir_ctx *ctx, const ir_insn *val_insn, ir_op op, ir_type type) { ir_val new_val; @@ -1921,10 +1989,11 @@ return ref; } -static uint32_t _ir_estimated_control(ir_ctx *ctx, ir_ref val, ir_ref loop) +static uint32_t _ir_estimated_control(const ir_ctx *ctx, ir_ref val, ir_ref loop) { - ir_insn *insn; - ir_ref n, *p, input, result, ctrl; + const ir_insn *insn; + const ir_ref *p; + ir_ref n, input, result, ctrl; if (IR_IS_CONST_REF(val)) { return 1; /* IR_START */ @@ -1955,18 +2024,18 @@ return result; } -static bool ir_is_loop_invariant(ir_ctx *ctx, ir_ref ref, ir_ref loop) +static bool ir_is_loop_invariant(const ir_ctx *ctx, ir_ref ref, ir_ref loop) { ref = _ir_estimated_control(ctx, ref, loop); return ref < loop; // TODO: check dominance instead of order } -static bool ir_is_cheaper_ext(ir_ctx *ctx, ir_ref ref, ir_ref loop, ir_ref ext_ref, ir_op op) +static bool ir_is_cheaper_ext(const ir_ctx *ctx, ir_ref ref, ir_ref loop, ir_ref ext_ref, ir_op op) { if (IR_IS_CONST_REF(ref)) { return 1; } else { - ir_insn *insn = &ctx->ir_base[ref]; + const ir_insn *insn = &ctx->ir_base[ref]; if (insn->op == IR_LOAD) { if (ir_is_loop_invariant(ctx, ref, loop)) { @@ -1982,7 +2051,7 @@ for (p = &ctx->use_edges[use_list->refs], n = use_list->count; n > 0; p++, n--) { use = *p; if (use != ext_ref) { - ir_insn *use_insn = &ctx->ir_base[use]; + const ir_insn *use_insn = &ctx->ir_base[use]; if (use_insn->op != op && (!(ir_op_flags[use_insn->op] & (IR_OP_FLAG_CONTROL|IR_OP_FLAG_MEM)) @@ -2018,7 +2087,7 @@ if (use == op_ref || use == ext_ref) { continue; } else { - ir_insn *use_insn = &ctx->ir_base[use]; + const ir_insn *use_insn = &ctx->ir_base[use]; if (use_insn->op >= IR_EQ && use_insn->op <= IR_UGT) { if (use_insn->op1 == phi_ref) { @@ -2057,7 +2126,7 @@ if (use == phi_ref || use == ext_ref) { continue; } else { - ir_insn *use_insn = &ctx->ir_base[use]; + const ir_insn *use_insn = &ctx->ir_base[use]; if (use_insn->op >= IR_EQ && use_insn->op <= IR_UGT) { if (use_insn->op1 == phi_ref) { @@ -2110,7 +2179,9 @@ && !IR_IS_SYM_CONST(ctx->ir_base[use_insn->op1].op)) { ctx->ir_base[use].op1 = ir_ext_const(ctx, &ctx->ir_base[use_insn->op1], op, type); } else { - ctx->ir_base[use].op1 = ir_ext_ref(ctx, use, use_insn->op1, op, type, worklist); + ir_ref tmp = ir_ext_ref(ctx, use, use_insn->op1, op, type, worklist); + use_insn = &ctx->ir_base[use]; + use_insn->op1 = tmp; } ir_bitqueue_add(worklist, use); } @@ -2119,7 +2190,9 @@ && !IR_IS_SYM_CONST(ctx->ir_base[use_insn->op2].op)) { ctx->ir_base[use].op2 = ir_ext_const(ctx, &ctx->ir_base[use_insn->op2], op, type); } else { - ctx->ir_base[use].op2 = ir_ext_ref(ctx, use, use_insn->op2, op, type, worklist); + ir_ref tmp = ir_ext_ref(ctx, use, use_insn->op2, op, type, worklist); + use_insn = &ctx->ir_base[use]; + use_insn->op2 = tmp; } ir_bitqueue_add(worklist, use); } @@ -2147,7 +2220,9 @@ && !IR_IS_SYM_CONST(ctx->ir_base[use_insn->op1].op)) { ctx->ir_base[use].op1 = ir_ext_const(ctx, &ctx->ir_base[use_insn->op1], op, type); } else { - ctx->ir_base[use].op1 = ir_ext_ref(ctx, use, use_insn->op1, op, type, worklist); + ir_ref tmp = ir_ext_ref(ctx, use, use_insn->op1, op, type, worklist); + use_insn = &ctx->ir_base[use]; + use_insn->op1 = tmp; } ir_bitqueue_add(worklist, use); } @@ -2156,7 +2231,9 @@ && !IR_IS_SYM_CONST(ctx->ir_base[use_insn->op2].op)) { ctx->ir_base[use].op2 = ir_ext_const(ctx, &ctx->ir_base[use_insn->op2], op, type); } else { - ctx->ir_base[use].op2 = ir_ext_ref(ctx, use, use_insn->op2, op, type, worklist); + ir_ref tmp = ir_ext_ref(ctx, use, use_insn->op2, op, type, worklist); + use_insn = &ctx->ir_base[use]; + use_insn->op2 = tmp; } ir_bitqueue_add(worklist, use); } @@ -2178,14 +2255,15 @@ && !IR_IS_SYM_CONST(ctx->ir_base[phi_insn->op2].op)) { ctx->ir_base[phi_ref].op2 = ir_ext_const(ctx, &ctx->ir_base[phi_insn->op2], op, type); } else { - ctx->ir_base[phi_ref].op2 = ir_ext_ref(ctx, phi_ref, phi_insn->op2, op, type, worklist); + ir_ref tmp = ir_ext_ref(ctx, phi_ref, phi_insn->op2, op, type, worklist); + ctx->ir_base[phi_ref].op2 = tmp; } return 1; } static bool ir_try_promote_ext(ir_ctx *ctx, ir_ref ext_ref, ir_insn *insn, ir_bitqueue *worklist) - { +{ ir_ref ref = insn->op1; /* Check for simple induction variable in the form: x2 = PHI(loop, x1, x3); x3 = ADD(x2, _); */ @@ -2251,42 +2329,6 @@ ir_ref prev, next; ir_use_list *use_list; - if (ctx->use_lists[begin].count > 1) { - ir_ref *p, n, i, use; - ir_insn *use_insn; - ir_ref region = end; - ir_ref next = IR_UNUSED; - - while (!IR_IS_BB_START(ctx->ir_base[region].op)) { - region = ctx->ir_base[region].op1; - } - - use_list = &ctx->use_lists[begin]; - n = use_list->count; - for (p = &ctx->use_edges[use_list->refs], i = 0; i < n; p++, i++) { - use = *p; - use_insn = &ctx->ir_base[use]; - if (ir_op_flags[use_insn->op] & IR_OP_FLAG_CONTROL) { - IR_ASSERT(!next); - next = use; - } else { - IR_ASSERT(use_insn->op == IR_VAR); - IR_ASSERT(use_insn->op1 == begin); - use_insn->op1 = region; - if (ir_use_list_add(ctx, region, use)) { - /* restore after reallocation */ - use_list = &ctx->use_lists[begin]; - n = use_list->count; - p = &ctx->use_edges[use_list->refs + i]; - } - } - } - - IR_ASSERT(next); - ctx->use_edges[use_list->refs] = next; - use_list->count = 1; - } - IR_ASSERT(ctx->ir_base[begin].op == IR_BEGIN); IR_ASSERT(ctx->ir_base[end].op == IR_END); IR_ASSERT(ctx->ir_base[begin].op1 == end); @@ -2386,7 +2428,7 @@ next->op1 = root->op1; ir_use_list_replace_one(ctx, root->op1, root_ref, next_ref); if (!IR_IS_CONST_REF(root->op2)) { - ir_use_list_remove_all(ctx, root->op2, root_ref); + ir_use_list_remove_one(ctx, root->op2, root_ref); if (ir_is_dead(ctx, root->op2)) { ir_bitqueue_add(worklist, root->op2); } @@ -2444,7 +2486,7 @@ ir_use_list_replace_one(ctx, root->op1, root_ref, next_ref); if (!IR_IS_CONST_REF(root->op2)) { - ir_use_list_remove_all(ctx, root->op2, root_ref); + ir_use_list_remove_one(ctx, root->op2, root_ref); if (ir_is_dead(ctx, root->op2)) { ir_bitqueue_add(worklist, root->op2); } @@ -2472,7 +2514,7 @@ } } -static bool ir_is_zero(ir_ctx *ctx, ir_ref ref) +static bool ir_is_zero(const ir_ctx *ctx, ir_ref ref) { return IR_IS_CONST_REF(ref) && !IR_IS_SYM_CONST(ctx->ir_base[ref].op) @@ -2497,7 +2539,7 @@ ir_ref root_ref = start1->op1; ir_insn *root = &ctx->ir_base[root_ref]; - if (root->op == IR_IF && !IR_IS_CONST_REF(root->op2) && ctx->use_lists[root->op2].count == 1) { + if (root->op == IR_IF && !IR_IS_CONST_REF(root->op2)) { ir_ref cond_ref = root->op2; ir_insn *cond = &ctx->ir_base[cond_ref]; ir_type type = insn->type; @@ -2571,13 +2613,17 @@ next->op1 = root->op1; ir_use_list_replace_one(ctx, root->op1, root_ref, next_ref); if (!IR_IS_CONST_REF(insn->op1)) { - ir_use_list_remove_all(ctx, insn->op1, cond_ref); + ir_use_list_remove_one(ctx, insn->op1, cond_ref); } if (!IR_IS_CONST_REF(insn->op2)) { - ir_use_list_remove_all(ctx, insn->op2, cond_ref); + ir_use_list_remove_one(ctx, insn->op2, cond_ref); } - MAKE_NOP(cond); CLEAR_USES(cond_ref); + if (ctx->use_lists[cond_ref].count == 1) { + MAKE_NOP(cond); CLEAR_USES(cond_ref); + } else { + ir_use_list_remove_one(ctx, cond_ref, root_ref); + } MAKE_NOP(root); CLEAR_USES(root_ref); MAKE_NOP(start1); CLEAR_USES(start1_ref); MAKE_NOP(start2); CLEAR_USES(start2_ref); @@ -2660,10 +2706,14 @@ ir_use_list_replace_one(ctx, root->op1, root_ref, next_ref); ir_use_list_remove_one(ctx, insn->op1, neg_ref); if (!IR_IS_CONST_REF(insn->op1)) { - ir_use_list_remove_all(ctx, insn->op1, cond_ref); + ir_use_list_remove_one(ctx, insn->op1, cond_ref); } - MAKE_NOP(cond); CLEAR_USES(cond_ref); + if (ctx->use_lists[cond_ref].count == 1) { + MAKE_NOP(cond); CLEAR_USES(cond_ref); + } else { + ir_use_list_remove_one(ctx, cond_ref, root_ref); + } MAKE_NOP(root); CLEAR_USES(root_ref); MAKE_NOP(start1); CLEAR_USES(start1_ref); MAKE_NOP(start2); CLEAR_USES(start2_ref); @@ -2677,8 +2727,16 @@ } return 1; -#if 0 - } else { + } else if (insn->op2 <= cond_ref && insn->op3 <= cond_ref + && cond->op != IR_OVERFLOW + // TODO: temporary disable IF-conversion for RLOAD. + // We don't track anti-dependencies in GCM and Local Scheduling. + // As result COND may be scheduled below the following RSTORE. + // See: https://github.com/dstogov/ir/issues/132 + && cond->op != IR_RLOAD + && !((cond->op >= IR_EQ && cond->op <= IR_UNORDERED) + && ((!IR_IS_CONST_REF(cond->op1) && ctx->ir_base[cond->op1].op == IR_RLOAD) + || (!IR_IS_CONST_REF(cond->op2) && ctx->ir_base[cond->op2].op == IR_RLOAD)))) { /* COND * * prev prev @@ -2723,7 +2781,7 @@ next->op1 = root->op1; ir_use_list_replace_one(ctx, cond_ref, root_ref, ref); ir_use_list_replace_one(ctx, root->op1, root_ref, next_ref); - ir_use_list_remove_all(ctx, root->op2, root_ref); + ir_use_list_remove_one(ctx, root->op2, root_ref); MAKE_NOP(root); CLEAR_USES(root_ref); MAKE_NOP(start1); CLEAR_USES(start1_ref); @@ -2732,12 +2790,12 @@ MAKE_NOP(end2); CLEAR_USES(end2_ref); MAKE_NOP(merge); CLEAR_USES(merge_ref); + ir_bitqueue_add(worklist, ref); if (ctx->ir_base[next->op1].op == IR_BEGIN || ctx->ir_base[next->op1].op == IR_MERGE) { ir_bitqueue_add(worklist, next->op1); } return 1; -#endif } } } @@ -2746,7 +2804,7 @@ return 0; } -static bool ir_cmp_is_true(ir_op op, ir_insn *op1, ir_insn *op2) +static bool ir_cmp_is_true(ir_op op, const ir_insn *op1, const ir_insn *op2) { IR_ASSERT(op1->type == op2->type); if (IR_IS_TYPE_INT(op1->type)) { @@ -2920,9 +2978,11 @@ if_false->optx = IR_OPTX(IR_BEGIN, IR_VOID, 1); if_false->op1 = end1_ref; + if_false->op2 = IR_UNUSED; if_true->optx = IR_OPTX(IR_BEGIN, IR_VOID, 1); if_true->op1 = end2_ref; + if_true->op2 = IR_UNUSED; ir_bitqueue_add(worklist, if_false_ref); ir_bitqueue_add(worklist, if_true_ref); @@ -2960,6 +3020,7 @@ if_true->optx = IR_BEGIN; if_true->op1 = IR_UNUSED; + if_true->op2 = IR_UNUSED; ctx->flags2 &= ~IR_CFG_REACHABLE; @@ -2987,8 +3048,8 @@ * IF_FALSE | MERGE * | | */ - ir_use_list_remove_all(ctx, merge_ref, cond_ref); - ir_use_list_remove_all(ctx, ref, if_true_ref); + ir_use_list_remove_one(ctx, merge_ref, cond_ref); + ir_use_list_remove_one(ctx, ref, if_true_ref); if (!IR_IS_CONST_REF(cond->op3)) { ir_use_list_replace_one(ctx, cond->op3, cond_ref, end2_ref); } @@ -3109,9 +3170,11 @@ if_false->optx = IR_OPTX(IR_BEGIN, IR_VOID, 1); if_false->op1 = end1_ref; + if_false->op2 = IR_UNUSED; if_true->optx = IR_OPTX(IR_BEGIN, IR_VOID, 1); if_true->op1 = end2_ref; + if_true->op2 = IR_UNUSED; ir_bitqueue_add(worklist, if_false_ref); ir_bitqueue_add(worklist, if_true_ref); @@ -3153,6 +3216,7 @@ if_true->optx = IR_BEGIN; if_true->op1 = IR_UNUSED; + if_true->op2 = IR_UNUSED; ctx->flags2 &= ~IR_CFG_REACHABLE; @@ -3182,8 +3246,8 @@ * | | */ - ir_use_list_remove_all(ctx, merge_ref, phi_ref); - ir_use_list_remove_all(ctx, ref, if_true_ref); + ir_use_list_remove_one(ctx, merge_ref, phi_ref); + ir_use_list_remove_one(ctx, ref, if_true_ref); if (!IR_IS_CONST_REF(phi->op3)) { ir_use_list_replace_one(ctx, phi->op3, phi_ref, insn->op2); } @@ -3273,7 +3337,7 @@ } } -static ir_ref ir_find_ext_use(ir_ctx *ctx, ir_ref ref) +static ir_ref ir_find_ext_use(const ir_ctx *ctx, ir_ref ref) { ir_use_list *use_list = &ctx->use_lists[ref]; ir_ref *p, n, use; @@ -3439,7 +3503,9 @@ if_true = &ctx->ir_base[if_true_ref]; if_false = &ctx->ir_base[if_false_ref]; if_true->op = IR_BEGIN; + if_true->op2 = IR_UNUSED; if_false->op = IR_BEGIN; + if_false->op2 = IR_UNUSED; if (ir_ref_is_true(ctx, condition)) { if_false->op1 = IR_UNUSED; ir_use_list_remove_one(ctx, ref, if_false_ref); @@ -3595,7 +3661,10 @@ if (!(ctx->flags & IR_OPT_CFG)) { /* pass */ } else if (insn->op == IR_BEGIN) { - if (insn->op1 && ctx->ir_base[insn->op1].op == IR_END) { + if (insn->op1 + && !insn->op2 /* no computed goto label */ + && ctx->use_lists[i].count == 1 + && ctx->ir_base[insn->op1].op == IR_END) { ir_merge_blocks(ctx, insn->op1, i, worklist); } } else if (insn->op == IR_MERGE) { @@ -3652,6 +3721,7 @@ insn->op1 = val; insn->op2 = IR_UNUSED; ir_bitqueue_add(worklist, i); + ir_iter_add_uses(ctx, i, worklist); } } } else if (insn->op == IR_STORE) { @@ -3698,14 +3768,55 @@ } } +void ir_iter_cleanup(ir_ctx *ctx) +{ + ir_bitqueue iter_worklist; + ir_bitqueue cfg_worklist; + ir_ref i, n; + ir_insn *insn; + + ir_bitqueue_init(&cfg_worklist, ctx->insns_count); + ir_bitqueue_init(&iter_worklist, ctx->insns_count); + + /* Remove unused nodes */ + for (i = IR_UNUSED + 1, insn = ctx->ir_base + i; i < ctx->insns_count;) { + if (IR_IS_FOLDABLE_OP(insn->op)) { + if (insn->op != IR_NOP && ctx->use_lists[i].count == 0) { + ir_iter_remove_insn(ctx, i, &iter_worklist); + } + } else if (insn->op == IR_IF || insn->op == IR_MERGE) { + ir_bitqueue_add(&cfg_worklist, i); + } + n = insn->inputs_count; + n = ir_insn_inputs_to_len(n); + i += n; + insn += n; + } + + while ((i = ir_bitqueue_pop(&iter_worklist)) >= 0) { + insn = &ctx->ir_base[i]; + if (IR_IS_FOLDABLE_OP(insn->op)) { + if (ctx->use_lists[i].count == 0) { + ir_iter_remove_insn(ctx, i, &iter_worklist); + } + } + } + + /* Cleanup Control Flow */ + ir_iter_opt(ctx, &cfg_worklist); + + ir_bitqueue_free(&iter_worklist); + ir_bitqueue_free(&cfg_worklist); +} + int ir_sccp(ir_ctx *ctx) { ir_bitqueue sccp_worklist, iter_worklist; - ir_insn *_values; + ir_sccp_val *_values; ir_bitqueue_init(&iter_worklist, ctx->insns_count); ir_bitqueue_init(&sccp_worklist, ctx->insns_count); - _values = ir_mem_calloc(ctx->insns_count, sizeof(ir_insn)); + _values = ir_mem_calloc(ctx->insns_count, sizeof(ir_sccp_val)); ctx->flags2 |= IR_OPT_IN_SCCP; ir_sccp_analyze(ctx, _values, &sccp_worklist, &iter_worklist); diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_x86.dasc php8.4-8.4.21/ext/opcache/jit/ir/ir_x86.dasc --- php8.4-8.4.16/ext/opcache/jit/ir/ir_x86.dasc 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_x86.dasc 2026-05-05 16:34:12.000000000 +0000 @@ -66,7 +66,7 @@ #define IR_SPILL_POS_TO_OFFSET(offset) \ ((ctx->flags & IR_USE_FRAME_POINTER) ? \ - ((offset) - (ctx->stack_frame_size - ctx->stack_frame_alignment)) : \ + ((offset) - ctx->stack_frame_size) : \ ((offset) + ctx->call_stack_size)) |.macro ASM_EXPAND_OP_MEM, MACRO, op, type, op1 @@ -882,8 +882,7 @@ |.endmacro typedef struct _ir_backend_data { - ir_reg_alloc_data ra_data; - uint32_t dessa_from_block; + ir_reg_alloc_data ra_data; dasm_State *dasm_state; ir_bitset emit_constants; int rodata_label, jmp_table_label; @@ -892,8 +891,18 @@ bool double_abs_const; bool float_abs_const; bool double_zero_const; + bool u2d_const; + bool u2f_const; + bool resolved_label_syms; } ir_backend_data; +typedef struct _ir_x86_64_sysv_va_list { + uint32_t gp_offset; + uint32_t fp_offset; + void *overflow_arg_area; + void *reg_save_area; +} ir_x86_64_sysv_va_list; + #define IR_GP_REG_NAME(code, name64, name32, name16, name8, name8h) \ #name64, #define IR_GP_REG_NAME32(code, name64, name32, name16, name8, name8h) \ @@ -905,9 +914,19 @@ #define IR_FP_REG_NAME(code, name) \ #name, -static const char *_ir_reg_name[IR_REG_NUM] = { +static const char *_ir_reg_name[] = { IR_GP_REGS(IR_GP_REG_NAME) IR_FP_REGS(IR_FP_REG_NAME) + "ALL", + "SCRATCH", +#ifdef IR_TARGET_X64 +# ifdef _WIN64 + "SCRATCH_SYSV", +# else + "SCRATCH_MS", +# endif + "SCRATCH_PN", /* preserve none */ +#endif }; static const char *_ir_reg_name32[IR_REG_NUM] = { @@ -922,66 +941,11 @@ IR_GP_REGS(IR_GP_REG_NAME8) }; -/* Calling Convention */ -#ifdef _WIN64 - -static const int8_t _ir_int_reg_params[IR_REG_INT_ARGS] = { - IR_REG_INT_ARG1, - IR_REG_INT_ARG2, - IR_REG_INT_ARG3, - IR_REG_INT_ARG4, -}; - -static const int8_t _ir_fp_reg_params[IR_REG_FP_ARGS] = { - IR_REG_FP_ARG1, - IR_REG_FP_ARG2, - IR_REG_FP_ARG3, - IR_REG_FP_ARG4, -}; - -#elif defined(IR_TARGET_X64) - -static const int8_t _ir_int_reg_params[IR_REG_INT_ARGS] = { - IR_REG_INT_ARG1, - IR_REG_INT_ARG2, - IR_REG_INT_ARG3, - IR_REG_INT_ARG4, - IR_REG_INT_ARG5, - IR_REG_INT_ARG6, -}; - -static const int8_t _ir_fp_reg_params[IR_REG_FP_ARGS] = { - IR_REG_FP_ARG1, - IR_REG_FP_ARG2, - IR_REG_FP_ARG3, - IR_REG_FP_ARG4, - IR_REG_FP_ARG5, - IR_REG_FP_ARG6, - IR_REG_FP_ARG7, - IR_REG_FP_ARG8, -}; - -#else - -static const int8_t *_ir_int_reg_params = NULL; -static const int8_t *_ir_fp_reg_params = NULL; -static const int8_t _ir_int_fc_reg_params[IR_REG_INT_FCARGS] = { - IR_REG_INT_FCARG1, - IR_REG_INT_FCARG2, -}; -static const int8_t *_ir_fp_fc_reg_params = NULL; - -#endif - const char *ir_reg_name(int8_t reg, ir_type type) { if (reg >= IR_REG_NUM) { - if (reg == IR_REG_SCRATCH) { - return "SCRATCH"; - } else { - IR_ASSERT(reg == IR_REG_ALL); - return "ALL"; - } + IR_ASSERT((uint8_t)reg < sizeof(_ir_reg_name) / sizeof(_ir_reg_name[0])); + return _ir_reg_name[reg]; } IR_ASSERT(reg >= 0 && reg < IR_REG_NUM); if (type == IR_VOID) { @@ -999,6 +963,159 @@ } } +/* Calling Conventions */ +#ifdef IR_TARGET_X64 + +# ifdef _WIN64 +# define IR_REG_SCRATH_X86_64_MS IR_REG_SET_1 +# define IR_REG_SCRATH_X86_64_SYSV IR_REG_SET_2 +# define IR_REG_SCRATH_X86_64_PN IR_REG_SET_3 +# else +# define IR_REG_SCRATH_X86_64_SYSV IR_REG_SET_1 +# define IR_REG_SCRATH_X86_64_MS IR_REG_SET_2 +# define IR_REG_SCRATH_X86_64_PN IR_REG_SET_3 +# endif + +# define IR_REGSET_SCRATCH_X86_64_SYSV \ + (IR_REGSET_INTERVAL(IR_REG_RAX, IR_REG_RDX) | \ + IR_REGSET_INTERVAL(IR_REG_RSI, IR_REG_RDI) | \ + IR_REGSET_INTERVAL(IR_REG_R8, IR_REG_R11) | \ + IR_REGSET_FP) + +# define IR_REGSET_SCRATCH_X86_64_WIN \ + (IR_REGSET_INTERVAL(IR_REG_RAX, IR_REG_RDX) | \ + IR_REGSET_INTERVAL(IR_REG_R8, IR_REG_R11) | \ + IR_REGSET_INTERVAL(IR_REG_XMM0, IR_REG_XMM5)) + +# define IR_REGSET_SCRATCH_X86_64_PN \ + (IR_REGSET_DIFFERENCE(IR_REGSET_GP, IR_REGSET(IR_REG_RBP)) | IR_REGSET_FP) + +const ir_regset ir_scratch_regset[] = { + IR_REGSET_GP | IR_REGSET_FP, +# ifdef _WIN64 + IR_REGSET_SCRATCH_X86_64_WIN, + IR_REGSET_SCRATCH_X86_64_SYSV, +# else + IR_REGSET_SCRATCH_X86_64_SYSV, + IR_REGSET_SCRATCH_X86_64_WIN, +# endif + IR_REGSET_SCRATCH_X86_64_PN, +}; + +const ir_call_conv_dsc ir_call_conv_x86_64_ms = { + 0, /* cleanup_stack_by_callee */ + 0, /* pass_struct_by_val */ + 0, /* sysv_varargs */ + 1, /* shadow_param_regs */ + 32, /* shadow_store_size */ + 4, /* int_param_regs_count */ + 4, /* fp_param_regs_count */ + IR_REG_RAX, /* int_ret_reg */ + IR_REG_XMM0, /* fp_ret_reg */ + IR_REG_NONE, /* fp_varargs_reg */ + IR_REG_SCRATH_X86_64_MS, + (const int8_t[4]){IR_REG_RCX, IR_REG_RDX, IR_REG_R8, IR_REG_R9}, + (const int8_t[4]){IR_REG_XMM0, IR_REG_XMM1, IR_REG_XMM2, IR_REG_XMM3}, + IR_REGSET(IR_REG_RBX) | IR_REGSET(IR_REG_RBP) | IR_REGSET(IR_REG_RSI) | IR_REGSET(IR_REG_RDI) | + IR_REGSET_INTERVAL(IR_REG_R12, IR_REG_R15) | IR_REGSET_INTERVAL(IR_REG_XMM6, IR_REG_XMM15), +}; + +const ir_call_conv_dsc ir_call_conv_x86_64_sysv = { + 0, /* cleanup_stack_by_callee */ + 1, /* pass_struct_by_val */ + 1, /* sysv_varargs */ + 0, /* shadow_param_regs */ + 0, /* shadow_store_size */ + 6, /* int_param_regs_count */ + 8, /* fp_param_regs_count */ + IR_REG_RAX, /* int_ret_reg */ + IR_REG_XMM0, /* fp_ret_reg */ + IR_REG_RAX, /* fp_varargs_reg */ + IR_REG_SCRATH_X86_64_SYSV, + (const int8_t[6]){IR_REG_RDI, IR_REG_RSI, IR_REG_RDX, IR_REG_RCX, IR_REG_R8, IR_REG_R9}, + (const int8_t[8]){IR_REG_XMM0, IR_REG_XMM1, IR_REG_XMM2, IR_REG_XMM3, + IR_REG_XMM4, IR_REG_XMM5, IR_REG_XMM6, IR_REG_XMM7}, + IR_REGSET(IR_REG_RBX) | IR_REGSET(IR_REG_RBP) | IR_REGSET_INTERVAL(IR_REG_R12, IR_REG_R15), + +}; + +const ir_call_conv_dsc ir_call_conv_x86_64_preserve_none = { + 0, /* cleanup_stack_by_callee */ + 1, /* pass_struct_by_val */ + 1, /* sysv_varargs */ + 0, /* shadow_param_regs */ + 0, /* shadow_store_size */ + 12, /* int_param_regs_count */ + 8, /* fp_param_regs_count */ + IR_REG_RAX, /* int_ret_reg */ + IR_REG_XMM0, /* fp_ret_reg */ + IR_REG_RAX, /* fp_varargs_reg */ + IR_REG_SCRATH_X86_64_PN, + (const int8_t[12]){IR_REG_R12, IR_REG_R13, IR_REG_R14, IR_REG_R15, + IR_REG_RDI, IR_REG_RSI, IR_REG_RDX, IR_REG_RCX, IR_REG_R8, IR_REG_R9, + IR_REG_R11, IR_REG_RAX}, + (const int8_t[8]){IR_REG_XMM0, IR_REG_XMM1, IR_REG_XMM2, IR_REG_XMM3, + IR_REG_XMM4, IR_REG_XMM5, IR_REG_XMM6, IR_REG_XMM7}, + IR_REGSET(IR_REG_RBP), + +}; + +# ifdef _WIN64 +# define ir_call_conv_default ir_call_conv_x86_64_ms +# else +# define ir_call_conv_default ir_call_conv_x86_64_sysv +# endif + +#else + +# define IR_REG_SCRATCH_X86 IR_REG_SET_1 + +# define IR_REGSET_SCRATCH_X86 \ + (IR_REGSET_INTERVAL(IR_REG_RAX, IR_REG_RDX) | IR_REGSET_FP) + +const ir_regset ir_scratch_regset[] = { + IR_REGSET_INTERVAL(IR_REG_GP_FIRST, IR_REG_FP_LAST), + IR_REGSET_SCRATCH_X86, +}; + +const ir_call_conv_dsc ir_call_conv_x86_cdecl = { + 0, /* cleanup_stack_by_callee */ + 1, /* pass_struct_by_val */ + 0, /* sysv_varargs */ + 0, /* shadow_param_regs */ + 0, /* shadow_store_size */ + 0, /* int_param_regs_count */ + 0, /* fp_param_regs_count */ + IR_REG_RAX, /* int_ret_reg */ + IR_REG_NONE, /* fp_ret_reg */ + IR_REG_NONE, /* fp_varargs_reg */ + IR_REG_SCRATCH_X86, + NULL, + NULL, + IR_REGSET(IR_REG_RBX) | IR_REGSET(IR_REG_RBP) | IR_REGSET(IR_REG_RSI) | IR_REGSET(IR_REG_RDI), +}; + +const ir_call_conv_dsc ir_call_conv_x86_fastcall = { + 1, /* cleanup_stack_by_callee */ + 1, /* pass_struct_by_val */ + 0, /* sysv_varargs */ + 0, /* shadow_param_regs */ + 0, /* shadow_store_size */ + 2, /* int_param_regs_count */ + 0, /* fp_param_regs_count */ + IR_REG_RAX, /* int_ret_reg */ + IR_REG_NONE, /* fp_ret_reg */ + IR_REG_NONE, /* fp_varargs_reg */ + IR_REG_SCRATCH_X86, + (const int8_t[4]){IR_REG_RCX, IR_REG_RDX}, + NULL, + IR_REGSET(IR_REG_RBX) | IR_REGSET(IR_REG_RBP) | IR_REGSET(IR_REG_RSI) | IR_REGSET(IR_REG_RDI), +}; + +# define ir_call_conv_default ir_call_conv_x86_cdecl + +#endif + #define IR_RULES(_) \ _(CMP_INT) \ _(CMP_FP) \ @@ -1050,6 +1167,7 @@ _(CMP_AND_BRANCH_FP) \ _(TEST_AND_BRANCH_INT) \ _(JCC_INT) \ + _(COND_TEST_INT) \ _(COND_CMP_INT) \ _(COND_CMP_FP) \ _(GUARD_CMP_INT) \ @@ -1087,6 +1205,7 @@ _(SSE_TRUNC) \ _(SSE_NEARBYINT) \ _(BIT_OP) \ + _(IGOTO_DUP) \ #define IR_LEA_FIRST IR_LEA_OB #define IR_LEA_LAST IR_LEA_O_SYM @@ -1110,35 +1229,24 @@ static bool ir_may_fuse_addr(ir_ctx *ctx, const ir_insn *addr_insn) { - if (sizeof(void*) == 4) { - return 1; + if (addr_insn->op == IR_LABEL) { + return 0; } else if (IR_IS_SYM_CONST(addr_insn->op)) { void *addr = ir_sym_addr(ctx, addr_insn); if (!addr) { return 0; } - return IR_IS_SIGNED_32BIT((int64_t)(intptr_t)addr); + return (sizeof(void*) == 4) || IR_IS_SIGNED_32BIT((int64_t)(intptr_t)addr); } else { - return IR_IS_SIGNED_32BIT(addr_insn->val.i64); + return (sizeof(void*) == 4) || IR_IS_SIGNED_32BIT(addr_insn->val.i64); } } static bool ir_may_fuse_imm(ir_ctx *ctx, const ir_insn *val_insn) { if (val_insn->type == IR_ADDR) { - if (sizeof(void*) == 4) { - return 1; - } else if (IR_IS_SYM_CONST(val_insn->op)) { - void *addr = ir_sym_addr(ctx, val_insn); - - if (!addr) { - return 0; - } - return IR_IS_SIGNED_32BIT((intptr_t)addr); - } else { - return IR_IS_SIGNED_32BIT(val_insn->val.i64); - } + return ir_may_fuse_addr(ctx, val_insn); } else { return (ir_type_size[val_insn->type] <= 4 || IR_IS_SIGNED_32BIT(val_insn->val.i64)); } @@ -1163,6 +1271,8 @@ const ir_insn *insn; int n = 0; int flags = IR_USE_MUST_BE_IN_REG | IR_OP1_MUST_BE_IN_REG | IR_OP2_MUST_BE_IN_REG | IR_OP3_MUST_BE_IN_REG; + const ir_proto_t *proto; + const ir_call_conv_dsc *cc; constraints->def_reg = IR_REG_NONE; constraints->hints_count = 0; @@ -1296,6 +1406,7 @@ } IR_FALLTHROUGH; case IR_COND_CMP_INT: + case IR_COND_TEST_INT: insn = &ctx->ir_base[ref]; if (IR_IS_TYPE_INT(insn->type)) { if (IR_IS_CONST_REF(insn->op3) || ir_rule(ctx, insn->op3) == IR_STATIC_ALLOCA) { @@ -1398,21 +1509,48 @@ break; case IR_CALL: insn = &ctx->ir_base[ref]; - if (IR_IS_TYPE_INT(insn->type)) { - constraints->def_reg = IR_REG_INT_RET1; -#ifdef IR_REG_FP_RET1 - } else { - constraints->def_reg = IR_REG_FP_RET1; + proto = ir_call_proto(ctx, insn); + cc = ir_get_call_conv_dsc(proto ? proto->flags : IR_CC_DEFAULT); + if (insn->type != IR_VOID) { + if (IR_IS_TYPE_INT(insn->type)) { + constraints->def_reg = cc->int_ret_reg; + } else { + IR_ASSERT(IR_IS_TYPE_FP(insn->type)); +#ifdef IR_TARGET_X86 + if (cc->fp_ret_reg == IR_REG_NONE) { + ctx->flags2 |= IR_HAS_FP_RET_SLOT; + } else #endif + { + constraints->def_reg = cc->fp_ret_reg; + } + } } - constraints->tmp_regs[0] = IR_SCRATCH_REG(IR_REG_SCRATCH, IR_USE_SUB_REF, IR_DEF_SUB_REF); + constraints->tmp_regs[0] = IR_SCRATCH_REG(cc->scratch_reg, IR_USE_SUB_REF, IR_DEF_SUB_REF); n = 1; - IR_FALLTHROUGH; + if (!IR_IS_CONST_REF(insn->op2) + && proto && (proto->flags & IR_VARARG_FUNC) && cc->fp_varargs_reg != IR_REG_NONE) { + constraints->tmp_regs[n] = IR_SCRATCH_REG(cc->fp_varargs_reg, IR_LOAD_SUB_REF, IR_USE_SUB_REF); + n++; + } + if (insn->inputs_count > 2) { + goto get_arg_hints; + } + flags = IR_USE_SHOULD_BE_IN_REG | IR_OP2_SHOULD_BE_IN_REG | IR_OP3_SHOULD_BE_IN_REG; + break; case IR_TAILCALL: insn = &ctx->ir_base[ref]; + proto = ir_call_proto(ctx, insn); + cc = ir_get_call_conv_dsc(proto ? proto->flags : IR_CC_DEFAULT); + if (!IR_IS_CONST_REF(insn->op2) + && proto && (proto->flags & IR_VARARG_FUNC) && cc->fp_varargs_reg != IR_REG_NONE) { + constraints->tmp_regs[n] = IR_SCRATCH_REG(cc->fp_varargs_reg, IR_LOAD_SUB_REF, IR_USE_SUB_REF); + n++; + } if (insn->inputs_count > 2) { +get_arg_hints: constraints->hints[2] = IR_REG_NONE; - constraints->hints_count = ir_get_args_regs(ctx, insn, constraints->hints); + constraints->hints_count = ir_get_args_regs(ctx, insn, cc, constraints->hints); if (!IR_IS_CONST_REF(insn->op2)) { constraints->tmp_regs[n] = IR_TMP_REG(1, IR_ADDR, IR_LOAD_SUB_REF, IR_USE_SUB_REF); n++; @@ -1517,13 +1655,18 @@ constraints->tmp_regs[0] = IR_TMP_REG(1, ctx->ir_base[insn->op1].type, IR_LOAD_SUB_REF, IR_DEF_SUB_REF); n = 1; } + if (IR_IS_TYPE_UNSIGNED(ctx->ir_base[insn->op1].type) + && ir_type_size[ctx->ir_base[insn->op1].type] >= sizeof(void*)) { + constraints->tmp_regs[n] = IR_TMP_REG(2, ctx->ir_base[insn->op1].type, IR_USE_SUB_REF, IR_DEF_SUB_REF); + n++; + } break; case IR_ABS_INT: flags = IR_DEF_CONFLICTS_WITH_INPUT_REGS | IR_USE_MUST_BE_IN_REG | IR_OP1_MUST_BE_IN_REG; break; case IR_PARAM: constraints->def_reg = ir_get_param_reg(ctx, ref); - flags = 0; + flags = (constraints->def_reg != IR_REG_NONE) ? IR_USE_SHOULD_BE_IN_REG : 0; break; case IR_PI: case IR_PHI: @@ -1535,13 +1678,15 @@ break; case IR_EXITCALL: flags = IR_USE_MUST_BE_IN_REG; - constraints->def_reg = IR_REG_INT_RET1; + cc = ir_get_call_conv_dsc(ctx->flags); + constraints->def_reg = cc->int_ret_reg; break; case IR_IF_INT: case IR_GUARD: case IR_GUARD_NOT: flags = IR_OP2_SHOULD_BE_IN_REG; break; + case IR_IGOTO: case IR_IJMP: flags = IR_OP2_SHOULD_BE_IN_REG; break; @@ -1549,16 +1694,21 @@ flags = IR_OP3_SHOULD_BE_IN_REG; break; case IR_RETURN_INT: + cc = ir_get_call_conv_dsc(ctx->flags); flags = IR_OP2_SHOULD_BE_IN_REG; - constraints->hints[2] = IR_REG_INT_RET1; + constraints->hints[2] = cc->int_ret_reg; constraints->hints_count = 3; break; case IR_RETURN_FP: -#ifdef IR_REG_FP_RET1 - flags = IR_OP2_SHOULD_BE_IN_REG; - constraints->hints[2] = IR_REG_FP_RET1; - constraints->hints_count = 3; + cc = ir_get_call_conv_dsc(ctx->flags); +#ifdef IR_TARGET_X86 + if (cc->fp_ret_reg != IR_REG_NONE) #endif + { + flags = IR_OP2_SHOULD_BE_IN_REG; + constraints->hints[2] = cc->fp_ret_reg; + constraints->hints_count = 3; + } break; case IR_SNAPSHOT: flags = 0; @@ -1574,7 +1724,7 @@ } break; case IR_VA_ARG: - flags = IR_USE_MUST_BE_IN_REG | IR_OP2_MUST_BE_IN_REG; + flags = IR_USE_MUST_BE_IN_REG | IR_OP2_MUST_BE_IN_REG | IR_DEF_CONFLICTS_WITH_INPUT_REGS; constraints->tmp_regs[0] = IR_TMP_REG(3, IR_ADDR, IR_LOAD_SUB_REF, IR_SAVE_SUB_REF); n = 1; insn = &ctx->ir_base[ref]; @@ -1669,7 +1819,9 @@ do { ir_insn *insn = &ctx->ir_base[*p]; - if (insn->op != IR_LOAD && (insn->op != IR_STORE || insn->op3 == addr_ref)) { + if (insn->op != IR_LOAD + && insn->op != IR_LOAD_v + && ((insn->op != IR_STORE && insn->op != IR_STORE_v) || insn->op3 == addr_ref)) { return; } p++; @@ -1752,7 +1904,7 @@ do { ir_insn *insn = &ctx->ir_base[pos]; - if (insn->op == IR_STORE) { + if (insn->op == IR_STORE || insn->op == IR_STORE_v || insn->op == IR_VSTORE || insn->op == IR_VSTORE_v) { // TODO: check if LOAD and STORE addresses may alias return 1; } else if (insn->op == IR_CALL) { @@ -1766,8 +1918,9 @@ static void ir_match_fuse_load(ir_ctx *ctx, ir_ref ref, ir_ref root) { - if (ir_in_same_block(ctx, ref) - && ctx->ir_base[ref].op == IR_LOAD) { + if (ir_in_same_block(ctx, ref) && + (ctx->ir_base[ref].op == IR_LOAD || ctx->ir_base[ref].op == IR_LOAD_v || + ctx->ir_base[ref].op == IR_VLOAD || ctx->ir_base[ref].op == IR_VLOAD_v)) { if (ctx->use_lists[ref].count == 2 && !ir_match_has_mem_deps(ctx, ref, root)) { ir_ref addr_ref = ctx->ir_base[ref].op2; @@ -1792,7 +1945,7 @@ ir_insn *insn = &ctx->ir_base[ref]; if (ir_in_same_block(ctx, ref) - && insn->op == IR_LOAD) { + && (insn->op == IR_LOAD || insn->op == IR_LOAD_v || insn->op == IR_VLOAD || insn->op == IR_VLOAD_v)) { if (ctx->use_lists[ref].count == 2 && !ir_match_has_mem_deps(ctx, ref, root)) { ir_ref addr_ref = ctx->ir_base[ref].op2; @@ -1814,8 +1967,6 @@ && ir_get_param_reg(ctx, ref) == IR_REG_NONE) { return 1; } - } else if (ctx->ir_base[ref].op == IR_VLOAD) { - return 1; } return 0; } @@ -1888,20 +2039,12 @@ } } -static void ir_match_fuse_load_cmp_fp_br(ir_ctx *ctx, ir_insn *insn, ir_ref root, bool direct) +static void ir_match_fuse_load_cmp_fp_br(ir_ctx *ctx, ir_insn *insn, ir_ref root) { - if (direct) { - if (insn->op == IR_LT || insn->op == IR_LE) { - /* swap operands to avoid P flag check */ - ir_swap_ops(insn); - insn->op ^= 3; - } - } else { - if (insn->op == IR_GT || insn->op == IR_GE) { - /* swap operands to avoid P flag check */ - ir_swap_ops(insn); - insn->op ^= 3; - } + if (insn->op == IR_LT || insn->op == IR_LE || insn->op == IR_UGT || insn->op == IR_UGE) { + /* swap operands to avoid P flag check */ + ir_swap_ops(insn); + insn->op ^= 3; } if (IR_IS_CONST_REF(insn->op2) && !IR_IS_FP_ZERO(ctx->ir_base[insn->op2])) { /* pass */ @@ -1926,7 +2069,7 @@ { const ir_proto_t *proto = (const ir_proto_t *)ir_get_str(ctx, func->proto); - if (proto->flags & IR_BUILTIN_FUNC) { + if ((proto->flags & IR_CALL_CONV_MASK) == IR_CC_BUILTIN) { size_t name_len; const char *name = ir_get_strl(ctx, func->val.name, &name_len); @@ -1984,6 +2127,34 @@ return 0; } +static bool all_usages_are_fusable(ir_ctx *ctx, ir_ref ref) +{ + ir_insn *insn = &ctx->ir_base[ref]; + + if (insn->op >= IR_EQ && insn->op <= IR_UNORDERED) { + ir_use_list *use_list = &ctx->use_lists[ref]; + ir_ref n = use_list->count; + + if (n > 0) { + ir_ref *p = ctx->use_edges + use_list->refs; + + do { + insn = &ctx->ir_base[*p]; + if (insn->op != IR_IF + && insn->op != IR_GUARD + && insn->op != IR_GUARD_NOT + && (insn->op != IR_COND || insn->op2 == ref || insn->op3 == ref)) { + return 0; + } + p++; + n--; + } while (n); + return 1; + } + } + return 0; +} + static uint32_t ir_match_insn(ir_ctx *ctx, ir_ref ref) { ir_insn *op2_insn; @@ -2452,24 +2623,46 @@ } } ctx->flags2 |= IR_HAS_CALLS | IR_16B_FRAME_ALIGNMENT; -#ifndef IR_REG_FP_RET1 - if (IR_IS_TYPE_FP(insn->type)) { - ctx->flags2 |= IR_HAS_FP_RET_SLOT; - } -#endif IR_FALLTHROUGH; case IR_TAILCALL: case IR_IJMP: + if (!IR_IS_CONST_REF(insn->op2)) { + if (ctx->ir_base[insn->op2].op == IR_PROTO) { + if (IR_IS_CONST_REF(ctx->ir_base[insn->op2].op1)) { + ctx->rules[insn->op2] = IR_FUSED | IR_SIMPLE | IR_PROTO; + } else { + ir_match_fuse_load(ctx, ctx->ir_base[insn->op2].op1, ref); + if (ctx->rules[ctx->ir_base[insn->op2].op1] & IR_FUSED) { + ctx->rules[insn->op2] = IR_FUSED | IR_SIMPLE | IR_PROTO; + } + } + } else { + ir_match_fuse_load(ctx, insn->op2, ref); + } + } + return insn->op; + case IR_IGOTO: + if (ctx->ir_base[insn->op1].op == IR_MERGE || ctx->ir_base[insn->op1].op == IR_LOOP_BEGIN) { + ir_insn *merge = &ctx->ir_base[insn->op1]; + ir_ref *p, n = merge->inputs_count; + + for (p = merge->ops + 1; n > 0; p++, n--) { + ir_ref input = *p; + IR_ASSERT(ctx->ir_base[input].op == IR_END || ctx->ir_base[input].op == IR_LOOP_END); + ctx->rules[input] = IR_IGOTO_DUP; + } + } ir_match_fuse_load(ctx, insn->op2, ref); return insn->op; case IR_VAR: - return IR_SKIPPED | IR_VAR; + return IR_STATIC_ALLOCA; case IR_PARAM: -#ifndef _WIN64 if (ctx->value_params && ctx->value_params[insn->op3 - 1].align) { - return IR_STATIC_ALLOCA; + const ir_call_conv_dsc *cc = ir_get_call_conv_dsc(ctx->flags); + if (cc->pass_struct_by_val) { + return IR_STATIC_ALLOCA; + } } -#endif return ctx->use_lists[ref].count > 0 ? IR_PARAM : IR_SKIPPED | IR_PARAM; case IR_ALLOCA: /* alloca() may be used only in functions */ @@ -2617,7 +2810,15 @@ return IR_VSTORE_FP; } break; + case IR_VSTORE_v: + if (IR_IS_TYPE_INT(ctx->ir_base[insn->op3].type)) { + return IR_VSTORE_INT; + } else { + return IR_VSTORE_FP; + } + break; case IR_LOAD: + case IR_LOAD_v: ir_match_fuse_addr(ctx, insn->op2); if (IR_IS_TYPE_INT(insn->type)) { return IR_LOAD_INT; @@ -2635,6 +2836,14 @@ return IR_STORE_FP; } break; + case IR_STORE_v: + ir_match_fuse_addr(ctx, insn->op2); + if (IR_IS_TYPE_INT(ctx->ir_base[insn->op3].type)) { + return IR_STORE_INT; + } else { + return IR_STORE_FP; + } + break; case IR_RLOAD: if (IR_REGSET_IN(IR_REGSET_UNION((ir_regset)ctx->fixed_regset, IR_REGSET_FIXED), insn->op2)) { return IR_SKIPPED | IR_RLOAD; @@ -2698,7 +2907,7 @@ return IR_RETURN_FP; } case IR_IF: - if (!IR_IS_CONST_REF(insn->op2) && ctx->use_lists[insn->op2].count == 1) { + if (!IR_IS_CONST_REF(insn->op2) && (ctx->use_lists[insn->op2].count == 1 || all_usages_are_fusable(ctx, insn->op2))) { op2_insn = &ctx->ir_base[insn->op2]; if (op2_insn->op >= IR_EQ && op2_insn->op <= IR_UNORDERED) { if (IR_IS_TYPE_INT(ctx->ir_base[op2_insn->op1].type)) { @@ -2710,7 +2919,9 @@ if (op1_insn->op == IR_AND && ctx->use_lists[op2_insn->op1].count == 1) { /* v = AND(_, _); c = CMP(v, 0) ... IF(c) => SKIP_TEST; SKIP ... TEST_AND_BRANCH */ - ir_match_fuse_load_test_int(ctx, op1_insn, ref); + if (ctx->use_lists[insn->op2].count == 1) { + ir_match_fuse_load_test_int(ctx, op1_insn, ref); + } ctx->rules[op2_insn->op1] = IR_FUSED | IR_TEST_INT; ctx->rules[insn->op2] = IR_FUSED | IR_SIMPLE | IR_NOP; return IR_TEST_AND_BRANCH_INT; @@ -2722,10 +2933,14 @@ op2_insn->op == IR_LT || op2_insn->op == IR_GE)))) { /* v = BINOP(_, _); c = CMP(v, 0) ... IF(c) => BINOP; SKIP_CMP ... JCC */ if (ir_op_flags[op1_insn->op] & IR_OP_FLAG_COMMUTATIVE) { - ir_match_fuse_load_commutative_int(ctx, op1_insn, ref); + if (ctx->use_lists[insn->op2].count == 1) { + ir_match_fuse_load_commutative_int(ctx, op1_insn, ref); + } ctx->rules[op2_insn->op1] = IR_BINOP_INT | IR_MAY_SWAP; } else { - ir_match_fuse_load(ctx, op1_insn->op2, ref); + if (ctx->use_lists[insn->op2].count == 1) { + ir_match_fuse_load(ctx, op1_insn->op2, ref); + } ctx->rules[op2_insn->op1] = IR_BINOP_INT; } ctx->rules[insn->op2] = IR_FUSED | IR_CMP_INT; @@ -2733,12 +2948,16 @@ } } /* c = CMP(_, _) ... IF(c) => SKIP_CMP ... CMP_AND_BRANCH */ - ir_match_fuse_load_cmp_int(ctx, op2_insn, ref); + if (ctx->use_lists[insn->op2].count == 1) { + ir_match_fuse_load_cmp_int(ctx, op2_insn, ref); + } ctx->rules[insn->op2] = IR_FUSED | IR_CMP_INT; return IR_CMP_AND_BRANCH_INT; } else { /* c = CMP(_, _) ... IF(c) => SKIP_CMP ... CMP_AND_BRANCH */ - ir_match_fuse_load_cmp_fp_br(ctx, op2_insn, ref, 1); + if (ctx->use_lists[insn->op2].count == 1) { + ir_match_fuse_load_cmp_fp_br(ctx, op2_insn, ref); + } ctx->rules[insn->op2] = IR_FUSED | IR_CMP_FP; return IR_CMP_AND_BRANCH_FP; } @@ -2826,31 +3045,43 @@ break; } case IR_COND: - if (!IR_IS_CONST_REF(insn->op1) && ctx->use_lists[insn->op1].count == 1) { + if (!IR_IS_CONST_REF(insn->op1) && (ctx->use_lists[insn->op1].count == 1 || all_usages_are_fusable(ctx, insn->op1))) { ir_insn *op1_insn = &ctx->ir_base[insn->op1]; if (op1_insn->op >= IR_EQ && op1_insn->op <= IR_UNORDERED) { if (IR_IS_TYPE_INT(ctx->ir_base[op1_insn->op1].type)) { - ir_match_fuse_load_cmp_int(ctx, op1_insn, ref); + if (ctx->use_lists[insn->op1].count == 1) { + ir_match_fuse_load_cmp_int(ctx, op1_insn, ref); + } ctx->rules[insn->op1] = IR_FUSED | IR_CMP_INT; return IR_COND_CMP_INT; } else { - ir_match_fuse_load_cmp_fp_br(ctx, op1_insn, ref, 1); + if (ctx->use_lists[insn->op1].count == 1) { + ir_match_fuse_load_cmp_fp_br(ctx, op1_insn, ref); + } ctx->rules[insn->op1] = IR_FUSED | IR_CMP_FP; return IR_COND_CMP_FP; } + } else if (op1_insn->op == IR_AND) { + /* c = AND(_, _) ... IF(c) => SKIP_TEST ... TEST_AND_BRANCH */ + ir_match_fuse_load_test_int(ctx, op1_insn, ref); + ctx->rules[insn->op1] = IR_FUSED | IR_TEST_INT; + return IR_COND_TEST_INT; } } + if (IR_IS_TYPE_INT(ctx->ir_base[insn->op1].type)) { + ir_match_fuse_load(ctx, insn->op1, ref); + } return IR_COND; case IR_GUARD: case IR_GUARD_NOT: - if (!IR_IS_CONST_REF(insn->op2) && ctx->use_lists[insn->op2].count == 1) { + if (!IR_IS_CONST_REF(insn->op2) && (ctx->use_lists[insn->op2].count == 1 || all_usages_are_fusable(ctx, insn->op2))) { op2_insn = &ctx->ir_base[insn->op2]; - if (op2_insn->op >= IR_EQ && op2_insn->op <= IR_UNORDERED + if (op2_insn->op >= IR_EQ && op2_insn->op <= IR_UNORDERED) { // TODO: register allocator may clobber operands of CMP before they are used in the GUARD_CMP - && (insn->op2 == ref - 1 || - (insn->op2 == ctx->prev_ref[ref] - 1 - && ctx->ir_base[ctx->prev_ref[ref]].op == IR_SNAPSHOT))) { +//??? && (insn->op2 == ref - 1 || +//??? (insn->op2 == ctx->prev_ref[ref] - 1 +//??? && ctx->ir_base[ctx->prev_ref[ref]].op == IR_SNAPSHOT))) { if (IR_IS_TYPE_INT(ctx->ir_base[op2_insn->op1].type)) { if (IR_IS_CONST_REF(op2_insn->op2) && !IR_IS_SYM_CONST(ctx->ir_base[op2_insn->op2].op) @@ -2864,10 +3095,14 @@ (op2_insn->op == IR_EQ || op2_insn->op == IR_NE || op2_insn->op == IR_LT || op2_insn->op == IR_GE))) { if (ir_op_flags[op1_insn->op] & IR_OP_FLAG_COMMUTATIVE) { - ir_match_fuse_load_commutative_int(ctx, op1_insn, ref); + if (ctx->use_lists[insn->op2].count == 1) { + ir_match_fuse_load_commutative_int(ctx, op1_insn, ref); + } ctx->rules[op2_insn->op1] = IR_BINOP_INT | IR_MAY_SWAP; } else { - ir_match_fuse_load(ctx, op1_insn->op2, ref); + if (ctx->use_lists[insn->op2].count == 1) { + ir_match_fuse_load(ctx, op1_insn->op2, ref); + } ctx->rules[op2_insn->op1] = IR_BINOP_INT; } /* v = BINOP(_, _); c = CMP(v, 0) ... IF(c) => BINOP; SKIP_CMP ... GUARD_JCC */ @@ -2875,6 +3110,7 @@ return IR_GUARD_JCC_INT; } } else if ((ctx->flags & IR_OPT_CODEGEN) + && ctx->use_lists[insn->op2].count == 1 && op2_insn->op1 == insn->op2 - 2 /* before previous instruction */ && ir_in_same_block(ctx, op2_insn->op1) && ctx->use_lists[op2_insn->op1].count == 2) { @@ -2922,12 +3158,16 @@ } } /* c = CMP(_, _) ... GUARD(c) => SKIP_CMP ... GUARD_CMP */ - ir_match_fuse_load_cmp_int(ctx, op2_insn, ref); + if (ctx->use_lists[insn->op2].count == 1) { + ir_match_fuse_load_cmp_int(ctx, op2_insn, ref); + } ctx->rules[insn->op2] = IR_FUSED | IR_CMP_INT; return IR_GUARD_CMP_INT; } else { /* c = CMP(_, _) ... GUARD(c) => SKIP_CMP ... GUARD_CMP */ - ir_match_fuse_load_cmp_fp_br(ctx, op2_insn, ref, insn->op == IR_GUARD_NOT); + if (ctx->use_lists[insn->op2].count == 1) { + ir_match_fuse_load_cmp_fp_br(ctx, op2_insn, ref); + } ctx->rules[insn->op2] = IR_FUSED | IR_CMP_FP; return IR_GUARD_CMP_FP; } @@ -3175,7 +3415,7 @@ | xorpd xmm(reg-IR_REG_FP_FIRST), xmm(reg-IR_REG_FP_FIRST) } } else { - label = ir_const_label(ctx, src); + label = ir_get_const_label(ctx, src); | ASM_FP_REG_TXT_OP movs, type, reg, [=>label] } } @@ -3229,6 +3469,38 @@ } } +static void ir_resolve_label_syms(ir_ctx *ctx) +{ + uint32_t b; + ir_block *bb; + + for (b = 1, bb = &ctx->cfg_blocks[b]; b <= ctx->cfg_blocks_count; bb++, b++) { + ir_insn *insn = &ctx->ir_base[bb->start]; + + if (insn->op == IR_BEGIN && insn->op2) { + IR_ASSERT(ctx->ir_base[insn->op2].op == IR_LABEL); + ctx->ir_base[insn->op2].val.u32_hi = b; + } + } +} + +static void ir_emit_load_label_addr(ir_ctx *ctx, ir_reg reg, ir_insn *label) +{ + ir_backend_data *data = ctx->data; + dasm_State **Dst = &data->dasm_state; + + if (!data->resolved_label_syms) { + data->resolved_label_syms = 1; + ir_resolve_label_syms(ctx); + } + + IR_ASSERT(label->op == IR_LABEL); + int b = label->val.u32_hi; + + b = ir_skip_empty_target_blocks(ctx, b); + | lea Ra(reg), aword [=>b] +} + static void ir_emit_load(ir_ctx *ctx, ir_type type, ir_reg reg, ir_ref src) { if (IR_IS_CONST_REF(src)) { @@ -3241,9 +3513,11 @@ } else if (insn->op == IR_STR) { ir_backend_data *data = ctx->data; dasm_State **Dst = &data->dasm_state; - int label = ir_const_label(ctx, src); + int label = ir_get_const_label(ctx, src); | lea Ra(reg), aword [=>label] + } else if (insn->op == IR_LABEL) { + ir_emit_load_label_addr(ctx, reg, insn); } else { ir_emit_load_imm_int(ctx, type, reg, insn->val.i64); } @@ -3289,7 +3563,7 @@ IR_ASSERT(IR_IS_CONST_REF(src)); if (val_insn->op == IR_STR) { - int label = ir_const_label(ctx, src); + int label = ir_get_const_label(ctx, src); IR_ASSERT(tmp_reg != IR_REG_NONE); |.if X64 @@ -3298,6 +3572,11 @@ |.else | ASM_TMEM_TXT_OP mov, aword, mem, =>label |.endif + } else if (val_insn->op == IR_LABEL) { + IR_ASSERT(tmp_reg != IR_REG_NONE); + tmp_reg = IR_REG_NUM(tmp_reg); + ir_emit_load_label_addr(ctx, tmp_reg, val_insn); + ir_emit_store_mem_int(ctx, type, mem, tmp_reg); } else { int64_t val = val_insn->val.i64; @@ -3726,7 +4005,8 @@ ir_insn *load_insn = &ctx->ir_base[ref]; ir_reg reg; - IR_ASSERT(load_insn->op == IR_LOAD); + IR_ASSERT(load_insn->op == IR_LOAD || load_insn->op == IR_LOAD_v || + load_insn->op == IR_VLOAD || load_insn->op == IR_VLOAD_v); if (UNEXPECTED(ctx->rules[ref] & IR_FUSED_REG)) { reg = ir_get_fused_reg(ctx, root, ref * sizeof(ir_ref) + 2); } else { @@ -3762,9 +4042,11 @@ } else if (insn->op == IR_STR) { ir_backend_data *data = ctx->data; dasm_State **Dst = &data->dasm_state; - int label = ir_const_label(ctx, src); + int label = ir_get_const_label(ctx, src); | lea Ra(reg), aword [=>label] + } else if (insn->op == IR_LABEL) { + ir_emit_load_label_addr(ctx, reg, insn); } else { ir_emit_load_imm_int(ctx, type, reg, insn->val.i64); } @@ -3836,59 +4118,68 @@ } } if ((ctx->flags & IR_VARARG_FUNC) && (ctx->flags2 & IR_HAS_VA_START)) { -#if defined(_WIN64) - ir_reg fp; - int offset; + const ir_call_conv_dsc *cc = data->ra_data.cc; - if (ctx->flags & IR_USE_FRAME_POINTER) { - fp = IR_REG_FRAME_POINTER; - offset = sizeof(void*) * 2; - } else { - fp = IR_REG_STACK_POINTER; - offset = ctx->stack_frame_size + ctx->call_stack_size + sizeof(void*); - } - | mov [Ra(fp)+offset], Ra(IR_REG_INT_ARG1) - | mov [Ra(fp)+offset+8], Ra(IR_REG_INT_ARG2) - | mov [Ra(fp)+offset+16], Ra(IR_REG_INT_ARG3) - | mov [Ra(fp)+offset+24], Ra(IR_REG_INT_ARG4) -#elif defined(IR_TARGET_X64) -|.if X64 - const int8_t *int_reg_params = _ir_int_reg_params; - const int8_t *fp_reg_params = _ir_fp_reg_params; - uint32_t i; - ir_reg fp; - int offset; - - if (ctx->flags & IR_USE_FRAME_POINTER) { - fp = IR_REG_FRAME_POINTER; + if (cc->shadow_store_size) { + ir_reg fp; + int shadow_store; + int offset = 0; + int n = 0; - offset = -(ctx->stack_frame_size - ctx->stack_frame_alignment - ctx->locals_area_size); - } else { - fp = IR_REG_STACK_POINTER; - offset = ctx->locals_area_size + ctx->call_stack_size; - } + if (ctx->flags & IR_USE_FRAME_POINTER) { + fp = IR_REG_FRAME_POINTER; + shadow_store = sizeof(void*) * 2; + } else { + fp = IR_REG_STACK_POINTER; + shadow_store = ctx->stack_frame_size + ctx->call_stack_size + sizeof(void*); + } - if ((ctx->flags2 & (IR_HAS_VA_ARG_GP|IR_HAS_VA_COPY)) && ctx->gp_reg_params < IR_REG_INT_ARGS) { - /* skip named args */ - offset += sizeof(void*) * ctx->gp_reg_params; - for (i = ctx->gp_reg_params; i < IR_REG_INT_ARGS; i++) { - | mov qword [Ra(fp)+offset], Rq(int_reg_params[i]) + while (offset < cc->shadow_store_size && n < cc->int_param_regs_count) { + | mov [Ra(fp)+shadow_store+offset], Ra(cc->int_param_regs[n]) + n++; offset += sizeof(void*); } } - if ((ctx->flags2 & (IR_HAS_VA_ARG_FP|IR_HAS_VA_COPY)) && ctx->fp_reg_params < IR_REG_FP_ARGS) { - | test al, al - | je >1 - /* skip named args */ - offset += 16 * ctx->fp_reg_params; - for (i = ctx->fp_reg_params; i < IR_REG_FP_ARGS; i++) { - | movaps [Ra(fp)+offset], xmm(fp_reg_params[i]-IR_REG_FP_FIRST) - offset += 16; + + if (cc->sysv_varargs) { + IR_ASSERT(sizeof(void*) == 8); +#ifdef IR_TARGET_X64 +|.if X64 + int32_t i; + ir_reg fp; + int offset; + + if (ctx->flags & IR_USE_FRAME_POINTER) { + fp = IR_REG_FRAME_POINTER; + + offset = -(ctx->stack_frame_size - ctx->locals_area_size); + } else { + fp = IR_REG_STACK_POINTER; + offset = ctx->locals_area_size + ctx->call_stack_size; + } + + if ((ctx->flags2 & (IR_HAS_VA_ARG_GP|IR_HAS_VA_COPY)) && ctx->gp_reg_params < cc->int_param_regs_count) { + /* skip named args */ + offset += sizeof(void*) * ctx->gp_reg_params; + for (i = ctx->gp_reg_params; i < cc->int_param_regs_count; i++) { + | mov qword [Ra(fp)+offset], Rq(cc->int_param_regs[i]) + offset += sizeof(void*); + } + } + if ((ctx->flags2 & (IR_HAS_VA_ARG_FP|IR_HAS_VA_COPY)) && ctx->fp_reg_params < cc->fp_param_regs_count) { + | test al, al + | je >1 + /* skip named args */ + offset += 16 * ctx->fp_reg_params; + for (i = ctx->fp_reg_params; i < cc->fp_param_regs_count; i++) { + | movaps [Ra(fp)+offset], xmm(cc->fp_param_regs[i]-IR_REG_FP_FIRST) + offset += 16; + } + |1: } - |1: - } |.endif #endif + } } } @@ -5607,7 +5898,7 @@ break; } } else if (IR_IS_CONST_REF(op2)) { - int label = ir_const_label(ctx, op2); + int label = ir_get_const_label(ctx, op2); switch (insn->op) { default: @@ -5714,7 +6005,7 @@ break; } } else if (IR_IS_CONST_REF(op2)) { - int label = ir_const_label(ctx, op2); + int label = ir_get_const_label(ctx, op2); switch (insn->op) { default: @@ -5821,8 +6112,15 @@ ir_type type = ctx->ir_base[cmp_insn->op1].type; ir_ref op1 = cmp_insn->op1; ir_ref op2 = cmp_insn->op2; - ir_reg op1_reg = ctx->regs[ref][1]; - ir_reg op2_reg = ctx->regs[ref][2]; + ir_reg op1_reg, op2_reg; + + if (UNEXPECTED(ctx->rules[ref] & IR_FUSED_REG)) { + op1_reg = ir_get_fused_reg(ctx, root, ref * sizeof(ir_ref) + 1); + op2_reg = ir_get_fused_reg(ctx, root, ref * sizeof(ir_ref) + 2); + } else { + op1_reg = ctx->regs[ref][1]; + op2_reg = ctx->regs[ref][2]; + } if (op1_reg != IR_REG_NONE && IR_REG_SPILLED(op1_reg)) { op1_reg = IR_REG_NUM(op1_reg); @@ -5988,8 +6286,15 @@ ir_type type = binop_insn->type; ir_ref op1 = binop_insn->op1; ir_ref op2 = binop_insn->op2; - ir_reg op1_reg = ctx->regs[ref][1]; - ir_reg op2_reg = ctx->regs[ref][2]; + ir_reg op1_reg, op2_reg; + + if (UNEXPECTED(ctx->rules[ref] & IR_FUSED_REG)) { + op1_reg = ir_get_fused_reg(ctx, root, ref * sizeof(ir_ref) + 1); + op2_reg = ir_get_fused_reg(ctx, root, ref * sizeof(ir_ref) + 2); + } else { + op1_reg = ctx->regs[ref][1]; + op2_reg = ctx->regs[ref][2]; + } IR_ASSERT(binop_insn->op == IR_AND); if (op1_reg != IR_REG_NONE) { @@ -6099,8 +6404,13 @@ op1 = cmp_insn->op1; op2 = cmp_insn->op2; - op1_reg = ctx->regs[cmp_ref][1]; - op2_reg = ctx->regs[cmp_ref][2]; + if (UNEXPECTED(ctx->rules[cmp_ref] & IR_FUSED_REG)) { + op1_reg = ir_get_fused_reg(ctx, root, cmp_ref * sizeof(ir_ref) + 1); + op2_reg = ir_get_fused_reg(ctx, root, cmp_ref * sizeof(ir_ref) + 2); + } else { + op1_reg = ctx->regs[cmp_ref][1]; + op2_reg = ctx->regs[cmp_ref][2]; + } if (op1_reg == IR_REG_NONE && op2_reg != IR_REG_NONE && (op == IR_EQ || op == IR_NE)) { ir_reg tmp_reg; @@ -6126,7 +6436,7 @@ } | ASM_FP_REG_REG_OP ucomis, type, op1_reg, op2_reg } else if (IR_IS_CONST_REF(op2)) { - int label = ir_const_label(ctx, op2); + int label = ir_get_const_label(ctx, op2); | ASM_FP_REG_TXT_OP ucomis, type, op1_reg, [=>label] } else { @@ -6373,8 +6683,15 @@ ir_type type = ctx->ir_base[cmp_insn->op1].type; ir_ref op1 = cmp_insn->op1; ir_ref op2 = cmp_insn->op2; - ir_reg op1_reg = ctx->regs[insn->op2][1]; - ir_reg op2_reg = ctx->regs[insn->op2][2]; + ir_reg op1_reg, op2_reg; + + if (UNEXPECTED(ctx->rules[insn->op2] & IR_FUSED_REG)) { + op1_reg = ir_get_fused_reg(ctx, def, insn->op2 * sizeof(ir_ref) + 1); + op2_reg = ir_get_fused_reg(ctx, def, insn->op2 * sizeof(ir_ref) + 2); + } else { + op1_reg = ctx->regs[insn->op2][1]; + op2_reg = ctx->regs[insn->op2][2]; + } if (op1_reg != IR_REG_NONE && IR_REG_SPILLED(op1_reg)) { op1_reg = IR_REG_NUM(op1_reg); @@ -6505,37 +6822,24 @@ IR_ASSERT(def_reg != IR_REG_NONE); - if (op2 != op3) { - if (op2_reg != IR_REG_NONE && IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, type, op2_reg, op2); - if (op1 == op2) { - op1_reg = op2_reg; - } - } - if (op3_reg != IR_REG_NONE && IR_REG_SPILLED(op3_reg)) { - op3_reg = IR_REG_NUM(op3_reg); - ir_emit_load(ctx, type, op3_reg, op3); - if (op1 == op2) { - op1_reg = op3_reg; - } - } - } else if (op2_reg != IR_REG_NONE && IR_REG_SPILLED(op2_reg)) { + if (op2_reg != IR_REG_NONE && IR_REG_SPILLED(op2_reg)) { op2_reg = IR_REG_NUM(op2_reg); ir_emit_load(ctx, type, op2_reg, op2); - op3_reg = op2_reg; if (op1 == op2) { op1_reg = op2_reg; } - } else if (op3_reg != IR_REG_NONE && IR_REG_SPILLED(op3_reg)) { + if (op3 == op2) { + op3_reg = op2_reg; + } + } + if (op3_reg != IR_REG_NONE && IR_REG_SPILLED(op3_reg)) { op3_reg = IR_REG_NUM(op3_reg); ir_emit_load(ctx, type, op3_reg, op3); - op2_reg = op3_reg; if (op1 == op3) { - op1_reg = op3_reg; + op1_reg = op2_reg; } } - if (op1_reg != IR_REG_NONE && op1 != op2 && op1 != op3 && IR_REG_SPILLED(op1_reg)) { + if (op1_reg != IR_REG_NONE && IR_REG_SPILLED(op1_reg)) { op1_reg = IR_REG_NUM(op1_reg); ir_emit_load(ctx, op1_type, op1_reg, op1); } @@ -6544,7 +6848,13 @@ if (op1_reg != IR_REG_NONE) { | ASM_REG_REG_OP test, op1_type, op1_reg, op1_reg } else { - ir_mem mem = ir_ref_spill_slot(ctx, op1); + ir_mem mem; + + if (ir_rule(ctx, insn->op1) & IR_FUSED) { + mem = ir_fuse_load(ctx, def, insn->op1); + } else { + mem = ir_ref_spill_slot(ctx, insn->op1); + } | ASM_MEM_IMM_OP cmp, op1_type, mem, 0 } @@ -6634,6 +6944,115 @@ } } +static void ir_emit_cond_test_int(ir_ctx *ctx, ir_ref def, ir_insn *insn) +{ + ir_backend_data *data = ctx->data; + dasm_State **Dst = &data->dasm_state; + ir_type type = insn->type; + ir_ref op2 = insn->op2; + ir_ref op3 = insn->op3; + ir_reg def_reg = IR_REG_NUM(ctx->regs[def][0]); + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg op3_reg = ctx->regs[def][3]; + + if (op2 != op3) { + if (op2_reg != IR_REG_NONE && IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, type, op2_reg, op2); + } + if (op3_reg != IR_REG_NONE && IR_REG_SPILLED(op3_reg)) { + op3_reg = IR_REG_NUM(op3_reg); + ir_emit_load(ctx, type, op3_reg, op3); + } + } else if (op2_reg != IR_REG_NONE && IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, type, op2_reg, op2); + op3_reg = op2_reg; + } else if (op3_reg != IR_REG_NONE && IR_REG_SPILLED(op3_reg)) { + op3_reg = IR_REG_NUM(op3_reg); + ir_emit_load(ctx, type, op3_reg, op3); + op2_reg = op3_reg; + } + + ir_emit_test_int_common(ctx, def, insn->op1, IR_NE); + + if (IR_IS_TYPE_INT(type)) { + bool eq = 0; + + if (op3_reg != IR_REG_NONE) { + if (op3_reg == def_reg) { + IR_ASSERT(op2_reg != IR_REG_NONE); + op3_reg = op2_reg; + eq = 1; // reverse + } else { + if (op2_reg != IR_REG_NONE) { + if (def_reg != op2_reg) { +// if (IR_IS_TYPE_INT(type)) { + ir_emit_mov(ctx, type, def_reg, op2_reg); +// } else { +// ir_emit_fp_mov(ctx, type, def_reg, op2_reg); +// } + } + } else if (IR_IS_CONST_REF(op2) && !IR_IS_SYM_CONST(ctx->ir_base[op2].op)) { + /* prevent "xor" and flags clobbering */ + ir_emit_mov_imm_int(ctx, type, def_reg, ctx->ir_base[op2].val.i64); + } else { + ir_emit_load_ex(ctx, type, def_reg, op2, def); + } + } + } else { + IR_ASSERT(op2_reg != IR_REG_NONE && op2_reg != def_reg); + if (IR_IS_CONST_REF(op3) && !IR_IS_SYM_CONST(ctx->ir_base[op3].op)) { + /* prevent "xor" and flags clobbering */ + ir_emit_mov_imm_int(ctx, type, def_reg, ctx->ir_base[op3].val.i64); + } else { + ir_emit_load_ex(ctx, type, def_reg, op3, def); + } + op3_reg = op2_reg; + eq = 1; // reverse + } + + if (eq) { + | ASM_REG_REG_OP2 cmovne, type, def_reg, op3_reg + } else { + | ASM_REG_REG_OP2 cmove, type, def_reg, op3_reg + } + } else { + | jne >2 + |1: + + if (op2_reg != IR_REG_NONE) { + if (def_reg != op2_reg) { + if (IR_IS_TYPE_INT(type)) { + ir_emit_mov(ctx, type, def_reg, op2_reg); + } else { + ir_emit_fp_mov(ctx, type, def_reg, op2_reg); + } + } + } else { + ir_emit_load_ex(ctx, type, def_reg, op2, def); + } + | jmp >3 + |2: + if (op3_reg != IR_REG_NONE) { + if (def_reg != op3_reg) { + if (IR_IS_TYPE_INT(type)) { + ir_emit_mov(ctx, type, def_reg, op3_reg); + } else { + ir_emit_fp_mov(ctx, type, def_reg, op3_reg); + } + } + } else { + ir_emit_load_ex(ctx, type, def_reg, op3, def); + } + |3: + } + + if (IR_REG_SPILLED(ctx->regs[def][0])) { + ir_emit_store(ctx, type, def, def_reg); + } +} + static void ir_emit_cond_cmp_int(ir_ctx *ctx, ir_ref def, ir_insn *insn) { ir_backend_data *data = ctx->data; @@ -6924,27 +7343,26 @@ ir_emit_epilogue(ctx); -#ifdef IR_TARGET_X86 - if (sizeof(void*) == 4 && (ctx->flags & IR_FASTCALL_FUNC) && ctx->param_stack_size) { + if (data->ra_data.cc->cleanup_stack_by_callee && ctx->param_stack_size) { | ret ctx->param_stack_size - return; + } else { + | ret } -#endif - - | ret } static void ir_emit_return_int(ir_ctx *ctx, ir_ref ref, ir_insn *insn) { + ir_backend_data *data = ctx->data; + ir_reg ret_reg = data->ra_data.cc->int_ret_reg; ir_reg op2_reg = ctx->regs[ref][2]; - if (op2_reg != IR_REG_INT_RET1) { + if (op2_reg != ret_reg) { ir_type type = ctx->ir_base[insn->op2].type; if (op2_reg != IR_REG_NONE && !IR_REG_SPILLED(op2_reg)) { - ir_emit_mov(ctx, type, IR_REG_INT_RET1, op2_reg); + ir_emit_mov(ctx, type, ret_reg, op2_reg); } else { - ir_emit_load(ctx, type, IR_REG_INT_RET1, insn->op2); + ir_emit_load(ctx, type, ret_reg, insn->op2); } } ir_emit_return_void(ctx); @@ -6952,64 +7370,68 @@ static void ir_emit_return_fp(ir_ctx *ctx, ir_ref ref, ir_insn *insn) { + ir_backend_data *data = ctx->data; ir_reg op2_reg = ctx->regs[ref][2]; ir_type type = ctx->ir_base[insn->op2].type; + ir_reg ret_reg = data->ra_data.cc->fp_ret_reg; -#ifdef IR_REG_FP_RET1 - if (op2_reg != IR_REG_FP_RET1) { + if (op2_reg != ret_reg && ret_reg != IR_REG_NONE) { if (op2_reg != IR_REG_NONE && !IR_REG_SPILLED(op2_reg)) { - ir_emit_fp_mov(ctx, type, IR_REG_FP_RET1, op2_reg); + ir_emit_fp_mov(ctx, type, ret_reg, op2_reg); } else { - ir_emit_load(ctx, type, IR_REG_FP_RET1, insn->op2); + ir_emit_load(ctx, type, ret_reg, insn->op2); } } -#else - ir_backend_data *data = ctx->data; - dasm_State **Dst = &data->dasm_state; - if (IR_IS_CONST_REF(insn->op2)) { - ir_insn *value = &ctx->ir_base[insn->op2]; +#ifdef IR_TARGET_X86 + if (ret_reg == IR_REG_NONE) { + dasm_State **Dst = &data->dasm_state; - if ((type == IR_FLOAT && value->val.f == 0.0) || (type == IR_DOUBLE && value->val.d == 0.0)) { - | fldz - } else if ((type == IR_FLOAT && value->val.f == 1.0) || (type == IR_DOUBLE && value->val.d == 1.0)) { - | fld1 - } else { - int label = ir_const_label(ctx, insn->op2); + if (IR_IS_CONST_REF(insn->op2)) { + ir_insn *value = &ctx->ir_base[insn->op2]; + + if ((type == IR_FLOAT && value->val.f == 0.0) || (type == IR_DOUBLE && value->val.d == 0.0)) { + | fldz + } else if ((type == IR_FLOAT && value->val.f == 1.0) || (type == IR_DOUBLE && value->val.d == 1.0)) { + | fld1 + } else { + int label = ir_get_const_label(ctx, insn->op2); + + if (type == IR_DOUBLE) { + | fld qword [=>label] + } else { + IR_ASSERT(type == IR_FLOAT); + | fld dword [=>label] + } + } + } else if (op2_reg == IR_REG_NONE || IR_REG_SPILLED(op2_reg)) { + ir_reg fp; + int32_t offset = ir_ref_spill_slot_offset(ctx, insn->op2, &fp); if (type == IR_DOUBLE) { - | fld qword [=>label] + | fld qword [Ra(fp)+offset] } else { IR_ASSERT(type == IR_FLOAT); - | fld dword [=>label] + | fld dword [Ra(fp)+offset] } - } - } else if (op2_reg == IR_REG_NONE || IR_REG_SPILLED(op2_reg)) { - ir_reg fp; - int32_t offset = ir_ref_spill_slot_offset(ctx, insn->op2, &fp); - - if (type == IR_DOUBLE) { - | fld qword [Ra(fp)+offset] } else { - IR_ASSERT(type == IR_FLOAT); - | fld dword [Ra(fp)+offset] - } - } else { - int32_t offset = ctx->ret_slot; - ir_reg fp; + int32_t offset = ctx->ret_slot; + ir_reg fp; - IR_ASSERT(offset != -1); - offset = IR_SPILL_POS_TO_OFFSET(offset); - fp = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - ir_emit_store_mem_fp(ctx, type, IR_MEM_BO(fp, offset), op2_reg); - if (type == IR_DOUBLE) { - | fld qword [Ra(fp)+offset] - } else { - IR_ASSERT(type == IR_FLOAT); - | fld dword [Ra(fp)+offset] + IR_ASSERT(offset != -1); + offset = IR_SPILL_POS_TO_OFFSET(offset); + fp = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + ir_emit_store_mem_fp(ctx, type, IR_MEM_BO(fp, offset), op2_reg); + if (type == IR_DOUBLE) { + | fld qword [Ra(fp)+offset] + } else { + IR_ASSERT(type == IR_FLOAT); + | fld dword [Ra(fp)+offset] + } } } #endif + ir_emit_return_void(ctx); } @@ -7260,7 +7682,20 @@ ir_emit_load(ctx, src_type, op1_reg, insn->op1); } if (op1_reg != def_reg) { +#ifdef IR_TARGET_X86 + if (ir_type_size[dst_type] == 1 + && (op1_reg == IR_REG_RBP || op1_reg == IR_REG_RSI || op1_reg == IR_REG_RDI)) { + ir_backend_data *data = ctx->data; + dasm_State **Dst = &data->dasm_state; + + ir_emit_mov(ctx, src_type, def_reg, op1_reg); + | and Rb(def_reg), 0xff + } else { + ir_emit_mov(ctx, dst_type, def_reg, op1_reg); + } +#else ir_emit_mov(ctx, dst_type, def_reg, op1_reg); +#endif } } else { ir_emit_load_ex(ctx, dst_type, def_reg, insn->op1, def); @@ -7385,7 +7820,7 @@ } } } else if (IR_IS_CONST_REF(insn->op1)) { - int label = ir_const_label(ctx, insn->op1); + int label = ir_get_const_label(ctx, insn->op1); | ASM_FP_REG_TXT_OP movs, dst_type, def_reg, [=>label] } else { @@ -7417,13 +7852,80 @@ IR_ASSERT(IR_IS_TYPE_INT(src_type)); IR_ASSERT(IR_IS_TYPE_FP(dst_type)); IR_ASSERT(def_reg != IR_REG_NONE); + + if (op1_reg != IR_REG_NONE && IR_REG_SPILLED(op1_reg)) { + op1_reg = IR_REG_NUM(op1_reg); + ir_emit_load(ctx, src_type, op1_reg, insn->op1); + } + + if (IR_IS_TYPE_UNSIGNED(src_type) && ir_type_size[src_type] >= sizeof(void*)) { + ir_reg tmp_reg = ctx->regs[def][2]; + + IR_ASSERT(tmp_reg != IR_REG_NONE); + if (op1_reg == IR_REG_NONE) { + if (IR_IS_CONST_REF(insn->op1)) { + IR_ASSERT(0); + } else { + ir_mem mem; + + if (ir_rule(ctx, insn->op1) & IR_FUSED) { + mem = ir_fuse_load(ctx, def, insn->op1); + } else { + mem = ir_ref_spill_slot(ctx, insn->op1); + } + ir_emit_load_mem_int(ctx, src_type, tmp_reg, mem); + op1_reg = tmp_reg; + } + } + if (sizeof(void*) == 4) { + if (tmp_reg == op1_reg) { + | add Rd(op1_reg), 0x80000000 + } else { + | lea Rd(tmp_reg), dword [Rd(op1_reg)+0x80000000] + op1_reg = tmp_reg; + } + } else { +|.if X64 + | test Rq(op1_reg), Rq(op1_reg) + | js >1 + |.cold_code + |1: + if (tmp_reg != op1_reg) { + | mov Rq(tmp_reg), Rq(op1_reg) + } + | shr Rq(tmp_reg), 1 + | adc Rq(tmp_reg), 0 + if (dst_type == IR_DOUBLE) { + if (ctx->mflags & IR_X86_AVX) { + | vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST) + | vcvtsi2sd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), Rq(tmp_reg) + | vaddsd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST) + } else { + | pxor xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST) + | cvtsi2sd xmm(def_reg-IR_REG_FP_FIRST), Rq(tmp_reg) + | addsd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST) + } + } else { + IR_ASSERT(dst_type == IR_FLOAT); + if (ctx->mflags & IR_X86_AVX) { + | vxorps xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST) + | vcvtsi2ss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), Rq(tmp_reg) + | vaddss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST) + } else { + | pxor xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST) + | cvtsi2ss xmm(def_reg-IR_REG_FP_FIRST), Rq(tmp_reg) + | addss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST) + } + } + | jmp >2 + |.code +|.endif + } + } + if (op1_reg != IR_REG_NONE) { bool src64 = 0; - if (IR_REG_SPILLED(op1_reg)) { - op1_reg = IR_REG_NUM(op1_reg); - ir_emit_load(ctx, src_type, op1_reg, insn->op1); - } if (IR_IS_TYPE_SIGNED(src_type)) { if (ir_type_size[src_type] < 4) { |.if X64 @@ -7462,7 +7964,6 @@ || } |.endif } else { - // TODO: uint64_t -> double src64 = 1; } } @@ -7508,6 +8009,40 @@ } |.endif } + |2: + if (sizeof(void*) == 4 && IR_IS_TYPE_UNSIGNED(src_type) && ir_type_size[src_type] >= sizeof(void*)) { + if (dst_type == IR_DOUBLE) { + uint32_t c = (sizeof(void*) == 4) ? 0x41e00000 : 0x43e00000; + if (!data->u2d_const) { + data->u2d_const = 1; + ir_rodata(ctx); + |.align 8 + |->u2d_const: + |.dword 0, c + |.code + } + if (ctx->mflags & IR_X86_AVX) { + | vaddsd xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), qword [->u2d_const] + } else { + | addsd xmm(def_reg-IR_REG_FP_FIRST), qword [->u2d_const] + } + } else { + uint32_t c = (sizeof(void*) == 4) ? 0x4f000000 : 0x5f000000; + if (!data->u2f_const) { + data->u2f_const = 1; + ir_rodata(ctx); + |.align 4 + |->u2f_const: + |.dword c + |.code + } + if (ctx->mflags & IR_X86_AVX) { + | vaddss xmm(def_reg-IR_REG_FP_FIRST), xmm(def_reg-IR_REG_FP_FIRST), dword [->u2f_const] + } else { + | addss xmm(def_reg-IR_REG_FP_FIRST), dword [->u2f_const] + } + } + } } else if (IR_IS_CONST_REF(insn->op1)) { IR_ASSERT(0); } else { @@ -7625,7 +8160,7 @@ |.endif } } else if (IR_IS_CONST_REF(insn->op1)) { - int label = ir_const_label(ctx, insn->op1); + int label = ir_get_const_label(ctx, insn->op1); if (!dst64) { if (src_type == IR_DOUBLE) { @@ -7746,7 +8281,7 @@ } } } else if (IR_IS_CONST_REF(insn->op1)) { - int label = ir_const_label(ctx, insn->op1); + int label = ir_get_const_label(ctx, insn->op1); if (src_type == IR_DOUBLE) { if (ctx->mflags & IR_X86_AVX) { @@ -8371,327 +8906,323 @@ static void ir_emit_va_start(ir_ctx *ctx, ir_ref def, ir_insn *insn) { -#if defined(_WIN64) || defined(IR_TARGET_X86) ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; dasm_State **Dst = &data->dasm_state; - ir_reg fp; - int arg_area_offset; - ir_reg op2_reg = ctx->regs[def][2]; - ir_reg tmp_reg = ctx->regs[def][3]; - int32_t offset; - IR_ASSERT(tmp_reg != IR_REG_NONE); - if (op2_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + if (!cc->sysv_varargs) { + ir_reg fp; + int arg_area_offset; + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg tmp_reg = ctx->regs[def][3]; + int32_t offset; + + IR_ASSERT(tmp_reg != IR_REG_NONE); + if (op2_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + } + offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); + op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); } - offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); - op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); - } - if (ctx->flags & IR_USE_FRAME_POINTER) { - fp = IR_REG_FRAME_POINTER; - arg_area_offset = sizeof(void*) * 2 + ctx->param_stack_size; + if (ctx->flags & IR_USE_FRAME_POINTER) { + fp = IR_REG_FRAME_POINTER; + arg_area_offset = sizeof(void*) * 2 + ctx->param_stack_size; + } else { + fp = IR_REG_STACK_POINTER; + arg_area_offset = ctx->stack_frame_size + ctx->call_stack_size + sizeof(void*) + ctx->param_stack_size; + } + | lea Ra(tmp_reg), aword [Ra(fp)+arg_area_offset] + | mov aword [Ra(op2_reg)+offset], Ra(tmp_reg) } else { - fp = IR_REG_STACK_POINTER; - arg_area_offset = ctx->stack_frame_size + ctx->call_stack_size + sizeof(void*) + ctx->param_stack_size; - } - | lea Ra(tmp_reg), aword [Ra(fp)+arg_area_offset] - | mov aword [Ra(op2_reg)+offset], Ra(tmp_reg) -#elif defined(IR_TARGET_X64) + IR_ASSERT(sizeof(void*) == 8); +#ifdef IR_TARGET_X64 |.if X64 - ir_backend_data *data = ctx->data; - dasm_State **Dst = &data->dasm_state; - ir_reg fp; - int reg_save_area_offset; - int overflow_arg_area_offset; - ir_reg op2_reg = ctx->regs[def][2]; - ir_reg tmp_reg = ctx->regs[def][3]; - bool have_reg_save_area = 0; - int32_t offset; + ir_reg fp; + int reg_save_area_offset; + int overflow_arg_area_offset; + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg tmp_reg = ctx->regs[def][3]; + bool have_reg_save_area = 0; + int32_t offset; - IR_ASSERT(tmp_reg != IR_REG_NONE); - if (op2_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + IR_ASSERT(tmp_reg != IR_REG_NONE); + if (op2_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + } + offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); + op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); } - offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); - op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); - } - if (ctx->flags & IR_USE_FRAME_POINTER) { - fp = IR_REG_FRAME_POINTER; - reg_save_area_offset = -(ctx->stack_frame_size - ctx->stack_frame_alignment - ctx->locals_area_size); - overflow_arg_area_offset = sizeof(void*) * 2 + ctx->param_stack_size; - } else { - fp = IR_REG_STACK_POINTER; - reg_save_area_offset = ctx->locals_area_size + ctx->call_stack_size; - overflow_arg_area_offset = ctx->stack_frame_size + ctx->call_stack_size + sizeof(void*) + ctx->param_stack_size; - } - - if ((ctx->flags2 & (IR_HAS_VA_ARG_GP|IR_HAS_VA_COPY)) && ctx->gp_reg_params < IR_REG_INT_ARGS) { - | lea Ra(tmp_reg), aword [Ra(fp)+reg_save_area_offset] - have_reg_save_area = 1; - /* Set va_list.gp_offset */ - | mov dword [Ra(op2_reg)+(offset+offsetof(ir_va_list, gp_offset))], sizeof(void*) * ctx->gp_reg_params - } else { - reg_save_area_offset -= sizeof(void*) * IR_REG_INT_ARGS; - /* Set va_list.gp_offset */ - | mov dword [Ra(op2_reg)+(offset+offsetof(ir_va_list, gp_offset))], sizeof(void*) * IR_REG_INT_ARGS - } - if ((ctx->flags2 & (IR_HAS_VA_ARG_FP|IR_HAS_VA_COPY)) && ctx->fp_reg_params < IR_REG_FP_ARGS) { - if (!have_reg_save_area) { + if (ctx->flags & IR_USE_FRAME_POINTER) { + fp = IR_REG_FRAME_POINTER; + reg_save_area_offset = -(ctx->stack_frame_size - ctx->locals_area_size); + overflow_arg_area_offset = sizeof(void*) * 2 + ctx->param_stack_size; + } else { + fp = IR_REG_STACK_POINTER; + reg_save_area_offset = ctx->locals_area_size + ctx->call_stack_size; + overflow_arg_area_offset = ctx->stack_frame_size + ctx->call_stack_size + sizeof(void*) + ctx->param_stack_size; + } + + if ((ctx->flags2 & (IR_HAS_VA_ARG_GP|IR_HAS_VA_COPY)) && ctx->gp_reg_params < cc->int_param_regs_count) { | lea Ra(tmp_reg), aword [Ra(fp)+reg_save_area_offset] have_reg_save_area = 1; - } - /* Set va_list.fp_offset */ - | mov dword [Ra(op2_reg)+(offset+offsetof(ir_va_list, fp_offset))], sizeof(void*) * IR_REG_INT_ARGS + 16 * ctx->fp_reg_params - } else { - /* Set va_list.fp_offset */ - | mov dword [Ra(op2_reg)+(offset+offsetof(ir_va_list, fp_offset))], sizeof(void*) * IR_REG_INT_ARGS + 16 * IR_REG_FP_ARGS - } - if (have_reg_save_area) { - /* Set va_list.reg_save_area */ - | mov qword [Ra(op2_reg)+(offset+offsetof(ir_va_list, reg_save_area))], Ra(tmp_reg) - } - | lea Ra(tmp_reg), aword [Ra(fp)+overflow_arg_area_offset] - /* Set va_list.overflow_arg_area */ - | mov qword [Ra(op2_reg)+(offset+offsetof(ir_va_list, overflow_arg_area))], Ra(tmp_reg) + /* Set va_list.gp_offset */ + | mov dword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, gp_offset))], sizeof(void*) * ctx->gp_reg_params + } else { + reg_save_area_offset -= sizeof(void*) * cc->int_param_regs_count; + /* Set va_list.gp_offset */ + | mov dword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, gp_offset))], sizeof(void*) * cc->int_param_regs_count + } + if ((ctx->flags2 & (IR_HAS_VA_ARG_FP|IR_HAS_VA_COPY)) && ctx->fp_reg_params < cc->fp_param_regs_count) { + if (!have_reg_save_area) { + | lea Ra(tmp_reg), aword [Ra(fp)+reg_save_area_offset] + have_reg_save_area = 1; + } + /* Set va_list.fp_offset */ + | mov dword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, fp_offset))], sizeof(void*) * cc->int_param_regs_count + 16 * ctx->fp_reg_params + } else { + /* Set va_list.fp_offset */ + | mov dword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, fp_offset))], sizeof(void*) * cc->int_param_regs_count + 16 * cc->fp_param_regs_count + } + if (have_reg_save_area) { + /* Set va_list.reg_save_area */ + | mov qword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, reg_save_area))], Ra(tmp_reg) + } + | lea Ra(tmp_reg), aword [Ra(fp)+overflow_arg_area_offset] + /* Set va_list.overflow_arg_area */ + | mov qword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, overflow_arg_area))], Ra(tmp_reg) |.endif -#else - IR_ASSERT(0 && "NIY va_start"); #endif + } } static void ir_emit_va_copy(ir_ctx *ctx, ir_ref def, ir_insn *insn) { -#if defined(_WIN64) || defined(IR_TARGET_X86) ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; dasm_State **Dst = &data->dasm_state; - ir_reg tmp_reg = ctx->regs[def][1]; - ir_reg op2_reg = ctx->regs[def][2]; - ir_reg op3_reg = ctx->regs[def][3]; - int32_t op2_offset, op3_offset; - IR_ASSERT(tmp_reg != IR_REG_NONE); - if (op2_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + if (!cc->sysv_varargs) { + ir_reg tmp_reg = ctx->regs[def][1]; + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg op3_reg = ctx->regs[def][3]; + int32_t op2_offset, op3_offset; + + IR_ASSERT(tmp_reg != IR_REG_NONE); + if (op2_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + } + op2_offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); + op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + op2_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); } - op2_offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); - op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - op2_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); - } - if (op3_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op3_reg)) { - op3_reg = IR_REG_NUM(op3_reg); - ir_emit_load(ctx, IR_ADDR, op3_reg, insn->op3); + if (op3_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op3_reg)) { + op3_reg = IR_REG_NUM(op3_reg); + ir_emit_load(ctx, IR_ADDR, op3_reg, insn->op3); + } + op3_offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op3) == IR_STATIC_ALLOCA); + op3_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + op3_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op3]); } - op3_offset = 0; + | mov Ra(tmp_reg), aword [Ra(op3_reg)+op3_offset] + | mov aword [Ra(op2_reg)+op2_offset], Ra(tmp_reg) } else { - IR_ASSERT(ir_rule(ctx, insn->op3) == IR_STATIC_ALLOCA); - op3_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - op3_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op3]); - } - | mov Ra(tmp_reg), aword [Ra(op3_reg)+op3_offset] - | mov aword [Ra(op2_reg)+op2_offset], Ra(tmp_reg) -#elif defined(IR_TARGET_X64) + IR_ASSERT(sizeof(void*) == 8); +#ifdef IR_TARGET_X64 |.if X64 - ir_backend_data *data = ctx->data; - dasm_State **Dst = &data->dasm_state; - ir_reg tmp_reg = ctx->regs[def][1]; - ir_reg op2_reg = ctx->regs[def][2]; - ir_reg op3_reg = ctx->regs[def][3]; - int32_t op2_offset, op3_offset; + ir_reg tmp_reg = ctx->regs[def][1]; + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg op3_reg = ctx->regs[def][3]; + int32_t op2_offset, op3_offset; - IR_ASSERT(tmp_reg != IR_REG_NONE); - if (op2_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); - } - op2_offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); - op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - op2_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); - } - if (op3_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op3_reg)) { - op3_reg = IR_REG_NUM(op3_reg); - ir_emit_load(ctx, IR_ADDR, op3_reg, insn->op3); + IR_ASSERT(tmp_reg != IR_REG_NONE); + if (op2_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + } + op2_offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); + op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + op2_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); } - op3_offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op3) == IR_STATIC_ALLOCA); - op3_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - op3_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op3]); - } - | mov Rd(tmp_reg), dword [Ra(op3_reg)+(op3_offset+offsetof(ir_va_list, gp_offset))] - | mov dword [Ra(op2_reg)+(op2_offset+offsetof(ir_va_list, gp_offset))], Rd(tmp_reg) - | mov Rd(tmp_reg), dword [Ra(op3_reg)+(op3_offset+offsetof(ir_va_list, fp_offset))] - | mov aword [Ra(op2_reg)+(op2_offset+offsetof(ir_va_list, fp_offset))], Ra(tmp_reg) - | mov Ra(tmp_reg), aword [Ra(op3_reg)+(op3_offset+offsetof(ir_va_list, overflow_arg_area))] - | mov aword [Ra(op2_reg)+(op2_offset+offsetof(ir_va_list, overflow_arg_area))], Ra(tmp_reg) - | mov Ra(tmp_reg), aword [Ra(op3_reg)+(op3_offset+offsetof(ir_va_list, reg_save_area))] - | mov aword [Ra(op2_reg)+(op2_offset+offsetof(ir_va_list, reg_save_area))], Ra(tmp_reg) + if (op3_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op3_reg)) { + op3_reg = IR_REG_NUM(op3_reg); + ir_emit_load(ctx, IR_ADDR, op3_reg, insn->op3); + } + op3_offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op3) == IR_STATIC_ALLOCA); + op3_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + op3_offset = ir_local_offset(ctx, &ctx->ir_base[insn->op3]); + } + | mov Rd(tmp_reg), dword [Ra(op3_reg)+(op3_offset+offsetof(ir_x86_64_sysv_va_list, gp_offset))] + | mov dword [Ra(op2_reg)+(op2_offset+offsetof(ir_x86_64_sysv_va_list, gp_offset))], Rd(tmp_reg) + | mov Rd(tmp_reg), dword [Ra(op3_reg)+(op3_offset+offsetof(ir_x86_64_sysv_va_list, fp_offset))] + | mov aword [Ra(op2_reg)+(op2_offset+offsetof(ir_x86_64_sysv_va_list, fp_offset))], Ra(tmp_reg) + | mov Ra(tmp_reg), aword [Ra(op3_reg)+(op3_offset+offsetof(ir_x86_64_sysv_va_list, overflow_arg_area))] + | mov aword [Ra(op2_reg)+(op2_offset+offsetof(ir_x86_64_sysv_va_list, overflow_arg_area))], Ra(tmp_reg) + | mov Ra(tmp_reg), aword [Ra(op3_reg)+(op3_offset+offsetof(ir_x86_64_sysv_va_list, reg_save_area))] + | mov aword [Ra(op2_reg)+(op2_offset+offsetof(ir_x86_64_sysv_va_list, reg_save_area))], Ra(tmp_reg) |.endif -#else - IR_ASSERT(0 && "NIY va_copy"); #endif + } } static void ir_emit_va_arg(ir_ctx *ctx, ir_ref def, ir_insn *insn) { -#if defined(_WIN64) || defined(IR_TARGET_X86) ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; dasm_State **Dst = &data->dasm_state; - ir_type type = insn->type; - ir_reg def_reg = IR_REG_NUM(ctx->regs[def][0]); - ir_reg op2_reg = ctx->regs[def][2]; - ir_reg tmp_reg = ctx->regs[def][3]; - int32_t offset; - IR_ASSERT((def_reg != IR_REG_NONE || ctx->use_lists[def].count == 1) && tmp_reg != IR_REG_NONE); - if (op2_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + if (!cc->sysv_varargs) { + ir_type type = insn->type; + ir_reg def_reg = IR_REG_NUM(ctx->regs[def][0]); + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg tmp_reg = ctx->regs[def][3]; + int32_t offset; + + IR_ASSERT((def_reg != IR_REG_NONE || ctx->use_lists[def].count == 1) && tmp_reg != IR_REG_NONE); + if (op2_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + } + offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); + op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); } - offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); - op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); - } - | mov Ra(tmp_reg), aword [Ra(op2_reg)+offset] -#ifdef _WIN64 - if (def_reg != IR_REG_NONE) { - ir_emit_load_mem(ctx, type, def_reg, IR_MEM_B(tmp_reg)); - } - | add Ra(tmp_reg), IR_MAX(ir_type_size[type], sizeof(void*)) -#else - if (!insn->op3) { - if (def_reg != IR_REG_NONE) { - ir_emit_load_mem(ctx, type, def_reg, IR_MEM_B(tmp_reg)); + | mov Ra(tmp_reg), aword [Ra(op2_reg)+offset] + if (!cc->pass_struct_by_val || !insn->op3) { + if (def_reg != IR_REG_NONE) { + ir_emit_load_mem(ctx, type, def_reg, IR_MEM_B(tmp_reg)); + } + | add Ra(tmp_reg), IR_MAX(ir_type_size[type], sizeof(void*)) + } else { + int size = IR_VA_ARG_SIZE(insn->op3); + + if (def_reg != IR_REG_NONE) { + IR_ASSERT(type == IR_ADDR); + int align = IR_VA_ARG_ALIGN(insn->op3); + + if (align > (int)sizeof(void*)) { + | add Ra(tmp_reg), (align-1) + | and Ra(tmp_reg), ~(align-1) + } + | mov Ra(def_reg), Ra(tmp_reg) + } + | add Ra(tmp_reg), IR_ALIGNED_SIZE(size, sizeof(void*)) + } + | mov aword [Ra(op2_reg)+offset], Ra(tmp_reg) + if (def_reg != IR_REG_NONE && IR_REG_SPILLED(ctx->regs[def][0])) { + ir_emit_store(ctx, type, def, def_reg); } - | add Ra(tmp_reg), IR_MAX(ir_type_size[type], sizeof(void*)) } else { - int size = (uint32_t)insn->op3 >> 3; + IR_ASSERT(sizeof(void*) == 8); +#ifdef IR_TARGET_X64 +|.if X64 + ir_type type = insn->type; + ir_reg def_reg = IR_REG_NUM(ctx->regs[def][0]); + ir_reg op2_reg = ctx->regs[def][2]; + ir_reg tmp_reg = ctx->regs[def][3]; + int32_t offset; - if (def_reg != IR_REG_NONE) { + IR_ASSERT((def_reg != IR_REG_NONE || ctx->use_lists[def].count == 1) && tmp_reg != IR_REG_NONE); + if (op2_reg != IR_REG_NONE) { + if (IR_REG_SPILLED(op2_reg)) { + op2_reg = IR_REG_NUM(op2_reg); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + } + offset = 0; + } else { + IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); + op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); + } + if (insn->op3) { + /* long struct arguemnt */ IR_ASSERT(type == IR_ADDR); - int align = 1U << (insn->op3 & 0x7); + int align = IR_VA_ARG_ALIGN(insn->op3); + int size = IR_VA_ARG_SIZE(insn->op3); + | mov Ra(tmp_reg), aword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, overflow_arg_area))] if (align > (int)sizeof(void*)) { | add Ra(tmp_reg), (align-1) | and Ra(tmp_reg), ~(align-1) } - | mov Ra(def_reg), Ra(tmp_reg) - } - | add Ra(tmp_reg), IR_ALIGNED_SIZE(size, sizeof(void*)) - } -#endif - | mov aword [Ra(op2_reg)+offset], Ra(tmp_reg) - if (def_reg && IR_REG_SPILLED(ctx->regs[def][0])) { - ir_emit_store(ctx, type, def, def_reg); - } -#elif defined(IR_TARGET_X64) -|.if X64 - ir_backend_data *data = ctx->data; - dasm_State **Dst = &data->dasm_state; - ir_type type = insn->type; - ir_reg def_reg = IR_REG_NUM(ctx->regs[def][0]); - ir_reg op2_reg = ctx->regs[def][2]; - ir_reg tmp_reg = ctx->regs[def][3]; - int32_t offset; - - IR_ASSERT((def_reg != IR_REG_NONE || ctx->use_lists[def].count == 1) && tmp_reg != IR_REG_NONE); - if (op2_reg != IR_REG_NONE) { - if (IR_REG_SPILLED(op2_reg)) { - op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); - } - offset = 0; - } else { - IR_ASSERT(ir_rule(ctx, insn->op2) == IR_STATIC_ALLOCA); - op2_reg = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; - offset = ir_local_offset(ctx, &ctx->ir_base[insn->op2]); - } - if (insn->op3) { - /* long struct arguemnt */ - IR_ASSERT(type == IR_ADDR); - int align = 1U << (insn->op3 & 0x7); - int size = (uint32_t)insn->op3 >> 3; - - | mov Ra(tmp_reg), aword [Ra(op2_reg)+(offset+offsetof(ir_va_list, overflow_arg_area))] - if (align > (int)sizeof(void*)) { - | add Ra(tmp_reg), (align-1) - | and Ra(tmp_reg), ~(align-1) - } - if (def_reg != IR_REG_NONE) { - | mov Ra(def_reg), Ra(tmp_reg) - } - | add Ra(tmp_reg), IR_ALIGNED_SIZE(size, sizeof(void*)) - | mov aword [Ra(op2_reg)+(offset+offsetof(ir_va_list, overflow_arg_area))], Ra(tmp_reg) - } else if (IR_IS_TYPE_INT(type)) { - | mov Rd(tmp_reg), dword [Ra(op2_reg)+(offset+offsetof(ir_va_list, gp_offset))] - | cmp Rd(tmp_reg), sizeof(void*)*IR_REG_INT_ARGS - | jge >1 - | add Rd(tmp_reg), sizeof(void*) - | mov dword [Ra(op2_reg)+(offset+offsetof(ir_va_list, gp_offset))], Rd(tmp_reg) - | add Ra(tmp_reg), aword [Ra(op2_reg)+(offset+offsetof(ir_va_list, reg_save_area))] - | jmp >2 - |1: - | mov Ra(tmp_reg), aword [Ra(op2_reg)+(offset+offsetof(ir_va_list, overflow_arg_area))] - | add Ra(tmp_reg), sizeof(void*) - | mov aword [Ra(op2_reg)+(offset+offsetof(ir_va_list, overflow_arg_area))], Ra(tmp_reg) - |2: - if (def_reg != IR_REG_NONE) { - if (ir_type_size[type] == 8) { - | mov Rq(def_reg), qword [Ra(tmp_reg)-sizeof(void*)] - } else { - | mov Rd(def_reg), dword [Ra(tmp_reg)-sizeof(void*)] + if (def_reg != IR_REG_NONE) { + | mov Ra(def_reg), Ra(tmp_reg) } + | add Ra(tmp_reg), IR_ALIGNED_SIZE(size, sizeof(void*)) + | mov aword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, overflow_arg_area))], Ra(tmp_reg) + } else if (IR_IS_TYPE_INT(type)) { + | mov Rd(tmp_reg), dword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, gp_offset))] + | cmp Rd(tmp_reg), sizeof(void*) * cc->int_param_regs_count + | jge >1 + | add Rd(tmp_reg), sizeof(void*) + | mov dword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, gp_offset))], Rd(tmp_reg) + | add Ra(tmp_reg), aword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, reg_save_area))] + | jmp >2 + |1: + | mov Ra(tmp_reg), aword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, overflow_arg_area))] + | add Ra(tmp_reg), sizeof(void*) + | mov aword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, overflow_arg_area))], Ra(tmp_reg) + |2: + if (def_reg != IR_REG_NONE) { + if (ir_type_size[type] == 8) { + | mov Rq(def_reg), qword [Ra(tmp_reg)-sizeof(void*)] + } else { + | mov Rd(def_reg), dword [Ra(tmp_reg)-sizeof(void*)] + } + } + } else { + | mov Rd(tmp_reg), dword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, fp_offset))] + | cmp Rd(tmp_reg), sizeof(void*) * cc->int_param_regs_count + 16 * cc->fp_param_regs_count + | jge >1 + | add Rd(tmp_reg), 16 + | mov dword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, fp_offset))], Rd(tmp_reg) + | add Ra(tmp_reg), aword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, reg_save_area))] + if (def_reg != IR_REG_NONE) { + ir_emit_load_mem_fp(ctx, type, def_reg, IR_MEM_BO(tmp_reg, -16)); + } + | jmp >2 + |1: + | mov Ra(tmp_reg), aword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, overflow_arg_area))] + if (def_reg != IR_REG_NONE) { + ir_emit_load_mem_fp(ctx, type, def_reg, IR_MEM_BO(tmp_reg, 0)); + } + | add Ra(tmp_reg), 8 + | mov aword [Ra(op2_reg)+(offset+offsetof(ir_x86_64_sysv_va_list, overflow_arg_area))], Ra(tmp_reg) + |2: } - } else { - | mov Rd(tmp_reg), dword [Ra(op2_reg)+(offset+offsetof(ir_va_list, fp_offset))] - | cmp Rd(tmp_reg), sizeof(void*) * IR_REG_INT_ARGS + 16 * IR_REG_FP_ARGS - | jge >1 - | add Rd(tmp_reg), 16 - | mov dword [Ra(op2_reg)+(offset+offsetof(ir_va_list, fp_offset))], Rd(tmp_reg) - | add Ra(tmp_reg), aword [Ra(op2_reg)+(offset+offsetof(ir_va_list, reg_save_area))] - if (def_reg != IR_REG_NONE) { - ir_emit_load_mem_fp(ctx, type, def_reg, IR_MEM_BO(tmp_reg, -16)); - } - | jmp >2 - |1: - | mov Ra(tmp_reg), aword [Ra(op2_reg)+(offset+offsetof(ir_va_list, overflow_arg_area))] - if (def_reg != IR_REG_NONE) { - ir_emit_load_mem_fp(ctx, type, def_reg, IR_MEM_BO(tmp_reg, 0)); + if (def_reg != IR_REG_NONE && IR_REG_SPILLED(ctx->regs[def][0])) { + ir_emit_store(ctx, type, def, def_reg); } - | add Ra(tmp_reg), 8 - | mov aword [Ra(op2_reg)+(offset+offsetof(ir_va_list, overflow_arg_area))], Ra(tmp_reg) - |2: - } - if (def_reg != IR_REG_NONE && IR_REG_SPILLED(ctx->regs[def][0])) { - ir_emit_store(ctx, type, def, def_reg); - } |.endif -#else - IR_ASSERT(0 && "NIY va_arg"); #endif + } } static void ir_emit_switch(ir_ctx *ctx, uint32_t b, ir_ref def, ir_insn *insn) @@ -8920,7 +9451,9 @@ val = &ctx->ir_base[use_insn->op2]; IR_ASSERT(!IR_IS_SYM_CONST(val->op)); label = ir_skip_empty_target_blocks(ctx, use_block); - if (IR_IS_32BIT(type, val->val)) { + if (val->val.u64 == 0) { + | ASM_REG_REG_OP test, type, op2_reg, op2_reg + } else if (IR_IS_32BIT(type, val->val)) { | ASM_REG_IMM_OP cmp, type, op2_reg, val->val.i32 } else { IR_ASSERT(sizeof(void*) == 8); @@ -8974,25 +9507,14 @@ } } -static int32_t ir_call_used_stack(ir_ctx *ctx, ir_insn *insn, int *copy_stack_ptr) +static int32_t ir_call_used_stack(ir_ctx *ctx, ir_insn *insn, const ir_call_conv_dsc *cc, int *copy_stack_ptr) { int j, n; ir_type type; int int_param = 0; int fp_param = 0; - int int_reg_params_count = IR_REG_INT_ARGS; - int fp_reg_params_count = IR_REG_FP_ARGS; int32_t used_stack = 0; -#ifdef _WIN64 int32_t copy_stack = 0; -#endif - -#ifdef IR_HAVE_FASTCALL - if (sizeof(void*) == 4 && ir_is_fastcall(ctx, insn)) { - int_reg_params_count = IR_REG_INT_FCARGS; - fp_reg_params_count = IR_REG_FP_FCARGS; - } -#endif n = insn->inputs_count; for (j = 3; j <= n; j++) { @@ -9003,55 +9525,49 @@ int size = arg->op2; int align = arg->op3; -#ifdef _WIN64 - copy_stack += size; - align = IR_MAX((int)sizeof(void*), align); - copy_stack = IR_ALIGNED_SIZE(copy_stack, align); - type = IR_ADDR; -#else - align = IR_MAX((int)sizeof(void*), align); - used_stack = IR_ALIGNED_SIZE(used_stack, align); - used_stack += size; - used_stack = IR_ALIGNED_SIZE(used_stack, sizeof(void*)); - continue; -#endif + if (!cc->pass_struct_by_val) { + copy_stack += size; + align = IR_MAX((int)sizeof(void*), align); + copy_stack = IR_ALIGNED_SIZE(copy_stack, align); + type = IR_ADDR; + } else { + align = IR_MAX((int)sizeof(void*), align); + used_stack = IR_ALIGNED_SIZE(used_stack, align); + used_stack += size; + used_stack = IR_ALIGNED_SIZE(used_stack, sizeof(void*)); + continue; + } } - if (int_param >= int_reg_params_count) { + if (int_param >= cc->int_param_regs_count) { used_stack += IR_MAX(sizeof(void*), ir_type_size[type]); } int_param++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - fp_param++; -#endif + if (cc->shadow_param_regs) { + fp_param++; + } } else { IR_ASSERT(IR_IS_TYPE_FP(type)); - if (fp_param >= fp_reg_params_count) { + if (fp_param >= cc->fp_param_regs_count) { used_stack += IR_MAX(sizeof(void*), ir_type_size[type]); } fp_param++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - int_param++; -#endif + if (cc->shadow_param_regs) { + int_param++; + } } } /* Reserved "home space" or "shadow store" for register arguments (used in Windows64 ABI) */ - used_stack += IR_SHADOW_ARGS; + used_stack += cc->shadow_store_size; -#ifdef _WIN64 copy_stack = IR_ALIGNED_SIZE(copy_stack, 16); used_stack += copy_stack; *copy_stack_ptr = copy_stack; -#else - *copy_stack_ptr = 0; -#endif return used_stack; } -static int32_t ir_emit_arguments(ir_ctx *ctx, ir_ref def, ir_insn *insn, ir_reg tmp_reg) +static int32_t ir_emit_arguments(ir_ctx *ctx, ir_ref def, ir_insn *insn, const ir_proto_t *proto, const ir_call_conv_dsc *cc, ir_reg tmp_reg) { ir_backend_data *data = ctx->data; dasm_State **Dst = &data->dasm_state; @@ -9063,11 +9579,7 @@ int int_param = 0; int fp_param = 0; int count = 0; - int int_reg_params_count = IR_REG_INT_ARGS; - int fp_reg_params_count = IR_REG_FP_ARGS; - const int8_t *int_reg_params = _ir_int_reg_params; - const int8_t *fp_reg_params = _ir_fp_reg_params; - int32_t used_stack, copy_stack = 0, stack_offset = IR_SHADOW_ARGS; + int32_t used_stack, copy_stack = 0, stack_offset = cc->shadow_store_size; ir_copy *copies; bool do_pass3 = 0; /* For temporaries we may use any scratch registers except for registers used for parameters */ @@ -9082,40 +9594,24 @@ tmp_reg = IR_REG_RAX; } -#ifdef IR_HAVE_FASTCALL - if (sizeof(void*) == 4 && ir_is_fastcall(ctx, insn)) { - int_reg_params_count = IR_REG_INT_FCARGS; - fp_reg_params_count = IR_REG_FP_FCARGS; - int_reg_params = _ir_int_fc_reg_params; - fp_reg_params = _ir_fp_fc_reg_params; - } -#endif - if (insn->op == IR_CALL - && (ctx->flags & IR_PREALLOCATED_STACK) -#ifdef IR_HAVE_FASTCALL - && !ir_is_fastcall(ctx, insn) /* fast call functions restore stack pointer */ -#endif - ) { - // TODO: support for preallocated stack -#ifdef _WIN64 - used_stack = ir_call_used_stack(ctx, insn, ©_stack); -#else - used_stack = 0; -#endif + && (ctx->flags2 & IR_PREALLOCATED_STACK) + && !cc->cleanup_stack_by_callee) { + if (!cc->pass_struct_by_val) { + used_stack = ir_call_used_stack(ctx, insn, cc, ©_stack); + } else { + used_stack = 0; + } } else { - used_stack = ir_call_used_stack(ctx, insn, ©_stack); - if (IR_SHADOW_ARGS + used_stack = ir_call_used_stack(ctx, insn, cc, ©_stack); + if (cc->shadow_store_size && insn->op == IR_TAILCALL - && used_stack == IR_SHADOW_ARGS) { + && used_stack == cc->shadow_store_size) { used_stack = 0; } if (ctx->fixed_call_stack_size && used_stack <= ctx->fixed_call_stack_size -#ifdef IR_HAVE_FASTCALL - && !ir_is_fastcall(ctx, insn) /* fast call functions restore stack pointer */ -#endif - ) { + && !cc->cleanup_stack_by_callee) { used_stack = 0; } else { /* Stack must be 16 byte aligned */ @@ -9127,10 +9623,10 @@ } } -#ifdef _WIN64 -|.if X64 if (copy_stack) { /* Copy struct arguments */ + IR_ASSERT(sizeof(void*) == 8); +|.if X64 int copy_stack_offset = 0; for (j = 3; j <= n; j++) { @@ -9163,9 +9659,8 @@ | rep; movsb } } - } |.endif -#endif + } /* 1. move all register arguments that should be passed through stack * and collect arguments that should be passed through registers */ @@ -9176,8 +9671,7 @@ arg_insn = &ctx->ir_base[arg]; type = arg_insn->type; if (IR_IS_TYPE_INT(type)) { -#ifndef _WIN64 - if (arg_insn->op == IR_ARGVAL) { + if (arg_insn->op == IR_ARGVAL && cc->pass_struct_by_val) { int size = arg_insn->op2; int align = arg_insn->op3; align = IR_MAX((int)sizeof(void*), align); @@ -9224,38 +9718,35 @@ stack_offset = IR_ALIGNED_SIZE(stack_offset, sizeof(void*)); continue; } -#endif - if (int_param < int_reg_params_count) { - dst_reg = int_reg_params[int_param]; + if (int_param < cc->int_param_regs_count) { + dst_reg = cc->int_param_regs[int_param]; } else { dst_reg = IR_REG_NONE; /* pass argument through stack */ } int_param++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - fp_param++; - if (arg_insn->op == IR_ARGVAL) { + if (cc->shadow_param_regs) { + fp_param++; + } + if (arg_insn->op == IR_ARGVAL && !cc->pass_struct_by_val) { do_pass3 = 3; continue; } -#endif } else { IR_ASSERT(IR_IS_TYPE_FP(type)); - if (fp_param < fp_reg_params_count) { - dst_reg = fp_reg_params[fp_param]; + if (fp_param < cc->fp_param_regs_count) { + dst_reg = cc->fp_param_regs[fp_param]; } else { dst_reg = IR_REG_NONE; /* pass argument through stack */ } fp_param++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - int_param++; -#endif + if (cc->shadow_param_regs) { + int_param++; + } } if (dst_reg != IR_REG_NONE) { if (IR_IS_CONST_REF(arg) || src_reg == IR_REG_NONE || - (IR_REG_SPILLED(src_reg) && !IR_REGSET_IN(IR_REGSET_PRESERVED, IR_REG_NUM(src_reg)))) { + (IR_REG_SPILLED(src_reg) && !IR_REGSET_IN(cc->preserved_regs, IR_REG_NUM(src_reg)))) { /* delay CONST->REG and MEM->REG moves to third pass */ do_pass3 = 1; } else { @@ -9290,11 +9781,9 @@ /* 3. move the remaining memory and immediate values */ if (do_pass3) { -#ifdef _WIN64 int copy_stack_offset = 0; -#endif - stack_offset = IR_SHADOW_ARGS; + stack_offset = cc->shadow_store_size; int_param = 0; fp_param = 0; for (j = 3; j <= n; j++) { @@ -9307,60 +9796,57 @@ int size = arg_insn->op2; int align = arg_insn->op3; -#ifndef _WIN64 - align = IR_MAX((int)sizeof(void*), align); - stack_offset = IR_ALIGNED_SIZE(stack_offset, align); - stack_offset += size; - stack_offset = IR_ALIGNED_SIZE(stack_offset, sizeof(void*)); - continue; -#else -|.if X64 - /* pass pointer to the copy on stack */ - copy_stack_offset += size; - align = IR_MAX((int)sizeof(void*), align); - copy_stack_offset = IR_ALIGNED_SIZE(copy_stack_offset, align); - if (int_param < int_reg_params_count) { - dst_reg = int_reg_params[int_param]; - | lea Ra(dst_reg), [rsp + (used_stack - copy_stack_offset)] + if (cc->pass_struct_by_val) { + align = IR_MAX((int)sizeof(void*), align); + stack_offset = IR_ALIGNED_SIZE(stack_offset, align); + stack_offset += size; + stack_offset = IR_ALIGNED_SIZE(stack_offset, sizeof(void*)); + continue; } else { - | lea Ra(tmp_reg), [rsp + (used_stack - copy_stack_offset)] - ir_emit_store_mem_int(ctx, IR_ADDR, IR_MEM_BO(IR_REG_STACK_POINTER, stack_offset), tmp_reg); - stack_offset += sizeof(void*); + /* pass pointer to the copy on stack */ + copy_stack_offset += size; + align = IR_MAX((int)sizeof(void*), align); + copy_stack_offset = IR_ALIGNED_SIZE(copy_stack_offset, align); + if (int_param < cc->int_param_regs_count) { + dst_reg = cc->int_param_regs[int_param]; + | lea Ra(dst_reg), [r4 + (used_stack - copy_stack_offset)] + } else { + | lea Ra(tmp_reg), [r4 + (used_stack - copy_stack_offset)] + ir_emit_store_mem_int(ctx, IR_ADDR, IR_MEM_BO(IR_REG_STACK_POINTER, stack_offset), tmp_reg); + stack_offset += sizeof(void*); + } + int_param++; + if (cc->shadow_param_regs) { + fp_param++; + } + continue; } - int_param++; - /* WIN64 calling convention use common couter for int and fp registers */ - fp_param++; - continue; -|.endif -#endif } - if (int_param < int_reg_params_count) { - dst_reg = int_reg_params[int_param]; + if (int_param < cc->int_param_regs_count) { + dst_reg = cc->int_param_regs[int_param]; } else { dst_reg = IR_REG_NONE; /* argument already passed through stack */ } int_param++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - fp_param++; -#endif + if (cc->shadow_param_regs) { + fp_param++; + } } else { IR_ASSERT(IR_IS_TYPE_FP(type)); - if (fp_param < fp_reg_params_count) { - dst_reg = fp_reg_params[fp_param]; + if (fp_param < cc->fp_param_regs_count) { + dst_reg = cc->fp_param_regs[fp_param]; } else { dst_reg = IR_REG_NONE; /* argument already passed through stack */ } fp_param++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - int_param++; -#endif + if (cc->shadow_param_regs) { + int_param++; + } } if (dst_reg != IR_REG_NONE) { if (IR_IS_CONST_REF(arg) || src_reg == IR_REG_NONE || - (IR_REG_SPILLED(src_reg) && !IR_REGSET_IN(IR_REGSET_PRESERVED, IR_REG_NUM(src_reg)))) { + (IR_REG_SPILLED(src_reg) && !IR_REGSET_IN(cc->preserved_regs, IR_REG_NUM(src_reg)))) { if (IR_IS_TYPE_INT(type)) { if (IR_IS_CONST_REF(arg)) { if (type == IR_I8 || type == IR_I16) { @@ -9428,17 +9914,16 @@ } } -#ifdef _WIN64 /* WIN64 calling convention requires duplcation of parameters passed in FP register into GP ones */ - if (ir_is_vararg(ctx, insn)) { - n = IR_MIN(n, IR_MAX_REG_ARGS + 2); + if (proto && (proto->flags & IR_VARARG_FUNC) && cc->shadow_param_regs) { + n = IR_MIN(n, IR_MIN(cc->int_param_regs_count, cc->fp_param_regs_count) + 2); for (j = 3; j <= n; j++) { arg = ir_insn_op(insn, j); arg_insn = &ctx->ir_base[arg]; type = arg_insn->type; if (IR_IS_TYPE_FP(type)) { - src_reg = fp_reg_params[j-3]; - dst_reg = int_reg_params[j-3]; + src_reg = cc->fp_param_regs[j-3]; + dst_reg = cc->int_param_regs[j-3]; |.if X64 if (ctx->mflags & IR_X86_AVX) { | vmovd Rq(dst_reg), xmm(src_reg-IR_REG_FP_FIRST) @@ -9449,41 +9934,46 @@ } } } - if (insn->op == IR_CALL && (ctx->flags & IR_PREALLOCATED_STACK)) { + + if (insn->op == IR_CALL && (ctx->flags2 & IR_PREALLOCATED_STACK)) { used_stack = 0; } -#endif -#ifdef IR_REG_VARARG_FP_REGS - /* set hidden argument to specify the number of vector registers used */ - if (ir_is_vararg(ctx, insn)) { - fp_param = IR_MIN(fp_param, fp_reg_params_count); - | mov Rd(IR_REG_VARARG_FP_REGS), fp_param + + if (proto && (proto->flags & IR_VARARG_FUNC) && cc->fp_varargs_reg != IR_REG_NONE) { + /* set hidden argument to specify the number of vector registers used */ + fp_param = IR_MIN(fp_param, cc->fp_param_regs_count); + if (fp_param) { + | mov Rd(cc->fp_varargs_reg), fp_param + } else { + | xor Rd(cc->fp_varargs_reg), Rd(cc->fp_varargs_reg) + } } -#endif return used_stack; } -static void ir_emit_call_ex(ir_ctx *ctx, ir_ref def, ir_insn *insn, int32_t used_stack) +static void ir_emit_call_ex(ir_ctx *ctx, ir_ref def, ir_insn *insn, const ir_proto_t *proto, const ir_call_conv_dsc *cc, int32_t used_stack) { ir_backend_data *data = ctx->data; dasm_State **Dst = &data->dasm_state; ir_reg def_reg; + ir_ref func = insn->op2; - if (IR_IS_CONST_REF(insn->op2)) { - void *addr = ir_call_addr(ctx, insn, &ctx->ir_base[insn->op2]); + if (!IR_IS_CONST_REF(func) && ctx->rules[func] == (IR_FUSED | IR_SIMPLE | IR_PROTO)) { + func = ctx->ir_base[func].op1; + } + if (IR_IS_CONST_REF(func)) { + void *addr = ir_call_addr(ctx, insn, &ctx->ir_base[func]); if (sizeof(void*) == 4 || IR_MAY_USE_32BIT_ADDR(ctx->code_buffer, addr)) { | call aword &addr } else { |.if X64 -|| ir_reg tmp_reg = IR_REG_RAX; - -#ifdef IR_REG_VARARG_FP_REGS -|| if (ir_is_vararg(ctx, insn)) { -|| tmp_reg = IR_REG_R11; +|| ir_reg tmp_reg = cc->int_ret_reg; +|| +|| if (proto && (proto->flags & IR_VARARG_FUNC) && tmp_reg == cc->fp_varargs_reg) { +|| tmp_reg = IR_REG_R11; // TODO: avoid usage of hardcoded temporary register ??? || } -#endif || if (IR_IS_SIGNED_32BIT(addr)) { | mov Rq(tmp_reg), ((ptrdiff_t)addr) // 0x48 0xc7 0xc0 || } else { @@ -9498,16 +9988,16 @@ if (op2_reg != IR_REG_NONE) { if (IR_REG_SPILLED(op2_reg)) { op2_reg = IR_REG_NUM(op2_reg); - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + ir_emit_load(ctx, IR_ADDR, op2_reg, func); } | call Ra(op2_reg) } else { ir_mem mem; - if (ir_rule(ctx, insn->op2) & IR_FUSED) { - mem = ir_fuse_load(ctx, def, insn->op2); + if (ir_rule(ctx, func) & IR_FUSED) { + mem = ir_fuse_load(ctx, def, func); } else { - mem = ir_ref_spill_slot(ctx, insn->op2); + mem = ir_ref_spill_slot(ctx, func); } | ASM_TMEM_OP call, aword, mem @@ -9518,7 +10008,7 @@ int32_t aligned_stack = IR_ALIGNED_SIZE(used_stack, 16); ctx->call_stack_size -= aligned_stack; - if (ir_is_fastcall(ctx, insn)) { + if (cc->cleanup_stack_by_callee) { aligned_stack -= used_stack; if (aligned_stack) { | add Ra(IR_REG_RSP), aligned_stack @@ -9532,31 +10022,32 @@ if (IR_IS_TYPE_INT(insn->type)) { def_reg = IR_REG_NUM(ctx->regs[def][0]); if (def_reg != IR_REG_NONE) { - if (def_reg != IR_REG_INT_RET1) { - ir_emit_mov(ctx, insn->type, def_reg, IR_REG_INT_RET1); + if (def_reg != cc->int_ret_reg) { + ir_emit_mov(ctx, insn->type, def_reg, cc->int_ret_reg); } if (IR_REG_SPILLED(ctx->regs[def][0])) { ir_emit_store(ctx, insn->type, def, def_reg); } } else if (ctx->use_lists[def].count > 1) { - ir_emit_store(ctx, insn->type, def, IR_REG_INT_RET1); + ir_emit_store(ctx, insn->type, def, cc->int_ret_reg); } } else { IR_ASSERT(IR_IS_TYPE_FP(insn->type)); def_reg = IR_REG_NUM(ctx->regs[def][0]); -#ifdef IR_REG_FP_RET1 - if (def_reg != IR_REG_NONE) { - if (def_reg != IR_REG_FP_RET1) { - ir_emit_fp_mov(ctx, insn->type, def_reg, IR_REG_FP_RET1); - } - if (IR_REG_SPILLED(ctx->regs[def][0])) { - ir_emit_store(ctx, insn->type, def, def_reg); + if (cc->fp_ret_reg != IR_REG_NONE) { + if (def_reg != IR_REG_NONE) { + if (def_reg != cc->fp_ret_reg) { + ir_emit_fp_mov(ctx, insn->type, def_reg, cc->fp_ret_reg); + } + if (IR_REG_SPILLED(ctx->regs[def][0])) { + ir_emit_store(ctx, insn->type, def, def_reg); + } + } else if (ctx->use_lists[def].count > 1) { + ir_emit_store(ctx, insn->type, def, cc->fp_ret_reg); } - } else if (ctx->use_lists[def].count > 1) { - ir_emit_store(ctx, insn->type, def, IR_REG_FP_RET1); } -#else - if (ctx->use_lists[def].count > 1) { +#ifdef IR_TARGET_X86 + if (ctx->use_lists[def].count > 1 && cc->fp_ret_reg == IR_REG_NONE) { int32_t offset; ir_reg fp; @@ -9592,18 +10083,23 @@ static void ir_emit_call(ir_ctx *ctx, ir_ref def, ir_insn *insn) { - int32_t used_stack = ir_emit_arguments(ctx, def, insn, ctx->regs[def][1]); - ir_emit_call_ex(ctx, def, insn, used_stack); + const ir_proto_t *proto = ir_call_proto(ctx, insn); + const ir_call_conv_dsc *cc = ir_get_call_conv_dsc(proto ? proto->flags : IR_CC_DEFAULT); + int32_t used_stack = ir_emit_arguments(ctx, def, insn, proto, cc, ctx->regs[def][1]); + ir_emit_call_ex(ctx, def, insn, proto, cc, used_stack); } static void ir_emit_tailcall(ir_ctx *ctx, ir_ref def, ir_insn *insn) { ir_backend_data *data = ctx->data; dasm_State **Dst = &data->dasm_state; - int32_t used_stack = ir_emit_arguments(ctx, def, insn, ctx->regs[def][1]); + const ir_proto_t *proto = ir_call_proto(ctx, insn); + const ir_call_conv_dsc *cc = ir_get_call_conv_dsc(proto ? proto->flags : IR_CC_DEFAULT); + int32_t used_stack = ir_emit_arguments(ctx, def, insn, proto, cc, ctx->regs[def][1]); + ir_ref func = insn->op2; if (used_stack != 0) { - ir_emit_call_ex(ctx, def, insn, used_stack); + ir_emit_call_ex(ctx, def, insn, proto, cc, used_stack); ir_emit_return_void(ctx); return; } @@ -9613,7 +10109,10 @@ ir_reg op2_reg = IR_REG_NONE; ir_mem mem = IR_MEM_B(IR_REG_NONE); - if (!IR_IS_CONST_REF(insn->op2)) { + if (!IR_IS_CONST_REF(func) && ctx->rules[func] == (IR_FUSED | IR_SIMPLE | IR_PROTO)) { + func = ctx->ir_base[func].op1; + } + if (!IR_IS_CONST_REF(func)) { op2_reg = ctx->regs[def][2]; ir_regset preserved_regs = (ir_regset)ctx->used_preserved_regs | IR_REGSET(IR_REG_STACK_POINTER); @@ -9623,7 +10122,7 @@ bool is_spill_slot = op2_reg != IR_REG_NONE && IR_REG_SPILLED(op2_reg) - && ctx->vregs[insn->op2]; + && ctx->vregs[func]; if (op2_reg != IR_REG_NONE && !is_spill_slot) { if (IR_REGSET_IN(preserved_regs, IR_REG_NUM(op2_reg))) { @@ -9631,20 +10130,20 @@ op2_reg = IR_REG_RAX; if (IR_REG_SPILLED(orig_op2_reg)) { - ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); + ir_emit_load(ctx, IR_ADDR, op2_reg, func); } else { - ir_type type = ctx->ir_base[insn->op2].type; + ir_type type = ctx->ir_base[func].type; | ASM_REG_REG_OP mov, type, op2_reg, IR_REG_NUM(orig_op2_reg) } } else { op2_reg = IR_REG_NUM(op2_reg); } } else { - if (ir_rule(ctx, insn->op2) & IR_FUSED) { + if (ir_rule(ctx, func) & IR_FUSED) { IR_ASSERT(op2_reg == IR_REG_NONE); - mem = ir_fuse_load(ctx, def, insn->op2); + mem = ir_fuse_load(ctx, def, func); } else { - mem = ir_ref_spill_slot(ctx, insn->op2); + mem = ir_ref_spill_slot(ctx, func); } ir_reg base = IR_MEM_BASE(mem); ir_reg index = IR_MEM_INDEX(mem); @@ -9652,7 +10151,7 @@ (index != IR_REG_NONE && IR_REGSET_IN(preserved_regs, index))) { op2_reg = IR_REG_RAX; - ir_type type = ctx->ir_base[insn->op2].type; + ir_type type = ctx->ir_base[func].type; ir_emit_load_mem_int(ctx, type, op2_reg, mem); } else { op2_reg = IR_REG_NONE; @@ -9662,20 +10161,18 @@ ir_emit_epilogue(ctx); - if (IR_IS_CONST_REF(insn->op2)) { - void *addr = ir_call_addr(ctx, insn, &ctx->ir_base[insn->op2]); + if (IR_IS_CONST_REF(func)) { + void *addr = ir_call_addr(ctx, insn, &ctx->ir_base[func]); if (sizeof(void*) == 4 || IR_MAY_USE_32BIT_ADDR(ctx->code_buffer, addr)) { | jmp aword &addr } else { |.if X64 -|| ir_reg tmp_reg = IR_REG_RAX; - -#ifdef IR_REG_VARARG_FP_REGS -|| if (ir_is_vararg(ctx, insn)) { -|| tmp_reg = IR_REG_R11; +|| ir_reg tmp_reg = cc->int_ret_reg; +|| +|| if (proto && (proto->flags & IR_VARARG_FUNC) && tmp_reg == cc->fp_varargs_reg) { +|| tmp_reg = IR_REG_R11; // TODO: avoid usage of hardcoded temporary register ??? || } -#endif || if (IR_IS_SIGNED_32BIT(addr)) { | mov Rq(tmp_reg), ((ptrdiff_t)addr) // 0x48 0xc7 0xc0 || } else { @@ -9701,6 +10198,19 @@ ir_reg op2_reg = ctx->regs[def][2]; if (IR_IS_CONST_REF(insn->op2)) { + if (ctx->ir_base[insn->op2].op == IR_LABEL) { + if (!data->resolved_label_syms) { + data->resolved_label_syms = 1; + ir_resolve_label_syms(ctx); + } + + uint32_t target = ctx->ir_base[insn->op2].val.u32_hi; + target = ir_skip_empty_target_blocks(ctx, target); + + | jmp =>target + return; + } + void *addr = ir_jmp_addr(ctx, insn, &ctx->ir_base[insn->op2]); if (sizeof(void*) == 4 || IR_MAY_USE_32BIT_ADDR(ctx->code_buffer, addr)) { @@ -9823,6 +10333,20 @@ | jp &addr | jbe =>target break; + case IR_ULT: + | jp =>target + | jae =>target + break; + case IR_UGE: + | jb =>target + break; + case IR_ULE: + | jp =>target + | ja =>target + break; + case IR_UGT: + | jbe =>target + break; case IR_ORDERED: | jnp =>target break; @@ -9908,6 +10432,20 @@ | jp &addr | jbe &target_addr break; + case IR_ULT: + | jp &target_addr + | jae &target_addr + break; + case IR_UGE: + | jb &target_addr + break; + case IR_ULE: + | jp &target_addr + | ja &target_addr + break; + case IR_UGT: + | jbe &target_addr + break; case IR_ORDERED: | jnp &target_addr break; @@ -9993,16 +10531,26 @@ case IR_GT: | ja &addr break; + case IR_ULT: + | jb &addr + break; + case IR_UGE: + | jp &addr + | jae &addr + break; + case IR_ULE: + | jbe &addr + break; + case IR_UGT: + | jp &addr + | ja &addr + break; case IR_ORDERED: | jp &addr break; case IR_UNORDERED: | jnp &addr break; -// case IR_ULT: fprintf(stderr, "\tjb .LL%d\n", true_block); break; -// case IR_UGE: fprintf(stderr, "\tjae .LL%d\n", true_block); break; -// case IR_ULE: fprintf(stderr, "\tjbe .LL%d\n", true_block); break; -// case IR_UGT: fprintf(stderr, "\tja .LL%d\n", true_block); break; } } return 0; @@ -10095,9 +10643,16 @@ ir_type type = ctx->ir_base[cmp_insn->op1].type; ir_ref op1 = cmp_insn->op1; ir_ref op2 = cmp_insn->op2; - ir_reg op1_reg = ctx->regs[insn->op2][1]; - ir_reg op2_reg = ctx->regs[insn->op2][2]; void *addr; + ir_reg op1_reg, op2_reg; + + if (UNEXPECTED(ctx->rules[insn->op2] & IR_FUSED_REG)) { + op1_reg = ir_get_fused_reg(ctx, def, insn->op2 * sizeof(ir_ref) + 1); + op2_reg = ir_get_fused_reg(ctx, def, insn->op2 * sizeof(ir_ref) + 2); + } else { + op1_reg = ctx->regs[insn->op2][1]; + op2_reg = ctx->regs[insn->op2][2]; + } if (op1_reg != IR_REG_NONE && IR_REG_SPILLED(op1_reg)) { op1_reg = IR_REG_NUM(op1_reg); @@ -10151,7 +10706,11 @@ void *addr = ir_jmp_addr(ctx, insn, &ctx->ir_base[insn->op3]); if (insn->op == IR_GUARD) { - op ^= 1; // reverse + if (op == IR_EQ || op == IR_NE || op == IR_ORDERED || op == IR_UNORDERED) { + op ^= 1; // reverse + } else { + op ^= 5; // reverse + } } return ir_emit_guard_jcc(ctx, b, def, next_block, op, addr, 0, 0); } @@ -10368,6 +10927,11 @@ static void ir_emit_exitcall(ir_ctx *ctx, ir_ref def, ir_insn *insn) { ir_backend_data *data = ctx->data; +#ifdef IR_TARGET_X86 + const ir_call_conv_dsc *cc = &ir_call_conv_x86_fastcall; +#else + const ir_call_conv_dsc *cc = &ir_call_conv_default; +#endif dasm_State **Dst = &data->dasm_state; ir_reg def_reg = IR_REG_NUM(ctx->regs[def][0]); @@ -10407,13 +10971,13 @@ | movsd qword [rsp+16*8+14*8], xmm14 | movsd qword [rsp+16*8+15*8], xmm15 | - | mov Ra(IR_REG_INT_ARG2), rsp - | lea Ra(IR_REG_INT_ARG1), [rsp+16*8+16*8+16] - | mov aword [rsp+4*8], Ra(IR_REG_INT_ARG1) - | mov Ra(IR_REG_INT_ARG1), [rsp+16*8+16*8+8] - |.if X64WIN - | sub rsp, 32 /* shadow space */ - |.endif + | mov Ra(cc->int_param_regs[1]), rsp + | lea Ra(cc->int_param_regs[0]), [rsp+16*8+16*8+16] + | mov aword [rsp+4*8], Ra(cc->int_param_regs[0]) + | mov Ra(cc->int_param_regs[0]), [rsp+16*8+16*8+8] + || if (cc->shadow_store_size) { + | sub rsp, cc->shadow_store_size /* shadow space */ + || } |.else | sub esp, 8*4+8*8+12 /* CPU regs + SSE regs */ | mov aword [esp+0*4], eax @@ -10432,10 +10996,10 @@ | movsd qword [esp+8*4+6*8], xmm6 | movsd qword [esp+8*4+7*8], xmm7 | - | mov Ra(IR_REG_INT_FCARG2), esp - | lea Ra(IR_REG_INT_FCARG1), [esp+8*4+8*8+16] - | mov aword [esp+4*4], Ra(IR_REG_INT_FCARG1) - | mov Ra(IR_REG_INT_FCARG1), [esp+8*4+8*8+12] + | mov Ra(cc->int_param_regs[1]), esp + | lea Ra(cc->int_param_regs[0]), [esp+8*4+8*8+16] + | mov aword [esp+4*4], Ra(cc->int_param_regs[0]) + | mov Ra(cc->int_param_regs[0]), [esp+8*4+8*8+12] |.endif if (IR_IS_CONST_REF(insn->op2)) { @@ -10458,16 +11022,14 @@ } // restore SP - |.if X64WIN - | add rsp, 32+16*8+16*8+16 /* shadow space + CPU regs + SSE regs */ - |.elif X64 - | add rsp, 16*8+16*8+16 /* CPU regs + SSE regs */ + |.if X64 + | add rsp, cc->shadow_store_size+16*8+16*8+16 /* shadow space + CPU regs + SSE regs */ |.else | add esp, 8*4+8*8+16 /* CPU regs + SSE regs */ |.endif - if (def_reg != IR_REG_INT_RET1) { - ir_emit_mov(ctx, insn->type, def_reg, IR_REG_INT_RET1); + if (def_reg != cc->int_ret_reg) { + ir_emit_mov(ctx, insn->type, def_reg, cc->int_ret_reg); } if (IR_REG_SPILLED(ctx->regs[def][0])) { ir_emit_store(ctx, insn->type, def, def_reg); @@ -10478,6 +11040,7 @@ { ir_reg fp = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER; + offset = IR_SPILL_POS_TO_OFFSET(offset); IR_ASSERT(from_reg != IR_REG_NONE || to_reg != IR_REG_NONE); if (IR_IS_TYPE_INT(type)) { @@ -10512,26 +11075,17 @@ int fp_param_num = 0; ir_reg src_reg; ir_reg dst_reg; - // TODO: Calling convention specific - int int_reg_params_count = IR_REG_INT_ARGS; - int fp_reg_params_count = IR_REG_FP_ARGS; - const int8_t *int_reg_params = _ir_int_reg_params; - const int8_t *fp_reg_params = _ir_fp_reg_params; + ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; int32_t stack_offset = 0; - -#ifdef IR_TARGET_X86 - if (sizeof(void*) == 4 && (ctx->flags & IR_FASTCALL_FUNC)) { - int_reg_params_count = IR_REG_INT_FCARGS; - fp_reg_params_count = IR_REG_FP_FCARGS; - int_reg_params = _ir_int_fc_reg_params; - fp_reg_params = _ir_fp_fc_reg_params; - } -#endif + int32_t stack_start = 0; if (ctx->flags & IR_USE_FRAME_POINTER) { - stack_offset = sizeof(void*) * 2; /* skip old frame pointer and return address */ + /* skip old frame pointer and return address */ + stack_start = sizeof(void*) * 2 + ctx->stack_frame_size; } else { - stack_offset = sizeof(void*) + ctx->stack_frame_size + ctx->call_stack_size; /* skip return address */ + /* skip return address */ + stack_start = sizeof(void*) + ctx->stack_frame_size; } n = use_list->count; for (i = 0, p = &ctx->use_edges[use_list->refs]; i < n; i++, p++) { @@ -10548,37 +11102,32 @@ stack_offset += ctx->value_params[insn->op3 - 1].size; stack_offset = IR_ALIGNED_SIZE(stack_offset, sizeof(void*)); continue; - } else if (int_param_num < int_reg_params_count) { - src_reg = int_reg_params[int_param_num]; + } else if (int_param_num < cc->int_param_regs_count) { + src_reg = cc->int_param_regs[int_param_num]; } else { src_reg = IR_REG_NONE; } int_param_num++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - fp_param_num++; -#endif + if (cc->shadow_param_regs) { + fp_param_num++; + } } else { - if (fp_param_num < fp_reg_params_count) { - src_reg = fp_reg_params[fp_param_num]; + if (fp_param_num < cc->fp_param_regs_count) { + src_reg = cc->fp_param_regs[fp_param_num]; } else { src_reg = IR_REG_NONE; } fp_param_num++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - int_param_num++; -#endif + if (cc->shadow_param_regs) { + int_param_num++; + } } if (ctx->vregs[use]) { dst_reg = IR_REG_NUM(ctx->regs[use][0]); IR_ASSERT(src_reg != IR_REG_NONE || dst_reg != IR_REG_NONE || - stack_offset == ctx->live_intervals[ctx->vregs[use]]->stack_spill_pos + - ((ctx->flags & IR_USE_FRAME_POINTER) ? - -(ctx->stack_frame_size - ctx->stack_frame_alignment) : - ctx->call_stack_size)); + stack_start + stack_offset == ctx->live_intervals[ctx->vregs[use]]->stack_spill_pos); if (src_reg != dst_reg) { - ir_emit_param_move(ctx, insn->type, src_reg, dst_reg, use, stack_offset); + ir_emit_param_move(ctx, insn->type, src_reg, dst_reg, use, stack_start + stack_offset); } if (dst_reg != IR_REG_NONE && IR_REG_SPILLED(ctx->regs[use][0])) { ir_emit_store(ctx, insn->type, use, dst_reg); @@ -10607,10 +11156,9 @@ return IR_REGSET_FIRST(available); } -static int ir_fix_dessa_tmps(ir_ctx *ctx, uint8_t type, ir_ref from, ir_ref to) +static int ir_fix_dessa_tmps(ir_ctx *ctx, uint8_t type, ir_ref from, ir_ref to, void *dessa_from_block) { - ir_backend_data *data = ctx->data; - ir_ref ref = ctx->cfg_blocks[data->dessa_from_block].end; + ir_ref ref = ctx->cfg_blocks[(intptr_t)dessa_from_block].end; if (to == 0) { if (IR_IS_TYPE_INT(type)) { @@ -10646,26 +11194,14 @@ int int_param_num = 0; int fp_param_num = 0; ir_reg src_reg; - // TODO: Calling convention specific - int int_reg_params_count = IR_REG_INT_ARGS; - int fp_reg_params_count = IR_REG_FP_ARGS; - const int8_t *int_reg_params = _ir_int_reg_params; - const int8_t *fp_reg_params = _ir_fp_reg_params; + ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; int32_t stack_start = 0; int32_t stack_offset = 0; -#ifdef IR_TARGET_X86 - if (sizeof(void*) == 4 && (ctx->flags & IR_FASTCALL_FUNC)) { - int_reg_params_count = IR_REG_INT_FCARGS; - fp_reg_params_count = IR_REG_FP_FCARGS; - int_reg_params = _ir_int_fc_reg_params; - fp_reg_params = _ir_fp_fc_reg_params; - } -#endif - if (ctx->flags & IR_USE_FRAME_POINTER) { /* skip old frame pointer and return address */ - stack_start = sizeof(void*) * 2 + (ctx->stack_frame_size - ctx->stack_frame_alignment); + stack_start = sizeof(void*) * 2 + ctx->stack_frame_size; } else { /* skip return address */ stack_start = sizeof(void*) + ctx->stack_frame_size; @@ -10676,8 +11212,7 @@ insn = &ctx->ir_base[use]; if (insn->op == IR_PARAM) { if (IR_IS_TYPE_INT(insn->type)) { -#ifndef _WIN64 - if (ctx->value_params && ctx->value_params[insn->op3 - 1].align) { + if (ctx->value_params && ctx->value_params[insn->op3 - 1].align && cc->pass_struct_by_val) { /* struct passed by value on stack */ size_t align = ctx->value_params[insn->op3 - 1].align; @@ -10688,28 +11223,25 @@ stack_offset = IR_ALIGNED_SIZE(stack_offset, sizeof(void*)); continue; } -#endif - if (int_param_num < int_reg_params_count) { - src_reg = int_reg_params[int_param_num]; + if (int_param_num < cc->int_param_regs_count) { + src_reg = cc->int_param_regs[int_param_num]; } else { src_reg = IR_REG_NONE; } int_param_num++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - fp_param_num++; -#endif + if (cc->shadow_param_regs) { + fp_param_num++; + } } else { - if (fp_param_num < fp_reg_params_count) { - src_reg = fp_reg_params[fp_param_num]; + if (fp_param_num < cc->fp_param_regs_count) { + src_reg = cc->fp_param_regs[fp_param_num]; } else { src_reg = IR_REG_NONE; } fp_param_num++; -#ifdef _WIN64 - /* WIN64 calling convention use common couter for int and fp registers */ - int_param_num++; -#endif + if (cc->shadow_param_regs) { + int_param_num++; + } } if (src_reg == IR_REG_NONE) { if (ctx->vregs[use]) { @@ -10729,12 +11261,13 @@ } } -#ifdef _WIN64 - /* WIN64 uses shsow area for registers */ - stack_offset += IR_MIN(int_param_num, int_reg_params_count) * sizeof(void*); -#endif - ctx->gp_reg_params = IR_MIN(int_param_num, int_reg_params_count); - ctx->fp_reg_params = IR_MIN(fp_param_num, fp_reg_params_count); + if (cc->shadow_store_size) { + /* WIN64 uses shadow area for registers */ + stack_offset += IR_MIN(int_param_num, cc->int_param_regs_count) * sizeof(void*); + } + + ctx->gp_reg_params = IR_MIN(int_param_num, cc->int_param_regs_count); + ctx->fp_reg_params = IR_MIN(fp_param_num, cc->fp_param_regs_count); ctx->param_stack_size = stack_offset; } @@ -10745,17 +11278,20 @@ ir_insn *insn; ir_ref i, n, j, *p; uint32_t *rule, insn_flags; - ir_backend_data *data = ctx->data; ir_regset available = 0; ir_target_constraints constraints; uint32_t def_flags; ir_reg reg; + ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; + ir_regset scratch = ir_scratch_regset[cc->scratch_reg - IR_REG_NUM]; -#ifndef IR_REG_FP_RET1 +#ifdef IR_TARGET_X86 if (ctx->flags2 & IR_HAS_FP_RET_SLOT) { - ctx->ret_slot = ir_allocate_spill_slot(ctx, IR_DOUBLE, &data->ra_data); - } else if (ctx->ret_type == IR_FLOAT || ctx->ret_type == IR_DOUBLE) { - ctx->ret_slot = ir_allocate_spill_slot(ctx, ctx->ret_type, &data->ra_data); + ctx->ret_slot = ir_allocate_spill_slot(ctx, IR_DOUBLE); + } else if ((ctx->ret_type == IR_FLOAT || ctx->ret_type == IR_DOUBLE) + && cc->fp_ret_reg == IR_REG_NONE) { + ctx->ret_slot = ir_allocate_spill_slot(ctx, ctx->ret_type); } else { ctx->ret_slot = -1; } @@ -10786,11 +11322,18 @@ case IR_MERGE: case IR_LOOP_BEGIN: case IR_LOOP_END: + case IR_IGOTO_DUP: break; -#ifndef IR_REG_FP_RET1 +#ifdef IR_TARGET_X86 case IR_CALL: - if (ctx->ret_slot == -1 && (insn->type == IR_FLOAT || insn->type == IR_DOUBLE)) { - ctx->ret_slot = ir_allocate_spill_slot(ctx, IR_DOUBLE, &data->ra_data); + if (ctx->ret_slot == -1 + && (insn->type == IR_FLOAT || insn->type == IR_DOUBLE)) { + const ir_proto_t *proto = ir_call_proto(ctx, insn); + const ir_call_conv_dsc *cc = ir_get_call_conv_dsc(proto ? proto->flags : IR_CC_DEFAULT); + + if (cc->fp_ret_reg == IR_REG_NONE) { + ctx->ret_slot = ir_allocate_spill_slot(ctx, IR_DOUBLE); + } } #endif IR_FALLTHROUGH; @@ -10802,7 +11345,7 @@ && *rule != IR_TEST_AND_BRANCH_INT && *rule != IR_GUARD_CMP_INT && *rule != IR_GUARD_CMP_FP) { - available = IR_REGSET_SCRATCH; + available = scratch; } if (ctx->vregs[i]) { reg = constraints.def_reg; @@ -10810,7 +11353,7 @@ IR_REGSET_EXCL(available, reg); ctx->regs[i][0] = reg | IR_REG_SPILL_STORE; } else if (def_flags & IR_USE_MUST_BE_IN_REG) { - if (insn->op == IR_VLOAD + if ((insn->op == IR_VLOAD || insn->op == IR_VLOAD_v) && ctx->live_intervals[ctx->vregs[i]] && ctx->live_intervals[ctx->vregs[i]]->stack_spill_pos != -1 && ir_is_same_mem_var(ctx, i, ctx->ir_base[insn->op2].op3)) { @@ -10832,7 +11375,7 @@ if (insn->op == IR_PARAM && reg == IR_REG_NONE) { ival->flags |= IR_LIVE_INTERVAL_MEM_PARAM; } else { - ival->stack_spill_pos = ir_allocate_spill_slot(ctx, ival->type, &data->ra_data); + ival->stack_spill_pos = ir_allocate_spill_slot(ctx, ival->type); } } else if (insn->op == IR_PARAM) { IR_ASSERT(0 && "unexpected PARAM"); @@ -10843,14 +11386,14 @@ ir_ref n = use_list->count; if (n > 0) { - int32_t stack_spill_pos = insn->op3 = ir_allocate_spill_slot(ctx, insn->type, &data->ra_data); + int32_t stack_spill_pos = insn->op3 = ir_allocate_spill_slot(ctx, insn->type); ir_ref i, *p, use; ir_insn *use_insn; for (i = 0, p = &ctx->use_edges[use_list->refs]; i < n; i++, p++) { use = *p; use_insn = &ctx->ir_base[use]; - if (use_insn->op == IR_VLOAD) { + if (use_insn->op == IR_VLOAD || use_insn->op == IR_VLOAD_v) { if (ctx->vregs[use] && !ctx->live_intervals[ctx->vregs[use]]) { ir_live_interval *ival = ir_arena_alloc(&ctx->arena, sizeof(ir_live_interval)); @@ -10861,7 +11404,7 @@ ival->vreg = ctx->vregs[use]; ival->stack_spill_pos = stack_spill_pos; } - } else if (use_insn->op == IR_VSTORE) { + } else if (use_insn->op == IR_VSTORE || use_insn->op == IR_VSTORE_v) { if (!IR_IS_CONST_REF(use_insn->op3) && ctx->vregs[use_insn->op3] && !ctx->live_intervals[ctx->vregs[use_insn->op3]]) { @@ -10898,10 +11441,14 @@ } } ctx->regs[i][constraints.tmp_regs[n].num] = reg; - } else if (constraints.tmp_regs[n].reg == IR_REG_SCRATCH) { - available = IR_REGSET_DIFFERENCE(available, IR_REGSET_SCRATCH); } else { - IR_REGSET_EXCL(available, constraints.tmp_regs[n].reg); + ir_reg reg = constraints.tmp_regs[n].reg; + + if (reg > IR_REG_NUM) { + available = IR_REGSET_DIFFERENCE(available, ir_scratch_regset[reg - IR_REG_NUM]); + } else { + IR_REGSET_EXCL(available, reg); + } } } while (n); } @@ -10937,8 +11484,7 @@ rule += n; } if (bb->flags & IR_BB_DESSA_MOVES) { - data->dessa_from_block = b; - ir_gen_dessa_moves(ctx, b, ir_fix_dessa_tmps); + ir_gen_dessa_moves(ctx, b, ir_fix_dessa_tmps, (void*)(intptr_t)b); } } @@ -10955,12 +11501,12 @@ for (i = 1, insn = ctx->ir_base + 1; i < ctx->insns_count;) { if (insn->op == IR_CALL) { - call_stack_size = ir_call_used_stack(ctx, insn, ©_stack); + const ir_proto_t *proto = ir_call_proto(ctx, insn); + const ir_call_conv_dsc *cc = ir_get_call_conv_dsc(proto ? proto->flags : IR_CC_DEFAULT); + + call_stack_size = ir_call_used_stack(ctx, insn, cc, ©_stack); if (call_stack_size > peak_call_stack_size -#ifdef IR_HAVE_FASTCALL - && !ir_is_fastcall(ctx, insn) /* fast call functions restore stack pointer */ -#endif - ) { + && !cc->cleanup_stack_by_callee) { peak_call_stack_size = call_stack_size; } } @@ -10970,7 +11516,7 @@ } if (peak_call_stack_size) { ctx->call_stack_size = peak_call_stack_size; - ctx->flags |= IR_PREALLOCATED_STACK; + ctx->flags2 |= IR_PREALLOCATED_STACK; } } @@ -10980,19 +11526,22 @@ ctx->locals_area_size = ctx->stack_frame_size; -#if defined(IR_TARGET_X64) && !defined(_WIN64) if ((ctx->flags & IR_VARARG_FUNC) && (ctx->flags2 & IR_HAS_VA_START)) { - ctx->flags2 |= IR_16B_FRAME_ALIGNMENT; - ctx->stack_frame_size = IR_ALIGNED_SIZE(ctx->stack_frame_size, 16); - ctx->locals_area_size = ctx->stack_frame_size; - if ((ctx->flags2 & (IR_HAS_VA_ARG_GP|IR_HAS_VA_COPY)) && ctx->gp_reg_params < IR_REG_INT_ARGS) { - additional_size += sizeof(void*) * IR_REG_INT_ARGS; - } - if ((ctx->flags2 & (IR_HAS_VA_ARG_FP|IR_HAS_VA_COPY)) && ctx->fp_reg_params < IR_REG_FP_ARGS) { - additional_size += 16 * IR_REG_FP_ARGS; + ir_backend_data *data = ctx->data; + const ir_call_conv_dsc *cc = data->ra_data.cc; + + if (cc->sysv_varargs) { + ctx->flags2 |= IR_16B_FRAME_ALIGNMENT; + ctx->stack_frame_size = IR_ALIGNED_SIZE(ctx->stack_frame_size, 16); + ctx->locals_area_size = ctx->stack_frame_size; + if ((ctx->flags2 & (IR_HAS_VA_ARG_GP|IR_HAS_VA_COPY)) && ctx->gp_reg_params < cc->int_param_regs_count) { + additional_size += sizeof(void*) * cc->int_param_regs_count; + } + if ((ctx->flags2 & (IR_HAS_VA_ARG_FP|IR_HAS_VA_COPY)) && ctx->fp_reg_params < cc->fp_param_regs_count) { + additional_size += 16 * cc->fp_param_regs_count; + } } } -#endif if (ctx->used_preserved_regs) { ir_regset used_preserved_regs = (ir_regset)ctx->used_preserved_regs; @@ -11006,7 +11555,6 @@ ctx->stack_frame_size = IR_ALIGNED_SIZE(ctx->stack_frame_size, sizeof(void*)); ctx->stack_frame_size += additional_size; - ctx->stack_frame_alignment = 0; ctx->call_stack_size = 0; if (ctx->flags2 & IR_16B_FRAME_ALIGNMENT) { @@ -11014,12 +11562,10 @@ if (!(ctx->flags & IR_FUNCTION)) { while (IR_ALIGNED_SIZE(ctx->stack_frame_size, 16) != ctx->stack_frame_size) { ctx->stack_frame_size += sizeof(void*); - ctx->stack_frame_alignment += sizeof(void*); } } else if (ctx->flags & IR_USE_FRAME_POINTER) { while (IR_ALIGNED_SIZE(ctx->stack_frame_size + sizeof(void*) * 2, 16) != ctx->stack_frame_size + sizeof(void*) * 2) { ctx->stack_frame_size += sizeof(void*); - ctx->stack_frame_alignment += sizeof(void*); } } else { if (!(ctx->flags & IR_NO_STACK_COMBINE)) { @@ -11028,7 +11574,6 @@ while (IR_ALIGNED_SIZE(ctx->stack_frame_size + ctx->call_stack_size + sizeof(void*), 16) != ctx->stack_frame_size + ctx->call_stack_size + sizeof(void*)) { ctx->stack_frame_size += sizeof(void*); - ctx->stack_frame_alignment += sizeof(void*); } } } @@ -11061,7 +11606,10 @@ int ret; void *entry; size_t size; + ir_ref igoto_dup_ref = IR_UNUSED; + uint32_t igoto_dup_block = 0; + data.ra_data.cc = ir_get_call_conv_dsc(ctx->flags); data.ra_data.unused_slot_4 = 0; data.ra_data.unused_slot_2 = 0; data.ra_data.unused_slot_1 = 0; @@ -11073,11 +11621,13 @@ data.double_abs_const = 0; data.float_abs_const = 0; data.double_zero_const = 0; + data.u2d_const = 0; + data.u2f_const = 0; + data.resolved_label_syms = 0; ctx->data = &data; if (!ctx->live_intervals) { ctx->stack_frame_size = 0; - ctx->stack_frame_alignment = 0; ctx->call_stack_size = 0; ctx->used_preserved_regs = 0; ir_allocate_unique_spill_slots(ctx); @@ -11099,7 +11649,6 @@ } ctx->stack_frame_size = ctx->fixed_stack_frame_size; ctx->call_stack_size = ctx->fixed_call_stack_size; - ctx->stack_frame_alignment = 0; } Dst = &data.dasm_state; @@ -11361,6 +11910,9 @@ case IR_COND: ir_emit_cond(ctx, i, insn); break; + case IR_COND_TEST_INT: + ir_emit_cond_test_int(ctx, i, insn); + break; case IR_COND_CMP_INT: ir_emit_cond_cmp_int(ctx, i, insn); break; @@ -11420,6 +11972,35 @@ case IR_TAILCALL: ir_emit_tailcall(ctx, i, insn); break; + case IR_IGOTO_DUP: + if (bb->flags & IR_BB_DESSA_MOVES) { + ir_emit_dessa_moves(ctx, b, bb); + } + IR_ASSERT(!igoto_dup_ref && !igoto_dup_block); + igoto_dup_ref = i; + igoto_dup_block = b; + b = ctx->cfg_edges[bb->successors]; + bb = &ctx->cfg_blocks[b]; + i = bb->start; + insn = &ctx->ir_base[i]; + rule = &ctx->rules[i]; + break; + case IR_IGOTO: + if ((ctx->ir_base[insn->op1].op == IR_MERGE || ctx->ir_base[insn->op1].op == IR_LOOP_BEGIN) + && (ctx->rules[ctx->ir_base[insn->op1].op1] & IR_RULE_MASK) == IR_IGOTO_DUP + && igoto_dup_ref) { + ir_emit_ijmp(ctx, i, insn); + b = igoto_dup_block; + bb = &ctx->cfg_blocks[b]; + i = igoto_dup_ref; + insn = &ctx->ir_base[i]; + rule = &ctx->rules[i]; + igoto_dup_block= 0; + igoto_dup_ref = 0; + break; + } + IR_ASSERT(!igoto_dup_ref && !igoto_dup_block); + IR_FALLTHROUGH; case IR_IJMP: ir_emit_ijmp(ctx, i, insn); break; @@ -11449,6 +12030,7 @@ ir_emit_vaddr(ctx, i, insn); break; case IR_VLOAD: + case IR_VLOAD_v: ir_emit_vload(ctx, i, insn); break; case IR_VSTORE_INT: @@ -11691,6 +12273,28 @@ } while (i != 0); } + if ((ctx->flags2 & IR_HAS_BLOCK_ADDR) && ctx->loader && ctx->loader->add_label) { + for (b = 1, bb = &ctx->cfg_blocks[b]; b <= ctx->cfg_blocks_count; bb++, b++) { + ir_insn *insn = &ctx->ir_base[bb->start]; + + if (insn->op == IR_BEGIN && insn->op2) { + IR_ASSERT(ctx->ir_base[insn->op2].op == IR_LABEL); + ctx->ir_base[insn->op2].val.u32_hi = 0; + ctx->loader->add_label(ctx->loader, ir_get_str(ctx, ctx->ir_base[insn->op2].val.str), + (char*)entry + dasm_getpclabel(&data.dasm_state, ir_skip_empty_target_blocks(ctx, b))); + } + } + } else if (data.resolved_label_syms) { + for (b = 1, bb = &ctx->cfg_blocks[b]; b <= ctx->cfg_blocks_count; bb++, b++) { + ir_insn *insn = &ctx->ir_base[bb->start]; + + if (insn->op == IR_BEGIN && insn->op2) { + IR_ASSERT(ctx->ir_base[insn->op2].op == IR_LABEL); + ctx->ir_base[insn->op2].val.u32_hi = 0; + } + } + } + dasm_free(&data.dasm_state); ir_mem_flush(entry, size); @@ -11702,7 +12306,7 @@ do { /* _cldemote(p); */ - asm volatile(".byte 0x0f, 0x1c, 0x06" :: "S" (p)); + __asm__ volatile(".byte 0x0f, 0x1c, 0x06" :: "S" (p)); p += 64; } while (p < start + size); } @@ -11775,7 +12379,7 @@ return entry; } -bool ir_needs_thunk(ir_code_buffer *code_buffer, void *addr) +bool ir_needs_thunk(const ir_code_buffer *code_buffer, void *addr) { return sizeof(void*) == 8 && !IR_MAY_USE_32BIT_ADDR(code_buffer, addr); } diff -Nru php8.4-8.4.16/ext/opcache/jit/ir/ir_x86.h php8.4-8.4.21/ext/opcache/jit/ir/ir_x86.h --- php8.4-8.4.16/ext/opcache/jit/ir/ir_x86.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/ir/ir_x86.h 2026-05-05 16:34:12.000000000 +0000 @@ -82,14 +82,17 @@ IR_GP_REGS(IR_GP_REG_ENUM) IR_FP_REGS(IR_FP_REG_ENUM) IR_REG_NUM, + IR_REG_ALL = IR_REG_NUM, /* special name for regset */ + IR_REG_SET_1, /* special name for regset */ + IR_REG_SET_2, /* special name for regset */ + IR_REG_SET_3, /* special name for regset */ + IR_REG_SET_NUM, }; #define IR_REG_GP_FIRST IR_REG_R0 #define IR_REG_FP_FIRST IR_REG_XMM0 #define IR_REG_GP_LAST (IR_REG_FP_FIRST - 1) #define IR_REG_FP_LAST (IR_REG_NUM - 1) -#define IR_REG_SCRATCH (IR_REG_NUM) /* special name for regset */ -#define IR_REG_ALL (IR_REG_NUM + 1) /* special name for regset */ #define IR_REGSET_64BIT 0 @@ -113,121 +116,4 @@ #define IR_REG_RSI IR_REG_R6 #define IR_REG_RDI IR_REG_R7 -/* Calling Convention */ -#ifdef _WIN64 - -# define IR_REG_INT_RET1 IR_REG_RAX -# define IR_REG_FP_RET1 IR_REG_XMM0 -# define IR_REG_INT_ARGS 4 -# define IR_REG_FP_ARGS 4 -# define IR_REG_INT_ARG1 IR_REG_RCX -# define IR_REG_INT_ARG2 IR_REG_RDX -# define IR_REG_INT_ARG3 IR_REG_R8 -# define IR_REG_INT_ARG4 IR_REG_R9 -# define IR_REG_FP_ARG1 IR_REG_XMM0 -# define IR_REG_FP_ARG2 IR_REG_XMM1 -# define IR_REG_FP_ARG3 IR_REG_XMM2 -# define IR_REG_FP_ARG4 IR_REG_XMM3 -# define IR_MAX_REG_ARGS 4 -# define IR_SHADOW_ARGS 32 /* Reserved space in bytes - "home space" or "shadow store" for register arguments */ - -# define IR_REGSET_SCRATCH \ - (IR_REGSET_INTERVAL(IR_REG_RAX, IR_REG_RDX) \ - | IR_REGSET_INTERVAL(IR_REG_R8, IR_REG_R11) \ - | IR_REGSET_INTERVAL(IR_REG_XMM0, IR_REG_XMM5)) - -# define IR_REGSET_PRESERVED \ - (IR_REGSET(IR_REG_RBX) \ - | IR_REGSET_INTERVAL(IR_REG_RBP, IR_REG_RDI) \ - | IR_REGSET_INTERVAL(IR_REG_R12, IR_REG_R15) \ - | IR_REGSET_INTERVAL(IR_REG_XMM6, IR_REG_XMM15)) - -#elif defined(IR_TARGET_X64) - -# define IR_REG_INT_RET1 IR_REG_RAX -# define IR_REG_FP_RET1 IR_REG_XMM0 -# define IR_REG_INT_ARGS 6 -# define IR_REG_FP_ARGS 8 -# define IR_REG_INT_ARG1 IR_REG_RDI -# define IR_REG_INT_ARG2 IR_REG_RSI -# define IR_REG_INT_ARG3 IR_REG_RDX -# define IR_REG_INT_ARG4 IR_REG_RCX -# define IR_REG_INT_ARG5 IR_REG_R8 -# define IR_REG_INT_ARG6 IR_REG_R9 -# define IR_REG_FP_ARG1 IR_REG_XMM0 -# define IR_REG_FP_ARG2 IR_REG_XMM1 -# define IR_REG_FP_ARG3 IR_REG_XMM2 -# define IR_REG_FP_ARG4 IR_REG_XMM3 -# define IR_REG_FP_ARG5 IR_REG_XMM4 -# define IR_REG_FP_ARG6 IR_REG_XMM5 -# define IR_REG_FP_ARG7 IR_REG_XMM6 -# define IR_REG_FP_ARG8 IR_REG_XMM7 -# define IR_MAX_REG_ARGS 14 -# define IR_SHADOW_ARGS 0 - -# define IR_REG_VARARG_FP_REGS IR_REG_RAX /* hidden argument to specify the number of vector registers used */ - -# define IR_REGSET_SCRATCH \ - (IR_REGSET_INTERVAL(IR_REG_RAX, IR_REG_RDX) \ - | IR_REGSET_INTERVAL(IR_REG_RSI, IR_REG_RDI) \ - | IR_REGSET_INTERVAL(IR_REG_R8, IR_REG_R11) \ - | IR_REGSET_FP) - -# define IR_REGSET_PRESERVED \ - (IR_REGSET(IR_REG_RBX) \ - | IR_REGSET(IR_REG_RBP) \ - | IR_REGSET_INTERVAL(IR_REG_R12, IR_REG_R15)) - -typedef struct _ir_va_list { - uint32_t gp_offset; - uint32_t fp_offset; - void *overflow_arg_area; - void *reg_save_area; -} ir_va_list; - -#elif defined(IR_TARGET_X86) - -# define IR_REG_INT_RET1 IR_REG_RAX -# define IR_REG_INT_RET2 IR_REG_RDX -# define IR_REG_INT_ARGS 0 -# define IR_REG_FP_ARGS 0 - -# define IR_HAVE_FASTCALL 1 -# define IR_REG_INT_FCARGS 2 -# define IR_REG_FP_FCARGS 0 -# define IR_REG_INT_FCARG1 IR_REG_RCX -# define IR_REG_INT_FCARG2 IR_REG_RDX -# define IR_MAX_REG_ARGS 2 -# define IR_SHADOW_ARGS 0 - -# define IR_REGSET_SCRATCH \ - (IR_REGSET_INTERVAL(IR_REG_RAX, IR_REG_RDX) | IR_REGSET_FP) - -# define IR_REGSET_PRESERVED \ - (IR_REGSET(IR_REG_RBX) \ - | IR_REGSET(IR_REG_RBP) \ - | IR_REGSET_INTERVAL(IR_REG_RSI, IR_REG_RDI)) - -#else -# error "Unsupported target architecture" -#endif - -typedef struct _ir_tmp_reg { - union { - uint8_t num; - int8_t reg; - }; - uint8_t type; - int8_t start; - int8_t end; -} ir_tmp_reg; - -struct _ir_target_constraints { - int8_t def_reg; - uint8_t tmps_count; - uint8_t hints_count; - ir_tmp_reg tmp_regs[3]; - int8_t hints[IR_MAX_REG_ARGS + 3]; -}; - #endif /* IR_X86_H */ diff -Nru php8.4-8.4.16/ext/opcache/jit/zend_jit.c php8.4-8.4.21/ext/opcache/jit/zend_jit.c --- php8.4-8.4.16/ext/opcache/jit/zend_jit.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/zend_jit.c 2026-05-05 16:34:12.000000000 +0000 @@ -2748,7 +2748,7 @@ if (i == end && (opline->result_type & (IS_SMART_BRANCH_JMPZ|IS_SMART_BRANCH_JMPNZ)) != 0) { /* smart branch split across basic blocks */ - if (!zend_jit_set_cond(&ctx, opline + 2, opline->result.var)) { + if (!zend_jit_set_cond(&ctx, opline, opline + 2, opline->result.var)) { goto jit_failure; } } diff -Nru php8.4-8.4.16/ext/opcache/jit/zend_jit_helpers.c php8.4-8.4.21/ext/opcache/jit/zend_jit_helpers.c --- php8.4-8.4.16/ext/opcache/jit/zend_jit_helpers.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/zend_jit_helpers.c 2026-05-05 16:34:12.000000000 +0000 @@ -2776,7 +2776,7 @@ //??? } else { //??? prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr); //??? } - if (prop_info) { + if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { /* special case for typed properties */ zend_jit_assign_op_to_typed_prop(zptr, prop_info, value, binary_op); } else { @@ -2972,6 +2972,9 @@ } } else { zend_property_info *prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); + if (prop_info && !ZEND_TYPE_IS_SET(prop_info->type)) { + prop_info = NULL; + } if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { fast_long_increment_function(prop); @@ -3042,6 +3045,9 @@ } } else { zend_property_info *prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); + if (prop_info && !ZEND_TYPE_IS_SET(prop_info->type)) { + prop_info = NULL; + } if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { fast_long_decrement_function(prop); @@ -3110,6 +3116,9 @@ ZVAL_NULL(result); } else { zend_property_info *prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + if (prop_info && !ZEND_TYPE_IS_SET(prop_info->type)) { + prop_info = NULL; + } if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { ZVAL_LONG(result, Z_LVAL_P(prop)); @@ -3171,6 +3180,9 @@ ZVAL_NULL(result); } else { zend_property_info *prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); + if (prop_info && !ZEND_TYPE_IS_SET(prop_info->type)) { + prop_info = NULL; + } if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { ZVAL_LONG(result, Z_LVAL_P(prop)); diff -Nru php8.4-8.4.16/ext/opcache/jit/zend_jit_ir.c php8.4-8.4.21/ext/opcache/jit/zend_jit_ir.c --- php8.4-8.4.16/ext/opcache/jit/zend_jit_ir.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/zend_jit_ir.c 2026-05-05 16:34:12.000000000 +0000 @@ -835,6 +835,7 @@ addr = (void*)zend_jit_trace_get_exit_addr(exit_point); exit_flags &= ~ZEND_JIT_EXIT_FIXED; } + t->stack_map[t->exit_info[exit_point].stack_offset + var].reg = ZREG_NONE; t->stack_map[t->exit_info[exit_point].stack_offset + var].flags = ZREG_TYPE_ONLY; } } else if (!(exit_flags & ZEND_JIT_EXIT_FIXED)) { @@ -4104,11 +4105,12 @@ return 1; } -static int zend_jit_set_cond(zend_jit_ctx *jit, const zend_op *next_opline, uint32_t var) +static int zend_jit_set_cond(zend_jit_ctx *jit, const zend_op *opline, const zend_op *next_opline, uint32_t var) { ir_ref ref; - ref = ir_ADD_U32(ir_ZEXT_U32(jit_CMP_IP(jit, IR_EQ, next_opline)), ir_CONST_U32(IS_FALSE)); + ir_op op = (opline->result_type & IS_SMART_BRANCH_JMPZ) ? IR_EQ : IR_NE; + ref = ir_ADD_U32(ir_ZEXT_U32(jit_CMP_IP(jit, op, next_opline)), ir_CONST_U32(IS_FALSE)); // EX_VAR(var) = ... ir_STORE(ir_ADD_OFFSET(jit_FP(jit), var + offsetof(zval, u1.type_info)), ref); @@ -8066,7 +8068,7 @@ return 1; } -static int zend_jit_escape_if_undef(zend_jit_ctx *jit, int var, uint32_t flags, const zend_op *opline, int8_t reg) +static int zend_jit_escape_if_undef(zend_jit_ctx *jit, int var, uint32_t flags, const zend_op *opline, const zend_op_array *op_array, int8_t reg) { zend_jit_addr reg_addr = ZEND_ADDR_REF_ZVAL(zend_jit_deopt_rload(jit, IR_ADDR, reg)); ir_ref if_def = ir_IF(jit_Z_TYPE(jit, reg_addr)); @@ -8089,7 +8091,20 @@ } jit_LOAD_IP_ADDR(jit, opline - 1); - ir_IJMP(jit_STUB_ADDR(jit, jit_stub_trace_escape)); + + /* We can't use trace_escape() because opcode handler may be overridden by JIT */ + zend_jit_op_array_trace_extension *jit_extension = + (zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(op_array); + size_t offset = jit_extension->offset; + ir_ref ref = ir_CONST_ADDR(ZEND_OP_TRACE_INFO((opline - 1), offset)->orig_handler); + if (GCC_GLOBAL_REGS) { + ir_TAILCALL(IR_VOID, ref); + } else { +#if defined(IR_TARGET_X86) + ref = ir_CAST_FC_FUNC(ref); +#endif + ir_TAILCALL_1(IR_I32, ref, jit_FP(jit)); + } ir_IF_TRUE(if_def); @@ -16938,6 +16953,7 @@ SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), IS_UNKNOWN, 1); } break; + case ZEND_FE_RESET_RW: case ZEND_BIND_INIT_STATIC_OR_JMP: if (opline->op1_type == IS_CV) { old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var)); @@ -16962,6 +16978,7 @@ SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op2.var), old_info); } break; + case ZEND_FE_RESET_RW: case ZEND_BIND_INIT_STATIC_OR_JMP: if (opline->op1_type == IS_CV) { SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var), old_info); diff -Nru php8.4-8.4.16/ext/opcache/jit/zend_jit_trace.c php8.4-8.4.21/ext/opcache/jit/zend_jit_trace.c --- php8.4-8.4.16/ext/opcache/jit/zend_jit_trace.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/jit/zend_jit_trace.c 2026-05-05 16:34:12.000000000 +0000 @@ -3603,7 +3603,7 @@ ZEND_ASSERT(STACK_FLAGS(parent_stack, check2) == ZREG_ZVAL_COPY); ZEND_ASSERT(reg != ZREG_NONE); - if (!zend_jit_escape_if_undef(jit, check2, flags, opline, reg)) { + if (!zend_jit_escape_if_undef(jit, check2, flags, opline, exit_info->op_array, reg)) { return 0; } if (!zend_jit_restore_zval(jit, EX_NUM_TO_VAR(check2), reg)) { @@ -4510,6 +4510,12 @@ op2_info = OP2_INFO(); op2_addr = OP2_REG_ADDR(); if ((op1_info & MAY_BE_UNDEF) || (op2_info & MAY_BE_UNDEF)) { + if (op1_type == IS_LONG || op1_type == IS_DOUBLE) { + CHECK_OP1_TRACE_TYPE(); + } + if (op2_type == IS_LONG || op2_type == IS_DOUBLE) { + CHECK_OP2_TRACE_TYPE(); + } break; } if (opline->opcode == ZEND_ADD && @@ -4518,6 +4524,12 @@ /* pass */ } else if (!(op1_info & (MAY_BE_LONG|MAY_BE_DOUBLE)) || !(op2_info & (MAY_BE_LONG|MAY_BE_DOUBLE))) { + if (op1_type == IS_LONG || op1_type == IS_DOUBLE) { + CHECK_OP1_TRACE_TYPE(); + } + if (op2_type == IS_LONG || op2_type == IS_DOUBLE) { + CHECK_OP2_TRACE_TYPE(); + } break; } if (orig_op1_type != IS_UNKNOWN @@ -5155,7 +5167,7 @@ && ssa->vars[ssa_op->op2_def].use_chain < 0 && !ssa->vars[ssa_op->op2_def].phi_use_chain) { if (!zend_jit_store_type(&ctx, var_num, type)) { - return 0; + goto jit_failure; } SET_STACK_TYPE(stack, var_num, type, 1); } @@ -5208,7 +5220,7 @@ && ssa->vars[ssa_op->op1_def].use_chain < 0 && !ssa->vars[ssa_op->op1_def].phi_use_chain) { if (!zend_jit_store_type(&ctx, var_num, type)) { - return 0; + goto jit_failure; } SET_STACK_TYPE(stack, var_num, type, 1); } @@ -5305,7 +5317,7 @@ && ssa->vars[ssa_op->op1_def].use_chain < 0 && !ssa->vars[ssa_op->op1_def].phi_use_chain) { if (!zend_jit_store_type(&ctx, var_num, type)) { - return 0; + goto jit_failure; } SET_STACK_TYPE(stack, var_num, type, 1); } @@ -6527,7 +6539,7 @@ var_num = EX_VAR_TO_NUM(var_num); if (!zend_jit_store_type(&ctx, var_num, type)) { - return 0; + goto jit_failure; } SET_STACK_TYPE(stack, var_num, type, 1); } @@ -7167,7 +7179,7 @@ && type != STACK_MEM_TYPE(stack, i) && zend_jit_trace_must_store_type(op_array, op_array_ssa, opline - op_array->opcodes, i, type)) { if (!zend_jit_store_type(jit, i, type)) { - return 0; + goto jit_failure; } SET_STACK_TYPE(stack, i, type, 1); } @@ -7289,11 +7301,11 @@ zend_string_release(name); } +jit_cleanup:; } zend_catch { do_bailout = 1; } zend_end_try(); -jit_cleanup: /* Clean up used op_arrays */ while (num_op_arrays > 0) { op_array = op_arrays[--num_op_arrays]; diff -Nru php8.4-8.4.16/ext/opcache/shared_alloc_shm.c php8.4-8.4.21/ext/opcache/shared_alloc_shm.c --- php8.4-8.4.16/ext/opcache/shared_alloc_shm.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/shared_alloc_shm.c 2026-05-05 16:34:12.000000000 +0000 @@ -42,7 +42,6 @@ # define MIN(x, y) ((x) > (y)? (y) : (x)) #endif -#define SEG_ALLOC_SIZE_MAX 32*1024*1024 #define SEG_ALLOC_SIZE_MIN 2*1024*1024 typedef struct { @@ -53,36 +52,38 @@ static int create_segments(size_t requested_size, zend_shared_segment_shm ***shared_segments_p, int *shared_segments_count, const char **error_in) { int i; - size_t allocate_size = 0, remaining_bytes = requested_size, seg_allocate_size; + size_t allocate_size = 0, remaining_bytes, seg_allocate_size; int first_segment_id = -1; key_t first_segment_key = -1; struct shmid_ds sds; int shmget_flags; zend_shared_segment_shm *shared_segments; - seg_allocate_size = SEG_ALLOC_SIZE_MAX; - /* determine segment size we _really_ need: - * no more than to include requested_size - */ - while (requested_size * 2 <= seg_allocate_size && seg_allocate_size > SEG_ALLOC_SIZE_MIN) { - seg_allocate_size >>= 1; - } - shmget_flags = IPC_CREAT|SHM_R|SHM_W|IPC_EXCL; - /* try allocating this much, if not - try shrinking */ - while (seg_allocate_size >= SEG_ALLOC_SIZE_MIN) { - allocate_size = MIN(requested_size, seg_allocate_size); - first_segment_id = shmget(first_segment_key, allocate_size, shmget_flags); - if (first_segment_id != -1) { - break; + /* Try contiguous allocation first. */ + seg_allocate_size = requested_size; + first_segment_id = shmget(first_segment_key, seg_allocate_size, shmget_flags); + if (UNEXPECTED(first_segment_id == -1)) { + /* Search for biggest n^2 < requested_size. */ + seg_allocate_size = SEG_ALLOC_SIZE_MIN; + while (seg_allocate_size < requested_size / 2) { + seg_allocate_size *= 2; } - seg_allocate_size >>= 1; /* shrink the allocated block */ - } - if (first_segment_id == -1) { - *error_in = "shmget"; - return ALLOC_FAILURE; + /* try allocating this much, if not - try shrinking */ + while (seg_allocate_size >= SEG_ALLOC_SIZE_MIN) { + first_segment_id = shmget(first_segment_key, seg_allocate_size, shmget_flags); + if (first_segment_id != -1) { + break; + } + seg_allocate_size >>= 1; /* shrink the allocated block */ + } + + if (first_segment_id == -1) { + *error_in = "shmget"; + return ALLOC_FAILURE; + } } *shared_segments_count = ((requested_size - 1) / seg_allocate_size) + 1; diff -Nru php8.4-8.4.16/ext/opcache/tests/gh21052.phpt php8.4-8.4.21/ext/opcache/tests/gh21052.phpt --- php8.4-8.4.16/ext/opcache/tests/gh21052.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/tests/gh21052.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,32 @@ +--TEST-- +GH-21052: Preloaded constant erroneously propagated to file-cached script +--CREDITS-- +Grummfy +--EXTENSIONS-- +opcache +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_cache="{TMP}" +opcache.preload={PWD}/gh21052_a.inc +--SKIPIF-- + +--FILE-- + +--EXPECT-- +array(1) { + [0]=> + string(3) "foo" +} +array(1) { + [0]=> + string(3) "foo" +} +array(1) { + [0]=> + string(3) "foo" +} diff -Nru php8.4-8.4.16/ext/opcache/tests/gh21052_a.inc php8.4-8.4.21/ext/opcache/tests/gh21052_a.inc --- php8.4-8.4.16/ext/opcache/tests/gh21052_a.inc 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/tests/gh21052_a.inc 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,13 @@ +a = 3; + $objs = []; + $obj = new stdClass; + $objs[] = $obj; +} + +?> +===DONE=== +--EXPECT-- +===DONE=== diff -Nru php8.4-8.4.16/ext/opcache/tests/jit/gh20818.phpt php8.4-8.4.21/ext/opcache/tests/jit/gh20818.phpt --- php8.4-8.4.16/ext/opcache/tests/jit/gh20818.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/tests/jit/gh20818.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,30 @@ +--TEST-- +GH-20818 (Segfault in Tracing JIT with Object Reference) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.jit=tracing +opcache.jit_buffer_size=1M +--FILE-- + 1], + (object) ["" => 1], + (object) [], +]; + +for ($i = 0; $i < 200; $i += 1) { + foreach ($data as $entry) { + process($entry); + } +} + +echo "Done\n"; +?> +--EXPECT-- +Done diff -Nru php8.4-8.4.16/ext/opcache/tests/jit/gh20838.inc php8.4-8.4.21/ext/opcache/tests/jit/gh20838.inc --- php8.4-8.4.16/ext/opcache/tests/jit/gh20838.inc 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/tests/jit/gh20838.inc 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,53 @@ + $value) { + if ($k[$key]['st'] == 'correction') $s += $value; + else { + if ($k[$key]['st'] == 'caa') $value = $value / $avc[$key]; + $s += $value / 5 * $k[$key]['tp'] * (1 + 50 / $k[$key]['tp'] * $pav / (100 * $c)); + } + } + } + + echo("$id $s\n"); + + return $s; +} diff -Nru php8.4-8.4.16/ext/opcache/tests/jit/gh20838.phpt php8.4-8.4.21/ext/opcache/tests/jit/gh20838.phpt --- php8.4-8.4.16/ext/opcache/tests/jit/gh20838.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/tests/jit/gh20838.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,66 @@ +--TEST-- +GH-20838 (JIT compiler produces wrong arithmetic results) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.jit=tracing +opcache.jit_buffer_size=64M +opcache.jit_hot_loop=61 +opcache.jit_hot_func=127 +opcache.jit_hot_return=8 +opcache.jit_hot_side_exit=8 +--EXTENSIONS-- +opcache +--FILE_EXTERNAL-- +gh20838.inc +--EXPECT-- +49 0 +1080 18 +4415 31.25 +4763 75 +4926 75 +4933 60 +4935 75 +4938 75 +4939 75 +4947 60 +4952 45 +4953 75 +4962 60 +8558 45 +14888 45 +16879 13 +100003 0 +100007 60 +100013 0 +100017 13 +100019 15 +100027 45 +100031 30 +106427 -37.5 +217955 -9 +240000 30 +240010 60 +240021 45 +240079 112.66666666667 +240210 45 +240227 45 +240249 75 +240273 75 +240333 30 +240335 60 +300024 96.5 +310001 45 +310025 45 +310034 60 +310042 30 +310111 75 +310191 45 +310219 75 +310236 15 +310322 45 +310356 30 +310360 21.25 +310394 29.5 +310405 75 +310411 60 diff -Nru php8.4-8.4.16/ext/opcache/tests/jit/gh20880.phpt php8.4-8.4.21/ext/opcache/tests/jit/gh20880.phpt --- php8.4-8.4.16/ext/opcache/tests/jit/gh20880.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/tests/jit/gh20880.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,27 @@ +--TEST-- +GH-20880 (JIT (tracing): NAN float comparisons incorrectly return true) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +--FILE-- + $max) { + return $value; + } + return $max; +} + + +$max = 0.0; +for ($i = 0; $i < 100000; $i++) { + $max = observe(1.0, $max); + $max = observe(3.0, $max); +} + +$max = observe(4.0, $max); +$max = observe(NAN, $max); +var_dump($max); +?> +--EXPECT-- +float(4) diff -Nru php8.4-8.4.16/ext/opcache/tests/jit/gh21158.phpt php8.4-8.4.21/ext/opcache/tests/jit/gh21158.phpt --- php8.4-8.4.16/ext/opcache/tests/jit/gh21158.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/tests/jit/gh21158.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,49 @@ +--TEST-- +GH-21158: Assertion jit->ra[var].flags & (1<<0) failed in zend_jit_use_reg +--CREDITS-- +YuanchengJiang +--EXTENSIONS-- +opcache +--INI-- +opcache.jit=1254 +--FILE-- += 0 && $col - 1 >= 0 && $board[$row - 1][$col - 1] == 1) $live_neighbors++; + if ($row >= 1 && $col + 1 < COL && $board[$row - 1][$col + 1] == 1) $live_neighbors++; + return $live_neighbors; +} +$board = [ + [1,1,0,0,1,1,1,1,1,0], + [0,1,0,1,1,0,0,1,0,0], + [0,1,0,0,1,0,0,0,1,0], + [0,0,1,1,1,1,1,0,0,0], + [1,1,1,1,1,1,0,1,1,0], + [0,1,0,0,1,1,1,0,1,0], + [0,1,1,0,1,1,1,1,0,0], + [1,1,0,0,0,0,1,1,1,0], + [1,0,0,1,1,0,1,1,0,1], + [0,0,1,1,1,0,1,1,0,1], +]; +for ($i = 0; $i < ROW; $i++) { + for ($j = 0; $j < COL; $j++) { + echo count_live_neighbors($board, $i, $j), ","; + } + echo "\n"; +} +?> +--EXPECT-- +1,0,0,1,1,1,1,1,0,0, +2,1,2,2,1,2,3,2,1,1, +2,0,2,2,1,1,1,1,1,0, +1,1,2,2,1,2,0,1,0,1, +1,2,2,3,3,2,2,2,0,0, +2,2,2,3,3,2,2,2,1,1, +2,1,1,2,2,3,2,2,0,1, +2,1,1,2,1,3,3,2,1,0, +1,1,2,1,0,2,2,2,2,1, +0,2,2,2,1,3,2,1,3,0, diff -Nru php8.4-8.4.16/ext/opcache/tests/jit/gh21267.phpt php8.4-8.4.21/ext/opcache/tests/jit/gh21267.phpt --- php8.4-8.4.16/ext/opcache/tests/jit/gh21267.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/tests/jit/gh21267.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,35 @@ +--TEST-- +GH-21267 (JIT infinite loop on FETCH_OBJ_R with IS_UNDEF property in polymorphic context) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.jit=tracing +opcache.jit_buffer_size=64M +opcache.jit_hot_loop=0 +opcache.jit_hot_func=2 +opcache.jit_hot_return=0 +opcache.jit_hot_side_exit=1 +--FILE-- +x; } +} + +$o1 = new C; +$o2 = new C; +$o2->x = false; +$o3 = new C; +unset($o3->x); +$a = [$o1, $o2, $o3]; + +for ($i = 0; $i < 8; $i++) { + $m = $a[$i % 3]; + $m->getX(); + $m->getX(); +} +?> +OK +--EXPECT-- +OK diff -Nru php8.4-8.4.16/ext/opcache/tests/jit/gh21267_blacklist.phpt php8.4-8.4.21/ext/opcache/tests/jit/gh21267_blacklist.phpt --- php8.4-8.4.16/ext/opcache/tests/jit/gh21267_blacklist.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/tests/jit/gh21267_blacklist.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,36 @@ +--TEST-- +GH-21267 (JIT infinite loop on FETCH_OBJ_R with IS_UNDEF via blacklisted trace exit) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.jit=tracing +opcache.jit_buffer_size=64M +opcache.jit_hot_loop=0 +opcache.jit_hot_func=2 +opcache.jit_hot_return=0 +opcache.jit_hot_side_exit=1 +opcache.jit_max_side_traces=0 +--FILE-- +x; } +} + +$o1 = new C; +$o2 = new C; +$o2->x = false; +$o3 = new C; +unset($o3->x); +$a = [$o1, $o2, $o3]; + +for ($i = 0; $i < 8; $i++) { + $m = $a[$i % 3]; + $m->getX(); + $m->getX(); +} +?> +OK +--EXPECT-- +OK diff -Nru php8.4-8.4.16/ext/opcache/tests/jit/gh21593.phpt php8.4-8.4.21/ext/opcache/tests/jit/gh21593.phpt --- php8.4-8.4.16/ext/opcache/tests/jit/gh21593.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/tests/jit/gh21593.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,49 @@ +--TEST-- +GH-21593: Function JIT JMPNZ smart branch +--CREDITS-- +paulmhh +--EXTENSIONS-- +opcache +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.jit=function +--FILE-- +a)) { + echo "1\n"; + } +} + +function test2($a) { + if (!isset($a?->a)) { + echo "2\n"; + } +} + +function test3($a) { + if (empty($a?->a)) { + echo "3\n"; + } +} + +function test4($a) { + if (!empty($a?->a)) { + echo "4\n"; + } +} + +$a = new stdClass; +$a->a = 'a'; + +test1($a); +test2($a); +test3($a); +test4($a); + +?> +--EXPECT-- +1 +4 diff -Nru php8.4-8.4.16/ext/opcache/tests/opt/gh11245_2.phpt php8.4-8.4.21/ext/opcache/tests/opt/gh11245_2.phpt --- php8.4-8.4.16/ext/opcache/tests/opt/gh11245_2.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/tests/opt/gh11245_2.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -28,9 +28,9 @@ 0000 T1 = PRE_INC_STATIC_PROP string("prop") string("X") 0001 T2 = ISSET_ISEMPTY_CV (empty) CV0($xx) 0002 JMPZ T2 0005 -0003 FREE T1 +0003 FREE T1 loop-end(+2) 0004 RETURN null 0005 FREE T1 0006 RETURN int(1) LIVE RANGES: - 1: 0001 - 0005 (tmp/var) + 1: 0001 - 0003 (tmp/var) diff -Nru php8.4-8.4.16/ext/opcache/tests/oss-fuzz-472563272.phpt php8.4-8.4.21/ext/opcache/tests/oss-fuzz-472563272.phpt --- php8.4-8.4.16/ext/opcache/tests/oss-fuzz-472563272.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/tests/oss-fuzz-472563272.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,14 @@ +--TEST-- +OSS-Fuzz #472563272: Borked block_pass JMP[N]Z optimization +--EXTENSIONS-- +opcache +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff -Nru php8.4-8.4.16/ext/opcache/zend_accelerator_util_funcs.c php8.4-8.4.21/ext/opcache/zend_accelerator_util_funcs.c --- php8.4-8.4.16/ext/opcache/zend_accelerator_util_funcs.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/opcache/zend_accelerator_util_funcs.c 2026-05-05 16:34:12.000000000 +0000 @@ -360,6 +360,12 @@ : NULL; if (parent_ce || (orig_ce->ce_flags & ZEND_ACC_LINKED)) { ce = zend_try_early_bind(orig_ce, parent_ce, early_binding->lcname, zv); + } else if (ZSTR_LEN(early_binding->lc_parent_name) == 0) { + /* Parentless class: use the same binding path as the VM handler */ + zval lcname_zv[2]; + ZVAL_STR(&lcname_zv[0], early_binding->lcname); + ZVAL_STR(&lcname_zv[1], early_binding->rtd_key); + ce = zend_bind_class_in_slot(zv, lcname_zv, early_binding->lc_parent_name); } } if (ce && early_binding->cache_slot != (uint32_t) -1) { diff -Nru php8.4-8.4.16/ext/openssl/openssl.c php8.4-8.4.21/ext/openssl/openssl.c --- php8.4-8.4.16/ext/openssl/openssl.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/openssl.c 2026-05-05 16:34:12.000000000 +0000 @@ -1567,14 +1567,11 @@ bio_out = BIO_new_file(file_path, PHP_OPENSSL_BIO_MODE_W(PKCS7_BINARY)); if (bio_out) { - if (!notext && !X509_print(bio_out, cert)) { - php_openssl_store_errors(); - } - if (!PEM_write_bio_X509(bio_out, cert)) { + if ((notext || X509_print(bio_out, cert)) && PEM_write_bio_X509(bio_out, cert)) { + RETVAL_TRUE; + } else { php_openssl_store_errors(); } - - RETVAL_TRUE; } else { php_openssl_store_errors(); php_error_docref(NULL, E_WARNING, "Error opening file %s", file_path); @@ -1872,8 +1869,7 @@ } if (!notext && !X509_print(bio_out, cert)) { php_openssl_store_errors(); - } - if (PEM_write_bio_X509(bio_out, cert)) { + } else if (PEM_write_bio_X509(bio_out, cert)) { BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); @@ -2134,6 +2130,11 @@ subject_name = X509_get_subject_name(cert); cert_name = X509_NAME_oneline(subject_name, NULL, 0); + if (cert_name == NULL) { + php_openssl_store_errors(); + goto err; + } + add_assoc_string(return_value, "name", cert_name); OPENSSL_free(cert_name); @@ -2166,6 +2167,12 @@ } str_serial = i2s_ASN1_INTEGER(NULL, asn1_serial); + /* Can return NULL on error or memory allocation failure */ + if (!str_serial) { + php_openssl_store_errors(); + goto err; + } + add_assoc_string(return_value, "serialNumber", str_serial); OPENSSL_free(str_serial); @@ -2195,7 +2202,7 @@ for (i = 0; i < X509_PURPOSE_get_count(); i++) { int id, purpset; char * pname; - X509_PURPOSE * purp; + const X509_PURPOSE * purp; zval subsub; array_init(&subsub); @@ -2245,7 +2252,7 @@ goto err_subitem; } } - else if (X509V3_EXT_print(bio_out, extension, 0, 0)) { + else if (X509V3_EXT_print(bio_out, extension, 0, 0) > 0) { BIO_get_mem_ptr(bio_out, &bio_buf); add_assoc_stringl(&subitem, extname, bio_buf->data, bio_buf->length); } else { @@ -2280,21 +2287,13 @@ X509_INFO *xi; char cert_path[MAXPATHLEN]; - if(!(stack = sk_X509_new_null())) { - php_openssl_store_errors(); - php_error_docref(NULL, E_ERROR, "Memory allocation failure"); - goto end; - } - if (!php_openssl_check_path(cert_file, cert_file_len, cert_path, arg_num)) { - sk_X509_free(stack); goto end; } if (!(in = BIO_new_file(cert_path, PHP_OPENSSL_BIO_MODE_R(PKCS7_BINARY)))) { php_openssl_store_errors(); php_error_docref(NULL, E_WARNING, "Error opening the file, %s", cert_path); - sk_X509_free(stack); goto end; } @@ -2302,7 +2301,11 @@ if (!(sk = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL))) { php_openssl_store_errors(); php_error_docref(NULL, E_WARNING, "Error reading the file, %s", cert_path); - sk_X509_free(stack); + goto end; + } + + if(!(stack = sk_X509_new_reserve(NULL, sk_X509_INFO_num(sk)))) { + php_openssl_store_errors(); goto end; } @@ -2342,6 +2345,7 @@ return 0; } if (!X509_STORE_CTX_init(csc, ctx, x, untrustedchain)) { + X509_STORE_CTX_free(csc); php_openssl_store_errors(); php_error_docref(NULL, E_WARNING, "Certificate store initialization failed"); return 0; @@ -2552,6 +2556,9 @@ bool free_cert; sk = sk_X509_new_null(); + if (sk == NULL) { + goto clean_exit; + } /* get certs */ if (Z_TYPE_P(zcerts) == IS_ARRAY) { @@ -2571,7 +2578,10 @@ } } - sk_X509_push(sk, cert); + if (sk_X509_push(sk, cert) <= 0) { + X509_free(cert); + goto push_fail_exit; + } } ZEND_HASH_FOREACH_END(); } else { /* a single certificate */ @@ -2589,11 +2599,20 @@ goto clean_exit; } } - sk_X509_push(sk, cert); + if (sk_X509_push(sk, cert) <= 0) { + X509_free(cert); + goto push_fail_exit; + } } clean_exit: return sk; + +push_fail_exit: + php_openssl_store_errors(); + php_sk_X509_free(sk); + sk = NULL; + goto clean_exit; } /* }}} */ @@ -2662,6 +2681,9 @@ if (args && (item = zend_hash_str_find(Z_ARRVAL_P(args), "extracerts", sizeof("extracerts")-1)) != NULL) { ca = php_array_to_X509_sk(item, 5, "extracerts"); + if (!ca) { + goto cleanup; + } } /* end parse extra config */ @@ -2755,6 +2777,9 @@ if (args && (item = zend_hash_str_find(Z_ARRVAL_P(args), "extracerts", sizeof("extracerts")-1)) != NULL) { ca = php_array_to_X509_sk(item, 5, "extracerts"); + if (!ca) { + goto cleanup; + } } /* end parse extra config */ @@ -2762,7 +2787,7 @@ if (p12 != NULL) { bio_out = BIO_new(BIO_s_mem()); - if (i2d_PKCS12_bio(bio_out, p12)) { + if (bio_out && i2d_PKCS12_bio(bio_out, p12)) { BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); @@ -2827,7 +2852,7 @@ if (cert) { bio_out = BIO_new(BIO_s_mem()); - if (PEM_write_bio_X509(bio_out, cert)) { + if (bio_out && PEM_write_bio_X509(bio_out, cert)) { BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length); @@ -2840,7 +2865,7 @@ if (pkey) { bio_out = BIO_new(BIO_s_mem()); - if (PEM_write_bio_PrivateKey(bio_out, pkey, NULL, NULL, 0, 0, NULL)) { + if (bio_out && PEM_write_bio_PrivateKey(bio_out, pkey, NULL, NULL, 0, 0, NULL)) { BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); ZVAL_STRINGL(&zpkey, bio_buf->data, bio_buf->length); @@ -2861,7 +2886,7 @@ if (!aCA) break; bio_out = BIO_new(BIO_s_mem()); - if (PEM_write_bio_X509(bio_out, aCA)) { + if (bio_out && PEM_write_bio_X509(bio_out, aCA)) { BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); ZVAL_STRINGL(&zextracert, bio_buf->data, bio_buf->length); @@ -3065,13 +3090,15 @@ } } } + + if (!X509_REQ_set_pubkey(csr, req->priv_key)) { + php_openssl_store_errors(); + } } else { php_openssl_store_errors(); + return FAILURE; } - if (!X509_REQ_set_pubkey(csr, req->priv_key)) { - php_openssl_store_errors(); - } return SUCCESS; } @@ -3151,9 +3178,9 @@ bio_out = BIO_new_file(file_path, PHP_OPENSSL_BIO_MODE_W(PKCS7_BINARY)); if (bio_out != NULL) { if (!notext && !X509_REQ_print(bio_out, csr)) { + /* TODO: warn? */ php_openssl_store_errors(); - } - if (!PEM_write_bio_X509_REQ(bio_out, csr)) { + } else if (!PEM_write_bio_X509_REQ(bio_out, csr)) { php_error_docref(NULL, E_WARNING, "Error writing PEM to file %s", file_path); php_openssl_store_errors(); } else { @@ -3202,9 +3229,7 @@ bio_out = BIO_new(BIO_s_mem()); if (!notext && !X509_REQ_print(bio_out, csr)) { php_openssl_store_errors(); - } - - if (PEM_write_bio_X509_REQ(bio_out, csr)) { + } else if (PEM_write_bio_X509_REQ(bio_out, csr)) { BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); @@ -3350,10 +3375,17 @@ goto cleanup; } } else { - PHP_OPENSSL_ASN1_INTEGER_set(X509_get_serialNumber(new_cert), serial); + if (!PHP_OPENSSL_ASN1_INTEGER_set(X509_get_serialNumber(new_cert), serial)) { + php_openssl_store_errors(); + php_error_docref(NULL, E_WARNING, "Error setting serial number"); + goto cleanup; + } } - X509_set_subject_name(new_cert, X509_REQ_get_subject_name(csr)); + if (!X509_set_subject_name(new_cert, X509_REQ_get_subject_name(csr))) { + php_openssl_store_errors(); + goto cleanup; + } if (cert == NULL) { cert = new_cert; @@ -3362,8 +3394,11 @@ php_openssl_store_errors(); goto cleanup; } - X509_gmtime_adj(X509_getm_notBefore(new_cert), 0); - X509_gmtime_adj(X509_getm_notAfter(new_cert), 60*60*24*num_days); + if (!X509_gmtime_adj(X509_getm_notBefore(new_cert), 0) + || !X509_gmtime_adj(X509_getm_notAfter(new_cert), 60*60*24*num_days)) { + php_openssl_store_errors(); + goto cleanup; + } i = X509_set_pubkey(new_cert, key); if (!i) { php_openssl_store_errors(); @@ -3800,7 +3835,10 @@ /* {{{ php_openssl_generate_private_key */ static EVP_PKEY * php_openssl_generate_private_key(struct php_x509_request * req) { - if (req->priv_key_bits < MIN_KEY_LENGTH) { + if ((req->priv_key_type == OPENSSL_KEYTYPE_RSA || + req->priv_key_type == OPENSSL_KEYTYPE_DH || + req->priv_key_type == OPENSSL_KEYTYPE_DSA) && + req->priv_key_bits < MIN_KEY_LENGTH) { php_error_docref(NULL, E_WARNING, "Private key length must be at least %d bits, configured to %d", MIN_KEY_LENGTH, req->priv_key_bits); return NULL; @@ -4069,7 +4107,14 @@ OPENSSL_PKEY_SET_BN(data, p); OPENSSL_PKEY_SET_BN(data, q); OPENSSL_PKEY_SET_BN(data, g); - if (!p || !q || !g || !DSA_set0_pqg(dsa, p, q, g)) { + if (!p || !q || !g) { + BN_free(p); + BN_free(q); + BN_free(g); + return 0; + } + + if (!DSA_set0_pqg(dsa, p, q, g)) { return 0; } @@ -4242,7 +4287,12 @@ OPENSSL_PKEY_SET_BN(data, p); OPENSSL_PKEY_SET_BN(data, q); OPENSSL_PKEY_SET_BN(data, g); - if (!p || !g || !DH_set0_pqg(dh, p, q, g)) { + if (!p || !q) { + BN_free(p); + return 0; + } + + if (!DH_set0_pqg(dh, p, q, g)) { return 0; } @@ -4255,6 +4305,10 @@ if (priv_key) { pub_key = php_openssl_dh_pub_from_priv(priv_key, g, p); if (pub_key == NULL) { + BN_free(p); + BN_free(q); + BN_free(g); + BN_free(priv_key); return 0; } return DH_set0_key(dh, pub_key, priv_key); @@ -4381,6 +4435,9 @@ EC_POINT *point_q = NULL; EC_GROUP *group = NULL; BN_CTX *bctx = BN_CTX_new(); + if (!bctx) { + goto clean_exit; + } *is_private = false; @@ -4677,6 +4734,9 @@ } EVP_PKEY_CTX_free(ctx); ctx = EVP_PKEY_CTX_new(param_key, NULL); + if (!ctx) { + goto cleanup; + } } if (EVP_PKEY_check(ctx) || EVP_PKEY_public_check_quick(ctx)) { @@ -4991,6 +5051,10 @@ if (PHP_SSL_REQ_PARSE(&req, args) == SUCCESS) { bio_out = BIO_new(BIO_s_mem()); + if (!bio_out) { + php_openssl_store_errors(); + goto cleanup; + } if (passphrase && req.priv_key_encrypt) { if (req.priv_key_encrypt_cipher) { @@ -5019,6 +5083,7 @@ php_openssl_store_errors(); } } +cleanup: PHP_SSL_REQ_DISPOSE(&req); EVP_PKEY_free(key); BIO_free(bio_out); @@ -5142,7 +5207,7 @@ EVP_PKEY *pkey = Z_OPENSSL_PKEY_P(key)->pkey; BIO *out = BIO_new(BIO_s_mem()); - if (!PEM_write_bio_PUBKEY(out, pkey)) { + if (!out || !PEM_write_bio_PUBKEY(out, pkey)) { BIO_free(out); php_openssl_store_errors(); RETURN_FALSE; @@ -5797,6 +5862,9 @@ } recipcerts = sk_X509_new_null(); + if (recipcerts == NULL) { + goto clean_exit; + } /* get certs */ if (Z_TYPE_P(zrecipcerts) == IS_ARRAY) { @@ -5818,7 +5886,10 @@ goto clean_exit; } } - sk_X509_push(recipcerts, cert); + if (sk_X509_push(recipcerts, cert) <= 0) { + X509_free(cert); + goto clean_exit; + } } ZEND_HASH_FOREACH_END(); } else { /* a single certificate */ @@ -5839,7 +5910,10 @@ goto clean_exit; } } - sk_X509_push(recipcerts, cert); + if (sk_X509_push(recipcerts, cert) <= 0) { + X509_free(cert); + goto clean_exit; + } } /* sanity check the cipher */ @@ -5860,16 +5934,21 @@ /* tack on extra headers */ if (zheaders) { ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(zheaders), strindex, zcertval) { + int ret; zend_string *str = zval_try_get_string(zcertval); if (UNEXPECTED(!str)) { goto clean_exit; } if (strindex) { - BIO_printf(outfile, "%s: %s\n", ZSTR_VAL(strindex), ZSTR_VAL(str)); + ret = BIO_printf(outfile, "%s: %s\n", ZSTR_VAL(strindex), ZSTR_VAL(str)); } else { - BIO_printf(outfile, "%s\n", ZSTR_VAL(str)); + ret = BIO_printf(outfile, "%s\n", ZSTR_VAL(str)); } zend_string_release(str); + if (ret < 0) { + php_openssl_store_errors(); + goto clean_exit; + } } ZEND_HASH_FOREACH_END(); } @@ -6088,6 +6167,7 @@ zend_string_release(str); if (ret < 0) { php_openssl_store_errors(); + goto clean_exit; } } ZEND_HASH_FOREACH_END(); } @@ -6404,6 +6484,9 @@ } recipcerts = sk_X509_new_null(); + if (recipcerts == NULL) { + goto clean_exit; + } /* get certs */ if (Z_TYPE_P(zrecipcerts) == IS_ARRAY) { @@ -6424,7 +6507,10 @@ goto clean_exit; } } - sk_X509_push(recipcerts, cert); + if (sk_X509_push(recipcerts, cert) <= 0) { + php_openssl_store_errors(); + goto clean_exit; + } } ZEND_HASH_FOREACH_END(); } else { /* a single certificate */ @@ -6444,7 +6530,10 @@ goto clean_exit; } } - sk_X509_push(recipcerts, cert); + if (sk_X509_push(recipcerts, cert) <= 0) { + php_openssl_store_errors(); + goto clean_exit; + } } /* sanity check the cipher */ @@ -6469,16 +6558,21 @@ /* tack on extra headers */ if (zheaders && encoding == ENCODING_SMIME) { ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(zheaders), strindex, zcertval) { + int ret; zend_string *str = zval_try_get_string(zcertval); if (UNEXPECTED(!str)) { goto clean_exit; } if (strindex) { - BIO_printf(outfile, "%s: %s\n", ZSTR_VAL(strindex), ZSTR_VAL(str)); + ret = BIO_printf(outfile, "%s: %s\n", ZSTR_VAL(strindex), ZSTR_VAL(str)); } else { - BIO_printf(outfile, "%s\n", ZSTR_VAL(str)); + ret = BIO_printf(outfile, "%s\n", ZSTR_VAL(str)); } zend_string_release(str); + if (ret < 0) { + php_openssl_store_errors(); + goto clean_exit; + } } ZEND_HASH_FOREACH_END(); } @@ -6758,6 +6852,7 @@ zend_string_release(str); if (ret < 0) { php_openssl_store_errors(); + goto clean_exit; } } ZEND_HASH_FOREACH_END(); } @@ -7437,18 +7532,20 @@ cipher = EVP_get_cipherbyname(method); if (!cipher) { php_error_docref(NULL, E_WARNING, "Unknown cipher algorithm"); - RETURN_FALSE; + RETVAL_FALSE; + goto out_pkey; } cipher_iv_len = EVP_CIPHER_iv_length(cipher); if (cipher_iv_len > 0) { if (!iv) { zend_argument_value_error(6, "cannot be null for the chosen cipher algorithm"); - RETURN_THROWS(); + goto out_pkey; } if ((size_t)cipher_iv_len != iv_len) { php_error_docref(NULL, E_WARNING, "IV length is invalid"); - RETURN_FALSE; + RETVAL_FALSE; + goto out_pkey; } iv_buf = (unsigned char *)iv; } else { @@ -7470,8 +7567,9 @@ } efree(buf); - EVP_PKEY_free(pkey); EVP_CIPHER_CTX_free(ctx); +out_pkey: + EVP_PKEY_free(pkey); } /* }}} */ @@ -7605,7 +7703,8 @@ sigbuf = zend_string_alloc(siglen, 0); md_ctx = EVP_MD_CTX_create(); - if (EVP_DigestInit(md_ctx, mdtype) && + if (md_ctx && + EVP_DigestInit(md_ctx, mdtype) && EVP_DigestUpdate(md_ctx, (unsigned char *)data, data_len) && EVP_DigestFinal (md_ctx, (unsigned char *)ZSTR_VAL(sigbuf), &siglen)) { if (raw_output) { diff -Nru php8.4-8.4.16/ext/openssl/tests/bug74796.phpt php8.4-8.4.21/ext/openssl/tests/bug74796.phpt --- php8.4-8.4.16/ext/openssl/tests/bug74796.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/bug74796.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -12,13 +12,24 @@ --FILE-- saveCaCert($caFile); +$certificateGenerator->saveNewCertAsFileWithKey('cs.php.net', $csFile); +$certificateGenerator->saveNewCertAsFileWithKey('uk.php.net', $ukFile); +$certificateGenerator->saveNewCertAsFileWithKey('us.php.net', $usFile); + $serverCode = <<<'CODE' $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN; $ctx = stream_context_create(['ssl' => [ 'SNI_server_certs' => [ - "cs.php.net" => __DIR__ . "/sni_server_cs.pem", - "uk.php.net" => __DIR__ . "/sni_server_uk.pem", - "us.php.net" => __DIR__ . "/sni_server_us.pem" + "cs.php.net" => '%s', + "uk.php.net" => '%s', + "us.php.net" => '%s', ] ]]); @@ -33,6 +44,7 @@ phpt_wait(); CODE; +$serverCode = sprintf($serverCode, $csFile, $ukFile, $usFile); $proxyCode = <<<'CODE' function parse_sni_from_client_hello($data) { @@ -134,7 +146,7 @@ $clientCode = <<<'CODE' $clientCtx = stream_context_create([ 'ssl' => [ - 'cafile' => __DIR__ . '/sni_server_ca.pem', + 'cafile' => '%s', 'verify_peer' => true, 'verify_peer_name' => true, ], @@ -155,16 +167,21 @@ phpt_notify('server'); CODE; +$clientCode = sprintf($clientCode, $caFile); include 'ServerClientTestCase.inc'; ServerClientTestCase::getInstance()->run($clientCode, [ - 'server' => $serverCode, - 'proxy' => $proxyCode, + 'server' => $serverCode, + 'proxy' => $proxyCode, ]); ?> --CLEAN-- --EXPECT-- string(19) "Hello from server 0" diff -Nru php8.4-8.4.16/ext/openssl/tests/bug80770.phpt php8.4-8.4.21/ext/openssl/tests/bug80770.phpt --- php8.4-8.4.16/ext/openssl/tests/bug80770.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/bug80770.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -11,14 +11,25 @@ saveCaCert($caCertFile); +$certificateGenerator->saveNewCertAsFileWithKey('cs.php.net', $csFile); +$certificateGenerator->saveNewCertAsFileWithKey('uk.php.net', $ukFile); +$certificateGenerator->saveNewCertAsFileWithKey('us.php.net', $usFile); +$certificateGenerator->saveNewCertAsFileWithKey('Bug80770 Test Client', $clientCertFile); $serverCode = <<<'CODE' $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; $ctx = stream_context_create(['ssl' => [ 'SNI_server_certs' => [ - "cs.php.net" => __DIR__ . "/sni_server_cs.pem", - "uk.php.net" => __DIR__ . "/sni_server_uk.pem", - "us.php.net" => __DIR__ . "/sni_server_us.pem" + "cs.php.net" => '%s', + "uk.php.net" => '%s', + "us.php.net" => '%s', ], 'verify_peer' => true, 'cafile' => '%s', @@ -28,7 +39,6 @@ ]]); $server = stream_socket_server('tcp://127.0.0.1:0', $errno, $errstr, $flags, $ctx); phpt_notify_server_start($server); - $client = stream_socket_accept($server, 30); if ($client) { $success = stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_SERVER); @@ -43,7 +53,7 @@ phpt_notify(message: "ACCEPT_FAILED"); } CODE; -$serverCode = sprintf($serverCode, $caCertFile); +$serverCode = sprintf($serverCode, $csFile, $ukFile, $usFile, $caCertFile); $clientCode = <<<'CODE' $flags = STREAM_CLIENT_CONNECT; @@ -58,19 +68,11 @@ if ($client) { stream_socket_enable_crypto($client, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); } - $result = phpt_wait(); echo trim($result); CODE; $clientCode = sprintf($clientCode, $clientCertFile); -include 'CertificateGenerator.inc'; - -// Generate CA and client certificate signed by that CA -$certificateGenerator = new CertificateGenerator(); -$certificateGenerator->saveCaCert($caCertFile); -$certificateGenerator->saveNewCertAsFileWithKey('Bug80770 Test Client', $clientCertFile); - include 'ServerClientTestCase.inc'; ServerClientTestCase::getInstance()->run($clientCode, $serverCode); ?> @@ -78,6 +80,9 @@ --EXPECTF-- CLIENT_CERT_CAPTURED diff -Nru php8.4-8.4.16/ext/openssl/tests/gh20802.phpt php8.4-8.4.21/ext/openssl/tests/gh20802.phpt --- php8.4-8.4.16/ext/openssl/tests/gh20802.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/gh20802.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,62 @@ +--TEST-- +GH-20802: undefined behavior with invalid SNI_server_certs option values +--EXTENSIONS-- +openssl +--SKIPIF-- + +--FILE-- + [ + 'local_cert' => '%s', + 'allow_self_signed' => true, + 'verify_peer_name' => false, + 'verify_peer' => false, + 'SNI_enabled' => true, + 'SNI_server_certs' => [ + 'localhost' => &$localhost, + ] + ] + ]); + $server = stream_socket_server('tls://127.0.0.1:12443', $errno, $errstr, $flags, $ctx); + phpt_notify_server_start($server); + stream_socket_accept($server, 3); +CODE; +$serverCode = sprintf($serverCode, $certFile); + +$clientCode = <<<'CODE' + $flags = STREAM_CLIENT_CONNECT; + +$ctx = stream_context_create([ + 'ssl' => [ + 'SNI_enabled' => true, + 'verify_peer_name' => false, + 'verify_peer' => false + ] + ]); + @stream_socket_client("tls://127.0.0.1:12443", $errno, $errstr, 1, $flags, $ctx); +CODE; + +include 'CertificateGenerator.inc'; +$certificateGenerator = new CertificateGenerator(); +$certificateGenerator->saveNewCertAsFileWithKey('gh20802-snioptions', $certFile); + +include 'ServerClientTestCase.inc'; +ServerClientTestCase::getInstance()->run($clientCode, $serverCode); +?> +--CLEAN-- + +--EXPECTF-- +%a +PHP Warning: stream_socket_accept(): Failed to enable crypto in %s(%d) : eval()'d code on line %d +PHP Warning: stream_socket_accept(): Accept failed: Cannot enable crypto in %s(%d) : eval()'d code on line %d diff -Nru php8.4-8.4.16/ext/openssl/tests/gh21031.phpt php8.4-8.4.21/ext/openssl/tests/gh21031.phpt --- php8.4-8.4.16/ext/openssl/tests/gh21031.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/gh21031.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,55 @@ +--TEST-- +GH-21031 (Fix NULL deref when enabling TLS fails and the peer name needs to be reset) +--EXTENSIONS-- +openssl +--SKIPIF-- + +--FILE-- + [ + 'SNI_server_certs' => [ + "cs.php.net" => __DIR__ . "/sni_server_cs_expired.pem", + ] + ]]); + + $server = stream_socket_server('tls://127.0.0.1:0', $errno, $errstr, $serverFlags, $ctx); + phpt_notify_server_start($server); + + $conn = stream_socket_accept($server, 10); + if ($conn) { + fclose($conn); + } + + phpt_wait(); +CODE; + +$clientCode = <<<'CODE' + $clientCtx = stream_context_create([ + 'ssl' => [ + 'cafile' => __DIR__ . '/sni_server_ca.pem', + 'verify_peer' => true, + 'verify_peer_name' => true, + ], + "http" => [ + "proxy" => "tcp://{{ ADDR }}" + ], + ]); + + var_dump(@file_get_contents("https://cs.php.net/", false, $clientCtx)); + + phpt_notify(); +CODE; + +include 'ServerClientTestCase.inc'; +ServerClientTestCase::getInstance()->run($clientCode, $serverCode); +?> +--EXPECT-- +bool(false) diff -Nru php8.4-8.4.16/ext/openssl/tests/gh21083.phpt php8.4-8.4.21/ext/openssl/tests/gh21083.phpt --- php8.4-8.4.16/ext/openssl/tests/gh21083.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/gh21083.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,61 @@ +--TEST-- +GH-21083 (openssl_pkey_new() fails for EC keys when private_key_bits is not set) +--EXTENSIONS-- +openssl +--SKIPIF-- + +--ENV-- +OPENSSL_CONF= +--FILE-- + $conf, + 'private_key_type' => OPENSSL_KEYTYPE_EC, + 'curve_name' => 'prime256v1', +]); +var_dump($key !== false); +$details = openssl_pkey_get_details($key); +var_dump($details['bits']); +var_dump($details['type'] === OPENSSL_KEYTYPE_EC); +echo "EC OK\n"; + +// X25519 - fixed size key, private_key_bits should not be required +if (defined('OPENSSL_KEYTYPE_X25519')) { + $key = openssl_pkey_new([ + 'config' => $conf, + 'private_key_type' => OPENSSL_KEYTYPE_X25519, + ]); + var_dump($key !== false); + echo "X25519 OK\n"; +} else { + echo "bool(true)\nX25519 OK\n"; +} + +// Ed25519 - fixed size key, private_key_bits should not be required +if (defined('OPENSSL_KEYTYPE_ED25519')) { + $key = openssl_pkey_new([ + 'config' => $conf, + 'private_key_type' => OPENSSL_KEYTYPE_ED25519, + ]); + var_dump($key !== false); + echo "Ed25519 OK\n"; +} else { + echo "bool(true)\nEd25519 OK\n"; +} + +unlink($conf); +?> +--EXPECT-- +bool(true) +int(256) +bool(true) +EC OK +bool(true) +X25519 OK +bool(true) +Ed25519 OK diff -Nru php8.4-8.4.16/ext/openssl/tests/gh9310.phpt php8.4-8.4.21/ext/openssl/tests/gh9310.phpt --- php8.4-8.4.16/ext/openssl/tests/gh9310.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/gh9310.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -23,7 +23,21 @@ copy($certFile, $baseDirCertFile); copy($pkFile, $baseDirPkFile); -copy(__DIR__ . '/sni_server_uk_cert.pem', $baseDir . '/sni_server_uk_cert.pem'); + +$sniCaFile = __DIR__ . '/gh9310_sni_ca.pem.tmp'; +$sniCsFile = __DIR__ . '/gh9310_sni_cs.pem.tmp'; +$sniUkCertFile = __DIR__ . '/gh9310_sni_uk_cert.pem.tmp'; +$sniUkKeyFile = __DIR__ . '/gh9310_sni_uk_key.pem.tmp'; +$sniUsCertFile = __DIR__ . '/gh9310_sni_us_cert.pem.tmp'; +$sniUsKeyFile = __DIR__ . '/gh9310_sni_us_key.pem.tmp'; +$baseDirSniUkCertFile = $baseDir . '/sni_uk_cert.pem'; + +$certificateGenerator->saveCaCert($sniCaFile); +$certificateGenerator->saveNewCertAsFileWithKey('cs.php.net', $sniCsFile); +$certificateGenerator->saveNewCertAndKey('uk.php.net', $sniUkCertFile, $sniUkKeyFile); +$certificateGenerator->saveNewCertAndKey('us.php.net', $sniUsCertFile, $sniUsKeyFile); + +copy($sniUkCertFile, $baseDirSniUkCertFile); $serverCodeTemplate = <<<'CODE' @@ -60,7 +74,7 @@ $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; $ctx = stream_context_create(['ssl' => [ 'SNI_server_certs' => [ - "cs.php.net" => __DIR__ . "/sni_server_cs.pem", + "cs.php.net" => '%s', ] ]]); @@ -69,6 +83,7 @@ stream_socket_accept($server); CODE; +$sniServerCodeV1 = sprintf($sniServerCodeV1, $sniCsFile); $sniServerCodeV2 = <<<'CODE' ini_set('log_errors', 'On'); @@ -77,8 +92,8 @@ $ctx = stream_context_create(['ssl' => [ 'SNI_server_certs' => [ "uk.php.net" => [ - 'local_cert' => __DIR__ . '/gh9310/sni_server_uk_cert.pem', - 'local_pk' => __DIR__ . '/sni_server_uk_key.pem', + 'local_cert' => '%s', + 'local_pk' => '%s', ] ] ]]); @@ -88,6 +103,7 @@ stream_socket_accept($server); CODE; +$sniServerCodeV2 = sprintf($sniServerCodeV2, $baseDirSniUkCertFile, $sniUkKeyFile); $sniServerCodeV3 = <<<'CODE' ini_set('log_errors', 'On'); @@ -96,8 +112,8 @@ $ctx = stream_context_create(['ssl' => [ 'SNI_server_certs' => [ "us.php.net" => [ - 'local_cert' => __DIR__ . '/sni_server_us_cert.pem', - 'local_pk' => __DIR__ . '/sni_server_us_key.pem', + 'local_cert' => '%s', + 'local_pk' => '%s', ] ] ]]); @@ -107,14 +123,15 @@ stream_socket_accept($server); CODE; +$sniServerCodeV3 = sprintf($sniServerCodeV3, $sniUsCertFile, $sniUsKeyFile); $sniClientCodeTemplate = <<<'CODE' $flags = STREAM_CLIENT_CONNECT; $ctxArr = [ - 'cafile' => __DIR__ . '/sni_server_ca.pem', + 'cafile' => '%s', + 'peer_name' => '%s', ]; - $ctxArr['peer_name'] = '%s'; $ctx = stream_context_create(['ssl' => $ctxArr]); @stream_socket_client("tls://{{ ADDR }}", $errno, $errstr, 1, $flags, $ctx); CODE; @@ -131,13 +148,13 @@ $serverCode = sprintf($serverCodeTemplate, $baseDirCertFile, $pkFile); ServerClientTestCase::getInstance()->run($clientCode, $serverCode); -$sniClientCode = sprintf($sniClientCodeTemplate, 'cs.php.net'); +$sniClientCode = sprintf($sniClientCodeTemplate, $sniCaFile, 'cs.php.net'); ServerClientTestCase::getInstance()->run($sniClientCode, $sniServerCodeV1); -$sniClientCode = sprintf($sniClientCodeTemplate, 'uk.php.net'); +$sniClientCode = sprintf($sniClientCodeTemplate, $sniCaFile, 'uk.php.net'); ServerClientTestCase::getInstance()->run($sniClientCode, $sniServerCodeV2); -$sniClientCode = sprintf($sniClientCodeTemplate, 'us.php.net'); +$sniClientCode = sprintf($sniClientCodeTemplate, $sniCaFile, 'us.php.net'); ServerClientTestCase::getInstance()->run($sniClientCode, $sniServerCodeV3); ?> @@ -149,7 +166,13 @@ @unlink(__DIR__ . '/gh9310.key'); @unlink($baseDir . '/cert.crt'); @unlink($baseDir . '/private.key'); -@unlink($baseDir . '/sni_server_uk_cert.pem'); +@unlink($baseDir . '/sni_uk_cert.pem'); +@unlink(__DIR__ . '/gh9310_sni_ca.pem.tmp'); +@unlink(__DIR__ . '/gh9310_sni_cs.pem.tmp'); +@unlink(__DIR__ . '/gh9310_sni_uk_cert.pem.tmp'); +@unlink(__DIR__ . '/gh9310_sni_uk_key.pem.tmp'); +@unlink(__DIR__ . '/gh9310_sni_us_cert.pem.tmp'); +@unlink(__DIR__ . '/gh9310_sni_us_key.pem.tmp'); @rmdir($baseDir); ?> --EXPECTF-- @@ -169,15 +192,15 @@ PHP Warning: stream_socket_accept(): Unable to get real path of private key file `%sgh9310.key' in %s PHP Warning: stream_socket_accept(): Failed to enable crypto in %s PHP Warning: stream_socket_accept(): Accept failed: %s -PHP Warning: stream_socket_accept(): open_basedir restriction in effect. File(%ssni_server_cs.pem) is not within the allowed path(s): (%sgh9310) in %s -PHP Warning: stream_socket_accept(): Failed setting local cert chain file `%ssni_server_cs.pem'; file not found in %s +PHP Warning: stream_socket_accept(): open_basedir restriction in effect. File(%sgh9310_sni_cs.pem.tmp) is not within the allowed path(s): (%sgh9310) in %s +PHP Warning: stream_socket_accept(): Failed setting local cert chain file `%sgh9310_sni_cs.pem.tmp'; file not found in %s PHP Warning: stream_socket_accept(): Failed to enable crypto in %s PHP Warning: stream_socket_accept(): Accept failed: %s -PHP Warning: stream_socket_accept(): open_basedir restriction in effect. File(%ssni_server_uk_key.pem) is not within the allowed path(s): (%sgh9310) in %s -PHP Warning: stream_socket_accept(): Failed setting local private key file `%ssni_server_uk_key.pem'; could not open file in %s +PHP Warning: stream_socket_accept(): open_basedir restriction in effect. File(%sgh9310_sni_uk_key.pem.tmp) is not within the allowed path(s): (%sgh9310) in %s +PHP Warning: stream_socket_accept(): Failed setting local private key file `%sgh9310_sni_uk_key.pem.tmp'; could not open file in %s PHP Warning: stream_socket_accept(): Failed to enable crypto in %s PHP Warning: stream_socket_accept(): Accept failed: %s -PHP Warning: stream_socket_accept(): open_basedir restriction in effect. File(%ssni_server_us_cert.pem) is not within the allowed path(s): (%sgh9310) in %s -PHP Warning: stream_socket_accept(): Failed setting local cert chain file `%ssni_server_us_cert.pem'; could not open file in %s +PHP Warning: stream_socket_accept(): open_basedir restriction in effect. File(%sgh9310_sni_us_cert.pem.tmp) is not within the allowed path(s): (%sgh9310) in %s +PHP Warning: stream_socket_accept(): Failed setting local cert chain file `%sgh9310_sni_us_cert.pem.tmp'; could not open file in %s PHP Warning: stream_socket_accept(): Failed to enable crypto in %s PHP Warning: stream_socket_accept(): Accept failed: %s diff -Nru php8.4-8.4.16/ext/openssl/tests/openssl_password.phpt php8.4-8.4.21/ext/openssl/tests/openssl_password.phpt --- php8.4-8.4.16/ext/openssl/tests/openssl_password.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/openssl_password.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -5,7 +5,10 @@ --SKIPIF-- --FILE-- diff -Nru php8.4-8.4.16/ext/openssl/tests/openssl_x509_checkpurpose_basic.phpt php8.4-8.4.21/ext/openssl/tests/openssl_x509_checkpurpose_basic.phpt --- php8.4-8.4.16/ext/openssl/tests/openssl_x509_checkpurpose_basic.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/openssl_x509_checkpurpose_basic.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -14,7 +14,7 @@ $bert = "file://" . __DIR__ . "/bug41033.pem"; $sert = "file://" . __DIR__ . "/san-cert.pem"; $cpca = __DIR__ . "/san-cert.pem"; -$utfl = __DIR__ . "/sni_server_uk.pem"; +$utfl = __DIR__ . "/sni_server.pem"; $rcrt = openssl_x509_read($cert); /* int openssl_x509_checkpurpose ( mixed $x509cert , int $purpose); */ diff -Nru php8.4-8.4.16/ext/openssl/tests/openssl_x509_export_to_file_leak.phpt php8.4-8.4.21/ext/openssl/tests/openssl_x509_export_to_file_leak.phpt --- php8.4-8.4.16/ext/openssl/tests/openssl_x509_export_to_file_leak.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/openssl_x509_export_to_file_leak.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -5,7 +5,7 @@ --FILE-- diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server.pem php8.4-8.4.21/ext/openssl/tests/sni_server.pem --- php8.4-8.4.16/ext/openssl/tests/sni_server.pem 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server.pem 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,57 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEArMpFePSNUHNHCiUWfsSPQxHaQTpDfogEISIMuGq5JhEuHWyl +HRe51JWZGi39a/PY9rAClfg/qqPnuxwFDoovhQsq9Kd0JnsXW11CMSqiBimf8vyg +GE/V2DIOiex7Ab8+5zEL7cCrNyXfDk+DuoT7Np3jaSE/u31OMUAzFz4/EL7Zqzlk +IMkHB/GSwLIJB8VbHt4Hunf28bLreTcjO/5QpNkSFtJ1PvbWRv3WheR5ykQQWGKF +9VgwYwS0Lu7YktLF2RGFZhIypUK8jazJiwsBRQ0faSCpAXTSPYh12GDegwAiKqGk +L+fayUdWGnnpYTVOysYL8mCoi9Ar0BPgtHEVvwIDAQABAoIBAGpg7XyWMxpAno/k +XYEWSo0kRJa75CnWW5R6fhJbwjlpglajONQ8czAqGeRARDFeI0lc+3qRJ8FKv7Q2 +f/Z/pNnoEj4liiDWz350X/gdIztgDRVv6rCNFj7QMps/eEuPDo8PZySs5bxCGJ2a +3qLKlE7/za4/xhkMAEPaHppEvFb15dpomqP2Fjqei9afp8tD+xJv9BGtkFIy9acw +94AWQi974kgW7ZzfEf8RqHM0ExKiESCc26knbcBu0tQ892YHggMccUMk/UrVgR5d +vuGOBurlYGLBstSDSKCCe6la4N/FX3FiC3WhVNescnuTZPXcX3zebh7roGjgrTdd +6UJYBIECgYEA09XYihdwW66G9Y09OatzlzBh1Rvzjv2Vl5NmWHHb6vh38H4PcOof +S1pT0JvRzpt8uEs4i+Eda5PyQyp4iGtD+DQ07Dxh2jiixsE3PRFRG2wg2QCgDHnS +6vgV1VOqA/A4on4nhxLZXxhX4YvHaJYlm1bZ+amG+j5XiI/NtHJm9k8CgYEA0NB9 +bAoaZnc06+T8rMaO45boX5SvYsCZbtY3VRl75SrbMal0IKfnXHELVHuei12LmlMs +LuFgG8jGO3+ncxUqMytoGvrmk/cM9tCNbDKVHtFbqz0qt9lkDAwLsBougKnVsNDW +Aae/tz/wYXJct86unfLh0xtvkx5Iz1we4cS1fZECgYA8YR+vfK7R8xUUuIVTAsOX +vHqmO6lYgH87DRCG9S0x9FB7g/LyxEjXOY/aTg+nTDpobUhY1nmESE8tRdXFTI27 +GWZcT3m0sZ/z9u6/wUfVAST7tWnpJHAx+TR/8bDsHnSGHF836O98Y3vpFeZosSNW ++5J1zxRiD5LzocmIPXOLkQKBgEgHApxXx898YwbTj8zRGMysay89DFpV8RboUWHL +To83/y/cMbBp+kZKwAu+MGwGMndjJSRunUY4NRik6c+qh0nrORfFX+++Efy4529g +60scEDC7Apc0J2x4Yze1cED1VD6PaqJbiKffKD2UwyKr6lOVSgwVtKDcm2Tbc9OQ +lMHhAoGBAIPwYVxzWM6I6pr8x2TucpBZZReLytz7uzybMNvbKCrwlETbNNXubnfp +nPuPKzpeRI0y26pIIAbijzFW0MXq+kIu3H7we8TaImsJ1AaQCTYeoLWBVcr6RISk +3d4i7iT35aWCuhPVve0FNIv/u3jrqX2H2C2MXMiLOsw1GFxPvpi4 +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIFIjCCAwqgAwIBAgICEAMwDQYJKoZIhvcNAQELBQAwVTELMAkGA1UEBhMCR0Ix +EDAOBgNVBAgMB0VuZ2xhbmQxEDAOBgNVBAoMB1BIUC5uZXQxEDAOBgNVBAsMB29w +ZW5zc2wxEDAOBgNVBAMMB3BocC5uZXQwHhcNMTgwMTE0MTgzNjMyWhcNMjYwNDAy +MTgzNjMyWjBGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UE +CgwHUEhQLm5ldDETMBEGA1UEAwwKdWsucGhwLm5ldDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKzKRXj0jVBzRwolFn7Ej0MR2kE6Q36IBCEiDLhquSYR +Lh1spR0XudSVmRot/Wvz2PawApX4P6qj57scBQ6KL4ULKvSndCZ7F1tdQjEqogYp +n/L8oBhP1dgyDonsewG/PucxC+3Aqzcl3w5Pg7qE+zad42khP7t9TjFAMxc+PxC+ +2as5ZCDJBwfxksCyCQfFWx7eB7p39vGy63k3Izv+UKTZEhbSdT721kb91oXkecpE +EFhihfVYMGMEtC7u2JLSxdkRhWYSMqVCvI2syYsLAUUNH2kgqQF00j2Iddhg3oMA +IiqhpC/n2slHVhp56WE1TsrGC/JgqIvQK9AT4LRxFb8CAwEAAaOCAQkwggEFMAkG +A1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMGCWCGSAGG+EIBDQQmFiRPcGVu +U1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFJK58uJe +Lv8WDOR8TTLUcSxO1zCyMGwGA1UdIwRlMGOAFOPK44Eacedv7HbR2Igcbew+4kUa +oUekRTBDMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UECgwH +UEhQLm5ldDEQMA4GA1UEAwwHcGhwLm5ldIICEAAwDgYDVR0PAQH/BAQDAgWgMBMG +A1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4ICAQDHayU795hFnQNj +fuYV21sEmkSjgtp6X4rV9JfoCp8U2gieL4mizoCPx9Q8HYaAf98hPYTofGUaCSd+ +Xlzd8lhLt9GCU+BsCxGtJocrjOQDhyhkioN8iirQRTtJpRVC6a4RCBGpenOD7Z7C +Z32uGXohzFuigP/J8/SXBdHrlpNSa03iEkkisPR46mbGj06lFVOFHJDNKA3CnQwM +3VfqvZt0ksZi/gAOol8dtrAd3k5JBfJ2BtqsPbycEGAhsGrTK/MeqiFcO8QZiXpN +qf0wZzOMFZJ4HqTiHs4TMMQaDK8c4qfR0l1OE224ijcB5NlqMjGAZabMfHgNZcl7 +fYPX+POsOMaqubv98uoC0PCK8NCTyfB4V/el72EEoVfwKYOxm3eYXBEE2ZNyIci6 +YKYhNa9e2k+cFueYMztV06HTGgkcHcSJATP+3ISTRx3tj1BPmc4O4WAMEMx1E0gg +PaVrBVAylGzt8kaMaOQMBImpsALSfutq6+KtQiu0OTGS3yVUGamV4AyRjuwF1/ZA +kZbjmNEGsf9d2rzS89ckds24QUx0zrfJ56p7lRvyVK/pML7iadv8dUH3fKDDDerD +oocLjOjNxFGN9Woz+kfidA8Siu0zsfQ6CLPlaQrVAVQH4iMuCZraqMc3TqAiUKRj +iHKp6FFrRZmY8W8HEKHv98uGofn+3g== +-----END CERTIFICATE----- diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server.phpt php8.4-8.4.21/ext/openssl/tests/sni_server.phpt --- php8.4-8.4.16/ext/openssl/tests/sni_server.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -8,13 +8,25 @@ ?> --FILE-- saveCaCert($caFile); +$certificateGenerator->saveNewCertAsFileWithKey('cs.php.net', $csFile); +$certificateGenerator->saveNewCertAsFileWithKey('uk.php.net', $ukFile); +$certificateGenerator->saveNewCertAsFileWithKey('us.php.net', $usFile); + $serverCode = <<<'CODE' $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; $ctx = stream_context_create(['ssl' => [ 'SNI_server_certs' => [ - "cs.php.net" => __DIR__ . "/sni_server_cs.pem", - "uk.php.net" => __DIR__ . "/sni_server_uk.pem", - "us.php.net" => __DIR__ . "/sni_server_us.pem" + "cs.php.net" => '%s', + "uk.php.net" => '%s', + "us.php.net" => '%s', ] ]]); @@ -25,11 +37,12 @@ @stream_socket_accept($server, 3); } CODE; +$serverCode = sprintf($serverCode, $csFile, $ukFile, $usFile); $clientCode = <<<'CODE' $flags = STREAM_CLIENT_CONNECT; $ctxArr = [ - 'cafile' => __DIR__ . '/sni_server_ca.pem', + 'cafile' => '%s', 'capture_peer_cert' => true ]; @@ -51,10 +64,18 @@ $cert = stream_context_get_options($ctx)['ssl']['peer_certificate']; var_dump(openssl_x509_parse($cert)['subject']['CN']); CODE; +$clientCode = sprintf($clientCode, $caFile); include 'ServerClientTestCase.inc'; ServerClientTestCase::getInstance()->run($clientCode, $serverCode); ?> +--CLEAN-- + --EXPECTF-- string(%d) "cs.php.net" string(%d) "uk.php.net" diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server_cs.pem php8.4-8.4.21/ext/openssl/tests/sni_server_cs.pem --- php8.4-8.4.16/ext/openssl/tests/sni_server_cs.pem 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server_cs.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpQIBAAKCAQEAvy5NhzktzEdsHTbGB6vqYANms5rn1zXFmTJrGlWCwoIsNmTf -ahvZkrC1cCXTZ7fbPB8XQbpAtz2ZSU7OcwBW9B8okYUPo9zi/ptwcrgsQsN0hrcD -8MBRUccevwime5fLvg8E9RJ/68y9y3BnRcVWYO2sAK9juTfidNjETU3Bb05oXv8D -SD/6onXQu4uXDgsQ3cRXeld9UB0xazmQXyyiIqXc/cpTAnaEVYzn28aj7NlUbzNq -511UXMXY44x9EcXWpPVZ7heNcJNzY5DCNzmtXKrt9yiMpWQcPXEzsESVxAMqib9u -TFOlvVX17LIPxBG656PjTD9J1h6kBbMCUxzs7wIDAQABAoIBAQC85lBeY0X4ST3v -I7bJz7kWQ2YP4uhfAdeLhoDDFWjNLffniwYhfwEc6xNri0R2f/jUT9gX7qORKwEx -qPdeNCC2t67LElGg1FlJv2Z9Q7MgCKYzkdQH5s6y4e9kTHTLO/JpiceZKz1QTQ3f -XOH9032E6nIAf0wmr6xHTgOwajrN8VI5BuPEMVmEwIw3AtYeqVuPCNKyGR4HUVkC -2bAydnGngbRJRnNzmKcWJancxpHDGBSFqPyuXMFC7Jgo3ZmyCbGp99vuXVk/sW9x -5aj94M9nRE0guk05ivH2/JZao2uLYkIgjFWlhNxKdWgWRk8DEuN4djC8mKS9YH1q -crYRToMhAoGBAOspUTtKP54mpZmyhxuDqj02JaJRzNTskPHsiF1UhtXuw7uT+ryV -ekUFLNXoFmn9mbx1WVaUvGH4qjilvQOxz7u++lz0ApqJEfyM3jc/cC40Y5zcuGSu -Etbg+SyDoytlgMCIydJyrS7NNALSo5p5oG6XY2f8yd/DCAmo8LzypaHRAoGBANAf -R1SlBMc/bOsi6GrJxcBVSCFMiKYiO5woL5aUKa9yM+UQuQ/6xbQ7Q+sOlt0FH3xo -AJ2L60qTdjyXVtjOdtXs5ZC4l+C6AfnCx6yLr+fNc4SOYXEfqS4LZylgwKd9KyVB -asspIW9Idbgebmi6vPyt9LDkIp0h1VuFGjkvQJK/AoGBAI4pbS0dprXyARyYW6sb -fpgAmuG099IkrT9DUfCx/81myTclr2fAKal+BmvOIXaz0/OlMXvw8K19iVIzh7+r -B70lJ+93p/dKM/BsLI5TsHqOO0YB/QsIXOVAHgJ2FfdPJnW+e9vYba+kZ/Po6PSi -4ITaykJ8BIJcQgis89QWEGFxAoGBAJhQO+jzuDKF9ZWEf6ofrw0anOZZ16wWY5/e -PS2rk3JmVxpuibHrKqPDt+ogTELHDAsFJmYmz3VNxHuFmrajK49Wh4/JuMVr/CQo -6+8YcA1qa/94IFIlBLDBAafjujsZvOjQHnM+z8xcsGKmStF00Pjv6qNG4xoyd646 -FD4DmfOLAoGAWXehpopZKXE9gRAni881ucK6WqxPPBoofbozi09D0MmfarIVaSkv -jNVVHBfLWd7IEXTjiipPBeUqq6Jc3pscN1Vp4rrl8jTmVTdazEv0LuzpdUFqmNo2 -M+xw17uz9D9Q32/aW1Lar0PdIaL/wGEDEyzEBFwrGppcENLilPz8gzU= ------END RSA PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIIFIjCCAwqgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwVTELMAkGA1UEBhMCR0Ix -EDAOBgNVBAgMB0VuZ2xhbmQxEDAOBgNVBAoMB1BIUC5uZXQxEDAOBgNVBAsMB29w -ZW5zc2wxEDAOBgNVBAMMB3BocC5uZXQwHhcNMTgwMTE0MTgzNjEyWhcNMjYwNDAy -MTgzNjEyWjBGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UE -CgwHUEhQLm5ldDETMBEGA1UEAwwKY3MucGhwLm5ldDCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAL8uTYc5LcxHbB02xger6mADZrOa59c1xZkyaxpVgsKC -LDZk32ob2ZKwtXAl02e32zwfF0G6QLc9mUlOznMAVvQfKJGFD6Pc4v6bcHK4LELD -dIa3A/DAUVHHHr8IpnuXy74PBPUSf+vMvctwZ0XFVmDtrACvY7k34nTYxE1NwW9O -aF7/A0g/+qJ10LuLlw4LEN3EV3pXfVAdMWs5kF8soiKl3P3KUwJ2hFWM59vGo+zZ -VG8zauddVFzF2OOMfRHF1qT1We4XjXCTc2OQwjc5rVyq7fcojKVkHD1xM7BElcQD -Kom/bkxTpb1V9eyyD8QRuuej40w/SdYepAWzAlMc7O8CAwEAAaOCAQkwggEFMAkG -A1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMGCWCGSAGG+EIBDQQmFiRPcGVu -U1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFHPfd8dK -Lz1R0Ck4WV1B9AWXd5DSMGwGA1UdIwRlMGOAFOPK44Eacedv7HbR2Igcbew+4kUa -oUekRTBDMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UECgwH -UEhQLm5ldDEQMA4GA1UEAwwHcGhwLm5ldIICEAAwDgYDVR0PAQH/BAQDAgWgMBMG -A1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4ICAQB6WSIHEyDXLZxH -hZjqSNQOA7Wc9Z2FCAiD29xYkGTL8WuPVGGP1mu4B92ytj+PMWwqSReDa7eTGLE7 -O7ozw9l+c+gNmHFNikSsGjlV2E8CToQOFMny+jAQYMSXf8UbTp9xDfgG02t/71hv -SLWqdeHMLcR0xi0nBQH0vDOkwUbuWYqFa3jejHieGhykHM6CkIk6lqnyOEO+ooIF -ZsLprrg1ss/mXCPI6niP0hze55ERKdxI7Rk8sZ4pVkf2SUWqZrUS0aJ+Ymmwi6Xd -2V7izq5N30PkJS8MtqII4FAjRBIkwPh0sy8PmW/DzkYU+lYQnDfYLKDFKcj8xJK/ -o8oZUBsQltrSj0KlM9QuqxCTCBCy1nXZ9WHOhq+jdLiTc1Oi60uEHcUMrLK8aYc4 -HqIvZS6C2iwMI0d1OP3VxmAbMQ9yqRi+FbLYavJ3H40jrU9SYqdxa0BrTaz8MJNE -6AEwgQDPChczSghvHME+Fs4mtGCY3TesbNZKVahQRjaFIhMZIZ4RP4CRc0bJOBG+ -8Me4+KHNsD2ki5b03wAN6C1P2QrMzI+gH9fXLZYp761ciDAsX6YIzrhHHYLxYpJH -BkQKKs8dCQWE5IzgVrdlvC3Z1/l9om66wHqqx7nKnPfYs/Sfnwe9MpCD6xJrXiTm -WS7NM6fbQpO9APNr7o0ZOjbbWFzlNw== ------END CERTIFICATE----- diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server_cs_cert.pem php8.4-8.4.21/ext/openssl/tests/sni_server_cs_cert.pem --- php8.4-8.4.16/ext/openssl/tests/sni_server_cs_cert.pem 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server_cs_cert.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFIjCCAwqgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwVTELMAkGA1UEBhMCR0Ix -EDAOBgNVBAgMB0VuZ2xhbmQxEDAOBgNVBAoMB1BIUC5uZXQxEDAOBgNVBAsMB29w -ZW5zc2wxEDAOBgNVBAMMB3BocC5uZXQwHhcNMTgwMTE0MTgzNjEyWhcNMjYwNDAy -MTgzNjEyWjBGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UE -CgwHUEhQLm5ldDETMBEGA1UEAwwKY3MucGhwLm5ldDCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAL8uTYc5LcxHbB02xger6mADZrOa59c1xZkyaxpVgsKC -LDZk32ob2ZKwtXAl02e32zwfF0G6QLc9mUlOznMAVvQfKJGFD6Pc4v6bcHK4LELD -dIa3A/DAUVHHHr8IpnuXy74PBPUSf+vMvctwZ0XFVmDtrACvY7k34nTYxE1NwW9O -aF7/A0g/+qJ10LuLlw4LEN3EV3pXfVAdMWs5kF8soiKl3P3KUwJ2hFWM59vGo+zZ -VG8zauddVFzF2OOMfRHF1qT1We4XjXCTc2OQwjc5rVyq7fcojKVkHD1xM7BElcQD -Kom/bkxTpb1V9eyyD8QRuuej40w/SdYepAWzAlMc7O8CAwEAAaOCAQkwggEFMAkG -A1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMGCWCGSAGG+EIBDQQmFiRPcGVu -U1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFHPfd8dK -Lz1R0Ck4WV1B9AWXd5DSMGwGA1UdIwRlMGOAFOPK44Eacedv7HbR2Igcbew+4kUa -oUekRTBDMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UECgwH -UEhQLm5ldDEQMA4GA1UEAwwHcGhwLm5ldIICEAAwDgYDVR0PAQH/BAQDAgWgMBMG -A1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4ICAQB6WSIHEyDXLZxH -hZjqSNQOA7Wc9Z2FCAiD29xYkGTL8WuPVGGP1mu4B92ytj+PMWwqSReDa7eTGLE7 -O7ozw9l+c+gNmHFNikSsGjlV2E8CToQOFMny+jAQYMSXf8UbTp9xDfgG02t/71hv -SLWqdeHMLcR0xi0nBQH0vDOkwUbuWYqFa3jejHieGhykHM6CkIk6lqnyOEO+ooIF -ZsLprrg1ss/mXCPI6niP0hze55ERKdxI7Rk8sZ4pVkf2SUWqZrUS0aJ+Ymmwi6Xd -2V7izq5N30PkJS8MtqII4FAjRBIkwPh0sy8PmW/DzkYU+lYQnDfYLKDFKcj8xJK/ -o8oZUBsQltrSj0KlM9QuqxCTCBCy1nXZ9WHOhq+jdLiTc1Oi60uEHcUMrLK8aYc4 -HqIvZS6C2iwMI0d1OP3VxmAbMQ9yqRi+FbLYavJ3H40jrU9SYqdxa0BrTaz8MJNE -6AEwgQDPChczSghvHME+Fs4mtGCY3TesbNZKVahQRjaFIhMZIZ4RP4CRc0bJOBG+ -8Me4+KHNsD2ki5b03wAN6C1P2QrMzI+gH9fXLZYp761ciDAsX6YIzrhHHYLxYpJH -BkQKKs8dCQWE5IzgVrdlvC3Z1/l9om66wHqqx7nKnPfYs/Sfnwe9MpCD6xJrXiTm -WS7NM6fbQpO9APNr7o0ZOjbbWFzlNw== ------END CERTIFICATE----- diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server_cs_expired.pem php8.4-8.4.21/ext/openssl/tests/sni_server_cs_expired.pem --- php8.4-8.4.16/ext/openssl/tests/sni_server_cs_expired.pem 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server_cs_expired.pem 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,57 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEAvy5NhzktzEdsHTbGB6vqYANms5rn1zXFmTJrGlWCwoIsNmTf +ahvZkrC1cCXTZ7fbPB8XQbpAtz2ZSU7OcwBW9B8okYUPo9zi/ptwcrgsQsN0hrcD +8MBRUccevwime5fLvg8E9RJ/68y9y3BnRcVWYO2sAK9juTfidNjETU3Bb05oXv8D +SD/6onXQu4uXDgsQ3cRXeld9UB0xazmQXyyiIqXc/cpTAnaEVYzn28aj7NlUbzNq +511UXMXY44x9EcXWpPVZ7heNcJNzY5DCNzmtXKrt9yiMpWQcPXEzsESVxAMqib9u +TFOlvVX17LIPxBG656PjTD9J1h6kBbMCUxzs7wIDAQABAoIBAQC85lBeY0X4ST3v +I7bJz7kWQ2YP4uhfAdeLhoDDFWjNLffniwYhfwEc6xNri0R2f/jUT9gX7qORKwEx +qPdeNCC2t67LElGg1FlJv2Z9Q7MgCKYzkdQH5s6y4e9kTHTLO/JpiceZKz1QTQ3f +XOH9032E6nIAf0wmr6xHTgOwajrN8VI5BuPEMVmEwIw3AtYeqVuPCNKyGR4HUVkC +2bAydnGngbRJRnNzmKcWJancxpHDGBSFqPyuXMFC7Jgo3ZmyCbGp99vuXVk/sW9x +5aj94M9nRE0guk05ivH2/JZao2uLYkIgjFWlhNxKdWgWRk8DEuN4djC8mKS9YH1q +crYRToMhAoGBAOspUTtKP54mpZmyhxuDqj02JaJRzNTskPHsiF1UhtXuw7uT+ryV +ekUFLNXoFmn9mbx1WVaUvGH4qjilvQOxz7u++lz0ApqJEfyM3jc/cC40Y5zcuGSu +Etbg+SyDoytlgMCIydJyrS7NNALSo5p5oG6XY2f8yd/DCAmo8LzypaHRAoGBANAf +R1SlBMc/bOsi6GrJxcBVSCFMiKYiO5woL5aUKa9yM+UQuQ/6xbQ7Q+sOlt0FH3xo +AJ2L60qTdjyXVtjOdtXs5ZC4l+C6AfnCx6yLr+fNc4SOYXEfqS4LZylgwKd9KyVB +asspIW9Idbgebmi6vPyt9LDkIp0h1VuFGjkvQJK/AoGBAI4pbS0dprXyARyYW6sb +fpgAmuG099IkrT9DUfCx/81myTclr2fAKal+BmvOIXaz0/OlMXvw8K19iVIzh7+r +B70lJ+93p/dKM/BsLI5TsHqOO0YB/QsIXOVAHgJ2FfdPJnW+e9vYba+kZ/Po6PSi +4ITaykJ8BIJcQgis89QWEGFxAoGBAJhQO+jzuDKF9ZWEf6ofrw0anOZZ16wWY5/e +PS2rk3JmVxpuibHrKqPDt+ogTELHDAsFJmYmz3VNxHuFmrajK49Wh4/JuMVr/CQo +6+8YcA1qa/94IFIlBLDBAafjujsZvOjQHnM+z8xcsGKmStF00Pjv6qNG4xoyd646 +FD4DmfOLAoGAWXehpopZKXE9gRAni881ucK6WqxPPBoofbozi09D0MmfarIVaSkv +jNVVHBfLWd7IEXTjiipPBeUqq6Jc3pscN1Vp4rrl8jTmVTdazEv0LuzpdUFqmNo2 +M+xw17uz9D9Q32/aW1Lar0PdIaL/wGEDEyzEBFwrGppcENLilPz8gzU= +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIFIjCCAwqgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwVTELMAkGA1UEBhMCR0Ix +EDAOBgNVBAgMB0VuZ2xhbmQxEDAOBgNVBAoMB1BIUC5uZXQxEDAOBgNVBAsMB29w +ZW5zc2wxEDAOBgNVBAMMB3BocC5uZXQwHhcNMTgwMTE0MTgzNjEyWhcNMjYwNDAy +MTgzNjEyWjBGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UE +CgwHUEhQLm5ldDETMBEGA1UEAwwKY3MucGhwLm5ldDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAL8uTYc5LcxHbB02xger6mADZrOa59c1xZkyaxpVgsKC +LDZk32ob2ZKwtXAl02e32zwfF0G6QLc9mUlOznMAVvQfKJGFD6Pc4v6bcHK4LELD +dIa3A/DAUVHHHr8IpnuXy74PBPUSf+vMvctwZ0XFVmDtrACvY7k34nTYxE1NwW9O +aF7/A0g/+qJ10LuLlw4LEN3EV3pXfVAdMWs5kF8soiKl3P3KUwJ2hFWM59vGo+zZ +VG8zauddVFzF2OOMfRHF1qT1We4XjXCTc2OQwjc5rVyq7fcojKVkHD1xM7BElcQD +Kom/bkxTpb1V9eyyD8QRuuej40w/SdYepAWzAlMc7O8CAwEAAaOCAQkwggEFMAkG +A1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMGCWCGSAGG+EIBDQQmFiRPcGVu +U1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFHPfd8dK +Lz1R0Ck4WV1B9AWXd5DSMGwGA1UdIwRlMGOAFOPK44Eacedv7HbR2Igcbew+4kUa +oUekRTBDMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UECgwH +UEhQLm5ldDEQMA4GA1UEAwwHcGhwLm5ldIICEAAwDgYDVR0PAQH/BAQDAgWgMBMG +A1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4ICAQB6WSIHEyDXLZxH +hZjqSNQOA7Wc9Z2FCAiD29xYkGTL8WuPVGGP1mu4B92ytj+PMWwqSReDa7eTGLE7 +O7ozw9l+c+gNmHFNikSsGjlV2E8CToQOFMny+jAQYMSXf8UbTp9xDfgG02t/71hv +SLWqdeHMLcR0xi0nBQH0vDOkwUbuWYqFa3jejHieGhykHM6CkIk6lqnyOEO+ooIF +ZsLprrg1ss/mXCPI6niP0hze55ERKdxI7Rk8sZ4pVkf2SUWqZrUS0aJ+Ymmwi6Xd +2V7izq5N30PkJS8MtqII4FAjRBIkwPh0sy8PmW/DzkYU+lYQnDfYLKDFKcj8xJK/ +o8oZUBsQltrSj0KlM9QuqxCTCBCy1nXZ9WHOhq+jdLiTc1Oi60uEHcUMrLK8aYc4 +HqIvZS6C2iwMI0d1OP3VxmAbMQ9yqRi+FbLYavJ3H40jrU9SYqdxa0BrTaz8MJNE +6AEwgQDPChczSghvHME+Fs4mtGCY3TesbNZKVahQRjaFIhMZIZ4RP4CRc0bJOBG+ +8Me4+KHNsD2ki5b03wAN6C1P2QrMzI+gH9fXLZYp761ciDAsX6YIzrhHHYLxYpJH +BkQKKs8dCQWE5IzgVrdlvC3Z1/l9om66wHqqx7nKnPfYs/Sfnwe9MpCD6xJrXiTm +WS7NM6fbQpO9APNr7o0ZOjbbWFzlNw== +-----END CERTIFICATE----- diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server_cs_key.pem php8.4-8.4.21/ext/openssl/tests/sni_server_cs_key.pem --- php8.4-8.4.16/ext/openssl/tests/sni_server_cs_key.pem 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server_cs_key.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpQIBAAKCAQEAvy5NhzktzEdsHTbGB6vqYANms5rn1zXFmTJrGlWCwoIsNmTf -ahvZkrC1cCXTZ7fbPB8XQbpAtz2ZSU7OcwBW9B8okYUPo9zi/ptwcrgsQsN0hrcD -8MBRUccevwime5fLvg8E9RJ/68y9y3BnRcVWYO2sAK9juTfidNjETU3Bb05oXv8D -SD/6onXQu4uXDgsQ3cRXeld9UB0xazmQXyyiIqXc/cpTAnaEVYzn28aj7NlUbzNq -511UXMXY44x9EcXWpPVZ7heNcJNzY5DCNzmtXKrt9yiMpWQcPXEzsESVxAMqib9u -TFOlvVX17LIPxBG656PjTD9J1h6kBbMCUxzs7wIDAQABAoIBAQC85lBeY0X4ST3v -I7bJz7kWQ2YP4uhfAdeLhoDDFWjNLffniwYhfwEc6xNri0R2f/jUT9gX7qORKwEx -qPdeNCC2t67LElGg1FlJv2Z9Q7MgCKYzkdQH5s6y4e9kTHTLO/JpiceZKz1QTQ3f -XOH9032E6nIAf0wmr6xHTgOwajrN8VI5BuPEMVmEwIw3AtYeqVuPCNKyGR4HUVkC -2bAydnGngbRJRnNzmKcWJancxpHDGBSFqPyuXMFC7Jgo3ZmyCbGp99vuXVk/sW9x -5aj94M9nRE0guk05ivH2/JZao2uLYkIgjFWlhNxKdWgWRk8DEuN4djC8mKS9YH1q -crYRToMhAoGBAOspUTtKP54mpZmyhxuDqj02JaJRzNTskPHsiF1UhtXuw7uT+ryV -ekUFLNXoFmn9mbx1WVaUvGH4qjilvQOxz7u++lz0ApqJEfyM3jc/cC40Y5zcuGSu -Etbg+SyDoytlgMCIydJyrS7NNALSo5p5oG6XY2f8yd/DCAmo8LzypaHRAoGBANAf -R1SlBMc/bOsi6GrJxcBVSCFMiKYiO5woL5aUKa9yM+UQuQ/6xbQ7Q+sOlt0FH3xo -AJ2L60qTdjyXVtjOdtXs5ZC4l+C6AfnCx6yLr+fNc4SOYXEfqS4LZylgwKd9KyVB -asspIW9Idbgebmi6vPyt9LDkIp0h1VuFGjkvQJK/AoGBAI4pbS0dprXyARyYW6sb -fpgAmuG099IkrT9DUfCx/81myTclr2fAKal+BmvOIXaz0/OlMXvw8K19iVIzh7+r -B70lJ+93p/dKM/BsLI5TsHqOO0YB/QsIXOVAHgJ2FfdPJnW+e9vYba+kZ/Po6PSi -4ITaykJ8BIJcQgis89QWEGFxAoGBAJhQO+jzuDKF9ZWEf6ofrw0anOZZ16wWY5/e -PS2rk3JmVxpuibHrKqPDt+ogTELHDAsFJmYmz3VNxHuFmrajK49Wh4/JuMVr/CQo -6+8YcA1qa/94IFIlBLDBAafjujsZvOjQHnM+z8xcsGKmStF00Pjv6qNG4xoyd646 -FD4DmfOLAoGAWXehpopZKXE9gRAni881ucK6WqxPPBoofbozi09D0MmfarIVaSkv -jNVVHBfLWd7IEXTjiipPBeUqq6Jc3pscN1Vp4rrl8jTmVTdazEv0LuzpdUFqmNo2 -M+xw17uz9D9Q32/aW1Lar0PdIaL/wGEDEyzEBFwrGppcENLilPz8gzU= ------END RSA PRIVATE KEY----- diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server_key_cert.phpt php8.4-8.4.21/ext/openssl/tests/sni_server_key_cert.phpt --- php8.4-8.4.16/ext/openssl/tests/sni_server_key_cert.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server_key_cert.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -8,21 +8,36 @@ ?> --FILE-- saveCaCert($caFile); +$certificateGenerator->saveNewCertAndKey('cs.php.net', $csCertFile, $csKeyFile); +$certificateGenerator->saveNewCertAndKey('uk.php.net', $ukCertFile, $ukKeyFile); +$certificateGenerator->saveNewCertAndKey('us.php.net', $usCertFile, $usKeyFile); + $serverCode = <<<'CODE' $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; $ctx = stream_context_create(['ssl' => [ 'SNI_server_certs' => [ "cs.php.net" => [ - 'local_cert' => __DIR__ . "/sni_server_cs_cert.pem", - 'local_pk' => __DIR__ . "/sni_server_cs_key.pem" + 'local_cert' => '%s', + 'local_pk' => '%s', ], "uk.php.net" => [ - 'local_cert' => __DIR__ . "/sni_server_uk_cert.pem", - 'local_pk' => __DIR__ . "/sni_server_uk_key.pem" + 'local_cert' => '%s', + 'local_pk' => '%s', ], "us.php.net" => [ - 'local_cert' => __DIR__ . "/sni_server_us_cert.pem", - 'local_pk' => __DIR__ . "/sni_server_us_key.pem" + 'local_cert' => '%s', + 'local_pk' => '%s', ], ] ]]); @@ -34,11 +49,16 @@ @stream_socket_accept($server, 3); } CODE; +$serverCode = sprintf($serverCode, + $csCertFile, $csKeyFile, + $ukCertFile, $ukKeyFile, + $usCertFile, $usKeyFile +); $clientCode = <<<'CODE' $flags = STREAM_CLIENT_CONNECT; $ctxArr = [ - 'cafile' => __DIR__ . '/sni_server_ca.pem', + 'cafile' => '%s', 'capture_peer_cert' => true ]; @@ -60,10 +80,21 @@ $cert = stream_context_get_options($ctx)['ssl']['peer_certificate']; var_dump(openssl_x509_parse($cert)['subject']['CN']); CODE; +$clientCode = sprintf($clientCode, $caFile); include 'ServerClientTestCase.inc'; ServerClientTestCase::getInstance()->run($clientCode, $serverCode); ?> +--CLEAN-- + --EXPECTF-- string(%d) "cs.php.net" string(%d) "uk.php.net" diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server_uk.pem php8.4-8.4.21/ext/openssl/tests/sni_server_uk.pem --- php8.4-8.4.16/ext/openssl/tests/sni_server_uk.pem 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server_uk.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEArMpFePSNUHNHCiUWfsSPQxHaQTpDfogEISIMuGq5JhEuHWyl -HRe51JWZGi39a/PY9rAClfg/qqPnuxwFDoovhQsq9Kd0JnsXW11CMSqiBimf8vyg -GE/V2DIOiex7Ab8+5zEL7cCrNyXfDk+DuoT7Np3jaSE/u31OMUAzFz4/EL7Zqzlk -IMkHB/GSwLIJB8VbHt4Hunf28bLreTcjO/5QpNkSFtJ1PvbWRv3WheR5ykQQWGKF -9VgwYwS0Lu7YktLF2RGFZhIypUK8jazJiwsBRQ0faSCpAXTSPYh12GDegwAiKqGk -L+fayUdWGnnpYTVOysYL8mCoi9Ar0BPgtHEVvwIDAQABAoIBAGpg7XyWMxpAno/k -XYEWSo0kRJa75CnWW5R6fhJbwjlpglajONQ8czAqGeRARDFeI0lc+3qRJ8FKv7Q2 -f/Z/pNnoEj4liiDWz350X/gdIztgDRVv6rCNFj7QMps/eEuPDo8PZySs5bxCGJ2a -3qLKlE7/za4/xhkMAEPaHppEvFb15dpomqP2Fjqei9afp8tD+xJv9BGtkFIy9acw -94AWQi974kgW7ZzfEf8RqHM0ExKiESCc26knbcBu0tQ892YHggMccUMk/UrVgR5d -vuGOBurlYGLBstSDSKCCe6la4N/FX3FiC3WhVNescnuTZPXcX3zebh7roGjgrTdd -6UJYBIECgYEA09XYihdwW66G9Y09OatzlzBh1Rvzjv2Vl5NmWHHb6vh38H4PcOof -S1pT0JvRzpt8uEs4i+Eda5PyQyp4iGtD+DQ07Dxh2jiixsE3PRFRG2wg2QCgDHnS -6vgV1VOqA/A4on4nhxLZXxhX4YvHaJYlm1bZ+amG+j5XiI/NtHJm9k8CgYEA0NB9 -bAoaZnc06+T8rMaO45boX5SvYsCZbtY3VRl75SrbMal0IKfnXHELVHuei12LmlMs -LuFgG8jGO3+ncxUqMytoGvrmk/cM9tCNbDKVHtFbqz0qt9lkDAwLsBougKnVsNDW -Aae/tz/wYXJct86unfLh0xtvkx5Iz1we4cS1fZECgYA8YR+vfK7R8xUUuIVTAsOX -vHqmO6lYgH87DRCG9S0x9FB7g/LyxEjXOY/aTg+nTDpobUhY1nmESE8tRdXFTI27 -GWZcT3m0sZ/z9u6/wUfVAST7tWnpJHAx+TR/8bDsHnSGHF836O98Y3vpFeZosSNW -+5J1zxRiD5LzocmIPXOLkQKBgEgHApxXx898YwbTj8zRGMysay89DFpV8RboUWHL -To83/y/cMbBp+kZKwAu+MGwGMndjJSRunUY4NRik6c+qh0nrORfFX+++Efy4529g -60scEDC7Apc0J2x4Yze1cED1VD6PaqJbiKffKD2UwyKr6lOVSgwVtKDcm2Tbc9OQ -lMHhAoGBAIPwYVxzWM6I6pr8x2TucpBZZReLytz7uzybMNvbKCrwlETbNNXubnfp -nPuPKzpeRI0y26pIIAbijzFW0MXq+kIu3H7we8TaImsJ1AaQCTYeoLWBVcr6RISk -3d4i7iT35aWCuhPVve0FNIv/u3jrqX2H2C2MXMiLOsw1GFxPvpi4 ------END RSA PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIIFIjCCAwqgAwIBAgICEAMwDQYJKoZIhvcNAQELBQAwVTELMAkGA1UEBhMCR0Ix -EDAOBgNVBAgMB0VuZ2xhbmQxEDAOBgNVBAoMB1BIUC5uZXQxEDAOBgNVBAsMB29w -ZW5zc2wxEDAOBgNVBAMMB3BocC5uZXQwHhcNMTgwMTE0MTgzNjMyWhcNMjYwNDAy -MTgzNjMyWjBGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UE -CgwHUEhQLm5ldDETMBEGA1UEAwwKdWsucGhwLm5ldDCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKzKRXj0jVBzRwolFn7Ej0MR2kE6Q36IBCEiDLhquSYR -Lh1spR0XudSVmRot/Wvz2PawApX4P6qj57scBQ6KL4ULKvSndCZ7F1tdQjEqogYp -n/L8oBhP1dgyDonsewG/PucxC+3Aqzcl3w5Pg7qE+zad42khP7t9TjFAMxc+PxC+ -2as5ZCDJBwfxksCyCQfFWx7eB7p39vGy63k3Izv+UKTZEhbSdT721kb91oXkecpE -EFhihfVYMGMEtC7u2JLSxdkRhWYSMqVCvI2syYsLAUUNH2kgqQF00j2Iddhg3oMA -IiqhpC/n2slHVhp56WE1TsrGC/JgqIvQK9AT4LRxFb8CAwEAAaOCAQkwggEFMAkG -A1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMGCWCGSAGG+EIBDQQmFiRPcGVu -U1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFJK58uJe -Lv8WDOR8TTLUcSxO1zCyMGwGA1UdIwRlMGOAFOPK44Eacedv7HbR2Igcbew+4kUa -oUekRTBDMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UECgwH -UEhQLm5ldDEQMA4GA1UEAwwHcGhwLm5ldIICEAAwDgYDVR0PAQH/BAQDAgWgMBMG -A1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4ICAQDHayU795hFnQNj -fuYV21sEmkSjgtp6X4rV9JfoCp8U2gieL4mizoCPx9Q8HYaAf98hPYTofGUaCSd+ -Xlzd8lhLt9GCU+BsCxGtJocrjOQDhyhkioN8iirQRTtJpRVC6a4RCBGpenOD7Z7C -Z32uGXohzFuigP/J8/SXBdHrlpNSa03iEkkisPR46mbGj06lFVOFHJDNKA3CnQwM -3VfqvZt0ksZi/gAOol8dtrAd3k5JBfJ2BtqsPbycEGAhsGrTK/MeqiFcO8QZiXpN -qf0wZzOMFZJ4HqTiHs4TMMQaDK8c4qfR0l1OE224ijcB5NlqMjGAZabMfHgNZcl7 -fYPX+POsOMaqubv98uoC0PCK8NCTyfB4V/el72EEoVfwKYOxm3eYXBEE2ZNyIci6 -YKYhNa9e2k+cFueYMztV06HTGgkcHcSJATP+3ISTRx3tj1BPmc4O4WAMEMx1E0gg -PaVrBVAylGzt8kaMaOQMBImpsALSfutq6+KtQiu0OTGS3yVUGamV4AyRjuwF1/ZA -kZbjmNEGsf9d2rzS89ckds24QUx0zrfJ56p7lRvyVK/pML7iadv8dUH3fKDDDerD -oocLjOjNxFGN9Woz+kfidA8Siu0zsfQ6CLPlaQrVAVQH4iMuCZraqMc3TqAiUKRj -iHKp6FFrRZmY8W8HEKHv98uGofn+3g== ------END CERTIFICATE----- diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server_uk_cert.pem php8.4-8.4.21/ext/openssl/tests/sni_server_uk_cert.pem --- php8.4-8.4.16/ext/openssl/tests/sni_server_uk_cert.pem 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server_uk_cert.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFIjCCAwqgAwIBAgICEAMwDQYJKoZIhvcNAQELBQAwVTELMAkGA1UEBhMCR0Ix -EDAOBgNVBAgMB0VuZ2xhbmQxEDAOBgNVBAoMB1BIUC5uZXQxEDAOBgNVBAsMB29w -ZW5zc2wxEDAOBgNVBAMMB3BocC5uZXQwHhcNMTgwMTE0MTgzNjMyWhcNMjYwNDAy -MTgzNjMyWjBGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UE -CgwHUEhQLm5ldDETMBEGA1UEAwwKdWsucGhwLm5ldDCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKzKRXj0jVBzRwolFn7Ej0MR2kE6Q36IBCEiDLhquSYR -Lh1spR0XudSVmRot/Wvz2PawApX4P6qj57scBQ6KL4ULKvSndCZ7F1tdQjEqogYp -n/L8oBhP1dgyDonsewG/PucxC+3Aqzcl3w5Pg7qE+zad42khP7t9TjFAMxc+PxC+ -2as5ZCDJBwfxksCyCQfFWx7eB7p39vGy63k3Izv+UKTZEhbSdT721kb91oXkecpE -EFhihfVYMGMEtC7u2JLSxdkRhWYSMqVCvI2syYsLAUUNH2kgqQF00j2Iddhg3oMA -IiqhpC/n2slHVhp56WE1TsrGC/JgqIvQK9AT4LRxFb8CAwEAAaOCAQkwggEFMAkG -A1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMGCWCGSAGG+EIBDQQmFiRPcGVu -U1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFJK58uJe -Lv8WDOR8TTLUcSxO1zCyMGwGA1UdIwRlMGOAFOPK44Eacedv7HbR2Igcbew+4kUa -oUekRTBDMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UECgwH -UEhQLm5ldDEQMA4GA1UEAwwHcGhwLm5ldIICEAAwDgYDVR0PAQH/BAQDAgWgMBMG -A1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4ICAQDHayU795hFnQNj -fuYV21sEmkSjgtp6X4rV9JfoCp8U2gieL4mizoCPx9Q8HYaAf98hPYTofGUaCSd+ -Xlzd8lhLt9GCU+BsCxGtJocrjOQDhyhkioN8iirQRTtJpRVC6a4RCBGpenOD7Z7C -Z32uGXohzFuigP/J8/SXBdHrlpNSa03iEkkisPR46mbGj06lFVOFHJDNKA3CnQwM -3VfqvZt0ksZi/gAOol8dtrAd3k5JBfJ2BtqsPbycEGAhsGrTK/MeqiFcO8QZiXpN -qf0wZzOMFZJ4HqTiHs4TMMQaDK8c4qfR0l1OE224ijcB5NlqMjGAZabMfHgNZcl7 -fYPX+POsOMaqubv98uoC0PCK8NCTyfB4V/el72EEoVfwKYOxm3eYXBEE2ZNyIci6 -YKYhNa9e2k+cFueYMztV06HTGgkcHcSJATP+3ISTRx3tj1BPmc4O4WAMEMx1E0gg -PaVrBVAylGzt8kaMaOQMBImpsALSfutq6+KtQiu0OTGS3yVUGamV4AyRjuwF1/ZA -kZbjmNEGsf9d2rzS89ckds24QUx0zrfJ56p7lRvyVK/pML7iadv8dUH3fKDDDerD -oocLjOjNxFGN9Woz+kfidA8Siu0zsfQ6CLPlaQrVAVQH4iMuCZraqMc3TqAiUKRj -iHKp6FFrRZmY8W8HEKHv98uGofn+3g== ------END CERTIFICATE----- diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server_uk_key.pem php8.4-8.4.21/ext/openssl/tests/sni_server_uk_key.pem --- php8.4-8.4.16/ext/openssl/tests/sni_server_uk_key.pem 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server_uk_key.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEArMpFePSNUHNHCiUWfsSPQxHaQTpDfogEISIMuGq5JhEuHWyl -HRe51JWZGi39a/PY9rAClfg/qqPnuxwFDoovhQsq9Kd0JnsXW11CMSqiBimf8vyg -GE/V2DIOiex7Ab8+5zEL7cCrNyXfDk+DuoT7Np3jaSE/u31OMUAzFz4/EL7Zqzlk -IMkHB/GSwLIJB8VbHt4Hunf28bLreTcjO/5QpNkSFtJ1PvbWRv3WheR5ykQQWGKF -9VgwYwS0Lu7YktLF2RGFZhIypUK8jazJiwsBRQ0faSCpAXTSPYh12GDegwAiKqGk -L+fayUdWGnnpYTVOysYL8mCoi9Ar0BPgtHEVvwIDAQABAoIBAGpg7XyWMxpAno/k -XYEWSo0kRJa75CnWW5R6fhJbwjlpglajONQ8czAqGeRARDFeI0lc+3qRJ8FKv7Q2 -f/Z/pNnoEj4liiDWz350X/gdIztgDRVv6rCNFj7QMps/eEuPDo8PZySs5bxCGJ2a -3qLKlE7/za4/xhkMAEPaHppEvFb15dpomqP2Fjqei9afp8tD+xJv9BGtkFIy9acw -94AWQi974kgW7ZzfEf8RqHM0ExKiESCc26knbcBu0tQ892YHggMccUMk/UrVgR5d -vuGOBurlYGLBstSDSKCCe6la4N/FX3FiC3WhVNescnuTZPXcX3zebh7roGjgrTdd -6UJYBIECgYEA09XYihdwW66G9Y09OatzlzBh1Rvzjv2Vl5NmWHHb6vh38H4PcOof -S1pT0JvRzpt8uEs4i+Eda5PyQyp4iGtD+DQ07Dxh2jiixsE3PRFRG2wg2QCgDHnS -6vgV1VOqA/A4on4nhxLZXxhX4YvHaJYlm1bZ+amG+j5XiI/NtHJm9k8CgYEA0NB9 -bAoaZnc06+T8rMaO45boX5SvYsCZbtY3VRl75SrbMal0IKfnXHELVHuei12LmlMs -LuFgG8jGO3+ncxUqMytoGvrmk/cM9tCNbDKVHtFbqz0qt9lkDAwLsBougKnVsNDW -Aae/tz/wYXJct86unfLh0xtvkx5Iz1we4cS1fZECgYA8YR+vfK7R8xUUuIVTAsOX -vHqmO6lYgH87DRCG9S0x9FB7g/LyxEjXOY/aTg+nTDpobUhY1nmESE8tRdXFTI27 -GWZcT3m0sZ/z9u6/wUfVAST7tWnpJHAx+TR/8bDsHnSGHF836O98Y3vpFeZosSNW -+5J1zxRiD5LzocmIPXOLkQKBgEgHApxXx898YwbTj8zRGMysay89DFpV8RboUWHL -To83/y/cMbBp+kZKwAu+MGwGMndjJSRunUY4NRik6c+qh0nrORfFX+++Efy4529g -60scEDC7Apc0J2x4Yze1cED1VD6PaqJbiKffKD2UwyKr6lOVSgwVtKDcm2Tbc9OQ -lMHhAoGBAIPwYVxzWM6I6pr8x2TucpBZZReLytz7uzybMNvbKCrwlETbNNXubnfp -nPuPKzpeRI0y26pIIAbijzFW0MXq+kIu3H7we8TaImsJ1AaQCTYeoLWBVcr6RISk -3d4i7iT35aWCuhPVve0FNIv/u3jrqX2H2C2MXMiLOsw1GFxPvpi4 ------END RSA PRIVATE KEY----- diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server_us.pem php8.4-8.4.21/ext/openssl/tests/sni_server_us.pem --- php8.4-8.4.16/ext/openssl/tests/sni_server_us.pem 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server_us.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpQIBAAKCAQEA1QkC3tiNYDY+ZxMmPbagYUbMpzuXo9mVBvYh86bYZaeB7bts -QCBK+6VD4D2LjR3RszpzmOzhJXjm8j0t+GeRS3OMIM75/BKAnixXicRSIb8zdIPz -JP992vvMq8p46/XftAfBhAMOaCqcD85zpyX4PhfC9733nOyN4yqx58O4UhVTKih6 -W9/ldp3uwSYAW+HyoINnHls/bFO8vv60K5VIhkxK30LHnC5PvByGfuHOgrscEThs -jW0ESqO0+9l88KhGdmLgzvbBlGxNziCMfn0LcFH6p2ITc3foD4LSzGEFtJ92OZi3 -buCOfbFsN7vWHTsEi89fRcCnWGtMwLUx0TCluQIDAQABAoIBAQCnsUQ1Lrl6trhA -Yu6DPbLZX+XQ7jPbonaQ2Ea5iOhmfIjmHdaEU+cyV1EqvseO+Z4MO0KraiuAV79T -h50cIEpa3kW7vbFCHz5nQ/hUVdlg/yT93rASu5rSOctOnz64Xv8Ms948kDtS+9eF -Cbo4JMdX+VRbt4mmWP8HhqAsFACPexEoWxJcIxwFcI24GTGzySjemNjQzbmcVhzM -a4k6n8DolCL1cRS54C5Aaf5g4+IFDgyydcgZXp1lnX3MnqivSNkejnPnY55NcmrH -X3ZWPlAi9GHOJE33uy8bGWnip7Tn4iTt6tJvjz/yP82TGACDg1B8XsKrqsuQLsoU -cNBVGcQBAoGBAPteCgNmuNOpo4SRA1UVRw1WgnE8YtnNA6vYyVcTLSpqabq33UaD -03L9CQsbHtj88U+E8OH24Iqj3U9x7QJfH8DVmWuBrlwez80JsKGnLdViHydjKcAz -H2Cbv+SiWeaWXkFCkN4Jf7k3q0Ew4SG2LOq5PVUy/NB4bilbJD2ExKpZAoGBANj2 -Hpwo35IQ4XfSSsGaCdn+8ajMcNUMMGZ6YkZqmVO4kogqobyrPL/2KE9ol/hlacw6 -U/6Digox5/wqruYfqyM8lqGOq2/0Xf7c4XfiOTS9Na4JN3OGzlyqPvcn2zdqhYFY -iHPu2RqpA+LhCHW9Zs8C1Bp/KAEPdRP6OabqVaphAoGACLrHVj7nBFLL3vq6RuYq -RYhPl2cld7LrAbjRpTiBRQvVCCsCgERrv36SJdSXSanfJ4fSZcaRHb97HBs0w/RR -wfypC1bBm2lmhhRkEfkgWlzCADgtZwNff5dpHqOUw7FNLK8HIO7rhJ8uT2FHMEiH -Xs94FdFjfknwaXdE1u4ZdmECgYEAgxfbkQHFbO2UPqErGGXp0/WOsS6ucpyF1jXW -kbOxZ3vb1jjkNyrEbzzeSHTrdmRYk9UekWeLjfNvt9dWjKfP8V+XqJCbF+9wqCFw -fs6LQEmfWMQq5DwtDqKznwVPGOHdPzVuZZaJSemb9oeAZBwINccAv+3bDyD23hZQ -pYFsN6ECgYEA33QYDNG/spki4D8rlxyxZ+1MdB/efnrGBhO8FsJpG5+AtmYhWgD9 -sl29+3aiRkmDznoy36z+hoeZePILEAKMcbHyXOymixOHPuaZJ95hbvq6sqd6WMAe -w5tHnxlfEuu11zatolk6WiAmTmG3sZpN5Tqloq0Ye4dvlhVKNV3Bn3E= ------END RSA PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIIFIjCCAwqgAwIBAgICEAQwDQYJKoZIhvcNAQELBQAwVTELMAkGA1UEBhMCR0Ix -EDAOBgNVBAgMB0VuZ2xhbmQxEDAOBgNVBAoMB1BIUC5uZXQxEDAOBgNVBAsMB29w -ZW5zc2wxEDAOBgNVBAMMB3BocC5uZXQwHhcNMTgwMTE0MTgzNjQ0WhcNMjYwNDAy -MTgzNjQ0WjBGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UE -CgwHUEhQLm5ldDETMBEGA1UEAwwKdXMucGhwLm5ldDCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANUJAt7YjWA2PmcTJj22oGFGzKc7l6PZlQb2IfOm2GWn -ge27bEAgSvulQ+A9i40d0bM6c5js4SV45vI9LfhnkUtzjCDO+fwSgJ4sV4nEUiG/ -M3SD8yT/fdr7zKvKeOv137QHwYQDDmgqnA/Oc6cl+D4Xwve995zsjeMqsefDuFIV -Uyooelvf5Xad7sEmAFvh8qCDZx5bP2xTvL7+tCuVSIZMSt9Cx5wuT7wchn7hzoK7 -HBE4bI1tBEqjtPvZfPCoRnZi4M72wZRsTc4gjH59C3BR+qdiE3N36A+C0sxhBbSf -djmYt27gjn2xbDe71h07BIvPX0XAp1hrTMC1MdEwpbkCAwEAAaOCAQkwggEFMAkG -A1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMGCWCGSAGG+EIBDQQmFiRPcGVu -U1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFOXnUeNs -grKQb+EvG36DXjjDDmsFMGwGA1UdIwRlMGOAFOPK44Eacedv7HbR2Igcbew+4kUa -oUekRTBDMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UECgwH -UEhQLm5ldDEQMA4GA1UEAwwHcGhwLm5ldIICEAAwDgYDVR0PAQH/BAQDAgWgMBMG -A1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4ICAQBDLwuLbx75ACSU -5cF2L/D17JEnhlna62MgKNdpNLJSpaofK2Lk2BqsmnQf5JdkrXWMUN/DsmXZc9pq -25XmprfABUP9Cx18KPVqLQ43Z9o+R9xI1Ospt5mrpxGp6l2BHSs/4G69nuPFpcIJ -iabnLYdUk2Z+64lPe4EMBrZH+pj4xn3JA59BACJYNYn0nLaw45DIAyzyLJ0vVSwc -0JtjsztXQov4UqdWXxLRFfe2nEGoK8ZkTJ8ELcCYu6sNSBjw9Ech78uXN1BQOBTK -lhAgN3FKqOp3hqf0umqf35gDvmWwLB/eptUYZ96gBYT0tbPA0P+YsW+iZmamxXma -Odgg8iRcPxKl9bVPt57NLaDy/RQhOxTGXQs1Q2jp7UhzqoZDClwVSDxd6DEppAFA -OZAY+Rsrm7VoCwVQ/1KbcJHmJ/79tArvaWJk3KHLGMpdZq4KwrC3hM8/QxYtyX/6 -cfnXvShBYCdfTGgNlj3t/mNAgp1ZB3s9ClGqRBR/P0Db+ryv5DuxYM6nzEB3Od0y -kT5tHbXDQY+1HCExjOMi7Al0cmC2r3+oxDA4UjGv+npgcfeoxQhXmm/SQRiPdKlb -vT0D594sLoB23jqA9bMehpxEyI7eGjfFUmXwMeu0tJhipvpJI3ogJoM+SCFTyLkc -12cPiz/sR/ALhvhUJXTeUH8wxPjzbA== ------END CERTIFICATE----- diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server_us_cert.pem php8.4-8.4.21/ext/openssl/tests/sni_server_us_cert.pem --- php8.4-8.4.16/ext/openssl/tests/sni_server_us_cert.pem 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server_us_cert.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFIjCCAwqgAwIBAgICEAQwDQYJKoZIhvcNAQELBQAwVTELMAkGA1UEBhMCR0Ix -EDAOBgNVBAgMB0VuZ2xhbmQxEDAOBgNVBAoMB1BIUC5uZXQxEDAOBgNVBAsMB29w -ZW5zc2wxEDAOBgNVBAMMB3BocC5uZXQwHhcNMTgwMTE0MTgzNjQ0WhcNMjYwNDAy -MTgzNjQ0WjBGMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UE -CgwHUEhQLm5ldDETMBEGA1UEAwwKdXMucGhwLm5ldDCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANUJAt7YjWA2PmcTJj22oGFGzKc7l6PZlQb2IfOm2GWn -ge27bEAgSvulQ+A9i40d0bM6c5js4SV45vI9LfhnkUtzjCDO+fwSgJ4sV4nEUiG/ -M3SD8yT/fdr7zKvKeOv137QHwYQDDmgqnA/Oc6cl+D4Xwve995zsjeMqsefDuFIV -Uyooelvf5Xad7sEmAFvh8qCDZx5bP2xTvL7+tCuVSIZMSt9Cx5wuT7wchn7hzoK7 -HBE4bI1tBEqjtPvZfPCoRnZi4M72wZRsTc4gjH59C3BR+qdiE3N36A+C0sxhBbSf -djmYt27gjn2xbDe71h07BIvPX0XAp1hrTMC1MdEwpbkCAwEAAaOCAQkwggEFMAkG -A1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMDMGCWCGSAGG+EIBDQQmFiRPcGVu -U1NMIEdlbmVyYXRlZCBTZXJ2ZXIgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFOXnUeNs -grKQb+EvG36DXjjDDmsFMGwGA1UdIwRlMGOAFOPK44Eacedv7HbR2Igcbew+4kUa -oUekRTBDMQswCQYDVQQGEwJHQjEQMA4GA1UECAwHRW5nbGFuZDEQMA4GA1UECgwH -UEhQLm5ldDEQMA4GA1UEAwwHcGhwLm5ldIICEAAwDgYDVR0PAQH/BAQDAgWgMBMG -A1UdJQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBCwUAA4ICAQBDLwuLbx75ACSU -5cF2L/D17JEnhlna62MgKNdpNLJSpaofK2Lk2BqsmnQf5JdkrXWMUN/DsmXZc9pq -25XmprfABUP9Cx18KPVqLQ43Z9o+R9xI1Ospt5mrpxGp6l2BHSs/4G69nuPFpcIJ -iabnLYdUk2Z+64lPe4EMBrZH+pj4xn3JA59BACJYNYn0nLaw45DIAyzyLJ0vVSwc -0JtjsztXQov4UqdWXxLRFfe2nEGoK8ZkTJ8ELcCYu6sNSBjw9Ech78uXN1BQOBTK -lhAgN3FKqOp3hqf0umqf35gDvmWwLB/eptUYZ96gBYT0tbPA0P+YsW+iZmamxXma -Odgg8iRcPxKl9bVPt57NLaDy/RQhOxTGXQs1Q2jp7UhzqoZDClwVSDxd6DEppAFA -OZAY+Rsrm7VoCwVQ/1KbcJHmJ/79tArvaWJk3KHLGMpdZq4KwrC3hM8/QxYtyX/6 -cfnXvShBYCdfTGgNlj3t/mNAgp1ZB3s9ClGqRBR/P0Db+ryv5DuxYM6nzEB3Od0y -kT5tHbXDQY+1HCExjOMi7Al0cmC2r3+oxDA4UjGv+npgcfeoxQhXmm/SQRiPdKlb -vT0D594sLoB23jqA9bMehpxEyI7eGjfFUmXwMeu0tJhipvpJI3ogJoM+SCFTyLkc -12cPiz/sR/ALhvhUJXTeUH8wxPjzbA== ------END CERTIFICATE----- diff -Nru php8.4-8.4.16/ext/openssl/tests/sni_server_us_key.pem php8.4-8.4.21/ext/openssl/tests/sni_server_us_key.pem --- php8.4-8.4.16/ext/openssl/tests/sni_server_us_key.pem 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/tests/sni_server_us_key.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpQIBAAKCAQEA1QkC3tiNYDY+ZxMmPbagYUbMpzuXo9mVBvYh86bYZaeB7bts -QCBK+6VD4D2LjR3RszpzmOzhJXjm8j0t+GeRS3OMIM75/BKAnixXicRSIb8zdIPz -JP992vvMq8p46/XftAfBhAMOaCqcD85zpyX4PhfC9733nOyN4yqx58O4UhVTKih6 -W9/ldp3uwSYAW+HyoINnHls/bFO8vv60K5VIhkxK30LHnC5PvByGfuHOgrscEThs -jW0ESqO0+9l88KhGdmLgzvbBlGxNziCMfn0LcFH6p2ITc3foD4LSzGEFtJ92OZi3 -buCOfbFsN7vWHTsEi89fRcCnWGtMwLUx0TCluQIDAQABAoIBAQCnsUQ1Lrl6trhA -Yu6DPbLZX+XQ7jPbonaQ2Ea5iOhmfIjmHdaEU+cyV1EqvseO+Z4MO0KraiuAV79T -h50cIEpa3kW7vbFCHz5nQ/hUVdlg/yT93rASu5rSOctOnz64Xv8Ms948kDtS+9eF -Cbo4JMdX+VRbt4mmWP8HhqAsFACPexEoWxJcIxwFcI24GTGzySjemNjQzbmcVhzM -a4k6n8DolCL1cRS54C5Aaf5g4+IFDgyydcgZXp1lnX3MnqivSNkejnPnY55NcmrH -X3ZWPlAi9GHOJE33uy8bGWnip7Tn4iTt6tJvjz/yP82TGACDg1B8XsKrqsuQLsoU -cNBVGcQBAoGBAPteCgNmuNOpo4SRA1UVRw1WgnE8YtnNA6vYyVcTLSpqabq33UaD -03L9CQsbHtj88U+E8OH24Iqj3U9x7QJfH8DVmWuBrlwez80JsKGnLdViHydjKcAz -H2Cbv+SiWeaWXkFCkN4Jf7k3q0Ew4SG2LOq5PVUy/NB4bilbJD2ExKpZAoGBANj2 -Hpwo35IQ4XfSSsGaCdn+8ajMcNUMMGZ6YkZqmVO4kogqobyrPL/2KE9ol/hlacw6 -U/6Digox5/wqruYfqyM8lqGOq2/0Xf7c4XfiOTS9Na4JN3OGzlyqPvcn2zdqhYFY -iHPu2RqpA+LhCHW9Zs8C1Bp/KAEPdRP6OabqVaphAoGACLrHVj7nBFLL3vq6RuYq -RYhPl2cld7LrAbjRpTiBRQvVCCsCgERrv36SJdSXSanfJ4fSZcaRHb97HBs0w/RR -wfypC1bBm2lmhhRkEfkgWlzCADgtZwNff5dpHqOUw7FNLK8HIO7rhJ8uT2FHMEiH -Xs94FdFjfknwaXdE1u4ZdmECgYEAgxfbkQHFbO2UPqErGGXp0/WOsS6ucpyF1jXW -kbOxZ3vb1jjkNyrEbzzeSHTrdmRYk9UekWeLjfNvt9dWjKfP8V+XqJCbF+9wqCFw -fs6LQEmfWMQq5DwtDqKznwVPGOHdPzVuZZaJSemb9oeAZBwINccAv+3bDyD23hZQ -pYFsN6ECgYEA33QYDNG/spki4D8rlxyxZ+1MdB/efnrGBhO8FsJpG5+AtmYhWgD9 -sl29+3aiRkmDznoy36z+hoeZePILEAKMcbHyXOymixOHPuaZJ95hbvq6sqd6WMAe -w5tHnxlfEuu11zatolk6WiAmTmG3sZpN5Tqloq0Ye4dvlhVKNV3Bn3E= ------END RSA PRIVATE KEY----- diff -Nru php8.4-8.4.16/ext/openssl/xp_ssl.c php8.4-8.4.21/ext/openssl/xp_ssl.c --- php8.4-8.4.16/ext/openssl/xp_ssl.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/openssl/xp_ssl.c 2026-05-05 16:34:12.000000000 +0000 @@ -126,10 +126,6 @@ #define GET_VER_OPT_LONG(_name, _num) \ if (GET_VER_OPT(_name)) _num = zval_get_long(val) -/* Used for peer verification in windows */ -#define PHP_X509_NAME_ENTRY_TO_UTF8(ne, i, out) \ - ASN1_STRING_to_UTF8(&out, X509_NAME_ENTRY_get_data(X509_NAME_get_entry(ne, i))) - #ifdef HAVE_IPV6 /* Used for IPv6 Address peer verification */ #define EXPAND_IPV6_ADDRESS(_str, _bytes) \ @@ -417,7 +413,7 @@ static bool php_openssl_matches_wildcard_name(const char *subjectname, const char *certname) /* {{{ */ { - char *wildcard = NULL; + const char *wildcard = NULL; ptrdiff_t prefix_len; size_t suffix_len, subject_len; @@ -476,7 +472,10 @@ GENERAL_NAME *san = sk_GENERAL_NAME_value(alt_names, i); if (san->type == GEN_DNS) { - ASN1_STRING_to_UTF8(&cert_name, san->d.dNSName); + if (ASN1_STRING_to_UTF8(&cert_name, san->d.dNSName) < 0) { + /* TODO: warn ? */ + continue; + } if ((size_t)ASN1_STRING_length(san->d.dNSName) != strlen((const char*)cert_name)) { OPENSSL_free(cert_name); /* prevent null-byte poisoning*/ @@ -859,8 +858,9 @@ buffer_active = 0; if (cert && X509_STORE_add_cert(cert_store, cert)) { ++certs_added; - X509_free(cert); } + /* TODO: notify user when adding certificate failed? */ + X509_free(cert); goto cert_start; } @@ -1416,6 +1416,10 @@ /* The hello method is not inherited by SSL structs when assigning a new context * inside the SNI callback, so the just use SSLv23 */ SSL_CTX *ctx = SSL_CTX_new(SSLv23_server_method()); + if (!ctx) { + php_error_docref(NULL, E_WARNING, "Failed to create the SSL context"); + return NULL; + } if (SSL_CTX_use_certificate_chain_file(ctx, cert_path) != 1) { php_error_docref(NULL, E_WARNING, @@ -1448,7 +1452,7 @@ zend_ulong key_index; int i = 0; char resolved_path_buff[MAXPATHLEN]; - SSL_CTX *ctx; + SSL_CTX *ctx = NULL; /* If the stream ctx disables SNI we're finished here */ if (GET_VER_OPT("SNI_enabled") && !zend_is_true(val)) { @@ -1490,6 +1494,8 @@ return FAILURE; } + ZVAL_DEREF(current); + if (Z_TYPE_P(current) == IS_ARRAY) { zval *local_pk, *local_cert; zend_string *local_pk_str, *local_cert_str; @@ -1544,17 +1550,17 @@ zend_string_release(local_pk_str); ctx = php_openssl_create_sni_server_ctx(resolved_cert_path_buff, resolved_pk_path_buff); - - } else if (php_openssl_check_path_str_ex( - Z_STR_P(current), resolved_path_buff, 0, false, false, - "SNI_server_certs in ssl stream context")) { - ctx = php_openssl_create_sni_server_ctx(resolved_path_buff, resolved_path_buff); + } else if (Z_TYPE_P(current) == IS_STRING) { + if (php_openssl_check_path_str_ex(Z_STR_P(current), resolved_path_buff, 0, false, false, "SNI_server_certs in ssl stream context")) { + ctx = php_openssl_create_sni_server_ctx(resolved_path_buff, resolved_path_buff); + } else { + php_error_docref(NULL, E_WARNING, + "Failed setting local cert chain file `%s'; file not found", + Z_STRVAL_P(current) + ); + } } else { - php_error_docref(NULL, E_WARNING, - "Failed setting local cert chain file `%s'; file not found", - Z_STRVAL_P(current) - ); - return FAILURE; + php_error_docref(NULL, E_WARNING, "SNI_server_certs options values must be of type array|string"); } if (ctx == NULL) { @@ -1804,7 +1810,8 @@ sslsock->ssl_handle = SSL_new(sslsock->ctx); - if (sslsock->ssl_handle == NULL) { + if (sslsock->ssl_handle == NULL + || !SSL_set_ex_data(sslsock->ssl_handle, php_openssl_get_ssl_stream_data_index(), stream)) { php_error_docref(NULL, E_WARNING, "SSL handle creation failure"); SSL_CTX_free(sslsock->ctx); sslsock->ctx = NULL; @@ -1815,8 +1822,6 @@ } #endif return FAILURE; - } else { - SSL_set_ex_data(sslsock->ssl_handle, php_openssl_get_ssl_stream_data_index(), stream); } if (!SSL_set_fd(sslsock->ssl_handle, sslsock->s.socket)) { diff -Nru php8.4-8.4.16/ext/pcntl/pcntl.c php8.4-8.4.21/ext/pcntl/pcntl.c --- php8.4-8.4.16/ext/pcntl/pcntl.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pcntl/pcntl.c 2026-05-05 16:34:12.000000000 +0000 @@ -93,7 +93,7 @@ #elif defined(HAVE_PSET_BIND) #include typedef psetid_t cpu_set_t; - #define sched_getaffinity(p, c, m) pset_bind(PS_QUERY, P_PID, (p <= 0 ? getpid() : p), &m) + #define sched_getaffinity(p, c, m) pset_bind(PS_QUERY, P_PID, p, &m) #define sched_setaffinity(p, c, m) pset_bind(m, P_PID, (p <= 0 ? getpid() : p), NULL) #define PCNTL_CPUSET(mask) mask #define PCNTL_CPU_ISSET(i, mask) (pset_assign(PS_QUERY, (processorid_t)i, &query) == 0 && query == mask) @@ -798,15 +798,16 @@ RETURN_THROWS(); } - /* Add the function name to our signal table */ - handle = zend_hash_index_update(&PCNTL_G(php_signal_table), signo, handle); - Z_TRY_ADDREF_P(handle); - + /* Register with the OS first so that on failure we don't record a handler that was never installed */ if (php_signal4(signo, pcntl_signal_handler, (int) restart_syscalls, 1) == (void *)SIG_ERR) { PCNTL_G(last_error) = errno; php_error_docref(NULL, E_WARNING, "Error assigning signal"); RETURN_FALSE; } + + /* Add the function name to our signal table */ + handle = zend_hash_index_update(&PCNTL_G(php_signal_table), signo, handle); + Z_TRY_ADDREF_P(handle); RETURN_TRUE; } /* }}} */ @@ -1342,6 +1343,7 @@ queue = PCNTL_G(head); PCNTL_G(head) = NULL; /* simple stores are atomic */ + PCNTL_G(tail) = NULL; /* Allocate */ while (queue) { @@ -1363,6 +1365,9 @@ #ifdef HAVE_STRUCT_SIGINFO_T zval_ptr_dtor(¶ms[1]); #endif + if (EG(exception)) { + break; + } } } @@ -1372,6 +1377,14 @@ queue = next; } + /* drain the remaining in case of exception thrown */ + while (queue) { + next = queue->next; + queue->next = PCNTL_G(spares); + PCNTL_G(spares) = queue; + queue = next; + } + PCNTL_G(pending_signals) = 0; /* Re-enable queue */ @@ -1584,7 +1597,7 @@ pid = pid_is_null ? getpid() : pid; fd = syscall(SYS_pidfd_open, pid, 0); - if (errno) { + if (fd == -1) { PCNTL_G(last_error) = errno; switch (errno) { case EINVAL: @@ -1610,11 +1623,12 @@ RETURN_FALSE; } ret = setns(fd, (int)nstype); + int setns_errno = errno; close(fd); if (ret == -1) { - PCNTL_G(last_error) = errno; - switch (errno) { + PCNTL_G(last_error) = setns_errno; + switch (setns_errno) { case ESRCH: zend_argument_value_error(1, "process no longer available (" ZEND_LONG_FMT ")", pid); RETURN_THROWS(); @@ -1624,11 +1638,11 @@ RETURN_THROWS(); case EPERM: - php_error_docref(NULL, E_WARNING, "Error %d: No required capability for this process", errno); + php_error_docref(NULL, E_WARNING, "Error %d: No required capability for this process", setns_errno); break; default: - php_error_docref(NULL, E_WARNING, "Error %d", errno); + php_error_docref(NULL, E_WARNING, "Error %d", setns_errno); } RETURN_FALSE; } else { @@ -1733,6 +1747,7 @@ if (cpu < 0 || cpu >= maxcpus) { zend_argument_value_error(2, "cpu id must be between 0 and " ZEND_ULONG_FMT " (" ZEND_LONG_FMT ")", maxcpus, cpu); + PCNTL_CPU_DESTROY(mask); RETURN_THROWS(); } diff -Nru php8.4-8.4.16/ext/pcntl/tests/pcntl_signal_dispatch_exception.phpt php8.4-8.4.21/ext/pcntl/tests/pcntl_signal_dispatch_exception.phpt --- php8.4-8.4.16/ext/pcntl/tests/pcntl_signal_dispatch_exception.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/pcntl/tests/pcntl_signal_dispatch_exception.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,34 @@ +--TEST-- +pcntl_signal_dispatch() stops dispatching after handler throws exception +--EXTENSIONS-- +pcntl +posix +--FILE-- +getMessage() . "\n"; +} + +echo "Handlers called: " . implode(', ', $called) . "\n"; + +?> +--EXPECT-- +Exception in signal handler +Handlers called: SIGUSR1 diff -Nru php8.4-8.4.16/ext/pcntl/tests/pcntl_signal_functions_invalid_signals.phpt php8.4-8.4.21/ext/pcntl/tests/pcntl_signal_functions_invalid_signals.phpt --- php8.4-8.4.16/ext/pcntl/tests/pcntl_signal_functions_invalid_signals.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/pcntl/tests/pcntl_signal_functions_invalid_signals.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,80 @@ +--TEST-- +pcntl_sigprocmask(), pcntl_sigwaitinfo(), and pcntl_sigtimedwait() properly throw on invalid signals +--EXTENSIONS-- +pcntl +--SKIPIF-- + +--INI-- +max_execution_time=0 +--FILE-- +getMessage() . PHP_EOL; +} + +try { + pcntl_sigprocmask(SIG_BLOCK, [0]); +} catch (ValueError $e) { + echo $e->getMessage() . PHP_EOL; +} + +try { + pcntl_sigprocmask(SIG_BLOCK, []); +} catch (ValueError $e) { + echo $e->getMessage() . PHP_EOL; +} + +try { + pcntl_sigwaitinfo(["not_a_signal"]); +} catch (TypeError $e) { + echo $e->getMessage() . PHP_EOL; +} + +try { + pcntl_sigwaitinfo([0]); +} catch (ValueError $e) { + echo $e->getMessage() . PHP_EOL; +} + +try { + pcntl_sigwaitinfo([]); +} catch (ValueError $e) { + echo $e->getMessage() . PHP_EOL; +} + +try { + pcntl_sigtimedwait(["not_a_signal"], $info, 1); +} catch (TypeError $e) { + echo $e->getMessage() . PHP_EOL; +} + +try { + pcntl_sigtimedwait([0], $info, 1); +} catch (ValueError $e) { + echo $e->getMessage() . PHP_EOL; +} + +try { + pcntl_sigtimedwait([], $info, 1); +} catch (ValueError $e) { + echo $e->getMessage() . PHP_EOL; +} + +?> +--EXPECTF-- +pcntl_sigprocmask(): Argument #2 ($signals) signals must be of type int, string given +pcntl_sigprocmask(): Argument #2 ($signals) signals must be between 1 and %d +pcntl_sigprocmask(): Argument #2 ($signals) must not be empty +pcntl_sigwaitinfo(): Argument #1 ($signals) signals must be of type int, string given +pcntl_sigwaitinfo(): Argument #1 ($signals) signals must be between 1 and %d +pcntl_sigwaitinfo(): Argument #1 ($signals) must not be empty +pcntl_sigtimedwait(): Argument #1 ($signals) signals must be of type int, string given +pcntl_sigtimedwait(): Argument #1 ($signals) signals must be between 1 and %d +pcntl_sigtimedwait(): Argument #1 ($signals) must not be empty diff -Nru php8.4-8.4.16/ext/pcre/php_pcre.c php8.4-8.4.21/ext/pcre/php_pcre.c --- php8.4-8.4.16/ext/pcre/php_pcre.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pcre/php_pcre.c 2026-05-05 16:34:12.000000000 +0000 @@ -631,7 +631,7 @@ /* Parse through the leading whitespace, and display a warning if we get to the end without encountering a delimiter. */ - while (isspace((int)*(unsigned char *)p)) p++; + while (isspace((unsigned char)*p)) p++; if (p >= end_p) { if (key != regex) { zend_string_release_ex(key, 0); @@ -644,7 +644,7 @@ /* Get the delimiter and display a warning if it is alphanumeric or a backslash. */ delimiter = *p++; - if (isalnum((int)*(unsigned char *)&delimiter) || delimiter == '\\' || delimiter == '\0') { + if (isalnum((unsigned char)delimiter) || delimiter == '\\' || delimiter == '\0') { if (key != regex) { zend_string_release_ex(key, 0); } @@ -840,6 +840,7 @@ if (key != regex) { zend_string_release_ex(key, 0); } + pcre2_code_free(new_entry.re); php_error_docref(NULL, E_WARNING, "Internal pcre2_pattern_info() error %d", rc); pcre_handle_exec_error(PCRE2_ERROR_INTERNAL); return NULL; @@ -850,6 +851,7 @@ if (key != regex) { zend_string_release_ex(key, 0); } + pcre2_code_free(new_entry.re); php_error_docref(NULL, E_WARNING, "Internal pcre_pattern_info() error %d", rc); pcre_handle_exec_error(PCRE2_ERROR_INTERNAL); return NULL; @@ -1173,6 +1175,7 @@ HashTable *marks = NULL; /* Array of marks for PREG_PATTERN_ORDER */ pcre2_match_data *match_data; PCRE2_SIZE start_offset2, orig_start_offset; + bool old_mdata_used; char *subject = ZSTR_VAL(subject_str); size_t subject_len = ZSTR_LEN(subject_str); @@ -1242,7 +1245,9 @@ matched = 0; PCRE_G(error_code) = PHP_PCRE_NO_ERROR; - if (!mdata_used && num_subpats <= PHP_PCRE_PREALLOC_MDATA_SIZE) { + old_mdata_used = mdata_used; + if (!old_mdata_used && num_subpats <= PHP_PCRE_PREALLOC_MDATA_SIZE) { + mdata_used = true; match_data = mdata; } else { match_data = pcre2_match_data_create_from_pattern(pce->re, PCRE_G(gctx_zmm)); @@ -1294,7 +1299,18 @@ if (subpats != NULL) { /* Try to get the list of substrings and display a warning if failed. */ if (UNEXPECTED(offsets[1] < offsets[0])) { - if (match_sets) efree(match_sets); + if (match_sets) { + for (i = 0; i < num_subpats; i++) { + zend_array_destroy(match_sets[i]); + } + efree(match_sets); + } + if (marks) { + zend_array_destroy(marks); + } + if (match_data != mdata) { + pcre2_match_data_free(match_data); + } php_error_docref(NULL, E_WARNING, "Get subpatterns list failed"); RETURN_FALSE; } @@ -1428,6 +1444,7 @@ if (match_data != mdata) { pcre2_match_data_free(match_data); } + mdata_used = old_mdata_used; /* Add the match sets to the output array and clean up */ if (match_sets) { @@ -1489,7 +1506,8 @@ /* Compile regex or get it from cache. */ pcre_cache_entry *pce; if ((pce = pcre_get_compiled_regex_cache(regex)) == NULL) { - RETURN_FALSE; + RETVAL_FALSE; + goto flf_clean; } pce->refcount++; @@ -1631,6 +1649,7 @@ size_t result_len; /* Length of result */ zend_string *result; /* Result of replacement */ pcre2_match_data *match_data; + bool old_mdata_used; /* Calculate the size of the offsets array, and allocate memory for it. */ num_subpats = pce->capture_count + 1; @@ -1644,7 +1663,9 @@ result_len = 0; PCRE_G(error_code) = PHP_PCRE_NO_ERROR; - if (!mdata_used && num_subpats <= PHP_PCRE_PREALLOC_MDATA_SIZE) { + old_mdata_used = mdata_used; + if (!old_mdata_used && num_subpats <= PHP_PCRE_PREALLOC_MDATA_SIZE) { + mdata_used = true; match_data = mdata; } else { match_data = pcre2_match_data_create_from_pattern(pce->re, PCRE_G(gctx_zmm)); @@ -1846,6 +1867,7 @@ if (match_data != mdata) { pcre2_match_data_free(match_data); } + mdata_used = old_mdata_used; return result; } @@ -2574,6 +2596,7 @@ uint32_t num_subpats; /* Number of captured subpatterns */ zval tmp; pcre2_match_data *match_data; + bool old_mdata_used; char *subject = ZSTR_VAL(subject_str); no_empty = flags & PREG_SPLIT_NO_EMPTY; @@ -2600,7 +2623,9 @@ goto last; } - if (!mdata_used && num_subpats <= PHP_PCRE_PREALLOC_MDATA_SIZE) { + old_mdata_used = mdata_used; + if (!old_mdata_used && num_subpats <= PHP_PCRE_PREALLOC_MDATA_SIZE) { + mdata_used = true; match_data = mdata; } else { match_data = pcre2_match_data_create_from_pattern(pce->re, PCRE_G(gctx_zmm)); @@ -2729,6 +2754,7 @@ if (match_data != mdata) { pcre2_match_data_free(match_data); } + mdata_used = old_mdata_used; if (PCRE_G(error_code) != PHP_PCRE_NO_ERROR) { zval_ptr_dtor(return_value); @@ -2928,6 +2954,7 @@ zend_ulong num_key; bool invert; /* Whether to return non-matching entries */ + bool old_mdata_used; pcre2_match_data *match_data; invert = flags & PREG_GREP_INVERT ? 1 : 0; @@ -2940,7 +2967,9 @@ PCRE_G(error_code) = PHP_PCRE_NO_ERROR; - if (!mdata_used && num_subpats <= PHP_PCRE_PREALLOC_MDATA_SIZE) { + old_mdata_used = mdata_used; + if (!old_mdata_used && num_subpats <= PHP_PCRE_PREALLOC_MDATA_SIZE) { + mdata_used = true; match_data = mdata; } else { match_data = pcre2_match_data_create_from_pattern(pce->re, PCRE_G(gctx_zmm)); @@ -3005,6 +3034,7 @@ if (match_data != mdata) { pcre2_match_data_free(match_data); } + mdata_used = old_mdata_used; } /* }}} */ diff -Nru php8.4-8.4.16/ext/pcre/tests/pcre_reentrancy.phpt php8.4-8.4.21/ext/pcre/tests/pcre_reentrancy.phpt --- php8.4-8.4.16/ext/pcre/tests/pcre_reentrancy.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/pcre/tests/pcre_reentrancy.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,58 @@ +--TEST-- +PCRE re-entrancy: nested calls should not corrupt global match data +--EXTENSIONS-- +pcre +--FILE-- + +--EXPECT-- +Testing nested PCRE calls... +Outer match: a +Outer match: b +Outer match: c +string(3) "ABC" + +Testing deep nesting... +string(7) "SUCCESS" diff -Nru php8.4-8.4.16/ext/pcre/tests/preg_match_all_negative_length_match.phpt php8.4-8.4.21/ext/pcre/tests/preg_match_all_negative_length_match.phpt --- php8.4-8.4.16/ext/pcre/tests/preg_match_all_negative_length_match.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/pcre/tests/preg_match_all_negative_length_match.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,10 @@ +--TEST-- +preg_match_all() resource cleanup when \K in lookahead causes negative-length match +--FILE-- + +--EXPECTF-- +Warning: preg_match_all(): Get subpatterns list failed in %s on line %d +bool(false) diff -Nru php8.4-8.4.16/ext/pcre/tests/preg_match_frameless_leak.phpt php8.4-8.4.21/ext/pcre/tests/preg_match_frameless_leak.phpt --- php8.4-8.4.16/ext/pcre/tests/preg_match_frameless_leak.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/pcre/tests/preg_match_frameless_leak.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,23 @@ +--TEST-- +Memory leak in preg_match() frameless function with invalid regex and object arguments +--FILE-- +val = str_repeat($val, random_int(1, 1)); + } + public function __toString() { + return $this->val; + } +} + +$regex = new Str("invalid regex"); +$subject = new Str("some subject"); + +@preg_match($regex, $subject); + +echo "Done"; +?> +--EXPECT-- +Done diff -Nru php8.4-8.4.16/ext/pcre/tests/preg_match_negative_length_match.phpt php8.4-8.4.21/ext/pcre/tests/preg_match_negative_length_match.phpt --- php8.4-8.4.16/ext/pcre/tests/preg_match_negative_length_match.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/pcre/tests/preg_match_negative_length_match.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,10 @@ +--TEST-- +preg_match() resource cleanup when \K in lookahead causes negative-length match +--FILE-- + +--EXPECTF-- +Warning: preg_match(): Get subpatterns list failed in %s on line %d +bool(false) diff -Nru php8.4-8.4.16/ext/pdo/pdo.c php8.4-8.4.21/ext/pdo/pdo.c --- php8.4-8.4.16/ext/pdo/pdo.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo/pdo.c 2026-05-05 16:34:12.000000000 +0000 @@ -244,7 +244,7 @@ } } - while (i < data_source_len && isspace(data_source[i])) { + while (i < data_source_len && isspace((unsigned char)data_source[i])) { i++; } diff -Nru php8.4-8.4.16/ext/pdo/pdo_sql_parser.c php8.4-8.4.21/ext/pdo/pdo_sql_parser.c --- php8.4-8.4.16/ext/pdo/pdo_sql_parser.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo/pdo_sql_parser.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 3.1 */ +/* Generated by re2c 4.3 */ /* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | @@ -404,7 +404,7 @@ if (t == PDO_PARSER_BIND) { ptrdiff_t len = s.cur - s.tok; - if ((ZSTR_VAL(inquery) < (s.cur - len)) && isalnum(*(s.cur - len - 1))) { + if ((ZSTR_VAL(inquery) < (s.cur - len)) && isalnum((unsigned char)s.cur[-len - 1])) { continue; } query_type |= PDO_PLACEHOLDER_NAMED; diff -Nru php8.4-8.4.16/ext/pdo/pdo_sql_parser.re php8.4-8.4.21/ext/pdo/pdo_sql_parser.re --- php8.4-8.4.16/ext/pdo/pdo_sql_parser.re 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo/pdo_sql_parser.re 2026-05-05 16:34:12.000000000 +0000 @@ -117,7 +117,7 @@ if (t == PDO_PARSER_BIND) { ptrdiff_t len = s.cur - s.tok; - if ((ZSTR_VAL(inquery) < (s.cur - len)) && isalnum(*(s.cur - len - 1))) { + if ((ZSTR_VAL(inquery) < (s.cur - len)) && isalnum((unsigned char)s.cur[-len - 1])) { continue; } query_type |= PDO_PLACEHOLDER_NAMED; diff -Nru php8.4-8.4.16/ext/pdo/pdo_stmt.c php8.4-8.4.21/ext/pdo/pdo_stmt.c --- php8.4-8.4.16/ext/pdo/pdo_stmt.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo/pdo_stmt.c 2026-05-05 16:34:12.000000000 +0000 @@ -148,7 +148,7 @@ stmt->columns[col].name = zend_string_separate(orig_name, 0); char *s = ZSTR_VAL(stmt->columns[col].name); while (*s != '\0') { - *s = toupper(*s); + *s = toupper((unsigned char)*s); s++; } break; diff -Nru php8.4-8.4.16/ext/pdo_dblib/tests/GHSA-5hqh-c84r-qjcv.phpt php8.4-8.4.21/ext/pdo_dblib/tests/GHSA-5hqh-c84r-qjcv.phpt --- php8.4-8.4.16/ext/pdo_dblib/tests/GHSA-5hqh-c84r-qjcv.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo_dblib/tests/GHSA-5hqh-c84r-qjcv.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -4,6 +4,7 @@ pdo_dblib --SKIPIF-- 252) { return 0; } - strncpy(ident, i, l); + memcpy(ident, i, l); ident[l] = '\0'; if (!strcasecmp(ident, "EXECUTE")) { @@ -351,7 +351,7 @@ if (l > 252) { return 0; } - strncpy(ident2, i2, l); + memcpy(ident2, i2, l); ident2[l] = '\0'; execBlock = !strcasecmp(ident2, "BLOCK"); passAsIs = 0; @@ -367,11 +367,15 @@ if (passAsIs) { - strcpy(sql_out, ZSTR_VAL(sql)); + memcpy(sql_out, ZSTR_VAL(sql), ZSTR_LEN(sql)); + sql_out[ZSTR_LEN(sql)] = '\0'; + *sql_out_len = ZSTR_LEN(sql); return 1; } - strncat(sql_out, start, p - start); + char *sql_out_p = sql_out; + memcpy(sql_out_p, start, p - start); + sql_out_p += p - start; while (p < end) { @@ -379,10 +383,12 @@ tok = php_firebird_get_token(&p, end); switch (tok) { - case ttParamMark: - tok = php_firebird_get_token(&p, end); + case ttParamMark: { + const char* p_peek = p; + tok = php_firebird_get_token(&p_peek, end); if (tok == ttIdent /*|| tok == ttString*/) { + p = p_peek; ++pindex; l = p - start; /* check the length of the identifier */ @@ -391,7 +397,7 @@ if (l > 253) { return 0; } - strncpy(pname, start, l); + memcpy(pname, start, l); pname[l] = '\0'; if (named_params) { @@ -400,7 +406,7 @@ zend_hash_str_update(named_params, pname, l, &tmp); } - strcat(sql_out, "?"); + *sql_out_p++ = '?'; } else { @@ -410,10 +416,11 @@ return 0; } ++pindex; - strncat(sql_out, start, p - start); + memcpy(sql_out_p, start, p - start); + sql_out_p += p - start; } break; - + } case ttIdent: if (execBlock) { @@ -425,11 +432,14 @@ if (l > 252) { return 0; } - strncpy(ident, start, l); + memcpy(ident, start, l); ident[l] = '\0'; if (!strcasecmp(ident, "AS")) { - strncat(sql_out, start, end - start); + memcpy(sql_out_p, start, end - start); + sql_out_p += end - start; + *sql_out_p = '\0'; + *sql_out_len = sql_out_p - sql_out; return 1; } } @@ -440,7 +450,8 @@ case ttComment: case ttString: case ttOther: - strncat(sql_out, start, p - start); + memcpy(sql_out_p, start, p - start); + sql_out_p += p - start; break; case ttBrokenComment: @@ -458,6 +469,8 @@ break; } } + *sql_out_p = '\0'; + *sql_out_len = sql_out_p - sql_out; return 1; } @@ -758,7 +771,7 @@ ret = -1; goto free_statement; } - while (result[i] != isc_info_end && i < result_size) { + while (i < result_size && result[i] != isc_info_end) { short len = (short)isc_vax_integer(&result[i+1],2); /* bail out on bad len */ if (len != 1 && len != 2 && len != 4) { @@ -792,7 +805,7 @@ static zend_string* firebird_handle_quoter(pdo_dbh_t *dbh, const zend_string *unquoted, enum pdo_param_type paramtype) { size_t qcount = 0; - char const *co, *l, *r; + char const *co, *l; char *c; size_t quotedlen; zend_string *quoted_str; @@ -801,9 +814,15 @@ return ZSTR_INIT_LITERAL("''", 0); } + const char * const end = ZSTR_VAL(unquoted) + ZSTR_LEN(unquoted); + /* Firebird only requires single quotes to be doubled if string lengths are used */ /* count the number of ' characters */ - for (co = ZSTR_VAL(unquoted); (co = strchr(co,'\'')); qcount++, co++); + for (co = ZSTR_VAL(unquoted); co < end; co++) { + if (*co == '\'') { + qcount++; + } + } if (UNEXPECTED(ZSTR_LEN(unquoted) + 2 > ZSTR_MAX_LEN - qcount)) { return NULL; @@ -815,15 +834,14 @@ *c++ = '\''; /* foreach (chunk that ends in a quote) */ - for (l = ZSTR_VAL(unquoted); (r = strchr(l,'\'')); l = r+1) { - strncpy(c, l, r-l+1); - c += (r-l+1); - /* add the second quote */ - *c++ = '\''; + for (l = ZSTR_VAL(unquoted); l < end; l++) { + *c++ = *l; + if (*l == '\'') { + /* add the second quote */ + *c++ = '\''; + } } - /* copy the remainder */ - strncpy(c, l, quotedlen-(c-ZSTR_VAL(quoted_str))-1); ZSTR_VAL(quoted_str)[quotedlen-1] = '\''; ZSTR_VAL(quoted_str)[quotedlen] = '\0'; @@ -1001,6 +1019,7 @@ { pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data; char *new_sql; + size_t new_sql_len; /* allocate the statement */ if (isc_dsql_allocate_statement(H->isc_status, &H->db, s)) { @@ -1012,14 +1031,14 @@ we need to replace :foo by ?, and store the name we just replaced */ new_sql = emalloc(ZSTR_LEN(sql)+1); new_sql[0] = '\0'; - if (!php_firebird_preprocess(sql, new_sql, named_params)) { + if (!php_firebird_preprocess(sql, new_sql, &new_sql_len, named_params)) { php_firebird_error_with_info(dbh, "07000", strlen("07000"), NULL, 0); efree(new_sql); return 0; } /* prepare the statement */ - if (isc_dsql_prepare(H->isc_status, &H->tr, s, 0, new_sql, H->sql_dialect, out_sqlda)) { + if (isc_dsql_prepare(H->isc_status, &H->tr, s, new_sql_len, new_sql, H->sql_dialect, out_sqlda)) { php_firebird_error(dbh); efree(new_sql); return 0; diff -Nru php8.4-8.4.16/ext/pdo_firebird/firebird_statement.c php8.4-8.4.21/ext/pdo_firebird/firebird_statement.c --- php8.4-8.4.16/ext/pdo_firebird/firebird_statement.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo_firebird/firebird_statement.c 2026-05-05 16:34:12.000000000 +0000 @@ -243,7 +243,7 @@ if (result_size > sizeof(result)) { goto error; } - while (result[i] != isc_info_end && i < result_size) { + while (i < result_size && result[i] != isc_info_end) { short len = (short) isc_vax_integer(&result[i + 1], 2); if (len != 1 && len != 2 && len != 4) { goto error; diff -Nru php8.4-8.4.16/ext/pdo_firebird/tests/autocommit.phpt php8.4-8.4.21/ext/pdo_firebird/tests/autocommit.phpt --- php8.4-8.4.16/ext/pdo_firebird/tests/autocommit.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo_firebird/tests/autocommit.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -74,9 +74,9 @@ ========== not in auto commit mode ========== auto commit mode OFF insert, expect error -SQLSTATE[08003]: Connection does not exist: %s +%r(SQLSTATE\[08003\]: Connection does not exist|SQLSTATE\[HY000\]: General error)%r: %s select, expect error -SQLSTATE[08003]: Connection does not exist: %s +%r(SQLSTATE\[08003\]: Connection does not exist|SQLSTATE\[HY000\]: General error)%r: %s done! diff -Nru php8.4-8.4.16/ext/pdo_firebird/tests/ghsa-w476-322c-wpvm.phpt php8.4-8.4.21/ext/pdo_firebird/tests/ghsa-w476-322c-wpvm.phpt --- php8.4-8.4.16/ext/pdo_firebird/tests/ghsa-w476-322c-wpvm.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/pdo_firebird/tests/ghsa-w476-322c-wpvm.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,46 @@ +--TEST-- +GHSA-w476-322c-wpvm: SQL injection in pdo_firebird via NUL bytes in quoted strings +--EXTENSIONS-- +pdo_firebird +--SKIPIF-- + +--XLEAK-- +A bug in firebird causes a memory leak when calling `isc_attach_database()`. +See https://github.com/FirebirdSQL/firebird/issues/7849 +--FILE-- +exec('CREATE TABLE ghsa_w476_322c_wpvm (name VARCHAR(255))'); + +$param = $dbh->quote("\0"); +$param2 = $dbh->quote('or 1=1--'); +var_export($param); +echo("\n"); + +echo "prepare: "; +$stmt = $dbh->prepare("SELECT * FROM ghsa_w476_322c_wpvm WHERE name = {$param} AND name = {$param2}"); +$stmt->execute(); +echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)) . "\n"; + +echo "query: "; +$stmt = $dbh->query("SELECT * FROM ghsa_w476_322c_wpvm WHERE name = {$param} AND name = {$param2}"); +echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)) . "\n"; + +echo "exec: "; +$affectedRows = $dbh->exec("UPDATE ghsa_w476_322c_wpvm SET name = 'updated' WHERE name = {$param} AND name = {$param2}"); +echo $affectedRows . "\n"; +?> +--CLEAN-- +exec("DROP TABLE ghsa_w476_322c_wpvm"); +?> +--EXPECT-- +'\'' . "\0" . '\'' +prepare: [] +query: [] +exec: 0 diff -Nru php8.4-8.4.16/ext/pdo_mysql/mysql_sql_parser.c php8.4-8.4.21/ext/pdo_mysql/mysql_sql_parser.c --- php8.4-8.4.16/ext/pdo_mysql/mysql_sql_parser.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo_mysql/mysql_sql_parser.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 3.1 */ +/* Generated by re2c 4.3 */ /* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | diff -Nru php8.4-8.4.16/ext/pdo_odbc/odbc_stmt.c php8.4-8.4.21/ext/pdo_odbc/odbc_stmt.c --- php8.4-8.4.16/ext/pdo_odbc/odbc_stmt.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo_odbc/odbc_stmt.c 2026-05-05 16:34:12.000000000 +0000 @@ -710,7 +710,7 @@ str = zend_string_realloc(str, used + 256, 0); memcpy(ZSTR_VAL(str) + used, buf2, 256); used = used + 255; - } else if (rc==SQL_SUCCESS) { + } else if (rc == SQL_SUCCESS && C->fetched_len != 0) { str = zend_string_realloc(str, used + C->fetched_len, 0); memcpy(ZSTR_VAL(str) + used, buf2, C->fetched_len); used = used + C->fetched_len; diff -Nru php8.4-8.4.16/ext/pdo_pgsql/pgsql_driver.c php8.4-8.4.21/ext/pdo_pgsql/pgsql_driver.c --- php8.4-8.4.16/ext/pdo_pgsql/pgsql_driver.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo_pgsql/pgsql_driver.c 2026-05-05 16:34:12.000000000 +0000 @@ -509,7 +509,7 @@ break; #endif #ifdef CONNECTION_GSS_STARTUP - case CONNECTION_SSL_STARTUP: + case CONNECTION_GSS_STARTUP: ZVAL_STRINGL(return_value, "Negotiating GSSAPI.", strlen("Negotiating GSSAPI.")); break; #endif diff -Nru php8.4-8.4.16/ext/pdo_pgsql/pgsql_sql_parser.c php8.4-8.4.21/ext/pdo_pgsql/pgsql_sql_parser.c --- php8.4-8.4.16/ext/pdo_pgsql/pgsql_sql_parser.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo_pgsql/pgsql_sql_parser.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 3.1 */ +/* Generated by re2c 4.3 */ /* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | diff -Nru php8.4-8.4.16/ext/pdo_sqlite/sqlite_sql_parser.c php8.4-8.4.21/ext/pdo_sqlite/sqlite_sql_parser.c --- php8.4-8.4.16/ext/pdo_sqlite/sqlite_sql_parser.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo_sqlite/sqlite_sql_parser.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 3.1 */ +/* Generated by re2c 4.3 */ /* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | diff -Nru php8.4-8.4.16/ext/pdo_sqlite/tests/bug81740.phpt php8.4-8.4.21/ext/pdo_sqlite/tests/bug81740.phpt --- php8.4-8.4.16/ext/pdo_sqlite/tests/bug81740.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pdo_sqlite/tests/bug81740.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -5,6 +5,7 @@ pdo_sqlite --SKIPIF-- diff -Nru php8.4-8.4.16/ext/pgsql/pgsql.c php8.4-8.4.21/ext/pgsql/pgsql.c --- php8.4-8.4.16/ext/pgsql/pgsql.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pgsql/pgsql.c 2026-05-05 16:34:12.000000000 +0000 @@ -705,10 +705,12 @@ /* create the link */ pgsql = PQconnectdb(connstring); if (pgsql == NULL || PQstatus(pgsql) == CONNECTION_BAD) { - PHP_PQ_ERROR("Unable to connect to PostgreSQL server: %s", pgsql) + zend_string *msgbuf = _php_pgsql_trim_message(PQerrorMessage(pgsql)); if (pgsql) { PQfinish(pgsql); } + php_error_docref(NULL, E_WARNING, "Unable to connect to PostgreSQL server: %s", ZSTR_VAL(msgbuf)); + zend_string_release(msgbuf); goto err; } @@ -789,19 +791,23 @@ if (connect_type & PGSQL_CONNECT_ASYNC) { pgsql = PQconnectStart(connstring); if (pgsql==NULL || PQstatus(pgsql)==CONNECTION_BAD) { - PHP_PQ_ERROR("Unable to connect to PostgreSQL server: %s", pgsql); + zend_string *msgbuf = _php_pgsql_trim_message(PQerrorMessage(pgsql)); if (pgsql) { PQfinish(pgsql); } + php_error_docref(NULL, E_WARNING, "Unable to connect to PostgreSQL server: %s", ZSTR_VAL(msgbuf)); + zend_string_release(msgbuf); goto err; } } else { pgsql = PQconnectdb(connstring); if (pgsql==NULL || PQstatus(pgsql)==CONNECTION_BAD) { - PHP_PQ_ERROR("Unable to connect to PostgreSQL server: %s", pgsql); + zend_string *msgbuf = _php_pgsql_trim_message(PQerrorMessage(pgsql)); if (pgsql) { PQfinish(pgsql); } + php_error_docref(NULL, E_WARNING, "Unable to connect to PostgreSQL server: %s", ZSTR_VAL(msgbuf)); + zend_string_release(msgbuf); goto err; } } @@ -5632,7 +5638,7 @@ goto cleanup; } if (opt & PGSQL_DML_ESCAPE) { - tmp = PQescapeIdentifier(pg_link, ZSTR_VAL(fld), ZSTR_LEN(fld) + 1); + tmp = PQescapeIdentifier(pg_link, ZSTR_VAL(fld), ZSTR_LEN(fld)); if (tmp == NULL) { php_error_docref(NULL, E_NOTICE, "Failed to escape field '%s'", ZSTR_VAL(fld)); goto cleanup; @@ -5817,7 +5823,7 @@ return -1; } if (opt & PGSQL_DML_ESCAPE) { - char *tmp = PQescapeIdentifier(pg_link, ZSTR_VAL(fld), ZSTR_LEN(fld) + 1); + char *tmp = PQescapeIdentifier(pg_link, ZSTR_VAL(fld), ZSTR_LEN(fld)); if (tmp == NULL) { php_error_docref(NULL, E_NOTICE, "Failed to escape field '%s'", ZSTR_VAL(fld)); return -1; diff -Nru php8.4-8.4.16/ext/pgsql/pgsql.stub.php php8.4-8.4.21/ext/pgsql/pgsql.stub.php --- php8.4-8.4.16/ext/pgsql/pgsql.stub.php 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pgsql/pgsql.stub.php 2026-05-05 16:34:12.000000000 +0000 @@ -432,7 +432,7 @@ * @cvalue PGSQL_DML_STRING */ const PGSQL_DML_STRING = UNKNOWN; -#ifdef PQTRACE_SUPPPRESS_TIMESTAMPS +#ifdef PQTRACE_SUPPRESS_TIMESTAMPS /** * @var int * @cvalue PQTRACE_SUPPRESS_TIMESTAMPS diff -Nru php8.4-8.4.16/ext/pgsql/pgsql_arginfo.h php8.4-8.4.21/ext/pgsql/pgsql_arginfo.h --- php8.4-8.4.16/ext/pgsql/pgsql_arginfo.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/pgsql/pgsql_arginfo.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 14b0bdd019480b850940b2c2b012b5f6d51746b8 */ + * Stub hash: c7e052b85d35ac885704016224e488c67cb83df3 */ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_pg_connect, 0, 1, PgSql\\Connection, MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, connection_string, IS_STRING, 0) @@ -828,7 +828,7 @@ REGISTER_LONG_CONSTANT("PGSQL_DML_EXEC", PGSQL_DML_EXEC, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_DML_ASYNC", PGSQL_DML_ASYNC, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PGSQL_DML_STRING", PGSQL_DML_STRING, CONST_PERSISTENT); -#if defined(PQTRACE_SUPPPRESS_TIMESTAMPS) +#if defined(PQTRACE_SUPPRESS_TIMESTAMPS) REGISTER_LONG_CONSTANT("PGSQL_TRACE_SUPPRESS_TIMESTAMPS", PQTRACE_SUPPRESS_TIMESTAMPS, CONST_PERSISTENT); #endif #if defined(PQTRACE_REGRESS_MODE) diff -Nru php8.4-8.4.16/ext/pgsql/tests/gh21162.phpt php8.4-8.4.21/ext/pgsql/tests/gh21162.phpt --- php8.4-8.4.16/ext/pgsql/tests/gh21162.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/pgsql/tests/gh21162.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,18 @@ +--TEST-- +GH-21162 (pg_connect() on error memory leak) +--EXTENSIONS-- +pgsql +--FILE-- + +--EXPECT-- +Warning caught +Done diff -Nru php8.4-8.4.16/ext/phar/func_interceptors.c php8.4-8.4.21/ext/phar/func_interceptors.c --- php8.4-8.4.16/ext/phar/func_interceptors.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/phar/func_interceptors.c 2026-05-05 16:34:12.000000000 +0000 @@ -932,6 +932,7 @@ PHAR_RELEASE(fopen); PHAR_RELEASE(file_get_contents); PHAR_RELEASE(is_file); + PHAR_RELEASE(is_link); PHAR_RELEASE(is_dir); PHAR_RELEASE(opendir); PHAR_RELEASE(file_exists); diff -Nru php8.4-8.4.16/ext/phar/phar.c php8.4-8.4.21/ext/phar/phar.c --- php8.4-8.4.16/ext/phar/phar.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/phar/phar.c 2026-05-05 16:34:12.000000000 +0000 @@ -260,20 +260,26 @@ PHAR_G(last_phar) = NULL; PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL; + /* This is a new phar that has perhaps had an alias/metadata set, but has never been flushed. */ + bool remove_fname_cache = !zend_hash_num_elements(&phar->manifest); + if (phar->fp && (!(phar->flags & PHAR_FILE_COMPRESSION_MASK) || !phar->alias)) { /* close open file handle - allows removal or rename of the file on windows, which has greedy locking - only close if the archive was not already compressed. If it - was compressed, then the fp does not refer to the original file. - We're also closing compressed files to save resources, - but only if the archive isn't aliased. */ + only close if the archive was not already compressed. + We're also closing compressed files to save resources, but only if the archive isn't aliased. + If it was compressed, then the fp does not refer to the original compressed file: + it refers to the **uncompressed** filtered file stream. + Therefore, upon closing a compressed file we need to invalidate the phar archive such + that the code that reopens the phar will not try to use the **compressed** file as if it was uncompressed. + That would result in treating compressed file data as if it were compressed and using uncompressed file offsets + on the compressed file. */ php_stream_close(phar->fp); phar->fp = NULL; + remove_fname_cache |= phar->flags & PHAR_FILE_COMPRESSION_MASK; } - if (!zend_hash_num_elements(&phar->manifest)) { - /* this is a new phar that has perhaps had an alias/metadata set, but has never - been flushed */ + if (remove_fname_cache) { if (zend_hash_str_del(&(PHAR_G(phar_fname_map)), phar->fname, phar->fname_len) != SUCCESS) { phar_destroy_phar_data(phar); } @@ -420,7 +426,7 @@ phar = idata->phar; - if (idata->internal_file->fp_refcount < 2) { + if (idata->internal_file->fp_refcount < 2 && idata->internal_file->fileinfo_lock_count == 0) { if (idata->fp && idata->fp != idata->phar->fp && idata->fp != idata->phar->ufp && idata->fp != idata->internal_file->fp) { php_stream_close(idata->fp); } @@ -1611,7 +1617,7 @@ const zend_long readsize = sizeof(buffer) - sizeof(token); const zend_long tokenlen = sizeof(token) - 1; zend_long halt_offset; - size_t got; + ssize_t got; uint32_t compression = PHAR_FILE_COMPRESSED_NONE; if (error) { @@ -1629,7 +1635,7 @@ /* Maybe it's better to compile the file instead of just searching, */ /* but we only want the offset. So we want a .re scanner to find it. */ while(!php_stream_eof(fp)) { - if ((got = php_stream_read(fp, buffer+tokenlen, readsize)) < (size_t) tokenlen) { + if ((got = php_stream_read(fp, buffer+tokenlen, readsize)) < tokenlen) { MAPPHAR_ALLOC_FAIL("internal corruption of phar \"%s\" (truncated entry)") } diff -Nru php8.4-8.4.16/ext/phar/phar_internal.h php8.4-8.4.21/ext/phar/phar_internal.h --- php8.4-8.4.16/ext/phar/phar_internal.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/phar/phar_internal.h 2026-05-05 16:34:12.000000000 +0000 @@ -216,6 +216,7 @@ php_stream *fp; php_stream *cfp; int fp_refcount; + unsigned int fileinfo_lock_count; char *tmp; phar_archive_data *phar; char *link; /* symbolic link to another file */ diff -Nru php8.4-8.4.16/ext/phar/phar_object.c php8.4-8.4.21/ext/phar/phar_object.c --- php8.4-8.4.16/ext/phar/phar_object.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/phar/phar_object.c 2026-05-05 16:34:12.000000000 +0000 @@ -649,6 +649,9 @@ char *testit; testit = sapi_getenv("SCRIPT_NAME", sizeof("SCRIPT_NAME")-1); + if (!testit) { + goto finish; + } if (!(pt = strstr(testit, basename))) { efree(testit); goto finish; @@ -1397,12 +1400,12 @@ zval *value; bool close_fp = 1; struct _phar_t *p_obj = (struct _phar_t*) puser; - size_t str_key_len, base_len = ZSTR_LEN(p_obj->base); + size_t str_key_len, base_len = p_obj->base ? ZSTR_LEN(p_obj->base) : 0; phar_entry_data *data; php_stream *fp; size_t fname_len; size_t contents_len; - char *fname, *error = NULL, *base = ZSTR_VAL(p_obj->base), *save = NULL, *temp = NULL; + char *fname, *error = NULL, *base = p_obj->base ? ZSTR_VAL(p_obj->base) : NULL, *save = NULL, *temp = NULL; zend_string *opened; char *str_key; zend_class_entry *ce = p_obj->c; @@ -3591,6 +3594,11 @@ if (!(entry = phar_get_entry_info_dir(phar_obj->archive, ZSTR_VAL(file_name), ZSTR_LEN(file_name), 1, &error, 0))) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s does not exist%s%s", ZSTR_VAL(file_name), error?", ":"", error?error:""); } else { + if (entry->is_temp_dir) { + efree(entry->filename); + efree(entry); + } + if (zend_string_equals_literal(file_name, ".phar/stub.php")) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Cannot get stub \".phar/stub.php\" directly in phar \"%s\", use getStub", phar_obj->archive->fname); RETURN_THROWS(); @@ -3606,11 +3614,6 @@ RETURN_THROWS(); } - if (entry->is_temp_dir) { - efree(entry->filename); - efree(entry); - } - zend_string *sfname = strpprintf(0, "phar://%s/%s", phar_obj->archive->fname, ZSTR_VAL(file_name)); zval zfname; ZVAL_NEW_STR(&zfname, sfname); @@ -3681,11 +3684,13 @@ size_t written_len = php_stream_write(data->fp, ZSTR_VAL(content), ZSTR_LEN(content)); if (written_len != contents_len) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s could not be written to", filename); + phar_entry_delref(data); goto finish; } } else { if (!(php_stream_from_zval_no_verify(contents_file, zresource))) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "Entry %s could not be written to", filename); + phar_entry_delref(data); goto finish; } php_stream_copy_to_stream_ex(contents_file, data->fp, PHP_STREAM_COPY_ALL, &contents_len); @@ -4519,7 +4524,7 @@ entry_obj->entry = entry_info; if (!entry_info->is_persistent && !entry_info->is_temp_dir) { - ++entry_info->fp_refcount; + ++entry_info->fileinfo_lock_count; /* The phar data must exist to keep the alias locked. */ ZEND_ASSERT(!phar_data->is_persistent); ++phar_data->refcount; @@ -4567,7 +4572,7 @@ efree(entry); entry_obj->entry = NULL; } else if (!entry->is_persistent) { - --entry->fp_refcount; + --entry->fileinfo_lock_count; /* The entry itself still lives in the manifest, * which will either be freed here if the file info was the last reference; or freed later. */ entry_obj->entry = NULL; diff -Nru php8.4-8.4.16/ext/phar/phar_path_check.c php8.4-8.4.21/ext/phar/phar_path_check.c --- php8.4-8.4.16/ext/phar/phar_path_check.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/phar/phar_path_check.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 3.1 */ +/* Generated by re2c 4.3 */ /* +----------------------------------------------------------------------+ | phar php single-file executable PHP extension | @@ -196,11 +196,8 @@ if (yych <= '/') goto yy22; yy18: YYCURSOR = YYMARKER; - if (yyaccept == 0) { - goto yy5; - } else { - goto yy2; - } + if (yyaccept == 0) goto yy5; + else goto yy2; yy19: ++YYCURSOR; { diff -Nru php8.4-8.4.16/ext/phar/stream.c php8.4-8.4.21/ext/phar/stream.c --- php8.4-8.4.16/ext/phar/stream.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/phar/stream.c 2026-05-05 16:34:12.000000000 +0000 @@ -357,11 +357,11 @@ static int phar_stream_close(php_stream *stream, int close_handle) /* {{{ */ { /* for some reasons phar needs to be flushed even if there is no write going on */ - phar_stream_flush(stream); + int ret = phar_stream_flush(stream); phar_entry_delref((phar_entry_data *)stream->abstract); - return 0; + return ret; } /* }}} */ diff -Nru php8.4-8.4.16/ext/phar/tar.c php8.4-8.4.21/ext/phar/tar.c --- php8.4-8.4.16/ext/phar/tar.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tar.c 2026-05-05 16:34:12.000000000 +0000 @@ -723,7 +723,7 @@ } if (entry->is_deleted) { - if (entry->fp_refcount <= 0) { + if (entry->fp_refcount <= 0 && entry->fileinfo_lock_count == 0) { return ZEND_HASH_APPLY_REMOVE; } else { /* we can't delete this in-memory until it is closed */ diff -Nru php8.4-8.4.16/ext/phar/tests/SplFileInfo_openFile_write.phpt php8.4-8.4.21/ext/phar/tests/SplFileInfo_openFile_write.phpt --- php8.4-8.4.16/ext/phar/tests/SplFileInfo_openFile_write.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tests/SplFileInfo_openFile_write.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,31 @@ +--TEST-- +SplFileInfo::openFile() in write mode +--EXTENSIONS-- +phar +--INI-- +phar.readonly=0 +--FILE-- +addFromString('test', 'contents'); +var_dump($phar['test']->openFile('w')); + +?> +--CLEAN-- + +--EXPECTF-- +object(SplFileObject)#%d (%d) { + ["pathName":"SplFileInfo":private]=> + string(%d) "phar://%stest" + ["fileName":"SplFileInfo":private]=> + string(4) "test" + ["openMode":"SplFileObject":private]=> + string(1) "w" + ["delimiter":"SplFileObject":private]=> + string(1) "," + ["enclosure":"SplFileObject":private]=> + string(1) """ +} diff -Nru php8.4-8.4.16/ext/phar/tests/bug74154.phpt php8.4-8.4.21/ext/phar/tests/bug74154.phpt --- php8.4-8.4.16/ext/phar/tests/bug74154.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tests/bug74154.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,41 @@ +--TEST-- +Bug #74154 (Phar extractTo creates empty files) +--EXTENSIONS-- +phar +zlib +--FILE-- +buildFromDirectory($dir); + +$compPhar = $phar->compress(Phar::GZ); +unset($phar); //make sure that test.tar is closed +unlink(__DIR__.'/bug74154.tar'); +unset($compPhar); //make sure that test.tar.gz is closed +$extractingPhar = new PharData(__DIR__.'/bug74154.tar.gz'); +$extractingPhar->extractTo($dir.'_out'); + +var_dump(file_get_contents($dir.'_out/1.txt')); +var_dump(file_get_contents($dir.'_out/2.txt')); + +?> +--CLEAN-- + +--EXPECT-- +string(64) "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh" +string(64) "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii" diff -Nru php8.4-8.4.16/ext/phar/tests/gh17808.phpt php8.4-8.4.21/ext/phar/tests/gh17808.phpt --- php8.4-8.4.16/ext/phar/tests/gh17808.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tests/gh17808.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -5,18 +5,26 @@ zlib --FILE-- getContent())); -unlink("$file"); +unlink($file); var_dump($file->getATime()); ?> +--CLEAN-- + --EXPECTF-- -string(%d) "phar://%spackage.xml" +object(PharFileInfo)#%d (%d) { + ["pathName":"SplFileInfo":private]=> + string(%d) "phar://%spackage.xml" + ["fileName":"SplFileInfo":private]=> + string(11) "package.xml" +} int(6747) - -Warning: unlink(): phar error: "package.xml" in phar %s, has open file pointers, cannot unlink in %s on line %d int(33188) diff -Nru php8.4-8.4.16/ext/phar/tests/gh20732.phpt php8.4-8.4.21/ext/phar/tests/gh20732.phpt --- php8.4-8.4.16/ext/phar/tests/gh20732.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tests/gh20732.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,14 @@ +--TEST-- +GH-20732 (Phar::LoadPhar undefined behavior when loading directory) +--EXTENSIONS-- +phar +--FILE-- +getMessage(), "\n"; +} +?> +--EXPECTF-- +%r(internal corruption of phar "%s" \(truncated entry\)|unable to open phar for reading ".")%r diff -Nru php8.4-8.4.16/ext/phar/tests/gh20882.phpt php8.4-8.4.21/ext/phar/tests/gh20882.phpt --- php8.4-8.4.16/ext/phar/tests/gh20882.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tests/gh20882.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,22 @@ +--TEST-- +GH-20882 (phar buildFromIterator breaks with missing base directory) +--EXTENSIONS-- +phar +--INI-- +phar.readonly=0 +--FILE-- +buildFromIterator( + new RecursiveIteratorIterator( + new RecursiveDirectoryIterator(__DIR__.'/test79082', FilesystemIterator::SKIP_DOTS) + ), + null + ); +} catch (BadMethodCallException $e) { + echo $e->getMessage(), "\n"; +} +?> +--EXPECT-- +Iterator RecursiveIteratorIterator returns an SplFileInfo object, so base directory must be specified diff -Nru php8.4-8.4.16/ext/phar/tests/gh21797.phpt php8.4-8.4.21/ext/phar/tests/gh21797.phpt --- php8.4-8.4.16/ext/phar/tests/gh21797.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tests/gh21797.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,30 @@ +--TEST-- +GH-21797: Phar::webPhar() NULL dereference when SCRIPT_NAME absent from SAPI environment +--CGI-- +--EXTENSIONS-- +phar +--INI-- +phar.readonly=0 +phar.require_hash=0 +variables_order=EGPC +register_argc_argv=0 +cgi.fix_pathinfo=0 +--ENV-- +REQUEST_METHOD=GET +PATH_INFO=/gh21797.phar +--FILE-- +addFromString('index.php', ''); +$phar->setStub(''); +unset($phar); +include $fname; +?> +--CLEAN-- + +--EXPECT-- +no crash diff -Nru php8.4-8.4.16/ext/phar/tests/gh21798-add-file-delref.phpt php8.4-8.4.21/ext/phar/tests/gh21798-add-file-delref.phpt --- php8.4-8.4.16/ext/phar/tests/gh21798-add-file-delref.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tests/gh21798-add-file-delref.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,29 @@ +--TEST-- +GH-21798: phar_add_file must call phar_entry_delref on write error paths +--EXTENSIONS-- +phar +--INI-- +phar.readonly=0 +phar.require_hash=0 +--FILE-- +addFromString('hello.txt', 'hello world'); +$phar->addFromString('empty.txt', ''); +unset($phar); + +$phar = new Phar($fname); +echo $phar['hello.txt']->getContent() . "\n"; +echo ($phar->offsetExists('empty.txt') ? 'empty exists' : 'missing') . "\n"; +echo "no crash\n"; +?> +--CLEAN-- + +--EXPECT-- +hello world +empty exists +no crash diff -Nru php8.4-8.4.16/ext/phar/tests/gh21798-offsetget-temp-entry.phpt php8.4-8.4.21/ext/phar/tests/gh21798-offsetget-temp-entry.phpt --- php8.4-8.4.16/ext/phar/tests/gh21798-offsetget-temp-entry.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tests/gh21798-offsetget-temp-entry.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,39 @@ +--TEST-- +GH-21798: Phar::offsetGet() must free is_temp_dir entry before rejecting .phar/* paths +--EXTENSIONS-- +phar +--INI-- +phar.readonly=0 +phar.require_hash=0 +--FILE-- +addFromString('index.php', ''); +unset($phar); + +$phar = new Phar($fname); +try { + $phar->offsetGet('.phar/stub.php'); +} catch (BadMethodCallException $e) { + echo $e->getMessage() . "\n"; +} +try { + $phar->offsetGet('.phar/alias.txt'); +} catch (BadMethodCallException $e) { + echo $e->getMessage() . "\n"; +} +try { + $phar->offsetGet('.phar/internal'); +} catch (BadMethodCallException $e) { + echo $e->getMessage() . "\n"; +} +echo "no crash\n"; +?> +--CLEAN-- + +--EXPECT-- +Entry .phar/stub.php does not exist +Entry .phar/alias.txt does not exist +Entry .phar/internal does not exist +no crash diff -Nru php8.4-8.4.16/ext/phar/tests/gh21799-stream-close-flush.phpt php8.4-8.4.21/ext/phar/tests/gh21799-stream-close-flush.phpt --- php8.4-8.4.16/ext/phar/tests/gh21799-stream-close-flush.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tests/gh21799-stream-close-flush.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,32 @@ +--TEST-- +GH-21799: phar_stream_close propagates phar_stream_flush return value +--EXTENSIONS-- +phar +--INI-- +phar.readonly=0 +phar.require_hash=0 +--FILE-- +addFromString('hello.txt', 'hello'); +unset($phar); + +$fp = fopen('phar://' . $fname . '/hello.txt', 'rb'); +$content = fread($fp, 1024); +$result = fclose($fp); + +echo $content . "\n"; +var_dump($result); +echo "no crash\n"; +?> +--CLEAN-- + +--EXPECT-- +hello +bool(true) +no crash diff -Nru php8.4-8.4.16/ext/phar/tests/phar-is-link-intercept.phpt php8.4-8.4.21/ext/phar/tests/phar-is-link-intercept.phpt --- php8.4-8.4.16/ext/phar/tests/phar-is-link-intercept.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tests/phar-is-link-intercept.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,29 @@ +--TEST-- +phar: is_link() intercept correctly delegates for non-symlink phar entries +--EXTENSIONS-- +phar +--INI-- +phar.readonly=0 +phar.require_hash=0 +--FILE-- +addFromString('file.txt', 'hello'); +$phar->setStub(''); +include $fname; +?> +--CLEAN-- + +--EXPECT-- +regular entry (not a symlink): bool(false) +missing entry: bool(false) +absolute phar:// path (bypasses intercept): bool(false) diff -Nru php8.4-8.4.16/ext/phar/tests/phar_extract2.phpt php8.4-8.4.21/ext/phar/tests/phar_extract2.phpt --- php8.4-8.4.16/ext/phar/tests/phar_extract2.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tests/phar_extract2.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -46,8 +46,6 @@ @rmdir($dir . 'one/level'); @rmdir($dir . 'one'); @rmdir($dir); -$dir = __DIR__ . '/extract1/'; -@rmdir($dir); ?> --EXPECTF-- %sextract2%cfile1.txt diff -Nru php8.4-8.4.16/ext/phar/tests/tar/bug70417.phpt php8.4-8.4.21/ext/phar/tests/tar/bug70417.phpt --- php8.4-8.4.16/ext/phar/tests/tar/bug70417.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/phar/tests/tar/bug70417.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -10,10 +10,11 @@ $resBefore = count(get_resources()); $arch = new PharData($filename); $arch->addFromString('foo', 'bar'); +$arch->addFromString('foo2', 'baz'); $arch->compress(Phar::GZ); unset($arch); $resAfter = count(get_resources()); -var_dump($resBefore === $resAfter); +var_dump($resAfter - $resBefore); ?> --CLEAN-- --EXPECT-- -bool(true) +int(0) diff -Nru php8.4-8.4.16/ext/phar/util.c php8.4-8.4.21/ext/phar/util.c --- php8.4-8.4.16/ext/phar/util.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/phar/util.c 2026-05-05 16:34:12.000000000 +0000 @@ -1640,6 +1640,7 @@ if (md_ctx) { EVP_MD_CTX_destroy(md_ctx); } + EVP_PKEY_free(key); if (error) { spprintf(error, 0, "openssl signature could not be verified"); } @@ -1954,7 +1955,7 @@ if (!EVP_SignInit(md_ctx, mdtype)) { EVP_PKEY_free(key); - EVP_MD_CTX_free(md_ctx); + EVP_MD_CTX_destroy(md_ctx); efree(sigbuf); if (error) { spprintf(error, 0, "unable to initialize openssl signature for phar \"%s\"", phar->fname); @@ -1965,7 +1966,7 @@ while ((sig_len = php_stream_read(fp, (char*)buf, sizeof(buf))) > 0) { if (!EVP_SignUpdate(md_ctx, buf, sig_len)) { EVP_PKEY_free(key); - EVP_MD_CTX_free(md_ctx); + EVP_MD_CTX_destroy(md_ctx); efree(sigbuf); if (error) { spprintf(error, 0, "unable to update the openssl signature for phar \"%s\"", phar->fname); @@ -1976,7 +1977,7 @@ if (!EVP_SignFinal (md_ctx, sigbuf, &siglen, key)) { EVP_PKEY_free(key); - EVP_MD_CTX_free(md_ctx); + EVP_MD_CTX_destroy(md_ctx); efree(sigbuf); if (error) { spprintf(error, 0, "unable to write phar \"%s\" with requested openssl signature", phar->fname); @@ -1986,7 +1987,7 @@ sigbuf[siglen] = '\0'; EVP_PKEY_free(key); - EVP_MD_CTX_free(md_ctx); + EVP_MD_CTX_destroy(md_ctx); #else size_t siglen; sigbuf = NULL; diff -Nru php8.4-8.4.16/ext/phar/zip.c php8.4-8.4.21/ext/phar/zip.c --- php8.4-8.4.16/ext/phar/zip.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/phar/zip.c 2026-05-05 16:34:12.000000000 +0000 @@ -864,7 +864,7 @@ } if (entry->is_deleted) { - if (entry->fp_refcount <= 0) { + if (entry->fp_refcount <= 0 && entry->fileinfo_lock_count == 0) { return ZEND_HASH_APPLY_REMOVE; } else { /* we can't delete this in-memory until it is closed */ diff -Nru php8.4-8.4.16/ext/posix/posix.c php8.4-8.4.21/ext/posix/posix.c --- php8.4-8.4.16/ext/posix/posix.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/posix/posix.c 2026-05-05 16:34:12.000000000 +0000 @@ -678,7 +678,8 @@ for (count = 0;; count++) { /* gr_mem entries may be misaligned on macos. */ char *gr_mem; - memcpy(&gr_mem, &g->gr_mem[count], sizeof(char *)); + char *entry = (char *)g->gr_mem + (count * sizeof (char *)); + memcpy(&gr_mem, entry, sizeof(char *)); if (!gr_mem) { break; } diff -Nru php8.4-8.4.16/ext/random/engine_mt19937.c php8.4-8.4.21/ext/random/engine_mt19937.c --- php8.4-8.4.16/ext/random/engine_mt19937.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/random/engine_mt19937.c 2026-05-05 16:34:12.000000000 +0000 @@ -392,11 +392,11 @@ if (engine->engine.algo->serialize) { array_init(&t); + zend_hash_str_add(Z_ARR_P(return_value), "__states", strlen("__states"), &t); if (!engine->engine.algo->serialize(engine->engine.state, Z_ARRVAL(t))) { zend_throw_exception(NULL, "Engine serialize failed", 0); RETURN_THROWS(); } - zend_hash_str_add(Z_ARR_P(return_value), "__states", strlen("__states"), &t); } } /* }}} */ diff -Nru php8.4-8.4.16/ext/random/engine_xoshiro256starstar.c php8.4-8.4.21/ext/random/engine_xoshiro256starstar.c --- php8.4-8.4.16/ext/random/engine_xoshiro256starstar.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/random/engine_xoshiro256starstar.c 2026-05-05 16:34:12.000000000 +0000 @@ -151,6 +151,10 @@ } } + if (UNEXPECTED(s->state[0] == 0 && s->state[1] == 0 && s->state[2] == 0 && s->state[3] == 0)) { + return false; + } + return true; } diff -Nru php8.4-8.4.16/ext/random/tests/02_engine/xoshiro256starstar_unserialize_zero_state.phpt php8.4-8.4.21/ext/random/tests/02_engine/xoshiro256starstar_unserialize_zero_state.phpt --- php8.4-8.4.16/ext/random/tests/02_engine/xoshiro256starstar_unserialize_zero_state.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/random/tests/02_engine/xoshiro256starstar_unserialize_zero_state.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,14 @@ +--TEST-- +GH-21731: Xoshiro256StarStar::__unserialize() must reject the all-zero state +--FILE-- +getMessage(), PHP_EOL; +} + +?> +--EXPECT-- +Invalid serialization data for Random\Engine\Xoshiro256StarStar object diff -Nru php8.4-8.4.16/ext/readline/readline.c php8.4-8.4.21/ext/readline/readline.c --- php8.4-8.4.16/ext/readline/readline.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/readline/readline.c 2026-05-05 16:34:12.000000000 +0000 @@ -47,6 +47,11 @@ static zval _readline_completion; static zval _readline_array; +ZEND_TLS char *php_readline_custom_readline_name = NULL; +#if defined(PHP_WIN32) || defined(HAVE_LIBEDIT) +ZEND_TLS char *php_readline_custom_line_buffer = NULL; +#endif + PHP_MINIT_FUNCTION(readline); PHP_MSHUTDOWN_FUNCTION(readline); PHP_RSHUTDOWN_FUNCTION(readline); @@ -146,7 +151,6 @@ zend_string *what = NULL; zval *value = NULL; size_t oldval; - char *oldstr; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|S!z!", &what, &value) == FAILURE) { RETURN_THROWS(); @@ -181,35 +185,29 @@ add_assoc_long(return_value,"attempted_completion_over",rl_attempted_completion_over); } else { if (zend_string_equals_literal_ci(what,"line_buffer")) { - oldstr = strdup(rl_line_buffer ? rl_line_buffer : ""); + RETVAL_STRING(SAFE_STRING(rl_line_buffer)); if (value) { if (!try_convert_to_string(value)) { RETURN_THROWS(); } + /* XXX: These stores would need to be atomic ideally or use a memory barrier */ #if !defined(PHP_WIN32) && !defined(HAVE_LIBEDIT) - if (!rl_line_buffer) { - rl_line_buffer = malloc(Z_STRLEN_P(value) + 1); - } else if (strlen(oldstr) < Z_STRLEN_P(value)) { - rl_extend_line_buffer(Z_STRLEN_P(value) + 1); - free(oldstr); - oldstr = strdup(rl_line_buffer ? rl_line_buffer : ""); + rl_extend_line_buffer(Z_STRLEN_P(value) + 1); + if (EXPECTED(rl_line_buffer)) { + memcpy(rl_line_buffer, Z_STRVAL_P(value), Z_STRLEN_P(value) + 1); } - memcpy(rl_line_buffer, Z_STRVAL_P(value), Z_STRLEN_P(value) + 1); #else - char *tmp = strdup(Z_STRVAL_P(value)); - if (tmp) { - if (rl_line_buffer) { - free(rl_line_buffer); - } - rl_line_buffer = tmp; + char *copy = strdup(Z_STRVAL_P(value)); + rl_line_buffer = copy; + if (php_readline_custom_line_buffer) { + free(php_readline_custom_line_buffer); } + php_readline_custom_line_buffer = copy; #endif #if !defined(PHP_WIN32) rl_end = Z_STRLEN_P(value); #endif } - RETVAL_STRING(SAFE_STRING(oldstr)); - free(oldstr); } else if (zend_string_equals_literal_ci(what, "point")) { RETVAL_LONG(rl_point); #ifndef PHP_WIN32 @@ -268,15 +266,19 @@ RETVAL_STRING((char *)SAFE_STRING(rl_library_version)); #endif } else if (zend_string_equals_literal_ci(what, "readline_name")) { - oldstr = (char*)rl_readline_name; + RETVAL_STRING(SAFE_STRING(rl_readline_name)); if (value) { - /* XXX if (rl_readline_name) free(rl_readline_name); */ if (!try_convert_to_string(value)) { RETURN_THROWS(); } - rl_readline_name = strdup(Z_STRVAL_P(value)); + char *copy = strdup(Z_STRVAL_P(value)); + /* XXX: This store would need to be atomic ideally or use a memory barrier */ + rl_readline_name = copy; + if (php_readline_custom_readline_name) { + free(php_readline_custom_readline_name); + } + php_readline_custom_readline_name = copy; } - RETVAL_STRING(SAFE_STRING(oldstr)); } else if (zend_string_equals_literal_ci(what, "attempted_completion_over")) { oldval = rl_attempted_completion_over; if (value) { diff -Nru php8.4-8.4.16/ext/readline/tests/gh18139.phpt php8.4-8.4.21/ext/readline/tests/gh18139.phpt --- php8.4-8.4.16/ext/readline/tests/gh18139.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/readline/tests/gh18139.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,18 @@ +--TEST-- +GH-18139 (Memory leak when overriding some settings via readline_info()) +--EXTENSIONS-- +readline +--FILE-- + +--EXPECTF-- +string(%d) "%S" +string(5) "first" +string(%d) "%S" +string(5) "third" diff -Nru php8.4-8.4.16/ext/session/mod_user.c php8.4-8.4.21/ext/session/mod_user.c --- php8.4-8.4.16/ext/session/mod_user.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/session/mod_user.c 2026-05-05 16:34:12.000000000 +0000 @@ -218,6 +218,7 @@ /* Anything else is some kind of error */ *nrdels = -1; // Error } + zval_ptr_dtor(&retval); return *nrdels; } diff -Nru php8.4-8.4.16/ext/session/tests/user_session_module/gh_gc_retval_leak.phpt php8.4-8.4.21/ext/session/tests/user_session_module/gh_gc_retval_leak.phpt --- php8.4-8.4.16/ext/session/tests/user_session_module/gh_gc_retval_leak.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/session/tests/user_session_module/gh_gc_retval_leak.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,33 @@ +--TEST-- +session_gc(): user handler returning non-bool/non-int does not leak memory +--INI-- +session.gc_probability=0 +session.save_handler=files +--EXTENSIONS-- +session +--FILE-- + +--EXPECTF-- + +Deprecated: session_set_save_handler(): Providing individual callbacks instead of an object implementing SessionHandlerInterface is deprecated in %s on line %d +bool(false) diff -Nru php8.4-8.4.16/ext/snmp/snmp.c php8.4-8.4.21/ext/snmp/snmp.c --- php8.4-8.4.16/ext/snmp/snmp.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/snmp/snmp.c 2026-05-05 16:34:12.000000000 +0000 @@ -959,7 +959,7 @@ /* }}} */ /* {{{ Set the authentication protocol in the snmpv3 session */ -static bool netsnmp_session_set_auth_protocol(struct snmp_session *s, zend_string *prot) +static ZEND_ATTRIBUTE_NONNULL bool netsnmp_session_set_auth_protocol(struct snmp_session *s, zend_string *prot) { #ifndef DISABLE_MD5 if (zend_string_equals_literal_ci(prot, "MD5")) { @@ -1011,7 +1011,7 @@ /* }}} */ /* {{{ Set the security protocol in the snmpv3 session */ -static bool netsnmp_session_set_sec_protocol(struct snmp_session *s, zend_string *prot) +static ZEND_ATTRIBUTE_NONNULL bool netsnmp_session_set_sec_protocol(struct snmp_session *s, zend_string *prot) { #ifndef NETSNMP_DISABLE_DES if (zend_string_equals_literal_ci(prot, "DES")) { @@ -1048,9 +1048,10 @@ /* }}} */ /* {{{ Make key from pass phrase in the snmpv3 session */ -static bool netsnmp_session_gen_auth_key(struct snmp_session *s, zend_string *pass) +static ZEND_ATTRIBUTE_NONNULL bool netsnmp_session_gen_auth_key(struct snmp_session *s, zend_string *pass) { int snmp_errno; + s->securityAuthKeyLen = USM_AUTH_KU_LEN; if ((snmp_errno = generate_Ku(s->securityAuthProto, s->securityAuthProtoLen, (uint8_t *) ZSTR_VAL(pass), ZSTR_LEN(pass), @@ -1063,7 +1064,7 @@ /* }}} */ /* {{{ Make key from pass phrase in the snmpv3 session */ -static bool netsnmp_session_gen_sec_key(struct snmp_session *s, zend_string *pass) +static ZEND_ATTRIBUTE_NONNULL bool netsnmp_session_gen_sec_key(struct snmp_session *s, zend_string *pass) { int snmp_errno; @@ -1102,9 +1103,10 @@ /* }}} */ /* {{{ Set all snmpv3-related security options */ -static bool netsnmp_session_set_security(struct snmp_session *session, zend_string *sec_level, +static ZEND_ATTRIBUTE_NONNULL_ARGS(2) bool netsnmp_session_set_security(struct snmp_session *session, zend_string *sec_level, zend_string *auth_protocol, zend_string *auth_passphrase, zend_string *priv_protocol, - zend_string *priv_passphrase, zend_string *contextName, zend_string *contextEngineID) + zend_string *priv_passphrase, zend_string *contextName, zend_string *contextEngineID, + uint32_t auth_protocol_argnum) { /* Setting the security level. */ @@ -1115,12 +1117,22 @@ if (session->securityLevel == SNMP_SEC_LEVEL_AUTHNOPRIV || session->securityLevel == SNMP_SEC_LEVEL_AUTHPRIV) { + if (!auth_protocol) { + zend_argument_value_error(auth_protocol_argnum, "cannot be null when security level is \"authNoPriv\" or \"authPriv\""); + return false; + } + /* Setting the authentication protocol. */ if (!netsnmp_session_set_auth_protocol(session, auth_protocol)) { /* ValueError already generated, just bail out */ return false; } + if (!auth_passphrase) { + zend_argument_value_error(auth_protocol_argnum + 1, "cannot be null when security level is \"authNoPriv\" or \"authPriv\""); + return false; + } + /* Setting the authentication passphrase. */ if (!netsnmp_session_gen_auth_key(session, auth_passphrase)) { /* Warning message sent already, just bail out */ @@ -1128,12 +1140,23 @@ } if (session->securityLevel == SNMP_SEC_LEVEL_AUTHPRIV) { + + if (!priv_protocol) { + zend_argument_value_error(auth_protocol_argnum + 2, "cannot be null when security level is \"authPriv\""); + return false; + } + /* Setting the security protocol. */ if (!netsnmp_session_set_sec_protocol(session, priv_protocol)) { /* ValueError already generated, just bail out */ return false; } + if (!priv_passphrase) { + zend_argument_value_error(auth_protocol_argnum + 3, "cannot be null when security level is \"authPriv\""); + return false; + } + /* Setting the security protocol passphrase. */ if (!netsnmp_session_gen_sec_key(session, priv_passphrase)) { /* Warning message sent already, just bail out */ @@ -1294,7 +1317,7 @@ netsnmp_session_free(&session); RETURN_FALSE; } - if (version == SNMP_VERSION_3 && !netsnmp_session_set_security(session, a3, a4, a5, a6, a7, NULL, NULL)) { + if (version == SNMP_VERSION_3 && !netsnmp_session_set_security(session, a3, a4, a5, a6, a7, NULL, NULL, 4)) { php_free_objid_query(&objid_query, oid_ht, value_ht, st); netsnmp_session_free(&session); /* Warning message sent already, just bail out */ @@ -1669,7 +1692,7 @@ RETURN_THROWS(); } - if (!netsnmp_session_set_security(snmp_object->session, a1, a2, a3, a4, a5, a6, a7)) { + if (!netsnmp_session_set_security(snmp_object->session, a1, a2, a3, a4, a5, a6, a7, 2)) { /* Warning message sent already, just bail out */ RETURN_FALSE; } diff -Nru php8.4-8.4.16/ext/snmp/tests/gh21336.phpt php8.4-8.4.21/ext/snmp/tests/gh21336.phpt --- php8.4-8.4.16/ext/snmp/tests/gh21336.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/snmp/tests/gh21336.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,41 @@ +--TEST-- +GH-21336 (undefined behavior in snmp - NULL pointer dereference in setSecurity) +--EXTENSIONS-- +snmp +--FILE-- +setSecurity('authPriv'); +} catch (ValueError $e) { + echo $e->getMessage() . PHP_EOL; +} + +// auth passphrase NULL +try { + $session->setSecurity('authNoPriv', 'MD5'); +} catch (ValueError $e) { + echo $e->getMessage() . PHP_EOL; +} + +// priv protocol NULL +try { + $session->setSecurity('authPriv', 'MD5', 'test12345'); +} catch (ValueError $e) { + echo $e->getMessage() . PHP_EOL; +} + +// priv passphrase NULL +try { + $session->setSecurity('authPriv', 'MD5', 'test12345', 'AES'); +} catch (ValueError $e) { + echo $e->getMessage() . PHP_EOL; +} +?> +--EXPECT-- +SNMP::setSecurity(): Argument #2 ($authProtocol) cannot be null when security level is "authNoPriv" or "authPriv" +SNMP::setSecurity(): Argument #3 ($authPassphrase) cannot be null when security level is "authNoPriv" or "authPriv" +SNMP::setSecurity(): Argument #4 ($privacyProtocol) cannot be null when security level is "authPriv" +SNMP::setSecurity(): Argument #5 ($privacyPassphrase) cannot be null when security level is "authPriv" diff -Nru php8.4-8.4.16/ext/soap/php_encoding.c php8.4-8.4.21/ext/soap/php_encoding.c --- php8.4-8.4.16/ext/soap/php_encoding.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/soap/php_encoding.c 2026-05-05 16:34:12.000000000 +0000 @@ -374,6 +374,7 @@ static void soap_add_xml_ref(zval *data, xmlNodePtr node) { if (SOAP_GLOBAL(ref_map)) { + Z_TRY_ADDREF_P(data); zend_hash_index_update(SOAP_GLOBAL(ref_map), (zend_ulong)node, data); } } @@ -2534,19 +2535,20 @@ xmlNsPtr nsptr; parse_namespace(attr->children->content, &type, &ns); + char *type_dup = estrdup(type); nsptr = xmlSearchNs(attr->doc, attr->parent, BAD_CAST(ns)); - end = strrchr(type,'['); + end = strrchr(type_dup,'['); if (end) { *end = '\0'; dimension = calc_dimension(end+1); dims = get_position(dimension, end+1); } if (nsptr != NULL) { - enc = get_encoder(SOAP_GLOBAL(sdl), (char*)nsptr->href, type); + enc = get_encoder(SOAP_GLOBAL(sdl), (char*)nsptr->href, type_dup); } if (ns) {efree(ns);} - + if (type_dup) efree(type_dup); } else if ((attr = get_attribute(data->properties,"itemType")) && attr->children && attr->children->content) { @@ -2795,7 +2797,7 @@ } xmlValue = get_node(item->children, "value"); - if (!xmlKey) { + if (!xmlValue) { soap_error0(E_ERROR, "Encoding: Can't decode apache map, missing value"); } @@ -3539,7 +3541,7 @@ } else { SOAP_GLOBAL(ref_map) = emalloc(sizeof(HashTable)); } - zend_hash_init(SOAP_GLOBAL(ref_map), 0, NULL, NULL, 0); + zend_hash_init(SOAP_GLOBAL(ref_map), 0, NULL, ZVAL_PTR_DTOR, 0); } void encode_finish(void) diff -Nru php8.4-8.4.16/ext/soap/php_http.c php8.4-8.4.21/ext/soap/php_http.c --- php8.4-8.4.16/ext/soap/php_http.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/soap/php_http.c 2026-05-05 16:34:12.000000000 +0000 @@ -1010,23 +1010,23 @@ char *sempos = strstr(cookie, ";"); if (eqpos != NULL && (sempos == NULL || sempos > eqpos)) { smart_str name = {0}; - int cookie_len; zval zcookie; + size_t cookie_value_len; if (sempos != NULL) { - cookie_len = sempos-(eqpos+1); + cookie_value_len = sempos-(eqpos+1); } else { - cookie_len = strlen(cookie)-(eqpos-cookie)-1; + cookie_value_len = strlen(cookie)-(eqpos-cookie)-1; } smart_str_appendl(&name, cookie, eqpos - cookie); smart_str_0(&name); array_init(&zcookie); - add_index_stringl(&zcookie, 0, eqpos + 1, cookie_len); + add_index_stringl(&zcookie, 0, eqpos + 1, cookie_value_len); if (sempos != NULL) { - char *options = cookie + cookie_len+1; + char *options = sempos + 1; while (*options) { while (*options == ' ') {options++;} sempos = strstr(options, ";"); diff -Nru php8.4-8.4.16/ext/soap/soap.c php8.4-8.4.21/ext/soap/soap.c --- php8.4-8.4.16/ext/soap/soap.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/soap/soap.c 2026-05-05 16:34:12.000000000 +0000 @@ -1551,12 +1551,20 @@ instanceof_function(Z_OBJCE(h->retval), soap_fault_class_entry)) { php_output_discard(); soap_server_fault_ex(function, &h->retval, h); - if (service->type == SOAP_CLASS && soap_obj) {zval_ptr_dtor(soap_obj);} + if (service->type == SOAP_CLASS && soap_obj) { + if (service->soap_class.persistence != SOAP_PERSISTENCE_SESSION) { + zval_ptr_dtor(soap_obj); + } + } goto fail; } else if (EG(exception)) { php_output_discard(); _soap_server_exception(service, function, ZEND_THIS); - if (service->type == SOAP_CLASS && soap_obj) {zval_ptr_dtor(soap_obj);} + if (service->type == SOAP_CLASS && soap_obj) { + if (service->soap_class.persistence != SOAP_PERSISTENCE_SESSION) { + zval_ptr_dtor(soap_obj); + } + } goto fail; } } else if (h->mustUnderstand) { diff -Nru php8.4-8.4.16/ext/soap/tests/GHSA-85c2-q967-79q5.phpt php8.4-8.4.21/ext/soap/tests/GHSA-85c2-q967-79q5.phpt --- php8.4-8.4.16/ext/soap/tests/GHSA-85c2-q967-79q5.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/soap/tests/GHSA-85c2-q967-79q5.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,61 @@ +--TEST-- +GHSA-85c2-q967-79q5: Stale SOAP_GLOBAL(ref_map) pointer with Apache Map +--CREDITS-- +brettgervasoni +--EXTENSIONS-- +soap +--FILE-- + + + + + + + + foo + bar + + + foo + baz + + + + + + +XML; + +$s = new SoapServer(null, ['uri' => 'urn:a']); +$s->setClass(Handler::class); +$s->handle($envelope); +var_dump($result); + +?> +--EXPECTF-- + + +array(2) { + [0]=> + array(1) { + ["foo"]=> + string(3) "baz" + } + [1]=> + object(stdClass)#%d (1) { + ["object"]=> + string(3) "bar" + } +} diff -Nru php8.4-8.4.16/ext/soap/tests/GHSA-hmxp-6pc4-f3vv.phpt php8.4-8.4.21/ext/soap/tests/GHSA-hmxp-6pc4-f3vv.phpt --- php8.4-8.4.16/ext/soap/tests/GHSA-hmxp-6pc4-f3vv.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/soap/tests/GHSA-hmxp-6pc4-f3vv.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,39 @@ +--TEST-- +GHSA-hmxp-6pc4-f3vv: Null pointer dereference on missing Apache map value +--CREDITS-- +Ilia Alshanetsky (iliaal) +--EXTENSIONS-- +soap +--FILE-- + + + + + + + hello + + + + +XML; + +$server = new SoapServer(null, [ + 'uri' => 'urn:test', + 'typemap' => [['type_name' => 'anything']], +]); +$server->addFunction('test'); +function test($m) { return null; } +$server->handle($request); + +?> +--EXPECT-- + +SOAP-ENV:ServerSOAP-ERROR: Encoding: Can't decode apache map, missing value diff -Nru php8.4-8.4.16/ext/soap/tests/GHSA-m33r-qmcv-p97q.phpt php8.4-8.4.21/ext/soap/tests/GHSA-m33r-qmcv-p97q.phpt --- php8.4-8.4.16/ext/soap/tests/GHSA-m33r-qmcv-p97q.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/soap/tests/GHSA-m33r-qmcv-p97q.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,58 @@ +--TEST-- +GHSA-m33r-qmcv-p97q: Use-after-free after header parsing failure with SOAP_PERSISTENCE_SESSION +--CREDITS-- +Ilia Alshanetsky (iliaal) +--EXTENSIONS-- +soap +session +--FILE-- + 'urn:a']); +$srv->setClass(Handler::class); +$srv->setPersistence(SOAP_PERSISTENCE_SESSION); + +$srv->handle(<< + + + + + + + + +XML); + +$srv->handle(<< + + + + + + + + +XML); + +?> +--EXPECT-- + +SOAP-ENV:Serverdenied + +SOAP-ENV:Serverdenied diff -Nru php8.4-8.4.16/ext/soap/tests/bugs/cookie_parse_options_offset.phpt php8.4-8.4.21/ext/soap/tests/bugs/cookie_parse_options_offset.phpt --- php8.4-8.4.16/ext/soap/tests/bugs/cookie_parse_options_offset.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/soap/tests/bugs/cookie_parse_options_offset.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,61 @@ +--TEST-- +SOAP Set-Cookie option parsing starts at wrong offset due to variable shadowing +--EXTENSIONS-- +soap +--SKIPIF-- + +--FILE-- + + + + + + +XML; +PHP; + +php_cli_server_start($code, null, $args); + +$client = new SoapClient(null, [ + 'location' => 'http://' . PHP_CLI_SERVER_ADDRESS . '/test/endpoint', + 'uri' => 'test-uri', + 'trace' => true, +]); + +try { + $client->__soapCall("test", []); +} catch (SoapFault $e) { + // Response parsing may fault, cookies are still stored +} + +$cookies = $client->__getCookies(); + +// path should default to "/test" from the request URI, not "/evil" from the value. +echo "value: " . $cookies['sessionkey'][0] . "\n"; +echo "path: " . $cookies['sessionkey'][1] . "\n"; +echo "domain: " . $cookies['sessionkey'][2] . "\n"; +?> +--EXPECT-- +value: path=/evil +path: /test +domain: good.com diff -Nru php8.4-8.4.16/ext/soap/tests/soap_qname_crash.phpt php8.4-8.4.21/ext/soap/tests/soap_qname_crash.phpt --- php8.4-8.4.16/ext/soap/tests/soap_qname_crash.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/soap/tests/soap_qname_crash.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -4,6 +4,7 @@ soap --SKIPIF-- --INI-- diff -Nru php8.4-8.4.16/ext/sockets/conversions.c php8.4-8.4.21/ext/sockets/conversions.c --- php8.4-8.4.16/ext/sockets/conversions.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/sockets/conversions.c 2026-05-05 16:34:12.000000000 +0000 @@ -611,7 +611,7 @@ } else { /* error already emitted, but let's emit another more relevant */ do_from_zval_err(ctx, "could not resolve address '%s' to get an AF_INET6 " - "address", Z_STRVAL_P(zaddr_str)); + "address", ZSTR_VAL(addr_str)); } zend_tmp_string_release(tmp_addr_str); diff -Nru php8.4-8.4.16/ext/sockets/sockets.c php8.4-8.4.21/ext/sockets/sockets.c --- php8.4-8.4.16/ext/sockets/sockets.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/sockets/sockets.c 2026-05-05 16:34:12.000000000 +0000 @@ -1584,6 +1584,12 @@ switch (php_sock->type) { case AF_UNIX: memset(&s_un, 0, sizeof(s_un)); + + if (addr_len >= sizeof(s_un.sun_path)) { + zend_argument_value_error(5, "must be less than %d", sizeof(s_un.sun_path)); + RETURN_THROWS(); + } + s_un.sun_family = AF_UNIX; snprintf(s_un.sun_path, sizeof(s_un.sun_path), "%s", addr); diff -Nru php8.4-8.4.16/ext/sockets/tests/gh21161.phpt php8.4-8.4.21/ext/sockets/tests/gh21161.phpt --- php8.4-8.4.16/ext/sockets/tests/gh21161.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/sockets/tests/gh21161.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,19 @@ +--TEST-- +GH-21161 (IPV6_PKTINFO socket option crash with null addr array entry) +--EXTENSIONS-- +sockets +--SKIPIF-- + +--FILE-- + null, 'ifindex' => 0]); +?> +--EXPECTF-- +Warning: socket_set_option(): Host lookup failed [%i]: %s on line %d + +Warning: socket_set_option(): error converting user data (path: in6_pktinfo > addr): could not resolve address '' to get an AF_INET6 address in %s on line %d diff -Nru php8.4-8.4.16/ext/sockets/tests/socket_sendto_unix_addr_too_long.phpt php8.4-8.4.21/ext/sockets/tests/socket_sendto_unix_addr_too_long.phpt --- php8.4-8.4.16/ext/sockets/tests/socket_sendto_unix_addr_too_long.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/sockets/tests/socket_sendto_unix_addr_too_long.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,29 @@ +--TEST-- +socket_sendto() with AF_UNIX rejects address exceeding sun_path limit +--EXTENSIONS-- +sockets +--SKIPIF-- + +--FILE-- +getMessage() . PHP_EOL; +} + +socket_close($socket); +?> +--EXPECTF-- +socket_sendto(): Argument #5 ($address) must be less than %d diff -Nru php8.4-8.4.16/ext/sodium/libsodium.c php8.4-8.4.21/ext/sodium/libsodium.c --- php8.4-8.4.16/ext/sodium/libsodium.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/sodium/libsodium.c 2026-05-05 16:34:12.000000000 +0000 @@ -2603,7 +2603,7 @@ RETURN_THROWS(); } if (p_len != crypto_scalarmult_BYTES) { - zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_SCALARMULT_SCALARBYTES bytes long"); + zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_SCALARMULT_BYTES bytes long"); RETURN_THROWS(); } q = zend_string_alloc(crypto_scalarmult_BYTES, 0); @@ -2674,7 +2674,7 @@ zend_argument_error(sodium_exception_ce, 1, "must not be zero", 0); RETURN_THROWS(); } - ZSTR_VAL(q)[crypto_scalarmult_BYTES] = 0; + ZSTR_VAL(q)[crypto_scalarmult_ristretto255_BYTES] = 0; RETURN_NEW_STR(q); } @@ -3214,7 +3214,7 @@ RETURN_THROWS(); } if (key_len != crypto_kdf_KEYBYTES) { - zend_argument_error(sodium_exception_ce, 4, "must be SODIUM_CRYPTO_KDF_BYTES_MIN bytes long"); + zend_argument_error(sodium_exception_ce, 4, "must be SODIUM_CRYPTO_KDF_KEYBYTES bytes long"); RETURN_THROWS(); } memcpy(ctx_padded, ctx, crypto_kdf_CONTEXTBYTES); diff -Nru php8.4-8.4.16/ext/spl/spl_array.c php8.4-8.4.21/ext/spl/spl_array.c --- php8.4-8.4.16/ext/spl/spl_array.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/spl/spl_array.c 2026-05-05 16:34:12.000000000 +0000 @@ -44,8 +44,6 @@ uint32_t ht_iter; int ar_flags; unsigned char nApplyCount; - bool is_child; - Bucket *bucket; zend_function *fptr_offset_get; zend_function *fptr_offset_set; zend_function *fptr_offset_has; @@ -166,8 +164,6 @@ object_properties_init(&intern->std, class_type); intern->ar_flags = 0; - intern->is_child = false; - intern->bucket = NULL; intern->ce_get_iterator = spl_ce_ArrayIterator; if (orig) { spl_array_object *other = spl_array_from_obj(orig); @@ -464,22 +460,6 @@ return spl_array_read_dimension_ex(1, object, offset, type, rv); } /* }}} */ -/* - * The assertion(HT_ASSERT_RC1(ht)) failed because the refcount was increased manually when intern->is_child is true. - * We have to set the refcount to 1 to make assertion success and restore the refcount to the original value after - * modifying the array when intern->is_child is true. - */ -static uint32_t spl_array_set_refcount(bool is_child, HashTable *ht, uint32_t refcount) /* {{{ */ -{ - uint32_t old_refcount = 0; - if (is_child) { - old_refcount = GC_REFCOUNT(ht); - GC_SET_REFCOUNT(ht, refcount); - } - - return old_refcount; -} /* }}} */ - static void spl_array_write_dimension_ex(int check_inherited, zend_object *object, zval *offset, zval *value) /* {{{ */ { spl_array_object *intern = spl_array_from_obj(object); @@ -503,19 +483,12 @@ } Z_TRY_ADDREF_P(value); - - uint32_t refcount = 0; if (!offset || Z_TYPE_P(offset) == IS_NULL) { ht = spl_array_get_hash_table(intern); if (UNEXPECTED(ht == intern->sentinel_array)) { return; } - refcount = spl_array_set_refcount(intern->is_child, ht, 1); zend_hash_next_index_insert(ht, value); - - if (refcount) { - spl_array_set_refcount(intern->is_child, ht, refcount); - } return; } @@ -530,17 +503,13 @@ spl_hash_key_release(&key); return; } - refcount = spl_array_set_refcount(intern->is_child, ht, 1); + if (key.key) { zend_hash_update_ind(ht, key.key, value); spl_hash_key_release(&key); } else { zend_hash_index_update(ht, key.h, value); } - - if (refcount) { - spl_array_set_refcount(intern->is_child, ht, refcount); - } } /* }}} */ static void spl_array_write_dimension(zend_object *object, zval *offset, zval *value) /* {{{ */ @@ -570,8 +539,6 @@ } ht = spl_array_get_hash_table(intern); - uint32_t refcount = spl_array_set_refcount(intern->is_child, ht, 1); - if (key.key) { zval *data = zend_hash_find(ht, key.key); if (data) { @@ -596,10 +563,6 @@ } else { zend_hash_index_del(ht, key.h); } - - if (refcount) { - spl_array_set_refcount(intern->is_child, ht, refcount); - } } /* }}} */ static void spl_array_unset_dimension(zend_object *object, zval *offset) /* {{{ */ @@ -973,15 +936,6 @@ } else { //??? TODO: try to avoid array duplication ZVAL_ARR(&intern->array, zend_array_dup(Z_ARR_P(array))); - - if (intern->is_child) { - Z_TRY_DELREF(intern->bucket->val); - /* - * replace bucket->val with copied array, so the changes between - * parent and child object can affect each other. - */ - ZVAL_COPY(&intern->bucket->val, &intern->array); - } } } else { if (Z_OBJ_HT_P(array) == &spl_handler_ArrayObject) { @@ -1854,15 +1808,6 @@ static void spl_instantiate_child_arg(zend_class_entry *pce, zval *retval, zval *arg1, zval *arg2) /* {{{ */ { object_init_ex(retval, pce); - spl_array_object *new_intern = Z_SPLARRAY_P(retval); - /* - * set new_intern->is_child is true to indicate that the object was created by - * RecursiveArrayIterator::getChildren() method. - */ - new_intern->is_child = true; - - /* find the bucket of parent object. */ - new_intern->bucket = (Bucket *)((char *)(arg1) - XtOffsetOf(Bucket, val));; zend_call_known_instance_method_with_2_params(pce->constructor, Z_OBJ_P(retval), NULL, arg1, arg2); } /* }}} */ diff -Nru php8.4-8.4.16/ext/spl/spl_directory.c php8.4-8.4.21/ext/spl/spl_directory.c --- php8.4-8.4.16/ext/spl/spl_directory.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/spl/spl_directory.c 2026-05-05 16:34:12.000000000 +0000 @@ -297,6 +297,11 @@ intern->type = SPL_FS_DIR; intern->u.dir.dirp = php_stream_opendir(ZSTR_VAL(path), REPORT_ERRORS, FG(default_context)); + if (intern->u.dir.dirp) { + /* we prevent potential UAF with conflicting explicit fclose(), relying on the object destructor for this */ + intern->u.dir.dirp->flags |= PHP_STREAM_FLAG_NO_FCLOSE; + } + if (ZSTR_LEN(path) > 1 && IS_SLASH_AT(ZSTR_VAL(path), ZSTR_LEN(path)-1)) { intern->path = zend_string_init(ZSTR_VAL(path), ZSTR_LEN(path)-1, 0); } else { diff -Nru php8.4-8.4.16/ext/spl/spl_dllist.c php8.4-8.4.21/ext/spl/spl_dllist.c --- php8.4-8.4.16/ext/spl/spl_dllist.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/spl/spl_dllist.c 2026-05-05 16:34:12.000000000 +0000 @@ -764,11 +764,10 @@ element = spl_ptr_llist_offset(intern->llist, index, intern->flags & SPL_DLLIST_IT_LIFO); if (element != NULL) { - /* connect the neightbors */ + /* disconnect the neighbours */ if (element->prev) { element->prev->next = element->next; } - if (element->next) { element->next->prev = element->prev; } @@ -782,6 +781,10 @@ llist->tail = element->prev; } + /* Keep consistency if element is kept alive. */ + element->prev = NULL; + element->next = NULL; + /* finally, delete the element */ llist->count--; diff -Nru php8.4-8.4.16/ext/spl/spl_heap.c php8.4-8.4.21/ext/spl/spl_heap.c --- php8.4-8.4.16/ext/spl/spl_heap.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/spl/spl_heap.c 2026-05-05 16:34:12.000000000 +0000 @@ -961,7 +961,7 @@ { spl_heap_object *object = Z_SPLHEAP_P(&iter->data); - if (UNEXPECTED(spl_heap_consistency_validations(object, false) != SUCCESS)) { + if (UNEXPECTED(spl_heap_consistency_validations(object, true) != SUCCESS)) { return; } @@ -992,6 +992,10 @@ RETURN_THROWS(); } + if (UNEXPECTED(spl_heap_consistency_validations(intern, true) != SUCCESS)) { + RETURN_THROWS(); + } + spl_ptr_heap_delete_top(intern->heap, NULL, ZEND_THIS); } /* }}} */ diff -Nru php8.4-8.4.16/ext/spl/spl_observer.c php8.4-8.4.21/ext/spl/spl_observer.c --- php8.4-8.4.16/ext/spl/spl_observer.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/spl/spl_observer.c 2026-05-05 16:34:12.000000000 +0000 @@ -240,11 +240,25 @@ return ret; } /* }}}*/ +/* TODO: make this an official Zend API? */ +#define SPL_SAFE_HASH_FOREACH_PTR(_ht, _ptr) do { \ + const HashTable *__ht = (_ht); \ + zval *_z = __ht->arPacked; \ + for (uint32_t _idx = 0; _idx < __ht->nNumUsed; _idx++, _z = ZEND_HASH_ELEMENT(__ht, _idx)) { \ + if (UNEXPECTED(Z_ISUNDEF_P(_z))) continue; \ + _ptr = Z_PTR_P(_z); + static void spl_object_storage_addall(spl_SplObjectStorage *intern, spl_SplObjectStorage *other) { /* {{{ */ spl_SplObjectStorageElement *element; - ZEND_HASH_FOREACH_PTR(&other->storage, element) { - spl_object_storage_attach(intern, element->obj, &element->inf); + SPL_SAFE_HASH_FOREACH_PTR(&other->storage, element) { + zval zv; + zend_object *obj = element->obj; + GC_ADDREF(obj); + ZVAL_COPY(&zv, &element->inf); + spl_object_storage_attach(intern, obj, &zv); + zval_ptr_dtor(&zv); + OBJ_RELEASE(obj); } ZEND_HASH_FOREACH_END(); intern->index = 0; @@ -626,10 +640,13 @@ other = Z_SPLOBJSTORAGE_P(obj); - ZEND_HASH_FOREACH_PTR(&intern->storage, element) { - if (!spl_object_storage_contains(other, element->obj)) { - spl_object_storage_detach(intern, element->obj); + SPL_SAFE_HASH_FOREACH_PTR(&intern->storage, element) { + zend_object *elem_obj = element->obj; + GC_ADDREF(elem_obj); + if (!spl_object_storage_contains(other, elem_obj)) { + spl_object_storage_detach(intern, elem_obj); } + OBJ_RELEASE(elem_obj); } ZEND_HASH_FOREACH_END(); zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos); diff -Nru php8.4-8.4.16/ext/spl/tests/SplObjectStorage/concurrent_deletion.phpt php8.4-8.4.21/ext/spl/tests/SplObjectStorage/concurrent_deletion.phpt --- php8.4-8.4.16/ext/spl/tests/SplObjectStorage/concurrent_deletion.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/spl/tests/SplObjectStorage/concurrent_deletion.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,46 @@ +--TEST-- +SplObjectStorage: Concurrent deletion during iteration +--CREDITS-- +cnitlrt +--FILE-- +removeAllExcept($other)); + +unset($victim, $other); +$victim = new SplObjectStorage(); +$other = new EvilStorage(); + +for ($i = 0; $i < 1024; $i++) { + $o = new stdClass(); + $victim[$o] = null; + $other[$o] = null; +} + +var_dump($other->addAll($victim)); +?> +--EXPECTF-- +int(%d) +int(1024) diff -Nru php8.4-8.4.16/ext/spl/tests/SplObjectStorage/concurrent_deletion_addall.phpt php8.4-8.4.21/ext/spl/tests/SplObjectStorage/concurrent_deletion_addall.phpt --- php8.4-8.4.16/ext/spl/tests/SplObjectStorage/concurrent_deletion_addall.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/spl/tests/SplObjectStorage/concurrent_deletion_addall.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,43 @@ +--TEST-- +SplObjectStorage: Concurrent deletion during addAll +--CREDITS-- +cnitlrt +--FILE-- +addAll($storage); + +var_dump($evil, $storage); + +?> +--EXPECTF-- +object(EvilStorage)#%d (1) { + ["storage":"SplObjectStorage":private]=> + array(1) { + [0]=> + array(2) { + ["obj"]=> + object(stdClass)#%d (0) { + } + ["inf"]=> + string(3) "foo" + } + } +} +object(SplObjectStorage)#%d (1) { + ["storage":"SplObjectStorage":private]=> + array(0) { + } +} diff -Nru php8.4-8.4.16/ext/spl/tests/SplObjectStorage/concurrent_deletion_removeexcept.phpt php8.4-8.4.21/ext/spl/tests/SplObjectStorage/concurrent_deletion_removeexcept.phpt --- php8.4-8.4.16/ext/spl/tests/SplObjectStorage/concurrent_deletion_removeexcept.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/spl/tests/SplObjectStorage/concurrent_deletion_removeexcept.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,35 @@ +--TEST-- +SplObjectStorage: Concurrent deletion during removeAllExcept +--CREDITS-- +cnitlrt +--FILE-- +removeAllExcept($evil); + +var_dump($evil, $storage); + +?> +--EXPECTF-- +object(EvilStorage)#%d (1) { + ["storage":"SplObjectStorage":private]=> + array(0) { + } +} +object(SplObjectStorage)#%d (1) { + ["storage":"SplObjectStorage":private]=> + array(0) { + } +} diff -Nru php8.4-8.4.16/ext/spl/tests/bug42654.phpt php8.4-8.4.21/ext/spl/tests/bug42654.phpt --- php8.4-8.4.16/ext/spl/tests/bug42654.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/spl/tests/bug42654.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -110,11 +110,11 @@ [2]=> array(2) { [2]=> - string(5) "alter" + string(4) "val2" [3]=> array(1) { [3]=> - string(5) "alter" + string(4) "val3" } } [4]=> @@ -129,11 +129,11 @@ [2]=> array(2) { [2]=> - string(5) "alter" + string(4) "val2" [3]=> array(1) { [3]=> - string(5) "alter" + string(4) "val3" } } [4]=> @@ -146,11 +146,11 @@ [2]=> array(2) { [2]=> - string(5) "alter" + string(4) "val2" [3]=> array(1) { [3]=> - string(5) "alter" + string(4) "val3" } } [4]=> diff -Nru php8.4-8.4.16/ext/spl/tests/bug42654_2.phpt php8.4-8.4.21/ext/spl/tests/bug42654_2.phpt --- php8.4-8.4.16/ext/spl/tests/bug42654_2.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/spl/tests/bug42654_2.phpt 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ ---TEST-- -Bug #42654 (RecursiveIteratorIterator modifies only part of leaves) ---FILE-- - 'val1', array('key2' => 'val2'), 'key3' => 'val3'); - -$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($data)); -foreach($iterator as $foo) { - $key = $iterator->key(); - switch($key) { - case 'key1': // first level - case 'key2': // recursive level - echo "update $key".PHP_EOL; - $iterator->offsetSet($key, 'alter'); - } -} -$copy = $iterator->getArrayCopy(); -var_dump($copy); -?> ---EXPECT-- -update key1 -update key2 -array(3) { - ["key1"]=> - string(5) "alter" - [0]=> - array(1) { - ["key2"]=> - string(5) "alter" - } - ["key3"]=> - string(4) "val3" -} diff -Nru php8.4-8.4.16/ext/spl/tests/gh10519.phpt php8.4-8.4.21/ext/spl/tests/gh10519.phpt --- php8.4-8.4.16/ext/spl/tests/gh10519.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/spl/tests/gh10519.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,7 @@ --TEST-- Bug GH-10519 (Array Data Address Reference Issue) +--XFAIL-- +The fix for this was bad --FILE-- +--EXPECTF-- + +Warning: fclose(): %d is not a valid stream resource in %s on line %d diff -Nru php8.4-8.4.16/ext/spl/tests/gh20856.phpt php8.4-8.4.21/ext/spl/tests/gh20856.phpt --- php8.4-8.4.16/ext/spl/tests/gh20856.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/spl/tests/gh20856.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,26 @@ +--TEST-- +GH-20856 (heap-use-after-free in SplDoublyLinkedList iterator when modifying during iteration) +--CREDITS-- +vi3tL0u1s +iluuu1994 +--FILE-- + +--EXPECTF-- +object(SplStack)#%d (%d) { + ["flags":"SplDoublyLinkedList":private]=> + int(6) + ["dllist":"SplDoublyLinkedList":private]=> + array(0) { + } +} diff -Nru php8.4-8.4.16/ext/spl/tests/gh21499.phpt php8.4-8.4.21/ext/spl/tests/gh21499.phpt --- php8.4-8.4.16/ext/spl/tests/gh21499.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/spl/tests/gh21499.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,17 @@ +--TEST-- +GH-21499 (RecursiveArrayIterator getChildren UAF after parent free) +--FILE-- +getChildren(); +unset($it); +$child->__construct([2, 3]); +var_dump($child->getArrayCopy()); +?> +--EXPECT-- +array(2) { + [0]=> + int(2) + [1]=> + int(3) +} diff -Nru php8.4-8.4.16/ext/spl/tests/heap_next_write_lock.phpt php8.4-8.4.21/ext/spl/tests/heap_next_write_lock.phpt --- php8.4-8.4.16/ext/spl/tests/heap_next_write_lock.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/spl/tests/heap_next_write_lock.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,34 @@ +--TEST-- +SplHeap::next() write lock +--CREDITS-- +cnitlrt +--FILE-- +did) { + $this->did = true; + // Re-entrant write during internal heap insertion comparison. + if (!$this->isEmpty()) { + $this->next(); // no write-lock validation + } + } + return parent::compare($p1, $p2); + } +} + +$q = new EvilPQ(); +try { + for ($i = 0; $i < 200; $i++) { + $q->insert("d$i", 100 - $i); + } +} catch (RuntimeException $e) { + echo $e::class, ": ", $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +RuntimeException: Heap cannot be changed when it is already being modified. diff -Nru php8.4-8.4.16/ext/sqlite3/sqlite3.c php8.4-8.4.21/ext/sqlite3/sqlite3.c --- php8.4-8.4.16/ext/sqlite3/sqlite3.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/sqlite3/sqlite3.c 2026-05-05 16:34:12.000000000 +0000 @@ -1998,6 +1998,7 @@ default: php_sqlite3_error(result_obj->db_obj, sqlite3_errcode(sqlite3_db_handle(result_obj->stmt_obj->stmt)), "Unable to execute statement: %s", sqlite3_errmsg(sqlite3_db_handle(result_obj->stmt_obj->stmt))); + RETURN_FALSE; } } /* }}} */ diff -Nru php8.4-8.4.16/ext/sqlite3/tests/gh20699.phpt php8.4-8.4.21/ext/sqlite3/tests/gh20699.phpt --- php8.4-8.4.16/ext/sqlite3/tests/gh20699.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/sqlite3/tests/gh20699.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,14 @@ +--TEST-- +GH-20699 (SQLite3Result fetchArray return array|false, null returned) +--EXTENSIONS-- +sqlite3 +--CREDITS-- +plusminmax +--FILE-- +prepare('BEGIN;')->execute()->fetchArray()); +?> +--EXPECTF-- +Warning: SQLite3Result::fetchArray(): Unable to execute statement: cannot start a transaction within a transaction in %s on line %d +bool(false) diff -Nru php8.4-8.4.16/ext/standard/basic_functions.c php8.4-8.4.21/ext/standard/basic_functions.c --- php8.4-8.4.16/ext/standard/basic_functions.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/basic_functions.c 2026-05-05 16:34:12.000000000 +0000 @@ -1768,7 +1768,10 @@ } if (i) { - php_output_start_default(); + if (UNEXPECTED(php_output_start_default() != SUCCESS)) { + zend_throw_error(NULL, "Unable to start output handler"); + RETURN_THROWS(); + } } php_get_highlight_struct(&syntax_highlighter_ini); @@ -1803,7 +1806,10 @@ Z_PARAM_PATH_STR(filename) ZEND_PARSE_PARAMETERS_END(); - php_output_start_default(); + if (UNEXPECTED(php_output_start_default() != SUCCESS)) { + zend_throw_error(NULL, "Unable to start output handler"); + RETURN_THROWS(); + } zend_stream_init_filename_ex(&file_handle, filename); zend_save_lexical_state(&original_lex_state); @@ -1840,7 +1846,10 @@ ZEND_PARSE_PARAMETERS_END(); if (i) { - php_output_start_default(); + if (UNEXPECTED(php_output_start_default() != SUCCESS)) { + zend_throw_error(NULL, "Unable to start output handler"); + RETURN_THROWS(); + } } EG(error_reporting) = E_ERROR; diff -Nru php8.4-8.4.16/ext/standard/dl.c php8.4-8.4.21/ext/standard/dl.c --- php8.4-8.4.16/ext/standard/dl.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/dl.c 2026-05-05 16:34:12.000000000 +0000 @@ -93,7 +93,7 @@ size_t i = strlen(err); (*errp)=estrdup(err); php_win32_error_msg_free(err); - while (i > 0 && isspace((*errp)[i-1])) { (*errp)[i-1] = '\0'; i--; } + while (i > 0 && isspace((unsigned char)(*errp)[i-1])) { (*errp)[i-1] = '\0'; i--; } } else { (*errp) = estrdup(""); } diff -Nru php8.4-8.4.16/ext/standard/exec.c php8.4-8.4.21/ext/standard/exec.c --- php8.4-8.4.16/ext/standard/exec.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/exec.c 2026-05-05 16:34:12.000000000 +0000 @@ -81,7 +81,7 @@ static size_t strip_trailing_whitespace(char *buf, size_t bufl) { size_t l = bufl; - while (l-- > 0 && isspace(((unsigned char *)buf)[l])); + while (l-- > 0 && isspace((unsigned char)buf[l])); if (l != (bufl - 1)) { bufl = l + 1; buf[bufl] = '\0'; @@ -282,7 +282,7 @@ size_t x, y; zend_string *cmd; #ifndef PHP_WIN32 - char *p = NULL; + const char *p = NULL; #endif ZEND_ASSERT(ZSTR_LEN(unescaped_cmd) == strlen(ZSTR_VAL(unescaped_cmd)) && "Must be a binary safe string"); diff -Nru php8.4-8.4.16/ext/standard/file.c php8.4-8.4.21/ext/standard/file.c --- php8.4-8.4.16/ext/standard/file.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/file.c 2026-05-05 16:34:12.000000000 +0000 @@ -1928,7 +1928,7 @@ inc_len = (bptr < limit ? (*bptr == '\0' ? 1 : php_mblen(bptr, limit - bptr)): 0); if (inc_len == 1) { char *tmp = bptr; - while ((*tmp != delimiter) && isspace((int)*(unsigned char *)tmp)) { + while ((*tmp != delimiter) && isspace((unsigned char)*tmp)) { tmp++; } if (*tmp == enclosure && tmp < limit) { diff -Nru php8.4-8.4.16/ext/standard/filters.c php8.4-8.4.21/ext/standard/filters.c --- php8.4-8.4.16/ext/standard/filters.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/filters.c 2026-05-05 16:34:12.000000000 +0000 @@ -949,7 +949,7 @@ goto out; } - if (!isxdigit((int) *ps)) { + if (!isxdigit(*ps)) { err = PHP_CONV_ERR_INVALID_SEQ; goto out; } @@ -1559,7 +1559,7 @@ php_convert_filter *inst; php_stream_filter *retval = NULL; - char *dot; + const char *dot; int conv_mode = 0; if (filterparams != NULL && Z_TYPE_P(filterparams) != IS_ARRAY) { diff -Nru php8.4-8.4.16/ext/standard/formatted_print.c php8.4-8.4.21/ext/standard/formatted_print.c --- php8.4-8.4.16/ext/standard/formatted_print.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/formatted_print.c 2026-05-05 16:34:12.000000000 +0000 @@ -376,7 +376,7 @@ int php_sprintf_get_argnum(char **format, size_t *format_len) { char *temppos = *format; - while (isdigit((int) *temppos)) temppos++; + while (isdigit((unsigned char)*temppos)) temppos++; if (*temppos != '$') { return ARG_NUM_NEXT; } @@ -468,7 +468,7 @@ PRINTF_DEBUG(("sprintf: first looking at '%c', inpos=%zu\n", *format, format - format_orig)); - if (isalpha((int)*format)) { + if (isalpha((unsigned char)*format)) { width = precision = 0; argnum = ARG_NUM_NEXT; } else { @@ -537,7 +537,7 @@ } width = Z_LVAL_P(tmp); adjusting |= ADJ_WIDTH; - } else if (isdigit((int)*format)) { + } else if (isdigit((unsigned char)*format)) { PRINTF_DEBUG(("sprintf: getting width\n")); if ((width = php_sprintf_getnumber(&format, &format_len)) < 0) { zend_value_error("Width must be between 0 and %d", INT_MAX); @@ -582,7 +582,7 @@ precision = Z_LVAL_P(tmp); adjusting |= ADJ_PRECISION; expprec = 1; - } else if (isdigit((int)*format)) { + } else if (isdigit((unsigned char)*format)) { if ((precision = php_sprintf_getnumber(&format, &format_len)) < 0) { zend_value_error("Precision must be between 0 and %d", INT_MAX); goto fail; diff -Nru php8.4-8.4.16/ext/standard/ftp_fopen_wrapper.c php8.4-8.4.21/ext/standard/ftp_fopen_wrapper.c --- php8.4-8.4.16/ext/standard/ftp_fopen_wrapper.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/ftp_fopen_wrapper.c 2026-05-05 16:34:12.000000000 +0000 @@ -78,8 +78,8 @@ { buffer[0] = '\0'; /* in case read fails to read anything */ while (php_stream_gets(stream, buffer, buffer_size-1) && - !(isdigit((int) buffer[0]) && isdigit((int) buffer[1]) && - isdigit((int) buffer[2]) && buffer[3] == ' ')); + !(isdigit((unsigned char)buffer[0]) && isdigit((unsigned char)buffer[1]) && + isdigit((unsigned char)buffer[2]) && buffer[3] == ' ')); return strtol(buffer, NULL, 10); } /* }}} */ @@ -228,7 +228,7 @@ #define PHP_FTP_CNTRL_CHK(val, val_len, err_msg) { \ unsigned char *s = (unsigned char *) val, *e = (unsigned char *) s + val_len; \ while (s < e) { \ - if (iscntrl(*s)) { \ + if (iscntrl((unsigned char)*s)) { \ php_stream_wrapper_log_error(wrapper, options, err_msg, val); \ goto connect_errexit; \ } \ @@ -337,14 +337,14 @@ /* parse pasv command (129, 80, 95, 25, 13, 221) */ tpath = tmp_line; /* skip over the "227 Some message " part */ - for (tpath += 4; *tpath && !isdigit((int) *tpath); tpath++); + for (tpath += 4; *tpath && !isdigit((unsigned char)*tpath); tpath++); if (!*tpath) { return 0; } /* skip over the host ip, to get the port */ hoststart = tpath; for (i = 0; i < 4; i++) { - for (; isdigit((int) *tpath); tpath++); + for (; isdigit((unsigned char)*tpath); tpath++); if (*tpath != ',') { return 0; } @@ -825,7 +825,7 @@ struct tm tm, tmbuf, *gmt; time_t stamp; - while ((size_t)(p - tmp_line) < sizeof(tmp_line) && !isdigit(*p)) { + while ((size_t)(p - tmp_line) < sizeof(tmp_line) && !isdigit((unsigned char)*p)) { p++; } diff -Nru php8.4-8.4.16/ext/standard/html.c php8.4-8.4.21/ext/standard/html.c --- php8.4-8.4.16/ext/standard/html.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/html.c 2026-05-05 16:34:12.000000000 +0000 @@ -678,8 +678,8 @@ /* strtol allows whitespace and other stuff in the beginning * we're not interested */ - if ((hexadecimal && !isxdigit(**buf)) || - (!hexadecimal && !isdigit(**buf))) { + if ((hexadecimal && !isxdigit((unsigned char)**buf)) || + (!hexadecimal && !isdigit((unsigned char)**buf))) { return FAILURE; } diff -Nru php8.4-8.4.16/ext/standard/html_tables/html_table_gen.php php8.4-8.4.21/ext/standard/html_tables/html_table_gen.php --- php8.4-8.4.16/ext/standard/html_tables/html_table_gen.php 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/html_tables/html_table_gen.php 2026-05-05 16:34:12.000000000 +0000 @@ -180,7 +180,7 @@ /* process file */ $map = array(); - $lines = explode("\n", file_get_contents($e{'file'})); + $lines = explode("\n", file_get_contents($e['file'])); foreach ($lines as $l) { if (preg_match("/^0x([0-9A-Z]{2})\t0x([0-9A-Z]{2,})/i", $l, $matches)) $map[] = array($matches[1], $matches[2]); @@ -323,7 +323,7 @@ /* process file */ $map = array(); - $lines = explode("\n", file_get_contents($e{'file'})); + $lines = explode("\n", file_get_contents($e['file'])); foreach ($lines as $l) { if (preg_match("/^0x([0-9A-Z]{2})\t0x([0-9A-Z]{2,})\s+#\s*(.*)$/i", $l, $matches)) $map[] = array($matches[1], $matches[2], rtrim($matches[3])); diff -Nru php8.4-8.4.16/ext/standard/http_fopen_wrapper.c php8.4-8.4.21/ext/standard/http_fopen_wrapper.c --- php8.4-8.4.16/ext/standard/http_fopen_wrapper.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/http_fopen_wrapper.c 2026-05-05 16:34:12.000000000 +0000 @@ -540,6 +540,10 @@ smart_str_appendl(&header, "\r\n", sizeof("\r\n")-1); if (php_stream_write(stream, ZSTR_VAL(header.s), ZSTR_LEN(header.s)) != ZSTR_LEN(header.s)) { + if (reset_ssl_peer_name) { + php_stream_context_unset_option(PHP_STREAM_CONTEXT(stream), "ssl", "peer_name"); + } + php_stream_wrapper_log_error(wrapper, options, "Cannot connect to HTTPS server through proxy"); php_stream_close(stream); stream = NULL; @@ -561,16 +565,18 @@ /* enable SSL transport layer */ if (stream) { + php_stream_context *old_context = PHP_STREAM_CONTEXT(stream); + if (php_stream_xport_crypto_setup(stream, STREAM_CRYPTO_METHOD_SSLv23_CLIENT, NULL) < 0 || php_stream_xport_crypto_enable(stream, 1) < 0) { php_stream_wrapper_log_error(wrapper, options, "Cannot connect to HTTPS server through proxy"); php_stream_close(stream); stream = NULL; } - } - if (reset_ssl_peer_name) { - php_stream_context_unset_option(PHP_STREAM_CONTEXT(stream), "ssl", "peer_name"); + if (reset_ssl_peer_name) { + php_stream_context_unset_option(old_context, "ssl", "peer_name"); + } } } diff -Nru php8.4-8.4.16/ext/standard/iptc.c php8.4-8.4.21/ext/standard/iptc.c --- php8.4-8.4.16/ext/standard/iptc.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/iptc.c 2026-05-05 16:34:12.000000000 +0000 @@ -73,19 +73,24 @@ #define M_APP15 0xef /* {{{ php_iptc_put1 */ -static int php_iptc_put1(FILE *fp, int spool, unsigned char c, unsigned char **spoolbuf) +static int php_iptc_put1(FILE *fp, int spool, unsigned char c, unsigned char **spoolbuf, const unsigned char *spoolbuf_end) { if (spool > 0) PUTC(c); - if (spoolbuf) *(*spoolbuf)++ = c; + if (spoolbuf) { + if (UNEXPECTED(*spoolbuf >= spoolbuf_end)) { + return EOF; + } + *(*spoolbuf)++ = c; + } return c; } /* }}} */ /* {{{ php_iptc_get1 */ -static int php_iptc_get1(FILE *fp, int spool, unsigned char **spoolbuf) +static int php_iptc_get1(FILE *fp, int spool, unsigned char **spoolbuf, const unsigned char *spoolbuf_end) { int c; char cc; @@ -99,66 +104,71 @@ PUTC(cc); } - if (spoolbuf) *(*spoolbuf)++ = c; + if (spoolbuf) { + if (UNEXPECTED(*spoolbuf >= spoolbuf_end)) { + return EOF; + } + *(*spoolbuf)++ = c; + } return c; } /* }}} */ /* {{{ php_iptc_read_remaining */ -static int php_iptc_read_remaining(FILE *fp, int spool, unsigned char **spoolbuf) +static int php_iptc_read_remaining(FILE *fp, int spool, unsigned char **spoolbuf, const unsigned char *spoolbuf_end) { - while (php_iptc_get1(fp, spool, spoolbuf) != EOF) continue; + while (php_iptc_get1(fp, spool, spoolbuf, spoolbuf_end) != EOF) continue; return M_EOI; } /* }}} */ /* {{{ php_iptc_skip_variable */ -static int php_iptc_skip_variable(FILE *fp, int spool, unsigned char **spoolbuf) +static int php_iptc_skip_variable(FILE *fp, int spool, unsigned char **spoolbuf, const unsigned char *spoolbuf_end) { unsigned int length; int c1, c2; - if ((c1 = php_iptc_get1(fp, spool, spoolbuf)) == EOF) return M_EOI; + if ((c1 = php_iptc_get1(fp, spool, spoolbuf, spoolbuf_end)) == EOF) return M_EOI; - if ((c2 = php_iptc_get1(fp, spool, spoolbuf)) == EOF) return M_EOI; + if ((c2 = php_iptc_get1(fp, spool, spoolbuf, spoolbuf_end)) == EOF) return M_EOI; length = (((unsigned char) c1) << 8) + ((unsigned char) c2); length -= 2; while (length--) - if (php_iptc_get1(fp, spool, spoolbuf) == EOF) return M_EOI; + if (php_iptc_get1(fp, spool, spoolbuf, spoolbuf_end) == EOF) return M_EOI; return 0; } /* }}} */ /* {{{ php_iptc_next_marker */ -static int php_iptc_next_marker(FILE *fp, int spool, unsigned char **spoolbuf) +static int php_iptc_next_marker(FILE *fp, int spool, unsigned char **spoolbuf, const unsigned char *spoolbuf_end) { int c; /* skip unimportant stuff */ - c = php_iptc_get1(fp, spool, spoolbuf); + c = php_iptc_get1(fp, spool, spoolbuf, spoolbuf_end); if (c == EOF) return M_EOI; while (c != 0xff) { - if ((c = php_iptc_get1(fp, spool, spoolbuf)) == EOF) + if ((c = php_iptc_get1(fp, spool, spoolbuf, spoolbuf_end)) == EOF) return M_EOI; /* we hit EOF */ } /* get marker byte, swallowing possible padding */ do { - c = php_iptc_get1(fp, 0, 0); + c = php_iptc_get1(fp, 0, 0, NULL); if (c == EOF) return M_EOI; /* we hit EOF */ else if (c == 0xff) - php_iptc_put1(fp, spool, (unsigned char)c, spoolbuf); + php_iptc_put1(fp, spool, (unsigned char)c, spoolbuf, spoolbuf_end); } while (c == 0xff); return (unsigned int) c; @@ -178,6 +188,7 @@ size_t inx; zend_string *spoolbuf = NULL; unsigned char *poi = NULL; + unsigned char *spoolbuf_end = NULL; zend_stat_t sb = {0}; bool written = 0; @@ -210,10 +221,11 @@ spoolbuf = zend_string_safe_alloc(1, iptcdata_len + sizeof(psheader) + 1024 + 1, sb.st_size, 0); poi = (unsigned char*)ZSTR_VAL(spoolbuf); + spoolbuf_end = poi + ZSTR_LEN(spoolbuf); memset(poi, 0, iptcdata_len + sizeof(psheader) + sb.st_size + 1024 + 1); } - if (php_iptc_get1(fp, spool, poi?&poi:0) != 0xFF) { + if (php_iptc_get1(fp, spool, poi?&poi:0, spoolbuf_end) != 0xFF) { fclose(fp); if (spoolbuf) { zend_string_efree(spoolbuf); @@ -221,7 +233,8 @@ RETURN_FALSE; } - if (php_iptc_get1(fp, spool, poi?&poi:0) != 0xD8) { + if (php_iptc_get1(fp, spool, poi?&poi:0, spoolbuf_end) != 0xD8) { +err: fclose(fp); if (spoolbuf) { zend_string_efree(spoolbuf); @@ -230,20 +243,22 @@ } while (!done) { - marker = php_iptc_next_marker(fp, spool, poi?&poi:0); + marker = php_iptc_next_marker(fp, spool, poi?&poi:0, spoolbuf_end); if (marker == M_EOI) { /* EOF */ break; } else if (marker != M_APP13) { - php_iptc_put1(fp, spool, (unsigned char)marker, poi?&poi:0); + if (php_iptc_put1(fp, spool, (unsigned char)marker, poi?&poi:0, spoolbuf_end) < 0) { + goto err; + } } switch (marker) { case M_APP13: /* we are going to write a new APP13 marker, so don't output the old one */ - php_iptc_skip_variable(fp, 0, 0); + php_iptc_skip_variable(fp, 0, 0, spoolbuf_end); fgetc(fp); /* skip already copied 0xFF byte */ - php_iptc_read_remaining(fp, spool, poi?&poi:0); + php_iptc_read_remaining(fp, spool, poi?&poi:0, spoolbuf_end); done = 1; break; @@ -256,7 +271,7 @@ } written = 1; - php_iptc_skip_variable(fp, spool, poi?&poi:0); + php_iptc_skip_variable(fp, spool, poi?&poi:0, spoolbuf_end); if (iptcdata_len & 1) { iptcdata_len++; /* make the length even */ @@ -266,25 +281,33 @@ psheader[ 3 ] = (iptcdata_len+28)&0xff; for (inx = 0; inx < 28; inx++) { - php_iptc_put1(fp, spool, psheader[inx], poi?&poi:0); + if (php_iptc_put1(fp, spool, psheader[inx], poi?&poi:0, spoolbuf_end) < 0) { + goto err; + } } - php_iptc_put1(fp, spool, (unsigned char)(iptcdata_len>>8), poi?&poi:0); - php_iptc_put1(fp, spool, (unsigned char)(iptcdata_len&0xff), poi?&poi:0); + if (php_iptc_put1(fp, spool, (unsigned char)(iptcdata_len>>8), poi?&poi:0, spoolbuf_end) < 0) { + goto err; + } + if (php_iptc_put1(fp, spool, (unsigned char)(iptcdata_len&0xff), poi?&poi:0, spoolbuf_end) < 0) { + goto err; + } for (inx = 0; inx < iptcdata_len; inx++) { - php_iptc_put1(fp, spool, iptcdata[inx], poi?&poi:0); + if (php_iptc_put1(fp, spool, iptcdata[inx], poi?&poi:0, spoolbuf_end) < 0) { + goto err; + } } break; case M_SOS: /* we hit data, no more marker-inserting can be done! */ - php_iptc_read_remaining(fp, spool, poi?&poi:0); + php_iptc_read_remaining(fp, spool, poi?&poi:0, spoolbuf_end); done = 1; break; default: - php_iptc_skip_variable(fp, spool, poi?&poi:0); + php_iptc_skip_variable(fp, spool, poi?&poi:0, spoolbuf_end); break; } } @@ -292,6 +315,7 @@ fclose(fp); if (spool < 2) { + *poi = '\0'; spoolbuf = zend_string_truncate(spoolbuf, poi - (unsigned char*)ZSTR_VAL(spoolbuf), 0); RETURN_NEW_STR(spoolbuf); } else { diff -Nru php8.4-8.4.16/ext/standard/libavifinfo/README.md php8.4-8.4.21/ext/standard/libavifinfo/README.md --- php8.4-8.4.16/ext/standard/libavifinfo/README.md 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/libavifinfo/README.md 2026-05-05 16:34:12.000000000 +0000 @@ -7,5 +7,5 @@ channel count without depending on the full libavif library. `avifinfo.h`, `avifinfo.c`, `LICENSE` and `PATENTS` were copied verbatim from: \ -https://aomedia.googlesource.com/libavifinfo/+/96f34d945ac7dac229feddfa94dbae66e202b838 \ +https://aomedia.googlesource.com/libavifinfo/+/2b924defa4c2cd227540efe164067a8cc913eeba \ They can easily be kept up-to-date the same way. diff -Nru php8.4-8.4.16/ext/standard/libavifinfo/avifinfo.c php8.4-8.4.21/ext/standard/libavifinfo/avifinfo.c --- php8.4-8.4.16/ext/standard/libavifinfo/avifinfo.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/libavifinfo/avifinfo.c 2026-05-05 16:34:12.000000000 +0000 @@ -34,14 +34,15 @@ // uint32_t is used everywhere in this file. It is unlikely to be insufficient // to parse AVIF headers. #define AVIFINFO_MAX_SIZE UINT32_MAX -// AvifInfoInternalFeatures uses uint8_t to store values and the number of -// values is clamped to 32 to limit the stack size. +// Be reasonable. Avoid timeouts and out-of-memory. +#define AVIFINFO_MAX_NUM_BOXES 4096 +// AvifInfoInternalFeatures uses uint8_t to store values. #define AVIFINFO_MAX_VALUE UINT8_MAX -#define AVIFINFO_UNDEFINED 0 // Maximum number of stored associations. Past that, they are skipped. #define AVIFINFO_MAX_TILES 16 #define AVIFINFO_MAX_PROPS 32 #define AVIFINFO_MAX_FEATURES 8 +#define AVIFINFO_UNDEFINED 0 // Reads an unsigned integer from 'input' with most significant bits first. // 'input' must be at least 'num_bytes'-long. @@ -93,6 +94,12 @@ #define AVIFINFO_CHECK_NOT_FOUND(check_status) \ AVIFINFO_CHECK_STATUS_IS((check_status), kNotFound) +#if defined(AVIFINFO_ENABLE_DEBUG_LOG) +#define AVIF_DEBUG_LOG(...) printf(__VA_ARGS__) +#else +#define AVIF_DEBUG_LOG(...) +#endif + //------------------------------------------------------------------------------ // Streamed input struct and helper functions. @@ -101,6 +108,7 @@ read_stream_t read; // Used to fetch more bytes from the 'stream'. skip_stream_t skip; // Used to advance the position in the 'stream'. // Fallback to 'read' if 'skip' is null. + uint64_t num_read_bytes; // Number of bytes read or skipped. } AvifInfoInternalStream; // Reads 'num_bytes' from the 'stream'. They are available at '*data'. @@ -109,6 +117,7 @@ AvifInfoInternalStream* stream, uint32_t num_bytes, const uint8_t** data) { *data = stream->read(stream->stream, num_bytes); AVIFINFO_CHECK(*data != NULL, kTruncated); + stream->num_read_bytes += num_bytes; return kFound; } @@ -127,6 +136,7 @@ return AvifInfoInternalRead(stream, num_bytes, &unused); } stream->skip(stream->stream, num_bytes); + stream->num_read_bytes += num_bytes; } return kFound; } @@ -137,6 +147,7 @@ typedef struct { uint8_t tile_item_id; uint8_t parent_item_id; + uint8_t dimg_idx; // Index of this association in the dimg box (0-based). } AvifInfoInternalTile; // Tile item id <-> parent item id associations. typedef struct { @@ -156,10 +167,15 @@ typedef struct { uint8_t has_primary_item; // True if "pitm" was parsed. - uint8_t has_alpha; // True if an alpha "auxC" was parsed. + uint8_t has_alpha; // True if an alpha "auxC" was parsed. + // Index of the gain map auxC property. + uint8_t gainmap_property_index; uint8_t primary_item_id; AvifInfoFeatures primary_item_features; // Deduced from the data below. uint8_t data_was_skipped; // True if some loops/indices were skipped. + uint8_t tone_mapped_item_id; // Id of the "tmap" box, > 0 if present. + uint8_t iinf_parsed; // True if the "iinf" (item info) box was parsed. + uint8_t iref_parsed; // True if the "iref" (item reference) box was parsed. uint8_t num_tiles; AvifInfoInternalTile tiles[AVIFINFO_MAX_TILES]; @@ -227,6 +243,36 @@ AVIFINFO_CHECK(f->has_primary_item, kNotFound); // Early exit. AVIFINFO_CHECK(f->num_dim_props > 0 && f->num_chan_props, kNotFound); + + // Look for a gain map. + // HEIF scheme: gain map is a hidden input of a derived item. + if (f->tone_mapped_item_id) { + for (uint32_t tile = 0; tile < f->num_tiles; ++tile) { + if (f->tiles[tile].parent_item_id == f->tone_mapped_item_id && + f->tiles[tile].dimg_idx == 1) { + f->primary_item_features.has_gainmap = 1; + f->primary_item_features.gainmap_item_id = f->tiles[tile].tile_item_id; + break; + } + } + } + // Adobe scheme: gain map is an auxiliary item. + if (!f->primary_item_features.has_gainmap && f->gainmap_property_index > 0) { + for (uint32_t prop_item = 0; prop_item < f->num_props; ++prop_item) { + if (f->props[prop_item].property_index == f->gainmap_property_index) { + f->primary_item_features.has_gainmap = 1; + f->primary_item_features.gainmap_item_id = f->props[prop_item].item_id; + break; + } + } + } + // If the gain map has not been found but we haven't read all the relevant + // metadata, we might still find one later and cannot stop now. + if (!f->primary_item_features.has_gainmap && + (!f->iinf_parsed || (f->tone_mapped_item_id && !f->iref_parsed))) { + return kNotFound; + } + AVIFINFO_CHECK_FOUND( AvifInfoInternalGetItemFeatures(f, f->primary_item_id, /*tile_depth=*/0)); @@ -250,8 +296,9 @@ // 'num_remaining_bytes' is the remaining size of the container of the 'box' // (either the file size itself or the content size of the parent of the 'box'). static AvifInfoInternalStatus AvifInfoInternalParseBox( - AvifInfoInternalStream* stream, uint32_t num_remaining_bytes, - uint32_t* num_parsed_boxes, AvifInfoInternalBox* box) { + int nesting_level, AvifInfoInternalStream* stream, + uint32_t num_remaining_bytes, uint32_t* num_parsed_boxes, + AvifInfoInternalBox* box) { const uint8_t* data; // See ISO/IEC 14496-12:2012(E) 4.2 uint32_t box_header_size = 8; // box 32b size + 32b type (at least) @@ -271,22 +318,38 @@ // Read the 32 least-significant bits. box->size = AvifInfoInternalReadBigEndian(data + 4, sizeof(uint32_t)); } else if (box->size == 0) { + // ISO/IEC 14496-12 4.2.2: + // if size is 0, then this box shall be in a top-level box + // (i.e. not contained in another box) + AVIFINFO_CHECK(nesting_level == 0, kInvalid); box->size = num_remaining_bytes; } AVIFINFO_CHECK(box->size >= box_header_size, kInvalid); AVIFINFO_CHECK(box->size <= num_remaining_bytes, kInvalid); + // 16 bytes of usertype should be read here if the box type is 'uuid'. + // 'uuid' boxes are skipped so usertype is part of the skipped body. + const int has_fullbox_header = !memcmp(box->type, "meta", 4) || !memcmp(box->type, "pitm", 4) || !memcmp(box->type, "ipma", 4) || !memcmp(box->type, "ispe", 4) || !memcmp(box->type, "pixi", 4) || !memcmp(box->type, "iref", 4) || - !memcmp(box->type, "auxC", 4); + !memcmp(box->type, "auxC", 4) || !memcmp(box->type, "iinf", 4) || + !memcmp(box->type, "infe", 4); if (has_fullbox_header) box_header_size += 4; AVIFINFO_CHECK(box->size >= box_header_size, kInvalid); box->content_size = box->size - box_header_size; - // Avoid timeouts. The maximum number of parsed boxes is arbitrary. - ++*num_parsed_boxes; - AVIFINFO_CHECK(*num_parsed_boxes < 4096, kAborted); + // AvifInfoGetFeaturesStream() can be called on a full stream or on a stream + // where the 'ftyp' box was already read. Do not count 'ftyp' boxes towards + // AVIFINFO_MAX_NUM_BOXES, so that this function returns the same status in + // both situations (because of the AVIFINFO_MAX_NUM_BOXES check that would + // compare a different box count otherwise). This is fine because top-level + // 'ftyp' boxes are just skipped anyway. + if (nesting_level != 0 || memcmp(box->type, "ftyp", 4)) { + // Avoid timeouts. The maximum number of parsed boxes is arbitrary. + ++*num_parsed_boxes; + AVIFINFO_CHECK(*num_parsed_boxes < AVIFINFO_MAX_NUM_BOXES, kAborted); + } box->version = 0; box->flags = 0; @@ -297,17 +360,22 @@ // See AV1 Image File Format (AVIF) 8.1 // at https://aomediacodec.github.io/av1-avif/#avif-boxes (available when // https://github.com/AOMediaCodec/av1-avif/pull/170 is merged). - uint32_t is_parsable = 1; - if (!memcmp(box->type, "meta", 4)) is_parsable = (box->version <= 0); - if (!memcmp(box->type, "pitm", 4)) is_parsable = (box->version <= 1); - if (!memcmp(box->type, "ipma", 4)) is_parsable = (box->version <= 1); - if (!memcmp(box->type, "ispe", 4)) is_parsable = (box->version <= 0); - if (!memcmp(box->type, "pixi", 4)) is_parsable = (box->version <= 0); - if (!memcmp(box->type, "iref", 4)) is_parsable = (box->version <= 1); - if (!memcmp(box->type, "auxC", 4)) is_parsable = (box->version <= 0); + const uint32_t is_parsable = + (!memcmp(box->type, "meta", 4) && box->version <= 0) || + (!memcmp(box->type, "pitm", 4) && box->version <= 1) || + (!memcmp(box->type, "ipma", 4) && box->version <= 1) || + (!memcmp(box->type, "ispe", 4) && box->version <= 0) || + (!memcmp(box->type, "pixi", 4) && box->version <= 0) || + (!memcmp(box->type, "iref", 4) && box->version <= 1) || + (!memcmp(box->type, "auxC", 4) && box->version <= 0) || + (!memcmp(box->type, "iinf", 4) && box->version <= 1) || + (!memcmp(box->type, "infe", 4) && box->version >= 2 && + box->version <= 3); // Instead of considering this file as invalid, skip unparsable boxes. - if (!is_parsable) memcpy(box->type, "\0skp", 4); // \0 so not a valid type + if (!is_parsable) memcpy(box->type, "skip", 4); // FreeSpaceBox } + AVIF_DEBUG_LOG("%*c", nesting_level * 2, ' '); + AVIF_DEBUG_LOG("Box type %.4s size %d\n", box->type, box->size); return kFound; } @@ -316,15 +384,16 @@ // Parses a 'stream' of an "ipco" box into 'features'. // "ispe" is used for width and height, "pixi" and "av1C" are used for bit depth // and number of channels, and "auxC" is used for alpha. -static AvifInfoInternalStatus ParseIpco(AvifInfoInternalStream* stream, +static AvifInfoInternalStatus ParseIpco(int nesting_level, + AvifInfoInternalStream* stream, uint32_t num_remaining_bytes, uint32_t* num_parsed_boxes, AvifInfoInternalFeatures* features) { uint32_t box_index = 1; // 1-based index. Used for iterating over properties. do { AvifInfoInternalBox box; - AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(stream, num_remaining_bytes, - num_parsed_boxes, &box)); + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox( + nesting_level, stream, num_remaining_bytes, num_parsed_boxes, &box)); if (!memcmp(box.type, "ispe", 4)) { // See ISO/IEC 23008-12:2017(E) 6.5.3.2 @@ -407,21 +476,43 @@ // at https://aomediacodec.github.io/av1-avif/#auxiliary-images const char* kAlphaStr = "urn:mpeg:mpegB:cicp:systems:auxiliary:alpha"; const uint32_t kAlphaStrLength = 44; // Includes terminating character. - if (box.content_size >= kAlphaStrLength) { + const char* kGainmapStr = "urn:com:photo:aux:hdrgainmap"; + const uint32_t kGainmapStrLength = 29; // Includes terminating character. + uint32_t num_read_bytes = 0; + // Check for a gain map or for an alpha plane. Start with the gain map + // since the identifier is shorter. + if (box.content_size >= kGainmapStrLength) { const uint8_t* data; AVIFINFO_CHECK_FOUND( - AvifInfoInternalRead(stream, kAlphaStrLength, &data)); + AvifInfoInternalRead(stream, kGainmapStrLength, &data)); + num_read_bytes = kGainmapStrLength; const char* const aux_type = (const char*)data; - if (strcmp(aux_type, kAlphaStr) == 0) { - // Note: It is unlikely but it is possible that this alpha plane does - // not belong to the primary item or a tile. Ignore this issue. - features->has_alpha = 1; + if (strcmp(aux_type, kGainmapStr) == 0) { + // Note: It is unlikely but it is possible that this gain map + // does not belong to the primary item or a tile. Ignore this issue. + if (box_index <= AVIFINFO_MAX_VALUE) { + features->gainmap_property_index = (uint8_t)box_index; + } else { + features->data_was_skipped = 1; + } + } else if (box.content_size >= kAlphaStrLength && + memcmp(aux_type, kAlphaStr, kGainmapStrLength) == 0) { + // The beginning of the aux type matches the alpha aux type string. + // Check the end as well. + const uint8_t* data2; + const uint32_t kEndLength = kAlphaStrLength - kGainmapStrLength; + AVIFINFO_CHECK_FOUND( + AvifInfoInternalRead(stream, kEndLength, &data2)); + num_read_bytes = kAlphaStrLength; + if (strcmp((const char*)data2, &kAlphaStr[kGainmapStrLength]) == 0) { + // Note: It is unlikely but it is possible that this alpha plane + // does not belong to the primary item or a tile. Ignore this issue. + features->has_alpha = 1; + } } - AVIFINFO_CHECK_FOUND( - AvifInfoInternalSkip(stream, box.content_size - kAlphaStrLength)); - } else { - AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size)); } + AVIFINFO_CHECK_FOUND( + AvifInfoInternalSkip(stream, box.content_size - num_read_bytes)); } else { AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size)); } @@ -431,20 +522,22 @@ AVIFINFO_RETURN(kNotFound); } -// Parses a 'stream' of an "iprp" box into 'features'. The "ipco" box contain +// Parses a 'stream' of an "iprp" box into 'features'. The "ipco" box contains // the properties which are linked to items by the "ipma" box. -static AvifInfoInternalStatus ParseIprp(AvifInfoInternalStream* stream, +static AvifInfoInternalStatus ParseIprp(int nesting_level, + AvifInfoInternalStream* stream, uint32_t num_remaining_bytes, uint32_t* num_parsed_boxes, AvifInfoInternalFeatures* features) { do { AvifInfoInternalBox box; - AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(stream, num_remaining_bytes, - num_parsed_boxes, &box)); + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox( + nesting_level, stream, num_remaining_bytes, num_parsed_boxes, &box)); if (!memcmp(box.type, "ipco", 4)) { - AVIFINFO_CHECK_NOT_FOUND( - ParseIpco(stream, box.content_size, num_parsed_boxes, features)); + AVIFINFO_CHECK_NOT_FOUND(ParseIpco(nesting_level + 1, stream, + box.content_size, num_parsed_boxes, + features)); } else if (!memcmp(box.type, "ipma", 4)) { // See ISO/IEC 23008-12:2017(E) 9.3.2 uint32_t num_read_bytes = 4; @@ -503,6 +596,7 @@ AVIFINFO_CHECK_NOT_FOUND( AvifInfoInternalGetPrimaryItemFeatures(features)); + // Mostly if 'data_was_skipped'. AVIFINFO_CHECK_FOUND( AvifInfoInternalSkip(stream, box.content_size - num_read_bytes)); } else { @@ -519,14 +613,17 @@ // The "dimg" boxes contain links between tiles and their parent items, which // can be used to infer bit depth and number of channels for the primary item // when the latter does not have these properties. -static AvifInfoInternalStatus ParseIref(AvifInfoInternalStream* stream, +static AvifInfoInternalStatus ParseIref(int nesting_level, + AvifInfoInternalStream* stream, uint32_t num_remaining_bytes, uint32_t* num_parsed_boxes, AvifInfoInternalFeatures* features) { - do { + features->iref_parsed = 1; + + while (num_remaining_bytes > 0) { AvifInfoInternalBox box; - AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(stream, num_remaining_bytes, - num_parsed_boxes, &box)); + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox( + nesting_level, stream, num_remaining_bytes, num_parsed_boxes, &box)); if (!memcmp(box.type, "dimg", 4)) { // See ISO/IEC 14496-12:2015(E) 8.11.12.2 @@ -557,6 +654,7 @@ features->num_tiles < AVIFINFO_MAX_TILES) { features->tiles[features->num_tiles].tile_item_id = to_item_id; features->tiles[features->num_tiles].parent_item_id = from_item_id; + features->tiles[features->num_tiles].dimg_idx = i; ++features->num_tiles; } else { features->data_was_skipped = 1; @@ -566,11 +664,77 @@ // If all features are available now, do not look further. AVIFINFO_CHECK_NOT_FOUND( AvifInfoInternalGetPrimaryItemFeatures(features)); + + // Mostly if 'data_was_skipped'. + AVIFINFO_CHECK_FOUND( + AvifInfoInternalSkip(stream, box.content_size - num_read_bytes)); } else { AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size)); } num_remaining_bytes -= box.size; - } while (num_remaining_bytes > 0); + } + AVIFINFO_RETURN(kNotFound); +} + +//------------------------------------------------------------------------------ + +// Parses a 'stream' of an "iinf" box into 'features'. +static AvifInfoInternalStatus ParseIinf(int nesting_level, + AvifInfoInternalStream* stream, + uint32_t num_remaining_bytes, + uint32_t box_version, + uint32_t* num_parsed_boxes, + AvifInfoInternalFeatures* features) { + features->iinf_parsed = 1; + + const uint32_t num_bytes_per_entry_count = box_version == 0 ? 2 : 4; + AVIFINFO_CHECK(num_bytes_per_entry_count <= num_remaining_bytes, kInvalid); + const uint8_t* data; + AVIFINFO_CHECK_FOUND( + AvifInfoInternalRead(stream, num_bytes_per_entry_count, &data)); + num_remaining_bytes -= num_bytes_per_entry_count; + const uint32_t entry_count = + AvifInfoInternalReadBigEndian(data, num_bytes_per_entry_count); + + for (int i = 0; i < entry_count; ++i) { + AvifInfoInternalBox box; + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox( + nesting_level, stream, num_remaining_bytes, num_parsed_boxes, &box)); + + if (!memcmp(box.type, "infe", 4)) { + // See ISO/IEC 14496-12:2015(E) 8.11.6.2 + const uint32_t num_bytes_per_id = (box.version == 2) ? 2 : 4; + const uint8_t* data; + // item_ID (16 or 32) + item_protection_index (16) + item_type (32). + AVIFINFO_CHECK(num_bytes_per_id + 2 + 4 <= box.content_size, kInvalid); + AVIFINFO_CHECK_FOUND( + AvifInfoInternalRead(stream, num_bytes_per_id, &data)); + const uint32_t item_id = + AvifInfoInternalReadBigEndian(data, num_bytes_per_id); + + // Skip item_protection_index. + AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, 2)); + + const uint8_t* item_type; + AVIFINFO_CHECK_FOUND(AvifInfoInternalRead(stream, 4, &item_type)); + if (!memcmp(item_type, "tmap", 4)) { + // Tone Mapped Image: indicates the presence of a gain map. + if (item_id <= AVIFINFO_MAX_VALUE) { + features->tone_mapped_item_id = (uint8_t)item_id; + } else { + features->data_was_skipped = 1; + } + } + + AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip( + stream, box.content_size - (num_bytes_per_id + 2 + 4))); + } else { + AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size)); + } + + num_remaining_bytes -= box.size; + if (num_remaining_bytes == 0) break; // Ignore entry_count bigger than box. + } AVIFINFO_RETURN(kNotFound); } @@ -578,18 +742,19 @@ // Parses a 'stream' of a "meta" box. It looks for the primary item ID in the // "pitm" box and recurses into other boxes to find its 'features'. -static AvifInfoInternalStatus ParseMeta(AvifInfoInternalStream* stream, +static AvifInfoInternalStatus ParseMeta(int nesting_level, + AvifInfoInternalStream* stream, uint32_t num_remaining_bytes, uint32_t* num_parsed_boxes, AvifInfoInternalFeatures* features) { do { AvifInfoInternalBox box; - AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(stream, num_remaining_bytes, - num_parsed_boxes, &box)); - + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox( + nesting_level, stream, num_remaining_bytes, num_parsed_boxes, &box)); if (!memcmp(box.type, "pitm", 4)) { // See ISO/IEC 14496-12:2015(E) 8.11.4.2 const uint32_t num_bytes_per_id = (box.version == 0) ? 2 : 4; + const uint64_t primary_item_id_location = stream->num_read_bytes; const uint8_t* data; AVIFINFO_CHECK(num_bytes_per_id <= num_remaining_bytes, kInvalid); AVIFINFO_CHECK_FOUND( @@ -599,14 +764,23 @@ AVIFINFO_CHECK(primary_item_id <= AVIFINFO_MAX_VALUE, kAborted); features->has_primary_item = 1; features->primary_item_id = primary_item_id; + features->primary_item_features.primary_item_id_location = + primary_item_id_location; + features->primary_item_features.primary_item_id_bytes = num_bytes_per_id; AVIFINFO_CHECK_FOUND( AvifInfoInternalSkip(stream, box.content_size - num_bytes_per_id)); } else if (!memcmp(box.type, "iprp", 4)) { - AVIFINFO_CHECK_NOT_FOUND( - ParseIprp(stream, box.content_size, num_parsed_boxes, features)); + AVIFINFO_CHECK_NOT_FOUND(ParseIprp(nesting_level + 1, stream, + box.content_size, num_parsed_boxes, + features)); } else if (!memcmp(box.type, "iref", 4)) { - AVIFINFO_CHECK_NOT_FOUND( - ParseIref(stream, box.content_size, num_parsed_boxes, features)); + AVIFINFO_CHECK_NOT_FOUND(ParseIref(nesting_level + 1, stream, + box.content_size, num_parsed_boxes, + features)); + } else if (!memcmp(box.type, "iinf", 4)) { + AVIFINFO_CHECK_NOT_FOUND(ParseIinf(nesting_level + 1, stream, + box.content_size, box.version, + num_parsed_boxes, features)); } else { AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size)); } @@ -622,8 +796,9 @@ static AvifInfoInternalStatus ParseFtyp(AvifInfoInternalStream* stream) { AvifInfoInternalBox box; uint32_t num_parsed_boxes = 0; - AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(stream, AVIFINFO_MAX_SIZE, - &num_parsed_boxes, &box)); + const int nesting_level = 0; + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox( + nesting_level, stream, AVIFINFO_MAX_SIZE, &num_parsed_boxes, &box)); AVIFINFO_CHECK(!memcmp(box.type, "ftyp", 4), kInvalid); // Iterate over brands. See ISO/IEC 14496-12:2012(E) 4.3.1 AVIFINFO_CHECK(box.content_size >= 8, kInvalid); // major_brand,minor_version @@ -647,15 +822,16 @@ AvifInfoInternalFeatures* features) { while (1) { AvifInfoInternalBox box; - AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(stream, AVIFINFO_MAX_SIZE, - num_parsed_boxes, &box)); + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox( + /*nesting_level=*/0, stream, AVIFINFO_MAX_SIZE, num_parsed_boxes, + &box)); if (!memcmp(box.type, "meta", 4)) { - return ParseMeta(stream, box.content_size, num_parsed_boxes, features); + return ParseMeta(/*nesting_level=*/1, stream, box.content_size, + num_parsed_boxes, features); } else { AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size)); } } - AVIFINFO_RETURN(kInvalid); // No "meta" no good. } //------------------------------------------------------------------------------ @@ -698,6 +874,11 @@ AvifInfoStatus AvifInfoGetFeatures(const uint8_t* data, size_t data_size, AvifInfoFeatures* features) { + const AvifInfoStatus status = AvifInfoIdentify(data, data_size); + if (status != kAvifInfoOk) { + if (features != NULL) memset(features, 0, sizeof(*features)); + return status; + } AvifInfoInternalForward stream; stream.data = data; stream.data_size = data_size; @@ -710,19 +891,20 @@ // Streamed input API AvifInfoStatus AvifInfoIdentifyStream(void* stream, read_stream_t read, - skip_stream_t skip) { + skip_stream_t skip) { if (read == NULL) return kAvifInfoNotEnoughData; AvifInfoInternalStream internal_stream; internal_stream.stream = stream; internal_stream.read = read; internal_stream.skip = skip; // Fallbacks to 'read' if null. + internal_stream.num_read_bytes = 0; return AvifInfoInternalConvertStatus(ParseFtyp(&internal_stream)); } AvifInfoStatus AvifInfoGetFeaturesStream(void* stream, read_stream_t read, - skip_stream_t skip, - AvifInfoFeatures* features) { + skip_stream_t skip, + AvifInfoFeatures* features) { if (features != NULL) memset(features, 0, sizeof(*features)); if (read == NULL) return kAvifInfoNotEnoughData; @@ -730,6 +912,7 @@ internal_stream.stream = stream; internal_stream.read = read; internal_stream.skip = skip; // Fallbacks to 'read' if null. + internal_stream.num_read_bytes = 0; uint32_t num_parsed_boxes = 0; AvifInfoInternalFeatures internal_features; memset(&internal_features, AVIFINFO_UNDEFINED, sizeof(internal_features)); diff -Nru php8.4-8.4.16/ext/standard/libavifinfo/avifinfo.h php8.4-8.4.21/ext/standard/libavifinfo/avifinfo.h --- php8.4-8.4.16/ext/standard/libavifinfo/avifinfo.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/libavifinfo/avifinfo.h 2026-05-05 16:34:12.000000000 +0000 @@ -35,10 +35,22 @@ } AvifInfoStatus; typedef struct { - uint32_t width, height; // In number of pixels. Ignores mirror and rotation. - uint32_t bit_depth; // Likely 8, 10 or 12 bits per channel per pixel. - uint32_t num_channels; // Likely 1, 2, 3 or 4 channels: - // (1 monochrome or 3 colors) + (0 or 1 alpha) + uint32_t width, height; // In number of pixels. Ignores crop and rotation. + uint32_t bit_depth; // Likely 8, 10 or 12 bits per channel per pixel. + uint32_t num_channels; // Likely 1, 2, 3 or 4 channels: + // (1 monochrome or 3 colors) + (0 or 1 alpha) + uint8_t has_gainmap; // True if a gain map was found. + // Id of the gain map item. Assumes there is at most one. If there are several + // gain map items (e.g. because the main image is tiled and each tile has an + // independent gain map), then this is one of the ids, arbitrarily chosen. + uint8_t gainmap_item_id; + // Start location in bytes of the primary item id, relative to the beginning + // of the given payload. The primary item id is a big endian number stored on + // bytes primary_item_id_location to + // primary_item_id_location+primary_item_id_bytes-1 inclusive. + uint64_t primary_item_id_location; + // Number of bytes of the primary item id. + uint8_t primary_item_id_bytes; } AvifInfoFeatures; //------------------------------------------------------------------------------ @@ -46,13 +58,19 @@ // Use this API if a raw byte array of fixed size is available as input. // Parses the 'data' and returns kAvifInfoOk if it is identified as an AVIF. +// 'data' can be partial but must point to the beginning of the AVIF file. // The file type can be identified in the first 12 bytes of most AVIF files. AvifInfoStatus AvifInfoIdentify(const uint8_t* data, size_t data_size); -// Parses the identified AVIF 'data' and extracts its 'features'. +// Parses the 'data' and returns kAvifInfoOk and its 'features' if it is +// identified as an AVIF file. // 'data' can be partial but must point to the beginning of the AVIF file. // The 'features' can be parsed in the first 450 bytes of most AVIF files. // 'features' are set to 0 unless kAvifInfoOk is returned. +// There is no need to call AvifInfoIdentify() before AvifInfoGetFeatures(). +// AvifInfoGetFeatures() parses the file further than AvifInfoIdentify() so it +// is possible that AvifInfoGetFeatures() returns errors while +// AvifInfoIdentify() returns kAvifInfoOk on the same given input bytes. AvifInfoStatus AvifInfoGetFeatures(const uint8_t* data, size_t data_size, AvifInfoFeatures* features); @@ -78,7 +96,15 @@ // 'read' cannot be null. If 'skip' is null, 'read' is called instead. AvifInfoStatus AvifInfoIdentifyStream(void* stream, read_stream_t read, skip_stream_t skip); -// Can be called right after AvifInfoIdentifyStream() with the same 'stream'. + +// Can be called right after AvifInfoIdentifyStream() with the same 'stream' +// object if AvifInfoIdentifyStream() returned kAvifInfoOk. +// Any location-dependent feature such as 'primary_item_id_location' is relative +// to the given 'stream', and must be offset by the number of bytes read or +// skipped during AvifInfoIdentifyStream() if it was called prior to +// AvifInfoGetFeaturesStream() on the same 'stream' object. +// AvifInfoGetFeaturesStream() should only be called if AvifInfoIdentifyStream() +// returned kAvifInfoOk with the same input bytes. AvifInfoStatus AvifInfoGetFeaturesStream(void* stream, read_stream_t read, skip_stream_t skip, AvifInfoFeatures* features); diff -Nru php8.4-8.4.16/ext/standard/mail.c php8.4-8.4.21/ext/standard/mail.c --- php8.4-8.4.16/ext/standard/mail.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/mail.c 2026-05-05 16:34:12.000000000 +0000 @@ -214,7 +214,8 @@ ZEND_HASH_FOREACH_KEY_VAL(headers, idx, key, val) { if (!key) { zend_type_error("Header name cannot be numeric, " ZEND_LONG_FMT " given", idx); - break; + smart_str_free(&s); + return NULL; } ZVAL_DEREF(val); /* https://tools.ietf.org/html/rfc2822#section-3.6 */ diff -Nru php8.4-8.4.16/ext/standard/math.c php8.4-8.4.21/ext/standard/math.c --- php8.4-8.4.16/ext/standard/math.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/math.c 2026-05-05 16:34:12.000000000 +0000 @@ -807,9 +807,9 @@ e = s + ZSTR_LEN(str); /* Skip leading whitespace */ - while (s < e && isspace(*s)) s++; + while (s < e && isspace((unsigned char)*s)) s++; /* Skip trailing whitespace */ - while (s < e && isspace(*(e-1))) e--; + while (s < e && isspace((unsigned char)e[-1])) e--; if (e - s >= 2) { if (base == 16 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) s += 2; @@ -1122,7 +1122,7 @@ tmpbuf = strpprintf(0, "%.*F", dec, d); if (tmpbuf == NULL) { return NULL; - } else if (!isdigit((int)ZSTR_VAL(tmpbuf)[0])) { + } else if (!isdigit((unsigned char)ZSTR_VAL(tmpbuf)[0])) { return tmpbuf; } diff -Nru php8.4-8.4.16/ext/standard/metaphone.c php8.4-8.4.21/ext/standard/metaphone.c --- php8.4-8.4.16/ext/standard/metaphone.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/metaphone.c 2026-05-05 16:34:12.000000000 +0000 @@ -80,7 +80,7 @@ /* Note: these functions require an uppercase letter input! */ static zend_always_inline char encode(char c) { - if (isalpha(c)) { + if (isalpha((unsigned char)c)) { ZEND_ASSERT(c >= 'A' && c <= 'Z'); return _codes[(c - 'A')]; } else { @@ -109,7 +109,7 @@ /* I suppose I could have been using a character pointer instead of * accesssing the array directly... */ -#define Convert_Raw(c) toupper(c) +#define Convert_Raw(c) toupper((unsigned char)c) /* Look at the next letter in the word */ #define Read_Raw_Next_Letter (word[w_idx+1]) #define Read_Next_Letter (Convert_Raw(Read_Raw_Next_Letter)) @@ -123,14 +123,14 @@ /* Look two letters down. It makes sure you don't walk off the string. */ #define Read_After_Next_Letter (Read_Raw_Next_Letter != '\0' ? Convert_Raw(word[w_idx+2]) \ : '\0') -#define Look_Ahead_Letter(n) (toupper(Lookahead((char *) word+w_idx, n))) +#define Look_Ahead_Letter(n) (toupper((unsigned char)Lookahead((char *) word+w_idx, n))) /* Allows us to safely look ahead an arbitrary # of letters */ /* I probably could have just used strlen... */ -static char Lookahead(char *word, int how_far) +static char Lookahead(char *word, size_t how_far) { - int idx; + size_t idx; for (idx = 0; word[idx] != '\0' && idx < how_far; idx++); /* Edge forward in the string... */ @@ -165,12 +165,12 @@ #define Phone_Len (p_idx) /* Note is a letter is a 'break' in the word */ -#define Isbreak(c) (!isalpha(c)) +#define Isbreak(c) (!isalpha((unsigned char)(c))) /* {{{ metaphone */ static void metaphone(unsigned char *word, size_t word_len, zend_long max_phonemes, zend_string **phoned_word, int traditional) { - int w_idx = 0; /* point in the phonization we're at. */ + size_t w_idx = 0; /* point in the phonization we're at. */ size_t p_idx = 0; /* end of the phoned phrase */ size_t max_buffer_len = 0; /* maximum length of the destination buffer */ char curr_letter; @@ -189,7 +189,7 @@ /*-- The first phoneme has to be processed specially. --*/ /* Find our first letter */ - for (; !isalpha(curr_letter = Read_Raw_Curr_Letter); w_idx++) { + for (; !isalpha((unsigned char)(curr_letter = Read_Raw_Curr_Letter)); w_idx++) { /* On the off chance we were given nothing but crap... */ if (curr_letter == '\0') { End_Phoned_Word(); @@ -277,7 +277,7 @@ */ /* Ignore non-alphas */ - if (!isalpha(curr_letter)) + if (!isalpha((unsigned char)curr_letter)) continue; curr_letter = Convert_Raw(curr_letter); diff -Nru php8.4-8.4.16/ext/standard/proc_open.c php8.4-8.4.21/ext/standard/proc_open.c --- php8.4-8.4.16/ext/standard/proc_open.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/proc_open.c 2026-05-05 16:34:12.000000000 +0000 @@ -507,7 +507,7 @@ } descriptorspec_item; static zend_string *get_valid_arg_string(zval *zv, int elem_num) { - zend_string *str = zval_get_string(zv); + zend_string *str = zval_try_get_string(zv); if (!str) { return NULL; } diff -Nru php8.4-8.4.16/ext/standard/quot_print.c php8.4-8.4.21/ext/standard/quot_print.c --- php8.4-8.4.16/ext/standard/quot_print.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/quot_print.c 2026-05-05 16:34:12.000000000 +0000 @@ -212,11 +212,11 @@ switch (str_in[i]) { case '=': if (str_in[i + 1] && str_in[i + 2] && - isxdigit((int) str_in[i + 1]) && - isxdigit((int) str_in[i + 2])) + isxdigit((unsigned char)str_in[i + 1]) && + isxdigit((unsigned char)str_in[i + 2])) { - ZSTR_VAL(str_out)[j++] = (php_hex2int((int) str_in[i + 1]) << 4) - + php_hex2int((int) str_in[i + 2]); + ZSTR_VAL(str_out)[j++] = (php_hex2int((unsigned char)str_in[i + 1]) << 4) + + php_hex2int((unsigned char)str_in[i + 2]); i += 3; } else /* check for soft line break according to RFC 2045*/ { k = 1; diff -Nru php8.4-8.4.16/ext/standard/scanf.c php8.4-8.4.21/ext/standard/scanf.c --- php8.4-8.4.16/ext/standard/scanf.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/scanf.c 2026-05-05 16:34:12.000000000 +0000 @@ -345,7 +345,7 @@ goto xpgCheckDone; } - if ( isdigit( (int)*ch ) ) { + if ( isdigit( (unsigned char)*ch ) ) { /* * Check for an XPG3-style %n$ specification. Note: there * must not be a mixture of XPG3 specs and non-XPG3 specs @@ -656,9 +656,9 @@ /* * If we see whitespace in the format, skip whitespace in the string. */ - if ( isspace( (int)*ch ) ) { + if ( isspace( (unsigned char)*ch ) ) { sch = *string; - while ( isspace( (int)sch ) ) { + while ( isspace( (unsigned char)sch ) ) { if (*string == '\0') { goto done; } @@ -809,7 +809,7 @@ if (!(flags & SCAN_NOSKIP)) { while (*string != '\0') { sch = *string; - if (! isspace((int)sch) ) { + if (! isspace((unsigned char)sch) ) { break; } string++; @@ -835,7 +835,7 @@ end = string; while (*end != '\0') { sch = *end; - if ( isspace( (int)sch ) ) { + if ( isspace( (unsigned char)sch ) ) { break; } end++; diff -Nru php8.4-8.4.16/ext/standard/soundex.c php8.4-8.4.21/ext/standard/soundex.c --- php8.4-8.4.16/ext/standard/soundex.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/soundex.c 2026-05-05 16:34:12.000000000 +0000 @@ -65,7 +65,7 @@ /* BUG: should also map here accented letters used in non */ /* English words or names (also found in English text!): */ /* esstsett, thorn, n-tilde, c-cedilla, s-caron, ... */ - code = toupper((int)(unsigned char)str[i]); + code = toupper((unsigned char)str[i]); if (code >= 'A' && code <= 'Z') { if (_small == 0) { /* remember first valid char */ diff -Nru php8.4-8.4.16/ext/standard/string.c php8.4-8.4.21/ext/standard/string.c --- php8.4-8.4.16/ext/standard/string.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/string.c 2026-05-05 16:34:12.000000000 +0000 @@ -3748,9 +3748,9 @@ case 'f': *target++='\f'; nlen--; break; case '\\': *target++='\\'; nlen--; break; case 'x': - if (source+1 < end && isxdigit((int)(*(source+1)))) { + if (source+1 < end && isxdigit((unsigned char)source[1])) { numtmp[0] = *++source; - if (source+1 < end && isxdigit((int)(*(source+1)))) { + if (source+1 < end && isxdigit((unsigned char)source[1])) { numtmp[1] = *++source; numtmp[2] = '\0'; nlen-=3; @@ -4605,7 +4605,7 @@ do { if (block_type == _HEB_BLOCK_TYPE_HEB) { - while ((isheb((int)*(tmp+1)) || _isblank((int)*(tmp+1)) || ispunct((int)*(tmp+1)) || (int)*(tmp+1)=='\n' ) && block_end block_start) { + while ((_isblank((int)*tmp) || ispunct((unsigned char)*tmp)) && *tmp!='/' && *tmp!='-' && block_end > block_start) { tmp--; block_end--; } @@ -5036,7 +5036,7 @@ done =1; break; default: - if (!isspace((int)c)) { + if (!isspace((unsigned char)c)) { if (state == 0) { state=1; } @@ -5126,7 +5126,7 @@ if (in_q) { break; } - if (isspace(*(p + 1)) && !allow_tag_spaces) { + if (isspace((unsigned char)p[1]) && !allow_tag_spaces) { *(rp++) = c; break; } @@ -5173,7 +5173,7 @@ if (in_q) { break; } - if (isspace(*(p + 1)) && !allow_tag_spaces) { + if (isspace((unsigned char)p[1]) && !allow_tag_spaces) { goto reg_char_1; } depth++; diff -Nru php8.4-8.4.16/ext/standard/strnatcmp.c php8.4-8.4.21/ext/standard/strnatcmp.c --- php8.4-8.4.16/ext/standard/strnatcmp.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/strnatcmp.c 2026-05-05 16:34:12.000000000 +0000 @@ -40,12 +40,12 @@ both numbers to know that they have the same magnitude, so we remember it in BIAS. */ for(;; (*a)++, (*b)++) { - if ((*a == aend || !isdigit((int)(unsigned char)**a)) && - (*b == bend || !isdigit((int)(unsigned char)**b))) + if ((*a == aend || !isdigit((unsigned char)**a)) && + (*b == bend || !isdigit((unsigned char)**b))) return bias; - else if (*a == aend || !isdigit((int)(unsigned char)**a)) + else if (*a == aend || !isdigit((unsigned char)**a)) return -1; - else if (*b == bend || !isdigit((int)(unsigned char)**b)) + else if (*b == bend || !isdigit((unsigned char)**b)) return +1; else if (**a < **b) { if (!bias) @@ -67,12 +67,12 @@ /* Compare two left-aligned numbers: the first to have a different value wins. */ for(;; (*a)++, (*b)++) { - if ((*a == aend || !isdigit((int)(unsigned char)**a)) && - (*b == bend || !isdigit((int)(unsigned char)**b))) + if ((*a == aend || !isdigit((unsigned char)**a)) && + (*b == bend || !isdigit((unsigned char)**b))) return 0; - else if (*a == aend || !isdigit((int)(unsigned char)**a)) + else if (*a == aend || !isdigit((unsigned char)**a)) return -1; - else if (*b == bend || !isdigit((int)(unsigned char)**b)) + else if (*b == bend || !isdigit((unsigned char)**b)) return +1; else if (**a < **b) return -1; @@ -103,27 +103,27 @@ ca = *ap; cb = *bp; /* skip over leading zeros */ - while (ca == '0' && (ap+1 < aend) && isdigit((int)(unsigned char)*(ap+1))) { + while (ca == '0' && (ap+1 < aend) && isdigit((unsigned char)ap[1])) { ca = *++ap; } - while (cb == '0' && (bp+1 < bend) && isdigit((int)(unsigned char)*(bp+1))) { + while (cb == '0' && (bp+1 < bend) && isdigit((unsigned char)bp[1])) { cb = *++bp; } while (1) { /* Skip consecutive whitespace */ - while (isspace((int)(unsigned char)ca)) { + while (isspace(ca)) { ca = *++ap; } - while (isspace((int)(unsigned char)cb)) { + while (isspace(cb)) { cb = *++bp; } /* process run of digits */ - if (isdigit((int)(unsigned char)ca) && isdigit((int)(unsigned char)cb)) { + if (isdigit(ca) && isdigit(cb)) { fractional = (ca == '0' || cb == '0'); if (fractional) @@ -147,8 +147,8 @@ } if (is_case_insensitive) { - ca = toupper((int)(unsigned char)ca); - cb = toupper((int)(unsigned char)cb); + ca = toupper(ca); + cb = toupper(cb); } if (ca < cb) diff -Nru php8.4-8.4.16/ext/standard/tests/GHSA-96wq-48vp-hh57.phpt php8.4-8.4.21/ext/standard/tests/GHSA-96wq-48vp-hh57.phpt --- php8.4-8.4.16/ext/standard/tests/GHSA-96wq-48vp-hh57.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/GHSA-96wq-48vp-hh57.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,22 @@ +--TEST-- +GHSA-96wq-48vp-hh57: signed integer overflow of char array offset +--CREDITS-- +012git012 +--INI-- +memory_limit=3G +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff -Nru php8.4-8.4.16/ext/standard/tests/file/bug52820.phpt php8.4-8.4.21/ext/standard/tests/file/bug52820.phpt --- php8.4-8.4.16/ext/standard/tests/file/bug52820.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/file/bug52820.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -45,22 +45,18 @@ --EXPECTREGEX-- temp stream \(close after\): About to rewind! -(\* processing: file:\/\/\/i_dont_exist\/\n)?\* Couldn't open file \/i_dont_exist\/ -\* [Cc]losing connection( #?-?\d+)? +(\* processing: file:\/\/\/i_dont_exist\/\n)?\* (Couldn't|Could not) open file \/i_dont_exist\/(\n\* [Cc]losing connection( #?-?\d+)?)? memory stream \(close after\): About to rewind! -(\* processing: file:\/\/\/i_dont_exist\/\n)?\* Couldn't open file \/i_dont_exist\/ -\* [Cc]losing connection( #?-?\d+)? +(\* processing: file:\/\/\/i_dont_exist\/\n)?\* (Couldn't|Could not) open file \/i_dont_exist\/(\n\* [Cc]losing connection( #?-?\d+)?)? temp stream \(leak\): About to rewind! -(\* processing: file:\/\/\/i_dont_exist\/\n)?\* Couldn't open file \/i_dont_exist\/ -\* [Cc]losing connection( #?-?\d+)? +(\* processing: file:\/\/\/i_dont_exist\/\n)?\* (Couldn't|Could not) open file \/i_dont_exist\/(\n\* [Cc]losing connection( #?-?\d+)?)? memory stream \(leak\): About to rewind! -(\* processing: file:\/\/\/i_dont_exist\/\n)?\* Couldn't open file \/i_dont_exist\/ -\* [Cc]losing connection( #?-?\d+)? +(\* processing: file:\/\/\/i_dont_exist\/\n)?\* (Couldn't|Could not) open file \/i_dont_exist\/(\n\* [Cc]losing connection( #?-?\d+)?)? Done\. diff -Nru php8.4-8.4.16/ext/standard/tests/file/bug69442.phpt php8.4-8.4.21/ext/standard/tests/file/bug69442.phpt --- php8.4-8.4.16/ext/standard/tests/file/bug69442.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/file/bug69442.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,6 @@ --TEST-- proc_open with PTY closes incorrect file descriptor +--FLAKY-- --SKIPIF-- +--FILE-- + +--CLEAN-- + +--EXPECT-- +int(1000) diff -Nru php8.4-8.4.16/ext/standard/tests/file/file_get_contents_file_put_contents_5gb.phpt php8.4-8.4.21/ext/standard/tests/file/file_get_contents_file_put_contents_5gb.phpt --- php8.4-8.4.16/ext/standard/tests/file/file_get_contents_file_put_contents_5gb.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/file/file_get_contents_file_put_contents_5gb.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -2,6 +2,7 @@ Test file_put_contents() and file_get_contents() functions with 5GB string --SKIPIF-- datalen; + stream_bucket_append($out, $bucket); + } + return PSFS_PASS_ON; + } +} + +stream_filter_register("pass", "pass_filter"); +$fp = fopen("php://memory", "w"); +stream_filter_append($fp, "pass"); + +try { + fwrite($fp, "data"); +} catch (TypeError $e) { + echo $e::class, ": ", $e->getMessage(), "\n"; +} + +try { + fclose($fp); +} catch (TypeError $e) { + echo $e::class, ": ", $e->getMessage(), "\n"; +} + +unset($fp); // prevent cleanup at shutdown + +?> +--EXPECTF-- +Warning: fwrite(): Unprocessed filter buckets remaining on input brigade in %s on line %d +TypeError: Cannot assign resource to property pass_filter::$stream of type int +TypeError: Cannot assign resource to property pass_filter::$stream of type int diff -Nru php8.4-8.4.16/ext/standard/tests/filters/gh20370_dynamic_stream_property.phpt php8.4-8.4.21/ext/standard/tests/filters/gh20370_dynamic_stream_property.phpt --- php8.4-8.4.16/ext/standard/tests/filters/gh20370_dynamic_stream_property.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/filters/gh20370_dynamic_stream_property.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,51 @@ +--TEST-- +GH-20370 (User filters should update dynamic stream property if it exists) +--FILE-- +stream = null; + return true; + } + + function filter($in, $out, &$consumed, $closing): int + { + while ($bucket = stream_bucket_make_writeable($in)) { + $consumed += $bucket->datalen; + stream_bucket_append($out, $bucket); + } + var_dump(property_exists($this, 'stream')); + if (is_resource($this->stream)) { + var_dump(get_resource_type($this->stream)); + } + return PSFS_PASS_ON; + } +} + +stream_filter_register("pass", "pass_filter"); +$fp = fopen("php://memory", "w"); +stream_filter_append($fp, "pass"); + +fwrite($fp, "data"); +rewind($fp); +echo fread($fp, 1024) . "\n"; + +?> +--EXPECTF-- +bool(true) +string(6) "stream" +bool(true) +string(6) "stream" +bool(true) +string(6) "stream" +bool(true) +string(6) "stream" +data +bool(true) diff -Nru php8.4-8.4.16/ext/standard/tests/filters/gh20370_no_stream_property.phpt php8.4-8.4.21/ext/standard/tests/filters/gh20370_no_stream_property.phpt --- php8.4-8.4.16/ext/standard/tests/filters/gh20370_no_stream_property.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/filters/gh20370_no_stream_property.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,37 @@ +--TEST-- +GH-20370 (User filters should not create stream property if not declared) +--FILE-- +datalen; + stream_bucket_append($out, $bucket); + } + + var_dump(property_exists($this, 'stream')); + return PSFS_PASS_ON; + } +} + +stream_filter_register("pass", "pass_filter"); +$fp = fopen("php://memory", "w"); +stream_filter_append($fp, "pass"); +fwrite($fp, "data"); +rewind($fp); +echo fread($fp, 1024) . "\n"; + +?> +--EXPECT-- +bool(false) +bool(false) +bool(false) +bool(false) +data +bool(false) diff -Nru php8.4-8.4.16/ext/standard/tests/filters/gh20370_private_stream_property.phpt php8.4-8.4.21/ext/standard/tests/filters/gh20370_private_stream_property.phpt --- php8.4-8.4.16/ext/standard/tests/filters/gh20370_private_stream_property.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/filters/gh20370_private_stream_property.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,38 @@ +--TEST-- +GH-20370 (User filters should handle private stream property correctly) +--FILE-- +datalen; + stream_bucket_append($out, $bucket); + } + return PSFS_PASS_ON; + } + + function onClose() + { + var_dump($this->stream); // should be null + } +} + +stream_filter_register("pass", "pass_filter"); +$fp = fopen("php://memory", "w"); +stream_filter_append($fp, "pass", STREAM_FILTER_WRITE); + +fwrite($fp, "data"); +rewind($fp); +echo fread($fp, 1024) . "\n"; + +?> +--EXPECT-- +data +NULL diff -Nru php8.4-8.4.16/ext/standard/tests/general_functions/gh20840.phpt php8.4-8.4.21/ext/standard/tests/general_functions/gh20840.phpt --- php8.4-8.4.16/ext/standard/tests/general_functions/gh20840.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/general_functions/gh20840.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,47 @@ +--TEST-- +GH-20840 (var_dump() crash with nested objects) +--CREDITS-- +bendrissou +--SKIPIF-- + +--INI-- +zend.max_allowed_stack_size=256K +--FILE-- +next = $newNode; + $node = $newNode; +} + +$buffer = ''; +ob_start(function ($chunk) use (&$buffer) { + $buffer .= $chunk; + $buffer = preg_replace('(\s*object\(Node\)#\d+ \(\d+\) \{\s*)', '', $buffer); + $buffer = preg_replace('(\s*\["next"\]=>\s*)', '', $buffer); + $buffer = preg_replace('(\s*\}\s*)', '', $buffer); +}); +var_dump($firstNode); +ob_end_flush(); +echo $buffer; + +while ($next = $firstNode->next) { + $firstNode->next = $next->next; +} +?> +--EXPECT-- +nesting level too deep diff -Nru php8.4-8.4.16/ext/standard/tests/gh20695.phpt php8.4-8.4.21/ext/standard/tests/gh20695.phpt --- php8.4-8.4.16/ext/standard/tests/gh20695.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/gh20695.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,14 @@ +--TEST-- +GH-20695 (Assertion failure in normalize_value() when parsing malformed INI input via parse_ini_string()) +--FILE-- + +--EXPECT-- +array(1) { + [8]=> + array(1) { + ["["]=> + int(0) + } +} diff -Nru php8.4-8.4.16/ext/standard/tests/http/http_build_query/gh20583.phpt php8.4-8.4.21/ext/standard/tests/http/http_build_query/gh20583.phpt --- php8.4-8.4.16/ext/standard/tests/http/http_build_query/gh20583.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/http/http_build_query/gh20583.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -10,11 +10,11 @@ } ?> --INI-- -zend.max_allowed_stack_size=128K +zend.max_allowed_stack_size=256K --FILE-- $a]; } try { diff -Nru php8.4-8.4.16/ext/standard/tests/image/gh20582.phpt php8.4-8.4.21/ext/standard/tests/image/gh20582.phpt --- php8.4-8.4.16/ext/standard/tests/image/gh20582.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/image/gh20582.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,54 @@ +--TEST-- +GH-20582 (Heap Buffer Overflow in iptcembed) +--CREDITS-- +Nikita Sveshnikov (Positive Technologies) +ndossche +--SKIPIF-- + +--FILE-- + STDIN, + 1 => STDOUT, + 2 => STDOUT, +); +$pipes = []; +$proc = proc_open([PHP_BINARY, '-n', '-r', "var_dump(iptcembed('A', '$pipe'));"], $descriptorspec, $pipes); + +// Blocks until a reader opens it +$fp = fopen($pipe, 'wb') or die("Failed to open FIFO"); + +// Write header +$data = "\xFF\xD8"; // SOI marker +$data .= "\xFF\xE0\x00\x10"; // APP0 marker (JFIF) +$data .= "JFIF" . str_repeat("\x00", 9); +$data .= "\xFF\xDA\x00\x08"; // SOS marker +$data .= str_repeat("\x00", 6); +fwrite($fp, $data); + +// Write garbage +fwrite($fp, str_repeat("A", 5120)); + +fclose($fp); + +?> +--CLEAN-- + +--EXPECTF-- +string(1055) "%0JFIF%0%0%0%0%0%0%0%0%0%0Photoshop 3.0%08BIM%0%0%0%0%0A%0%0%0%0%0%0%0%0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" diff -Nru php8.4-8.4.16/ext/standard/tests/mail/gh20776.phpt php8.4-8.4.21/ext/standard/tests/mail/gh20776.phpt --- php8.4-8.4.16/ext/standard/tests/mail/gh20776.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/mail/gh20776.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,15 @@ +--TEST-- +GH-20776: mail() memory leak when header array contains numeric keys +--FILE-- + 'Value', 5 => 'invalid key'])); +} catch (Throwable $e) { + echo $e::class, ': ', $e->getMessage(), PHP_EOL; +} +?> +--EXPECT-- +TypeError: Header name cannot be numeric, 5 given diff -Nru php8.4-8.4.16/ext/standard/tests/skipif_no_root.inc php8.4-8.4.21/ext/standard/tests/skipif_no_root.inc --- php8.4-8.4.16/ext/standard/tests/skipif_no_root.inc 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/skipif_no_root.inc 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,16 @@ + --INI-- diff -Nru php8.4-8.4.16/ext/standard/tests/strings/gh18976.phpt php8.4-8.4.21/ext/standard/tests/strings/gh18976.phpt --- php8.4-8.4.16/ext/standard/tests/strings/gh18976.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/strings/gh18976.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -2,6 +2,10 @@ GH-18976 (pack overflow with h/H format) --INI-- memory_limit=-1 +--SKIPIF-- + --FILE-- getMessage(), "\n"; +} +?> +--EXPECTF-- +%a +Fatal error: php_strip_whitespace(): Cannot use output buffering in output buffering display handlers in %s on line %d diff -Nru php8.4-8.4.16/ext/standard/tests/strings/gh20906_2.phpt php8.4-8.4.21/ext/standard/tests/strings/gh20906_2.phpt --- php8.4-8.4.16/ext/standard/tests/strings/gh20906_2.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/strings/gh20906_2.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,21 @@ +--TEST-- +GH-20906 (Assertion failure when messing up output buffers) - highlight_file +--CREDITS-- +vi3tL0u1s +--FILE-- + +--EXPECTF-- +%a +Fatal error: highlight_file(): Cannot use output buffering in output buffering display handlers in %s on line %d diff -Nru php8.4-8.4.16/ext/standard/tests/strings/gh20906_3.phpt php8.4-8.4.21/ext/standard/tests/strings/gh20906_3.phpt --- php8.4-8.4.16/ext/standard/tests/strings/gh20906_3.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/standard/tests/strings/gh20906_3.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,21 @@ +--TEST-- +GH-20906 (Assertion failure when messing up output buffers) - highlight_string +--CREDITS-- +vi3tL0u1s +--FILE-- + +--EXPECTF-- +%a +Fatal error: highlight_string(): Cannot use output buffering in output buffering display handlers in %s on line %d diff -Nru php8.4-8.4.16/ext/standard/type.c php8.4-8.4.21/ext/standard/type.c --- php8.4-8.4.16/ext/standard/type.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/type.c 2026-05-05 16:34:12.000000000 +0000 @@ -160,7 +160,7 @@ char *strval = Z_STRVAL_P(num); size_t strlen = Z_STRLEN_P(num); - while (isspace(*strval) && strlen) { + while (isspace((unsigned char)*strval) && strlen) { strval++; strlen--; } diff -Nru php8.4-8.4.16/ext/standard/url.c php8.4-8.4.21/ext/standard/url.c --- php8.4-8.4.16/ext/standard/url.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/url.c 2026-05-05 16:34:12.000000000 +0000 @@ -105,7 +105,7 @@ p = s; while (p < e) { /* scheme = 1*[ lowalpha | digit | "+" | "-" | "." ] */ - if (!isalpha(*p) && !isdigit(*p) && *p != '+' && *p != '.' && *p != '-') { + if (!isalpha((unsigned char)*p) && !isdigit((unsigned char)*p) && *p != '+' && *p != '.' && *p != '-') { if (e + 1 < ue && e < binary_strcspn(s, ue, "?#")) { goto parse_port; } else if (s + 1 < ue && *s == '/' && *(s + 1) == '/') { /* relative-scheme URL */ @@ -134,7 +134,7 @@ * correctly parse things like a.com:80 */ p = e + 1; - while (p < ue && isdigit(*p)) { + while (p < ue && isdigit((unsigned char)*p)) { p++; } @@ -174,7 +174,7 @@ p = e + 1; pp = p; - while (pp < ue && pp - p < 6 && isdigit(*pp)) { + while (pp < ue && pp - p < 6 && isdigit((unsigned char)*pp)) { pp++; } @@ -417,12 +417,12 @@ int value; int c; - c = ((unsigned char *)s)[0]; + c = (unsigned char)s[0]; if (isupper(c)) c = tolower(c); value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16; - c = ((unsigned char *)s)[1]; + c = (unsigned char)s[1]; if (isupper(c)) c = tolower(c); value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10; @@ -588,8 +588,8 @@ if (*data == '+') { *dest = ' '; } - else if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1)) - && isxdigit((int) *(data + 2))) { + else if (*data == '%' && len >= 2 && isxdigit((unsigned char)data[1]) + && isxdigit((unsigned char)data[2])) { *dest = (char) php_htoi(data + 1); data += 2; len -= 2; @@ -647,8 +647,8 @@ char *data = str; while (len--) { - if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1)) - && isxdigit((int) *(data + 2))) { + if (*data == '%' && len >= 2 && isxdigit((unsigned char)data[1]) + && isxdigit((unsigned char)data[2])) { *dest = (char) php_htoi(data + 1); data += 2; len -= 2; @@ -709,7 +709,7 @@ c = *p; *p = '\0'; s = p + 1; - while (isspace((int)*(unsigned char *)s)) { + while (isspace((unsigned char)*s)) { s++; } diff -Nru php8.4-8.4.16/ext/standard/url_scanner_ex.c php8.4-8.4.21/ext/standard/url_scanner_ex.c --- php8.4-8.4.16/ext/standard/url_scanner_ex.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/url_scanner_ex.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 3.1 */ +/* Generated by re2c 4.3 */ /* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | @@ -86,7 +86,7 @@ *val++ = '\0'; for (q = key; *q; q++) { - *q = tolower(*q); + *q = tolower((unsigned char)*q); } keylen = q - key; str = zend_string_init(key, keylen, 1); @@ -138,7 +138,7 @@ char *q; for (q = key; *q; q++) { - *q = tolower(*q); + *q = tolower((unsigned char)*q); } keylen = q - key; if (keylen > 0) { @@ -458,7 +458,7 @@ } smart_str_appendl(&ctx->tag, start, YYCURSOR - start); for (i = 0; i < ZSTR_LEN(ctx->tag.s); i++) - ZSTR_VAL(ctx->tag.s)[i] = tolower((int)(unsigned char)ZSTR_VAL(ctx->tag.s)[i]); + ZSTR_VAL(ctx->tag.s)[i] = tolower((unsigned char)ZSTR_VAL(ctx->tag.s)[i]); /* intentionally using str_find here, in case the hash value is set, but the string val is changed later */ if ((ctx->lookup_data = zend_hash_str_find_ptr(ctx->tags, ZSTR_VAL(ctx->tag.s), ZSTR_LEN(ctx->tag.s))) != NULL) { ok = 1; @@ -525,53 +525,49 @@ { YYCTYPE yych; - static const unsigned char yybm[] = { - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 0, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, + static const unsigned char yybm[256] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 0, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128 }; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy1; - } + if (yybm[0+yych] & 128) goto yy1; goto yy2; yy1: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy1; - } + if (yybm[0+yych] & 128) goto yy1; { passthru(STD_ARGS); goto state_plain; } yy2: ++YYCURSOR; @@ -584,54 +580,50 @@ { YYCTYPE yych; - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + static const unsigned char yybm[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 128, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy4; - } + if (yybm[0+yych] & 128) goto yy4; ++YYCURSOR; { passthru(STD_ARGS); goto state_plain_begin; } yy4: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy4; - } + if (yybm[0+yych] & 128) goto yy4; { handle_tag(STD_ARGS); /* Sets STATE */; passthru(STD_ARGS); if (STATE == STATE_PLAIN) goto state_plain; else goto state_next_arg; } } @@ -644,45 +636,43 @@ { YYCTYPE yych; - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 0, 128, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + static const unsigned char yybm[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy8; - } + if (yybm[0+yych] & 128) goto yy8; if (yych <= '>') { if (yych == '/') goto yy9; if (yych >= '>') goto yy10; @@ -702,9 +692,7 @@ ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy8; - } + if (yybm[0+yych] & 128) goto yy8; { passthru(STD_ARGS); goto state_next_arg; } yy9: yych = *++YYCURSOR; @@ -723,39 +711,39 @@ { YYCTYPE yych; - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + static const unsigned char yybm[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; @@ -770,9 +758,7 @@ ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy14; - } + if (yybm[0+yych] & 128) goto yy14; { passthru(STD_ARGS); handle_arg(STD_ARGS); STATE = STATE_BEFORE_VAL; goto state_before_val; } } @@ -782,39 +768,39 @@ { YYCTYPE yych; - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + static const unsigned char yybm[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; @@ -831,9 +817,7 @@ ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy18; - } + if (yybm[0+yych] & 128) goto yy18; { passthru(STD_ARGS); STATE = STATE_VAL; goto state_val; } yy19: ++YYCURSOR; @@ -852,45 +836,43 @@ { YYCTYPE yych; - static const unsigned char yybm[] = { - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 192, 192, 224, 224, 192, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 192, 224, 128, 224, 224, 224, 224, 64, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 0, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, + static const unsigned char yybm[256] = { + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 192, 192, 224, 224, 192, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 192, 224, 128, 224, 224, 224, 224, 64, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 0, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 224, 224, 224, 224, 224, 224 }; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - if (yybm[0+yych] & 32) { - goto yy21; - } + if (yybm[0+yych] & 32) goto yy21; if (yych <= ' ') goto yy22; if (yych <= '"') goto yy24; if (yych <= '\'') goto yy25; @@ -899,9 +881,7 @@ ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if (yybm[0+yych] & 32) { - goto yy21; - } + if (yybm[0+yych] & 32) goto yy21; { handle_val(STD_ARGS, 0, ' '); goto state_next_arg_begin; } yy22: ++YYCURSOR; @@ -920,9 +900,7 @@ if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; yy27: - if (yybm[0+yych] & 64) { - goto yy26; - } + if (yybm[0+yych] & 64) goto yy26; if (yych <= '"') goto yy29; yy28: YYCURSOR = YYMARKER; @@ -935,9 +913,7 @@ if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; yy31: - if (yybm[0+yych] & 128) { - goto yy30; - } + if (yybm[0+yych] & 128) goto yy30; if (yych >= '(') goto yy28; ++YYCURSOR; { handle_val(STD_ARGS, 1, '\''); goto state_next_arg_begin; } diff -Nru php8.4-8.4.16/ext/standard/url_scanner_ex.re php8.4-8.4.21/ext/standard/url_scanner_ex.re --- php8.4-8.4.16/ext/standard/url_scanner_ex.re 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/url_scanner_ex.re 2026-05-05 16:34:12.000000000 +0000 @@ -85,7 +85,7 @@ *val++ = '\0'; for (q = key; *q; q++) { - *q = tolower(*q); + *q = tolower((unsigned char)*q); } keylen = q - key; str = zend_string_init(key, keylen, 1); @@ -137,7 +137,7 @@ char *q; for (q = key; *q; q++) { - *q = tolower(*q); + *q = tolower((unsigned char)*q); } keylen = q - key; if (keylen > 0) { @@ -463,7 +463,7 @@ } smart_str_appendl(&ctx->tag, start, YYCURSOR - start); for (i = 0; i < ZSTR_LEN(ctx->tag.s); i++) - ZSTR_VAL(ctx->tag.s)[i] = tolower((int)(unsigned char)ZSTR_VAL(ctx->tag.s)[i]); + ZSTR_VAL(ctx->tag.s)[i] = tolower((unsigned char)ZSTR_VAL(ctx->tag.s)[i]); /* intentionally using str_find here, in case the hash value is set, but the string val is changed later */ if ((ctx->lookup_data = zend_hash_str_find_ptr(ctx->tags, ZSTR_VAL(ctx->tag.s), ZSTR_LEN(ctx->tag.s))) != NULL) { ok = 1; diff -Nru php8.4-8.4.16/ext/standard/user_filters.c php8.4-8.4.21/ext/standard/user_filters.c --- php8.4-8.4.16/ext/standard/user_filters.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/user_filters.c 2026-05-05 16:34:12.000000000 +0000 @@ -148,14 +148,31 @@ uint32_t orig_no_fclose = stream->flags & PHP_STREAM_FLAG_NO_FCLOSE; stream->flags |= PHP_STREAM_FLAG_NO_FCLOSE; - zval *stream_prop = zend_hash_str_find_ind(Z_OBJPROP_P(obj), "stream", sizeof("stream")-1); - if (stream_prop) { - /* Give the userfilter class a hook back to the stream */ - zval_ptr_dtor(stream_prop); - php_stream_to_zval(stream, stream_prop); - Z_ADDREF_P(stream_prop); + /* Give the userfilter class a hook back to the stream */ + zend_class_entry *old_scope = EG(fake_scope); + EG(fake_scope) = Z_OBJCE_P(obj); + + zend_string *stream_name = ZSTR_INIT_LITERAL("stream", 0); + bool stream_property_exists = Z_OBJ_HT_P(obj)->has_property(Z_OBJ_P(obj), stream_name, ZEND_PROPERTY_EXISTS, NULL); + if (stream_property_exists) { + zval stream_zval; + php_stream_to_zval(stream, &stream_zval); + zend_update_property_ex(Z_OBJCE_P(obj), Z_OBJ_P(obj), stream_name, &stream_zval); + /* If property update threw an exception, skip filter execution */ + if (EG(exception)) { + EG(fake_scope) = old_scope; + if (buckets_in->head) { + php_error_docref(NULL, E_WARNING, "Unprocessed filter buckets remaining on input brigade"); + } + zend_string_release(stream_name); + stream->flags &= ~PHP_STREAM_FLAG_NO_FCLOSE; + stream->flags |= orig_no_fclose; + return PSFS_ERR_FATAL; + } } + EG(fake_scope) = old_scope; + ZVAL_STRINGL(&func_name, "filter", sizeof("filter")-1); /* Setup calling arguments */ @@ -196,11 +213,16 @@ /* filter resources are cleaned up by the stream destructor, * keeping a reference to the stream resource here would prevent it - * from being destroyed properly */ - if (stream_prop) { - convert_to_null(stream_prop); + * from being destroyed properly. + * Since the property accepted a resource assignment above, it must have + * no type hint or be typed as mixed, so we can safely assign null. + */ + if (stream_property_exists) { + zend_update_property_null(Z_OBJCE_P(obj), Z_OBJ_P(obj), ZSTR_VAL(stream_name), ZSTR_LEN(stream_name)); } + zend_string_release(stream_name); + zval_ptr_dtor(&args[3]); zval_ptr_dtor(&args[2]); zval_ptr_dtor(&args[1]); @@ -237,8 +259,8 @@ len = strlen(filtername); /* determine the classname/class entry */ - if (NULL == (fdat = zend_hash_str_find_ptr(BG(user_filter_map), (char*)filtername, len))) { - char *period; + if (NULL == (fdat = zend_hash_str_find_ptr(BG(user_filter_map), filtername, len))) { + const char *period; /* Userspace Filters using ambiguous wildcards could cause problems. i.e.: myfilter.foo.bar will always call into myfilter.foo.* @@ -250,16 +272,16 @@ /* Search for wildcard matches instead */ memcpy(wildcard, filtername, len + 1); /* copy \0 */ - period = wildcard + (period - filtername); - while (period) { - ZEND_ASSERT(period[0] == '.'); - period[1] = '*'; - period[2] = '\0'; + char *new_period = wildcard + (period - filtername); + while (new_period) { + ZEND_ASSERT(new_period[0] == '.'); + new_period[1] = '*'; + new_period[2] = '\0'; if (NULL != (fdat = zend_hash_str_find_ptr(BG(user_filter_map), wildcard, strlen(wildcard)))) { - period = NULL; + new_period = NULL; } else { - *period = '\0'; - period = strrchr(wildcard, '.'); + *new_period = '\0'; + new_period = strrchr(wildcard, '.'); } } efree(wildcard); @@ -289,7 +311,7 @@ } /* filtername */ - add_property_string(&obj, "filtername", (char*)filtername); + add_property_string(&obj, "filtername", filtername); /* and the parameters, if any */ if (filterparams) { diff -Nru php8.4-8.4.16/ext/standard/var.c php8.4-8.4.21/ext/standard/var.c --- php8.4-8.4.16/ext/standard/var.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/var.c 2026-05-05 16:34:12.000000000 +0000 @@ -56,6 +56,12 @@ { const char *prop_name, *class_name; +#ifdef ZEND_CHECK_STACK_LIMIT + if (UNEXPECTED(zend_call_stack_overflowed(EG(stack_limit)))) { + php_printf("%*cnesting level too deep", level + 1, ' '); + return; + } +#endif if (key == NULL) { /* numeric key */ php_printf("%*c[" ZEND_LONG_FMT "]=>\n", level + 1, ' ', index); } else { /* string key */ diff -Nru php8.4-8.4.16/ext/standard/var_unserializer.c php8.4-8.4.21/ext/standard/var_unserializer.c --- php8.4-8.4.16/ext/standard/var_unserializer.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/var_unserializer.c 2026-05-05 16:34:12.000000000 +0000 @@ -1,4 +1,4 @@ -/* Generated by re2c 3.1 */ +/* Generated by re2c 4.3 */ /* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | @@ -891,39 +891,39 @@ { YYCTYPE yych; - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + static const unsigned char yybm[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 }; if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7); yych = *YYCURSOR; @@ -1000,9 +1000,7 @@ } yy15: yych = *++YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy27; - } + if (yybm[0+yych] & 128) goto yy27; yy16: YYCURSOR = YYMARKER; goto yy2; @@ -1085,9 +1083,7 @@ ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy27; - } + if (yybm[0+yych] & 128) goto yy27; if (yych <= '/') goto yy16; if (yych <= ':') goto yy44; goto yy16; diff -Nru php8.4-8.4.16/ext/standard/versioning.c php8.4-8.4.21/ext/standard/versioning.c --- php8.4-8.4.16/ext/standard/versioning.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/standard/versioning.c 2026-05-05 16:34:12.000000000 +0000 @@ -45,8 +45,8 @@ * s/([^\d\.])([^\D\.])/$1.$2/g; * s/([^\D\.])([^\d\.])/$1.$2/g; */ -#define isdig(x) (isdigit(x)&&(x)!='.') -#define isndig(x) (!isdigit(x)&&(x)!='.') +#define isdig(x) (isdigit((unsigned char)(x))&&(x)!='.') +#define isndig(x) (!isdigit((unsigned char)(x))&&(x)!='.') #define isspecialver(x) ((x)=='-'||(x)=='_'||(x)=='+') lq = *(q - 1); @@ -59,7 +59,7 @@ *q++ = '.'; } *q++ = *p; - } else if (!isalnum(*p)) { + } else if (!isalnum((unsigned char)*p)) { if (lq != '.') { *q++ = '.'; } @@ -152,17 +152,17 @@ if ((n2 = strchr(p2, '.')) != NULL) { *n2 = '\0'; } - if (isdigit(*p1) && isdigit(*p2)) { + if (isdigit((unsigned char)*p1) && isdigit((unsigned char)*p2)) { /* compare element numerically */ l1 = strtol(p1, NULL, 10); l2 = strtol(p2, NULL, 10); compare = ZEND_NORMALIZE_BOOL(l1 - l2); - } else if (!isdigit(*p1) && !isdigit(*p2)) { + } else if (!isdigit((unsigned char)*p1) && !isdigit((unsigned char)*p2)) { /* compare element names */ compare = compare_special_version_forms(p1, p2); } else { /* mix of names and numbers */ - if (isdigit(*p1)) { + if (isdigit((unsigned char)*p1)) { compare = compare_special_version_forms("#N#", p2); } else { compare = compare_special_version_forms(p1, "#N#"); @@ -180,13 +180,13 @@ } if (compare == 0) { if (n1 != NULL) { - if (isdigit(*p1)) { + if (isdigit((unsigned char)*p1)) { compare = 1; } else { compare = php_version_compare(p1, "#N#"); } } else if (n2 != NULL) { - if (isdigit(*p2)) { + if (isdigit((unsigned char)*p2)) { compare = -1; } else { compare = php_version_compare("#N#", p2); diff -Nru php8.4-8.4.16/ext/sysvshm/sysvshm.c php8.4-8.4.21/ext/sysvshm/sysvshm.c --- php8.4-8.4.16/ext/sysvshm/sysvshm.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/sysvshm/sysvshm.c 2026-05-05 16:34:12.000000000 +0000 @@ -309,11 +309,13 @@ shm_data = &shm_var->mem; PHP_VAR_UNSERIALIZE_INIT(var_hash); - if (php_var_unserialize(return_value, (const unsigned char **) &shm_data, (unsigned char *) shm_data + shm_var->length, &var_hash) != 1) { + int res = php_var_unserialize(return_value, (const unsigned char **) &shm_data, (unsigned char *) shm_data + shm_var->length, &var_hash); + PHP_VAR_UNSERIALIZE_DESTROY(var_hash); + if (res != 1) { php_error_docref(NULL, E_WARNING, "Variable data in shared memory is corrupted"); - RETVAL_FALSE; + zval_ptr_dtor(return_value); + RETURN_FALSE; } - PHP_VAR_UNSERIALIZE_DESTROY(var_hash); } /* }}} */ diff -Nru php8.4-8.4.16/ext/sysvshm/tests/shm_get_var_leak.phpt php8.4-8.4.21/ext/sysvshm/tests/shm_get_var_leak.phpt --- php8.4-8.4.16/ext/sysvshm/tests/shm_get_var_leak.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/sysvshm/tests/shm_get_var_leak.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,37 @@ +--TEST-- +shm_get_var() leaks if variable is corrupted +--EXTENSIONS-- +sysvshm +ffi +--INI-- +ffi.enable=1 +--SKIPIF-- + +--FILE-- +shmat($ffi->shmget($key, 0, 0), $ffi->new('void *'), 0); + +$ptr[0x40 + 13] = 0; // Corrupt first byte of second element of serialized data + +var_dump(shm_get_var($s, 0)); + +shm_remove($s); + +?> +--EXPECTF-- +Warning: shm_get_var(): Variable data in shared memory is corrupted in %s on line %d +bool(false) diff -Nru php8.4-8.4.16/ext/tidy/tests/parsing_file_too_large.phpt php8.4-8.4.21/ext/tidy/tests/parsing_file_too_large.phpt --- php8.4-8.4.16/ext/tidy/tests/parsing_file_too_large.phpt 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/tidy/tests/parsing_file_too_large.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -4,6 +4,7 @@ tidy --SKIPIF-- documentElement->append($sheet->createElementNS('urn:test', 'test:dummy')); +$sheet->documentElement->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:test', 'urn:test'); $input = Dom\XMLDocument::createFromString(<< diff -Nru php8.4-8.4.16/ext/xsl/tests/gh21357_1.phpt php8.4-8.4.21/ext/xsl/tests/gh21357_1.phpt --- php8.4-8.4.16/ext/xsl/tests/gh21357_1.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/xsl/tests/gh21357_1.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,20 @@ +--TEST-- +GH-21357 (XSLTProcessor works with \DOMDocument, but fails with \Dom\XMLDocument) +--EXTENSIONS-- +dom +xsl +--CREDITS-- +jacekkow +--FILE-- + + + +XML; + +$dom = Dom\XMLDocument::createFromString($xml); +var_dump(new XSLTProcessor()->importStylesheet($dom)); +?> +--EXPECT-- +bool(true) diff -Nru php8.4-8.4.16/ext/xsl/tests/gh21357_2.phpt php8.4-8.4.21/ext/xsl/tests/gh21357_2.phpt --- php8.4-8.4.16/ext/xsl/tests/gh21357_2.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/xsl/tests/gh21357_2.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,35 @@ +--TEST-- +GH-21357 (XSLTProcessor works with \DOMDocument, but fails with \Dom\XMLDocument) +--EXTENSIONS-- +dom +xsl +--CREDITS-- +jacekkow +--FILE-- + + + + + + + + + + + + +'; +$dom = Dom\XMLDocument::createFromString($xsl); +$xsl = new XSLTProcessor(); +$xsl->importStylesheet($dom); +var_dump($xsl->transformToXml(\Dom\XMLDocument::createFromString(''))); +?> +--EXPECT-- +string(138) " + +" diff -Nru php8.4-8.4.16/ext/xsl/tests/gh21496.phpt php8.4-8.4.21/ext/xsl/tests/gh21496.phpt --- php8.4-8.4.16/ext/xsl/tests/gh21496.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/xsl/tests/gh21496.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,32 @@ +--TEST-- +GH-21496 (UAF in dom_objects_free_storage when importing non-document node as stylesheet) +--EXTENSIONS-- +dom +xsl +--CREDITS-- +YuanchengJiang +--FILE-- +loadXML(<< +XML); +$doc->documentElement->appendChild($comment); +unset($doc); +$proc = new XSLTProcessor(); +var_dump($proc->importStylesheet($comment)); +$sxe = simplexml_load_string(''); +$proc = new XSLTProcessor(); +$proc->importStylesheet($sxe); +?> +--EXPECTF-- +Warning: XSLTProcessor::importStylesheet(): compilation error: file %s line 1 element container in %s on line %d + +Warning: XSLTProcessor::importStylesheet(): xsltParseStylesheetProcess : document is not a stylesheet in %s on line %d +bool(false) + +Warning: XSLTProcessor::importStylesheet(): compilation error: element container in %s on line %d + +Warning: XSLTProcessor::importStylesheet(): xsltParseStylesheetProcess : document is not a stylesheet in %s on line %d + diff -Nru php8.4-8.4.16/ext/xsl/xsltprocessor.c php8.4-8.4.21/ext/xsl/xsltprocessor.c --- php8.4-8.4.16/ext/xsl/xsltprocessor.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/xsl/xsltprocessor.c 2026-05-05 16:34:12.000000000 +0000 @@ -123,65 +123,38 @@ } } -static void xsl_add_ns_to_map(xmlHashTablePtr table, xsltStylesheetPtr sheet, const xmlNode *cur, const xmlChar *prefix, const xmlChar *uri) +static void xsl_add_ns_def(xmlNodePtr node) { - const xmlChar *existing_url = xmlHashLookup(table, prefix); - if (existing_url != NULL && !xmlStrEqual(existing_url, uri)) { - xsltTransformError(NULL, sheet, (xmlNodePtr) cur, "Namespaces prefix %s used for multiple namespaces\n", prefix); - sheet->warnings++; - } else if (existing_url == NULL) { - xmlHashUpdateEntry(table, prefix, (void *) uri, NULL); - } -} + if (node->type == XML_ELEMENT_NODE) { + for (xmlAttrPtr attr = node->properties; attr; attr = attr->next) { + if (php_dom_ns_is_fast((const xmlNode *) attr, php_dom_ns_is_xmlns_magic_token)) { + xmlNsPtr ns = xmlMalloc(sizeof(*ns)); + if (!ns) { + return; + } -/* Adds all namespace declaration (not using nsDef) into a hash map that maps prefix to uri. Warns on conflicting declarations. */ -static void xsl_build_ns_map(xmlHashTablePtr table, xsltStylesheetPtr sheet, php_dom_libxml_ns_mapper *ns_mapper, const xmlDoc *doc) -{ - const xmlNode *cur = xmlDocGetRootElement(doc); + bool should_free; + xmlChar *attr_value = php_libxml_attr_value(attr, &should_free); - while (cur != NULL) { - if (cur->type == XML_ELEMENT_NODE) { - if (cur->ns != NULL && cur->ns->prefix != NULL) { - xsl_add_ns_to_map(table, sheet, cur, cur->ns->prefix, cur->ns->href); - } - - for (const xmlAttr *attr = cur->properties; attr != NULL; attr = attr->next) { - if (attr->ns != NULL && attr->ns->prefix != NULL && php_dom_ns_is_fast_ex(attr->ns, php_dom_ns_is_xmlns_magic_token) - && attr->children != NULL && attr->children->content != NULL) { - /* This attribute declares a namespace, get the relevant instance. - * The declared namespace is not the same as the namespace of this attribute (which is xmlns). */ - const xmlChar *prefix = attr->name; - xmlNsPtr ns = php_dom_libxml_ns_mapper_get_ns_raw_strings_nullsafe(ns_mapper, (const char *) prefix, (const char *) attr->children->content); - xsl_add_ns_to_map(table, sheet, cur, prefix, ns->href); - } + memset(ns, 0, sizeof(*ns)); + ns->type = XML_LOCAL_NAMESPACE; + ns->href = should_free ? attr_value : xmlStrdup(attr_value); + ns->prefix = attr->ns->prefix ? xmlStrdup(attr->name) : NULL; + ns->next = node->nsDef; + node->nsDef = ns; } } - - cur = php_dom_next_in_tree_order(cur, (const xmlNode *) doc); } } -/* Apply namespace corrections for new DOM */ -typedef enum { - XSL_NS_HASH_CORRECTION_NONE = 0, - XSL_NS_HASH_CORRECTION_APPLIED = 1, - XSL_NS_HASH_CORRECTION_FAILED = 2 -} xsl_ns_hash_correction_status; - -static zend_always_inline xsl_ns_hash_correction_status xsl_apply_ns_hash_corrections(xsltStylesheetPtr sheetp, xmlNodePtr nodep, xmlDocPtr doc) +static void xsl_add_ns_defs(xmlDocPtr doc) { - if (sheetp->nsHash == NULL) { - dom_object *node_intern = php_dom_object_get_data(nodep); - if (node_intern != NULL && php_dom_follow_spec_intern(node_intern)) { - sheetp->nsHash = xmlHashCreate(10); - if (UNEXPECTED(!sheetp->nsHash)) { - return XSL_NS_HASH_CORRECTION_FAILED; - } - xsl_build_ns_map(sheetp->nsHash, sheetp, php_dom_get_ns_mapper(node_intern), doc); - return XSL_NS_HASH_CORRECTION_APPLIED; - } + xmlNodePtr base = (xmlNodePtr) doc; + xmlNodePtr node = base->children; + while (node != NULL) { + xsl_add_ns_def(node); + node = php_dom_next_in_tree_order(node, base); } - return XSL_NS_HASH_CORRECTION_NONE; } /* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html# @@ -190,11 +163,11 @@ PHP_METHOD(XSLTProcessor, importStylesheet) { zval *id, *docp = NULL; - xmlDoc *doc = NULL, *newdoc = NULL; + xmlDoc *newdoc = NULL; xsltStylesheetPtr sheetp; bool clone_docu = false; xmlNode *nodep = NULL; - zval *cloneDocu, rv; + zval *cloneDocu, rv, clone_zv, owner_zv; zend_string *member; id = ZEND_THIS; @@ -203,50 +176,88 @@ } nodep = php_libxml_import_node(docp); + if (nodep == NULL) { + zend_argument_type_error(1, "must be a valid XML node"); + RETURN_THROWS(); + } + + if (Z_OBJ_HANDLER_P(docp, clone_obj) == NULL) { + zend_argument_type_error(1, "must be a cloneable node"); + RETURN_THROWS(); + } + + ZVAL_UNDEF(&owner_zv); + + /* For non-document nodes, resolve the ownerDocument and clone that + * instead as xsltParseStylesheetProcess may free nodes in the document. */ + if (nodep->type != XML_DOCUMENT_NODE && nodep->type != XML_HTML_DOCUMENT_NODE) { + if (nodep->doc == NULL) { + zend_argument_value_error(1, "must be part of a document"); + RETURN_THROWS(); + } + + /* See dom_import_simplexml_common */ + + dom_object *nodeobj = (dom_object *) ((char *) Z_OBJ_P(docp) - Z_OBJ_HT_P(docp)->offset); + + php_dom_create_object((xmlNodePtr) nodep->doc, &owner_zv, nodeobj); + docp = &owner_zv; + } + + /* libxslt uses _private, so we must copy the imported + * stylesheet document otherwise the node proxies will be a mess. + * We will clone the object and detach the libxml internals later. */ + zend_object *clone = Z_OBJ_HANDLER_P(docp, clone_obj)(Z_OBJ_P(docp)); + zval_ptr_dtor(&owner_zv); + if (!clone) { + RETURN_THROWS(); + } + + ZVAL_OBJ(&clone_zv, clone); + nodep = php_libxml_import_node(&clone_zv); if (nodep) { - doc = nodep->doc; + newdoc = nodep->doc; } - if (doc == NULL) { + if (newdoc == NULL) { + OBJ_RELEASE(clone); zend_argument_type_error(1, "must be a valid XML node"); RETURN_THROWS(); } - /* libxslt uses _private, so we must copy the imported - stylesheet document otherwise the node proxies will be a mess */ - newdoc = xmlCopyDoc(doc, 1); - xmlNodeSetBase((xmlNodePtr) newdoc, (xmlChar *)doc->URL); + php_libxml_node_object *clone_lxml_obj = Z_LIBXML_NODE_P(&clone_zv); + PHP_LIBXML_SANITIZE_GLOBALS(parse); ZEND_DIAGNOSTIC_IGNORED_START("-Wdeprecated-declarations") xmlSubstituteEntitiesDefault(1); xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS; ZEND_DIAGNOSTIC_IGNORED_END + if (clone_lxml_obj->document->class_type == PHP_LIBXML_CLASS_MODERN) { + xsl_add_ns_defs(newdoc); + } + sheetp = xsltParseStylesheetDoc(newdoc); PHP_LIBXML_RESTORE_GLOBALS(parse); if (!sheetp) { - xmlFreeDoc(newdoc); + OBJ_RELEASE(clone); RETURN_FALSE; } xsl_object *intern = Z_XSL_P(id); - xsl_ns_hash_correction_status status = xsl_apply_ns_hash_corrections(sheetp, nodep, doc); - if (UNEXPECTED(status == XSL_NS_HASH_CORRECTION_FAILED)) { - xsltFreeStylesheet(sheetp); - xmlFreeDoc(newdoc); - RETURN_FALSE; - } else if (status == XSL_NS_HASH_CORRECTION_APPLIED) { - /* The namespace mappings need to be kept alive. - * This is stored in the ref obj outside of libxml2, but that means that the sheet won't keep it alive - * unlike with namespaces from old DOM. */ - if (intern->sheet_ref_obj) { - php_libxml_decrement_doc_ref_directly(intern->sheet_ref_obj); - } - intern->sheet_ref_obj = Z_LIBXML_NODE_P(docp)->document; - intern->sheet_ref_obj->refcount++; - } + /* Detach object */ + clone_lxml_obj->document->ptr = NULL; + /* The namespace mappings need to be kept alive. + * This is stored in the ref obj outside of libxml2, but that means that the sheet won't keep it alive + * unlike with namespaces from old DOM. */ + if (intern->sheet_ref_obj) { + php_libxml_decrement_doc_ref_directly(intern->sheet_ref_obj); + } + intern->sheet_ref_obj = clone_lxml_obj->document; + intern->sheet_ref_obj->refcount++; + OBJ_RELEASE(clone); member = ZSTR_INIT_LITERAL("cloneDocument", 0); cloneDocu = zend_std_read_property(Z_OBJ_P(id), member, BP_VAR_R, NULL, &rv); diff -Nru php8.4-8.4.16/ext/zend_test/test.c php8.4-8.4.21/ext/zend_test/test.c --- php8.4-8.4.16/ext/zend_test/test.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/zend_test/test.c 2026-05-05 16:34:12.000000000 +0000 @@ -74,6 +74,7 @@ static zend_class_entry *zend_test_unit_enum; static zend_class_entry *zend_test_string_enum; static zend_class_entry *zend_test_int_enum; +static zend_class_entry *zend_test_enum_with_interface; static zend_class_entry *zend_test_magic_call; static zend_object_handlers zend_test_class_handlers; @@ -1318,6 +1319,7 @@ zend_test_unit_enum = register_class_ZendTestUnitEnum(); zend_test_string_enum = register_class_ZendTestStringEnum(); zend_test_int_enum = register_class_ZendTestIntEnum(); + zend_test_enum_with_interface = register_class_ZendTestEnumWithInterface(zend_test_interface); zend_test_magic_call = register_class__ZendTestMagicCall(); diff -Nru php8.4-8.4.16/ext/zend_test/test.stub.php php8.4-8.4.21/ext/zend_test/test.stub.php --- php8.4-8.4.16/ext/zend_test/test.stub.php 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/zend_test/test.stub.php 2026-05-05 16:34:12.000000000 +0000 @@ -201,6 +201,11 @@ case Baz = -1; } + enum ZendTestEnumWithInterface implements _ZendTestInterface { + case Foo; + case Bar; + } + function zend_test_array_return(): array {} /** @genstubs-expose-comment-block diff -Nru php8.4-8.4.16/ext/zend_test/test_arginfo.h php8.4-8.4.21/ext/zend_test/test_arginfo.h --- php8.4-8.4.16/ext/zend_test/test_arginfo.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/zend_test/test_arginfo.h 2026-05-05 16:34:12.000000000 +0000 @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 6f76138d313c37244148004e2691ee47534f87a4 */ + * Stub hash: bf65e1dd1eeeeec46687a76a7ea6554cd1971dfc */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -1187,6 +1187,20 @@ return class_entry; } +#endif + +#if (PHP_VERSION_ID >= 80100) +static zend_class_entry *register_class_ZendTestEnumWithInterface(zend_class_entry *class_entry__ZendTestInterface) +{ + zend_class_entry *class_entry = zend_register_internal_enum("ZendTestEnumWithInterface", IS_UNDEF, NULL); + zend_class_implements(class_entry, 1, class_entry__ZendTestInterface); + + zend_enum_add_case_cstr(class_entry, "Foo", NULL); + + zend_enum_add_case_cstr(class_entry, "Bar", NULL); + + return class_entry; +} #endif static zend_class_entry *register_class_ZendTestNS_Foo(void) diff -Nru php8.4-8.4.16/ext/zip/php_zip.c php8.4-8.4.21/ext/zip/php_zip.c --- php8.4-8.4.16/ext/zip/php_zip.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/zip/php_zip.c 2026-05-05 16:34:12.000000000 +0000 @@ -675,12 +675,14 @@ /* now catch the FreeBSD style of "no matches" */ if (!globbuf.gl_pathc || !globbuf.gl_pathv) { + globfree(&globbuf); return 0; } /* we assume that any glob pattern will match files from one directory only so checking the dirname of the first match should be sufficient */ if (ZIP_OPENBASEDIR_CHECKPATH(globbuf.gl_pathv[0])) { + globfree(&globbuf); return -1; } diff -Nru php8.4-8.4.16/ext/zip/php_zip.h php8.4-8.4.21/ext/zip/php_zip.h --- php8.4-8.4.16/ext/zip/php_zip.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/zip/php_zip.h 2026-05-05 16:34:12.000000000 +0000 @@ -39,7 +39,7 @@ /* Additionnal flags not from libzip */ #define ZIP_FL_OPEN_FILE_NOW (1u<<30) -#define PHP_ZIP_VERSION "1.22.7" +#define PHP_ZIP_VERSION "1.22.8" #ifdef HAVE_LIBZIP_VERSION #define LIBZIP_VERSION_STR zip_libzip_version() diff -Nru php8.4-8.4.16/ext/zip/tests/gh21698.phpt php8.4-8.4.21/ext/zip/tests/gh21698.phpt --- php8.4-8.4.16/ext/zip/tests/gh21698.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/zip/tests/gh21698.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,21 @@ +--TEST-- +GH-21698 (ZipArchive::addGlob memory leak when open_basedir rejects the match) +--EXTENSIONS-- +zip +--FILE-- +open($zipfile, ZipArchive::CREATE | ZipArchive::OVERWRITE); + +ini_set('open_basedir', '/nonexistent_dir_for_gh21698'); +var_dump($zip->addGlob(__FILE__, 0, [])); +$zip->close(); +?> +--CLEAN-- + +--EXPECTF-- +Warning: ZipArchive::addGlob(): open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s) in %s on line %d +bool(false) diff -Nru php8.4-8.4.16/ext/zip/zip_stream.c php8.4-8.4.21/ext/zip/zip_stream.c --- php8.4-8.4.16/ext/zip/zip_stream.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/zip/zip_stream.c 2026-05-05 16:34:12.000000000 +0000 @@ -125,12 +125,11 @@ size_t path_len = strlen(stream->orig_path); char file_dirname[MAXPATHLEN]; struct zip *za; - char *fragment; size_t fragment_len; int err; zend_string *file_basename; - fragment = strchr(path, '#'); + const char *fragment = strchr(path, '#'); if (!fragment) { return -1; } @@ -286,14 +285,13 @@ struct zip *za; struct zip_file *zf = NULL; - char *fragment; size_t fragment_len; int err; php_stream *stream = NULL; struct php_zip_stream_data_t *self; - fragment = strchr(path, '#'); + const char *fragment = strchr(path, '#'); if (!fragment) { return NULL; } diff -Nru php8.4-8.4.16/ext/zlib/tests/gzseek_seek_oob.phpt php8.4-8.4.21/ext/zlib/tests/gzseek_seek_oob.phpt --- php8.4-8.4.16/ext/zlib/tests/gzseek_seek_oob.phpt 1970-01-01 00:00:00.000000000 +0000 +++ php8.4-8.4.21/ext/zlib/tests/gzseek_seek_oob.phpt 2026-05-05 16:34:12.000000000 +0000 @@ -0,0 +1,19 @@ +--TEST-- +Test function gzseek() by seeking out of bounds +--EXTENSIONS-- +zlib +--FILE-- + +--EXPECT-- +int(-1) +int(0) +int(0) diff -Nru php8.4-8.4.16/ext/zlib/zlib_fopen_wrapper.c php8.4-8.4.21/ext/zlib/zlib_fopen_wrapper.c --- php8.4-8.4.16/ext/zlib/zlib_fopen_wrapper.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/ext/zlib/zlib_fopen_wrapper.c 2026-05-05 16:34:12.000000000 +0000 @@ -94,9 +94,14 @@ php_error_docref(NULL, E_WARNING, "SEEK_END is not supported"); return -1; } - *newoffs = gzseek(self->gz_file, offset, whence); - return (*newoffs < 0) ? -1 : 0; + z_off_t new_offset = gzseek(self->gz_file, offset, whence); + if (new_offset < 0) { + return -1; + } + + *newoffs = new_offset; + return 0; } static int php_gziop_close(php_stream *stream, int close_handle) diff -Nru php8.4-8.4.16/main/SAPI.c php8.4-8.4.21/main/SAPI.c --- php8.4-8.4.16/main/SAPI.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/SAPI.c 2026-05-05 16:34:12.000000000 +0000 @@ -191,7 +191,7 @@ *p = 0; break; default: - *p = tolower(*p); + *p = tolower((unsigned char)*p); break; } } @@ -715,10 +715,10 @@ } /* cut off trailing spaces, linefeeds and carriage-returns */ - if (header_line_len && isspace(header_line[header_line_len-1])) { + if (header_line_len && isspace((unsigned char)header_line[header_line_len - 1])) { do { header_line_len--; - } while(header_line_len && isspace(header_line[header_line_len-1])); + } while(header_line_len && isspace((unsigned char)header_line[header_line_len - 1])); header_line[header_line_len]='\0'; } diff -Nru php8.4-8.4.16/main/debug_gdb_scripts.c php8.4-8.4.21/main/debug_gdb_scripts.c --- php8.4-8.4.16/main/debug_gdb_scripts.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/debug_gdb_scripts.c 2026-05-05 16:34:12.000000000 +0000 @@ -6,7 +6,7 @@ * * See https://sourceware.org/gdb/current/onlinedocs/gdb.html/dotdebug_005fgdb_005fscripts-section.html#dotdebug_005fgdb_005fscripts-section */ -asm( +__asm__( ".pushsection \".debug_gdb_scripts\", \"MS\",%progbits,1\n" ".byte 4 /* Python Text */\n" ".ascii \"gdb.inlined-script\\n\"\n" diff -Nru php8.4-8.4.16/main/fastcgi.c php8.4-8.4.21/main/fastcgi.c --- php8.4-8.4.16/main/fastcgi.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/fastcgi.c 2026-05-05 16:34:12.000000000 +0000 @@ -641,7 +641,7 @@ int fcgi_listen(const char *path, int backlog) { - char *s; + const char *s; int tcp = 0; char host[MAXPATHLEN]; short port = 0; @@ -944,7 +944,7 @@ return n; } -static inline ssize_t safe_read(fcgi_request *req, const void *buf, size_t count) +static inline ssize_t safe_read(fcgi_request *req, void *buf, size_t count) { int ret; size_t n = 0; diff -Nru php8.4-8.4.16/main/fopen_wrappers.c php8.4-8.4.21/main/fopen_wrappers.c --- php8.4-8.4.16/main/fopen_wrappers.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/fopen_wrappers.c 2026-05-05 16:34:12.000000000 +0000 @@ -511,7 +511,7 @@ } /* Don't resolve paths which contain protocol (except of file://) */ - for (p = filename; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; p++); + for (p = filename; isalnum((unsigned char)*p) || *p == '+' || *p == '-' || *p == '.'; p++); if ((*p == ':') && (p - filename > 1) && (p[1] == '/') && (p[2] == '/')) { wrapper = php_stream_locate_url_wrapper(filename, &actual_path, STREAM_OPEN_FOR_INCLUDE); if (wrapper == &php_plain_files_wrapper) { @@ -543,7 +543,7 @@ /* Check for stream wrapper */ int is_stream_wrapper = 0; - for (p = ptr; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; p++); + for (p = ptr; isalnum((unsigned char)*p) || *p == '+' || *p == '-' || *p == '.'; p++); if ((*p == ':') && (p - ptr > 1) && (p[1] == '/') && (p[2] == '/')) { /* .:// or ..:// is not a stream wrapper */ if (p[-1] != '.' || p[-2] != '.' || p - 2 != ptr) { @@ -618,7 +618,7 @@ actual_path = trypath; /* Check for stream wrapper */ - for (p = trypath; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; p++); + for (p = trypath; isalnum((unsigned char)*p) || *p == '+' || *p == '-' || *p == '.'; p++); if ((*p == ':') && (p - trypath > 1) && (p[1] == '/') && (p[2] == '/')) { wrapper = php_stream_locate_url_wrapper(trypath, &actual_path, STREAM_OPEN_FOR_INCLUDE); if (!wrapper) { diff -Nru php8.4-8.4.16/main/main.c php8.4-8.4.21/main/main.c --- php8.4-8.4.16/main/main.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/main.c 2026-05-05 16:34:12.000000000 +0000 @@ -995,7 +995,7 @@ { zend_string *replace_origin = NULL; char *docref_buf = NULL, *target = NULL; - char *docref_target = "", *docref_root = ""; + const char *docref_target = "", *docref_root = ""; char *p; const char *space = ""; const char *class_name = ""; diff -Nru php8.4-8.4.16/main/network.c php8.4-8.4.21/main/network.c --- php8.4-8.4.16/main/network.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/network.c 2026-05-05 16:34:12.000000000 +0000 @@ -553,7 +553,7 @@ PHPAPI zend_result php_network_parse_network_address_with_port(const char *addr, size_t addrlen, struct sockaddr *sa, socklen_t *sl) { - char *colon; + const char *colon; char *tmp; zend_result ret = FAILURE; short port; diff -Nru php8.4-8.4.16/main/output.c php8.4-8.4.21/main/output.c --- php8.4-8.4.16/main/output.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/output.c 2026-05-05 16:34:12.000000000 +0000 @@ -187,8 +187,12 @@ /* release all output handlers */ if (OG(handlers).elements) { while ((handler = zend_stack_top(&OG(handlers)))) { - php_output_handler_free(handler); zend_stack_del_top(&OG(handlers)); + /* It's possible to start a new output handler and mark it as active, + * however this loop will destroy all active handlers. */ + OG(active) = NULL; + ZEND_ASSERT(OG(running) == NULL && "output is deactivated therefore running should stay NULL"); + php_output_handler_free(handler); } } zend_stack_destroy(&OG(handlers)); @@ -534,6 +538,10 @@ HashTable *rconflicts; php_output_handler_conflict_check_t conflict; + if (!(OG(flags) & PHP_OUTPUT_ACTIVATED)) { + return FAILURE; + } + if (php_output_lock_error(PHP_OUTPUT_HANDLER_START) || !handler) { return FAILURE; } @@ -718,10 +726,11 @@ * Destroy and free an output handler */ PHPAPI void php_output_handler_free(php_output_handler **h) { - if (*h) { - php_output_handler_dtor(*h); - efree(*h); + php_output_handler *handler = *h; + if (handler) { *h = NULL; + php_output_handler_dtor(handler); + efree(handler); } } /* }}} */ diff -Nru php8.4-8.4.16/main/php_ini.c php8.4-8.4.21/main/php_ini.c --- php8.4-8.4.16/main/php_ini.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/php_ini.c 2026-05-05 16:34:12.000000000 +0000 @@ -40,7 +40,7 @@ char *tmp = path; \ while (*tmp) { \ if (*tmp == '\\') *tmp = '/'; \ - else *tmp = tolower(*tmp); \ + else *tmp = tolower((unsigned char)*tmp); \ tmp++; \ } \ } diff -Nru php8.4-8.4.16/main/php_ini_builder.c php8.4-8.4.21/main/php_ini_builder.c --- php8.4-8.4.16/main/php_ini_builder.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/php_ini_builder.c 2026-05-05 16:34:12.000000000 +0000 @@ -67,7 +67,7 @@ if (val != NULL) { val++; - if (!isalnum(*val) && *val != '"' && *val != '\'' && *val != '\0') { + if (!isalnum((unsigned char)*val) && *val != '"' && *val != '\'' && *val != '\0') { php_ini_builder_quoted(b, arg, val - arg - 1, val, arg + len - val); } else { php_ini_builder_realloc(b, len + strlen("\n")); diff -Nru php8.4-8.4.16/main/php_variables.c php8.4-8.4.21/main/php_variables.c --- php8.4-8.4.16/main/php_variables.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/php_variables.c 2026-05-05 16:34:12.000000000 +0000 @@ -221,7 +221,7 @@ ip++; index_s = ip; - if (isspace(*ip)) { + if (isspace((unsigned char)*ip)) { ip++; } if (*ip==']') { @@ -544,7 +544,7 @@ if (arg == PARSE_COOKIE) { /* Remove leading spaces from cookie names, needed for multi-cookie header where ; can be followed by a space */ - while (isspace(*var)) { + while (isspace((unsigned char)*var)) { var++; } if (var == val || *var == '\0') { diff -Nru php8.4-8.4.16/main/php_version.h php8.4-8.4.21/main/php_version.h --- php8.4-8.4.16/main/php_version.h 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/php_version.h 2026-05-05 16:34:12.000000000 +0000 @@ -2,7 +2,7 @@ /* edit configure.ac to change version number */ #define PHP_MAJOR_VERSION 8 #define PHP_MINOR_VERSION 4 -#define PHP_RELEASE_VERSION 16 +#define PHP_RELEASE_VERSION 21 #define PHP_EXTRA_VERSION "" -#define PHP_VERSION "8.4.16" -#define PHP_VERSION_ID 80416 +#define PHP_VERSION "8.4.21" +#define PHP_VERSION_ID 80421 diff -Nru php8.4-8.4.16/main/rfc1867.c php8.4-8.4.21/main/rfc1867.c --- php8.4-8.4.16/main/rfc1867.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/rfc1867.c 2026-05-05 16:34:12.000000000 +0000 @@ -392,7 +392,7 @@ } /* space in the beginning means same header */ - if (!isspace(line[0])) { + if (!isspace((unsigned char)line[0])) { value = strchr(line, ':'); } @@ -408,7 +408,7 @@ } *value = '\0'; - do { value++; } while (isspace(*value)); + do { value++; } while (isspace((unsigned char)*value)); key = estrdup(line); smart_string_appends(&buf_value, value); @@ -505,7 +505,7 @@ static char *php_ap_getword_conf(const zend_encoding *encoding, char *str) { - while (*str && isspace(*str)) { + while (*str && isspace((unsigned char)*str)) { ++str; } @@ -521,7 +521,7 @@ } else { char *strend = str; - while (*strend && !isspace(*strend)) { + while (*strend && !isspace((unsigned char)*strend)) { ++strend; } return substring_conf(str, strend - str, 0); @@ -797,7 +797,7 @@ goto fileupload_done; } - while (isspace(*cd)) { + while (isspace((unsigned char)*cd)) { ++cd; } @@ -805,7 +805,7 @@ { char *key = NULL, *word = pair; - while (isspace(*cd)) { + while (isspace((unsigned char)*cd)) { ++cd; } diff -Nru php8.4-8.4.16/main/snprintf.c php8.4-8.4.21/main/snprintf.c --- php8.4-8.4.16/main/snprintf.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/snprintf.c 2026-05-05 16:34:12.000000000 +0000 @@ -288,7 +288,7 @@ /* * Check for Infinity and NaN */ - if (isalpha((int)*p)) { + if (isalpha((unsigned char)*p)) { *len = strlen(p); memcpy(buf, p, *len + 1); *is_negative = false; @@ -435,11 +435,11 @@ #define NUM( c ) ( c - '0' ) #define STR_TO_DEC( str, num ) \ - num = NUM( *str++ ) ; \ - while ( isdigit((int)*str ) ) \ + num = NUM( *(str)++ ) ; \ + while ( isdigit((unsigned char)*(str) ) ) \ { \ num *= 10 ; \ - num += NUM( *str++ ) ; \ + num += NUM( *(str)++ ) ; \ } /* @@ -533,7 +533,7 @@ /* * Try to avoid checking for flags, width or precision */ - if (isascii((int)*fmt) && !islower((int)*fmt)) { + if (isascii((unsigned char)*fmt) && !islower((unsigned char)*fmt)) { /* * Recognize flags: -, #, BLANK, + */ @@ -555,7 +555,7 @@ /* * Check if a width was specified */ - if (isdigit((int)*fmt)) { + if (isdigit((unsigned char)*fmt)) { STR_TO_DEC(fmt, min_width); adjust_width = true; } else if (*fmt == '*') { @@ -575,7 +575,7 @@ if (*fmt == '.') { adjust_precision = true; fmt++; - if (isdigit((int)*fmt)) { + if (isdigit((unsigned char)*fmt)) { STR_TO_DEC(fmt, precision); } else if (*fmt == '*') { precision = va_arg(ap, int); diff -Nru php8.4-8.4.16/main/spprintf.c php8.4-8.4.21/main/spprintf.c --- php8.4-8.4.16/main/spprintf.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/spprintf.c 2026-05-05 16:34:12.000000000 +0000 @@ -148,12 +148,12 @@ #define NUM(c) (c - '0') #define STR_TO_DEC(str, num) do { \ - num = NUM(*str++); \ - while (isdigit((int)*str)) { \ + num = NUM(*(str)++); \ + while (isdigit((unsigned char)*(str))) {\ num *= 10; \ - num += NUM(*str++); \ + num += NUM(*(str)++); \ if (num >= INT_MAX / 10) { \ - while (isdigit((int)*str++)); \ + while (isdigit((unsigned char)*(str)++)); \ break; \ } \ } \ @@ -233,7 +233,7 @@ /* * Try to avoid checking for flags, width or precision */ - if (isascii((int)*fmt) && !islower((int)*fmt)) { + if (isascii((unsigned char)*fmt) && !islower((unsigned char)*fmt)) { /* * Recognize flags: -, #, BLANK, + */ @@ -255,7 +255,7 @@ /* * Check if a width was specified */ - if (isdigit((int)*fmt)) { + if (isdigit((unsigned char)*fmt)) { STR_TO_DEC(fmt, min_width); adjust_width = true; } else if (*fmt == '*') { @@ -275,7 +275,7 @@ if (*fmt == '.') { adjust_precision = true; fmt++; - if (isdigit((int)*fmt)) { + if (isdigit((unsigned char)*fmt)) { STR_TO_DEC(fmt, precision); } else if (*fmt == '*') { precision = va_arg(ap, int); diff -Nru php8.4-8.4.16/main/streams/filter.c php8.4-8.4.21/main/streams/filter.c --- php8.4-8.4.16/main/streams/filter.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/streams/filter.c 2026-05-05 16:34:12.000000000 +0000 @@ -224,7 +224,7 @@ const php_stream_filter_factory *factory = NULL; php_stream_filter *filter = NULL; size_t n; - char *period; + const char *period; n = strlen(filtername); @@ -236,17 +236,17 @@ wildname = safe_emalloc(1, n, 3); memcpy(wildname, filtername, n+1); - period = wildname + (period - filtername); - while (period && !filter) { - ZEND_ASSERT(period[0] == '.'); - period[1] = '*'; - period[2] = '\0'; + char *new_period = wildname + (period - filtername); + while (new_period && !filter) { + ZEND_ASSERT(new_period[0] == '.'); + new_period[1] = '*'; + new_period[2] = '\0'; if (NULL != (factory = zend_hash_str_find_ptr(filter_hash, wildname, strlen(wildname)))) { filter = factory->create_filter(filtername, filterparams, persistent); } - *period = '\0'; - period = strrchr(wildname, '.'); + *new_period = '\0'; + new_period = strrchr(wildname, '.'); } efree(wildname); } diff -Nru php8.4-8.4.16/main/streams/memory.c php8.4-8.4.21/main/streams/memory.c --- php8.4-8.4.16/main/streams/memory.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/streams/memory.c 2026-05-05 16:34:12.000000000 +0000 @@ -247,8 +247,8 @@ size_t old_size = ZSTR_LEN(ms->data); ms->data = zend_string_realloc(ms->data, newsize, 0); memset(ZSTR_VAL(ms->data) + old_size, 0, newsize - old_size); - ZSTR_VAL(ms->data)[ZSTR_LEN(ms->data)] = '\0'; } + ZSTR_VAL(ms->data)[ZSTR_LEN(ms->data)] = '\0'; return PHP_STREAM_OPTION_RETURN_OK; } } @@ -615,7 +615,8 @@ { php_stream *stream; php_stream_temp_data *ts; - char *comma, *semi, *sep; + char *comma; + const char *semi, *sep; size_t mlen, dlen, plen, vlen, ilen; zend_off_t newoffs; zval meta; @@ -637,7 +638,7 @@ path += 2; } - if ((comma = memchr(path, ',', dlen)) == NULL) { + if ((comma = (char *) memchr(path, ',', dlen)) == NULL) { php_stream_wrapper_log_error(wrapper, options, "rfc2397: no comma in URL"); return NULL; } diff -Nru php8.4-8.4.16/main/streams/plain_wrapper.c php8.4-8.4.21/main/streams/plain_wrapper.c --- php8.4-8.4.16/main/streams/plain_wrapper.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/streams/plain_wrapper.c 2026-05-05 16:34:12.000000000 +0000 @@ -1775,7 +1775,7 @@ ptr = pathbuf; while (ptr && *ptr) { - end = strchr(ptr, DEFAULT_DIR_SEPARATOR); + end = (char *) strchr(ptr, DEFAULT_DIR_SEPARATOR); if (end != NULL) { *end = '\0'; end++; diff -Nru php8.4-8.4.16/main/streams/streams.c php8.4-8.4.21/main/streams/streams.c --- php8.4-8.4.16/main/streams/streams.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/streams/streams.c 2026-05-05 16:34:12.000000000 +0000 @@ -1923,7 +1923,7 @@ unsigned int i; for(i = 0; i < protocol_len; i++) { - if (!isalnum((int)protocol[i]) && + if (!isalnum((unsigned char)protocol[i]) && protocol[i] != '+' && protocol[i] != '-' && protocol[i] != '.') { @@ -2003,7 +2003,7 @@ return (php_stream_wrapper*)((options & STREAM_LOCATE_WRAPPERS_ONLY) ? NULL : &php_plain_files_wrapper); } - for (p = path; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; p++) { + for (p = path; isalnum((unsigned char)*p) || *p == '+' || *p == '-' || *p == '.'; p++) { n++; } diff -Nru php8.4-8.4.16/main/streams/transports.c php8.4-8.4.21/main/streams/transports.c --- php8.4-8.4.16/main/streams/transports.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/streams/transports.c 2026-05-05 16:34:12.000000000 +0000 @@ -95,7 +95,7 @@ } orig_path = name; - for (p = name; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; p++) { + for (p = name; isalnum((unsigned char)*p) || *p == '+' || *p == '-' || *p == '.'; p++) { n++; } diff -Nru php8.4-8.4.16/main/streams/xp_socket.c php8.4-8.4.21/main/streams/xp_socket.c --- php8.4-8.4.16/main/streams/xp_socket.c 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/main/streams/xp_socket.c 2026-05-05 16:34:12.000000000 +0000 @@ -617,7 +617,7 @@ static inline char *parse_ip_address_ex(const char *str, size_t str_len, int *portno, int get_err, zend_string **err) { - char *colon; + const char *colon; char *host = NULL; if (memchr(str, '\0', str_len)) { @@ -628,7 +628,7 @@ #ifdef HAVE_IPV6 if (*(str) == '[' && str_len > 1) { /* IPV6 notation to specify raw address with port (i.e. [fe80::1]:80) */ - char *p = memchr(str + 1, ']', str_len - 2); + const char *p = memchr(str + 1, ']', str_len - 2); if (!p || *(p + 1) != ':') { if (get_err) { *err = strpprintf(0, "Failed to parse IPv6 address \"%s\"", str); diff -Nru php8.4-8.4.16/pear/install-pear-nozlib.phar php8.4-8.4.21/pear/install-pear-nozlib.phar --- php8.4-8.4.16/pear/install-pear-nozlib.phar 2025-12-16 16:03:34.000000000 +0000 +++ php8.4-8.4.21/pear/install-pear-nozlib.phar 2026-05-05 16:34:12.000000000 +0000 @@ -1282,10 +1282,10 @@ require_once 'phar://install-pear-nozlib.phar/index.php'; -__HALT_COMPILER();Finstall-pear-nozlib.pharArchive/Tar.phpKYZCgKY!mArchive_Tar-1.5.0.tarZCgw;mConsole/Getopt.phph5ZCgh5mConsole_Getopt-1.4.3.tarzZCgzU/m index.php\+ZCg\+Hcm OS/Guess.php#-ZCg#-mPEAR-1.10.16.tarPZCgPZRmPEAR.phpZCg'7,mPEAR/ChannelFile.phpZCgα7mPEAR/ChannelFile/Parser.phpZCgnwPmPEAR/Command.php0ZCg0mPEAR/Command/Common.php; ZCg; k -mPEAR/Command/Install.phpZCgmPEAR/Command/Install.xml!ZCg!jmPEAR/Common.phphZCgh_mPEAR/Config.php ZCg 71mPEAR/Dependency2.phpZCgg{mPEAR/DependencyDB.phpK_ZCgK_jmPEAR/Downloader.phpZCgF(mPEAR/Downloader/Package.php*ZCg*1 mPEAR/ErrorStack.php1ZCg1mPEAR/Frontend.phpZCgmPEAR/Frontend/CLI.phprdZCgrdmPEAR/Installer.phpZCgpmPEAR/Installer/Role.php+ZCg+#tsCmPEAR/Installer/Role/Common.phpGZCgG?mPEAR/Installer/Role/Data.phpZCg -mPEAR/Installer/Role/Data.xmlZCgfszmPEAR/Installer/Role/Doc.php ZCg mPEAR/Installer/Role/Doc.xmlZCgh&P*mPEAR/Installer/Role/Php.php ZCg ?mmPEAR/Installer/Role/Php.xmlZCgzqmPEAR/Installer/Role/Script.phpZCg[mPEAR/Installer/Role/Script.xmlZCg@vmPEAR/Installer/Role/Test.phpZCgYmPEAR/Installer/Role/Test.xmlZCgB] mPEAR/PackageFile.php>ZCg>Om!PEAR/PackageFile/Generator/v1.phpEZCgEHm!PEAR/PackageFile/Generator/v2.php8ZCg8\;mPEAR/PackageFile/Parser/v1.php@ZCg@!mPEAR/PackageFile/Parser/v2.php ZCg mPEAR/PackageFile/v1.php"ZCg"0mPEAR/PackageFile/v2.phpdZCgd%Ewm!PEAR/PackageFile/v2/Validator.phpLZCgLC8mPEAR/Proxy.phpZCg(PzmPEAR/Registry.php+ZCg+FW5m PEAR/REST.phpAZCgA-mPEAR/REST/10.phpZCgmPEAR/Start.php :ZCg :ncmPEAR/Start/CLI.phpTSZCgTScmPEAR/Task/Common.phpDZCgD.mPEAR/Task/Postinstallscript.php9ZCg9Lvm"PEAR/Task/Postinstallscript/rw.phpAZCgAj+mPEAR/Task/Replace.phpZCgLpK_mPEAR/Task/Replace/rw.php<ZCg<7AmPEAR/Task/Unixeol.php$ ZCg$ jmPEAR/Task/Unixeol/rw.phpAZCgAoymPEAR/Task/Windowseol.php ZCg {MPmPEAR/Task/Windowseol/rw.phpNZCgNjmPEAR/Validate.php?VZCg?V,ntmPEAR/Validator/PECL.php^ZCg^_mPEAR/XMLParser.phpIZCgIͰhmStructures/Graph.phpiZCgiC}m,Structures/Graph/Manipulator/AcyclicTest.phpZCg1m2Structures/Graph/Manipulator/TopologicalSorter.phpZCgv?mStructures/Graph/Node.phpj+ZCgj+]#imStructures_Graph-1.2.0.tar8ZCg8(m -System.php QZCg QXBm XML/Util.php}ZCg}|mXML_Util-1.4.5.tar@ZCg@*BkmmPEAR/Command/Install.php QviCv(mPEAR/Command/Install.xml! Qvi!jmPEAR/Common.phph Qvih mPEAR/Config.php  Qvi ImPEAR/Dependency2.php QvimPEAR/DependencyDB.phpK_ QviK_@.mPEAR/Downloader.php8 Qvi8$mPEAR/Downloader/Package.php* Qvi*ET[mPEAR/ErrorStack.php1 Qvi1!mPEAR/Frontend.php QviޔmPEAR/Frontend/CLI.phpe QvieRmmPEAR/Installer.php Qvii?umPEAR/Installer/Role.php+ Qvi+θ7mPEAR/Installer/Role/Common.phpG QviG(mPEAR/Installer/Role/Data.php Qvir+kmPEAR/Installer/Role/Data.xml QvifszmPEAR/Installer/Role/Doc.php  Qvi çmPEAR/Installer/Role/Doc.xml Qvih&P*mPEAR/Installer/Role/Php.php  Qvi  >lmPEAR/Installer/Role/Php.xml QvizqmPEAR/Installer/Role/Script.php QviP'mPEAR/Installer/Role/Script.xml Qvi@vmPEAR/Installer/Role/Test.php QviiLmPEAR/Installer/Role/Test.xml QviB] mPEAR/PackageFile.php> Qvi>]m!PEAR/PackageFile/Generator/v1.phpE QviEAm!PEAR/PackageFile/Generator/v2.php8 Qvi8Y.hmPEAR/PackageFile/Parser/v1.php@ Qvi@mPEAR/PackageFile/Parser/v2.php Qvi lImPEAR/PackageFile/v1.php" Qvi"'TmPEAR/PackageFile/v2.phpd Qvid"m!PEAR/PackageFile/v2/Validator.phpL QviLgmPEAR/Proxy.php Qvi(PzmPEAR/Registry.php+ Qvi+ѱm PEAR/REST.phpiC QviiC_9~mPEAR/REST/10.php Qvid[rmPEAR/Start.php : Qvi :ncmPEAR/Start/CLI.phpTS QviTScmPEAR/Task/Common.phpD QviD&mPEAR/Task/Postinstallscript.php9 Qvi9Km"PEAR/Task/Postinstallscript/rw.phpA QviA{SmPEAR/Task/Replace.php Qvio9xmPEAR/Task/Replace/rw.php< Qvi<YY +mPEAR/Task/Unixeol.php$ Qvi$ jp mPEAR/Task/Unixeol/rw.phpA QviA; mPEAR/Task/Windowseol.php Qvi mPEAR/Task/Windowseol/rw.phpN QviNzߖmPEAR/Validate.php?V Qvi?V MmPEAR/Validator/PECL.php^ Qvi^f^mPEAR/XMLParser.phpI QviIYkmStructures/Graph.phpi QviiC}m,Structures/Graph/Manipulator/AcyclicTest.php Qvi1m2Structures/Graph/Manipulator/TopologicalSorter.php Qviv?mStructures/Graph/Node.phpj+ Qvij+]#imStructures_Graph-1.2.0.tar8 Qvi8(m +System.php Q Qvi Qw1WBm XML/Util.php} Qvi}|mXML_Util-1.4.5.tar@ Qvi@*Bkm_fmt = "Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/" . + $this->_fmt = "Z100filename/Z8mode/Z8uid/Z8gid/a12size/Z12mtime/" . "Z8checksum/Z1typeflag/Z100link/Z6magic/Z2version/" . "Z32uname/Z32gname/Z8devmajor/Z8devminor/Z131prefix"; } @@ -2278,48 +2257,45 @@ { if (is_resource($this->_file)) { if ($p_len === null) { - if ($this->_compress_type == 'gz') { - @gzputs($this->_file, $p_binary_data); - } else { - if ($this->_compress_type == 'bz2') { - @bzwrite($this->_file, $p_binary_data); - } else { - if ($this->_compress_type == 'lzma2') { - @xzwrite($this->_file, $p_binary_data); - } else { - if ($this->_compress_type == 'none') { - @fputs($this->_file, $p_binary_data); - } else { - $this->_error( - 'Unknown or missing compression type (' - . $this->_compress_type . ')' - ); - } - } - } - } - } else { - if ($this->_compress_type == 'gz') { - @gzputs($this->_file, $p_binary_data, $p_len); - } else { - if ($this->_compress_type == 'bz2') { - @bzwrite($this->_file, $p_binary_data, $p_len); - } else { - if ($this->_compress_type == 'lzma2') { - @xzwrite($this->_file, $p_binary_data, $p_len); - } else { - if ($this->_compress_type == 'none') { - @fputs($this->_file, $p_binary_data, $p_len); - } else { - $this->_error( - 'Unknown or missing compression type (' - . $this->_compress_type . ')' - ); - } - } - } - } + switch ($this->_compress_type) + { + case 'gz': + $bytes = @gzwrite($this->_file, $p_binary_data); + break; + case 'bz2': + $bytes = @bzwrite($this->_file, $p_binary_data); + break; + case 'lzma2': + $bytes = @xzwrite($this->_file, $p_binary_data); + break; + case 'none': + $bytes = @fwrite($this->_file, $p_binary_data); + break; + default: + $this->_error('Unknown or missing compression type (' . $this->_compress_type . ')'); + return false; + } + } else { + switch ($this->_compress_type) + { + case 'gz': + $bytes = @gzwrite($this->_file, $p_binary_data, $p_len); + break; + case 'bz2': + $bytes = @bzwrite($this->_file, $p_binary_data, $p_len); + break; + case 'lzma2': + $bytes = @xzwrite($this->_file, $p_binary_data, $p_len); + break; + case 'none': + $bytes = @fwrite($this->_file, $p_binary_data, $p_len); + break; + default: + $this->_error('Unknown or missing compression type (' . $this->_compress_type . ')'); + return false; + } } + return $bytes !== false; } return true; } @@ -2404,7 +2380,7 @@ if (is_resource($this->_file)) { // ----- Write the last 0 filled block for end of archive $v_binary_data = pack('a1024', ''); - $this->_writeBlock($v_binary_data); + return $this->_writeBlock($v_binary_data); } return true; } @@ -2566,7 +2542,9 @@ $pack_format = sprintf('a%d', $this->buffer_length); } $v_binary_data = pack($pack_format, "$v_buffer"); - $this->_writeBlock($v_binary_data); + if(!$this->_writeBlock($v_binary_data)) { + return false; + } } fclose($v_file); @@ -2628,7 +2606,9 @@ $i = 0; while (($v_buffer = substr($p_string, (($i++) * 512), 512)) != '') { $v_binary_data = pack("a512", $v_buffer); - $this->_writeBlock($v_binary_data); + if (!$this->_writeBlock($v_binary_data)) { + return false; + } } return true; @@ -3815,8 +3795,8 @@ return $p_path; } } -package.xml0000664000175000017500000005035014575343342013062 0ustar ashnazgashnazg - +package.xml0000664000175000017500000005136215036730307013060 0ustar ashnazgashnazg + Archive_Tar pear.php.net Tar file management class @@ -3855,11 +3835,11 @@ stig@php.net no - 2024-03-16 - + 2025-07-19 + - 1.5.0 - 1.5.0 + 1.6.0 + 1.6.0 stable @@ -3867,12 +3847,15 @@ New BSD License -* PR #42: fix @return true... to @return bool true... on some functions -* PR #46: use 775 default for mkdirs, to avoid world-write +This release drops support for PHP 5.4 and 5.5. + +* PR #51: big file support +* PR #53: Fix return value of _writeBlock +* PR #58: Remove gzopen/gztell/gzseek shim - + @@ -3885,10 +3868,10 @@ - 5.2.0 + 5.6.0 - 1.9.0 + 1.10.0 @@ -3896,6 +3879,25 @@ + 1.6.0 + 1.6.0 + + + stable + stable + + 2025-07-19 + New BSD License + +This release drops support for PHP 5.4 and 5.5. + +* PR #51: big file support +* PR #53: Fix return value of _writeBlock +* PR #58: Remove gzopen/gztell/gzseek shim + + + + 1.5.0 1.5.0 @@ -4561,7 +4563,7 @@ -Archive_Tar-1.5.0/Archive/Tar.php0000664000175000017500000025444614575343342016427 0ustar ashnazgashnazg_fmt = "Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/" . + $this->_fmt = "Z100filename/Z8mode/Z8uid/Z8gid/a12size/Z12mtime/" . "Z8checksum/Z1typeflag/Z100link/Z6magic/Z2version/" . "Z32uname/Z32gname/Z8devmajor/Z8devminor/Z131prefix"; } @@ -5554,48 +5535,45 @@ { if (is_resource($this->_file)) { if ($p_len === null) { - if ($this->_compress_type == 'gz') { - @gzputs($this->_file, $p_binary_data); - } else { - if ($this->_compress_type == 'bz2') { - @bzwrite($this->_file, $p_binary_data); - } else { - if ($this->_compress_type == 'lzma2') { - @xzwrite($this->_file, $p_binary_data); - } else { - if ($this->_compress_type == 'none') { - @fputs($this->_file, $p_binary_data); - } else { - $this->_error( - 'Unknown or missing compression type (' - . $this->_compress_type . ')' - ); - } - } - } - } - } else { - if ($this->_compress_type == 'gz') { - @gzputs($this->_file, $p_binary_data, $p_len); - } else { - if ($this->_compress_type == 'bz2') { - @bzwrite($this->_file, $p_binary_data, $p_len); - } else { - if ($this->_compress_type == 'lzma2') { - @xzwrite($this->_file, $p_binary_data, $p_len); - } else { - if ($this->_compress_type == 'none') { - @fputs($this->_file, $p_binary_data, $p_len); - } else { - $this->_error( - 'Unknown or missing compression type (' - . $this->_compress_type . ')' - ); - } - } - } - } + switch ($this->_compress_type) + { + case 'gz': + $bytes = @gzwrite($this->_file, $p_binary_data); + break; + case 'bz2': + $bytes = @bzwrite($this->_file, $p_binary_data); + break; + case 'lzma2': + $bytes = @xzwrite($this->_file, $p_binary_data); + break; + case 'none': + $bytes = @fwrite($this->_file, $p_binary_data); + break; + default: + $this->_error('Unknown or missing compression type (' . $this->_compress_type . ')'); + return false; + } + } else { + switch ($this->_compress_type) + { + case 'gz': + $bytes = @gzwrite($this->_file, $p_binary_data, $p_len); + break; + case 'bz2': + $bytes = @bzwrite($this->_file, $p_binary_data, $p_len); + break; + case 'lzma2': + $bytes = @xzwrite($this->_file, $p_binary_data, $p_len); + break; + case 'none': + $bytes = @fwrite($this->_file, $p_binary_data, $p_len); + break; + default: + $this->_error('Unknown or missing compression type (' . $this->_compress_type . ')'); + return false; + } } + return $bytes !== false; } return true; } @@ -5680,7 +5658,7 @@ if (is_resource($this->_file)) { // ----- Write the last 0 filled block for end of archive $v_binary_data = pack('a1024', ''); - $this->_writeBlock($v_binary_data); + return $this->_writeBlock($v_binary_data); } return true; } @@ -5842,7 +5820,9 @@ $pack_format = sprintf('a%d', $this->buffer_length); } $v_binary_data = pack($pack_format, "$v_buffer"); - $this->_writeBlock($v_binary_data); + if(!$this->_writeBlock($v_binary_data)) { + return false; + } } fclose($v_file); @@ -5904,7 +5884,9 @@ $i = 0; while (($v_buffer = substr($p_string, (($i++) * 512), 512)) != '') { $v_binary_data = pack("a512", $v_buffer); - $this->_writeBlock($v_binary_data); + if (!$this->_writeBlock($v_binary_data)) { + return false; + } } return true; @@ -7091,7 +7073,7 @@ return $p_path; } } -Archive_Tar-1.5.0/docs/Archive_Tar.txt0000644000175000017500000004524614575343342017461 0ustar ashnazgashnazgDocumentation for class Archive_Tar +Archive_Tar-1.6.0/docs/Archive_Tar.txt0000644000175000017500000004524615036730307017454 0ustar ashnazgashnazgDocumentation for class Archive_Tar =================================== Last update : 2001-08-15 @@ -7566,11 +7548,11 @@ Go through the archive and extract only the files present in the list. -package.sig0000664000175000017500000000030314575343370013036 0ustar ashnazgashnazg-----BEGIN PGP SIGNATURE----- +package.sig0000664000175000017500000000030315036730350013025 0ustar ashnazgashnazg-----BEGIN PGP SIGNATURE----- -iF0EABECAB0WIQQQ9oz3P4qkJvYXdSlyoyG6wkXxdQUCZfXG+AAKCRByoyG6wkXx -dWGFAJ47mleOupFDI3l/aiKTj3zafih36gCgosA9KxDa87XLExsxHdS2CgNPNJA= -=XWRy +iF0EABECAB0WIQQQ9oz3P4qkJvYXdSlyoyG6wkXxdQUCaHuw6AAKCRByoyG6wkXx +dbYcAKDfV1Xoum4YOQHKzrXVplUr2I/XrwCgiNn2vw9ifVwFMweSQGrROJBMm9o= +=HVo8 -----END PGP SIGNATURE----- 'phar://install-pear-nozlib.phar/Archive_Tar-1.5.0.tar', +$install_files = array('Archive_Tar' => 'phar://install-pear-nozlib.phar/Archive_Tar-1.6.0.tar', 'Console_Getopt' => 'phar://install-pear-nozlib.phar/Console_Getopt-1.4.3.tar', 'Structures_Graph' => 'phar://install-pear-nozlib.phar/Structures_Graph-1.2.0.tar', 'XML_Util' => 'phar://install-pear-nozlib.phar/XML_Util-1.4.5.tar', -'PEAR' => 'phar://install-pear-nozlib.phar/PEAR-1.10.16.tar', +'PEAR' => 'phar://install-pear-nozlib.phar/PEAR-1.10.18.tar', ); array_shift($argv); $debug = false; @@ -9231,7 +9213,7 @@ * @author Gregory Beaver * @copyright 1997-2020 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -9538,8 +9520,8 @@ * c-basic-offset: 4 * End: */ -package.xml0000664000175000017500000017051714720722517013067 0ustar ashnazgashnazg - +package.xml0000664000175000017500000017224715135450373013070 0ustar ashnazgashnazg + PEAR pear.php.net PEAR Base System @@ -9633,10 +9615,10 @@ mj@php.net no - 2024-11-24 - + 2026-01-25 + - 1.10.16 + 1.10.18 1.10.1 @@ -9645,43 +9627,41 @@ New BSD License -* PR #141: Fix bug #27796: "Array to string" conversion warnings on installs/other actions -* PR #145: Never reference E_STRICT on PHP 8.4+ -* PR #147: Fix tests 8.1+ +* PR #164: don't use report_memleaks with 8.5+ - + - + - + - + - + - + - + - + - + @@ -9690,77 +9670,77 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9769,115 +9749,115 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9934,11 +9914,11 @@ - + - + @@ -10901,9 +10881,43 @@ * PR #147: Fix tests 8.1+ + + 2025-12-14 + + 1.10.17 + 1.10.1 + + + stable + stable + + New BSD License + +* PR #152: Fix HTTP chunked encoding handling +* PR #153: fix composer.json: typo in replace for pear_exception package +* PR #154: switch to https by default +* PR #156: Throw new Error instead of E_USER_ERROR on PHP 7.0+ +* PR #159: update tests for https-first behavior + + + + 2026-01-25 + + 1.10.18 + 1.10.1 + + + stable + stable + + New BSD License + +* PR #164: don't use report_memleaks with 8.5+ + + -PEAR-1.10.16/OS/Guess.php0000664000175000017500000002637614720722517014426 0ustar ashnazgashnazg * @copyright 1997-2020 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -11298,7 +11312,7 @@ * c-basic-offset: 4 * End: */ -PEAR-1.10.16/PEAR/ChannelFile/Parser.php0000644000175000017500000000325414720722517017136 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -11364,7 +11378,7 @@ $ret->setPackagefile($file, $archive); return $ret; } -}PEAR-1.10.16/PEAR/Command/Auth.xml0000644000175000017500000000231414720722517016016 0ustar ashnazgashnazg +}PEAR-1.10.18/PEAR/Command/Auth.xml0000644000175000017500000000231415135450373016017 0ustar ashnazgashnazg Connects and authenticates to remote server [Deprecated in favor of channel-login] doLogin @@ -11393,7 +11407,7 @@ connect to the remote server, it only deletes the stored username and password from your user configuration. -PEAR-1.10.16/PEAR/Command/Auth.php0000644000175000017500000000501314720722517016004 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Command/Auth.php0000644000175000017500000000501315135450373016005 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 * @deprecated since 1.8.0alpha1 @@ -11473,7 +11487,7 @@ parent::__construct($ui, $config); } } -PEAR-1.10.16/PEAR/Command/Build.xml0000664000175000017500000000060414720722517016156 0ustar ashnazgashnazg +PEAR-1.10.18/PEAR/Command/Build.xml0000664000175000017500000000060415135450373016157 0ustar ashnazgashnazg Build an Extension From C Source doBuild @@ -11487,7 +11501,7 @@ [package.xml] Builds one or more extensions contained in a package. -PEAR-1.10.16/PEAR/Command/Build.php0000664000175000017500000000512314720722517016146 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Command/Build.php0000664000175000017500000000512315135450373016147 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -11578,7 +11592,7 @@ } } } -PEAR-1.10.16/PEAR/Command/Channels.xml0000644000175000017500000001017214720722517016651 0ustar ashnazgashnazg +PEAR-1.10.18/PEAR/Command/Channels.xml0000644000175000017500000001017215135450373016652 0ustar ashnazgashnazg List Available Channels doList @@ -11700,7 +11714,7 @@ remote server, it only deletes the stored username and password from your user configuration. -PEAR-1.10.16/PEAR/Command/Channels.php0000664000175000017500000010124514720722517016644 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Command/Channels.php0000664000175000017500000010132515135450373016644 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -12244,15 +12258,15 @@ // if force is specified, use a timestamp of "1" to force retrieval $lastmodified = isset($options['force']) ? false : $c->lastModified(); PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $contents = $dl->downloadHttp('http://' . $c->getName() . '/channel.xml', + $contents = $dl->downloadHttp('https://' . $c->getName() . '/channel.xml', $this->ui, $tmpdir, null, $lastmodified); PEAR::staticPopErrorHandling(); if (PEAR::isError($contents)) { - // Attempt to fall back to https - $this->ui->outputData("Channel \"$params[0]\" is not responding over http://, failed with message: " . $contents->getMessage()); - $this->ui->outputData("Trying channel \"$params[0]\" over https:// instead"); + // Attempt to fall back to http + $this->ui->outputData("Channel \"$params[0]\" is not responding over https://, failed with message: " . $contents->getMessage()); + $this->ui->outputData("Trying channel \"$params[0]\" over http:// instead"); PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); - $contents = $dl->downloadHttp('https://' . $c->getName() . '/channel.xml', + $contents = $dl->downloadHttp('http://' . $c->getName() . '/channel.xml', $this->ui, $tmpdir, null, $lastmodified); PEAR::staticPopErrorHandling(); if (PEAR::isError($contents)) { @@ -12260,8 +12274,9 @@ $c->getName() . '" (' . $contents->getMessage() . ')'); } } - - list($contents, $lastmodified) = $contents; + if (is_array($contents)) { + list($contents, $lastmodified) = $contents; + } if (!$contents) { $this->ui->outputData("Channel \"$params[0]\" is up to date"); return; @@ -12582,7 +12597,7 @@ return true; } } -PEAR-1.10.16/PEAR/Command/Common.php0000664000175000017500000002002614720722517016336 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -12854,7 +12869,7 @@ return $this->$func($command, $options, $params); } } -PEAR-1.10.16/PEAR/Command/Config.xml0000644000175000017500000000646614720722517016336 0ustar ashnazgashnazg +PEAR-1.10.18/PEAR/Command/Config.xml0000644000175000017500000000646615135450373016337 0ustar ashnazgashnazg Show All Settings doConfigShow @@ -12945,7 +12960,7 @@ and uninstall). -PEAR-1.10.16/PEAR/Command/Config.php0000664000175000017500000003615314720722517016323 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Command/Config.php0000664000175000017500000003615315135450373016324 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -13359,7 +13374,7 @@ return false; } } -PEAR-1.10.16/PEAR/Command/Install.xml0000664000175000017500000002076314720722517016535 0ustar ashnazgashnazg +PEAR-1.10.18/PEAR/Command/Install.xml0000664000175000017500000002076315135450373016536 0ustar ashnazgashnazg Install Package doInstall @@ -13638,7 +13653,7 @@ Run post-installation scripts in package <package>, if any exist. -PEAR-1.10.16/PEAR/Command/Install.php0000664000175000017500000014347314720722517016530 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Command/Install.php0000664000175000017500000014347315135450373016531 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -14911,7 +14926,7 @@ return $ret; } } -PEAR-1.10.16/PEAR/Command/Mirror.xml0000644000175000017500000000115114720722517016365 0ustar ashnazgashnazg +PEAR-1.10.18/PEAR/Command/Mirror.xml0000644000175000017500000000115115135450373016366 0ustar ashnazgashnazg Downloads each available package from the default channel doDownloadAll @@ -14928,7 +14943,7 @@ and downloads them to current working directory. Note: only packages within preferred_state ({config preferred_state}) will be downloaded -PEAR-1.10.16/PEAR/Command/Mirror.php0000644000175000017500000001063614720722517016364 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Command/Mirror.php0000644000175000017500000001063615135450373016365 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.2.0 */ @@ -15066,7 +15081,7 @@ return true; } } -PEAR-1.10.16/PEAR/Command/Package.xml0000644000175000017500000001606614720722517016461 0ustar ashnazgashnazg +PEAR-1.10.18/PEAR/Command/Package.xml0000644000175000017500000001606615135450373016462 0ustar ashnazgashnazg Build Package doPackage @@ -15302,7 +15317,7 @@ used for automated conversion or learning the format. -PEAR-1.10.16/PEAR/Command/Package.php0000664000175000017500000011633414720722517016451 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Command/Package.php0000664000175000017500000011633415135450373016452 0ustar ashnazgashnazg +PEAR-1.10.18/PEAR/Command/Pickle.xml0000644000175000017500000000223315135450373016325 0ustar ashnazgashnazg Build PECL Package doPackage @@ -16459,7 +16474,7 @@ generate both package.xml. -PEAR-1.10.16/PEAR/Command/Pickle.php0000644000175000017500000003702714720722517016324 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Command/Pickle.php0000644000175000017500000003702715135450373016325 0ustar ashnazgashnazg * @copyright 2005-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.1 */ @@ -16879,7 +16894,7 @@ $gen->toPackageFile('.'); } } -PEAR-1.10.16/PEAR/Command/Registry.xml0000644000175000017500000000337614720722517016736 0ustar ashnazgashnazg +PEAR-1.10.18/PEAR/Command/Registry.xml0000644000175000017500000000337615135450373016737 0ustar ashnazgashnazg List Installed Packages In The Default Channel doList @@ -16936,7 +16951,7 @@ local package file, an URL to a package file, or the name of an installed package. -PEAR-1.10.16/PEAR/Command/Registry.php0000664000175000017500000013231514720722517016723 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Command/Registry.php0000664000175000017500000013231515135450373016724 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -18081,7 +18096,7 @@ $this->ui->outputData($data, 'package-info'); } } -PEAR-1.10.16/PEAR/Command/Remote.xml0000644000175000017500000000635714720722517016363 0ustar ashnazgashnazg +PEAR-1.10.18/PEAR/Command/Remote.xml0000644000175000017500000000635715135450373016364 0ustar ashnazgashnazg Information About Remote Packages doRemoteInfo @@ -18189,7 +18204,7 @@ parameter. -PEAR-1.10.16/PEAR/Command/Remote.php0000664000175000017500000007244214720722517016352 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Command/Remote.php0000664000175000017500000007244215135450373016353 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -18998,7 +19013,7 @@ return $num; } } -PEAR-1.10.16/PEAR/Command/Test.xml0000644000175000017500000000315114720722517016034 0ustar ashnazgashnazg +PEAR-1.10.18/PEAR/Command/Test.xml0000644000175000017500000000315115135450373016035 0ustar ashnazgashnazg Run Regression Tests doRunTests @@ -19051,7 +19066,7 @@ [testfile|dir ...] Run regression tests with PHP's regression testing script (run-tests.php). -PEAR-1.10.16/PEAR/Command/Test.php0000644000175000017500000002755014720722517016034 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Command/Test.php0000644000175000017500000002755015135450373016035 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -19394,7 +19409,7 @@ return $this->raiseError('Some tests failed'); } } -PEAR-1.10.16/PEAR/Downloader/Package.php0000664000175000017500000022465714720722517017201 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -21375,7 +21390,7 @@ return $info; } } -PEAR-1.10.16/PEAR/Frontend/CLI.php0000644000175000017500000006211514720722517015721 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -21734,7 +21749,11 @@ function userConfirm($prompt, $default = 'yes') { - trigger_error("PEAR_Frontend_CLI::userConfirm not yet converted", E_USER_ERROR); + if (PHP_VERSION_ID < 70000) { + trigger_error("PEAR_Frontend_CLI::userConfirm not yet converted", E_USER_ERROR); + } else { + throw new Error('PEAR_Frontend_CLI::userConfirm not yet converted'); + } static $positives = array('y', 'yes', 'on', '1'); static $negatives = array('n', 'no', 'off', '0'); print "$this->lp$prompt [$default] : "; @@ -22125,7 +22144,7 @@ print $text; } } -PEAR-1.10.16/PEAR/Installer/Role/Common.php0000644000175000017500000001410714720722517017617 0ustar ashnazgashnazg * @copyright 1997-2006 The PHP Group * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -22298,7 +22317,7 @@ } } ?> -PEAR-1.10.16/PEAR/Installer/Role/Cfg.xml0000644000175000017500000000064514720722517017101 0ustar ashnazgashnazg +PEAR-1.10.18/PEAR/Installer/Role/Cfg.xml0000644000175000017500000000064515135450373017102 0ustar ashnazgashnazg php extsrc extbin @@ -22312,7 +22331,7 @@ -PEAR-1.10.16/PEAR/Installer/Role/Cfg.php0000644000175000017500000000757714720722517017103 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Installer/Role/Cfg.php0000644000175000017500000000757715135450373017104 0ustar ashnazgashnazg * @copyright 2007-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.7.0 */ @@ -22416,7 +22435,7 @@ return $test; } -}PEAR-1.10.16/PEAR/Installer/Role/Data.xml0000644000175000017500000000062214720722517017246 0ustar ashnazgashnazg +}PEAR-1.10.18/PEAR/Installer/Role/Data.xml0000644000175000017500000000062215135450373017247 0ustar ashnazgashnazg php extsrc extbin @@ -22430,7 +22449,7 @@ -PEAR-1.10.16/PEAR/Installer/Role/Data.php0000644000175000017500000000141714720722517017240 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Installer/Role/Data.php0000644000175000017500000000141715135450373017241 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ class PEAR_Installer_Role_Data extends PEAR_Installer_Role_Common {} -?>PEAR-1.10.16/PEAR/Installer/Role/Doc.xml0000644000175000017500000000062114720722517017101 0ustar ashnazgashnazg +?>PEAR-1.10.18/PEAR/Installer/Role/Doc.xml0000644000175000017500000000062115135450373017102 0ustar ashnazgashnazg php extsrc extbin @@ -22470,7 +22489,7 @@ -PEAR-1.10.16/PEAR/Installer/Role/Doc.php0000644000175000017500000000141514720722517017072 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Installer/Role/Doc.php0000644000175000017500000000141515135450373017073 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ class PEAR_Installer_Role_Doc extends PEAR_Installer_Role_Common {} -?>PEAR-1.10.16/PEAR/Installer/Role/Ext.xml0000644000175000017500000000050214720722517017132 0ustar ashnazgashnazg +?>PEAR-1.10.18/PEAR/Installer/Role/Ext.xml0000644000175000017500000000050215135450373017133 0ustar ashnazgashnazg extbin zendextbin 1 @@ -22507,7 +22526,7 @@ 1 -PEAR-1.10.16/PEAR/Installer/Role/Ext.php0000644000175000017500000000141514720722517017125 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Installer/Role/Ext.php0000644000175000017500000000141515135450373017126 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ class PEAR_Installer_Role_Ext extends PEAR_Installer_Role_Common {} -?>PEAR-1.10.16/PEAR/Installer/Role/Man.xml0000644000175000017500000000064514720722517017115 0ustar ashnazgashnazg +?>PEAR-1.10.18/PEAR/Installer/Role/Man.xml0000644000175000017500000000064515135450373017116 0ustar ashnazgashnazg php extsrc extbin @@ -22548,7 +22567,7 @@ -PEAR-1.10.16/PEAR/Installer/Role/Man.php0000644000175000017500000000144514720722517017103 0ustar ashnazgashnazg * @copyright 2011 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.10.0 */ class PEAR_Installer_Role_Man extends PEAR_Installer_Role_Common {} ?> -PEAR-1.10.16/PEAR/Installer/Role/Php.xml0000644000175000017500000000065514720722517017132 0ustar ashnazgashnazg +PEAR-1.10.18/PEAR/Installer/Role/Php.xml0000644000175000017500000000065515135450373017133 0ustar ashnazgashnazg php extsrc extbin @@ -22590,7 +22609,7 @@ -PEAR-1.10.16/PEAR/Installer/Role/Php.php0000644000175000017500000000141514720722517017114 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Installer/Role/Php.php0000644000175000017500000000141515135450373017115 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ class PEAR_Installer_Role_Php extends PEAR_Installer_Role_Common {} -?>PEAR-1.10.16/PEAR/Installer/Role/Script.xml0000644000175000017500000000066014720722517017643 0ustar ashnazgashnazg +?>PEAR-1.10.18/PEAR/Installer/Role/Script.xml0000644000175000017500000000066015135450373017644 0ustar ashnazgashnazg php extsrc extbin @@ -22630,7 +22649,7 @@ 1 -PEAR-1.10.16/PEAR/Installer/Role/Script.php0000644000175000017500000000142314720722517017630 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Installer/Role/Script.php0000644000175000017500000000142315135450373017631 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ class PEAR_Installer_Role_Script extends PEAR_Installer_Role_Common {} -?>PEAR-1.10.16/PEAR/Installer/Role/Src.xml0000644000175000017500000000044214720722517017124 0ustar ashnazgashnazg +?>PEAR-1.10.18/PEAR/Installer/Role/Src.xml0000644000175000017500000000044215135450373017125 0ustar ashnazgashnazg extsrc zendextsrc 1 @@ -22667,7 +22686,7 @@ -PEAR-1.10.16/PEAR/Installer/Role/Src.php0000644000175000017500000000156214720722517017117 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Installer/Role/Src.php0000644000175000017500000000156215135450373017120 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -22699,7 +22718,7 @@ $installer->source_files++; } } -?>PEAR-1.10.16/PEAR/Installer/Role/Test.xml0000644000175000017500000000062214720722517017314 0ustar ashnazgashnazg +?>PEAR-1.10.18/PEAR/Installer/Role/Test.xml0000644000175000017500000000062215135450373017315 0ustar ashnazgashnazg php extsrc extbin @@ -22713,7 +22732,7 @@ -PEAR-1.10.16/PEAR/Installer/Role/Test.php0000644000175000017500000000141714720722517017306 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Installer/Role/Test.php0000644000175000017500000000141715135450373017307 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ class PEAR_Installer_Role_Test extends PEAR_Installer_Role_Common {} -?>PEAR-1.10.16/PEAR/Installer/Role/Www.xml0000644000175000017500000000064414720722517017165 0ustar ashnazgashnazg +?>PEAR-1.10.18/PEAR/Installer/Role/Www.xml0000644000175000017500000000064415135450373017166 0ustar ashnazgashnazg php extsrc extbin @@ -22753,7 +22772,7 @@ -PEAR-1.10.16/PEAR/Installer/Role/Www.php0000644000175000017500000000141114720722517017145 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Installer/Role/Www.php0000644000175000017500000000141115135450373017146 0ustar ashnazgashnazg * @copyright 2007-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.7.0 */ class PEAR_Installer_Role_Www extends PEAR_Installer_Role_Common {} -?>PEAR-1.10.16/PEAR/Installer/Role.php0000664000175000017500000001727414720722517016401 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Installer/Role.php0000664000175000017500000001727415135450373016402 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -23044,7 +23063,7 @@ PEAR_Installer_Role::getValidRoles('****', true); return true; } -}PEAR-1.10.16/PEAR/PackageFile/Generator/v1.php0000664000175000017500000014226114720722517020145 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -23091,7 +23110,7 @@ function getPackagerVersion() { - return '1.10.16'; + return '1.10.18'; } /** @@ -23242,7 +23261,7 @@ ); $ret = "\n"; $ret .= "\n"; - $ret .= "\n" . + $ret .= "\n" . " $pkginfo[package]"; if (isset($pkginfo['extends'])) { $ret .= "\n$pkginfo[extends]"; @@ -24330,7 +24349,7 @@ } } ?> -PEAR-1.10.16/PEAR/PackageFile/Generator/v2.php0000664000175000017500000010071114720722517020140 0ustar ashnazgashnazgoptions['beautifyFilelist'] = true; } - $arr['attribs']['packagerversion'] = '1.10.16'; + $arr['attribs']['packagerversion'] = '1.10.18'; if ($this->serialize($arr, $options)) { return $this->_serializedData . "\n"; } @@ -25216,7 +25235,7 @@ return $tag; } } -PEAR-1.10.16/PEAR/PackageFile/Parser/v1.php0000644000175000017500000004020714720722517017446 0ustar ashnazgashnazgPEAR-1.10.16/PEAR/PackageFile/Parser/v2.php0000644000175000017500000000611014720722517017442 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/PackageFile/Parser/v2.php0000644000175000017500000000611015135450373017443 0ustar ashnazgashnazgsetPackagefile($file, $archive); return $ret; } -}PEAR-1.10.16/PEAR/PackageFile/v2/rw.php0000644000175000017500000017313714720722517016654 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a8 */ @@ -27386,7 +27405,7 @@ { unset($this->_packageInfo['changelog']); } -}PEAR-1.10.16/PEAR/PackageFile/v2/Validator.php0000664000175000017500000024620014720722517020143 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a8 * @access private @@ -27499,8 +27518,8 @@ isset($test['dependencies']['required']) && isset($test['dependencies']['required']['pearinstaller']) && isset($test['dependencies']['required']['pearinstaller']['min']) && - '1.10.16' != '@package' . '_version@' && - version_compare('1.10.16', + '1.10.18' != '@package' . '_version@' && + version_compare('1.10.18', $test['dependencies']['required']['pearinstaller']['min'], '<') ) { $this->_pearVersionTooLow($test['dependencies']['required']['pearinstaller']['min']); @@ -28738,7 +28757,7 @@ $this->_stack->push(__FUNCTION__, 'error', array('version' => $version), 'This package.xml requires PEAR version %version% to parse properly, we are ' . - 'version 1.10.16'); + 'version 1.10.18'); } function _invalidTagOrder($oktags, $actual, $root) @@ -29521,7 +29540,7 @@ return $providesret; } } -PEAR-1.10.16/PEAR/PackageFile/v1.php0000664000175000017500000014266314720722517016225 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -31123,7 +31142,7 @@ // }}} } ?> -PEAR-1.10.16/PEAR/PackageFile/v2.php0000664000175000017500000021050014720722517016210 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -33182,7 +33201,7 @@ } } ?> -PEAR-1.10.16/PEAR/REST/10.php0000644000175000017500000007762114720722517014540 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a12 */ @@ -34052,7 +34071,7 @@ } } } -PEAR-1.10.16/PEAR/REST/11.php0000644000175000017500000002575114720722517014536 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.3 */ @@ -34392,7 +34411,7 @@ } } ?> -PEAR-1.10.16/PEAR/REST/13.php0000644000175000017500000003542714720722517014541 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a12 */ @@ -34787,7 +34806,7 @@ return $ret; } -}PEAR-1.10.16/PEAR/Task/Postinstallscript/rw.php0000644000175000017500000001403414720722517020623 0ustar ashnazgashnazg - read/write version * @@ -34812,7 +34831,7 @@ * @author Greg Beaver * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a10 */ @@ -34969,7 +34988,7 @@ ); } } -PEAR-1.10.16/PEAR/Task/Replace/rw.php0000644000175000017500000000302714720722517016435 0ustar ashnazgashnazg - read/write version * @@ -34994,7 +35013,7 @@ * @author Greg Beaver * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a10 */ @@ -35028,7 +35047,7 @@ return $this->_params; } } -PEAR-1.10.16/PEAR/Task/Unixeol/rw.php0000644000175000017500000000243414720722517016506 0ustar ashnazgashnazg - read/write version * @@ -35053,7 +35072,7 @@ * @author Greg Beaver * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a10 */ @@ -35083,7 +35102,7 @@ } } ?> -PEAR-1.10.16/PEAR/Task/Windowseol/rw.php0000644000175000017500000000245114720722517017214 0ustar ashnazgashnazg - read/write version * @@ -35109,7 +35128,7 @@ * @author Greg Beaver * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a10 */ @@ -35139,7 +35158,7 @@ } } ?> -PEAR-1.10.16/PEAR/Task/Common.php0000644000175000017500000001403714720722517015665 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 * @abstract @@ -35346,7 +35365,7 @@ return PEAR::raiseError($msg, $code); } } -PEAR-1.10.16/PEAR/Task/Postinstallscript.php0000644000175000017500000003457014720722517020202 0ustar ashnazgashnazg * @@ -35375,7 +35394,7 @@ * @author Greg Beaver * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -35696,7 +35715,7 @@ { } } -PEAR-1.10.16/PEAR/Task/Replace.php0000644000175000017500000001537114720722517016012 0ustar ashnazgashnazg * @@ -35721,7 +35740,7 @@ * @author Greg Beaver * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -35882,7 +35901,7 @@ return $contents; } } -PEAR-1.10.16/PEAR/Task/Unixeol.php0000644000175000017500000000437714720722517016066 0ustar ashnazgashnazg * @@ -35907,7 +35926,7 @@ * @author Greg Beaver * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -35961,7 +35980,7 @@ return preg_replace("/\r\n|\n\r|\r|\n/", "\n", $contents); } } -PEAR-1.10.16/PEAR/Task/Windowseol.php0000644000175000017500000000436314720722517016570 0ustar ashnazgashnazg * @@ -35987,7 +36006,7 @@ * @author Greg Beaver * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -36041,7 +36060,7 @@ return preg_replace("/\r\n|\n\r|\r|\n/", "\r\n", $contents); } } -PEAR-1.10.16/PEAR/Validator/PECL.php0000644000175000017500000000407114720722517016200 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a5 */ @@ -36102,7 +36121,7 @@ return $ret; } } -?>PEAR-1.10.16/PEAR/Builder.php0000664000175000017500000004477314720722517015135 0ustar ashnazgashnazgPEAR-1.10.18/PEAR/Builder.php0000664000175000017500000004477315135450373015136 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since PHP 4.0.2 * @see http://pear.php.net/manual/en/core.ppm.pear-builder.php @@ -36549,7 +36568,7 @@ if (!file_exists($build_dir) || !is_dir($build_dir) || !chdir($build_dir)) { return $this->raiseError("could not chdir to $build_dir"); } - putenv('PHP_PEAR_VERSION=1.10.16'); + putenv('PHP_PEAR_VERSION=1.10.18'); foreach ($to_run as $cmd) { $err = $this->_runCommand($cmd, $callback); if (PEAR::isError($err)) { @@ -36661,7 +36680,7 @@ return parent::log($level, $msg, $append_crlf); } } -PEAR-1.10.16/PEAR/ChannelFile.php0000644000175000017500000014323414720722517015705 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -38221,7 +38240,7 @@ return time(); } } -PEAR-1.10.16/PEAR/Command.php0000664000175000017500000003021314720722517015105 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -38609,7 +38628,7 @@ return false; } // }}} -}PEAR-1.10.16/PEAR/Common.php0000664000175000017500000006354214720722517014772 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 * @deprecated This class will disappear, and its components will be spread @@ -39447,7 +39466,7 @@ require_once 'PEAR/Config.php'; require_once 'PEAR/PackageFile.php'; -PEAR-1.10.16/PEAR/Config.php0000664000175000017500000020703514720722517014744 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -41571,7 +41590,7 @@ } } } -PEAR-1.10.16/PEAR/DependencyDB.php0000664000175000017500000005740114720722517016023 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -42342,7 +42361,7 @@ } } } -PEAR-1.10.16/PEAR/Dependency2.php0000664000175000017500000014241614720722517015700 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -42884,7 +42903,7 @@ */ function getPEARVersion() { - return '1.10.16'; + return '1.10.18'; } function validatePearinstallerDependency($dep) @@ -43699,7 +43718,7 @@ $this->_currentPackage, true))); } } -PEAR-1.10.16/PEAR/Downloader.php0000664000175000017500000020073114720722517015631 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.3.0 */ @@ -45337,7 +45356,7 @@ } $request .= $ifmodifiedsince . - "User-Agent: PEAR/1.10.16/PHP/" . PHP_VERSION . "\r\n"; + "User-Agent: PEAR/1.10.18/PHP/" . PHP_VERSION . "\r\n"; if ($object !== null) { // only pass in authentication for non-static calls $username = $config->get('username', null, $channel); @@ -45427,19 +45446,43 @@ call_user_func($callback, 'start', array(basename($dest_file), $length)); } - while ($data = fread($fp, 1024)) { - $bytes += strlen($data); - if ($callback) { - call_user_func($callback, 'bytesread', $bytes); + if (isset($headers['transfer-encoding']) && strtolower($headers['transfer-encoding']) === 'chunked') { + while (!feof($fp)) { + $chunk_size = hexdec(fgets($fp)); + if ($chunk_size === 0) { + break; + } + $data = fread($fp, $chunk_size); + $bytes += strlen($data); + if ($callback) { + call_user_func($callback, 'bytesread', $bytes); + } + if (!@fwrite($wp, $data)) { + fclose($fp); + if ($callback) { + call_user_func($callback, 'writefailed', + array($dest_file, error_get_last()["message"])); + } + return PEAR::raiseError( + "$dest_file: write failed (" . error_get_last()["message"] . ")"); + } + fgets($fp); // Skip the trailing CRLF } - if (!@fwrite($wp, $data)) { - fclose($fp); + } else { + while ($data = fread($fp, 1024)) { + $bytes += strlen($data); if ($callback) { - call_user_func($callback, 'writefailed', - array($dest_file, error_get_last()["message"])); + call_user_func($callback, 'bytesread', $bytes); + } + if (!@fwrite($wp, $data)) { + fclose($fp); + if ($callback) { + call_user_func($callback, 'writefailed', + array($dest_file, error_get_last()["message"])); + } + return PEAR::raiseError( + "$dest_file: write failed (" . error_get_last()["message"] . ")"); } - return PEAR::raiseError( - "$dest_file: write failed (" . error_get_last()["message"] . ")"); } } @@ -45466,7 +45509,7 @@ return $dest_file; } } -PEAR-1.10.16/PEAR/ErrorStack.php0000664000175000017500000010201414720722517015605 0ustar ashnazgashnazg * @author Greg Beaver - * @version 1.10.16 + * @version 1.10.18 * @package PEAR_ErrorStack * @category Debugging * @copyright 2004-2008 Greg Beaver @@ -46445,7 +46488,7 @@ $stack = &PEAR_ErrorStack::singleton('PEAR_ErrorStack'); $stack->pushCallback(array('PEAR_ErrorStack', '_handleError')); ?> -PEAR-1.10.16/PEAR/Exception.php0000644000175000017500000003315514720722517015473 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.3.3 * @@ -46832,7 +46875,7 @@ } return $causeMsg . $this->getTraceAsString(); } -}PEAR-1.10.16/PEAR/Frontend.php0000664000175000017500000001477214720722517015322 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -47055,7 +47098,7 @@ { } } -PEAR-1.10.16/PEAR/Installer.php0000664000175000017500000021071114720722517015467 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -48862,7 +48905,7 @@ // }}} } -PEAR-1.10.16/PEAR/PackageFile.php0000664000175000017500000003674614720722517015703 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -49353,7 +49396,7 @@ return $info; } } -PEAR-1.10.16/PEAR/Packager.php0000644000175000017500000001704014720722517015245 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */ @@ -49552,7 +49595,7 @@ return $dest_package; } -}PEAR-1.10.16/PEAR/Proxy.php0000664000175000017500000001275214720722517014660 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -49955,10 +49998,10 @@ $pear_channel->setServer('pear.php.net'); $pear_channel->setSummary('PHP Extension and Application Repository'); $pear_channel->setDefaultPEARProtocols(); - $pear_channel->setBaseURL('REST1.0', 'http://pear.php.net/rest/'); - $pear_channel->setBaseURL('REST1.1', 'http://pear.php.net/rest/'); - $pear_channel->setBaseURL('REST1.3', 'http://pear.php.net/rest/'); - //$pear_channel->setBaseURL('REST1.4', 'http://pear.php.net/rest/'); + $pear_channel->setBaseURL('REST1.0', 'https://pear.php.net/rest/'); + $pear_channel->setBaseURL('REST1.1', 'https://pear.php.net/rest/'); + $pear_channel->setBaseURL('REST1.3', 'https://pear.php.net/rest/'); + //$pear_channel->setBaseURL('REST1.4', 'https://pear.php.net/rest/'); } else { $pear_channel->setServer('pear.php.net'); $pear_channel->setAlias('pear'); @@ -49980,8 +50023,8 @@ $pecl_channel->setServer('pecl.php.net'); $pecl_channel->setSummary('PHP Extension Community Library'); $pecl_channel->setDefaultPEARProtocols(); - $pecl_channel->setBaseURL('REST1.0', 'http://pecl.php.net/rest/'); - $pecl_channel->setBaseURL('REST1.1', 'http://pecl.php.net/rest/'); + $pecl_channel->setBaseURL('REST1.0', 'https://pecl.php.net/rest/'); + $pecl_channel->setBaseURL('REST1.1', 'https://pecl.php.net/rest/'); $pecl_channel->setValidationPackage('PEAR_Validator_PECL', '1.0'); } else { $pecl_channel->setServer('pecl.php.net'); @@ -50004,9 +50047,9 @@ $doc_channel->setServer('doc.php.net'); $doc_channel->setSummary('PHP Documentation Team'); $doc_channel->setDefaultPEARProtocols(); - $doc_channel->setBaseURL('REST1.0', 'http://doc.php.net/rest/'); - $doc_channel->setBaseURL('REST1.1', 'http://doc.php.net/rest/'); - $doc_channel->setBaseURL('REST1.3', 'http://doc.php.net/rest/'); + $doc_channel->setBaseURL('REST1.0', 'https://doc.php.net/rest/'); + $doc_channel->setBaseURL('REST1.1', 'https://doc.php.net/rest/'); + $doc_channel->setBaseURL('REST1.3', 'https://doc.php.net/rest/'); } else { $doc_channel->setServer('doc.php.net'); $doc_channel->setAlias('doc'); @@ -51248,9 +51291,9 @@ $pear_channel->setAlias('pear'); $pear_channel->setSummary('PHP Extension and Application Repository'); $pear_channel->setDefaultPEARProtocols(); - $pear_channel->setBaseURL('REST1.0', 'http://pear.php.net/rest/'); - $pear_channel->setBaseURL('REST1.1', 'http://pear.php.net/rest/'); - $pear_channel->setBaseURL('REST1.3', 'http://pear.php.net/rest/'); + $pear_channel->setBaseURL('REST1.0', 'https://pear.php.net/rest/'); + $pear_channel->setBaseURL('REST1.1', 'https://pear.php.net/rest/'); + $pear_channel->setBaseURL('REST1.3', 'https://pear.php.net/rest/'); return $pear_channel; } @@ -51264,8 +51307,8 @@ $pear_channel->setAlias('pecl'); $pear_channel->setSummary('PHP Extension Community Library'); $pear_channel->setDefaultPEARProtocols(); - $pear_channel->setBaseURL('REST1.0', 'http://pecl.php.net/rest/'); - $pear_channel->setBaseURL('REST1.1', 'http://pecl.php.net/rest/'); + $pear_channel->setBaseURL('REST1.0', 'https://pecl.php.net/rest/'); + $pear_channel->setBaseURL('REST1.1', 'https://pecl.php.net/rest/'); $pear_channel->setValidationPackage('PEAR_Validator_PECL', '1.0'); return $pear_channel; } @@ -51281,9 +51324,9 @@ $doc_channel->setAlias('phpdocs'); $doc_channel->setSummary('PHP Documentation Team'); $doc_channel->setDefaultPEARProtocols(); - $doc_channel->setBaseURL('REST1.0', 'http://doc.php.net/rest/'); - $doc_channel->setBaseURL('REST1.1', 'http://doc.php.net/rest/'); - $doc_channel->setBaseURL('REST1.3', 'http://doc.php.net/rest/'); + $doc_channel->setBaseURL('REST1.0', 'https://doc.php.net/rest/'); + $doc_channel->setBaseURL('REST1.1', 'https://doc.php.net/rest/'); + $doc_channel->setBaseURL('REST1.3', 'https://doc.php.net/rest/'); return $doc_channel; } @@ -52137,7 +52180,7 @@ return $ret; } } -PEAR-1.10.16/PEAR/REST.php0000664000175000017500000004050514720722517014311 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -52522,7 +52565,7 @@ } $request .= $ifmodifiedsince . - "User-Agent: PEAR/1.10.16/PHP/" . PHP_VERSION . "\r\n"; + "User-Agent: PEAR/1.10.18/PHP/" . PHP_VERSION . "\r\n"; $username = $this->config->get('username', null, $channel); $password = $this->config->get('password', null, $channel); @@ -52587,8 +52630,19 @@ $length = isset($headers['content-length']) ? $headers['content-length'] : -1; $data = ''; - while ($chunk = @fread($fp, 8192)) { - $data .= $chunk; + if (isset($headers['transfer-encoding']) && strtolower($headers['transfer-encoding']) === 'chunked') { + while (!feof($fp)) { + $chunk_size = hexdec(fgets($fp)); + if ($chunk_size === 0) { + break; + } + $data .= fread($fp, $chunk_size); + fgets($fp); // Skip the trailing CRLF + } + } else { + while ($chunk = @fread($fp, 8192)) { + $data .= $chunk; + } } fclose($fp); @@ -52611,7 +52665,7 @@ return $data; } } -PEAR-1.10.16/PEAR/RunTest.php0000664000175000017500000010663214720722517015144 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.3.3 */ @@ -52677,7 +52731,6 @@ 'display_errors=1', 'log_errors=0', 'html_errors=0', - 'report_memleaks=0', 'report_zend_debug=0', 'docref_root=', 'docref_ext=.html', @@ -52706,6 +52759,9 @@ $excluded_error_reporting |= E_STRICT; } $this->ini_overwrites[] = 'error_reporting=' . (E_ALL & ~$excluded_error_reporting); + if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 80500) { + $this->ini_overwrites[] = 'report_memleaks=0'; + } if (is_null($logger)) { require_once 'PEAR/Common.php'; $logger = new PEAR_Common; @@ -53588,7 +53644,7 @@ } } } -PEAR-1.10.16/PEAR/Validate.php0000664000175000017500000005276514720722517015300 0ustar ashnazgashnazg * @copyright 1997-2009 The Authors * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 1.10.16 + * @version Release: 1.10.18 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */ @@ -54212,7 +54268,7 @@ { return true; } -}PEAR-1.10.16/PEAR/XMLParser.php0000644000175000017500000001537714720722517015360 0ustar ashnazgashnazg_dataStack[$this->_depth] .= $cdata; } -}PEAR-1.10.16/scripts/pear.bat0000755000175000017500000001036114720722517015400 0ustar ashnazgashnazg@ECHO OFF +}PEAR-1.10.18/scripts/pear.bat0000755000175000017500000001036115135450373015401 0ustar ashnazgashnazg@ECHO OFF REM ---------------------------------------------------------------------- REM PHP version 5 @@ -54568,7 +54624,7 @@ :RUN "%PHP_PEAR_PHP_BIN%" -C -d date.timezone=UTC -d output_buffering=1 -d safe_mode=0 -d open_basedir="" -d auto_prepend_file="" -d auto_append_file="" -d variables_order=EGPCS -d register_argc_argv="On" -d "include_path='%PHP_PEAR_INSTALL_DIR%'" -f "%PHP_PEAR_INSTALL_DIR%\pearcmd.php" -- %1 %2 %3 %4 %5 %6 %7 %8 %9 :END -@ECHO ONPEAR-1.10.16/scripts/peardev.bat0000664000175000017500000001105014720722517016072 0ustar ashnazgashnazg@ECHO OFF +@ECHO ONPEAR-1.10.18/scripts/peardev.bat0000664000175000017500000001105015135450373016073 0ustar ashnazgashnazg@ECHO OFF REM ---------------------------------------------------------------------- REM PHP version 5 @@ -54682,7 +54738,7 @@ "%PHP_PEAR_PHP_BIN%" -C -d date.timezone=UTC -d memory_limit="-1" -d safe_mode=0 -d register_argc_argv="On" -d auto_prepend_file="" -d auto_append_file="" -d variables_order=EGPCS -d open_basedir="" -d output_buffering=1 -d "include_path='%PHP_PEAR_INSTALL_DIR%'" -f "%PHP_PEAR_INSTALL_DIR%\pearcmd.php" -- %1 %2 %3 %4 %5 %6 %7 %8 %9 :END @ECHO ON -PEAR-1.10.16/scripts/pecl.bat0000664000175000017500000001072114720722517015373 0ustar ashnazgashnazg@ECHO OFF +PEAR-1.10.18/scripts/pecl.bat0000664000175000017500000001072115135450373015374 0ustar ashnazgashnazg@ECHO OFF REM ---------------------------------------------------------------------- REM PHP version 5 @@ -54796,7 +54852,7 @@ "%PHP_PEAR_PHP_BIN%" -C -d date.timezone=UTC -d output_buffering=1 -d safe_mode=0 -d "include_path='%PHP_PEAR_INSTALL_DIR%'" -d register_argc_argv="On" -d variables_order=EGPCS -f "%PHP_PEAR_INSTALL_DIR%\peclcmd.php" -- %1 %2 %3 %4 %5 %6 %7 %8 %9 :END @ECHO ON -PEAR-1.10.16/scripts/pear.sh0000775000175000017500000000140414720722517015244 0ustar ashnazgashnazg#!/bin/sh +PEAR-1.10.18/scripts/pear.sh0000775000175000017500000000140415135450373015245 0ustar ashnazgashnazg#!/bin/sh # first find which PHP binary to use if test "x$PHP_PEAR_PHP_BIN" != "x"; then @@ -54824,7 +54880,7 @@ fi exec $PHP -C -q $INCARG -d date.timezone=UTC -d output_buffering=1 -d variables_order=EGPCS -d open_basedir="" -d safe_mode=0 -d register_argc_argv="On" -d auto_prepend_file="" -d auto_append_file="" $INCDIR/pearcmd.php "$@" -PEAR-1.10.16/scripts/peardev.sh0000755000175000017500000000143114720722517015741 0ustar ashnazgashnazg#!/bin/sh +PEAR-1.10.18/scripts/peardev.sh0000755000175000017500000000143115135450373015742 0ustar ashnazgashnazg#!/bin/sh # first find which PHP binary to use if test "x$PHP_PEAR_PHP_BIN" != "x"; then @@ -54852,7 +54908,7 @@ fi exec $PHP -d date.timezone=UTC -d memory_limit="-1" -C -q $INCARG -d output_buffering=1 -d open_basedir="" -d safe_mode=0 -d register_argc_argv="On" -d auto_prepend_file="" -d variables_order=EGPCS -d auto_append_file="" $INCDIR/pearcmd.php "$@" -PEAR-1.10.16/scripts/pecl.sh0000755000175000017500000000130214720722517015233 0ustar ashnazgashnazg#!/bin/sh +PEAR-1.10.18/scripts/pecl.sh0000755000175000017500000000130215135450373015234 0ustar ashnazgashnazg#!/bin/sh # first find which PHP binary to use if test "x$PHP_PEAR_PHP_BIN" != "x"; then @@ -54880,7 +54936,7 @@ fi exec $PHP -C -q $INCARG -d date.timezone=UTC -d output_buffering=1 -d variables_order=EGPCS -d safe_mode=0 -d register_argc_argv="On" $INCDIR/peclcmd.php "$@" -PEAR-1.10.16/scripts/pearcmd.php0000664000175000017500000003517414720722517016115 0ustar ashnazgashnazg -PEAR-1.10.16/LICENSE0000644000175000017500000000270514720722517013277 0ustar ashnazgashnazgCopyright (c) 1997-2009, +PEAR-1.10.18/LICENSE0000644000175000017500000000270515135450373013300 0ustar ashnazgashnazgCopyright (c) 1997-2009, Stig Bakken , Gregory Beaver , Helgi Þormar Þorbjörnsson , @@ -55440,7 +55496,7 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -PEAR-1.10.16/INSTALL0000644000175000017500000000417014720722517013321 0ustar ashnazgashnazgPEAR - The PEAR Installer +PEAR-1.10.18/INSTALL0000644000175000017500000000417015135450373013322 0ustar ashnazgashnazgPEAR - The PEAR Installer ========================= Installing the PEAR Installer. @@ -55492,7 +55548,7 @@ related issues. Happy PHPing, we hope PEAR will be a great tool for your development work! -PEAR-1.10.16/package.dtd0000664000175000017500000000640414720722517014364 0ustar ashnazgashnazg