Ich habe einen Zweig von Servo, der bei der Ausführung auf Android abstürzt, da eine Schlüsselverwendung von mem::replace nicht dazu führt, dass das Ziel die Werte ändert. Wenn ich println!("{:?}", self.pending_line)
vor und nach dem mem::replace hinzufüge, werden die Werte auf dem Desktop wie erwartet aktualisiert, aber auf Android bleibt der ursprüngliche Wert erhalten.
Wenn ich stattdessen eines der folgenden verwende:
self.pending_line = Line::new(self.floats.writing_mode, &self.minimum_metrics);
oder
let mut new_line = Line::new(self.floats.writing_mode, &self.minimum_metrics);
mem::swap(&mut self.pending_line, &mut new_line);
dann wird self.pending
wie erwartet aktualisiert und Servo stürzt unter Android nicht ab.
Folgendes funktioniert auch:
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));
(ja, dieselbe Operation zweimal ausführen)
Hmm, es sieht so aus, als ob dieser Typ ziemlich groß ist (https://github.com/jdm/servo/blob/layoutstuff/components/layout/inline.rs#L221-L245), also wird der Simd-Pfad im Swap (https ://github.com/rust-lang/rust/blob/master/src/libcore/ptr.rs#L194-L227) das derzeit auf einigen anderen Plattformen deaktiviert ist, also frage ich mich, ob der Fehler irgendwo drin ist ...
Triage: Nicht sicher, ob dies immer noch ein Problem ist.
Aktualisierter libcore SIMD-Code:
Hilfreichster Kommentar
Folgendes funktioniert auch:
(ja, dieselbe Operation zweimal ausführen)