У меня есть ветка 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.
Также работает следующее:
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:
Самый полезный комментарий
Также работает следующее:
(да, выполнить одну и ту же операцию дважды)