From ce0ac09de705cf0ad4f579b13ccb13cbc9cf3bef Mon Sep 17 00:00:00 2001 From: Steve Kirbach Date: Tue, 23 Jan 2024 08:06:50 -0800 Subject: [PATCH] fix assigning proper variable --- swiftwinrt/Resources/CWinRT/MemoryBuffer.h | 4 ++-- swiftwinrt/Resources/Support/IBufferByteAccess.swift | 3 ++- .../Resources/Support/IMemoryBufferByteAccess.swift | 10 ++++++---- swiftwinrt/code_writers.h | 7 ++----- .../test_component/Windows.Foundation+Impl.swift | 7 ++----- .../test_component/Windows.Storage.Streams+Impl.swift | 7 ++----- .../test_component/Windows.Storage.Streams.swift | 7 ++----- 7 files changed, 18 insertions(+), 27 deletions(-) diff --git a/swiftwinrt/Resources/CWinRT/MemoryBuffer.h b/swiftwinrt/Resources/CWinRT/MemoryBuffer.h index 65414448..777c5669 100644 --- a/swiftwinrt/Resources/CWinRT/MemoryBuffer.h +++ b/swiftwinrt/Resources/CWinRT/MemoryBuffer.h @@ -19,8 +19,8 @@ typedef struct IMemoryBufferByteAccessVtbl _COM_Outptr_ void** ppvObject); ULONG (STDMETHODCALLTYPE* AddRef)(__RPC__in IMemoryBufferByteAccess* This); ULONG (STDMETHODCALLTYPE* Release)(__RPC__in IMemoryBufferByteAccess* This); - HRESULT (STDMETHODCALLTYPE* Buffer)(__RPC__in IMemoryBufferByteAccess* This, - BYTE** value); + HRESULT (STDMETHODCALLTYPE* GetBuffer)(__RPC__in IMemoryBufferByteAccess* This, + BYTE** value, _Out_ UINT32* capacity); END_INTERFACE } IMemoryBufferByteAccessVtbl; diff --git a/swiftwinrt/Resources/Support/IBufferByteAccess.swift b/swiftwinrt/Resources/Support/IBufferByteAccess.swift index 48474070..2b21c7ab 100644 --- a/swiftwinrt/Resources/Support/IBufferByteAccess.swift +++ b/swiftwinrt/Resources/Support/IBufferByteAccess.swift @@ -13,11 +13,12 @@ extension __ABI_ { public class IBufferByteAccess: IUnknown { override public class var IID: IID { IID_IBufferByteAccess} - public func Buffer(_ bytes: UnsafeMutablePointer?) throws { + public func Buffer() throws -> UnsafeMutablePointer? { var buffer: UnsafeMutablePointer? try perform(as: C_BINDINGS_MODULE.C_IBufferByteAccess.self) { pThis in try CHECKED(pThis.pointee.lpVtbl.pointee.Buffer(pThis, &buffer)) } + return buffer } static fileprivate func Buffer(_ this: UnsafeMutablePointer?, _ buffer: UnsafeMutablePointer?>?) -> HRESULT { return E_NOTIMPL diff --git a/swiftwinrt/Resources/Support/IMemoryBufferByteAccess.swift b/swiftwinrt/Resources/Support/IMemoryBufferByteAccess.swift index f03a185d..aa05002a 100644 --- a/swiftwinrt/Resources/Support/IMemoryBufferByteAccess.swift +++ b/swiftwinrt/Resources/Support/IMemoryBufferByteAccess.swift @@ -12,14 +12,16 @@ extension __ABI_ { public class IMemoryBufferByteAccess: IUnknown { override public class var IID: IID { IID_IMemoryBufferByteAccess} - public func Buffer(_ bytes: UnsafeMutablePointer?) throws { + public func Buffer() throws -> UnsafeMutablePointer? { var buffer: UnsafeMutablePointer? + var capacity: UInt32 = 0 try perform(as: C_BINDINGS_MODULE.IMemoryBufferByteAccess.self) { pThis in - try CHECKED(pThis.pointee.lpVtbl.pointee.Buffer(pThis, &buffer)) + try CHECKED(pThis.pointee.lpVtbl.pointee.GetBuffer(pThis, &buffer, &capacity)) } + return buffer } - fileprivate static func Buffer(_ this: UnsafeMutablePointer?, _ buffer: UnsafeMutablePointer?>?) -> HRESULT { + fileprivate static func GetBuffer(_ this: UnsafeMutablePointer?, _ buffer: UnsafeMutablePointer?>?, _ count: UnsafeMutablePointer?) -> HRESULT { return E_NOTIMPL } } @@ -60,7 +62,7 @@ fileprivate var IMemoryBufferByteAccessVTable: C_BINDINGS_MODULE.IMemoryBufferBy QueryInterface: { __ABI_.IMemoryBufferByteAccessWrapper.queryInterface($0, $1, $2) }, AddRef: { __ABI_.IMemoryBufferByteAccessWrapper.addRef($0) }, Release: { __ABI_.IMemoryBufferByteAccessWrapper.release($0) }, - Buffer: { __ABI_.IMemoryBufferByteAccess.Buffer($0, $1) } + GetBuffer: { __ABI_.IMemoryBufferByteAccess.GetBuffer($0, $1, $2) } ) extension IMemoryBufferByteAccess { diff --git a/swiftwinrt/code_writers.h b/swiftwinrt/code_writers.h index afb11859..912ae776 100644 --- a/swiftwinrt/code_writers.h +++ b/swiftwinrt/code_writers.h @@ -1001,11 +1001,8 @@ bind_bridge_fullname(type)); w.write(R"(% var data: Data { get throws { let bufferByteAccess: %.__ABI_.% = try %.QueryInterface() - var data = Data(count: Int(capacity)) - try data.withUnsafeMutableBytes { (bytes: UnsafeMutableRawBufferPointer) in - try bufferByteAccess.Buffer(bytes.baseAddress?.assumingMemoryBound(to: UInt8.self)) - } - return data + guard let buffer = try bufferByteAccess.Buffer() else { return Data() } + return Data(bytesNoCopy: buffer, count: Int(capacity), deallocator: .none) } } )", modifier_for(type_definition, info), w.support, type.swift_type_name(), get_swift_name(info)); diff --git a/tests/test_component/Sources/test_component/Windows.Foundation+Impl.swift b/tests/test_component/Sources/test_component/Windows.Foundation+Impl.swift index 9269805d..14841cec 100644 --- a/tests/test_component/Sources/test_component/Windows.Foundation+Impl.swift +++ b/tests/test_component/Sources/test_component/Windows.Foundation+Impl.swift @@ -233,11 +233,8 @@ public enum __IMPL_Windows_Foundation { fileprivate var data: Data { get throws { let bufferByteAccess: test_component.__ABI_.IMemoryBufferByteAccess = try _IMemoryBufferByteAccess.QueryInterface() - var data = Data(count: Int(capacity)) - try data.withUnsafeMutableBytes { (bytes: UnsafeMutableRawBufferPointer) in - try bufferByteAccess.Buffer(bytes.baseAddress?.assumingMemoryBound(to: UInt8.self)) - } - return data + guard let buffer = try bufferByteAccess.Buffer() else { return Data() } + return Data(bytesNoCopy: buffer, count: Int(capacity), deallocator: .none) } } } diff --git a/tests/test_component/Sources/test_component/Windows.Storage.Streams+Impl.swift b/tests/test_component/Sources/test_component/Windows.Storage.Streams+Impl.swift index 952baa5a..1c197db2 100644 --- a/tests/test_component/Sources/test_component/Windows.Storage.Streams+Impl.swift +++ b/tests/test_component/Sources/test_component/Windows.Storage.Streams+Impl.swift @@ -42,11 +42,8 @@ public enum __IMPL_Windows_Storage_Streams { fileprivate var data: Data { get throws { let bufferByteAccess: test_component.__ABI_.IBufferByteAccess = try _IBufferByteAccess.QueryInterface() - var data = Data(count: Int(capacity)) - try data.withUnsafeMutableBytes { (bytes: UnsafeMutableRawBufferPointer) in - try bufferByteAccess.Buffer(bytes.baseAddress?.assumingMemoryBound(to: UInt8.self)) - } - return data + guard let buffer = try bufferByteAccess.Buffer() else { return Data() } + return Data(bytesNoCopy: buffer, count: Int(capacity), deallocator: .none) } } } diff --git a/tests/test_component/Sources/test_component/Windows.Storage.Streams.swift b/tests/test_component/Sources/test_component/Windows.Storage.Streams.swift index 12f4fcc9..36f3b265 100644 --- a/tests/test_component/Sources/test_component/Windows.Storage.Streams.swift +++ b/tests/test_component/Sources/test_component/Windows.Storage.Streams.swift @@ -50,11 +50,8 @@ public final class Buffer : WinRTClass, IBufferByteAccess, IBuffer { public var data: Data { get throws { let bufferByteAccess: test_component.__ABI_.IBufferByteAccess = try _IBufferByteAccess.QueryInterface() - var data = Data(count: Int(capacity)) - try data.withUnsafeMutableBytes { (bytes: UnsafeMutableRawBufferPointer) in - try bufferByteAccess.Buffer(bytes.baseAddress?.assumingMemoryBound(to: UInt8.self)) - } - return data + guard let buffer = try bufferByteAccess.Buffer() else { return Data() } + return Data(bytesNoCopy: buffer, count: Int(capacity), deallocator: .none) } } /// [Open Microsoft documentation](https://learn.microsoft.com/uwp/api/windows.storage.streams.buffer.capacity)