зеркало из https://github.com/mozilla/pjs.git
Fixing the problem with AIX not passing floating point params thru xptinvoke
submitted by pkw@austin.ibm.com r=cls@seawood.org a=blizzard@mozilla.org # 106118
This commit is contained in:
Родитель
3f09b1f5db
Коммит
8bdb101a36
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче