Merge pull request #3291 from yglukhov/nimvm-generic-fix

Fixed when nimvm in generics.
This commit is contained in:
Andreas Rumpf
2015-09-07 16:20:16 +02:00
3 changed files with 14 additions and 8 deletions

View File

@@ -124,6 +124,9 @@ proc semSym(c: PContext, n: PNode, s: PSym, flags: TExprFlags): PNode =
return newSymNode(u, n.info)
result = newSymNode(s, n.info)
of skVar, skLet, skResult, skForVar:
if s.magic == mNimvm:
localError(n.info, "illegal context for 'nimvm' magic")
markUsed(n.info, s)
styleCheckUse(n.info, s)
# if a proc accesses a global variable, it is not side effect free:
@@ -1769,9 +1772,14 @@ proc semWhen(c: PContext, n: PNode, semCheck = true): PNode =
# ...
# else:
# ...
let whenNimvm = n.sons.len == 2 and n.sons[0].kind == nkElifBranch and
n.sons[1].kind == nkElse and n.sons[0].sons[0].kind == nkIdent and
lookUp(c, n.sons[0].sons[0]).magic == mNimvm
var whenNimvm = false
if n.sons.len == 2 and n.sons[0].kind == nkElifBranch and
n.sons[1].kind == nkElse:
let exprNode = n.sons[0].sons[0]
if exprNode.kind == nkIdent:
whenNimvm = lookUp(c, exprNode).magic == mNimvm
elif exprNode.kind == nkSym:
whenNimvm = exprNode.sym.magic == mNimvm
for i in countup(0, sonsLen(n) - 1):
var it = n.sons[i]

View File

@@ -640,8 +640,6 @@ proc getConstExpr(m: PSym, n: PNode): PNode =
of mNaN: result = newFloatNodeT(NaN, n)
of mInf: result = newFloatNodeT(Inf, n)
of mNegInf: result = newFloatNodeT(NegInf, n)
of mNimvm:
localError(n.info, "illegal context for 'nimvm' magic")
else:
if sfFakeConst notin s.flags: result = copyTree(s.ast)
of {skProc, skMethod}:

View File

@@ -1173,12 +1173,12 @@ const
## "i386", "alpha", "powerpc", "powerpc64", "powerpc64el", "sparc",
## "amd64", "mips", "mipsel", "arm", "arm64".
nimvm* {.magic: "Nimvm".}: bool = false
seqShallowFlag = low(int)
let nimvm* {.magic: "Nimvm".}: bool = false
## may be used only in "when" expression.
## It is true in Nim VM context and false otherwise
seqShallowFlag = low(int)
proc compileOption*(option: string): bool {.
magic: "CompileOption", noSideEffect.}
## can be used to determine an on|off compile-time option. Example: