1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc_rhapsody.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,113 @@ 1.4 +/* -*- Mode: C; tab-width: 4; 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 +/* Platform specific code to invoke XPCOM methods on native objects */ 1.10 + 1.11 +#include "xptcprivate.h" 1.12 + 1.13 +extern "C" uint32_t 1.14 +invoke_count_words(uint32_t paramCount, nsXPTCVariant* s) 1.15 +{ 1.16 + uint32_t result = 0; 1.17 + /* fprintf(stderr,"invoke_count_words(%d,%p)\n",paramCount, s);*/ 1.18 + 1.19 + for(uint32_t i = 0; i < paramCount; i++, s++) 1.20 + { 1.21 + if(s->IsPtrData()) 1.22 + { 1.23 + result++; 1.24 + continue; 1.25 + } 1.26 + switch(s->type) 1.27 + { 1.28 + case nsXPTType::T_I8 : 1.29 + case nsXPTType::T_I16 : 1.30 + case nsXPTType::T_I32 : 1.31 + result++; 1.32 + break; 1.33 + case nsXPTType::T_I64 : 1.34 + result+=2; 1.35 + break; 1.36 + case nsXPTType::T_U8 : 1.37 + case nsXPTType::T_U16 : 1.38 + case nsXPTType::T_U32 : 1.39 + result++; 1.40 + break; 1.41 + case nsXPTType::T_U64 : 1.42 + result+=2; 1.43 + break; 1.44 + case nsXPTType::T_FLOAT : 1.45 + result++; 1.46 + break; 1.47 + case nsXPTType::T_DOUBLE : 1.48 + result+=2; 1.49 + break; 1.50 + case nsXPTType::T_BOOL : 1.51 + case nsXPTType::T_CHAR : 1.52 + case nsXPTType::T_WCHAR : 1.53 + result++; 1.54 + break; 1.55 + default: 1.56 + // all the others are plain pointer types 1.57 + result++; 1.58 + break; 1.59 + } 1.60 + } 1.61 + return result; 1.62 +} 1.63 + 1.64 +extern "C" void 1.65 +invoke_copy_to_stack(uint32_t* d, uint32_t paramCount, nsXPTCVariant* s, double *fprData) 1.66 +{ 1.67 + uint32_t fpCount = 0; 1.68 + 1.69 + /* fprintf(stderr,"invoke_copy_to_stack(%p, %d, %p, %p)\n", d, paramCount, s, fprData);*/ 1.70 + 1.71 + for(uint32_t i = 0; i < paramCount; i++, d++, s++) 1.72 + { 1.73 + if(s->IsPtrData()) 1.74 + { 1.75 + *((void**)d) = s->ptr; 1.76 + continue; 1.77 + } 1.78 + switch(s->type) 1.79 + { 1.80 + case nsXPTType::T_I8 : *((int32_t*) d) = s->val.i8; break; 1.81 + case nsXPTType::T_I16 : *((int32_t*) d) = s->val.i16; break; 1.82 + case nsXPTType::T_I32 : *((int32_t*) d) = s->val.i32; break; 1.83 + case nsXPTType::T_I64 : *((int64_t*) d) = s->val.i64; d++; break; 1.84 + case nsXPTType::T_U8 : *((uint32_t*) d) = s->val.u8; break; 1.85 + case nsXPTType::T_U16 : *((uint32_t*)d) = s->val.u16; break; 1.86 + case nsXPTType::T_U32 : *((uint32_t*)d) = s->val.u32; break; 1.87 + case nsXPTType::T_U64 : *((uint64_t*)d) = s->val.u64; d++; break; 1.88 + case nsXPTType::T_FLOAT : *((float*) d) = s->val.f; 1.89 + if (fpCount < 13) 1.90 + fprData[fpCount++] = s->val.f; 1.91 + break; 1.92 + case nsXPTType::T_DOUBLE : *((double*) d) = s->val.d; d++; 1.93 + if (fpCount < 13) 1.94 + fprData[fpCount++] = s->val.d; 1.95 + break; 1.96 + case nsXPTType::T_BOOL : *((uint32_t*) d) = s->val.b; break; 1.97 + case nsXPTType::T_CHAR : *((int32_t*) d) = s->val.c; break; 1.98 + case nsXPTType::T_WCHAR : *((uint32_t*) d) = s->val.wc; break; 1.99 + default: 1.100 + // all the others are plain pointer types 1.101 + *((void**)d) = s->val.p; 1.102 + break; 1.103 + } 1.104 + } 1.105 +} 1.106 + 1.107 +extern "C" nsresult _NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, 1.108 + uint32_t paramCount, 1.109 + nsXPTCVariant* params); 1.110 + 1.111 +EXPORT_XPCOM_API(nsresult) 1.112 +NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, 1.113 + uint32_t paramCount, nsXPTCVariant* params) 1.114 +{ 1.115 + return _NS_InvokeByIndex(that, methodIndex, paramCount, params); 1.116 +}