checkAcceptChild() needs fewer virtual calls
authormorrita@google.com <morrita@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 29 Nov 2012 00:51:45 +0000 (00:51 +0000)
committermorrita@google.com <morrita@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 29 Nov 2012 00:51:45 +0000 (00:51 +0000)
commitd2df1754895ba657428e2d8c7a8b93fa18e6f3fb
tree6df312b14c3aedc050fb439ee35f565d8837c394
parent80b3052d21ebd636957bf67e32a7f03885771485
checkAcceptChild() needs fewer virtual calls
https://bugs.webkit.org/show_bug.cgi?id=103372

Reviewed by Ojan Vafai.

This change reorganizes checkAcceptChild family for speed.

- Made Node::checkAddChild and Node::checkReplaceChild() static inline functions
  in ContainerNode.cpp. checkAcceptChild() was also moved to the same file. This allows us
  more aggressive inlining.

- Added a fast path in checkAcceptChild(), where we can assume that the parent is element
  and the new child is element or text. Under this assumption, we need no extra type checks
  and just needs a cycle prevention through Node::contains(). This is faster than current generic version.

- Moved extra checks from checkAddChild() and checkReplaceChild() to
  checkAcceptChild(). This allows the fast path skips even these extra checks.

- Node::canReplaceChild() is devirtualized. Since the only override is on
  Document, we can check isDocumentNode() to call it directly.

- The default implemenation of Node::canReplaceChild() just calls isChildTypeAllowed().
  That is what an extra check for checkAddChild() did. So we can share these code path in checkAcceptChild().

This gains 2-3% win on Dromaeo dom-modify.html.

No new tests, covered by existing tests.

* dom/ContainerNode.cpp:
(WebCore::isChildTypeAllowed): Moved from Node.cpp
(WebCore::checkAcceptChild): Moved from Node.cpp, Added a fast path.
(WebCore::checkAddChild): Moved from Node.cpp
(WebCore::checkReplaceChild): Moved from Node.cpp
(WebCore::ContainerNode::insertBefore): Followed the signature change.
(WebCore::ContainerNode::replaceChild): Followed the signature change, moved null check from checkReplaceChild to here.
(WebCore::ContainerNode::appendChild): Followed the signature change.
* dom/Document.h:
(Document):
* dom/Node.cpp:
* dom/Node.h:
(WebCore::Node::isDocumentTypeNode): Added for better readability of call sites.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@136076 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/WebCore/ChangeLog
Source/WebCore/dom/ContainerNode.cpp
Source/WebCore/dom/Document.h
Source/WebCore/dom/Node.cpp
Source/WebCore/dom/Node.h