How to use javap to see what lines of bytecode correspond to lines in the Java code?

398 views Asked by At

I was tasked to make a method that calculates the magnitude of a given vector and then used javap -c to break it down.

Now I must show what each local variable in the magnitude frame corresponds to in the java, and which lines of bytecode correspond to what.

Here is the method I made:

public class Vector {
    /** Magnitude of vector
     * Calculates the magnitude of the vector corresponding
     *   to the array a.
     *
     * @return magnitude
     */
    public double magnitude(double[] a){
        int n = a.length;
        double sum = 1;
        for (int i=0; i<n; i++){
            sum = sum*a[i];
        }
        double magnitude = Math.sqrt(sum);
        return magnitude;
    }
}

here is the result of using javap -c:

public class Vector { 
  public Vector(); 
    Code: 
       0: aload_0 
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V 
       4: return 

  public double magnitude(double[]); 
    Code: 
       0: aload_1 
       1: arraylength 
       2: istore_2 
       3: dconst_1 
       4: dstore_3 
       5: iconst_0 
       6: istore        5 
       8: iload         5 
      10: iload_2 
      11: if_icmpge     27 
      14: dload_3 
      15: aload_1 
      16: iload         5 
      18: daload 
      19: dmul 
      20: dstore_3 
      21: iinc          5, 1 
      24: goto          8 
      27: dload_3 
      28: invokestatic  #2                  // Method java/lang/Math.sqrt:(D)D 
      31: dstore        5 
      33: dload         5 
      35: dreturn 
}
1

There are 1 answers

0
August On

Run javap with the -l flag:

$ javap -c -l Vector

Compiled from "Vector.java"
public class Vector {
  public Vector();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        
    LineNumberTable:
      line 1: 0

  public double magnitude(double[]);
    Code:
       0: aload_1       
       1: arraylength   
       2: istore_2      
       3: dconst_1      
       4: dstore_3      
       ...
      35: dreturn       
    LineNumberTable:
      line 12: 0
      line 14: 3
      line 16: 5
      line 18: 14
      line 16: 21
      line 22: 27
      line 24: 33
}

For example, you can see that instructions 3 & 4 correspond to line 14, where 1 is loaded into a double at index 2.