parent
d4cae118dc
commit
abe07eb75d
6 changed files with 156 additions and 11 deletions
110
tests/vm/taddrof.nim
Normal file
110
tests/vm/taddrof.nim
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
discard """
|
||||
nimout: '''
|
||||
true
|
||||
true
|
||||
[nil, nil, nil, nil]
|
||||
[MyObjectRef(123, 321), nil, nil, nil]
|
||||
['A', '\x00', '\x00', '\x00']
|
||||
MyObjectRef(123, 321)
|
||||
(key: 8, val: 0)
|
||||
'''
|
||||
output: '''
|
||||
true
|
||||
true
|
||||
[nil, nil, nil, nil]
|
||||
[MyObjectRef(123, 321), nil, nil, nil]
|
||||
['A', '\x00', '\x00', '\x00']
|
||||
MyObjectRef(123, 321)
|
||||
'''
|
||||
"""
|
||||
|
||||
type
|
||||
MyObjectRef = ref object
|
||||
a,b: int
|
||||
|
||||
MyContainerObject = ref object
|
||||
member: MyObjectRef
|
||||
|
||||
MySuperContainerObject = ref object
|
||||
member: MyContainerObject
|
||||
arr: array[4, MyObjectRef]
|
||||
|
||||
MyOtherObject = ref object
|
||||
case kind: bool
|
||||
of true:
|
||||
member: MyObjectRef
|
||||
else:
|
||||
discard
|
||||
|
||||
proc `$`(arg: MyObjectRef): string =
|
||||
result = "MyObjectRef("
|
||||
result.addInt arg.a
|
||||
result.add ", "
|
||||
result.addInt arg.b
|
||||
result.add ")"
|
||||
|
||||
proc foobar(dst: var MyObjectRef) =
|
||||
dst = new(MyObjectRef)
|
||||
dst.a = 123
|
||||
dst.b = 321
|
||||
|
||||
proc changeChar(c: var char) =
|
||||
c = 'A'
|
||||
|
||||
proc test() =
|
||||
# when it comes from a var, it works
|
||||
var y: MyObjectRef
|
||||
foobar(y)
|
||||
echo y != nil
|
||||
# when it comes from a member, it fails on VM
|
||||
var x = new(MyContainerObject)
|
||||
foobar(x.member)
|
||||
echo x.member != nil
|
||||
|
||||
# when it comes from an array, it fails on VM
|
||||
var arr: array[4, MyObjectRef]
|
||||
echo arr
|
||||
foobar(arr[0])
|
||||
echo arr
|
||||
|
||||
var arr2: array[4, char]
|
||||
changeChar(arr2[0])
|
||||
echo arr2
|
||||
|
||||
|
||||
var z = MyOtherObject(kind: true)
|
||||
foobar(z.member)
|
||||
echo z.member
|
||||
|
||||
# this still doesn't work
|
||||
# var sc = new(MySuperContainerObject)
|
||||
# sc.member = new(MyContainerObject)
|
||||
# foobar(sc.member.member)
|
||||
# echo sc.member.member
|
||||
# foobar(sc.arr[1])
|
||||
# echo sc.arr
|
||||
|
||||
#var str = "---"
|
||||
#changeChar(str[1])
|
||||
#echo str
|
||||
|
||||
test()
|
||||
static:
|
||||
test()
|
||||
|
||||
type T = object
|
||||
f: seq[tuple[key, val: int]]
|
||||
|
||||
proc foo(s: var seq[tuple[key, val: int]]; i: int) =
|
||||
s[i].key = 4*i
|
||||
# r4 = addr(s[i])
|
||||
# r4[0] = 4*i
|
||||
|
||||
proc bar() =
|
||||
var s: T
|
||||
s.f = newSeq[tuple[key, val: int]](3)
|
||||
foo(s.f, 2)
|
||||
echo s.f[2]
|
||||
|
||||
static:
|
||||
bar()
|
||||
|
|
@ -42,7 +42,7 @@ proc getOrElse[T](o: Option[T], def: T): T =
|
|||
proc quoteStr(s: string): Option[string] =
|
||||
s.some.notEmpty.map(v => "`" & v & "`")
|
||||
|
||||
macro str(s: string): typed =
|
||||
macro str(s: string): void =
|
||||
let x = s.strVal
|
||||
let y = quoteStr(x)
|
||||
let sn = newStrLitNode(y.getOrElse("NONE"))
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ discard """
|
|||
# bug #3731
|
||||
var list {.compileTime.} = newSeq[int]()
|
||||
|
||||
macro calc*(): typed =
|
||||
macro calc*(): void =
|
||||
list.add(1)
|
||||
for c in list.mitems:
|
||||
c = 13
|
||||
|
|
@ -19,7 +19,7 @@ calc()
|
|||
|
||||
# bug #3859
|
||||
import macros
|
||||
macro m: typed =
|
||||
macro m: void =
|
||||
var s = newseq[NimNode](3)
|
||||
# var s: array[3,NimNode] # not working either
|
||||
for i in 0..<s.len: s[i] = newLit(3) # works
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue