Merge pull request #3232 from yglukhov/js-pointer-fix

JS: Untyped pointers codegen changed. addr expression fixed.
This commit is contained in:
Andreas Rumpf
2015-08-21 21:25:41 +02:00
4 changed files with 21 additions and 10 deletions

View File

@@ -136,7 +136,7 @@ proc mapType(typ: PType): TJSTypeKind =
result = etyBaseIndex
of tyPointer:
# treat a tyPointer like a typed pointer to an array of bytes
result = etyInt
result = etyBaseIndex
of tyRange, tyDistinct, tyOrdinal, tyConst, tyMutable, tyIter, tyProxy:
result = mapType(t.sons[0])
of tyInt..tyInt64, tyUInt..tyUInt64, tyEnum, tyChar: result = etyInt

View File

@@ -13,6 +13,8 @@
proc semAddr(c: PContext; n: PNode; isUnsafeAddr=false): PNode =
result = newNodeI(nkAddr, n.info)
let x = semExprWithType(c, n)
if x.kind == nkSym:
x.sym.flags.incl(sfAddrTaken)
if isAssignable(c, x, isUnsafeAddr) notin {arLValue, arLocalLValue}:
localError(n.info, errExprHasNoAddress)
result.add x

View File

@@ -532,15 +532,17 @@ proc nimMax(a, b: int): int {.compilerproc.} = return if a >= b: a else: b
type NimString = string # hack for hti.nim
include "system/hti"
type JSRef = int # Fake type.
proc isFatPointer(ti: PNimType): bool =
# This has to be consistent with the code generator!
return ti.base.kind notin {tyObject,
tyArray, tyArrayConstr, tyTuple,
tyOpenArray, tySet, tyVar, tyRef, tyPtr}
proc nimCopy(dest, src: pointer, ti: PNimType): pointer {.compilerproc.}
proc nimCopy(dest, src: JSRef, ti: PNimType): JSRef {.compilerproc.}
proc nimCopyAux(dest, src: pointer, n: ptr TNimNode) {.compilerproc.} =
proc nimCopyAux(dest, src: JSRef, n: ptr TNimNode) {.compilerproc.} =
case n.kind
of nkNone: sysAssert(false, "nimCopyAux")
of nkSlot:
@@ -562,7 +564,7 @@ proc nimCopyAux(dest, src: pointer, n: ptr TNimNode) {.compilerproc.} =
}
"""
proc nimCopy(dest, src: pointer, ti: PNimType): pointer =
proc nimCopy(dest, src: JSRef, ti: PNimType): JSRef =
case ti.kind
of tyPtr, tyRef, tyVar, tyNil:
if not isFatPointer(ti):
@@ -603,12 +605,11 @@ proc nimCopy(dest, src: pointer, ti: PNimType): pointer =
else:
result = src
proc genericReset(x: pointer, ti: PNimType): pointer {.compilerproc.} =
proc genericReset(x: JSRef, ti: PNimType): JSRef {.compilerproc.} =
asm "`result` = null;"
case ti.kind
of tyPtr, tyRef, tyVar, tyNil:
if not isFatPointer(ti):
result = nil
else:
if isFatPointer(ti):
asm """
`result` = [null, 0];
"""
@@ -633,9 +634,9 @@ proc genericReset(x: pointer, ti: PNimType): pointer {.compilerproc.} =
}
"""
else:
result = nil
discard
proc arrayConstr(len: int, value: pointer, typ: PNimType): pointer {.
proc arrayConstr(len: int, value: JSRef, typ: PNimType): JSRef {.
asmNoStackFrame, compilerproc.} =
# types are fake
asm """

View File

@@ -62,3 +62,11 @@ var t : tuple[a, b: int]
var pt = addr t[1]
pt[] = 123
doAssert(t.b == 123)
#block: # Test "untyped" pointer.
proc testPtr(p: pointer, a: int) =
doAssert(a == 5)
(cast[ptr int](p))[] = 124
var i = 123
testPtr(addr i, 5)
doAssert(i == 124)