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:
parent
565a26808d
commit
060ddd2a7a
4 changed files with 9 additions and 2 deletions
|
@ -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())
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue