Example usage for org.objectweb.asm Type getElementType

List of usage examples for org.objectweb.asm Type getElementType

Introduction

In this page you can find the example usage for org.objectweb.asm Type getElementType.

Prototype

public Type getElementType() 

Source Link

Document

Returns the type of the elements of this array type.

Usage

From source file:ch.eiafr.cojac.FloatReplaceClassVisitor.java

License:Apache License

@Override
public FieldVisitor visitField(int accessFlags, String fieldName, String fieldType, String genericSignature,
        Object initValStatic) {//  www. j  a v  a 2 s  . c om
    if (fieldType.equals("F")) {
        return super.visitField(accessFlags, fieldName, COJAC_FLOAT_WRAPPER_TYPE_DESCR, genericSignature, null);
    } else if (fieldType.equals("D")) {
        return super.visitField(accessFlags, fieldName, COJAC_DOUBLE_WRAPPER_TYPE_DESCR, genericSignature,
                null);
    } else if (fieldType.equals(Type.getType(Float.class).getDescriptor())) {
        return super.visitField(accessFlags, fieldName, COJAC_FLOAT_WRAPPER_TYPE_DESCR, genericSignature, null);
    } else if (fieldType.equals(Type.getType(Double.class).getDescriptor())) {
        return super.visitField(accessFlags, fieldName, COJAC_DOUBLE_WRAPPER_TYPE_DESCR, genericSignature,
                null);
    }

    Type type = Type.getType(fieldType);
    if (type.getSort() == Type.ARRAY) {
        if (type.getElementType().equals(Type.FLOAT_TYPE)) {
            String desc = arrayDescriptor(type.getDimensions(), COJAC_FLOAT_WRAPPER_TYPE_DESCR);
            return super.visitField(accessFlags, fieldName, desc, genericSignature, null);
        } else if (type.getElementType().equals(Type.DOUBLE_TYPE)) {
            String desc = arrayDescriptor(type.getDimensions(), COJAC_DOUBLE_WRAPPER_TYPE_DESCR);
            return super.visitField(accessFlags, fieldName, desc, genericSignature, null);
        }
    }
    return super.visitField(accessFlags, fieldName, fieldType, genericSignature, initValStatic);
}

From source file:ch.eiafr.cojac.instrumenters.FloatProxyMethod.java

License:Apache License

private static void convertReturnType(MethodVisitor mv, String desc) {
    Type returnType = Type.getReturnType(desc);
    Type cojacType = afterFloatReplacement(returnType);
    if (returnType.equals(cojacType) == false) {
        convertRealToCojacType(returnType, mv);
    }/*from w w  w  . j  a  v a  2s  .c o  m*/
    if (returnType.equals(OBJ_TYPE)) {
        convertObjectToCojac(mv, returnType);
    } else if (returnType.getSort() == Type.ARRAY && returnType.getElementType().equals(OBJ_TYPE)) {
        convertObjectToCojac(mv, returnType);
    }
}

From source file:ch.eiafr.cojac.instrumenters.FloatProxyMethod.java

License:Apache License

public static void convertRealToCojacType(Type realType, MethodVisitor mv) {
    // WRAPPER SPEC: FW.fromFloat(float) -> FW,  FW.fromRealFloatWrapper(Float) -> FW
    // WRAPPER SPEC: DW.fromDouble(double) -> DW, DW.fromRealDoubleWrapper(Double) -> DW
    if (realType.equals(Type.FLOAT_TYPE)) {
        mv.visitMethodInsn(INVOKESTATIC, COJAC_FLOAT_WRAPPER_INTERNAL_NAME, "fromFloat",
                "(F)" + COJAC_FLOAT_WRAPPER_TYPE_DESCR, false);
    } else if (realType.equals(JWRAPPER_FLOAT_TYPE)) {
        mv.visitMethodInsn(INVOKESTATIC, COJAC_FLOAT_WRAPPER_INTERNAL_NAME, "fromRealFloatWrapper",
                "(" + JWRAPPER_FLOAT_TYPE.getDescriptor() + ")" + COJAC_FLOAT_WRAPPER_TYPE_DESCR, false);
    } else if (realType.equals(Type.DOUBLE_TYPE)) {
        mv.visitMethodInsn(INVOKESTATIC, COJAC_DOUBLE_WRAPPER_INTERNAL_NAME, "fromDouble",
                "(D)" + COJAC_DOUBLE_WRAPPER_TYPE_DESCR, false);
    } else if (realType.equals(JWRAPPER_DOUBLE_TYPE)) {
        mv.visitMethodInsn(INVOKESTATIC, COJAC_DOUBLE_WRAPPER_INTERNAL_NAME, "fromRealDoubleWrapper",
                "(" + JWRAPPER_DOUBLE_TYPE.getDescriptor() + ")" + COJAC_DOUBLE_WRAPPER_TYPE_DESCR, false);
    } else if (isPrimitiveFloatOrDoubleArray(realType)) {
        mv.visitTypeInsn(CHECKCAST, OBJ_TYPE.getInternalName());
        mv.visitLdcInsn(realType.getDimensions());
        if (realType.getElementType().equals(Type.FLOAT_TYPE)) {
            mv.visitMethodInsn(INVOKESTATIC, FN_NAME, "convertPrimitiveArrayToCojac",
                    "(" + OBJ_DESC + "I)" + OBJ_DESC, false);
        } else if (realType.getElementType().equals(Type.DOUBLE_TYPE)) {
            mv.visitMethodInsn(INVOKESTATIC, DN_NAME, "convertPrimitiveArrayToCojac",
                    "(" + OBJ_DESC + "I)" + OBJ_DESC, false);
        }/*from  w  w  w.ja v a2s  .com*/
        mv.visitTypeInsn(CHECKCAST, afterFloatReplacement(realType).getInternalName());
    }
}

From source file:ch.eiafr.cojac.instrumenters.FloatProxyMethod.java

License:Apache License

private static boolean isPrimitiveFloatOrDoubleArray(Type realType) {
    if (realType.getSort() != Type.ARRAY)
        return false;
    Type t = realType.getElementType();
    if (t.equals(Type.FLOAT_TYPE) || t.equals(Type.DOUBLE_TYPE))
        return true;
    return false;
}

From source file:ch.eiafr.cojac.instrumenters.FloatProxyMethod.java

License:Apache License

private static boolean isJWrapperFloatOrDoubleArray(Type realType) {
    if (realType.getSort() != Type.ARRAY)
        return false;
    Type t = realType.getElementType();
    if (t.equals(JWRAPPER_DOUBLE_TYPE) || t.equals(JWRAPPER_FLOAT_TYPE))
        return true;
    return false;
}

From source file:ch.eiafr.cojac.instrumenters.FloatProxyMethod.java

License:Apache License

public static void convertCojacToRealType(Type realType, MethodVisitor mv) {
    if (realType.equals(Type.FLOAT_TYPE)) {
        mv.visitMethodInsn(INVOKESTATIC, COJAC_FLOAT_WRAPPER_INTERNAL_NAME, "toFloat",
                "(" + COJAC_FLOAT_WRAPPER_TYPE_DESCR + ")F", false);
    } else if (realType.equals(JWRAPPER_FLOAT_TYPE)) {
        mv.visitMethodInsn(INVOKESTATIC, COJAC_FLOAT_WRAPPER_INTERNAL_NAME, "toRealFloatWrapper",
                "(" + COJAC_FLOAT_WRAPPER_TYPE_DESCR + ")" + FL_DESCR, false);
    } else if (realType.equals(Type.DOUBLE_TYPE)) {
        mv.visitMethodInsn(INVOKESTATIC, COJAC_DOUBLE_WRAPPER_INTERNAL_NAME, "toDouble",
                "(" + COJAC_DOUBLE_WRAPPER_TYPE_DESCR + ")D", false);
    } else if (realType.equals(JWRAPPER_DOUBLE_TYPE)) {
        mv.visitMethodInsn(INVOKESTATIC, COJAC_DOUBLE_WRAPPER_INTERNAL_NAME, "toRealDoubleWrapper",
                "(" + COJAC_DOUBLE_WRAPPER_TYPE_DESCR + ")" + DL_DESCR, false);
    } else if (isPrimitiveFloatOrDoubleArray(realType) || isJWrapperFloatOrDoubleArray(realType)) {
        mv.visitTypeInsn(CHECKCAST, OBJ_TYPE.getInternalName());
        mv.visitLdcInsn(realType.getDimensions());
        Type eType = realType.getElementType();
        if (eType.equals(Type.FLOAT_TYPE)) {
            mv.visitMethodInsn(INVOKESTATIC, FN_NAME, "convertArrayToPrimitive",
                    "(" + OBJ_DESC + "I)" + OBJ_DESC, false);
        } else if (eType.equals(Type.DOUBLE_TYPE)) {
            mv.visitMethodInsn(INVOKESTATIC, DN_NAME, "convertArrayToPrimitive",
                    "(" + OBJ_DESC + "I)" + OBJ_DESC, false);
        } else if (eType.equals(JWRAPPER_FLOAT_TYPE)) {
            mv.visitMethodInsn(INVOKESTATIC, FN_NAME, "convertArrayToJWrapper",
                    "(" + OBJ_DESC + "I)" + OBJ_DESC, false);
        } else if (eType.equals(JWRAPPER_DOUBLE_TYPE)) {
            mv.visitMethodInsn(INVOKESTATIC, DN_NAME, "convertArrayToJWrapper",
                    "(" + OBJ_DESC + "I)" + OBJ_DESC, false);
        }//from ww  w.ja va2 s . com
        mv.visitTypeInsn(CHECKCAST, realType.getInternalName());
    }
}

From source file:ch.eiafr.cojac.instrumenters.InvokableMethod.java

License:Apache License

/** Float|float|Double|double [array] -> CojacWrapper */
public static Type afterFloatReplacement(Type type) {
    if (type.equals(Type.getType(Float.class)))
        return COJAC_FLOAT_WRAPPER_TYPE;
    if (type.equals(Type.FLOAT_TYPE))
        return COJAC_FLOAT_WRAPPER_TYPE;
    if (type.equals(Type.getType(Double.class)))
        return COJAC_DOUBLE_WRAPPER_TYPE;
    if (type.equals(Type.DOUBLE_TYPE))
        return COJAC_DOUBLE_WRAPPER_TYPE;
    if (type.getSort() == Type.ARRAY) {
        Type newType = afterFloatReplacement(type.getElementType());
        if (type.equals(newType))
            return type;
        String desc = "";
        for (int i = 0; i < type.getDimensions(); i++)
            desc += "[";
        desc += newType.getDescriptor();
        return Type.getType(desc);
    }//from w  w w  . j a v  a2 s  .  co m
    return type;
}

From source file:cl.inria.stiq.db.structure.impl.StructureDatabase.java

License:Open Source License

public static ITypeInfo getType(IMutableStructureDatabase aStructureDatabase, String aName,
        boolean aCreateIfAbsent, boolean aFailIfAbsent) {
    aName = transformClassName(aName);/*w  ww  . j  av a2s  . c  o  m*/
    Type theType = Type.getType(aName);
    switch (theType.getSort()) {
    case Type.OBJECT: {
        String theClassName = theType.getClassName();
        return aCreateIfAbsent ? aStructureDatabase.getNewClass(theClassName)
                : aStructureDatabase.getClass(theClassName, aFailIfAbsent);
    }

    case Type.ARRAY: {
        ITypeInfo theElementType = getType(aStructureDatabase, theType.getElementType().getDescriptor(),
                aCreateIfAbsent, aFailIfAbsent);

        int theDimensions = theType.getDimensions();

        return new ArrayTypeInfo(null, // That should be safe... if there is a problem we'll see what we do
                theElementType, theDimensions);
    }

    case Type.VOID:
        return PrimitiveTypeInfo.VOID;
    case Type.BOOLEAN:
        return PrimitiveTypeInfo.BOOLEAN;
    case Type.BYTE:
        return PrimitiveTypeInfo.BYTE;
    case Type.CHAR:
        return PrimitiveTypeInfo.CHAR;
    case Type.DOUBLE:
        return PrimitiveTypeInfo.DOUBLE;
    case Type.FLOAT:
        return PrimitiveTypeInfo.FLOAT;
    case Type.INT:
        return PrimitiveTypeInfo.INT;
    case Type.LONG:
        return PrimitiveTypeInfo.LONG;
    case Type.SHORT:
        return PrimitiveTypeInfo.SHORT;

    default:
        // This is not a "normal" failure, so always throw exception
        throw new RuntimeException("Not handled: " + theType);
    }
}

From source file:co.cask.cdap.internal.app.runtime.batch.distributed.MapReduceContainerHelper.java

License:Apache License

/**
 * Rewrites the TwillLauncher bytecode as described
 * in {@link #saveLauncher(Configuration, File, List)}.
 *
 * @param hConf the hadoop configuration
 * @param sourceByteCode the original bytecode of the TwillLauncher
 * @param output output stream for writing the modified bytecode.
 * @throws IOException/* ww w  . ja  v a 2s .  c  o m*/
 */
private static void rewriteLauncher(Configuration hConf, InputStream sourceByteCode, OutputStream output)
        throws IOException {
    URI frameworkURI = getFrameworkURI(hConf);
    if (frameworkURI == null) {
        ByteStreams.copy(sourceByteCode, output);
        return;
    }

    // It is localized as archive, and due to TWILL-144, a suffix is added. We need to reverse the effect of it
    // by creating an extra symlink as the first line in the TwillLauncher.main() method.
    String ext = Paths.getExtension(frameworkURI.getPath());
    if (ext.isEmpty()) {
        ByteStreams.copy(sourceByteCode, output);
        return;
    }

    final String sourceName = frameworkURI.getFragment();
    final String targetName = sourceName + "." + ext;

    ClassReader cr = new ClassReader(sourceByteCode);
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
    cr.accept(new ClassVisitor(Opcodes.ASM5, cw) {

        @Override
        public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                String[] exceptions) {
            MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
            if (!name.equals("main")) {
                return mv;
            }
            Type[] argTypes = Type.getArgumentTypes(desc);
            if (argTypes.length != 1) {
                return mv;
            }
            Type argType = argTypes[0];
            if (argType.getSort() != Type.ARRAY
                    || !String.class.getName().equals(argType.getElementType().getClassName())) {
                return mv;
            }

            return new AdviceAdapter(Opcodes.ASM5, mv, access, name, desc) {
                @Override
                protected void onMethodEnter() {
                    visitLdcInsn(sourceName);
                    visitLdcInsn(targetName);
                    invokeStatic(Type.getType(MapReduceContainerSymLinker.class),
                            Methods.getMethod(void.class, "symlink", String.class, String.class));
                }
            };
        }
    }, ClassReader.EXPAND_FRAMES);

    output.write(cw.toByteArray());
}

From source file:com.android.build.gradle.shrinker.DependencyFinderVisitor.java

License:Apache License

/**
 * Extracts a dependency target from a {@link Type} object. Ignores SDK classes.
 *
 * @param type A {@link Type} object, encountered by the visitor. Cannot be of sort METHOD.
 * @return If the {@link Type} is for a class or an object array, the internal name of that
 *     class. Null if the that class is an SDK class.
 * @see AbstractShrinker#isSdkPackage(String)
 *//*from  www.jav a 2  s  .c om*/
@Nullable
private static String getTargetClassName(Type type) {
    switch (type.getSort()) {
    case Type.VOID:
    case Type.SHORT:
    case Type.INT:
    case Type.LONG:
    case Type.FLOAT:
    case Type.BOOLEAN:
    case Type.BYTE:
    case Type.DOUBLE:
    case Type.CHAR:
        return null;
    case Type.ARRAY:
        return getTargetClassName(type.getElementType());
    case Type.OBJECT:
        String name = type.getInternalName();
        return isSdkPackage(name) ? null : name;
    case Type.METHOD:
        throw new IllegalArgumentException("Can't extract one class from a METHOD Type.");
    default:
        throw new AssertionError("Unknown Type sort " + type.getSort());
    }
}