diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..df4436b8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "vendor/mimalloc"] + path = vendor/mimalloc + url = https://github.com/microsoft/mimalloc diff --git a/lib/std/system/mimalloc.nim b/lib/std/system/mimalloc.nim new file mode 100644 index 00000000..2b16c155 --- /dev/null +++ b/lib/std/system/mimalloc.nim @@ -0,0 +1,23 @@ +{.compile("../../../vendor/mimalloc/src/static.c", "-Ivendor/mimalloc/include").} + +type + csize_t* {.importc: "size_t", nodecl.} = uint + +proc mi_malloc(size: csize_t): pointer {.importc: "mi_malloc".} +proc mi_calloc(nmemb: csize_t, size: csize_t): pointer {.importc: "mi_calloc".} +proc mi_realloc(pt: pointer, size: csize_t): pointer {.importc: "mi_realloc".} +proc mi_free(p: pointer) {.importc: "mi_free".} + +proc mi_usable_size(p: pointer): csize_t {.importc: "mi_usable_size".} + +proc alloc*(size: int): pointer = + result = mi_malloc(size.csize_t) + +proc realloc*(p: pointer; size: int): pointer = + result = mi_realloc(p, size.csize_t) + +proc dealloc*(p: pointer) = + mi_free(p) + +proc allocatedSize*(p: pointer): int = + result = int mi_usable_size(p) diff --git a/src/hexer/expander.nim b/src/hexer/expander.nim index 9dfc1764..e6748057 100644 --- a/src/hexer/expander.nim +++ b/src/hexer/expander.nim @@ -466,7 +466,13 @@ proc parsePragmas(e: var EContext; c: var Cursor): CollectedPragmas = error e, "expected string literal or ident, but got: ", c result.flags.incl Nodecl inc c - of ImportC, ImportCpp, ExportC, Plugin: + of ImportC, ImportCpp: + inc c + expectStrLit e, c + result.externName = pool.strings[c.litId] + result.flags.incl pk + inc c + of ExportC, Plugin: inc c expectStrLit e, c result.externName = pool.strings[c.litId] @@ -479,6 +485,7 @@ proc parsePragmas(e: var EContext; c: var Cursor): CollectedPragmas = inc c expectStrLit e, c result.header = c.litId + result.flags.incl Nodecl inc c of Align: inc c @@ -610,6 +617,10 @@ proc traverseProc(e: var EContext; c: var Cursor; mode: TraverseMode) = swap dst, e.dest if Nodecl in prag.flags or isGeneric: discard "do not add to e.dest" + elif prag.flags * {ImportC, ImportCpp} != {}: + e.dest.add tagToken("imp", c.info) + e.dest.add dst + e.dest.addParRi() else: e.dest.add dst if prag.header != StrId(0): @@ -1082,6 +1093,8 @@ proc traverseStmt(e: var EContext; c: var Cursor; mode = TraverseAll) = traverseTypeDecl e, c of ContinueS, WhenS: error e, "unreachable: ", c + of PragmasLineS: + skip c of ClonerS, TracerS, DisarmerS, MoverS, DtorS: skip c else: diff --git a/src/hexer/xelim.nim b/src/hexer/xelim.nim index d5657561..0868f68b 100644 --- a/src/hexer/xelim.nim +++ b/src/hexer/xelim.nim @@ -357,7 +357,8 @@ proc trStmt(c: var Context; dest: var TokenBuf; n: var Cursor) = trBlock c, dest, n, tar of IterS, TemplateS, TypeS, EmitS, BreakS, ContinueS, ForS, CmdS, IncludeS, ImportS, FromImportS, ImportExceptS, - ExportS, CommentS, ClonerS, TracerS, DisarmerS, MoverS, DtorS: + ExportS, CommentS, ClonerS, TracerS, DisarmerS, MoverS, DtorS, + PragmasLineS: takeTree dest, n of StmtsS: copyInto(dest, n): diff --git a/src/nifler/bridge.nim b/src/nifler/bridge.nim index 57420874..753d97c4 100644 --- a/src/nifler/bridge.nim +++ b/src/nifler/bridge.nim @@ -149,6 +149,68 @@ proc addFloatLit*(b: var Builder; u: BiggestFloat; suffix: string) = b.addFloatLit u b.addStrLit suffix +proc toNif*(n, parent: PNode; c: var TranslationContext) + +proc compilePathToNif(n, parent: PNode; info: TLineInfo; c: var TranslationContext) = + var modulePath = toFullPath(c.conf, info.fileIndex) + case n.kind + of nkStrLit, nkRStrLit, nkTripleStrLit: + let cfile = n.strVal + if isAbsolute(cfile): + toNif(n, parent, c) + else: + var path = parentDir(modulePath) / cfile + relLineInfo(n, parent, c) + c.b.addStrLit(path) + else: + toNif(n, parent, c) + +proc handleCompileDeps(n: PNode, child: PNode; isCall: bool; hasCompile: var bool; c: var TranslationContext) = + if child.len > 0 and child[0].kind == nkIdent and + child[0].ident.s == "compile": + if not hasCompile: + c.deps.addTree(nodeKindTranslation(n.kind)) + hasCompile = true + + let oldLineInfoEnabled = c.lineInfoEnabled + c.lineInfoEnabled = false + let oldDepsEnabled = c.depsEnabled + swap c.b, c.deps + c.depsEnabled = false + + c.b.addTree("kv") + if isCall: + if child.len == 3: + toNif(child[0], child, c) + c.b.addTree("tup") + compilePathToNif(child[1], child, n.info, c) + c.b.addStrLit("") + toNif(child[2], child, c) + c.b.endTree() + elif child.len == 2: + # format (file, obj, customArgs) + toNif(child[0], child, c) + c.b.addTree("tup") + + case child[1].kind + of nkStrLit, nkRStrLit, nkTripleStrLit: + compilePathToNif(child[1], child, n.info, c) + c.b.addStrLit("") + of nkTupleConstr: + let tup = child[1] + if tup.len == 2: + compilePathToNif(tup[0], tup, n.info, c) + toNif(tup[1], tup, c) + else: + discard + c.b.addStrLit("") + c.b.endTree() + c.b.endTree() + + c.depsEnabled = oldDepsEnabled + swap c.b, c.deps + c.lineInfoEnabled = oldLineInfoEnabled + proc toNif*(n, parent: PNode; c: var TranslationContext) = case n.kind of nkNone, nkEmpty: @@ -594,6 +656,27 @@ proc toNif*(n, parent: PNode; c: var TranslationContext) = toNif(n[i], n, c) c.b.endTree() c.depsEnabled = oldDepsEnabled + of nkPragma: + if c.depsEnabled: + var hasCompile = false + for i in 0..