bug 580128 - Fix more compartment warnings. Work of multiple people. r=gal/peterv/jst

This commit is contained in:
Blake Kaplan 2010-10-10 15:37:19 -07:00
Родитель 969bd22678
Коммит 644aa16e54
5 изменённых файлов: 24 добавлений и 3 удалений

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

@ -151,7 +151,7 @@ nsXBLProtoImplMethod::InstallMember(nsIScriptContext* aContext,
JSAutoRequest ar(cx); JSAutoRequest ar(cx);
JSAutoEnterCompartment ac; JSAutoEnterCompartment ac;
if (!ac.enter(cx, mJSMethodObject)) { if (!ac.enter(cx, globalObject)) {
return NS_ERROR_UNEXPECTED; return NS_ERROR_UNEXPECTED;
} }
@ -312,6 +312,10 @@ nsXBLProtoImplAnonymousMethod::Execute(nsIContent* aBoundElement)
JSObject* thisObject = JSVAL_TO_OBJECT(v); JSObject* thisObject = JSVAL_TO_OBJECT(v);
JSAutoRequest ar(cx); JSAutoRequest ar(cx);
JSAutoEnterCompartment ac;
if (!ac.enter(cx, thisObject))
return NS_ERROR_UNEXPECTED;
// Clone the function object, using thisObject as the parent so "this" is in // Clone the function object, using thisObject as the parent so "this" is in
// the scope chain of the resulting function (for backwards compat to the // the scope chain of the resulting function (for backwards compat to the

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

@ -176,6 +176,11 @@ nsXBLProtoImplProperty::InstallMember(nsIScriptContext* aContext,
if ((mJSGetterObject || mJSSetterObject) && targetClassObject) { if ((mJSGetterObject || mJSSetterObject) && targetClassObject) {
JSObject * getter = nsnull; JSObject * getter = nsnull;
JSAutoRequest ar(cx); JSAutoRequest ar(cx);
JSAutoEnterCompartment ac;
if (!ac.enter(cx, globalObject))
return NS_ERROR_UNEXPECTED;
if (mJSGetterObject) if (mJSGetterObject)
if (!(getter = ::JS_CloneFunctionObject(cx, mJSGetterObject, globalObject))) if (!(getter = ::JS_CloneFunctionObject(cx, mJSGetterObject, globalObject)))
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;

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

@ -1187,8 +1187,10 @@ bool
JSAutoEnterCompartment::enter(JSContext *cx, JSObject *target) JSAutoEnterCompartment::enter(JSContext *cx, JSObject *target)
{ {
JS_ASSERT(!call); JS_ASSERT(!call);
if (cx->compartment == target->getCompartment()) if (cx->compartment == target->getCompartment()) {
call = reinterpret_cast<JSCrossCompartmentCall*>(1);
return true; return true;
}
call = JS_EnterCrossCompartmentCall(cx, target); call = JS_EnterCrossCompartmentCall(cx, target);
return call != NULL; return call != NULL;
} }

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

@ -979,12 +979,14 @@ class JS_PUBLIC_API(JSAutoEnterCompartment)
bool entered() const { return call != NULL; } bool entered() const { return call != NULL; }
~JSAutoEnterCompartment() { ~JSAutoEnterCompartment() {
if (call) if (call && call != reinterpret_cast<JSCrossCompartmentCall*>(1))
JS_LeaveCrossCompartmentCall(call); JS_LeaveCrossCompartmentCall(call);
} }
void swap(JSAutoEnterCompartment &other) { void swap(JSAutoEnterCompartment &other) {
JSCrossCompartmentCall *tmp = call; JSCrossCompartmentCall *tmp = call;
if (tmp == reinterpret_cast<JSCrossCompartmentCall*>(1))
tmp = NULL;
call = other.call; call = other.call;
other.call = tmp; other.call = tmp;
} }

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

@ -217,6 +217,14 @@ mozJSSubScriptLoader::LoadSubScript (const PRUnichar * aURL
fprintf (stderr, "Final global: %p\n", target_obj); fprintf (stderr, "Final global: %p\n", target_obj);
#endif #endif
} }
else if (target_obj->isWrapper())
{
target_obj = target_obj->unwrap();
}
JSAutoEnterCompartment ac;
if (!ac.enter(cx, target_obj))
return NS_ERROR_UNEXPECTED;
/* load up the url. From here on, failures are reflected as ``custom'' /* load up the url. From here on, failures are reflected as ``custom''
* js exceptions */ * js exceptions */