Skip to content

Commit 97ce90f

Browse files
authored
fixes nifreader so that Nimony can compile it (#1213)
1 parent 2ea1b22 commit 97ce90f

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

src/lib/nifreader.nim

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
## High performance ("zero copies") NIF file reader.
88

9-
import std / [memfiles, tables, parseutils, assertions]
9+
import std / [memfiles, tables, parseutils, assertions, syncio, hashes]
1010
import stringviews
1111

1212
const
@@ -77,29 +77,38 @@ template `-!`(a, b: pchar): int = cast[int](a) - cast[int](b)
7777

7878
template `^`(p: pchar): char = p[0]
7979

80+
when not defined(nimony):
81+
proc rawData*(s: var string): ptr UncheckedArray[char] {.inline.} =
82+
assert s.len > 0
83+
cast[ptr UncheckedArray[char]](addr s[0])
84+
8085
proc open*(filename: string): Reader =
8186
let f = try:
8287
memfiles.open(filename)
8388
except:
84-
when defined(debug): writeStackTrace()
89+
when defined(debug) and not defined(nimony): writeStackTrace()
8590
quit "[Error] cannot open: " & filename
91+
default MemFile
8692
result = Reader(f: f, p: nil)
8793
result.p = cast[pchar](result.f.mem)
8894
result.eof = result.p +! result.f.size
8995

9096
proc openFromBuffer*(buf: sink string): Reader =
9197
result = Reader(f: default(MemFile), buf: ensureMove buf)
92-
result.p = cast[pchar](addr result.buf[0])
98+
result.p = rawData result.buf
9399
result.eof = result.p +! result.buf.len
94100
result.f.mem = result.p
95101
result.f.size = result.buf.len
96102

97103
proc close*(r: var Reader) =
98104
close r.f
99105

100-
template useCpuRegisters(body) {.dirty.} =
101-
var p = r.p # encourage the code generator to use a register for this.
102-
let eof = r.eof
106+
when not defined(nimony):
107+
{.pragma: untyped.}
108+
109+
template useCpuRegisters(body: untyped) {.untyped.} =
110+
var p {.inject.} = r.p # encourage the code generator to use a register for this.
111+
let eof {.inject.} = r.eof
103112
body
104113
r.p = p # store back
105114

@@ -167,7 +176,7 @@ proc decodeStr*(t: Token): string =
167176
else:
168177
result = newString(t.s.len)
169178
if t.s.len > 0:
170-
copyMem(addr result[0], t.s.p, t.s.len)
179+
copyMem(rawData result, t.s.p, t.s.len)
171180

172181
proc decodeFilename*(t: Token): string =
173182
if FilenameHasEscapes in t.flags:
@@ -184,7 +193,7 @@ proc decodeFilename*(t: Token): string =
184193
inc p
185194
else:
186195
result = newString(t.filename.len)
187-
copyMem(addr result[0], t.filename.p, t.filename.len)
196+
copyMem(rawData result, t.filename.p, t.filename.len)
188197

189198
proc decodeFloat*(t: Token): BiggestFloat =
190199
result = 0.0
@@ -495,7 +504,7 @@ proc startsWith*(r: Reader; prefix: string): bool =
495504
return false
496505

497506
proc processDirectives*(r: var Reader): DirectivesResult =
498-
template handleSubstitutionPair(r: var Reader; valid: set[NifKind]; subs: typed) =
507+
template handleSubstitutionPair(r: var Reader; valid: set[NifKind]; subs: Table[StringView, (NifKind, StringView)]) =
499508
if r.p < r.eof and ^r.p in ControlCharsOrWhite:
500509
let key = next(r)
501510
if key.tk == Ident:

0 commit comments

Comments
 (0)