Closed Bug 283349 Opened 20 years ago Closed 20 years ago

Assertion failure: ns->prefix, at jsxml.c:2298

Categories

(Core :: JavaScript Engine, defect, P1)

x86
Linux
defect

Tracking

()

VERIFIED FIXED
mozilla1.8beta2

People

(Reporter: igor, Assigned: brendan)

Details

(Keywords: js1.5, Whiteboard: [have patch])

Attachments

(2 files)

The following script:

var x = <x>text</x>;
var ns = new Namespace("http://foo.com/bar");
x.addNamespace(ns);
print(x.toXMLString());

Generates assertion failure when run in js shell built from trunk on 2005-02-23:
js -x ~/s/x.js
Assertion failure: ns->prefix, at jsxml.c:2298
Aborted
Oops, got carried away there -- too many degrees of freedom in E4X on whether a
namespace can have an undefined (null in this impl) prefix, the empty string
(meaning default namespace), or a non-empty string.  GetNamespace was ignoring
the undefined (null) case that can arise programmatically via 'ns = new
Namespace; x.addNamespace(ns)'.

In general, qn->prefix can be null or the empty string, too.  For a namespace
ns, !ns->prefix means that no prefix was specified, while IS_EMPTY(ns->prefix)
means this is a default namespace.  Since qn->prefix is set only by calls to
js_NewXMLQName*(), and some of those pass NULL for prefix while others pass a
variable that came from ns->prefix (which could be the empty string), we have
to test like so:

(!ns->prefix || IS_EMPTY(ns->prefix)) && (!qn->prefix || IS_EMPTY(qn->prefix))

if either ns->prefix or qn->prefix is null, when comparing a namespace's prefix
to a qname's prefix.

Looking for review from igor and shaver, to maximize E4X brainprint.

/be
Attachment #175348 - Flags: superreview?(shaver)
Attachment #175348 - Flags: review?(igor)
Assignee: general → brendan
Keywords: js1.5
Priority: -- → P1
Whiteboard: [have patch]
Target Milestone: --- → mozilla1.8beta2
Status: NEW → ASSIGNED
Attachment #175348 - Flags: review?(igor) → review+
From ECMA-357 13.3.5.4 [[GetNamespace]]:

3. Find a Namespace ns in InScopeNamespaces, such that ns.uri == q.uri. If more
than one such Namespace ns exists, the implementation may choose one of the
matching Namespaces arbitrarily. NOTE: implementations that preserve prefixes in
qualified names may additionally constrain ns, such that ns.prefix == q.[[Prefix]]

That NOTE is less than helpful.  As the "Erratum, very tricky, ..." comment just
barely visible in the patch explains, due to how xml-infoset is mapped into e4x,
q.[[Prefix]] for an unprefixed XML tag will be undefined, but we want the
default namespace (prefix == "") to match.

This patch makes the reverse-match work too: an ns with ns.prefix *undefined*
(null in the code) matches a q.[[Prefix]] == "".  You won't get an XML node with
[[Name]].[[Prefix]] == "" via the ECMA-357-specified mapping from xml-infoset,
but you could construct such a thing with setName.

Whee!  I'm still thinking dark thoughts about E4X distinguishing "no prefix"
from "default namespace prefix (empty string)", but not carrying the logic thru
as required.

/be
Comment on attachment 175348 [details] [diff] [review]
handle null ns->prefix in GetNamespace

sr=shaver with the IS_EMPTY(ns->prefix ? ns->prefix : qn->prefix)
simplification.
Attachment #175348 - Flags: superreview?(shaver) → superreview+
Status: ASSIGNED → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
js/tests/e4x/Regress/regress-283349.js checked in.
Flags: testcase+
verified fixed.
Status: RESOLVED → VERIFIED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: