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*)&regs[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*)&regs[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