public static boolean isPrimitive(Type type) { switch (type.getSort()) { case Type.ARRAY: case Type.OBJECT: return false; default: return true; } }
private static Type remap(Type type) { switch (type.getSort()) { case Type.OBJECT: case Type.ARRAY: return Constants.TYPE_OBJECT; default: return type; } }
private static Type remap(Type type) { switch (type.getSort()) { case Type.OBJECT: case Type.ARRAY: return Constants.TYPE_OBJECT; default: return type; } }
public static boolean isArray(Type type) { return type.getSort() == Type.ARRAY; }
public static boolean isPrimitive(Type type) { switch (type.getSort()) { case Type.ARRAY: case Type.OBJECT: return false; default: return true; } }
public static boolean isArray(Type type) { return type.getSort() == Type.ARRAY; }
public static int NEWARRAY(Type type) { switch (type.getSort()) { case Type.BYTE: return Constants.T_BYTE; case Type.CHAR: return Constants.T_CHAR; case Type.DOUBLE: return Constants.T_DOUBLE; case Type.FLOAT: return Constants.T_FLOAT; case Type.INT: return Constants.T_INT; case Type.LONG: return Constants.T_LONG; case Type.SHORT: return Constants.T_SHORT; case Type.BOOLEAN: return Constants.T_BOOLEAN; default: return -1; // error } }
public static Type getBoxedType(Type type) { switch (type.getSort()) { case Type.CHAR: return Constants.TYPE_CHARACTER; case Type.BOOLEAN: return Constants.TYPE_BOOLEAN; case Type.DOUBLE: return Constants.TYPE_DOUBLE; case Type.FLOAT: return Constants.TYPE_FLOAT; case Type.LONG: return Constants.TYPE_LONG; case Type.INT: return Constants.TYPE_INTEGER; case Type.SHORT: return Constants.TYPE_SHORT; case Type.BYTE: return Constants.TYPE_BYTE; default: return type; } }
public void visitInsn(int opcode) { if ((opcode >= IRETURN && opcode <= RETURN)) { Type tp = returnType; if (tp.getSort() == Type.ARRAY && tp.getElementType().getSort() == Type.BYTE) { mv.visitInsn(Opcodes.DUP); mv.visitVarInsn(Opcodes.ALOAD, 1);// stat mv.visitMethodInsn(Opcodes.INVOKESTATIC, TRACEMAIN, START_METHOD, START_SIGNATURE, false); } } mv.visitInsn(opcode); } }
public void visitInsn(int opcode) { if ((opcode >= IRETURN && opcode <= RETURN)) { Type tp = returnType; if (tp.getSort() == Type.ARRAY && tp.getElementType().getSort() == Type.BYTE) { mv.visitInsn(Opcodes.DUP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, this.className, KEY_ELEMENT_FIELD, "Ljava/lang/Object;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, TRACEMAIN, START_METHOD, START_SIGNATURE, false); } } mv.visitInsn(opcode); } }
Class<?> toJavaType(Type t) throws ClassNotFoundException { switch (t.getSort()) { case Type.BOOLEAN: return boolean.class; case Type.BYTE: return byte.class; case Type.SHORT: return short.class; case Type.CHAR: return char.class; case Type.INT: return int.class; case Type.FLOAT: return float.class; case Type.LONG: return long.class; case Type.DOUBLE: return double.class; case Type.OBJECT: return Class.forName(t.getClassName()); case Type.ARRAY: return Class.forName(t.getDescriptor()); case Type.VOID: return void.class; } throw new RuntimeException(); } }
static private void box(Type arg, MethodVisitor mv) { switch (arg.getSort()) { case Type.OBJECT: case Type.ARRAY:
public static void main(String[] args) { Type type = Type.getReturnType("(Z)[I"); System.out.println("type = " + type.getSort()); System.out.println("dim = " + type.getDimensions()); System.out.println("element = " + type.getElementType()); }
private String remapParamType(Type type) { String remappedName; String internalName; switch (type.getSort()) { case ARRAY: internalName = type.getInternalName(); int count = 0; while (internalName.charAt(count) == '[') count++; remappedName = remapParamType(internalName.substring(count)); if (remappedName != null) { return Type.getObjectType(internalName.substring(0, count) + remappedName).getDescriptor(); } break; case OBJECT: type = mappedType(type); break; default: break; } return type.getDescriptor(); } }
private void addType(Type t) { switch (t.getSort()) { case Type.ARRAY: addType(t.getElementType()); break; case Type.OBJECT: parseClassName(t.getClassName().replace('.', '/')); break; default: // Do nothing break; } }
static void box(final Type type, ListIterator<AbstractInsnNode> instructions) { if (type.getSort() == OBJECT || type.getSort() == ARRAY) { return; } if (Type.VOID_TYPE.equals(type)) { instructions.add(new InsnNode(Opcodes.ACONST_NULL)); } else { Type boxed = getBoxedType(type); instructions.add(new TypeInsnNode(Opcodes.NEW, boxed.getInternalName())); if (type.getSize() == 2) { // Pp -> Ppo -> oPpo -> ooPpo -> ooPp -> o instructions.add(new InsnNode(Opcodes.DUP_X2)); instructions.add(new InsnNode(Opcodes.DUP_X2)); instructions.add(new InsnNode(Opcodes.POP)); } else { // p -> po -> opo -> oop -> o instructions.add(new InsnNode(Opcodes.DUP_X1)); instructions.add(new InsnNode(Opcodes.SWAP)); } instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, boxed.getInternalName(), "<init>", "(" + type.getDescriptor() + ")V", false)); } }
private static void hash_primitive(CodeEmitter e, Type type) { switch (type.getSort()) { case Type.BOOLEAN: // f ? 0 : 1 e.push(1); e.math(e.XOR, Type.INT_TYPE); break; case Type.FLOAT: // Float.floatToIntBits(f) e.invoke_static(Constants.TYPE_FLOAT, FLOAT_TO_INT_BITS); break; case Type.DOUBLE: // Double.doubleToLongBits(f), hash_code(Long.TYPE) e.invoke_static(Constants.TYPE_DOUBLE, DOUBLE_TO_LONG_BITS); // fall through case Type.LONG: hash_long(e); } }
/** * Forces a return of a default value, depending on the method's return type * * @param type The method's return type */ public void pushDefaultReturnValueToStack(Type type) { if (type.equals(Type.BOOLEAN_TYPE)) { push(false); } else if (type.equals(Type.INT_TYPE) || type.equals(Type.SHORT_TYPE) || type.equals(Type.BYTE_TYPE) || type.equals(Type.CHAR_TYPE)) { push(0); } else if (type.equals(Type.LONG_TYPE)) { push(0L); } else if (type.equals(Type.FLOAT_TYPE)) { push(0f); } else if (type.equals(Type.DOUBLE_TYPE)) { push(0d); } else if (type.getSort() == ARRAY || type.getSort() == OBJECT) { loadNull(); } }
/** * Pushes a zero onto the stack if the argument is a primitive class, or a null otherwise. */ public void zero_or_null(Type type) { if (TypeUtils.isPrimitive(type)) { switch (type.getSort()) { case Type.DOUBLE: push(0d); break; case Type.LONG: push(0L); break; case Type.FLOAT: push(0f); break; case Type.VOID: aconst_null(); default: push(0); } } else { aconst_null(); } }
private static Type getBoxedType(final Type type) { switch (type.getSort()) { case Type.BYTE: return Type.getObjectType("java/lang/Byte"); case Type.BOOLEAN: return Type.getObjectType("java/lang/Boolean"); case Type.SHORT: return Type.getObjectType("java/lang/Short"); case Type.CHAR: return Type.getObjectType("java/lang/Character"); case Type.INT: return Type.getObjectType("java/lang/Integer"); case Type.FLOAT: return Type.getObjectType("java/lang/Float"); case Type.LONG: return Type.getObjectType("java/lang/Long"); case Type.DOUBLE: return Type.getObjectType("java/lang/Double"); default: // no boxing required return type; } } }