Rust: mem::replace ne modifie pas réellement la destination sur Android

Créé le 22 mars 2018  ·  3Commentaires  ·  Source: rust-lang/rust

J'ai une branche de Servo qui se bloque lorsqu'elle est exécutée sur Android car une utilisation clé de mem::replace n'entraîne pas réellement la modification des valeurs de la destination. Lorsque j'ajoute println!("{:?}", self.pending_line) avant et après le mem::replace, sur le bureau, les valeurs sont mises à jour comme prévu, mais sur Android, la valeur d'origine reste.

Lorsque j'utilise l'un des éléments suivants à la place :

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);

alors self.pending est mis à jour comme prévu et Servo ne plante pas sur Android.

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

Commentaire le plus utile

Les éléments suivants fonctionnent également :

        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));

(oui, effectuer la même opération deux fois)

Tous les 3 commentaires

Les éléments suivants fonctionnent également :

        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));

(oui, effectuer la même opération deux fois)

Hmm, il semble que ce type soit assez volumineux (https://github.com/jdm/servo/blob/layoutstuff/components/layout/inline.rs#L221-L245) il va donc frapper le chemin simd dans swap (https ://github.com/rust-lang/rust/blob/master/src/libcore/ptr.rs#L194-L227) qui est actuellement désactivé sur d'autres plates-formes, alors je me demande si le bogue est là quelque part...

Triage : Je ne sais pas si le problème persiste.

Code SIMD libcore mis à jour :

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

Cette page vous a été utile?
0 / 5 - 0 notes