diff --git a/cores/esp8266/abi.cpp b/cores/esp8266/abi.cpp index 72f3fb0a06..6b7ea3509a 100644 --- a/cores/esp8266/abi.cpp +++ b/cores/esp8266/abi.cpp @@ -24,61 +24,9 @@ using __cxxabiv1::__guard; // Debugging helper, last allocation which returned NULL -extern void *umm_last_fail_alloc_addr; -extern int umm_last_fail_alloc_size; - extern "C" void __cxa_pure_virtual(void) __attribute__ ((__noreturn__)); extern "C" void __cxa_deleted_virtual(void) __attribute__ ((__noreturn__)); - -#if !defined(__cpp_exceptions) - -// overwrite weak operators new/new[] definitions - -void* operator new(size_t size) -{ - void *ret = malloc(size); - if (0 != size && 0 == ret) { - umm_last_fail_alloc_addr = __builtin_return_address(0); - umm_last_fail_alloc_size = size; - __unhandled_exception(PSTR("OOM")); - } - return ret; -} - -void* operator new[](size_t size) -{ - void *ret = malloc(size); - if (0 != size && 0 == ret) { - umm_last_fail_alloc_addr = __builtin_return_address(0); - umm_last_fail_alloc_size = size; - __unhandled_exception(PSTR("OOM")); - } - return ret; -} - -void* operator new (size_t size, const std::nothrow_t&) -{ - void *ret = malloc(size); - if (0 != size && 0 == ret) { - umm_last_fail_alloc_addr = __builtin_return_address(0); - umm_last_fail_alloc_size = size; - } - return ret; -} - -void* operator new[] (size_t size, const std::nothrow_t&) -{ - void *ret = malloc(size); - if (0 != size && 0 == ret) { - umm_last_fail_alloc_addr = __builtin_return_address(0); - umm_last_fail_alloc_size = size; - } - return ret; -} - -#endif // !defined(__cpp_exceptions) - void __cxa_pure_virtual(void) { panic(); diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp index cf6dd669f6..fc3f272f93 100644 --- a/cores/esp8266/core_esp8266_main.cpp +++ b/cores/esp8266/core_esp8266_main.cpp @@ -301,9 +301,20 @@ static void __unhandled_exception_cpp() } } +extern void *umm_last_fail_alloc_addr; +extern int umm_last_fail_alloc_size; + +static void __new_handler() { + umm_last_fail_alloc_addr = __builtin_return_address(0); + umm_last_fail_alloc_size = 0; + std::set_new_handler(nullptr); + __unhandled_exception(PSTR("OOM")); +} + void init_done() { system_set_os_print(1); gdb_init(); + std::set_new_handler(__new_handler); std::set_terminate(__unhandled_exception_cpp); do_global_ctors(); esp_schedule();