[Orxonox-commit 748] r3277 - branches/netp6/src/network
scheusso at orxonox.net
scheusso at orxonox.net
Sun Jul 12 19:20:39 CEST 2009
Author: scheusso
Date: 2009-07-12 19:20:39 +0200 (Sun, 12 Jul 2009)
New Revision: 3277
Modified:
branches/netp6/src/network/NetworkFunction.h
Log:
fixed a 64bit issue and inserted some static asserts to prevent further runtime errors with function pointer sizes bigger than expected ...
Modified: branches/netp6/src/network/NetworkFunction.h
===================================================================
--- branches/netp6/src/network/NetworkFunction.h 2009-07-12 14:49:41 UTC (rev 3276)
+++ branches/netp6/src/network/NetworkFunction.h 2009-07-12 17:20:39 UTC (rev 3277)
@@ -36,6 +36,7 @@
#include <map>
#include <string>
#include <boost/preprocessor/cat.hpp>
+#include <boost/static_assert.hpp>
#include "core/OrxonoxClass.h"
#include "core/Functor.h"
@@ -45,9 +46,9 @@
namespace orxonox
{
-#ifdef ORXONOX_COMPILER_GCC
+#if defined(ORXONOX_COMPILER_GCC) && defined(ORXONOX_ARCH_32)
static const unsigned int MAX_FUNCTION_POINTER_SIZE = 8;
-#else //ORXONOX_COMPILER_GCC
+#else
static const unsigned int MAX_FUNCTION_POINTER_SIZE = 16;
#endif //ORXONOX_COMPILER_GCC
static const unsigned int MAX_FUNCTION_POINTER_INTS = (MAX_FUNCTION_POINTER_SIZE-1)/4+1;
@@ -56,7 +57,7 @@
uint32_t pointer[MAX_FUNCTION_POINTER_INTS];
bool operator<(const NetworkFunctionPointer& b) const
{
-#ifdef ORXONOX_COMPILER_GCC
+#if defined(ORXONOX_COMPILER_GCC) && defined(ORXONOX_ARCH_32)
return pointer[0]<b.pointer[0] ? true : pointer[1]<b.pointer[1];
#else //ORXONOX_COMPILER_GCC
return pointer[0]<b.pointer[0] ? true : ( pointer[1]<b.pointer[1] ? true : ( pointer[2]<b.pointer[2] ? true : pointer[3]<b.pointer[3] ) );
@@ -194,7 +195,8 @@
template<class T> inline void copyPtr( T ptr, NetworkFunctionPointer& destptr)
{
- memset((uint8_t*)&destptr + sizeof(T), 0, sizeof(NetworkFunctionPointer)-sizeof(T));
+ if( sizeof(NetworkFunctionPointer)-sizeof(T) > 0)
+ memset((uint8_t*)&destptr + sizeof(T), 0, sizeof(NetworkFunctionPointer)-sizeof(T));
T p2 = ptr;
memcpy( &destptr, &p2, sizeof(T) );
// for(unsigned int i=0; i<(sizeof(T)-1/4)+1; i++)
@@ -203,6 +205,7 @@
template<class T> inline void* registerStaticNetworkFunctionFct( T ptr, const std::string& name )
{
+ BOOST_STATIC_ASSERT( sizeof(T)<=sizeof(NetworkFunctionPointer) ); // if this fails your compiler uses bigger pointers for static functions than defined above
NetworkFunctionPointer destptr;
copyPtr( ptr, destptr );
new NetworkFunctionStatic( createFunctor(ptr), name, destptr );
@@ -211,6 +214,7 @@
template<class T, class PT> inline void* registerMemberNetworkFunctionFct( PT ptr, const std::string& name )
{
+ BOOST_STATIC_ASSERT( sizeof(PT)<=sizeof(NetworkFunctionPointer) ); // if this fails your compiler uses bigger pointers for a specific kind of member functions than defined above
NetworkFunctionPointer destptr;
copyPtr( ptr, destptr );
new NetworkMemberFunction<T>( createFunctor(ptr), name, destptr );
More information about the Orxonox-commit
mailing list