< prev index next >

src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotSignature.java

Print this page

        

@@ -43,11 +43,13 @@
     private ResolvedJavaType returnTypeCache;
     private final HotSpotJVMCIRuntimeProvider runtime;
 
     public HotSpotSignature(HotSpotJVMCIRuntimeProvider runtime, String signature) {
         this.runtime = runtime;
-        assert signature.length() > 0;
+        if (signature.length() == 0) {
+            throw new IllegalArgumentException("Signature cannot be empty");
+        }
         this.originalString = signature;
 
         if (signature.charAt(0) == '(') {
             int cur = 1;
             while (cur < signature.length() && signature.charAt(cur) != ')') {

@@ -57,13 +59,15 @@
             }
 
             cur++;
             int nextCur = parseSignature(signature, cur);
             returnType = signature.substring(cur, nextCur);
-            assert nextCur == signature.length();
+            if (nextCur != signature.length()) {
+                throw new IllegalArgumentException("Extra characters at end of signature: " + signature);
+            }
         } else {
-            returnType = null;
+            throw new IllegalArgumentException("Signature must start with a '(': " + signature);
         }
     }
 
     public HotSpotSignature(HotSpotJVMCIRuntimeProvider runtime, ResolvedJavaType returnType, ResolvedJavaType... parameterTypes) {
         this.runtime = runtime;

@@ -79,19 +83,24 @@
         this.originalString = sb.toString();
         assert new HotSpotSignature(runtime, originalString).equals(this);
     }
 
     private static int parseSignature(String signature, int start) {
+        try {
         int cur = start;
         char first;
         do {
-            first = signature.charAt(cur++);
+                first = signature.charAt(cur);
+                cur++;
         } while (first == '[');
 
         switch (first) {
             case 'L':
                 while (signature.charAt(cur) != ';') {
+                        if (signature.charAt(cur) == '.') {
+                            throw new IllegalArgumentException("Class name in signature contains '.' at index " + cur + ": " + signature);
+                        }
                     cur++;
                 }
                 cur++;
                 break;
             case 'V':

@@ -103,13 +112,16 @@
             case 'J':
             case 'S':
             case 'Z':
                 break;
             default:
-                throw new JVMCIError("Invalid character at index %d in signature: %s", cur, signature);
+                    throw new IllegalArgumentException("Invalid character '" + signature.charAt(cur - 1) + "' at index " + (cur - 1) + " in signature: " + signature);
         }
         return cur;
+        } catch (StringIndexOutOfBoundsException e) {
+            throw new IllegalArgumentException("Truncated signature: " + signature);
+        }
     }
 
     @Override
     public int getParameterCount(boolean withReceiver) {
         return parameters.size() + (withReceiver ? 1 : 0);
< prev index next >