template+emit supports volatileRead and volatileWrite ops

This commit is contained in:
Andreas Rumpf
2017-01-23 11:22:14 +01:00
parent 93068f1ba6
commit d651012688
3 changed files with 26 additions and 4 deletions

View File

@@ -973,6 +973,8 @@ proc genAsmOrEmitStmt(p: BProc, t: PNode, isAsmStmt=false): Rope =
r = mangleName(p.module, sym)
sym.loc.r = r # but be consequent!
res.add($r)
of nkTypeOfExpr:
res.add($getTypeDesc(p.module, t.sons[i].typ))
else:
var a: TLoc
initLocExpr(p, t.sons[i], a)

View File

@@ -445,7 +445,9 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode =
of nkPostfix:
result.sons[1] = semTemplBody(c, n.sons[1])
of nkPragma:
result = onlyReplaceParams(c, n)
for x in n:
if x.kind == nkExprColonExpr:
x.sons[1] = semTemplBody(c, x.sons[1])
of nkBracketExpr:
result = newNodeI(nkCall, n.info)
result.add newIdentNode(getIdent("[]"), n.info)

View File

@@ -1,15 +1,16 @@
discard """
output: '''HELLO WORLD
c_func'''
c_func
12'''
"""
import macros, strutils
emit("echo " & '"' & "hello world".toUpper & '"')
emit("echo " & '"' & "hello world".toUpperAscii & '"')
# bug #1025
macro foo(icname): stmt =
macro foo(icname): untyped =
let ic = newStrLitNode($icname)
result = quote do:
proc x* =
@@ -19,3 +20,20 @@ macro foo(icname): stmt =
foo(c_func)
x()
template volatileLoad[T](x: ptr T): T =
var res: T
{.emit: [res, " = (*(", type(x[]), " volatile*)", x, ");"].}
res
template volatileStore[T](x: ptr T; y: T) =
{.emit: ["*((", type(x[]), " volatile*)(", x, ")) = ", y, ";"].}
proc main =
var st: int
var foo: ptr int = addr st
volatileStore(foo, 12)
echo volatileLoad(foo)
main()