theUser BL | 8 Feb 00:46
Picon
Favicon

Problem with visitLineNumber()


Hi!

This is my test-program:
------------------------------------
public class TestProgram {

  int GlobalVaribale1 = 5;
  double GlobalVariable2 = 14.3;

  public static void rectangle(int left, int right, int width, int height) {

    // calculate something

    int result = 5;
    int tmp;

    result=left+width;
    tmp=width+height;

    result *= tmp;

    System.out.println("The result is: " + result); 

  }

}
-------------------------------------
compiled with ASM and decompiled with ASMifier and added some debug-information myself, it looks like

-----------------------------------------------
  import java.io.*;
import java.util.*;
import org.objectweb.asm.*;
  //import org.objectweb.asm.attrs.*;
public class TestProgramDump implements Opcodes {

public static byte[] dump () throws Exception {

ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;

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

{
fv = cw.visitField(0, "GlobalVaribale1", "I", null, null);
fv.visitEnd();
}
{
fv = cw.visitField(0, "GlobalVariable2", "D", null, null);
fv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
mv.visitVarInsn(ALOAD, 0);
mv.visitInsn(ICONST_5);
mv.visitFieldInsn(PUTFIELD, "TestProgram", "GlobalVaribale1", "I");
mv.visitVarInsn(ALOAD, 0);
mv.visitLdcInsn(new Double("14.3"));
mv.visitFieldInsn(PUTFIELD, "TestProgram", "GlobalVariable2", "D");
mv.visitInsn(RETURN);
mv.visitMaxs(3, 1);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "rectangle", "(IIII)V", null, null);
mv.visitCode();
  Label line010 = new Label();
  mv.visitLineNumber(10, line010);
mv.visitInsn(ICONST_5);
mv.visitVarInsn(ISTORE, 4);
mv.visitVarInsn(ILOAD, 0);
mv.visitVarInsn(ILOAD, 2);
  Label line013 = new Label();
  mv.visitLineNumber(13, line013);
mv.visitInsn(IADD);
mv.visitVarInsn(ISTORE, 4);
mv.visitVarInsn(ILOAD, 2);
mv.visitVarInsn(ILOAD, 3);
  Label line014 = new Label();
  mv.visitLineNumber(14, line014);
mv.visitInsn(IADD);
mv.visitVarInsn(ISTORE, 5);
mv.visitVarInsn(ILOAD, 4);
mv.visitVarInsn(ILOAD, 5);
  Label line016 = new Label();
  mv.visitLineNumber(16, line016);
mv.visitInsn(IMUL);
mv.visitVarInsn(ISTORE, 4);
  Label line018 = new Label();
  mv.visitLineNumber(18, line018);
mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V");
mv.visitLdcInsn("The result is: ");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
mv.visitVarInsn(ILOAD, 4);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
mv.visitInsn(RETURN);
  Label end = new org.objectweb.asm.Label();
  mv.visitLocalVariable("result", "I", null, line010, end, 4);
  mv.visitLocalVariable("tmp", "I", null, line010, end, 5);
  mv.visitLocalVariable("height", "I", null, line010, end, 3);
  mv.visitLocalVariable("width", "I", null, line010, end, 2);
  mv.visitLocalVariable("right", "I", null, line010, end, 1);
  mv.visitLocalVariable("left", "I", null, line010, end, 0);
mv.visitMaxs(3, 6);
mv.visitEnd();
}
cw.visitEnd();

return cw.toByteArray();
}

  public static void main(String[] args) {
  try {
  FileOutputStream fos = new FileOutputStream("TestProgram.class");
  fos.write(dump());
  fos.close();
  } catch(Throwable e) {
  System.out.println("e");
  }
  }

}
---------------------------------------------

The whitespaces at the beginning of some lines is, that you can see, what I have added to the ASMified code.
The visitLocalVariable() works perfect. But the visitLineNumber not. It seems, that the compiled
version sees the complete code in line 18.
Line 10, 13, 14 and 16 are not seen as separated lines.

What have I do wrong?

Greatings
theuserbl

 		 	   		  

--

-- 
You receive this message as a subscriber of the asm <at> ow2.org mailing list.
To unsubscribe: mailto:asm-unsubscribe <at> ow2.org
For general help: mailto:sympa <at> ow2.org?subject=help
OW2 mailing lists service home page: http://www.ow2.org/wws

Gmane