This commit is contained in:
Araq
2014-11-28 18:15:06 +01:00
parent 4def86f077
commit 51dd4b7601
2 changed files with 42 additions and 13 deletions

View File

@@ -113,7 +113,7 @@ proc rdLoc(a: TCompRes): PRope {.inline.} =
result = ropef("$1[$2]", a.address, a.res)
proc newProc(globals: PGlobals, module: BModule, procDef: PNode,
options: TOptions): PProc =
options: TOptions): PProc =
result = PProc(
blocks: @[],
options: options,
@@ -942,17 +942,14 @@ proc genAddr(p: PProc, n: PNode, r: var TCompRes) =
case s.kind
of skVar, skLet, skResult:
r.kind = resExpr
if mapType(n.typ) == etyObject:
if mapType(n.sons[0].typ) == etyObject:
# make addr() a no-op:
r.typ = etyNone
r.res = s.loc.r
r.address = nil
elif sfGlobal in s.flags:
# globals are always indirect accessible
r.typ = etyBaseIndex
r.address = toRope("Globals")
r.res = makeJSString(ropeToStr(s.loc.r))
elif sfAddrTaken in s.flags:
elif {sfGlobal, sfAddrTaken} * s.flags != {}:
# for ease of code generation, we do not distinguish between
# sfAddrTaken and sfGlobal.
r.typ = etyBaseIndex
r.address = s.loc.r
r.res = toRope("0")
@@ -981,7 +978,7 @@ proc genSym(p: PProc, n: PNode, r: var TCompRes) =
of skVar, skLet, skParam, skTemp, skResult:
if s.loc.r == nil:
internalError(n.info, "symbol has no generated name: " & s.name.s)
var k = mapType(s.typ)
let k = mapType(s.typ)
if k == etyBaseIndex:
r.typ = etyBaseIndex
if {sfAddrTaken, sfGlobal} * s.flags != {}:
@@ -990,7 +987,7 @@ proc genSym(p: PProc, n: PNode, r: var TCompRes) =
else:
r.address = s.loc.r
r.res = con(s.loc.r, "_Idx")
elif k != etyObject and sfAddrTaken in s.flags:
elif k != etyObject and {sfAddrTaken, sfGlobal} * s.flags != {}:
r.res = ropef("$1[0]", [s.loc.r])
else:
r.res = s.loc.r
@@ -1170,8 +1167,9 @@ proc createVar(p: PProc, typ: PType, indirect: bool): PRope =
internalError("createVar: " & $t.kind)
result = nil
proc isIndirect(v: PSym): bool =
result = (sfAddrTaken in v.flags) and (mapType(v.typ) != etyObject) and
proc isIndirect(v: PSym): bool =
result = {sfAddrTaken, sfGlobal} * v.flags != {} and
(mapType(v.typ) != etyObject) and
v.kind notin {skProc, skConverter, skMethod, skIterator, skClosureIterator}
proc genVarInit(p: PProc, v: PSym, n: PNode) =
@@ -1675,7 +1673,6 @@ proc newModule(module: PSym): BModule =
proc genHeader(): PRope =
result = ropef("/* Generated by the Nim Compiler v$1 */$n" &
"/* (c) 2014 Andreas Rumpf */$n$n" &
"$nvar Globals = this;$n" &
"var framePtr = null;$n" &
"var excHandler = null;$n" &
"var lastJSError = null;$n",

32
tests/js/tbyvar.nim Normal file
View File

@@ -0,0 +1,32 @@
discard """
output: '''foo 12
bar 12
2
foo 12
bar 12
2'''
"""
# bug #1489
proc foo(x: int) = echo "foo: ", x
proc bar(y: var int) = echo "bar: ", y
var x = 12
foo(x)
bar(x)
# bug #1490
var y = 1
y *= 2
echo y
proc main =
var x = 12
foo(x)
bar(x)
var y = 1
y *= 2
echo y
main()