Skip to content

Commit 032f52c

Browse files
committed
fix: broken cache merging
1 parent 150b8c6 commit 032f52c

File tree

4 files changed

+42
-8
lines changed

4 files changed

+42
-8
lines changed

c2me-opts-dfc/src/main/java/com/ishland/c2me/opts/dfc/common/ducks/IEqualityOverriding.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@ public interface IEqualityOverriding {
44

55
void c2me$overrideEquality(Object object);
66

7+
Object c2me$getOverriddenEquality();
8+
79
}

c2me-opts-dfc/src/main/java/com/ishland/c2me/opts/dfc/common/gen/SubCompiledDensityFunction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public void fill(double[] densities, EachApplier applier) {
8989
@Override
9090
public DensityFunction apply(DensityFunctionVisitor visitor) {
9191
if (this.getClass() != SubCompiledDensityFunction.class) {
92-
throw new UnsupportedOperationException();
92+
throw new AbstractMethodError();
9393
}
9494
boolean modified = false;
9595
Supplier<DensityFunction> fallback = this.blendingFallback != null ? Suppliers.memoize(() -> {

c2me-opts-dfc/src/main/java/com/ishland/c2me/opts/dfc/mixin/MixinChunkNoiseSampler.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@
44
import com.ishland.c2me.opts.dfc.common.ducks.ICoordinatesFilling;
55
import com.ishland.c2me.opts.dfc.common.util.ArrayCache;
66
import net.minecraft.world.gen.chunk.ChunkNoiseSampler;
7+
import net.minecraft.world.gen.densityfunction.DensityFunction;
8+
import net.minecraft.world.gen.densityfunction.DensityFunctionTypes;
79
import org.spongepowered.asm.mixin.Final;
810
import org.spongepowered.asm.mixin.Mixin;
911
import org.spongepowered.asm.mixin.Shadow;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.Inject;
14+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1015

1116
@Mixin(ChunkNoiseSampler.class)
1217
public class MixinChunkNoiseSampler implements IArrayCacheCapable, ICoordinatesFilling {
@@ -16,6 +21,7 @@ public class MixinChunkNoiseSampler implements IArrayCacheCapable, ICoordinatesF
1621
@Shadow private int startBlockY;
1722
@Shadow private int startBlockX;
1823
@Shadow private int startBlockZ;
24+
@Shadow private boolean isInInterpolationLoop;
1925
private final ArrayCache c2me$arrayCache = new ArrayCache();
2026

2127
@Override
@@ -42,4 +48,11 @@ public class MixinChunkNoiseSampler implements IArrayCacheCapable, ICoordinatesF
4248
}
4349
}
4450
}
51+
52+
@Inject(method = "getActualDensityFunctionImpl", at = @At("HEAD"))
53+
private void protectInterpolationLoop(DensityFunction function, CallbackInfoReturnable<DensityFunction> cir) {
54+
if (this.isInInterpolationLoop && function instanceof DensityFunctionTypes.Wrapping) {
55+
throw new IllegalStateException("Cannot create more wrapping during interpolation loop");
56+
}
57+
}
4558
}

c2me-opts-dfc/src/main/java/com/ishland/c2me/opts/dfc/mixin/MixinDFTWrapping.java

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import org.spongepowered.asm.mixin.Unique;
1515

1616
@Mixin(DensityFunctionTypes.Wrapping.class)
17-
public abstract class MixinDFTWrapping implements IFastCacheLike, IEqualityOverriding {
17+
public abstract class MixinDFTWrapping implements IFastCacheLike, IEqualityOverriding, DensityFunctionTypes.Wrapper {
1818

1919
@Mutable
2020
@Shadow @Final private DensityFunction wrapped;
@@ -58,7 +58,20 @@ public abstract class MixinDFTWrapping implements IFastCacheLike, IEqualityOverr
5858

5959
@Override
6060
public void c2me$overrideEquality(Object object) {
61-
this.c2me$optionalEquality = object;
61+
Object inner = object;
62+
while (true) {
63+
Object inner1 = inner instanceof IEqualityOverriding e1 ? e1.c2me$getOverriddenEquality() : null;
64+
if (inner1 == null) {
65+
this.c2me$optionalEquality = inner;
66+
break;
67+
}
68+
inner = inner1;
69+
}
70+
}
71+
72+
@Override
73+
public Object c2me$getOverriddenEquality() {
74+
return this.c2me$optionalEquality;
6275
}
6376

6477
@WrapMethod(method = "hashCode")
@@ -72,12 +85,18 @@ private int wrapHashCode(Operation<Integer> original) {
7285
}
7386

7487
@WrapMethod(method = "equals")
75-
private boolean wrapEquals(Object object, Operation<Boolean> original) {
76-
Object c2me$optionalEquality1 = this.c2me$optionalEquality;
77-
if (c2me$optionalEquality1 != null) {
78-
return c2me$optionalEquality1.equals(object);
88+
private boolean wrapEquals(Object that, Operation<Boolean> original) {
89+
Object a = this.c2me$getOverriddenEquality();
90+
Object b = that instanceof IEqualityOverriding equalityOverriding ? equalityOverriding.c2me$getOverriddenEquality() : null;
91+
if (a == null) {
92+
return original.call(b != null ? b : that);
7993
} else {
80-
return original.call(object);
94+
return a.equals(b != null ? b : that);
8195
}
8296
}
97+
98+
@Override
99+
public DensityFunction apply(DensityFunctionVisitor visitor) {
100+
return visitor.apply(this.c2me$withDelegate(this.wrapped().apply(visitor)));
101+
}
83102
}

0 commit comments

Comments
 (0)