@@ -840,12 +840,24 @@ impl ExecutingFrame<'_> {
840840 }
841841 bytecode:: Instruction :: SetupWith { end } => {
842842 let context_manager = self . pop_value ( ) ;
843- let enter_res = vm. call_special_method (
844- context_manager. clone ( ) ,
845- identifier ! ( vm, __enter__) ,
846- ( ) ,
847- ) ?;
848- let exit = context_manager. get_attr ( identifier ! ( vm, __exit__) , vm) ?;
843+ let error_string = || -> String {
844+ format ! (
845+ "'{:.200}' object does not support the context manager protocol" ,
846+ context_manager. class( ) . name( ) ,
847+ )
848+ } ;
849+ let enter_res = vm
850+ . get_special_method ( context_manager. clone ( ) , identifier ! ( vm, __enter__) ) ?
851+ . map_err ( |_obj| vm. new_type_error ( error_string ( ) ) ) ?
852+ . invoke ( ( ) , vm) ?;
853+
854+ let exit = context_manager
855+ . get_attr ( identifier ! ( vm, __exit__) , vm)
856+ . map_err ( |_exc| {
857+ vm. new_type_error ( {
858+ format ! ( "'{} (missed __exit__ method)" , error_string( ) )
859+ } )
860+ } ) ?;
849861 self . push_value ( exit) ;
850862 self . push_block ( BlockType :: Finally {
851863 handler : end. get ( arg) ,
@@ -855,9 +867,24 @@ impl ExecutingFrame<'_> {
855867 }
856868 bytecode:: Instruction :: BeforeAsyncWith => {
857869 let mgr = self . pop_value ( ) ;
858- let aenter_res =
859- vm. call_special_method ( mgr. clone ( ) , identifier ! ( vm, __aenter__) , ( ) ) ?;
860- let aexit = mgr. get_attr ( identifier ! ( vm, __aexit__) , vm) ?;
870+ let error_string = || -> String {
871+ format ! (
872+ "'{:.200}' object does not support the asynchronous context manager protocol" ,
873+ mgr. class( ) . name( ) ,
874+ )
875+ } ;
876+
877+ let aenter_res = vm
878+ . get_special_method ( mgr. clone ( ) , identifier ! ( vm, __aenter__) ) ?
879+ . map_err ( |_obj| vm. new_type_error ( error_string ( ) ) ) ?
880+ . invoke ( ( ) , vm) ?;
881+ let aexit = mgr
882+ . get_attr ( identifier ! ( vm, __aexit__) , vm)
883+ . map_err ( |_exc| {
884+ vm. new_type_error ( {
885+ format ! ( "'{} (missed __aexit__ method)" , error_string( ) )
886+ } )
887+ } ) ?;
861888 self . push_value ( aexit) ;
862889 self . push_value ( aenter_res) ;
863890
0 commit comments