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.
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 :
Commentaire le plus utile
Les éléments suivants fonctionnent également :
(oui, effectuer la même opération deux fois)