@@ -100,6 +100,7 @@ proc decode(dest: var openArray[uint8], src: openArray[uint32]) =
100100
101101template 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
110111template 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+
126139proc 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+
263282proc md5Init * (c: var MD5Context ) =
264283 # # Initializes an `MD5Context`.
265284 # #
@@ -271,10 +290,16 @@ proc md5Init*(c: var MD5Context) =
271290 c.state[3 ] = 0x 10325476 '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
279304proc 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
312325proc 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
333343when defined (nimHasStyleChecks):
0 commit comments