.
diff --git a/src/_decoder.pyx b/src/_decoder.pyx
index e08c6b4..6857ded 100644
--- a/src/_decoder.pyx
+++ b/src/_decoder.pyx
@@ -511,7 +511,7 @@
try:
value = _decode_recursive(reader, &c0)
except _DecoderException as ex:
- result[key] = ex.result
+ result[key] = (<_DecoderException> ex).result
raise
if expect(c0 < 0, False):
@@ -550,7 +550,7 @@
try:
value = _decode_recursive(reader, &c0)
except _DecoderException as ex:
- result.append(ex.result)
+ result.append((<_DecoderException> ex).result)
raise
if expect(c0 < 0, False):
@@ -637,7 +637,7 @@
except RecursionError:
_raise_nesting(_reader_tell(reader), result)
except _DecoderException as ex:
- ex.result = result
+ (<_DecoderException> ex).result = result
raise ex
finally:
_reader_leave(reader)
@@ -706,19 +706,21 @@
c1 = cast_to_uint32(c0)
_raise_unframed_data(c1, start)
except _DecoderException as ex:
- ex.result = result
+ (<_DecoderException> ex).result = result
raise ex
return result
cdef object _decode_all(ReaderRef reader, boolean some):
- cdef Exception ex
+ cdef Exception ex_result
+ cdef _DecoderException ex
try:
return _decode_all_sub(reader, some)
except _DecoderException as e:
- ex = e.cls(e.msg, e.result, e.extra)
- raise ex
+ ex = <_DecoderException> e
+ ex_result = ex.cls(ex.msg, ex.result, ex.extra)
+ raise ex_result
cdef object _decode_ucs1(const void *string, Py_ssize_t length,
diff --git a/src/_exceptions_decoder.pyx b/src/_exceptions_decoder.pyx
index aa64528..3f57afb 100644
--- a/src/_exceptions_decoder.pyx
+++ b/src/_exceptions_decoder.pyx
@@ -62,8 +62,15 @@
return self.args[2]
-class _DecoderException(BaseException):
- def __init__(self, cls, msg, extra, result):
+@final
+@auto_pickle(False)
+cdef class _DecoderException(Exception):
+ cdef object cls
+ cdef object msg
+ cdef object extra
+ cdef object result
+
+ def __cinit__(self, cls, msg, extra, result):
self.cls = cls
self.msg = msg
self.extra = extra