> On Jun 13, 2017, at 12:37 PM, Alex Christensen <achristen...@apple.com> wrote:
> 
> Ok, maybe we can get rid of std::function, then!  I hadn’t used BlockPtr as 
> much as Chris.  I’d be opposed to adding a copy constructor to WTF::Function 
> because the non-copyability of WTF::Function is why we made it, and it has 
> prevented many bugs.

I agree that the copy semantics of std::function are strange - each copy gets 
its own view of the state of the closure.  This gets super weird when you 
implement an algorithm that accidentally copies the function - the act of 
copying invokes copy constructors on all of the lambda-lifted state, which is 
probably not what you wanted.  So I’m not surprised that moving to 
WTF::Function avoided bugs.  What I’m proposing also prevents many of the same 
bugs because the lambda-lifted state never gets copied in my world.

Do you think that code that uses ObjC blocks encounters the kind of bugs that 
you saw WTF::Function preventing?  Or are the bugs that Function prevents more 
specific to std::function?  I guess I’d never heard of a need to change block 
semantics to avoid bugs, so I have a hunch that the bugs you guys prevented 
were specific to the fact that std::function copies instead of sharing.

> 
> I’ve also seen many cases where I have a WTF::Function that I want to make 
> sure is called once and only once before destruction.  I wouldn’t mind adding 
> a WTF::Callback subclass that just asserts that it has been called once.  
> That would’ve prevented some bugs, too, but not every use of WTF::Function 
> has such a requirement.
> 
>> On Jun 13, 2017, at 12:31 PM, Chris Dumez <cdu...@apple.com 
>> <mailto:cdu...@apple.com>> wrote:
>> 
>> We already have BlockPtr for passing a Function as a lambda block.
>> 
>> Chris Dumez
>> 
>> On Jun 13, 2017, at 12:29 PM, Alex Christensen <achristen...@apple.com 
>> <mailto:achristen...@apple.com>> wrote:
>> 
>>> std::function, c++ lambda, and objc blocks are all interchangeable.  
>>> WTF::Functions cannot be used as objc blocks because the latter must be 
>>> copyable.  Until that changes or we stop using objc, we cannot completely 
>>> eliminate std::function from WebKit.
>>> _______________________________________________
>>> webkit-dev mailing list
>>> webkit-dev@lists.webkit.org <mailto:webkit-dev@lists.webkit.org>
>>> https://lists.webkit.org/mailman/listinfo/webkit-dev 
>>> <https://lists.webkit.org/mailman/listinfo/webkit-dev>
> 
> _______________________________________________
> webkit-dev mailing list
> webkit-dev@lists.webkit.org
> https://lists.webkit.org/mailman/listinfo/webkit-dev

_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to