diff --git a/Libraries/LibJS/Runtime/Realm.h b/Libraries/LibJS/Runtime/Realm.h index 5e318c42bd2..f9c369abfec 100644 --- a/Libraries/LibJS/Runtime/Realm.h +++ b/Libraries/LibJS/Runtime/Realm.h @@ -30,6 +30,12 @@ public: virtual ~HostDefined() = default; virtual void visit_edges(Cell::Visitor&) { } + + template + bool fast_is() const = delete; + + virtual bool is_principal_host_defined() const { return false; } + virtual bool is_synthetic_host_defined() const { return false; } }; template diff --git a/Libraries/LibWeb/Bindings/Intrinsics.cpp b/Libraries/LibWeb/Bindings/Intrinsics.cpp index 51595543122..d327dbeada4 100644 --- a/Libraries/LibWeb/Bindings/Intrinsics.cpp +++ b/Libraries/LibWeb/Bindings/Intrinsics.cpp @@ -31,8 +31,8 @@ bool Intrinsics::is_exposed(StringView name) const Intrinsics& host_defined_intrinsics(JS::Realm& realm) { - VERIFY(realm.host_defined()); - return as(*realm.host_defined()).intrinsics; + ASSERT(realm.host_defined()); + return static_cast(*realm.host_defined()).intrinsics; } } diff --git a/Libraries/LibWeb/Bindings/PrincipalHostDefined.h b/Libraries/LibWeb/Bindings/PrincipalHostDefined.h index 7819d3c3380..87130056309 100644 --- a/Libraries/LibWeb/Bindings/PrincipalHostDefined.h +++ b/Libraries/LibWeb/Bindings/PrincipalHostDefined.h @@ -14,7 +14,7 @@ namespace Web::Bindings { -struct PrincipalHostDefined : public HostDefined { +struct PrincipalHostDefined final : public HostDefined { PrincipalHostDefined(GC::Ref eso, GC::Ref intrinsics, GC::Ref page) : HostDefined(intrinsics) , environment_settings_object(eso) @@ -23,6 +23,7 @@ struct PrincipalHostDefined : public HostDefined { } virtual ~PrincipalHostDefined() override = default; virtual void visit_edges(JS::Cell::Visitor& visitor) override; + virtual bool is_principal_host_defined() const override { return true; } GC::Ref environment_settings_object; GC::Ref page; @@ -44,3 +45,6 @@ struct PrincipalHostDefined : public HostDefined { } } + +template<> +inline bool JS::Realm::HostDefined::fast_is() const { return is_principal_host_defined(); } diff --git a/Libraries/LibWeb/Bindings/SyntheticHostDefined.h b/Libraries/LibWeb/Bindings/SyntheticHostDefined.h index ba2efb074ee..f8781a3559d 100644 --- a/Libraries/LibWeb/Bindings/SyntheticHostDefined.h +++ b/Libraries/LibWeb/Bindings/SyntheticHostDefined.h @@ -13,7 +13,7 @@ namespace Web::Bindings { -struct SyntheticHostDefined : public HostDefined { +struct SyntheticHostDefined final : public HostDefined { SyntheticHostDefined(HTML::SyntheticRealmSettings synthetic_realm_settings, GC::Ref intrinsics) : HostDefined(intrinsics) , synthetic_realm_settings(move(synthetic_realm_settings)) @@ -22,8 +22,12 @@ struct SyntheticHostDefined : public HostDefined { virtual ~SyntheticHostDefined() override = default; virtual void visit_edges(JS::Cell::Visitor& visitor) override; + virtual bool is_synthetic_host_defined() const override { return true; } HTML::SyntheticRealmSettings synthetic_realm_settings; }; } + +template<> +inline bool JS::Realm::HostDefined::fast_is() const { return is_synthetic_host_defined(); }