summary refs log tree commit diff stats
path: root/tests/arc/topt_refcursors.nim
blob: c13d81badc1e049a66f432177c0963318ec397dd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
discard """
  output: ''''''
  cmd: '''nim c --gc:arc --expandArc:traverse --hint:Performance:off $file'''
  nimout: '''--expandArc: traverse

var
  it_cursor
  jt
try:
  it_cursor = root
  block :tmp:
    while (
      not (it_cursor == nil)):
      echo [it_cursor.s]
      it_cursor = it_cursor.ri
  `=copy`(jt, root)
  block :tmp_1:
    while (
      not (jt == nil)):
      var ri_1
      try:
        `=copy`(ri_1, jt.ri)
        echo [jt.s]
        `=sink`(jt, ri_1)
        wasMoved(ri_1)
      finally:
        `=destroy`(ri_1)
finally:
  `=destroy`(jt)
-- end of expandArc ------------------------'''
"""

type
  Node = ref object
    le, ri: Node
    s: string

proc traverse(root: Node) =
  var it = root
  while it != nil:
    echo it.s
    it = it.ri

  var jt = root
  while jt != nil:
    let ri = jt.ri
    echo jt.s
    jt = ri

traverse(nil)

# XXX: This optimization is not sound