Skip to content

Commit ce3ca23

Browse files
committed
Add lazy data constant API
1 parent 2017099 commit ce3ca23

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

src/main/java/dev/lukebemish/bytecodebuilder/ClassContext.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.lang.constant.MethodTypeDesc;
88
import java.lang.invoke.MethodHandles;
99
import java.util.Collection;
10-
import java.util.List;
1110
import java.util.Set;
1211
import java.util.function.BiConsumer;
1312
import java.util.function.Consumer;
@@ -41,7 +40,7 @@ public static MethodHandles.Lookup hidden(MethodHandles.Lookup lookup, boolean i
4140
if (tracker.data.isEmpty()) {
4241
return lookup.defineHiddenClass(bytes, initialize, options.toArray(MethodHandles.Lookup.ClassOption[]::new));
4342
} else {
44-
return lookup.defineHiddenClassWithClassData(bytes, List.copyOf(tracker.data), initialize, options.toArray(MethodHandles.Lookup.ClassOption[]::new));
43+
return lookup.defineHiddenClassWithClassData(bytes, tracker.data.stream().map(ClassDataTracker.DataValue::resolve).toList(), initialize, options.toArray(MethodHandles.Lookup.ClassOption[]::new));
4544
}
4645
}
4746
}

src/main/java/dev/lukebemish/bytecodebuilder/ClassDataTracker.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,39 @@
44
import java.lang.constant.DynamicConstantDesc;
55
import java.util.ArrayList;
66
import java.util.List;
7+
import java.util.function.Supplier;
78

89
public final class ClassDataTracker {
9-
final List<Object> data = new ArrayList<>();
10+
sealed interface DataValue {
11+
Object resolve();
12+
13+
record Direct(Object object) implements DataValue {
14+
@Override
15+
public Object resolve() {
16+
return object;
17+
}
18+
}
19+
record Lazy(Supplier<Object> object) implements DataValue {
20+
@Override
21+
public Object resolve() {
22+
return object.get();
23+
}
24+
}
25+
}
26+
27+
final List<DataValue> data = new ArrayList<>();
1028

1129
ClassDataTracker() {}
1230

1331
public DynamicConstantDesc<?> dataConstant(ClassDesc descriptor, Object value) {
1432
var idx = data.size();
15-
data.add(value);
33+
data.add(new DataValue.Direct(value));
34+
return Constants.classDataAt(descriptor, idx);
35+
}
36+
37+
public DynamicConstantDesc<?> delayedDataConstant(ClassDesc descriptor, Supplier<Object> value) {
38+
var idx = data.size();
39+
data.add(new DataValue.Lazy(value));
1640
return Constants.classDataAt(descriptor, idx);
1741
}
1842
}

0 commit comments

Comments
 (0)