Skip to content

Commit 5362519

Browse files
committed
Make method generation order sorted by MethodKey
helps maintain a more deterministic order
1 parent eb639db commit 5362519

File tree

8 files changed

+28
-14
lines changed

8 files changed

+28
-14
lines changed

src/main/java/io/papermc/asm/rules/RewriteRule.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.papermc.asm.ClassProcessingContext;
44
import io.papermc.asm.rules.builder.RuleFactory;
5+
import io.papermc.asm.util.DescriptorUtils;
56
import java.lang.constant.ClassDesc;
67
import java.util.ArrayList;
78
import java.util.Arrays;
@@ -26,7 +27,7 @@ static RewriteRule forOwnerClass(final Class<?> owner, final Consumer<? super Ru
2627

2728
@SafeVarargs
2829
static RewriteRule forOwnerClasses(final Set<Class<?>> owners, final Consumer<? super RuleFactory> firstFactoryConsumer, final Consumer<? super RuleFactory>... factoryConsumers) {
29-
return forOwners(owners.stream().map(c -> c.describeConstable().orElseThrow()).collect(Collectors.toUnmodifiableSet()), firstFactoryConsumer, factoryConsumers);
30+
return forOwners(owners.stream().map(DescriptorUtils::desc).collect(Collectors.toUnmodifiableSet()), firstFactoryConsumer, factoryConsumers);
3031
}
3132

3233
@SafeVarargs
@@ -49,7 +50,13 @@ static RewriteRule chain(final RewriteRule... rules) {
4950
}
5051

5152
static RewriteRule chain(final Collection<? extends RewriteRule> rules) {
52-
return new Chain(List.copyOf(rules));
53+
final List<? extends RewriteRule> filteredRules = rules.stream().filter(r -> r != EMPTY).toList();
54+
if (filteredRules.isEmpty()) {
55+
return EMPTY;
56+
} else if (filteredRules.size() == 1) {
57+
return filteredRules.iterator().next();
58+
}
59+
return new Chain(filteredRules);
5360
}
5461

5562
static ChainBuilder chain() {
@@ -73,16 +80,17 @@ default ClassVisitor createVisitor(final int api, final ClassVisitor parent, fin
7380
}
7481
}
7582

76-
record Chain(List<RewriteRule> rules) implements RewriteRule {
77-
public Chain(final List<RewriteRule> rules) {
78-
this.rules = List.copyOf(rules);
83+
record Chain(List<? extends RewriteRule> rules) implements RewriteRule {
84+
public Chain {
85+
rules = List.copyOf(rules);
7986
}
8087

8188
@Override
8289
public ClassVisitor createVisitor(final int api, final ClassVisitor parent, final ClassProcessingContext context) {
8390
ClassVisitor visitor = parent;
84-
for (final RewriteRule rule : this.rules) {
85-
visitor = rule.createVisitor(api, visitor, context);
91+
// iterate over this.rules backwards to ensure the first rule is the outermost visitor
92+
for (int i = this.rules.size() - 1; i >= 0; i--) {
93+
visitor = this.rules.get(i).createVisitor(api, visitor, context);
8694
}
8795
return visitor;
8896
}
@@ -109,7 +117,7 @@ public ChainBuilder then(final RewriteRule... rules) {
109117
}
110118

111119
public RewriteRule build() {
112-
return new Chain(this.rules);
120+
return RewriteRule.chain(this.rules);
113121
}
114122
}
115123
}

src/main/java/io/papermc/asm/rules/builder/RuleFactoryImpl.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,6 @@ private static Method isStatic(final Method staticHandler) {
101101

102102
@Override
103103
public RewriteRule build() {
104-
if (this.rules.size() == 1) {
105-
return this.rules.get(0);
106-
}
107104
return RewriteRule.chain(this.rules);
108105
}
109106
}

src/main/java/io/papermc/asm/rules/method/MethodRewriteRule.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
import io.papermc.asm.rules.method.rewrite.MethodRewrite;
66
import java.lang.constant.ClassDesc;
77
import java.lang.constant.MethodTypeDesc;
8-
import java.util.LinkedHashMap;
8+
import java.util.Comparator;
99
import java.util.Map;
10+
import java.util.TreeMap;
1011
import org.checkerframework.checker.nullness.qual.Nullable;
1112
import org.objectweb.asm.ClassVisitor;
1213
import org.objectweb.asm.Handle;
@@ -56,9 +57,17 @@ default boolean shouldProcess(final ClassProcessingContext context, final int op
5657

5758
@Override
5859
default ClassVisitor createVisitor(final int api, final ClassVisitor parent, final ClassProcessingContext context) {
59-
record MethodKey(String owner, String name, MethodTypeDesc descriptor) {
60+
record MethodKey(String owner, String name, MethodTypeDesc descriptor) implements Comparable<MethodKey> {
61+
private static final Comparator<MethodKey> COMPARATOR = Comparator.comparing(MethodKey::owner)
62+
.thenComparing(MethodKey::name)
63+
.thenComparing(key -> key.descriptor().descriptorString());
64+
65+
@Override
66+
public int compareTo(final MethodKey o) {
67+
return COMPARATOR.compare(this, o);
68+
}
6069
}
61-
final Map<MethodKey, MethodRewrite.MethodGenerator> methodsToGenerate = new LinkedHashMap<>();
70+
final Map<MethodKey, MethodRewrite.MethodGenerator> methodsToGenerate = new TreeMap<>();
6271
return new ClassVisitor(api, parent) {
6372

6473
@Override
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)