Skip to content

Commit 1231b1f

Browse files
committed
fix #14339: fixes limited VM support for addr
1 parent a8858eb commit 1231b1f

File tree

3 files changed

+87
-2
lines changed

3 files changed

+87
-2
lines changed

compiler/vm.nim

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -746,10 +746,13 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
746746
regs[ra].regAddr = addr(regs[rb])
747747
of opcAddrNode:
748748
decodeB(rkNodeAddr)
749-
if regs[rb].kind == rkNode:
749+
case regs[rb].kind
750+
of rkNode:
750751
regs[ra].nodeAddr = addr(regs[rb].node)
752+
of rkNodeAddr: # bug #14339
753+
regs[ra].nodeAddr = regs[rb].nodeAddr
751754
else:
752-
stackTrace(c, tos, pc, "limited VM support for 'addr'")
755+
stackTrace(c, tos, pc, "limited VM support for 'addr', got kind: " & $regs[rb].kind)
753756
of opcLdDeref:
754757
# a = b[]
755758
let ra = instr.regA

tests/misc/taddr.nim

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,16 @@ block:
135135
block: # pending bug #15959
136136
when false:
137137
proc byLent2[T](a: T): lent type(a[0]) = a[0]
138+
139+
block: # bug #14339
140+
type
141+
Node = ref object
142+
val: int
143+
proc bar(c: Node): var int =
144+
var n = c # was: Error: limited VM support for 'addr'
145+
c.val
146+
proc main =
147+
var a = Node()
148+
discard a.bar()
149+
static: main()
150+
main()

tests/stdlib/tcritbits.nim

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import std/[sequtils,critbits]
2+
3+
template main =
4+
var r: CritBitTree[void]
5+
r.incl "abc"
6+
r.incl "xyz"
7+
r.incl "def"
8+
r.incl "definition"
9+
r.incl "prefix"
10+
r.incl "foo"
11+
12+
doAssert r.contains"def"
13+
14+
r.excl "def"
15+
assert r.missingOrExcl("foo") == false
16+
assert "foo" notin toSeq(r.items)
17+
18+
assert r.missingOrExcl("foo") == true
19+
20+
assert toSeq(r.items) == @["abc", "definition", "prefix", "xyz"]
21+
22+
assert toSeq(r.itemsWithPrefix("de")) == @["definition"]
23+
var c = CritBitTree[int]()
24+
25+
c.inc("a")
26+
assert c["a"] == 1
27+
28+
c.inc("a", 4)
29+
assert c["a"] == 5
30+
31+
c.inc("a", -5)
32+
assert c["a"] == 0
33+
34+
c.inc("b", 2)
35+
assert c["b"] == 2
36+
37+
c.inc("c", 3)
38+
assert c["c"] == 3
39+
40+
c.inc("a", 1)
41+
assert c["a"] == 1
42+
43+
var cf = CritBitTree[float]()
44+
45+
cf.incl("a", 1.0)
46+
assert cf["a"] == 1.0
47+
48+
cf.incl("b", 2.0)
49+
assert cf["b"] == 2.0
50+
51+
cf.incl("c", 3.0)
52+
assert cf["c"] == 3.0
53+
54+
assert cf.len == 3
55+
cf.excl("c")
56+
assert cf.len == 2
57+
58+
var cb: CritBitTree[string]
59+
cb.incl("help", "help")
60+
for k in cb.keysWithPrefix("helpp"):
61+
doAssert false, "there is no prefix helpp"
62+
63+
block: # bug #14339
64+
var strings: CritBitTree[int]
65+
discard strings.containsOrIncl("foo", 3)
66+
doAssert strings["foo"] == 3
67+
68+
main()
69+
static: main()

0 commit comments

Comments
 (0)