blob: 1415b495b39840b495c8a87f71362d93ddb94e16 [file] [log] [blame]
// 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;
}
}