nsID** result)
nsID* result)
GetInterfaceTypeFromParam(XPCCallContext& ccx,                          nsIInterfaceInfo* ifaceInfo,                          const nsXPTMethodInfo* methodInfo,                          const nsXPTParamInfo& paramInfo,                          uint16 vtblIndex,                          uint8 paramIndex,                          const nsXPTType& datum_type,                          nsXPTCVariant* dispatchParams,                          nsID** result){    uint8 argnum;    nsresult rv;    uint8 type_tag = datum_type.TagPart();    // XXX fixup the various exceptions that are thrown    if(type_tag == nsXPTType::T_INTERFACE)    {        rv = ifaceInfo->GetIIDForParam(vtblIndex, &paramInfo, result);        if(NS_FAILED(rv))            return ThrowBadParam(NS_ERROR_XPC_CANT_GET_PARAM_IFACE_INFO, paramIndex, ccx);    }    else if(type_tag == nsXPTType::T_INTERFACE_IS)    {        rv = ifaceInfo->GetInterfaceIsArgNumberForParam(vtblIndex, &paramInfo, &argnum);        if(NS_FAILED(rv))            return Throw(NS_ERROR_XPC_CANT_GET_ARRAY_INFO, ccx);        const nsXPTParamInfo& arg_param = methodInfo->GetParam(argnum);        const nsXPTType& arg_type = arg_param.GetType();                // The xpidl compiler ensures this. We reaffirm it for safety.        if(!arg_type.IsPointer() || arg_type.TagPart() != nsXPTType::T_IID)            return ThrowBadParam(NS_ERROR_XPC_CANT_GET_PARAM_IFACE_INFO, paramIndex, ccx);        if(!(*result = (nsID*) nsMemory::Clone(dispatchParams[argnum].val.p,                                               sizeof(nsID))))            return ReportOutOfMemory(ccx);    }    return JS_TRUE;}