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 ]
1010import stringviews
1111
1212const
@@ -77,29 +77,38 @@ template `-!`(a, b: pchar): int = cast[int](a) - cast[int](b)
7777
7878template `^` (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+
8085proc 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
9096proc 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
97103proc 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
172181proc 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
189198proc decodeFloat * (t: Token ): BiggestFloat =
190199 result = 0.0
@@ -495,7 +504,7 @@ proc startsWith*(r: Reader; prefix: string): bool =
495504 return false
496505
497506proc 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