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 } |