rjmccall added a comment. In D58514#1429662 <https://reviews.llvm.org/D58514#1429662>, @wuhao5 wrote:
> > The specified user model of blocks is that they stay on the stack until > > they get copied, and there can be multiple such copies. ARC just automates > > that process. So the address of a block is not consistent before you've > > forced a copy. > > > > I tend to agree that a better user model would have been for blocks to be > > allocated in one place, without any of this copying business, and for the > > compiler to make an intelligent decision about stack vs. heap based on how > > the block is used. That's the model we've used for closures in Swift. But > > that would've required the compiler to have a better ability to propagate > > information about how the block was used, which Clang isn't really set up > > for, and it would've required `noescape` annotations to be introduced and > > used reliably throughout the SDK, which seemed like a big request at the > > time. So it's not how it works. > > > > There is no way in the existing ABI for copying a block to cause other > > references to the block to become references to the heap block. We do do > > that for `__block` variables, but not for block objects themselves. > > I see - this makes sense. Right that I'd expect the compiler would know more > about where the block is being used and make the variable consistent. my > other worry is, although not realistically, that there can be other projects > to use this weak/strong pointer trick to do a recursive block invocation. it > becomes to me a bit counter-intuitive that I will need to know more about how > block and where it should be copied, which currently we don't have to worry > about it at all. > > Right now we force an explicit copy before using it, but still like to > request that this would be handled by Clang at some later point :) Can I ask why you want a weak reference to a block in the first place? It seems basically useless — blocks can certainly appear in reference cycles, but I don't know why you'd ever try to break that cycle with the block instead of somewhere else. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D58514/new/ https://reviews.llvm.org/D58514 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits