[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