1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-30 07:55:08 +00:00

AK: Really disallow making OwnPtrs from refcounted types

This looks at three things:
- if the type has a typedef `AllowOwnPtr', respect that
- if not, disallow construction if both of `ref()' and `unref()' are
  present.
Note that in the second case, if a type only defines `ref()' or only
defines `unref()', an OwnPtr can be created, as a RefPtr of that type
would be ill-formed.

Also marks a `Performance' to explicitly allow OwnPtrs.
This commit is contained in:
AnotherTest 2020-11-03 18:21:56 +03:30 committed by Andreas Kling
parent 565a26808d
commit 060ddd2a7a
4 changed files with 9 additions and 2 deletions

View file

@ -52,7 +52,9 @@ public:
NonnullOwnPtr(AdoptTag, T& ptr) NonnullOwnPtr(AdoptTag, T& ptr)
: m_ptr(&ptr) : m_ptr(&ptr)
{ {
static_assert(!is_ref_counted((const T*)nullptr), "Use RefPtr<> for RefCounted types"); static_assert(
requires { requires typename T::AllowOwnPtr()(); } || !requires(T obj) { requires !typename T::AllowOwnPtr()(); obj.ref(); obj.unref(); },
"Use NonnullRefPtr<> for RefCounted types");
} }
NonnullOwnPtr(NonnullOwnPtr&& other) NonnullOwnPtr(NonnullOwnPtr&& other)
: m_ptr(other.leak_ptr()) : m_ptr(other.leak_ptr())

View file

@ -38,7 +38,9 @@ public:
explicit OwnPtr(T* ptr) explicit OwnPtr(T* ptr)
: m_ptr(ptr) : m_ptr(ptr)
{ {
static_assert(!is_ref_counted((const T*)nullptr), "Use RefPtr<> for RefCounted types"); static_assert(
requires { requires typename T::AllowOwnPtr()(); } || !requires(T obj) { requires !typename T::AllowOwnPtr()(); obj.ref(); obj.unref(); },
"Use RefPtr<> for RefCounted types");
} }
OwnPtr(OwnPtr&& other) OwnPtr(OwnPtr&& other)
: m_ptr(other.leak_ptr()) : m_ptr(other.leak_ptr())

View file

@ -65,6 +65,7 @@ class RefCountedBase {
public: public:
typedef unsigned int RefCountType; typedef unsigned int RefCountType;
using AllowOwnPtr = FalseType;
ALWAYS_INLINE void ref() const ALWAYS_INLINE void ref() const
{ {

View file

@ -26,6 +26,7 @@
#pragma once #pragma once
#include <AK/StdLibExtras.h>
#include <LibCore/ElapsedTimer.h> #include <LibCore/ElapsedTimer.h>
#include <LibWeb/Bindings/Wrappable.h> #include <LibWeb/Bindings/Wrappable.h>
#include <LibWeb/DOM/EventTarget.h> #include <LibWeb/DOM/EventTarget.h>
@ -37,6 +38,7 @@ class Performance final
, public Bindings::Wrappable { , public Bindings::Wrappable {
public: public:
using WrapperType = Bindings::PerformanceWrapper; using WrapperType = Bindings::PerformanceWrapper;
using AllowOwnPtr = AK::TrueType;
explicit Performance(DOM::Window&); explicit Performance(DOM::Window&);
~Performance(); ~Performance();