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

Inline more hot paths and optimize IsElementNode() within node.h

See the linked bugs, which make clear that the functions
touched in [1] and [2] are very hot code paths, at least for
the blink microbenchmarks. This CL marks those functions
ALWAYS_INLINE and optimizes access to IsElementNode() which
is the most-likely used of the DOMNodeType accessors.

[1] https://chromium-review.googlesource.com/c/chromium/src/+/1962631
[2] https://chromium-review.googlesource.com/c/chromium/src/+/1965945

Bug: 1036543, 1036088, 1036536, 1036089
Change-Id: If07e3dfc051ed5abd152ac758d27113b63080fee
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2042374
Auto-Submit: Mason Freed <masonfreed@chromium.org>
Commit-Queue: Kent Tamura <tkent@chromium.org>
Reviewed-by: default avatarKent Tamura <tkent@chromium.org>
Cr-Commit-Position: refs/heads/master@{#739177}
parent 4295349b
......@@ -269,12 +269,16 @@ class CORE_EXPORT Node : public EventTarget {
void SetComputedStyle(scoped_refptr<const ComputedStyle> computed_style);
// Other methods (not part of DOM)
bool IsTextNode() const { return GetDOMNodeType() == DOMNodeType::kText; }
bool IsContainerNode() const { return GetFlag(kIsContainerFlag); }
bool IsElementNode() const {
ALWAYS_INLINE bool IsTextNode() const {
return GetDOMNodeType() == DOMNodeType::kText;
}
ALWAYS_INLINE bool IsContainerNode() const {
return GetFlag(kIsContainerFlag);
}
ALWAYS_INLINE bool IsElementNode() const {
return GetDOMNodeType() == DOMNodeType::kElement;
}
bool IsDocumentFragment() const {
ALWAYS_INLINE bool IsDocumentFragment() const {
return GetDOMNodeType() == DOMNodeType::kDocumentFragment;
}
......@@ -971,7 +975,9 @@ class CORE_EXPORT Node : public EventTarget {
// 4 bits remaining.
};
bool GetFlag(NodeFlags mask) const { return node_flags_ & mask; }
ALWAYS_INLINE bool GetFlag(NodeFlags mask) const {
return node_flags_ & mask;
}
void SetFlag(bool f, NodeFlags mask) {
node_flags_ = (node_flags_ & ~mask) | (-(int32_t)f & mask);
}
......@@ -979,12 +985,12 @@ class CORE_EXPORT Node : public EventTarget {
void ClearFlag(NodeFlags mask) { node_flags_ &= ~mask; }
enum class DOMNodeType : uint32_t {
kOther = 0,
kElement = 0,
kText = 1 << kDOMNodeTypeShift,
kElement = 2 << kDOMNodeTypeShift,
kDocumentFragment = 3 << kDOMNodeTypeShift,
kDocumentFragment = 2 << kDOMNodeTypeShift,
kOther = 3 << kDOMNodeTypeShift,
};
DOMNodeType GetDOMNodeType() const {
ALWAYS_INLINE DOMNodeType GetDOMNodeType() const {
return static_cast<DOMNodeType>(node_flags_ & kDOMNodeTypeMask);
}
......@@ -1008,12 +1014,15 @@ class CORE_EXPORT Node : public EventTarget {
static_cast<NodeFlags>(DOMNodeType::kText) |
static_cast<NodeFlags>(ElementNamespaceType::kOther),
kCreateContainer = kDefaultNodeFlags | kIsContainerFlag |
static_cast<NodeFlags>(DOMNodeType::kOther) |
static_cast<NodeFlags>(ElementNamespaceType::kOther),
kCreateElement =
kCreateContainer | static_cast<NodeFlags>(DOMNodeType::kElement),
kCreateElement = kDefaultNodeFlags | kIsContainerFlag |
static_cast<NodeFlags>(DOMNodeType::kElement) |
static_cast<NodeFlags>(ElementNamespaceType::kOther),
kCreateDocumentFragment =
kCreateContainer |
static_cast<NodeFlags>(DOMNodeType::kDocumentFragment),
kDefaultNodeFlags | kIsContainerFlag |
static_cast<NodeFlags>(DOMNodeType::kDocumentFragment) |
static_cast<NodeFlags>(ElementNamespaceType::kOther),
kCreateShadowRoot = kCreateDocumentFragment | kIsInShadowTreeFlag,
kCreateHTMLElement = kDefaultNodeFlags | kIsContainerFlag |
static_cast<NodeFlags>(DOMNodeType::kElement) |
......
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