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 /* Platform specific code to invoke XPCOM methods on native objects */
7
8 #include "xptcprivate.h"
9
10 #if (_MIPS_SIM != _ABIN32) && (_MIPS_SIM != _ABI64)
11 #error "This code is for MIPS n32/n64 only"
12 #endif
13
14 extern "C" uint32_t
invoke_count_words(uint32_t paramCount,nsXPTCVariant * s)15 invoke_count_words(uint32_t paramCount, nsXPTCVariant* s)
16 {
17 return paramCount;
18 }
19
20 extern "C" void
invoke_copy_to_stack(uint64_t * d,uint32_t paramCount,nsXPTCVariant * s,uint64_t * regs)21 invoke_copy_to_stack(uint64_t* d, uint32_t paramCount,
22 nsXPTCVariant* s, uint64_t *regs)
23 {
24 #define N_ARG_REGS 7 /* 8 regs minus 1 for "this" ptr */
25
26 for (uint32_t i = 0; i < paramCount; i++, s++)
27 {
28 if (s->IsIndirect()) {
29 if (i < N_ARG_REGS)
30 regs[i] = (uint64_t) &s->val;
31 else
32 *d++ = (uint64_t) &s->val;
33 continue;
34 }
35 switch (s->type) {
36 //
37 // signed types first
38 //
39 case nsXPTType::T_I8:
40 if (i < N_ARG_REGS)
41 ((int64_t*)regs)[i] = s->val.i8;
42 else
43 *d++ = s->val.i8;
44 break;
45 case nsXPTType::T_I16:
46 if (i < N_ARG_REGS)
47 ((int64_t*)regs)[i] = s->val.i16;
48 else
49 *d++ = s->val.i16;
50 break;
51 case nsXPTType::T_I32:
52 if (i < N_ARG_REGS)
53 ((int64_t*)regs)[i] = s->val.i32;
54 else
55 *d++ = s->val.i32;
56 break;
57 case nsXPTType::T_I64:
58 if (i < N_ARG_REGS)
59 ((int64_t*)regs)[i] = s->val.i64;
60 else
61 *d++ = s->val.i64;
62 break;
63 //
64 // unsigned types next
65 //
66 case nsXPTType::T_U8:
67 if (i < N_ARG_REGS)
68 regs[i] = s->val.u8;
69 else
70 *d++ = s->val.u8;
71 break;
72 case nsXPTType::T_U16:
73 if (i < N_ARG_REGS)
74 regs[i] = s->val.u16;
75 else
76 *d++ = s->val.u16;
77 break;
78 case nsXPTType::T_U32:
79 if (i < N_ARG_REGS)
80 // 32-bit values need to be sign-extended
81 // in register, so use the signed value.
82 regs[i] = s->val.i32;
83 else
84 *d++ = s->val.u32;
85 break;
86 case nsXPTType::T_U64:
87 if (i < N_ARG_REGS)
88 regs[i] = s->val.u64;
89 else
90 *d++ = s->val.u64;
91 break;
92 case nsXPTType::T_FLOAT:
93 // the float data formate must not be converted!
94 // Just only copy without conversion.
95 if (i < N_ARG_REGS)
96 *(float*)®s[i] = s->val.f;
97 else
98 *(float*)d++ = s->val.f;
99 break;
100 case nsXPTType::T_DOUBLE:
101 if (i < N_ARG_REGS)
102 *(double*)®s[i] = s->val.d;
103 else
104 *(double*)d++ = s->val.d;
105 break;
106 case nsXPTType::T_BOOL:
107 if (i < N_ARG_REGS)
108 regs[i] = s->val.b;
109 else
110 *d++ = s->val.b;
111 break;
112 case nsXPTType::T_CHAR:
113 if (i < N_ARG_REGS)
114 regs[i] = s->val.c;
115 else
116 *d++ = s->val.c;
117 break;
118 case nsXPTType::T_WCHAR:
119 if (i < N_ARG_REGS)
120 regs[i] = s->val.wc;
121 else
122 *d++ = s->val.wc;
123 break;
124 default:
125 // all the others are plain pointer types
126 if (i < N_ARG_REGS)
127 regs[i] = (uint64_t)s->val.p;
128 else
129 *d++ = (uint64_t)s->val.p;
130 break;
131 }
132 }
133 }
134
135 extern "C" nsresult _NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
136 uint32_t paramCount,
137 nsXPTCVariant* params);
138
139 EXPORT_XPCOM_API(nsresult)
NS_InvokeByIndex(nsISupports * that,uint32_t methodIndex,uint32_t paramCount,nsXPTCVariant * params)140 NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
141 uint32_t paramCount, nsXPTCVariant* params)
142 {
143 return _NS_InvokeByIndex(that, methodIndex, paramCount, params);
144 }
145