From 03568c1065b6c86a885c563b30bb71a80f179fbc Mon Sep 17 00:00:00 2001 From: "jband%netscape.com" Date: Wed, 10 Feb 1999 04:17:53 +0000 Subject: [PATCH] NOT YET PART OF SEAMONKEY - prepped the four files for movement to libxpt, centralized/simplified access to services, fixed InterfaceInfoImpl::GetName, removed files I forgot to remove before git-svn-id: svn://10.0.0.236/trunk@20216 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/js/src/xpconnect/nsIInterfaceInfo.h | 30 ++ .../src/xpconnect/nsIInterfaceInfoManager.h | 13 +- mozilla/js/src/xpconnect/nsIXPConnect.h | 38 +-- mozilla/js/src/xpconnect/nsXPConnect.cpp | 32 ++ mozilla/js/src/xpconnect/test/TestXPC.cpp | 1 - mozilla/js/src/xpconnect/xpcbogusii.cpp | 169 ----------- mozilla/js/src/xpconnect/xpcbogusii.h | 280 ------------------ mozilla/js/src/xpconnect/xpcprivate.h | 15 +- mozilla/js/src/xpconnect/xpcwrappedjs.cpp | 21 +- .../js/src/xpconnect/xpcwrappedjsclass.cpp | 19 +- mozilla/js/src/xpconnect/xpcwrappednative.cpp | 21 +- .../src/xpconnect/xpcwrappednativeclass.cpp | 43 ++- mozilla/js/src/xpconnect/xpt_cpp.cpp | 88 +++--- 13 files changed, 177 insertions(+), 593 deletions(-) delete mode 100644 mozilla/js/src/xpconnect/xpcbogusii.cpp delete mode 100644 mozilla/js/src/xpconnect/xpcbogusii.h diff --git a/mozilla/js/src/xpconnect/nsIInterfaceInfo.h b/mozilla/js/src/xpconnect/nsIInterfaceInfo.h index a789261d21c..90f999d4d49 100644 --- a/mozilla/js/src/xpconnect/nsIInterfaceInfo.h +++ b/mozilla/js/src/xpconnect/nsIInterfaceInfo.h @@ -49,4 +49,34 @@ public: NS_IMETHOD GetConstant(uint16 index, const nsXPTConstant** constant) = 0; }; +/***************************************************************************/ +/***************************************************************************/ +// XXX this is here just for testing - pulled from XPConnect... +// it can go away after nsIInterfaceInfos are being built from typelibs + +// {159E36D0-991E-11d2-AC3F-00C09300144B} +#define NS_ITESTXPC_FOO_IID \ +{ 0x159e36d0, 0x991e, 0x11d2, \ + { 0xac, 0x3f, 0x0, 0xc0, 0x93, 0x0, 0x14, 0x4b } } + +class nsITestXPCFoo : public nsISupports +{ +public: + NS_IMETHOD Test(int p1, int p2, int* retval) = 0; + NS_IMETHOD Test2() = 0; +}; + +// {5F9D20C0-9B6B-11d2-9FFE-000064657374} +#define NS_ITESTXPC_FOO2_IID \ +{ 0x5f9d20c0, 0x9b6b, 0x11d2, \ + { 0x9f, 0xfe, 0x0, 0x0, 0x64, 0x65, 0x73, 0x74 } } + +class nsITestXPCFoo2 : public nsITestXPCFoo +{ +public: +}; + +/***************************************************************************/ +/***************************************************************************/ + #endif /* nsIInterfaceInfo_h___ */ diff --git a/mozilla/js/src/xpconnect/nsIInterfaceInfoManager.h b/mozilla/js/src/xpconnect/nsIInterfaceInfoManager.h index 235f96dab22..657d75cadef 100644 --- a/mozilla/js/src/xpconnect/nsIInterfaceInfoManager.h +++ b/mozilla/js/src/xpconnect/nsIInterfaceInfoManager.h @@ -44,8 +44,19 @@ public: }; +/***************************************************************************/ +// XXX XXX Removed this block and switch XPC_PUBLIC_API to XPT_PUBLIC_API +// when this code is moved to libxpt +#include "jsapi.h" +#ifdef EXPORT_XPC_API +#define XPC_PUBLIC_API(t) JS_EXPORT_API(t) +#else +#define XPC_PUBLIC_API(t) JS_IMPORT_API(t) +#endif +/***************************************************************************/ + JS_BEGIN_EXTERN_C -// XXX remove this an use ServiceManager instead +// XXX remove this and use ServiceManager instead XPC_PUBLIC_API(nsIInterfaceInfoManager*) XPT_GetInterfaceInfoManager(); JS_END_EXTERN_C diff --git a/mozilla/js/src/xpconnect/nsIXPConnect.h b/mozilla/js/src/xpconnect/nsIXPConnect.h index 4191218440d..7682074b2fd 100644 --- a/mozilla/js/src/xpconnect/nsIXPConnect.h +++ b/mozilla/js/src/xpconnect/nsIXPConnect.h @@ -23,6 +23,8 @@ #include "nsISupports.h" #include "jsapi.h" +#include "nsIInterfaceInfo.h" +#include "nsIInterfaceInfoManager.h" /* * The linkage of XPC API functions differs depending on whether the file is @@ -41,43 +43,9 @@ #define XPC_FRIEND_API(t) XPC_PUBLIC_API(t) #define XPC_FRIEND_DATA(t) XPC_PUBLIC_DATA(t) -#include "nsIInterfaceInfo.h" -#include "nsIInterfaceInfoManager.h" - - // XXX break these up into separate files... // XXX declare them in XPIDL :) -/***************************************************************************/ -/***************************************************************************/ -// this is here just for testing... - -// {159E36D0-991E-11d2-AC3F-00C09300144B} -#define NS_ITESTXPC_FOO_IID \ -{ 0x159e36d0, 0x991e, 0x11d2, \ - { 0xac, 0x3f, 0x0, 0xc0, 0x93, 0x0, 0x14, 0x4b } } - -class nsITestXPCFoo : public nsISupports -{ -public: - NS_IMETHOD Test(int p1, int p2, int* retval) = 0; - NS_IMETHOD Test2() = 0; -}; - -// {5F9D20C0-9B6B-11d2-9FFE-000064657374} -#define NS_ITESTXPC_FOO2_IID \ -{ 0x5f9d20c0, 0x9b6b, 0x11d2, \ - { 0x9f, 0xfe, 0x0, 0x0, 0x64, 0x65, 0x73, 0x74 } } - -class nsITestXPCFoo2 : public nsITestXPCFoo -{ -public: -}; - -/***************************************************************************/ -/***************************************************************************/ - - /***************************************************************************/ // forward declarations... class nsIXPCScriptable; @@ -165,7 +133,7 @@ public: }; JS_BEGIN_EXTERN_C -// XXX remove this an use ServiceManager instead +// XXX remove this and use ServiceManager instead XPC_PUBLIC_API(nsIXPConnect*) XPC_GetXPConnect(); JS_END_EXTERN_C diff --git a/mozilla/js/src/xpconnect/nsXPConnect.cpp b/mozilla/js/src/xpconnect/nsXPConnect.cpp index e6fab8c3493..18611b4c5a6 100644 --- a/mozilla/js/src/xpconnect/nsXPConnect.cpp +++ b/mozilla/js/src/xpconnect/nsXPConnect.cpp @@ -51,6 +51,38 @@ nsXPConnect::GetXPConnect() return mSelf; } +// static +nsIAllocator* +nsXPConnect::GetAllocator(nsXPConnect* xpc /*= NULL*/) +{ + nsIAllocator* al; + nsXPConnect* xpcl = xpc; + + if(!xpcl && !(xpcl = GetXPConnect())) + return NULL; + if(NULL != (al = xpcl->mAllocator)) + NS_ADDREF(al); + if(!xpc) + NS_RELEASE(xpcl); + return al; +} + +// static +nsIInterfaceInfoManager* +nsXPConnect::GetInterfaceInfoManager(nsXPConnect* xpc /*= NULL*/) +{ + nsIInterfaceInfoManager* iim; + nsXPConnect* xpcl = xpc; + + if(!xpcl && !(xpcl = GetXPConnect())) + return NULL; + if(NULL != (iim = xpcl->mInterfaceInfoManager)) + NS_ADDREF(iim); + if(!xpc) + NS_RELEASE(xpcl); + return iim; +} + nsXPConnect::nsXPConnect() : mContextMap(NULL), mAllocator(NULL), diff --git a/mozilla/js/src/xpconnect/test/TestXPC.cpp b/mozilla/js/src/xpconnect/test/TestXPC.cpp index 9b07d94b3b4..66ad804b1bc 100644 --- a/mozilla/js/src/xpconnect/test/TestXPC.cpp +++ b/mozilla/js/src/xpconnect/test/TestXPC.cpp @@ -177,7 +177,6 @@ MyScriptable::DefaultValue(JSContext *cx, JSObject *obj, return arbitrary->DefaultValue(cx, obj, type, vp, wrapper, NULL, retval); } - /***************************************************************************/ class nsTestXPCFoo : public nsITestXPCFoo2 diff --git a/mozilla/js/src/xpconnect/xpcbogusii.cpp b/mozilla/js/src/xpconnect/xpcbogusii.cpp deleted file mode 100644 index 68b8b0b5522..00000000000 --- a/mozilla/js/src/xpconnect/xpcbogusii.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -/* Temporary Interface Info related stuff. */ - -#include "xpcprivate.h" - -NS_IMPL_ISUPPORTS(nsInterfaceInfo, NS_IINTERFACEINFO_IID) - -nsInterfaceInfo::nsInterfaceInfo(REFNSIID aIID, const char* aName, - nsInterfaceInfo* aParent) - : mIID(aIID), - mName(strdup(aName)), - mParent(aParent) -{ - NS_PRECONDITION(aName, "bad param"); - NS_INIT_REFCNT(); - NS_ADDREF_THIS(); - - mMethodBaseIndex = mParent ? - mParent->mMethodBaseIndex + - mParent->mMethodCount : 0; - - mConstantBaseIndex = mParent ? - mParent->mConstantBaseIndex + - mParent->mConstantCount : 0; - - /////////////////////////////////////////////// - // XXX completely bogus hardcoded stuff... - - mMethodCount = 4; - mMethods = new nsXPCMethodInfo[4]; - - nsXPCParamInfo* params = new nsXPCParamInfo[3]; - params[0] = nsXPCParamInfo(nsXPCParamInfo::IS_IN, nsXPCType::T_I32); - params[1] = nsXPCParamInfo(nsXPCParamInfo::IS_IN, nsXPCType::T_I32); - params[2] = nsXPCParamInfo(nsXPCParamInfo::IS_OUT | nsXPCParamInfo::IS_RETVAL, nsXPCType::T_I32); - nsXPCParamInfo result = nsXPCParamInfo(nsXPCParamInfo::IS_OUT, nsXPCType::T_U32); - - // XXX these are bogus declarations - don't call! - mMethods[0] = nsXPCMethodInfo(0, "QueryInterface", 2, params, result); - mMethods[1] = nsXPCMethodInfo(0, "AddRef", 0, NULL, result); - mMethods[2] = nsXPCMethodInfo(0, "Release", 0, NULL, result); - // this one should be callable (in test/TestXPC.cpp) - mMethods[3] = nsXPCMethodInfo(0, "Test", 3, params, result); - - /////// - - mConstantCount = 2; - mConstants = new nsXPCConstant[2]; - - nsXPCVariant v; - v.type = nsXPCType::T_I32; - v.val.i32 = 5; - mConstants[0] = nsXPCConstant("five", v); - v.val.i32 = 6; - mConstants[1] = nsXPCConstant("six", v); - /////////////////////////////////////////////// - - - if(mParent) - NS_ADDREF(mParent); -} - -nsInterfaceInfo::~nsInterfaceInfo() -{ - if(mName) - free(mName); - if(mParent) - NS_RELEASE(mParent); - if(mMethods) - delete [] mMethods; - if(mConstants) - delete [] mConstants; -} - -NS_IMETHODIMP -nsInterfaceInfo::GetName(const char** name) -{ - NS_PRECONDITION(name, "bad param"); - *name = mName; - return NS_OK; -} - -NS_IMETHODIMP -nsInterfaceInfo::GetIID(const nsIID** iid) -{ - NS_PRECONDITION(iid, "bad param"); - *iid = &mIID; - return NS_OK; -} - -NS_IMETHODIMP -nsInterfaceInfo::GetParent(nsIInterfaceInfo** parent) -{ - NS_PRECONDITION(parent, "bad param"); - *parent = mParent; - return NS_OK; -} - -NS_IMETHODIMP -nsInterfaceInfo::GetMethodCount(int* count) -{ - NS_PRECONDITION(count, "bad param"); - *count = mMethodBaseIndex + mMethodCount; - return NS_OK; -} - -NS_IMETHODIMP -nsInterfaceInfo::GetConstantCount(int* count) -{ - NS_PRECONDITION(count, "bad param"); - *count = mConstantBaseIndex + mConstantCount; - return NS_OK; -} - -NS_IMETHODIMP -nsInterfaceInfo::GetMethodInfo(unsigned index, const nsXPCMethodInfo** info) -{ - NS_PRECONDITION(info, "bad param"); - if(index < mMethodBaseIndex) - return mParent->GetMethodInfo(index, info); - - if(index >= mMethodBaseIndex + mMethodCount) - { - NS_PRECONDITION(0, "bad param"); - *info = NULL; - return NS_ERROR_INVALID_ARG; - } - - // else... - *info = &mMethods[mMethodBaseIndex+index]; - return NS_OK; -} - -NS_IMETHODIMP -nsInterfaceInfo::GetConstant(unsigned index, const nsXPCConstant** constant) -{ - NS_PRECONDITION(constant, "bad param"); - if(index < mConstantBaseIndex) - return mParent->GetConstant(index, constant); - - if(index >= mConstantBaseIndex + mConstantCount) - { - NS_PRECONDITION(0, "bad param"); - *constant = NULL; - return NS_ERROR_INVALID_ARG; - } - - // else... - *constant = &mConstants[mConstantBaseIndex+index]; - return NS_OK; -} - diff --git a/mozilla/js/src/xpconnect/xpcbogusii.h b/mozilla/js/src/xpconnect/xpcbogusii.h deleted file mode 100644 index 4f7cf16a32c..00000000000 --- a/mozilla/js/src/xpconnect/xpcbogusii.h +++ /dev/null @@ -1,280 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * - * The contents of this file are subject to the Netscape Public License - * Version 1.0 (the "NPL"); you may not use this file except in - * compliance with the NPL. You may obtain a copy of the NPL at - * http://www.mozilla.org/NPL/ - * - * Software distributed under the NPL is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL - * for the specific language governing rights and limitations under the - * NPL. - * - * The Initial Developer of this code under the NPL is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All Rights - * Reserved. - */ - -/* Temporary Interface Info related stuff. */ - -#ifndef xpcbogusii_h___ -#define xpcbogusii_h___ - -class nsXPCType -{ -private: - uint8 t; // only member - -public: - nsXPCType() {} - nsXPCType(uint8 type) : t(type) {} - - nsXPCType& operator=(uint8 type) {t = type; return *this;} - operator uint8() const {return t;} - - enum - { - IS_POINTER = 0x80, - IS_UNIQUE_POINTER = 0x40, - IS_REFERENCE = 0x20, - TYPE_MASK = 0x1f, - - T_I8 = 0, - T_I16 = 1, - T_I32 = 2, - T_I64 = 3, - T_U8 = 4, - T_U16 = 5, - T_U32 = 6, - T_U64 = 7, - T_FLOAT = 8, - T_DOUBLE = 9, - T_BOOL = 10, - T_CHAR = 11, - T_WCHAR = 12, - T_VOID = 13, - - T_P_I8 = IS_POINTER | 0, - T_P_I16 = IS_POINTER | 1, - T_P_I32 = IS_POINTER | 2, - T_P_I64 = IS_POINTER | 3, - T_P_U8 = IS_POINTER | 4, - T_P_U16 = IS_POINTER | 5, - T_P_U32 = IS_POINTER | 6, - T_P_U64 = IS_POINTER | 7, - T_P_FLOAT = IS_POINTER | 8, - T_P_DOUBLE = IS_POINTER | 9, - T_P_BOOL = IS_POINTER | 10, - T_P_CHAR = IS_POINTER | 11, - T_P_WCHAR = IS_POINTER | 12, - T_P_VOID = IS_POINTER | 13, - T_P_IID = IS_POINTER | 14, - T_BSTR = IS_POINTER | 15, - T_P_CHAR_STR = IS_POINTER | 16, - T_P_WCHAR_STR = IS_POINTER | 17, - - T_INTERFACE = 18, - T_INTERFACE_IS = 19 - }; -}; - -// this is used only for WrappedJS stub param repackaging -struct nsXPCMiniVariant -{ -// No ctors or dtors so that we can use arrays of these on the stack -// with no penalty. - union - { - int8 i8; - int16 i16; - int32 i32; - int64 i64; - uint8 u8; - uint16 u16; - uint32 u32; - uint64 u64; - float f; - double d; - PRBool b; - char c; - wchar_t wc; - void* p; - } val; -}; - -struct nsXPCVariant -{ -// No ctors or dtors so that we can use arrays of these on the stack -// with no penalty. - union - { - int8 i8; - int16 i16; - int32 i32; - int64 i64; - uint8 u8; - uint16 u16; - uint32 u32; - uint64 u64; - float f; - double d; - PRBool b; - char c; - wchar_t wc; - void* p; - nsID id; - - } val; - void* ptr; - void* ptr2; - nsXPCType type; - uint8 flags; - - enum - { - PTR_IS_DATA = 0x1, // used for OUT params, ptr points to data in val - VAL_IS_OWNED = 0x2 // val.p holds an alloced ptr that must be freed - }; - - JSBool IsPtrData() const {return (JSBool) (flags & PTR_IS_DATA);} - JSBool IsValOwned() const {return (JSBool) (flags & VAL_IS_OWNED);} -}; - - -class nsXPCParamInfo -{ -public: - // XXX simple ctors, we can do better - nsXPCParamInfo() {} - nsXPCParamInfo(uint8 aFlags, const nsXPCType& aType) - : mFlags(aFlags), mType(aType) {} - - enum - { - IS_IN = 0x80, - IS_OUT = 0x40, - IS_RETVAL = 0x20 - }; - - JSBool IsIn() const {return (JSBool) (mFlags & IS_IN);} - JSBool IsOut() const {return (JSBool) (mFlags & IS_OUT);} - JSBool IsRetval() const {return (JSBool) (mFlags & IS_RETVAL);} - const nsXPCType& GetType() const {return mType;} - uint8 GetInterfaceIsArgNumber() const - { - NS_PRECONDITION(mType == nsXPCType::T_INTERFACE_IS,"not an interface_is"); - return mInterfaceIsArgNum; - } - nsIInterfaceInfo* GetInterface() const - { - NS_PRECONDITION(mType == nsXPCType::T_INTERFACE,"not an interface"); - return mInterface; - } - -private: - uint8 mFlags; - nsXPCType mType; - // XXX mostly ignoring this for now... - union - { - uint8 mInterfaceIsArgNum; - nsIInterfaceInfo* mInterface; - }; -}; - -class nsXPCMethodInfo -{ -public: - // XXX simple ctors, we can do better - // XXX the pointer stuff (especially) needs to be fixed - nsXPCMethodInfo() {} - nsXPCMethodInfo(uint8 aFlags, - char* aName, - uint8 aParamCount, - nsXPCParamInfo* aParams, - const nsXPCParamInfo& aResult) - : mFlags(aFlags), mName(aName), - mParamCount(aParamCount), mParams(aParams), mResult(aResult) {} - - enum - { - IS_GETTER = 0x80, - IS_SETTER = 0x40, - IS_VAR_ARGS = 0x20, - IS_CONSTRUCTOR = 0x10, - IS_HIDDEN = 0x08 - }; - - JSBool IsGetter() const {return (JSBool) (mFlags & IS_GETTER);} - JSBool IsSetter() const {return (JSBool) (mFlags & IS_SETTER);} - JSBool IsVarArgs() const {return (JSBool) (mFlags & IS_VAR_ARGS);} - JSBool IsConstructor() const {return (JSBool) (mFlags & IS_CONSTRUCTOR);} - JSBool IsHidden() const {return (JSBool) (mFlags & IS_HIDDEN);} - const char* GetName() const {return mName;} - uint8 GetParamCount() const {return mParamCount;} - const nsXPCParamInfo& GetParam(uint8 index) const - { - NS_PRECONDITION(index < mParamCount,"bad arg"); - return mParams[index]; - } - const nsXPCParamInfo& GetResult() const {return mResult;} -private: - uint8 mFlags; - char* mName; - uint8 mParamCount; - nsXPCParamInfo* mParams; - nsXPCParamInfo mResult; -}; - -class nsXPCConstant -{ -public: - // XXX simple ctors, we can do better - nsXPCConstant() {} - nsXPCConstant(char* aName, const nsXPCVariant& aVal) - : mName(aName), mVal(aVal) {}; - - const char* GetName() const {return mName;} - const nsXPCVariant& GetValue() const {return mVal;} -private: - char* mName; - nsXPCVariant mVal; -}; - -class nsInterfaceInfo : public nsIInterfaceInfo -{ - NS_DECL_ISUPPORTS; - - NS_IMETHOD GetName(const char** name); - NS_IMETHOD GetIID(const nsIID** iid); - - NS_IMETHOD GetParent(nsIInterfaceInfo** parent); - - // these include counts of parents - NS_IMETHOD GetMethodCount(int* count); - NS_IMETHOD GetConstantCount(int* count); - - // these include methods and constants of parents - NS_IMETHOD GetMethodInfo(unsigned index, const nsXPCMethodInfo** info); - NS_IMETHOD GetConstant(unsigned index, const nsXPCConstant** constant); - -public: - nsInterfaceInfo(REFNSIID aIID, const char* aName, nsInterfaceInfo* aParent); - virtual ~nsInterfaceInfo(); - -private: - char* mName; - nsIID mIID; - nsInterfaceInfo* mParent; - - unsigned mMethodBaseIndex; - unsigned mMethodCount; - nsXPCMethodInfo* mMethods; - - unsigned mConstantBaseIndex; - unsigned mConstantCount; - nsXPCConstant* mConstants; -}; - -#endif /* xpcbogusii_h___ */ \ No newline at end of file diff --git a/mozilla/js/src/xpconnect/xpcprivate.h b/mozilla/js/src/xpconnect/xpcprivate.h index cc3f414783b..d0bdb5ec9bd 100644 --- a/mozilla/js/src/xpconnect/xpcprivate.h +++ b/mozilla/js/src/xpconnect/xpcprivate.h @@ -66,23 +66,12 @@ class nsXPConnect : public nsIXPConnect // non-interface implementation public: static nsXPConnect* GetXPConnect(); + static nsIAllocator* GetAllocator(nsXPConnect* xpc = NULL); + static nsIInterfaceInfoManager* GetInterfaceInfoManager(nsXPConnect* xpc = NULL); XPCContext* GetContext(JSContext* cx); JSContext2XPCContextMap* GetContextMap() {return mContextMap;} nsIXPCScriptable* GetArbitraryScriptable() {return mArbitraryScriptable;} - nsIAllocator* GetAllocator() - { - if(mAllocator) - NS_ADDREF(mAllocator); - return mAllocator; - } - - nsIInterfaceInfoManager* GetInterfaceInfoManager() - { - if(mInterfaceInfoManager) - NS_ADDREF(mInterfaceInfoManager); - return mInterfaceInfoManager; - } virtual ~nsXPConnect(); private: diff --git a/mozilla/js/src/xpconnect/xpcwrappedjs.cpp b/mozilla/js/src/xpconnect/xpcwrappedjs.cpp index 7575aaf27cc..6babeecde86 100644 --- a/mozilla/js/src/xpconnect/xpcwrappedjs.cpp +++ b/mozilla/js/src/xpconnect/xpcwrappedjs.cpp @@ -299,16 +299,17 @@ nsXPCWrappedJSMethods::GetIID(nsIID** iid) NS_PRECONDITION(iid, "bad param"); nsIAllocator* al; - void* p; - - al = mWrapper->GetClass()->GetXPCContext()->GetXPConnect()->GetAllocator(); - if(!al || NULL == (p = al->Alloc(sizeof(nsIID)))) + if(NULL != (al = nsXPConnect::GetAllocator())) { - *iid = NULL; - return NS_ERROR_UNEXPECTED; + void* p = al->Alloc(sizeof(nsIID)); + NS_RELEASE(al); + if(p) + { + memcpy(p, &mWrapper->GetIID(), sizeof(nsIID)); + *iid = (nsIID*)p; + return NS_OK; + } } - NS_RELEASE(al); - memcpy(p, &mWrapper->GetIID(), sizeof(nsIID)); - *iid = (nsIID*)p; - return NS_OK; + *iid = NULL; + return NS_ERROR_UNEXPECTED; } diff --git a/mozilla/js/src/xpconnect/xpcwrappedjsclass.cpp b/mozilla/js/src/xpconnect/xpcwrappedjsclass.cpp index c2e30f8fe17..c86592b3f24 100644 --- a/mozilla/js/src/xpconnect/xpcwrappedjsclass.cpp +++ b/mozilla/js/src/xpconnect/xpcwrappedjsclass.cpp @@ -46,21 +46,16 @@ nsXPCWrappedJSClass::GetNewOrUsedClass(XPCContext* xpcc, } else { - nsXPConnect* xpc; - if((xpc = nsXPConnect::GetXPConnect()) != NULL) + nsIInterfaceInfoManager* iimgr; + if(NULL != (iimgr = nsXPConnect::GetInterfaceInfoManager())) { - nsIInterfaceInfoManager* iimgr; - if((iimgr = xpc->GetInterfaceInfoManager()) != NULL) + nsIInterfaceInfo* info; + if(NS_SUCCEEDED(iimgr->GetInfoForIID(&aIID, &info))) { - nsIInterfaceInfo* info; - if(NS_SUCCEEDED(iimgr->GetInfoForIID(&aIID, &info))) - { - clazz = new nsXPCWrappedJSClass(xpcc, aIID, info); - NS_RELEASE(info); - } - NS_RELEASE(iimgr); + clazz = new nsXPCWrappedJSClass(xpcc, aIID, info); + NS_RELEASE(info); } - NS_RELEASE(xpc); + NS_RELEASE(iimgr); } } return clazz; diff --git a/mozilla/js/src/xpconnect/xpcwrappednative.cpp b/mozilla/js/src/xpconnect/xpcwrappednative.cpp index e790f2082d8..ea53bcf8783 100644 --- a/mozilla/js/src/xpconnect/xpcwrappednative.cpp +++ b/mozilla/js/src/xpconnect/xpcwrappednative.cpp @@ -328,16 +328,17 @@ nsXPCWrappedNative::GetIID(nsIID** iid) NS_PRECONDITION(iid, "bad param"); nsIAllocator* al; - void* p; - - al = GetClass()->GetXPCContext()->GetXPConnect()->GetAllocator(); - if(!al || NULL == (p = al->Alloc(sizeof(nsIID)))) + if(NULL != (al = nsXPConnect::GetAllocator())) { - *iid = NULL; - return NS_ERROR_UNEXPECTED; + void* p = al->Alloc(sizeof(nsIID)); + NS_RELEASE(al); + if(p) + { + memcpy(p, &GetIID(), sizeof(nsIID)); + *iid = (nsIID*)p; + return NS_OK; + } } - NS_RELEASE(al); - memcpy(p, &GetIID(), sizeof(nsIID)); - *iid = (nsIID*)p; - return NS_OK; + *iid = NULL; + return NS_ERROR_UNEXPECTED; } diff --git a/mozilla/js/src/xpconnect/xpcwrappednativeclass.cpp b/mozilla/js/src/xpconnect/xpcwrappednativeclass.cpp index b09dbfea1e4..82d397e0546 100644 --- a/mozilla/js/src/xpconnect/xpcwrappednativeclass.cpp +++ b/mozilla/js/src/xpconnect/xpcwrappednativeclass.cpp @@ -46,23 +46,18 @@ nsXPCWrappedNativeClass::GetNewOrUsedClass(XPCContext* xpcc, } else { - nsXPConnect* xpc; - if((xpc = nsXPConnect::GetXPConnect()) != NULL) + nsIInterfaceInfoManager* iimgr; + if(NULL != (iimgr = nsXPConnect::GetInterfaceInfoManager())) { - nsIInterfaceInfoManager* iimgr; - if((iimgr = xpc->GetInterfaceInfoManager()) != NULL) + nsIInterfaceInfo* info; + if(NS_SUCCEEDED(iimgr->GetInfoForIID(&aIID, &info))) { - nsIInterfaceInfo* info; - if(NS_SUCCEEDED(iimgr->GetInfoForIID(&aIID, &info))) - { - clazz = new nsXPCWrappedNativeClass(xpcc, aIID, info); - if(-1 == clazz->mMemberCount) // -1 means 'failed to init' - NS_RELEASE(clazz); // NULLs out 'clazz' - NS_RELEASE(info); - } - NS_RELEASE(iimgr); + clazz = new nsXPCWrappedNativeClass(xpcc, aIID, info); + if(-1 == clazz->mMemberCount) // -1 means 'failed to init' + NS_RELEASE(clazz); // NULLs out 'clazz' + NS_RELEASE(info); } - NS_RELEASE(xpc); + NS_RELEASE(iimgr); } } return clazz; @@ -93,16 +88,11 @@ nsXPCWrappedNativeClass::~nsXPCWrappedNativeClass() DestroyMemberDescriptors(); if(mName) { - nsXPConnect* xpc; - if((xpc = nsXPConnect::GetXPConnect()) != NULL) + nsIAllocator* al; + if(NULL != (al = nsXPConnect::GetAllocator())) { - nsIAllocator* al; - if((al = xpc->GetAllocator()) != NULL) - { - al->Free(mName); - NS_RELEASE(al); - } - NS_RELEASE(xpc); + al->Free(mName); + NS_RELEASE(al); } } NS_RELEASE(mInfo); @@ -144,8 +134,8 @@ nsXPCWrappedNativeClass::BuildMemberDescriptors() if(NS_FAILED(mInfo->GetMethodInfo(i, &info))) return JS_FALSE; - // XX perhaps this should be extended to be 'CanBeReflected()' to - // also cover methods with non-complient signatures. + // XXX perhaps this should be extended to be 'CanBeReflected()' to + // also cover methods with non-compliant signatures. if(info->IsHidden()) continue; @@ -282,7 +272,7 @@ isConstructorID(JSContext *cx, jsid id) { jsval idval; const char *property_name; - + // XXX this could be improved by cacheing the hashed id for "constructor" if (JS_IdToValue(cx, id, &idval) && JSVAL_IS_STRING(idval) && (property_name = JS_GetStringBytes(JSVAL_TO_STRING(idval))) != NULL) { if (!strcmp(property_name, "constructor")) { @@ -386,6 +376,7 @@ nsXPCWrappedNativeClass::CallWrappedMethod(nsXPCWrappedNative* wrapper, nsresult invokeResult; *vp = JSVAL_NULL; + // make sure we have what we need if(isAttributeSet) diff --git a/mozilla/js/src/xpconnect/xpt_cpp.cpp b/mozilla/js/src/xpconnect/xpt_cpp.cpp index 9bfe45eb140..eeaf9beb01a 100644 --- a/mozilla/js/src/xpconnect/xpt_cpp.cpp +++ b/mozilla/js/src/xpconnect/xpt_cpp.cpp @@ -18,7 +18,16 @@ /* InterfaceInfo support code - some temporary. */ -#include "xpcprivate.h" +#include +#include +#include "nscore.h" +#include "nsISupports.h" +#include "nsIInterfaceInfo.h" +#include "nsIInterfaceInfoManager.h" +#include "nsIServiceManager.h" +#include "nsIAllocator.h" +#include "xpt_struct.h" +#include "xpt_cpp.h" // declare this in the .cpp file for now class InterfaceInfoImpl : public nsIInterfaceInfo @@ -44,10 +53,6 @@ public: InterfaceInfoImpl* parent); virtual ~InterfaceInfoImpl(); -private: - PRBool GetAllocator(nsIAllocator** allocator); - void ReleaseAllocator(nsIAllocator** allocator); - private: XPTInterfaceDirectoryEntry* mEntry; InterfaceInfoImpl* mParent; @@ -57,8 +62,6 @@ private: uint16 mConstantCount; }; -/***************************************************************************/ - // declare this in the .cpp file for now class InterfaceInfoManagerImpl : public nsIInterfaceInfoManager { @@ -75,6 +78,9 @@ class InterfaceInfoManagerImpl : public nsIInterfaceInfoManager public: InterfaceInfoManagerImpl(); ~InterfaceInfoManagerImpl(); + + static InterfaceInfoManagerImpl* GetInterfaceInfoManager(); + static nsIAllocator* GetAllocator(InterfaceInfoManagerImpl* iim = NULL); private: PRBool BuildInterfaceForEntry(uint16 index); @@ -84,6 +90,7 @@ private: nsIAllocator* mAllocator; }; +/***************************************************************************/ /***************************************************************************/ /***************************************************************************/ // hacked hardcoded simulation... @@ -94,7 +101,7 @@ XPTParamDescriptor ResultParam[] = { XPTParamDescriptor QueryInterfaceParams[2] = { {XPT_PD_IN, {TD_PNSIID|XPT_TDP_POINTER|XPT_TDP_REFERENCE,0}}, - {XPT_PD_OUT|XPT_PD_RETVAL, {TD_PVOID,0}} + {XPT_PD_OUT|XPT_PD_RETVAL, {TD_INTERFACE_IS_TYPE,0}} }; XPTParamDescriptor TestParams[3] = { @@ -149,12 +156,12 @@ nsXPTParamInfo::GetInterface() const { NS_PRECONDITION(GetType() == nsXPTType::T_INTERFACE,"not an interface"); - // not optimal! - nsIInterfaceInfoManager* mgr = XPT_GetInterfaceInfoManager(); - if(!mgr) + nsIInterfaceInfoManager* mgr; + if(!(mgr = InterfaceInfoManagerImpl::GetInterfaceInfoManager())) return NULL; nsIInterfaceInfo* info; + // not optimal! mgr->GetInfoForIID(&InterfaceDirectoryEntryTable[type.type.interface].iid, &info); NS_RELEASE(mgr); @@ -168,6 +175,13 @@ NS_IMPL_ISUPPORTS(InterfaceInfoManagerImpl, NS_IINTERFACEINFO_MANAGER_IID) XPC_PUBLIC_API(nsIInterfaceInfoManager*) XPT_GetInterfaceInfoManager() +{ + return InterfaceInfoManagerImpl::GetInterfaceInfoManager(); +} + +// static +InterfaceInfoManagerImpl* +InterfaceInfoManagerImpl::GetInterfaceInfoManager() { static InterfaceInfoManagerImpl* impl = NULL; if(!impl) @@ -178,7 +192,24 @@ XPT_GetInterfaceInfoManager() if(impl) NS_ADDREF(impl); return impl; -} +} + +// static +nsIAllocator* +InterfaceInfoManagerImpl::GetAllocator(InterfaceInfoManagerImpl* iim /*= NULL*/) +{ + nsIAllocator* al; + InterfaceInfoManagerImpl* iiml = iim; + + if(!iiml && !(iiml = GetInterfaceInfoManager())) + return NULL; + if(NULL != (al = iiml->mAllocator)) + NS_ADDREF(al); + if(!iim) + NS_RELEASE(iiml); + return al; +} + static NS_DEFINE_IID(kAllocatorCID, NS_ALLOCATOR_CID); static NS_DEFINE_IID(kIAllocatorIID, NS_IALLOCATOR_IID); @@ -332,35 +363,20 @@ InterfaceInfoImpl::~InterfaceInfoImpl() NS_RELEASE(mParent); } -PRBool -InterfaceInfoImpl::GetAllocator(nsIAllocator** allocator) -{ - return NS_SUCCEEDED(nsServiceManager::GetService(kAllocatorCID, - kIAllocatorIID, - (nsISupports **)allocator)); -} -void -InterfaceInfoImpl::ReleaseAllocator(nsIAllocator** allocator) -{ - nsServiceManager::ReleaseService(kAllocatorCID, - (nsISupports *)*allocator, NULL); - *allocator = NULL; -} - NS_IMETHODIMP InterfaceInfoImpl::GetName(char** name) { - nsIAllocator* allocator; - NS_PRECONDITION(name, "bad param"); - if(GetAllocator(&allocator)) + + nsIAllocator* allocator; + if(NULL != (allocator = InterfaceInfoManagerImpl::GetAllocator())) { int len = strlen(mEntry->name)+1; char* p = (char*)allocator->Alloc(len); - ReleaseAllocator(&allocator); + NS_RELEASE(allocator); if(p) { - memcpy(p, &mEntry->name, len); + memcpy(p, mEntry->name, len); *name = p; return NS_OK; } @@ -373,13 +389,13 @@ InterfaceInfoImpl::GetName(char** name) NS_IMETHODIMP InterfaceInfoImpl::GetIID(nsIID** iid) { - nsIAllocator* allocator; - NS_PRECONDITION(iid, "bad param"); - if(GetAllocator(&allocator)) + + nsIAllocator* allocator; + if(NULL != (allocator = InterfaceInfoManagerImpl::GetAllocator())) { nsIID* p = (nsIID*)allocator->Alloc(sizeof(nsIID)); - ReleaseAllocator(&allocator); + NS_RELEASE(allocator); if(p) { memcpy(p, &mEntry->iid, sizeof(nsIID));