Example usage for org.objectweb.asm Label Label

List of usage examples for org.objectweb.asm Label Label

Introduction

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

Prototype

public Label() 

Source Link

Document

Constructs a new label.

Usage

From source file:com.github.javalbert.reflection.ClassAccessFactory.java

License:Apache License

private void visitIndexMethodLastPart(String categoryOfStringCase, Label firstLabel) {
    mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
    mv.visitInsn(DUP);/*  ww  w.  j a va 2 s  . c  o  m*/
    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
    mv.visitInsn(DUP);
    mv.visitLdcInsn("No " + categoryOfStringCase + " with name: ");
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V",
            false);
    mv.visitInsn(ATHROW);
    Label lastLabel = new Label();
    mv.visitLabel(lastLabel);
    mv.visitLocalVariable("this", classAccessTypeDescriptor, null, firstLabel, lastLabel, 0);
    mv.visitLocalVariable("name", "Ljava/lang/String;", null, firstLabel, lastLabel, 1);
    mv.visitMaxs(5, 3);
    mv.visitEnd();
}

From source file:com.github.javalbert.reflection.ClassAccessFactory.java

License:Apache License

private void visitMethodAccessBridge(int parameterCount) {
    mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "call",
            getMethodAccessMethodDescriptor(parameterCount, "Ljava/lang/Object;"), null, null);
    mv.visitCode();//from  w w w .j  a v a 2 s.  c  o m
    mv.visitLabel(new Label());
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitTypeInsn(CHECKCAST, internalName);
    mv.visitVarInsn(ILOAD, 2);
    for (int i = 0; i < parameterCount; i++) {
        mv.visitVarInsn(ALOAD, 3 + i);
    }
    mv.visitMethodInsn(INVOKEVIRTUAL, classAccessInternalName, "call",
            getMethodAccessMethodDescriptor(parameterCount), false);
    mv.visitInsn(ARETURN);
    mv.visitMaxs(3 + parameterCount, 3 + parameterCount);
    mv.visitEnd();
}

From source file:com.github.javalbert.reflection.ClassAccessFactory.java

License:Apache License

private void visitMethodAccessInvokeBridge() {
    mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_VARARGS + ACC_SYNTHETIC, "invoke",
            "(Ljava/lang/Object;I[Ljava/lang/Object;)Ljava/lang/Object;", null, null);
    mv.visitCode();// ww w. j  av a 2 s  .  c om
    mv.visitLabel(new Label());
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitTypeInsn(CHECKCAST, internalName);
    mv.visitVarInsn(ILOAD, 2);
    mv.visitVarInsn(ALOAD, 3);
    mv.visitMethodInsn(INVOKEVIRTUAL, classAccessInternalName, "invoke",
            "(" + classTypeDescriptor + "I[Ljava/lang/Object;)Ljava/lang/Object;", false);
    mv.visitInsn(ARETURN);
    mv.visitMaxs(4, 4);
    mv.visitEnd();
}

From source file:com.github.javalbert.reflection.ClassAccessFactory.java

License:Apache License

private void visitMethodAccessInvokeMethod() {
    mv = cw.visitMethod(ACC_PUBLIC + ACC_VARARGS, "invoke",
            "(" + classTypeDescriptor + "I[Ljava/lang/Object;)Ljava/lang/Object;", null, null);
    mv.visitCode();//from   www  . j a  va2  s .c o m
    Label firstLabel = new Label();
    mv.visitLabel(firstLabel);
    mv.visitVarInsn(ILOAD, 2);

    Label defaultCaseLabel = new Label();

    if (methodInfoList == null || methodInfoList.isEmpty()) {
        mv.visitInsn(POP);
        mv.visitLabel(defaultCaseLabel);
        visitMethodAccessInvokeMethodLastPart(firstLabel);
        return;
    }

    Label[] labels = getTableSwitchLabelsForAccess(defaultCaseLabel, methodInfoList);

    // Always use a table switch because there are no gaps between method indices
    mv.visitTableSwitchInsn(methodInfoList.get(0).memberIndex,
            methodInfoList.get(methodInfoList.size() - 1).memberIndex, defaultCaseLabel, labels);

    for (int i = 0; i < methodInfoList.size(); i++) {
        MethodInfo methodInfo = methodInfoList.get(i);

        mv.visitLabel(labels[i]);
        mv.visitFrame(F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ALOAD, 1);

        List<ParameterInfo> parameters = methodInfo.parameters;
        for (int j = 0; j < parameters.size(); j++) {
            ParameterInfo parameter = parameters.get(j);

            mv.visitVarInsn(ALOAD, 3);
            AsmUtils.visitZeroOperandInt(mv, j);
            mv.visitInsn(AALOAD);

            checkCast(parameter);
        }

        mv.visitMethodInsn(methodInfo.invokeOpcode, internalName, methodInfo.name, methodInfo.descriptor, true);
        if (methodInfo.method.getReturnType() == Void.TYPE) {
            mv.visitLabel(new Label());
            mv.visitInsn(ACONST_NULL);
        }
        mv.visitInsn(ARETURN);
    }

    mv.visitLabel(defaultCaseLabel);
    mv.visitFrame(F_SAME, 0, null, 0, null);

    visitMethodAccessInvokeMethodLastPart(firstLabel);
}

From source file:com.github.javalbert.reflection.ClassAccessFactory.java

License:Apache License

private void visitMethodAccessInvokeMethodLastPart(Label firstLabel) {
    mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
    mv.visitInsn(DUP);/* w w  w  . j  a va 2  s. c  om*/
    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
    mv.visitInsn(DUP);
    mv.visitLdcInsn("No method with index: ");
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false);
    mv.visitVarInsn(ILOAD, 2);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;",
            false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V",
            false);
    mv.visitInsn(ATHROW);
    Label lastLabel = new Label();
    mv.visitLabel(lastLabel);
    mv.visitLocalVariable("this", classAccessTypeDescriptor, null, firstLabel, lastLabel, 0);
    mv.visitLocalVariable("obj", classTypeDescriptor, null, firstLabel, lastLabel, 1);
    mv.visitLocalVariable("methodIndex", "I", null, firstLabel, lastLabel, 2);
    mv.visitLocalVariable("args", "[Ljava/lang/Object;", null, firstLabel, lastLabel, 3);
    mv.visitMaxs(5, 4);
    mv.visitEnd();
}

From source file:com.github.javalbert.reflection.ClassAccessFactory.java

License:Apache License

private void visitMethodAccessLastPart(Label firstLabel, int parameterCount) {
    mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
    mv.visitInsn(DUP);/*from  w  ww  .  ja v  a2s  .  c o m*/
    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
    mv.visitInsn(DUP);
    mv.visitLdcInsn("No method with index ");
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false);
    mv.visitLabel(new Label());
    mv.visitVarInsn(ILOAD, 2);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;",
            false);
    mv.visitLdcInsn(" with " + parameterCount + " parameter(s)");
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
    mv.visitLabel(new Label());
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V",
            false);
    mv.visitInsn(ATHROW);
    Label lastLabel = new Label();
    mv.visitLabel(lastLabel);
    mv.visitLocalVariable("this", classAccessTypeDescriptor, null, firstLabel, lastLabel, 0);
    mv.visitLocalVariable("obj", classTypeDescriptor, null, firstLabel, lastLabel, 1);
    mv.visitLocalVariable("methodIndex", "I", null, firstLabel, lastLabel, 2);

    for (int i = 0; i < parameterCount; i++) {
        mv.visitLocalVariable("arg" + i, "Ljava/lang/Object;", null, firstLabel, lastLabel, 3 + i);
    }

    mv.visitMaxs(5, 3 + parameterCount);
    mv.visitEnd();
}

From source file:com.github.javalbert.reflection.ClassAccessFactory.java

License:Apache License

private void visitMethodAccessMethod(int parameterCount) {
    List<MethodInfo> methodsWithParamCount = paramCountMethodsMap.get(parameterCount);

    mv = cw.visitMethod(ACC_PUBLIC, "call", getMethodAccessMethodDescriptor(parameterCount), null, null);
    mv.visitCode();/*from   www.java  2  s.  c  om*/
    Label firstLabel = new Label();
    mv.visitLabel(firstLabel);
    mv.visitVarInsn(ILOAD, 2);

    Label defaultCaseLabel = new Label();

    if (methodsWithParamCount == null || methodsWithParamCount.isEmpty()) {
        mv.visitInsn(POP);
        mv.visitLabel(defaultCaseLabel);
        visitMethodAccessLastPart(firstLabel, parameterCount);
        return;
    }

    boolean useTableSwitch = useTableSwitch(methodsWithParamCount);
    Label[] labels = useTableSwitch ? getTableSwitchLabelsForAccess(defaultCaseLabel, methodsWithParamCount)
            : newLabelArray(methodsWithParamCount.size());

    if (useTableSwitch) {
        mv.visitTableSwitchInsn(methodsWithParamCount.get(0).memberIndex,
                methodsWithParamCount.get(methodsWithParamCount.size() - 1).memberIndex, defaultCaseLabel,
                labels);
    } else {
        mv.visitLookupSwitchInsn(defaultCaseLabel,
                methodsWithParamCount.stream().mapToInt(f -> f.memberIndex).toArray(), labels);
    }

    for (int i = 0; i < methodsWithParamCount.size(); i++) {
        MethodInfo methodInfo = methodsWithParamCount.get(i);

        mv.visitLabel(labels[i]);
        mv.visitFrame(F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ALOAD, 1);

        List<ParameterInfo> parameters = methodInfo.parameters;
        for (int j = 0; j < parameters.size(); j++) {
            ParameterInfo parameter = parameters.get(j);

            mv.visitVarInsn(ALOAD, 3 + j);

            checkCast(parameter);
        }

        mv.visitMethodInsn(methodInfo.invokeOpcode, internalName, methodInfo.name, methodInfo.descriptor, true);
        if (methodInfo.method.getReturnType() == Void.TYPE) {
            mv.visitLabel(new Label());
            mv.visitInsn(ACONST_NULL);
        }
        mv.visitInsn(ARETURN);
    }

    mv.visitLabel(defaultCaseLabel);
    mv.visitFrame(F_SAME, 0, null, 0, null);

    visitMethodAccessLastPart(firstLabel, parameterCount);
}

From source file:com.github.javalbert.reflection.ClassAccessFactory.java

License:Apache License

private void visitMethodIndexMethod() {
    mv = cw.visitMethod(ACC_PUBLIC + ACC_VARARGS, "methodIndex", "(Ljava/lang/String;[Ljava/lang/Class;)I",
            "(Ljava/lang/String;[Ljava/lang/Class<*>;)I", null);
    mv.visitCode();//  w  w  w. ja  v  a2s  .  c o  m
    final Label firstLabel = new Label();
    mv.visitLabel(firstLabel);

    List<MethodNameReturnIndex> methodIndices = getMethodIndexSwitchCases();

    if (methodIndices.isEmpty()) {
        visitMethodIndexMethodLastPart(firstLabel, methodIndices);
        return;
    }

    mv.visitVarInsn(ALOAD, 1);
    mv.visitInsn(DUP);
    mv.visitVarInsn(ASTORE, 3);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "hashCode", "()I", false);

    final Label defaultCaseLabel = new Label();

    Collections.sort(methodIndices, StringCaseReturnIndex::compareHashCode);

    int[] methodNameHashCodes = new int[methodIndices.size()];
    Label[] caseLabels = new Label[methodIndices.size()];
    for (int i = 0; i < methodIndices.size(); i++) {
        methodNameHashCodes[i] = methodIndices.get(i).hashCode;
        caseLabels[i] = new Label();
    }

    mv.visitLookupSwitchInsn(defaultCaseLabel, methodNameHashCodes, caseLabels);

    for (int i = 0; i < methodIndices.size(); i++) {
        MethodNameReturnIndex methodIndex = methodIndices.get(i);

        mv.visitLabel(caseLabels[i]);

        if (i > 0) {
            mv.visitFrame(F_SAME, 0, null, 0, null);
        } else {
            mv.visitFrame(F_APPEND, 1, new Object[] { "java/lang/String" }, 0, null);
        }

        mv.visitVarInsn(ALOAD, 3);
        mv.visitLdcInsn(methodIndex.name);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false);
        mv.visitJumpInsn(IFNE, methodIndex.returnIndexLabel);
        mv.visitJumpInsn(GOTO, defaultCaseLabel);
    }

    Collections.sort(methodIndices, StringCaseReturnIndex::compareIndex);
    for (int i = 0; i < methodIndices.size(); i++) {
        visitMethodIndexReturnStatements(methodIndices.get(i), defaultCaseLabel);
    }

    mv.visitLabel(defaultCaseLabel);
    mv.visitFrame(F_CHOP, 1, null, 0, null);

    visitMethodIndexMethodLastPart(firstLabel, methodIndices);
}

From source file:com.github.javalbert.reflection.ClassAccessFactory.java

License:Apache License

private void visitMethodIndexMethodLastPart(Label firstLabel, List<MethodNameReturnIndex> methodIndices) {
    mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
    mv.visitInsn(DUP);/*w ww .j  a  va 2  s  . c  o m*/
    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
    mv.visitInsn(DUP);
    mv.visitLdcInsn("No method called ");
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitLabel(new Label());
    mv.visitLdcInsn(" with parameters ");
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitMethodInsn(INVOKESTATIC, "java/util/Arrays", "stream",
            "([Ljava/lang/Object;)Ljava/util/stream/Stream;", false);
    mv.visitLabel(new Label());
    mv.visitInvokeDynamicInsn("apply", "()Ljava/util/function/Function;", new Handle(H_INVOKESTATIC,
            "java/lang/invoke/LambdaMetafactory", "metafactory",
            "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;",
            false),
            new Object[] { Type.getType("(Ljava/lang/Object;)Ljava/lang/Object;"),
                    new Handle(H_INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false),
                    Type.getType("(Ljava/lang/Class;)Ljava/lang/String;") });
    mv.visitMethodInsn(INVOKEINTERFACE, "java/util/stream/Stream", "map",
            "(Ljava/util/function/Function;)Ljava/util/stream/Stream;", true);
    mv.visitLabel(new Label());
    mv.visitMethodInsn(INVOKESTATIC, "java/util/stream/Collectors", "toList", "()Ljava/util/stream/Collector;",
            false);
    mv.visitMethodInsn(INVOKEINTERFACE, "java/util/stream/Stream", "collect",
            "(Ljava/util/stream/Collector;)Ljava/lang/Object;", true);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/Object;)Ljava/lang/StringBuilder;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
    mv.visitLabel(new Label());
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V",
            false);
    mv.visitInsn(ATHROW);
    Label lastLabel = new Label();
    mv.visitLabel(lastLabel);
    mv.visitLocalVariable("this", classAccessTypeDescriptor, null, firstLabel, lastLabel, 0);
    mv.visitLocalVariable("name", "Ljava/lang/String;", null, firstLabel, lastLabel, 1);
    mv.visitLocalVariable("parameterTypes", "[Ljava/lang/Class;", null, firstLabel, lastLabel, 2);
    mv.visitMaxs(5, methodIndices.isEmpty() ? 3 : 4);
    mv.visitEnd();
}

From source file:com.github.javalbert.reflection.ClassAccessFactory.java

License:Apache License

private void visitMethodIndexReturnStatements(MethodNameReturnIndex methodIndex, Label defaultCaseLabel) {
    Label jumpLabel = methodIndex.returnIndexLabel;

    List<MethodInfo> methods = methodIndex.methods;
    for (int i = 0; i < methods.size(); i++) {
        MethodInfo methodInfo = methods.get(i);
        Class<?>[] parameterTypes = methodInfo.method.getParameterTypes();

        mv.visitLabel(jumpLabel);/*w  w w. j a  va 2 s .c  o  m*/
        mv.visitFrame(F_SAME, 0, null, 0, null);
        mv.visitVarInsn(ALOAD, 2);
        AsmUtils.visitZeroOperandInt(mv, parameterTypes.length);
        mv.visitTypeInsn(ANEWARRAY, "java/lang/Class");

        for (int j = 0; j < parameterTypes.length; j++) {
            mv.visitInsn(DUP);
            AsmUtils.visitZeroOperandInt(mv, j);

            Class<?> parameterType = parameterTypes[j];
            if (parameterType.isPrimitive()) {
                mv.visitFieldInsn(GETSTATIC, Type.getInternalName(ClassUtils.primitiveToWrapper(parameterType)),
                        "TYPE", "Ljava/lang/Class;");
            } else {
                mv.visitLdcInsn(Type.getType(parameterType));
            }

            mv.visitInsn(AASTORE);
        }

        mv.visitMethodInsn(INVOKESTATIC, "java/util/Arrays", "equals",
                "([Ljava/lang/Object;[Ljava/lang/Object;)Z", false);

        jumpLabel = i + 1 >= methods.size() ? defaultCaseLabel : new Label();
        mv.visitJumpInsn(IFEQ, jumpLabel);

        mv.visitLabel(new Label());
        AsmUtils.visitZeroOperandInt(mv, methodInfo.memberIndex);
        mv.visitInsn(IRETURN);
    }
}