diff options
author | Damien George <damien.p.george@gmail.com> | 2014-07-01 14:26:37 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-07-01 14:26:37 +0100 |
commit | f065344d3b5d88bc09e0028382f26ab60de2b5b2 (patch) | |
tree | ea4e1b3f43611332c55a561c0e025d286f7aca09 /py | |
parent | aa47f3968bdb46c67b6150eb7637d1cbd1e76767 (diff) | |
parent | 2fe841d2fa022bc7f546ddd77a79eaa0150bdf87 (diff) | |
download | micropython-f065344d3b5d88bc09e0028382f26ab60de2b5b2.tar.gz micropython-f065344d3b5d88bc09e0028382f26ab60de2b5b2.zip |
Merge branch 'preserve-except' of github.com:dhylands/micropython into dhylands-preserve-except
Diffstat (limited to 'py')
-rw-r--r-- | py/gc.c | 4 | ||||
-rw-r--r-- | py/gc.h | 1 | ||||
-rw-r--r-- | py/objexcept.c | 5 |
3 files changed, 10 insertions, 0 deletions
@@ -172,6 +172,10 @@ void gc_unlock(void) { gc_lock_depth--; } +bool gc_is_locked(void) { + return gc_lock_depth != 0; +} + #define VERIFY_PTR(ptr) ( \ (ptr & (BYTES_PER_BLOCK - 1)) == 0 /* must be aligned on a block */ \ && ptr >= (machine_uint_t)gc_pool_start /* must be above start of pool */ \ @@ -30,6 +30,7 @@ void gc_init(void *start, void *end); // They can be used to prevent the GC from allocating/freeing. void gc_lock(void); void gc_unlock(void); +bool gc_is_locked(void); // A given port must implement gc_collect by using the other collect functions. void gc_collect(void); diff --git a/py/objexcept.c b/py/objexcept.c index 9f421373bb..b4a831c628 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -37,6 +37,7 @@ #include "objtype.h" #include "runtime.h" #include "runtime0.h" +#include "gc.h" typedef struct _mp_obj_exception_t { mp_obj_base_t base; @@ -335,6 +336,10 @@ void mp_obj_exception_clear_traceback(mp_obj_t self_in) { } void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, machine_uint_t line, qstr block) { + if (gc_is_locked()) { + // We can't allocate memory, so don't bother to try + return; + } GET_NATIVE_EXCEPTION(self, self_in); // for traceback, we are just using the list object for convenience, it's not really a list of Python objects |