Remove threads and gcsafe where parsing is used

This commit is contained in:
Emery Hemingway 2023-08-05 20:20:44 +01:00
parent 65cd9fa3e9
commit b563de9ac4
7 changed files with 12 additions and 10 deletions

View File

@ -1,6 +1,6 @@
# Package
version = "20230801"
version = "20230805"
author = "Emery Hemingway"
description = "data model and serialization format"
license = "Unlicense"

View File

@ -208,7 +208,7 @@ proc sortDict[E](pr: var Preserve[E]) =
sort(pr.dict) do (x, y: DictEntry[E]) -> int:
cmp(x.key, y.key)
proc cannonicalize*[E](pr: var Preserve[E]) {.gcsafe.} =
proc cannonicalize*[E](pr: var Preserve[E]) =
## Cannonicalize a compound Preserves value by total ordering.
case pr.kind
of pkSequence:
@ -848,7 +848,7 @@ template unpreservable*() {.pragma.}
## as its native type.
## Unpreservability is asserted at runtime.
proc toPreserve*[T](x: T; E = void): Preserve[E] =
proc toPreserve*[T](x: T; E = void): Preserve[E] {.gcsafe.} =
## Serializes ``x`` to Preserves. Can be customized by defining
## ``toPreserveHook(x: T; E: typedesc)`` in the calling scope.
## Any ``toPreserveHook`` that does not compile will be discarded;
@ -981,7 +981,7 @@ func containsNativeEmbeds[E](pr: Preserve[E]): bool =
elif pr.kind == pkEmbedded:
result = true
proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool =
proc fromPreserve*[T, E](v: var T; pr: Preserve[E]): bool {.gcsafe.} =
## Inplace version of `preserveTo`. Returns ``true`` on
## a complete match, otherwise returns ``false``.
## Can be customized with `fromPreserveHook[E](x: T; var pr: Preserve[E]): bool`.
@ -1327,7 +1327,7 @@ proc mapEmbeds*[A, B](pr: sink Preserve[A]; op: proc (v: A): B): Preserve[B] =
result = embed op(pr.embed)
cannonicalize(result)
proc contract*[E](pr: sink Preserve[E]; op: proc (v: E): Preserve[void]): Preserve[void] =
proc contract*[E](pr: sink Preserve[E]; op: proc (v: E): Preserve[void] {.gcsafe.}): Preserve[void] {.gcsafe.} =
## Convert `Preserve[E]` to `Preserve[void]` using an `E → Preserve[void]` procedure.
if not pr.embedded:
case pr.kind
@ -1353,7 +1353,7 @@ proc contract*[E](pr: sink Preserve[E]; op: proc (v: E): Preserve[void]): Preser
result = embed op(pr.embed)
cannonicalize(result)
proc expand*[E](pr: sink Preserve[void]; op: proc (v: Preserve[void]): Preserve[E]): Preserve[E] =
proc expand*[E](pr: sink Preserve[void]; op: proc (v: Preserve[void]): Preserve[E] {.gcsafe.}): Preserve[E] {.gcsafe.} =
## Convert `Preserve[void]` to `Preserve[E]` using an `Preserve[void] → Preserve[E]` procedure.
if pr.embedded:
result = op(pr)

View File

@ -28,7 +28,7 @@ proc toPreserveHook*(js: JsonNode; E: typedesc): Preserve[E] =
for i, e in js.elems:
result.sequence[i] = toPreserveHook(e, E)
proc fromPreserveHook*[E](js: var JsonNode; prs: Preserve[E]): bool {.gcsafe.} =
proc fromPreserveHook*[E](js: var JsonNode; prs: Preserve[E]): bool =
runnableExamples:
import std/json
var js = JsonNode()

View File

@ -0,0 +1 @@
threads:off

View File

@ -78,7 +78,7 @@ template unescape(buf: var seq[byte]; capture: string) =
add(buf, byte capture[i])
inc(i)
proc parsePreserves*(text: string): Preserve[void] {.gcsafe.} =
proc parsePreserves*(text: string): Preserve[void] =
## Parse a text-encoded Preserves `string` to a `Preserve` value.
runnableExamples:
assert parsePreserves"[ 1 2 3 ]" == [ 1, 2, 3 ].toPreserve
@ -184,7 +184,7 @@ proc parsePreserves*(text: string): Preserve[void] {.gcsafe.} =
assert(stack.len == 1)
stack.pop.value
proc parsePreserves*(text: string; E: typedesc): Preserve[E] {.gcsafe.} =
proc parsePreserves*(text: string; E: typedesc): Preserve[E] =
## Parse a text-encoded Preserves `string` to a `Preserve[E]` value for embedded type `E`.
when E is void: parsePreserves(text)
else: mapEmbeds(parsePreserves(text), E)

View File

@ -59,7 +59,7 @@ template pushStack(n: Value) =
proc toSymbolLit(s: string): Value =
initRecord[void](toSymbol"lit", toSymbol s)
proc match(text: string; p: var ParseState) {.gcsafe.}
proc match(text: string; p: var ParseState)
const parser = peg("Schema", p: ParseState):

View File

@ -0,0 +1 @@
threads:off