Bug 357063: use cursor operations to implement xml equality to properly implement E4X. r=brendan,jwalden

This commit is contained in:
igor.bukanov%gmail.com 2006-10-26 13:36:16 +00:00
Родитель 5050841dff
Коммит b4c3cc1f95
1 изменённых файлов: 26 добавлений и 12 удалений

Просмотреть файл

@ -3591,13 +3591,18 @@ Descendants(JSContext *cx, JSXML *xml, jsval id)
return list;
}
static JSBool
xml_equality(JSContext *cx, JSObject *obj, jsval v, JSBool *bp);
/* Recursive (JSXML *) parameterized version of Equals. */
static JSBool
XMLEquals(JSContext *cx, JSXML *xml, JSXML *vxml, JSBool *bp)
{
JSXMLQName *qn, *vqn;
uint32 i, j, n;
JSXML **xvec, **vvec, *attr, *vattr;
JSXMLArrayCursor cursor, vcursor;
JSXML *kid, *vkid, *attr, *vattr;
JSBool ok;
JSObject *xobj, *vobj;
retry:
@ -3630,21 +3635,30 @@ retry:
if (JSXML_HAS_VALUE(xml)) {
*bp = js_EqualStrings(xml->xml_value, vxml->xml_value);
} else if ((n = xml->xml_kids.length) != vxml->xml_kids.length) {
} else if (xml->xml_kids.length != vxml->xml_kids.length) {
*bp = JS_FALSE;
} else {
xvec = (JSXML **) xml->xml_kids.vector;
vvec = (JSXML **) vxml->xml_kids.vector;
for (i = 0; i < n; i++) {
xobj = js_GetXMLObject(cx, xvec[i]);
vobj = js_GetXMLObject(cx, vvec[i]);
if (!xobj || !vobj)
return JS_FALSE;
if (!js_XMLObjectOps.equality(cx, xobj, OBJECT_TO_JSVAL(vobj), bp))
return JS_FALSE;
if (!*bp)
XMLArrayCursorInit(&cursor, &xml->xml_kids);
XMLArrayCursorInit(&vcursor, &vxml->xml_kids);
for (;;) {
kid = (JSXML *) XMLArrayCursorNext(&cursor);
vkid = (JSXML *) XMLArrayCursorNext(&vcursor);
if (!kid || !vkid) {
*bp = !kid && !vkid;
ok = JS_TRUE;
break;
}
xobj = js_GetXMLObject(cx, kid);
vobj = js_GetXMLObject(cx, vkid);
ok = xobj && vobj &&
xml_equality(cx, xobj, OBJECT_TO_JSVAL(vobj), bp);
if (!ok || !*bp)
break;
}
XMLArrayCursorFinish(&vcursor);
XMLArrayCursorFinish(&cursor);
if (!ok)
return JS_FALSE;
if (*bp && xml->xml_class == JSXML_CLASS_ELEMENT) {
n = xml->xml_attrs.length;