diff --git a/src/json_lib.cpp b/src/json_lib.cpp index 3948c9a..f3d7dc8 100644 --- a/src/json_lib.cpp +++ b/src/json_lib.cpp @@ -115,6 +115,12 @@ std::string json::var_generate(var& value) { } std::string json::vector_generate(nas_vec& vect) { + // avoid stackoverflow + if (vect.printed) { + error_info() += "json::stringify: get vector containing itself\n"; + return "undefined"; + } + vect.printed = true; std::string out = "["; for(auto& i : vect.elems) { out += var_generate(i) + ","; @@ -123,10 +129,17 @@ std::string json::vector_generate(nas_vec& vect) { out.pop_back(); } out += "]"; + vect.printed = false; return out; } std::string json::hash_generate(nas_hash& hash) { + // avoid stackoverflow + if (hash.printed) { + error_info() += "json::stringify: get hash containing itself\n"; + return "undefined"; + } + hash.printed = true; std::string out = "{"; for(auto& i : hash.elems) { out += "\"" + i.first + "\":"; @@ -136,6 +149,7 @@ std::string json::hash_generate(nas_hash& hash) { out.pop_back(); } out += "}"; + hash.printed = false; return out; } diff --git a/test/json.nas b/test/json.nas index 0e24d05..4d0aa2e 100644 --- a/test/json.nas +++ b/test/json.nas @@ -66,6 +66,20 @@ test_func(json.stringify({ test_func(""); println(); +func { + var a = {}; + a.a = a; + + var b = []; + append(b, b); + + println(json.stringify(a)); + println(json.get_error()); + println(json.stringify(b)); + println(json.get_error()); + println(); +}(); + var test_json = func(json) { var bar = process_bar.high_resolution_bar(30); var tmp = [