Rust: mem :: replace لا تغير الوجهة فعليًا على Android

تم إنشاؤها على ٢٢ مارس ٢٠١٨  ·  3تعليقات  ·  مصدر: rust-lang/rust

لدي فرع من Servo يتعطل عند تشغيله على Android لأن استخدام مفتاح mem :: replace لا يتسبب في الواقع في تغيير الوجهة للقيم. عندما أقوم بإضافة println!("{:?}", self.pending_line) قبل وبعد mem :: replace ، يتم تحديث القيم على سطح المكتب كما هو متوقع ، ولكن في 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 كما هو متوقع ولا يتعطل Servo على 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 التقييمات