Commit 2d488224 authored by Mason Freed's avatar Mason Freed Committed by Commit Bot

Optimize NodeType bit access

There were several performance regressions after [1] consolidated some
NodeType bits from individual flags to a bitmask. This CL attempts to
optimize back some of that performance.

[1] https://chromium.googlesource.com/chromium/src/+/196a45a23b1e0c1ad89c125a0877ce367b6b4bf3

Bug: 1036088, 1036089
Change-Id: I24b263cc7360c0178b76d759268406630f99a5cf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1978913
Commit-Queue: Kent Tamura <tkent@chromium.org>
Reviewed-by: default avatarKent Tamura <tkent@chromium.org>
Auto-Submit: Mason Freed <masonfreed@chromium.org>
Cr-Commit-Position: refs/heads/master@{#727839}
parent 8f5bb31b
......@@ -80,14 +80,14 @@ class V8ScrollStateCallback;
class WebPluginContainerImpl;
struct PhysicalRect;
const int kDOMNodeTypeShift = 1;
const int kDOMNodeTypeShift = 2;
const int kElementNamespaceTypeShift = 4;
const int kNodeStyleChangeShift = 17;
const int kNodeCustomElementShift = 19;
// Values for kChildNeedsStyleRecalcFlag, controlling whether a node gets its
// style recalculated.
enum StyleChangeType {
enum StyleChangeType : uint32_t {
// This node does not need style recalculation.
kNoStyleChange = 0,
// This node needs style recalculation.
......@@ -96,7 +96,7 @@ enum StyleChangeType {
kSubtreeStyleChange = 2 << kNodeStyleChangeShift,
};
enum class CustomElementState {
enum class CustomElementState : uint32_t {
// https://dom.spec.whatwg.org/#concept-element-custom-element-state
kUncustomized = 0,
kCustom = 1 << kNodeCustomElementShift,
......@@ -272,11 +272,7 @@ class CORE_EXPORT Node : public EventTarget {
// Other methods (not part of DOM)
bool IsTextNode() const { return GetDOMNodeType() == DOMNodeType::kText; }
bool IsContainerNode() const {
auto type = GetDOMNodeType();
return type == DOMNodeType::kContainer || type == DOMNodeType::kElement ||
type == DOMNodeType::kDocumentFragment;
}
bool IsContainerNode() const { return GetFlag(kIsContainerFlag); }
bool IsElementNode() const {
return GetDOMNodeType() == DOMNodeType::kElement;
}
......@@ -919,11 +915,12 @@ class CORE_EXPORT Node : public EventTarget {
void Trace(Visitor*) override;
private:
enum NodeFlags {
enum NodeFlags : uint32_t {
kHasRareDataFlag = 1,
// Node type flags. These never change once created.
kDOMNodeTypeMask = 0x7 << kDOMNodeTypeShift,
kIsContainerFlag = 1 << 1,
kDOMNodeTypeMask = 0x3 << kDOMNodeTypeShift,
kElementNamespaceTypeMask = 0x3 << kElementNamespaceTypeShift,
kIsV0InsertionPointFlag = 1 << 6,
......@@ -977,18 +974,17 @@ class CORE_EXPORT Node : public EventTarget {
void SetFlag(NodeFlags mask) { node_flags_ |= mask; }
void ClearFlag(NodeFlags mask) { node_flags_ &= ~mask; }
enum class DOMNodeType {
enum class DOMNodeType : uint32_t {
kOther = 0,
kText = 1 << kDOMNodeTypeShift,
kContainer = 2 << kDOMNodeTypeShift,
kElement = 3 << kDOMNodeTypeShift,
kDocumentFragment = 4 << kDOMNodeTypeShift,
kElement = 2 << kDOMNodeTypeShift,
kDocumentFragment = 3 << kDOMNodeTypeShift,
};
DOMNodeType GetDOMNodeType() const {
return static_cast<DOMNodeType>(node_flags_ & kDOMNodeTypeMask);
}
enum class ElementNamespaceType {
enum class ElementNamespaceType : uint32_t {
kOther = 0,
kHTML = 1 << kElementNamespaceTypeShift,
kMathML = 2 << kElementNamespaceTypeShift,
......@@ -1005,12 +1001,11 @@ class CORE_EXPORT Node : public EventTarget {
kDefaultNodeFlags | static_cast<NodeFlags>(DOMNodeType::kOther),
kCreateText =
kDefaultNodeFlags | static_cast<NodeFlags>(DOMNodeType::kText),
kCreateContainer =
kDefaultNodeFlags | static_cast<NodeFlags>(DOMNodeType::kContainer),
kCreateContainer = kDefaultNodeFlags | kIsContainerFlag,
kCreateElement =
kDefaultNodeFlags | static_cast<NodeFlags>(DOMNodeType::kElement),
kCreateContainer | static_cast<NodeFlags>(DOMNodeType::kElement),
kCreateDocumentFragment =
kDefaultNodeFlags |
kCreateContainer |
static_cast<NodeFlags>(DOMNodeType::kDocumentFragment),
kCreateShadowRoot = kCreateDocumentFragment | kIsInShadowTreeFlag,
kCreateHTMLElement =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment