структуры, либо немаленькие другие енумы.
заимплементил для верхнеуровневого енума deserialize, который внутри делает матч по строке и, в зависимости от одного из 251 значения этой строки, возвращает енум примерно так:
let value: serde_json::Value = Deserialize::deserialize(deserializer)?;
....
let obj = match tag {
"tag_value_1" => LargeEnum::EnumVariant1(
serde_json::from_value(
value.clone()
).map_err(|e|
D::Error::custom(format!("EnumVariant1 deserialize to LargeEnum::EnumVariant1 with error: {}", e))
)?
),
....
в матче получаю stack overflow.
проверял, если уменьшить кол-во вариантов в match, то паника уходит
как быть?
юзать стандартные serde(tag=...) не катит, т.к. тэг мне нужно передать дальше для десериализации вложенных структур, а serde так не умеет
Какие вызовы в стеке, если запустить с gdb?
с ллдб, в гдб не умею. наверху стека: * thread #9, name = 'tokio-runtime-w', stop reason = signal SIGSEGV: address access protected (fault address: 0x7ffff5498050) * frame #0: 0x0000555556b74097 main`__rust_probestack + 23 frame #1: 0x00005555563d928a main`_$LT$rust_tdlib..types.._common..TdType$u20$as$u20$serde..de..Deserialize$GT$::deserialize::h37f4e71ff0f74a91(deserializer=0x0000000000000000) at _common.rs:560 frame #2: 0x00005555556f1016 main`serde_json::de::from_trait::hf804f873e5d11cd2(read=<unavailable>) at de.rs:2386:22 frame #3: 0x00005555556f1227 main`serde_json::de::from_str::haf5c4f009eaf1615(s=(data_ptr = "{\"@type\":\"updateOption\",\"name\":\"version\",\"value\":{\"@type\":\"optionValueString\",\"value\":\"1.7.0\"},\"@client_id\":1}", length = 110)) at de.rs:2586:5
я бы посоветовал уменьшать количество вариантов и найти, на каком падает - вероятно там просто рекурсивный вызов или баг в данном конкретном варианте
разбить это? impl<'de> Deserialize<'de> for TdType { fn deserialize<D>(deserializer: D) -> Result<TdType, D::Error>
в общем уменьшить кол-во вариантов нельзя. но если уменьшить для тестирования и оставить только тот, который матчится конкретно для этого сообщения - всё ок
> проверял, если уменьшить кол-во вариантов в match, то паника уходит я про это
Окей, а попробуй запусти то же самое, но в релизе и проверь, уйдет ли переполнение.
а, я понял, не обязательно матчить ж... ок, попробую
там херова гора типов, подождем до вечера, пока соберется :)
и что это значит?
это значит в дебаге генерируется менее эффективный код.
Есть багрепорт с serde и большой структурой, фикс вроде еще не смержили
Тут serde-derive не задействован
задействован. для вложенных структур. его нет только на верхнеуровневом енуме
Ну проблема то явно в верхнеуровневом енуме.
99% - да... ну ок, попробую поразбивать на функции, спасибо
Обсуждают сегодня