xpcom/reflect/xptcall/src/md/unix/xptcinvoke_ipf32.cpp

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     2 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
     3  *
     4  * This Source Code Form is subject to the terms of the Mozilla Public
     5  * License, v. 2.0. If a copy of the MPL was not distributed with this
     6  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     8 #include "xptcprivate.h"
    10 #include <iostream.h>
    12 // "This code is for IA64 only"
    15 /* invoke_copy_to_stack() will copy from variant array 's' to
    16  * the stack argument area 'mloc', the integer register area 'iloc', and
    17  * the float register area 'floc'.
    18  *
    19  */
    20 extern "C" void
    21 invoke_copy_to_stack(uint64_t* mloc, uint64_t* iloc, uint64_t* floc,
    22   const uint32_t paramCount, nsXPTCVariant* s)
    23 {
    24   uint64_t* dest = mloc;
    25   uint32_t len = paramCount;
    26   nsXPTCVariant* source = s;
    28   uint32_t indx;
    29   uint32_t endlen;
    30   endlen = (len > 7) ? 7 : len;
    31   /* handle the memory arguments */
    32   for (indx = 7; indx < len; ++indx)
    33   {
    34     if (source[indx].IsPtrData())
    35     {
    36 #ifdef __LP64__
    37       /* 64 bit pointer mode */
    38       *((void**) dest) = source[indx].ptr;
    39 #else
    40       /* 32 bit pointer mode */
    41       uint32_t* adr = (uint32_t*) dest;
    42       *(adr) = 0;
    43       *(adr+1) = (uint32_t) source[indx].ptr;
    44 #endif
    45     }
    46     else
    47     switch (source[indx].type)
    48     {
    49     case nsXPTType::T_I8    : *(dest) = source[indx].val.i8;  break;
    50     case nsXPTType::T_I16   : *(dest) = source[indx].val.i16; break;
    51     case nsXPTType::T_I32   : *(dest) = source[indx].val.i32; break;
    52     case nsXPTType::T_I64   : *(dest) = source[indx].val.i64; break;
    53     case nsXPTType::T_U8    : *(dest) = source[indx].val.u8;  break;
    54     case nsXPTType::T_U16   : *(dest) = source[indx].val.u16; break;
    55     case nsXPTType::T_U32   : *(dest) = source[indx].val.u32; break;
    56     case nsXPTType::T_U64   : *(dest) = source[indx].val.u64; break;
    57     case nsXPTType::T_FLOAT : *(dest) = source[indx].val.u32; break;
    58     case nsXPTType::T_DOUBLE: *(dest) = source[indx].val.u64; break;
    59     case nsXPTType::T_BOOL  : *(dest) = source[indx].val.b; break;
    60     case nsXPTType::T_CHAR  : *(dest) = source[indx].val.c; break;
    61     case nsXPTType::T_WCHAR : *(dest) = source[indx].val.wc; break;
    62     default:
    63     // all the others are plain pointer types
    64 #ifdef __LP64__
    65       /* 64 bit pointer mode */
    66       *((void**) dest) = source[indx].val.p;
    67 #else
    68       {
    69       /* 32 bit pointer mode */
    70       uint32_t* adr = (uint32_t*) dest;
    71       *(adr) = 0;
    72       *(adr+1) = (uint32_t) source[indx].val.p;
    73       }
    74 #endif
    75     }
    76     ++dest;
    77   }
    78   /* process register arguments */
    79   dest = iloc;
    80   for (indx = 0; indx < endlen; ++indx)
    81   {
    82     if (source[indx].IsPtrData())
    83     {
    84 #ifdef __LP64__
    85       /* 64 bit pointer mode */
    86       *((void**) dest) = source[indx].ptr;
    87 #else
    88       /* 32 bit pointer mode */
    89       uint32_t* adr = (uint32_t*) dest;
    90       *(adr) = 0;
    91       *(adr+1) = (uint32_t) source[indx].ptr;
    92 #endif
    93     }
    94     else
    95     switch (source[indx].type)
    96     {
    97     case nsXPTType::T_I8    : *(dest) = source[indx].val.i8; break;
    98     case nsXPTType::T_I16   : *(dest) = source[indx].val.i16; break;
    99     case nsXPTType::T_I32   : *(dest) = source[indx].val.i32; break;
   100     case nsXPTType::T_I64   : *(dest) = source[indx].val.i64; break;
   101     case nsXPTType::T_U8    : *(dest) = source[indx].val.u8; break;
   102     case nsXPTType::T_U16   : *(dest) = source[indx].val.u16; break;
   103     case nsXPTType::T_U32   : *(dest) = source[indx].val.u32; break;
   104     case nsXPTType::T_U64   : *(dest) = source[indx].val.u64; break;
   105     case nsXPTType::T_FLOAT :
   106       *((double*) (floc++)) = (double) source[indx].val.f;
   107       break;
   108     case nsXPTType::T_DOUBLE:
   109       *((double*) (floc++)) = source[indx].val.d;
   110       break;
   111     case nsXPTType::T_BOOL  : *(dest) = source[indx].val.b; break;
   112     case nsXPTType::T_CHAR  : *(dest) = source[indx].val.c; break;
   113     case nsXPTType::T_WCHAR : *(dest) = source[indx].val.wc; break;
   114     default:
   115     // all the others are plain pointer types
   116 #ifdef __LP64__
   117       /* 64 bit pointer mode */
   118       *((void**) dest) = source[indx].val.p;
   119 #else
   120       {
   121       /* 32 bit pointer mode */
   122       uint32_t* adr = (uint32_t*) dest;
   123       *(adr) = 0;
   124       *(adr+1) = (uint32_t) source[indx].val.p;
   125       }
   126 #endif
   127     }
   128     ++dest;
   129   }
   131 }

mercurial