}
PrepareAndDispatch( nsXPTCStubBase *self, PRUint32 methodIndex,                    PRUint32 *args)#endif{#define PARAM_BUFFER_COUNT     16    nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT];    nsXPTCMiniVariant* dispatchParams = NULL;    nsIInterfaceInfo* iface_info = NULL;    const nsXPTMethodInfo* info;    PRUint8 paramCount;    PRUint8 i;    nsresult result = NS_ERROR_FAILURE;    // If anything fails before stackBytesToPop can be set then    // the failure is completely catastrophic!    NS_ASSERTION(self,"no self");    self->GetInterfaceInfo(&iface_info);    NS_ASSERTION(iface_info,"no interface info");    iface_info->GetMethodInfo(PRUint16(methodIndex), &info);    NS_ASSERTION(info,"no interface info");    paramCount = info->GetParamCount();#ifdef XP_OS2_VACPP    /* If paramCount is > 0, write out the EDX pointer to the       space on the stack args[0]. args[-4] is the space on       the stack where it was pushed */    if (paramCount) {        args[0] = args[-4];    }    /* If paramCount is > 1, write out the ECX pointer to the       space on the stack args[1]. args[-3] is the space on       the stack where it was pushed */    if (paramCount > 1) {        args[1] = args[-3];    }#endif    // setup variant array pointer    if(paramCount > PARAM_BUFFER_COUNT)        dispatchParams = new nsXPTCMiniVariant[paramCount];    else        dispatchParams = paramBuffer;    NS_ASSERTION(dispatchParams,"no place for params");    PRUint32* ap = args;    for(i = 0; i < paramCount; i++, ap++)    {        const nsXPTParamInfo& param = info->GetParam(i);        const nsXPTType& type = param.GetType();        nsXPTCMiniVariant* dp = &dispatchParams[i];        if(param.IsOut() || !type.IsArithmetic())        {            dp->val.p = (void*) *ap;            continue;        }        // else        switch(type)        {        case nsXPTType::T_I8     : dp->val.i8  = *((PRInt8*)  ap);       break;        case nsXPTType::T_I16    : dp->val.i16 = *((PRInt16*) ap);       break;        case nsXPTType::T_I32    : dp->val.i32 = *((PRInt32*) ap);       break;        case nsXPTType::T_I64    : dp->val.i64 = *((PRInt64*) ap); ap++; break;        case nsXPTType::T_U8     : dp->val.u8  = *((PRUint8*) ap);       break;        case nsXPTType::T_U16    : dp->val.u16 = *((PRUint16*)ap);       break;        case nsXPTType::T_U32    : dp->val.u32 = *((PRUint32*)ap);       break;        case nsXPTType::T_U64    : dp->val.u64 = *((PRUint64*)ap); ap++; break;        case nsXPTType::T_FLOAT  : dp->val.f   = *((float*)   ap);       break;        case nsXPTType::T_DOUBLE : dp->val.d   = *((double*)  ap); ap++; break;        case nsXPTType::T_BOOL   : dp->val.b   = *((PRBool*)  ap);       break;        case nsXPTType::T_CHAR   : dp->val.c   = *((char*)    ap);       break;        case nsXPTType::T_WCHAR  : dp->val.wc  = *((wchar_t*) ap);       break;        default:            NS_ASSERTION(0, "bad type");            break;        }    }    result = self->CallMethod((PRUint16)methodIndex, info, dispatchParams);    NS_RELEASE(iface_info);    if(dispatchParams != paramBuffer)        delete [] dispatchParams;    return result;}