| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent cd12d1c commit 50958c8
8 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -250,6 +250,17 @@ BaseObjectPtrImpl<T, kIsWeak>& BaseObjectPtrImpl<T, kIsWeak>::operator=( | |||
| 250 | 250 | return *new (this) BaseObjectPtrImpl(std::move(other)); | |
| 251 | 251 | } | |
| 252 | 252 | ||
| 253 | + template <typename T, bool kIsWeak> | ||
| 254 | + BaseObjectPtrImpl<T, kIsWeak>::BaseObjectPtrImpl(std::nullptr_t) | ||
| 255 | + : BaseObjectPtrImpl() {} | ||
| 256 | + | ||
| 257 | + template <typename T, bool kIsWeak> | ||
| 258 | + BaseObjectPtrImpl<T, kIsWeak>& BaseObjectPtrImpl<T, kIsWeak>::operator=( | ||
| 259 | + std::nullptr_t) { | ||
| 260 | + this->~BaseObjectPtrImpl(); | ||
| 261 | + return *new (this) BaseObjectPtrImpl(); | ||
| 262 | + } | ||
| 263 | + | ||
| 253 | 264 | template <typename T, bool kIsWeak> | |
| 254 | 265 | void BaseObjectPtrImpl<T, kIsWeak>::reset(T* ptr) { | |
| 255 | 266 | *this = BaseObjectPtrImpl(ptr); | |
@@ -289,6 +300,16 @@ bool BaseObjectPtrImpl<T, kIsWeak>::operator !=( | |||
| 289 | 300 | return get() != other.get(); | |
| 290 | 301 | } | |
| 291 | 302 | ||
| 303 | + template <typename T, bool kIsWeak> | ||
| 304 | + bool operator==(const BaseObjectPtrImpl<T, kIsWeak> ptr, const std::nullptr_t) { | ||
| 305 | + return ptr.get() == nullptr; | ||
| 306 | + } | ||
| 307 | + | ||
| 308 | + template <typename T, bool kIsWeak> | ||
| 309 | + bool operator==(const std::nullptr_t, const BaseObjectPtrImpl<T, kIsWeak> ptr) { | ||
| 310 | + return ptr.get() == nullptr; | ||
| 311 | + } | ||
| 312 | + | ||
| 292 | 313 | template <typename T, typename... Args> | |
| 293 | 314 | BaseObjectPtr<T> MakeBaseObject(Args&&... args) { | |
| 294 | 315 | return BaseObjectPtr<T>(new T(std::forward<Args>(args)...)); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -274,6 +274,9 @@ class BaseObjectPtrImpl final { | |||
| 274 | 274 | inline BaseObjectPtrImpl(BaseObjectPtrImpl&& other); | |
| 275 | 275 | inline BaseObjectPtrImpl& operator=(BaseObjectPtrImpl&& other); | |
| 276 | 276 | ||
| 277 | + inline BaseObjectPtrImpl(std::nullptr_t); | ||
| 278 | + inline BaseObjectPtrImpl& operator=(std::nullptr_t); | ||
| 279 | + | ||
| 277 | 280 | inline void reset(T* ptr = nullptr); | |
| 278 | 281 | inline T* get() const; | |
| 279 | 282 | inline T& operator*() const; | |
@@ -295,6 +298,13 @@ class BaseObjectPtrImpl final { | |||
| 295 | 298 | inline BaseObject::PointerData* pointer_data() const; | |
| 296 | 299 | }; | |
| 297 | 300 | ||
| 301 | + template <typename T, bool kIsWeak> | ||
| 302 | + inline static bool operator==(const BaseObjectPtrImpl<T, kIsWeak>, | ||
| 303 | + const std::nullptr_t); | ||
| 304 | + template <typename T, bool kIsWeak> | ||
| 305 | + inline static bool operator==(const std::nullptr_t, | ||
| 306 | + const BaseObjectPtrImpl<T, kIsWeak>); | ||
| 307 | + | ||
| 298 | 308 | template <typename T> | |
| 299 | 309 | using BaseObjectPtr = BaseObjectPtrImpl<T, false>; | |
| 300 | 310 | template <typename T> | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -224,7 +224,7 @@ BaseObjectPtr<HistogramBase> HistogramBase::Create( | |||
| 224 | 224 | ->InstanceTemplate() | |
| 225 | 225 | ->NewInstance(env->context()) | |
| 226 | 226 | .ToLocal(&obj)) { | |
| 227 | - return BaseObjectPtr<HistogramBase>(); | ||
| 227 | + return nullptr; | ||
| 228 | 228 | } | |
| 229 | 229 | ||
| 230 | 230 | return MakeBaseObject<HistogramBase>(env, obj, options); | |
@@ -238,7 +238,7 @@ BaseObjectPtr<HistogramBase> HistogramBase::Create( | |||
| 238 | 238 | ->InstanceTemplate() | |
| 239 | 239 | ->NewInstance(env->context()) | |
| 240 | 240 | .ToLocal(&obj)) { | |
| 241 | - return BaseObjectPtr<HistogramBase>(); | ||
| 241 | + return nullptr; | ||
| 242 | 242 | } | |
| 243 | 243 | return MakeBaseObject<HistogramBase>(env, obj, std::move(histogram)); | |
| 244 | 244 | } | |
@@ -392,7 +392,7 @@ BaseObjectPtr<IntervalHistogram> IntervalHistogram::Create( | |||
| 392 | 392 | if (!GetConstructorTemplate(env) | |
| 393 | 393 | ->InstanceTemplate() | |
| 394 | 394 | ->NewInstance(env->context()).ToLocal(&obj)) { | |
| 395 | - return BaseObjectPtr<IntervalHistogram>(); | ||
| 395 | + return nullptr; | ||
| 396 | 396 | } | |
| 397 | 397 | ||
| 398 | 398 | return MakeBaseObject<IntervalHistogram>( | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -168,11 +168,10 @@ BaseObjectPtr<Blob> Blob::Create(Environment* env, | |||
| 168 | 168 | ||
| 169 | 169 | Local<Function> ctor; | |
| 170 | 170 | if (!GetConstructorTemplate(env)->GetFunction(env->context()).ToLocal(&ctor)) | |
| 171 | - return BaseObjectPtr<Blob>(); | ||
| 171 | + return nullptr; | ||
| 172 | 172 | ||
| 173 | 173 | Local<Object> obj; | |
| 174 | - if (!ctor->NewInstance(env->context()).ToLocal(&obj)) | ||
| 175 | - return BaseObjectPtr<Blob>(); | ||
| 174 | + if (!ctor->NewInstance(env->context()).ToLocal(&obj)) return nullptr; | ||
| 176 | 175 | ||
| 177 | 176 | return MakeBaseObject<Blob>(env, obj, data_queue); | |
| 178 | 177 | } | |
@@ -326,7 +325,7 @@ BaseObjectPtr<Blob::Reader> Blob::Reader::Create(Environment* env, | |||
| 326 | 325 | ->InstanceTemplate() | |
| 327 | 326 | ->NewInstance(env->context()) | |
| 328 | 327 | .ToLocal(&obj)) { | |
| 329 | - return BaseObjectPtr<Blob::Reader>(); | ||
| 328 | + return nullptr; | ||
| 330 | 329 | } | |
| 331 | 330 | ||
| 332 | 331 | return MakeBaseObject<Blob::Reader>(env, obj, std::move(blob)); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -867,7 +867,7 @@ void Http2Session::Close(uint32_t code, bool socket_closed) { | |||
| 867 | 867 | // but this is faster and does not fail if the stream is not found. | |
| 868 | 868 | BaseObjectPtr<Http2Stream> Http2Session::FindStream(int32_t id) { | |
| 869 | 869 | auto s = streams_.find(id); | |
| 870 | - return s != streams_.end() ? s->second : BaseObjectPtr<Http2Stream>(); | ||
| 870 | + return s != streams_.end() ? s->second : nullptr; | ||
| 871 | 871 | } | |
| 872 | 872 | ||
| 873 | 873 | bool Http2Session::CanAddStream() { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -553,7 +553,7 @@ BaseObjectPtr<SocketAddressBlockListWrap> SocketAddressBlockListWrap::New( | |||
| 553 | 553 | if (!env->blocklist_constructor_template() | |
| 554 | 554 | ->InstanceTemplate() | |
| 555 | 555 | ->NewInstance(env->context()).ToLocal(&obj)) { | |
| 556 | - return BaseObjectPtr<SocketAddressBlockListWrap>(); | ||
| 556 | + return nullptr; | ||
| 557 | 557 | } | |
| 558 | 558 | BaseObjectPtr<SocketAddressBlockListWrap> wrap = | |
| 559 | 559 | MakeBaseObject<SocketAddressBlockListWrap>(env, obj); | |
@@ -568,7 +568,7 @@ BaseObjectPtr<SocketAddressBlockListWrap> SocketAddressBlockListWrap::New( | |||
| 568 | 568 | if (!env->blocklist_constructor_template() | |
| 569 | 569 | ->InstanceTemplate() | |
| 570 | 570 | ->NewInstance(env->context()).ToLocal(&obj)) { | |
| 571 | - return BaseObjectPtr<SocketAddressBlockListWrap>(); | ||
| 571 | + return nullptr; | ||
| 572 | 572 | } | |
| 573 | 573 | BaseObjectPtr<SocketAddressBlockListWrap> wrap = | |
| 574 | 574 | MakeBaseObject<SocketAddressBlockListWrap>( | |
@@ -775,7 +775,7 @@ BaseObjectPtr<SocketAddressBase> SocketAddressBase::Create( | |||
| 775 | 775 | if (!GetConstructorTemplate(env) | |
| 776 | 776 | ->InstanceTemplate() | |
| 777 | 777 | ->NewInstance(env->context()).ToLocal(&obj)) { | |
| 778 | - return BaseObjectPtr<SocketAddressBase>(); | ||
| 778 | + return nullptr; | ||
| 779 | 779 | } | |
| 780 | 780 | ||
| 781 | 781 | return MakeBaseObject<SocketAddressBase>(env, obj, std::move(address)); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2390,7 +2390,7 @@ BaseObjectPtr<StatementSync> StatementSync::Create( | |||
| 2390 | 2390 | ->InstanceTemplate() | |
| 2391 | 2391 | ->NewInstance(env->context()) | |
| 2392 | 2392 | .ToLocal(&obj)) { | |
| 2393 | - return BaseObjectPtr<StatementSync>(); | ||
| 2393 | + return nullptr; | ||
| 2394 | 2394 | } | |
| 2395 | 2395 | ||
| 2396 | 2396 | return MakeBaseObject<StatementSync>(env, obj, std::move(db), stmt); | |
@@ -2544,7 +2544,7 @@ BaseObjectPtr<Session> Session::Create(Environment* env, | |||
| 2544 | 2544 | ->InstanceTemplate() | |
| 2545 | 2545 | ->NewInstance(env->context()) | |
| 2546 | 2546 | .ToLocal(&obj)) { | |
| 2547 | - return BaseObjectPtr<Session>(); | ||
| 2547 | + return nullptr; | ||
| 2548 | 2548 | } | |
| 2549 | 2549 | ||
| 2550 | 2550 | return MakeBaseObject<Session>(env, obj, std::move(database), session); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -155,6 +155,42 @@ TEST_F(BaseObjectPtrTest, Moveable) { | |||
| 155 | 155 | EXPECT_EQ(realm->base_object_created_after_bootstrap(), 0); | |
| 156 | 156 | } | |
| 157 | 157 | ||
| 158 | + TEST_F(BaseObjectPtrTest, Nullptr) { | ||
| 159 | + const HandleScope handle_scope(isolate_); | ||
| 160 | + const Argv argv; | ||
| 161 | + Env env_{handle_scope, argv}; | ||
| 162 | + Environment* env = *env_; | ||
| 163 | + Realm* realm = env->principal_realm(); | ||
| 164 | + | ||
| 165 | + BaseObjectPtr<DummyBaseObject> ptr = nullptr; | ||
| 166 | + EXPECT_EQ(nullptr, ptr); | ||
| 167 | + EXPECT_EQ(ptr, nullptr); | ||
| 168 | + EXPECT_EQ(nullptr, ptr.get()); | ||
| 169 | + | ||
| 170 | + // Implicit constructor. | ||
| 171 | + BaseObjectPtr<DummyBaseObject> ptr2 = []() -> BaseObjectPtr<DummyBaseObject> { | ||
| 172 | + return nullptr; | ||
| 173 | + }(); | ||
| 174 | + EXPECT_EQ(nullptr, ptr2); | ||
| 175 | + EXPECT_EQ(ptr2, nullptr); | ||
| 176 | + EXPECT_EQ(nullptr, ptr2.get()); | ||
| 177 | + | ||
| 178 | + BaseObjectWeakPtr<DummyBaseObject> weak_ptr{ptr}; | ||
| 179 | + EXPECT_EQ(nullptr, weak_ptr); | ||
| 180 | + EXPECT_EQ(weak_ptr, nullptr); | ||
| 181 | + EXPECT_EQ(nullptr, weak_ptr.get()); | ||
| 182 | + ptr.reset(); | ||
| 183 | + EXPECT_EQ(weak_ptr.get(), nullptr); | ||
| 184 | + | ||
| 185 | + // No object creation with nullptr. | ||
| 186 | + EXPECT_EQ(realm->base_object_created_after_bootstrap(), 0); | ||
| 187 | + | ||
| 188 | + BaseObjectPtr<DummyBaseObject> ptr4 = DummyBaseObject::NewDetached(env); | ||
| 189 | + EXPECT_NE(nullptr, ptr4); | ||
| 190 | + EXPECT_NE(ptr4, nullptr); | ||
| 191 | + EXPECT_EQ(realm->base_object_created_after_bootstrap(), 1); | ||
| 192 | + } | ||
| 193 | + | ||
| 158 | 194 | TEST_F(BaseObjectPtrTest, NestedClasses) { | |
| 159 | 195 | class ObjectWithPtr : public BaseObject { | |
| 160 | 196 | public: | |
| Back | FazBrowse Home | New Git URL |
0 commit comments