Rooting fixes courtesy dbaron (331678, r=mrbkap).

git-svn-id: svn://10.0.0.236/trunk@192997 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
brendan%mozilla.org
2006-03-25 21:54:18 +00:00
parent fcd7bae029
commit 2a0d15e8b9

View File

@@ -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 *