diff --git a/components/style/data.rs b/components/style/data.rs index b701d2c5c236..b50b21701911 100644 --- a/components/style/data.rs +++ b/components/style/data.rs @@ -100,8 +100,24 @@ impl RestyleData { /// A list of styles for eagerly-cascaded pseudo-elements. /// Lazily-allocated. -#[derive(Clone, Debug)] -pub struct EagerPseudoStyles(pub Option>]>>); +#[derive(Debug)] +pub struct EagerPseudoStyles(pub Option>; EAGER_PSEUDO_COUNT]>>); + +// Manually implement `Clone` here because the derived impl of `Clone` for +// array types assumes the value inside is `Copy`. +impl Clone for EagerPseudoStyles { + fn clone(&self) -> Self { + if self.0.is_none() { + return EagerPseudoStyles(None) + } + let self_values = self.0.as_ref().unwrap(); + let mut values: [Option>; EAGER_PSEUDO_COUNT] = Default::default(); + for i in 0..EAGER_PSEUDO_COUNT { + values[i] = self_values[i].clone(); + } + EagerPseudoStyles(Some(Box::new(values))) + } +} impl EagerPseudoStyles { /// Returns whether there are any pseudo styles. @@ -129,7 +145,7 @@ impl EagerPseudoStyles { /// Sets the style for the eager pseudo. pub fn set(&mut self, pseudo: &PseudoElement, value: Arc) { if self.0.is_none() { - self.0 = Some(vec![None; EAGER_PSEUDO_COUNT].into_boxed_slice()); + self.0 = Some(Box::new(Default::default())); } self.0.as_mut().unwrap()[pseudo.eager_index()] = Some(value); } diff --git a/tests/unit/stylo/size_of.rs b/tests/unit/stylo/size_of.rs index f464c173b957..4f4521df9e28 100644 --- a/tests/unit/stylo/size_of.rs +++ b/tests/unit/stylo/size_of.rs @@ -32,9 +32,9 @@ size_of_test!(test_size_of_rule, style::stylist::Rule, 32); size_of_test!(test_size_of_option_arc_cv, Option>, 8); size_of_test!(test_size_of_option_rule_node, Option, 8); -size_of_test!(test_size_of_element_styles, ElementStyles, 24); +size_of_test!(test_size_of_element_styles, ElementStyles, 16); size_of_test!(test_size_of_restyle_data, RestyleData, 8); -size_of_test!(test_size_of_element_data, ElementData, 32); +size_of_test!(test_size_of_element_data, ElementData, 24); size_of_test!(test_size_of_property_declaration, style::properties::PropertyDeclaration, 32);