Refactor the Binary serialisation interface
Refactor the Binary serialisation interface
The end goal is to dynamically add deduplication tables for ModIface
interface serialisation.
We identify two main points of interest that make this difficult:
- UserData hardcodes what
Binaryinstances can have deduplication tables. Moreover, it heavily uses partial functions. - GHC.Iface.Binary hardcodes the deduplication tables for 'Name' and 'FastString', making it difficult to add more deduplication.
Instead of having a single UserData record with fields for all the
types that can have deduplication tables, we allow providing custom
serialisers for any Typeable.
These are wrapped in existentials and stored in a Map indexed by their
respective TypeRep.
The Binary instance of the type to deduplicate still needs to
explicitly look up the decoder via findUserDataReader and
findUserDataWriter, which is no worse than the status-quo.
Map was chosen as microbenchmarks indicate it is the fastest for a
small number of keys (< 10).
In addition to this refactoring, we split UserData into ReaderUserData
and WriterUserData, to avoid partial functions.
Bump haddock submodule to accommodate for UserData split.
Split BinHandle into ReadBinHandle and WriteBinHandle
A BinHandle contains too much information for reading data.
For example, it needs to keep a FastMutInt and a IORef BinData,
when the non-mutable variants would suffice.
Additionally, this change has the benefit that anyone can immediately
tell whether the BinHandle is used for reading or writing.
Bump haddock submodule for BinHandle split.
This PR refactors the codebase to prepare !12371 (closed) and #24615 (closed)