From 771e359e05b5dde37e5bb615ff3039c550c87c0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Wa=C5=9Bko?= Date: Fri, 8 Mar 2024 13:33:13 +0100 Subject: [PATCH] break cycles by registering the object _before_ it is written --- .../src/main/java/org/enso/persist/PerGenerator.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/java/persistance/src/main/java/org/enso/persist/PerGenerator.java b/lib/java/persistance/src/main/java/org/enso/persist/PerGenerator.java index c7d2199b031c..961ff3158319 100644 --- a/lib/java/persistance/src/main/java/org/enso/persist/PerGenerator.java +++ b/lib/java/persistance/src/main/java/org/enso/persist/PerGenerator.java @@ -59,14 +59,15 @@ final int writeObject(T t) throws IOException { java.lang.Object obj = writeReplace.apply(t); java.lang.Integer found = knownObjects.get(obj); if (found == null) { + found = this.position; + knownObjects.put(obj, found); + org.enso.persist.Persistance p = map.forType(obj.getClass()); java.io.ByteArrayOutputStream os = new ByteArrayOutputStream(); p.writeInline(obj, new ReferenceOutput(this, os)); - found = this.position; byte[] arr = os.toByteArray(); main.write(arr); this.position += arr.length; - knownObjects.put(obj, found); } return found; } @@ -83,18 +84,18 @@ final void writeIndirect(Object obj, Persistance.Output out) throws IOException } java.lang.Integer found = knownObjects.get(obj); if (found == null) { + found = position; + knownObjects.put(obj, found); var os = new ByteArrayOutputStream(); var osData = new ReferenceOutput(this, os); p.writeInline(obj, osData); - found = position; if (os.size() == 0) { os.write(0); } byte[] arr = os.toByteArray(); main.write(arr); position += arr.length; - knownObjects.put(obj, found); if (histogram != null) { histogram.register(obj.getClass(), arr.length); }