Skip to content

Commit b7d7c4c

Browse files
committed
Push the options and extensions down into the JSONScanner, since they are immutable for the duration of the decode and are more heavily used in the scanner
1 parent 671d7df commit b7d7c4c

File tree

3 files changed

+25
-33
lines changed

3 files changed

+25
-33
lines changed

Sources/SwiftProtobuf/AnyMessageStorage.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,7 @@ fileprivate func unpack(contentJSON: Data,
6969
var value = String()
7070
try contentJSON.withUnsafeBytes { (body: UnsafeRawBufferPointer) in
7171
if body.count > 0 {
72-
var scanner = JSONScanner(source: body,
73-
messageDepthLimit: options.messageDepthLimit,
74-
ignoreUnknownFields: options.ignoreUnknownFields)
72+
var scanner = JSONScanner(source: body, options: options, extensions: extensions)
7573
let key = try scanner.nextQuotedString()
7674
if key != "value" {
7775
// The only thing within a WKT should be "value".

Sources/SwiftProtobuf/JSONDecoder.swift

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,27 @@ import Foundation
1616

1717
internal struct JSONDecoder: Decoder {
1818
internal var scanner: JSONScanner
19-
internal var options: JSONDecodingOptions
20-
internal var extensions: ExtensionMap
2119
internal var messageType: Message.Type
2220
private var fieldCount = 0
2321
private var isMapKey = false
2422
private var fieldNameMap: _NameMap?
2523

24+
internal var options: JSONDecodingOptions { scanner.options }
25+
2626
mutating func handleConflictingOneOf() throws {
2727
throw JSONDecodingError.conflictingOneOf
2828
}
2929

3030
internal init(source: UnsafeRawBufferPointer, options: JSONDecodingOptions,
3131
messageType: Message.Type, extensions: ExtensionMap) {
32-
self.options = options
33-
self.scanner = JSONScanner(source: source,
34-
messageDepthLimit: self.options.messageDepthLimit,
35-
ignoreUnknownFields: self.options.ignoreUnknownFields)
36-
self.messageType = messageType
37-
self.extensions = extensions
32+
let scanner = JSONScanner(source: source,
33+
options: options,
34+
extensions: extensions)
35+
self.init(scanner: scanner, messageType: messageType)
3836
}
3937

40-
private init(decoder: JSONDecoder, messageType: Message.Type) {
41-
// The scanner is copied over along with the options.
42-
self.scanner = decoder.scanner
43-
self.options = decoder.options
44-
self.extensions = decoder.extensions
38+
private init(scanner: JSONScanner, messageType: Message.Type) {
39+
self.scanner = scanner
4540
self.messageType = messageType
4641
}
4742

@@ -53,8 +48,7 @@ internal struct JSONDecoder: Decoder {
5348
try scanner.skipRequiredComma()
5449
}
5550
let fieldNumber = try scanner.nextFieldNumber(names: fieldNameMap!,
56-
messageType: messageType,
57-
extensionMap: extensions)
51+
messageType: messageType)
5852
if let fieldNumber = fieldNumber {
5953
fieldCount += 1
6054
return fieldNumber
@@ -539,7 +533,7 @@ internal struct JSONDecoder: Decoder {
539533
if value == nil {
540534
value = M()
541535
}
542-
var subDecoder = JSONDecoder(decoder: self, messageType: M.self)
536+
var subDecoder = JSONDecoder(scanner: scanner, messageType: M.self)
543537
try subDecoder.decodeFullObject(message: &value!)
544538
assert(scanner.recursionBudget == subDecoder.scanner.recursionBudget)
545539
scanner = subDecoder.scanner
@@ -570,7 +564,7 @@ internal struct JSONDecoder: Decoder {
570564
}
571565
} else {
572566
var message = M()
573-
var subDecoder = JSONDecoder(decoder: self, messageType: M.self)
567+
var subDecoder = JSONDecoder(scanner: scanner, messageType: M.self)
574568
try subDecoder.decodeFullObject(message: &message)
575569
value.append(message)
576570
assert(scanner.recursionBudget == subDecoder.scanner.recursionBudget)
@@ -708,7 +702,7 @@ internal struct JSONDecoder: Decoder {
708702
fieldNumber: Int
709703
) throws {
710704
// Force-unwrap: we can only get here if the extension exists.
711-
let ext = extensions[messageType, fieldNumber]!
705+
let ext = scanner.extensions[messageType, fieldNumber]!
712706

713707
var fieldValue = values[fieldNumber]
714708
if fieldValue != nil {

Sources/SwiftProtobuf/JSONScanner.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -374,9 +374,10 @@ internal struct JSONScanner {
374374
private let source: UnsafeRawBufferPointer
375375
private var index: UnsafeRawBufferPointer.Index
376376
private var numberParser = DoubleParser()
377+
internal var options: JSONDecodingOptions
378+
internal var extensions: ExtensionMap
377379
internal var recursionLimit: Int
378380
internal var recursionBudget: Int
379-
private var ignoreUnknownFields: Bool
380381

381382
/// True if the scanner has read all of the data from the source, with the
382383
/// exception of any trailing whitespace (which is consumed by reading this
@@ -400,14 +401,15 @@ internal struct JSONScanner {
400401

401402
internal init(
402403
source: UnsafeRawBufferPointer,
403-
messageDepthLimit: Int,
404-
ignoreUnknownFields: Bool
404+
options: JSONDecodingOptions,
405+
extensions: ExtensionMap
405406
) {
406407
self.source = source
407408
self.index = source.startIndex
408-
self.recursionLimit = messageDepthLimit
409-
self.recursionBudget = messageDepthLimit
410-
self.ignoreUnknownFields = ignoreUnknownFields
409+
self.recursionLimit = options.messageDepthLimit
410+
self.recursionBudget = options.messageDepthLimit
411+
self.options = options
412+
self.extensions = extensions
411413
}
412414

413415
private mutating func incrementRecursionDepth() throws {
@@ -1249,12 +1251,11 @@ internal struct JSONScanner {
12491251
///
12501252
/// Throws if field name cannot be parsed.
12511253
/// If it encounters an unknown field name, it throws
1252-
/// unless `ignoreUnknownFields` is set, in which case
1254+
/// unless `options.ignoreUnknownFields` is set, in which case
12531255
/// it silently skips it.
12541256
internal mutating func nextFieldNumber(
12551257
names: _NameMap,
1256-
messageType: Message.Type,
1257-
extensionMap: ExtensionMap?
1258+
messageType: Message.Type
12581259
) throws -> Int? {
12591260
while true {
12601261
var fieldName: String
@@ -1273,8 +1274,7 @@ internal struct JSONScanner {
12731274
return fieldNumber
12741275
}
12751276
}
1276-
if let extensions = extensionMap,
1277-
let first = fieldName.first, first == "[",
1277+
if let first = fieldName.first, first == "[",
12781278
let last = fieldName.last, last == "]"
12791279
{
12801280
fieldName.removeFirst()
@@ -1283,7 +1283,7 @@ internal struct JSONScanner {
12831283
return fieldNumber
12841284
}
12851285
}
1286-
if !ignoreUnknownFields {
1286+
if !options.ignoreUnknownFields {
12871287
throw JSONDecodingError.unknownField(fieldName)
12881288
}
12891289
// Unknown field, skip it and try to parse the next field name

0 commit comments

Comments
 (0)