@@ -60,6 +60,26 @@ fn bytes_io_getvalue(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
60
60
Ok ( vm. get_none ( ) )
61
61
}
62
62
63
+ fn io_base_cm_enter ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
64
+ arg_check ! ( vm, args, required = [ ( instance, None ) ] ) ;
65
+ Ok ( instance. clone ( ) )
66
+ }
67
+
68
+ fn io_base_cm_exit ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
69
+ arg_check ! (
70
+ vm,
71
+ args,
72
+ // The context manager protocol requires these, but we don't use them
73
+ required = [
74
+ ( _instance, None ) ,
75
+ ( _exception_type, None ) ,
76
+ ( _exception_value, None ) ,
77
+ ( _traceback, None )
78
+ ]
79
+ ) ;
80
+ Ok ( vm. get_none ( ) )
81
+ }
82
+
63
83
fn buffered_io_base_init ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
64
84
arg_check ! ( vm, args, required = [ ( buffered, None ) , ( raw, None ) ] ) ;
65
85
vm. ctx . set_attr ( & buffered, "raw" , raw. clone ( ) ) ;
@@ -347,7 +367,10 @@ pub fn io_open(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
347
367
348
368
pub fn mk_module ( ctx : & PyContext ) -> PyObjectRef {
349
369
//IOBase the abstract base class of the IO Module
350
- let io_base = py_class ! ( ctx, "IOBase" , ctx. object( ) , { } ) ;
370
+ let io_base = py_class ! ( ctx, "IOBase" , ctx. object( ) , {
371
+ "__enter__" => ctx. new_rustfunc( io_base_cm_enter) ,
372
+ "__exit__" => ctx. new_rustfunc( io_base_cm_exit)
373
+ } ) ;
351
374
352
375
// IOBase Subclasses
353
376
let raw_io_base = py_class ! ( ctx, "RawIOBase" , ctx. object( ) , { } ) ;
0 commit comments