From af40ea14c4e409e54dfaef07197f020ae06144f2 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Thu, 22 Jan 2026 12:35:41 +0100 Subject: [PATCH] Updates for --debug=dumpLambdaDeserializationStats --- .../sun/tools/javac/comp/LambdaToMethod.java | 3 +- .../tools/javac/resources/compiler.properties | 5 +-- .../LambdaSerializedClassCastException.java | 25 +++++++------- .../LambdaSerializedClassCastException.out | 2 ++ ...bleObjectMethodReferencesOnInterfaces.java | 34 +++++++++++++++---- ...ableObjectMethodReferencesOnInterfaces.out | 8 ++--- .../lambda/SerializableObjectMethods.out | 4 +-- 7 files changed, 53 insertions(+), 28 deletions(-) create mode 100644 test/langtools/tools/javac/lambda/LambdaSerializedClassCastException.out diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java index 3d06dd1aba0..40628709dfe 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java @@ -759,7 +759,8 @@ public class LambdaToMethod extends TreeTranslator { implMethodKind, implClass, implMethodName, - implMethodSignature)); + implMethodSignature, + instantiatedMethodType)); } stmts.append(stmt); } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index 2ba9122c04a..f444fd01ade 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -1701,7 +1701,7 @@ compiler.note.mref.stat.1=\ alternate metafactory = {0}\n\ bridge method = {1} -# 0: string, 1: string, 2: string, 3: number, 4: string, 5: string, 6: string +# 0: string, 1: string, 2: string, 3: number, 4: string, 5: string, 6: string, 7: string compiler.note.lambda.deserialization.stat=\ Generating lambda deserialization\n\ functionalInterfaceClass: {0}\n\ @@ -1710,7 +1710,8 @@ compiler.note.lambda.deserialization.stat=\ implMethodKind: {3}\n\ implClass: {4}\n\ implMethodName: {5}\n\ - implMethodSignature: {6} + implMethodSignature: {6}\n\ + instantiatedMethodType: {7} compiler.note.note=\ Note:\u0020 diff --git a/test/langtools/tools/javac/lambda/LambdaSerializedClassCastException.java b/test/langtools/tools/javac/lambda/LambdaSerializedClassCastException.java index 7a388a9316e..f63f4b64e79 100644 --- a/test/langtools/tools/javac/lambda/LambdaSerializedClassCastException.java +++ b/test/langtools/tools/javac/lambda/LambdaSerializedClassCastException.java @@ -22,10 +22,12 @@ */ /* -@test -@bug 8208752 -@summary NPE generating serializedLambdaName for nested lambda -*/ + * @test + * @bug 8208752 + * @summary NPE generating serializedLambdaName for nested lambda + * @compile/ref=LambdaSerializedClassCastException.out -XDrawDiagnostics --debug=dumpLambdaDeserializationStats LambdaSerializedClassCastException.java + * @run main LambdaSerializedClassCastException + */ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -50,13 +52,12 @@ public class LambdaSerializedClassCastException { @SuppressWarnings("unchecked") static T serialDeserial(T object) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(object); - oos.close(); - ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); - ObjectInputStream ois = new ObjectInputStream(bais); - T result = (T) ois.readObject(); - ois.close(); - return result; + try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { + oos.writeObject(object); + } + try (ObjectInputStream ois = + new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) { + return (T) ois.readObject(); + } } } diff --git a/test/langtools/tools/javac/lambda/LambdaSerializedClassCastException.out b/test/langtools/tools/javac/lambda/LambdaSerializedClassCastException.out new file mode 100644 index 00000000000..4ad61e5e00e --- /dev/null +++ b/test/langtools/tools/javac/lambda/LambdaSerializedClassCastException.out @@ -0,0 +1,2 @@ +LambdaSerializedClassCastException.java:44:59: compiler.note.lambda.deserialization.stat: java/util/function/Function, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Object, toString, ()Ljava/lang/String;, (Ljava/lang/String;)Ljava/lang/String; +LambdaSerializedClassCastException.java:46:59: compiler.note.lambda.deserialization.stat: java/util/function/Function, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Object, toString, ()Ljava/lang/String;, (Ljava/lang/Object;)Ljava/lang/String; diff --git a/test/langtools/tools/javac/lambda/SerializableObjectMethodReferencesOnInterfaces.java b/test/langtools/tools/javac/lambda/SerializableObjectMethodReferencesOnInterfaces.java index 56d58ebdd16..7c52dd57148 100644 --- a/test/langtools/tools/javac/lambda/SerializableObjectMethodReferencesOnInterfaces.java +++ b/test/langtools/tools/javac/lambda/SerializableObjectMethodReferencesOnInterfaces.java @@ -24,19 +24,22 @@ /* * @test * @summary test lambda deserialization for Object method references on interfaces - * @library /tools/lib - * @modules jdk.compiler/com.sun.tools.javac.api - * jdk.compiler/com.sun.tools.javac.main - * jdk.jdeps/com.sun.tools.javap - * @build toolbox.ToolBox toolbox.JavacTask * @compile/ref=SerializableObjectMethodReferencesOnInterfaces.out -XDrawDiagnostics --debug=dumpLambdaDeserializationStats SerializableObjectMethodReferencesOnInterfaces.java + * @run main SerializableObjectMethodReferencesOnInterfaces */ +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.io.Serializable; -import java.lang.classfile.*; public class SerializableObjectMethodReferencesOnInterfaces { + public static void main(String[] args) throws Exception { + new Test().run(); + } + static class Test { interface I1 extends Serializable {} @@ -53,11 +56,28 @@ public class SerializableObjectMethodReferencesOnInterfaces { ONE } - void f() throws Exception { + void run() throws Exception { F f1 = I1::hashCode; F f2 = I2::hashCode; F f3 = E::hashCode; F f4 = Object::hashCode; + + serialDeserial(f1).apply(new I1() {}); + serialDeserial(f2).apply(new I2() {}); + serialDeserial(f3).apply(E.ONE); + serialDeserial(f4).apply(new Object()); + } + } + + @SuppressWarnings("unchecked") + static T serialDeserial(T object) throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { + oos.writeObject(object); + } + try (ObjectInputStream ois = + new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) { + return (T) ois.readObject(); } } } diff --git a/test/langtools/tools/javac/lambda/SerializableObjectMethodReferencesOnInterfaces.out b/test/langtools/tools/javac/lambda/SerializableObjectMethodReferencesOnInterfaces.out index ae2c307674c..92eb705f1f7 100644 --- a/test/langtools/tools/javac/lambda/SerializableObjectMethodReferencesOnInterfaces.out +++ b/test/langtools/tools/javac/lambda/SerializableObjectMethodReferencesOnInterfaces.out @@ -1,4 +1,4 @@ -SerializableObjectMethodReferencesOnInterfaces.java:57:33: compiler.note.lambda.deserialization.stat: SerializableObjectMethodReferencesOnInterfaces$Test$F, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Object, hashCode, ()I -SerializableObjectMethodReferencesOnInterfaces.java:58:33: compiler.note.lambda.deserialization.stat: SerializableObjectMethodReferencesOnInterfaces$Test$F, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Object, hashCode, ()I -SerializableObjectMethodReferencesOnInterfaces.java:59:32: compiler.note.lambda.deserialization.stat: SerializableObjectMethodReferencesOnInterfaces$Test$F, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Enum, hashCode, ()I -SerializableObjectMethodReferencesOnInterfaces.java:60:37: compiler.note.lambda.deserialization.stat: SerializableObjectMethodReferencesOnInterfaces$Test$F, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Object, hashCode, ()I +SerializableObjectMethodReferencesOnInterfaces.java:60:33: compiler.note.lambda.deserialization.stat: SerializableObjectMethodReferencesOnInterfaces$Test$F, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Object, hashCode, ()I, (LSerializableObjectMethodReferencesOnInterfaces$Test$I1;)Ljava/lang/Integer; +SerializableObjectMethodReferencesOnInterfaces.java:61:33: compiler.note.lambda.deserialization.stat: SerializableObjectMethodReferencesOnInterfaces$Test$F, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Object, hashCode, ()I, (LSerializableObjectMethodReferencesOnInterfaces$Test$I2;)Ljava/lang/Integer; +SerializableObjectMethodReferencesOnInterfaces.java:62:32: compiler.note.lambda.deserialization.stat: SerializableObjectMethodReferencesOnInterfaces$Test$F, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Enum, hashCode, ()I, (LSerializableObjectMethodReferencesOnInterfaces$Test$E;)Ljava/lang/Integer; +SerializableObjectMethodReferencesOnInterfaces.java:63:37: compiler.note.lambda.deserialization.stat: SerializableObjectMethodReferencesOnInterfaces$Test$F, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Object, hashCode, ()I, (Ljava/lang/Object;)Ljava/lang/Integer; diff --git a/test/langtools/tools/javac/lambda/SerializableObjectMethods.out b/test/langtools/tools/javac/lambda/SerializableObjectMethods.out index 13c05a44873..56caaabc6de 100644 --- a/test/langtools/tools/javac/lambda/SerializableObjectMethods.out +++ b/test/langtools/tools/javac/lambda/SerializableObjectMethods.out @@ -1,4 +1,4 @@ -SerializableObjectMethods.java:59:35: compiler.note.lambda.deserialization.stat: SerializableObjectMethods$F, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Object, hashCode, ()I -SerializableObjectMethods.java:60:35: compiler.note.lambda.deserialization.stat: SerializableObjectMethods$F, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Object, hashCode, ()I +SerializableObjectMethods.java:59:35: compiler.note.lambda.deserialization.stat: SerializableObjectMethods$F, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Object, hashCode, ()I, (LSerializableObjectMethods$I1;)Ljava/lang/Integer; +SerializableObjectMethods.java:60:35: compiler.note.lambda.deserialization.stat: SerializableObjectMethods$F, apply, (Ljava/lang/Object;)Ljava/lang/Object;, 5, java/lang/Object, hashCode, ()I, (LSerializableObjectMethods$I2;)Ljava/lang/Integer; - compiler.note.unchecked.filename: SerializableObjectMethods.java - compiler.note.unchecked.recompile