LibWeb: Make CSSRule::type() non-virtual

All its overrides return constants, and without virtual dispatch the
`qualified_layer_name` and `absolutized_selectors` functions can benefit
from slightly better optimizations.

`CSSRule`s aren't allocated that often, so the memory impact is minimal.
This commit is contained in:
Jonne Ransijn 2024-10-28 20:16:28 +01:00 committed by Andreas Kling
commit 5c1bbd3eff
Notes: github-actions[bot] 2024-10-28 21:56:20 +00:00
30 changed files with 23 additions and 42 deletions

View file

@ -11,8 +11,8 @@
namespace Web::CSS { namespace Web::CSS {
CSSConditionRule::CSSConditionRule(JS::Realm& realm, CSSRuleList& rules) CSSConditionRule::CSSConditionRule(JS::Realm& realm, CSSRuleList& rules, Type type)
: CSSGroupingRule(realm, rules) : CSSGroupingRule(realm, rules, type)
{ {
} }

View file

@ -24,7 +24,7 @@ public:
virtual void for_each_effective_rule(TraversalOrder, Function<void(CSSRule const&)> const& callback) const override; virtual void for_each_effective_rule(TraversalOrder, Function<void(CSSRule const&)> const& callback) const override;
protected: protected:
CSSConditionRule(JS::Realm&, CSSRuleList&); CSSConditionRule(JS::Realm&, CSSRuleList&, Type);
virtual void initialize(JS::Realm&) override; virtual void initialize(JS::Realm&) override;
}; };

View file

@ -23,7 +23,7 @@ JS::NonnullGCPtr<CSSFontFaceRule> CSSFontFaceRule::create(JS::Realm& realm, Pars
} }
CSSFontFaceRule::CSSFontFaceRule(JS::Realm& realm, ParsedFontFace&& font_face) CSSFontFaceRule::CSSFontFaceRule(JS::Realm& realm, ParsedFontFace&& font_face)
: CSSRule(realm) : CSSRule(realm, Type::FontFace)
, m_font_face(move(font_face)) , m_font_face(move(font_face))
{ {
} }

View file

@ -21,8 +21,6 @@ public:
virtual ~CSSFontFaceRule() override = default; virtual ~CSSFontFaceRule() override = default;
virtual Type type() const override { return Type::FontFace; }
ParsedFontFace const& font_face() const { return m_font_face; } ParsedFontFace const& font_face() const { return m_font_face; }
CSSStyleDeclaration* style(); CSSStyleDeclaration* style();

View file

@ -14,8 +14,8 @@
namespace Web::CSS { namespace Web::CSS {
CSSGroupingRule::CSSGroupingRule(JS::Realm& realm, CSSRuleList& rules) CSSGroupingRule::CSSGroupingRule(JS::Realm& realm, CSSRuleList& rules, Type type)
: CSSRule(realm) : CSSRule(realm, type)
, m_rules(rules) , m_rules(rules)
{ {
for (auto& rule : *m_rules) for (auto& rule : *m_rules)

View file

@ -31,7 +31,7 @@ public:
virtual void set_parent_style_sheet(CSSStyleSheet*) override; virtual void set_parent_style_sheet(CSSStyleSheet*) override;
protected: protected:
CSSGroupingRule(JS::Realm&, CSSRuleList&); CSSGroupingRule(JS::Realm&, CSSRuleList&, Type);
virtual void initialize(JS::Realm&) override; virtual void initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override; virtual void visit_edges(Cell::Visitor&) override;

View file

@ -29,7 +29,7 @@ JS::NonnullGCPtr<CSSImportRule> CSSImportRule::create(URL::URL url, DOM::Documen
} }
CSSImportRule::CSSImportRule(URL::URL url, DOM::Document& document) CSSImportRule::CSSImportRule(URL::URL url, DOM::Document& document)
: CSSRule(document.realm()) : CSSRule(document.realm(), Type::Import)
, m_url(move(url)) , m_url(move(url))
, m_document(document) , m_document(document)
{ {

View file

@ -36,8 +36,6 @@ public:
CSSStyleSheet* style_sheet_for_bindings() { return m_style_sheet; } CSSStyleSheet* style_sheet_for_bindings() { return m_style_sheet; }
void set_style_sheet(CSSStyleSheet* style_sheet) { m_style_sheet = style_sheet; } void set_style_sheet(CSSStyleSheet* style_sheet) { m_style_sheet = style_sheet; }
virtual Type type() const override { return Type::Import; }
private: private:
CSSImportRule(URL::URL, DOM::Document&); CSSImportRule(URL::URL, DOM::Document&);

View file

@ -19,7 +19,7 @@ JS::NonnullGCPtr<CSSKeyframeRule> CSSKeyframeRule::create(JS::Realm& realm, CSS:
} }
CSSKeyframeRule::CSSKeyframeRule(JS::Realm& realm, CSS::Percentage key, PropertyOwningCSSStyleDeclaration& declarations) CSSKeyframeRule::CSSKeyframeRule(JS::Realm& realm, CSS::Percentage key, PropertyOwningCSSStyleDeclaration& declarations)
: CSSRule(realm) : CSSRule(realm, Type::Keyframe)
, m_key(key) , m_key(key)
, m_declarations(declarations) , m_declarations(declarations)
{ {

View file

@ -25,8 +25,6 @@ public:
virtual ~CSSKeyframeRule() = default; virtual ~CSSKeyframeRule() = default;
virtual Type type() const override { return Type::Keyframe; }
CSS::Percentage key() const { return m_key; } CSS::Percentage key() const { return m_key; }
JS::NonnullGCPtr<CSSStyleDeclaration> style() const { return m_declarations; } JS::NonnullGCPtr<CSSStyleDeclaration> style() const { return m_declarations; }
JS::NonnullGCPtr<PropertyOwningCSSStyleDeclaration> style_as_property_owning_style_declaration() const { return m_declarations; } JS::NonnullGCPtr<PropertyOwningCSSStyleDeclaration> style_as_property_owning_style_declaration() const { return m_declarations; }

View file

@ -20,7 +20,7 @@ JS::NonnullGCPtr<CSSKeyframesRule> CSSKeyframesRule::create(JS::Realm& realm, Fl
} }
CSSKeyframesRule::CSSKeyframesRule(JS::Realm& realm, FlyString name, JS::NonnullGCPtr<CSSRuleList> keyframes) CSSKeyframesRule::CSSKeyframesRule(JS::Realm& realm, FlyString name, JS::NonnullGCPtr<CSSRuleList> keyframes)
: CSSRule(realm) : CSSRule(realm, Type::Keyframes)
, m_name(move(name)) , m_name(move(name))
, m_rules(move(keyframes)) , m_rules(move(keyframes))
{ {

View file

@ -28,8 +28,6 @@ public:
virtual ~CSSKeyframesRule() = default; virtual ~CSSKeyframesRule() = default;
virtual Type type() const override { return Type::Keyframes; }
auto const& css_rules() const { return m_rules; } auto const& css_rules() const { return m_rules; }
FlyString const& name() const { return m_name; } FlyString const& name() const { return m_name; }
[[nodiscard]] WebIDL::UnsignedLong length() const; [[nodiscard]] WebIDL::UnsignedLong length() const;

View file

@ -25,7 +25,7 @@ FlyString CSSLayerBlockRule::next_unique_anonymous_layer_name()
} }
CSSLayerBlockRule::CSSLayerBlockRule(JS::Realm& realm, FlyString name, CSSRuleList& rules) CSSLayerBlockRule::CSSLayerBlockRule(JS::Realm& realm, FlyString name, CSSRuleList& rules)
: CSSGroupingRule(realm, rules) : CSSGroupingRule(realm, rules, Type::LayerBlock)
, m_name(move(name)) , m_name(move(name))
{ {
if (m_name.is_empty()) { if (m_name.is_empty()) {

View file

@ -22,8 +22,6 @@ public:
virtual ~CSSLayerBlockRule() = default; virtual ~CSSLayerBlockRule() = default;
virtual Type type() const override { return Type::LayerBlock; }
FlyString const& name() const { return m_name; } FlyString const& name() const { return m_name; }
FlyString const& internal_name() const { return m_name_internal; } FlyString const& internal_name() const { return m_name_internal; }
FlyString internal_qualified_name(Badge<StyleComputer>) const; FlyString internal_qualified_name(Badge<StyleComputer>) const;

View file

@ -19,7 +19,7 @@ JS::NonnullGCPtr<CSSLayerStatementRule> CSSLayerStatementRule::create(JS::Realm&
} }
CSSLayerStatementRule::CSSLayerStatementRule(JS::Realm& realm, Vector<FlyString> name_list) CSSLayerStatementRule::CSSLayerStatementRule(JS::Realm& realm, Vector<FlyString> name_list)
: CSSRule(realm) : CSSRule(realm, Type::LayerStatement)
, m_name_list(move(name_list)) , m_name_list(move(name_list))
{ {
} }

View file

@ -20,8 +20,6 @@ public:
virtual ~CSSLayerStatementRule() = default; virtual ~CSSLayerStatementRule() = default;
virtual Type type() const override { return Type::LayerStatement; }
// FIXME: Should be FrozenArray // FIXME: Should be FrozenArray
ReadonlySpan<FlyString> name_list() const { return m_name_list; } ReadonlySpan<FlyString> name_list() const { return m_name_list; }
Vector<FlyString> internal_qualified_name_list(Badge<StyleComputer>) const; Vector<FlyString> internal_qualified_name_list(Badge<StyleComputer>) const;

View file

@ -20,7 +20,7 @@ JS::NonnullGCPtr<CSSMediaRule> CSSMediaRule::create(JS::Realm& realm, MediaList&
} }
CSSMediaRule::CSSMediaRule(JS::Realm& realm, MediaList& media, CSSRuleList& rules) CSSMediaRule::CSSMediaRule(JS::Realm& realm, MediaList& media, CSSRuleList& rules)
: CSSConditionRule(realm, rules) : CSSConditionRule(realm, rules, Type::Media)
, m_media(media) , m_media(media)
{ {
} }

View file

@ -23,8 +23,6 @@ public:
virtual ~CSSMediaRule() = default; virtual ~CSSMediaRule() = default;
virtual Type type() const override { return Type::Media; }
virtual String condition_text() const override; virtual String condition_text() const override;
virtual bool condition_matches() const override { return m_media->matches(); } virtual bool condition_matches() const override { return m_media->matches(); }

View file

@ -17,7 +17,7 @@ namespace Web::CSS {
JS_DEFINE_ALLOCATOR(CSSNamespaceRule); JS_DEFINE_ALLOCATOR(CSSNamespaceRule);
CSSNamespaceRule::CSSNamespaceRule(JS::Realm& realm, Optional<FlyString> prefix, FlyString namespace_uri) CSSNamespaceRule::CSSNamespaceRule(JS::Realm& realm, Optional<FlyString> prefix, FlyString namespace_uri)
: CSSRule(realm) : CSSRule(realm, Type::Namespace)
, m_namespace_uri(move(namespace_uri)) , m_namespace_uri(move(namespace_uri))
, m_prefix(prefix.value_or(""_fly_string)) , m_prefix(prefix.value_or(""_fly_string))
{ {

View file

@ -23,7 +23,6 @@ public:
FlyString const& namespace_uri() const { return m_namespace_uri; } FlyString const& namespace_uri() const { return m_namespace_uri; }
void set_prefix(FlyString value) { m_prefix = move(value); } void set_prefix(FlyString value) { m_prefix = move(value); }
FlyString const& prefix() const { return m_prefix; } FlyString const& prefix() const { return m_prefix; }
virtual Type type() const override { return Type::Namespace; }
private: private:
CSSNamespaceRule(JS::Realm&, Optional<FlyString> prefix, FlyString namespace_uri); CSSNamespaceRule(JS::Realm&, Optional<FlyString> prefix, FlyString namespace_uri);

View file

@ -18,7 +18,7 @@ JS::NonnullGCPtr<CSSNestedDeclarations> CSSNestedDeclarations::create(JS::Realm&
} }
CSSNestedDeclarations::CSSNestedDeclarations(JS::Realm& realm, PropertyOwningCSSStyleDeclaration& declaration) CSSNestedDeclarations::CSSNestedDeclarations(JS::Realm& realm, PropertyOwningCSSStyleDeclaration& declaration)
: CSSRule(realm) : CSSRule(realm, Type::NestedDeclarations)
, m_declaration(declaration) , m_declaration(declaration)
{ {
m_declaration->set_parent_rule(*this); m_declaration->set_parent_rule(*this);

View file

@ -19,7 +19,6 @@ public:
virtual ~CSSNestedDeclarations() override = default; virtual ~CSSNestedDeclarations() override = default;
virtual Type type() const override { return Type::NestedDeclarations; }
PropertyOwningCSSStyleDeclaration const& declaration() const { return m_declaration; } PropertyOwningCSSStyleDeclaration const& declaration() const { return m_declaration; }
CSSStyleDeclaration* style(); CSSStyleDeclaration* style();

View file

@ -19,7 +19,7 @@ JS::NonnullGCPtr<CSSPropertyRule> CSSPropertyRule::create(JS::Realm& realm, FlyS
} }
CSSPropertyRule::CSSPropertyRule(JS::Realm& realm, FlyString name, FlyString syntax, bool inherits, Optional<String> initial_value) CSSPropertyRule::CSSPropertyRule(JS::Realm& realm, FlyString name, FlyString syntax, bool inherits, Optional<String> initial_value)
: CSSRule(realm) : CSSRule(realm, Type::Property)
, m_name(move(name)) , m_name(move(name))
, m_syntax(move(syntax)) , m_syntax(move(syntax))
, m_inherits(inherits) , m_inherits(inherits)

View file

@ -25,7 +25,6 @@ public:
virtual ~CSSPropertyRule() = default; virtual ~CSSPropertyRule() = default;
virtual Type type() const override { return Type::Property; }
FlyString const& name() const { return m_name; } FlyString const& name() const { return m_name; }
FlyString const& syntax() const { return m_syntax; } FlyString const& syntax() const { return m_syntax; }
bool inherits() const { return m_inherits; } bool inherits() const { return m_inherits; }

View file

@ -13,8 +13,9 @@
namespace Web::CSS { namespace Web::CSS {
CSSRule::CSSRule(JS::Realm& realm) CSSRule::CSSRule(JS::Realm& realm, Type type)
: PlatformObject(realm) : PlatformObject(realm)
, m_type(type)
{ {
} }

View file

@ -38,7 +38,7 @@ public:
Property = 103, // FIXME: This should return `0` as a type, but type is used for a lot of dispatching Property = 103, // FIXME: This should return `0` as a type, but type is used for a lot of dispatching
}; };
virtual Type type() const = 0; Type type() const { return m_type; }
String css_text() const; String css_text() const;
void set_css_text(StringView); void set_css_text(StringView);
@ -57,7 +57,7 @@ public:
virtual String serialized() const = 0; virtual String serialized() const = 0;
protected: protected:
explicit CSSRule(JS::Realm&); explicit CSSRule(JS::Realm&, Type);
virtual void visit_edges(Cell::Visitor&) override; virtual void visit_edges(Cell::Visitor&) override;
@ -72,6 +72,7 @@ protected:
[[nodiscard]] FlyString const& parent_layer_internal_qualified_name_slow_case() const; [[nodiscard]] FlyString const& parent_layer_internal_qualified_name_slow_case() const;
Type m_type;
JS::GCPtr<CSSRule> m_parent_rule; JS::GCPtr<CSSRule> m_parent_rule;
JS::GCPtr<CSSStyleSheet> m_parent_style_sheet; JS::GCPtr<CSSStyleSheet> m_parent_style_sheet;

View file

@ -22,7 +22,7 @@ JS::NonnullGCPtr<CSSStyleRule> CSSStyleRule::create(JS::Realm& realm, SelectorLi
} }
CSSStyleRule::CSSStyleRule(JS::Realm& realm, SelectorList&& selectors, PropertyOwningCSSStyleDeclaration& declaration, CSSRuleList& nested_rules) CSSStyleRule::CSSStyleRule(JS::Realm& realm, SelectorList&& selectors, PropertyOwningCSSStyleDeclaration& declaration, CSSRuleList& nested_rules)
: CSSGroupingRule(realm, nested_rules) : CSSGroupingRule(realm, nested_rules, Type::Style)
, m_selectors(move(selectors)) , m_selectors(move(selectors))
, m_declaration(declaration) , m_declaration(declaration)
{ {

View file

@ -27,8 +27,6 @@ public:
SelectorList const& absolutized_selectors() const; SelectorList const& absolutized_selectors() const;
PropertyOwningCSSStyleDeclaration const& declaration() const { return m_declaration; } PropertyOwningCSSStyleDeclaration const& declaration() const { return m_declaration; }
virtual Type type() const override { return Type::Style; }
String selector_text() const; String selector_text() const;
void set_selector_text(StringView); void set_selector_text(StringView);

View file

@ -19,7 +19,7 @@ JS::NonnullGCPtr<CSSSupportsRule> CSSSupportsRule::create(JS::Realm& realm, Nonn
} }
CSSSupportsRule::CSSSupportsRule(JS::Realm& realm, NonnullRefPtr<Supports>&& supports, CSSRuleList& rules) CSSSupportsRule::CSSSupportsRule(JS::Realm& realm, NonnullRefPtr<Supports>&& supports, CSSRuleList& rules)
: CSSConditionRule(realm, rules) : CSSConditionRule(realm, rules, Type::Supports)
, m_supports(move(supports)) , m_supports(move(supports))
{ {
} }

View file

@ -24,8 +24,6 @@ public:
virtual ~CSSSupportsRule() = default; virtual ~CSSSupportsRule() = default;
virtual Type type() const override { return Type::Supports; }
String condition_text() const override; String condition_text() const override;
virtual bool condition_matches() const override { return m_supports->matches(); } virtual bool condition_matches() const override { return m_supports->matches(); }