~ubuntu-branches/ubuntu/precise/kompozer/precise

« back to all changes in this revision

Viewing changes to mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ipf32.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Anthony Yarusso
  • Date: 2007-08-27 01:11:03 UTC
  • Revision ID: james.westby@ubuntu.com-20070827011103-2jgf4s6532gqu2ka
Tags: upstream-0.7.10
ImportĀ upstreamĀ versionĀ 0.7.10

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 
3
 *
 
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/
 
8
 *
 
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.
 
13
 *
 
14
 * The Original Code is mozilla.org code.
 
15
 *
 
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
 
19
 * Rights Reserved.
 
20
 *
 
21
 * Contributor(s): 
 
22
 */
 
23
 
 
24
#include "xptcprivate.h"
 
25
 
 
26
#include <iostream.h>
 
27
 
 
28
// "This code is for IA64 only"
 
29
 
 
30
 
 
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'.
 
34
 *
 
35
 */
 
36
extern "C" void
 
37
invoke_copy_to_stack(uint64_t* mloc, uint64_t* iloc, uint64_t* floc,
 
38
  const PRUint32 paramCount, nsXPTCVariant* s)
 
39
{
 
40
  uint64_t* dest = mloc;
 
41
  PRUint32 len = paramCount;
 
42
  nsXPTCVariant* source = s;
 
43
 
 
44
  PRUint32 indx;
 
45
  PRUint32 endlen;
 
46
  endlen = (len > 7) ? 7 : len;
 
47
  /* handle the memory arguments */
 
48
  for (indx = 7; indx < len; ++indx)
 
49
  {
 
50
    if (source[indx].IsPtrData())
 
51
    {
 
52
#ifdef __LP64__
 
53
      /* 64 bit pointer mode */
 
54
      *((void**) dest) = source[indx].ptr;
 
55
#else
 
56
      /* 32 bit pointer mode */
 
57
      uint32_t* adr = (uint32_t*) dest;
 
58
      *(adr) = 0;
 
59
      *(adr+1) = (uint32_t) source[indx].ptr;
 
60
#endif
 
61
    }
 
62
    else
 
63
    switch (source[indx].type)
 
64
    {
 
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;
 
78
    default:
 
79
    // all the others are plain pointer types
 
80
#ifdef __LP64__
 
81
      /* 64 bit pointer mode */
 
82
      *((void**) dest) = source[indx].val.p;
 
83
#else
 
84
      {
 
85
      /* 32 bit pointer mode */
 
86
      uint32_t* adr = (uint32_t*) dest;
 
87
      *(adr) = 0;
 
88
      *(adr+1) = (uint32_t) source[indx].val.p;
 
89
      }
 
90
#endif
 
91
    }
 
92
    ++dest;
 
93
  }
 
94
  /* process register arguments */
 
95
  dest = iloc;
 
96
  for (indx = 0; indx < endlen; ++indx)
 
97
  {
 
98
    if (source[indx].IsPtrData())
 
99
    {
 
100
#ifdef __LP64__
 
101
      /* 64 bit pointer mode */
 
102
      *((void**) dest) = source[indx].ptr;
 
103
#else
 
104
      /* 32 bit pointer mode */
 
105
      uint32_t* adr = (uint32_t*) dest;
 
106
      *(adr) = 0;
 
107
      *(adr+1) = (uint32_t) source[indx].ptr;
 
108
#endif
 
109
    }
 
110
    else
 
111
    switch (source[indx].type)
 
112
    {
 
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;
 
123
      break;
 
124
    case nsXPTType::T_DOUBLE:
 
125
      *((double*) (floc++)) = source[indx].val.d;
 
126
      break;
 
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;
 
130
    default:
 
131
    // all the others are plain pointer types
 
132
#ifdef __LP64__
 
133
      /* 64 bit pointer mode */
 
134
      *((void**) dest) = source[indx].val.p;
 
135
#else
 
136
      {
 
137
      /* 32 bit pointer mode */
 
138
      uint32_t* adr = (uint32_t*) dest;
 
139
      *(adr) = 0;
 
140
      *(adr+1) = (uint32_t) source[indx].val.p;
 
141
      }
 
142
#endif
 
143
    }
 
144
    ++dest;
 
145
  }
 
146
 
 
147
}
 
148