From 85858e72dfdc3e941c2e620e94de05ad663138b1 Mon Sep 17 00:00:00 2001 From: Jim Mussared Date: Wed, 29 Jan 2020 14:27:33 +1100 Subject: py/objexcept: Allow compression of exception message text. The decompression of error-strings is only done if the string is accessed via printing or via er.args. Tests are added for this feature to ensure the decompression works. --- tests/micropython/heapalloc_exc_compressed.py | 48 ++++++++++++++++++++++ tests/micropython/heapalloc_exc_compressed.py.exp | 6 +++ .../heapalloc_exc_compressed_emg_exc.py | 41 ++++++++++++++++++ .../heapalloc_exc_compressed_emg_exc.py.exp | 4 ++ 4 files changed, 99 insertions(+) create mode 100644 tests/micropython/heapalloc_exc_compressed.py create mode 100644 tests/micropython/heapalloc_exc_compressed.py.exp create mode 100644 tests/micropython/heapalloc_exc_compressed_emg_exc.py create mode 100644 tests/micropython/heapalloc_exc_compressed_emg_exc.py.exp (limited to 'tests') diff --git a/tests/micropython/heapalloc_exc_compressed.py b/tests/micropython/heapalloc_exc_compressed.py new file mode 100644 index 000000000..79e423ca0 --- /dev/null +++ b/tests/micropython/heapalloc_exc_compressed.py @@ -0,0 +1,48 @@ +import micropython + +# Tests both code paths for built-in exception raising. +# mp_obj_new_exception_msg_varg (exception requires decompression at raise-time to format) +# mp_obj_new_exception_msg (decompression can be deferred) + +# NameError uses mp_obj_new_exception_msg_varg for NameError("name '%q' isn't defined") +# set.pop uses mp_obj_new_exception_msg for KeyError("pop from an empty set") + +# Tests that deferred decompression works both via print(e) and accessing the message directly via e.args. + +a = set() + +# First test the regular case (can use heap for allocating the decompression buffer). +try: + name() +except NameError as e: + print(type(e).__name__, e) + +try: + a.pop() +except KeyError as e: + print(type(e).__name__, e) + +try: + name() +except NameError as e: + print(e.args[0]) + +try: + a.pop() +except KeyError as e: + print(e.args[0]) + +# Then test that it still works when the heap is locked (i.e. in ISR context). +micropython.heap_lock() + +try: + name() +except NameError as e: + print(type(e).__name__) + +try: + a.pop() +except KeyError as e: + print(type(e).__name__) + +micropython.heap_unlock() diff --git a/tests/micropython/heapalloc_exc_compressed.py.exp b/tests/micropython/heapalloc_exc_compressed.py.exp new file mode 100644 index 000000000..32d1642f8 --- /dev/null +++ b/tests/micropython/heapalloc_exc_compressed.py.exp @@ -0,0 +1,6 @@ +NameError name 'name' isn't defined +KeyError pop from an empty set +name 'name' isn't defined +pop from an empty set +NameError +KeyError diff --git a/tests/micropython/heapalloc_exc_compressed_emg_exc.py b/tests/micropython/heapalloc_exc_compressed_emg_exc.py new file mode 100644 index 000000000..86ade0786 --- /dev/null +++ b/tests/micropython/heapalloc_exc_compressed_emg_exc.py @@ -0,0 +1,41 @@ +import micropython + +# Does the full test from heapalloc_exc_compressed.py but while the heap is +# locked (this can only work when the emergency exception buf is enabled). + +# Some ports need to allocate heap for the emgergency exception buffer. +try: + micropython.alloc_emergency_exception_buf(256) +except AttributeError: + pass + +a = set() + + +def test(): + micropython.heap_lock() + + try: + name() + except NameError as e: + print(type(e).__name__, e) + + try: + a.pop() + except KeyError as e: + print(type(e).__name__, e) + + try: + name() + except NameError as e: + print(e.args[0]) + + try: + a.pop() + except KeyError as e: + print(e.args[0]) + + micropython.heap_unlock() + + +test() diff --git a/tests/micropython/heapalloc_exc_compressed_emg_exc.py.exp b/tests/micropython/heapalloc_exc_compressed_emg_exc.py.exp new file mode 100644 index 000000000..7c368712a --- /dev/null +++ b/tests/micropython/heapalloc_exc_compressed_emg_exc.py.exp @@ -0,0 +1,4 @@ +NameError name 'name' isn't defined +KeyError pop from an empty set +name 'name' isn't defined +pop from an empty set -- cgit v1.2.3