List of usage examples for org.objectweb.asm MethodVisitor visitLocalVariable
public void visitLocalVariable(final String name, final String descriptor, final String signature, final Label start, final Label end, final int index)
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); }