[swift-evolution] Proposal: [stdlib] Remove withUnsafe[Mutable]Pointer[s]()

Joe Groff jgroff at apple.com
Wed Dec 16 16:42:05 CST 2015


If 'ptr' is a local variable, then the scope of 'ptr' could potentially be used as the lifetime of the referenced memory. That's still not perfect if 'ptr' is escaped and you expect it to remain valid for the longer duration of `x`, though.

-Joe

> On Dec 16, 2015, at 2:38 PM, Jordan Rose via swift-evolution <swift-evolution at swift.org> wrote:
> 
> 'x' may not have storage at all, either because it fits entirely in registers or because it's actually a computed property. So this would have to synthesize storage, presumably on the stack. It's unclear when it's safe to destroy that storage, too.
> 
> Limiting inout-to-pointer conversions to a single call gives a clear start and end for where the pointer is valid, which allows the compiler to do correct cleanup.
> 
> Jordan
> 
>> On Dec 16, 2015, at 14:25 , Jacob Bandes-Storch via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> 
>> Is there a reason that this couldn't be made to work?
>>     let ptr: UnsafePointer<Void> = &x
>> 
>> 
>> Jacob
>> 
>> On Wed, Dec 16, 2015 at 2:16 PM, Michael Gottesman via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> 
>> > On Dec 16, 2015, at 4:07 PM, Michael Gottesman via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> >
>> >
>> >> On Dec 16, 2015, at 2:22 PM, Dave Abrahams <dabrahams at apple.com <mailto:dabrahams at apple.com>> wrote:
>> >>
>> >>
>> >>> On Dec 16, 2015, at 11:54 AM, Michael Gottesman via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> >>>
>> >>>>
>> >>>> On Dec 16, 2015, at 1:49 PM, Kevin Ballard via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> >>>>
>> >>>> Another replacement for withUnsafe[Mutable]Pointer is declaring a nested function of the appropriate type (this is equivalent to the anonymous closure, but perhaps more readable):
>> >>>>
>> >>>> func foo(ptr: UnsafePointer<Int>) {
>> >>>> // ...
>> >>>> }
>> >>>> foo(&x)
>> >>>>
>> >>>> -Kevin
>> >>>>
>> >>>> On Wed, Dec 16, 2015, at 11:38 AM, Kevin Ballard wrote:
>> >>>>> # Introduction
>> >>>>>
>> >>>>> The stdlib provides functions withUnsafePointer() and withUnsafeMutablePointer() (and plural variants) that take an inout reference and call a block with the UnsafePointer/UnsafeMutablePointer created from the reference.
>> >>>>>
>> >>>>> # Problem
>> >>>>>
>> >>>>> withUnsafePointer() can only be used with mutable variables, because those are the only things that can be used with inout &refs. Both functions are also fairly useless, as &x refs can be passed directly to functions taking an UnsafePointer or UnsafeMutablePointer. The existence of the functions mostly just causes people to think they're necessary when they're not. The provide no functionality that passing &x refs directly to the functions taking a pointer doesn't already fulfill.
>> >>>>>
>> >>>>> # Solution
>> >>>>>
>> >>>>> Remove the functions from the stdlib. The Swift Book should also be updated to talk about passing an &x ref to a function that takes an UnsafePointer or UnsafeMutablePointer (but of course changes to the book are not covered by the open-source project). Most uses of these functions can probably be replaced with a &x ref directly. If any can't, they could be replaced with the following equivalent expressions:
>> >>>>>
>> >>>>> { (ptr: UnsafePointer<Int>) in
>> >>>>> // ...
>> >>>>> }(&x)
>> >>>>>
>> >>>>> or:
>> >>>>>
>> >>>>> withExtendedLifetime(&x) { (ptr: UnsafePointer<Int>) in
>> >>>>> // ...
>> >>>>> }
>> >>>
>> >>> One thing to keep in mind here is that with*Pointer and friends is also meant to enable one to work around issues with the optimizer if they come up in a convenient manner. I.e. imagine if one is attempting to process an image using a 5d array and for whatever reason, you are not getting the performance you need. Hopefully you would file a bug report and then use with*Pointer for your image processing loop.
>> >>>
>> >>> My fear about withExtendedLifetime is that the name is a misnomer. You are not extending the lifetime.
>> >>
>> >> What makes you say that?
>> >
>> > Let me be more specific.
>> >
>> > My issue with the name 'withExtendedLifetime' is that it is suggestive that the lifetime of &x is being extended in a way that is different from if one just passed off &x to any old function. In reality though, nothing special is happening here implying that the name is misleading. A better name IMO would be something that drops any such implication.
>> 
>> For example, we could just use 'with' (something that has been suggested for this use case in various blog posts). I.e.:
>> 
>> with(&x) { (ptr: UnsafePointer<Int>) in
>>    ...
>> }
>> 
>> Michael
>> 
>> >
>> > Michael
>> >
>> >>
>> >> If in fact it is true, shouldn't you file a bug report?
>> >>
>> >> -Dave
>> >>
>> >>
>> >>
>> >
>> > _______________________________________________
>> > swift-evolution mailing list
>> > swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> > https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
>>  _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
>  _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20151216/34f097a0/attachment.html>


More information about the swift-evolution mailing list