> 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