Skip to content

Commit

Permalink
fixes #13722 (#13729)
Browse files Browse the repository at this point in the history
* fixes #13722

* better fix
  • Loading branch information
Araq authored Mar 23, 2020
1 parent e05fd1d commit fc5dd11
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 12 deletions.
2 changes: 1 addition & 1 deletion compiler/injectdestructors.nim
Original file line number Diff line number Diff line change
Expand Up @@ -616,7 +616,7 @@ proc pVarScoped(v: PNode; c: var Con; ri, res: PNode) =
# unpacked tuple needs reset at every loop iteration
res.add newTree(nkFastAsgn, v, genDefaultCall(v.typ, c, v.info))
elif {sfGlobal, sfThread} * v.sym.flags == {sfGlobal}:
c.graph.globalDestructors.add genDestroy(c, v)
c.graph.globalDestructors.add genDestroy(c, v)
else:
# We always translate 'var v = f()' into bitcopies. If 'v' is in a loop,
# the destruction at the loop end will free the resources. Other assignments
Expand Down
28 changes: 20 additions & 8 deletions lib/pure/base64.nim
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,17 @@ let
cb64 = cbBase('+', '/')
cb64safe = cbBase('-', '_')

const
cb64VM = cbBase('+', '/')
cb64safeVM = cbBase('-', '_')

const
invalidChar = 255

template encodeInternal(s: typed, alphabet: ptr array[64, char]): untyped =
template encodeSize(size: int): int = (size * 4 div 3) + 6

template encodeInternal(s, alphabet: typed): untyped =
## encodes `s` into base64 representation.
proc encodeSize(size: int): int =
return (size * 4 div 3) + 6

result.setLen(encodeSize(s.len))

Expand All @@ -94,7 +98,7 @@ template encodeInternal(s: typed, alphabet: ptr array[64, char]): untyped =
n = exp
inc inputIndex

template outputChar(x: untyped) =
template outputChar(x: typed) =
result[outputIndex] = alphabet[x and 63]
inc outputIndex

Expand Down Expand Up @@ -129,6 +133,16 @@ template encodeInternal(s: typed, alphabet: ptr array[64, char]): untyped =

result.setLen(outputIndex)

template encodeImpl() {.dirty.} =
when nimVM:
block:
let lookupTableVM = if safe: cb64safeVM else: cb64VM
encodeInternal(s, lookupTableVM)
else:
block:
let lookupTable = if safe: unsafeAddr(cb64safe) else: unsafeAddr(cb64)
encodeInternal(s, lookupTable)

proc encode*[T: SomeInteger|char](s: openArray[T], safe = false): string =
## Encodes `s` into base64 representation.
##
Expand All @@ -148,8 +162,7 @@ proc encode*[T: SomeInteger|char](s: openArray[T], safe = false): string =
assert encode(['n', 'i', 'm']) == "bmlt"
assert encode(@['n', 'i', 'm']) == "bmlt"
assert encode([1, 2, 3, 4, 5]) == "AQIDBAU="
let lookupTable = if safe: unsafeAddr(cb64safe) else: unsafeAddr(cb64)
encodeInternal(s, lookupTable)
encodeImpl()

proc encode*(s: string, safe = false): string =
## Encodes ``s`` into base64 representation.
Expand All @@ -167,8 +180,7 @@ proc encode*(s: string, safe = false): string =
## * `decode proc<#decode,string>`_ for decoding a string
runnableExamples:
assert encode("Hello World") == "SGVsbG8gV29ybGQ="
let lookupTable = if safe: unsafeAddr(cb64safe) else: unsafeAddr(cb64)
encodeInternal(s, lookupTable)
encodeImpl()

proc encodeMIME*(s: string, lineLen = 75, newLine = "\r\n"): string =
## Encodes ``s`` into base64 representation as lines.
Expand Down
9 changes: 6 additions & 3 deletions tests/stdlib/tbase64.nim
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
discard """
output: "OK"
output: '''YQ=='''
nimout: '''YQ=='''
"""
import base64

import base64
static: echo encode("a")
echo encode("a")

proc main() =
doAssert encode("Hello World") == "SGVsbG8gV29ybGQ="
doAssert encode("leasure.") == "bGVhc3VyZS4="
Expand Down Expand Up @@ -54,6 +59,4 @@ proc main() =
doAssert encode("", safe = true) == ""
doAssert encode("the quick brown dog jumps over the lazy fox", safe = true) == "dGhlIHF1aWNrIGJyb3duIGRvZyBqdW1wcyBvdmVyIHRoZSBsYXp5IGZveA=="

echo "OK"

main()

0 comments on commit fc5dd11

Please sign in to comment.