Java Code Examples for org.apache.bcel.Constants#T_ARRAY

The following examples show how to use org.apache.bcel.Constants#T_ARRAY . 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: InstructionFactory.java    From ApkToolPlus with Apache License 2.0 6 votes vote down vote up
public Instruction createAppend(Type type) {
  byte t = type.getType();

  if(isString(type))
    return createInvoke(append_mos[0], Constants.INVOKEVIRTUAL);

  switch(t) {
  case Constants.T_BOOLEAN:
  case Constants.T_CHAR: 
  case Constants.T_FLOAT:
  case Constants.T_DOUBLE:
  case Constants.T_BYTE:
  case Constants.T_SHORT:
  case Constants.T_INT:
  case Constants.T_LONG
    :   return createInvoke(append_mos[t], Constants.INVOKEVIRTUAL);
  case Constants.T_ARRAY:
  case Constants.T_OBJECT:
    return createInvoke(append_mos[1], Constants.INVOKEVIRTUAL);
  default:
    throw new RuntimeException("Oops: No append for this type? " + type);
  }
}
 
Example 2
Source File: InstructionFactory.java    From ApkToolPlus with Apache License 2.0 6 votes vote down vote up
/** Create typed return
 */
public static ReturnInstruction createReturn(Type type) {
  switch(type.getType()) {
  case Constants.T_ARRAY:
  case Constants.T_OBJECT:  return ARETURN;
  case Constants.T_INT:
  case Constants.T_SHORT:
  case Constants.T_BOOLEAN:
  case Constants.T_CHAR: 
  case Constants.T_BYTE:    return IRETURN;
  case Constants.T_FLOAT:   return FRETURN;
  case Constants.T_DOUBLE:  return DRETURN;
  case Constants.T_LONG:    return LRETURN;
  case Constants.T_VOID:    return RETURN;

  default:
    throw new RuntimeException("Invalid type: " + type);
  }
}
 
Example 3
Source File: InstructionFactory.java    From ApkToolPlus with Apache License 2.0 6 votes vote down vote up
/**
 * @param index index of local variable
 */
public static LocalVariableInstruction createStore(Type type, int index) {
  switch(type.getType()) {
  case Constants.T_BOOLEAN:
  case Constants.T_CHAR:
  case Constants.T_BYTE:
  case Constants.T_SHORT:
  case Constants.T_INT:    return new ISTORE(index);
  case Constants.T_FLOAT:  return new FSTORE(index);
  case Constants.T_DOUBLE: return new DSTORE(index);
  case Constants.T_LONG:   return new LSTORE(index);
  case Constants.T_ARRAY:
  case Constants.T_OBJECT: return new ASTORE(index);
  default:       throw new RuntimeException("Invalid type " + type);
  }
}
 
Example 4
Source File: InstructionFactory.java    From ApkToolPlus with Apache License 2.0 6 votes vote down vote up
/**
 * @param index index of local variable
 */
public static LocalVariableInstruction createLoad(Type type, int index) {
  switch(type.getType()) {
  case Constants.T_BOOLEAN:
  case Constants.T_CHAR:
  case Constants.T_BYTE:
  case Constants.T_SHORT:
  case Constants.T_INT:    return new ILOAD(index);
  case Constants.T_FLOAT:  return new FLOAD(index);
  case Constants.T_DOUBLE: return new DLOAD(index);
  case Constants.T_LONG:   return new LLOAD(index);
  case Constants.T_ARRAY:
  case Constants.T_OBJECT: return new ALOAD(index);
  default:       throw new RuntimeException("Invalid type " + type);
  }
}
 
Example 5
Source File: InstructionFactory.java    From ApkToolPlus with Apache License 2.0 6 votes vote down vote up
/**
 * @param type type of elements of array, i.e., array.getElementType()
 */
public static ArrayInstruction createArrayLoad(Type type) {
  switch(type.getType()) {
  case Constants.T_BOOLEAN:
  case Constants.T_BYTE:   return BALOAD;
  case Constants.T_CHAR:   return CALOAD;
  case Constants.T_SHORT:  return SALOAD;
  case Constants.T_INT:    return IALOAD;
  case Constants.T_FLOAT:  return FALOAD;
  case Constants.T_DOUBLE: return DALOAD;
  case Constants.T_LONG:   return LALOAD;
  case Constants.T_ARRAY:
  case Constants.T_OBJECT: return AALOAD;
  default:       throw new RuntimeException("Invalid type " + type);
  }
}
 
Example 6
Source File: InstructionFactory.java    From ApkToolPlus with Apache License 2.0 6 votes vote down vote up
/**
 * @param type type of elements of array, i.e., array.getElementType()
 */
public static ArrayInstruction createArrayStore(Type type) {
  switch(type.getType()) {
  case Constants.T_BOOLEAN:
  case Constants.T_BYTE:   return BASTORE;
  case Constants.T_CHAR:   return CASTORE;
  case Constants.T_SHORT:  return SASTORE;
  case Constants.T_INT:    return IASTORE;
  case Constants.T_FLOAT:  return FASTORE;
  case Constants.T_DOUBLE: return DASTORE;
  case Constants.T_LONG:   return LASTORE;
  case Constants.T_ARRAY:
  case Constants.T_OBJECT: return AASTORE;
  default:       throw new RuntimeException("Invalid type " + type);
  }
}
 
Example 7
Source File: InstructionFactory.java    From ApkToolPlus with Apache License 2.0 6 votes vote down vote up
/** Create "null" value for reference types, 0 for basic types like int
 */
public static Instruction createNull(Type type) {
  switch(type.getType()) {
  case Constants.T_ARRAY:
  case Constants.T_OBJECT:  return ACONST_NULL;
  case Constants.T_INT:
  case Constants.T_SHORT:
  case Constants.T_BOOLEAN:
  case Constants.T_CHAR: 
  case Constants.T_BYTE:    return ICONST_0;
  case Constants.T_FLOAT:   return FCONST_0;
  case Constants.T_DOUBLE:  return DCONST_0;
  case Constants.T_LONG:    return LCONST_0;
  case Constants.T_VOID:    return NOP;

  default:
    throw new RuntimeException("Invalid type: " + type);
  }
}
 
Example 8
Source File: Utility.java    From ApkToolPlus with Apache License 2.0 6 votes vote down vote up
/**
  * Return type of signature as a byte value as defined in <em>Constants</em>
  *
  * @param  signature in format described above
  * @return type of signature
  * @see    Constants
  */
 public static final byte typeOfSignature(String signature)
   throws ClassFormatException
 {
   try {
     switch(signature.charAt(0)) {
     case 'B' : return Constants.T_BYTE;
     case 'C' : return Constants.T_CHAR;
     case 'D' : return Constants.T_DOUBLE;
     case 'F' : return Constants.T_FLOAT;
     case 'I' : return Constants.T_INT;
     case 'J' : return Constants.T_LONG;
     case 'L' : return Constants.T_REFERENCE;
     case '[' : return Constants.T_ARRAY;
     case 'V' : return Constants.T_VOID;
     case 'Z' : return Constants.T_BOOLEAN;
     case 'S' : return Constants.T_SHORT;
     default:  
throw new ClassFormatException("Invalid method signature: " + signature);
     }
   } catch(StringIndexOutOfBoundsException e) {
     throw new ClassFormatException("Invalid method signature: " + signature);
   }
 }
 
Example 9
Source File: ArrayType.java    From ApkToolPlus with Apache License 2.0 5 votes vote down vote up
/**
 * Constructor for array of given type
 *
 * @param type type of array (may be an array itself)
 */ 
public ArrayType(Type type, int dimensions) {
  super(Constants.T_ARRAY, "<dummy>");

  if((dimensions < 1) || (dimensions > Constants.MAX_BYTE))
    throw new ClassGenException("Invalid number of dimensions: " + dimensions);

  switch(type.getType()) {
  case Constants.T_ARRAY:
    ArrayType array = (ArrayType)type;
    this.dimensions = dimensions + array.dimensions;
    basic_type      = array.basic_type;
    break;
    
  case Constants.T_VOID:
    throw new ClassGenException("Invalid type: void[]");

  default: // Basic type or reference
    this.dimensions = dimensions;
    basic_type = type;
    break;
  }

  StringBuffer buf = new StringBuffer();
  for(int i=0; i < this.dimensions; i++)
    buf.append('[');

  buf.append(basic_type.getSignature());

  signature = buf.toString();
}
 
Example 10
Source File: Type.java    From ApkToolPlus with Apache License 2.0 5 votes vote down vote up
/**
  * Convert signature to a Type object.
  * @param signature signature string such as Ljava/lang/String;
  * @return type object
  */
 public static final Type getType(String signature)
   throws StringIndexOutOfBoundsException
 {
   byte type = Utility.typeOfSignature(signature);

   if(type <= Constants.T_VOID) {
     consumed_chars = 1;
     return BasicType.getType(type);
   } else if(type == Constants.T_ARRAY) {
     int dim=0;
     do { // Count dimensions
dim++;
     } while(signature.charAt(dim) == '[');

     // Recurse, but just once, if the signature is ok
     Type t = getType(signature.substring(dim));

     consumed_chars += dim; // update counter

     return new ArrayType(t, dim);
   } else { // type == T_REFERENCE
     int index = signature.indexOf(';'); // Look for closing `;'

     if(index < 0)
throw new ClassFormatException("Invalid signature: " + signature);

     consumed_chars = index + 1; // "Lblabla;" `L' and `;' are removed

     return new ObjectType(signature.substring(1, index).replace('/', '.'));
   }
 }