lambda: Add support for invoke-interface for boxed innate lambdas
Lambda closures created with the 'create-lambda' instruction
(termed "innate lambdas") can be turned into an object with 'box-lambda'.
This CL enables support for those kinds of lambdas to work with
'invoke-interface' by generating a proxy class for the lambda.
Note: MIPS32/64 support not included.
Bug: 24618608
Bug: 25107649
Change-Id: Ic8f1bb66ebeaed4097e758a50becf1cff6ccaefb
diff --git a/runtime/native/java_lang_reflect_Proxy.cc b/runtime/native/java_lang_reflect_Proxy.cc
index 4a6ab40..647cec0 100644
--- a/runtime/native/java_lang_reflect_Proxy.cc
+++ b/runtime/native/java_lang_reflect_Proxy.cc
@@ -27,15 +27,31 @@
namespace art {
static jclass Proxy_generateProxy(JNIEnv* env, jclass, jstring name, jobjectArray interfaces,
- jobject loader, jobjectArray methods, jobjectArray throws) {
+ jobject loader, jobjectArray methods, jobjectArray throws,
+ jboolean is_lambda_proxy) {
ScopedFastNativeObjectAccess soa(env);
ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
- return soa.AddLocalReference<jclass>(class_linker->CreateProxyClass(
- soa, name, interfaces, loader, methods, throws));
+
+ mirror::Class* proxy_class = nullptr;
+
+ if (UNLIKELY(is_lambda_proxy)) {
+ bool already_exists; // XX: Perhaps add lambdaProxyCache to java.lang.ClassLoader ?
+ proxy_class = class_linker->CreateLambdaProxyClass(soa,
+ name,
+ interfaces,
+ loader,
+ methods,
+ throws,
+ /*out*/&already_exists);
+ } else {
+ proxy_class = class_linker->CreateProxyClass(soa, name, interfaces, loader, methods, throws);
+ }
+
+ return soa.AddLocalReference<jclass>(proxy_class);
}
static JNINativeMethod gMethods[] = {
- NATIVE_METHOD(Proxy, generateProxy, "!(Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/ClassLoader;[Ljava/lang/reflect/Method;[[Ljava/lang/Class;)Ljava/lang/Class;"),
+ NATIVE_METHOD(Proxy, generateProxy, "!(Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/ClassLoader;[Ljava/lang/reflect/Method;[[Ljava/lang/Class;Z)Ljava/lang/Class;"),
};
void register_java_lang_reflect_Proxy(JNIEnv* env) {