summaryrefslogtreecommitdiff
path: root/Meta
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2022-08-22 18:31:08 +0100
committerLinus Groh <mail@linusgroh.de>2022-08-23 13:58:30 +0100
commit40a70461a0f6b0224c51fe7fb1be28edd26bb4b3 (patch)
tree5d54bb00d2d82dac774137057bcec21cc9d5d56d /Meta
parent56b2ae5ac0a383c96163c4b7b07bddd79da23c7a (diff)
downloadserenity-40a70461a0f6b0224c51fe7fb1be28edd26bb4b3.zip
LibWeb: Replace GlobalObject with Realm in wrapper functions
Similar to create() in LibJS, wrap() et al. are on a low enough level to warrant passing a Realm directly instead of relying on the current realm from the VM, as a wrapper may need to be allocated while no JS is being executed.
Diffstat (limited to 'Meta')
-rw-r--r--Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp34
1 files changed, 20 insertions, 14 deletions
diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp
index f31d49df28..6ffebcf539 100644
--- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp
+++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp
@@ -913,7 +913,7 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
// The lambda must take the JS::Value to convert as a parameter instead of capturing it in order to support union types being variadic.
StringBuilder to_variant_captures;
- to_variant_captures.append("&global_object, &vm"sv);
+ to_variant_captures.append("&global_object, &vm, &realm"sv);
if (dictionary_type)
to_variant_captures.append(String::formatted(", &{}{}_to_dictionary", js_name, js_suffix));
@@ -925,6 +925,7 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
// These might be unused.
(void)global_object;
(void)vm;
+ (void)realm;
)~~~");
// 1. If the union type includes undefined and V is undefined, then return the unique undefined value.
@@ -1507,10 +1508,11 @@ static void generate_wrap_statement(SourceGenerator& generator, String const& va
auto cpp_type = IDL::idl_type_name_to_cpp_type(current_union_type, interface);
union_generator.set("current_type", cpp_type.name);
union_generator.append(R"~~~(
- [&vm, &global_object](@current_type@ const& visited_union_value@recursion_depth@) -> JS::Value {
+ [&vm, &global_object, &realm](@current_type@ const& visited_union_value@recursion_depth@) -> JS::Value {
// These may be unused.
(void)vm;
(void)global_object;
+ (void) realm;
)~~~");
// NOTE: While we are using const&, the underlying type for wrappable types in unions is (Nonnull)RefPtr, which are not references.
@@ -1609,11 +1611,11 @@ static void generate_wrap_statement(SourceGenerator& generator, String const& va
} else {
if (wrapping_reference == WrappingReference::No) {
scoped_generator.append(R"~~~(
- @result_expression@ wrap(global_object, const_cast<@type@&>(*@value@));
+ @result_expression@ wrap(realm, const_cast<@type@&>(*@value@));
)~~~");
} else {
scoped_generator.append(R"~~~(
- @result_expression@ wrap(global_object, const_cast<@type@&>(@value@));
+ @result_expression@ wrap(realm, const_cast<@type@&>(@value@));
)~~~");
}
}
@@ -1948,7 +1950,7 @@ inline String idl_enum_to_string(@enum.type.name@ value) {
if (should_emit_wrapper_factory(interface)) {
generator.append(R"~~~(
-@wrapper_class@* wrap(JS::GlobalObject&, @fully_qualified_name@&);
+@wrapper_class@* wrap(JS::Realm&, @fully_qualified_name@&);
)~~~");
}
@@ -2045,9 +2047,9 @@ void @wrapper_class@::initialize(JS::Realm& realm)
if (should_emit_wrapper_factory(interface)) {
generator.append(R"~~~(
-@wrapper_class@* wrap(JS::GlobalObject& global_object, @fully_qualified_name@& impl)
+@wrapper_class@* wrap(JS::Realm& realm, @fully_qualified_name@& impl)
{
- return static_cast<@wrapper_class@*>(wrap_impl(global_object, impl));
+ return static_cast<@wrapper_class@*>(wrap_impl(realm, impl));
}
)~~~");
}
@@ -2072,6 +2074,7 @@ void @wrapper_class@::visit_edges(JS::Cell::Visitor& visitor)
static JS::Value wrap_for_legacy_platform_object_get_own_property(JS::GlobalObject& global_object, [[maybe_unused]] auto& retval)
{
[[maybe_unused]] auto& vm = global_object.vm();
+ [[maybe_unused]] auto& realm = *vm.current_realm();
)~~~");
if (interface.named_property_getter.has_value()) {
@@ -2989,7 +2992,7 @@ JS::ThrowCompletionOr<JS::Object*> @constructor_class@::construct(FunctionObject
)~~~");
}
generator.append(R"~~~(
- return wrap(global_object, *impl);
+ return wrap(realm, *impl);
)~~~");
} else {
// Multiple constructor overloads - can't do that yet.
@@ -3528,9 +3531,10 @@ JS_DEFINE_NATIVE_FUNCTION(@class_name@::to_string)
iterator_generator.append(R"~~~(
JS_DEFINE_NATIVE_FUNCTION(@prototype_class@::entries)
{
+ auto& realm = *vm.current_realm();
auto* impl = TRY(impl_from(vm, global_object));
- return wrap(global_object, @iterator_name@::create(*impl, Object::PropertyKind::KeyAndValue));
+ return wrap(realm, @iterator_name@::create(*impl, Object::PropertyKind::KeyAndValue));
}
JS_DEFINE_NATIVE_FUNCTION(@prototype_class@::for_each)
@@ -3557,16 +3561,18 @@ JS_DEFINE_NATIVE_FUNCTION(@prototype_class@::for_each)
JS_DEFINE_NATIVE_FUNCTION(@prototype_class@::keys)
{
+ auto& realm = *vm.current_realm();
auto* impl = TRY(impl_from(vm, global_object));
- return wrap(global_object, @iterator_name@::create(*impl, Object::PropertyKind::Key));
+ return wrap(realm, @iterator_name@::create(*impl, Object::PropertyKind::Key));
}
JS_DEFINE_NATIVE_FUNCTION(@prototype_class@::values)
{
+ auto& realm = *vm.current_realm();
auto* impl = TRY(impl_from(vm, global_object));
- return wrap(global_object, @iterator_name@::create(*impl, Object::PropertyKind::Value));
+ return wrap(realm, @iterator_name@::create(*impl, Object::PropertyKind::Value));
}
)~~~");
}
@@ -3613,7 +3619,7 @@ private:
NonnullRefPtr<@fully_qualified_name@> m_impl;
};
-@wrapper_class@* wrap(JS::GlobalObject&, @fully_qualified_name@&);
+@wrapper_class@* wrap(JS::Realm&, @fully_qualified_name@&);
} // namespace Web::Bindings
)~~~");
@@ -3696,9 +3702,9 @@ void @wrapper_class@::visit_edges(Cell::Visitor& visitor)
impl().visit_edges(visitor);
}
-@wrapper_class@* wrap(JS::GlobalObject& global_object, @fully_qualified_name@& impl)
+@wrapper_class@* wrap(JS::Realm& realm, @fully_qualified_name@& impl)
{
- return static_cast<@wrapper_class@*>(wrap_impl(global_object, impl));
+ return static_cast<@wrapper_class@*>(wrap_impl(realm, impl));
}
} // namespace Web::Bindings