parent
							
								
									7bee1fdb71
								
							
						
					
					
						commit
						4458799e06
					
				| 
						 | 
				
			
			@ -694,7 +694,7 @@ final class MethodWriter extends MethodVisitor {
 | 
			
		|||
    if (visible) {
 | 
			
		||||
      if (lastRuntimeVisibleParameterAnnotations == null) {
 | 
			
		||||
        lastRuntimeVisibleParameterAnnotations =
 | 
			
		||||
            new AnnotationWriter[Type.getArgumentTypes(descriptor).length];
 | 
			
		||||
            new AnnotationWriter[Type.getArgumentCount(descriptor)];
 | 
			
		||||
      }
 | 
			
		||||
      return lastRuntimeVisibleParameterAnnotations[parameter] =
 | 
			
		||||
          AnnotationWriter.create(
 | 
			
		||||
| 
						 | 
				
			
			@ -702,7 +702,7 @@ final class MethodWriter extends MethodVisitor {
 | 
			
		|||
    } else {
 | 
			
		||||
      if (lastRuntimeInvisibleParameterAnnotations == null) {
 | 
			
		||||
        lastRuntimeInvisibleParameterAnnotations =
 | 
			
		||||
            new AnnotationWriter[Type.getArgumentTypes(descriptor).length];
 | 
			
		||||
            new AnnotationWriter[Type.getArgumentCount(descriptor)];
 | 
			
		||||
      }
 | 
			
		||||
      return lastRuntimeInvisibleParameterAnnotations[parameter] =
 | 
			
		||||
          AnnotationWriter.create(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -295,26 +295,12 @@ public final class Type {
 | 
			
		|||
   */
 | 
			
		||||
  public static Type[] getArgumentTypes(final String methodDescriptor) {
 | 
			
		||||
    // First step: compute the number of argument types in methodDescriptor.
 | 
			
		||||
    int numArgumentTypes = 0;
 | 
			
		||||
    // Skip the first character, which is always a '('.
 | 
			
		||||
    int currentOffset = 1;
 | 
			
		||||
    // Parse the argument types, one at a each loop iteration.
 | 
			
		||||
    while (methodDescriptor.charAt(currentOffset) != ')') {
 | 
			
		||||
      while (methodDescriptor.charAt(currentOffset) == '[') {
 | 
			
		||||
        currentOffset++;
 | 
			
		||||
      }
 | 
			
		||||
      if (methodDescriptor.charAt(currentOffset++) == 'L') {
 | 
			
		||||
        // Skip the argument descriptor content.
 | 
			
		||||
        int semiColumnOffset = methodDescriptor.indexOf(';', currentOffset);
 | 
			
		||||
        currentOffset = Math.max(currentOffset, semiColumnOffset + 1);
 | 
			
		||||
      }
 | 
			
		||||
      ++numArgumentTypes;
 | 
			
		||||
    }
 | 
			
		||||
    int numArgumentTypes = getArgumentCount(methodDescriptor);
 | 
			
		||||
 | 
			
		||||
    // Second step: create a Type instance for each argument type.
 | 
			
		||||
    Type[] argumentTypes = new Type[numArgumentTypes];
 | 
			
		||||
    // Skip the first character, which is always a '('.
 | 
			
		||||
    currentOffset = 1;
 | 
			
		||||
    int currentOffset = 1;
 | 
			
		||||
    // Parse and create the argument types, one at each loop iteration.
 | 
			
		||||
    int currentArgumentTypeIndex = 0;
 | 
			
		||||
    while (methodDescriptor.charAt(currentOffset) != ')') {
 | 
			
		||||
| 
						 | 
				
			
			@ -702,6 +688,43 @@ public final class Type {
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns the number of arguments of this method type. This method should only be used for method
 | 
			
		||||
   * types.
 | 
			
		||||
   *
 | 
			
		||||
   * @return the number of arguments of this method type. Each argument counts for 1, even long and
 | 
			
		||||
   *     double ones. The implicit @literal{this} argument is not counted.
 | 
			
		||||
   */
 | 
			
		||||
  public int getArgumentCount() {
 | 
			
		||||
    return getArgumentCount(getDescriptor());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns the number of arguments in the given method descriptor.
 | 
			
		||||
   *
 | 
			
		||||
   * @param methodDescriptor a method descriptor.
 | 
			
		||||
   * @return the number of arguments in the given method descriptor. Each argument counts for 1,
 | 
			
		||||
   *     even long and double ones. The implicit @literal{this} argument is not counted.
 | 
			
		||||
   */
 | 
			
		||||
  public static int getArgumentCount(final String methodDescriptor) {
 | 
			
		||||
    int argumentCount = 0;
 | 
			
		||||
    // Skip the first character, which is always a '('.
 | 
			
		||||
    int currentOffset = 1;
 | 
			
		||||
    // Parse the argument types, one at a each loop iteration.
 | 
			
		||||
    while (methodDescriptor.charAt(currentOffset) != ')') {
 | 
			
		||||
      while (methodDescriptor.charAt(currentOffset) == '[') {
 | 
			
		||||
        currentOffset++;
 | 
			
		||||
      }
 | 
			
		||||
      if (methodDescriptor.charAt(currentOffset++) == 'L') {
 | 
			
		||||
        // Skip the argument descriptor content.
 | 
			
		||||
        int semiColumnOffset = methodDescriptor.indexOf(';', currentOffset);
 | 
			
		||||
        currentOffset = Math.max(currentOffset, semiColumnOffset + 1);
 | 
			
		||||
      }
 | 
			
		||||
      ++argumentCount;
 | 
			
		||||
    }
 | 
			
		||||
    return argumentCount;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns the size of the arguments and of the return value of methods of this type. This method
 | 
			
		||||
   * should only be used for method types.
 | 
			
		||||
| 
						 | 
				
			
			@ -709,7 +732,8 @@ public final class Type {
 | 
			
		|||
   * @return the size of the arguments of the method (plus one for the implicit this argument),
 | 
			
		||||
   *     argumentsSize, and the size of its return value, returnSize, packed into a single int i =
 | 
			
		||||
   *     {@code (argumentsSize << 2) | returnSize} (argumentsSize is therefore equal to {@code
 | 
			
		||||
   *     i >> 2}, and returnSize to {@code i & 0x03}).
 | 
			
		||||
   *     i >> 2}, and returnSize to {@code i & 0x03}). Long and double values have size 2,
 | 
			
		||||
   *     the others have size 1.
 | 
			
		||||
   */
 | 
			
		||||
  public int getArgumentsAndReturnSizes() {
 | 
			
		||||
    return getArgumentsAndReturnSizes(getDescriptor());
 | 
			
		||||
| 
						 | 
				
			
			@ -722,7 +746,8 @@ public final class Type {
 | 
			
		|||
   * @return the size of the arguments of the method (plus one for the implicit this argument),
 | 
			
		||||
   *     argumentsSize, and the size of its return value, returnSize, packed into a single int i =
 | 
			
		||||
   *     {@code (argumentsSize << 2) | returnSize} (argumentsSize is therefore equal to {@code
 | 
			
		||||
   *     i >> 2}, and returnSize to {@code i & 0x03}).
 | 
			
		||||
   *     i >> 2}, and returnSize to {@code i & 0x03}). Long and double values have size 2,
 | 
			
		||||
   *     the others have size 1.
 | 
			
		||||
   */
 | 
			
		||||
  public static int getArgumentsAndReturnSizes(final String methodDescriptor) {
 | 
			
		||||
    int argumentsSize = 1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue