On Tue, Dec 15, 2015, at 06:39 PM, Dave Abrahams wrote:
> 
> > On Dec 15, 2015, at 6:33 PM, Kevin Ballard via swift-dev 
> > <swift-dev@swift.org> wrote:
> > 
> > On Tue, Dec 15, 2015, at 03:03 PM, Joe Groff via swift-dev wrote:
> >> 
> >> Yeah, it seems to me like a reasonable refinement for 'withUnsafePointer' 
> >> to take an immutable parameter. Since this is a stdlib API change, you 
> >> should suggest that on swift-evolution.
> > 
> > A change like that is going to break any code that relies on the inout 
> > optimization (where it uses call-by-reference instead of copy-in copy-out 
> > when possible). Yes, such code is in violation of Swift semantics today, 
> > but it does work.
> 
> Two questions:
> 
> 1. Don’t we want a withUnsafeMutablePointer for the mutating cases (where the 
> inout optimization can take effect) anyway?

I'm thinking here of cases like passing a context pointer to KVO. You're not 
actually mutating it, you just need a pointer that's the same every time you 
call the code.

> 2. Joe, these APIs predate many of your changes that make &x transparently 
> convert to Unsafe[Mutable]Pointer arguments.  Are they obsolete?  Can we 
> replace them with { x: Unsafe[Mutable]Pointer in … }(&y) ?

Interesting idea. I rarely use withUnsafePointer/withUnsafeMutablePointer 
because the &x shorthand exists. If withUnsafePointer() is modified to take its 
argument by-value and create a pointer from it, I expect people will start 
using it in place of &x shorthand so they can use it with immutable values, 
without realizing that they're getting a different pointer back each time 
(whether they notice this depends on what they're using the pointer for).

If { x: UnsafePointer<Int> in ... }(&y) works, that's a cute replacement. 
Although it does move the &y reference to after the scope instead of before, 
which is a little unfortunate.

...huh. On a whim I tested the following and it shocked me by working.

var x: Int = 42
withExtendedLifetime(&x) { (x: UnsafeMutablePointer<Int>) in
    x.memory += 1
}
print(x) // prints 43

If we want to replace withUnsafe[Mutable]Pointer() with a common idiom, I'd 
recommend using withExtendedLifetime like that, because a) it guarantees the 
pointed-to value exists for the duration of the scope, and b) it already works.

-Kevin Ballard
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to