-
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathParameterGeneration.java
More file actions
69 lines (56 loc) · 2.31 KB
/
ParameterGeneration.java
File metadata and controls
69 lines (56 loc) · 2.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package io.papermc.classfile.generation;
import java.lang.classfile.CodeBuilder;
import java.lang.classfile.TypeKind;
import java.lang.constant.ClassDesc;
import java.lang.constant.MethodTypeDesc;
import java.util.function.Consumer;
@FunctionalInterface
public interface ParameterGeneration {
static ParameterGeneration standard() {
return Standard.INSTANCE;
}
static ParameterGeneration standard(final Consumer<CodeBuilder> prefix) {
return (descriptor, builder) -> {
prefix.accept(builder);
Standard.INSTANCE.generateParameters(descriptor, builder);
};
}
static ParameterGeneration mutating(final Mutating mutator) {
return mutating($ -> {}, mutator);
}
static ParameterGeneration mutating(final Consumer<CodeBuilder> prefix, final Mutating mutator) {
return (descriptor, builder) -> {
prefix.accept(builder);
mutator.generateParameters(descriptor, builder);
};
}
void generateParameters(MethodTypeDesc descriptor, CodeBuilder builder);
record Standard() implements ParameterGeneration {
private static final Standard INSTANCE = new Standard();
@Override
public void generateParameters(final MethodTypeDesc descriptor, final CodeBuilder builder) {
// Load all parameters (using correct slots for wide types)
int slot = 0;
for (final ClassDesc paramType : descriptor.parameterList()) {
final TypeKind typeKind = TypeKind.from(paramType);
builder.loadLocal(typeKind, slot);
slot += typeKind.slotSize();
}
}
}
@FunctionalInterface
interface Mutating extends ParameterGeneration {
@Override
default void generateParameters(final MethodTypeDesc descriptor, final CodeBuilder builder) {
// Load all parameters (using correct slots for wide types)
int slot = 0;
for (final ClassDesc paramType : descriptor.parameterList()) {
final TypeKind typeKind = TypeKind.from(paramType);
builder.loadLocal(typeKind, slot);
this.mutate(paramType, builder);
slot += typeKind.slotSize();
}
}
void mutate(ClassDesc paramType, CodeBuilder builder);
}
}