From 2a0d15e8b966337f6d9e6e47445b205749a0622a Mon Sep 17 00:00:00 2001 From: "brendan%mozilla.org" Date: Sat, 25 Mar 2006 21:54:18 +0000 Subject: [PATCH] Rooting fixes courtesy dbaron (331678, r=mrbkap). git-svn-id: svn://10.0.0.236/trunk@192997 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/js/src/jsxml.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/mozilla/js/src/jsxml.c b/mozilla/js/src/jsxml.c index d55750d26db..bed6ea5cfae 100644 --- a/mozilla/js/src/jsxml.c +++ b/mozilla/js/src/jsxml.c @@ -2966,6 +2966,7 @@ ToAttributeName(JSContext *cx, jsval v) JSObject *obj; JSClass *clasp; JSXMLQName *qn; + JSTempValueRooter tvr; if (JSVAL_IS_STRING(v)) { name = JSVAL_TO_STRING(v); @@ -3006,7 +3007,16 @@ ToAttributeName(JSContext *cx, jsval v) qn = js_NewXMLQName(cx, uri, prefix, name); if (!qn) return NULL; - if (!js_GetAttributeNameObject(cx, qn)) + + /* + * Temp and local root scope APIs take GC-thing pointers tagged as jsvals + * and blindly untag. Since qn is a GC-thing pointer, we can treat it as + * an object pointer. + */ + JS_PUSH_SINGLE_TEMP_ROOT(cx, OBJECT_TO_JSVAL(qn), &tvr); + obj = js_GetAttributeNameObject(cx, qn); + JS_POP_TEMP_ROOT(cx, &tvr); + if (!obj) return NULL; return qn; } @@ -5546,13 +5556,12 @@ xml_attribute(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { JSXMLQName *qn; - jsval name; qn = ToAttributeName(cx, argv[0]); if (!qn) return JS_FALSE; - name = OBJECT_TO_JSVAL(qn->object); - return GetProperty(cx, obj, name, rval); + argv[0] = OBJECT_TO_JSVAL(qn->object); /* local root */ + return GetProperty(cx, obj, argv[0], rval); } /* XML and XMLList */ @@ -5562,13 +5571,18 @@ xml_attributes(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, { jsval name; JSXMLQName *qn; + JSTempValueRooter tvr; + JSBool ok; name = ATOM_KEY(cx->runtime->atomState.starAtom); qn = ToAttributeName(cx, name); if (!qn) return JS_FALSE; name = OBJECT_TO_JSVAL(qn->object); - return GetProperty(cx, obj, name, rval); + JS_PUSH_SINGLE_TEMP_ROOT(cx, name, &tvr); + ok = GetProperty(cx, obj, name, rval); + JS_POP_TEMP_ROOT(cx, &tvr); + return ok; } static JSXML *