Comment by srcreigh
6 days ago
It's worth every effort to avoid situations where a function creates extra clean up responsibilities to the caller only on error conditions.
If I really needed a large error payload, too big to fit on the stack, I'd probably want to do something like this:
const errbuf = try alloc.alloc(u8, 1024*1024*1024);
module.setErrorBuf(&errbuf)
defer {
module.setErrorBuf(null);
alloc.free(errbuf);
}
var func_diag = diagnostics.OfFunction(module.func){};
module.func(foo, bar, &func_diag) catch |err| switch (err) {
error.BigPayload => {
const payload = func_diag.get(error.BigPayload);
// The payload can reference the 1MiB of data safely here,
// and it's cleaned up automatically.
}
}
No comments yet
Contribute on Hacker News ↗