diff options
Diffstat (limited to 'compiler/pragmas.nim')
-rw-r--r-- | compiler/pragmas.nim | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index d73494c6e..52eb46bf4 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -130,6 +130,7 @@ proc processImportCpp(s: PSym, extname: string) = excl(s.flags, sfForward) let m = s.getModule() incl(m.flags, sfCompileToCpp) + extccomp.gMixedMode = true proc processImportObjC(s: PSym, extname: string) = setExternName(s, extname) @@ -447,6 +448,9 @@ proc semAsmOrEmit*(con: PContext, n: PNode, marker: char): PNode = addSon(result, newSymNode(e)) else: addSon(result, newStrNode(nkStrLit, sub)) + else: + # an empty '``' produces a single '`' + addSon(result, newStrNode(nkStrLit, $marker)) if c < 0: break a = c + 1 else: illFormedAst(n) @@ -518,6 +522,28 @@ proc pragmaRaisesOrTags(c: PContext, n: PNode) = else: invalidPragma(n) +proc pragmaLockStmt(c: PContext; it: PNode) = + if it.kind != nkExprColonExpr: + invalidPragma(it) + else: + let n = it[1] + if n.kind != nkBracket: + localError(n.info, errGenerated, "locks pragma takes a list of expressions") + else: + for i in 0 .. <n.len: + n.sons[i] = c.semExpr(c, n.sons[i]) + +proc pragmaLocks(c: PContext, it: PNode): TLockLevel = + if it.kind != nkExprColonExpr: + invalidPragma(it) + else: + if it[1].kind != nkNilLit: + let x = expectIntLit(c, it) + if x < 0 or x > MaxLockLevel: + localError(it[1].info, "integer must be within 0.." & $MaxLockLevel) + else: + result = TLockLevel(x) + proc typeBorrow(sym: PSym, n: PNode) = if n.kind == nkExprColonExpr: let it = n.sons[1] @@ -807,6 +833,10 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: int, if sym == nil: invalidPragma(it) of wLine: pragmaLine(c, it) of wRaises, wTags: pragmaRaisesOrTags(c, it) + of wLocks: + if sym == nil: pragmaLockStmt(c, it) + elif sym.typ == nil: invalidPragma(it) + else: sym.typ.lockLevel = pragmaLocks(c, it) of wGuard: if sym == nil or sym.kind notin {skVar, skLet, skField}: invalidPragma(it) |