diff options
author | Damien George <damien.p.george@gmail.com> | 2016-12-20 11:20:01 +1100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2016-12-20 11:20:01 +1100 |
commit | 0d32f1aeb3e3792f2bd04c499a6d5a22c2efdf0c (patch) | |
tree | 4751284f824c8acde7e6efc93cda1038c973009b /esp8266/modesp.c | |
parent | 5e1ccddc825e1304dbf235e391df3e1a5aea0723 (diff) |
esp8266: When doing GC be sure to trace the memory holding native code.
Native code can hold pointers to objects on the heap, eg constant objects
like big integers.
Diffstat (limited to 'esp8266/modesp.c')
-rw-r--r-- | esp8266/modesp.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/esp8266/modesp.c b/esp8266/modesp.c index a20769abc..4403dfde4 100644 --- a/esp8266/modesp.c +++ b/esp8266/modesp.c @@ -711,6 +711,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(esp_esf_free_bufs_obj, esp_esf_free_bufs); // esp.set_native_code_location() function; see below. If flash is selected // then it is erased as needed. +#include "gccollect.h" + #define IRAM1_END (0x40108000) #define FLASH_START (0x40200000) #define FLASH_END (0x40300000) @@ -734,6 +736,16 @@ void esp_native_code_init(void) { esp_native_code_erased = 0; } +void esp_native_code_gc_collect(void) { + void *src; + if (esp_native_code_location == ESP_NATIVE_CODE_IRAM1) { + src = (void*)esp_native_code_start; + } else { + src = (void*)(FLASH_START + esp_native_code_start); + } + gc_collect_root(src, (esp_native_code_end - esp_native_code_start) / sizeof(uint32_t)); +} + void *esp_native_code_commit(void *buf, size_t len) { //printf("COMMIT(buf=%p, len=%u, start=%08x, cur=%08x, end=%08x, erased=%08x)\n", buf, len, esp_native_code_start, esp_native_code_cur, esp_native_code_end, esp_native_code_erased); |