summaryrefslogtreecommitdiff
path: root/view/sharedcache/api/sharedcacheapi.h
diff options
context:
space:
mode:
authorMark Rowe <mrowe@bdash.net.nz>2025-02-08 10:40:44 -0800
committerMason Reed <mason@vector35.com>2025-02-12 18:43:02 -0500
commitc20bf355152d9a715dae3c19777c3d4a1046174b (patch)
treeca54b22241c36bcfd8259c16b2583b9d19487ed3 /view/sharedcache/api/sharedcacheapi.h
parent714d7628097c5b02e23bcad1dba9880c7afc034b (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.h70
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),
+ };
}
};