Skip to content

Commit 3af74b5

Browse files
committed
I missed that LinRecordBuilder was mutable state somehow
1 parent bf6ff55 commit 3af74b5

2 files changed

Lines changed: 15 additions & 4 deletions

File tree

dfu/src/main/java/org/enginehub/linbus/dfu/LinOps.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,6 @@ public static LinOps getInstance() {
7171
return INSTANCE;
7272
}
7373

74-
private final LinRecordBuilder recordBuilder = new LinRecordBuilder(this);
75-
7674
private LinOps() {
7775
}
7876

@@ -450,7 +448,7 @@ public LinTag<?> remove(LinTag<?> input, String key) {
450448

451449
@Override
452450
public RecordBuilder<LinTag<?>> mapBuilder() {
453-
return recordBuilder;
451+
return new LinRecordBuilder(this);
454452
}
455453

456454
@Override

dfu/src/test/java/org/enginehub/linbus/dfu/LinOpsRecordBuilderTest.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package org.enginehub.linbus.dfu;
2020

2121
import com.mojang.serialization.DataResult;
22+
import com.mojang.serialization.RecordBuilder;
2223
import org.enginehub.linbus.tree.LinCompoundTag;
2324
import org.enginehub.linbus.tree.LinEndTag;
2425
import org.enginehub.linbus.tree.LinIntTag;
@@ -78,10 +79,22 @@ void addRejectsEndValue() {
7879
.hasErrorWithMessageThat().startsWith("Cannot add END tag to compound: ");
7980
}
8081

82+
@Test
83+
@DisplayName("each mapBuilder() call is independent, so concurrent builders don't leak into each other")
84+
void mapBuilderCallsAreIndependent() {
85+
RecordBuilder<LinTag<?>> first = OPS.mapBuilder().add("a", LinIntTag.of(1));
86+
RecordBuilder<LinTag<?>> second = OPS.mapBuilder().add("b", LinIntTag.of(2));
87+
88+
assertThat(first.build(OPS.empty()))
89+
.hasResultThat().isEqualTo(LinCompoundTag.builder().putInt("a", 1).build());
90+
assertThat(second.build(OPS.empty()))
91+
.hasResultThat().isEqualTo(LinCompoundTag.builder().putInt("b", 2).build());
92+
}
93+
8194
@Test
8295
void addRejectsEndValueFromDataResult() {
8396
assertThat(
84-
OPS.mapBuilder().add("a", DataResult.success((LinTag<?>) LinEndTag.instance())).build(OPS.empty())
97+
OPS.mapBuilder().add("a", DataResult.success(LinEndTag.instance())).build(OPS.empty())
8598
).hasErrorWithMessageThat().startsWith("Cannot add END tag to compound: ");
8699
}
87100
}

0 commit comments

Comments
 (0)