michael@0: /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: /* Invoke tests xptcall. */ michael@0: michael@0: #include michael@0: #include "xptcall.h" michael@0: #include "prinrval.h" michael@0: #include "nsMemory.h" michael@0: michael@0: // Allows us to mark unused functions as known-unused michael@0: #ifdef __GNUC__ michael@0: #define UNUSED __attribute__ ((unused)) michael@0: #else michael@0: #define UNUSED michael@0: #endif michael@0: michael@0: // forward declration michael@0: static void DoMultipleInheritenceTest(); michael@0: static void DoMultipleInheritenceTest2(); michael@0: static void UNUSED DoSpeedTest(); michael@0: michael@0: // {AAC1FB90-E099-11d2-984E-006008962422} michael@0: #define INVOKETESTTARGET_IID \ michael@0: { 0xaac1fb90, 0xe099, 0x11d2, \ michael@0: { 0x98, 0x4e, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } } michael@0: michael@0: michael@0: class InvokeTestTargetInterface : public nsISupports michael@0: { michael@0: public: michael@0: NS_DECLARE_STATIC_IID_ACCESSOR(INVOKETESTTARGET_IID) michael@0: NS_IMETHOD AddTwoInts(int32_t p1, int32_t p2, int32_t* retval) = 0; michael@0: NS_IMETHOD MultTwoInts(int32_t p1, int32_t p2, int32_t* retval) = 0; michael@0: NS_IMETHOD AddTwoLLs(int64_t p1, int64_t p2, int64_t* retval) = 0; michael@0: NS_IMETHOD MultTwoLLs(int64_t p1, int64_t p2, int64_t* retval) = 0; michael@0: michael@0: NS_IMETHOD AddManyInts(int32_t p1, int32_t p2, int32_t p3, int32_t p4, michael@0: int32_t p5, int32_t p6, int32_t p7, int32_t p8, michael@0: int32_t p9, int32_t p10, int32_t* retval) = 0; michael@0: michael@0: NS_IMETHOD AddTwoFloats(float p1, float p2, float* retval) = 0; michael@0: michael@0: NS_IMETHOD AddManyDoubles(double p1, double p2, double p3, double p4, michael@0: double p5, double p6, double p7, double p8, michael@0: double p9, double p10, double* retval) = 0; michael@0: michael@0: NS_IMETHOD AddManyFloats(float p1, float p2, float p3, float p4, michael@0: float p5, float p6, float p7, float p8, michael@0: float p9, float p10, float* retval) = 0; michael@0: michael@0: NS_IMETHOD AddManyManyFloats(float p1, float p2, float p3, float p4, michael@0: float p5, float p6, float p7, float p8, michael@0: float p9, float p10, float p11, float p12, michael@0: float p13, float p14, float p15, float p16, michael@0: float p17, float p18, float p19, float p20, michael@0: float *retval) = 0; michael@0: michael@0: NS_IMETHOD AddMixedInts(int64_t p1, int32_t p2, int64_t p3, int32_t p4, michael@0: int32_t p5, int64_t p6, int32_t p7, int32_t p8, michael@0: int64_t p9, int32_t p10, int64_t* retval) = 0; michael@0: michael@0: NS_IMETHOD AddMixedInts2(int32_t p1, int64_t p2, int32_t p3, int64_t p4, michael@0: int64_t p5, int32_t p6, int64_t p7, int64_t p8, michael@0: int32_t p9, int64_t p10, int64_t* retval) = 0; michael@0: michael@0: NS_IMETHOD AddMixedFloats(float p1, float p2, double p3, double p4, michael@0: float p5, float p6, double p7, double p8, michael@0: float p9, double p10, float p11, michael@0: double *retval) = 0; michael@0: michael@0: NS_IMETHOD PassTwoStrings(const char* s1, const char* s2, char** retval) = 0; michael@0: michael@0: NS_IMETHOD AddMixedInts3(int64_t p1, int64_t p2, int32_t p3, int64_t p4, michael@0: int32_t p5, int32_t p6, int64_t p7, int64_t p8, michael@0: int32_t p9, int64_t p10, int64_t* retval) = 0; michael@0: NS_IMETHOD ShouldFail(int32_t p) = 0; michael@0: }; michael@0: michael@0: NS_DEFINE_STATIC_IID_ACCESSOR(InvokeTestTargetInterface, INVOKETESTTARGET_IID) michael@0: michael@0: class InvokeTestTarget : public InvokeTestTargetInterface michael@0: { michael@0: public: michael@0: NS_DECL_ISUPPORTS michael@0: NS_IMETHOD AddTwoInts(int32_t p1, int32_t p2, int32_t* retval); michael@0: NS_IMETHOD MultTwoInts(int32_t p1, int32_t p2, int32_t* retval); michael@0: NS_IMETHOD AddTwoLLs(int64_t p1, int64_t p2, int64_t* retval); michael@0: NS_IMETHOD MultTwoLLs(int64_t p1, int64_t p2, int64_t* retval); michael@0: michael@0: NS_IMETHOD AddManyInts(int32_t p1, int32_t p2, int32_t p3, int32_t p4, michael@0: int32_t p5, int32_t p6, int32_t p7, int32_t p8, michael@0: int32_t p9, int32_t p10, int32_t* retval); michael@0: michael@0: NS_IMETHOD AddTwoFloats(float p1, float p2, float* retval); michael@0: michael@0: NS_IMETHOD AddManyDoubles(double p1, double p2, double p3, double p4, michael@0: double p5, double p6, double p7, double p8, michael@0: double p9, double p10, double* retval); michael@0: michael@0: NS_IMETHOD AddManyFloats(float p1, float p2, float p3, float p4, michael@0: float p5, float p6, float p7, float p8, michael@0: float p9, float p10, float* retval); michael@0: michael@0: NS_IMETHOD AddMixedInts(int64_t p1, int32_t p2, int64_t p3, int32_t p4, michael@0: int32_t p5, int64_t p6, int32_t p7, int32_t p8, michael@0: int64_t p9, int32_t p10, int64_t* retval); michael@0: michael@0: NS_IMETHOD AddMixedInts2(int32_t p1, int64_t p2, int32_t p3, int64_t p4, michael@0: int64_t p5, int32_t p6, int64_t p7, int64_t p8, michael@0: int32_t p9, int64_t p10, int64_t* retval); michael@0: michael@0: NS_IMETHOD AddMixedFloats(float p1, float p2, double p3, double p4, michael@0: float p5, float p6, double p7, double p8, michael@0: float p9, double p10, float p11, michael@0: double *retval); michael@0: michael@0: NS_IMETHOD AddManyManyFloats(float p1, float p2, float p3, float p4, michael@0: float p5, float p6, float p7, float p8, michael@0: float p9, float p10, float p11, float p12, michael@0: float p13, float p14, float p15, float p16, michael@0: float p17, float p18, float p19, float p20, michael@0: float *retval); michael@0: michael@0: NS_IMETHOD PassTwoStrings(const char* s1, const char* s2, char** retval); michael@0: michael@0: InvokeTestTarget(); michael@0: michael@0: NS_IMETHOD AddMixedInts3(int64_t p1, int64_t p2, int32_t p3, int64_t p4, michael@0: int32_t p5, int32_t p6, int64_t p7, int64_t p8, michael@0: int32_t p9, int64_t p10, int64_t* retval); michael@0: NS_IMETHOD ShouldFail(int32_t p); michael@0: }; michael@0: michael@0: NS_IMPL_ISUPPORTS(InvokeTestTarget, InvokeTestTargetInterface) michael@0: michael@0: InvokeTestTarget::InvokeTestTarget() michael@0: { michael@0: NS_ADDREF_THIS(); michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::ShouldFail(int32_t p) { michael@0: return NS_ERROR_NULL_POINTER; michael@0: } michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::AddTwoInts(int32_t p1, int32_t p2, int32_t* retval) michael@0: { michael@0: *retval = p1 + p2; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::MultTwoInts(int32_t p1, int32_t p2, int32_t* retval) michael@0: { michael@0: *retval = p1 * p2; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::AddTwoLLs(int64_t p1, int64_t p2, int64_t* retval) michael@0: { michael@0: *retval = p1 + p2; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::MultTwoLLs(int64_t p1, int64_t p2, int64_t* retval) michael@0: { michael@0: *retval = p1 * p2; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::AddManyInts(int32_t p1, int32_t p2, int32_t p3, int32_t p4, michael@0: int32_t p5, int32_t p6, int32_t p7, int32_t p8, michael@0: int32_t p9, int32_t p10, int32_t* retval) michael@0: { michael@0: #ifdef DEBUG_TESTINVOKE michael@0: printf("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n", michael@0: p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); michael@0: #endif michael@0: *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::AddTwoFloats(float p1, float p2, float *retval) michael@0: { michael@0: #ifdef DEBUG_TESTINVOKE michael@0: printf("%f, %f\n", p1, p2); michael@0: #endif michael@0: *retval = p1 + p2; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::AddManyDoubles(double p1, double p2, double p3, double p4, michael@0: double p5, double p6, double p7, double p8, michael@0: double p9, double p10, double* retval) michael@0: { michael@0: #ifdef DEBUG_TESTINVOKE michael@0: printf("%lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf\n", michael@0: p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); michael@0: #endif michael@0: *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::AddManyFloats(float p1, float p2, float p3, float p4, michael@0: float p5, float p6, float p7, float p8, michael@0: float p9, float p10, float* retval) michael@0: { michael@0: #ifdef DEBUG_TESTINVOKE michael@0: printf("%f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n", michael@0: p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); michael@0: #endif michael@0: *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::AddMixedFloats(float p1, float p2, double p3, double p4, michael@0: float p5, float p6, double p7, double p8, michael@0: float p9, double p10, float p11, michael@0: double *retval) michael@0: { michael@0: #ifdef DEBUG_TESTINVOKE michael@0: printf("%f, %f, %lf, %lf, %f, %f, %lf, %lf, %f, %lf, %f\n", michael@0: p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); michael@0: #endif michael@0: *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10 + p11; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::AddManyManyFloats(float p1, float p2, float p3, float p4, michael@0: float p5, float p6, float p7, float p8, michael@0: float p9, float p10, float p11, float p12, michael@0: float p13, float p14, float p15, float p16, michael@0: float p17, float p18, float p19, float p20, michael@0: float *retval) michael@0: { michael@0: #ifdef DEBUG_TESTINVOKE michael@0: printf("%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, " michael@0: "%f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n", michael@0: p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, michael@0: p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); michael@0: #endif michael@0: *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10 + michael@0: p11 + p12 + p13 + p14 + p15 + p16 + p17 + p18 + p19 + p20; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::AddMixedInts(int64_t p1, int32_t p2, int64_t p3, int32_t p4, michael@0: int32_t p5, int64_t p6, int32_t p7, int32_t p8, michael@0: int64_t p9, int32_t p10, int64_t* retval) michael@0: { michael@0: *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::AddMixedInts2(int32_t p1, int64_t p2, int32_t p3, int64_t p4, michael@0: int64_t p5, int32_t p6, int64_t p7, int64_t p8, michael@0: int32_t p9, int64_t p10, int64_t* retval) michael@0: { michael@0: *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::AddMixedInts3(int64_t p1, int64_t p2, int32_t p3, int64_t p4, michael@0: int32_t p5, int32_t p6, int64_t p7, int64_t p8, michael@0: int32_t p9, int64_t p10, int64_t* retval) michael@0: { michael@0: printf("P1 : %lld\n", p1); michael@0: printf("P2 : %lld\n", p2); michael@0: printf("P3 : %d\n", p3); michael@0: printf("P4 : %lld\n", p4); michael@0: printf("P5 : %d\n", p5); michael@0: printf("P6 : %d\n", p6); michael@0: printf("P7 : %lld\n", p7); michael@0: printf("P8 : %lld\n", p8); michael@0: printf("P9 : %d\n", p9); michael@0: printf("P10: %lld\n", p10); michael@0: printf("ret: %p\n", static_cast(retval)); michael@0: *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: InvokeTestTarget::PassTwoStrings(const char* s1, const char* s2, char** retval) michael@0: { michael@0: const char milk[] = "milk"; michael@0: char *ret = (char*)nsMemory::Alloc(sizeof(milk)); michael@0: if (!ret) michael@0: return NS_ERROR_OUT_OF_MEMORY; michael@0: strncpy(ret, milk, sizeof(milk)); michael@0: printf("\t%s %s", s1, s2); michael@0: *retval = ret; michael@0: return NS_OK; michael@0: } michael@0: michael@0: int main() michael@0: { michael@0: InvokeTestTarget *test = new InvokeTestTarget(); michael@0: michael@0: /* here we make the global 'check for alloc failure' checker happy */ michael@0: if(!test) michael@0: return 1; michael@0: michael@0: int32_t out, tmp32 = 0; michael@0: int64_t out64; michael@0: nsresult failed_rv; michael@0: printf("calling direct:\n"); michael@0: if(NS_SUCCEEDED(test->AddTwoInts(1,1,&out))) michael@0: printf("\t1 + 1 = %d\n", out); michael@0: else michael@0: printf("\tFAILED"); michael@0: int64_t one = 1, two = 2; michael@0: if(NS_SUCCEEDED(test->AddTwoLLs(one,one,&out64))) michael@0: { michael@0: tmp32 = (int)out64; michael@0: printf("\t1L + 1L = %d\n", tmp32); michael@0: } michael@0: else michael@0: printf("\tFAILED"); michael@0: if(NS_SUCCEEDED(test->MultTwoInts(2,2,&out))) michael@0: printf("\t2 * 2 = %d\n", out); michael@0: else michael@0: printf("\tFAILED"); michael@0: if(NS_SUCCEEDED(test->MultTwoLLs(two,two,&out64))) michael@0: { michael@0: tmp32 = (int)out64; michael@0: printf("\t2L * 2L = %d\n", tmp32); michael@0: } michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: double outD; michael@0: float outF; michael@0: int32_t outI; michael@0: char *outS; michael@0: michael@0: if(NS_SUCCEEDED(test->AddManyInts(1,2,3,4,5,6,7,8,9,10,&outI))) michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", outI); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: if(NS_SUCCEEDED(test->AddTwoFloats(1,2,&outF))) michael@0: printf("\t1 + 2 = %ff\n", (double)outF); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: if(NS_SUCCEEDED(test->AddManyDoubles(1,2,3,4,5,6,7,8,9,10,&outD))) michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %f\n", outD); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: if(NS_SUCCEEDED(test->AddManyFloats(1,2,3,4,5,6,7,8,9,10,&outF))) michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %ff\n", (double)outF); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: if(NS_SUCCEEDED(test->AddManyManyFloats(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,&outF))) michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 +1 15 + 16 + 17 + 18 + 19 + 20 = %ff\n", (double)outF); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: if(NS_SUCCEEDED(test->AddMixedInts(1,2,3,4,5,6,7,8,9,10,&out64))) michael@0: { michael@0: tmp32 = (int)out64; michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", tmp32); michael@0: } michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: if(NS_SUCCEEDED(test->AddMixedInts2(1,2,3,4,5,6,7,8,9,10,&out64))) michael@0: { michael@0: tmp32 = (int)out64; michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", tmp32); michael@0: } michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: if(NS_SUCCEEDED(test->AddMixedInts3(3,5,7,11,13,17,19,23,29,31,&out64))) michael@0: { michael@0: tmp32 = (int)out64; michael@0: printf("\t3 + 5 + 7 + 11 + 13 + 17 + 19 + 23 + 29 + 31 = %d\n", tmp32); michael@0: } michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: if(NS_SUCCEEDED(test->AddMixedFloats(1,2,3,4,5,6,7,8,9,10,11,&outD))) michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 = %f\n", (double)outD); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: if (NS_SUCCEEDED(test->PassTwoStrings("moo","cow",&outS))) { michael@0: printf(" = %s\n", outS); michael@0: nsMemory::Free(outS); michael@0: } else michael@0: printf("\tFAILED"); michael@0: michael@0: failed_rv = test->ShouldFail(5); michael@0: printf("should fail %s, returned %x\n", failed_rv == NS_ERROR_NULL_POINTER ? "failed" :"passed", failed_rv); michael@0: michael@0: printf("calling via invoke:\n"); michael@0: michael@0: nsXPTCVariant var[21]; michael@0: michael@0: var[0].val.i32 = 1; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.i32 = 1; michael@0: var[1].type = nsXPTType::T_I32; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.i32 = 0; michael@0: var[2].type = nsXPTType::T_I32; michael@0: var[2].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[2].ptr = &var[2].val.i32; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 3, 3, var))) michael@0: printf("\t1 + 1 = %d\n", var[2].val.i32); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: var[0].val.i64 = 1; michael@0: var[0].type = nsXPTType::T_I64; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.i64 = 1; michael@0: var[1].type = nsXPTType::T_I64; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.i64 = 0; michael@0: var[2].type = nsXPTType::T_I64; michael@0: var[2].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[2].ptr = &var[2].val.i64; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 5, 3, var))) michael@0: printf("\t1L + 1L = %d\n", (int)var[2].val.i64); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: var[0].val.i32 = 2; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.i32 = 2; michael@0: var[1].type = nsXPTType::T_I32; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.i32 = 0; michael@0: var[2].type = nsXPTType::T_I32; michael@0: var[2].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[2].ptr = &var[2].val.i32; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 4, 3, var))) michael@0: printf("\t2 * 2 = %d\n", var[2].val.i32); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: var[0].val.i64 = 2; michael@0: var[0].type = nsXPTType::T_I64; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.i64 = 2; michael@0: var[1].type = nsXPTType::T_I64; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.i64 = 0; michael@0: var[2].type = nsXPTType::T_I64; michael@0: var[2].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[2].ptr = &var[2].val.i64; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 6, 3, var))) michael@0: printf("\t2L * 2L = %d\n", (int)var[2].val.i64); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: var[0].val.i32 = 1; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.i32 = 2; michael@0: var[1].type = nsXPTType::T_I32; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.i32 = 3; michael@0: var[2].type = nsXPTType::T_I32; michael@0: var[2].flags = 0; michael@0: michael@0: var[3].val.i32 = 4; michael@0: var[3].type = nsXPTType::T_I32; michael@0: var[3].flags = 0; michael@0: michael@0: var[4].val.i32 = 5; michael@0: var[4].type = nsXPTType::T_I32; michael@0: var[4].flags = 0; michael@0: michael@0: var[5].val.i32 = 6; michael@0: var[5].type = nsXPTType::T_I32; michael@0: var[5].flags = 0; michael@0: michael@0: var[6].val.i32 = 7; michael@0: var[6].type = nsXPTType::T_I32; michael@0: var[6].flags = 0; michael@0: michael@0: var[7].val.i32 = 8; michael@0: var[7].type = nsXPTType::T_I32; michael@0: var[7].flags = 0; michael@0: michael@0: var[8].val.i32 = 9; michael@0: var[8].type = nsXPTType::T_I32; michael@0: var[8].flags = 0; michael@0: michael@0: var[9].val.i32 = 10; michael@0: var[9].type = nsXPTType::T_I32; michael@0: var[9].flags = 0; michael@0: michael@0: var[10].val.i32 = 0; michael@0: var[10].type = nsXPTType::T_I32; michael@0: var[10].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[10].ptr = &var[10].val.i32; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 7, 11, var))) michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", michael@0: var[10].val.i32); michael@0: michael@0: var[0].val.f = 1.0f; michael@0: var[0].type = nsXPTType::T_FLOAT; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.f = 2.0f; michael@0: var[1].type = nsXPTType::T_FLOAT; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.f = 0.0f; michael@0: var[2].type = nsXPTType::T_FLOAT; michael@0: var[2].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[2].ptr = &var[2].val.f; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 8, 3, var))) michael@0: printf("\t1 + 2 = %ff\n", michael@0: (double) var[2].val.f); michael@0: michael@0: michael@0: var[0].val.d = 1.0; michael@0: var[0].type = nsXPTType::T_DOUBLE; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.d = 2.0; michael@0: var[1].type = nsXPTType::T_DOUBLE; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.d = 3.0; michael@0: var[2].type = nsXPTType::T_DOUBLE; michael@0: var[2].flags = 0; michael@0: michael@0: var[3].val.d = 4.0; michael@0: var[3].type = nsXPTType::T_DOUBLE; michael@0: var[3].flags = 0; michael@0: michael@0: var[4].val.d = 5.0; michael@0: var[4].type = nsXPTType::T_DOUBLE; michael@0: var[4].flags = 0; michael@0: michael@0: var[5].val.d = 6.0; michael@0: var[5].type = nsXPTType::T_DOUBLE; michael@0: var[5].flags = 0; michael@0: michael@0: var[6].val.d = 7.0; michael@0: var[6].type = nsXPTType::T_DOUBLE; michael@0: var[6].flags = 0; michael@0: michael@0: var[7].val.d = 8.0; michael@0: var[7].type = nsXPTType::T_DOUBLE; michael@0: var[7].flags = 0; michael@0: michael@0: var[8].val.d = 9.0; michael@0: var[8].type = nsXPTType::T_DOUBLE; michael@0: var[8].flags = 0; michael@0: michael@0: var[9].val.d = 10.0; michael@0: var[9].type = nsXPTType::T_DOUBLE; michael@0: var[9].flags = 0; michael@0: michael@0: var[10].val.d = 0.0; michael@0: var[10].type = nsXPTType::T_DOUBLE; michael@0: var[10].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[10].ptr = &var[10].val.d; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 9, 11, var))) michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %f\n", michael@0: var[10].val.d); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: var[0].val.f = 1.0f; michael@0: var[0].type = nsXPTType::T_FLOAT; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.f = 2.0f; michael@0: var[1].type = nsXPTType::T_FLOAT; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.f = 3.0f; michael@0: var[2].type = nsXPTType::T_FLOAT; michael@0: var[2].flags = 0; michael@0: michael@0: var[3].val.f = 4.0f; michael@0: var[3].type = nsXPTType::T_FLOAT; michael@0: var[3].flags = 0; michael@0: michael@0: var[4].val.f = 5.0f; michael@0: var[4].type = nsXPTType::T_FLOAT; michael@0: var[4].flags = 0; michael@0: michael@0: var[5].val.f = 6.0f; michael@0: var[5].type = nsXPTType::T_FLOAT; michael@0: var[5].flags = 0; michael@0: michael@0: var[6].val.f = 7.0f; michael@0: var[6].type = nsXPTType::T_FLOAT; michael@0: var[6].flags = 0; michael@0: michael@0: var[7].val.f = 8.0f; michael@0: var[7].type = nsXPTType::T_FLOAT; michael@0: var[7].flags = 0; michael@0: michael@0: var[8].val.f = 9.0f; michael@0: var[8].type = nsXPTType::T_FLOAT; michael@0: var[8].flags = 0; michael@0: michael@0: var[9].val.f = 10.0f; michael@0: var[9].type = nsXPTType::T_FLOAT; michael@0: var[9].flags = 0; michael@0: michael@0: var[10].val.f = 0.0f; michael@0: var[10].type = nsXPTType::T_FLOAT; michael@0: var[10].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[10].ptr = &var[10].val.f; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 10, 11, var))) michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %ff\n", michael@0: (double) var[10].val.f); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: var[0].val.f = 1.0f; michael@0: var[0].type = nsXPTType::T_FLOAT; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.f = 2.0f; michael@0: var[1].type = nsXPTType::T_FLOAT; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.f = 3.0f; michael@0: var[2].type = nsXPTType::T_FLOAT; michael@0: var[2].flags = 0; michael@0: michael@0: var[3].val.f = 4.0f; michael@0: var[3].type = nsXPTType::T_FLOAT; michael@0: var[3].flags = 0; michael@0: michael@0: var[4].val.f = 5.0f; michael@0: var[4].type = nsXPTType::T_FLOAT; michael@0: var[4].flags = 0; michael@0: michael@0: var[5].val.f = 6.0f; michael@0: var[5].type = nsXPTType::T_FLOAT; michael@0: var[5].flags = 0; michael@0: michael@0: var[6].val.f = 7.0f; michael@0: var[6].type = nsXPTType::T_FLOAT; michael@0: var[6].flags = 0; michael@0: michael@0: var[7].val.f = 8.0f; michael@0: var[7].type = nsXPTType::T_FLOAT; michael@0: var[7].flags = 0; michael@0: michael@0: var[8].val.f = 9.0f; michael@0: var[8].type = nsXPTType::T_FLOAT; michael@0: var[8].flags = 0; michael@0: michael@0: var[9].val.f = 10.0f; michael@0: var[9].type = nsXPTType::T_FLOAT; michael@0: var[9].flags = 0; michael@0: michael@0: var[10].val.f = 11.0f; michael@0: var[10].type = nsXPTType::T_FLOAT; michael@0: var[10].flags = 0; michael@0: michael@0: var[11].val.f = 12.0f; michael@0: var[11].type = nsXPTType::T_FLOAT; michael@0: var[11].flags = 0; michael@0: michael@0: var[12].val.f = 13.0f; michael@0: var[12].type = nsXPTType::T_FLOAT; michael@0: var[12].flags = 0; michael@0: michael@0: var[13].val.f = 14.0f; michael@0: var[13].type = nsXPTType::T_FLOAT; michael@0: var[13].flags = 0; michael@0: michael@0: var[14].val.f = 15.0f; michael@0: var[14].type = nsXPTType::T_FLOAT; michael@0: var[14].flags = 0; michael@0: michael@0: var[15].val.f = 16.0f; michael@0: var[15].type = nsXPTType::T_FLOAT; michael@0: var[15].flags = 0; michael@0: michael@0: var[16].val.f = 17.0f; michael@0: var[16].type = nsXPTType::T_FLOAT; michael@0: var[16].flags = 0; michael@0: michael@0: var[17].val.f = 18.0f; michael@0: var[17].type = nsXPTType::T_FLOAT; michael@0: var[17].flags = 0; michael@0: michael@0: var[18].val.f = 19.0f; michael@0: var[18].type = nsXPTType::T_FLOAT; michael@0: var[18].flags = 0; michael@0: michael@0: var[19].val.f = 20.0f; michael@0: var[19].type = nsXPTType::T_FLOAT; michael@0: var[19].flags = 0; michael@0: michael@0: var[20].val.f = 0.0f; michael@0: var[20].type = nsXPTType::T_FLOAT; michael@0: var[20].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[20].ptr = &var[20].val.f; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 11, 21, var))) michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 = %ff\n", michael@0: (double) var[20].val.f); michael@0: michael@0: var[0].val.i64 = 1; michael@0: var[0].type = nsXPTType::T_I64; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.i32 = 2; michael@0: var[1].type = nsXPTType::T_I32; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.i64 = 3; michael@0: var[2].type = nsXPTType::T_I64; michael@0: var[2].flags = 0; michael@0: michael@0: var[3].val.i32 = 4; michael@0: var[3].type = nsXPTType::T_I32; michael@0: var[3].flags = 0; michael@0: michael@0: var[4].val.i32 = 5; michael@0: var[4].type = nsXPTType::T_I32; michael@0: var[4].flags = 0; michael@0: michael@0: var[5].val.i64 = 6; michael@0: var[5].type = nsXPTType::T_I64; michael@0: var[5].flags = 0; michael@0: michael@0: var[6].val.i32 = 7; michael@0: var[6].type = nsXPTType::T_I32; michael@0: var[6].flags = 0; michael@0: michael@0: var[7].val.i32 = 8; michael@0: var[7].type = nsXPTType::T_I32; michael@0: var[7].flags = 0; michael@0: michael@0: var[8].val.i64 = 9; michael@0: var[8].type = nsXPTType::T_I64; michael@0: var[8].flags = 0; michael@0: michael@0: var[9].val.i32 = 10; michael@0: var[9].type = nsXPTType::T_I32; michael@0: var[9].flags = 0; michael@0: michael@0: var[10].val.i64 = 0; michael@0: var[10].type = nsXPTType::T_I64; michael@0: var[10].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[10].ptr = &var[10].val.i64; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 12, 11, var))) michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", michael@0: (int)var[10].val.i64); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: var[0].val.i32 = 1; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.i64 = 2; michael@0: var[1].type = nsXPTType::T_I64; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.i32 = 3; michael@0: var[2].type = nsXPTType::T_I32; michael@0: var[2].flags = 0; michael@0: michael@0: var[3].val.i64 = 4; michael@0: var[3].type = nsXPTType::T_I64; michael@0: var[3].flags = 0; michael@0: michael@0: var[4].val.i64 = 5; michael@0: var[4].type = nsXPTType::T_I64; michael@0: var[4].flags = 0; michael@0: michael@0: var[5].val.i32 = 6; michael@0: var[5].type = nsXPTType::T_I32; michael@0: var[5].flags = 0; michael@0: michael@0: var[6].val.i64 = 7; michael@0: var[6].type = nsXPTType::T_I64; michael@0: var[6].flags = 0; michael@0: michael@0: var[7].val.i64 = 8; michael@0: var[7].type = nsXPTType::T_I64; michael@0: var[7].flags = 0; michael@0: michael@0: var[8].val.i32 = 9; michael@0: var[8].type = nsXPTType::T_I32; michael@0: var[8].flags = 0; michael@0: michael@0: var[9].val.i64 = 10; michael@0: var[9].type = nsXPTType::T_I64; michael@0: var[9].flags = 0; michael@0: michael@0: var[10].val.i64 = 0; michael@0: var[10].type = nsXPTType::T_I64; michael@0: var[10].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[10].ptr = &var[10].val.i64; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 13, 11, var))) michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", michael@0: (int)var[10].val.i64); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: var[0].val.f = 1.0f; michael@0: var[0].type = nsXPTType::T_FLOAT; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.f = 2.0f; michael@0: var[1].type = nsXPTType::T_FLOAT; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.d = 3.0; michael@0: var[2].type = nsXPTType::T_DOUBLE; michael@0: var[2].flags = 0; michael@0: michael@0: var[3].val.d = 4.0; michael@0: var[3].type = nsXPTType::T_DOUBLE; michael@0: var[3].flags = 0; michael@0: michael@0: var[4].val.f = 5.0f; michael@0: var[4].type = nsXPTType::T_FLOAT; michael@0: var[4].flags = 0; michael@0: michael@0: var[5].val.f = 6.0f; michael@0: var[5].type = nsXPTType::T_FLOAT; michael@0: var[5].flags = 0; michael@0: michael@0: var[6].val.d = 7.0; michael@0: var[6].type = nsXPTType::T_DOUBLE; michael@0: var[6].flags = 0; michael@0: michael@0: var[7].val.d = 8.0; michael@0: var[7].type = nsXPTType::T_DOUBLE; michael@0: var[7].flags = 0; michael@0: michael@0: var[8].val.f = 9.0f; michael@0: var[8].type = nsXPTType::T_FLOAT; michael@0: var[8].flags = 0; michael@0: michael@0: var[9].val.d = 10.0; michael@0: var[9].type = nsXPTType::T_DOUBLE; michael@0: var[9].flags = 0; michael@0: michael@0: var[10].val.f = 11.0f; michael@0: var[10].type = nsXPTType::T_FLOAT; michael@0: var[10].flags = 0; michael@0: michael@0: var[11].val.d = 0.0; michael@0: var[11].type = nsXPTType::T_DOUBLE; michael@0: var[11].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[11].ptr = &var[11].val.d; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 14, 12, var))) michael@0: printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 = %f\n", michael@0: var[11].val.d); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: var[0].val.p = (void*)"moo"; michael@0: var[0].type = nsXPTType::T_CHAR_STR; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.p = (void*)"cow"; michael@0: var[1].type = nsXPTType::T_CHAR_STR; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.p = 0; michael@0: var[2].type = nsXPTType::T_CHAR_STR; michael@0: var[2].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[2].ptr = &var[2].val.p; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 15, 3, var))) michael@0: printf(" = %s\n", static_cast(var[2].val.p)); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: var[0].val.i32 = 5; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: michael@0: failed_rv = NS_InvokeByIndex(test, 17, 1, var); michael@0: printf("should fail %s, returned %x\n", failed_rv == NS_ERROR_NULL_POINTER ? "failed" :"passed", failed_rv); michael@0: michael@0: var[0].val.i64 = 3; michael@0: var[0].type = nsXPTType::T_I64; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.i64 = 5; michael@0: var[1].type = nsXPTType::T_I64; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.i32 = 7; michael@0: var[2].type = nsXPTType::T_I32; michael@0: var[2].flags = 0; michael@0: michael@0: var[3].val.i64 = 11; michael@0: var[3].type = nsXPTType::T_I64; michael@0: var[3].flags = 0; michael@0: michael@0: var[4].val.i32 = 13; michael@0: var[4].type = nsXPTType::T_I32; michael@0: var[4].flags = 0; michael@0: michael@0: var[5].val.i32 = 17; michael@0: var[5].type = nsXPTType::T_I32; michael@0: var[5].flags = 0; michael@0: michael@0: var[6].val.i64 = 19; michael@0: var[6].type = nsXPTType::T_I64; michael@0: var[6].flags = 0; michael@0: michael@0: var[7].val.i64 = 23; michael@0: var[7].type = nsXPTType::T_I64; michael@0: var[7].flags = 0; michael@0: michael@0: var[8].val.i32 = 29; michael@0: var[8].type = nsXPTType::T_I32; michael@0: var[8].flags = 0; michael@0: michael@0: var[9].val.i64 = 31; michael@0: var[9].type = nsXPTType::T_I64; michael@0: var[9].flags = 0; michael@0: michael@0: var[10].val.i64 = 0; michael@0: var[10].type = nsXPTType::T_I64; michael@0: var[10].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[10].ptr = &var[10].val.i64; michael@0: michael@0: if(NS_SUCCEEDED(NS_InvokeByIndex(test, 16, 11, var))) michael@0: printf("\t3 + 5 + 7 + 11 + 13 + 17 + 19 + 23 + 29+ 31 = %d\n", michael@0: (int)var[10].val.i64); michael@0: else michael@0: printf("\tFAILED"); michael@0: michael@0: DoMultipleInheritenceTest(); michael@0: DoMultipleInheritenceTest2(); michael@0: // Disabled by default - takes too much time on slow machines michael@0: //DoSpeedTest(); michael@0: michael@0: return 0; michael@0: } michael@0: michael@0: /***************************************************************************/ michael@0: /***************************************************************************/ michael@0: /***************************************************************************/ michael@0: michael@0: // {491C65A0-3317-11d3-9885-006008962422} michael@0: #define FOO_IID \ michael@0: { 0x491c65a0, 0x3317, 0x11d3, \ michael@0: { 0x98, 0x85, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } } michael@0: michael@0: // {491C65A1-3317-11d3-9885-006008962422} michael@0: #define BAR_IID \ michael@0: { 0x491c65a1, 0x3317, 0x11d3, \ michael@0: { 0x98, 0x85, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } } michael@0: michael@0: /***************************/ michael@0: michael@0: class nsIFoo : public nsISupports michael@0: { michael@0: public: michael@0: NS_DECLARE_STATIC_IID_ACCESSOR(FOO_IID) michael@0: NS_IMETHOD FooMethod1(int32_t i) = 0; michael@0: NS_IMETHOD FooMethod2(int32_t i) = 0; michael@0: }; michael@0: michael@0: NS_DEFINE_STATIC_IID_ACCESSOR(nsIFoo, FOO_IID) michael@0: michael@0: class nsIBar : public nsISupports michael@0: { michael@0: public: michael@0: NS_DECLARE_STATIC_IID_ACCESSOR(BAR_IID) michael@0: NS_IMETHOD BarMethod1(int32_t i) = 0; michael@0: NS_IMETHOD BarMethod2(int32_t i) = 0; michael@0: }; michael@0: michael@0: NS_DEFINE_STATIC_IID_ACCESSOR(nsIBar, BAR_IID) michael@0: michael@0: /***************************/ michael@0: michael@0: class FooImpl : public nsIFoo michael@0: { michael@0: public: michael@0: NS_IMETHOD FooMethod1(int32_t i); michael@0: NS_IMETHOD FooMethod2(int32_t i); michael@0: michael@0: FooImpl(); michael@0: michael@0: protected: michael@0: ~FooImpl() {} michael@0: michael@0: public: michael@0: virtual const char* ImplName() = 0; michael@0: michael@0: int SomeData1; michael@0: int SomeData2; michael@0: const char* Name; michael@0: }; michael@0: michael@0: class BarImpl : public nsIBar michael@0: { michael@0: public: michael@0: NS_IMETHOD BarMethod1(int32_t i); michael@0: NS_IMETHOD BarMethod2(int32_t i); michael@0: michael@0: BarImpl(); michael@0: michael@0: protected: michael@0: ~BarImpl() {} michael@0: michael@0: public: michael@0: virtual const char * ImplName() = 0; michael@0: michael@0: int SomeData1; michael@0: int SomeData2; michael@0: const char* Name; michael@0: }; michael@0: michael@0: /***************************/ michael@0: michael@0: FooImpl::FooImpl() : Name("FooImpl") michael@0: { michael@0: } michael@0: michael@0: NS_IMETHODIMP FooImpl::FooMethod1(int32_t i) michael@0: { michael@0: printf("\tFooImpl::FooMethod1 called with i == %d, %s part of a %s\n", michael@0: i, Name, ImplName()); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP FooImpl::FooMethod2(int32_t i) michael@0: { michael@0: printf("\tFooImpl::FooMethod2 called with i == %d, %s part of a %s\n", michael@0: i, Name, ImplName()); michael@0: return NS_OK; michael@0: } michael@0: michael@0: /***************************/ michael@0: michael@0: BarImpl::BarImpl() : Name("BarImpl") michael@0: { michael@0: } michael@0: michael@0: NS_IMETHODIMP BarImpl::BarMethod1(int32_t i) michael@0: { michael@0: printf("\tBarImpl::BarMethod1 called with i == %d, %s part of a %s\n", michael@0: i, Name, ImplName()); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP BarImpl::BarMethod2(int32_t i) michael@0: { michael@0: printf("\tBarImpl::BarMethod2 called with i == %d, %s part of a %s\n", michael@0: i, Name, ImplName()); michael@0: return NS_OK; michael@0: } michael@0: michael@0: /***************************/ michael@0: michael@0: class FooBarImpl : public FooImpl, public BarImpl michael@0: { michael@0: public: michael@0: NS_DECL_ISUPPORTS michael@0: michael@0: const char* ImplName(); michael@0: michael@0: FooBarImpl(); michael@0: michael@0: private: michael@0: ~FooBarImpl() {} michael@0: michael@0: public: michael@0: const char* MyName; michael@0: }; michael@0: michael@0: FooBarImpl::FooBarImpl() : MyName("FooBarImpl") michael@0: { michael@0: NS_ADDREF_THIS(); michael@0: } michael@0: michael@0: const char* FooBarImpl::ImplName() michael@0: { michael@0: return MyName; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: FooBarImpl::QueryInterface(REFNSIID aIID, void** aInstancePtr) michael@0: { michael@0: if (nullptr == aInstancePtr) { michael@0: return NS_ERROR_NULL_POINTER; michael@0: } michael@0: michael@0: *aInstancePtr = nullptr; michael@0: michael@0: michael@0: if (aIID.Equals(NS_GET_IID(nsIFoo))) { michael@0: *aInstancePtr = (void*) static_cast(this); michael@0: NS_ADDREF_THIS(); michael@0: return NS_OK; michael@0: } michael@0: if (aIID.Equals(NS_GET_IID(nsIBar))) { michael@0: *aInstancePtr = (void*) static_cast(this); michael@0: NS_ADDREF_THIS(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: if (aIID.Equals(NS_GET_IID(nsISupports))) { michael@0: *aInstancePtr = (void*) static_cast michael@0: (static_cast(this)); michael@0: NS_ADDREF_THIS(); michael@0: return NS_OK; michael@0: } michael@0: return NS_NOINTERFACE; michael@0: } michael@0: michael@0: NS_IMPL_ADDREF(FooBarImpl) michael@0: NS_IMPL_RELEASE(FooBarImpl) michael@0: michael@0: michael@0: static void DoMultipleInheritenceTest() michael@0: { michael@0: FooBarImpl* impl = new FooBarImpl(); michael@0: if(!impl) michael@0: return; michael@0: michael@0: nsIFoo* foo; michael@0: nsIBar* bar; michael@0: michael@0: nsXPTCVariant var[1]; michael@0: michael@0: printf("\n"); michael@0: if(NS_SUCCEEDED(impl->QueryInterface(NS_GET_IID(nsIFoo), (void**)&foo)) && michael@0: NS_SUCCEEDED(impl->QueryInterface(NS_GET_IID(nsIBar), (void**)&bar))) michael@0: { michael@0: printf("impl == %p\n", static_cast(impl)); michael@0: printf("foo == %p\n", static_cast(foo)); michael@0: printf("bar == %p\n", static_cast(bar)); michael@0: michael@0: printf("Calling Foo...\n"); michael@0: printf("direct calls:\n"); michael@0: foo->FooMethod1(1); michael@0: foo->FooMethod2(2); michael@0: michael@0: printf("invoke calls:\n"); michael@0: var[0].val.i32 = 1; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: NS_InvokeByIndex(foo, 3, 1, var); michael@0: michael@0: var[0].val.i32 = 2; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: NS_InvokeByIndex(foo, 4, 1, var); michael@0: michael@0: printf("\n"); michael@0: michael@0: printf("Calling Bar...\n"); michael@0: printf("direct calls:\n"); michael@0: bar->BarMethod1(1); michael@0: bar->BarMethod2(2); michael@0: michael@0: printf("invoke calls:\n"); michael@0: var[0].val.i32 = 1; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: NS_InvokeByIndex(bar, 3, 1, var); michael@0: michael@0: var[0].val.i32 = 2; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: NS_InvokeByIndex(bar, 4, 1, var); michael@0: michael@0: printf("\n"); michael@0: michael@0: NS_RELEASE(foo); michael@0: NS_RELEASE(bar); michael@0: } michael@0: NS_RELEASE(impl); michael@0: } michael@0: /***************************************************************************/ michael@0: /***************************************************************************/ michael@0: /***************************************************************************/ michael@0: /* This is a variation on the theme submitted by duncan@be.com (Duncan Wilcox). michael@0: * He was seeing the other test work and this test not work. They should both michael@0: * Work on any given platform michael@0: */ michael@0: michael@0: class nsIFoo2 : public nsISupports michael@0: { michael@0: public: michael@0: NS_IMETHOD FooMethod1(int32_t i) = 0; michael@0: NS_IMETHOD FooMethod2(int32_t i) = 0; michael@0: }; michael@0: michael@0: class nsIBar2 : public nsISupports michael@0: { michael@0: public: michael@0: NS_IMETHOD BarMethod1(int32_t i) = 0; michael@0: NS_IMETHOD BarMethod2(int32_t i) = 0; michael@0: }; michael@0: michael@0: class FooBarImpl2 : public nsIFoo2, public nsIBar2 michael@0: { michael@0: public: michael@0: // Foo interface michael@0: NS_IMETHOD FooMethod1(int32_t i); michael@0: NS_IMETHOD FooMethod2(int32_t i); michael@0: michael@0: // Bar interface michael@0: NS_IMETHOD BarMethod1(int32_t i); michael@0: NS_IMETHOD BarMethod2(int32_t i); michael@0: michael@0: NS_DECL_ISUPPORTS michael@0: michael@0: FooBarImpl2(); michael@0: michael@0: private: michael@0: ~FooBarImpl2() {} michael@0: michael@0: public: michael@0: int32_t value; michael@0: }; michael@0: michael@0: FooBarImpl2::FooBarImpl2() : value(0x12345678) michael@0: { michael@0: NS_ADDREF_THIS(); michael@0: } michael@0: michael@0: NS_IMETHODIMP FooBarImpl2::FooMethod1(int32_t i) michael@0: { michael@0: printf("\tFooBarImpl2::FooMethod1 called with i == %d, local value = %x\n", michael@0: i, value); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP FooBarImpl2::FooMethod2(int32_t i) michael@0: { michael@0: printf("\tFooBarImpl2::FooMethod2 called with i == %d, local value = %x\n", michael@0: i, value); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP FooBarImpl2::BarMethod1(int32_t i) michael@0: { michael@0: printf("\tFooBarImpl2::BarMethod1 called with i == %d, local value = %x\n", michael@0: i, value); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP FooBarImpl2::BarMethod2(int32_t i) michael@0: { michael@0: printf("\tFooBarImpl2::BarMethod2 called with i == %d, local value = %x\n", michael@0: i, value); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: FooBarImpl2::QueryInterface(REFNSIID aIID, void** aInstancePtr) michael@0: { michael@0: if (nullptr == aInstancePtr) { michael@0: return NS_ERROR_NULL_POINTER; michael@0: } michael@0: michael@0: *aInstancePtr = nullptr; michael@0: michael@0: michael@0: if (aIID.Equals(NS_GET_IID(nsIFoo))) { michael@0: *aInstancePtr = (void*) static_cast(this); michael@0: NS_ADDREF_THIS(); michael@0: return NS_OK; michael@0: } michael@0: if (aIID.Equals(NS_GET_IID(nsIBar))) { michael@0: *aInstancePtr = (void*) static_cast(this); michael@0: NS_ADDREF_THIS(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: if (aIID.Equals(NS_GET_IID(nsISupports))) { michael@0: *aInstancePtr = (void*) static_cast michael@0: (static_cast(this)); michael@0: NS_ADDREF_THIS(); michael@0: return NS_OK; michael@0: } michael@0: return NS_NOINTERFACE; michael@0: } michael@0: michael@0: NS_IMPL_ADDREF(FooBarImpl2) michael@0: NS_IMPL_RELEASE(FooBarImpl2) michael@0: michael@0: static void DoMultipleInheritenceTest2() michael@0: { michael@0: FooBarImpl2* impl = new FooBarImpl2(); michael@0: if(!impl) michael@0: return; michael@0: michael@0: nsIFoo2* foo; michael@0: nsIBar2* bar; michael@0: michael@0: nsXPTCVariant var[1]; michael@0: michael@0: printf("\n"); michael@0: if(NS_SUCCEEDED(impl->QueryInterface(NS_GET_IID(nsIFoo), (void**)&foo)) && michael@0: NS_SUCCEEDED(impl->QueryInterface(NS_GET_IID(nsIBar), (void**)&bar))) michael@0: { michael@0: printf("impl == %p\n", static_cast(impl)); michael@0: printf("foo == %p\n", static_cast(foo)); michael@0: printf("bar == %p\n", static_cast(bar)); michael@0: michael@0: printf("Calling Foo...\n"); michael@0: printf("direct calls:\n"); michael@0: foo->FooMethod1(1); michael@0: foo->FooMethod2(2); michael@0: michael@0: printf("invoke calls:\n"); michael@0: var[0].val.i32 = 1; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: NS_InvokeByIndex(foo, 3, 1, var); michael@0: michael@0: var[0].val.i32 = 2; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: NS_InvokeByIndex(foo, 4, 1, var); michael@0: michael@0: printf("\n"); michael@0: michael@0: printf("Calling Bar...\n"); michael@0: printf("direct calls:\n"); michael@0: bar->BarMethod1(1); michael@0: bar->BarMethod2(2); michael@0: michael@0: printf("invoke calls:\n"); michael@0: var[0].val.i32 = 1; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: NS_InvokeByIndex(bar, 3, 1, var); michael@0: michael@0: var[0].val.i32 = 2; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: NS_InvokeByIndex(bar, 4, 1, var); michael@0: michael@0: printf("\n"); michael@0: michael@0: NS_RELEASE(foo); michael@0: NS_RELEASE(bar); michael@0: } michael@0: NS_RELEASE(impl); michael@0: } michael@0: michael@0: static void DoSpeedTest() michael@0: { michael@0: InvokeTestTarget *test = new InvokeTestTarget(); michael@0: michael@0: nsXPTCVariant var[3]; michael@0: michael@0: var[0].val.i32 = 1; michael@0: var[0].type = nsXPTType::T_I32; michael@0: var[0].flags = 0; michael@0: michael@0: var[1].val.i32 = 1; michael@0: var[1].type = nsXPTType::T_I32; michael@0: var[1].flags = 0; michael@0: michael@0: var[2].val.i32 = 0; michael@0: var[2].type = nsXPTType::T_I32; michael@0: var[2].flags = nsXPTCVariant::PTR_IS_DATA; michael@0: var[2].ptr = &var[2].val.i32; michael@0: michael@0: int32_t in1 = 1; michael@0: int32_t in2 = 1; michael@0: int32_t out; michael@0: michael@0: // Crank this number down if your platform is slow :) michael@0: static const int count = 100000000; michael@0: int i; michael@0: PRIntervalTime start; michael@0: PRIntervalTime interval_direct; michael@0: PRIntervalTime interval_invoke; michael@0: michael@0: printf("Speed test...\n\n"); michael@0: printf("Doing %d direct call iterations...\n", count); michael@0: start = PR_IntervalNow(); michael@0: for(i = count; i; i--) michael@0: (void)test->AddTwoInts(in1, in2, &out); michael@0: interval_direct = PR_IntervalNow() - start; michael@0: michael@0: printf("Doing %d invoked call iterations...\n", count); michael@0: start = PR_IntervalNow(); michael@0: for(i = count; i; i--) michael@0: (void)NS_InvokeByIndex(test, 3, 3, var); michael@0: interval_invoke = PR_IntervalNow() - start; michael@0: michael@0: printf(" direct took %0.2f seconds\n", michael@0: (double)interval_direct/(double)PR_TicksPerSecond()); michael@0: printf(" invoke took %0.2f seconds\n", michael@0: (double)interval_invoke/(double)PR_TicksPerSecond()); michael@0: printf(" So, invoke overhead was ~ %0.2f seconds (~ %0.0f%%)\n", michael@0: (double)(interval_invoke-interval_direct)/(double)PR_TicksPerSecond(), michael@0: (double)(interval_invoke-interval_direct)/(double)interval_invoke*100); michael@0: }