Rust: mem :: replace na verdade não altera o destino no Android

Criado em 22 mar. 2018  ·  3Comentários  ·  Fonte: rust-lang/rust

Eu tenho um ramo do Servo que trava ao ser executado no Android porque o uso de mem :: replace não faz com que o destino mude os valores. Quando adiciono println!("{:?}", self.pending_line) antes e depois de mem :: replace, no desktop os valores são atualizados conforme o esperado, mas no Android o valor original permanece.

Quando eu uso um dos seguintes:

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

ou

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

então self.pending é atualizado conforme o esperado e o Servo não trava no Android.

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

Comentários muito úteis

O seguinte também 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));

(sim, realizando a mesma operação duas vezes)

Todos 3 comentários

O seguinte também 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));

(sim, realizando a mesma operação duas vezes)

Hmm, parece que esse tipo é muito grande (https://github.com/jdm/servo/blob/layoutstuff/components/layout/inline.rs#L221-L245), então atingirei o caminho simd no swap (https : //github.com/rust-lang/rust/blob/master/src/libcore/ptr.rs#L194-L227) que está atualmente desativado em algumas outras plataformas, então eu me pergunto se o bug está lá em algum lugar ...

Triagem: não tenho certeza se isso ainda é um problema.

Código SIMD da libcore atualizado:

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

Esta página foi útil?
0 / 5 - 0 avaliações