Skip to content

Commit 01ee424

Browse files
asotonacl4es
andcommitted
8294960: Convert java.base/java.lang.invoke package to use the Classfile API to generate lambdas and method handles
Co-authored-by: Claes Redestad <redestad@openjdk.org> Reviewed-by: redestad, liach
1 parent 50bed6c commit 01ee424

File tree

11 files changed

+1298
-1716
lines changed

11 files changed

+1298
-1716
lines changed

src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java

Lines changed: 219 additions & 283 deletions
Large diffs are not rendered by default.

src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@
2525

2626
package java.lang.invoke;
2727

28-
import jdk.internal.org.objectweb.asm.ClassWriter;
29-
import jdk.internal.org.objectweb.asm.Opcodes;
3028
import sun.invoke.util.Wrapper;
3129

30+
import java.lang.classfile.ClassFile;
31+
import java.lang.classfile.attribute.SourceFileAttribute;
32+
import java.lang.constant.ClassDesc;
3233
import java.util.ArrayList;
3334
import java.util.HashSet;
3435
import java.util.Map;
@@ -38,10 +39,10 @@
3839
import java.util.TreeSet;
3940
import java.util.stream.Stream;
4041

42+
import static java.lang.classfile.ClassFile.*;
4143
import static java.lang.invoke.LambdaForm.BasicType.*;
42-
import static java.lang.invoke.MethodHandleStatics.CLASSFILE_VERSION;
43-
import static java.lang.invoke.MethodTypeForm.*;
4444
import static java.lang.invoke.LambdaForm.Kind.*;
45+
import static java.lang.invoke.MethodTypeForm.*;
4546

4647
/**
4748
* Helper class to assist the GenerateJLIClassesPlugin to get access to
@@ -557,19 +558,14 @@ static byte[] generateInvokersHolderClassBytes(String className,
557558
* a class with a specified name.
558559
*/
559560
private static byte[] generateCodeBytesForLFs(String className, String[] names, LambdaForm[] forms) {
560-
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
561-
cw.visit(CLASSFILE_VERSION, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER,
562-
className, null, InvokerBytecodeGenerator.INVOKER_SUPER_NAME, null);
563-
cw.visitSource(className.substring(className.lastIndexOf('/') + 1), null);
564-
565-
for (int i = 0; i < forms.length; i++) {
566-
InvokerBytecodeGenerator g
567-
= new InvokerBytecodeGenerator(className, names[i], forms[i], forms[i].methodType());
568-
g.setClassWriter(cw);
569-
g.addMethod();
570-
}
571-
572-
return cw.toByteArray();
561+
return ClassFile.of().build(ClassDesc.ofInternalName(className), clb -> {
562+
clb.withFlags(ACC_PRIVATE | ACC_FINAL | ACC_SUPER)
563+
.withSuperclass(InvokerBytecodeGenerator.INVOKER_SUPER_DESC)
564+
.with(SourceFileAttribute.of(className.substring(className.lastIndexOf('/') + 1)));
565+
for (int i = 0; i < forms.length; i++) {
566+
new InvokerBytecodeGenerator(className, names[i], forms[i], forms[i].methodType()).addMethod(clb);
567+
}
568+
});
573569
}
574570

575571
private static LambdaForm makeReinvokerFor(MethodType type) {

src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java

Lines changed: 264 additions & 288 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)