certi-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[certi-cvs] certi/scripts GenMsgCXX.py GenerateMessages.py ...


From: certi-cvs
Subject: [certi-cvs] certi/scripts GenMsgCXX.py GenerateMessages.py ...
Date: Wed, 09 Jun 2010 15:25:08 +0000

CVSROOT:        /sources/certi
Module name:    certi
Changes by:     Eric NOULARD <erk>      10/06/09 15:25:07

Modified files:
        scripts        : GenMsgCXX.py GenerateMessages.py GenMsgAST.py 

Log message:
        Merge from Lucas ALBA work
        First set of modifications
          - improve error messages
          - improve types included in the factory 

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenMsgCXX.py?cvsroot=certi&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenerateMessages.py?cvsroot=certi&r1=1.37&r2=1.38
http://cvs.savannah.gnu.org/viewcvs/certi/scripts/GenMsgAST.py?cvsroot=certi&r1=1.7&r2=1.8

Patches:
Index: GenMsgCXX.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenMsgCXX.py,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- GenMsgCXX.py        28 Mar 2010 16:07:43 -0000      1.14
+++ GenMsgCXX.py        9 Jun 2010 15:25:07 -0000       1.15
@@ -17,7 +17,7 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ## USA
 ##
-## $Id: GenMsgCXX.py,v 1.14 2010/03/28 16:07:43 erk Exp $
+## $Id: GenMsgCXX.py,v 1.15 2010/06/09 15:25:07 erk Exp $
 ## ----------------------------------------------------------------------------
 
 """
@@ -89,6 +89,21 @@
                                'double'   : 'read_double',}
         self.__languageName="C++"
         self.replacePrefix = None
+        self.exportPrefix = ""
+        self.serializeBufferType = "libhla::MessageBuffer"
+        self.messageTypeGetter = "getType()"
+        self.exception = ["std::string"]
+
+    def getTargetTypeName(self,name):
+        if name in self.builtinTypeMap.keys():
+            return self.builtinTypeMap[name]
+        else:
+            t=self.AST.getType(name)
+        if isinstance(t,GenMsgAST.EnumType):
+            prefix=self.AST.name.split(".")[0]+"::"
+            return prefix+name
+        else:
+            return name
 
     def getRepresentationFor(self,name):
         for native in self.AST.natives:
@@ -241,6 +256,32 @@
         if field.qualifier == "optional":
             stream.write(self.getIndent()+"bool _has%s;\n" % 
self.upperFirst(field.name))
                                                     
+    def generateEnum(self,stream,enum):
+        self.writeComment(stream, enum)
+        stream.write(self.getIndent())
+        stream.write("typedef enum %s {\n" % enum.name)
+        self.indent()
+        first = True
+        lastname = (enum.values[len(enum.values)-1]).name
+        for enumval in enum.values:
+            if first:
+                stream.write(self.getIndent())
+                stream.write("%s = %d, " % (enumval.name,enumval.value))       
         
+                first=False
+                self.writeComment(stream, enumval)
+            else:
+                stream.write(self.getIndent())
+            if (enumval.name==lastname):
+                stream.write("%s \n" % enumval.name)            
+            else:
+                stream.write("%s, " % enumval.name)            
+                self.writeComment(stream, enumval)
+                                            
+        self.unIndent()      
+        stream.write(self.getIndent())          
+        stream.write("} %s_t; " %  enum.name) 
+        stream.write(self.commentLineBeginWith + "end of enum %s \n" % 
enum.name)
+                                                    
     def generateHeader(self,stream,factoryOnly=False):
         # write the usual header protecting MACRO
         supposedHeaderName=stream.name
@@ -310,30 +351,11 @@
             # Generate enum
             lastname = ""
             for enum in self.AST.enums:            
-                self.writeComment(stream, enum)
-                stream.write(self.getIndent())
-                stream.write("typedef enum %s {\n" % enum.name)
-                self.indent()
-                first = True
-                lastname = (enum.values[len(enum.values)-1]).name
-                for enumval in enum.values:
-                    if first:
-                        stream.write(self.getIndent())
-                        stream.write("%s = %d, " % 
(enumval.name,enumval.value))                
-                        first=False
-                        self.writeComment(stream, enumval)
-                    else:
-                        stream.write(self.getIndent())
-                        if (enumval.name==lastname):
-                            stream.write("%s \n" % enumval.name)               
    
-                        else:
-                            stream.write("%s, " % enumval.name)                
    
-                            self.writeComment(stream, enumval)                 
           
-                self.unIndent()      
-                stream.write(self.getIndent())          
-                stream.write("} %s_t; " %  enum.name) 
-                stream.write(self.commentLineBeginWith + "end of enum %s \n" % 
enum.name)
+                self.generateEnum(stream, enum)
+               stream.write("\n")
+               
             # close enum namespace            
+           
             self.unIndent()
             stream.write(self.getIndent())
             stream.write("}\n")
@@ -342,7 +364,7 @@
             for msg in self.AST.messages:
                 self.writeComment(stream, msg)
                 stream.write(self.getIndent())
-                stream.write("class CERTI_EXPORT %s" % msg.name)
+                stream.write("class %s %s" % (self.exportPrefix,msg.name))
                 if msg.hasMerge():
                     stream.write(" : public %s {\n" % msg.merge.name)
                     virtual = "virtual "
@@ -354,6 +376,12 @@
                 # begin public
                 stream.write(self.getIndent()+"public:\n") 
                 self.indent()
+               
+               if msg.hasEnum():
+                   self.generateEnum(stream,msg.enum)
+                   stream.write("\n")
+               
+                   
                 if msg.hasMerge():
                    stream.write(self.getIndent()+"typedef %s 
Super;\n"%msg.merge.name)
                 # now write constructor/destructor
@@ -364,8 +392,8 @@
                 # if we have some specific field
                 if len(msg.fields)>0:
                     # serialize/deserialize 
-                    stream.write(self.getIndent()+virtual+"void 
serialize(MessageBuffer& msgBuffer);\n")
-                    stream.write(self.getIndent()+virtual+"void 
deserialize(MessageBuffer& msgBuffer);\n")
+                    stream.write(self.getIndent()+virtual+"void serialize(%s& 
msgBuffer);\n" % (self.serializeBufferType))
+                    stream.write(self.getIndent()+virtual+"void 
deserialize(%s& msgBuffer);\n" % (self.serializeBufferType))
                     # specific getter/setter
                     stream.write(self.getIndent()+self.commentLineBeginWith+" 
specific Getter(s)/Setter(s)\n")
                     for field in msg.fields:
@@ -406,13 +434,24 @@
         # @todo
         if self.AST.hasFactory():             
             self.writeComment(stream, self.AST.factory)
-            stream.write(self.getIndent() + "class CERTI_EXPORT %s {\n" % 
self.AST.factory.name)
+            stream.write(self.getIndent() + "class %s %s {\n" % 
(self.exportPrefix,self.AST.factory.name))
             self.indent()
             # begin public
             stream.write(self.getIndent()+"public:\n")            
             self.indent()            
-            stream.write(self.getIndent()+"static %s* %s(%s type) throw 
(NetworkError, NetworkSignal);\n"% self.AST.factory.creator)
-            stream.write(self.getIndent()+"static %s* %s(%s stream) throw 
(NetworkError, NetworkSignal);\n"% self.AST.factory.receiver)
+           
+            stream.write(self.getIndent()+"static %s* %s(%s type) throw ("% 
self.AST.factory.creator)
+           stream.write("%s" %(self.exception[0]))
+           for exception in self.exception[1:]:
+               stream.write(" ,%s" %(exception))
+           stream.write("); \n")
+           
+            stream.write(self.getIndent()+"static %s* %s(%s stream) throw ("% 
self.AST.factory.receiver)
+           stream.write("%s" %(self.exception[0]))
+           for exception in self.exception[1:]:
+               stream.write(" ,%s" %(exception))
+           stream.write("); \n")
+           
             self.unIndent()
             #end public
             #begin protected
@@ -571,7 +610,12 @@
             
     def writeFactoryCreator(self,stream):
         creator = 
(self.AST.factory.creator[0],self.AST.factory.name)+self.AST.factory.creator[1:]
            
-        stream.write(self.getIndent()+"%s* %s::%s(%s type) throw 
(NetworkError, NetworkSignal) {\n"% creator)
+        stream.write(self.getIndent()+"%s* %s::%s(%s type) throw ("% creator)
+       stream.write("%s" %(self.exception[0]))
+       for exception in self.exception[1:]:
+           stream.write(" ,%s" %(exception))
+       stream.write(") { \n")
+       
         self.indent()
         stream.write(self.getIndent()+"%s* msg = NULL;\n\n" % creator[0])
         stream.write(self.getIndent() + "switch (type) {\n")
@@ -579,9 +623,14 @@
         for e in self.AST.eMessageType.values:
             if (None!=self.replacePrefix):                        
                 stream.write(self.getIndent()+"case %s::%s:\n" % 
(creator[0],e.name.replace(self.replacePrefix[0],"",1)))                
+            else:
+               stream.write(self.getIndent()+"case %s::%s:\n" % 
(creator[0],e.name))
+                        
             self.indent()
+           
             if None==e.type:
-                stream.write(self.getIndent()+"throw NetworkError(\"%s message 
type should not be used!!\");\n"%e.name)
+               # we throw here the first exception of the list 
+                stream.write(self.getIndent()+"throw %s(\"%s message type 
should not be used!!\");\n"%(self.exception[0],e.name))
             else:
                 stream.write(self.getIndent()+"msg = new %s();\n" % e.type)
             stream.write(self.getIndent()+"break;\n")
@@ -594,10 +643,15 @@
     
     def writeFactoryReceiver(self,stream):
         receiver = 
(self.AST.factory.receiver[0],self.AST.factory.name)+self.AST.factory.receiver[1:]
-        stream.write(self.getIndent()+"%s* %s::%s(%s stream) throw 
(NetworkError, NetworkSignal) {\n"% receiver)
+        stream.write(self.getIndent()+"%s* %s::%s(%s stream) throw ("% 
receiver)
+        stream.write("%s" %(self.exception[0]))
+       for exception in self.exception[1:]:
+           stream.write(" ,%s" %(exception))
+       stream.write(") { \n")
+       
         self.indent()
         stream.write(self.getIndent()+self.commentLineBeginWith+" FIXME This 
is not thread safe\n")
-        stream.write(self.getIndent()+"static MessageBuffer msgBuffer;\n")
+        stream.write(self.getIndent()+"static %s msgBuffer;\n" % 
(self.serializeBufferType))
         stream.write(self.getIndent()+"%s  msgGen;\n" % receiver[0])
         stream.write(self.getIndent()+"%s* msg;\n\n" % receiver[0])
         stream.write(self.getIndent()+self.commentLineBeginWith+" receive 
generic message \n")
@@ -605,7 +659,7 @@
         stream.write(self.getIndent()+self.commentLineBeginWith+" create 
specific message from type \n")
         
         stream.write(self.getIndent()+"msg = ");
-        
stream.write(self.AST.factory.name+"::"+self.AST.factory.creator[1]+"(msgGen.getMessageType());\n")
+        
stream.write(self.AST.factory.name+"::"+self.AST.factory.creator[1]+"(msgGen.%s);\n"
 %(self.messageTypeGetter))
         
         
stream.write(self.getIndent()+"msgBuffer.assumeSizeFromReservedBytes();\n")    
         stream.write(self.getIndent()+"msg->deserialize(msgBuffer);\n")
@@ -665,7 +719,7 @@
                 # if we have some specific field
                 if len(msg.fields)>0:
                     # begin serialize method 
-                    stream.write(self.getIndent()+"void 
%s::serialize(MessageBuffer& msgBuffer) {\n" % msg.name)
+                    stream.write(self.getIndent()+"void %s::serialize(%s& 
msgBuffer) {\n" % (msg.name,self.serializeBufferType))
                     self.indent()
                     if msg.hasMerge():
                         
stream.write(self.getIndent()+self.commentLineBeginWith)
@@ -679,7 +733,7 @@
                     # end serialize method
                     
                     # begin deserialize method
-                    stream.write(self.getIndent()+"void 
%s::deserialize(MessageBuffer& msgBuffer) {\n" % msg.name)
+                    stream.write(self.getIndent()+"void %s::deserialize(%s& 
msgBuffer) {\n" % (msg.name,self.serializeBufferType))
                     self.indent()
                     if msg.hasMerge():
                         
stream.write(self.getIndent()+self.commentLineBeginWith)
@@ -731,6 +785,10 @@
         self.replacePrefix = list()
         self.replacePrefix.append("M_")
         self.replacePrefix.append("Message::")     
+        self.exportPrefix = "CERTI_EXPORT"   
+       self.serializeBufferType = "libhla::MessageBuffer"
+       self.messageTypeGetter = "getMessageType()"
+       self.exception = ["NetworkError","NetworkSignal"]
 
 class CXXCERTINetworkMessageGenerator(CXXCERTIGenerator):    
     """
@@ -746,3 +804,9 @@
         self.replacePrefix = list()
         self.replacePrefix.append("NM_")
         self.replacePrefix.append("NetworkMessage::")     
+        self.exportPrefix = "CERTI_EXPORT"
+        self.serializeBufferType = "libhla::MessageBuffer"
+       self.messageTypeGetter = "getMessageType()"
+       self.exception = ["NetworkError","NetworkSignal"]
+
+

Index: GenerateMessages.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenerateMessages.py,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -b -r1.37 -r1.38
--- GenerateMessages.py 16 May 2010 08:29:00 -0000      1.37
+++ GenerateMessages.py 9 Jun 2010 15:25:07 -0000       1.38
@@ -19,7 +19,7 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ## USA
 ##
-## $Id: GenerateMessages.py,v 1.37 2010/05/16 08:29:00 erk Exp $
+## $Id: GenerateMessages.py,v 1.38 2010/06/09 15:25:07 erk Exp $
 ## ----------------------------------------------------------------------------
 
 """
@@ -80,6 +80,7 @@
 
 generatorBackends = dict()
 generatorBackends[GenMsgBase.MsgSpecGenerator.generatorName().lower()] = 
GenMsgBase.MsgSpecGenerator
+generatorBackends[GenMsgCXX.CXXCERTIGenerator.generatorName().lower()] = 
GenMsgCXX.CXXCERTIGenerator
 generatorBackends[GenMsgCXX.CXXCERTIMessageGenerator.generatorName().lower()] 
= GenMsgCXX.CXXCERTIMessageGenerator
 
generatorBackends[GenMsgCXX.CXXCERTINetworkMessageGenerator.generatorName().lower()]
 = GenMsgCXX.CXXCERTINetworkMessageGenerator
 generatorBackends[GenMsgPython.PythonGenerator.generatorName().lower()] = 
GenMsgPython.PythonGenerator

Index: GenMsgAST.py
===================================================================
RCS file: /sources/certi/certi/scripts/GenMsgAST.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- GenMsgAST.py        16 May 2010 08:29:00 -0000      1.7
+++ GenMsgAST.py        9 Jun 2010 15:25:07 -0000       1.8
@@ -17,7 +17,7 @@
 ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ## USA
 ##
-## $Id: GenMsgAST.py,v 1.7 2010/05/16 08:29:00 erk Exp $
+## $Id: GenMsgAST.py,v 1.8 2010/06/09 15:25:07 erk Exp $
 ## ----------------------------------------------------------------------------
 
 """
@@ -99,7 +99,7 @@
     
     """
     def __init__(self,name):
-        super(MessageAST,self).__init__(name=name)
+        super(MessageAST,self).__init__(name=os.path.basename(name))
         self.__package            = None
         self.__version            = None
         self.__factory            = None
@@ -168,6 +168,19 @@
     # pythonic getter/setter using properties   
     enums = property(fget=__getEnumTypes,fset=None,fdel=None,doc=None)         
         
+    def getRootMergeType(self,msg):
+       """ return the root merge type
+       """
+       retval = None
+       current = msg
+       while retval==None:                         
+               if isinstance(current,MessageType):
+                       if current.hasMerge():
+                         current=AST.getType(current.merge)
+                       else: 
+                         retval = current
+               else:
+                       retval = current                
         
     def add(self,any):
         """ 
@@ -406,6 +419,7 @@
         super(MessageType,self).__init__(name=name)
         self.fields        = fields
         self.merge         = merge                 
+        self.enum          = None
     
     def __repr__(self):
         res = "message %s " % self.name
@@ -414,6 +428,9 @@
     def hasMerge(self):
         return self.merge != None
     
+    def hasEnum(self):
+        return self.enum != None
+    
     class CombinedField(ASTElement):
         def __init__(self,typeid,fields):
             super(MessageType.CombinedField,self).__init__(name="Combined")
@@ -525,21 +542,41 @@
         enumval = EnumType.EnumValue("NOT_USED",None)
         enumval.type = None
         msgTypeEnumVals = [enumval]
+        lastMerge = None
         for msg in AST.messages:
             # We do not generate the enum factory entry for a message
             # with no merge there is no possible factory for that
             # kind of message. 
+            # However some message types may merge from one another
+            # as soon as there is a "common" root merge type 
             if msg.hasMerge():
+               if (None!=lastMerge):
+                          # recurse to find root merge                         
                   
+                   if (lastMerge!=AST.getRootMergeType(msg.merge)):
+                                         self.logger.error("Error: there is 
more than one merged type (%s != %s). You should use one merged type only" % 
(lastMerge, msg.merge))
+                                         self.logger.fatal(" --> Check lines 
(%d,%d)" % (msg.linespan) + " of <%s>" % AST.name )
+                                         return           
+               else:
+                   lastMerge = AST.getRootMergeType(msg.merge)
+            
                 enumval      = EnumType.EnumValue(msg.name.upper(),None)
                 enumval.type = msg.name
                 msgTypeEnumVals.append(enumval)
             if not self.checkMessageFields(msg,AST):
                return            
+       
+       
+       
         enumval      = EnumType.EnumValue("LAST",None)
         enumval.type = None                                    
         msgTypeEnumVals.append(enumval)
-        AST.eMessageType = 
EnumType(AST.name.split(".")[0]+"_MessageType",msgTypeEnumVals) 
-        AST.add(AST.eMessageType)
+        AST.eMessageType = EnumType("MessageType",msgTypeEnumVals)
+       if lastMerge != None:
+            mergeClass=AST.getType(lastMerge)
+           if isinstance(mergeClass,MessageType):
+                mergeClass.enum = AST.eMessageType
+       
+        
          
 
         # @todo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]