Back to index

lightning-sunbird  0.9+nobinonly
xptcinvoke_ppc_aix64.cpp
Go to the documentation of this file.
00001 /* ***** BEGIN LICENSE BLOCK *****
00002  * Version: MPL 1.1/LGPL 2.1/GPL 2.0
00003  *
00004  * The contents of this file are subject to the Mozilla Public
00005  * License Version 1.1 (the "License"); you may not use this file
00006  * except in compliance with the License. You may obtain a copy of
00007  * the License at http://www.mozilla.org/MPL/
00008  *
00009  * Software distributed under the License is distributed on an "AS
00010  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
00011  * implied. See the License for the specific language governing
00012  * rights and limitations under the License.
00013  *
00014  * The Original Code is mozilla.org code.
00015  *
00016  * The Initial Developer of the Original Code is IBM Corporation.
00017  * Portions created by IBM are
00018  *   Copyright (C) 2002, International Business Machines Corporation.
00019  *   All Rights Reserved.
00020  *
00021  * Contributor(s):
00022  *
00023  *  Alternatively, the contents of this file may be used under the terms of
00024  *  either of the GNU General Public License Version 2 or later (the "GPL"),
00025  *  or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00026  *  in which case the provisions of the GPL or the LGPL are applicable instead
00027  *  of those above. If you wish to allow use of your version of this file only
00028  *  under the terms of either the GPL or the LGPL, and not to allow others to
00029  *  use your version of this file under the terms of the MPL, indicate your
00030  *  decision by deleting the provisions above and replace them with the notice
00031  *  and other provisions required by the LGPL or the GPL. If you do not delete
00032  *  the provisions above, a recipient may use your version of this file under
00033  *  the terms of any one of the MPL, the GPL or the LGPL.
00034  *
00035  * ***** END LICENSE BLOCK ***** */
00036 
00037 /* Platform specific code to invoke XPCOM methods on native objects */
00038 
00039 #include "xptcprivate.h"
00040 
00041 #ifdef _AIX
00042 
00043 extern "C" void
00044 invoke_copy_to_stack(PRUint64* d, PRUint32 paramCount, nsXPTCVariant* s, double *fprData)
00045 {
00046 /*
00047     We need to copy the parameters for this function to locals and use them
00048     from there since the parameters occupy the same stack space as the stack
00049     we're trying to populate.
00050 */
00051     PRUint64 *l_d = d;
00052     nsXPTCVariant *l_s = s;
00053     PRUint32 l_paramCount = paramCount, fpCount = 0;
00054     double *l_fprData = fprData;
00055 
00056     for(PRUint32 i = 0; i < l_paramCount; i++, l_d++, l_s++)
00057     {
00058         if(l_s->IsPtrData())
00059         {
00060             *l_d = (PRUint64)l_s->ptr;
00061             continue;
00062         }
00063         switch(l_s->type)
00064         {
00065         case nsXPTType::T_I8:    *l_d = (PRUint64)l_s->val.i8;   break;
00066         case nsXPTType::T_I16:   *l_d = (PRUint64)l_s->val.i16;  break;
00067         case nsXPTType::T_I32:   *l_d = (PRUint64)l_s->val.i32;  break;
00068         case nsXPTType::T_I64:   *l_d = (PRUint64)l_s->val.i64;  break;
00069         case nsXPTType::T_U8:    *l_d = (PRUint64)l_s->val.u8;   break;
00070         case nsXPTType::T_U16:   *l_d = (PRUint64)l_s->val.u16;  break;
00071         case nsXPTType::T_U32:   *l_d = (PRUint64)l_s->val.u32;  break;
00072         case nsXPTType::T_U64:   *l_d = (PRUint64)l_s->val.u64;  break;
00073         case nsXPTType::T_BOOL:  *l_d = (PRUint64)l_s->val.b;    break;
00074         case nsXPTType::T_CHAR:  *l_d = (PRUint64)l_s->val.c;    break;
00075         case nsXPTType::T_WCHAR: *l_d = (PRUint64)l_s->val.wc;   break;
00076 
00077         case nsXPTType::T_DOUBLE:
00078             *((double*)l_d) = l_s->val.d;
00079             if(fpCount < 13)
00080                 l_fprData[fpCount++] = l_s->val.d;
00081             break;
00082         case nsXPTType::T_FLOAT:
00083             *((float*)l_d) = l_s->val.f;
00084             if(fpCount < 13)
00085                 l_fprData[fpCount++] = l_s->val.f;
00086             break;
00087         default:
00088             // all the others are plain pointer types
00089             *l_d = (PRUint64)l_s->val.p;
00090             break;
00091         }
00092     }
00093 }
00094 #endif
00095