Example usage for org.objectweb.asm MethodVisitor visitInsn

List of usage examples for org.objectweb.asm MethodVisitor visitInsn

Introduction

In this page you can find the example usage for org.objectweb.asm MethodVisitor visitInsn.

Prototype

public void visitInsn(final int opcode) 

Source Link

Document

Visits a zero operand instruction.

Usage

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

License:Apache License

static byte[] emptyClass(String name) throws Exception {

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;// ww w  .j  a v a2  s .  co m
    MethodVisitor mv;
    AnnotationVisitor av0;

    cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, "test/" + name, null, "java/lang/Object", null);

    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

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

License:Apache License

static byte[] classWithEmptyMethods(String className, String... namesAndDescriptors) throws Exception {

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;//from w  ww .  jav  a  2 s  .  co m
    MethodVisitor mv;
    AnnotationVisitor av0;

    cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, "test/" + className, null, "java/lang/Object", null);

    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    for (String namesAndDescriptor : namesAndDescriptors) {
        int colon = namesAndDescriptor.indexOf(':');
        String methodName = namesAndDescriptor.substring(0, colon);
        String descriptor = namesAndDescriptor.substring(colon + 1, namesAndDescriptor.length());
        {
            mv = cw.visitMethod(ACC_PUBLIC, methodName, descriptor, null, null);
            mv.visitCode();
            // This bytecode is only valid for some signatures (void methods). This class is used
            // for testing the parser, we don't ever load these classes to a running VM anyway.
            mv.visitInsn(RETURN);
            mv.visitMaxs(0, 1);
            mv.visitEnd();
        }
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:com.android.build.gradle.tasks.fd.GenerateInstantRunAppInfoTask.java

License:Apache License

void writeAppInfoClass(@NonNull String applicationId, @Nullable String applicationClass, long token)
        throws IOException {
    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;/*from   w w  w. j  a  v  a 2  s.  co  m*/
    MethodVisitor mv;

    String appInfoOwner = "com/android/tools/fd/runtime/AppInfo";
    cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, appInfoOwner, null, "java/lang/Object", null);

    fv = cw.visitField(ACC_PUBLIC + ACC_STATIC, "applicationId", "Ljava/lang/String;", null, null);
    fv.visitEnd();
    fv = cw.visitField(ACC_PUBLIC + ACC_STATIC, "applicationClass", "Ljava/lang/String;", null, null);
    fv.visitEnd();
    fv = cw.visitField(ACC_PUBLIC + ACC_STATIC, "token", "J", null, null);
    fv.visitEnd();
    fv = cw.visitField(ACC_PUBLIC + ACC_STATIC, "usingApkSplits", "Z", null, null);
    fv.visitEnd();
    mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();
    Label l0 = new Label();
    mv.visitLabel(l0);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
    mv.visitInsn(RETURN);
    Label l1 = new Label();
    mv.visitLabel(l1);
    mv.visitLocalVariable("this", "L" + appInfoOwner + ";", null, l0, l1, 0);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
    mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
    mv.visitCode();
    mv.visitLdcInsn(applicationId);
    mv.visitFieldInsn(PUTSTATIC, appInfoOwner, "applicationId", "Ljava/lang/String;");
    if (applicationClass != null) {
        mv.visitLdcInsn(applicationClass);
    } else {
        mv.visitInsn(ACONST_NULL);
    }
    mv.visitFieldInsn(PUTSTATIC, appInfoOwner, "applicationClass", "Ljava/lang/String;");
    if (token != 0L) {
        mv.visitLdcInsn(token);
    } else {
        mv.visitInsn(LCONST_0);
    }
    mv.visitFieldInsn(PUTSTATIC, appInfoOwner, "token", "J");
    if (isUsingMultiApks()) {
        mv.visitInsn(ICONST_1);
    } else {
        mv.visitInsn(ICONST_0);
    }
    mv.visitFieldInsn(PUTSTATIC, appInfoOwner, "usingApkSplits", "Z");

    mv.visitInsn(RETURN);
    mv.visitMaxs(2, 0);
    mv.visitEnd();
    cw.visitEnd();

    byte[] bytes = cw.toByteArray();

    try (JarOutputStream outputStream = new JarOutputStream(
            new BufferedOutputStream(new FileOutputStream(getOutputFile())))) {
        outputStream.putNextEntry(new ZipEntry("com/android/tools/fd/runtime/AppInfo.class"));
        outputStream.write(bytes);
        outputStream.closeEntry();
    }
}

From source file:com.android.build.gradle.tasks.ir.GenerateInstantRunAppInfoTask.java

License:Apache License

void writeAppInfoClass(@NonNull String applicationId, long token) throws IOException {
    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;//from   w  ww .j  a va2 s .  c  om
    MethodVisitor mv;

    String appInfoOwner = SERVER_PACKAGE + "/AppInfo";
    cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, appInfoOwner, null, "java/lang/Object", null);

    fv = cw.visitField(ACC_PUBLIC + ACC_STATIC, "applicationId", "Ljava/lang/String;", null, null);
    fv.visitEnd();
    fv = cw.visitField(ACC_PUBLIC + ACC_STATIC, "token", "J", null, null);
    fv.visitEnd();
    mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();
    Label l0 = new Label();
    mv.visitLabel(l0);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
    mv.visitInsn(RETURN);
    Label l1 = new Label();
    mv.visitLabel(l1);
    mv.visitLocalVariable("this", "L" + appInfoOwner + ";", null, l0, l1, 0);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
    mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
    mv.visitCode();
    mv.visitLdcInsn(applicationId);
    mv.visitFieldInsn(PUTSTATIC, appInfoOwner, "applicationId", "Ljava/lang/String;");
    if (token != 0L) {
        mv.visitLdcInsn(token);
    } else {
        mv.visitInsn(LCONST_0);
    }
    mv.visitFieldInsn(PUTSTATIC, appInfoOwner, "token", "J");

    mv.visitInsn(RETURN);
    mv.visitMaxs(2, 0);
    mv.visitEnd();
    cw.visitEnd();

    byte[] bytes = cw.toByteArray();

    try (JarOutputStream outputStream = new JarOutputStream(
            new BufferedOutputStream(new FileOutputStream(getOutputFile())))) {
        outputStream.putNextEntry(new ZipEntry(SERVER_PACKAGE + "/AppInfo.class"));
        outputStream.write(bytes);
        outputStream.closeEntry();
    }
}

From source file:com.android.builder.shrinker.TestClasses.java

License:Apache License

public static byte[] emptyClass(String name) throws Exception {

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;/*from   w w  w.  j a  va  2 s .com*/
    MethodVisitor mv;
    AnnotationVisitor av0;

    cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, "test/" + name, null, "java/lang/Object", null);

    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:com.asakusafw.dag.compiler.builtin.BranchOperatorGenerator.java

License:Apache License

static void branch(MethodVisitor method, Context context, UserOperator operator, LocalVarRef input,
        Map<OperatorProperty, FieldRef> dependencies) {
    OperatorOutput[] outputs = outputs(context, operator);
    Label[] caseLabels = Stream.of(outputs).map(o -> new Label()).toArray(Label[]::new);
    Label defaultLabel = new Label();
    Label endLabel = new Label();

    method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, typeOf(Enum.class).getInternalName(), "ordinal",
            Type.getMethodDescriptor(Type.INT_TYPE), false);
    method.visitTableSwitchInsn(0, caseLabels.length - 1, defaultLabel, caseLabels);

    for (int i = 0; i < outputs.length; i++) {
        method.visitLabel(caseLabels[i]);
        FieldRef ref = Invariants.requireNonNull(dependencies.get(outputs[i]));
        ref.load(method);/*from w w  w.  ja  v a 2 s . co  m*/
        input.load(method);
        invokeResultAdd(method);
        method.visitJumpInsn(Opcodes.GOTO, endLabel);
    }
    method.visitLabel(defaultLabel);
    getNew(method, Descriptions.typeOf(AssertionError.class));
    method.visitInsn(Opcodes.ATHROW);

    method.visitLabel(endLabel);
}

From source file:com.asakusafw.dag.compiler.builtin.FoldOperatorGenerator.java

License:Apache License

private ClassDescription generateCombinerClass(Context context, UserOperator operator, ClassDescription outer) {
    ClassDescription target = getCombinerName(outer);
    OperatorInput input = operator.getInput(0);

    ClassWriter writer = newWriter(target, Object.class, ObjectCombiner.class);
    writer.visitOuterClass(outer.getInternalName(), target.getInternalName(), null);

    FieldRef impl = defineOperatorField(writer, operator, target);
    defineEmptyConstructor(writer, Object.class, method -> {
        setOperatorField(method, operator, impl);
    });// w ww  .  ja  v  a 2  s .  co  m
    defineBuildKey(context, writer, input.getDataType(), input.getGroup());

    MethodVisitor method = writer.visitMethod(Opcodes.ACC_PUBLIC, "combine",
            Type.getMethodDescriptor(Type.VOID_TYPE, typeOf(Object.class), typeOf(Object.class)), null, null);

    List<ValueRef> arguments = new ArrayList<>();
    arguments.add(impl);
    arguments.add(m -> {
        m.visitVarInsn(Opcodes.ALOAD, 1);
        m.visitTypeInsn(Opcodes.CHECKCAST, typeOf(input.getDataType()).getInternalName());
    });
    arguments.add(m -> {
        m.visitVarInsn(Opcodes.ALOAD, 2);
        m.visitTypeInsn(Opcodes.CHECKCAST, typeOf(input.getDataType()).getInternalName());
    });
    for (VertexElement dep : context.getDependencies(operator.getArguments())) {
        Invariants.require(dep.getElementKind() == ElementKind.VALUE);
        ValueDescription value = ((ValueElement) dep).getValue();
        arguments.add(m -> {
            getConst(method, Invariants.safe(() -> value.resolve(context.getClassLoader())));
        });
    }
    invoke(method, context, operator, arguments);
    method.visitInsn(Opcodes.RETURN);
    method.visitMaxs(0, 0);
    method.visitEnd();
    return context.addClassFile(new ClassData(target, writer::toByteArray));
}

From source file:com.asakusafw.dag.compiler.builtin.FoldOperatorGenerator.java

License:Apache License

private void defineSimpleStart(UserOperator operator, ClassWriter writer, FieldRef acc) {
    MethodVisitor method = writer.visitMethod(Opcodes.ACC_PUBLIC, "start",
            Type.getMethodDescriptor(Type.VOID_TYPE, typeOf(Object.class)), null, null);

    TypeDescription dataType = operator.getInput(Fold.ID_INPUT).getDataType();

    acc.load(method);/*from   w  w  w. j  a  va 2 s. com*/
    method.visitVarInsn(Opcodes.ALOAD, 1);
    method.visitTypeInsn(Opcodes.CHECKCAST, typeOf(dataType).getInternalName());
    copyDataModel(method, dataType);

    method.visitInsn(Opcodes.RETURN);
    method.visitMaxs(0, 0);
    method.visitEnd();
}

From source file:com.asakusafw.dag.compiler.builtin.FoldOperatorGenerator.java

License:Apache License

private void defineSimpleCombine(Context context, UserOperator operator, ClassWriter writer, FieldRef impl,
        FieldRef acc, Map<OperatorProperty, FieldRef> map) {
    MethodVisitor method = writer.visitMethod(Opcodes.ACC_PUBLIC, "combine",
            Type.getMethodDescriptor(Type.VOID_TYPE, typeOf(Object.class)), null, null);

    TypeDescription dataType = operator.getInput(Fold.ID_INPUT).getDataType();
    LocalVarRef object = cast(method, 1, dataType);

    List<ValueRef> arguments = new ArrayList<>();
    arguments.add(impl);/*from  w  ww  . j a v  a 2s. co m*/
    arguments.add(acc);
    arguments.add(object);
    appendSecondaryInputs(arguments::add, operator, map::get);
    appendArguments(arguments::add, operator, map::get);
    invoke(method, context, operator, arguments);

    method.visitInsn(Opcodes.RETURN);
    method.visitMaxs(0, 0);
    method.visitEnd();
}

From source file:com.asakusafw.dag.compiler.builtin.FoldOperatorGenerator.java

License:Apache License

private void defineSimpleFinish(ClassWriter writer, FieldRef acc, ValueRef result) {
    MethodVisitor method = writer.visitMethod(Opcodes.ACC_PUBLIC, "finish",
            Type.getMethodDescriptor(typeOf(void.class)), null, null);

    result.load(method);/*  ww w. j a v a  2 s. c  o  m*/
    acc.load(method);
    invokeResultAdd(method);

    method.visitInsn(Opcodes.RETURN);
    method.visitMaxs(0, 0);
    method.visitEnd();
}