Rust: mem::replace mutiert das Ziel nicht auf Android

Erstellt am 22. März 2018  ·  3Kommentare  ·  Quelle: rust-lang/rust

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.

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

Hilfreichster Kommentar

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)

Alle 3 Kommentare

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:

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen