|  | // Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | package com.android.tools.r8.cf; | 
|  |  | 
|  | import java.io.ByteArrayInputStream; | 
|  | import java.io.ByteArrayOutputStream; | 
|  | import java.io.IOException; | 
|  | import java.io.ObjectInputStream; | 
|  | import java.io.ObjectOutputStream; | 
|  | import java.io.Serializable; | 
|  | import java.lang.reflect.InvocationTargetException; | 
|  | import java.lang.reflect.Method; | 
|  |  | 
|  | class KeepDeserializeLambdaMethodTest { | 
|  | static final String LAMBDA_MESSAGE = "[I'm the lambda.]"; | 
|  |  | 
|  | static void invokeLambda(Object o) | 
|  | throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { | 
|  | Method runMethod = o.getClass().getMethod("run"); | 
|  | runMethod.invoke(o); | 
|  | } | 
|  |  | 
|  | static Serializable getLambda() { | 
|  | return (Runnable & Serializable) () -> System.out.println("base lambda"); | 
|  | } | 
|  | } | 
|  |  | 
|  | class KeepDeserializeLambdaMethodTestDex extends KeepDeserializeLambdaMethodTest { | 
|  | public static void main(String[] args) throws Exception { | 
|  | invokeLambda(getLambda()); | 
|  | invokeLambda( | 
|  | (Runnable & Serializable) | 
|  | () -> System.out.println(KeepDeserializeLambdaMethodTest.LAMBDA_MESSAGE)); | 
|  | } | 
|  | } | 
|  |  | 
|  | class KeepDeserializeLambdaMethodTestCf extends KeepDeserializeLambdaMethodTest { | 
|  |  | 
|  | public static void main(String[] args) throws Exception { | 
|  | invokeLambda(roundtrip(getLambda())); | 
|  | invokeLambda(roundtrip((Runnable & Serializable) () -> System.out.println(LAMBDA_MESSAGE))); | 
|  | } | 
|  |  | 
|  | private static Object roundtrip(Serializable myLambda) | 
|  | throws IOException, ClassNotFoundException { | 
|  | byte[] bytes; | 
|  | { | 
|  | ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); | 
|  | ObjectOutputStream out = new ObjectOutputStream(byteStream); | 
|  | out.writeObject(myLambda); | 
|  | out.close(); | 
|  | bytes = byteStream.toByteArray(); | 
|  | } | 
|  | Object o; | 
|  | { | 
|  | ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes); | 
|  | ObjectInputStream in = new ObjectInputStream(byteStream); | 
|  | o = in.readObject(); | 
|  | in.close(); | 
|  | } | 
|  | return o; | 
|  | } | 
|  | } |