src/share/classes/com/sun/tools/javac/comp/Flow.java

Print this page




 724                     if (isInitialConstructor) {
 725                         inits = exit.inits;
 726                         for (int i = firstadr; i < nextadr; i++)
 727                             checkInit(exit.tree.pos(), vars[i]);
 728                     }
 729                 } else {
 730                     // uncaught throws will be reported later
 731                     pendingExits.append(exit);
 732                 }
 733             }
 734         } finally {
 735             inits = initsPrev;
 736             uninits = uninitsPrev;
 737             nextadr = nextadrPrev;
 738             firstadr = firstadrPrev;
 739             caught = caughtPrev;
 740             lint = lintPrev;
 741         }
 742     }
 743 






















































 744     public void visitVarDef(JCVariableDecl tree) {
 745         boolean track = trackable(tree.sym);
 746         if (track && tree.sym.owner.kind == MTH) newVar(tree.sym);
 747         if (tree.init != null) {
 748             Lint lintPrev = lint;
 749             lint = lint.augment(tree.sym.attributes_field);
 750             try{
 751                 scanExpr(tree.init);
 752                 if (track) letInit(tree.pos(), tree.sym);
 753             } finally {
 754                 lint = lintPrev;
 755             }
 756         }
 757     }
 758 
 759     public void visitBlock(JCBlock tree) {
 760         int nextadrPrev = nextadr;
 761         scanStats(tree.stats);
 762         nextadr = nextadrPrev;
 763     }




 724                     if (isInitialConstructor) {
 725                         inits = exit.inits;
 726                         for (int i = firstadr; i < nextadr; i++)
 727                             checkInit(exit.tree.pos(), vars[i]);
 728                     }
 729                 } else {
 730                     // uncaught throws will be reported later
 731                     pendingExits.append(exit);
 732                 }
 733             }
 734         } finally {
 735             inits = initsPrev;
 736             uninits = uninitsPrev;
 737             nextadr = nextadrPrev;
 738             firstadr = firstadrPrev;
 739             caught = caughtPrev;
 740             lint = lintPrev;
 741         }
 742     }
 743 
 744     public void visitLambda(JCLambda tree) {
 745         List<Type> caughtPrev = caught;
 746         List<Type> mthrown = List.nil();  // no checked exception can be thrown
 747         Bits initsPrev = inits.dup();
 748         Bits uninitsPrev = uninits.dup();
 749         int nextadrPrev = nextadr;
 750         int firstadrPrev = firstadr;
 751         Lint lintPrev = lint;
 752 
 753         lint = lint.augment(tree.sym.attributes_field);
 754 
 755         assert pendingExits.isEmpty();
 756 
 757         try {
 758             firstadr = nextadr;
 759             for (List<JCVariableDecl> l = tree.parameters; l.nonEmpty(); l = l.tail) {
 760                 JCVariableDecl def = l.head;
 761                 scan(def);
 762                 inits.incl(def.sym.adr);
 763                 uninits.excl(def.sym.adr);
 764             }
 765           
 766             if ((tree.sym.flags() & (BLOCK | STATIC)) != BLOCK)
 767                 caught = mthrown;
 768             // else we are in an instance initializer block;
 769             // leave caught unchanged.
 770 
 771             alive = true;
 772             if (tree.bodyOrExpr.getTag() == BLOCK) {
 773               scanStat(tree.bodyOrExpr);
 774             } else {
 775               scanExpr(tree.bodyOrExpr);
 776             }
 777           
 778             List<PendingExit> exits = pendingExits.toList();
 779             pendingExits = new ListBuffer<PendingExit>();
 780             while (exits.nonEmpty()) {
 781                 PendingExit exit = exits.head;
 782                 exits = exits.tail;
 783                 if (exit.thrown != null) {
 784                     // uncaught throws will be reported later
 785                     pendingExits.append(exit);
 786                 }
 787             }
 788         } finally {
 789             inits = initsPrev;
 790             uninits = uninitsPrev;
 791             nextadr = nextadrPrev;
 792             firstadr = firstadrPrev;
 793             caught = caughtPrev;
 794             lint = lintPrev;
 795         }
 796     }
 797     
 798     public void visitVarDef(JCVariableDecl tree) {
 799         boolean track = trackable(tree.sym);
 800         if (track && tree.sym.owner.kind == MTH) newVar(tree.sym);
 801         if (tree.init != null) {
 802             Lint lintPrev = lint;
 803             lint = lint.augment(tree.sym.attributes_field);
 804             try{
 805                 scanExpr(tree.init);
 806                 if (track) letInit(tree.pos(), tree.sym);
 807             } finally {
 808                 lint = lintPrev;
 809             }
 810         }
 811     }
 812 
 813     public void visitBlock(JCBlock tree) {
 814         int nextadrPrev = nextadr;
 815         scanStats(tree.stats);
 816         nextadr = nextadrPrev;
 817     }