< 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 >