1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 19:27:45 +00:00

LibJS: Mark classes and virtual functions final where possible

These cases were found with GCC's `-Wsuggest-final-{types,methods}`
warnings, which catch calls that could have been devirtualized had we
declared the functions `final` in the source.

To reproduce, Link Time Optimization needs to be enabled. The easiest
way to achieve this is to set the `CMAKE_INTERPROCEDURAL_OPTIMIZATION`
cache variable to `ON`. The `.incbin` directive in LibCompress' Brotli
decompressor might needs to be changed to an absolute path for this to
work.

This commit also removes a pair of unused virtual functions.
This commit is contained in:
Daniel Bertalan 2023-08-13 12:53:46 +02:00 committed by Andreas Kling
parent 72c9f56c66
commit 65232b6681
9 changed files with 17 additions and 20 deletions

View file

@ -156,7 +156,7 @@ public:
}; };
// 14.13 Labelled Statements, https://tc39.es/ecma262/#sec-labelled-statements // 14.13 Labelled Statements, https://tc39.es/ecma262/#sec-labelled-statements
class LabelledStatement : public Statement { class LabelledStatement final : public Statement {
public: public:
LabelledStatement(SourceRange source_range, DeprecatedFlyString label, NonnullRefPtr<Statement const> labelled_item) LabelledStatement(SourceRange source_range, DeprecatedFlyString label, NonnullRefPtr<Statement const> labelled_item)
: Statement(move(source_range)) : Statement(move(source_range))

View file

@ -27,8 +27,8 @@ class CyclicModule : public Module {
public: public:
// Note: Do not call these methods directly unless you are HostResolveImportedModule. // Note: Do not call these methods directly unless you are HostResolveImportedModule.
// Badges cannot be used because other hosts must be able to call this (and it is called recursively) // Badges cannot be used because other hosts must be able to call this (and it is called recursively)
virtual ThrowCompletionOr<void> link(VM& vm) override; virtual ThrowCompletionOr<void> link(VM& vm) override final;
virtual ThrowCompletionOr<Promise*> evaluate(VM& vm) override; virtual ThrowCompletionOr<Promise*> evaluate(VM& vm) override final;
Vector<ModuleRequest> const& requested_modules() const { return m_requested_modules; } Vector<ModuleRequest> const& requested_modules() const { return m_requested_modules; }
@ -37,8 +37,8 @@ protected:
virtual void visit_edges(Cell::Visitor&) override; virtual void visit_edges(Cell::Visitor&) override;
virtual ThrowCompletionOr<u32> inner_module_linking(VM& vm, Vector<Module*>& stack, u32 index) override; virtual ThrowCompletionOr<u32> inner_module_linking(VM& vm, Vector<Module*>& stack, u32 index) override final;
virtual ThrowCompletionOr<u32> inner_module_evaluation(VM& vm, Vector<Module*>& stack, u32 index) override; virtual ThrowCompletionOr<u32> inner_module_evaluation(VM& vm, Vector<Module*>& stack, u32 index) override final;
virtual ThrowCompletionOr<void> initialize_environment(VM& vm); virtual ThrowCompletionOr<void> initialize_environment(VM& vm);
virtual ThrowCompletionOr<void> execute_module(VM& vm, GCPtr<PromiseCapability> capability = {}); virtual ThrowCompletionOr<void> execute_module(VM& vm, GCPtr<PromiseCapability> capability = {});

View file

@ -87,7 +87,6 @@ public:
virtual ~Visitor() = default; virtual ~Visitor() = default;
}; };
virtual bool is_environment() const { return false; }
virtual void visit_edges(Visitor&) { } virtual void visit_edges(Visitor&) { }
// This will be called on unmarked objects by the garbage collector in a separate pass before destruction. // This will be called on unmarked objects by the garbage collector in a separate pass before destruction.

View file

@ -33,7 +33,7 @@ public:
}; };
template<typename T, size_t inline_capacity> template<typename T, size_t inline_capacity>
class MarkedVector class MarkedVector final
: public MarkedVectorBase : public MarkedVectorBase
, public Vector<T, inline_capacity> { , public Vector<T, inline_capacity> {

View file

@ -40,10 +40,10 @@ public:
virtual ~Array() override = default; virtual ~Array() override = default;
virtual ThrowCompletionOr<Optional<PropertyDescriptor>> internal_get_own_property(PropertyKey const&) const override; virtual ThrowCompletionOr<Optional<PropertyDescriptor>> internal_get_own_property(PropertyKey const&) const override final;
virtual ThrowCompletionOr<bool> internal_define_own_property(PropertyKey const&, PropertyDescriptor const&) override; virtual ThrowCompletionOr<bool> internal_define_own_property(PropertyKey const&, PropertyDescriptor const&) override final;
virtual ThrowCompletionOr<bool> internal_delete(PropertyKey const&) override; virtual ThrowCompletionOr<bool> internal_delete(PropertyKey const&) override final;
virtual ThrowCompletionOr<MarkedVector<Value>> internal_own_property_keys() const override; virtual ThrowCompletionOr<MarkedVector<Value>> internal_own_property_keys() const override final;
[[nodiscard]] bool length_is_writable() const { return m_length_writable; } [[nodiscard]] bool length_is_writable() const { return m_length_writable; }

View file

@ -32,11 +32,11 @@ public:
virtual ~DeclarativeEnvironment() override = default; virtual ~DeclarativeEnvironment() override = default;
virtual ThrowCompletionOr<bool> has_binding(DeprecatedFlyString const& name, Optional<size_t>* = nullptr) const override; virtual ThrowCompletionOr<bool> has_binding(DeprecatedFlyString const& name, Optional<size_t>* = nullptr) const override final;
virtual ThrowCompletionOr<void> create_mutable_binding(VM&, DeprecatedFlyString const& name, bool can_be_deleted) override; virtual ThrowCompletionOr<void> create_mutable_binding(VM&, DeprecatedFlyString const& name, bool can_be_deleted) override final;
virtual ThrowCompletionOr<void> create_immutable_binding(VM&, DeprecatedFlyString const& name, bool strict) override; virtual ThrowCompletionOr<void> create_immutable_binding(VM&, DeprecatedFlyString const& name, bool strict) override final;
virtual ThrowCompletionOr<void> initialize_binding(VM&, DeprecatedFlyString const& name, Value, InitializeBindingHint) override; virtual ThrowCompletionOr<void> initialize_binding(VM&, DeprecatedFlyString const& name, Value, InitializeBindingHint) override final;
virtual ThrowCompletionOr<void> set_mutable_binding(VM&, DeprecatedFlyString const& name, Value, bool strict) override; virtual ThrowCompletionOr<void> set_mutable_binding(VM&, DeprecatedFlyString const& name, Value, bool strict) override final;
virtual ThrowCompletionOr<Value> get_binding_value(VM&, DeprecatedFlyString const& name, bool strict) override; virtual ThrowCompletionOr<Value> get_binding_value(VM&, DeprecatedFlyString const& name, bool strict) override;
virtual ThrowCompletionOr<bool> delete_binding(VM&, DeprecatedFlyString const& name) override; virtual ThrowCompletionOr<bool> delete_binding(VM&, DeprecatedFlyString const& name) override;

View file

@ -63,8 +63,6 @@ protected:
virtual void visit_edges(Visitor&) override; virtual void visit_edges(Visitor&) override;
private: private:
virtual bool is_environment() const final { return true; }
bool m_permanently_screwed_by_eval { false }; bool m_permanently_screwed_by_eval { false };
GCPtr<Environment> m_outer_environment; GCPtr<Environment> m_outer_environment;

View file

@ -164,7 +164,7 @@ public:
void define_direct_accessor(PropertyKey const&, FunctionObject* getter, FunctionObject* setter, PropertyAttributes attributes); void define_direct_accessor(PropertyKey const&, FunctionObject* getter, FunctionObject* setter, PropertyAttributes attributes);
using IntrinsicAccessor = Value (*)(Realm&); using IntrinsicAccessor = Value (*)(Realm&);
virtual void define_intrinsic_accessor(PropertyKey const&, PropertyAttributes attributes, IntrinsicAccessor accessor); void define_intrinsic_accessor(PropertyKey const&, PropertyAttributes attributes, IntrinsicAccessor accessor);
void define_native_function(Realm&, PropertyKey const&, SafeFunction<ThrowCompletionOr<Value>(VM&)>, i32 length, PropertyAttributes attributes); void define_native_function(Realm&, PropertyKey const&, SafeFunction<ThrowCompletionOr<Value>(VM&)>, i32 length, PropertyAttributes attributes);
void define_native_accessor(Realm&, PropertyKey const&, SafeFunction<ThrowCompletionOr<Value>(VM&)> getter, SafeFunction<ThrowCompletionOr<Value>(VM&)> setter, PropertyAttributes attributes); void define_native_accessor(Realm&, PropertyKey const&, SafeFunction<ThrowCompletionOr<Value>(VM&)> getter, SafeFunction<ThrowCompletionOr<Value>(VM&)> setter, PropertyAttributes attributes);

View file

@ -10,7 +10,7 @@
namespace JS { namespace JS {
class ObjectEnvironment : public Environment { class ObjectEnvironment final : public Environment {
JS_ENVIRONMENT(ObjectEnvironment, Environment); JS_ENVIRONMENT(ObjectEnvironment, Environment);
public: public: