Skip to content

Commit 3daa120

Browse files
committed
Use defer to ensure cleanup is handled correctly
1 parent 79dce59 commit 3daa120

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

Sources/SwiftProtobuf/JSONEncodingVisitor.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,11 @@ internal struct JSONEncodingVisitor: Visitor {
298298
encoder.append(text: json)
299299
}
300300
} else if let newNameMap = (M.self as? _ProtoNameProviding.Type)?._protobuf_nameMap {
301+
// Install inner object's name map
301302
let oldNameMap = self.nameMap
302303
self.nameMap = newNameMap
304+
// Restore outer object's name map before returning
305+
defer { self.nameMap = oldNameMap }
303306
for v in value {
304307
if comma {
305308
encoder.comma()
@@ -309,7 +312,6 @@ internal struct JSONEncodingVisitor: Visitor {
309312
try v.traverse(visitor: &self)
310313
encoder.endObject()
311314
}
312-
self.nameMap = oldNameMap
313315
} else {
314316
throw JSONEncodingError.missingFieldNames
315317
}

Sources/SwiftProtobuf/TextFormatEncodingVisitor.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,12 @@ internal struct TextFormatEncodingVisitor: Visitor {
246246
self.nameMap = (M.self as? _ProtoNameProviding.Type)?._protobuf_nameMap
247247
self.nameResolver = [:]
248248
self.extensions = (value as? ExtensibleMessage)?._protobuf_extensionFieldValues
249+
// Restore state before returning
250+
defer {
251+
self.extensions = oldExtensions
252+
self.nameResolver = oldNameResolver
253+
self.nameMap = oldNameMap
254+
}
249255
// Encode submessage
250256
encoder.startMessageField()
251257
if let any = value as? Google_Protobuf_Any {
@@ -254,10 +260,6 @@ internal struct TextFormatEncodingVisitor: Visitor {
254260
try! value.traverse(visitor: &self)
255261
}
256262
encoder.endMessageField()
257-
// Restore state
258-
self.extensions = oldExtensions
259-
self.nameResolver = oldNameResolver
260-
self.nameMap = oldNameMap
261263
}
262264

263265
// Emit the full "verbose" form of an Any. This writes the typeURL

0 commit comments

Comments
 (0)