diff --git a/Userland/Libraries/LibJS/SafeFunction.h b/Userland/Libraries/LibJS/SafeFunction.h index 4dfb9599b1..03bb604712 100644 --- a/Userland/Libraries/LibJS/SafeFunction.h +++ b/Userland/Libraries/LibJS/SafeFunction.h @@ -35,12 +35,16 @@ public: void register_closure() { + if (!m_size) + return; if (auto* wrapper = callable_wrapper()) register_safe_function_closure(wrapper, m_size); } void unregister_closure() { + if (!m_size) + return; if (auto* wrapper = callable_wrapper()) unregister_safe_function_closure(wrapper, m_size); } @@ -48,13 +52,13 @@ public: template SafeFunction(CallableType&& callable) requires((AK::IsFunctionObject && IsCallableWithArguments && !IsSame, SafeFunction>)) { - init_with_callable(forward(callable)); + init_with_callable(forward(callable), CallableKind::FunctionObject); } template SafeFunction(FunctionType f) requires((AK::IsFunctionPointer && IsCallableWithArguments, In...> && !IsSame, SafeFunction>)) { - init_with_callable(move(f)); + init_with_callable(move(f), CallableKind::FunctionPointer); } SafeFunction(SafeFunction&& other) @@ -110,6 +114,11 @@ public: } private: + enum class CallableKind { + FunctionPointer, + FunctionObject, + }; + class CallableWrapperBase { public: virtual ~CallableWrapperBase() = default; @@ -195,7 +204,7 @@ private: } template - void init_with_callable(Callable&& callable) + void init_with_callable(Callable&& callable, CallableKind kind) { VERIFY(m_call_nesting_level == 0); VERIFY(m_kind == FunctionKind::NullPointer); @@ -207,7 +216,10 @@ private: new (m_storage) WrapperType(forward(callable)); m_kind = FunctionKind::Inline; } - m_size = sizeof(WrapperType); + if (kind == CallableKind::FunctionObject) + m_size = sizeof(WrapperType); + else + m_size = 0; register_closure(); }