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がクラッシュしません。
以下も機能します。
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コード:
最も参考になるコメント
以下も機能します。
(はい、同じ操作を2回実行します)