1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/xpcom/reflect/xptcall/tests/TestXPTCInvoke.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1447 @@ 1.4 +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +/* Invoke tests xptcall. */ 1.10 + 1.11 +#include <stdio.h> 1.12 +#include "xptcall.h" 1.13 +#include "prinrval.h" 1.14 +#include "nsMemory.h" 1.15 + 1.16 +// Allows us to mark unused functions as known-unused 1.17 +#ifdef __GNUC__ 1.18 +#define UNUSED __attribute__ ((unused)) 1.19 +#else 1.20 +#define UNUSED 1.21 +#endif 1.22 + 1.23 +// forward declration 1.24 +static void DoMultipleInheritenceTest(); 1.25 +static void DoMultipleInheritenceTest2(); 1.26 +static void UNUSED DoSpeedTest(); 1.27 + 1.28 +// {AAC1FB90-E099-11d2-984E-006008962422} 1.29 +#define INVOKETESTTARGET_IID \ 1.30 +{ 0xaac1fb90, 0xe099, 0x11d2, \ 1.31 + { 0x98, 0x4e, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } } 1.32 + 1.33 + 1.34 +class InvokeTestTargetInterface : public nsISupports 1.35 +{ 1.36 +public: 1.37 + NS_DECLARE_STATIC_IID_ACCESSOR(INVOKETESTTARGET_IID) 1.38 + NS_IMETHOD AddTwoInts(int32_t p1, int32_t p2, int32_t* retval) = 0; 1.39 + NS_IMETHOD MultTwoInts(int32_t p1, int32_t p2, int32_t* retval) = 0; 1.40 + NS_IMETHOD AddTwoLLs(int64_t p1, int64_t p2, int64_t* retval) = 0; 1.41 + NS_IMETHOD MultTwoLLs(int64_t p1, int64_t p2, int64_t* retval) = 0; 1.42 + 1.43 + NS_IMETHOD AddManyInts(int32_t p1, int32_t p2, int32_t p3, int32_t p4, 1.44 + int32_t p5, int32_t p6, int32_t p7, int32_t p8, 1.45 + int32_t p9, int32_t p10, int32_t* retval) = 0; 1.46 + 1.47 + NS_IMETHOD AddTwoFloats(float p1, float p2, float* retval) = 0; 1.48 + 1.49 + NS_IMETHOD AddManyDoubles(double p1, double p2, double p3, double p4, 1.50 + double p5, double p6, double p7, double p8, 1.51 + double p9, double p10, double* retval) = 0; 1.52 + 1.53 + NS_IMETHOD AddManyFloats(float p1, float p2, float p3, float p4, 1.54 + float p5, float p6, float p7, float p8, 1.55 + float p9, float p10, float* retval) = 0; 1.56 + 1.57 + NS_IMETHOD AddManyManyFloats(float p1, float p2, float p3, float p4, 1.58 + float p5, float p6, float p7, float p8, 1.59 + float p9, float p10, float p11, float p12, 1.60 + float p13, float p14, float p15, float p16, 1.61 + float p17, float p18, float p19, float p20, 1.62 + float *retval) = 0; 1.63 + 1.64 + NS_IMETHOD AddMixedInts(int64_t p1, int32_t p2, int64_t p3, int32_t p4, 1.65 + int32_t p5, int64_t p6, int32_t p7, int32_t p8, 1.66 + int64_t p9, int32_t p10, int64_t* retval) = 0; 1.67 + 1.68 + NS_IMETHOD AddMixedInts2(int32_t p1, int64_t p2, int32_t p3, int64_t p4, 1.69 + int64_t p5, int32_t p6, int64_t p7, int64_t p8, 1.70 + int32_t p9, int64_t p10, int64_t* retval) = 0; 1.71 + 1.72 + NS_IMETHOD AddMixedFloats(float p1, float p2, double p3, double p4, 1.73 + float p5, float p6, double p7, double p8, 1.74 + float p9, double p10, float p11, 1.75 + double *retval) = 0; 1.76 + 1.77 + NS_IMETHOD PassTwoStrings(const char* s1, const char* s2, char** retval) = 0; 1.78 + 1.79 + NS_IMETHOD AddMixedInts3(int64_t p1, int64_t p2, int32_t p3, int64_t p4, 1.80 + int32_t p5, int32_t p6, int64_t p7, int64_t p8, 1.81 + int32_t p9, int64_t p10, int64_t* retval) = 0; 1.82 + NS_IMETHOD ShouldFail(int32_t p) = 0; 1.83 +}; 1.84 + 1.85 +NS_DEFINE_STATIC_IID_ACCESSOR(InvokeTestTargetInterface, INVOKETESTTARGET_IID) 1.86 + 1.87 +class InvokeTestTarget : public InvokeTestTargetInterface 1.88 +{ 1.89 +public: 1.90 + NS_DECL_ISUPPORTS 1.91 + NS_IMETHOD AddTwoInts(int32_t p1, int32_t p2, int32_t* retval); 1.92 + NS_IMETHOD MultTwoInts(int32_t p1, int32_t p2, int32_t* retval); 1.93 + NS_IMETHOD AddTwoLLs(int64_t p1, int64_t p2, int64_t* retval); 1.94 + NS_IMETHOD MultTwoLLs(int64_t p1, int64_t p2, int64_t* retval); 1.95 + 1.96 + NS_IMETHOD AddManyInts(int32_t p1, int32_t p2, int32_t p3, int32_t p4, 1.97 + int32_t p5, int32_t p6, int32_t p7, int32_t p8, 1.98 + int32_t p9, int32_t p10, int32_t* retval); 1.99 + 1.100 + NS_IMETHOD AddTwoFloats(float p1, float p2, float* retval); 1.101 + 1.102 + NS_IMETHOD AddManyDoubles(double p1, double p2, double p3, double p4, 1.103 + double p5, double p6, double p7, double p8, 1.104 + double p9, double p10, double* retval); 1.105 + 1.106 + NS_IMETHOD AddManyFloats(float p1, float p2, float p3, float p4, 1.107 + float p5, float p6, float p7, float p8, 1.108 + float p9, float p10, float* retval); 1.109 + 1.110 + NS_IMETHOD AddMixedInts(int64_t p1, int32_t p2, int64_t p3, int32_t p4, 1.111 + int32_t p5, int64_t p6, int32_t p7, int32_t p8, 1.112 + int64_t p9, int32_t p10, int64_t* retval); 1.113 + 1.114 + NS_IMETHOD AddMixedInts2(int32_t p1, int64_t p2, int32_t p3, int64_t p4, 1.115 + int64_t p5, int32_t p6, int64_t p7, int64_t p8, 1.116 + int32_t p9, int64_t p10, int64_t* retval); 1.117 + 1.118 + NS_IMETHOD AddMixedFloats(float p1, float p2, double p3, double p4, 1.119 + float p5, float p6, double p7, double p8, 1.120 + float p9, double p10, float p11, 1.121 + double *retval); 1.122 + 1.123 + NS_IMETHOD AddManyManyFloats(float p1, float p2, float p3, float p4, 1.124 + float p5, float p6, float p7, float p8, 1.125 + float p9, float p10, float p11, float p12, 1.126 + float p13, float p14, float p15, float p16, 1.127 + float p17, float p18, float p19, float p20, 1.128 + float *retval); 1.129 + 1.130 + NS_IMETHOD PassTwoStrings(const char* s1, const char* s2, char** retval); 1.131 + 1.132 + InvokeTestTarget(); 1.133 + 1.134 + NS_IMETHOD AddMixedInts3(int64_t p1, int64_t p2, int32_t p3, int64_t p4, 1.135 + int32_t p5, int32_t p6, int64_t p7, int64_t p8, 1.136 + int32_t p9, int64_t p10, int64_t* retval); 1.137 + NS_IMETHOD ShouldFail(int32_t p); 1.138 +}; 1.139 + 1.140 +NS_IMPL_ISUPPORTS(InvokeTestTarget, InvokeTestTargetInterface) 1.141 + 1.142 +InvokeTestTarget::InvokeTestTarget() 1.143 +{ 1.144 + NS_ADDREF_THIS(); 1.145 +} 1.146 + 1.147 +NS_IMETHODIMP 1.148 +InvokeTestTarget::ShouldFail(int32_t p) { 1.149 + return NS_ERROR_NULL_POINTER; 1.150 +} 1.151 +NS_IMETHODIMP 1.152 +InvokeTestTarget::AddTwoInts(int32_t p1, int32_t p2, int32_t* retval) 1.153 +{ 1.154 + *retval = p1 + p2; 1.155 + return NS_OK; 1.156 +} 1.157 + 1.158 +NS_IMETHODIMP 1.159 +InvokeTestTarget::MultTwoInts(int32_t p1, int32_t p2, int32_t* retval) 1.160 +{ 1.161 + *retval = p1 * p2; 1.162 + return NS_OK; 1.163 +} 1.164 + 1.165 +NS_IMETHODIMP 1.166 +InvokeTestTarget::AddTwoLLs(int64_t p1, int64_t p2, int64_t* retval) 1.167 +{ 1.168 + *retval = p1 + p2; 1.169 + return NS_OK; 1.170 +} 1.171 + 1.172 +NS_IMETHODIMP 1.173 +InvokeTestTarget::MultTwoLLs(int64_t p1, int64_t p2, int64_t* retval) 1.174 +{ 1.175 + *retval = p1 * p2; 1.176 + return NS_OK; 1.177 +} 1.178 + 1.179 +NS_IMETHODIMP 1.180 +InvokeTestTarget::AddManyInts(int32_t p1, int32_t p2, int32_t p3, int32_t p4, 1.181 + int32_t p5, int32_t p6, int32_t p7, int32_t p8, 1.182 + int32_t p9, int32_t p10, int32_t* retval) 1.183 +{ 1.184 +#ifdef DEBUG_TESTINVOKE 1.185 + printf("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n", 1.186 + p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); 1.187 +#endif 1.188 + *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; 1.189 + return NS_OK; 1.190 +} 1.191 + 1.192 +NS_IMETHODIMP 1.193 +InvokeTestTarget::AddTwoFloats(float p1, float p2, float *retval) 1.194 +{ 1.195 +#ifdef DEBUG_TESTINVOKE 1.196 + printf("%f, %f\n", p1, p2); 1.197 +#endif 1.198 + *retval = p1 + p2; 1.199 + return NS_OK; 1.200 +} 1.201 + 1.202 +NS_IMETHODIMP 1.203 +InvokeTestTarget::AddManyDoubles(double p1, double p2, double p3, double p4, 1.204 + double p5, double p6, double p7, double p8, 1.205 + double p9, double p10, double* retval) 1.206 +{ 1.207 +#ifdef DEBUG_TESTINVOKE 1.208 + printf("%lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf\n", 1.209 + p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); 1.210 +#endif 1.211 + *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; 1.212 + return NS_OK; 1.213 +} 1.214 + 1.215 +NS_IMETHODIMP 1.216 +InvokeTestTarget::AddManyFloats(float p1, float p2, float p3, float p4, 1.217 + float p5, float p6, float p7, float p8, 1.218 + float p9, float p10, float* retval) 1.219 +{ 1.220 +#ifdef DEBUG_TESTINVOKE 1.221 + printf("%f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n", 1.222 + p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); 1.223 +#endif 1.224 + *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; 1.225 + return NS_OK; 1.226 +} 1.227 + 1.228 +NS_IMETHODIMP 1.229 +InvokeTestTarget::AddMixedFloats(float p1, float p2, double p3, double p4, 1.230 + float p5, float p6, double p7, double p8, 1.231 + float p9, double p10, float p11, 1.232 + double *retval) 1.233 +{ 1.234 +#ifdef DEBUG_TESTINVOKE 1.235 + printf("%f, %f, %lf, %lf, %f, %f, %lf, %lf, %f, %lf, %f\n", 1.236 + p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); 1.237 +#endif 1.238 + *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10 + p11; 1.239 + return NS_OK; 1.240 +} 1.241 + 1.242 +NS_IMETHODIMP 1.243 +InvokeTestTarget::AddManyManyFloats(float p1, float p2, float p3, float p4, 1.244 + float p5, float p6, float p7, float p8, 1.245 + float p9, float p10, float p11, float p12, 1.246 + float p13, float p14, float p15, float p16, 1.247 + float p17, float p18, float p19, float p20, 1.248 + float *retval) 1.249 +{ 1.250 +#ifdef DEBUG_TESTINVOKE 1.251 + printf("%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, " 1.252 + "%f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n", 1.253 + p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, 1.254 + p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); 1.255 +#endif 1.256 + *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10 + 1.257 + p11 + p12 + p13 + p14 + p15 + p16 + p17 + p18 + p19 + p20; 1.258 + return NS_OK; 1.259 +} 1.260 + 1.261 +NS_IMETHODIMP 1.262 +InvokeTestTarget::AddMixedInts(int64_t p1, int32_t p2, int64_t p3, int32_t p4, 1.263 + int32_t p5, int64_t p6, int32_t p7, int32_t p8, 1.264 + int64_t p9, int32_t p10, int64_t* retval) 1.265 +{ 1.266 + *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; 1.267 + return NS_OK; 1.268 +} 1.269 + 1.270 +NS_IMETHODIMP 1.271 +InvokeTestTarget::AddMixedInts2(int32_t p1, int64_t p2, int32_t p3, int64_t p4, 1.272 + int64_t p5, int32_t p6, int64_t p7, int64_t p8, 1.273 + int32_t p9, int64_t p10, int64_t* retval) 1.274 +{ 1.275 + *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; 1.276 + return NS_OK; 1.277 +} 1.278 + 1.279 +NS_IMETHODIMP 1.280 +InvokeTestTarget::AddMixedInts3(int64_t p1, int64_t p2, int32_t p3, int64_t p4, 1.281 + int32_t p5, int32_t p6, int64_t p7, int64_t p8, 1.282 + int32_t p9, int64_t p10, int64_t* retval) 1.283 +{ 1.284 + printf("P1 : %lld\n", p1); 1.285 + printf("P2 : %lld\n", p2); 1.286 + printf("P3 : %d\n", p3); 1.287 + printf("P4 : %lld\n", p4); 1.288 + printf("P5 : %d\n", p5); 1.289 + printf("P6 : %d\n", p6); 1.290 + printf("P7 : %lld\n", p7); 1.291 + printf("P8 : %lld\n", p8); 1.292 + printf("P9 : %d\n", p9); 1.293 + printf("P10: %lld\n", p10); 1.294 + printf("ret: %p\n", static_cast<void*>(retval)); 1.295 + *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; 1.296 + return NS_OK; 1.297 +} 1.298 + 1.299 +NS_IMETHODIMP 1.300 +InvokeTestTarget::PassTwoStrings(const char* s1, const char* s2, char** retval) 1.301 +{ 1.302 + const char milk[] = "milk"; 1.303 + char *ret = (char*)nsMemory::Alloc(sizeof(milk)); 1.304 + if (!ret) 1.305 + return NS_ERROR_OUT_OF_MEMORY; 1.306 + strncpy(ret, milk, sizeof(milk)); 1.307 + printf("\t%s %s", s1, s2); 1.308 + *retval = ret; 1.309 + return NS_OK; 1.310 +} 1.311 + 1.312 +int main() 1.313 +{ 1.314 + InvokeTestTarget *test = new InvokeTestTarget(); 1.315 + 1.316 + /* here we make the global 'check for alloc failure' checker happy */ 1.317 + if(!test) 1.318 + return 1; 1.319 + 1.320 + int32_t out, tmp32 = 0; 1.321 + int64_t out64; 1.322 + nsresult failed_rv; 1.323 + printf("calling direct:\n"); 1.324 + if(NS_SUCCEEDED(test->AddTwoInts(1,1,&out))) 1.325 + printf("\t1 + 1 = %d\n", out); 1.326 + else 1.327 + printf("\tFAILED"); 1.328 + int64_t one = 1, two = 2; 1.329 + if(NS_SUCCEEDED(test->AddTwoLLs(one,one,&out64))) 1.330 + { 1.331 + tmp32 = (int)out64; 1.332 + printf("\t1L + 1L = %d\n", tmp32); 1.333 + } 1.334 + else 1.335 + printf("\tFAILED"); 1.336 + if(NS_SUCCEEDED(test->MultTwoInts(2,2,&out))) 1.337 + printf("\t2 * 2 = %d\n", out); 1.338 + else 1.339 + printf("\tFAILED"); 1.340 + if(NS_SUCCEEDED(test->MultTwoLLs(two,two,&out64))) 1.341 + { 1.342 + tmp32 = (int)out64; 1.343 + printf("\t2L * 2L = %d\n", tmp32); 1.344 + } 1.345 + else 1.346 + printf("\tFAILED"); 1.347 + 1.348 + double outD; 1.349 + float outF; 1.350 + int32_t outI; 1.351 + char *outS; 1.352 + 1.353 + if(NS_SUCCEEDED(test->AddManyInts(1,2,3,4,5,6,7,8,9,10,&outI))) 1.354 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", outI); 1.355 + else 1.356 + printf("\tFAILED"); 1.357 + 1.358 + if(NS_SUCCEEDED(test->AddTwoFloats(1,2,&outF))) 1.359 + printf("\t1 + 2 = %ff\n", (double)outF); 1.360 + else 1.361 + printf("\tFAILED"); 1.362 + 1.363 + if(NS_SUCCEEDED(test->AddManyDoubles(1,2,3,4,5,6,7,8,9,10,&outD))) 1.364 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %f\n", outD); 1.365 + else 1.366 + printf("\tFAILED"); 1.367 + 1.368 + if(NS_SUCCEEDED(test->AddManyFloats(1,2,3,4,5,6,7,8,9,10,&outF))) 1.369 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %ff\n", (double)outF); 1.370 + else 1.371 + printf("\tFAILED"); 1.372 + 1.373 + 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))) 1.374 + 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); 1.375 + else 1.376 + printf("\tFAILED"); 1.377 + 1.378 + if(NS_SUCCEEDED(test->AddMixedInts(1,2,3,4,5,6,7,8,9,10,&out64))) 1.379 + { 1.380 + tmp32 = (int)out64; 1.381 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", tmp32); 1.382 + } 1.383 + else 1.384 + printf("\tFAILED"); 1.385 + 1.386 + if(NS_SUCCEEDED(test->AddMixedInts2(1,2,3,4,5,6,7,8,9,10,&out64))) 1.387 + { 1.388 + tmp32 = (int)out64; 1.389 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", tmp32); 1.390 + } 1.391 + else 1.392 + printf("\tFAILED"); 1.393 + 1.394 + if(NS_SUCCEEDED(test->AddMixedInts3(3,5,7,11,13,17,19,23,29,31,&out64))) 1.395 + { 1.396 + tmp32 = (int)out64; 1.397 + printf("\t3 + 5 + 7 + 11 + 13 + 17 + 19 + 23 + 29 + 31 = %d\n", tmp32); 1.398 + } 1.399 + else 1.400 + printf("\tFAILED"); 1.401 + 1.402 + if(NS_SUCCEEDED(test->AddMixedFloats(1,2,3,4,5,6,7,8,9,10,11,&outD))) 1.403 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 = %f\n", (double)outD); 1.404 + else 1.405 + printf("\tFAILED"); 1.406 + 1.407 + if (NS_SUCCEEDED(test->PassTwoStrings("moo","cow",&outS))) { 1.408 + printf(" = %s\n", outS); 1.409 + nsMemory::Free(outS); 1.410 + } else 1.411 + printf("\tFAILED"); 1.412 + 1.413 + failed_rv = test->ShouldFail(5); 1.414 + printf("should fail %s, returned %x\n", failed_rv == NS_ERROR_NULL_POINTER ? "failed" :"passed", failed_rv); 1.415 + 1.416 + printf("calling via invoke:\n"); 1.417 + 1.418 + nsXPTCVariant var[21]; 1.419 + 1.420 + var[0].val.i32 = 1; 1.421 + var[0].type = nsXPTType::T_I32; 1.422 + var[0].flags = 0; 1.423 + 1.424 + var[1].val.i32 = 1; 1.425 + var[1].type = nsXPTType::T_I32; 1.426 + var[1].flags = 0; 1.427 + 1.428 + var[2].val.i32 = 0; 1.429 + var[2].type = nsXPTType::T_I32; 1.430 + var[2].flags = nsXPTCVariant::PTR_IS_DATA; 1.431 + var[2].ptr = &var[2].val.i32; 1.432 + 1.433 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 3, 3, var))) 1.434 + printf("\t1 + 1 = %d\n", var[2].val.i32); 1.435 + else 1.436 + printf("\tFAILED"); 1.437 + 1.438 + var[0].val.i64 = 1; 1.439 + var[0].type = nsXPTType::T_I64; 1.440 + var[0].flags = 0; 1.441 + 1.442 + var[1].val.i64 = 1; 1.443 + var[1].type = nsXPTType::T_I64; 1.444 + var[1].flags = 0; 1.445 + 1.446 + var[2].val.i64 = 0; 1.447 + var[2].type = nsXPTType::T_I64; 1.448 + var[2].flags = nsXPTCVariant::PTR_IS_DATA; 1.449 + var[2].ptr = &var[2].val.i64; 1.450 + 1.451 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 5, 3, var))) 1.452 + printf("\t1L + 1L = %d\n", (int)var[2].val.i64); 1.453 + else 1.454 + printf("\tFAILED"); 1.455 + 1.456 + var[0].val.i32 = 2; 1.457 + var[0].type = nsXPTType::T_I32; 1.458 + var[0].flags = 0; 1.459 + 1.460 + var[1].val.i32 = 2; 1.461 + var[1].type = nsXPTType::T_I32; 1.462 + var[1].flags = 0; 1.463 + 1.464 + var[2].val.i32 = 0; 1.465 + var[2].type = nsXPTType::T_I32; 1.466 + var[2].flags = nsXPTCVariant::PTR_IS_DATA; 1.467 + var[2].ptr = &var[2].val.i32; 1.468 + 1.469 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 4, 3, var))) 1.470 + printf("\t2 * 2 = %d\n", var[2].val.i32); 1.471 + else 1.472 + printf("\tFAILED"); 1.473 + 1.474 + var[0].val.i64 = 2; 1.475 + var[0].type = nsXPTType::T_I64; 1.476 + var[0].flags = 0; 1.477 + 1.478 + var[1].val.i64 = 2; 1.479 + var[1].type = nsXPTType::T_I64; 1.480 + var[1].flags = 0; 1.481 + 1.482 + var[2].val.i64 = 0; 1.483 + var[2].type = nsXPTType::T_I64; 1.484 + var[2].flags = nsXPTCVariant::PTR_IS_DATA; 1.485 + var[2].ptr = &var[2].val.i64; 1.486 + 1.487 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 6, 3, var))) 1.488 + printf("\t2L * 2L = %d\n", (int)var[2].val.i64); 1.489 + else 1.490 + printf("\tFAILED"); 1.491 + 1.492 + var[0].val.i32 = 1; 1.493 + var[0].type = nsXPTType::T_I32; 1.494 + var[0].flags = 0; 1.495 + 1.496 + var[1].val.i32 = 2; 1.497 + var[1].type = nsXPTType::T_I32; 1.498 + var[1].flags = 0; 1.499 + 1.500 + var[2].val.i32 = 3; 1.501 + var[2].type = nsXPTType::T_I32; 1.502 + var[2].flags = 0; 1.503 + 1.504 + var[3].val.i32 = 4; 1.505 + var[3].type = nsXPTType::T_I32; 1.506 + var[3].flags = 0; 1.507 + 1.508 + var[4].val.i32 = 5; 1.509 + var[4].type = nsXPTType::T_I32; 1.510 + var[4].flags = 0; 1.511 + 1.512 + var[5].val.i32 = 6; 1.513 + var[5].type = nsXPTType::T_I32; 1.514 + var[5].flags = 0; 1.515 + 1.516 + var[6].val.i32 = 7; 1.517 + var[6].type = nsXPTType::T_I32; 1.518 + var[6].flags = 0; 1.519 + 1.520 + var[7].val.i32 = 8; 1.521 + var[7].type = nsXPTType::T_I32; 1.522 + var[7].flags = 0; 1.523 + 1.524 + var[8].val.i32 = 9; 1.525 + var[8].type = nsXPTType::T_I32; 1.526 + var[8].flags = 0; 1.527 + 1.528 + var[9].val.i32 = 10; 1.529 + var[9].type = nsXPTType::T_I32; 1.530 + var[9].flags = 0; 1.531 + 1.532 + var[10].val.i32 = 0; 1.533 + var[10].type = nsXPTType::T_I32; 1.534 + var[10].flags = nsXPTCVariant::PTR_IS_DATA; 1.535 + var[10].ptr = &var[10].val.i32; 1.536 + 1.537 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 7, 11, var))) 1.538 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", 1.539 + var[10].val.i32); 1.540 + 1.541 + var[0].val.f = 1.0f; 1.542 + var[0].type = nsXPTType::T_FLOAT; 1.543 + var[0].flags = 0; 1.544 + 1.545 + var[1].val.f = 2.0f; 1.546 + var[1].type = nsXPTType::T_FLOAT; 1.547 + var[1].flags = 0; 1.548 + 1.549 + var[2].val.f = 0.0f; 1.550 + var[2].type = nsXPTType::T_FLOAT; 1.551 + var[2].flags = nsXPTCVariant::PTR_IS_DATA; 1.552 + var[2].ptr = &var[2].val.f; 1.553 + 1.554 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 8, 3, var))) 1.555 + printf("\t1 + 2 = %ff\n", 1.556 + (double) var[2].val.f); 1.557 + 1.558 + 1.559 + var[0].val.d = 1.0; 1.560 + var[0].type = nsXPTType::T_DOUBLE; 1.561 + var[0].flags = 0; 1.562 + 1.563 + var[1].val.d = 2.0; 1.564 + var[1].type = nsXPTType::T_DOUBLE; 1.565 + var[1].flags = 0; 1.566 + 1.567 + var[2].val.d = 3.0; 1.568 + var[2].type = nsXPTType::T_DOUBLE; 1.569 + var[2].flags = 0; 1.570 + 1.571 + var[3].val.d = 4.0; 1.572 + var[3].type = nsXPTType::T_DOUBLE; 1.573 + var[3].flags = 0; 1.574 + 1.575 + var[4].val.d = 5.0; 1.576 + var[4].type = nsXPTType::T_DOUBLE; 1.577 + var[4].flags = 0; 1.578 + 1.579 + var[5].val.d = 6.0; 1.580 + var[5].type = nsXPTType::T_DOUBLE; 1.581 + var[5].flags = 0; 1.582 + 1.583 + var[6].val.d = 7.0; 1.584 + var[6].type = nsXPTType::T_DOUBLE; 1.585 + var[6].flags = 0; 1.586 + 1.587 + var[7].val.d = 8.0; 1.588 + var[7].type = nsXPTType::T_DOUBLE; 1.589 + var[7].flags = 0; 1.590 + 1.591 + var[8].val.d = 9.0; 1.592 + var[8].type = nsXPTType::T_DOUBLE; 1.593 + var[8].flags = 0; 1.594 + 1.595 + var[9].val.d = 10.0; 1.596 + var[9].type = nsXPTType::T_DOUBLE; 1.597 + var[9].flags = 0; 1.598 + 1.599 + var[10].val.d = 0.0; 1.600 + var[10].type = nsXPTType::T_DOUBLE; 1.601 + var[10].flags = nsXPTCVariant::PTR_IS_DATA; 1.602 + var[10].ptr = &var[10].val.d; 1.603 + 1.604 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 9, 11, var))) 1.605 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %f\n", 1.606 + var[10].val.d); 1.607 + else 1.608 + printf("\tFAILED"); 1.609 + 1.610 + var[0].val.f = 1.0f; 1.611 + var[0].type = nsXPTType::T_FLOAT; 1.612 + var[0].flags = 0; 1.613 + 1.614 + var[1].val.f = 2.0f; 1.615 + var[1].type = nsXPTType::T_FLOAT; 1.616 + var[1].flags = 0; 1.617 + 1.618 + var[2].val.f = 3.0f; 1.619 + var[2].type = nsXPTType::T_FLOAT; 1.620 + var[2].flags = 0; 1.621 + 1.622 + var[3].val.f = 4.0f; 1.623 + var[3].type = nsXPTType::T_FLOAT; 1.624 + var[3].flags = 0; 1.625 + 1.626 + var[4].val.f = 5.0f; 1.627 + var[4].type = nsXPTType::T_FLOAT; 1.628 + var[4].flags = 0; 1.629 + 1.630 + var[5].val.f = 6.0f; 1.631 + var[5].type = nsXPTType::T_FLOAT; 1.632 + var[5].flags = 0; 1.633 + 1.634 + var[6].val.f = 7.0f; 1.635 + var[6].type = nsXPTType::T_FLOAT; 1.636 + var[6].flags = 0; 1.637 + 1.638 + var[7].val.f = 8.0f; 1.639 + var[7].type = nsXPTType::T_FLOAT; 1.640 + var[7].flags = 0; 1.641 + 1.642 + var[8].val.f = 9.0f; 1.643 + var[8].type = nsXPTType::T_FLOAT; 1.644 + var[8].flags = 0; 1.645 + 1.646 + var[9].val.f = 10.0f; 1.647 + var[9].type = nsXPTType::T_FLOAT; 1.648 + var[9].flags = 0; 1.649 + 1.650 + var[10].val.f = 0.0f; 1.651 + var[10].type = nsXPTType::T_FLOAT; 1.652 + var[10].flags = nsXPTCVariant::PTR_IS_DATA; 1.653 + var[10].ptr = &var[10].val.f; 1.654 + 1.655 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 10, 11, var))) 1.656 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %ff\n", 1.657 + (double) var[10].val.f); 1.658 + else 1.659 + printf("\tFAILED"); 1.660 + 1.661 + var[0].val.f = 1.0f; 1.662 + var[0].type = nsXPTType::T_FLOAT; 1.663 + var[0].flags = 0; 1.664 + 1.665 + var[1].val.f = 2.0f; 1.666 + var[1].type = nsXPTType::T_FLOAT; 1.667 + var[1].flags = 0; 1.668 + 1.669 + var[2].val.f = 3.0f; 1.670 + var[2].type = nsXPTType::T_FLOAT; 1.671 + var[2].flags = 0; 1.672 + 1.673 + var[3].val.f = 4.0f; 1.674 + var[3].type = nsXPTType::T_FLOAT; 1.675 + var[3].flags = 0; 1.676 + 1.677 + var[4].val.f = 5.0f; 1.678 + var[4].type = nsXPTType::T_FLOAT; 1.679 + var[4].flags = 0; 1.680 + 1.681 + var[5].val.f = 6.0f; 1.682 + var[5].type = nsXPTType::T_FLOAT; 1.683 + var[5].flags = 0; 1.684 + 1.685 + var[6].val.f = 7.0f; 1.686 + var[6].type = nsXPTType::T_FLOAT; 1.687 + var[6].flags = 0; 1.688 + 1.689 + var[7].val.f = 8.0f; 1.690 + var[7].type = nsXPTType::T_FLOAT; 1.691 + var[7].flags = 0; 1.692 + 1.693 + var[8].val.f = 9.0f; 1.694 + var[8].type = nsXPTType::T_FLOAT; 1.695 + var[8].flags = 0; 1.696 + 1.697 + var[9].val.f = 10.0f; 1.698 + var[9].type = nsXPTType::T_FLOAT; 1.699 + var[9].flags = 0; 1.700 + 1.701 + var[10].val.f = 11.0f; 1.702 + var[10].type = nsXPTType::T_FLOAT; 1.703 + var[10].flags = 0; 1.704 + 1.705 + var[11].val.f = 12.0f; 1.706 + var[11].type = nsXPTType::T_FLOAT; 1.707 + var[11].flags = 0; 1.708 + 1.709 + var[12].val.f = 13.0f; 1.710 + var[12].type = nsXPTType::T_FLOAT; 1.711 + var[12].flags = 0; 1.712 + 1.713 + var[13].val.f = 14.0f; 1.714 + var[13].type = nsXPTType::T_FLOAT; 1.715 + var[13].flags = 0; 1.716 + 1.717 + var[14].val.f = 15.0f; 1.718 + var[14].type = nsXPTType::T_FLOAT; 1.719 + var[14].flags = 0; 1.720 + 1.721 + var[15].val.f = 16.0f; 1.722 + var[15].type = nsXPTType::T_FLOAT; 1.723 + var[15].flags = 0; 1.724 + 1.725 + var[16].val.f = 17.0f; 1.726 + var[16].type = nsXPTType::T_FLOAT; 1.727 + var[16].flags = 0; 1.728 + 1.729 + var[17].val.f = 18.0f; 1.730 + var[17].type = nsXPTType::T_FLOAT; 1.731 + var[17].flags = 0; 1.732 + 1.733 + var[18].val.f = 19.0f; 1.734 + var[18].type = nsXPTType::T_FLOAT; 1.735 + var[18].flags = 0; 1.736 + 1.737 + var[19].val.f = 20.0f; 1.738 + var[19].type = nsXPTType::T_FLOAT; 1.739 + var[19].flags = 0; 1.740 + 1.741 + var[20].val.f = 0.0f; 1.742 + var[20].type = nsXPTType::T_FLOAT; 1.743 + var[20].flags = nsXPTCVariant::PTR_IS_DATA; 1.744 + var[20].ptr = &var[20].val.f; 1.745 + 1.746 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 11, 21, var))) 1.747 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 = %ff\n", 1.748 + (double) var[20].val.f); 1.749 + 1.750 + var[0].val.i64 = 1; 1.751 + var[0].type = nsXPTType::T_I64; 1.752 + var[0].flags = 0; 1.753 + 1.754 + var[1].val.i32 = 2; 1.755 + var[1].type = nsXPTType::T_I32; 1.756 + var[1].flags = 0; 1.757 + 1.758 + var[2].val.i64 = 3; 1.759 + var[2].type = nsXPTType::T_I64; 1.760 + var[2].flags = 0; 1.761 + 1.762 + var[3].val.i32 = 4; 1.763 + var[3].type = nsXPTType::T_I32; 1.764 + var[3].flags = 0; 1.765 + 1.766 + var[4].val.i32 = 5; 1.767 + var[4].type = nsXPTType::T_I32; 1.768 + var[4].flags = 0; 1.769 + 1.770 + var[5].val.i64 = 6; 1.771 + var[5].type = nsXPTType::T_I64; 1.772 + var[5].flags = 0; 1.773 + 1.774 + var[6].val.i32 = 7; 1.775 + var[6].type = nsXPTType::T_I32; 1.776 + var[6].flags = 0; 1.777 + 1.778 + var[7].val.i32 = 8; 1.779 + var[7].type = nsXPTType::T_I32; 1.780 + var[7].flags = 0; 1.781 + 1.782 + var[8].val.i64 = 9; 1.783 + var[8].type = nsXPTType::T_I64; 1.784 + var[8].flags = 0; 1.785 + 1.786 + var[9].val.i32 = 10; 1.787 + var[9].type = nsXPTType::T_I32; 1.788 + var[9].flags = 0; 1.789 + 1.790 + var[10].val.i64 = 0; 1.791 + var[10].type = nsXPTType::T_I64; 1.792 + var[10].flags = nsXPTCVariant::PTR_IS_DATA; 1.793 + var[10].ptr = &var[10].val.i64; 1.794 + 1.795 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 12, 11, var))) 1.796 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", 1.797 + (int)var[10].val.i64); 1.798 + else 1.799 + printf("\tFAILED"); 1.800 + 1.801 + var[0].val.i32 = 1; 1.802 + var[0].type = nsXPTType::T_I32; 1.803 + var[0].flags = 0; 1.804 + 1.805 + var[1].val.i64 = 2; 1.806 + var[1].type = nsXPTType::T_I64; 1.807 + var[1].flags = 0; 1.808 + 1.809 + var[2].val.i32 = 3; 1.810 + var[2].type = nsXPTType::T_I32; 1.811 + var[2].flags = 0; 1.812 + 1.813 + var[3].val.i64 = 4; 1.814 + var[3].type = nsXPTType::T_I64; 1.815 + var[3].flags = 0; 1.816 + 1.817 + var[4].val.i64 = 5; 1.818 + var[4].type = nsXPTType::T_I64; 1.819 + var[4].flags = 0; 1.820 + 1.821 + var[5].val.i32 = 6; 1.822 + var[5].type = nsXPTType::T_I32; 1.823 + var[5].flags = 0; 1.824 + 1.825 + var[6].val.i64 = 7; 1.826 + var[6].type = nsXPTType::T_I64; 1.827 + var[6].flags = 0; 1.828 + 1.829 + var[7].val.i64 = 8; 1.830 + var[7].type = nsXPTType::T_I64; 1.831 + var[7].flags = 0; 1.832 + 1.833 + var[8].val.i32 = 9; 1.834 + var[8].type = nsXPTType::T_I32; 1.835 + var[8].flags = 0; 1.836 + 1.837 + var[9].val.i64 = 10; 1.838 + var[9].type = nsXPTType::T_I64; 1.839 + var[9].flags = 0; 1.840 + 1.841 + var[10].val.i64 = 0; 1.842 + var[10].type = nsXPTType::T_I64; 1.843 + var[10].flags = nsXPTCVariant::PTR_IS_DATA; 1.844 + var[10].ptr = &var[10].val.i64; 1.845 + 1.846 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 13, 11, var))) 1.847 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", 1.848 + (int)var[10].val.i64); 1.849 + else 1.850 + printf("\tFAILED"); 1.851 + 1.852 + var[0].val.f = 1.0f; 1.853 + var[0].type = nsXPTType::T_FLOAT; 1.854 + var[0].flags = 0; 1.855 + 1.856 + var[1].val.f = 2.0f; 1.857 + var[1].type = nsXPTType::T_FLOAT; 1.858 + var[1].flags = 0; 1.859 + 1.860 + var[2].val.d = 3.0; 1.861 + var[2].type = nsXPTType::T_DOUBLE; 1.862 + var[2].flags = 0; 1.863 + 1.864 + var[3].val.d = 4.0; 1.865 + var[3].type = nsXPTType::T_DOUBLE; 1.866 + var[3].flags = 0; 1.867 + 1.868 + var[4].val.f = 5.0f; 1.869 + var[4].type = nsXPTType::T_FLOAT; 1.870 + var[4].flags = 0; 1.871 + 1.872 + var[5].val.f = 6.0f; 1.873 + var[5].type = nsXPTType::T_FLOAT; 1.874 + var[5].flags = 0; 1.875 + 1.876 + var[6].val.d = 7.0; 1.877 + var[6].type = nsXPTType::T_DOUBLE; 1.878 + var[6].flags = 0; 1.879 + 1.880 + var[7].val.d = 8.0; 1.881 + var[7].type = nsXPTType::T_DOUBLE; 1.882 + var[7].flags = 0; 1.883 + 1.884 + var[8].val.f = 9.0f; 1.885 + var[8].type = nsXPTType::T_FLOAT; 1.886 + var[8].flags = 0; 1.887 + 1.888 + var[9].val.d = 10.0; 1.889 + var[9].type = nsXPTType::T_DOUBLE; 1.890 + var[9].flags = 0; 1.891 + 1.892 + var[10].val.f = 11.0f; 1.893 + var[10].type = nsXPTType::T_FLOAT; 1.894 + var[10].flags = 0; 1.895 + 1.896 + var[11].val.d = 0.0; 1.897 + var[11].type = nsXPTType::T_DOUBLE; 1.898 + var[11].flags = nsXPTCVariant::PTR_IS_DATA; 1.899 + var[11].ptr = &var[11].val.d; 1.900 + 1.901 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 14, 12, var))) 1.902 + printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 = %f\n", 1.903 + var[11].val.d); 1.904 + else 1.905 + printf("\tFAILED"); 1.906 + 1.907 + var[0].val.p = (void*)"moo"; 1.908 + var[0].type = nsXPTType::T_CHAR_STR; 1.909 + var[0].flags = 0; 1.910 + 1.911 + var[1].val.p = (void*)"cow"; 1.912 + var[1].type = nsXPTType::T_CHAR_STR; 1.913 + var[1].flags = 0; 1.914 + 1.915 + var[2].val.p = 0; 1.916 + var[2].type = nsXPTType::T_CHAR_STR; 1.917 + var[2].flags = nsXPTCVariant::PTR_IS_DATA; 1.918 + var[2].ptr = &var[2].val.p; 1.919 + 1.920 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 15, 3, var))) 1.921 + printf(" = %s\n", static_cast<char*>(var[2].val.p)); 1.922 + else 1.923 + printf("\tFAILED"); 1.924 + 1.925 + var[0].val.i32 = 5; 1.926 + var[0].type = nsXPTType::T_I32; 1.927 + var[0].flags = 0; 1.928 + 1.929 + failed_rv = NS_InvokeByIndex(test, 17, 1, var); 1.930 + printf("should fail %s, returned %x\n", failed_rv == NS_ERROR_NULL_POINTER ? "failed" :"passed", failed_rv); 1.931 + 1.932 + var[0].val.i64 = 3; 1.933 + var[0].type = nsXPTType::T_I64; 1.934 + var[0].flags = 0; 1.935 + 1.936 + var[1].val.i64 = 5; 1.937 + var[1].type = nsXPTType::T_I64; 1.938 + var[1].flags = 0; 1.939 + 1.940 + var[2].val.i32 = 7; 1.941 + var[2].type = nsXPTType::T_I32; 1.942 + var[2].flags = 0; 1.943 + 1.944 + var[3].val.i64 = 11; 1.945 + var[3].type = nsXPTType::T_I64; 1.946 + var[3].flags = 0; 1.947 + 1.948 + var[4].val.i32 = 13; 1.949 + var[4].type = nsXPTType::T_I32; 1.950 + var[4].flags = 0; 1.951 + 1.952 + var[5].val.i32 = 17; 1.953 + var[5].type = nsXPTType::T_I32; 1.954 + var[5].flags = 0; 1.955 + 1.956 + var[6].val.i64 = 19; 1.957 + var[6].type = nsXPTType::T_I64; 1.958 + var[6].flags = 0; 1.959 + 1.960 + var[7].val.i64 = 23; 1.961 + var[7].type = nsXPTType::T_I64; 1.962 + var[7].flags = 0; 1.963 + 1.964 + var[8].val.i32 = 29; 1.965 + var[8].type = nsXPTType::T_I32; 1.966 + var[8].flags = 0; 1.967 + 1.968 + var[9].val.i64 = 31; 1.969 + var[9].type = nsXPTType::T_I64; 1.970 + var[9].flags = 0; 1.971 + 1.972 + var[10].val.i64 = 0; 1.973 + var[10].type = nsXPTType::T_I64; 1.974 + var[10].flags = nsXPTCVariant::PTR_IS_DATA; 1.975 + var[10].ptr = &var[10].val.i64; 1.976 + 1.977 + if(NS_SUCCEEDED(NS_InvokeByIndex(test, 16, 11, var))) 1.978 + printf("\t3 + 5 + 7 + 11 + 13 + 17 + 19 + 23 + 29+ 31 = %d\n", 1.979 + (int)var[10].val.i64); 1.980 + else 1.981 + printf("\tFAILED"); 1.982 + 1.983 + DoMultipleInheritenceTest(); 1.984 + DoMultipleInheritenceTest2(); 1.985 + // Disabled by default - takes too much time on slow machines 1.986 + //DoSpeedTest(); 1.987 + 1.988 + return 0; 1.989 +} 1.990 + 1.991 +/***************************************************************************/ 1.992 +/***************************************************************************/ 1.993 +/***************************************************************************/ 1.994 + 1.995 +// {491C65A0-3317-11d3-9885-006008962422} 1.996 +#define FOO_IID \ 1.997 +{ 0x491c65a0, 0x3317, 0x11d3, \ 1.998 + { 0x98, 0x85, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } } 1.999 + 1.1000 +// {491C65A1-3317-11d3-9885-006008962422} 1.1001 +#define BAR_IID \ 1.1002 +{ 0x491c65a1, 0x3317, 0x11d3, \ 1.1003 + { 0x98, 0x85, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } } 1.1004 + 1.1005 +/***************************/ 1.1006 + 1.1007 +class nsIFoo : public nsISupports 1.1008 +{ 1.1009 +public: 1.1010 + NS_DECLARE_STATIC_IID_ACCESSOR(FOO_IID) 1.1011 + NS_IMETHOD FooMethod1(int32_t i) = 0; 1.1012 + NS_IMETHOD FooMethod2(int32_t i) = 0; 1.1013 +}; 1.1014 + 1.1015 +NS_DEFINE_STATIC_IID_ACCESSOR(nsIFoo, FOO_IID) 1.1016 + 1.1017 +class nsIBar : public nsISupports 1.1018 +{ 1.1019 +public: 1.1020 + NS_DECLARE_STATIC_IID_ACCESSOR(BAR_IID) 1.1021 + NS_IMETHOD BarMethod1(int32_t i) = 0; 1.1022 + NS_IMETHOD BarMethod2(int32_t i) = 0; 1.1023 +}; 1.1024 + 1.1025 +NS_DEFINE_STATIC_IID_ACCESSOR(nsIBar, BAR_IID) 1.1026 + 1.1027 +/***************************/ 1.1028 + 1.1029 +class FooImpl : public nsIFoo 1.1030 +{ 1.1031 +public: 1.1032 + NS_IMETHOD FooMethod1(int32_t i); 1.1033 + NS_IMETHOD FooMethod2(int32_t i); 1.1034 + 1.1035 + FooImpl(); 1.1036 + 1.1037 +protected: 1.1038 + ~FooImpl() {} 1.1039 + 1.1040 +public: 1.1041 + virtual const char* ImplName() = 0; 1.1042 + 1.1043 + int SomeData1; 1.1044 + int SomeData2; 1.1045 + const char* Name; 1.1046 +}; 1.1047 + 1.1048 +class BarImpl : public nsIBar 1.1049 +{ 1.1050 +public: 1.1051 + NS_IMETHOD BarMethod1(int32_t i); 1.1052 + NS_IMETHOD BarMethod2(int32_t i); 1.1053 + 1.1054 + BarImpl(); 1.1055 + 1.1056 +protected: 1.1057 + ~BarImpl() {} 1.1058 + 1.1059 +public: 1.1060 + virtual const char * ImplName() = 0; 1.1061 + 1.1062 + int SomeData1; 1.1063 + int SomeData2; 1.1064 + const char* Name; 1.1065 +}; 1.1066 + 1.1067 +/***************************/ 1.1068 + 1.1069 +FooImpl::FooImpl() : Name("FooImpl") 1.1070 +{ 1.1071 +} 1.1072 + 1.1073 +NS_IMETHODIMP FooImpl::FooMethod1(int32_t i) 1.1074 +{ 1.1075 + printf("\tFooImpl::FooMethod1 called with i == %d, %s part of a %s\n", 1.1076 + i, Name, ImplName()); 1.1077 + return NS_OK; 1.1078 +} 1.1079 + 1.1080 +NS_IMETHODIMP FooImpl::FooMethod2(int32_t i) 1.1081 +{ 1.1082 + printf("\tFooImpl::FooMethod2 called with i == %d, %s part of a %s\n", 1.1083 + i, Name, ImplName()); 1.1084 + return NS_OK; 1.1085 +} 1.1086 + 1.1087 +/***************************/ 1.1088 + 1.1089 +BarImpl::BarImpl() : Name("BarImpl") 1.1090 +{ 1.1091 +} 1.1092 + 1.1093 +NS_IMETHODIMP BarImpl::BarMethod1(int32_t i) 1.1094 +{ 1.1095 + printf("\tBarImpl::BarMethod1 called with i == %d, %s part of a %s\n", 1.1096 + i, Name, ImplName()); 1.1097 + return NS_OK; 1.1098 +} 1.1099 + 1.1100 +NS_IMETHODIMP BarImpl::BarMethod2(int32_t i) 1.1101 +{ 1.1102 + printf("\tBarImpl::BarMethod2 called with i == %d, %s part of a %s\n", 1.1103 + i, Name, ImplName()); 1.1104 + return NS_OK; 1.1105 +} 1.1106 + 1.1107 +/***************************/ 1.1108 + 1.1109 +class FooBarImpl : public FooImpl, public BarImpl 1.1110 +{ 1.1111 +public: 1.1112 + NS_DECL_ISUPPORTS 1.1113 + 1.1114 + const char* ImplName(); 1.1115 + 1.1116 + FooBarImpl(); 1.1117 + 1.1118 +private: 1.1119 + ~FooBarImpl() {} 1.1120 + 1.1121 +public: 1.1122 + const char* MyName; 1.1123 +}; 1.1124 + 1.1125 +FooBarImpl::FooBarImpl() : MyName("FooBarImpl") 1.1126 +{ 1.1127 + NS_ADDREF_THIS(); 1.1128 +} 1.1129 + 1.1130 +const char* FooBarImpl::ImplName() 1.1131 +{ 1.1132 + return MyName; 1.1133 +} 1.1134 + 1.1135 +NS_IMETHODIMP 1.1136 +FooBarImpl::QueryInterface(REFNSIID aIID, void** aInstancePtr) 1.1137 +{ 1.1138 + if (nullptr == aInstancePtr) { 1.1139 + return NS_ERROR_NULL_POINTER; 1.1140 + } 1.1141 + 1.1142 + *aInstancePtr = nullptr; 1.1143 + 1.1144 + 1.1145 + if (aIID.Equals(NS_GET_IID(nsIFoo))) { 1.1146 + *aInstancePtr = (void*) static_cast<nsIFoo*>(this); 1.1147 + NS_ADDREF_THIS(); 1.1148 + return NS_OK; 1.1149 + } 1.1150 + if (aIID.Equals(NS_GET_IID(nsIBar))) { 1.1151 + *aInstancePtr = (void*) static_cast<nsIBar*>(this); 1.1152 + NS_ADDREF_THIS(); 1.1153 + return NS_OK; 1.1154 + } 1.1155 + 1.1156 + if (aIID.Equals(NS_GET_IID(nsISupports))) { 1.1157 + *aInstancePtr = (void*) static_cast<nsISupports*> 1.1158 + (static_cast<nsIFoo*>(this)); 1.1159 + NS_ADDREF_THIS(); 1.1160 + return NS_OK; 1.1161 + } 1.1162 + return NS_NOINTERFACE; 1.1163 +} 1.1164 + 1.1165 +NS_IMPL_ADDREF(FooBarImpl) 1.1166 +NS_IMPL_RELEASE(FooBarImpl) 1.1167 + 1.1168 + 1.1169 +static void DoMultipleInheritenceTest() 1.1170 +{ 1.1171 + FooBarImpl* impl = new FooBarImpl(); 1.1172 + if(!impl) 1.1173 + return; 1.1174 + 1.1175 + nsIFoo* foo; 1.1176 + nsIBar* bar; 1.1177 + 1.1178 + nsXPTCVariant var[1]; 1.1179 + 1.1180 + printf("\n"); 1.1181 + if(NS_SUCCEEDED(impl->QueryInterface(NS_GET_IID(nsIFoo), (void**)&foo)) && 1.1182 + NS_SUCCEEDED(impl->QueryInterface(NS_GET_IID(nsIBar), (void**)&bar))) 1.1183 + { 1.1184 + printf("impl == %p\n", static_cast<void*>(impl)); 1.1185 + printf("foo == %p\n", static_cast<void*>(foo)); 1.1186 + printf("bar == %p\n", static_cast<void*>(bar)); 1.1187 + 1.1188 + printf("Calling Foo...\n"); 1.1189 + printf("direct calls:\n"); 1.1190 + foo->FooMethod1(1); 1.1191 + foo->FooMethod2(2); 1.1192 + 1.1193 + printf("invoke calls:\n"); 1.1194 + var[0].val.i32 = 1; 1.1195 + var[0].type = nsXPTType::T_I32; 1.1196 + var[0].flags = 0; 1.1197 + NS_InvokeByIndex(foo, 3, 1, var); 1.1198 + 1.1199 + var[0].val.i32 = 2; 1.1200 + var[0].type = nsXPTType::T_I32; 1.1201 + var[0].flags = 0; 1.1202 + NS_InvokeByIndex(foo, 4, 1, var); 1.1203 + 1.1204 + printf("\n"); 1.1205 + 1.1206 + printf("Calling Bar...\n"); 1.1207 + printf("direct calls:\n"); 1.1208 + bar->BarMethod1(1); 1.1209 + bar->BarMethod2(2); 1.1210 + 1.1211 + printf("invoke calls:\n"); 1.1212 + var[0].val.i32 = 1; 1.1213 + var[0].type = nsXPTType::T_I32; 1.1214 + var[0].flags = 0; 1.1215 + NS_InvokeByIndex(bar, 3, 1, var); 1.1216 + 1.1217 + var[0].val.i32 = 2; 1.1218 + var[0].type = nsXPTType::T_I32; 1.1219 + var[0].flags = 0; 1.1220 + NS_InvokeByIndex(bar, 4, 1, var); 1.1221 + 1.1222 + printf("\n"); 1.1223 + 1.1224 + NS_RELEASE(foo); 1.1225 + NS_RELEASE(bar); 1.1226 + } 1.1227 + NS_RELEASE(impl); 1.1228 +} 1.1229 +/***************************************************************************/ 1.1230 +/***************************************************************************/ 1.1231 +/***************************************************************************/ 1.1232 +/* This is a variation on the theme submitted by duncan@be.com (Duncan Wilcox). 1.1233 +* He was seeing the other test work and this test not work. They should both 1.1234 +* Work on any given platform 1.1235 +*/ 1.1236 + 1.1237 +class nsIFoo2 : public nsISupports 1.1238 +{ 1.1239 +public: 1.1240 + NS_IMETHOD FooMethod1(int32_t i) = 0; 1.1241 + NS_IMETHOD FooMethod2(int32_t i) = 0; 1.1242 +}; 1.1243 + 1.1244 +class nsIBar2 : public nsISupports 1.1245 +{ 1.1246 +public: 1.1247 + NS_IMETHOD BarMethod1(int32_t i) = 0; 1.1248 + NS_IMETHOD BarMethod2(int32_t i) = 0; 1.1249 +}; 1.1250 + 1.1251 +class FooBarImpl2 : public nsIFoo2, public nsIBar2 1.1252 +{ 1.1253 +public: 1.1254 + // Foo interface 1.1255 + NS_IMETHOD FooMethod1(int32_t i); 1.1256 + NS_IMETHOD FooMethod2(int32_t i); 1.1257 + 1.1258 + // Bar interface 1.1259 + NS_IMETHOD BarMethod1(int32_t i); 1.1260 + NS_IMETHOD BarMethod2(int32_t i); 1.1261 + 1.1262 + NS_DECL_ISUPPORTS 1.1263 + 1.1264 + FooBarImpl2(); 1.1265 + 1.1266 +private: 1.1267 + ~FooBarImpl2() {} 1.1268 + 1.1269 +public: 1.1270 + int32_t value; 1.1271 +}; 1.1272 + 1.1273 +FooBarImpl2::FooBarImpl2() : value(0x12345678) 1.1274 +{ 1.1275 + NS_ADDREF_THIS(); 1.1276 +} 1.1277 + 1.1278 +NS_IMETHODIMP FooBarImpl2::FooMethod1(int32_t i) 1.1279 +{ 1.1280 + printf("\tFooBarImpl2::FooMethod1 called with i == %d, local value = %x\n", 1.1281 + i, value); 1.1282 + return NS_OK; 1.1283 +} 1.1284 + 1.1285 +NS_IMETHODIMP FooBarImpl2::FooMethod2(int32_t i) 1.1286 +{ 1.1287 + printf("\tFooBarImpl2::FooMethod2 called with i == %d, local value = %x\n", 1.1288 + i, value); 1.1289 + return NS_OK; 1.1290 +} 1.1291 + 1.1292 +NS_IMETHODIMP FooBarImpl2::BarMethod1(int32_t i) 1.1293 +{ 1.1294 + printf("\tFooBarImpl2::BarMethod1 called with i == %d, local value = %x\n", 1.1295 + i, value); 1.1296 + return NS_OK; 1.1297 +} 1.1298 + 1.1299 +NS_IMETHODIMP FooBarImpl2::BarMethod2(int32_t i) 1.1300 +{ 1.1301 + printf("\tFooBarImpl2::BarMethod2 called with i == %d, local value = %x\n", 1.1302 + i, value); 1.1303 + return NS_OK; 1.1304 +} 1.1305 + 1.1306 +NS_IMETHODIMP 1.1307 +FooBarImpl2::QueryInterface(REFNSIID aIID, void** aInstancePtr) 1.1308 +{ 1.1309 + if (nullptr == aInstancePtr) { 1.1310 + return NS_ERROR_NULL_POINTER; 1.1311 + } 1.1312 + 1.1313 + *aInstancePtr = nullptr; 1.1314 + 1.1315 + 1.1316 + if (aIID.Equals(NS_GET_IID(nsIFoo))) { 1.1317 + *aInstancePtr = (void*) static_cast<nsIFoo2*>(this); 1.1318 + NS_ADDREF_THIS(); 1.1319 + return NS_OK; 1.1320 + } 1.1321 + if (aIID.Equals(NS_GET_IID(nsIBar))) { 1.1322 + *aInstancePtr = (void*) static_cast<nsIBar2*>(this); 1.1323 + NS_ADDREF_THIS(); 1.1324 + return NS_OK; 1.1325 + } 1.1326 + 1.1327 + if (aIID.Equals(NS_GET_IID(nsISupports))) { 1.1328 + *aInstancePtr = (void*) static_cast<nsISupports*> 1.1329 + (static_cast<nsIFoo2*>(this)); 1.1330 + NS_ADDREF_THIS(); 1.1331 + return NS_OK; 1.1332 + } 1.1333 + return NS_NOINTERFACE; 1.1334 +} 1.1335 + 1.1336 +NS_IMPL_ADDREF(FooBarImpl2) 1.1337 +NS_IMPL_RELEASE(FooBarImpl2) 1.1338 + 1.1339 +static void DoMultipleInheritenceTest2() 1.1340 +{ 1.1341 + FooBarImpl2* impl = new FooBarImpl2(); 1.1342 + if(!impl) 1.1343 + return; 1.1344 + 1.1345 + nsIFoo2* foo; 1.1346 + nsIBar2* bar; 1.1347 + 1.1348 + nsXPTCVariant var[1]; 1.1349 + 1.1350 + printf("\n"); 1.1351 + if(NS_SUCCEEDED(impl->QueryInterface(NS_GET_IID(nsIFoo), (void**)&foo)) && 1.1352 + NS_SUCCEEDED(impl->QueryInterface(NS_GET_IID(nsIBar), (void**)&bar))) 1.1353 + { 1.1354 + printf("impl == %p\n", static_cast<void*>(impl)); 1.1355 + printf("foo == %p\n", static_cast<void*>(foo)); 1.1356 + printf("bar == %p\n", static_cast<void*>(bar)); 1.1357 + 1.1358 + printf("Calling Foo...\n"); 1.1359 + printf("direct calls:\n"); 1.1360 + foo->FooMethod1(1); 1.1361 + foo->FooMethod2(2); 1.1362 + 1.1363 + printf("invoke calls:\n"); 1.1364 + var[0].val.i32 = 1; 1.1365 + var[0].type = nsXPTType::T_I32; 1.1366 + var[0].flags = 0; 1.1367 + NS_InvokeByIndex(foo, 3, 1, var); 1.1368 + 1.1369 + var[0].val.i32 = 2; 1.1370 + var[0].type = nsXPTType::T_I32; 1.1371 + var[0].flags = 0; 1.1372 + NS_InvokeByIndex(foo, 4, 1, var); 1.1373 + 1.1374 + printf("\n"); 1.1375 + 1.1376 + printf("Calling Bar...\n"); 1.1377 + printf("direct calls:\n"); 1.1378 + bar->BarMethod1(1); 1.1379 + bar->BarMethod2(2); 1.1380 + 1.1381 + printf("invoke calls:\n"); 1.1382 + var[0].val.i32 = 1; 1.1383 + var[0].type = nsXPTType::T_I32; 1.1384 + var[0].flags = 0; 1.1385 + NS_InvokeByIndex(bar, 3, 1, var); 1.1386 + 1.1387 + var[0].val.i32 = 2; 1.1388 + var[0].type = nsXPTType::T_I32; 1.1389 + var[0].flags = 0; 1.1390 + NS_InvokeByIndex(bar, 4, 1, var); 1.1391 + 1.1392 + printf("\n"); 1.1393 + 1.1394 + NS_RELEASE(foo); 1.1395 + NS_RELEASE(bar); 1.1396 + } 1.1397 + NS_RELEASE(impl); 1.1398 +} 1.1399 + 1.1400 +static void DoSpeedTest() 1.1401 +{ 1.1402 + InvokeTestTarget *test = new InvokeTestTarget(); 1.1403 + 1.1404 + nsXPTCVariant var[3]; 1.1405 + 1.1406 + var[0].val.i32 = 1; 1.1407 + var[0].type = nsXPTType::T_I32; 1.1408 + var[0].flags = 0; 1.1409 + 1.1410 + var[1].val.i32 = 1; 1.1411 + var[1].type = nsXPTType::T_I32; 1.1412 + var[1].flags = 0; 1.1413 + 1.1414 + var[2].val.i32 = 0; 1.1415 + var[2].type = nsXPTType::T_I32; 1.1416 + var[2].flags = nsXPTCVariant::PTR_IS_DATA; 1.1417 + var[2].ptr = &var[2].val.i32; 1.1418 + 1.1419 + int32_t in1 = 1; 1.1420 + int32_t in2 = 1; 1.1421 + int32_t out; 1.1422 + 1.1423 + // Crank this number down if your platform is slow :) 1.1424 + static const int count = 100000000; 1.1425 + int i; 1.1426 + PRIntervalTime start; 1.1427 + PRIntervalTime interval_direct; 1.1428 + PRIntervalTime interval_invoke; 1.1429 + 1.1430 + printf("Speed test...\n\n"); 1.1431 + printf("Doing %d direct call iterations...\n", count); 1.1432 + start = PR_IntervalNow(); 1.1433 + for(i = count; i; i--) 1.1434 + (void)test->AddTwoInts(in1, in2, &out); 1.1435 + interval_direct = PR_IntervalNow() - start; 1.1436 + 1.1437 + printf("Doing %d invoked call iterations...\n", count); 1.1438 + start = PR_IntervalNow(); 1.1439 + for(i = count; i; i--) 1.1440 + (void)NS_InvokeByIndex(test, 3, 3, var); 1.1441 + interval_invoke = PR_IntervalNow() - start; 1.1442 + 1.1443 + printf(" direct took %0.2f seconds\n", 1.1444 + (double)interval_direct/(double)PR_TicksPerSecond()); 1.1445 + printf(" invoke took %0.2f seconds\n", 1.1446 + (double)interval_invoke/(double)PR_TicksPerSecond()); 1.1447 + printf(" So, invoke overhead was ~ %0.2f seconds (~ %0.0f%%)\n", 1.1448 + (double)(interval_invoke-interval_direct)/(double)PR_TicksPerSecond(), 1.1449 + (double)(interval_invoke-interval_direct)/(double)interval_invoke*100); 1.1450 +}