< 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,53 ****
private ResolvedJavaType returnTypeCache;
private final HotSpotJVMCIRuntimeProvider runtime;
public HotSpotSignature(HotSpotJVMCIRuntimeProvider runtime, String signature) {
this.runtime = runtime;
! assert signature.length() > 0;
this.originalString = signature;
if (signature.charAt(0) == '(') {
int cur = 1;
while (cur < signature.length() && signature.charAt(cur) != ')') {
--- 43,55 ----
private ResolvedJavaType returnTypeCache;
private final HotSpotJVMCIRuntimeProvider runtime;
public HotSpotSignature(HotSpotJVMCIRuntimeProvider runtime, String signature) {
this.runtime = runtime;
! 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,69 ****
}
cur++;
int nextCur = parseSignature(signature, cur);
returnType = signature.substring(cur, nextCur);
! assert nextCur == signature.length();
} else {
! returnType = null;
}
}
public HotSpotSignature(HotSpotJVMCIRuntimeProvider runtime, ResolvedJavaType returnType, ResolvedJavaType... parameterTypes) {
this.runtime = runtime;
--- 59,73 ----
}
cur++;
int nextCur = parseSignature(signature, cur);
returnType = signature.substring(cur, nextCur);
! if (nextCur != signature.length()) {
! throw new IllegalArgumentException("Extra characters at end of signature: " + signature);
! }
} else {
! throw new IllegalArgumentException("Signature must start with a '(': " + signature);
}
}
public HotSpotSignature(HotSpotJVMCIRuntimeProvider runtime, ResolvedJavaType returnType, ResolvedJavaType... parameterTypes) {
this.runtime = runtime;
*** 79,97 ****
this.originalString = sb.toString();
assert new HotSpotSignature(runtime, originalString).equals(this);
}
private static int parseSignature(String signature, int start) {
int cur = start;
char first;
do {
! first = signature.charAt(cur++);
} while (first == '[');
switch (first) {
case 'L':
while (signature.charAt(cur) != ';') {
cur++;
}
cur++;
break;
case 'V':
--- 83,106 ----
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);
! 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,115 ****
case 'J':
case 'S':
case 'Z':
break;
default:
! throw new JVMCIError("Invalid character at index %d in signature: %s", cur, signature);
}
return cur;
}
@Override
public int getParameterCount(boolean withReceiver) {
return parameters.size() + (withReceiver ? 1 : 0);
--- 112,127 ----
case 'J':
case 'S':
case 'Z':
break;
default:
! 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 >