revert: remove safeToString_ and recursive toString handling due to memory leak on runtime errors
The safeToString_ mechanism introduced in 40897f33 used per-fiber maps and lists to detect recursive toString calls, but leaked memory when runtime errors occurred before cleanup. This reverts to direct toString implementations for List and Map, removing the recursive detection logic and updating tests to mark self-referencing containers as TODO.
This commit is contained in:
@@ -14,37 +14,4 @@ class Foo {
|
||||
|
||||
IO.print([1, new Foo, 2]) // expect: [1, Foo.toString, 2]
|
||||
|
||||
// Lists that directly contain themselves.
|
||||
var list = []
|
||||
list.add(list)
|
||||
IO.print(list) // expect: [...]
|
||||
|
||||
list = [1, 2]
|
||||
list[0] = list
|
||||
IO.print(list) // expect: [..., 2]
|
||||
|
||||
list = [1, 2]
|
||||
list[1] = list
|
||||
IO.print(list) // expect: [1, ...]
|
||||
|
||||
// Lists that indirectly contain themselves.
|
||||
list = [null, [2, [3, null, 4], null, 5], 6]
|
||||
list[0] = list
|
||||
list[1][1][1] = list
|
||||
list[1][2] = list
|
||||
IO.print(list) // expect: [..., [2, [3, ..., 4], ..., 5], 6]
|
||||
|
||||
// List containing an object that calls toString on a recursive list.
|
||||
class Box {
|
||||
new(field) { _field = field }
|
||||
toString { "box " + _field.toString }
|
||||
}
|
||||
|
||||
list = [1, 2]
|
||||
list.add(new Box(list))
|
||||
IO.print(list) // expect: [1, 2, box ...]
|
||||
|
||||
// List containing a map containing the list.
|
||||
list = [1, null, 2]
|
||||
list[1] = {"list": list}
|
||||
IO.print(list) // expect: [1, {list: ...}, 2]
|
||||
// TODO: Handle lists that contain themselves.
|
||||
|
||||
@@ -24,28 +24,4 @@ IO.print(s == "{1: 2, 3: 4, 5: 6}" ||
|
||||
s == "{5: 6, 1: 2, 3: 4}" ||
|
||||
s == "{5: 6, 3: 4, 1: 2}") // expect: true
|
||||
|
||||
// Map that directly contains itself.
|
||||
var map = {}
|
||||
map["key"] = map
|
||||
IO.print(map) // expect: {key: ...}
|
||||
|
||||
// Map that indirectly contains itself.
|
||||
map = {}
|
||||
map["a"] = {"b": {"c": map}}
|
||||
|
||||
IO.print(map) // expect: {a: {b: {c: ...}}}
|
||||
|
||||
// Map containing an object that calls toString on a recursive map.
|
||||
class Box {
|
||||
new(field) { _field = field }
|
||||
toString { "box " + _field.toString }
|
||||
}
|
||||
|
||||
map = {}
|
||||
map["box"] = new Box(map)
|
||||
IO.print(map) // expect: {box: box ...}
|
||||
|
||||
// Map containing a list containing the map.
|
||||
map = {}
|
||||
map["list"] = [1, map, 2]
|
||||
IO.print(map) // expect: {list: [1, ..., 2]}
|
||||
// TODO: Handle maps that contain themselves.
|
||||
Reference in New Issue
Block a user