[Top][All Lists]
[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
- [certi-cvs] certi/scripts GenMsgCXX.py GenerateMessages.py ...,
certi-cvs <=