@@ -255,7 +255,7 @@ abstract final class $name {
255255
256256''' );
257257
258- // Listener block constructor is only available for void blocks.
258+ /// Listener block constructor is only available for void blocks.
259259 if (hasListener) {
260260 // This snippet is the same as the convFn above, except that the params
261261 // don't need to be retained because they've already been retained by
@@ -294,7 +294,16 @@ abstract final class $name {
294294 {bool keepIsolateAlive = true}) {
295295 final raw = $newClosureBlock ($listenerCallable .nativeFunction.cast(),
296296 $listenerConvFn , keepIsolateAlive);
297- final wrapper = $wrapListenerFn (raw);
297+
298+ dynamic wrapper;
299+ try {
300+ wrapper = $wrapListenerFn (raw);
301+ } catch (_) {
302+ $releaseFn (raw.cast());
303+ throw UnsupportedError('Failed to load native trampoline. '
304+ 'Ensure the generated .m file is linked.');
305+ }
306+
298307 $releaseFn (raw.cast());
299308 return $blockType (wrapper, retain: false, release: true);
300309 }
@@ -316,7 +325,17 @@ abstract final class $name {
316325 final rawListener = $newClosureBlock (
317326 $blockingListenerCallable .nativeFunction.cast(),
318327 $listenerConvFn , keepIsolateAlive);
319- final wrapper = $wrapBlockingFn (raw, rawListener, $objCContext );
328+
329+ dynamic wrapper;
330+ try {
331+ wrapper = $wrapBlockingFn (raw, rawListener, $objCContext );
332+ } catch (_) {
333+ $releaseFn (raw.cast());
334+ $releaseFn (rawListener.cast());
335+ throw UnsupportedError('Failed to load native trampoline. '
336+ 'Ensure the generated .m file is linked.');
337+ }
338+
320339 $releaseFn (raw.cast());
321340 $releaseFn (rawListener.cast());
322341 return $blockType (wrapper, retain: false, release: true);
0 commit comments