Raise error if length of exported symbols exceeds boost::serialization limit
[libt2n] / codegen / main.cpp
index 105dc24..7271b22 100644 (file)
@@ -30,6 +30,7 @@
 #include <stdexcept>
 #include <string>
 #include <boost/lexical_cast.hpp>
+#include <boost/serialization/extended_type_info.hpp>
 
 #include "config.h"
 
@@ -142,6 +143,15 @@ struct parse_error : public std::runtime_error
     {}
 };
 
+struct error_name_too_long : public std::runtime_error
+{
+    error_name_too_long(const std::string &name)
+            : std::runtime_error("symbol name '" + name + "' too long for serialization ("
+                                 + boost::lexical_cast<std::string>(name.length()) + ">"
+                                 + boost::lexical_cast<std::string>(BOOST_SERIALIZATION_MAX_KEY_SIZE-1) + ")")
+    {}
+};
+
 //! get type by id
 /*!
   \return type name or empty string on error
@@ -224,11 +234,17 @@ struct t2n_procedure
 
     std::string ret_classname() const
     {
-        return name+mangled+"_res";
+        std::string result = name+mangled+"_res";
+        if (result.length() >= BOOST_SERIALIZATION_MAX_KEY_SIZE)
+            throw error_name_too_long(result);
+        return result;
     }
     std::string cmd_classname() const
     {
-        return name+mangled+"_cmd";
+        std::string result = name+mangled+"_cmd";
+        if (result.length() >= BOOST_SERIALIZATION_MAX_KEY_SIZE)
+            throw error_name_too_long(result);
+        return result;
     }
     bool hasReturn() const {return !ret_type.isVoid();}
 };