Vladimir
Vladimir
он поидее может понять и добавить лишний дроп
Vladimir
без флагов
Alexander
так перешёл по ссылкам
Alexander
сейчас прочитю может останутся вопросы - спрошу
Alexander
ааа там конкретной реализации нету...
ozkriff🇺🇦
без флагов
ну там компилятор когда может (часто) статически определеяет и никакого флага не нужно, но если у тебя код с ветвлениями - статически никак не узнаешь
Alexander
почему спрашиваю, мне интересно можно ли это переиспользовать у себя в каком-то виде
Vladimir
можно пример такого ветвления когда статически нельзя добавить лишний дроп?
Alexander
т.е.:
fn foo(Result<Baz,Quu> y) Box<Bar> -> ()
let x = Box::new(Bar);
let z = y.unwrap();
return x
Alexander
вот например такой код
Alexander
извините, что не скомпиляется, но суть я думаю ясна
Alexander
в случае если нам передали Err<Baz> агрументом, то все развалится, но память должна освободиться
Alexander
а если не передали, то Box должен вернуться выше и все хорошо
Alexander
@c_vld ^
Alexander
вот как это внутри работает
Alexander
на стек складывается инфа о выделенных ресурсах, при unchecked исключении сворачиваем стек все освобождая, иначе тупо выходим?
Vladimir
https://doc.rust-lang.org/beta/nomicon/unwinding.html
Vladimir
вот тут почитай
Alexander
ниговорят как сделано, или я плохо читаю
Vladimir
ну хз там еще подкатегории есть
Vladimir
суть в том, что есть два вида обработка паники в расте
ozkriff🇺🇦
https://www.reddit.com/r/rust/comments/4zj7v0/drop_flags_are_gone_o/ - в прошлогодней новости есть пара интересных коментов с подробностями, кстати
Vladimir
@ozkriff я просто смотрю на такой код
pub fn some(a: bool,b: bool) {
let mut v;
if a {
v = test::black_box(NewStruct);
}
}
Vladimir
он полностью аналог с плейпена, правильно?
Vladimir
но при этом я не нахожу тут анализа переменной со стека
example::some:
test dil, dil
je .LBB1_2
push rbp
mov rbp, rsp
sub rsp, 16
lea rax, [rbp - 8]
call <example::NewStruct as core::ops::drop::Drop>::drop@PLT
add rsp, 16
pop rbp
.LBB1_2:
ret
Vladimir
даже в более сложном
pub fn some(a: bool,b: bool) {
let mut v;
if a {
v = test::black_box(NewStruct);
}
if b {
v = test::black_box(NewStruct);
}
}
Sherzod
Sherzod
Андрюха, давно тут?
Vladimir
example::some:
push rbp
mov rbp, rsp
push rbx
push rax
test dil, dil
je .LBB2_1
lea rax, [rbp - 16]
mov al, 1
test sil, sil
jne .LBB2_5
jmp .LBB2_8
.LBB2_1:
xor eax, eax
test sil, sil
je .LBB2_8
.LBB2_5:
lea rcx, [rbp - 16]
test al, al
je .LBB2_7
call <example::NewStruct as core::ops::drop::Drop>::drop@PLT
jmp .LBB2_7
.LBB2_8:
test al, al
je .LBB2_9
.LBB2_7:
call <example::NewStruct as core::ops::drop::Drop>::drop@PLT
.LBB2_9:
add rsp, 8
pop rbx
pop rbp
ret
mov rbx, rax
call core::ptr::drop_in_place
mov rdi, rbx
call _Unwind_Resume@PLT
str.0:
Alexander
@c_vld ясно, вот мне случай с unroll интересен
ozkriff🇺🇦
хм, интересно. в моей картине мира тут флаги быть должны) может компилятор анализирует контекст хитрее и понимает что они таки не нужны? надо будет покопать
ozkriff🇺🇦
с утра вот. я даже тебе отвечал про гифку с go :(
Sherzod
Sherzod
Vladimir
@qnikst если честно, технически как унролл я тебе не скажу, могу лишь сказать, что поочередно дропаются все переменные со стека, дергая их деструкторы, и так по всей цепочке вызовов
Vladimir
до
перехвата унвинда
Alexander
а не знаешь на стеке специальный frame с указателями на методы? или что
Alexander
ну хотя не так и важно
Alexander
хм.. хотя интересно что происходит когда такая переменная совобождается обычным образом, инфа со стека снимается?
Сережа
я не уверен как это в расте, но скорее всего компилятор должен генерировать вызов Drop неявно когда видит выход из блока, которому принадлежит объект
Сережа
что значит обычным способом переменная освобождается?
Сережа
что значит инфа снимается со стека?
Filipp
указатель стека декрементится на размер фрейма?
Filipp
https://careers.mozilla.org/position/gh/906143
а че сюда никто не апплаился?
Cuno
@qnikst В расте llvm exceptions используются для паники: https://github.com/rust-lang/rust/blob/master/src/libpanic_unwind/gcc.rs
John
Cuno
Да, действительно. Коммент в начале файла ввел в заблуждение.
VCL
VCL
Приветствую․ Какой package рекомендуете устанавливать для VSCode?
Маjко
2
VCL
Loo
Loo
պլհկ
kitsu
VCL
iNTELLIJ IDEA
Есть․ Даже с opensource лицензией хД. Но решил попробовать что-то новое.
պլհկ
Marat
VCL
Плохой совет!
В том extension-е есть возможность выбрать RLS.
պլհկ
А rust rls официальный от команды rls
Маjко
Маjко
Это единственный развивающийся плагин для раста
Маjко
И он поддерживает как rls так и racer + cargo check
Сережа
В идее есть отладка пошаговая?
Маjко
VCL
iNTELLIJ IDEA
И самописные замены rustfmt, racer и т․д., не думаю, что хорошая идея.
VCL
А там в плагине всё с нуля
VCL
Насколько знаю
Loo
Vlad
Че кто звал?
Bugworm
Вим
Сережа
Умеет
պլհկ
Это единственный развивающийся плагин для раста
Hello everyone. I'm a maintainer and I'm very busy. At some point rls-vscode will supersede the extension. Until that moment someone should maintain the extension. If you are interested in it, please send me an email to kalita.alexey@outlook.com
պլհկ
Да, бро, ты был прав, сорян
Loo
outlook 0_0