2
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
4
* The contents of this file are subject to the Netscape Public
5
* License Version 1.1 (the "License"); you may not use this file
6
* except in compliance with the License. You may obtain a copy of
7
* the License at http://www.mozilla.org/NPL/
9
* Software distributed under the License is distributed on an "AS
10
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11
* implied. See the License for the specific language governing
12
* rights and limitations under the License.
14
* The Original Code is mozilla.org code.
16
* The Initial Developer of the Original Code is Netscape
17
* Communications Corporation. Portions created by Netscape are
18
* Copyright (C) 1999 Netscape Communications Corporation. All
24
#include "xptcprivate.h"
28
// "This code is for IA64 only"
31
/* invoke_copy_to_stack() will copy from variant array 's' to
32
* the stack argument area 'mloc', the integer register area 'iloc', and
33
* the float register area 'floc'.
37
invoke_copy_to_stack(uint64_t* mloc, uint64_t* iloc, uint64_t* floc,
38
const PRUint32 paramCount, nsXPTCVariant* s)
40
uint64_t* dest = mloc;
41
PRUint32 len = paramCount;
42
nsXPTCVariant* source = s;
46
endlen = (len > 7) ? 7 : len;
47
/* handle the memory arguments */
48
for (indx = 7; indx < len; ++indx)
50
if (source[indx].IsPtrData())
53
/* 64 bit pointer mode */
54
*((void**) dest) = source[indx].ptr;
56
/* 32 bit pointer mode */
57
uint32_t* adr = (uint32_t*) dest;
59
*(adr+1) = (uint32_t) source[indx].ptr;
63
switch (source[indx].type)
65
case nsXPTType::T_I8 : *(dest) = source[indx].val.i8; break;
66
case nsXPTType::T_I16 : *(dest) = source[indx].val.i16; break;
67
case nsXPTType::T_I32 : *(dest) = source[indx].val.i32; break;
68
case nsXPTType::T_I64 : *(dest) = source[indx].val.i64; break;
69
case nsXPTType::T_U8 : *(dest) = source[indx].val.u8; break;
70
case nsXPTType::T_U16 : *(dest) = source[indx].val.u16; break;
71
case nsXPTType::T_U32 : *(dest) = source[indx].val.u32; break;
72
case nsXPTType::T_U64 : *(dest) = source[indx].val.u64; break;
73
case nsXPTType::T_FLOAT : *(dest) = source[indx].val.u32; break;
74
case nsXPTType::T_DOUBLE: *(dest) = source[indx].val.u64; break;
75
case nsXPTType::T_BOOL : *(dest) = source[indx].val.b; break;
76
case nsXPTType::T_CHAR : *(dest) = source[indx].val.c; break;
77
case nsXPTType::T_WCHAR : *(dest) = source[indx].val.wc; break;
79
// all the others are plain pointer types
81
/* 64 bit pointer mode */
82
*((void**) dest) = source[indx].val.p;
85
/* 32 bit pointer mode */
86
uint32_t* adr = (uint32_t*) dest;
88
*(adr+1) = (uint32_t) source[indx].val.p;
94
/* process register arguments */
96
for (indx = 0; indx < endlen; ++indx)
98
if (source[indx].IsPtrData())
101
/* 64 bit pointer mode */
102
*((void**) dest) = source[indx].ptr;
104
/* 32 bit pointer mode */
105
uint32_t* adr = (uint32_t*) dest;
107
*(adr+1) = (uint32_t) source[indx].ptr;
111
switch (source[indx].type)
113
case nsXPTType::T_I8 : *(dest) = source[indx].val.i8; break;
114
case nsXPTType::T_I16 : *(dest) = source[indx].val.i16; break;
115
case nsXPTType::T_I32 : *(dest) = source[indx].val.i32; break;
116
case nsXPTType::T_I64 : *(dest) = source[indx].val.i64; break;
117
case nsXPTType::T_U8 : *(dest) = source[indx].val.u8; break;
118
case nsXPTType::T_U16 : *(dest) = source[indx].val.u16; break;
119
case nsXPTType::T_U32 : *(dest) = source[indx].val.u32; break;
120
case nsXPTType::T_U64 : *(dest) = source[indx].val.u64; break;
121
case nsXPTType::T_FLOAT :
122
*((double*) (floc++)) = (double) source[indx].val.f;
124
case nsXPTType::T_DOUBLE:
125
*((double*) (floc++)) = source[indx].val.d;
127
case nsXPTType::T_BOOL : *(dest) = source[indx].val.b; break;
128
case nsXPTType::T_CHAR : *(dest) = source[indx].val.c; break;
129
case nsXPTType::T_WCHAR : *(dest) = source[indx].val.wc; break;
131
// all the others are plain pointer types
133
/* 64 bit pointer mode */
134
*((void**) dest) = source[indx].val.p;
137
/* 32 bit pointer mode */
138
uint32_t* adr = (uint32_t*) dest;
140
*(adr+1) = (uint32_t) source[indx].val.p;