[DEBUG] correct order of parameter in c++

gcc of rpi3 change it order of usnig parameter ==> I need to check it at the runtime now.
This commit is contained in:
Edouard DUPIN 2016-08-03 21:31:06 +02:00
parent 47c69df1e0
commit 3287796807
4 changed files with 50 additions and 27 deletions

View File

@ -7,6 +7,34 @@
#include <zeus/debug.h>
#include <etk/os/FSNode.h>
static int32_t firstCall(bool& _value) {
_value = false;
return 51;
}
static int32_t secondCall(bool& _value) {
_value = true;
return 452;
}
static void unneededCall(int32_t _val1, int32_t _val2) {
// Nothing to do ...
}
bool zeus::checkOrderFunctionParameter() {
static bool value = false;
static bool init = false;
if (init == true) {
return value;
}
// use a temporary variable to mermit to have multiple first call and like this permit to not need to initialize it while not really needed
bool valueTmp = false;
unneededCall(firstCall(valueTmp),secondCall(valueTmp));
value = valueTmp;
init = true;
return value;
}
enum zeus::AbstractFunction::type zeus::AbstractFunction::getType() const {
return m_type;
}

View File

@ -13,6 +13,10 @@
namespace zeus {
/**
* @bried check if the compilater order the function element call in order or backOrder
*/
bool checkOrderFunctionParameter();
/**
* @brief Interface to store a function and call it after with a @ref zeus::Buffer
*/

View File

@ -27,19 +27,16 @@ namespace zeus {
if (_obj == nullptr) {
return;
}
#if defined(__clang__)
ZEUS_RETURN ret;
if (zeus::checkOrderFunctionParameter() == true) {
// clang generate a basic warning:
// warning: multiple unsequenced modifications to 'idParam' [-Wunsequenced]
int32_t idParam = 0;
ZEUS_RETURN ret = (*_pointer.*_func)(_obj->getParameter<ZEUS_TYPES>(idParam++)...);
#elif defined(__GNUC__) || defined(__GNUG__) || defined(_MSC_VER)
ret = (*_pointer.*_func)(_obj->getParameter<ZEUS_TYPES>(idParam++)...);
} else {
int32_t idParam = int32_t(sizeof...(ZEUS_TYPES))-1;
ZEUS_RETURN ret = (*_pointer.*_func)(_obj->getParameter<ZEUS_TYPES>(idParam--)...);
#else
#error Must be implemented ...
ZEUS_RETURN ret;
return;
#endif
ret = (*_pointer.*_func)(_obj->getParameter<ZEUS_TYPES>(idParam--)...);
}
_interfaceClient->addAsync([=](WebServer* _interface) {
_interface->answerValue(_obj->getTransactionId(), ret, _obj->getClientId());
return true;
@ -60,18 +57,15 @@ namespace zeus {
if (_obj == nullptr) {
return;
}
#if defined(__clang__)
if (zeus::checkOrderFunctionParameter() == true) {
// clang generate a basic warning:
// warning: multiple unsequenced modifications to 'idParam' [-Wunsequenced]
int32_t idParam = 0;
(*_pointer.*_func)(_obj->getParameter<ZEUS_TYPES>(idParam++)...);
#elif defined(__GNUC__) || defined(__GNUG__) || defined(_MSC_VER)
} else {
int32_t idParam = int32_t(sizeof...(ZEUS_TYPES))-1;
(*_pointer.*_func)(_obj->getParameter<ZEUS_TYPES>(idParam--)...);
#else
#error Must be implemented ...
return;
#endif
}
_interfaceClient->addAsync([=](WebServer* _interface) {
_interface->answerVoid(_obj->getTransactionId(), _obj->getClientId());
return true;

View File

@ -22,17 +22,16 @@ namespace zeus {
if (_obj == nullptr) {
return;
}
#if defined(__clang__)
ZEUS_RETURN ret;
if (zeus::checkOrderFunctionParameter() == true) {
// clang generate a basic warning:
// warning: multiple unsequenced modifications to 'idParam' [-Wunsequenced]
int32_t idParam = 0;
ZEUS_RETURN ret = _func(_obj->getParameter<ZEUS_TYPES>(idParam++)...);
#elif defined(__GNUC__) || defined(__GNUG__) || defined(_MSC_VER)
ret = _func(_obj->getParameter<ZEUS_TYPES>(idParam++)...);
} else {
int32_t idParam = int32_t(sizeof...(ZEUS_TYPES))-1;
ZEUS_RETURN ret = _func(_obj->getParameter<ZEUS_TYPES>(idParam--)...);
#else
#error Must be implemented ...
#endif
ret = _func(_obj->getParameter<ZEUS_TYPES>(idParam--)...);
}
_interfaceClient->addAsync([=](WebServer* _interface) {
_interface->answerValue(_obj->getTransactionId(), ret, _obj->getClientId());
return true;
@ -51,17 +50,15 @@ namespace zeus {
if (_obj == nullptr) {
return;
}
#if defined(__clang__)
if (zeus::checkOrderFunctionParameter() == true) {
// clang generate a basic warning:
// warning: multiple unsequenced modifications to 'idParam' [-Wunsequenced]
int32_t idParam = 0;
_func(_obj->getParameter<ZEUS_TYPES>(idParam++)...);
#elif defined(__GNUC__) || defined(__GNUG__) || defined(_MSC_VER)
} else {
int32_t idParam = int32_t(sizeof...(ZEUS_TYPES))-1;
_func(_obj->getParameter<ZEUS_TYPES>(idParam--)...);
#else
#error Must be implemented ...
#endif
}
_interfaceClient->addAsync([=](WebServer* _interface) {
_interface->answerVoid(_obj->getTransactionId(), _obj->getClientId());
return true;