Rust: mem::replace 实际上不会改变 Android 上的目的地

创建于 2018-03-22  ·  3评论  ·  资料来源: rust-lang/rust

我有一个Servo 分支,它在 Android 上运行时崩溃,因为mem::replaceprintln!("{:?}", 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 上崩溃。

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

(是的,执行相同的操作两次)

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

(是的,执行相同的操作两次)

嗯,看起来这种类型非常大(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)目前在其他一些平台上被禁用,所以我想知道这个错误是否在某个地方......

分类:不确定这是否仍然是一个问题。

更新了 libcore SIMD 代码:

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

此页面是否有帮助?
0 / 5 - 0 等级