micropython/tests/micropython
Damien George 96fd80db13 py/objexcept: Prevent infinite recursion when allocating exceptions.
The aim of this patch is to rewrite the functions that create exception
instances (mp_obj_exception_make_new and mp_obj_new_exception_msg_varg) so
that they do not call any functions that may raise an exception.  Otherwise
it's possible to create infinite recursion with an exception being raised
while trying to create an exception object.

The two main things that are done to accomplish this are:
1. Change mp_obj_new_exception_msg_varg to just format the string, then
   call mp_obj_exception_make_new to actually create the exception object.
2. In mp_obj_exception_make_new and mp_obj_new_exception_msg_varg try to
   allocate all memory first using functions that don't raise exceptions
   If any of the memory allocations fail (return NULL) then degrade
   gracefully by trying other options for memory allocation, eg using the
   emergency exception buffer.
3. Use a custom printer backend to conservatively format strings: if it
   can't allocate memory then it just truncates the string.

As part of this rewrite, raising an exception without a message, like
KeyError(123), will now use the emergency buffer to store the arg and
traceback data if there is no heap memory available.

Memory use with this patch is unchanged.  Code size is increased by:

   bare-arm:  +136
minimal x86:  +124
   unix x64:   +72
unix nanbox:   +96
      stm32:   +88
    esp8266:   +92
     cc3200:   +80
2017-09-21 15:24:57 +10:00
..
const.py
const.py.exp
const2.py
const2.py.exp
const_error.py
const_error.py.exp
const_intbig.py
const_intbig.py.exp
decorator.py
decorator.py.exp
decorator_error.py
decorator_error.py.exp
emg_exc.py py/objexcept: Prevent infinite recursion when allocating exceptions. 2017-09-21 15:24:57 +10:00
emg_exc.py.exp py/objexcept: Prevent infinite recursion when allocating exceptions. 2017-09-21 15:24:57 +10:00
heap_lock.py
heap_lock.py.exp
heapalloc.py
heapalloc.py.exp
heapalloc_bytesio.py tests: Convert remaining "sys.exit()" to "raise SystemExit". 2017-06-10 20:34:38 +03:00
heapalloc_bytesio.py.exp
heapalloc_bytesio2.py py/objstringio: If created from immutable object, follow copy on write policy. 2017-06-09 17:33:01 +03:00
heapalloc_bytesio2.py.exp py/objstringio: If created from immutable object, follow copy on write policy. 2017-06-09 17:33:01 +03:00
heapalloc_exc_raise.py
heapalloc_exc_raise.py.exp
heapalloc_inst_call.py
heapalloc_inst_call.py.exp
heapalloc_int_from_bytes.py tests/micropython: Add test for int.from_bytes with many zero bytes. 2017-05-06 10:29:09 +10:00
heapalloc_int_from_bytes.py.exp tests/micropython: Add test for int.from_bytes with many zero bytes. 2017-05-06 10:29:09 +10:00
heapalloc_iter.py tests: Convert remaining "sys.exit()" to "raise SystemExit". 2017-06-10 20:34:38 +03:00
heapalloc_str.py tests/heapalloc_str: Test no-replacement case for str.replace(). 2017-03-22 22:17:52 +03:00
heapalloc_str.py.exp
heapalloc_super.py tests: Add tests for calling super and loading a method directly. 2017-04-22 23:39:38 +10:00
heapalloc_super.py.exp tests: Add tests for calling super and loading a method directly. 2017-04-22 23:39:38 +10:00
heapalloc_traceback.py tests: Convert remaining "sys.exit()" to "raise SystemExit". 2017-06-10 20:34:38 +03:00
heapalloc_traceback.py.exp tests: Convert remaining "sys.exit()" to "raise SystemExit". 2017-06-10 20:34:38 +03:00
kbd_intr.py tests: Convert remaining "sys.exit()" to "raise SystemExit". 2017-06-10 20:34:38 +03:00
kbd_intr.py.exp tests/micropython: Add test for micropython.kbd_intr(). 2017-04-18 17:24:30 +10:00
meminfo.py
meminfo.py.exp
memstats.py
memstats.py.exp
native_closure.py
native_closure.py.exp
native_const_intbig.py tests/micropython/: Split off intbig tests. 2017-03-07 07:12:58 +01:00
native_const_intbig.py.exp tests/micropython/: Split off intbig tests. 2017-03-07 07:12:58 +01:00
native_misc.py
native_misc.py.exp
opt_level.py tests/micropython/opt_level: Clarify the expected output for opt_level == 3. 2017-03-09 23:22:31 +01:00
opt_level.py.exp
schedule.py tests: Convert remaining "sys.exit()" to "raise SystemExit". 2017-06-10 20:34:38 +03:00
schedule.py.exp tests/micropython: Add tests for micropython.schedule(). 2017-03-20 15:20:26 +11:00
stack_use.py
stack_use.py.exp
viper_addr.py
viper_addr.py.exp
viper_args.py
viper_args.py.exp
viper_binop_arith.py
viper_binop_arith.py.exp
viper_binop_comp.py
viper_binop_comp.py.exp
viper_binop_comp_imm.py
viper_binop_comp_imm.py.exp
viper_binop_multi_comp.py
viper_binop_multi_comp.py.exp
viper_cond.py
viper_cond.py.exp
viper_error.py tests/micropython/viper_error: Add more tests to improve coverage. 2017-03-14 23:05:41 +11:00
viper_error.py.exp tests/micropython/viper_error: Add more tests to improve coverage. 2017-03-14 23:05:41 +11:00
viper_import.py
viper_import.py.exp
viper_misc.py tests/micropython/: Split off intbig tests. 2017-03-07 07:12:58 +01:00
viper_misc.py.exp tests/micropython/: Split off intbig tests. 2017-03-07 07:12:58 +01:00
viper_misc_intbig.py tests/micropython/: Split off intbig tests. 2017-03-07 07:12:58 +01:00
viper_misc_intbig.py.exp tests/micropython/: Split off intbig tests. 2017-03-07 07:12:58 +01:00
viper_ptr8_load.py
viper_ptr8_load.py.exp
viper_ptr8_store.py
viper_ptr8_store.py.exp
viper_ptr16_load.py
viper_ptr16_load.py.exp
viper_ptr16_store.py
viper_ptr16_store.py.exp
viper_ptr32_load.py
viper_ptr32_load.py.exp
viper_ptr32_store.py
viper_ptr32_store.py.exp
viper_subscr.py
viper_subscr.py.exp