Bug 1754037 - Part 3b: Update IPDL generated code to new ParamTraits API, r=ipc-reviewers,mccr8

Updates to the IPDL code generator to make the generated code correctly
use the new ParamTraits APIs for serialization and deserialization.

IPDL continues to use IPDLParamTraits after this change, it will be
changed to use ParamTraits in a later part.

Differential Revision: https://phabricator.services.mozilla.com/D140002
This commit is contained in:
Nika Layzell 2022-03-04 15:39:40 +00:00
parent 5f06238318
commit 1d44e4355c

View file

@ -163,10 +163,6 @@ def _backstagePass():
return ExprCall(ExprVar("mozilla::ipc::PrivateIPDLInterface")) return ExprCall(ExprVar("mozilla::ipc::PrivateIPDLInterface"))
def _iterType(ptr):
return Type("PickleIterator", ptr=ptr)
def _deleteId(): def _deleteId():
return ExprVar("Msg___delete____ID") return ExprVar("Msg___delete____ID")
@ -1952,8 +1948,8 @@ def _generateMessageConstructor(md, segmentSize, protocol, forReply=False):
class _ParamTraits: class _ParamTraits:
var = ExprVar("aVar") var = ExprVar("aVar")
msgvar = ExprVar("aMsg") writervar = ExprVar("aWriter")
itervar = ExprVar("aIter") readervar = ExprVar("aReader")
actor = ExprVar("aActor") actor = ExprVar("aActor")
@classmethod @classmethod
@ -1977,23 +1973,23 @@ class _ParamTraits:
) )
@classmethod @classmethod
def writeSentinel(cls, msgvar, sentinelKey): def writeSentinel(cls, writervar, sentinelKey):
return [ return [
Whitespace("// Sentinel = " + repr(sentinelKey) + "\n", indent=True), Whitespace("// Sentinel = " + repr(sentinelKey) + "\n", indent=True),
StmtExpr( StmtExpr(
ExprCall( ExprCall(
ExprSelect(msgvar, "->", "WriteSentinel"), ExprSelect(writervar, "->", "WriteSentinel"),
args=[ExprLiteral.Int(hashfunc(sentinelKey))], args=[ExprLiteral.Int(hashfunc(sentinelKey))],
) )
), ),
] ]
@classmethod @classmethod
def readSentinel(cls, msgvar, itervar, sentinelKey, sentinelFail): def readSentinel(cls, readervar, sentinelKey, sentinelFail):
# Read the sentinel # Read the sentinel
read = ExprCall( read = ExprCall(
ExprSelect(msgvar, "->", "ReadSentinel"), ExprSelect(readervar, "->", "ReadSentinel"),
args=[itervar, ExprLiteral.Int(hashfunc(sentinelKey))], args=[ExprLiteral.Int(hashfunc(sentinelKey))],
) )
ifsentinel = StmtIf(ExprNot(read)) ifsentinel = StmtIf(ExprNot(read))
ifsentinel.addifstmts(sentinelFail) ifsentinel.addifstmts(sentinelFail)
@ -2004,13 +2000,13 @@ class _ParamTraits:
] ]
@classmethod @classmethod
def write(cls, var, msgvar, actor, ipdltype=None): def write(cls, var, writervar, actor, ipdltype=None):
if ipdltype and _cxxTypeNeedsMoveForSend(ipdltype): if ipdltype and _cxxTypeNeedsMoveForSend(ipdltype):
var = ExprMove(var) var = ExprMove(var)
return ExprCall(ExprVar("WriteIPDLParam"), args=[msgvar, actor, var]) return ExprCall(ExprVar("WriteIPDLParam"), args=[writervar, actor, var])
@classmethod @classmethod
def checkedWrite(cls, ipdltype, var, msgvar, sentinelKey, actor): def checkedWrite(cls, ipdltype, var, writervar, sentinelKey, actor):
assert sentinelKey assert sentinelKey
block = Block() block = Block()
@ -2027,10 +2023,10 @@ class _ParamTraits:
block.addstmts( block.addstmts(
[ [
StmtExpr(cls.write(var, msgvar, actor, ipdltype)), StmtExpr(cls.write(var, writervar, actor, ipdltype)),
] ]
) )
block.addstmts(cls.writeSentinel(msgvar, sentinelKey)) block.addstmts(cls.writeSentinel(writervar, sentinelKey))
return block return block
@classmethod @classmethod
@ -2046,7 +2042,7 @@ class _ParamTraits:
[ [
StmtExpr( StmtExpr(
ExprCall( ExprCall(
ExprSelect(cls.msgvar, "->", "WriteBytes"), ExprSelect(cls.writervar, "->", "WriteBytes"),
args=[ args=[
ExprAddrOf( ExprAddrOf(
ExprCall(first.getMethod(thisexpr=cls.var, sel=".")) ExprCall(first.getMethod(thisexpr=cls.var, sel="."))
@ -2057,7 +2053,7 @@ class _ParamTraits:
) )
] ]
) )
block.addstmts(cls.writeSentinel(cls.msgvar, cls.bulkSentinelKey(fields))) block.addstmts(cls.writeSentinel(cls.writervar, cls.bulkSentinelKey(fields)))
return block return block
@ -2067,9 +2063,8 @@ class _ParamTraits:
first = fields[0] first = fields[0]
readbytes = ExprCall( readbytes = ExprCall(
ExprSelect(cls.msgvar, "->", "ReadBytesInto"), ExprSelect(cls.readervar, "->", "ReadBytesInto"),
args=[ args=[
cls.itervar,
ExprAddrOf(ExprCall(first.getMethod(thisexpr=cls.var, sel="->"))), ExprAddrOf(ExprCall(first.getMethod(thisexpr=cls.var, sel="->"))),
ExprLiteral.Int(size * len(fields)), ExprLiteral.Int(size * len(fields)),
], ],
@ -2080,8 +2075,7 @@ class _ParamTraits:
block.addstmt(ifbad) block.addstmt(ifbad)
block.addstmts( block.addstmts(
cls.readSentinel( cls.readSentinel(
cls.msgvar, cls.readervar,
cls.itervar,
cls.bulkSentinelKey(fields), cls.bulkSentinelKey(fields),
errfnSentinel()(errmsg), errfnSentinel()(errmsg),
) )
@ -2094,8 +2088,7 @@ class _ParamTraits:
cls, cls,
ipdltype, ipdltype,
var, var,
msgvar, readervar,
itervar,
errfn, errfn,
paramtype, paramtype,
sentinelKey, sentinelKey,
@ -2106,9 +2099,7 @@ class _ParamTraits:
# Read the data # Read the data
ifbad = StmtIf( ifbad = StmtIf(
ExprNot( ExprNot(ExprCall(ExprVar("ReadIPDLParam"), args=[readervar, actor, var]))
ExprCall(ExprVar("ReadIPDLParam"), args=[msgvar, itervar, actor, var])
)
) )
if not isinstance(paramtype, list): if not isinstance(paramtype, list):
paramtype = ["Error deserializing " + paramtype] paramtype = ["Error deserializing " + paramtype]
@ -2127,7 +2118,7 @@ class _ParamTraits:
block.addstmt(ifnull) block.addstmt(ifnull)
block.addstmts( block.addstmts(
cls.readSentinel(msgvar, itervar, sentinelKey, errfnSentinel(*paramtype)) cls.readSentinel(readervar, sentinelKey, errfnSentinel(*paramtype))
) )
return block return block
@ -2141,8 +2132,7 @@ class _ParamTraits:
return cls.checkedRead( return cls.checkedRead(
ipdltype, ipdltype,
var, var,
cls.msgvar, cls.readervar,
cls.itervar,
errfn=errfn, errfn=errfn,
paramtype=what, paramtype=what,
sentinelKey=sentinelKey, sentinelKey=sentinelKey,
@ -2175,7 +2165,7 @@ class _ParamTraits:
MethodDecl( MethodDecl(
"Write", "Write",
params=[ params=[
Decl(Type("IPC::Message", ptr=True), cls.msgvar.name), Decl(Type("IPC::MessageWriter", ptr=True), cls.writervar.name),
Decl(iprotocoltype, cls.actor.name), Decl(iprotocoltype, cls.actor.name),
Decl(intype, cls.var.name), Decl(intype, cls.var.name),
], ],
@ -2191,8 +2181,7 @@ class _ParamTraits:
MethodDecl( MethodDecl(
"Read", "Read",
params=[ params=[
Decl(Type("IPC::Message", ptr=True, const=True), cls.msgvar.name), Decl(Type("IPC::MessageReader", ptr=True), cls.readervar.name),
Decl(_iterType(ptr=True), cls.itervar.name),
Decl(iprotocoltype, cls.actor.name), Decl(iprotocoltype, cls.actor.name),
Decl(outtype, cls.var.name), Decl(outtype, cls.var.name),
], ],
@ -2241,14 +2230,14 @@ class _ParamTraits:
""", """,
var=cls.var, var=cls.var,
actor=cls.actor, actor=cls.actor,
write=cls.write(ExprVar("id"), cls.msgvar, cls.actor), write=cls.write(ExprVar("id"), cls.writervar, cls.actor),
) )
# bool Read(..) impl # bool Read(..) impl
read = StmtCode( read = StmtCode(
""" """
mozilla::Maybe<mozilla::ipc::IProtocol*> actor = mozilla::Maybe<mozilla::ipc::IProtocol*> actor =
${actor}->ReadActor(${msgvar}, ${itervar}, true, ${actortype}, ${protocolid}); ${actor}->ReadActor(${readervar}, true, ${actortype}, ${protocolid});
if (actor.isNothing()) { if (actor.isNothing()) {
return false; return false;
} }
@ -2257,8 +2246,7 @@ class _ParamTraits:
return true; return true;
""", """,
actor=cls.actor, actor=cls.actor,
msgvar=cls.msgvar, readervar=cls.readervar,
itervar=cls.itervar,
actortype=ExprLiteral.String(actortype.name()), actortype=ExprLiteral.String(actortype.name()),
protocolid=_protocolId(actortype), protocolid=_protocolId(actortype),
var=cls.var, var=cls.var,
@ -2289,7 +2277,7 @@ class _ParamTraits:
writefield = cls.checkedWrite( writefield = cls.checkedWrite(
f.ipdltype, f.ipdltype,
get(".", f), get(".", f),
cls.msgvar, cls.writervar,
sentinelKey=f.basename, sentinelKey=f.basename,
actor=cls.actor, actor=cls.actor,
) )
@ -2349,7 +2337,11 @@ class _ParamTraits:
write = prelude + [ write = prelude + [
StmtDecl(Decl(Type.INT, typevar.name), init=ud.callType(cls.var)), StmtDecl(Decl(Type.INT, typevar.name), init=ud.callType(cls.var)),
cls.checkedWrite( cls.checkedWrite(
None, typevar, cls.msgvar, sentinelKey=uniontype.name(), actor=cls.actor None,
typevar,
cls.writervar,
sentinelKey=uniontype.name(),
actor=cls.actor,
), ),
Whitespace.NL, Whitespace.NL,
writeswitch, writeswitch,
@ -2377,7 +2369,7 @@ class _ParamTraits:
wstmt = cls.checkedWrite( wstmt = cls.checkedWrite(
c.ipdltype, c.ipdltype,
ExprCall(ExprSelect(cls.var, ".", c.getTypeName())), ExprCall(ExprSelect(cls.var, ".", c.getTypeName())),
cls.msgvar, cls.writervar,
sentinelKey=c.enum(), sentinelKey=c.enum(),
actor=cls.actor, actor=cls.actor,
) )
@ -3996,8 +3988,6 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
self.msgvar = msgvar self.msgvar = msgvar
replyvar = ExprVar("reply__") replyvar = ExprVar("reply__")
self.replyvar = replyvar self.replyvar = replyvar
itervar = ExprVar("iter__")
self.itervar = itervar
var = ExprVar("v__") var = ExprVar("v__")
self.var = var self.var = var
# for ctor recv cases, we can't read the actor ID into a PFoo* # for ctor recv cases, we can't read the actor ID into a PFoo*
@ -5030,6 +5020,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
def makeMessage(self, md, errfn, fromActor=None): def makeMessage(self, md, errfn, fromActor=None):
msgvar = self.msgvar msgvar = self.msgvar
writervar = ExprVar("writer__")
routingId = self.protocol.routingId(fromActor) routingId = self.protocol.routingId(fromActor)
this = ExprVar.THIS this = ExprVar.THIS
if md.decl.type.isDtor(): if md.decl.type.isDtor():
@ -5040,12 +5031,20 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
StmtDecl( StmtDecl(
Decl(Type("IPC::Message", ptr=True), msgvar.name), Decl(Type("IPC::Message", ptr=True), msgvar.name),
init=ExprCall(ExprVar(md.pqMsgCtorFunc()), args=[routingId]), init=ExprCall(ExprVar(md.pqMsgCtorFunc()), args=[routingId]),
) ),
StmtDecl(
Decl(Type("IPC::MessageWriter"), writervar.name),
initargs=[ExprDeref(msgvar), this],
),
] ]
+ [Whitespace.NL] + [Whitespace.NL]
+ [ + [
_ParamTraits.checkedWrite( _ParamTraits.checkedWrite(
p.ipdltype, p.var(), msgvar, sentinelKey=p.name, actor=this p.ipdltype,
p.var(),
ExprAddrOf(writervar),
sentinelKey=p.name,
actor=this,
) )
for p in md.params for p in md.params
] ]
@ -5070,7 +5069,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
_ParamTraits.checkedWrite( _ParamTraits.checkedWrite(
p.ipdltype, p.ipdltype,
paramValue(idx), paramValue(idx),
self.replyvar, ExprAddrOf(ExprVar("writer__")),
sentinelKey=p.name, sentinelKey=p.name,
actor=ExprVar("self__"), actor=ExprVar("self__"),
) )
@ -5088,6 +5087,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
${resolvertype} resolver = [resolver__ = std::move(resolver__)](${resolveType} aParam) { ${resolvertype} resolver = [resolver__ = std::move(resolver__)](${resolveType} aParam) {
resolver__->Resolve([&] (IPC::Message* ${replyvar}, IProtocol* self__) { resolver__->Resolve([&] (IPC::Message* ${replyvar}, IProtocol* self__) {
IPC::MessageWriter writer__(*${replyvar}, self__);
$*{serializeParams} $*{serializeParams}
${logSendingReply} ${logSendingReply}
}); });
@ -5127,13 +5127,17 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
ExprCall(ExprVar(md.pqReplyCtorFunc()), args=[routingId]), ExprCall(ExprVar(md.pqReplyCtorFunc()), args=[routingId]),
) )
), ),
StmtDecl(
Decl(Type("IPC::MessageWriter"), "writer__"),
initargs=[ExprDeref(replyvar), ExprVar.THIS],
),
Whitespace.NL, Whitespace.NL,
] ]
+ [ + [
_ParamTraits.checkedWrite( _ParamTraits.checkedWrite(
r.ipdltype, r.ipdltype,
r.var(), r.var(),
replyvar, ExprAddrOf(ExprVar("writer__")),
sentinelKey=r.name, sentinelKey=r.name,
actor=ExprVar.THIS, actor=ExprVar.THIS,
) )
@ -5155,8 +5159,8 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
def deserializeMessage(self, md, side, errfn, errfnSent): def deserializeMessage(self, md, side, errfn, errfnSent):
msgvar = self.msgvar msgvar = self.msgvar
itervar = self.itervar
msgexpr = ExprAddrOf(msgvar) msgexpr = ExprAddrOf(msgvar)
readervar = ExprVar("reader__")
isctor = md.decl.type.isCtor() isctor = md.decl.type.isCtor()
stmts = [ stmts = [
self.logMessage(md, msgexpr, "Received ", receiving=True), self.logMessage(md, msgexpr, "Received ", receiving=True),
@ -5178,8 +5182,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
_ParamTraits.checkedRead( _ParamTraits.checkedRead(
None, None,
ExprAddrOf(handlevar), ExprAddrOf(handlevar),
msgexpr, ExprAddrOf(readervar),
ExprAddrOf(self.itervar),
errfn, errfn,
"'%s'" % handletype.name, "'%s'" % handletype.name,
sentinelKey="actor", sentinelKey="actor",
@ -5210,8 +5213,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
_ParamTraits.checkedRead( _ParamTraits.checkedRead(
p.ipdltype, p.ipdltype,
ExprAddrOf(p.var()), ExprAddrOf(p.var()),
msgexpr, ExprAddrOf(readervar),
ExprAddrOf(itervar),
errfn, errfn,
"'%s'" % p.ipdltype.name(), "'%s'" % p.ipdltype.name(),
sentinelKey=p.name, sentinelKey=p.name,
@ -5226,13 +5228,14 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
( (
[ [
StmtDecl( StmtDecl(
Decl(_iterType(ptr=False), self.itervar.name), initargs=[msgvar] Decl(Type("IPC::MessageReader"), readervar.name),
initargs=[msgvar, ExprVar.THIS],
) )
] ]
+ decls + decls
+ [Whitespace.NL] + [Whitespace.NL]
+ reads + reads
+ [self.endRead(msgvar, itervar)] + [StmtCode("${reader}.EndRead();\n", reader=readervar)]
) )
) )
@ -5240,7 +5243,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
def deserializeAsyncReply(self, md, side, errfn, errfnSent): def deserializeAsyncReply(self, md, side, errfn, errfnSent):
msgvar = self.msgvar msgvar = self.msgvar
itervar = self.itervar readervar = ExprVar("reader__")
msgexpr = ExprAddrOf(msgvar) msgexpr = ExprAddrOf(msgvar)
isctor = md.decl.type.isCtor() isctor = md.decl.type.isCtor()
resolve = ExprVar("resolve__") resolve = ExprVar("resolve__")
@ -5253,28 +5256,26 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
StmtCode( StmtCode(
""" """
bool resolve__ = false; bool resolve__ = false;
if (!ReadIPDLParam(${msgexpr}, &${itervar}, this, &resolve__)) { if (!ReadIPDLParam(&${readervar}, this, &resolve__)) {
FatalError("Error deserializing bool"); FatalError("Error deserializing bool");
return MsgValueError; return MsgValueError;
} }
""", """,
msgexpr=msgexpr, readervar=readervar,
itervar=itervar,
), ),
] ]
desrej = [ desrej = [
StmtCode( StmtCode(
""" """
ResponseRejectReason reason__{}; ResponseRejectReason reason__{};
if (!ReadIPDLParam(${msgexpr}, &${itervar}, this, &reason__)) { if (!ReadIPDLParam(&${readervar}, this, &reason__)) {
FatalError("Error deserializing ResponseRejectReason"); FatalError("Error deserializing ResponseRejectReason");
return MsgValueError; return MsgValueError;
} }
${readervar}.EndRead();
""", """,
msgexpr=msgexpr, readervar=readervar,
itervar=itervar,
), ),
self.endRead(msgvar, itervar),
] ]
prologue = [ prologue = [
self.logMessage(md, msgexpr, "Received ", receiving=True), self.logMessage(md, msgexpr, "Received ", receiving=True),
@ -5286,7 +5287,12 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
return prologue return prologue
prologue.extend( prologue.extend(
[StmtDecl(Decl(_iterType(ptr=False), itervar.name), initargs=[msgvar])] [
StmtDecl(
Decl(Type("IPC::MessageReader"), readervar.name),
initargs=[msgvar, ExprVar.THIS],
)
]
+ desresolve + desresolve
) )
@ -5301,8 +5307,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
_ParamTraits.checkedRead( _ParamTraits.checkedRead(
None, None,
ExprAddrOf(handlevar), ExprAddrOf(handlevar),
msgexpr, ExprAddrOf(readervar),
ExprAddrOf(itervar),
errfn, errfn,
"'%s'" % handletype.name, "'%s'" % handletype.name,
sentinelKey="actor", sentinelKey="actor",
@ -5324,8 +5329,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
_ParamTraits.checkedRead( _ParamTraits.checkedRead(
p.ipdltype, p.ipdltype,
ExprAddrOf(p.var()), ExprAddrOf(p.var()),
msgexpr, ExprAddrOf(readervar),
ExprAddrOf(itervar),
errfn, errfn,
"'%s'" % p.ipdltype.name(), "'%s'" % p.ipdltype.name(),
sentinelKey=p.name, sentinelKey=p.name,
@ -5334,7 +5338,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
) )
for p in md.returns[start:] for p in md.returns[start:]
] ]
+ [self.endRead(msgvar, itervar)] + [StmtCode("${reader}.EndRead();", reader=readervar)]
) )
return resolve, reason, prologue, desrej, stmts return resolve, reason, prologue, desrej, stmts
@ -5349,7 +5353,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
if 0 == len(md.returns): if 0 == len(md.returns):
return stmts return stmts
itervar = self.itervar readervar = ExprVar("reader__")
declstmts = [] declstmts = []
if decls: if decls:
declstmts = [ declstmts = [
@ -5360,7 +5364,8 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
[ [
Whitespace.NL, Whitespace.NL,
StmtDecl( StmtDecl(
Decl(_iterType(ptr=False), itervar.name), initargs=[self.replyvar] Decl(Type("IPC::MessageReader"), readervar.name),
initargs=[self.replyvar, ExprVar.THIS],
), ),
] ]
+ declstmts + declstmts
@ -5369,8 +5374,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
_ParamTraits.checkedRead( _ParamTraits.checkedRead(
r.ipdltype, r.ipdltype,
r.var(), r.var(),
ExprAddrOf(self.replyvar), ExprAddrOf(readervar),
ExprAddrOf(self.itervar),
errfn, errfn,
"'%s'" % r.ipdltype.name(), "'%s'" % r.ipdltype.name(),
sentinelKey=r.name, sentinelKey=r.name,
@ -5379,7 +5383,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
) )
for r in md.returns for r in md.returns
] ]
+ [self.endRead(self.replyvar, itervar)] + [StmtCode("${reader}.EndRead();", reader=readervar)]
) )
return stmts return stmts
@ -5629,15 +5633,6 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
saveIdStmts = [] saveIdStmts = []
return idvar, saveIdStmts return idvar, saveIdStmts
def endRead(self, msgexpr, iterexpr):
return StmtCode(
"""
${msg}.EndRead(${iter}, ${msg}.type());
""",
msg=msgexpr,
iter=iterexpr,
)
class _GenerateProtocolParentCode(_GenerateProtocolActorCode): class _GenerateProtocolParentCode(_GenerateProtocolActorCode):
def __init__(self): def __init__(self):