diff options
| author | Mark Rowe <mrowe@bdash.net.nz> | 2025-02-08 10:40:44 -0800 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-02-12 18:43:02 -0500 |
| commit | c20bf355152d9a715dae3c19777c3d4a1046174b (patch) | |
| tree | ca54b22241c36bcfd8259c16b2583b9d19487ed3 /view/sharedcache/api/sharedcacheapi.h | |
| parent | 714d7628097c5b02e23bcad1dba9880c7afc034b (diff) | |
[SharedCache] Make MetadataSerializable::Load static
`MetadataSerializable` is updated to allow a subclass to optionally
specify the return type of `Load`. If not specified it defaults to the
subclass itself. `SharedCache` specifies `std::optional` to represent
the case where the serialized metadata is in a format or version it does
not recognize.
By making `Load` a static member function and having it return a new
object it becomes easier to reason about the state of objects when a
deserialization failure occurs. It can return `std::optional` to
indicate failure and there is no object left in an unknown state.
Prior to this, `Load` worked on an existing instance of an object. It
was unclear what state the object would be in if a deserialization
failure occurred (its original state prior to `Load`? some
partially-loaded state? a null state?). The failure itself also had to
be communicated out of band.
Diffstat (limited to 'view/sharedcache/api/sharedcacheapi.h')
| -rw-r--r-- | view/sharedcache/api/sharedcacheapi.h | 70 |
1 files changed, 36 insertions, 34 deletions
diff --git a/view/sharedcache/api/sharedcacheapi.h b/view/sharedcache/api/sharedcacheapi.h index cfe78351..ec64ef10 100644 --- a/view/sharedcache/api/sharedcacheapi.h +++ b/view/sharedcache/api/sharedcacheapi.h @@ -211,40 +211,42 @@ namespace SharedCacheAPI { MSS(relocatable); } - void Load(SharedCacheCore::DeserializationContext& context) { - MSL(textBase); - MSL(loadCommandOffset); - MSL_SUBCLASS(ident); - MSL(identifierPrefix); - MSL(installName); - MSL(entryPoints); - MSL(m_entryPoints); - MSL_SUBCLASS(symtab); - MSL_SUBCLASS(dysymtab); - MSL_SUBCLASS(dyldInfo); - // MSL_SUBCLASS(routines64); // FIXME CRASH but also do we even use this? - MSL_SUBCLASS(functionStarts); - MSL_SUBCLASS(moduleInitSections); - MSL_SUBCLASS(exportTrie); - MSL_SUBCLASS(chainedFixups); - MSL(relocationBase); - MSL_SUBCLASS(segments); - MSL_SUBCLASS(linkeditSegment); - MSL_SUBCLASS(sections); - MSL(sectionNames); - MSL_SUBCLASS(symbolStubSections); - MSL_SUBCLASS(symbolPointerSections); - MSL(dylibs); - MSL_SUBCLASS(buildVersion); - MSL_SUBCLASS(buildToolVersions); - MSL(exportTriePath); - MSL(dysymPresent); - MSL(dyldInfoPresent); - MSL(exportTriePresent); - MSL(chainedFixupsPresent); - // MSL(routinesPresent); - MSL(functionStartsPresent); - MSL(relocatable); + static SharedCacheMachOHeader Load(SharedCacheCore::DeserializationContext& context) { + return SharedCacheMachOHeader { + .MSL(textBase), + .MSL(loadCommandOffset), + .MSL(ident), + .MSL(identifierPrefix), + .MSL(installName), + .MSL(entryPoints), + .MSL(m_entryPoints), + .MSL(symtab), + .MSL(dysymtab), + .MSL(dyldInfo), + // .MSL(routines64), // FIXME CRASH but also do we even use this? + .MSL(functionStarts), + .MSL(moduleInitSections), + .MSL(exportTrie), + .MSL(chainedFixups), + .MSL(relocationBase), + .MSL(segments), + .MSL(linkeditSegment), + .MSL(sections), + .MSL(sectionNames), + .MSL(symbolStubSections), + .MSL(symbolPointerSections), + .MSL(dylibs), + .MSL(buildVersion), + .MSL(buildToolVersions), + .MSL(exportTriePath), + .MSL(dysymPresent), + .MSL(dyldInfoPresent), + .MSL(exportTriePresent), + .MSL(chainedFixupsPresent), + // .MSL(routinesPresent), + .MSL(functionStartsPresent), + .MSL(relocatable), + }; } }; |
