aboutsummaryrefslogtreecommitdiff
path: root/tests/programs/share.zc
diff options
context:
space:
mode:
authorGravatar Moon Flower <moonflower@elhenney.local> 2026-10-12 08:46:23 +0330
committerGravatar Moon Flower <moonflower@elhenney.local> 2026-10-12 08:46:23 +0330
commitecc350ca5c2eb50be8309c5f14f8bf0d87db9a02 (patch)
tree70e0af76a1b13affff7c6cc8aac7b3e6ef960478 /tests/programs/share.zc
a
Diffstat (limited to 'tests/programs/share.zc')
-rw-r--r--tests/programs/share.zc34
1 files changed, 34 insertions, 0 deletions
diff --git a/tests/programs/share.zc b/tests/programs/share.zc
new file mode 100644
index 0000000..e9c381f
--- /dev/null
+++ b/tests/programs/share.zc
@@ -0,0 +1,34 @@
+// shared cons cells, a shared string, and a cycle. the collector reclaims
+// them once nothing points at them. free of a shared cell does nothing.
+fn main() {
+ let base = live_objects(), a, b, c, s, p, q, cyc, n, tri;
+ a = cons(1, 2);
+ b = cons(a, 3);
+ c = cons(a, 4);
+ put_n(car(a)); put_c(32);
+ put_n(cdr(a)); put_c(32);
+ put_n(car(car(b))); put_c(32);
+ put_n(cdr(c)); put_c(32);
+ put_n(car(b) == a); put_c(32);
+ put_n(is_shared(a)); put_c(32);
+ n = live_objects();
+ free(a);
+ put_n(live_objects() == n); put_c(32);
+ put_n(car(a)); put_c(32);
+ s = n_to_s(42);
+ p = cons(s, 0);
+ q = cons(s, 1);
+ put_n(s_to_n(car(p))); put_c(32);
+ put_n(car(p) == car(q)); put_c(32);
+ cyc = cons(0, 1);
+ cyc[0] = cyc;
+ put_n(cdr(cyc)); put_c(32);
+ put_n(car(cyc) == cyc); put_c(32);
+ tri = triple(5, 6, 7);
+ put_n(tget(tri, 1)); put_c(32);
+ a = 0; b = 0; c = 0; s = 0; p = 0; q = 0; cyc = 0; tri = 0;
+ scrub();
+ gc();
+ put_n(live_objects() - base); put_c(10);
+ return 0;
+}