aboutsummaryrefslogtreecommitdiff
path: root/examples/vec.fwd
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2026-01-06 17:17:27 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2026-01-06 17:19:52 +0200
commit99601456e6ad4c86287ba786923c99c5499037e0 (patch)
tree7f834f015cfc5c14e695e0521ae31c4262254dba /examples/vec.fwd
parent64146b46da45ce69ab380add00459f7b60fe9196 (diff)
downloadfwd-99601456e6ad4c86287ba786923c99c5499037e0.tar.gz
fwd-99601456e6ad4c86287ba786923c99c5499037e0.zip
improve move checker to detect pointer leaksHEADmastergnc
+ Currently requires a lot of unnecessary `forget` statements, but at least some can likely be eliminated by doing some basic origin analysis, kind of like with groups
Diffstat (limited to 'examples/vec.fwd')
-rw-r--r--examples/vec.fwd28
1 files changed, 23 insertions, 5 deletions
diff --git a/examples/vec.fwd b/examples/vec.fwd
index f7838f1..22049e0 100644
--- a/examples/vec.fwd
+++ b/examples/vec.fwd
@@ -45,9 +45,17 @@ set_vec(vec v, i64 i, i64 e, (vec) ok)
{
v => [n => n, s => s, buf => buf];
buf + (n - 1 as u64) => nbuf;
- nil nbuf {fwdpanic("should never happen");} => dst;
+ nil nbuf {
+ nil nbuf;
+ fwdfree(buf);
+ fwdpanic("should never happen");
+ } => dst;
+
+ /* perform actual store */
e => dst*;
- ok([n => n, s => s, nbuf => buf] vec);
+
+ nil nbuf;
+ ok([n => n, s => s, buf => buf] vec);
}
n_vec(vec v, (vec, u64) ok)
@@ -67,9 +75,19 @@ append_vec(vec v, i64 e, (vec) ok)
at_vec(vec v, u64 i, (vec, &i64) ok)
{
v => [n => n, s => s, buf => buf];
- guard(i < n) => {fwdpanic("bounds error")} => ;
- fwdptradd(buf, (i * sizeof(i64)) as i64) => *i64 buf;
- nil buf {fwdpanic("should never happen");} => &i64 bufr;
+ guard(i < n) => {
+ fwdfree(buf);
+ fwdpanic("bounds error");
+ } => ;
+
+ buf + i => *i64 nbuf;
+ nil nbuf {
+ nil nbuf;
+ fwdfree(buf);
+ fwdpanic("should never happen");
+ } => &i64 bufr;
+
+ nil nbuf;
ok([n => n, s => s, buf => buf] vec, bufr);
}