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