لدي فرع من 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.
يعمل ما يلي أيضًا:
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 المحدث:
التعليق الأكثر فائدة
يعمل ما يلي أيضًا:
(نعم ، قم بإجراء نفس العملية مرتين)