Tengo una rama de Servo que se bloquea cuando se ejecuta en Android porque el uso de una println!("{:?}", self.pending_line)
antes y después de mem :: replace, en el escritorio los valores se actualizan como se esperaba, pero en Android permanece el valor original.
Cuando utilizo cualquiera de los siguientes en su lugar:
self.pending_line = Line::new(self.floats.writing_mode, &self.minimum_metrics);
o
let mut new_line = Line::new(self.floats.writing_mode, &self.minimum_metrics);
mem::swap(&mut self.pending_line, &mut new_line);
luego self.pending
se actualiza como se esperaba y Servo no falla en Android.
Lo siguiente también funciona:
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));
(sí, realizando la misma operación dos veces)
Hmm, parece que ese tipo es bastante grande (https://github.com/jdm/servo/blob/layoutstuff/components/layout/inline.rs#L221-L245), por lo que entrará en la ruta simd en intercambio (https : //github.com/rust-lang/rust/blob/master/src/libcore/ptr.rs#L194-L227) que actualmente está deshabilitado en algunas otras plataformas, así que me pregunto si el error está ahí en alguna parte ...
Triage: No estoy seguro de si esto sigue siendo un problema.
Código SIMD libcore actualizado:
Comentario más útil
Lo siguiente también funciona:
(sí, realizando la misma operación dos veces)