Example usage for org.objectweb.asm MethodVisitor visitLocalVariable

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

Introduction

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

Prototype

public void visitLocalVariable(final String name, final String descriptor, final String signature,
        final Label start, final Label end, final int index) 

Source Link

Document

Visits a local variable declaration.

Usage

From source file:org.spongepowered.test.decompile.WhileTests.java

License:Open Source License

@Test
public void testWhileNestedIfInverse() {
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "(ZZ)V");
    MethodVisitor mv = builder.getGenerator();
    Label start = new Label();
    mv.visitLabel(start);//from  ww w.j  a  v  a  2  s  . c  o  m
    Label end = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    Label l3 = new Label();
    mv.visitJumpInsn(GOTO, l3);
    mv.visitLabel(l1);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitJumpInsn(IFEQ, l2);
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitLabel(l2);
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitLabel(l3);
    mv.visitVarInsn(ILOAD, 0);
    mv.visitJumpInsn(IFNE, l1);
    mv.visitLabel(end);
    mv.visitInsn(RETURN);
    mv.visitLocalVariable("a", "Z", null, start, end, 0);
    mv.visitLocalVariable("b", "Z", null, start, end, 1);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "while (a) {\n" + "    if (b) {\n"
            + "        org.spongepowered.test.decompile.WhileTests.body();\n" + "    }\n\n"
            + "    org.spongepowered.test.decompile.WhileTests.body();\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.decompile.WhileTests.java

License:Open Source License

@Test
public void testWhileBreak() {
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "(IZ)V");
    MethodVisitor mv = builder.getGenerator();
    Label start = new Label();
    mv.visitLabel(start);//  www .  j  a va  2 s.co m
    Label end = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    mv.visitLabel(l1);
    mv.visitVarInsn(ILOAD, 0);
    mv.visitInsn(ICONST_5);
    mv.visitJumpInsn(IF_ICMPGE, end);
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitJumpInsn(IFEQ, l2);
    mv.visitJumpInsn(GOTO, end);
    mv.visitLabel(l2);
    mv.visitJumpInsn(GOTO, l1);
    mv.visitLabel(end);
    mv.visitInsn(RETURN);
    mv.visitLocalVariable("i", "I", null, start, end, 0);
    mv.visitLocalVariable("a", "Z", null, start, end, 1);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "while (i < 5) {\n" + "    org.spongepowered.test.decompile.WhileTests.body();\n"
            + "    if (a) {\n" + "        break;\n" + "    }\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.decompile.WhileTests.java

License:Open Source License

@Test
public void testWhileBreakInverse() {
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "(IZ)V");
    MethodVisitor mv = builder.getGenerator();
    Label start = new Label();
    mv.visitLabel(start);//from  w  w w.  jav  a  2s .  c o  m
    Label end = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    mv.visitJumpInsn(GOTO, l2);
    mv.visitLabel(l1);
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitJumpInsn(IFEQ, l2);
    mv.visitJumpInsn(GOTO, end);
    mv.visitLabel(l2);
    mv.visitVarInsn(ILOAD, 0);
    mv.visitInsn(ICONST_5);
    mv.visitJumpInsn(IF_ICMPLT, l1);
    mv.visitLabel(end);
    mv.visitInsn(RETURN);
    mv.visitLocalVariable("i", "I", null, start, end, 0);
    mv.visitLocalVariable("a", "Z", null, start, end, 1);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "while (i < 5) {\n" + "    org.spongepowered.test.decompile.WhileTests.body();\n"
            + "    if (a) {\n" + "        break;\n" + "    }\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.decompile.WhileTests.java

License:Open Source License

@Test
public void testWhileContinue() {
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "(IZ)V");
    MethodVisitor mv = builder.getGenerator();
    Label start = new Label();
    mv.visitLabel(start);//from w  ww  .j  a va2  s.com
    Label end = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    mv.visitLabel(l1);
    mv.visitVarInsn(ILOAD, 0);
    mv.visitInsn(ICONST_5);
    mv.visitJumpInsn(IF_ICMPGE, end);
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitJumpInsn(IFEQ, l2);
    mv.visitJumpInsn(GOTO, l1);
    mv.visitLabel(l2);
    mv.visitJumpInsn(GOTO, l1);
    mv.visitLabel(end);
    mv.visitInsn(RETURN);
    mv.visitLocalVariable("i", "I", null, start, end, 0);
    mv.visitLocalVariable("a", "Z", null, start, end, 1);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "while (i < 5) {\n" + "    org.spongepowered.test.decompile.WhileTests.body();\n"
            + "    if (a) {\n" + "        continue;\n" + "    }\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.decompile.WhileTests.java

License:Open Source License

@Test
public void testWhileContinueInverse() {
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "(IZ)V");
    MethodVisitor mv = builder.getGenerator();
    Label start = new Label();
    mv.visitLabel(start);//from   w  w  w.  j a v a2 s.co m
    Label end = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    Label l3 = new Label();
    mv.visitJumpInsn(GOTO, l3);
    mv.visitLabel(l1);
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitJumpInsn(IFEQ, l2);
    mv.visitJumpInsn(GOTO, l3);
    mv.visitLabel(l2);
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitLabel(l3);
    mv.visitVarInsn(ILOAD, 0);
    mv.visitInsn(ICONST_5);
    mv.visitJumpInsn(IF_ICMPLT, l1);
    mv.visitLabel(end);
    mv.visitInsn(RETURN);
    mv.visitLocalVariable("i", "I", null, start, end, 0);
    mv.visitLocalVariable("a", "Z", null, start, end, 1);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "while (i < 5) {\n" + "    org.spongepowered.test.decompile.WhileTests.body();\n"
            + "    if (a) {\n" + "        continue;\n" + "    }\n\n"
            + "    org.spongepowered.test.decompile.WhileTests.body();\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.decompile.WhileTests.java

License:Open Source License

@Test
public void testIfThenWhileInverse() {
    // the target of an if preceeding a while which has been made in the
    // inverse manner will be optimized to point to the condition of the
    // while loop rather than the start of the while loop
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "(IZ)V");
    MethodVisitor mv = builder.getGenerator();
    Label start = new Label();
    mv.visitLabel(start);//from  w  ww. j av  a2  s.com
    Label end = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    mv.visitVarInsn(ILOAD, 1);
    mv.visitJumpInsn(IFEQ, l2);
    mv.visitInsn(RETURN);
    mv.visitLabel(l1);
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitLabel(l2);
    mv.visitVarInsn(ILOAD, 0);
    mv.visitInsn(ICONST_5);
    mv.visitJumpInsn(IF_ICMPLT, l1);
    mv.visitLabel(end);
    mv.visitInsn(RETURN);
    mv.visitLocalVariable("i", "I", null, start, end, 0);
    mv.visitLocalVariable("a", "Z", null, start, end, 1);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "if (a) {\n" + "    return;\n" + "}\n\n" + "while (i < 5) {\n"
            + "    org.spongepowered.test.decompile.WhileTests.body();\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.decompile.WhileTests.java

License:Open Source License

@Test
public void testWhileDirectBreak() {
    // if the break is the only thing in a condition it will sometimes be
    // optimized so that the inverse of the condition targets the outside of
    // the loop rather than having a goto inside the condition
    TestMethodBuilder builder = new TestMethodBuilder("test_mth", "(IZ)V");
    MethodVisitor mv = builder.getGenerator();
    Label start = new Label();
    mv.visitLabel(start);/*from   w ww  .j  a  v a  2  s.c o m*/
    Label end = new Label();
    Label l1 = new Label();
    mv.visitLabel(l1);
    mv.visitVarInsn(ILOAD, 0);
    mv.visitInsn(ICONST_5);
    mv.visitJumpInsn(IF_ICMPGE, end);
    mv.visitMethodInsn(INVOKESTATIC, THIS_TYPE.getInternalName(), "body", "()V", false);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitJumpInsn(IFNE, end);
    mv.visitJumpInsn(GOTO, l1);
    mv.visitLabel(end);
    mv.visitInsn(RETURN);
    mv.visitLocalVariable("i", "I", null, start, end, 0);
    mv.visitLocalVariable("a", "Z", null, start, end, 1);

    String insn = TestHelper.getAsString(builder.finish(), "test_mth");
    String good = "while (i < 5) {\n" + "    org.spongepowered.test.decompile.WhileTests.body();\n"
            + "    if (a) {\n" + "        break;\n" + "    }\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.kotlin.BasicTests.java

License:Open Source License

@Test
public void testSimple() {
    TestMethodBuilder builder = new TestMethodBuilder("sum", "(II)I");
    MethodVisitor mv = builder.getGenerator();
    Label start = new Label();
    mv.visitLabel(start);/*  w  ww  .ja va  2s .com*/
    Label end = new Label();
    mv.visitVarInsn(ILOAD, 0);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitInsn(IADD);
    mv.visitLabel(end);
    mv.visitInsn(IRETURN);
    mv.visitLocalVariable("a", "I", null, start, end, 0);
    mv.visitLocalVariable("b", "I", null, start, end, 1);

    String insn = KotlinTestHelper.getMethodAsString(builder.finish(), "sum");
    String good = "fun sum(a: Int, b: Int) = a + b";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.kotlin.BasicTests.java

License:Open Source License

@Test
public void testLocals() {
    TestMethodBuilder builder = new TestMethodBuilder("main", "()V");
    MethodVisitor mv = builder.getGenerator();
    Label start = new Label();
    mv.visitLabel(start);/*  w  w w. java2  s. c o m*/
    Label end = new Label();
    mv.visitLdcInsn("Hello");
    mv.visitVarInsn(ASTORE, 0);
    mv.visitInsn(ICONST_2);
    mv.visitVarInsn(ISTORE, 1);
    mv.visitIincInsn(1, 5);
    mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", true);
    mv.visitLabel(end);
    mv.visitInsn(RETURN);
    mv.visitLocalVariable("s", "Ljava/lang/String;", null, start, end, 0);
    mv.visitLocalVariable("a", "I", null, start, end, 1);

    String insn = KotlinTestHelper.getMethodAsString(builder.finish(), "main");
    String good = "fun main() {\n" + "    val s: String = \"Hello\"\n" + "    var a: Int = 2\n" + "    a += 5\n"
            + "    println(s)\n" + "}";
    Assert.assertEquals(good, insn);
}

From source file:org.spongepowered.test.kotlin.IfTests.java

License:Open Source License

@Test
public void testSimpleIf() {
    TestMethodBuilder builder = new TestMethodBuilder("maxOf", "(II)I");
    MethodVisitor mv = builder.getGenerator();
    Label start = new Label();
    Label l1 = new Label();
    mv.visitLabel(start);//from  ww  w  .java2s.c  om
    Label end = new Label();
    mv.visitVarInsn(ILOAD, 0);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitJumpInsn(IF_ICMPLE, l1);
    mv.visitVarInsn(ILOAD, 0);
    mv.visitInsn(IRETURN);
    mv.visitLabel(l1);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitLabel(end);
    mv.visitInsn(IRETURN);
    mv.visitLocalVariable("a", "I", null, start, end, 0);
    mv.visitLocalVariable("b", "I", null, start, end, 1);

    String insn = KotlinTestHelper.getMethodAsString(builder.finish(), "maxOf");
    String good = "fun maxOf(a: Int, b: Int): Int {\n" + "    if (a > b) {\n" + "        return a\n"
            + "    }\n\n" + "    return b\n" + "}";
    Assert.assertEquals(good, insn);
}