rc-js-util
Version:
A collection of TS and C++ utilities to help writing performant and correct applications, achieved through strict typing and (removable) invariant checking.
46 lines (40 loc) • 1.29 kB
text/typescript
import { lifecycleStack } from "../web-assembly/emscripten/lifecycle-stack.js";
import { _Debug } from "../debug/_debug.js";
/**
* @public
* Any shared objects allocated in the callback will be released on return. By default, these will be released on throw too.
* In such event the error will be rethrown after releasing any shared objects.
*
* Error handling can be disabled by setting the build flag `WASM_DISABLE_STACK_LIFECYCLE_TRY_CATCH`.
*/
export function blockScope<TRet>
(
callback: () => TRet
)
: TRet
{
const blockScopedNode = lifecycleStack.push();
let ret: TRet | undefined;
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
if (_BUILD.WASM_DISABLE_STACK_LIFECYCLE_TRY_CATCH)
{
ret = callback();
blockScopedNode.getLinked().unlinkAll();
lifecycleStack.pop();
}
else
{
try
{
ret = callback();
}
finally
{
blockScopedNode.getLinked().unlinkAll();
lifecycleStack.pop();
}
}
// you need to be very careful about ordering... block scope probably isn't appropriate for this
_BUILD.DEBUG && _Debug.assert(!(ret instanceof Promise), "found promise, this is not supported");
return ret;
}