Java Code Examples for org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException#ErrInvalidMethodSignature

The following examples show how to use org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException#ErrInvalidMethodSignature . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: BinaryIndexer.java    From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 4 votes vote down vote up
private char[] decodeFieldType(char[] signature) throws ClassFormatException {
	if (signature == null) return null;
	int arrayDim = 0;
	for (int i = 0, max = signature.length; i < max; i++) {
		switch(signature[i]) {
			case 'B':
				if (arrayDim > 0)
					return convertToArrayType(BYTE, arrayDim);
				return BYTE;

			case 'C':
				if (arrayDim > 0)
					return convertToArrayType(CHAR, arrayDim);
				return CHAR;

			case 'D':
				if (arrayDim > 0)
					return convertToArrayType(DOUBLE, arrayDim);
				return DOUBLE;

			case 'F':
				if (arrayDim > 0)
					return convertToArrayType(FLOAT, arrayDim);
				return FLOAT;

			case 'I':
				if (arrayDim > 0)
				return convertToArrayType(INT, arrayDim);
				return INT;

			case 'J':
				if (arrayDim > 0)
					return convertToArrayType(LONG, arrayDim);
				return LONG;

			case 'L':
				int indexOfSemiColon = CharOperation.indexOf(';', signature, i+1);
				if (indexOfSemiColon == -1) throw new ClassFormatException(ClassFormatException.ErrInvalidMethodSignature);
				if (arrayDim > 0) {
					return convertToArrayType(replace('/','.',CharOperation.subarray(signature, i + 1, indexOfSemiColon)), arrayDim);
				}
				return replace('/','.',CharOperation.subarray(signature, i + 1, indexOfSemiColon));

			case 'S':
				if (arrayDim > 0)
					return convertToArrayType(SHORT, arrayDim);
				return SHORT;

			case 'Z':
				if (arrayDim > 0)
					return convertToArrayType(BOOLEAN, arrayDim);
				return BOOLEAN;

			case 'V':
				return VOID;

			case '[':
				arrayDim++;
				break;

			default:
				throw new ClassFormatException(ClassFormatException.ErrInvalidMethodSignature);
		}
	}
	return null;
}
 
Example 2
Source File: BinaryIndexer.java    From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 4 votes vote down vote up
private char[] decodeReturnType(char[] signature) throws ClassFormatException {
	if (signature == null) return null;
	int indexOfClosingParen = CharOperation.lastIndexOf(')', signature);
	if (indexOfClosingParen == -1) throw new ClassFormatException(ClassFormatException.ErrInvalidMethodSignature);
	int arrayDim = 0;
	for (int i = indexOfClosingParen + 1, max = signature.length; i < max; i++) {
		switch(signature[i]) {
			case 'B':
				if (arrayDim > 0)
					return convertToArrayType(BYTE, arrayDim);
				return BYTE;

			case 'C':
				if (arrayDim > 0)
					return convertToArrayType(CHAR, arrayDim);
				return CHAR;

			case 'D':
				if (arrayDim > 0)
					return convertToArrayType(DOUBLE, arrayDim);
				return DOUBLE;

			case 'F':
				if (arrayDim > 0)
					return convertToArrayType(FLOAT, arrayDim);
				return FLOAT;

			case 'I':
				if (arrayDim > 0)
					return convertToArrayType(INT, arrayDim);
				return INT;

			case 'J':
				if (arrayDim > 0)
					return convertToArrayType(LONG, arrayDim);
				return LONG;

			case 'L':
				int indexOfSemiColon = CharOperation.indexOf(';', signature, i+1);
				if (indexOfSemiColon == -1) throw new ClassFormatException(ClassFormatException.ErrInvalidMethodSignature);
				if (arrayDim > 0) {
					return convertToArrayType(replace('/','.',CharOperation.subarray(signature, i + 1, indexOfSemiColon)), arrayDim);
				}
				return replace('/','.',CharOperation.subarray(signature, i + 1, indexOfSemiColon));

			case 'S':
				if (arrayDim > 0)
					return convertToArrayType(SHORT, arrayDim);
				return SHORT;

			case 'Z':
				if (arrayDim > 0)
					return convertToArrayType(BOOLEAN, arrayDim);
				return BOOLEAN;

			case 'V':
				return VOID;

			case '[':
				arrayDim++;
				break;

			default:
				throw new ClassFormatException(ClassFormatException.ErrInvalidMethodSignature);
		}
	}
	return null;
}
 
Example 3
Source File: BinaryIndexer.java    From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 4 votes vote down vote up
private int extractArgCount(char[] signature, char[] className) throws ClassFormatException {
	int indexOfClosingParen = CharOperation.lastIndexOf(')', signature);
	if (indexOfClosingParen == 1) {
		// there is no parameter
		return 0;
	}
	if (indexOfClosingParen == -1) {
		throw new ClassFormatException(ClassFormatException.ErrInvalidMethodSignature);
	}
	int parameterTypesCounter = 0;
	for (int i = 1; i < indexOfClosingParen; i++) {
		switch(signature[i]) {
			case 'B':
			case 'C':
			case 'D':
			case 'F':
			case 'I':
			case 'J':
			case 'S':
			case 'Z':
				parameterTypesCounter++;
				break;
			case 'L':
				int indexOfSemiColon = CharOperation.indexOf(';', signature, i+1);
				if (indexOfSemiColon == -1) throw new ClassFormatException(ClassFormatException.ErrInvalidMethodSignature);
				// verify if first parameter is synthetic
				if (className != null && parameterTypesCounter == 0) {
					char[] classSignature = Signature.createCharArrayTypeSignature(className, true);
					int length = indexOfSemiColon-i+1;
					if (classSignature.length > (length+1)) {
						// synthetic means that parameter type has same signature than given class
						for (int j=i, k=0; j<indexOfSemiColon; j++, k++) {
							if (!(signature[j] == classSignature[k] || (signature[j] == '/' && classSignature[k] == '.' ))) {
								parameterTypesCounter++;
								break;
							}
						}
					} else {
						parameterTypesCounter++;
					}
					className = null; // do not verify following parameters
				} else {
					parameterTypesCounter++;
				}
				i = indexOfSemiColon;
				break;
			case '[':
				break;
			default:
				throw new ClassFormatException(ClassFormatException.ErrInvalidMethodSignature);
		}
	}
	return parameterTypesCounter;
}