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:
|
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
|
||||||
|
|
|
||||||
|
|
@ -322,10 +322,10 @@ when defined(kwin):
|
||||||
}
|
}
|
||||||
print(buf);
|
print(buf);
|
||||||
"""
|
"""
|
||||||
|
|
||||||
elif defined(nodejs):
|
elif defined(nodejs):
|
||||||
proc ewriteln(x: cstring) = log(x)
|
proc ewriteln(x: cstring) = log(x)
|
||||||
|
|
||||||
proc rawEcho {.compilerproc, asmNoStackFrame.} =
|
proc rawEcho {.compilerproc, asmNoStackFrame.} =
|
||||||
asm """
|
asm """
|
||||||
var buf = "";
|
var buf = "";
|
||||||
|
|
@ -339,12 +339,12 @@ else:
|
||||||
var
|
var
|
||||||
document {.importc, nodecl.}: ref TDocument
|
document {.importc, nodecl.}: ref TDocument
|
||||||
|
|
||||||
proc ewriteln(x: cstring) =
|
proc ewriteln(x: cstring) =
|
||||||
var node = document.getElementsByTagName("body")[0]
|
var node = document.getElementsByTagName("body")[0]
|
||||||
if node != nil:
|
if node != nil:
|
||||||
node.appendChild(document.createTextNode(x))
|
node.appendChild(document.createTextNode(x))
|
||||||
node.appendChild(document.createElement("br"))
|
node.appendChild(document.createElement("br"))
|
||||||
else:
|
else:
|
||||||
raise newException(ValueError, "<body> element does not exist yet!")
|
raise newException(ValueError, "<body> element does not exist yet!")
|
||||||
|
|
||||||
proc rawEcho {.compilerproc.} =
|
proc rawEcho {.compilerproc.} =
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
@ -679,7 +683,7 @@ proc nimParseBiggestFloat(s: string, number: var BiggestFloat, start = 0): int {
|
||||||
if s[i] == 'I' or s[i] == 'i':
|
if s[i] == 'I' or s[i] == 'i':
|
||||||
if s[i+1] == 'N' or s[i+1] == 'n':
|
if s[i+1] == 'N' or s[i+1] == 'n':
|
||||||
if s[i+2] == 'F' or s[i+2] == 'f':
|
if s[i+2] == 'F' or s[i+2] == 'f':
|
||||||
if s[i+3] notin IdentChars:
|
if s[i+3] notin IdentChars:
|
||||||
number = Inf*sign
|
number = Inf*sign
|
||||||
return i+3 - start
|
return i+3 - start
|
||||||
return 0
|
return 0
|
||||||
|
|
|
||||||
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