Commit d6481709 authored by Nika Layzell's avatar Nika Layzell
Browse files

Bug 1822863 - Use `Span<...>` in IPDL send signatures, r=ipc-reviewers,mccr8

This should make it possible to send data without copying in some
situations.

This requires adding the `rightconst` attribute to the C++ `Type` type
in order to allow specifying `Span<PFoo* const>`, which isn't possible
to specify with a left const. The type is getting very gross with all of
these flags and it's probably worth switching it to be a recursive
type at this point.

Differential Revision: https://phabricator.services.mozilla.com/D173570
parent 2b45e5a7
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -3144,7 +3144,7 @@ mozilla::ipc::IPCResult ContentChild::RecvUpdateWindow(

PContentPermissionRequestChild*
ContentChild::AllocPContentPermissionRequestChild(
    const nsTArray<PermissionRequest>& aRequests, nsIPrincipal* aPrincipal,
    Span<const PermissionRequest> aRequests, nsIPrincipal* aPrincipal,
    nsIPrincipal* aTopLevelPrincipal, const bool& aIsHandlingUserInput,
    const bool& aMaybeUnsafePermissionDelegate, const TabId& aTabId) {
  MOZ_CRASH("unused");
@@ -3422,7 +3422,7 @@ bool ContentChild::DeallocPURLClassifierChild(PURLClassifierChild* aActor) {
}

PURLClassifierLocalChild* ContentChild::AllocPURLClassifierLocalChild(
    nsIURI* aUri, const nsTArray<IPCURLClassifierFeature>& aFeatures) {
    nsIURI* aUri, Span<const IPCURLClassifierFeature> aFeatures) {
  return new URLClassifierLocalChild();
}

+2 −2
Original line number Diff line number Diff line
@@ -481,7 +481,7 @@ class ContentChild final : public PContentChild,
#endif

  PContentPermissionRequestChild* AllocPContentPermissionRequestChild(
      const nsTArray<PermissionRequest>& aRequests, nsIPrincipal* aPrincipal,
      Span<const PermissionRequest> aRequests, nsIPrincipal* aPrincipal,
      nsIPrincipal* aTopLevelPrincipal, const bool& aIsHandlingUserInput,
      const bool& aMaybeUnsafePermissionDelegate, const TabId& aTabId);
  bool DeallocPContentPermissionRequestChild(
@@ -565,7 +565,7 @@ class ContentChild final : public PContentChild,

  // PURLClassifierLocalChild
  PURLClassifierLocalChild* AllocPURLClassifierLocalChild(
      nsIURI* aUri, const nsTArray<IPCURLClassifierFeature>& aFeatures);
      nsIURI* aUri, Span<const IPCURLClassifierFeature> aFeatures);
  bool DeallocPURLClassifierLocalChild(PURLClassifierLocalChild* aActor);

  PLoginReputationChild* AllocPLoginReputationChild(nsIURI* aUri);
+9 −0
Original line number Diff line number Diff line
@@ -1015,6 +1015,15 @@ struct ParamTraitsIPC<mozilla::UniqueMachSendRight> {
template <class P>
struct ParamTraitsMozilla : ParamTraitsIPC<P> {};

// Sending-only specialization for mozilla::Span<T const>. Uses an identical
// serialization format as `const nsTArray<T>&`.
template <class T>
struct ParamTraitsMozilla<mozilla::Span<const T>> {
  static void Write(MessageWriter* writer, mozilla::Span<const T> p) {
    WriteSequenceParam<const T>(writer, p.Elements(), p.Length());
  }
};

template <>
struct ParamTraitsMozilla<nsresult> {
  typedef nsresult param_type;
+6 −0
Original line number Diff line number Diff line
@@ -366,6 +366,7 @@ class Type(Node):
        ptrconstptr=False,
        ref=False,
        rvalref=False,
        rightconst=False,
        hasimplicitcopyctor=True,
        T=None,
        inner=None,
@@ -384,6 +385,8 @@ class Type(Node):
          rvalref        => T&&

        Any type, naked or pointer, can be const (const T) or ref (T&)."""
        # XXX(nika): This type is complex enough at this point, perhaps we
        # should get "fancy with recursive types" to simplify it.
        assert isinstance(name, str)
        assert isinstance(const, bool)
        assert isinstance(ptr, bool)
@@ -391,6 +394,7 @@ class Type(Node):
        assert isinstance(ptrconstptr, bool)
        assert isinstance(ref, bool)
        assert isinstance(rvalref, bool)
        assert isinstance(rightconst, bool)
        assert not isinstance(T, str)

        Node.__init__(self)
@@ -401,6 +405,7 @@ class Type(Node):
        self.ptrconstptr = ptrconstptr
        self.ref = ref
        self.rvalref = rvalref
        self.rightconst = rightconst
        self.hasimplicitcopyctor = hasimplicitcopyctor
        self.T = T
        self.inner = inner
@@ -416,6 +421,7 @@ class Type(Node):
            ptrconstptr=self.ptrconstptr,
            ref=self.ref,
            rvalref=self.rvalref,
            rightconst=self.rightconst,
            T=copy.deepcopy(self.T, memo),
            inner=copy.deepcopy(self.inner, memo),
        )
+2 −0
Original line number Diff line number Diff line
@@ -76,6 +76,8 @@ class CxxCodeGen(CodePrinter, Visitor):
            ts += "&"
        elif t.rvalref:
            ts += "&&"
        elif t.rightconst:
            ts += " const"

        self.write(ts)

Loading