> On Mar 20, 2016, at 11:41 PM, Dmitri Gribenko <[email protected]> wrote:
> 
> On Sun, Mar 20, 2016 at 9:32 PM, Timothy Wood via swift-evolution
> <[email protected]> wrote:
>> 
>> In preparation for writing a proposal, I wanted to solicit any feedback and 
>> general level of interest on addressing SR-842, which proposes modifying 
>> ObjectiveC.autoreleasepool to allow a potentially `throw`ing body via a 
>> `rethrows` annotation. I have a branch with the very simple change applied 
>> and a test. However, Dmitri Gribenko pointed out that it would be even 
>> better if the signature was amended to allow for a generic return type:
>> 
>>  public func autoreleasepool<Result>(@noescape code: () throws -> Result) 
>> rethrows -> Result
>> 
>> It isn’t clear to me whether it is possible for a wrapper to be written that 
>> adds rethrow, since the function needs to compile under the assumption that 
>> the passed block does not throw. So, something like this doesn’t actually 
>> compile.
> 
> Hi Timothy,
> 
> I think it should be possible -- or I wouldn't be suggesting it :)
> 
> func poolPush() {}
> func poolPop() {}
> 
> public func autoreleasepool<Result>(@noescape code: () throws ->
> Result) rethrows -> Result {
>  poolPush()
>  defer { poolPop() }
>  return try code()
> }


Sorry; yes of course it is possible to make stdlib do this. What I meant was 
whether it is possible for code outside stdlib to easily wrap a autoreleasepool 
that does not have `rethrow` applied and make one that does. Or, more 
generically, is it possible in Swift, given only `func f(@noescape body: Void 
-> Void)` to write `func f(@noescape body: Void throws -> Void) rethrows`? It 
seemed to me like it isn’t possible, since the wrapper needs to capture the 
error inside a do/catch in a var and then optionally re-throw it outside the 
do/catch, but the rethrow can’t be done (as far as I can see) since that seems 
to make the compiler thing that the function should be marked as `throws` 
instead of `rethrows`.

In particular, in this case pushPool() and popPool() don’t exist as nice public 
API:

@warn_unused_result
@_silgen_name("objc_autoreleasePoolPush")
func __pushAutoreleasePool() -> OpaquePointer

@_silgen_name("objc_autoreleasePoolPop")
func __popAutoreleasePool(pool: OpaquePointer)

Either way, I think stdlib should be marked `rethrow` here, but it may make for 
a more compelling argument for this (and other cases in stdlib that take a 
function argument) if it is hard or impossible(?) for code outside stdlib to 
provide a `rethrows` wrapper of code in stdlib.

Thanks!

-tim

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to