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 py/modmicropython: Add micropython.const, alias for identity function. 2016-09-27 13:34:21 +10:00
const.py.exp py/parse: Treat constants that start with underscore as private. 2016-06-06 17:28:32 +01:00
const2.py py/modmicropython: Add micropython.const, alias for identity function. 2016-09-27 13:34:21 +10:00
const2.py.exp tests/micropython: Add tests for const names being replaced in parser. 2016-09-27 13:03:53 +10:00
const_error.py py/modmicropython: Add micropython.const, alias for identity function. 2016-09-27 13:34:21 +10:00
const_error.py.exp tests: Add tests for SyntaxError, TypeError, and other missing things. 2015-03-25 23:10:09 +00:00
const_intbig.py tests/micropython: Add test for consts that are bignums. 2017-02-24 13:08:18 +11:00
const_intbig.py.exp tests/micropython: Add test for consts that are bignums. 2017-02-24 13:08:18 +11:00
decorator.py tests: Add tests for things that are not already tested. 2015-03-12 22:48:45 +00:00
decorator.py.exp tests: Add tests for things that are not already tested. 2015-03-12 22:48:45 +00:00
decorator_error.py tests: Add tests for SyntaxError, TypeError, and other missing things. 2015-03-25 23:10:09 +00:00
decorator_error.py.exp tests: Add tests for SyntaxError, TypeError, and other missing things. 2015-03-25 23:10:09 +00:00
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 tests/micropython: Add tests for heap_lock, and emergency exceptions. 2016-10-14 00:32:34 +11:00
heap_lock.py.exp tests/micropython: Add tests for heap_lock, and emergency exceptions. 2016-10-14 00:32:34 +11:00
heapalloc.py tests/micropython: Move alloc-less traceback test to separate test file. 2016-11-21 17:39:23 +11:00
heapalloc.py.exp tests/micropython: Move alloc-less traceback test to separate test file. 2016-11-21 17:39:23 +11:00
heapalloc_bytesio.py tests: Convert remaining "sys.exit()" to "raise SystemExit". 2017-06-10 20:34:38 +03:00
heapalloc_bytesio.py.exp tests/heapalloc_bytesio: Test for BytesIO with preallocates space. 2017-02-02 00:38:38 +03:00
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 tests/heapalloc_exc_raise.py: Heap alloc test for raising/catching exc. 2017-02-20 04:22:32 +03:00
heapalloc_exc_raise.py.exp tests/heapalloc_exc_raise.py: Heap alloc test for raising/catching exc. 2017-02-20 04:22:32 +03:00
heapalloc_inst_call.py tests/heapalloc_inst_call: Test for no alloc for simple object calls. 2016-12-25 00:50:27 +03:00
heapalloc_inst_call.py.exp tests/heapalloc_inst_call: Test for no alloc for simple object calls. 2016-12-25 00:50:27 +03:00
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 tests/heapalloc_str: Test for alloc-free string operations. 2017-01-27 00:49:39 +03:00
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 tests: Add missing tests for builtins, and many other things. 2015-04-04 22:05:30 +01:00
meminfo.py.exp tests/meminfo: Update for addition of "max free sz" output. 2016-07-01 00:39:26 +03:00
memstats.py tests: Add missing tests for builtins, and many other things. 2015-04-04 22:05:30 +01:00
memstats.py.exp tests: Add missing tests for builtins, and many other things. 2015-04-04 22:05:30 +01:00
native_closure.py tests: Add specific test for closures in native emitter. 2015-04-03 16:14:25 +01:00
native_closure.py.exp tests: Add specific test for closures in native emitter. 2015-04-03 16:14:25 +01:00
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 tests: Add tests for SyntaxError, TypeError, and other missing things. 2015-03-25 23:10:09 +00:00
native_misc.py.exp tests: Add tests for SyntaxError, TypeError, and other missing things. 2015-03-25 23:10:09 +00:00
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 tests/micropython/opt_level: Add test for opt_level 3. 2017-01-19 23:38:11 +11:00
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 tests/micropython: Add test for micropython.stack_use() function. 2016-12-28 17:46:52 +11:00
stack_use.py.exp tests/micropython: Add test for micropython.stack_use() function. 2016-12-28 17:46:52 +11:00
viper_addr.py py/viper: Allow casting of Python integers to viper pointers. 2016-02-09 13:29:20 +00:00
viper_addr.py.exp py/viper: Allow casting of Python integers to viper pointers. 2016-02-09 13:29:20 +00:00
viper_args.py tests: Improve test coverage of py/compile.c. 2016-10-11 12:30:32 +11:00
viper_args.py.exp py: Allow viper functions to take up to 4 arguments. 2015-07-23 14:11:29 +01:00
viper_binop_arith.py py: Implement native multiply operation in viper emitter. 2015-06-04 14:00:29 +00:00
viper_binop_arith.py.exp py: Implement native multiply operation in viper emitter. 2015-06-04 14:00:29 +00:00
viper_binop_comp.py tests: Add tests for viper binary operations. 2014-09-29 19:42:06 +01:00
viper_binop_comp.py.exp tests: Add tests for viper binary operations. 2014-09-29 19:42:06 +01:00
viper_binop_comp_imm.py asmarm: Fix bug with encoding small negative ints using MVN instruction. 2014-12-14 03:24:17 +02:00
viper_binop_comp_imm.py.exp asmarm: Fix bug with encoding small negative ints using MVN instruction. 2014-12-14 03:24:17 +02:00
viper_binop_multi_comp.py py: Partially fix viper multi-comparison; add test for it. 2014-10-19 19:00:51 +01:00
viper_binop_multi_comp.py.exp py: Partially fix viper multi-comparison; add test for it. 2014-10-19 19:00:51 +01:00
viper_cond.py tests: Add more tests for viper, including tests for ViperTypeError's. 2015-04-22 23:18:28 +01:00
viper_cond.py.exp tests: Add more tests for viper, including tests for ViperTypeError's. 2015-04-22 23:18:28 +01:00
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 tests/micropython: Add test for import from within viper function. 2016-11-10 22:54:55 +11:00
viper_import.py.exp tests/micropython: Add test for import from within viper function. 2016-11-10 22:54:55 +11:00
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 tests: Add more tests for viper, including tests for ViperTypeError's. 2015-04-22 23:18:28 +01:00
viper_ptr8_load.py.exp tests: Add more tests for viper, including tests for ViperTypeError's. 2015-04-22 23:18:28 +01:00
viper_ptr8_store.py tests: Add more tests for viper, including tests for ViperTypeError's. 2015-04-22 23:18:28 +01:00
viper_ptr8_store.py.exp tests: Add more tests for viper, including tests for ViperTypeError's. 2015-04-22 23:18:28 +01:00
viper_ptr16_load.py tests: Add more tests for viper 16/32-bit load/store, and ellipsis. 2015-10-13 18:24:36 +01:00
viper_ptr16_load.py.exp tests: Add more tests for viper 16/32-bit load/store, and ellipsis. 2015-10-13 18:24:36 +01:00
viper_ptr16_store.py tests: Add more tests for viper 16/32-bit load/store, and ellipsis. 2015-10-13 18:24:36 +01:00
viper_ptr16_store.py.exp tests: Add more tests for viper 16/32-bit load/store, and ellipsis. 2015-10-13 18:24:36 +01:00
viper_ptr32_load.py tests: Add more tests for viper 16/32-bit load/store, and ellipsis. 2015-10-13 18:24:36 +01:00
viper_ptr32_load.py.exp tests: Add more tests for viper 16/32-bit load/store, and ellipsis. 2015-10-13 18:24:36 +01:00
viper_ptr32_store.py tests: Add more tests for viper 16/32-bit load/store, and ellipsis. 2015-10-13 18:24:36 +01:00
viper_ptr32_store.py.exp tests: Add more tests for viper 16/32-bit load/store, and ellipsis. 2015-10-13 18:24:36 +01:00
viper_subscr.py py: Implement implicit cast to obj for viper load/store index/value. 2015-06-04 11:52:16 +01:00
viper_subscr.py.exp py: Implement implicit cast to obj for viper load/store index/value. 2015-06-04 11:52:16 +01:00