Skip to content

mpgen: Allow wrapped interfaces to inherit from unwrapped interfaces - #377

Open
ryanofsky wants to merge 1 commit into
bitcoin-core:masterfrom
ryanofsky:pr/methodkey
Open

ryanofsky wants to merge 1 commit into
bitcoin-core:masterfrom
ryanofsky:pr/methodkey

Conversation

@ryanofsky

@ryanofsky ryanofsky commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Problem: Currently, interface inheritance in libmultiprocess only works if capnproto base and derived interfaces both use $Proxy.wrap annotations and have C++ base and derived classes implementing methods of both interfaces. It is currently not possible to have derived capnproto interface that uses $Proxy.wrap inherit from a base interface that is unwrapped. This is needed for the stable/unstable Chain interface split proposed in bitcoin/bitcoin#34981. This limitation exists because ProxyMethod template class which is responsible for mapping capnproto method types to c++ method pointers currently assumes that that every capnproto method will be implemented by the wrapped base interface, and doesn't allow them to be implemented be derived classes.

Solution: Pass an interface type template parameter to ProxyMethod and to the ProxyMethodTraits, ProxyClientMethodTraits and ProxyServerMethodTraits traits classes, and have mpgen generate ProxyMethod specializations for every method an interface handles, including inherited ones. Small change to proxy.h, proxy-types.h and gen.cpp, plus a test of an interface inheriting from a base interface with no C++ class.

This is a potentially breaking change for code that specializes ProxyClientMethodTraits or ProxyServerMethodTraits, which now takes the interface type as its first template argument. But Bitcoin Core master does not have any of these specializations currently, so it needs no changes. Generated code is otherwise equivalent and there are no wire protocol changes.

Add an Interface template parameter to ProxyMethod, ProxyMethodTraits,
ProxyClientMethodTraits and ProxyServerMethodTraits, and generate ProxyMethod
specializations for inherited methods as well as each interface's own methods.

This lets a wrapped capnp interface inherit methods from a base interface
that is wrapped by a different C++ class, or not wrapped at all. Previously
the mapping from an inherited method to a C++ method came from the base
interface's generated ProxyMethod<Params> specialization, so it only worked
when the base interface was wrapped by a C++ base class of the derived
interface's class. Each method could only have one mapping, so two wrapped
interfaces inheriting from the same unwrapped base could not each supply one.

Bitcoin Core needs this to split its Chain interface into stable Chain and
UnstableChain capnp interfaces wrapping the same interfaces::Chain class
(bitcoin/bitcoin#34981).

This is a breaking change for code specializing ProxyClientMethodTraits or
ProxyServerMethodTraits, which now takes the interface type as its first
template argument.

This change was written with Claude Opus 5.5 (1M context).
@DrahtBot

DrahtBot commented Oct 15, 2026 •

Copy link
Copy Markdown

The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

Reviews

See the guideline and AI policy for information on the review process.
A summary of reviews will appear here.

Conflicts

Reviewers, this pull request conflicts with the following ones:

  • #342 (Allow request cancellation for wrapped C++ methods by xyzconstant)

If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants