micropython/py
Damien George f040685b0c py: Only store the exception instance on Py stack in bytecode try block.
When an exception is raised and is to be handled by the VM, it is stored
on the Python value stack so the bytecode can access it.  CPython stores
3 objects on the stack for each exception: exc type, exc instance and
traceback.  uPy followed this approach, but it turns out not to be
necessary.  Instead, it is enough to store just the exception instance on
the Python value stack.  The only place where the 3 values are needed
explicitly is for the __exit__ handler of a with-statement context, but
for these cases the 3 values can be extracted from the single exception
instance.

This patch removes the need to store 3 values on the stack, and instead
just stores the exception instance.

Code size is reduced by about 50-100 bytes, the compiler and VM are
slightly simpler, generate bytecode is smaller (by 2 bytes for each try
block), and the Python value stack is reduced in size for functions that
handle exceptions.
2016-09-27 12:37:21 +10:00
..
argcheck.c py/argcheck: Use size_t instead of mp_uint_t to count number of args. 2016-03-14 22:35:48 +00:00
asmarm.c py: Implement native multiply operation in viper emitter. 2015-06-04 14:00:29 +00:00
asmarm.h py: Implement native multiply operation in viper emitter. 2015-06-04 14:00:29 +00:00
asmthumb.c py/asmthumb: Flush D-cache, and invalidate I-cache on STM32F7. 2016-09-09 14:48:15 +10:00
asmthumb.h py: Add lsl/lsr/asr opcode support to inline Thumb2 assembler. 2015-10-19 14:26:19 +01:00
asmx64.c py/asmx64: Support all 16 regs in reg to memory move instructions. 2016-02-15 09:05:50 +00:00
asmx64.h py: Implement ptr32 load and store in viper emitter. 2015-10-13 00:50:17 +01:00
asmx86.c py/asmx86: Fix function definition to use int32_t instead of int. 2015-11-27 14:06:53 +00:00
asmx86.h py: Implement native multiply operation in viper emitter. 2015-06-04 14:00:29 +00:00
bc.c py: Update opcode format table because 3 opcodes were removed, 1 added. 2016-09-23 12:48:57 +10:00
bc.h py/bc.h: Rename _mp_code_state to _mp_code_state_t. 2016-08-27 23:23:51 +10:00
bc0.h py: Combine 3 comprehension opcodes (list/dict/set) into 1. 2016-09-19 12:28:03 +10:00
binary.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
binary.h py/binary: Make return type of mp_binary_get_size size_t instead of int. 2015-05-17 18:12:19 +01:00
builtin.h py: Add basic _thread module, with ability to start a new thread. 2016-06-28 11:28:48 +01:00
builtinevex.c py: Change type signature of builtin funs that take variable or kw args. 2016-01-11 00:49:27 +00:00
builtinimport.c py/builtinimport: Fix nanbox build after change to better handle -m modules. 2016-09-20 17:55:42 +03:00
compile.c py: Only store the exception instance on Py stack in bytecode try block. 2016-09-27 12:37:21 +10:00
compile.h py/compile: Add mp_compile_to_raw_code() to return raw code object. 2015-11-20 12:30:37 +00:00
emit.h py: Combine 3 comprehension emit functions (list/dict/set) into 1. 2016-09-19 12:23:31 +10:00
emitbc.c py: Only store the exception instance on Py stack in bytecode try block. 2016-09-27 12:37:21 +10:00
emitcommon.c py: Add MICROPY_ENABLE_COMPILER and MICROPY_PY_BUILTINS_EVAL_EXEC opts. 2015-12-18 12:35:44 +00:00
emitglue.c py/emitglue.c: provide mp_raw_code_load_file for any unix architecture 2016-09-04 16:17:46 +10:00
emitglue.h py/emitglue: Make mp_raw_code_t* arguments constant pointers. 2016-04-13 16:05:43 +01:00
emitinlinethumb.c py/emitinlinethumb: Use qstrs instead of char* for names of asm ops. 2016-02-23 15:20:39 +00:00
emitnative.c py: Combine 3 comprehension emit functions (list/dict/set) into 1. 2016-09-19 12:23:31 +10:00
formatfloat.c py/formatfloat: Fix further cases of buffer overflow in formatting. 2016-03-29 22:07:15 +01:00
formatfloat.h py: Implement mp_format_float for doubles and use where appropriate 2015-05-17 21:47:11 +01:00
frozenmod.c py: Allow to stat and import frozen mpy files using new frozen "VFS". 2016-05-23 12:42:23 +01:00
frozenmod.h py/{builtinimport,frozenmod}: Rework frozen modules support to support packages. 2016-05-21 21:38:50 +03:00
gc.c py/gc: Add MICROPY_GC_CONSERVATIVE_CLEAR option to always zero memory. 2016-08-26 15:35:26 +10:00
gc.h py/gc: Calculate (and report) maximum contiguous free block size. 2016-07-01 00:09:55 +03:00
grammar.h py: Simplify "and" action within parser by making ident-rules explicit. 2016-04-14 13:49:23 +01:00
lexer.c py/vstr: Remove vstr.had_error flag and inline basic vstr functions. 2016-09-19 12:28:55 +10:00
lexer.h py: add async/await/async for/async with syntax 2016-04-13 15:26:38 +01:00
lexerstr.c py: Add MICROPY_ENABLE_COMPILER and MICROPY_PY_BUILTINS_EVAL_EXEC opts. 2015-12-18 12:35:44 +00:00
lexerunix.c unix: Allow to cat a script into stdin from the command line. 2015-06-04 23:42:45 +01:00
makeqstrdata.py py/makeqstrdata.py: Compute the qstr hash from bytes, not characters. 2016-09-02 14:32:47 +10:00
makeqstrdefs.py py/makeqstrdefs.py: Use python 2.6 syntax for set creation. 2016-09-09 23:01:23 +10:00
makeversionhdr.py py/makeversionhdr.py: Work with backslashes in paths. 2015-10-30 11:34:53 +03:00
malloc.c py/gc: Add MICROPY_GC_CONSERVATIVE_CLEAR option to always zero memory. 2016-08-26 15:35:26 +10:00
map.c py: Declare constant data as properly constant. 2016-05-20 12:46:20 +01:00
misc.h py/vstr: Remove vstr.had_error flag and inline basic vstr functions. 2016-09-19 12:28:55 +10:00
mkenv.mk py: Move frozen modules rules from esp8266 port for reuse across ports. 2016-09-17 21:00:40 +03:00
mkrules.mk py: Move frozen modules rules from esp8266 port for reuse across ports. 2016-09-17 21:00:40 +03:00
modarray.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
modbuiltins.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
modcmath.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
modcollections.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
modgc.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
modio.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
modmath.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
modmicropython.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
modstruct.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
modsys.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
modthread.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
moduerrno.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
mpconfig.h py: Add MICROPY_USE_INTERNAL_PRINTF option, defaults to enabled. 2016-09-05 12:18:53 +10:00
mperrno.h py/moduerrno: Add ECONNREFUSED, one of frequent networking errors. 2016-05-28 00:17:19 +03:00
mphal.h py/mphal.h: If virtpin API is used, automagically include its header. 2016-06-19 00:12:37 +03:00
mpprint.c py/mpprint: Fail an assertion with unsupported format specifiers. 2016-09-01 18:09:44 +10:00
mpprint.h py: Change mp_print_strn_t func type to use size_t for the str length. 2015-11-29 14:25:04 +00:00
mpstate.c py: Add MICROPY_DYNAMIC_COMPILER option to config compiler at runtime. 2016-02-25 10:05:46 +00:00
mpstate.h py/gc: Implement GC running by allocation threshold. 2016-07-21 00:37:30 +03:00
mpthread.h py/mpthread: Include mpstate.h when defining GIL macros. 2016-06-28 11:28:52 +01:00
mpz.c py/mpz: Fix mpn_div so that it doesn't modify memory of denominator. 2016-05-09 17:21:42 +01:00
mpz.h windows/py: Support 64bit mingw-w64 builds 2015-11-24 17:34:14 +02:00
nativeglue.c py/viper: Allow casting of Python integers to viper pointers. 2016-02-09 13:29:20 +00:00
nlr.h py/nlrsetjmp: Update to take into account new location of nlr_top. 2016-06-28 11:28:52 +01:00
nlrsetjmp.c py/nlrsetjmp: Update to take into account new location of nlr_top. 2016-06-28 11:28:52 +01:00
nlrthumb.c py: Fix nlrthumb.c when DEBUG=1 is defined 2016-07-21 00:54:21 +03:00
nlrx64.S py/nlrx64.S: Prefix mp_thread_get_state with an underscore on Mac. 2016-07-11 14:27:47 +01:00
nlrx86.S py: Add basic _thread module, with ability to start a new thread. 2016-06-28 11:28:48 +01:00
nlrxtensa.S py: Put all global state together in state structures. 2015-01-07 20:33:00 +00:00
obj.c unix: Enable MICROPY_PY_STR_BYTES_CMP_WARN. 2016-07-22 00:52:07 +03:00
obj.h all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
objarray.c py/objarray: Split out header to allow direct access to object. 2016-07-06 18:19:27 +03:00
objarray.h py/objarray: Split out header to allow direct access to object. 2016-07-06 18:19:27 +03:00
objattrtuple.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
objbool.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objboundmeth.c py/objboundmeth: Allocate arg state on stack if heap alloc fails. 2016-03-08 15:36:53 +00:00
objcell.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
objclosure.c py: Fix passing of some wide int types to printf varg format list. 2016-03-14 22:40:39 +00:00
objcomplex.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objdict.c py/objdict: Get rid of asserts (remove/replace with mp_check_self()). 2016-08-12 22:01:11 +03:00
objenumerate.c py: Use new code pattern for parsing kw args with mp_arg_parse_all. 2016-01-13 15:47:56 +00:00
objexcept.c py/objexcept: Don't convert errno to str in constructor, do it in print. 2016-05-12 14:27:52 +01:00
objexcept.h py: Change exception traceback data to use size_t instead of mp_uint_t. 2016-01-02 22:04:12 +00:00
objfilter.c py: Get rid of assert() in method argument checking functions. 2016-08-12 22:39:03 +03:00
objfloat.c py/objfloat, py/modmath: Ensure M_PI and M_E defined. 2016-05-12 13:28:45 +01:00
objfun.c py: Rename struct mp_code_state to mp_code_state_t. 2016-08-27 23:21:00 +10:00
objfun.h py: Add constant table to bytecode. 2015-11-13 12:49:18 +00:00
objgenerator.c py: Rename struct mp_code_state to mp_code_state_t. 2016-08-27 23:21:00 +10:00
objgenerator.h py: Move to guarded includes, everywhere in py/ core. 2015-01-01 20:32:09 +00:00
objgetitemiter.c py/objgetitemiter: Typo fix in comment. 2016-01-23 23:30:06 +02:00
objint.c py: Use MP_SMALL_INT_POSITIVE_MASK to check if uint fits in a small int. 2016-03-10 21:52:56 +00:00
objint.h py: Change mp_obj_int_is_positive to more general mp_obj_int_sign. 2016-01-07 14:29:12 +00:00
objint_longlong.c py: Use MP_SMALL_INT_POSITIVE_MASK to check if uint fits in a small int. 2016-03-10 21:52:56 +00:00
objint_mpz.c py/mpz: Do Python style division/modulo within bignum divmod routine. 2016-05-08 22:21:21 +01:00
objlist.c py: Get rid of assert() in method argument checking functions. 2016-08-12 22:39:03 +03:00
objlist.h py: Fix adding of traceback so that it appends to existing info. 2015-02-27 00:36:39 +00:00
objmap.c py: Get rid of assert() in method argument checking functions. 2016-08-12 22:39:03 +03:00
objmodule.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
objmodule.h py: Move to guarded includes, everywhere in py/ core. 2015-01-01 20:32:09 +00:00
objnamedtuple.c py/objnamedtuple: Allow passing field names as a tuple. 2016-05-23 21:08:07 +01:00
objnone.c py/objnone: Use mp_generic_unary_op instead of custom one. 2016-09-19 12:28:55 +10:00
objobject.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objpolyiter.c py/objpolyiter: Implement instance-polymorphic iterator type. 2015-12-14 23:48:12 +02:00
objproperty.c py: Get rid of assert() in method argument checking functions. 2016-08-12 22:39:03 +03:00
objrange.c py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objreversed.c py: Get rid of assert() in method argument checking functions. 2016-08-12 22:39:03 +03:00
objset.c py: Get rid of assert() in method argument checking functions. 2016-08-12 22:39:03 +03:00
objsingleton.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
objslice.c py: Wrap all obj-ptr conversions in MP_OBJ_TO_PTR/MP_OBJ_FROM_PTR. 2015-11-29 14:25:35 +00:00
objstr.c py: If str/bytes hash is 0 then explicitly compute it. 2016-09-02 14:49:50 +10:00
objstr.h py: If str/bytes hash is 0 then explicitly compute it. 2016-09-02 14:49:50 +10:00
objstringio.c py/objstringio: Implement MP_STREAM_SEEK ioctl and add seek() method. 2016-07-28 01:53:44 +03:00
objstrunicode.c py/objstr,objstrunicode: Fix inconistent #if indentation. 2016-08-07 15:24:57 +03:00
objtuple.c py/objtuple: In tuple_cmp_helper, use mp_check_self instead of raising. 2016-08-14 16:28:05 +10:00
objtuple.h py: Add MP_ROM_* macros and mp_rom_* types and use them. 2015-11-29 14:25:04 +00:00
objtype.c py/objtype: Inherit protocol vtable from base class only if it exists. 2016-06-19 00:56:06 +03:00
objtype.h py: Change first arg of type.make_new from mp_obj_t to mp_obj_type_t*. 2016-01-11 00:49:27 +00:00
objzip.c py: Get rid of assert() in method argument checking functions. 2016-08-12 22:39:03 +03:00
opmethods.c py: Move to guarded includes, everywhere in py/ core. 2015-01-01 20:32:09 +00:00
parse.c py/parse: Only replace constants that are standalone identifiers. 2016-09-23 17:23:16 +10:00
parse.h py/parse: Improve constant folding to operate on small and big ints. 2016-01-07 14:40:35 +00:00
parsenum.c py/parsenum: Use pow function to apply exponent to decimal number. 2016-03-29 22:12:07 +01:00
parsenum.h py/parsenum: Use size_t to count bytes, and int for type of base arg. 2016-03-14 22:34:03 +00:00
parsenumbase.c py/parsenum: Fix compiler warnings for no decl and signed comparison. 2016-03-14 22:52:52 +00:00
parsenumbase.h py/parsenum: Use size_t to count bytes, and int for type of base arg. 2016-03-14 22:34:03 +00:00
py.mk py/py.mk: Add support for building modussl_mbedtls. 2016-09-23 14:30:46 +03:00
qstr.c py/qstr: Remove a comment. 2016-09-19 13:18:54 +10:00
qstr.h py: Rename __QSTR_EXTRACT flag to NO_QSTR. 2016-06-16 01:42:48 +03:00
qstrdefs.h py: Add rules for automated extraction of qstrs from sources. 2016-04-16 13:18:09 +01:00
repl.c py: Declare constant data as properly constant. 2016-05-20 12:46:20 +01:00
repl.h py, readline: Add tab autocompletion for REPL. 2015-04-29 00:46:26 +01:00
ringbuf.h py/ringbuf.h: Add reusable ring buffer class. 2016-03-30 14:48:31 +03:00
runtime.c all: Remove 'name' member from mp_obj_module_t struct. 2016-09-22 00:23:16 +10:00
runtime.h py: Shrink mp_arg_t struct by using reduced-size integer members. 2016-09-23 12:13:51 +10:00
runtime0.h py: Extend native type-sig to use 4 bits, so uint is separate to ptr. 2016-02-02 23:16:05 +00:00
runtime_utils.c py/runtime_utils: Fix nanbox build. 2016-04-25 20:03:14 +03:00
scope.c py: Add MICROPY_ENABLE_COMPILER and MICROPY_PY_BUILTINS_EVAL_EXEC opts. 2015-12-18 12:35:44 +00:00
scope.h py: Put all bytecode state (arg count, etc) in bytecode. 2015-11-13 12:49:18 +00:00
sequence.c py/sequence: Allow to use bignums as indices in slice objects. 2016-08-15 23:26:34 +10:00
showbc.c py/showbc: Make printf's go to the platform print stream. 2016-09-20 11:30:54 +10:00
smallint.c py: Move to guarded includes, everywhere in py/ core. 2015-01-01 20:32:09 +00:00
smallint.h py/smallint: Allow to override MP_SMALL_INT_MIN et al. 2016-01-08 13:43:56 +00:00
stackctrl.c py: Add MP_STATE_THREAD to hold state specific to a given thread. 2016-06-28 11:09:31 +01:00
stackctrl.h py/stackctrl: Add mp_stack_set_top() to explicitly set stack top value. 2016-03-07 14:12:24 +07:00
stream.c py/stream: Remove unnecessary check for NULL return from vstr_extend. 2016-09-22 10:50:47 +10:00
stream.h py/mpconfig.h: Add MICROPY_STREAMS_POSIX_API setting. 2016-07-30 20:05:56 +03:00
unicode.c py/repl: Check for an identifier char after the keyword. 2016-02-17 08:56:15 +00:00
unicode.h py: Move to guarded includes, everywhere in py/ core. 2015-01-01 20:32:09 +00:00
vm.c py: Only store the exception instance on Py stack in bytecode try block. 2016-09-27 12:37:21 +10:00
vmentrytable.h py: Combine 3 comprehension opcodes (list/dict/set) into 1. 2016-09-19 12:28:03 +10:00
vstr.c py/vstr: Remove vstr.had_error flag and inline basic vstr functions. 2016-09-19 12:28:55 +10:00
warning.c py: Convert occurrences of non-debug printf to mp_printf. 2015-04-16 14:30:16 +00:00