Rust: mem :: replaceは、Androidで宛先を実際に変更しないでください

作成日 2018年03月22日  ·  3コメント  ·  ソース: rust-lang/rust

mem :: replaceをキーで使用しても実際には宛先の値が変更されないため、Androidで実行するとクラッシュするServoのブランチがあります。 mem :: replaceの前後にprintln!("{:?}", self.pending_line)を追加すると、デスクトップでは期待どおりに値が更新されますが、Androidでは元の値が残ります。

代わりに次のいずれかを使用する場合:

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

また

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

その後、 self.pendingが期待どおりに更新され、AndroidでServoがクラッシュしません。

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

最も参考になるコメント

以下も機能します。

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

(はい、同じ操作を2回実行します)

全てのコメント3件

以下も機能します。

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

(はい、同じ操作を2回実行します)

うーん、そのタイプはかなり大きいようです(https://github.com/jdm/servo/blob/layoutstuff/components/layout/inline.rs#L221-L245)ので、スワップでsimdパスにヒットします(https ://github.com/rust-lang/rust/blob/master/src/libcore/ptr.rs#L194-L227)現在、他のいくつかのプラットフォームでは無効になっているので、どこかにバグがあるのではないかと思います...

トリアージ:これがまだ問題であるかどうかはわかりません。

更新されたlibcoreSIMDコード:

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

このページは役に立ちましたか?
0 / 5 - 0 評価