void nsXBLProtoImpl::UnlinkJSObjects() { if (mClassObject) { DestroyMembers(); } }
nsresult nsXBLProtoImpl::CompilePrototypeMembers(nsXBLPrototypeBinding* aBinding) { // We want to pre-compile our implementation's members against a "prototype context". Then when we actually // bind the prototype to a real xbl instance, we'll clone the pre-compiled JS into the real instance's // context. nsCOMPtr<nsIScriptGlobalObjectOwner> globalOwner( do_QueryInterface(aBinding->XBLDocumentInfo())); nsIScriptGlobalObject* globalObject = globalOwner->GetScriptGlobalObject(); NS_ENSURE_TRUE(globalObject, NS_ERROR_UNEXPECTED); nsIScriptContext *context = globalObject->GetContext(); NS_ENSURE_TRUE(context, NS_ERROR_OUT_OF_MEMORY); JSContext *cx = (JSContext *)context->GetNativeContext(); JSObject *global = globalObject->GetGlobalJSObject(); void* classObject; nsresult rv = aBinding->InitClass(mClassName, cx, global, global, &classObject); if (NS_FAILED(rv)) return rv; mClassObject = (JSObject*) classObject; if (!mClassObject) return NS_ERROR_FAILURE; // Set version up front so we don't thrash it JSVersion oldVersion = ::JS_SetVersion(cx, JSVERSION_LATEST); // Now that we have a class object installed, we walk our member list and compile each of our // properties and methods in turn. for (nsXBLProtoImplMember* curr = mMembers; curr; curr = curr->GetNext()) { nsresult rv = curr->CompileMember(context, mClassName, mClassObject); if (NS_FAILED(rv)) { DestroyMembers(); ::JS_SetVersion(cx, oldVersion); return rv; } } ::JS_SetVersion(cx, oldVersion); return NS_OK; }