parent
faad6ed67f
commit
1e9ab3bb0a
3 changed files with 53 additions and 13 deletions
|
|
@ -961,18 +961,18 @@ proc genAddr(p: PProc, n: PNode, r: var TCompRes) =
|
|||
of nkCheckedFieldExpr:
|
||||
genCheckedFieldAddr(p, n, r)
|
||||
of nkDotExpr:
|
||||
genFieldAddr(p, n, r)
|
||||
genFieldAddr(p, n.sons[0], r)
|
||||
of nkBracketExpr:
|
||||
var ty = skipTypes(n.sons[0].typ, abstractVarRange)
|
||||
if ty.kind in {tyRef, tyPtr}: ty = skipTypes(ty.lastSon, abstractVarRange)
|
||||
case ty.kind
|
||||
of tyArray, tyArrayConstr, tyOpenArray, tySequence, tyString, tyCString,
|
||||
tyVarargs:
|
||||
genArrayAddr(p, n, r)
|
||||
tyVarargs, tyChar:
|
||||
genArrayAddr(p, n.sons[0], r)
|
||||
of tyTuple:
|
||||
genFieldAddr(p, n, r)
|
||||
else: internalError(n.info, "expr(nkBracketExpr, " & $ty.kind & ')')
|
||||
else: internalError(n.info, "genAddr")
|
||||
genFieldAddr(p, n.sons[0], r)
|
||||
else: internalError(n.sons[0].info, "expr(nkBracketExpr, " & $ty.kind & ')')
|
||||
else: internalError(n.sons[0].info, "genAddr")
|
||||
|
||||
proc genSym(p: PProc, n: PNode, r: var TCompRes) =
|
||||
var s = n.sym
|
||||
|
|
|
|||
|
|
@ -563,7 +563,11 @@ proc nimCopy(x: pointer, ti: PNimType): pointer =
|
|||
}
|
||||
"""
|
||||
of tyString:
|
||||
asm "`result` = `x`.slice(0);"
|
||||
asm """
|
||||
if (`x` !== null) {
|
||||
`result` = `x`.slice(0);
|
||||
}
|
||||
"""
|
||||
else:
|
||||
result = x
|
||||
|
||||
|
|
|
|||
36
tests/js/taddr.nim
Normal file
36
tests/js/taddr.nim
Normal 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'
|
||||
Loading…
Add table
Add a link
Reference in a new issue