Commit 5528ac12 authored by Andrew McCreight's avatar Andrew McCreight
Browse files

Bug 1808598, part 1 - Clean up send semantics IPDL types. r=ipc-reviewers,nika

This patch implements a number of cleanups for how send semantics are
represented in IPDL types.

1. needsMoreJuiceThan is inlined.
2. convertsTo is renamed to sendSemanticsSatisfiedBy to be more descriptive,
   and is no longer a class method.
3. nestedRange, sendSemantics and the methods that operate on them
   are moved from IPDLType to a new class, which MessageType and
   ProtocolType now inherit from.
4. IPDLType.hasReply has been inlined into MessageType.hasReply.

Differential Revision: https://phabricator.services.mozilla.com/D167836
parent 474151c8
Loading
Loading
Loading
Loading
+18 −20
Original line number Diff line number Diff line
@@ -241,6 +241,15 @@ class IPDLType(Type):
    def isManagedEndpoint(self):
        return False

    def hasBaseType(self):
        return False


class SendSemanticsType(IPDLType):
    def __init__(self, nestedRange, sendSemantics):
        self.nestedRange = nestedRange
        self.sendSemantics = sendSemantics

    def isAsync(self):
        return self.sendSemantics == ASYNC

@@ -250,14 +259,7 @@ class IPDLType(Type):
    def isInterrupt(self):
        return self.sendSemantics is INTR

    def hasReply(self):
        return self.isSync() or self.isInterrupt()

    def hasBaseType(self):
        return False

    @classmethod
    def convertsTo(cls, lesser, greater):
    def sendSemanticsSatisfiedBy(self, greater):
        def _unwrap(nr):
            if isinstance(nr, dict):
                return _unwrap(nr["nested"])
@@ -266,6 +268,7 @@ class IPDLType(Type):
            else:
                raise ValueError("Got unexpected nestedRange value: %s" % nr)

        lesser = self
        lnr0, gnr0, lnr1, gnr1 = (
            _unwrap(lesser.nestedRange[0]),
            _unwrap(greater.nestedRange[0]),
@@ -289,11 +292,8 @@ class IPDLType(Type):

        return False

    def needsMoreJuiceThan(self, o):
        return not IPDLType.convertsTo(self, o)


class MessageType(IPDLType):
class MessageType(SendSemanticsType):
    def __init__(
        self,
        nested,
@@ -310,10 +310,9 @@ class MessageType(IPDLType):
        assert not (ctor and dtor)
        assert not (ctor or dtor) or cdtype is not None

        SendSemanticsType.__init__(self, (nested, nested), sendSemantics)
        self.nested = nested
        self.prio = prio
        self.nestedRange = (nested, nested)
        self.sendSemantics = sendSemantics
        self.direction = direction
        self.params = []
        self.returns = []
@@ -346,17 +345,16 @@ class MessageType(IPDLType):
        return self.direction is INOUT

    def hasReply(self):
        return len(self.returns) or IPDLType.hasReply(self)
        return len(self.returns) or self.isSync() or self.isInterrupt()

    def hasImplicitActorParam(self):
        return self.isCtor() or self.isDtor()


class ProtocolType(IPDLType):
class ProtocolType(SendSemanticsType):
    def __init__(self, qname, nested, sendSemantics, refcounted, needsotherpid):
        SendSemanticsType.__init__(self, (NOT_NESTED, nested), sendSemantics)
        self.qname = qname
        self.nestedRange = (NOT_NESTED, nested)
        self.sendSemantics = sendSemantics
        self.managers = []  # ProtocolType
        self.manages = []
        self.hasDelete = False
@@ -1527,7 +1525,7 @@ class CheckTypes(TcheckVisitor):
        ptype, pname = p.decl.type, p.decl.shortname

        for mgrtype in ptype.managers:
            if mgrtype is not None and ptype.needsMoreJuiceThan(mgrtype):
            if mgrtype is not None and not ptype.sendSemanticsSatisfiedBy(mgrtype):
                self.error(
                    p.decl.loc,
                    "protocol `%s' requires more powerful send semantics than its manager `%s' provides",  # NOQA: E501
@@ -1635,7 +1633,7 @@ class CheckTypes(TcheckVisitor):
                pname,
            )

        if mtype.needsMoreJuiceThan(ptype):
        if not mtype.sendSemanticsSatisfiedBy(ptype):
            self.error(
                loc,
                "message `%s' requires more powerful send semantics than its protocol `%s' provides",  # NOQA: E501