jdk/test/com/sun/jdi/LineNumberOnBraceTest.java
changeset 2 90ce3da70b43
child 24973 8c4bc3fa4c4e
equal deleted inserted replaced
0:fd16c54261b3 2:90ce3da70b43
       
     1 /**
       
     2  *  @test/nodynamiccopyright/
       
     3  *  @bug 4952629 4870514
       
     4  *  @summary REGRESSION: javac generates a spurious line number entry on } else {
       
     5  *
       
     6  *  @author jjh
       
     7  *
       
     8  *  @run build VMConnection TargetListener TargetAdapter
       
     9  *  @run compile -g LineNumberOnBraceTest.java
       
    10  *  @run main LineNumberOnBraceTest
       
    11  */
       
    12 import com.sun.jdi.*;
       
    13 import com.sun.jdi.event.*;
       
    14 import com.sun.jdi.request.*;
       
    15 
       
    16 import java.util.*;
       
    17 
       
    18     /********** LINE NUMBER SENSITIVE! *****************************************************************/
       
    19 class LineNumberOnBraceTarg {
       
    20 
       
    21     public final static int stopLine = 28;   // THIS MUST BE THE LINE NUMBER OF THE // stopline LINE
       
    22     public final static int stopLine2 = 34;  // THIS MUST BE THE LINE NUMBER OF THE // stopline2 LINE
       
    23 
       
    24 
       
    25     public static void main(String[] args){
       
    26         System.out.println("Howdy!");
       
    27         if (args.length == 0) {
       
    28             System.out.println("No args to debuggee");             // stopLine
       
    29         } else {
       
    30             System.out.println("Some args to debuggee");
       
    31         }
       
    32         if (args.length == 0) {
       
    33             boolean b1 = false;
       
    34             if (b1) {                                              // stopLine2
       
    35                 System.out.println("In 2nd else");                 // bug 4870514 is that we stop here.
       
    36             }
       
    37         } else {
       
    38             System.out.println("In 2nd else");
       
    39         }
       
    40         System.out.println("Goodbye from LineNumberOnBraceTarg!");  // stopLine2 + 6
       
    41     }
       
    42 
       
    43     // This isn't part of the test; it is just here
       
    44     // so one can see what line numbers are generated for a finally.
       
    45     public void exampleOfThrow() {
       
    46         try {
       
    47             throw new Exception();
       
    48         } catch (Exception e) {
       
    49             System.out.println("caught exception");
       
    50         } finally {
       
    51             System.out.println("finally");
       
    52         }
       
    53     }
       
    54 
       
    55 }
       
    56 
       
    57     /********** test program **********/
       
    58 
       
    59 public class LineNumberOnBraceTest extends TestScaffold {
       
    60     ReferenceType targetClass;
       
    61     ThreadReference mainThread;
       
    62 
       
    63     LineNumberOnBraceTest (String args[]) {
       
    64         super(args);
       
    65     }
       
    66 
       
    67     public static void main(String[] args)      throws Exception {
       
    68         new LineNumberOnBraceTest(args).startTests();
       
    69     }
       
    70     /********** test core **********/
       
    71 
       
    72     protected void runTests() throws Exception {
       
    73         /*
       
    74          * Get to the top of main()
       
    75          * to determine targetClass and mainThread
       
    76          */
       
    77         BreakpointEvent bpe = startToMain("LineNumberOnBraceTarg");
       
    78         targetClass = bpe.location().declaringType();
       
    79         mainThread = bpe.thread();
       
    80 
       
    81         resumeTo("LineNumberOnBraceTarg", LineNumberOnBraceTarg.stopLine);
       
    82         StepEvent stepev = stepOverLine(mainThread);       // step to 2nd if (args.length
       
    83 
       
    84         // Bug 4952629 is that javac outputs a line number
       
    85         // on the goto around the else which causes us to
       
    86         // be stopped at that goto instead of the println("Goodbye ...")
       
    87 
       
    88         int ln = stepev.location().lineNumber();
       
    89         System.out.println("Debuggee is stopped at line " + ln);
       
    90         if (ln != LineNumberOnBraceTarg.stopLine + 4) {
       
    91             failure("FAIL: Bug 4952629: Should be at line " +
       
    92                     (LineNumberOnBraceTarg.stopLine + 4) +
       
    93                     ", am at " + ln);
       
    94         } else {
       
    95             System.out.println("Passed test for 4952629");
       
    96         }
       
    97 
       
    98         // Test for bug 4870514
       
    99         System.out.println("Resuming to " + LineNumberOnBraceTarg.stopLine2);
       
   100         resumeTo("LineNumberOnBraceTarg", LineNumberOnBraceTarg.stopLine2);
       
   101         System.out.println("Stopped at " + LineNumberOnBraceTarg.stopLine2);
       
   102         stepev = stepOverLine(mainThread);
       
   103         ln = stepev.location().lineNumber();
       
   104         System.out.println("Debuggee is stopped at line " + ln);
       
   105         if (ln == LineNumberOnBraceTarg.stopLine2 + 1) {
       
   106             failure("FAIL: bug 4870514: Incorrectly stopped at " +
       
   107                     (LineNumberOnBraceTarg.stopLine2 + 1));
       
   108         } else {
       
   109             System.out.println("Passed test for 4870514");
       
   110         }
       
   111 
       
   112 
       
   113         /*
       
   114          * resume the target listening for events
       
   115          */
       
   116         listenUntilVMDisconnect();
       
   117 
       
   118         /*
       
   119          * deal with results of test
       
   120          * if anything has called failure("foo") testFailed will be true
       
   121          */
       
   122         if (!testFailed) {
       
   123             println("LineNumberOnBraceTest: passed");
       
   124         } else {
       
   125             throw new Exception("LineNumberOnBraceTest: failed");
       
   126         }
       
   127     }
       
   128 }