Rust: mem :: replace на самом деле не изменяет место назначения на Android

Созданный на 22 мар. 2018  ·  3Комментарии  ·  Источник: rust-lang/rust

У меня есть ветка Servo, которая дает сбой при запуске на Android, потому что ключевое использование mem :: replace на самом деле не приводит к изменению значений в месте назначения. Когда я добавляю println!("{:?}", self.pending_line) до и после mem :: replace, на рабочем столе значения обновляются, как и ожидалось, но на Android исходное значение остается.

Когда вместо этого я использую одно из следующего:

self.pending_line = Line::new(self.floats.writing_mode, &self.minimum_metrics);

или

let mut new_line = Line::new(self.floats.writing_mode, &self.minimum_metrics);
mem::swap(&mut self.pending_line, &mut new_line);

тогда self.pending обновляется должным образом, и Servo не дает сбоев на Android.

A-codegen A-simd C-bug O-android T-compiler

Самый полезный комментарий

Также работает следующее:

        mem::replace(&mut self.pending_line,
                     Line::new(self.floats.writing_mode, &self.minimum_metrics));
        mem::replace(&mut self.pending_line,
                     Line::new(self.floats.writing_mode, &self.minimum_metrics));

(да, выполнить одну и ту же операцию дважды)

Все 3 Комментарий

Также работает следующее:

        mem::replace(&mut self.pending_line,
                     Line::new(self.floats.writing_mode, &self.minimum_metrics));
        mem::replace(&mut self.pending_line,
                     Line::new(self.floats.writing_mode, &self.minimum_metrics));

(да, выполнить одну и ту же операцию дважды)

Хм, похоже, этот тип довольно большой (https://github.com/jdm/servo/blob/layoutstuff/components/layout/inline.rs#L221-L245), поэтому будет попадать в путь simd в свопе (https : //github.com/rust-lang/rust/blob/master/src/libcore/ptr.rs#L194-L227), который в настоящее время отключен на некоторых других платформах, поэтому мне интересно, где-то там ошибка ...

Сортировка: не уверен, что это все еще проблема.

Обновлен SIMD-код libcore:

https://github.com/rust-lang/rust/blob/8ce3f840ae9b735a66531996c32330f24b877cb0/src/libcore/ptr/mod.rs#L418 -L465

Была ли эта страница полезной?
0 / 5 - 0 рейтинги