|
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 /* Invoke tests xptcall. */ |
|
7 |
|
8 #include <stdio.h> |
|
9 #include "xptcall.h" |
|
10 #include "prinrval.h" |
|
11 #include "nsMemory.h" |
|
12 |
|
13 // Allows us to mark unused functions as known-unused |
|
14 #ifdef __GNUC__ |
|
15 #define UNUSED __attribute__ ((unused)) |
|
16 #else |
|
17 #define UNUSED |
|
18 #endif |
|
19 |
|
20 // forward declration |
|
21 static void DoMultipleInheritenceTest(); |
|
22 static void DoMultipleInheritenceTest2(); |
|
23 static void UNUSED DoSpeedTest(); |
|
24 |
|
25 // {AAC1FB90-E099-11d2-984E-006008962422} |
|
26 #define INVOKETESTTARGET_IID \ |
|
27 { 0xaac1fb90, 0xe099, 0x11d2, \ |
|
28 { 0x98, 0x4e, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } } |
|
29 |
|
30 |
|
31 class InvokeTestTargetInterface : public nsISupports |
|
32 { |
|
33 public: |
|
34 NS_DECLARE_STATIC_IID_ACCESSOR(INVOKETESTTARGET_IID) |
|
35 NS_IMETHOD AddTwoInts(int32_t p1, int32_t p2, int32_t* retval) = 0; |
|
36 NS_IMETHOD MultTwoInts(int32_t p1, int32_t p2, int32_t* retval) = 0; |
|
37 NS_IMETHOD AddTwoLLs(int64_t p1, int64_t p2, int64_t* retval) = 0; |
|
38 NS_IMETHOD MultTwoLLs(int64_t p1, int64_t p2, int64_t* retval) = 0; |
|
39 |
|
40 NS_IMETHOD AddManyInts(int32_t p1, int32_t p2, int32_t p3, int32_t p4, |
|
41 int32_t p5, int32_t p6, int32_t p7, int32_t p8, |
|
42 int32_t p9, int32_t p10, int32_t* retval) = 0; |
|
43 |
|
44 NS_IMETHOD AddTwoFloats(float p1, float p2, float* retval) = 0; |
|
45 |
|
46 NS_IMETHOD AddManyDoubles(double p1, double p2, double p3, double p4, |
|
47 double p5, double p6, double p7, double p8, |
|
48 double p9, double p10, double* retval) = 0; |
|
49 |
|
50 NS_IMETHOD AddManyFloats(float p1, float p2, float p3, float p4, |
|
51 float p5, float p6, float p7, float p8, |
|
52 float p9, float p10, float* retval) = 0; |
|
53 |
|
54 NS_IMETHOD AddManyManyFloats(float p1, float p2, float p3, float p4, |
|
55 float p5, float p6, float p7, float p8, |
|
56 float p9, float p10, float p11, float p12, |
|
57 float p13, float p14, float p15, float p16, |
|
58 float p17, float p18, float p19, float p20, |
|
59 float *retval) = 0; |
|
60 |
|
61 NS_IMETHOD AddMixedInts(int64_t p1, int32_t p2, int64_t p3, int32_t p4, |
|
62 int32_t p5, int64_t p6, int32_t p7, int32_t p8, |
|
63 int64_t p9, int32_t p10, int64_t* retval) = 0; |
|
64 |
|
65 NS_IMETHOD AddMixedInts2(int32_t p1, int64_t p2, int32_t p3, int64_t p4, |
|
66 int64_t p5, int32_t p6, int64_t p7, int64_t p8, |
|
67 int32_t p9, int64_t p10, int64_t* retval) = 0; |
|
68 |
|
69 NS_IMETHOD AddMixedFloats(float p1, float p2, double p3, double p4, |
|
70 float p5, float p6, double p7, double p8, |
|
71 float p9, double p10, float p11, |
|
72 double *retval) = 0; |
|
73 |
|
74 NS_IMETHOD PassTwoStrings(const char* s1, const char* s2, char** retval) = 0; |
|
75 |
|
76 NS_IMETHOD AddMixedInts3(int64_t p1, int64_t p2, int32_t p3, int64_t p4, |
|
77 int32_t p5, int32_t p6, int64_t p7, int64_t p8, |
|
78 int32_t p9, int64_t p10, int64_t* retval) = 0; |
|
79 NS_IMETHOD ShouldFail(int32_t p) = 0; |
|
80 }; |
|
81 |
|
82 NS_DEFINE_STATIC_IID_ACCESSOR(InvokeTestTargetInterface, INVOKETESTTARGET_IID) |
|
83 |
|
84 class InvokeTestTarget : public InvokeTestTargetInterface |
|
85 { |
|
86 public: |
|
87 NS_DECL_ISUPPORTS |
|
88 NS_IMETHOD AddTwoInts(int32_t p1, int32_t p2, int32_t* retval); |
|
89 NS_IMETHOD MultTwoInts(int32_t p1, int32_t p2, int32_t* retval); |
|
90 NS_IMETHOD AddTwoLLs(int64_t p1, int64_t p2, int64_t* retval); |
|
91 NS_IMETHOD MultTwoLLs(int64_t p1, int64_t p2, int64_t* retval); |
|
92 |
|
93 NS_IMETHOD AddManyInts(int32_t p1, int32_t p2, int32_t p3, int32_t p4, |
|
94 int32_t p5, int32_t p6, int32_t p7, int32_t p8, |
|
95 int32_t p9, int32_t p10, int32_t* retval); |
|
96 |
|
97 NS_IMETHOD AddTwoFloats(float p1, float p2, float* retval); |
|
98 |
|
99 NS_IMETHOD AddManyDoubles(double p1, double p2, double p3, double p4, |
|
100 double p5, double p6, double p7, double p8, |
|
101 double p9, double p10, double* retval); |
|
102 |
|
103 NS_IMETHOD AddManyFloats(float p1, float p2, float p3, float p4, |
|
104 float p5, float p6, float p7, float p8, |
|
105 float p9, float p10, float* retval); |
|
106 |
|
107 NS_IMETHOD AddMixedInts(int64_t p1, int32_t p2, int64_t p3, int32_t p4, |
|
108 int32_t p5, int64_t p6, int32_t p7, int32_t p8, |
|
109 int64_t p9, int32_t p10, int64_t* retval); |
|
110 |
|
111 NS_IMETHOD AddMixedInts2(int32_t p1, int64_t p2, int32_t p3, int64_t p4, |
|
112 int64_t p5, int32_t p6, int64_t p7, int64_t p8, |
|
113 int32_t p9, int64_t p10, int64_t* retval); |
|
114 |
|
115 NS_IMETHOD AddMixedFloats(float p1, float p2, double p3, double p4, |
|
116 float p5, float p6, double p7, double p8, |
|
117 float p9, double p10, float p11, |
|
118 double *retval); |
|
119 |
|
120 NS_IMETHOD AddManyManyFloats(float p1, float p2, float p3, float p4, |
|
121 float p5, float p6, float p7, float p8, |
|
122 float p9, float p10, float p11, float p12, |
|
123 float p13, float p14, float p15, float p16, |
|
124 float p17, float p18, float p19, float p20, |
|
125 float *retval); |
|
126 |
|
127 NS_IMETHOD PassTwoStrings(const char* s1, const char* s2, char** retval); |
|
128 |
|
129 InvokeTestTarget(); |
|
130 |
|
131 NS_IMETHOD AddMixedInts3(int64_t p1, int64_t p2, int32_t p3, int64_t p4, |
|
132 int32_t p5, int32_t p6, int64_t p7, int64_t p8, |
|
133 int32_t p9, int64_t p10, int64_t* retval); |
|
134 NS_IMETHOD ShouldFail(int32_t p); |
|
135 }; |
|
136 |
|
137 NS_IMPL_ISUPPORTS(InvokeTestTarget, InvokeTestTargetInterface) |
|
138 |
|
139 InvokeTestTarget::InvokeTestTarget() |
|
140 { |
|
141 NS_ADDREF_THIS(); |
|
142 } |
|
143 |
|
144 NS_IMETHODIMP |
|
145 InvokeTestTarget::ShouldFail(int32_t p) { |
|
146 return NS_ERROR_NULL_POINTER; |
|
147 } |
|
148 NS_IMETHODIMP |
|
149 InvokeTestTarget::AddTwoInts(int32_t p1, int32_t p2, int32_t* retval) |
|
150 { |
|
151 *retval = p1 + p2; |
|
152 return NS_OK; |
|
153 } |
|
154 |
|
155 NS_IMETHODIMP |
|
156 InvokeTestTarget::MultTwoInts(int32_t p1, int32_t p2, int32_t* retval) |
|
157 { |
|
158 *retval = p1 * p2; |
|
159 return NS_OK; |
|
160 } |
|
161 |
|
162 NS_IMETHODIMP |
|
163 InvokeTestTarget::AddTwoLLs(int64_t p1, int64_t p2, int64_t* retval) |
|
164 { |
|
165 *retval = p1 + p2; |
|
166 return NS_OK; |
|
167 } |
|
168 |
|
169 NS_IMETHODIMP |
|
170 InvokeTestTarget::MultTwoLLs(int64_t p1, int64_t p2, int64_t* retval) |
|
171 { |
|
172 *retval = p1 * p2; |
|
173 return NS_OK; |
|
174 } |
|
175 |
|
176 NS_IMETHODIMP |
|
177 InvokeTestTarget::AddManyInts(int32_t p1, int32_t p2, int32_t p3, int32_t p4, |
|
178 int32_t p5, int32_t p6, int32_t p7, int32_t p8, |
|
179 int32_t p9, int32_t p10, int32_t* retval) |
|
180 { |
|
181 #ifdef DEBUG_TESTINVOKE |
|
182 printf("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n", |
|
183 p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); |
|
184 #endif |
|
185 *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; |
|
186 return NS_OK; |
|
187 } |
|
188 |
|
189 NS_IMETHODIMP |
|
190 InvokeTestTarget::AddTwoFloats(float p1, float p2, float *retval) |
|
191 { |
|
192 #ifdef DEBUG_TESTINVOKE |
|
193 printf("%f, %f\n", p1, p2); |
|
194 #endif |
|
195 *retval = p1 + p2; |
|
196 return NS_OK; |
|
197 } |
|
198 |
|
199 NS_IMETHODIMP |
|
200 InvokeTestTarget::AddManyDoubles(double p1, double p2, double p3, double p4, |
|
201 double p5, double p6, double p7, double p8, |
|
202 double p9, double p10, double* retval) |
|
203 { |
|
204 #ifdef DEBUG_TESTINVOKE |
|
205 printf("%lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf\n", |
|
206 p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); |
|
207 #endif |
|
208 *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; |
|
209 return NS_OK; |
|
210 } |
|
211 |
|
212 NS_IMETHODIMP |
|
213 InvokeTestTarget::AddManyFloats(float p1, float p2, float p3, float p4, |
|
214 float p5, float p6, float p7, float p8, |
|
215 float p9, float p10, float* retval) |
|
216 { |
|
217 #ifdef DEBUG_TESTINVOKE |
|
218 printf("%f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n", |
|
219 p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); |
|
220 #endif |
|
221 *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; |
|
222 return NS_OK; |
|
223 } |
|
224 |
|
225 NS_IMETHODIMP |
|
226 InvokeTestTarget::AddMixedFloats(float p1, float p2, double p3, double p4, |
|
227 float p5, float p6, double p7, double p8, |
|
228 float p9, double p10, float p11, |
|
229 double *retval) |
|
230 { |
|
231 #ifdef DEBUG_TESTINVOKE |
|
232 printf("%f, %f, %lf, %lf, %f, %f, %lf, %lf, %f, %lf, %f\n", |
|
233 p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); |
|
234 #endif |
|
235 *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10 + p11; |
|
236 return NS_OK; |
|
237 } |
|
238 |
|
239 NS_IMETHODIMP |
|
240 InvokeTestTarget::AddManyManyFloats(float p1, float p2, float p3, float p4, |
|
241 float p5, float p6, float p7, float p8, |
|
242 float p9, float p10, float p11, float p12, |
|
243 float p13, float p14, float p15, float p16, |
|
244 float p17, float p18, float p19, float p20, |
|
245 float *retval) |
|
246 { |
|
247 #ifdef DEBUG_TESTINVOKE |
|
248 printf("%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, " |
|
249 "%f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n", |
|
250 p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, |
|
251 p11, p12, p13, p14, p15, p16, p17, p18, p19, p20); |
|
252 #endif |
|
253 *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10 + |
|
254 p11 + p12 + p13 + p14 + p15 + p16 + p17 + p18 + p19 + p20; |
|
255 return NS_OK; |
|
256 } |
|
257 |
|
258 NS_IMETHODIMP |
|
259 InvokeTestTarget::AddMixedInts(int64_t p1, int32_t p2, int64_t p3, int32_t p4, |
|
260 int32_t p5, int64_t p6, int32_t p7, int32_t p8, |
|
261 int64_t p9, int32_t p10, int64_t* retval) |
|
262 { |
|
263 *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; |
|
264 return NS_OK; |
|
265 } |
|
266 |
|
267 NS_IMETHODIMP |
|
268 InvokeTestTarget::AddMixedInts2(int32_t p1, int64_t p2, int32_t p3, int64_t p4, |
|
269 int64_t p5, int32_t p6, int64_t p7, int64_t p8, |
|
270 int32_t p9, int64_t p10, int64_t* retval) |
|
271 { |
|
272 *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; |
|
273 return NS_OK; |
|
274 } |
|
275 |
|
276 NS_IMETHODIMP |
|
277 InvokeTestTarget::AddMixedInts3(int64_t p1, int64_t p2, int32_t p3, int64_t p4, |
|
278 int32_t p5, int32_t p6, int64_t p7, int64_t p8, |
|
279 int32_t p9, int64_t p10, int64_t* retval) |
|
280 { |
|
281 printf("P1 : %lld\n", p1); |
|
282 printf("P2 : %lld\n", p2); |
|
283 printf("P3 : %d\n", p3); |
|
284 printf("P4 : %lld\n", p4); |
|
285 printf("P5 : %d\n", p5); |
|
286 printf("P6 : %d\n", p6); |
|
287 printf("P7 : %lld\n", p7); |
|
288 printf("P8 : %lld\n", p8); |
|
289 printf("P9 : %d\n", p9); |
|
290 printf("P10: %lld\n", p10); |
|
291 printf("ret: %p\n", static_cast<void*>(retval)); |
|
292 *retval = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9 + p10; |
|
293 return NS_OK; |
|
294 } |
|
295 |
|
296 NS_IMETHODIMP |
|
297 InvokeTestTarget::PassTwoStrings(const char* s1, const char* s2, char** retval) |
|
298 { |
|
299 const char milk[] = "milk"; |
|
300 char *ret = (char*)nsMemory::Alloc(sizeof(milk)); |
|
301 if (!ret) |
|
302 return NS_ERROR_OUT_OF_MEMORY; |
|
303 strncpy(ret, milk, sizeof(milk)); |
|
304 printf("\t%s %s", s1, s2); |
|
305 *retval = ret; |
|
306 return NS_OK; |
|
307 } |
|
308 |
|
309 int main() |
|
310 { |
|
311 InvokeTestTarget *test = new InvokeTestTarget(); |
|
312 |
|
313 /* here we make the global 'check for alloc failure' checker happy */ |
|
314 if(!test) |
|
315 return 1; |
|
316 |
|
317 int32_t out, tmp32 = 0; |
|
318 int64_t out64; |
|
319 nsresult failed_rv; |
|
320 printf("calling direct:\n"); |
|
321 if(NS_SUCCEEDED(test->AddTwoInts(1,1,&out))) |
|
322 printf("\t1 + 1 = %d\n", out); |
|
323 else |
|
324 printf("\tFAILED"); |
|
325 int64_t one = 1, two = 2; |
|
326 if(NS_SUCCEEDED(test->AddTwoLLs(one,one,&out64))) |
|
327 { |
|
328 tmp32 = (int)out64; |
|
329 printf("\t1L + 1L = %d\n", tmp32); |
|
330 } |
|
331 else |
|
332 printf("\tFAILED"); |
|
333 if(NS_SUCCEEDED(test->MultTwoInts(2,2,&out))) |
|
334 printf("\t2 * 2 = %d\n", out); |
|
335 else |
|
336 printf("\tFAILED"); |
|
337 if(NS_SUCCEEDED(test->MultTwoLLs(two,two,&out64))) |
|
338 { |
|
339 tmp32 = (int)out64; |
|
340 printf("\t2L * 2L = %d\n", tmp32); |
|
341 } |
|
342 else |
|
343 printf("\tFAILED"); |
|
344 |
|
345 double outD; |
|
346 float outF; |
|
347 int32_t outI; |
|
348 char *outS; |
|
349 |
|
350 if(NS_SUCCEEDED(test->AddManyInts(1,2,3,4,5,6,7,8,9,10,&outI))) |
|
351 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", outI); |
|
352 else |
|
353 printf("\tFAILED"); |
|
354 |
|
355 if(NS_SUCCEEDED(test->AddTwoFloats(1,2,&outF))) |
|
356 printf("\t1 + 2 = %ff\n", (double)outF); |
|
357 else |
|
358 printf("\tFAILED"); |
|
359 |
|
360 if(NS_SUCCEEDED(test->AddManyDoubles(1,2,3,4,5,6,7,8,9,10,&outD))) |
|
361 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %f\n", outD); |
|
362 else |
|
363 printf("\tFAILED"); |
|
364 |
|
365 if(NS_SUCCEEDED(test->AddManyFloats(1,2,3,4,5,6,7,8,9,10,&outF))) |
|
366 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %ff\n", (double)outF); |
|
367 else |
|
368 printf("\tFAILED"); |
|
369 |
|
370 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))) |
|
371 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); |
|
372 else |
|
373 printf("\tFAILED"); |
|
374 |
|
375 if(NS_SUCCEEDED(test->AddMixedInts(1,2,3,4,5,6,7,8,9,10,&out64))) |
|
376 { |
|
377 tmp32 = (int)out64; |
|
378 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", tmp32); |
|
379 } |
|
380 else |
|
381 printf("\tFAILED"); |
|
382 |
|
383 if(NS_SUCCEEDED(test->AddMixedInts2(1,2,3,4,5,6,7,8,9,10,&out64))) |
|
384 { |
|
385 tmp32 = (int)out64; |
|
386 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", tmp32); |
|
387 } |
|
388 else |
|
389 printf("\tFAILED"); |
|
390 |
|
391 if(NS_SUCCEEDED(test->AddMixedInts3(3,5,7,11,13,17,19,23,29,31,&out64))) |
|
392 { |
|
393 tmp32 = (int)out64; |
|
394 printf("\t3 + 5 + 7 + 11 + 13 + 17 + 19 + 23 + 29 + 31 = %d\n", tmp32); |
|
395 } |
|
396 else |
|
397 printf("\tFAILED"); |
|
398 |
|
399 if(NS_SUCCEEDED(test->AddMixedFloats(1,2,3,4,5,6,7,8,9,10,11,&outD))) |
|
400 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 = %f\n", (double)outD); |
|
401 else |
|
402 printf("\tFAILED"); |
|
403 |
|
404 if (NS_SUCCEEDED(test->PassTwoStrings("moo","cow",&outS))) { |
|
405 printf(" = %s\n", outS); |
|
406 nsMemory::Free(outS); |
|
407 } else |
|
408 printf("\tFAILED"); |
|
409 |
|
410 failed_rv = test->ShouldFail(5); |
|
411 printf("should fail %s, returned %x\n", failed_rv == NS_ERROR_NULL_POINTER ? "failed" :"passed", failed_rv); |
|
412 |
|
413 printf("calling via invoke:\n"); |
|
414 |
|
415 nsXPTCVariant var[21]; |
|
416 |
|
417 var[0].val.i32 = 1; |
|
418 var[0].type = nsXPTType::T_I32; |
|
419 var[0].flags = 0; |
|
420 |
|
421 var[1].val.i32 = 1; |
|
422 var[1].type = nsXPTType::T_I32; |
|
423 var[1].flags = 0; |
|
424 |
|
425 var[2].val.i32 = 0; |
|
426 var[2].type = nsXPTType::T_I32; |
|
427 var[2].flags = nsXPTCVariant::PTR_IS_DATA; |
|
428 var[2].ptr = &var[2].val.i32; |
|
429 |
|
430 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 3, 3, var))) |
|
431 printf("\t1 + 1 = %d\n", var[2].val.i32); |
|
432 else |
|
433 printf("\tFAILED"); |
|
434 |
|
435 var[0].val.i64 = 1; |
|
436 var[0].type = nsXPTType::T_I64; |
|
437 var[0].flags = 0; |
|
438 |
|
439 var[1].val.i64 = 1; |
|
440 var[1].type = nsXPTType::T_I64; |
|
441 var[1].flags = 0; |
|
442 |
|
443 var[2].val.i64 = 0; |
|
444 var[2].type = nsXPTType::T_I64; |
|
445 var[2].flags = nsXPTCVariant::PTR_IS_DATA; |
|
446 var[2].ptr = &var[2].val.i64; |
|
447 |
|
448 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 5, 3, var))) |
|
449 printf("\t1L + 1L = %d\n", (int)var[2].val.i64); |
|
450 else |
|
451 printf("\tFAILED"); |
|
452 |
|
453 var[0].val.i32 = 2; |
|
454 var[0].type = nsXPTType::T_I32; |
|
455 var[0].flags = 0; |
|
456 |
|
457 var[1].val.i32 = 2; |
|
458 var[1].type = nsXPTType::T_I32; |
|
459 var[1].flags = 0; |
|
460 |
|
461 var[2].val.i32 = 0; |
|
462 var[2].type = nsXPTType::T_I32; |
|
463 var[2].flags = nsXPTCVariant::PTR_IS_DATA; |
|
464 var[2].ptr = &var[2].val.i32; |
|
465 |
|
466 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 4, 3, var))) |
|
467 printf("\t2 * 2 = %d\n", var[2].val.i32); |
|
468 else |
|
469 printf("\tFAILED"); |
|
470 |
|
471 var[0].val.i64 = 2; |
|
472 var[0].type = nsXPTType::T_I64; |
|
473 var[0].flags = 0; |
|
474 |
|
475 var[1].val.i64 = 2; |
|
476 var[1].type = nsXPTType::T_I64; |
|
477 var[1].flags = 0; |
|
478 |
|
479 var[2].val.i64 = 0; |
|
480 var[2].type = nsXPTType::T_I64; |
|
481 var[2].flags = nsXPTCVariant::PTR_IS_DATA; |
|
482 var[2].ptr = &var[2].val.i64; |
|
483 |
|
484 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 6, 3, var))) |
|
485 printf("\t2L * 2L = %d\n", (int)var[2].val.i64); |
|
486 else |
|
487 printf("\tFAILED"); |
|
488 |
|
489 var[0].val.i32 = 1; |
|
490 var[0].type = nsXPTType::T_I32; |
|
491 var[0].flags = 0; |
|
492 |
|
493 var[1].val.i32 = 2; |
|
494 var[1].type = nsXPTType::T_I32; |
|
495 var[1].flags = 0; |
|
496 |
|
497 var[2].val.i32 = 3; |
|
498 var[2].type = nsXPTType::T_I32; |
|
499 var[2].flags = 0; |
|
500 |
|
501 var[3].val.i32 = 4; |
|
502 var[3].type = nsXPTType::T_I32; |
|
503 var[3].flags = 0; |
|
504 |
|
505 var[4].val.i32 = 5; |
|
506 var[4].type = nsXPTType::T_I32; |
|
507 var[4].flags = 0; |
|
508 |
|
509 var[5].val.i32 = 6; |
|
510 var[5].type = nsXPTType::T_I32; |
|
511 var[5].flags = 0; |
|
512 |
|
513 var[6].val.i32 = 7; |
|
514 var[6].type = nsXPTType::T_I32; |
|
515 var[6].flags = 0; |
|
516 |
|
517 var[7].val.i32 = 8; |
|
518 var[7].type = nsXPTType::T_I32; |
|
519 var[7].flags = 0; |
|
520 |
|
521 var[8].val.i32 = 9; |
|
522 var[8].type = nsXPTType::T_I32; |
|
523 var[8].flags = 0; |
|
524 |
|
525 var[9].val.i32 = 10; |
|
526 var[9].type = nsXPTType::T_I32; |
|
527 var[9].flags = 0; |
|
528 |
|
529 var[10].val.i32 = 0; |
|
530 var[10].type = nsXPTType::T_I32; |
|
531 var[10].flags = nsXPTCVariant::PTR_IS_DATA; |
|
532 var[10].ptr = &var[10].val.i32; |
|
533 |
|
534 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 7, 11, var))) |
|
535 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", |
|
536 var[10].val.i32); |
|
537 |
|
538 var[0].val.f = 1.0f; |
|
539 var[0].type = nsXPTType::T_FLOAT; |
|
540 var[0].flags = 0; |
|
541 |
|
542 var[1].val.f = 2.0f; |
|
543 var[1].type = nsXPTType::T_FLOAT; |
|
544 var[1].flags = 0; |
|
545 |
|
546 var[2].val.f = 0.0f; |
|
547 var[2].type = nsXPTType::T_FLOAT; |
|
548 var[2].flags = nsXPTCVariant::PTR_IS_DATA; |
|
549 var[2].ptr = &var[2].val.f; |
|
550 |
|
551 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 8, 3, var))) |
|
552 printf("\t1 + 2 = %ff\n", |
|
553 (double) var[2].val.f); |
|
554 |
|
555 |
|
556 var[0].val.d = 1.0; |
|
557 var[0].type = nsXPTType::T_DOUBLE; |
|
558 var[0].flags = 0; |
|
559 |
|
560 var[1].val.d = 2.0; |
|
561 var[1].type = nsXPTType::T_DOUBLE; |
|
562 var[1].flags = 0; |
|
563 |
|
564 var[2].val.d = 3.0; |
|
565 var[2].type = nsXPTType::T_DOUBLE; |
|
566 var[2].flags = 0; |
|
567 |
|
568 var[3].val.d = 4.0; |
|
569 var[3].type = nsXPTType::T_DOUBLE; |
|
570 var[3].flags = 0; |
|
571 |
|
572 var[4].val.d = 5.0; |
|
573 var[4].type = nsXPTType::T_DOUBLE; |
|
574 var[4].flags = 0; |
|
575 |
|
576 var[5].val.d = 6.0; |
|
577 var[5].type = nsXPTType::T_DOUBLE; |
|
578 var[5].flags = 0; |
|
579 |
|
580 var[6].val.d = 7.0; |
|
581 var[6].type = nsXPTType::T_DOUBLE; |
|
582 var[6].flags = 0; |
|
583 |
|
584 var[7].val.d = 8.0; |
|
585 var[7].type = nsXPTType::T_DOUBLE; |
|
586 var[7].flags = 0; |
|
587 |
|
588 var[8].val.d = 9.0; |
|
589 var[8].type = nsXPTType::T_DOUBLE; |
|
590 var[8].flags = 0; |
|
591 |
|
592 var[9].val.d = 10.0; |
|
593 var[9].type = nsXPTType::T_DOUBLE; |
|
594 var[9].flags = 0; |
|
595 |
|
596 var[10].val.d = 0.0; |
|
597 var[10].type = nsXPTType::T_DOUBLE; |
|
598 var[10].flags = nsXPTCVariant::PTR_IS_DATA; |
|
599 var[10].ptr = &var[10].val.d; |
|
600 |
|
601 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 9, 11, var))) |
|
602 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %f\n", |
|
603 var[10].val.d); |
|
604 else |
|
605 printf("\tFAILED"); |
|
606 |
|
607 var[0].val.f = 1.0f; |
|
608 var[0].type = nsXPTType::T_FLOAT; |
|
609 var[0].flags = 0; |
|
610 |
|
611 var[1].val.f = 2.0f; |
|
612 var[1].type = nsXPTType::T_FLOAT; |
|
613 var[1].flags = 0; |
|
614 |
|
615 var[2].val.f = 3.0f; |
|
616 var[2].type = nsXPTType::T_FLOAT; |
|
617 var[2].flags = 0; |
|
618 |
|
619 var[3].val.f = 4.0f; |
|
620 var[3].type = nsXPTType::T_FLOAT; |
|
621 var[3].flags = 0; |
|
622 |
|
623 var[4].val.f = 5.0f; |
|
624 var[4].type = nsXPTType::T_FLOAT; |
|
625 var[4].flags = 0; |
|
626 |
|
627 var[5].val.f = 6.0f; |
|
628 var[5].type = nsXPTType::T_FLOAT; |
|
629 var[5].flags = 0; |
|
630 |
|
631 var[6].val.f = 7.0f; |
|
632 var[6].type = nsXPTType::T_FLOAT; |
|
633 var[6].flags = 0; |
|
634 |
|
635 var[7].val.f = 8.0f; |
|
636 var[7].type = nsXPTType::T_FLOAT; |
|
637 var[7].flags = 0; |
|
638 |
|
639 var[8].val.f = 9.0f; |
|
640 var[8].type = nsXPTType::T_FLOAT; |
|
641 var[8].flags = 0; |
|
642 |
|
643 var[9].val.f = 10.0f; |
|
644 var[9].type = nsXPTType::T_FLOAT; |
|
645 var[9].flags = 0; |
|
646 |
|
647 var[10].val.f = 0.0f; |
|
648 var[10].type = nsXPTType::T_FLOAT; |
|
649 var[10].flags = nsXPTCVariant::PTR_IS_DATA; |
|
650 var[10].ptr = &var[10].val.f; |
|
651 |
|
652 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 10, 11, var))) |
|
653 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %ff\n", |
|
654 (double) var[10].val.f); |
|
655 else |
|
656 printf("\tFAILED"); |
|
657 |
|
658 var[0].val.f = 1.0f; |
|
659 var[0].type = nsXPTType::T_FLOAT; |
|
660 var[0].flags = 0; |
|
661 |
|
662 var[1].val.f = 2.0f; |
|
663 var[1].type = nsXPTType::T_FLOAT; |
|
664 var[1].flags = 0; |
|
665 |
|
666 var[2].val.f = 3.0f; |
|
667 var[2].type = nsXPTType::T_FLOAT; |
|
668 var[2].flags = 0; |
|
669 |
|
670 var[3].val.f = 4.0f; |
|
671 var[3].type = nsXPTType::T_FLOAT; |
|
672 var[3].flags = 0; |
|
673 |
|
674 var[4].val.f = 5.0f; |
|
675 var[4].type = nsXPTType::T_FLOAT; |
|
676 var[4].flags = 0; |
|
677 |
|
678 var[5].val.f = 6.0f; |
|
679 var[5].type = nsXPTType::T_FLOAT; |
|
680 var[5].flags = 0; |
|
681 |
|
682 var[6].val.f = 7.0f; |
|
683 var[6].type = nsXPTType::T_FLOAT; |
|
684 var[6].flags = 0; |
|
685 |
|
686 var[7].val.f = 8.0f; |
|
687 var[7].type = nsXPTType::T_FLOAT; |
|
688 var[7].flags = 0; |
|
689 |
|
690 var[8].val.f = 9.0f; |
|
691 var[8].type = nsXPTType::T_FLOAT; |
|
692 var[8].flags = 0; |
|
693 |
|
694 var[9].val.f = 10.0f; |
|
695 var[9].type = nsXPTType::T_FLOAT; |
|
696 var[9].flags = 0; |
|
697 |
|
698 var[10].val.f = 11.0f; |
|
699 var[10].type = nsXPTType::T_FLOAT; |
|
700 var[10].flags = 0; |
|
701 |
|
702 var[11].val.f = 12.0f; |
|
703 var[11].type = nsXPTType::T_FLOAT; |
|
704 var[11].flags = 0; |
|
705 |
|
706 var[12].val.f = 13.0f; |
|
707 var[12].type = nsXPTType::T_FLOAT; |
|
708 var[12].flags = 0; |
|
709 |
|
710 var[13].val.f = 14.0f; |
|
711 var[13].type = nsXPTType::T_FLOAT; |
|
712 var[13].flags = 0; |
|
713 |
|
714 var[14].val.f = 15.0f; |
|
715 var[14].type = nsXPTType::T_FLOAT; |
|
716 var[14].flags = 0; |
|
717 |
|
718 var[15].val.f = 16.0f; |
|
719 var[15].type = nsXPTType::T_FLOAT; |
|
720 var[15].flags = 0; |
|
721 |
|
722 var[16].val.f = 17.0f; |
|
723 var[16].type = nsXPTType::T_FLOAT; |
|
724 var[16].flags = 0; |
|
725 |
|
726 var[17].val.f = 18.0f; |
|
727 var[17].type = nsXPTType::T_FLOAT; |
|
728 var[17].flags = 0; |
|
729 |
|
730 var[18].val.f = 19.0f; |
|
731 var[18].type = nsXPTType::T_FLOAT; |
|
732 var[18].flags = 0; |
|
733 |
|
734 var[19].val.f = 20.0f; |
|
735 var[19].type = nsXPTType::T_FLOAT; |
|
736 var[19].flags = 0; |
|
737 |
|
738 var[20].val.f = 0.0f; |
|
739 var[20].type = nsXPTType::T_FLOAT; |
|
740 var[20].flags = nsXPTCVariant::PTR_IS_DATA; |
|
741 var[20].ptr = &var[20].val.f; |
|
742 |
|
743 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 11, 21, var))) |
|
744 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 = %ff\n", |
|
745 (double) var[20].val.f); |
|
746 |
|
747 var[0].val.i64 = 1; |
|
748 var[0].type = nsXPTType::T_I64; |
|
749 var[0].flags = 0; |
|
750 |
|
751 var[1].val.i32 = 2; |
|
752 var[1].type = nsXPTType::T_I32; |
|
753 var[1].flags = 0; |
|
754 |
|
755 var[2].val.i64 = 3; |
|
756 var[2].type = nsXPTType::T_I64; |
|
757 var[2].flags = 0; |
|
758 |
|
759 var[3].val.i32 = 4; |
|
760 var[3].type = nsXPTType::T_I32; |
|
761 var[3].flags = 0; |
|
762 |
|
763 var[4].val.i32 = 5; |
|
764 var[4].type = nsXPTType::T_I32; |
|
765 var[4].flags = 0; |
|
766 |
|
767 var[5].val.i64 = 6; |
|
768 var[5].type = nsXPTType::T_I64; |
|
769 var[5].flags = 0; |
|
770 |
|
771 var[6].val.i32 = 7; |
|
772 var[6].type = nsXPTType::T_I32; |
|
773 var[6].flags = 0; |
|
774 |
|
775 var[7].val.i32 = 8; |
|
776 var[7].type = nsXPTType::T_I32; |
|
777 var[7].flags = 0; |
|
778 |
|
779 var[8].val.i64 = 9; |
|
780 var[8].type = nsXPTType::T_I64; |
|
781 var[8].flags = 0; |
|
782 |
|
783 var[9].val.i32 = 10; |
|
784 var[9].type = nsXPTType::T_I32; |
|
785 var[9].flags = 0; |
|
786 |
|
787 var[10].val.i64 = 0; |
|
788 var[10].type = nsXPTType::T_I64; |
|
789 var[10].flags = nsXPTCVariant::PTR_IS_DATA; |
|
790 var[10].ptr = &var[10].val.i64; |
|
791 |
|
792 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 12, 11, var))) |
|
793 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", |
|
794 (int)var[10].val.i64); |
|
795 else |
|
796 printf("\tFAILED"); |
|
797 |
|
798 var[0].val.i32 = 1; |
|
799 var[0].type = nsXPTType::T_I32; |
|
800 var[0].flags = 0; |
|
801 |
|
802 var[1].val.i64 = 2; |
|
803 var[1].type = nsXPTType::T_I64; |
|
804 var[1].flags = 0; |
|
805 |
|
806 var[2].val.i32 = 3; |
|
807 var[2].type = nsXPTType::T_I32; |
|
808 var[2].flags = 0; |
|
809 |
|
810 var[3].val.i64 = 4; |
|
811 var[3].type = nsXPTType::T_I64; |
|
812 var[3].flags = 0; |
|
813 |
|
814 var[4].val.i64 = 5; |
|
815 var[4].type = nsXPTType::T_I64; |
|
816 var[4].flags = 0; |
|
817 |
|
818 var[5].val.i32 = 6; |
|
819 var[5].type = nsXPTType::T_I32; |
|
820 var[5].flags = 0; |
|
821 |
|
822 var[6].val.i64 = 7; |
|
823 var[6].type = nsXPTType::T_I64; |
|
824 var[6].flags = 0; |
|
825 |
|
826 var[7].val.i64 = 8; |
|
827 var[7].type = nsXPTType::T_I64; |
|
828 var[7].flags = 0; |
|
829 |
|
830 var[8].val.i32 = 9; |
|
831 var[8].type = nsXPTType::T_I32; |
|
832 var[8].flags = 0; |
|
833 |
|
834 var[9].val.i64 = 10; |
|
835 var[9].type = nsXPTType::T_I64; |
|
836 var[9].flags = 0; |
|
837 |
|
838 var[10].val.i64 = 0; |
|
839 var[10].type = nsXPTType::T_I64; |
|
840 var[10].flags = nsXPTCVariant::PTR_IS_DATA; |
|
841 var[10].ptr = &var[10].val.i64; |
|
842 |
|
843 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 13, 11, var))) |
|
844 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = %d\n", |
|
845 (int)var[10].val.i64); |
|
846 else |
|
847 printf("\tFAILED"); |
|
848 |
|
849 var[0].val.f = 1.0f; |
|
850 var[0].type = nsXPTType::T_FLOAT; |
|
851 var[0].flags = 0; |
|
852 |
|
853 var[1].val.f = 2.0f; |
|
854 var[1].type = nsXPTType::T_FLOAT; |
|
855 var[1].flags = 0; |
|
856 |
|
857 var[2].val.d = 3.0; |
|
858 var[2].type = nsXPTType::T_DOUBLE; |
|
859 var[2].flags = 0; |
|
860 |
|
861 var[3].val.d = 4.0; |
|
862 var[3].type = nsXPTType::T_DOUBLE; |
|
863 var[3].flags = 0; |
|
864 |
|
865 var[4].val.f = 5.0f; |
|
866 var[4].type = nsXPTType::T_FLOAT; |
|
867 var[4].flags = 0; |
|
868 |
|
869 var[5].val.f = 6.0f; |
|
870 var[5].type = nsXPTType::T_FLOAT; |
|
871 var[5].flags = 0; |
|
872 |
|
873 var[6].val.d = 7.0; |
|
874 var[6].type = nsXPTType::T_DOUBLE; |
|
875 var[6].flags = 0; |
|
876 |
|
877 var[7].val.d = 8.0; |
|
878 var[7].type = nsXPTType::T_DOUBLE; |
|
879 var[7].flags = 0; |
|
880 |
|
881 var[8].val.f = 9.0f; |
|
882 var[8].type = nsXPTType::T_FLOAT; |
|
883 var[8].flags = 0; |
|
884 |
|
885 var[9].val.d = 10.0; |
|
886 var[9].type = nsXPTType::T_DOUBLE; |
|
887 var[9].flags = 0; |
|
888 |
|
889 var[10].val.f = 11.0f; |
|
890 var[10].type = nsXPTType::T_FLOAT; |
|
891 var[10].flags = 0; |
|
892 |
|
893 var[11].val.d = 0.0; |
|
894 var[11].type = nsXPTType::T_DOUBLE; |
|
895 var[11].flags = nsXPTCVariant::PTR_IS_DATA; |
|
896 var[11].ptr = &var[11].val.d; |
|
897 |
|
898 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 14, 12, var))) |
|
899 printf("\t1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 = %f\n", |
|
900 var[11].val.d); |
|
901 else |
|
902 printf("\tFAILED"); |
|
903 |
|
904 var[0].val.p = (void*)"moo"; |
|
905 var[0].type = nsXPTType::T_CHAR_STR; |
|
906 var[0].flags = 0; |
|
907 |
|
908 var[1].val.p = (void*)"cow"; |
|
909 var[1].type = nsXPTType::T_CHAR_STR; |
|
910 var[1].flags = 0; |
|
911 |
|
912 var[2].val.p = 0; |
|
913 var[2].type = nsXPTType::T_CHAR_STR; |
|
914 var[2].flags = nsXPTCVariant::PTR_IS_DATA; |
|
915 var[2].ptr = &var[2].val.p; |
|
916 |
|
917 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 15, 3, var))) |
|
918 printf(" = %s\n", static_cast<char*>(var[2].val.p)); |
|
919 else |
|
920 printf("\tFAILED"); |
|
921 |
|
922 var[0].val.i32 = 5; |
|
923 var[0].type = nsXPTType::T_I32; |
|
924 var[0].flags = 0; |
|
925 |
|
926 failed_rv = NS_InvokeByIndex(test, 17, 1, var); |
|
927 printf("should fail %s, returned %x\n", failed_rv == NS_ERROR_NULL_POINTER ? "failed" :"passed", failed_rv); |
|
928 |
|
929 var[0].val.i64 = 3; |
|
930 var[0].type = nsXPTType::T_I64; |
|
931 var[0].flags = 0; |
|
932 |
|
933 var[1].val.i64 = 5; |
|
934 var[1].type = nsXPTType::T_I64; |
|
935 var[1].flags = 0; |
|
936 |
|
937 var[2].val.i32 = 7; |
|
938 var[2].type = nsXPTType::T_I32; |
|
939 var[2].flags = 0; |
|
940 |
|
941 var[3].val.i64 = 11; |
|
942 var[3].type = nsXPTType::T_I64; |
|
943 var[3].flags = 0; |
|
944 |
|
945 var[4].val.i32 = 13; |
|
946 var[4].type = nsXPTType::T_I32; |
|
947 var[4].flags = 0; |
|
948 |
|
949 var[5].val.i32 = 17; |
|
950 var[5].type = nsXPTType::T_I32; |
|
951 var[5].flags = 0; |
|
952 |
|
953 var[6].val.i64 = 19; |
|
954 var[6].type = nsXPTType::T_I64; |
|
955 var[6].flags = 0; |
|
956 |
|
957 var[7].val.i64 = 23; |
|
958 var[7].type = nsXPTType::T_I64; |
|
959 var[7].flags = 0; |
|
960 |
|
961 var[8].val.i32 = 29; |
|
962 var[8].type = nsXPTType::T_I32; |
|
963 var[8].flags = 0; |
|
964 |
|
965 var[9].val.i64 = 31; |
|
966 var[9].type = nsXPTType::T_I64; |
|
967 var[9].flags = 0; |
|
968 |
|
969 var[10].val.i64 = 0; |
|
970 var[10].type = nsXPTType::T_I64; |
|
971 var[10].flags = nsXPTCVariant::PTR_IS_DATA; |
|
972 var[10].ptr = &var[10].val.i64; |
|
973 |
|
974 if(NS_SUCCEEDED(NS_InvokeByIndex(test, 16, 11, var))) |
|
975 printf("\t3 + 5 + 7 + 11 + 13 + 17 + 19 + 23 + 29+ 31 = %d\n", |
|
976 (int)var[10].val.i64); |
|
977 else |
|
978 printf("\tFAILED"); |
|
979 |
|
980 DoMultipleInheritenceTest(); |
|
981 DoMultipleInheritenceTest2(); |
|
982 // Disabled by default - takes too much time on slow machines |
|
983 //DoSpeedTest(); |
|
984 |
|
985 return 0; |
|
986 } |
|
987 |
|
988 /***************************************************************************/ |
|
989 /***************************************************************************/ |
|
990 /***************************************************************************/ |
|
991 |
|
992 // {491C65A0-3317-11d3-9885-006008962422} |
|
993 #define FOO_IID \ |
|
994 { 0x491c65a0, 0x3317, 0x11d3, \ |
|
995 { 0x98, 0x85, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } } |
|
996 |
|
997 // {491C65A1-3317-11d3-9885-006008962422} |
|
998 #define BAR_IID \ |
|
999 { 0x491c65a1, 0x3317, 0x11d3, \ |
|
1000 { 0x98, 0x85, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } } |
|
1001 |
|
1002 /***************************/ |
|
1003 |
|
1004 class nsIFoo : public nsISupports |
|
1005 { |
|
1006 public: |
|
1007 NS_DECLARE_STATIC_IID_ACCESSOR(FOO_IID) |
|
1008 NS_IMETHOD FooMethod1(int32_t i) = 0; |
|
1009 NS_IMETHOD FooMethod2(int32_t i) = 0; |
|
1010 }; |
|
1011 |
|
1012 NS_DEFINE_STATIC_IID_ACCESSOR(nsIFoo, FOO_IID) |
|
1013 |
|
1014 class nsIBar : public nsISupports |
|
1015 { |
|
1016 public: |
|
1017 NS_DECLARE_STATIC_IID_ACCESSOR(BAR_IID) |
|
1018 NS_IMETHOD BarMethod1(int32_t i) = 0; |
|
1019 NS_IMETHOD BarMethod2(int32_t i) = 0; |
|
1020 }; |
|
1021 |
|
1022 NS_DEFINE_STATIC_IID_ACCESSOR(nsIBar, BAR_IID) |
|
1023 |
|
1024 /***************************/ |
|
1025 |
|
1026 class FooImpl : public nsIFoo |
|
1027 { |
|
1028 public: |
|
1029 NS_IMETHOD FooMethod1(int32_t i); |
|
1030 NS_IMETHOD FooMethod2(int32_t i); |
|
1031 |
|
1032 FooImpl(); |
|
1033 |
|
1034 protected: |
|
1035 ~FooImpl() {} |
|
1036 |
|
1037 public: |
|
1038 virtual const char* ImplName() = 0; |
|
1039 |
|
1040 int SomeData1; |
|
1041 int SomeData2; |
|
1042 const char* Name; |
|
1043 }; |
|
1044 |
|
1045 class BarImpl : public nsIBar |
|
1046 { |
|
1047 public: |
|
1048 NS_IMETHOD BarMethod1(int32_t i); |
|
1049 NS_IMETHOD BarMethod2(int32_t i); |
|
1050 |
|
1051 BarImpl(); |
|
1052 |
|
1053 protected: |
|
1054 ~BarImpl() {} |
|
1055 |
|
1056 public: |
|
1057 virtual const char * ImplName() = 0; |
|
1058 |
|
1059 int SomeData1; |
|
1060 int SomeData2; |
|
1061 const char* Name; |
|
1062 }; |
|
1063 |
|
1064 /***************************/ |
|
1065 |
|
1066 FooImpl::FooImpl() : Name("FooImpl") |
|
1067 { |
|
1068 } |
|
1069 |
|
1070 NS_IMETHODIMP FooImpl::FooMethod1(int32_t i) |
|
1071 { |
|
1072 printf("\tFooImpl::FooMethod1 called with i == %d, %s part of a %s\n", |
|
1073 i, Name, ImplName()); |
|
1074 return NS_OK; |
|
1075 } |
|
1076 |
|
1077 NS_IMETHODIMP FooImpl::FooMethod2(int32_t i) |
|
1078 { |
|
1079 printf("\tFooImpl::FooMethod2 called with i == %d, %s part of a %s\n", |
|
1080 i, Name, ImplName()); |
|
1081 return NS_OK; |
|
1082 } |
|
1083 |
|
1084 /***************************/ |
|
1085 |
|
1086 BarImpl::BarImpl() : Name("BarImpl") |
|
1087 { |
|
1088 } |
|
1089 |
|
1090 NS_IMETHODIMP BarImpl::BarMethod1(int32_t i) |
|
1091 { |
|
1092 printf("\tBarImpl::BarMethod1 called with i == %d, %s part of a %s\n", |
|
1093 i, Name, ImplName()); |
|
1094 return NS_OK; |
|
1095 } |
|
1096 |
|
1097 NS_IMETHODIMP BarImpl::BarMethod2(int32_t i) |
|
1098 { |
|
1099 printf("\tBarImpl::BarMethod2 called with i == %d, %s part of a %s\n", |
|
1100 i, Name, ImplName()); |
|
1101 return NS_OK; |
|
1102 } |
|
1103 |
|
1104 /***************************/ |
|
1105 |
|
1106 class FooBarImpl : public FooImpl, public BarImpl |
|
1107 { |
|
1108 public: |
|
1109 NS_DECL_ISUPPORTS |
|
1110 |
|
1111 const char* ImplName(); |
|
1112 |
|
1113 FooBarImpl(); |
|
1114 |
|
1115 private: |
|
1116 ~FooBarImpl() {} |
|
1117 |
|
1118 public: |
|
1119 const char* MyName; |
|
1120 }; |
|
1121 |
|
1122 FooBarImpl::FooBarImpl() : MyName("FooBarImpl") |
|
1123 { |
|
1124 NS_ADDREF_THIS(); |
|
1125 } |
|
1126 |
|
1127 const char* FooBarImpl::ImplName() |
|
1128 { |
|
1129 return MyName; |
|
1130 } |
|
1131 |
|
1132 NS_IMETHODIMP |
|
1133 FooBarImpl::QueryInterface(REFNSIID aIID, void** aInstancePtr) |
|
1134 { |
|
1135 if (nullptr == aInstancePtr) { |
|
1136 return NS_ERROR_NULL_POINTER; |
|
1137 } |
|
1138 |
|
1139 *aInstancePtr = nullptr; |
|
1140 |
|
1141 |
|
1142 if (aIID.Equals(NS_GET_IID(nsIFoo))) { |
|
1143 *aInstancePtr = (void*) static_cast<nsIFoo*>(this); |
|
1144 NS_ADDREF_THIS(); |
|
1145 return NS_OK; |
|
1146 } |
|
1147 if (aIID.Equals(NS_GET_IID(nsIBar))) { |
|
1148 *aInstancePtr = (void*) static_cast<nsIBar*>(this); |
|
1149 NS_ADDREF_THIS(); |
|
1150 return NS_OK; |
|
1151 } |
|
1152 |
|
1153 if (aIID.Equals(NS_GET_IID(nsISupports))) { |
|
1154 *aInstancePtr = (void*) static_cast<nsISupports*> |
|
1155 (static_cast<nsIFoo*>(this)); |
|
1156 NS_ADDREF_THIS(); |
|
1157 return NS_OK; |
|
1158 } |
|
1159 return NS_NOINTERFACE; |
|
1160 } |
|
1161 |
|
1162 NS_IMPL_ADDREF(FooBarImpl) |
|
1163 NS_IMPL_RELEASE(FooBarImpl) |
|
1164 |
|
1165 |
|
1166 static void DoMultipleInheritenceTest() |
|
1167 { |
|
1168 FooBarImpl* impl = new FooBarImpl(); |
|
1169 if(!impl) |
|
1170 return; |
|
1171 |
|
1172 nsIFoo* foo; |
|
1173 nsIBar* bar; |
|
1174 |
|
1175 nsXPTCVariant var[1]; |
|
1176 |
|
1177 printf("\n"); |
|
1178 if(NS_SUCCEEDED(impl->QueryInterface(NS_GET_IID(nsIFoo), (void**)&foo)) && |
|
1179 NS_SUCCEEDED(impl->QueryInterface(NS_GET_IID(nsIBar), (void**)&bar))) |
|
1180 { |
|
1181 printf("impl == %p\n", static_cast<void*>(impl)); |
|
1182 printf("foo == %p\n", static_cast<void*>(foo)); |
|
1183 printf("bar == %p\n", static_cast<void*>(bar)); |
|
1184 |
|
1185 printf("Calling Foo...\n"); |
|
1186 printf("direct calls:\n"); |
|
1187 foo->FooMethod1(1); |
|
1188 foo->FooMethod2(2); |
|
1189 |
|
1190 printf("invoke calls:\n"); |
|
1191 var[0].val.i32 = 1; |
|
1192 var[0].type = nsXPTType::T_I32; |
|
1193 var[0].flags = 0; |
|
1194 NS_InvokeByIndex(foo, 3, 1, var); |
|
1195 |
|
1196 var[0].val.i32 = 2; |
|
1197 var[0].type = nsXPTType::T_I32; |
|
1198 var[0].flags = 0; |
|
1199 NS_InvokeByIndex(foo, 4, 1, var); |
|
1200 |
|
1201 printf("\n"); |
|
1202 |
|
1203 printf("Calling Bar...\n"); |
|
1204 printf("direct calls:\n"); |
|
1205 bar->BarMethod1(1); |
|
1206 bar->BarMethod2(2); |
|
1207 |
|
1208 printf("invoke calls:\n"); |
|
1209 var[0].val.i32 = 1; |
|
1210 var[0].type = nsXPTType::T_I32; |
|
1211 var[0].flags = 0; |
|
1212 NS_InvokeByIndex(bar, 3, 1, var); |
|
1213 |
|
1214 var[0].val.i32 = 2; |
|
1215 var[0].type = nsXPTType::T_I32; |
|
1216 var[0].flags = 0; |
|
1217 NS_InvokeByIndex(bar, 4, 1, var); |
|
1218 |
|
1219 printf("\n"); |
|
1220 |
|
1221 NS_RELEASE(foo); |
|
1222 NS_RELEASE(bar); |
|
1223 } |
|
1224 NS_RELEASE(impl); |
|
1225 } |
|
1226 /***************************************************************************/ |
|
1227 /***************************************************************************/ |
|
1228 /***************************************************************************/ |
|
1229 /* This is a variation on the theme submitted by duncan@be.com (Duncan Wilcox). |
|
1230 * He was seeing the other test work and this test not work. They should both |
|
1231 * Work on any given platform |
|
1232 */ |
|
1233 |
|
1234 class nsIFoo2 : public nsISupports |
|
1235 { |
|
1236 public: |
|
1237 NS_IMETHOD FooMethod1(int32_t i) = 0; |
|
1238 NS_IMETHOD FooMethod2(int32_t i) = 0; |
|
1239 }; |
|
1240 |
|
1241 class nsIBar2 : public nsISupports |
|
1242 { |
|
1243 public: |
|
1244 NS_IMETHOD BarMethod1(int32_t i) = 0; |
|
1245 NS_IMETHOD BarMethod2(int32_t i) = 0; |
|
1246 }; |
|
1247 |
|
1248 class FooBarImpl2 : public nsIFoo2, public nsIBar2 |
|
1249 { |
|
1250 public: |
|
1251 // Foo interface |
|
1252 NS_IMETHOD FooMethod1(int32_t i); |
|
1253 NS_IMETHOD FooMethod2(int32_t i); |
|
1254 |
|
1255 // Bar interface |
|
1256 NS_IMETHOD BarMethod1(int32_t i); |
|
1257 NS_IMETHOD BarMethod2(int32_t i); |
|
1258 |
|
1259 NS_DECL_ISUPPORTS |
|
1260 |
|
1261 FooBarImpl2(); |
|
1262 |
|
1263 private: |
|
1264 ~FooBarImpl2() {} |
|
1265 |
|
1266 public: |
|
1267 int32_t value; |
|
1268 }; |
|
1269 |
|
1270 FooBarImpl2::FooBarImpl2() : value(0x12345678) |
|
1271 { |
|
1272 NS_ADDREF_THIS(); |
|
1273 } |
|
1274 |
|
1275 NS_IMETHODIMP FooBarImpl2::FooMethod1(int32_t i) |
|
1276 { |
|
1277 printf("\tFooBarImpl2::FooMethod1 called with i == %d, local value = %x\n", |
|
1278 i, value); |
|
1279 return NS_OK; |
|
1280 } |
|
1281 |
|
1282 NS_IMETHODIMP FooBarImpl2::FooMethod2(int32_t i) |
|
1283 { |
|
1284 printf("\tFooBarImpl2::FooMethod2 called with i == %d, local value = %x\n", |
|
1285 i, value); |
|
1286 return NS_OK; |
|
1287 } |
|
1288 |
|
1289 NS_IMETHODIMP FooBarImpl2::BarMethod1(int32_t i) |
|
1290 { |
|
1291 printf("\tFooBarImpl2::BarMethod1 called with i == %d, local value = %x\n", |
|
1292 i, value); |
|
1293 return NS_OK; |
|
1294 } |
|
1295 |
|
1296 NS_IMETHODIMP FooBarImpl2::BarMethod2(int32_t i) |
|
1297 { |
|
1298 printf("\tFooBarImpl2::BarMethod2 called with i == %d, local value = %x\n", |
|
1299 i, value); |
|
1300 return NS_OK; |
|
1301 } |
|
1302 |
|
1303 NS_IMETHODIMP |
|
1304 FooBarImpl2::QueryInterface(REFNSIID aIID, void** aInstancePtr) |
|
1305 { |
|
1306 if (nullptr == aInstancePtr) { |
|
1307 return NS_ERROR_NULL_POINTER; |
|
1308 } |
|
1309 |
|
1310 *aInstancePtr = nullptr; |
|
1311 |
|
1312 |
|
1313 if (aIID.Equals(NS_GET_IID(nsIFoo))) { |
|
1314 *aInstancePtr = (void*) static_cast<nsIFoo2*>(this); |
|
1315 NS_ADDREF_THIS(); |
|
1316 return NS_OK; |
|
1317 } |
|
1318 if (aIID.Equals(NS_GET_IID(nsIBar))) { |
|
1319 *aInstancePtr = (void*) static_cast<nsIBar2*>(this); |
|
1320 NS_ADDREF_THIS(); |
|
1321 return NS_OK; |
|
1322 } |
|
1323 |
|
1324 if (aIID.Equals(NS_GET_IID(nsISupports))) { |
|
1325 *aInstancePtr = (void*) static_cast<nsISupports*> |
|
1326 (static_cast<nsIFoo2*>(this)); |
|
1327 NS_ADDREF_THIS(); |
|
1328 return NS_OK; |
|
1329 } |
|
1330 return NS_NOINTERFACE; |
|
1331 } |
|
1332 |
|
1333 NS_IMPL_ADDREF(FooBarImpl2) |
|
1334 NS_IMPL_RELEASE(FooBarImpl2) |
|
1335 |
|
1336 static void DoMultipleInheritenceTest2() |
|
1337 { |
|
1338 FooBarImpl2* impl = new FooBarImpl2(); |
|
1339 if(!impl) |
|
1340 return; |
|
1341 |
|
1342 nsIFoo2* foo; |
|
1343 nsIBar2* bar; |
|
1344 |
|
1345 nsXPTCVariant var[1]; |
|
1346 |
|
1347 printf("\n"); |
|
1348 if(NS_SUCCEEDED(impl->QueryInterface(NS_GET_IID(nsIFoo), (void**)&foo)) && |
|
1349 NS_SUCCEEDED(impl->QueryInterface(NS_GET_IID(nsIBar), (void**)&bar))) |
|
1350 { |
|
1351 printf("impl == %p\n", static_cast<void*>(impl)); |
|
1352 printf("foo == %p\n", static_cast<void*>(foo)); |
|
1353 printf("bar == %p\n", static_cast<void*>(bar)); |
|
1354 |
|
1355 printf("Calling Foo...\n"); |
|
1356 printf("direct calls:\n"); |
|
1357 foo->FooMethod1(1); |
|
1358 foo->FooMethod2(2); |
|
1359 |
|
1360 printf("invoke calls:\n"); |
|
1361 var[0].val.i32 = 1; |
|
1362 var[0].type = nsXPTType::T_I32; |
|
1363 var[0].flags = 0; |
|
1364 NS_InvokeByIndex(foo, 3, 1, var); |
|
1365 |
|
1366 var[0].val.i32 = 2; |
|
1367 var[0].type = nsXPTType::T_I32; |
|
1368 var[0].flags = 0; |
|
1369 NS_InvokeByIndex(foo, 4, 1, var); |
|
1370 |
|
1371 printf("\n"); |
|
1372 |
|
1373 printf("Calling Bar...\n"); |
|
1374 printf("direct calls:\n"); |
|
1375 bar->BarMethod1(1); |
|
1376 bar->BarMethod2(2); |
|
1377 |
|
1378 printf("invoke calls:\n"); |
|
1379 var[0].val.i32 = 1; |
|
1380 var[0].type = nsXPTType::T_I32; |
|
1381 var[0].flags = 0; |
|
1382 NS_InvokeByIndex(bar, 3, 1, var); |
|
1383 |
|
1384 var[0].val.i32 = 2; |
|
1385 var[0].type = nsXPTType::T_I32; |
|
1386 var[0].flags = 0; |
|
1387 NS_InvokeByIndex(bar, 4, 1, var); |
|
1388 |
|
1389 printf("\n"); |
|
1390 |
|
1391 NS_RELEASE(foo); |
|
1392 NS_RELEASE(bar); |
|
1393 } |
|
1394 NS_RELEASE(impl); |
|
1395 } |
|
1396 |
|
1397 static void DoSpeedTest() |
|
1398 { |
|
1399 InvokeTestTarget *test = new InvokeTestTarget(); |
|
1400 |
|
1401 nsXPTCVariant var[3]; |
|
1402 |
|
1403 var[0].val.i32 = 1; |
|
1404 var[0].type = nsXPTType::T_I32; |
|
1405 var[0].flags = 0; |
|
1406 |
|
1407 var[1].val.i32 = 1; |
|
1408 var[1].type = nsXPTType::T_I32; |
|
1409 var[1].flags = 0; |
|
1410 |
|
1411 var[2].val.i32 = 0; |
|
1412 var[2].type = nsXPTType::T_I32; |
|
1413 var[2].flags = nsXPTCVariant::PTR_IS_DATA; |
|
1414 var[2].ptr = &var[2].val.i32; |
|
1415 |
|
1416 int32_t in1 = 1; |
|
1417 int32_t in2 = 1; |
|
1418 int32_t out; |
|
1419 |
|
1420 // Crank this number down if your platform is slow :) |
|
1421 static const int count = 100000000; |
|
1422 int i; |
|
1423 PRIntervalTime start; |
|
1424 PRIntervalTime interval_direct; |
|
1425 PRIntervalTime interval_invoke; |
|
1426 |
|
1427 printf("Speed test...\n\n"); |
|
1428 printf("Doing %d direct call iterations...\n", count); |
|
1429 start = PR_IntervalNow(); |
|
1430 for(i = count; i; i--) |
|
1431 (void)test->AddTwoInts(in1, in2, &out); |
|
1432 interval_direct = PR_IntervalNow() - start; |
|
1433 |
|
1434 printf("Doing %d invoked call iterations...\n", count); |
|
1435 start = PR_IntervalNow(); |
|
1436 for(i = count; i; i--) |
|
1437 (void)NS_InvokeByIndex(test, 3, 3, var); |
|
1438 interval_invoke = PR_IntervalNow() - start; |
|
1439 |
|
1440 printf(" direct took %0.2f seconds\n", |
|
1441 (double)interval_direct/(double)PR_TicksPerSecond()); |
|
1442 printf(" invoke took %0.2f seconds\n", |
|
1443 (double)interval_invoke/(double)PR_TicksPerSecond()); |
|
1444 printf(" So, invoke overhead was ~ %0.2f seconds (~ %0.0f%%)\n", |
|
1445 (double)(interval_invoke-interval_direct)/(double)PR_TicksPerSecond(), |
|
1446 (double)(interval_invoke-interval_direct)/(double)interval_invoke*100); |
|
1447 } |