Rust: mem :: replace en realidad no mute el destino en Android

Creado en 22 mar. 2018  ·  3Comentarios  ·  Fuente: rust-lang/rust

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.

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

Comentario más útil

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)

Todos 3 comentarios

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:

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

¿Fue útil esta página
0 / 5 - 0 calificaciones