Skip to content

Commit 3811b4d

Browse files
committed
Handle missing Objective-C block bindings
1 parent 5103ef3 commit 3811b4d

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

pkgs/ffigen/lib/src/code_generator/objc_block.dart

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)