diff --git a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc_aix.cpp b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc_aix.cpp index 519b3a7f2c2..138c252d7e1 100644 --- a/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc_aix.cpp +++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ppc_aix.cpp @@ -99,16 +99,17 @@ invoke_count_words(PRUint32 paramCount, nsXPTCVariant* s) } extern "C" void -invoke_copy_to_stack(PRUint32* d, PRUint32 paramCount, nsXPTCVariant* s) +invoke_copy_to_stack(PRUint32* d, PRUint32 paramCount, nsXPTCVariant* s, double *fprData) { /* We need to copy the parameters for this function to locals and use them from there since the parameters occupy the same stack space as the stack we're trying to populate. */ - uint32 *l_d = d; + PRUint32 *l_d = d; nsXPTCVariant *l_s = s; - uint32 l_paramCount = paramCount; + PRUint32 l_paramCount = paramCount, fpCount = 0; + double *l_fprData = fprData; typedef struct { uint32 hi; @@ -129,14 +130,24 @@ invoke_copy_to_stack(PRUint32* d, PRUint32 paramCount, nsXPTCVariant* s) case nsXPTType::T_I16 : *((int32*) l_d) = l_s->val.i16; break; case nsXPTType::T_I32 : *((int32*) l_d) = l_s->val.i32; break; case nsXPTType::T_I64 : - case nsXPTType::T_U64 : - case nsXPTType::T_DOUBLE : *((uint32*) l_d++) = ((DU *)l_s)->hi; - *((uint32*) l_d) = ((DU *)l_s)->lo; - break; + case nsXPTType::T_U64 : + *((uint32*) l_d++) = ((DU *)l_s)->hi; + *((uint32*) l_d) = ((DU *)l_s)->lo; + break; + case nsXPTType::T_DOUBLE : + *((uint32*) l_d++) = ((DU *)l_s)->hi; + *((uint32*) l_d) = ((DU *)l_s)->lo; + if(fpCount < 13) + l_fprData[fpCount++] = l_s->val.d; + break; case nsXPTType::T_U8 : *((uint32*) l_d) = l_s->val.u8; break; case nsXPTType::T_U16 : *((uint32*) l_d) = l_s->val.u16; break; case nsXPTType::T_U32 : *((uint32*) l_d) = l_s->val.u32; break; - case nsXPTType::T_FLOAT : *((float*) l_d) = l_s->val.f; break; + case nsXPTType::T_FLOAT : + *((float*) l_d) = l_s->val.f; + if(fpCount < 13) + l_fprData[fpCount++] = l_s->val.f; + break; case nsXPTType::T_BOOL : *((PRBool*) l_d) = l_s->val.b; break; case nsXPTType::T_CHAR : *((uint32*) l_d) = l_s->val.c; break; case nsXPTType::T_WCHAR : *((int32*) l_d) = l_s->val.wc; break;