summaryrefslogtreecommitdiffstats
path: root/src/libs/xpcom18a4/xpcom/build/nsOS2VACLegacy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/xpcom18a4/xpcom/build/nsOS2VACLegacy.cpp')
-rw-r--r--src/libs/xpcom18a4/xpcom/build/nsOS2VACLegacy.cpp753
1 files changed, 753 insertions, 0 deletions
diff --git a/src/libs/xpcom18a4/xpcom/build/nsOS2VACLegacy.cpp b/src/libs/xpcom18a4/xpcom/build/nsOS2VACLegacy.cpp
new file mode 100644
index 00000000..c9c04b30
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/nsOS2VACLegacy.cpp
@@ -0,0 +1,753 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * innotek GmbH.
+ * Portions created by the Initial Developer are Copyright (C) 2003
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * innotek GmbH / Knut St. Osmundsen
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*
+ * This module contains wrappers for a handful of XPCOM methods which someone
+ * have been so kind as to link their plugins against. This module will only
+ * provide the minimum of what necessary to make legacy plugins work with
+ * the GCC based mozilla. Luckily this only means the IBM oji JAVA plugins.
+ *
+ * Actually, I haven't seen npoji6 calling any of these yet.
+ */
+
+/*******************************************************************************
+* Defined Constants And Macros *
+*******************************************************************************/
+/** @group Visual Age for C++ v3.6.5 target (OS/2). */
+/* @{ */
+/** Indicate Visual Age for C++ v3.6.5 target */
+#define VFT_VAC365 1
+/** VFTable/Interface Calling Convention for Win32. */
+#define VFTCALL _Optlink
+/** First Entry which VAC uses. */
+#define VFTFIRST_DECL unsigned uFirst[2]
+#define VFTFIRST_VAL() {0, 0},
+/** This deltas which VAC uses. */
+#define VFTDELTA_DECL(n) unsigned uDelta##n
+#define VFTDELTA_VAL() 0,
+/** @} */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "nscore.h"
+#include "nsIServiceManagerUtils.h"
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+#ifndef __cplusplus
+typedef struct nsID
+{
+ PRUint32 m0;
+ PRUint16 m1;
+ PRUint16 m2;
+ PRUint8 m3[8];
+} nsID, nsCID, nsIID;
+#define REFNSIID const nsIID *
+
+typedef PRUint32 nsrefcnt;
+#endif
+
+
+/**
+ * nsISupports vftable.
+ */
+typedef struct vftable_nsISupports
+{
+ VFTFIRST_DECL;
+ nsresult (*VFTCALL QueryInterface)(void *pvThis, REFNSIID aIID, void** aInstancePtr);
+ VFTDELTA_DECL(QueryInterface);
+ nsrefcnt (*VFTCALL AddRef)(void *pvThis);
+ VFTDELTA_DECL(AddRef);
+ nsrefcnt (*VFTCALL Release)(void *pvThis);
+ VFTDELTA_DECL(Release);
+} VFTnsISupports;
+
+/**
+ * nsGetServiceByCID::nsCOMPtr_helper vftable.
+ */
+typedef struct vftable_nsGetServiceByCID_nsCOMPtr_helper
+{
+ VFTFIRST_DECL;
+ /* virtual nsresult operator()( const nsIID&, void** ) const; */
+ nsresult (*VFTCALL __operator_paratheses)(void *pvThis, REFNSIID aIID, void** aInstancePtr);
+ VFTDELTA_DECL(__operator_paratheses);
+ void * (*VFTCALL __destructor)(void *pvThis, unsigned __dtorFlags, unsigned __vtt);
+ VFTDELTA_DECL(__destructor);
+} VFTnsGetServiceByCID_nsCOMPtr_helper;
+
+/**
+ * nsQueryInterface::nsCOMPtr_helper vftable.
+ */
+typedef struct vftable_nsQueryInterface_nsCOMPtr_helper
+{
+ VFTFIRST_DECL;
+ nsresult (*VFTCALL __operator_paratheses)(void *pvThis, REFNSIID aIID, void** aInstancePtr);
+ VFTDELTA_DECL(__operator_paratheses);
+} VFTnsQueryInterface_nsCOMPtr_helper;
+
+
+
+
+/**
+ * nsISupport object.
+ */
+typedef struct obj_nsISupports
+{
+ VFTnsISupports *pVFT;
+} obj_nsISupports;
+
+/**
+ * nsCOMPtr_base object.
+ */
+typedef struct obj_nsCOMPtr_base
+{
+ obj_nsISupports *mRawPtr;
+} obj_nsCOMPtr_base;
+
+/**
+ * nsGetServiceByCID_nsCOMPtr_helper object.
+ */
+typedef struct obj_nsGetServiceByCID_nsCOMPtr_helper
+{
+ VFTnsGetServiceByCID_nsCOMPtr_helper *pVFT; /* ?? */
+ nsID *mCID; /* const nsCID& */
+ void *mServiceManager;/* nsCOMPtr<nsIServiceManager> */
+ nsresult *mErrorPtr;
+} obj_nsGetServiceByCID_nsCOMPtr_helper;
+
+/**
+ * nsQueryInterface_nsCOMPtr_helper object.
+ */
+typedef struct obj_nsQueryInterface_nsCOMPtr_helper
+{
+ VFTnsQueryInterface_nsCOMPtr_helper *pVFT; /* ?? */
+ obj_nsISupports *mRawPtr; /* const nsCID& */
+ nsresult *mErrorPtr;
+} obj_nsQueryInterface_nsCOMPtr_helper;
+
+
+
+
+/**
+ * nsCOMPtr_base::~nsCOMPtr_base()
+ *
+ * @remark This guys doing the oji plugin have been very unfortunate to link in this
+ * without any similar new operator. The object is thus created in the plugin
+ * but freed by xpcom.dll. As the plugin and mozilla have different CRTs this
+ * is a good way of asking for trouble. But, they guys've been lucky, the VAC
+ * CRT might just handle this ok.
+ * However, we cannot perform this delete as we have no VAC CRT around, and
+ * hence we will leak this object.
+ * ----
+ * assembly:
+ public __dt__13nsCOMPtr_baseFv
+__dt__13nsCOMPtr_baseFv proc
+ push ebp
+ mov ebp,esp
+ sub esp,08h
+ mov [ebp+08h],eax; this
+ mov [ebp+0ch],edx; __dtorFlags
+
+; 63 if ( mRawPtr )
+ mov eax,[ebp+08h]; this
+ cmp dword ptr [eax],0h
+ je @BLBL4
+
+; 64 NSCAP_RELEASE(this, mRawPtr);
+ mov ecx,[ebp+08h]; this
+ mov ecx,[ecx]
+ mov ecx,[ecx]
+ mov eax,[ebp+08h]; this
+ mov eax,[eax]
+ add eax,[ecx+01ch]
+ mov ecx,[ebp+08h]; this
+ mov ecx,[ecx]
+ mov ecx,[ecx]
+ call dword ptr [ecx+018h]
+@BLBL4:
+
+; 65 }
+ test byte ptr [ebp+0ch],01h; __dtorFlags
+ je @BLBL6
+ mov eax,[ebp+08h]; this
+ call __dl__FPv
+@BLBL6:
+ mov eax,[ebp+08h]; this
+ add esp,08h
+ pop ebp
+ ret
+__dt__13nsCOMPtr_baseFv endp
+*/
+extern "C" void * VFTCALL __dt__13nsCOMPtr_baseFv(void *pvThis, unsigned __dtorFlags)
+{
+ obj_nsCOMPtr_base *pThis = (obj_nsCOMPtr_base*)pvThis;
+//asm("int $3");
+ if (pThis->mRawPtr)
+ {
+ /* NSCAP_RELEASE(this, mRawPtr); */
+ pThis->mRawPtr->pVFT->Release((char*)pThis->mRawPtr + pThis->mRawPtr->pVFT->uDeltaRelease);
+ }
+
+ /*
+ * Delete the object...
+ * (As memtioned before we'll rather leak this.)
+ */
+ #if 0
+ if (!(__dtorFlags & 1))
+ __dl__FPv(this)
+ #endif
+
+ return pvThis;
+}
+
+/** workaround for _Optlink bug.. */
+extern "C" void * VFTCALL _dt__13nsCOMPtr_baseFv(void *pvThis, unsigned __dtorFlags)
+{
+ return __dt__13nsCOMPtr_baseFv(pvThis, __dtorFlags);
+}
+
+
+
+/**
+ *
+ * -----
+ * assembly:
+; 92 nsGetServiceByCID::operator()( const nsIID& aIID, void** aInstancePtr ) const
+ align 010h
+
+ public __cl__17nsGetServiceByCIDCFRC4nsIDPPv
+__cl__17nsGetServiceByCIDCFRC4nsIDPPv proc
+ push ebp
+ mov ebp,esp
+ sub esp,014h
+ push ebx
+ sub esp,08h
+ mov [ebp+08h],eax; this
+ mov [ebp+0ch],edx; aIID
+ mov [ebp+010h],ecx; aInstancePtr
+
+; 94 nsresult status = NS_ERROR_FAILURE;
+ mov dword ptr [ebp-04h],080004005h; status
+
+; 95 if ( mServiceManager ) {
+ mov eax,[ebp+08h]; this
+ add eax,08h
+ call __opP13nsDerivedSafeXT17nsIServiceManager___8nsCOMPtrXT17nsIServiceManager_CFv
+ test eax,eax
+ je @BLBL13
+
+; 96 status = mServiceManager->GetService(mCID, aIID, (void**)aInstancePtr);
+ mov eax,[ebp+08h]; this
+ add eax,08h
+ call __rf__8nsCOMPtrXT17nsIServiceManager_CFv
+ mov [ebp-08h],eax; __212
+ mov eax,[ebp+010h]; aInstancePtr
+ push eax
+ mov ecx,[ebp+0ch]; aIID
+ mov edx,[ebp+08h]; this
+ mov edx,[edx+04h]
+ mov ebx,[ebp-08h]; __212
+ mov ebx,[ebx]
+ mov eax,[ebp-08h]; __212
+ add eax,[ebx+024h]
+ sub esp,0ch
+ mov ebx,[ebp-08h]; __212
+ mov ebx,[ebx]
+ call dword ptr [ebx+020h]
+ add esp,010h
+ mov [ebp-04h],eax; status
+
+; 97 } else {
+ jmp @BLBL14
+ align 010h
+@BLBL13:
+
+; 95 if ( mServiceManager ) {
+
+; 98 nsCOMPtr<nsIServiceManager> mgr;
+ lea eax,[ebp-0ch]; mgr
+ call __ct__8nsCOMPtrXT17nsIServiceManager_Fv
+
+; 99 NS_GetServiceManager(getter_AddRefs(mgr));
+ lea edx,[ebp-0ch]; mgr
+ lea eax,[ebp-010h]; __216
+ call getter_AddRefs__FR8nsCOMPtrXT17nsIServiceManager_
+ sub esp,04h
+ lea eax,[ebp-010h]; __216
+ sub esp,04h
+ call __opPP17nsIServiceManager__15nsGetterAddRefsXT17nsIServiceManager_Fv
+ add esp,08h
+ call NS_GetServiceManager
+ mov edx,02h
+ lea eax,[ebp-010h]; __216
+ call __dt__15nsGetterAddRefsXT17nsIServiceManager_Fv
+
+; 100 if (mgr)
+ lea eax,[ebp-0ch]; mgr
+ call __opP13nsDerivedSafeXT17nsIServiceManager___8nsCOMPtrXT17nsIServiceManager_CFv
+ test eax,eax
+ je @BLBL15
+
+; 101 status = mgr->GetService(mCID, aIID, (void**)aInstancePtr);
+ lea eax,[ebp-0ch]; mgr
+ call __rf__8nsCOMPtrXT17nsIServiceManager_CFv
+ mov [ebp-014h],eax; __217
+ mov eax,[ebp+010h]; aInstancePtr
+ push eax
+ mov ecx,[ebp+0ch]; aIID
+ mov edx,[ebp+08h]; this
+ mov edx,[edx+04h]
+ mov ebx,[ebp-014h]; __217
+ mov ebx,[ebx]
+ mov eax,[ebp-014h]; __217
+ add eax,[ebx+024h]
+ sub esp,0ch
+ mov ebx,[ebp-014h]; __217
+ mov ebx,[ebx]
+ call dword ptr [ebx+020h]
+ add esp,010h
+ mov [ebp-04h],eax; status
+@BLBL15:
+
+; 102 }
+ mov edx,02h
+ lea eax,[ebp-0ch]; mgr
+ call __dt__8nsCOMPtrXT17nsIServiceManager_Fv
+@BLBL14:
+
+; 103 if ( NS_FAILED(status) )
+ test byte ptr [ebp-01h],080h; status
+ je @BLBL16
+
+; 104 *aInstancePtr = 0;
+ mov eax,[ebp+010h]; aInstancePtr
+ mov dword ptr [eax],0h
+@BLBL16:
+
+; 106 if ( mErrorPtr )
+ mov eax,[ebp+08h]; this
+ cmp dword ptr [eax+0ch],0h
+ je @BLBL17
+
+; 107 *mErrorPtr = status;
+ mov eax,[ebp+08h]; this
+ mov eax,[eax+0ch]
+ mov ebx,[ebp-04h]; status
+ mov [eax],ebx
+@BLBL17:
+
+; 108 return status;
+ mov eax,[ebp-04h]; status
+ add esp,08h
+ pop ebx
+ mov esp,ebp
+ pop ebp
+ ret
+__cl__17nsGetServiceByCIDCFRC4nsIDPPv endp
+
+ * -----
+ * C++ Code:
+nsresult
+nsGetServiceByCID::operator()( const nsIID& aIID, void** aInstancePtr ) const
+{
+ nsresult status = NS_ERROR_FAILURE;
+ if ( mServiceManager ) {
+ status = mServiceManager->GetService(mCID, aIID, (void**)aInstancePtr);
+ } else {
+ nsCOMPtr<nsIServiceManager> mgr;
+ NS_GetServiceManager(getter_AddRefs(mgr));
+ if (mgr)
+ status = mgr->GetService(mCID, aIID, (void**)aInstancePtr);
+ }
+ if ( NS_FAILED(status) )
+ *aInstancePtr = 0;
+
+ if ( mErrorPtr )
+ *mErrorPtr = status;
+ return status;
+}
+ */
+extern "C" nsresult VFTCALL GSBC_COM__operator_paratheses(void *pvThis, REFNSIID aIID, void** aInstancePtr)
+{
+ obj_nsGetServiceByCID_nsCOMPtr_helper *pThis = (obj_nsGetServiceByCID_nsCOMPtr_helper *)pvThis;
+ nsresult status = NS_ERROR_FAILURE;
+//asm("int $3");
+
+ /* For convenience we don't use mServiceManager here because it's a wrapped object.
+ * We ASSUME that there is only one service manager floating around....
+ */
+ nsCOMPtr<nsIServiceManager> mgr;
+ NS_GetServiceManager(getter_AddRefs(mgr));
+ if (mgr)
+ status = mgr->GetService(*pThis->mCID, aIID, (void**)aInstancePtr);
+
+ if (NS_FAILED(status))
+ *aInstancePtr = 0;
+
+ if (pThis->mErrorPtr)
+ *pThis->mErrorPtr = status;
+ return status;
+}
+
+/**
+ * Just a destructor.
+ * -----
+ * assembly:
+; 59 virtual ~nsGetServiceByCID() {};
+ align 010h
+
+__dt__17nsGetServiceByCIDFv proc
+ push ebp
+ mov ebp,esp
+ sub esp,08h
+ mov [ebp+08h],eax; this
+ mov [ebp+0ch],edx; __dtorFlags
+ mov [ebp+010h],ecx; __vtt
+ mov eax,[ebp+08h]; this
+ mov dword ptr [eax],offset FLAT:__vft17nsGetServiceByCID15nsCOMPtr_helper
+ mov edx,02h
+ mov eax,[ebp+08h]; this
+ add eax,08h
+ call __dt__8nsCOMPtrXT17nsIServiceManager_Fv
+ test byte ptr [ebp+0ch],01h; __dtorFlags
+ je @BLBL24
+ mov eax,[ebp+08h]; this
+ call __dl__FPv
+@BLBL24:
+ mov eax,[ebp+08h]; this
+ add esp,08h
+ pop ebp
+ ret
+__dt__17nsGetServiceByCIDFv endp
+ */
+extern "C" void * VFTCALL GSBC_COM__destructor(void *pvThis, unsigned __dtorFlags, unsigned __vtt)
+{
+ obj_nsGetServiceByCID_nsCOMPtr_helper *pThis = (obj_nsGetServiceByCID_nsCOMPtr_helper *)pvThis;
+//asm("int $3");
+
+ /*
+ * Because previously mentioned issues with VAC heaps, we'll
+ * not do anything in here.
+ * (We will then skip destruction of all parents and such, but
+ * I don't think that will hurt anyone.)
+ */
+ __dtorFlags = __dtorFlags;
+ __vtt = __vtt;
+ return pThis;
+}
+
+
+/**
+ * VFT for nsGetServiceByCID::nsCOMPtr_helper or something like that.
+ * It's just implementing an operator() and the destructor.
+ *
+ * @remark We need to skip an underscore to get the name right.
+ * ----
+ * assembly:
+__vft17nsGetServiceByCID15nsCOMPtr_helper dd 0
+ db 0h,0h,0h,0h
+ dd offset FLAT:__cl__17nsGetServiceByCIDCFRC4nsIDPPv
+ db 0h,0h,0h,0h
+ dd offset FLAT:__dt__17nsGetServiceByCIDFv
+ db 0h,0h,0h,0h
+ */
+extern const VFTnsGetServiceByCID_nsCOMPtr_helper _vft17nsGetServiceByCID15nsCOMPtr_helper =
+{
+ VFTFIRST_VAL()
+ GSBC_COM__operator_paratheses, VFTDELTA_VAL()
+ GSBC_COM__destructor, VFTDELTA_VAL()
+};
+
+
+
+/**
+ *
+ * -----
+ * assembly
+; 42 nsQueryInterface::operator()( const nsIID& aIID, void** answer ) const
+ align 010h
+
+ public __cl__16nsQueryInterfaceCFRC4nsIDPPv
+__cl__16nsQueryInterfaceCFRC4nsIDPPv proc
+ push ebp
+ mov ebp,esp
+ sub esp,08h
+ push ebx
+ sub esp,0ch
+ mov [ebp+08h],eax; this
+ mov [ebp+0ch],edx; aIID
+ mov [ebp+010h],ecx; answer
+
+; 45 if ( mRawPtr )
+ mov eax,[ebp+08h]; this
+ cmp dword ptr [eax+04h],0h
+ je @BLBL1
+
+; 46 {
+; 47 status = mRawPtr->QueryInterface(aIID, answer);
+ mov ecx,[ebp+010h]; answer
+ mov edx,[ebp+0ch]; aIID
+ mov ebx,[ebp+08h]; this
+ mov ebx,[ebx+04h]
+ mov ebx,[ebx]
+ mov eax,[ebp+08h]; this
+ mov eax,[eax+04h]
+ add eax,[ebx+0ch]
+ mov ebx,[ebp+08h]; this
+ mov ebx,[ebx+04h]
+ mov ebx,[ebx]
+ call dword ptr [ebx+08h]
+ mov [ebp-04h],eax; status
+
+; 48 #ifdef NSCAP_FEATURE_TEST_NONNULL_QUERY_SUCCEEDS
+; 49 NS_WARN_IF_FALSE(NS_SUCCEEDED(status), "interface not found---were you expecting that?");
+; 50 #endif
+; 51 }
+ jmp @BLBL2
+ align 010h
+@BLBL1:
+
+; 45 if ( mRawPtr )
+
+; 53 status = NS_ERROR_NULL_POINTER;
+ mov dword ptr [ebp-04h],080004003h; status
+@BLBL2:
+
+; 55 if ( mErrorPtr )
+ mov eax,[ebp+08h]; this
+ cmp dword ptr [eax+08h],0h
+ je @BLBL3
+
+; 56 *mErrorPtr = status;
+ mov eax,[ebp+08h]; this
+ mov eax,[eax+08h]
+ mov ebx,[ebp-04h]; status
+ mov [eax],ebx
+@BLBL3:
+
+; 57 return status;
+ mov eax,[ebp-04h]; status
+ add esp,0ch
+ pop ebx
+ mov esp,ebp
+ pop ebp
+ ret
+__cl__16nsQueryInterfaceCFRC4nsIDPPv endp
+
+ * -----
+ * C++ Code:
+nsresult
+nsQueryInterface::operator()( const nsIID& aIID, void** answer ) const
+ {
+ nsresult status;
+ if ( mRawPtr )
+ {
+ status = mRawPtr->QueryInterface(aIID, answer);
+#ifdef NSCAP_FEATURE_TEST_NONNULL_QUERY_SUCCEEDS
+ NS_WARN_IF_FALSE(NS_SUCCEEDED(status), "interface not found---were you expecting that?");
+#endif
+ }
+ else
+ status = NS_ERROR_NULL_POINTER;
+
+ if ( mErrorPtr )
+ *mErrorPtr = status;
+ return status;
+ }
+ */
+extern "C" nsresult VFTCALL QI_COM__operator_paratheses(void *pvThis, REFNSIID aIID, void** aInstancePtr)
+{
+ obj_nsQueryInterface_nsCOMPtr_helper *pThis = (obj_nsQueryInterface_nsCOMPtr_helper *)pvThis;
+ nsresult status = NS_ERROR_NULL_POINTER;
+//asm("int $3");
+
+ if (pThis->mRawPtr)
+ {
+ status = pThis->mRawPtr->pVFT->QueryInterface(pThis->mRawPtr, aIID, aInstancePtr);
+ /* don't care about warnings, do we? */
+ }
+
+ if (pThis->mErrorPtr)
+ *pThis->mErrorPtr = status;
+ return status;
+}
+
+
+
+/**
+ * VFT for nsQueryInterface::nsCOMPtr_helper or something like that.
+ * No destructor, only an operator().
+ *
+ * @remark We need to skip an underscore to get the name right.
+ * -----
+ * assembly:
+__vft16nsQueryInterface15nsCOMPtr_helper dd 0
+ db 0h,0h,0h,0h
+ dd offset FLAT:__cl__16nsQueryInterfaceCFRC4nsIDPPv
+ db 0h,0h,0h,0h
+ */
+extern const VFTnsQueryInterface_nsCOMPtr_helper _vft16nsQueryInterface15nsCOMPtr_helper =
+{
+ VFTFIRST_VAL()
+ QI_COM__operator_paratheses, VFTDELTA_VAL()
+};
+
+/**
+ *
+ * -----
+ * C++ Code:
+void
+assign_assuming_AddRef( nsISupports* newPtr )
+{
+ / *
+ |AddRef()|ing the new value (before entering this function) before
+ |Release()|ing the old lets us safely ignore the self-assignment case.
+ We must, however, be careful only to |Release()| _after_ doing the
+ assignment, in case the |Release()| leads to our _own_ destruction,
+ which would, in turn, cause an incorrect second |Release()| of our old
+ pointer. Thank <waterson@netscape.com> for discovering this.
+ * /
+ nsISupports* oldPtr = mRawPtr;
+ mRawPtr = newPtr;
+ NSCAP_LOG_ASSIGNMENT(this, newPtr);
+ NSCAP_LOG_RELEASE(this, oldPtr);
+ if ( oldPtr )
+ NSCAP_RELEASE(this, oldPtr);
+}
+ */
+extern "C" void VFTCALL assign_assuming_AddRef__13nsCOMPtr_baseFP11nsISupports(void *pvThis, obj_nsISupports *newPtr)
+{
+ obj_nsCOMPtr_base *pThis = (obj_nsCOMPtr_base *)pvThis;
+ obj_nsISupports *oldPtr;
+
+ oldPtr = pThis->mRawPtr;
+ pThis->mRawPtr = newPtr;
+ if (oldPtr)
+ {
+ /* NSCAP_RELEASE(this, oldPtr); */
+ pThis->mRawPtr->pVFT->Release(oldPtr + oldPtr->pVFT->uDeltaRelease);
+ }
+}
+
+
+
+
+/**
+ *
+ * -----
+ * Assembly:
+; 77 nsCOMPtr_base::assign_from_helper( const nsCOMPtr_helper& helper, const nsIID& iid )
+ align 010h
+
+ public assign_from_helper__13nsCOMPtr_baseFRC15nsCOMPtr_helperRC4nsID
+assign_from_helper__13nsCOMPtr_baseFRC15nsCOMPtr_helperRC4nsID proc
+ push ebp
+ mov ebp,esp
+ sub esp,08h
+ push ebx
+ sub esp,0ch
+ mov [ebp+08h],eax; this
+ mov [ebp+0ch],edx; helper
+ mov [ebp+010h],ecx; iid
+
+; 80 if ( NS_FAILED( helper(iid, NS_REINTERPRET_CAST(void**, &newRawPtr)) ) )
+ lea ecx,[ebp-04h]; newRawPtr
+ mov edx,[ebp+010h]; iid
+ mov ebx,[ebp+0ch]; helper
+ mov ebx,[ebx]
+ mov eax,[ebp+0ch]; helper
+ add eax,[ebx+0ch]
+ mov ebx,[ebp+0ch]; helper
+ mov ebx,[ebx]
+ call dword ptr [ebx+08h]
+ test eax,080000000h
+ je @BLBL8
+
+; 81 newRawPtr = 0;
+ mov dword ptr [ebp-04h],0h; newRawPtr
+@BLBL8:
+
+; 82 assign_assuming_AddRef(newRawPtr);
+ mov edx,[ebp-04h]; newRawPtr
+ mov eax,[ebp+08h]; this
+ call assign_assuming_AddRef__13nsCOMPtr_baseFP11nsISupports
+ add esp,0ch
+ pop ebx
+ mov esp,ebp
+ pop ebp
+ ret
+assign_from_helper__13nsCOMPtr_baseFRC15nsCOMPtr_helperRC4nsID endp
+
+ * -----
+ * C Code:
+void
+nsCOMPtr_base::assign_from_helper( const nsCOMPtr_helper& helper, const nsIID& iid )
+ {
+ nsISupports* newRawPtr;
+ if ( NS_FAILED( helper(iid, NS_REINTERPRET_CAST(void**, &newRawPtr)) ) )
+ newRawPtr = 0;
+ assign_assuming_AddRef(newRawPtr);
+ }
+ */
+extern "C" void VFTCALL assign_from_helper__13nsCOMPtr_baseFRC15nsCOMPtr_helperRC4nsID(
+ void *pvThis, void * helper, REFNSIID iid)
+{
+ obj_nsCOMPtr_base *pThis = (obj_nsCOMPtr_base *)pvThis;
+ obj_nsISupports* newRawPtr = NULL;
+ nsresult status = NS_ERROR_FAILURE;
+//asm("int $3");
+
+ /* this may or may not be correct but the layout is the same. */
+ obj_nsQueryInterface_nsCOMPtr_helper * pHelper = (obj_nsQueryInterface_nsCOMPtr_helper*)helper;
+
+ /* if ( NS_FAILED( helper(iid, NS_REINTERPRET_CAST(void**, &newRawPtr)) ) ) */
+ status = pHelper->pVFT->__operator_paratheses((char*)pHelper + pHelper->pVFT->uDelta__operator_paratheses,
+ iid, (void**)&newRawPtr);
+ if (NS_FAILED(status))
+ newRawPtr = 0;
+
+ /* assign_assuming_AddRef(newRawPtr); */
+ assign_assuming_AddRef__13nsCOMPtr_baseFP11nsISupports(pThis, newRawPtr);
+}
+
+
+