Verbesserung
Wichtig
Detail
Fehlerbehebung
Wichtig
Detail
In TL-Script lassen sich JSON-Objekte konstruiern. Verwendet man diese als Ergebnis einer Rekursion, führt dies zu einem Stack-Overflow, da die Abbruchbedingung nicht erkannt werden kann, weil die Hashcodes nicht stabil sind.
Lösung
In TL-Script konstruierte JSON-Objekte (z.B. {"v": 5}) werden über eine spezielle Map implementiert, die dafür optimiert ist, viele gleichartige Objekte (mit denselben Schlüsseln aber anderen Werten) effizient zu speichern. Diese Map-Implementierung hielt sich aber nicht an den Vertrag des Interfaces Map, der eine spezielle Hashcode-Implementierung vorschreibt - bzw. noch schlimmer, mehrfache Aufrufe von hashCode() führten zu unterschiedlichen Ergebnissen. Die Hashcode-Berechnung wird von AbstractMap erledigt, basiert aber auf dem entrySet() der Map und dieses wiederum auf der Hashcode-Implementierung der Entries des Entry-Sets. Hier wurde eine Hashcode-Implementierung für die Entries des Entry-Sets ergänzt.
Test
- {"v": 5}.recursion(x -> $x["v"] > 0 ? {"v": $x["v"] - 1} : {"v": $x["v"]})
- test.com.top_logic.model.search.expr.TestSearchExpression.testRecursionWithJson()