зеркало из https://github.com/mozilla/gecko-dev.git
bug 225978, Support XPTCALL for Windows XP 64 bits for AMD64 (x86-64), r/sr=shaver
This commit is contained in:
Родитель
31eed473bb
Коммит
e4f7972248
|
@ -1,93 +1,98 @@
|
|||
#
|
||||
# ***** 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 mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 1998
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either of 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 *****
|
||||
|
||||
DEPTH = ../../../../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = xpcom
|
||||
LIBRARY_NAME = xptcmd
|
||||
|
||||
#
|
||||
# The default is this buildable, but non-functioning code.
|
||||
#
|
||||
ifdef GNU_CXX
|
||||
CPPSRCS = \
|
||||
../unix/xptcinvoke_gcc_x86_unix.cpp \
|
||||
xptcstubs.cpp \
|
||||
$(NULL)
|
||||
LOCAL_INCLUDES = -I$(srcdir)/../unix
|
||||
DEFINES += -DMOZ_USE_STDCALL -DMOZ_NEED_LEADING_UNDERSCORE
|
||||
else
|
||||
|
||||
CPPSRCS = xptcinvoke.cpp xptcstubs.cpp
|
||||
|
||||
endif
|
||||
|
||||
|
||||
# Force use of PIC
|
||||
FORCE_USE_PIC = 1
|
||||
|
||||
include $(topsrcdir)/config/config.mk
|
||||
|
||||
ifeq ($(CPU),ALPHA)
|
||||
CPPSRCS := xptcinvoke_alpha.cpp xptcstubs_alpha.cpp
|
||||
ASFILES := xptcinvoke_asm_alpha.s xptcstubs_asm_alpha.s
|
||||
AS := asaxp
|
||||
ASFLAGS += /I../../..public
|
||||
endif
|
||||
|
||||
ifeq ($(OS_ARCH),WINCE)
|
||||
ifeq ($(TARGET_CPU),arm)
|
||||
CPPSRCS = xptcinvokece.cpp xptcstubsce.cpp
|
||||
ASFILES =
|
||||
AS =
|
||||
ASFLAGS += /I../../..public
|
||||
endif
|
||||
endif
|
||||
|
||||
# we don't want the shared lib, but we want to force the creation of a static lib.
|
||||
FORCE_STATIC_LIB = 1
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
DEFINES += -DEXPORT_XPTC_API -D_IMPL_NS_COM -D_IMPL_NS_BASE
|
||||
|
||||
LOCAL_INCLUDES += -I$(srcdir)/../..
|
||||
#
|
||||
# ***** 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 mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 1998
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either of 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 *****
|
||||
|
||||
DEPTH = ../../../../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = xpcom
|
||||
LIBRARY_NAME = xptcmd
|
||||
|
||||
#
|
||||
# The default is this buildable, but non-functioning code.
|
||||
#
|
||||
ifdef GNU_CXX
|
||||
CPPSRCS = \
|
||||
../unix/xptcinvoke_gcc_x86_unix.cpp \
|
||||
xptcstubs.cpp \
|
||||
$(NULL)
|
||||
LOCAL_INCLUDES = -I$(srcdir)/../unix
|
||||
DEFINES += -DMOZ_USE_STDCALL -DMOZ_NEED_LEADING_UNDERSCORE
|
||||
else
|
||||
|
||||
CPPSRCS = xptcinvoke.cpp xptcstubs.cpp
|
||||
|
||||
endif
|
||||
|
||||
|
||||
# Force use of PIC
|
||||
FORCE_USE_PIC = 1
|
||||
|
||||
include $(topsrcdir)/config/config.mk
|
||||
|
||||
ifeq ($(CPU),ALPHA)
|
||||
CPPSRCS := xptcinvoke_alpha.cpp xptcstubs_alpha.cpp
|
||||
ASFILES := xptcinvoke_asm_alpha.s xptcstubs_asm_alpha.s
|
||||
AS := asaxp
|
||||
ASFLAGS += /I../../..public
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_CPU),x86_64)
|
||||
CPPSRCS := xptcinvoke_x86_64.cpp xptcstubs_x86_64.cpp
|
||||
ASFILES := xptcinvoke_asm_x86_64.asm xptcstubs_asm_x86_64.asm
|
||||
endif
|
||||
|
||||
ifeq ($(OS_ARCH),WINCE)
|
||||
ifeq ($(TARGET_CPU),arm)
|
||||
CPPSRCS = xptcinvokece.cpp xptcstubsce.cpp
|
||||
ASFILES =
|
||||
AS =
|
||||
ASFLAGS += /I../../..public
|
||||
endif
|
||||
endif
|
||||
|
||||
# we don't want the shared lib, but we want to force the creation of a static lib.
|
||||
FORCE_STATIC_LIB = 1
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
DEFINES += -DEXPORT_XPTC_API -D_IMPL_NS_COM -D_IMPL_NS_BASE
|
||||
|
||||
LOCAL_INCLUDES += -I$(srcdir)/../..
|
||||
|
|
|
@ -0,0 +1,148 @@
|
|||
; ***** 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 mozilla.org code.
|
||||
;
|
||||
; The Initial Developer of the Original Code is
|
||||
; Makoto Kato <m_kato@ga2.so-net.ne.jp>.
|
||||
; Portions created by the Initial Developer are Copyright (C) 2004
|
||||
; the Initial Developer. All Rights Reserved.
|
||||
;
|
||||
; Contributor(s):
|
||||
;
|
||||
; 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 *****
|
||||
|
||||
extrn invoke_copy_to_stack:PROC
|
||||
|
||||
|
||||
.CODE
|
||||
|
||||
;
|
||||
;XPTC__InvokebyIndex(nsISupports* that, PRUint32 methodIndex,
|
||||
; PRUint32 paramCount, nsXPTCVariant* params)
|
||||
;
|
||||
|
||||
XPTC__InvokebyIndex PROC
|
||||
|
||||
;
|
||||
; store register parameter
|
||||
;
|
||||
|
||||
mov [rsp+32], r9 ; params
|
||||
mov [rsp+24], r8d ; paramCount
|
||||
mov [rsp+16], edx ; methodIndex
|
||||
mov [rsp+8], rcx ; that
|
||||
|
||||
;
|
||||
; store RBX register
|
||||
;
|
||||
|
||||
mov [rsp-8], rbx
|
||||
mov [rsp-16], rbp
|
||||
|
||||
mov rbp, rsp ; store current RSP to RBP
|
||||
sub rsp, 24
|
||||
|
||||
;
|
||||
; maybe we don't have any parameters to copy
|
||||
;
|
||||
|
||||
test r8d, r8d
|
||||
jz noparams
|
||||
|
||||
;
|
||||
; make space for 1st parameter
|
||||
|
||||
mov eax, r8d
|
||||
shl rax, 3 ; *= 8 (max possible param size)
|
||||
sub rsp, rax
|
||||
mov rcx, rsp
|
||||
|
||||
;
|
||||
; 2nd paramter is parameter count
|
||||
;
|
||||
|
||||
mov edx, r8d
|
||||
|
||||
;
|
||||
; 3rd paramter is params
|
||||
;
|
||||
|
||||
mov r8, r9
|
||||
|
||||
sub rsp, 32
|
||||
|
||||
call invoke_copy_to_stack ; rcx = d
|
||||
; edx = paramCount
|
||||
; r8 = s
|
||||
|
||||
add rsp, 32
|
||||
|
||||
mov rdx, [rsp] ; 1st parameter
|
||||
movsd xmm1, qword ptr [rsp] ; for double
|
||||
|
||||
mov r8, [rsp+8] ; 2nd parameter
|
||||
movsd xmm2, qword ptr [rsp+8] ; for double
|
||||
|
||||
mov r9, [rsp+16] ; 3rd parameter
|
||||
movsd xmm3, qword ptr [rsp+16] ; for double
|
||||
|
||||
noparams:
|
||||
|
||||
;
|
||||
; 1st paramter (this)
|
||||
;
|
||||
|
||||
mov rcx, [rbp+8] ; that
|
||||
|
||||
;
|
||||
; calcurate call address
|
||||
;
|
||||
|
||||
mov rbx, [rcx]
|
||||
mov eax, [rbp+16] ; methodIndex
|
||||
|
||||
;
|
||||
; Now current stack has paramter list
|
||||
; But, since callee function backups paramters, make space into stack.
|
||||
|
||||
sub rsp, 8
|
||||
|
||||
call qword ptr [rbx+rax*8] ; stdcall, i.e. callee cleans up stack.
|
||||
|
||||
;
|
||||
; restore registers
|
||||
;
|
||||
|
||||
mov rsp, rbp
|
||||
mov rbx, [rsp-8]
|
||||
mov rbp, [rsp-16]
|
||||
|
||||
ret
|
||||
|
||||
XPTC__InvokebyIndex ENDP
|
||||
|
||||
|
||||
END
|
|
@ -0,0 +1,91 @@
|
|||
/* -*- Mode: C; tab-width: 8; 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 mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Makoto Kato <m_kato@ga2.so-net.ne.jp>.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* 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 ***** */
|
||||
|
||||
/* Platform specific code to invoke XPCOM methods on native objects */
|
||||
|
||||
#include "xptcprivate.h"
|
||||
|
||||
extern "C" void
|
||||
invoke_copy_to_stack(PRUint64* d, PRUint32 paramCount, nsXPTCVariant* s)
|
||||
{
|
||||
for(; paramCount > 0; paramCount--, d++, s++)
|
||||
{
|
||||
if(s->IsPtrData())
|
||||
{
|
||||
*((void**)d) = s->ptr;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* AMD64 platform uses 8 bytes align.
|
||||
*/
|
||||
|
||||
switch(s->type)
|
||||
{
|
||||
case nsXPTType::T_I8 : *((PRInt8*) d) = s->val.i8; break;
|
||||
case nsXPTType::T_I16 : *((PRInt16*) d) = s->val.i16; break;
|
||||
case nsXPTType::T_I32 : *((PRInt32*) d) = s->val.i32; break;
|
||||
case nsXPTType::T_I64 : *((PRInt64*) d) = s->val.i64; break;
|
||||
case nsXPTType::T_U8 : *((PRUint8*) d) = s->val.u8; break;
|
||||
case nsXPTType::T_U16 : *((PRUint16*)d) = s->val.u16; break;
|
||||
case nsXPTType::T_U32 : *((PRUint32*)d) = s->val.u32; break;
|
||||
case nsXPTType::T_U64 : *((PRUint64*)d) = s->val.u64; break;
|
||||
case nsXPTType::T_FLOAT : *((float*) d) = s->val.f; break;
|
||||
case nsXPTType::T_DOUBLE : *((double*) d) = s->val.d; break;
|
||||
case nsXPTType::T_BOOL : *((PRBool*) d) = s->val.b; break;
|
||||
case nsXPTType::T_CHAR : *((char*) d) = s->val.c; break;
|
||||
case nsXPTType::T_WCHAR : *((wchar_t*) d) = s->val.wc; break;
|
||||
default:
|
||||
// all the others are plain pointer types
|
||||
*((void**)d) = s->val.p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" nsresult
|
||||
XPTC__InvokebyIndex(nsISupports* that, PRUint32 methodIndex,
|
||||
PRUint32 paramCount, nsXPTCVariant* params);
|
||||
|
||||
extern "C"
|
||||
XPTC_PUBLIC_API(nsresult)
|
||||
XPTC_InvokeByIndex(nsISupports* that, PRUint32 methodIndex,
|
||||
PRUint32 paramCount, nsXPTCVariant* params)
|
||||
{
|
||||
return XPTC__InvokebyIndex(that, methodIndex, paramCount, params);
|
||||
}
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,229 @@
|
|||
/* -*- Mode: C; tab-width: 8; 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 mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Makoto Kato <m_kato@ga2.so-net.ne.jp>.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* 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 ***** */
|
||||
|
||||
/* Implement shared vtbl methods. */
|
||||
|
||||
#include "xptcprivate.h"
|
||||
|
||||
/*
|
||||
* This is for Windows XP 64-Bit Edition / Server 2003 for AMD64 or later.
|
||||
*/
|
||||
|
||||
extern "C" nsresult
|
||||
PrepareAndDispatch(nsXPTCStubBase* self, PRUint32 methodIndex, PRUint64* args,
|
||||
PRUint64 *gprData, double *fprData)
|
||||
{
|
||||
#define PARAM_BUFFER_COUNT 16
|
||||
//
|
||||
// "this" pointer is first parameter, so parameter count is 3.
|
||||
//
|
||||
#define PARAM_GPR_COUNT 3
|
||||
#define PARAM_FPR_COUNT 3
|
||||
|
||||
nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT];
|
||||
nsXPTCMiniVariant* dispatchParams = NULL;
|
||||
nsIInterfaceInfo* iface_info = NULL;
|
||||
const nsXPTMethodInfo* info;
|
||||
PRUint8 paramCount;
|
||||
PRUint8 i;
|
||||
nsresult result = NS_ERROR_FAILURE;
|
||||
|
||||
NS_ASSERTION(self,"no self");
|
||||
|
||||
self->GetInterfaceInfo(&iface_info);
|
||||
NS_ASSERTION(iface_info,"no interface info");
|
||||
|
||||
iface_info->GetMethodInfo(PRUint16(methodIndex), &info);
|
||||
NS_ASSERTION(info,"no interface info");
|
||||
|
||||
paramCount = info->GetParamCount();
|
||||
|
||||
//
|
||||
// setup variant array pointer
|
||||
//
|
||||
|
||||
if(paramCount > PARAM_BUFFER_COUNT)
|
||||
dispatchParams = new nsXPTCMiniVariant[paramCount];
|
||||
else
|
||||
dispatchParams = paramBuffer;
|
||||
|
||||
NS_ASSERTION(dispatchParams,"no place for params");
|
||||
|
||||
PRUint64* ap = args;
|
||||
PRUint32 iCount = 0;
|
||||
|
||||
for(i = 0; i < paramCount; i++)
|
||||
{
|
||||
const nsXPTParamInfo& param = info->GetParam(i);
|
||||
const nsXPTType& type = param.GetType();
|
||||
nsXPTCMiniVariant* dp = &dispatchParams[i];
|
||||
|
||||
if(param.IsOut() || !type.IsArithmetic())
|
||||
{
|
||||
if (iCount < PARAM_GPR_COUNT)
|
||||
dp->val.p = (void*)gprData[iCount++];
|
||||
else
|
||||
dp->val.p = (void*)*ap++;
|
||||
|
||||
continue;
|
||||
}
|
||||
// else
|
||||
switch(type)
|
||||
{
|
||||
case nsXPTType::T_I8:
|
||||
if (iCount < PARAM_GPR_COUNT)
|
||||
dp->val.i8 = (PRInt8)gprData[iCount++];
|
||||
else
|
||||
dp->val.i8 = *((PRInt8*)ap++);
|
||||
break;
|
||||
|
||||
case nsXPTType::T_I16:
|
||||
if (iCount < PARAM_GPR_COUNT)
|
||||
dp->val.i16 = (PRInt16)gprData[iCount++];
|
||||
else
|
||||
dp->val.i16 = *((PRInt16*)ap++);
|
||||
break;
|
||||
|
||||
case nsXPTType::T_I32:
|
||||
if (iCount < PARAM_GPR_COUNT)
|
||||
dp->val.i32 = (PRInt32)gprData[iCount++];
|
||||
else
|
||||
dp->val.i32 = *((PRInt32*)ap++);
|
||||
break;
|
||||
|
||||
case nsXPTType::T_I64:
|
||||
if (iCount < PARAM_GPR_COUNT)
|
||||
dp->val.i64 = (PRInt64)gprData[iCount++];
|
||||
else
|
||||
dp->val.i64 = *((PRInt64*)ap++);
|
||||
break;
|
||||
|
||||
case nsXPTType::T_U8:
|
||||
if (iCount < PARAM_GPR_COUNT)
|
||||
dp->val.u8 = (PRUint8)gprData[iCount++];
|
||||
else
|
||||
dp->val.u8 = *((PRUint8*)ap++);
|
||||
break;
|
||||
|
||||
case nsXPTType::T_U16:
|
||||
if (iCount < PARAM_GPR_COUNT)
|
||||
dp->val.u16 = (PRUint16)gprData[iCount++];
|
||||
else
|
||||
dp->val.u16 = *((PRUint16*)ap++);
|
||||
break;
|
||||
|
||||
case nsXPTType::T_U32:
|
||||
if (iCount < PARAM_GPR_COUNT)
|
||||
dp->val.u32 = (PRUint32)gprData[iCount++];
|
||||
else
|
||||
dp->val.u32 = *((PRUint32*)ap++);
|
||||
break;
|
||||
|
||||
case nsXPTType::T_U64:
|
||||
if (iCount < PARAM_GPR_COUNT)
|
||||
dp->val.u64 = (PRUint64)gprData[iCount++];
|
||||
else
|
||||
dp->val.u64 = *((PRUint64*)ap++);
|
||||
break;
|
||||
|
||||
case nsXPTType::T_FLOAT:
|
||||
if (iCount < PARAM_FPR_COUNT)
|
||||
dp->val.f = (float)fprData[iCount++];
|
||||
else
|
||||
dp->val.f = *((float*)ap++);
|
||||
break;
|
||||
|
||||
case nsXPTType::T_DOUBLE:
|
||||
if (iCount < PARAM_FPR_COUNT)
|
||||
dp->val.d = (double)fprData[iCount++];
|
||||
else
|
||||
dp->val.d = *((double*)ap++);
|
||||
break;
|
||||
|
||||
case nsXPTType::T_BOOL:
|
||||
if (iCount < PARAM_GPR_COUNT)
|
||||
dp->val.b = (PRBool)gprData[iCount++];
|
||||
else
|
||||
dp->val.b = *((PRBool*)ap++);
|
||||
break;
|
||||
|
||||
case nsXPTType::T_CHAR:
|
||||
if (iCount < PARAM_GPR_COUNT)
|
||||
dp->val.c = (char)gprData[iCount++];
|
||||
else
|
||||
dp->val.c = *((char*)ap++);
|
||||
break;
|
||||
|
||||
case nsXPTType::T_WCHAR:
|
||||
if (iCount < PARAM_GPR_COUNT)
|
||||
dp->val.wc = (wchar_t)gprData[iCount++];
|
||||
else
|
||||
dp->val.wc = *((wchar_t*)ap++);
|
||||
break;
|
||||
|
||||
default:
|
||||
NS_ASSERTION(0, "bad type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
result = self->CallMethod((PRUint16)methodIndex, info, dispatchParams);
|
||||
|
||||
NS_RELEASE(iface_info);
|
||||
|
||||
if(dispatchParams != paramBuffer)
|
||||
delete [] dispatchParams;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#define STUB_ENTRY(n) /* defined in the assembly file */
|
||||
|
||||
#define SENTINEL_ENTRY(n) \
|
||||
nsresult nsXPTCStubBase::Sentinel##n() \
|
||||
{ \
|
||||
NS_ASSERTION(0,"nsXPTCStubBase::Sentinel called"); \
|
||||
return NS_ERROR_NOT_IMPLEMENTED; \
|
||||
}
|
||||
|
||||
#include "xptcstubsdef.inc"
|
||||
|
||||
void
|
||||
xptc_dummy()
|
||||
{
|
||||
}
|
||||
|
Загрузка…
Ссылка в новой задаче