Alexander
а не всеок
Alexander
сейчас, я минимальный пример сделаю
Konstantin
@qnikst спсб, что хоть маленько поднял уровень дискуссий на канале
Alexander
StorageDead(_5); // scope 2 at src/main.rs:14:23: 14:23
Alexander
вот что это значит? и StorageLive(_1)
Anonymous
и что должно вести себя неожидаемо?
Alexander
как это работает
Vladimir
сторейж дед значит что выход из скопа
Vladimir
очевидно
Alexander
при панике не вызываются drop-ы?
Alexander
я не спрашиваю "что это значит"
Alexander
я спрашиваю "как это реализовано"
Alexander
что это значит для программы во время выполнения
Vladimir
ничего это не значит
Alexander
я совсем непонятно общаюсь?
Alexander
т.е. это noop?
Alexander
блин..
Alexander
storage dead значит выход из скоупа, ничего это не значит
Vladimir
скоп существует ток для мира
Vladimir
для программы не существует
պլհկ
я
Vladimir
я тоже писал
Alexander
так, теперь как мне сделать исключение со stack unrolling?
Alexander
а то unwrap это паника при панике ничего не освобождается судя по некрономикону
Vladimir
@lonokhov не совсем в конце второй ветки
Alexander
так а как сделать что-то что у меня будет stack unwinding
Vladimir
https://play.rust-lang.org/?gist=d160b5cf2ec8591990ef4fd086a88ed4&version=stable
Vladimir
у раста переменная которая объявлена ниже в скопе, должна дропаться перед переменной которая объявлена выше
Vladimir
паника может быть и аборт, и unwind
Vladimir
в случае unwind всё освобождается
Vladimir
и по умолчанию unwind
Alexander
ok
Vladimir
да
պլհկ
catch_unwind
Alexander
fn test(b:bool, r:Result<u32,u32>) {
let x = A {};
if b {
let _ = r.unwrap();
std::mem::drop(x);
()
} else {
()
}
}
Alexander
вот пример, у него 2 формы вторая если unwrap сделать после дропа
Alexander
в обоих случаях деструктор вызывается один и только 1 раз
Alexander
это нормально правильно и понятно
Сережа
а если словить панику при размотке стека в панике будет аборт?
Alexander
что не понятно, как это реализовано внутри
Vladimir
Alexander
впрочем мир я только сейчас открою
Vladimir
по этому в дропе нельзя паниковать
Alexander
хм.. а не тут читерство
Сережа
с++ вы не любите, да?
Vladimir
сразу открывай асм
Alexander
unwrap ветвление создает
Alexander
я не умею в асм нормально
Sergey
Alexander
щас 1/0 сделаем
Alexander
fn test(b:bool, r:u32) {
let x = A {};
if b {
let _ = 1/r;
std::mem::drop(x);
()
} else {
()
}
}
Сережа
а хотя вы же сами тут говорили что unwind через gcc personality, так что, что в плюсах, то и в расте
Сережа
а на msvc тулчейне унвинд через SEH виндовые?
Alexander
во, хороший пример, тут нету неявного дропа в первой ветке, но если r=0 то x соберётся, а если !=0 то не соберётся лишний раз
Сережа
или все таки unwind через llvm exceptions, а оно уже в зависимости от target'а родной механизм использует?
Alexander
bb6: {
StorageDead(_6); // scope 2 at src/main.rs:19:5: 19:5
switchInt(_12) -> [0u8: bb7, otherwise: bb10]; // scope 1 at src/main.rs:20:2: 20:2
}
lil
Alexander
он в 1/r заменил на кейс проверку 0
Alexander
так понятно как он работает
Matwey
А если у меня функция состоит из одного экспрешина, обязательно ли ей писать возвращаемый тип, или сама догадается?
Vladimir
обязательно
Vladimir
никто не должен догадываться, это не питон
Vladimir
вызывающая сторона должна понимать, что за сигнатура у функции
ozkriff🇺🇦
Alexander
@lonokhov как ты это получил
Alexander
я пока (для mir) получил вставленный компилятором бранч
Alexander
который проверяет переменную на 0
Alexander
и если там 0 то освобождает и паникует
ozkriff🇺🇦
@c_vld блин, я до сих пор не верю что флагов на стеке совсем нет. нормальную документацию хрен найдешь. загрузил людей в гиттере
Vladimir
Vladimir
может то оптимизатор соптимизировал
Alexander
но чот я сомневаюсь, что в менее тривиальных случаях так прокатит и придётся флаги делать
Matwey
А можно ли из одной переменной сделать slice длиной 1 элемент?
Vladimir
Vladimir
Anonymous
&[v] слайс
Matwey
Понял, спасибо
Alexander
в общем хитро.. жалко к нам не притащить разумным способом
Alexander
а похожий способ мне показался неразумным или требует очень много от компилятора