Size: a a a

2020 November 27

DD

Daniil Davydov in Rust Beginners
это называется "процедурный макрос" и описано в рустбуке
источник

DD

Daniil Davydov in Rust Beginners
источник

HS

Hagas Saan in Rust Beginners
Daniil Davydov
это называется "процедурный макрос" и описано в рустбуке
Спасибо)
источник

a

antuan in Rust Beginners
antuan
интересненько. я, конечно, нубас, но мне казалось, что компилятор должен защищать от этого...
(lldb) process launch
Process 985173 launched: '/home/anton/Projects/feedr/standalone-server/target/debug/standalone-server' (x86_64)
Process 985173 stopped
* thread #18, name = 'standalone-serv', stop reason = signal SIGSEGV: address access protected (fault address: 0x7fffe4ff72b0)
   frame #0: 0x00005555577a8924 standalone-server`__rust_probestack + 23
standalone-server`__rust_probestack:
->  0x5555577a8924 <+23>: testq  %rsp, 0x8(%rsp)
   0x5555577a8929 <+28>: subq   $0x1000, %r11             ; imm = 0x1000
   0x5555577a8930 <+35>: cmpq   $0x1000, %r11             ; imm = 0x1000
   0x5555577a8937 <+42>: ja     0x5555577a891d            ; <+16>
порылся

вот такой код:
match &td_type[..] {
"value" => macros!(...),
...
}

матч делается по 80и строкам. уменьшаю на 30 - всё ок. возвращаю одну (становится 51) - падает thread '<unknown>' has overflowed its stack...
даже не знаю, что по этому поводу спросить... как сматчить оставшиеся 30 вариантов, чтобы стек не переполнялся? :D
источник

MB

Mikail Bagishov in Rust Beginners
Возможно макрос генерирует тонну кода, использующего много стека
источник

a

antuan in Rust Beginners
ну как много, экран-полтора)
источник

a

antuan in Rust Beginners
падает конкретно в таком стеке этого макроса: ещё один матч (ok/err), if, Enum::Value(value)
источник

a

antuan in Rust Beginners
т.е. если приведения к энуму не делать - становится норм
источник

a

antuan in Rust Beginners
ну и разумеется, всё это завернуто в тонну кода, футур...
источник

a

antuan in Rust Beginners
сформулировал вопрос. почему количество матчей влияет? мы ж энивей при матче не заходим во все ветки, а значит другие ветки на размер стека влиять не должны.
источник

MB

Mikail Bagishov in Rust Beginners
ну это странно, да.
Возможно из-за асинка.
Это дебажная сборка?
источник

a

antuan in Rust Beginners
просто cargo build, если речь про это
выпилю матч по строкам, заюзаю #[serde(tag="@type")], поглядим, поможет ли. а то и правда что-то немного бессмысленное делается
источник

MB

Mikail Bagishov in Rust Beginners
Ну в оптимизированной сборке (—release) потребление стека вероятно бдут лучше
источник

a

antuan in Rust Beginners
угу. как будет готово к релизу - обязательно попробую. а пока что мне б код написать было бы неплохо)
интересно, можно ли это считать багом языка. и если да - как б её воспроизвести....
источник

MB

Mikail Bagishov in Rust Beginners
ну багом языка это точно не является.
Это может быть баг в макросе или баг в компиляторе.
Или не баг а просто недостаточная оптимизация.

Флаг —release не имеет ничего общего с релизом. Он просто означает, что ценой замедления компиляции будет собран более эффективный бинарник.
источник

MB

Mikail Bagishov in Rust Beginners
Он называется так лишь потому, что обычно при разработке он не используется, а для создания распространяемых конечным юзерам бинарников используется
источник

a

antuan in Rust Beginners
https://t.me/rust_beginners_ru/92272
мне казалось, слова "это страно" как бы говорит о том, что так быть по идее не должно.

я могу попробовать —release, конечно, спасибо... насколько замедляется сборка?
источник

MB

Mikail Bagishov in Rust Beginners
> мне казалось, слова "это страно" как бы говорит о том, что так быть по идее не должно.
Да, я удивлен такому. Но валить это именно на язык, а не на компилятор или макрос без разбора не стоит.

Насколько замедляется сборка - зависит от многих факторов, поэтому даже не возьмусь предсказывать.
источник

a

antuan in Rust Beginners
аргумент...
источник

a

antuan in Rust Beginners
кстати, если макрос определен на уровне метода, а не модуля - может влиять на размер стека? предполагаю, что нет, но всё же...
источник