зеркало из https://github.com/mozilla/pjs.git
Родитель
518ac19c4e
Коммит
93be16ebcd
|
@ -27,9 +27,8 @@ VPATH = @srcdir@
|
|||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = xpcom
|
||||
SIMPLE_PROGRAMS = invoke_test
|
||||
|
||||
CPPSRCS = invoke_test.cpp
|
||||
CPPSRCS = stub_test.cpp #invoke_test.cpp
|
||||
SIMPLE_PROGRAMS = $(CPPSRCS:.cpp=$(BIN_SUFFIX))
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
|
|
|
@ -52,19 +52,19 @@ NS_IMETHODIMP bar::ignored(){return 0;}
|
|||
NS_IMETHODIMP bar::callme1(int i, int j)
|
||||
{
|
||||
printf("called bar::callme1 with: %d %d\n", i, j);
|
||||
return 5;
|
||||
return 15;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP bar::callme2(int i, int j)
|
||||
{
|
||||
printf("called bar::callme2 with: %d %d\n", i, j);
|
||||
return 5;
|
||||
return 25;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP bar::callme3(int i, int j)
|
||||
{
|
||||
printf("called bar::callme3 with: %d %d\n", i, j);
|
||||
return 5;
|
||||
return 35;
|
||||
}
|
||||
|
||||
void docall(foo* f, int i, int j){
|
||||
|
@ -78,19 +78,23 @@ static int __stdcall
|
|||
PrepareAndDispatch(baz* self, PRUint32 methodIndex,
|
||||
PRUint32* args, PRUint32* stackBytesToPop)
|
||||
{
|
||||
fprintf(stdout, "PrepareAndDispatch (%p, %d, %p)\n",
|
||||
(void*)self, methodIndex, (void*)args);
|
||||
foo* a = self->other;
|
||||
int p1 = (int) *args;
|
||||
int p2 = (int) *(args+1);
|
||||
int out = 0;
|
||||
switch(methodIndex)
|
||||
{
|
||||
case 1: a->callme1(p1, p2); break;
|
||||
case 2: a->callme2(p1, p2); break;
|
||||
case 3: a->callme3(p1, p2); break;
|
||||
case 1: out = a->callme1(p1, p2); break;
|
||||
case 2: out = a->callme2(p1, p2); break;
|
||||
case 3: out = a->callme3(p1, p2); break;
|
||||
}
|
||||
*stackBytesToPop = 2*4;
|
||||
return 1;
|
||||
return out;
|
||||
}
|
||||
|
||||
#ifndef __GNUC__
|
||||
static __declspec(naked) void SharedStub(void)
|
||||
{
|
||||
__asm {
|
||||
|
@ -121,6 +125,26 @@ static __declspec(naked) void SharedStub(void)
|
|||
__declspec(naked) nsresult __stdcall baz::callme##n() \
|
||||
{ __asm push n __asm jmp SharedStub }
|
||||
|
||||
#else /* __GNUC__ */
|
||||
|
||||
#define STUB_ENTRY(n) \
|
||||
nsresult __stdcall baz::callme##n() \
|
||||
{ \
|
||||
PRUint32 *args, stackBytesToPop; \
|
||||
int result = 0; \
|
||||
baz *obj; \
|
||||
__asm__ __volatile__ ( \
|
||||
"leal 0x0c(%%ebp), %0\n\t" /* args */ \
|
||||
"movl 0x08(%%ebp), %1\n\t" /* this */ \
|
||||
: "=r" (args), \
|
||||
"=r" (obj)); \
|
||||
result = PrepareAndDispatch(obj, n, args,&stackBytesToPop); \
|
||||
fprintf(stdout, "stub returning: %d\n", result); \
|
||||
fprintf(stdout, "bytes to pop: %d\n", stackBytesToPop); \
|
||||
return result; \
|
||||
}
|
||||
|
||||
#endif /* ! __GNUC__ */
|
||||
|
||||
#else
|
||||
/***************************************************************************/
|
||||
|
@ -141,8 +165,6 @@ PrepareAndDispatch(baz* self, PRUint32 methodIndex, PRUint32* args)
|
|||
return 1;
|
||||
}
|
||||
|
||||
//nsresult nsXPCWrappedJS::Stub##n() \
|
||||
|
||||
#define STUB_ENTRY(n) \
|
||||
nsresult baz::callme##n() \
|
||||
{ \
|
||||
|
@ -157,7 +179,7 @@ nsresult baz::callme##n() \
|
|||
"call *%%edx" /* PrepareAndDispatch */ \
|
||||
: "=a" (result) /* %0 */ \
|
||||
: "d" (method) /* %1 */ \
|
||||
: "ax", "dx", "cx", "memory" ); \
|
||||
: "memory" ); \
|
||||
return result; \
|
||||
}
|
||||
|
||||
|
|
|
@ -49,6 +49,12 @@
|
|||
#define ATTRIBUTE_STDCALL
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_NEED_LEADING_UNDERSCORE
|
||||
#define SYMBOL_UNDERSCORE "_"
|
||||
#else
|
||||
#define SYMBOL_UNDERSCORE
|
||||
#endif
|
||||
|
||||
/*
|
||||
What are those keeper functions?
|
||||
|
||||
|
|
|
@ -133,6 +133,9 @@
|
|||
#elif defined(__sun__) || defined(__sun)
|
||||
#define CFRONT_STYLE_THIS_ADJUST
|
||||
|
||||
#elif defined(_WIN32)
|
||||
#define THUNK_BASED_THIS_ADJUST
|
||||
|
||||
#else
|
||||
#error "need a platform define if using unixish x86 code"
|
||||
#endif
|
||||
|
|
|
@ -44,7 +44,10 @@
|
|||
#include "xptc_gcc_x86_unix.h"
|
||||
|
||||
extern "C" {
|
||||
static void ATTRIBUTE_USED ATTRIBUTE_STDCALL
|
||||
#ifndef XP_WIN32
|
||||
static
|
||||
#endif
|
||||
void ATTRIBUTE_USED ATTRIBUTE_STDCALL
|
||||
invoke_copy_to_stack(PRUint32 paramCount, nsXPTCVariant* s, PRUint32* d)
|
||||
{
|
||||
for(PRUint32 i = paramCount; i >0; i--, d++, s++)
|
||||
|
@ -111,9 +114,9 @@ xptc_invoke_copy_to_stack_keeper (void)
|
|||
__asm__ (
|
||||
".text\n\t"
|
||||
".align 16\n\t"
|
||||
".globl XPTC_InvokeByIndex\n\t"
|
||||
".type XPTC_InvokeByIndex,@function\n"
|
||||
"XPTC_InvokeByIndex:\n\t"
|
||||
".globl " SYMBOL_UNDERSCORE "XPTC_InvokeByIndex\n\t"
|
||||
".type " SYMBOL_UNDERSCORE "XPTC_InvokeByIndex,@function\n"
|
||||
SYMBOL_UNDERSCORE "XPTC_InvokeByIndex:\n\t"
|
||||
"pushl %ebp\n\t"
|
||||
"movl %esp, %ebp\n\t"
|
||||
#ifdef MOZ_PRESERVE_PIC
|
||||
|
@ -132,7 +135,7 @@ __asm__ (
|
|||
"pushl %esp\n\t"
|
||||
"pushl 0x14(%ebp)\n\t"
|
||||
"pushl %eax\n\t"
|
||||
"call invoke_copy_to_stack\n\t"
|
||||
"call " SYMBOL_UNDERSCORE "invoke_copy_to_stack\n\t"
|
||||
#ifndef MOZ_USE_STDCALL
|
||||
"addl $0x0c, %esp\n\t" /* done with param stuff */
|
||||
#endif
|
||||
|
@ -164,7 +167,7 @@ __asm__ (
|
|||
"movl %ebp, %esp\n\t"
|
||||
"popl %ebp\n\t"
|
||||
"ret\n"
|
||||
".size XPTC_InvokeByIndex, . - XPTC_InvokeByIndex\n\t"
|
||||
".size " SYMBOL_UNDERSCORE "XPTC_InvokeByIndex, . -" SYMBOL_UNDERSCORE "XPTC_InvokeByIndex\n\t"
|
||||
);
|
||||
|
||||
#else
|
||||
|
|
|
@ -32,7 +32,17 @@ LIBRARY_NAME = xptcmd
|
|||
#
|
||||
# The default is this buildable, but non-functioning code.
|
||||
#
|
||||
CPPSRCS := xptcinvoke.cpp xptcstubs.cpp
|
||||
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
|
||||
|
@ -53,4 +63,4 @@ include $(topsrcdir)/config/rules.mk
|
|||
|
||||
DEFINES += -DEXPORT_XPTC_API -D_IMPL_NS_COM -D_IMPL_NS_BASE
|
||||
|
||||
LOCAL_INCLUDES = -I$(srcdir)/../..
|
||||
LOCAL_INCLUDES += -I$(srcdir)/../..
|
||||
|
|
|
@ -43,6 +43,8 @@
|
|||
#error "This code is for Win32 only"
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
|
||||
static nsresult __stdcall
|
||||
PrepareAndDispatch(nsXPTCStubBase* self, PRUint32 methodIndex,
|
||||
PRUint32* args, PRUint32* stackBytesToPop)
|
||||
|
@ -122,7 +124,13 @@ PrepareAndDispatch(nsXPTCStubBase* self, PRUint32 methodIndex,
|
|||
return result;
|
||||
}
|
||||
|
||||
static __declspec(naked) void SharedStub(void)
|
||||
} // extern "C"
|
||||
|
||||
// declspec(naked) is broken in gcc
|
||||
#ifndef __GNUC__
|
||||
static
|
||||
__declspec(naked)
|
||||
void SharedStub(void)
|
||||
{
|
||||
__asm {
|
||||
push ebp // set up simple stack frame
|
||||
|
@ -151,6 +159,25 @@ static __declspec(naked) void SharedStub(void)
|
|||
__declspec(naked) nsresult __stdcall nsXPTCStubBase::Stub##n() \
|
||||
{ __asm mov ecx, n __asm jmp SharedStub }
|
||||
|
||||
#else
|
||||
|
||||
#define STUB_ENTRY(n) \
|
||||
nsresult __stdcall nsXPTCStubBase::Stub##n() \
|
||||
{ \
|
||||
PRUint32 *args, stackBytesToPop = 0; \
|
||||
nsresult result = 0; \
|
||||
nsXPTCStubBase *obj; \
|
||||
__asm__ __volatile__ ( \
|
||||
"leal 0x0c(%%ebp), %%ecx\n\t" /* args */ \
|
||||
"movl 0x08(%%ebp), %%edx\n\t" /* this */ \
|
||||
: "=c" (args), \
|
||||
"=d" (obj)); \
|
||||
result = PrepareAndDispatch(obj, n, args, &stackBytesToPop); \
|
||||
return result; \
|
||||
}
|
||||
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
#define SENTINEL_ENTRY(n) \
|
||||
nsresult __stdcall nsXPTCStubBase::Sentinel##n() \
|
||||
{ \
|
||||
|
@ -158,11 +185,18 @@ nsresult __stdcall nsXPTCStubBase::Sentinel##n() \
|
|||
return NS_ERROR_NOT_IMPLEMENTED; \
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4035) // OK to have no return value
|
||||
#endif
|
||||
#include "xptcstubsdef.inc"
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(default : 4035) // restore default
|
||||
#endif
|
||||
|
||||
void
|
||||
#ifdef __GNUC__
|
||||
__cdecl
|
||||
#endif
|
||||
xptc_dummy()
|
||||
{
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче