Uplift bitfield fix for nsChangeHint

This commit is contained in:
Manish Goregaokar 2016-11-18 14:09:23 -08:00
parent 9fb589dfd2
commit 3d5b26ac26
5 changed files with 219 additions and 104 deletions

View file

@ -188,6 +188,7 @@ COMPILATION_TARGETS = {
"StyleTransition",
"UniquePtr",
],
"bitfield_enum_types": ["nsChangeHint", "nsRestyleHint"],
"opaque_types": [
"atomic___base",
"nsAString_internal_char_traits",
@ -523,6 +524,11 @@ def build(objdir, target_name, debug, debugger, kind_name=None,
flags.append("--whitelist-var")
flags.append(header)
if "bitfield_enum_types" in current_target:
for ty in current_target["bitfield_enum_types"]:
flags.append("--bitfield-enum")
flags.append(ty)
if "opaque_types" in current_target:
for ty in current_target["opaque_types"]:
flags.append("--opaque-type")

View file

@ -4,6 +4,7 @@
use dom::TRestyleDamage;
use gecko_bindings::bindings;
use gecko_bindings::structs;
use gecko_bindings::structs::{nsChangeHint, nsStyleContext};
use gecko_bindings::sugar::ownership::FFIArcHelpers;
use properties::ComputedValues;
@ -23,8 +24,7 @@ impl TRestyleDamage for GeckoRestyleDamage {
type PreExistingComputedValues = nsStyleContext;
fn empty() -> Self {
use std::mem;
GeckoRestyleDamage(unsafe { mem::transmute(0u32) })
GeckoRestyleDamage(nsChangeHint(0))
}
fn compute(source: &nsStyleContext,
@ -38,7 +38,7 @@ impl TRestyleDamage for GeckoRestyleDamage {
}
fn rebuild_and_reflow() -> Self {
GeckoRestyleDamage(nsChangeHint::nsChangeHint_ReconstructFrame)
GeckoRestyleDamage(structs::nsChangeHint_nsChangeHint_ReconstructFrame)
}
}
@ -46,8 +46,7 @@ impl BitOr for GeckoRestyleDamage {
type Output = Self;
fn bitor(self, other: Self) -> Self {
use std::mem;
GeckoRestyleDamage(unsafe { mem::transmute(self.0 as u32 | other.0 as u32) })
GeckoRestyleDamage(self.0 | other.0)
}
}

View file

@ -3948,7 +3948,36 @@ fn bindgen_test_layout_EventStates() {
impl Clone for EventStates {
fn clone(&self) -> Self { *self }
}
#[repr(u32)]
pub const nsRestyleHint_eRestyle_Self: nsRestyleHint = nsRestyleHint(1);
pub const nsRestyleHint_eRestyle_SomeDescendants: nsRestyleHint =
nsRestyleHint(2);
pub const nsRestyleHint_eRestyle_Subtree: nsRestyleHint = nsRestyleHint(4);
pub const nsRestyleHint_eRestyle_LaterSiblings: nsRestyleHint =
nsRestyleHint(8);
pub const nsRestyleHint_eRestyle_CSSTransitions: nsRestyleHint =
nsRestyleHint(16);
pub const nsRestyleHint_eRestyle_CSSAnimations: nsRestyleHint =
nsRestyleHint(32);
pub const nsRestyleHint_eRestyle_SVGAttrAnimations: nsRestyleHint =
nsRestyleHint(64);
pub const nsRestyleHint_eRestyle_StyleAttribute: nsRestyleHint =
nsRestyleHint(128);
pub const nsRestyleHint_eRestyle_StyleAttribute_Animations: nsRestyleHint =
nsRestyleHint(256);
pub const nsRestyleHint_eRestyle_Force: nsRestyleHint = nsRestyleHint(512);
pub const nsRestyleHint_eRestyle_ForceDescendants: nsRestyleHint =
nsRestyleHint(1024);
pub const nsRestyleHint_eRestyle_AllHintsWithAnimations: nsRestyleHint =
nsRestyleHint(368);
impl ::std::ops::BitOr<nsRestyleHint> for nsRestyleHint {
type
Output
=
Self;
#[inline]
fn bitor(self, other: Self) -> Self { nsRestyleHint(self.0 | other.0) }
}
#[repr(C)]
/**
* |nsRestyleHint| is a bitfield for the result of
* |HasStateDependentStyle| and |HasAttributeDependentStyle|. When no
@ -3968,20 +3997,7 @@ impl Clone for EventStates {
* RestyleManager::RestyleHintToString.
*/
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum nsRestyleHint {
eRestyle_Self = 1,
eRestyle_SomeDescendants = 2,
eRestyle_Subtree = 4,
eRestyle_LaterSiblings = 8,
eRestyle_CSSTransitions = 16,
eRestyle_CSSAnimations = 32,
eRestyle_SVGAttrAnimations = 64,
eRestyle_StyleAttribute = 128,
eRestyle_StyleAttribute_Animations = 256,
eRestyle_Force = 512,
eRestyle_ForceDescendants = 1024,
eRestyle_AllHintsWithAnimations = 368,
}
pub struct nsRestyleHint(pub u32);
/**
* Instances of this class represent moments in time, or a special
* "null" moment. We do not use the non-monotonic system clock or
@ -5089,39 +5105,78 @@ fn bindgen_test_layout_RestyleManagerHandle() {
impl Clone for RestyleManagerHandle {
fn clone(&self) -> Self { *self }
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum nsChangeHint {
nsChangeHint_RepaintFrame = 1,
nsChangeHint_NeedReflow = 2,
nsChangeHint_ClearAncestorIntrinsics = 4,
nsChangeHint_ClearDescendantIntrinsics = 8,
nsChangeHint_NeedDirtyReflow = 16,
nsChangeHint_SyncFrameView = 32,
nsChangeHint_UpdateCursor = 64,
nsChangeHint_UpdateEffects = 128,
nsChangeHint_UpdateOpacityLayer = 256,
nsChangeHint_UpdateTransformLayer = 512,
nsChangeHint_ReconstructFrame = 1024,
nsChangeHint_UpdateOverflow = 2048,
nsChangeHint_UpdateSubtreeOverflow = 4096,
nsChangeHint_UpdatePostTransformOverflow = 8192,
nsChangeHint_UpdateParentOverflow = 16384,
nsChangeHint_ChildrenOnlyTransform = 32768,
nsChangeHint_RecomputePosition = 65536,
nsChangeHint_UpdateContainingBlock = 131072,
nsChangeHint_BorderStyleNoneChange = 262144,
nsChangeHint_UpdateTextPath = 524288,
nsChangeHint_SchedulePaint = 1048576,
nsChangeHint_NeutralChange = 2097152,
nsChangeHint_InvalidateRenderingObservers = 4194304,
nsChangeHint_ReflowChangesSizeOrPosition = 8388608,
nsChangeHint_UpdateComputedBSize = 16777216,
nsChangeHint_UpdateUsesOpacity = 33554432,
nsChangeHint_UpdateBackgroundPosition = 67108864,
nsChangeHint_AddOrRemoveTransform = 134217728,
nsChangeHint_AllHints = 268435455,
pub const nsChangeHint_nsChangeHint_RepaintFrame: nsChangeHint =
nsChangeHint(1);
pub const nsChangeHint_nsChangeHint_NeedReflow: nsChangeHint =
nsChangeHint(2);
pub const nsChangeHint_nsChangeHint_ClearAncestorIntrinsics: nsChangeHint =
nsChangeHint(4);
pub const nsChangeHint_nsChangeHint_ClearDescendantIntrinsics: nsChangeHint =
nsChangeHint(8);
pub const nsChangeHint_nsChangeHint_NeedDirtyReflow: nsChangeHint =
nsChangeHint(16);
pub const nsChangeHint_nsChangeHint_SyncFrameView: nsChangeHint =
nsChangeHint(32);
pub const nsChangeHint_nsChangeHint_UpdateCursor: nsChangeHint =
nsChangeHint(64);
pub const nsChangeHint_nsChangeHint_UpdateEffects: nsChangeHint =
nsChangeHint(128);
pub const nsChangeHint_nsChangeHint_UpdateOpacityLayer: nsChangeHint =
nsChangeHint(256);
pub const nsChangeHint_nsChangeHint_UpdateTransformLayer: nsChangeHint =
nsChangeHint(512);
pub const nsChangeHint_nsChangeHint_ReconstructFrame: nsChangeHint =
nsChangeHint(1024);
pub const nsChangeHint_nsChangeHint_UpdateOverflow: nsChangeHint =
nsChangeHint(2048);
pub const nsChangeHint_nsChangeHint_UpdateSubtreeOverflow: nsChangeHint =
nsChangeHint(4096);
pub const nsChangeHint_nsChangeHint_UpdatePostTransformOverflow: nsChangeHint
=
nsChangeHint(8192);
pub const nsChangeHint_nsChangeHint_UpdateParentOverflow: nsChangeHint =
nsChangeHint(16384);
pub const nsChangeHint_nsChangeHint_ChildrenOnlyTransform: nsChangeHint =
nsChangeHint(32768);
pub const nsChangeHint_nsChangeHint_RecomputePosition: nsChangeHint =
nsChangeHint(65536);
pub const nsChangeHint_nsChangeHint_UpdateContainingBlock: nsChangeHint =
nsChangeHint(131072);
pub const nsChangeHint_nsChangeHint_BorderStyleNoneChange: nsChangeHint =
nsChangeHint(262144);
pub const nsChangeHint_nsChangeHint_UpdateTextPath: nsChangeHint =
nsChangeHint(524288);
pub const nsChangeHint_nsChangeHint_SchedulePaint: nsChangeHint =
nsChangeHint(1048576);
pub const nsChangeHint_nsChangeHint_NeutralChange: nsChangeHint =
nsChangeHint(2097152);
pub const nsChangeHint_nsChangeHint_InvalidateRenderingObservers: nsChangeHint
=
nsChangeHint(4194304);
pub const nsChangeHint_nsChangeHint_ReflowChangesSizeOrPosition: nsChangeHint
=
nsChangeHint(8388608);
pub const nsChangeHint_nsChangeHint_UpdateComputedBSize: nsChangeHint =
nsChangeHint(16777216);
pub const nsChangeHint_nsChangeHint_UpdateUsesOpacity: nsChangeHint =
nsChangeHint(33554432);
pub const nsChangeHint_nsChangeHint_UpdateBackgroundPosition: nsChangeHint =
nsChangeHint(67108864);
pub const nsChangeHint_nsChangeHint_AddOrRemoveTransform: nsChangeHint =
nsChangeHint(134217728);
pub const nsChangeHint_nsChangeHint_AllHints: nsChangeHint =
nsChangeHint(268435455);
impl ::std::ops::BitOr<nsChangeHint> for nsChangeHint {
type
Output
=
Self;
#[inline]
fn bitor(self, other: Self) -> Self { nsChangeHint(self.0 | other.0) }
}
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct nsChangeHint(pub u32);
pub type nscolor = u32;
#[repr(u32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]

View file

@ -3930,7 +3930,36 @@ fn bindgen_test_layout_EventStates() {
impl Clone for EventStates {
fn clone(&self) -> Self { *self }
}
#[repr(u32)]
pub const nsRestyleHint_eRestyle_Self: nsRestyleHint = nsRestyleHint(1);
pub const nsRestyleHint_eRestyle_SomeDescendants: nsRestyleHint =
nsRestyleHint(2);
pub const nsRestyleHint_eRestyle_Subtree: nsRestyleHint = nsRestyleHint(4);
pub const nsRestyleHint_eRestyle_LaterSiblings: nsRestyleHint =
nsRestyleHint(8);
pub const nsRestyleHint_eRestyle_CSSTransitions: nsRestyleHint =
nsRestyleHint(16);
pub const nsRestyleHint_eRestyle_CSSAnimations: nsRestyleHint =
nsRestyleHint(32);
pub const nsRestyleHint_eRestyle_SVGAttrAnimations: nsRestyleHint =
nsRestyleHint(64);
pub const nsRestyleHint_eRestyle_StyleAttribute: nsRestyleHint =
nsRestyleHint(128);
pub const nsRestyleHint_eRestyle_StyleAttribute_Animations: nsRestyleHint =
nsRestyleHint(256);
pub const nsRestyleHint_eRestyle_Force: nsRestyleHint = nsRestyleHint(512);
pub const nsRestyleHint_eRestyle_ForceDescendants: nsRestyleHint =
nsRestyleHint(1024);
pub const nsRestyleHint_eRestyle_AllHintsWithAnimations: nsRestyleHint =
nsRestyleHint(368);
impl ::std::ops::BitOr<nsRestyleHint> for nsRestyleHint {
type
Output
=
Self;
#[inline]
fn bitor(self, other: Self) -> Self { nsRestyleHint(self.0 | other.0) }
}
#[repr(C)]
/**
* |nsRestyleHint| is a bitfield for the result of
* |HasStateDependentStyle| and |HasAttributeDependentStyle|. When no
@ -3950,20 +3979,7 @@ impl Clone for EventStates {
* RestyleManager::RestyleHintToString.
*/
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum nsRestyleHint {
eRestyle_Self = 1,
eRestyle_SomeDescendants = 2,
eRestyle_Subtree = 4,
eRestyle_LaterSiblings = 8,
eRestyle_CSSTransitions = 16,
eRestyle_CSSAnimations = 32,
eRestyle_SVGAttrAnimations = 64,
eRestyle_StyleAttribute = 128,
eRestyle_StyleAttribute_Animations = 256,
eRestyle_Force = 512,
eRestyle_ForceDescendants = 1024,
eRestyle_AllHintsWithAnimations = 368,
}
pub struct nsRestyleHint(pub u32);
/**
* Instances of this class represent moments in time, or a special
* "null" moment. We do not use the non-monotonic system clock or
@ -5068,39 +5084,78 @@ fn bindgen_test_layout_RestyleManagerHandle() {
impl Clone for RestyleManagerHandle {
fn clone(&self) -> Self { *self }
}
#[repr(u32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum nsChangeHint {
nsChangeHint_RepaintFrame = 1,
nsChangeHint_NeedReflow = 2,
nsChangeHint_ClearAncestorIntrinsics = 4,
nsChangeHint_ClearDescendantIntrinsics = 8,
nsChangeHint_NeedDirtyReflow = 16,
nsChangeHint_SyncFrameView = 32,
nsChangeHint_UpdateCursor = 64,
nsChangeHint_UpdateEffects = 128,
nsChangeHint_UpdateOpacityLayer = 256,
nsChangeHint_UpdateTransformLayer = 512,
nsChangeHint_ReconstructFrame = 1024,
nsChangeHint_UpdateOverflow = 2048,
nsChangeHint_UpdateSubtreeOverflow = 4096,
nsChangeHint_UpdatePostTransformOverflow = 8192,
nsChangeHint_UpdateParentOverflow = 16384,
nsChangeHint_ChildrenOnlyTransform = 32768,
nsChangeHint_RecomputePosition = 65536,
nsChangeHint_UpdateContainingBlock = 131072,
nsChangeHint_BorderStyleNoneChange = 262144,
nsChangeHint_UpdateTextPath = 524288,
nsChangeHint_SchedulePaint = 1048576,
nsChangeHint_NeutralChange = 2097152,
nsChangeHint_InvalidateRenderingObservers = 4194304,
nsChangeHint_ReflowChangesSizeOrPosition = 8388608,
nsChangeHint_UpdateComputedBSize = 16777216,
nsChangeHint_UpdateUsesOpacity = 33554432,
nsChangeHint_UpdateBackgroundPosition = 67108864,
nsChangeHint_AddOrRemoveTransform = 134217728,
nsChangeHint_AllHints = 268435455,
pub const nsChangeHint_nsChangeHint_RepaintFrame: nsChangeHint =
nsChangeHint(1);
pub const nsChangeHint_nsChangeHint_NeedReflow: nsChangeHint =
nsChangeHint(2);
pub const nsChangeHint_nsChangeHint_ClearAncestorIntrinsics: nsChangeHint =
nsChangeHint(4);
pub const nsChangeHint_nsChangeHint_ClearDescendantIntrinsics: nsChangeHint =
nsChangeHint(8);
pub const nsChangeHint_nsChangeHint_NeedDirtyReflow: nsChangeHint =
nsChangeHint(16);
pub const nsChangeHint_nsChangeHint_SyncFrameView: nsChangeHint =
nsChangeHint(32);
pub const nsChangeHint_nsChangeHint_UpdateCursor: nsChangeHint =
nsChangeHint(64);
pub const nsChangeHint_nsChangeHint_UpdateEffects: nsChangeHint =
nsChangeHint(128);
pub const nsChangeHint_nsChangeHint_UpdateOpacityLayer: nsChangeHint =
nsChangeHint(256);
pub const nsChangeHint_nsChangeHint_UpdateTransformLayer: nsChangeHint =
nsChangeHint(512);
pub const nsChangeHint_nsChangeHint_ReconstructFrame: nsChangeHint =
nsChangeHint(1024);
pub const nsChangeHint_nsChangeHint_UpdateOverflow: nsChangeHint =
nsChangeHint(2048);
pub const nsChangeHint_nsChangeHint_UpdateSubtreeOverflow: nsChangeHint =
nsChangeHint(4096);
pub const nsChangeHint_nsChangeHint_UpdatePostTransformOverflow: nsChangeHint
=
nsChangeHint(8192);
pub const nsChangeHint_nsChangeHint_UpdateParentOverflow: nsChangeHint =
nsChangeHint(16384);
pub const nsChangeHint_nsChangeHint_ChildrenOnlyTransform: nsChangeHint =
nsChangeHint(32768);
pub const nsChangeHint_nsChangeHint_RecomputePosition: nsChangeHint =
nsChangeHint(65536);
pub const nsChangeHint_nsChangeHint_UpdateContainingBlock: nsChangeHint =
nsChangeHint(131072);
pub const nsChangeHint_nsChangeHint_BorderStyleNoneChange: nsChangeHint =
nsChangeHint(262144);
pub const nsChangeHint_nsChangeHint_UpdateTextPath: nsChangeHint =
nsChangeHint(524288);
pub const nsChangeHint_nsChangeHint_SchedulePaint: nsChangeHint =
nsChangeHint(1048576);
pub const nsChangeHint_nsChangeHint_NeutralChange: nsChangeHint =
nsChangeHint(2097152);
pub const nsChangeHint_nsChangeHint_InvalidateRenderingObservers: nsChangeHint
=
nsChangeHint(4194304);
pub const nsChangeHint_nsChangeHint_ReflowChangesSizeOrPosition: nsChangeHint
=
nsChangeHint(8388608);
pub const nsChangeHint_nsChangeHint_UpdateComputedBSize: nsChangeHint =
nsChangeHint(16777216);
pub const nsChangeHint_nsChangeHint_UpdateUsesOpacity: nsChangeHint =
nsChangeHint(33554432);
pub const nsChangeHint_nsChangeHint_UpdateBackgroundPosition: nsChangeHint =
nsChangeHint(67108864);
pub const nsChangeHint_nsChangeHint_AddOrRemoveTransform: nsChangeHint =
nsChangeHint(134217728);
pub const nsChangeHint_nsChangeHint_AllHints: nsChangeHint =
nsChangeHint(268435455);
impl ::std::ops::BitOr<nsChangeHint> for nsChangeHint {
type
Output
=
Self;
#[inline]
fn bitor(self, other: Self) -> Self { nsChangeHint(self.0 | other.0) }
}
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct nsChangeHint(pub u32);
pub type nscolor = u32;
#[repr(u32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]

View file

@ -23,24 +23,24 @@ macro_rules! check_enum_value {
// const-fn and no other way to access the numerical value :-(
macro_rules! check_enum_value_non_static {
($a:expr, $b:expr) => {
assert_eq!($a as usize, $b as usize);
assert_eq!($a.0 as usize, $b as usize);
}
}
#[test]
fn assert_restyle_hints_match() {
use style::restyle_hints::*; // For flags
use style::gecko_bindings::structs::nsRestyleHint;
use style::gecko_bindings::structs;
check_enum_value_non_static!(nsRestyleHint::eRestyle_Self, RESTYLE_SELF.bits());
check_enum_value_non_static!(structs::nsRestyleHint_eRestyle_Self, RESTYLE_SELF.bits());
// XXX This for Servo actually means something like an hypothetical
// Restyle_AllDescendants (but without running selector matching on the
// element). ServoRestyleManager interprets it like that, but in practice we
// should align the behavior with Gecko adding a new restyle hint, maybe?
//
// See https://bugzilla.mozilla.org/show_bug.cgi?id=1291786
check_enum_value_non_static!(nsRestyleHint::eRestyle_SomeDescendants, RESTYLE_DESCENDANTS.bits());
check_enum_value_non_static!(nsRestyleHint::eRestyle_LaterSiblings, RESTYLE_LATER_SIBLINGS.bits());
check_enum_value_non_static!(structs::nsRestyleHint_eRestyle_SomeDescendants, RESTYLE_DESCENDANTS.bits());
check_enum_value_non_static!(structs::nsRestyleHint_eRestyle_LaterSiblings, RESTYLE_LATER_SIBLINGS.bits());
}
// Note that we can't call each_pseudo_element, parse_pseudo_element, or