This commit is contained in:
Dominik Picheta 2015-03-15 22:06:26 +00:00
commit 1e9ab3bb0a
3 changed files with 53 additions and 13 deletions

View file

@ -961,18 +961,18 @@ proc genAddr(p: PProc, n: PNode, r: var TCompRes) =
of nkCheckedFieldExpr: of nkCheckedFieldExpr:
genCheckedFieldAddr(p, n, r) genCheckedFieldAddr(p, n, r)
of nkDotExpr: of nkDotExpr:
genFieldAddr(p, n, r) genFieldAddr(p, n.sons[0], r)
of nkBracketExpr: of nkBracketExpr:
var ty = skipTypes(n.sons[0].typ, abstractVarRange) var ty = skipTypes(n.sons[0].typ, abstractVarRange)
if ty.kind in {tyRef, tyPtr}: ty = skipTypes(ty.lastSon, abstractVarRange) if ty.kind in {tyRef, tyPtr}: ty = skipTypes(ty.lastSon, abstractVarRange)
case ty.kind case ty.kind
of tyArray, tyArrayConstr, tyOpenArray, tySequence, tyString, tyCString, of tyArray, tyArrayConstr, tyOpenArray, tySequence, tyString, tyCString,
tyVarargs: tyVarargs, tyChar:
genArrayAddr(p, n, r) genArrayAddr(p, n.sons[0], r)
of tyTuple: of tyTuple:
genFieldAddr(p, n, r) genFieldAddr(p, n.sons[0], r)
else: internalError(n.info, "expr(nkBracketExpr, " & $ty.kind & ')') else: internalError(n.sons[0].info, "expr(nkBracketExpr, " & $ty.kind & ')')
else: internalError(n.info, "genAddr") else: internalError(n.sons[0].info, "genAddr")
proc genSym(p: PProc, n: PNode, r: var TCompRes) = proc genSym(p: PProc, n: PNode, r: var TCompRes) =
var s = n.sym var s = n.sym

View file

@ -563,7 +563,11 @@ proc nimCopy(x: pointer, ti: PNimType): pointer =
} }
""" """
of tyString: of tyString:
asm "`result` = `x`.slice(0);" asm """
if (`x` !== null) {
`result` = `x`.slice(0);
}
"""
else: else:
result = x result = x

36
tests/js/taddr.nim Normal file
View file

@ -0,0 +1,36 @@
type T = object
x: int
s: string
var obj: T
var fieldAddr = addr(obj.x)
var objAddr = addr(obj)
# Integer tests
var field = fieldAddr[]
doAssert field == 0
var objDeref = objAddr[]
doAssert objDeref.x == 0
# Change value
obj.x = 42
doAssert field == 0
doAssert objDeref.x == 0
field = fieldAddr[]
objDeref = objAddr[]
doAssert field == 42
doAssert objDeref.x == 42
# String tests
obj.s = "lorem ipsum dolor sit amet"
var indexAddr = addr(obj.s[2])
doAssert indexAddr[] == '4'
indexAddr[] = 'd'
doAssert indexAddr[] == 'd'