1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2  * Version: MPL 1.1
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 
8 /* This code is for MIPS using the O32 ABI. */
9 
10 /* Platform specific code to invoke XPCOM methods on native objects */
11 
12 #include "xptcprivate.h"
13 
14 #include <stdint.h>
15 
16 extern "C" uint32_t
invoke_count_words(uint32_t paramCount,nsXPTCVariant * s)17 invoke_count_words(uint32_t paramCount, nsXPTCVariant* s)
18 {
19     // Count a word for a0 even though it's never stored or loaded
20     // We do this only for alignment of register pairs.
21     uint32_t result = 1;
22     for (uint32_t i = 0; i < paramCount; i++, result++, s++)
23     {
24         if (s->IsIndirect())
25             continue;
26 
27         switch(s->type)
28         {
29         case nsXPTType::T_I64    :
30         case nsXPTType::T_U64    :
31         case nsXPTType::T_DOUBLE :
32 	    if (result & 1)
33 		result++;
34 	    result++;
35 	    break;
36 
37         default:
38             break;
39         }
40     }
41     return (result + 1) & ~(uint32_t)1;
42 }
43 
44 extern "C" void
invoke_copy_to_stack(uint32_t * d,uint32_t paramCount,nsXPTCVariant * s)45 invoke_copy_to_stack(uint32_t* d, uint32_t paramCount,
46                      nsXPTCVariant* s)
47 {
48     // Skip the unused a0 slot, which we keep only for register pair alignment.
49     d++;
50 
51     for (uint32_t i = 0; i < paramCount; i++, d++, s++)
52     {
53         if (s->IsIndirect())
54         {
55             *((void**)d) = (void*) &s->val;
56             continue;
57         }
58 
59         switch(s->type)
60         {
61         case nsXPTType::T_I8     : *d = (uint32_t) s->val.i8;   break;
62         case nsXPTType::T_I16    : *d = (uint32_t) s->val.i16;  break;
63         case nsXPTType::T_I32    : *d = (uint32_t) s->val.i32;  break;
64         case nsXPTType::T_I64    :
65             if ((intptr_t)d & 4) d++;
66             *((int64_t*) d)  = s->val.i64;    d++;
67             break;
68         case nsXPTType::T_U8     : *d = (uint32_t) s->val.u8;   break;
69         case nsXPTType::T_U16    : *d = (uint32_t) s->val.u16;  break;
70         case nsXPTType::T_U32    : *d = (uint32_t) s->val.u32;  break;
71         case nsXPTType::T_U64    :
72             if ((intptr_t)d & 4) d++;
73             *((uint64_t*) d) = s->val.u64;    d++;
74             break;
75         case nsXPTType::T_FLOAT  : *((float*)   d) = s->val.f;  break;
76         case nsXPTType::T_DOUBLE :
77             if ((intptr_t)d & 4) d++;
78             *((double*)   d) = s->val.d;      d++;
79             break;
80         case nsXPTType::T_BOOL   : *d = (bool)  s->val.b;     break;
81         case nsXPTType::T_CHAR   : *d = (char)    s->val.c;     break;
82         case nsXPTType::T_WCHAR  : *d = (wchar_t) s->val.wc;    break;
83         default:
84             *((void**)d) = s->val.p;
85             break;
86         }
87     }
88 }
89 
90 extern "C" nsresult _NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
91                                         uint32_t paramCount,
92                                         nsXPTCVariant* params);
93 
94 EXPORT_XPCOM_API(nsresult)
NS_InvokeByIndex(nsISupports * that,uint32_t methodIndex,uint32_t paramCount,nsXPTCVariant * params)95 NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
96                    uint32_t paramCount, nsXPTCVariant* params)
97 {
98     return _NS_InvokeByIndex(that, methodIndex, paramCount, params);
99 }
100