--- a/ipc/ipdl/ipdl/lower.py
+++ b/ipc/ipdl/ipdl/lower.py
@@ -1657,30 +1657,38 @@ class _GenerateProtocolCode(ipdl.ast.Vis
msgenum.addId(self.protocol.name +'End')
ns.addstmts([ StmtDecl(Decl(msgenum, '')), Whitespace.NL ])
tfDecl, tfDefn = _splitFuncDeclDefn(self.genTransitionFunc())
ns.addstmts([ tfDecl, Whitespace.NL ])
self.funcDefns.append(tfDefn)
for md in p.messageDecls:
- ns.addstmts([
- _generateMessageClass(md.msgClass(), md.msgId(),
- md.decl.type.priority,
- md.prettyMsgName(p.name+'::'),
- md.decl.type.compress),
- Whitespace.NL ])
+ decls = []
+
+ mfDecl, mfDefn = _splitFuncDeclDefn(
+ _generateMessageConstructor(md.msgClass(), md.msgId(),
+ md.decl.type.priority,
+ md.prettyMsgName(p.name+'::'),
+ md.decl.type.compress))
+ decls.append(mfDecl)
+ self.funcDefns.append(mfDefn)
+
if md.hasReply():
- ns.addstmts([
- _generateMessageClass(
+ rfDecl, rfDefn = _splitFuncDeclDefn(
+ _generateMessageConstructor(
md.replyClass(), md.replyId(),
md.decl.type.priority,
md.prettyReplyName(p.name+'::'),
- md.decl.type.compress),
- Whitespace.NL ])
+ md.decl.type.compress))
+ decls.append(rfDecl)
+ self.funcDefns.append(rfDefn)
+
+ decls.append(Whitespace.NL)
+ ns.addstmts(decls)
ns.addstmts([ Whitespace.NL, Whitespace.NL ])
def genBridgeFunc(self, bridge):
p = self.protocol
parentHandleType = _cxxBareType(ActorType(bridge.parent.ptype),
_otherSide(bridge.parent.side),
@@ -1892,51 +1900,48 @@ class _GenerateProtocolCode(ipdl.ast.Vis
StmtExpr(ExprAssn(ExprDeref(nextvar), _errorState())),
StmtReturn(ExprLiteral.FALSE),
])
return transitionfunc
##--------------------------------------------------
-def _generateMessageClass(clsname, msgid, priority, prettyName, compress):
- cls = Class(name=clsname, inherits=[ Inherit(Type('IPC::Message')) ])
- cls.addstmt(Label.PUBLIC)
-
- idenum = TypeEnum()
- idenum.addId('ID', msgid)
- cls.addstmt(StmtDecl(Decl(idenum, '')))
-
- # make the message constructor
+def _generateMessageConstructor(clsname, msgid, priority, prettyName, compress):
+ routingId = ExprVar('routingId')
+
+ func = FunctionDefn(FunctionDecl(
+ clsname,
+ params=[ Decl(Type('int32_t'), routingId.name) ],
+ ret=Type('IPC::Message', ptr=1)))
+
if compress == 'compress':
- compression = ExprVar('COMPRESSION_ENABLED')
+ compression = ExprVar('IPC::Message::COMPRESSION_ENABLED')
elif compress:
assert compress == 'compressall'
- compression = ExprVar('COMPRESSION_ALL')
+ compression = ExprVar('IPC::Message::COMPRESSION_ALL')
else:
- compression = ExprVar('COMPRESSION_NONE')
+ compression = ExprVar('IPC::Message::COMPRESSION_NONE')
if priority == ipdl.ast.NORMAL_PRIORITY:
priorityEnum = 'IPC::Message::PRIORITY_NORMAL'
elif priority == ipdl.ast.HIGH_PRIORITY:
priorityEnum = 'IPC::Message::PRIORITY_HIGH'
else:
assert priority == ipdl.ast.URGENT_PRIORITY
priorityEnum = 'IPC::Message::PRIORITY_URGENT'
- routingId = ExprVar('routingId')
- ctor = ConstructorDefn(
- ConstructorDecl(clsname, params=[ Decl(Type('int32_t'), routingId.name) ]),
- memberinits=[ ExprMemberInit(ExprVar('IPC::Message'),
- [ routingId,
- ExprVar('ID'),
- ExprVar(priorityEnum),
- compression,
- ExprLiteral.String(prettyName) ]) ])
- cls.addstmts([ ctor ])
-
- return cls
+
+ func.addstmt(
+ StmtReturn(ExprNew(Type('IPC::Message'),
+ args=[ routingId,
+ ExprVar(msgid),
+ ExprVar(priorityEnum),
+ compression,
+ ExprLiteral.String(prettyName) ])))
+
+ return func
##--------------------------------------------------
class _ComputeTypeDeps(TypeVisitor):
'''Pass that gathers the C++ types that a particular IPDL type
(recursively) depends on. There are two kinds of dependencies: (i)
types that need forward declaration; (ii) types that need a |using|
stmt. Some types generate both kinds.'''
@@ -5107,19 +5112,19 @@ class _GenerateProtocolActorCode(ipdl.as
StmtExpr(ExprAssn(_actorId(actorexpr), _FREED_ACTOR_ID)) ]
def makeMessage(self, md, errfn, fromActor=None):
msgvar = self.msgvar
routingId = self.protocol.routingId(fromActor)
this = None
if md.decl.type.isDtor(): this = md.actorDecl().var()
- stmts = ([ StmtDecl(Decl(Type(md.pqMsgClass(), ptr=1), msgvar.name),
- init=ExprNew(Type(md.pqMsgClass()),
- args=[ routingId ])) ]
+ stmts = ([ StmtDecl(Decl(Type('IPC::Message', ptr=1), msgvar.name),
+ init=ExprCall(ExprVar(md.pqMsgClass()),
+ args=[ routingId ])) ]
+ [ Whitespace.NL ]
+ [ StmtExpr(self.write(p.ipdltype, p.var(), msgvar, this))
for p in md.params ]
+ [ Whitespace.NL ]
+ self.setMessageFlags(md, msgvar, reply=0))
return msgvar, stmts
@@ -5128,17 +5133,17 @@ class _GenerateProtocolActorCode(ipdl.as
routingId = self.protocol.routingId()
# TODO special cases for async ctor/dtor replies
if not md.decl.type.hasReply():
return [ ]
replyvar = self.replyvar
return (
[ StmtExpr(ExprAssn(
- replyvar, ExprNew(Type(md.pqReplyClass()), args=[ routingId ]))),
+ replyvar, ExprCall(ExprVar(md.pqReplyClass()), args=[ routingId ]))),
Whitespace.NL ]
+ [ StmtExpr(self.write(r.ipdltype, r.var(), replyvar))
for r in md.returns ]
+ self.setMessageFlags(md, replyvar, reply=1)
+ [ self.logMessage(md, replyvar, 'Sending reply ') ])
def setMessageFlags(self, md, var, reply):