> On Nov 4, 2016, at 12:16 AM, Rien <r...@balancingrock.nl> wrote:
> 
> Thanks Any, most informative.
> 
> So the pointer “gateway’s” are in fact ephemeral. That is good for 
> performance.
> 
> As to the low level interfaces, are you aware of any effort that addresses 
> the POSIX socket functions?
> (Things like ‘addrinfo')

I've seen some discussion on mailing lists and forums.  I included a little 
blurb in the 3.0 migration guide.  Search for socket API helpers in this page. 

https://swift.org/migration-guide/se-0107-migrate.html#common-use-cases

Andy

> 
> Regards,
> Rien
> 
> Site: http://balancingrock.nl
> Blog: http://swiftrien.blogspot.com
> Github: http://github.com/Swiftrien
> Project: http://swiftfire.nl
> 
> 
> 
> 
>>> On 04 Nov 2016, at 06:24, Andrew Trick <atr...@apple.com> wrote:
>>> 
>>> 
>>>> On Nov 3, 2016, at 7:41 AM, Rien via swift-users <swift-users@swift.org> 
>>>> wrote:
>>>> 
>>>> On 03 Nov 2016, at 15:16, Manfred Schubert via swift-users 
>>>> <swift-users@swift.org> wrote:
>>>> 
>>>> 
>>>>> Am 02.11.2016 um 18:37 schrieb Rien <r...@balancingrock.nl>:
>>>>> 
>>>>>>> 
>>>>>>> var rawPtr = UnsafeMutableRawPointer.allocate(bytes: 2, alignedTo: 0)
>>>>>>> 
>>>>>>> var widePtr = rawPtr.bindMemory(to: Int16.self, capacity: 1)
>>>>>>> 
>>>>>>> widePtr.pointee = 32
>>>>>>> 
>>>>>>> var narrowPtr = rawPtr.bindMemory(to: UInt8.self, capacity: 2)
>>>>>>> 
>>>>>>> narrowPtr[0] = 16
>>>>>>> narrowPtr[1] = 255
>>>>>>> 
>>>>>>> print(widePtr.pointee)
>>>>>> 
>>>>>> This compiles and runs as expected, but it should not be allowed if I 
>>>>>> understand things correctly. So shouldn’t it be a compile time error or 
>>>>>> crash at runtime? If not, what do I get over how it was before where I 
>>>>>> was casting to a typed pointer?
>>>>> 
>>>>> Why do you think it should not be allowed.
>>>>> AFAICS everything is correct.
>>>> 
>>>> If I understand the documentation correctly, this should not be allowed, 
>>>> because it’s not allowed to access memory as different types at the same 
>>>> time. It needs to be „bound“ to the type first, and can only be bound to 
>>>> one type at a time, so all access as another type must be encapsulated 
>>>> within a closure.
>>>> 
>>> 
>>> Ah, but that is not the case.
>>> 
>>> It is important to differentiate between the “gateway” to the memory and 
>>> the memory area itself.
>>> Different programming languages/compilers have different approaches, but I 
>>> believe that Swift allocates a struct for every gateway.
>>> widePtr and narrowPtr are two different gateways. They refer to different 
>>> struct's. But the struct for each of them refers to the same memory area.
>> 
>> In the Swift memory model, a pointer value is substitutable with any other 
>> pointer of the same value. And for efficiency, pointer values are 
>> implemented as addresses. This was an intentional design decision. For 
>> example, this is well-defined:
>> 
>> func foo<T: Equatable>(rawPtr: UnsafeRawPointer, ptrT: UnsafePointer<T>) {
>>  if rawPtr == UnsafeRawPointer(ptrT) {
>>    assert(rawPtr.assumingMemoryBound(to: T.self).pointee == ptrT.pointee)
>>  }
>> }
>> 
>> Note that assumingMemoryBound(to:) is essentially a nice way of doing 
>> unsafeBitCast, but intentional and verifiable.
>> 
>>> Example: widePtr can be located at address 0x1000, narrowPtr can be 
>>> allocated at address 0x2000 while the memory area both refer to (the raw 
>>> memory) can be at address 0x3000
>> 
>> Swift strict aliasing means that unrelated typed accesses to memory cannot 
>> overlap in their underlying raw memory.
>> 
>> Our UnsafePointer value representation is not realistically ever going to 
>> depend on the Pointee type.
>> 
>>> Every access to the raw memory via a gateway must follow the rules for that 
>>> gateway.
>> 
>>> Note: Some compilers may only create ephemeral gateways, but as long as the 
>>> compiler checks that the acces follows the correct rules, that is not a 
>>> problem.
>>> 
>>> This is not only very useful, but it also opens the door to better 
>>> interfaces to some low level Unix APIs.
>> 
>> I think we would want a Swift interface on top of those APIs that doesn’t 
>> rely on type punning.
>> 
>> A Swift pointer value itself doesn’t provide a gateway. It is really 
>> bindMemory(to:capacity:) or withMemoryRebound(to:capacity:) that control 
>> whether typed access is well-defined at some point in the program.
>> 
>> In native Swift code, interacting with the memory binding APIs will be 
>> extremely rare. Type punning is not a “normal” activity outside of use cases 
>> like network I/O and binary file formats. In those cases it probably makes 
>> more sense to use a raw pointer directly rather than binding memory to a 
>> type.
>> 
>> -Andy
>> 
>>> 
>>> 
>>>> 
>>>> Manfred
>>>> _______________________________________________
>>>> swift-users mailing list
>>>> swift-users@swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>> 
>>> Regards,
>>> Rien
>>> 
>>> Site: http://balancingrock.nl
>>> Blog: http://swiftrien.blogspot.com
>>> Github: http://github.com/Swiftrien
>>> Project: http://swiftfire.nl
>>> 
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users@swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-users
> 
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to