diff options
Diffstat (limited to 'docs/history/10-zc/code/tests/umd.zc')
| -rw-r--r-- | docs/history/10-zc/code/tests/umd.zc | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/docs/history/10-zc/code/tests/umd.zc b/docs/history/10-zc/code/tests/umd.zc new file mode 100644 index 0000000..7d1bffc --- /dev/null +++ b/docs/history/10-zc/code/tests/umd.zc @@ -0,0 +1,52 @@ +// lists as [len, items...], items owned by the list +fn mklist(n) -> u +{ + var l = new(n + 1); + l[0] = 0; + return l as u; +} +fn push(m l, d item) { l[l[0] + 1] = item as d; l[0] = l[0] + 1; return 0; } +fn sum(m l) { var s = 0, i = 1; while (i <= l[0]) { s += l[i][0]; i++; } return s; } +fn box(v) -> u { var b = new(1); b[0] = v; return b as u; } +fn consume(d b) { return b[0]; } + +fn main() +{ + var base = live_objects(); + { + var l = mklist(8); // u from mklist arrives here as m + var i = 0; + while (i < 5) { + var b = box(i * 10); // m in the loop body + b as d; // give it down + push(l, b); + i++; + } + putn(sum(l)); putc(' '); + putn(live_objects() - base); putc(' '); // list + 5 boxes + } + putn(live_objects() - base); putc(' '); // freed at the block's end, children too + + // u handed up one block by assignment, and as a block value + var outer; + { + var t = box(7); + t as u; + outer = t; + } + var v = { var w = box(8); w as u }; + putn(outer[0] + v[0]); putc(' '); + + // d given away to a callee + var g = box(99); + putn(consume(g as d)); putc(' '); + + // containers: child takes its parent's tag + var p = new(2), c = new(1); + c[0] = 5; + p[0] = c; + p[1] = new(3); + putn(p[0][0]); putc(' '); + putn(live_objects() - base); putc(10); + return 0; +} |
