> 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