Skip to content

Regression: DOMDocument::saveXML/saveHTML(int) treats $node as options — Zend TypeError ?DOMNode (ext/dom/document.c) #31396

Description

@PurHur

Category

stdlib · php-src-strict · ext/dom

Problem

DOMDocument::saveXML() / saveHTML() accept a non-null non-DOMNode first argument on VM/JIT by treating a lone int/float as $options. Zend always types argument #1 as ?DOMNode and TypeErrors.

Repro Zend 8.2+ VM/JIT (2026-08-16)
$doc->saveXML(1) TypeError ?DOMNode, int given serializes whole document (int→options)
$doc->saveXML(LIBXML_NOEMPTYTAG) same TypeError applies LIBXML_NOEMPTYTAG as options
$doc->saveHTML(1) TypeError ?DOMNode, int given serializes HTML
$doc->saveXML(null, LIBXML_NOEMPTYTAG) expands empty tags same (control)
$doc->saveXML("x") TypeError string TypeError (message wording differs)

Root cause: DomClassMethod::parseSaveNodeAndOptionsArgs() special-cases a single int/float as $options (comment cites #6140; that issue does not justify the coercion).

php-src reference

PHP implementation target

  • ext/dom/DomClassMethod.phpparseSaveNodeAndOptionsArgs() / saveSerializationOptionalDomNodeArg() — always treat arg1 as ?DOMNode; Zend-shaped TypeError
  • ext/dom/VmDomJitDispatch.php + DomSaveXMLJitHelper.php — mirror nullable node check for JIT/AOT bridges

Repro

./script/docker-exec.sh -- bash -lc 'php bin/vm.php test/repro/issue_dom_savexml_savehtml_node_typeerror.php'
./script/docker-exec.sh -- bash -lc 'php bin/jit.php test/repro/issue_dom_savexml_savehtml_node_typeerror.php'

Done when

  • saveXML(1) / saveHTML(1) / saveXML(LIBXML_NOEMPTYTAG) TypeError like Zend (Argument #1 ($node) must be of type ?DOMNode, …)
  • saveXML(null, LIBXML_NOEMPTYTAG) still works
  • Compliance .phpt under test/compliance/cases/dom/
  • php-src-strict; VM + JIT (AOT when bridge in scope)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:vmVirtual machinebugSomething isn't workingimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimphase-4:stdlibPhase 4 – stdlib for web appsstdlib

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions