From 269f9c68638d9ccd3c5dc41575ba093290c989ac Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 27 Mar 2022 03:19:32 +0200 Subject: [PATCH] LibWeb: Add fast-paths for wrapping already-wrapped C++ objects If a C++ object already has a JS wrapper, we don't need to go through the expensive type checks to figure out which kind of wrapper to create. Instead, just return the wrapper we already have! This gives a noticeable increase in smoothness on Acid3, where ~10% of CPU time was previously spent doing RTTI type checks in wrap(). With these changes, it's down to ~1%. --- Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.cpp | 3 +++ Userland/Libraries/LibWeb/Bindings/EventWrapperFactory.cpp | 3 +++ Userland/Libraries/LibWeb/Bindings/NodeWrapperFactory.cpp | 3 +++ 3 files changed, 9 insertions(+) diff --git a/Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.cpp b/Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.cpp index 54cdc9643e..e20db17db7 100644 --- a/Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.cpp +++ b/Userland/Libraries/LibWeb/Bindings/CSSRuleWrapperFactory.cpp @@ -14,6 +14,9 @@ namespace Web::Bindings { CSSRuleWrapper* wrap(JS::GlobalObject& global_object, CSS::CSSRule& rule) { + if (rule.wrapper()) + return static_cast(rule.wrapper()); + if (is(rule)) return static_cast(wrap_impl(global_object, verify_cast(rule))); return static_cast(wrap_impl(global_object, rule)); diff --git a/Userland/Libraries/LibWeb/Bindings/EventWrapperFactory.cpp b/Userland/Libraries/LibWeb/Bindings/EventWrapperFactory.cpp index a048827b68..e5d974cef4 100644 --- a/Userland/Libraries/LibWeb/Bindings/EventWrapperFactory.cpp +++ b/Userland/Libraries/LibWeb/Bindings/EventWrapperFactory.cpp @@ -22,6 +22,9 @@ namespace Web::Bindings { EventWrapper* wrap(JS::GlobalObject& global_object, DOM::Event& event) { + if (event.wrapper()) + return static_cast(event.wrapper()); + if (is(event)) return static_cast(wrap_impl(global_object, static_cast(event))); if (is(event)) diff --git a/Userland/Libraries/LibWeb/Bindings/NodeWrapperFactory.cpp b/Userland/Libraries/LibWeb/Bindings/NodeWrapperFactory.cpp index db09082939..2040879901 100644 --- a/Userland/Libraries/LibWeb/Bindings/NodeWrapperFactory.cpp +++ b/Userland/Libraries/LibWeb/Bindings/NodeWrapperFactory.cpp @@ -176,6 +176,9 @@ namespace Web::Bindings { NodeWrapper* wrap(JS::GlobalObject& global_object, DOM::Node& node) { + if (node.wrapper()) + return static_cast(node.wrapper()); + if (is(node)) return static_cast(wrap_impl(global_object, verify_cast(node))); if (is(node))