From 0a890b2a9eb67ca014d26e4d1e8eb5bdeac55af6 Mon Sep 17 00:00:00 2001 From: "jst%netscape.com" Date: Thu, 6 Feb 2003 00:38:22 +0000 Subject: [PATCH] Fixing regression bug 191916. Making classes of eTypeExternalConstructor constructable again, we can't use the DOMJSClass_Construct() hook directly from a JS function, it must be used only as a construct hook on instances of the JS class nsDOMClassInfo::sDOMJSClass. r=bugmail@sicking.cc, sr=peterv@netscape.com, a=asa@mozilla.org git-svn-id: svn://10.0.0.236/trunk@137448 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/dom/src/base/nsDOMClassInfo.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/mozilla/dom/src/base/nsDOMClassInfo.cpp b/mozilla/dom/src/base/nsDOMClassInfo.cpp index f9c59fe5589..44ece7c7e35 100644 --- a/mozilla/dom/src/base/nsDOMClassInfo.cpp +++ b/mozilla/dom/src/base/nsDOMClassInfo.cpp @@ -3338,6 +3338,7 @@ DOMJSClass_Construct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, if ((name_struct->mType != nsGlobalNameStruct::eTypeExternalClassInfo || !name_struct->mData->mConstructorCID) && + name_struct->mType != nsGlobalNameStruct::eTypeExternalConstructor && name_struct->mType != nsGlobalNameStruct::eTypeExternalConstructorAlias) { // ignore return value, we return JS_FALSE anyway NS_ERROR("object instantiated without constructor"); @@ -3812,14 +3813,18 @@ nsWindowSH::GlobalResolve(nsISupports *native, JSContext *cx, JSObject *obj, } if (name_struct->mType == nsGlobalNameStruct::eTypeExternalConstructor) { - // If there was a JS_DefineUCFunction() I could use it here, but - // no big deal... - JSFunction *f = ::JS_DefineFunction(cx, obj, ::JS_GetStringBytes(str), - DOMJSClass_Construct, 0, - JSPROP_READONLY); + // If there was a JS_DefineUCObject() we could use it here... + JSObject* class_obj = ::JS_DefineObject(cx, obj, ::JS_GetStringBytes(str), + &sDOMJSClass, 0, 0); + if (!class_obj) { + return NS_ERROR_UNEXPECTED; + } - if (!f) { - return NS_ERROR_OUT_OF_MEMORY; + if (!::JS_SetPrivate(cx, class_obj, + NS_CONST_CAST(void *, + NS_STATIC_CAST(const void *, + class_name)))) { + return NS_ERROR_UNEXPECTED; } *did_resolve = PR_TRUE;