diff options
| author | babenko <[email protected]> | 2024-08-12 14:25:18 +0300 |
|---|---|---|
| committer | babenko <[email protected]> | 2024-08-12 14:37:41 +0300 |
| commit | e3206dbabc87736656ea7f93a10733b19df972ef (patch) | |
| tree | 7cb8746d5ae689cd1ca3bef56f9c238ab8a233dd | |
| parent | 975db672d3fdc6000736c4e9860fc1510417374a (diff) | |
Do not require non-polymorphic types to be registered
4c5a97623154a55b7e85fc124ee047b31f738077
| -rw-r--r-- | yt/yt/core/phoenix/type_def-inl.h | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/yt/yt/core/phoenix/type_def-inl.h b/yt/yt/core/phoenix/type_def-inl.h index 914cf669aec..a57d812b830 100644 --- a/yt/yt/core/phoenix/type_def-inl.h +++ b/yt/yt/core/phoenix/type_def-inl.h @@ -885,15 +885,15 @@ struct TSerializer YT_VERIFY(streamTag == runtimeTag); } } else { - const auto& descriptor = [&] () -> const TTypeDescriptor& { - if constexpr(TPolymorphicTraits<T>::Polymorphic) { - auto tag = LoadSuspended<TTypeTag>(context); - return ITypeRegistry::Get()->GetUniverseDescriptor().GetTypeDescriptorByTagOrThrow(tag); - } else { - return T::GetTypeDescriptor(); - } - }(); - rawPtr = descriptor.template ConstructOrThrow<T>(); + if constexpr(TPolymorphicTraits<T>::Polymorphic) { + auto tag = LoadSuspended<TTypeTag>(context); + const auto& descriptor = ITypeRegistry::Get()->GetUniverseDescriptor().GetTypeDescriptorByTagOrThrow(tag); + rawPtr = descriptor.template ConstructOrThrow<T>(); + } else { + using TFactory = typename TFactoryTraits<T>::TFactory; + static_assert(TFactory::ConcreteConstructor); + rawPtr = static_cast<T*>(TFactory::ConcreteConstructor()); + } context.RegisterConstructedObject(rawPtr); } |
