@@ -4,7 +4,9 @@ use std::{env, mem};
4
4
use crate :: frame:: FrameRef ;
5
5
use crate :: function:: { OptionalArg , PyFuncArgs } ;
6
6
use crate :: obj:: objstr:: PyStringRef ;
7
- use crate :: pyobject:: { IntoPyObject , ItemProtocol , PyClassImpl , PyContext , PyObjectRef , PyResult } ;
7
+ use crate :: pyobject:: {
8
+ IntoPyObject , ItemProtocol , PyClassImpl , PyContext , PyObjectRef , PyResult , TypeProtocol ,
9
+ } ;
8
10
use crate :: version;
9
11
use crate :: vm:: { PySettings , VirtualMachine } ;
10
12
@@ -149,6 +151,17 @@ fn sys_intern(value: PyStringRef, _vm: &VirtualMachine) -> PyStringRef {
149
151
value
150
152
}
151
153
154
+ fn sys_exc_info ( vm : & VirtualMachine ) -> PyResult {
155
+ Ok ( vm. ctx . new_tuple ( match vm. current_exception ( ) {
156
+ Some ( exception) => vec ! [
157
+ exception. class( ) . into_object( ) ,
158
+ exception. clone( ) ,
159
+ vm. get_none( ) ,
160
+ ] ,
161
+ None => vec ! [ vm. get_none( ) , vm. get_none( ) , vm. get_none( ) ] ,
162
+ } ) )
163
+ }
164
+
152
165
pub fn make_module ( vm : & VirtualMachine , module : PyObjectRef , builtins : PyObjectRef ) {
153
166
let ctx = & vm. ctx ;
154
167
@@ -309,6 +322,7 @@ settrace() -- set the global debug tracing function
309
322
"setprofile" => ctx. new_rustfunc( sys_setprofile) ,
310
323
"settrace" => ctx. new_rustfunc( sys_settrace) ,
311
324
"version" => vm. new_str( version:: get_version( ) ) ,
325
+ "exc_info" => ctx. new_rustfunc( sys_exc_info) ,
312
326
} ) ;
313
327
314
328
modules. set_item ( "sys" , module. clone ( ) , vm) . unwrap ( ) ;
0 commit comments