summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--py/obj.c3
-rw-r--r--tests/misc/recursive_data.py_9
2 files changed, 12 insertions, 0 deletions
diff --git a/py/obj.c b/py/obj.c
index a0f55d65db..7e39c5a5cc 100644
--- a/py/obj.c
+++ b/py/obj.c
@@ -35,6 +35,7 @@
#include "obj.h"
#include "runtime0.h"
#include "runtime.h"
+#include "stackctrl.h"
mp_obj_type_t *mp_obj_get_type(mp_const_obj_t o_in) {
if (MP_OBJ_IS_SMALL_INT(o_in)) {
@@ -59,6 +60,8 @@ void printf_wrapper(void *env, const char *fmt, ...) {
}
void mp_obj_print_helper(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) {
+ // There can be data structures nested too deep, or just recursive
+ STACK_CHECK();
#if !NDEBUG
if (o_in == NULL) {
print(env, "(nil)");
diff --git a/tests/misc/recursive_data.py_ b/tests/misc/recursive_data.py_
new file mode 100644
index 0000000000..6a52a3c0e8
--- /dev/null
+++ b/tests/misc/recursive_data.py_
@@ -0,0 +1,9 @@
+# This tests that printing recursive data structure doesn't lead to segfault.
+# Unfortunately, print() so far doesn't support "file "kwarg, so variable-len
+# output of this test cannot be redirected, and this test cannot be validated.
+l = [1, 2, 3, None]
+l[-1] = l
+try:
+ print(l)
+except RuntimeError:
+ print("RuntimeError")