Skip to content

RPC: Functionality to downcast dyn Object to a dyn Trait.

Nick Mathewson requested to merge nickm/arti:rpc_pseudomethods_v6 into main

This is a rather tricky piece of functionality. It works as follows.

We introduce a CastTable type. Each CastTable tells us how to downcast dyn Object for objects of a single concrete type. The Object type now has a get_casttable method that returns an empty CastTable by default.

CastTable is, internally, a map from the TypeId of the target dyn Trait reference type to a function fn(&dyn Object) -> &dyn Trait. These functions are stored as Box<dyn Any + ...>. (They are Boxed because they may refer to generic functions, which you can't get a static reference to, and they're Any because the functions have different types.)

The decl_object! macro now implements get_casttable as appropriate. (The syntax is a bit janky, but that's what we get for not using derive_adhoc.) For non-generic types, get_casttable uses a Lazy<CastTable>. to initialize a CastTable exactly once. For generic types, it use a Lazy<RwLock<HashMap<..>> to build one CastTable per instantiation of the generic type.

This could probably be optimized a bit more, the yaks could be shaved in a more scintillating hairstyle, and the syntax for generic decl_object could definitely be improved.

Edited by Ian Jackson

Merge request reports