[PATCH] D34331: func.wrap.func.con: Unset function before destroying anything

Volodymyr Sapsai via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 21 15:36:38 PDT 2018


vsapsai added inline comments.


================
Comment at: libcxx/include/functional:1722-1733
     if (__f.__f_ == 0)
         __f_ = 0;
     else if ((void *)__f.__f_ == &__f.__buf_)
     {
         __f_ = __as_base(&__buf_);
         __f.__f_->__clone(__f_);
     }
----------------
Here is the similar code I've mentioned.


================
Comment at: libcxx/include/functional:1821
 {
-    if ((void *)__f_ == &__buf_)
-        __f_->destroy();
-    else if (__f_)
-        __f_->destroy_deallocate();
-    __f_ = 0;
+    function::operator=(nullptr);
     if (__f.__f_ == 0)
----------------
mclow.lists wrote:
> Couldn't this be more clearly written as `*this = nullptr;` ?
Personally I prefer to call operator explicitly but checking the code shows it isn't very common. Will change.


================
Comment at: libcxx/include/functional:1822
+    function::operator=(nullptr);
     if (__f.__f_ == 0)
         __f_ = 0;
----------------
mclow.lists wrote:
> At this point `__f_ == 0` (because we just set it to 0).
> We probably don't need to do that again.
> 
This code is the same as in `function(function&& __f)`. Do you think there is enough value to deviate from that implementation?


================
Comment at: libcxx/include/functional:1843
     __f_ = 0;
+    if ((void *)__t == &__buf_)
+        __t->destroy();
----------------
mclow.lists wrote:
> I see this dance 4x in `<functional_03>` and once here. Did you give any thought to making it a function of `__base`?  Maybe call it `__clear`?
> 
> Then line #1821 can be written as `__clear();`
> 
> 
Haven't really thought about that. Not sure it can be easily done. All `__base` classes are separate templates and don't have a common ancestor. Don't want to introduce macros as it doesn't look like libc++ style. You achieve the most consistency with current code by copy-pasting and repeating the same dance a few times.


https://reviews.llvm.org/D34331





More information about the cfe-commits mailing list