Mercurial > hg > graal-jvmci-8
diff jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java @ 23789:0cb263db490f
use MethodParameters attribute instead of depending on -g option for sanity checks (JDK-8168915)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Fri, 04 Nov 2016 14:22:47 +0100 |
parents | aaed278a9cf1 |
children | 224f43824e2b |
line wrap: on
line diff
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java Fri Nov 04 14:18:01 2016 +0100 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java Fri Nov 04 14:22:47 2016 +0100 @@ -33,8 +33,10 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Executable; +import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Type; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -462,6 +464,22 @@ } @Override + public Parameter[] getParameters() { + Executable javaMethod = toJava(); + if (javaMethod == null) { + return null; + } + + java.lang.reflect.Parameter[] javaParameters = javaMethod.getParameters(); + Parameter[] res = new Parameter[javaParameters.length]; + for (int i = 0; i < res.length; i++) { + java.lang.reflect.Parameter src = javaParameters[i]; + res[i] = new Parameter(src.getName(), src.getModifiers(), this, i); + } + return res; + } + + @Override public Annotation[][] getParameterAnnotations() { Executable javaMethod = toJava(); return javaMethod == null ? null : javaMethod.getParameterAnnotations(); @@ -531,13 +549,31 @@ return result; } + private static Method searchMethods(Method[] methods, String name, Class<?> returnType, Class<?>[] parameterTypes) { + for (Method m : methods) { + if (m.getName().equals(name) && returnType.equals(m.getReturnType()) && Arrays.equals(m.getParameterTypes(), parameterTypes)) { + return m; + } + } + return null; + } + private Executable toJava() { if (toJavaCache != null) { return toJavaCache; } try { Class<?>[] parameterTypes = signatureToTypes(); - Executable result = isConstructor() ? holder.mirror().getDeclaredConstructor(parameterTypes) : holder.mirror().getDeclaredMethod(name, parameterTypes); + Class<?> returnType = ((HotSpotResolvedJavaType) getSignature().getReturnType(holder).resolve(holder)).mirror(); + + Executable result; + if (isConstructor()) { + result = holder.mirror().getDeclaredConstructor(parameterTypes); + } else { + // Do not use Method.getDeclaredMethod() as it can return a bridge method + // when this.isBridge() is false and vice versa. + result = searchMethods(holder.mirror().getDeclaredMethods(), name, returnType, parameterTypes); + } toJavaCache = result; return result; } catch (NoSuchMethodException | NoClassDefFoundError e) {