From e53de72a823c6d70899f9657dfba812e78b2e364 Mon Sep 17 00:00:00 2001 From: naughty610 Date: Wed, 30 Dec 2015 16:56:13 +0800 Subject: [PATCH] =?UTF-8?q?dexmaker=E5=AF=B9abstract=E7=B1=BB=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E4=B8=8Dsuper=20call=20abstract=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/android/dx/stock/ProxyBuilder.java | 69 +++++++++++++--------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/thirdparty/moai-dexmaker/src/main/java/com/android/dx/stock/ProxyBuilder.java b/thirdparty/moai-dexmaker/src/main/java/com/android/dx/stock/ProxyBuilder.java index 6ac84a9..3bbfd75 100644 --- a/thirdparty/moai-dexmaker/src/main/java/com/android/dx/stock/ProxyBuilder.java +++ b/thirdparty/moai-dexmaker/src/main/java/com/android/dx/stock/ProxyBuilder.java @@ -17,13 +17,14 @@ package com.android.dx.stock; import com.android.dx.Code; -import com.android.dx.FieldId; import com.android.dx.Comparison; import com.android.dx.DexMaker; +import com.android.dx.FieldId; import com.android.dx.Label; import com.android.dx.Local; import com.android.dx.MethodId; import com.android.dx.TypeId; + import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; @@ -32,9 +33,6 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import static java.lang.reflect.Modifier.PRIVATE; -import static java.lang.reflect.Modifier.PUBLIC; -import static java.lang.reflect.Modifier.STATIC; import java.lang.reflect.UndeclaredThrowableException; import java.util.Arrays; import java.util.Collections; @@ -45,6 +43,10 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; +import static java.lang.reflect.Modifier.PRIVATE; +import static java.lang.reflect.Modifier.PUBLIC; +import static java.lang.reflect.Modifier.STATIC; + /** * Creates dynamic proxies of concrete classes. *

@@ -458,6 +460,11 @@ public final class ProxyBuilder { Local superResult2 = code.newLocal(resultType); Local nullHandler = code.newLocal(handlerType); + // throw exception if InvocationHandler is null + TypeId iseExceptionType = TypeId.get(IllegalStateException.class); + MethodId iseConstructor = iseExceptionType.getConstructor(); + Local localIse = code.newLocal(iseExceptionType); + code.loadConstant(methodIndex, m); code.sget(allMethods, methodArray); code.aget(thisMethod, methodArray, methodIndex); @@ -487,16 +494,18 @@ public final class ProxyBuilder { // This is required to handle the case of construction of an object which leaks the // "this" pointer. code.mark(handlerNullCase); - for (int i = 0; i < superArgs2.length; ++i) { - superArgs2[i] = code.getParameter(i, argTypes[i]); - } - if (void.class.equals(returnType)) { - code.invokeSuper(superMethod, null, localThis, superArgs2); - code.returnVoid(); - } else { - invokeSuper(superMethod, code, localThis, superArgs2, superResult2); - code.returnValue(superResult2); - } + code.newInstance(localIse, iseConstructor); + code.throwValue(localIse); +// for (int i = 0; i < superArgs2.length; ++i) { +// superArgs2[i] = code.getParameter(i, argTypes[i]); +// } +// if (void.class.equals(returnType)) { +// code.invokeSuper(superMethod, null, localThis, superArgs2); +// code.returnVoid(); +// } else { +// invokeSuper(superMethod, code, localThis, superArgs2, superResult2); +// code.returnValue(superResult2); +// } /* * And to allow calling the original super method, the following is also generated: @@ -507,21 +516,23 @@ public final class ProxyBuilder { * } */ // TODO: don't include a super_ method if the target is abstract! - MethodId callsSuperMethod = generatedType.getMethod( - resultType, superMethodName(method), argTypes); - Code superCode = dexMaker.declare(callsSuperMethod, PUBLIC); - Local superThis = superCode.getThis(generatedType); - Local[] superArgs = new Local[argClasses.length]; - for (int i = 0; i < superArgs.length; ++i) { - superArgs[i] = superCode.getParameter(i, argTypes[i]); - } - if (void.class.equals(returnType)) { - superCode.invokeSuper(superMethod, null, superThis, superArgs); - superCode.returnVoid(); - } else { - Local superResult = superCode.newLocal(resultType); - invokeSuper(superMethod, superCode, superThis, superArgs, superResult); - superCode.returnValue(superResult); + if (!Modifier.isAbstract(method.getModifiers())) { + MethodId callsSuperMethod = generatedType.getMethod( + resultType, superMethodName(method), argTypes); + Code superCode = dexMaker.declare(callsSuperMethod, PUBLIC); + Local superThis = superCode.getThis(generatedType); + Local[] superArgs = new Local[argClasses.length]; + for (int i = 0; i < superArgs.length; ++i) { + superArgs[i] = superCode.getParameter(i, argTypes[i]); + } + if (void.class.equals(returnType)) { + superCode.invokeSuper(superMethod, null, superThis, superArgs); + superCode.returnVoid(); + } else { + Local superResult = superCode.newLocal(resultType); + invokeSuper(superMethod, superCode, superThis, superArgs, superResult); + superCode.returnValue(superResult); + } } } } -- 2.6.2