@@ -323,27 +323,6 @@ impl Bridge<'_> {
323
323
} )
324
324
}
325
325
326
- fn enter < R > ( self , f : impl FnOnce ( ) -> R ) -> R {
327
- let force_show_panics = self . force_show_panics ;
328
- // Hide the default panic output within `proc_macro` expansions.
329
- // NB. the server can't do this because it may use a different libstd.
330
- static HIDE_PANICS_DURING_EXPANSION : Once = Once :: new ( ) ;
331
- HIDE_PANICS_DURING_EXPANSION . call_once ( || {
332
- let prev = panic:: take_hook ( ) ;
333
- panic:: set_hook ( Box :: new ( move |info| {
334
- let show = BridgeState :: with ( |state| match state {
335
- BridgeState :: NotConnected => true ,
336
- BridgeState :: Connected ( _) | BridgeState :: InUse => force_show_panics,
337
- } ) ;
338
- if show {
339
- prev ( info)
340
- }
341
- } ) ) ;
342
- } ) ;
343
-
344
- BRIDGE_STATE . with ( |state| state. set ( BridgeState :: Connected ( self ) , f) )
345
- }
346
-
347
326
fn with < R > ( f : impl FnOnce ( & mut Bridge < ' _ > ) -> R ) -> R {
348
327
BridgeState :: with ( |state| match state {
349
328
BridgeState :: NotConnected => {
@@ -388,7 +367,6 @@ impl<I, O> Clone for Client<I, O> {
388
367
389
368
/// Client-side helper for handling client panics, entering the bridge,
390
369
/// deserializing input and serializing output.
391
- // FIXME(eddyb) maybe replace `Bridge::enter` with this?
392
370
fn run_client < A : for < ' a , ' s > DecodeMut < ' a , ' s , ( ) > , R : Encode < ( ) > > (
393
371
mut bridge : Bridge < ' _ > ,
394
372
f : impl FnOnce ( A ) -> R ,
@@ -397,29 +375,48 @@ fn run_client<A: for<'a, 's> DecodeMut<'a, 's, ()>, R: Encode<()>>(
397
375
let mut buf = bridge. cached_buffer . take ( ) ;
398
376
399
377
panic:: catch_unwind ( panic:: AssertUnwindSafe ( || {
400
- bridge. enter ( || {
401
- let reader = & mut & buf[ ..] ;
402
- let input = A :: decode ( reader, & mut ( ) ) ;
403
-
404
- // Put the `cached_buffer` back in the `Bridge`, for requests.
405
- Bridge :: with ( |bridge| bridge. cached_buffer = buf. take ( ) ) ;
406
-
407
- let output = f ( input) ;
408
-
409
- // Take the `cached_buffer` back out, for the output value.
410
- buf = Bridge :: with ( |bridge| bridge. cached_buffer . take ( ) ) ;
411
-
412
- // HACK(eddyb) Separate encoding a success value (`Ok(output)`)
413
- // from encoding a panic (`Err(e: PanicMessage)`) to avoid
414
- // having handles outside the `bridge.enter(|| ...)` scope, and
415
- // to catch panics that could happen while encoding the success.
416
- //
417
- // Note that panics should be impossible beyond this point, but
418
- // this is defensively trying to avoid any accidental panicking
419
- // reaching the `extern "C"` (which should `abort` but might not
420
- // at the moment, so this is also potentially preventing UB).
421
- buf. clear ( ) ;
422
- Ok :: < _ , ( ) > ( output) . encode ( & mut buf, & mut ( ) ) ;
378
+ let force_show_panics = bridge. force_show_panics ;
379
+ // Hide the default panic output within `proc_macro` expansions.
380
+ // NB. the server can't do this because it may use a different libstd.
381
+ static HIDE_PANICS_DURING_EXPANSION : Once = Once :: new ( ) ;
382
+ HIDE_PANICS_DURING_EXPANSION . call_once ( || {
383
+ let prev = panic:: take_hook ( ) ;
384
+ panic:: set_hook ( Box :: new ( move |info| {
385
+ let show = BridgeState :: with ( |state| match state {
386
+ BridgeState :: NotConnected => true ,
387
+ BridgeState :: Connected ( _) | BridgeState :: InUse => force_show_panics,
388
+ } ) ;
389
+ if show {
390
+ prev ( info)
391
+ }
392
+ } ) ) ;
393
+ } ) ;
394
+
395
+ BRIDGE_STATE . with ( |state| {
396
+ state. set ( BridgeState :: Connected ( bridge) , || {
397
+ let reader = & mut & buf[ ..] ;
398
+ let input = A :: decode ( reader, & mut ( ) ) ;
399
+
400
+ // Put the `cached_buffer` back in the `Bridge`, for requests.
401
+ Bridge :: with ( |bridge| bridge. cached_buffer = buf. take ( ) ) ;
402
+
403
+ let output = f ( input) ;
404
+
405
+ // Take the `cached_buffer` back out, for the output value.
406
+ buf = Bridge :: with ( |bridge| bridge. cached_buffer . take ( ) ) ;
407
+
408
+ // HACK(eddyb) Separate encoding a success value (`Ok(output)`)
409
+ // from encoding a panic (`Err(e: PanicMessage)`) to avoid
410
+ // having handles outside the `bridge.enter(|| ...)` scope, and
411
+ // to catch panics that could happen while encoding the success.
412
+ //
413
+ // Note that panics should be impossible beyond this point, but
414
+ // this is defensively trying to avoid any accidental panicking
415
+ // reaching the `extern "C"` (which should `abort` but might not
416
+ // at the moment, so this is also potentially preventing UB).
417
+ buf. clear ( ) ;
418
+ Ok :: < _ , ( ) > ( output) . encode ( & mut buf, & mut ( ) ) ;
419
+ } )
423
420
} )
424
421
} ) )
425
422
. map_err ( PanicMessage :: from)
0 commit comments