diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-03-25 13:31:35 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-03-25 13:31:35 +0300 |
| commit | f26641d78d7ff7a9d19114ec77a9f97378d1f68c (patch) | |
| tree | 97ca459ac533669d3ced7aa4729e53f898c89b38 | |
| parent | a3ae66e1aa6a79c3b1c5e23ccdce778bba829c09 (diff) | |
| download | nimpb-f26641d78d7ff7a9d19114ec77a9f97378d1f68c.tar.gz nimpb-f26641d78d7ff7a9d19114ec77a9f97378d1f68c.zip | |
Add packed support to generateSizeOfMessageProc()
| -rw-r--r-- | src/protobuf/gen.nim | 27 | ||||
| -rw-r--r-- | src/protobuf/stream.nim | 2 |
2 files changed, 19 insertions, 10 deletions
diff --git a/src/protobuf/gen.nim b/src/protobuf/gen.nim index cd47138..3ef13c2 100644 --- a/src/protobuf/gen.nim +++ b/src/protobuf/gen.nim @@ -396,15 +396,24 @@ proc generateSizeOfMessageProc(desc: NimNode): NimNode = # TODO: packed if isRepeated(field): - procBody.add quote do: - for value in `fname`: - let - sizeOfField = `sizeofproc`(value) - tagSize = sizeOfUint32(uint32(makeTag(`number`, `wiretype`))) - `resultId` = `resultId` + - sizeOfField + - sizeOfUint64(sizeOfField) + - tagSize + if isPacked(field): + procBody.add quote do: + if `hasproc`(`messageId`): + let + tagSize = sizeOfUint32(uint32(makeTag(`number`, WireType.LengthDelimited))) + dataSize = packedFieldSize(`fname`, `wiretype`) + sizeOfSize = sizeOfUint64(dataSize) + `resultId` = tagSize + dataSize + sizeOfSize + else: + procBody.add quote do: + for value in `fname`: + let + sizeOfField = `sizeofproc`(value) + tagSize = sizeOfUint32(uint32(makeTag(`number`, `wiretype`))) + `resultId` = `resultId` + + sizeOfField + + sizeOfUint64(sizeOfField) + + tagSize else: let sizeOfFieldId = ident("sizeOfField") diff --git a/src/protobuf/stream.nim b/src/protobuf/stream.nim index 4c026b4..b7e941d 100644 --- a/src/protobuf/stream.nim +++ b/src/protobuf/stream.nim @@ -263,7 +263,7 @@ proc packedFieldSize*[T](values: seq[T], wiretype: WireType): uint64 = for value in values: result += sizeOfVarint(value) else: - discard + raise newException(Exception, "invalid wiretype") proc sizeOfString*(s: string): uint64 = result = sizeOfVarint(len(s).uint64) + len(s).uint64 |
