From 4d28cfc6820e0586a53f824fe6ca9e81acabd621 Mon Sep 17 00:00:00 2001 From: rtrimana Date: Wed, 3 Jul 2019 15:18:30 -0700 Subject: [PATCH 1/1] Fixing a bug: Map's parameterized type signature with wildcard was not handled properly. --- examples/Reflection.java | 22 +++++++++++----------- src/main/gov/nasa/jpf/vm/Types.java | 20 +++++++++++++++----- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/examples/Reflection.java b/examples/Reflection.java index 312248f..0918964 100644 --- a/examples/Reflection.java +++ b/examples/Reflection.java @@ -54,13 +54,13 @@ public class Reflection { public static void main(String[] args) { - BigInteger bi = new BigInteger("-1"); - System.out.println(bi); + //BigInteger bi = new BigInteger("-1"); + //System.out.println(bi); - /* TODO: Enumerate all methods in Class.class - Method[] methods = Class.class.getMethods(); + /* TODO: Enumerate all methods in Class.class */ + Method[] methods = Collection.class.getMethods(); for(Method mth : methods) { - //System.out.println("==========================="); + System.out.println("==========================="); //System.out.println("Method: " + mth.getName()); Type[] parameters = mth.getGenericParameterTypes(); for (int i = 0; i < parameters.length; i++) { @@ -69,9 +69,9 @@ public class Reflection { System.out.println(); Type returnType = mth.getGenericReturnType(); System.out.println(returnType + "\n"); - }*/ + } - Method[] methods = Collection.class.getMethods(); + /*Method[] methods = Collection.class.getMethods(); // Method[] methods = Class.class.getMethods(); Method method = null; for(Method meth : methods) { @@ -84,7 +84,7 @@ public class Reflection { Type returnType = meth.getGenericReturnType(); System.out.println(returnType); System.out.println("==========================="); - } + }*/ /* TODO: This is an excerpt of the BigInteger library int radix = 10; @@ -162,11 +162,11 @@ public class Reflection { System.out.println(interfaces[i]); }*/ - /* - Method[] methods = Collection.class.getMethods(); + + /*Method[] methods = Map.class.getMethods(); Method method = null; for(Method mth : methods) { - if (mth.getName().equals("toArray")) { + if (mth.getName().equals("putAll")) { //if (mth.getName().equals("isAssignableFrom")) { //if (mth.getName().equals("getSuperclass")) { method = mth; diff --git a/src/main/gov/nasa/jpf/vm/Types.java b/src/main/gov/nasa/jpf/vm/Types.java index ba71512..981ac10 100644 --- a/src/main/gov/nasa/jpf/vm/Types.java +++ b/src/main/gov/nasa/jpf/vm/Types.java @@ -1222,20 +1222,30 @@ public class Types { int pos = signature.indexOf('<', 0); if (pos == -1) return new String[0]; + + pos = pos + 1; ArrayList typeVarNames = new ArrayList<>(); while (pos < signature.length()) { String typeVarName = ""; + // Try comma first int comma = signature.indexOf(',', pos); if (comma == -1) { - int closing = signature.lastIndexOf('>', signature.length()); - typeVarName = signature.substring(pos + 1, closing); - pos = signature.length(); + // If not comma then perhaps semicolon + int semicolon = signature.indexOf(';', pos); + if (semicolon == -1) { + int closing = signature.lastIndexOf('>', signature.length()); + typeVarName = signature.substring(pos, closing); + pos = signature.length(); + } else { + typeVarName = signature.substring(pos, semicolon); + pos = semicolon + 1; + } } else { - typeVarName = signature.substring(pos + 1, comma); + typeVarName = signature.substring(pos, comma); pos = comma + 1; } - typeVarNames.add(typeVarName); + typeVarNames.add(typeVarName.trim()); } String[] arrTypeVarNames = new String[typeVarNames.size()]; -- 2.34.1