Просмотр исходного кода

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%.
Andreas Kling 3 лет назад
Родитель
Сommit
269f9c6863

+ 3 - 0
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<CSSRuleWrapper*>(rule.wrapper());
+
     if (is<CSS::CSSStyleRule>(rule))
         return static_cast<CSSRuleWrapper*>(wrap_impl(global_object, verify_cast<CSS::CSSStyleRule>(rule)));
     return static_cast<CSSRuleWrapper*>(wrap_impl(global_object, rule));

+ 3 - 0
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<EventWrapper*>(event.wrapper());
+
     if (is<DOM::CustomEvent>(event))
         return static_cast<CustomEventWrapper*>(wrap_impl(global_object, static_cast<DOM::CustomEvent&>(event)));
     if (is<CSS::MediaQueryListEvent>(event))

+ 3 - 0
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<NodeWrapper*>(node.wrapper());
+
     if (is<DOM::Document>(node))
         return static_cast<NodeWrapper*>(wrap_impl(global_object, verify_cast<DOM::Document>(node)));
     if (is<DOM::DocumentType>(node))