From 335cb4c9f4a48acdd82537f7d49019f0e5b34aa1 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Wed, 7 Feb 2018 22:48:44 +0100 Subject: [PATCH] Whitelist Copy types when generating PropertyDeclaration --- .../style/properties/properties.mako.rs | 68 +++++++++++++++---- components/style/values/generics/transform.rs | 8 +-- .../style/values/specified/background.rs | 2 +- components/style/values/specified/border.rs | 2 +- components/style/values/specified/font.rs | 6 +- 5 files changed, 63 insertions(+), 23 deletions(-) diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index 21d585fcb48..edd82ce6236 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -206,11 +206,51 @@ pub mod animated_properties { <% from itertools import groupby + copyTypes = set([ + "AlignContent", + "AlignItems", + "AlignSelf", + "BackgroundRepeat", + "BorderImageRepeat", + "BorderStyle", + "Contain", + "FontStyleAdjust", + "FontSynthesis", + "FontWeight", + "GridAutoFlow", + "ImageOrientation", + "InitialLetter", + "Integer", + "IntegerOrAuto", + "JustifyContent", + "JustifyItems", + "JustifySelf", + "MozForceBrokenImageIcon", + "MozScriptLevel", + "MozScriptMinSize", + "MozScriptSizeMultiplier", + "NonNegativeNumber", + "Opacity", + "OutlineStyle", + "OverscrollBehavior", + "Percentage", + "PositiveIntegerOrAuto", + "SVGPaintOrder", + "ScrollSnapType", + "TextDecorationLine", + "TouchAction", + "TransformStyle", + "XSpan", + "XTextZoom", + ]) + variants = [] for property in data.longhands: if property.predefined_type and not property.is_vector: + copy = property.predefined_type in copyTypes ty = "::values::specified::{}".format(property.predefined_type) else: + copy = bool(property.keyword) and not property.is_vector ty = "longhands::{}::SpecifiedValue".format(property.ident) if property.boxed: ty = "Box<{}>".format(ty) @@ -218,7 +258,7 @@ pub mod animated_properties { "name": property.camel_case, "type": ty, "doc": "`" + property.name + "`", - "keyword": bool(property.keyword) and not property.is_vector, + "copy": copy, }) groups = {} @@ -229,9 +269,9 @@ pub mod animated_properties { groups[ty] = group for v in group: if len(group) == 1: - sortkeys[v["name"]] = (not v["keyword"], 1, v["name"], "") + sortkeys[v["name"]] = (not v["copy"], 1, v["name"], "") else: - sortkeys[v["name"]] = (not v["keyword"], len(group), ty, v["name"]) + sortkeys[v["name"]] = (not v["copy"], len(group), ty, v["name"]) variants.sort(key=lambda x: sortkeys[x["name"]]) # It is extremely important to sort the `data.longhands` array here so @@ -251,19 +291,19 @@ pub mod animated_properties { "name": "CSSWideKeyword", "type": "WideKeywordDeclaration", "doc": "A CSS-wide keyword.", - "keyword": False, + "copy": False, }, { "name": "WithVariables", "type": "VariableDeclaration", "doc": "An unparsed declaration.", - "keyword": False, + "copy": False, }, { "name": "Custom", "type": "CustomDeclaration", "doc": "A custom property declaration.", - "keyword": False, + "copy": False, }, ] for v in extra: @@ -292,15 +332,15 @@ impl Clone for PropertyDeclaration { use self::PropertyDeclaration::*; <% - [keywords, others] = [list(g) for _, g in groupby(variants, key=lambda x: not x["keyword"])] + [copy, others] = [list(g) for _, g in groupby(variants, key=lambda x: not x["copy"])] %> match *self { - ${" | ".join("{}(..)".format(v["name"]) for v in keywords)} => { + ${" |\n".join("{}(..)".format(v["name"]) for v in copy)} => { #[derive(Clone, Copy)] #[repr(u16)] - enum Keywords { - % for v in keywords: + enum CopyVariants { + % for v in copy: _${v["name"]}(${v["type"]}), % endfor } @@ -308,8 +348,8 @@ impl Clone for PropertyDeclaration { unsafe { let mut out = mem::uninitialized(); ptr::write( - &mut out as *mut _ as *mut Keywords, - *(self as *const _ as *const Keywords), + &mut out as *mut _ as *mut CopyVariants, + *(self as *const _ as *const CopyVariants), ); out } @@ -323,7 +363,7 @@ impl Clone for PropertyDeclaration { ${vs[0]["name"]}(value.clone()) } % else: - ${" | ".join("{}(ref value)".format(v["name"]) for v in vs)} => { + ${" |\n".join("{}(ref value)".format(v["name"]) for v in vs)} => { unsafe { let mut out = ManuallyDrop::new(mem::uninitialized()); ptr::write( @@ -357,7 +397,7 @@ impl PartialEq for PropertyDeclaration { } match *self { % for ty, vs in groupby(variants, key=lambda x: x["type"]): - ${" | ".join("{}(ref this)".format(v["name"]) for v in vs)} => { + ${" |\n".join("{}(ref this)".format(v["name"]) for v in vs)} => { let other_repr = &*(other as *const _ as *const PropertyDeclarationVariantRepr<${ty}>); *this == other_repr.value diff --git a/components/style/values/generics/transform.rs b/components/style/values/generics/transform.rs index f2818842723..caa71d15102 100644 --- a/components/style/values/generics/transform.rs +++ b/components/style/values/generics/transform.rs @@ -675,8 +675,8 @@ pub fn get_normalized_vector_and_angle( } } -#[derive(ComputeSquaredDistance, ToAnimatedZero, ToComputedValue)] -#[derive(Clone, Debug, MallocSizeOf, PartialEq, ToCss)] +#[derive(Clone, ComputeSquaredDistance, Copy, Debug, MallocSizeOf, PartialEq)] +#[derive(ToAnimatedZero, ToComputedValue, ToCss)] /// A value of the `Rotate` property /// /// @@ -689,8 +689,8 @@ pub enum Rotate { Rotate3D(Number, Number, Number, Angle), } -#[derive(ComputeSquaredDistance, ToAnimatedZero, ToComputedValue)] -#[derive(Clone, Debug, MallocSizeOf, PartialEq, ToCss)] +#[derive(Clone, ComputeSquaredDistance, Copy, Debug, MallocSizeOf, PartialEq)] +#[derive(ToAnimatedZero, ToComputedValue, ToCss)] /// A value of the `Scale` property /// /// diff --git a/components/style/values/specified/background.rs b/components/style/values/specified/background.rs index e26414ca768..4387563a3b1 100644 --- a/components/style/values/specified/background.rs +++ b/components/style/values/specified/background.rs @@ -58,7 +58,7 @@ pub enum BackgroundRepeatKeyword { /// The specified value for the `background-repeat` property. /// /// https://drafts.csswg.org/css-backgrounds/#the-background-repeat -#[derive(Clone, Debug, MallocSizeOf, PartialEq, ToCss)] +#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, ToCss)] pub enum BackgroundRepeat { /// `repeat-x` RepeatX, diff --git a/components/style/values/specified/border.rs b/components/style/values/specified/border.rs index f382e1d4634..a9cc4fc2983 100644 --- a/components/style/values/specified/border.rs +++ b/components/style/values/specified/border.rs @@ -186,7 +186,7 @@ pub enum BorderImageRepeatKeyword { /// The specified value for the `border-image-repeat` property. /// /// https://drafts.csswg.org/css-backgrounds/#the-border-image-repeat -#[derive(Clone, Debug, MallocSizeOf, PartialEq, ToCss)] +#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, ToCss)] pub struct BorderImageRepeat(pub BorderImageRepeatKeyword, pub Option); impl BorderImageRepeat { diff --git a/components/style/values/specified/font.rs b/components/style/values/specified/font.rs index c823dca799c..50d703cfa06 100644 --- a/components/style/values/specified/font.rs +++ b/components/style/values/specified/font.rs @@ -1776,7 +1776,7 @@ impl Parse for FontFeatureSettings { } } -#[derive(Clone, Debug, MallocSizeOf, PartialEq, ToComputedValue)] +#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, ToComputedValue)] /// Whether user agents are allowed to synthesize bold or oblique font faces /// when a font family lacks bold or italic faces pub struct FontSynthesis { @@ -2054,7 +2054,7 @@ impl Parse for VariationValue { } -#[derive(Clone, Debug, MallocSizeOf, PartialEq, ToComputedValue)] +#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, ToComputedValue)] /// text-zoom. Enable if true, disable if false pub struct XTextZoom(pub bool); @@ -2106,7 +2106,7 @@ impl ToCss for XLang { } #[cfg_attr(feature = "gecko", derive(MallocSizeOf))] -#[derive(Clone, Debug, PartialEq, ToCss)] +#[derive(Clone, Copy, Debug, PartialEq, ToCss)] /// Specifies the minimum font size allowed due to changes in scriptlevel. /// Ref: https://wiki.mozilla.org/MathML:mstyle pub struct MozScriptMinSize(pub NoCalcLength);