Skip to content

Commit a725e2b

Browse files
committed
Adds alternative extend_exception! macro
1 parent 81654d4 commit a725e2b

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

extra_tests/snippets/builtin_exceptions.py

+3
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,6 @@ class SubError(MyError):
192192
assert OSError.strerror
193193
assert OSError(1, 2).errno
194194
assert OSError(1, 2).strerror
195+
196+
assert ImportError.__init__.__qualname__ == 'ImportError.__init__'
197+
assert ImportError(name='a').name == 'a'

vm/src/exceptions.rs

+16-1
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,19 @@ extends_exception! {
643643
"Base class for I/O related errors."
644644
}
645645

646+
macro_rules! extend_exception {
647+
( $ctx:expr, $class:expr, { $($name:expr => $value:expr),* $(,)* }) => {
648+
$class.set_str_attr("__new__", $ctx.new_method("__new__", $class.clone(), PyBaseException::tp_new));
649+
$class.set_str_attr("__init__", $ctx.new_method("__init__", $class.clone(), PyBaseException::init));
650+
651+
extend_class!($ctx, $class, {
652+
$(
653+
$name => $value,
654+
)*
655+
});
656+
};
657+
}
658+
646659
impl ExceptionZoo {
647660
pub(crate) fn init() -> Self {
648661
// The same order as definitions:
@@ -819,6 +832,8 @@ impl ExceptionZoo {
819832
"value" => ctx.new_readonly_getset("value", excs.stop_iteration.clone(), make_arg_getter(0)),
820833
});
821834

835+
extend_exception!(ctx, &excs.arithmetic_error, {});
836+
822837
extend_class!(ctx, &excs.syntax_error, {
823838
"msg" => ctx.new_readonly_getset("msg", excs.syntax_error.clone(), make_arg_getter(0)),
824839
// TODO: members
@@ -828,7 +843,7 @@ impl ExceptionZoo {
828843
"text" => ctx.none(),
829844
});
830845

831-
extend_class!(ctx, &excs.import_error, {
846+
extend_exception!(ctx, &excs.import_error, {
832847
"__init__" => ctx.new_method("__init__", excs.import_error.clone(), import_error_init),
833848
"msg" => ctx.new_readonly_getset("msg", excs.import_error.clone(), make_arg_getter(0)),
834849
});

0 commit comments

Comments
 (0)