From 664dfb05430be6303dc5da05210476d8b91de7f4 Mon Sep 17 00:00:00 2001 From: SpectralDragon Date: Fri, 18 Sep 2026 10:55:11 +0300 Subject: [PATCH] Fix Windows string bridge compilation --- .../GravityVirtualMachineTests.swift | 12 ++++++++++++ .../GravitySwift/GravityVirtualMachine.swift | 17 +++++------------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/Tests/GravityTests/GravityVirtualMachineTests.swift b/Tests/GravityTests/GravityVirtualMachineTests.swift index 136fbce..aa434a9 100644 --- a/Tests/GravityTests/GravityVirtualMachineTests.swift +++ b/Tests/GravityTests/GravityVirtualMachineTests.swift @@ -79,6 +79,18 @@ struct GravityVirtualMachineTests { #expect(result.toInteger == 2) } + @Test("Bridges strings through null-terminated storage") + func bridgesNullTerminatedStrings() { + let delegate = TestVirtualMachineDelegate() + let virtualMachine = GravityVirtualMachine( + settings: .init(), + delegate: delegate + ) + let value = GSValue(string: "Hello", in: virtualMachine) + + #expect(value.toString == "Hello") + } + @Test("Collects declaration annotations without executing main") func collectsDeclarationAnnotations() throws { let delegate = TestVirtualMachineDelegate() diff --git a/binding/GravitySwift/GravityVirtualMachine.swift b/binding/GravitySwift/GravityVirtualMachine.swift index 32bc906..7c9c527 100644 --- a/binding/GravitySwift/GravityVirtualMachine.swift +++ b/binding/GravitySwift/GravityVirtualMachine.swift @@ -371,18 +371,11 @@ extension GravityVirtualMachine { extension String { func toPointer() -> UnsafePointer? { - guard let data = self.data(using: .utf8) else { return nil } - - let buffer = UnsafeMutablePointer.allocate(capacity: data.count) - let stream = OutputStream(toBuffer: buffer, capacity: data.count) - - stream.open() - data.withUnsafeBytes { pointer in - let charPointer = pointer.bindMemory(to: CChar.self) - stream.write(charPointer.baseAddress!, maxLength: charPointer.count) + let capacity = utf8.count + 1 + let buffer = UnsafeMutablePointer.allocate(capacity: capacity) + return withCString { source in + buffer.initialize(from: source, count: capacity) + return UnsafePointer(buffer) } - stream.close() - - return UnsafePointer(buffer) } }