From 3af74b5a413dff115df470cc467f38bf8f8ff920 Mon Sep 17 00:00:00 2001 From: Octavia Togami Date: Sun, 12 Jul 2026 12:28:00 -0700 Subject: [PATCH] I missed that LinRecordBuilder was mutable state somehow --- .../java/org/enginehub/linbus/dfu/LinOps.java | 4 +--- .../linbus/dfu/LinOpsRecordBuilderTest.java | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/dfu/src/main/java/org/enginehub/linbus/dfu/LinOps.java b/dfu/src/main/java/org/enginehub/linbus/dfu/LinOps.java index 5a333cf..6326c05 100644 --- a/dfu/src/main/java/org/enginehub/linbus/dfu/LinOps.java +++ b/dfu/src/main/java/org/enginehub/linbus/dfu/LinOps.java @@ -71,8 +71,6 @@ public static LinOps getInstance() { return INSTANCE; } - private final LinRecordBuilder recordBuilder = new LinRecordBuilder(this); - private LinOps() { } @@ -450,7 +448,7 @@ public LinTag remove(LinTag input, String key) { @Override public RecordBuilder> mapBuilder() { - return recordBuilder; + return new LinRecordBuilder(this); } @Override diff --git a/dfu/src/test/java/org/enginehub/linbus/dfu/LinOpsRecordBuilderTest.java b/dfu/src/test/java/org/enginehub/linbus/dfu/LinOpsRecordBuilderTest.java index 2d44ef6..0f5c9f0 100644 --- a/dfu/src/test/java/org/enginehub/linbus/dfu/LinOpsRecordBuilderTest.java +++ b/dfu/src/test/java/org/enginehub/linbus/dfu/LinOpsRecordBuilderTest.java @@ -19,6 +19,7 @@ package org.enginehub.linbus.dfu; import com.mojang.serialization.DataResult; +import com.mojang.serialization.RecordBuilder; import org.enginehub.linbus.tree.LinCompoundTag; import org.enginehub.linbus.tree.LinEndTag; import org.enginehub.linbus.tree.LinIntTag; @@ -78,10 +79,22 @@ void addRejectsEndValue() { .hasErrorWithMessageThat().startsWith("Cannot add END tag to compound: "); } + @Test + @DisplayName("each mapBuilder() call is independent, so concurrent builders don't leak into each other") + void mapBuilderCallsAreIndependent() { + RecordBuilder> first = OPS.mapBuilder().add("a", LinIntTag.of(1)); + RecordBuilder> second = OPS.mapBuilder().add("b", LinIntTag.of(2)); + + assertThat(first.build(OPS.empty())) + .hasResultThat().isEqualTo(LinCompoundTag.builder().putInt("a", 1).build()); + assertThat(second.build(OPS.empty())) + .hasResultThat().isEqualTo(LinCompoundTag.builder().putInt("b", 2).build()); + } + @Test void addRejectsEndValueFromDataResult() { assertThat( - OPS.mapBuilder().add("a", DataResult.success((LinTag) LinEndTag.instance())).build(OPS.empty()) + OPS.mapBuilder().add("a", DataResult.success(LinEndTag.instance())).build(OPS.empty()) ).hasErrorWithMessageThat().startsWith("Cannot add END tag to compound: "); } }