Skip to content

Commit 0bb8b2b

Browse files
committed
cleanup
1 parent e45a6ef commit 0bb8b2b

File tree

1 file changed

+35
-25
lines changed

1 file changed

+35
-25
lines changed

lib/pure/md5.nim

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ proc decode(dest: var openArray[uint8], src: openArray[uint32]) =
100100

101101
template slice(s: string, a, b): openArray[uint8] =
102102
when nimvm:
103+
# toOpenArray is not implemented in VM
103104
var s2 = newSeq[uint8](s.len)
104105
for i in 0 ..< s2.len:
105106
s2[i] = uint8(s[i])
@@ -109,10 +110,11 @@ template slice(s: string, a, b): openArray[uint8] =
109110

110111
template slice(s: cstring, a, b): openArray[uint8] =
111112
when nimvm:
112-
let ss = $s
113-
slice(ss, a, b)
113+
# toOpenArray is not implemented in VM
114+
slice($s, a, b)
114115
else:
115116
when defined(js):
117+
# toOpenArrayByte for cstring is not implemented in JS
116118
slice($s, a, b)
117119
else:
118120
s.toOpenArrayByte(a, b)
@@ -123,6 +125,17 @@ template slice(s: openArray[uint8], a, b): openArray[uint8] =
123125
else:
124126
s.toOpenArray(a, b)
125127

128+
const useMem = declared(copyMem)
129+
130+
template memOrNot(withMem, withoutMem): untyped =
131+
when nimvm:
132+
withoutMem
133+
else:
134+
when useMem:
135+
withMem
136+
else:
137+
withoutMem
138+
126139
proc transform(buffer: openArray[uint8], state: var MD5State) =
127140
var
128141
myBlock: MD5Block
@@ -260,6 +273,12 @@ proc `==`*(D1, D2: MD5Digest): bool =
260273
return true
261274

262275

276+
proc clearBuffer(c: var MD5Context) {.inline.} =
277+
memOrNot:
278+
zeroMem(addr(c.buffer), sizeof(MD5Buffer))
279+
do:
280+
reset(c.buffer)
281+
263282
proc md5Init*(c: var MD5Context) =
264283
## Initializes an `MD5Context`.
265284
##
@@ -271,10 +290,16 @@ proc md5Init*(c: var MD5Context) =
271290
c.state[3] = 0x10325476'u32
272291
c.count[0] = 0'u32
273292
c.count[1] = 0'u32
274-
when false:
275-
zeroMem(addr(c.buffer), sizeof(MD5Buffer))
276-
else:
277-
reset(c.buffer)
293+
clearBuffer(c)
294+
295+
proc writeBuffer(c: var MD5Context, index: int,
296+
input: openArray[uint8], inputIndex, len: int) {.inline.} =
297+
memOrNot:
298+
copyMem(addr(c.buffer[index]), unsafeAddr(input[inputIndex]), len)
299+
do:
300+
{.cast(raises: []).}:
301+
# `[]=` can sometimes track RangeDefect, even though it cannot be raised here
302+
c.buffer[index .. index + len - 1] = input.slice(inputIndex, inputIndex + len - 1)
278303

279304
proc md5Update*(c: var MD5Context, input: openArray[uint8]) =
280305
## Updates the `MD5Context` with the `input` data.
@@ -287,27 +312,15 @@ proc md5Update*(c: var MD5Context, input: openArray[uint8]) =
287312
c.count[1] = c.count[1] + (uint32(input.len) shr 29)
288313
var PartLen = 64 - Index
289314
if input.len >= PartLen:
290-
when false:
291-
copyMem(addr(c.buffer[Index]), unsafeAddr(input[0]), PartLen)
292-
else:
293-
{.cast(raises: []).}:
294-
c.buffer[Index .. Index + PartLen - 1] = input.slice(0, PartLen - 1)
315+
writeBuffer(c, Index, input, 0, PartLen)
295316
transform(c.buffer, c.state)
296317
var i = PartLen
297318
while i + 63 < input.len:
298319
transform(input.slice(i, i + 63), c.state)
299320
inc(i, 64)
300-
when false:
301-
copyMem(addr(c.buffer[0]), unsafeAddr(input[i]), input.len-i)
302-
else:
303-
{.cast(raises: []).}:
304-
c.buffer[0 .. input.len - i - 1] = input.slice(i, input.len - 1)
321+
writeBuffer(c, 0, input, i, input.len - i)
305322
else:
306-
when false:
307-
copyMem(addr(c.buffer[Index]), unsafeAddr(input[0]), input.len)
308-
else:
309-
{.cast(raises: []).}:
310-
c.buffer[Index .. Index + input.len - 1] = input
323+
writeBuffer(c, Index, input, 0, input.len)
311324

312325
proc md5Final*(c: var MD5Context, digest: var MD5Digest) =
313326
## Finishes the `MD5Context` and stores the result in `digest`.
@@ -324,10 +337,7 @@ proc md5Final*(c: var MD5Context, digest: var MD5Digest) =
324337
md5Update(c, padding.slice(0, PadLen - 1))
325338
md5Update(c, Bits)
326339
decode(digest, c.state)
327-
when false:
328-
zeroMem(addr(c), sizeof(MD5Context))
329-
else:
330-
reset(c)
340+
clearBuffer(c)
331341

332342

333343
when defined(nimHasStyleChecks):

0 commit comments

Comments
 (0)