From 802acf7dd5c13d930f5f6454a7666622bd95e1bc Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Sat, 13 Jul 2019 18:41:53 +0300 Subject: [PATCH] Add sys.exc_info --- tests/snippets/sysmod.py | 8 ++++++++ vm/src/sysmodule.rs | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/tests/snippets/sysmod.py b/tests/snippets/sysmod.py index 0f81efce1..3b602dd58 100644 --- a/tests/snippets/sysmod.py +++ b/tests/snippets/sysmod.py @@ -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 diff --git a/vm/src/sysmodule.rs b/vm/src/sysmodule.rs index d45070aeb..c8eb98363 100644 --- a/vm/src/sysmodule.rs +++ b/vm/src/sysmodule.rs @@ -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();