summary refs log tree commit diff stats
path: root/tests/accept/compile/tnew.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/accept/compile/tnew.nim')
-rw-r--r--tests/accept/compile/tnew.nim49
1 files changed, 49 insertions, 0 deletions
diff --git a/tests/accept/compile/tnew.nim b/tests/accept/compile/tnew.nim
new file mode 100644
index 000000000..6527541a2
--- /dev/null
+++ b/tests/accept/compile/tnew.nim
@@ -0,0 +1,49 @@
+# Test the implementation of the new operator

+# and the code generation for gc walkers

+# (and the garbage collector):

+

+type

+  PNode = ref TNode

+  TNode = object

+    data: int

+    str: string

+    le, ri: PNode

+

+  TStressTest = ref array [0..45, array [1..45, TNode]]

+

+proc finalizer(n: PNode) =

+  write(stdout, n.data)

+  write(stdout, " is now freed\n")

+

+proc newNode(data: int, le, ri: PNode): PNode =

+  new(result, finalizer)

+  result.le = le

+  result.ri = ri

+  result.data = data

+

+# now loop and build a tree

+proc main() =

+  var

+    i = 0

+    p: TStressTest

+  while i < 1000:

+    var n: PNode

+

+    n = newNode(i, nil, newNode(i + 10000, nil, nil))

+    inc(i)

+  new(p)

+

+  write(stdout, "Simple tree node allocation worked!\n")

+  i = 0

+  while i < 1000:

+    var m = newNode(i + 20000, nil, nil)

+    var k = newNode(i + 30000, nil, nil)

+    m.le = m

+    m.ri = k

+    k.le = m

+    k.ri = k

+    inc(i)

+

+  write(stdout, "Simple cycle allocation worked!\n")

+

+main()