Add sys.exc_info

This commit is contained in:
Aviv Palivoda committed 2019-07-15 19:26:53 +03:00
1 parent a0abe08c9a
commit 802acf7dd5
2 files changed
+23 -1

No files matched your search

+8
View File
@@ -38,3 +38,11 @@ sys.settrace(trc)
demo(5)
sys.settrace(None)
assert sys.exc_info() == (None, None, None)
try:
1/0
except ZeroDivisionError as exc:
exc_info = sys.exc_info()
assert exc_info[0] == type(exc) == ZeroDivisionError
assert exc_info[1] == exc
+15 -1
View File
@@ -4,7 +4,9 @@ use std::{env, mem};
use crate::frame::FrameRef;
use crate::function::{OptionalArg, PyFuncArgs};
use crate::obj::objstr::PyStringRef;
use crate::pyobject::{IntoPyObject, ItemProtocol, PyClassImpl, PyContext, PyObjectRef, PyResult};
use crate::pyobject::{
IntoPyObject, ItemProtocol, PyClassImpl, PyContext, PyObjectRef, PyResult, TypeProtocol,
};
use crate::version;
use crate::vm::{PySettings, VirtualMachine};
@@ -149,6 +151,17 @@ fn sys_intern(value: PyStringRef, _vm: &VirtualMachine) -> PyStringRef {
value
}
fn sys_exc_info(vm: &VirtualMachine) -> PyResult {
Ok(vm.ctx.new_tuple(match vm.current_exception() {
Some(exception) => vec![
exception.class().into_object(),
exception.clone(),
vm.get_none(),
],
None => vec![vm.get_none(), vm.get_none(), vm.get_none()],
}))
}
pub fn make_module(vm: &VirtualMachine, module: PyObjectRef, builtins: PyObjectRef) {
let ctx = &vm.ctx;
@@ -309,6 +322,7 @@ settrace() -- set the global debug tracing function
"setprofile" => ctx.new_rustfunc(sys_setprofile),
"settrace" => ctx.new_rustfunc(sys_settrace),
"version" => vm.new_str(version::get_version()),
"exc_info" => ctx.new_rustfunc(sys_exc_info),
});
modules.set_item("sys", module.clone(), vm).unwrap();