src/share/classes/com/sun/tools/javac/comp/Flow.java
Print this page
*** 319,329 ****
if (classDef != null &&
classDef.pos == exit.tree.pos) {
log.error(exit.tree.pos(),
"unreported.exception.default.constructor",
exit.thrown);
! } else if (exit.tree.getTag() == JCTree.VARDEF &&
((JCVariableDecl)exit.tree).sym.isResourceVariable()) {
log.error(exit.tree.pos(),
"unreported.exception.implicit.close",
exit.thrown,
((JCVariableDecl)exit.tree).sym.name);
--- 319,329 ----
if (classDef != null &&
classDef.pos == exit.tree.pos) {
log.error(exit.tree.pos(),
"unreported.exception.default.constructor",
exit.thrown);
! } else if (exit.tree.getTag() == JCTree.Tag.VARDEF &&
((JCVariableDecl)exit.tree).sym.isResourceVariable()) {
log.error(exit.tree.pos(),
"unreported.exception.implicit.close",
exit.thrown,
((JCVariableDecl)exit.tree).sym.name);
*** 414,424 ****
* C.this.name, and tree represents a trackable variable,
* record an initialization of the variable.
*/
void letInit(JCTree tree) {
tree = TreeInfo.skipParens(tree);
! if (tree.getTag() == JCTree.IDENT || tree.getTag() == JCTree.SELECT) {
Symbol sym = TreeInfo.symbol(tree);
if (sym.kind == VAR) {
letInit(tree.pos(), (VarSymbol)sym);
}
}
--- 414,424 ----
* C.this.name, and tree represents a trackable variable,
* record an initialization of the variable.
*/
void letInit(JCTree tree) {
tree = TreeInfo.skipParens(tree);
! if (tree.getTag() == JCTree.Tag.IDENT || tree.getTag() == JCTree.Tag.SELECT) {
Symbol sym = TreeInfo.symbol(tree);
if (sym.kind == VAR) {
letInit(tree.pos(), (VarSymbol)sym);
}
}
*** 450,460 ****
boolean result = false;
List<PendingExit> exits = pendingExits.toList();
pendingExits = oldPendingExits;
for (; exits.nonEmpty(); exits = exits.tail) {
PendingExit exit = exits.head;
! if (exit.tree.getTag() == JCTree.BREAK &&
((JCBreak) exit.tree).target == tree) {
inits.andSet(exit.inits);
uninits.andSet(exit.uninits);
result = true;
} else {
--- 450,460 ----
boolean result = false;
List<PendingExit> exits = pendingExits.toList();
pendingExits = oldPendingExits;
for (; exits.nonEmpty(); exits = exits.tail) {
PendingExit exit = exits.head;
! if (exit.tree.getTag() == JCTree.Tag.BREAK &&
((JCBreak) exit.tree).target == tree) {
inits.andSet(exit.inits);
uninits.andSet(exit.uninits);
result = true;
} else {
*** 469,479 ****
boolean result = false;
List<PendingExit> exits = pendingExits.toList();
pendingExits = new ListBuffer<PendingExit>();
for (; exits.nonEmpty(); exits = exits.tail) {
PendingExit exit = exits.head;
! if (exit.tree.getTag() == JCTree.CONTINUE &&
((JCContinue) exit.tree).target == tree) {
inits.andSet(exit.inits);
uninits.andSet(exit.uninits);
result = true;
} else {
--- 469,479 ----
boolean result = false;
List<PendingExit> exits = pendingExits.toList();
pendingExits = new ListBuffer<PendingExit>();
for (; exits.nonEmpty(); exits = exits.tail) {
PendingExit exit = exits.head;
! if (exit.tree.getTag() == JCTree.Tag.CONTINUE &&
((JCContinue) exit.tree).target == tree) {
inits.andSet(exit.inits);
uninits.andSet(exit.uninits);
result = true;
} else {
*** 515,536 ****
/** Analyze a definition.
*/
void scanDef(JCTree tree) {
scanStat(tree);
! if (tree != null && tree.getTag() == JCTree.BLOCK && !alive) {
log.error(tree.pos(),
"initializer.must.be.able.to.complete.normally");
}
}
/** Analyze a statement. Check that statement is reachable.
*/
void scanStat(JCTree tree) {
if (!alive && tree != null) {
log.error(tree.pos(), "unreachable.stmt");
! if (tree.getTag() != JCTree.SKIP) alive = true;
}
scan(tree);
}
/** Analyze list of statements.
--- 515,536 ----
/** Analyze a definition.
*/
void scanDef(JCTree tree) {
scanStat(tree);
! if (tree != null && tree.getTag() == JCTree.Tag.BLOCK && !alive) {
log.error(tree.pos(),
"initializer.must.be.able.to.complete.normally");
}
}
/** Analyze a statement. Check that statement is reachable.
*/
void scanStat(JCTree tree) {
if (!alive && tree != null) {
log.error(tree.pos(), "unreachable.stmt");
! if (tree.getTag() != JCTree.Tag.SKIP) alive = true;
}
scan(tree);
}
/** Analyze list of statements.
*** 612,622 ****
lint = lint.augment(tree.sym.attributes_field);
try {
// define all the static fields
for (List<JCTree> l = tree.defs; l.nonEmpty(); l = l.tail) {
! if (l.head.getTag() == JCTree.VARDEF) {
JCVariableDecl def = (JCVariableDecl)l.head;
if ((def.mods.flags & STATIC) != 0) {
VarSymbol sym = def.sym;
if (trackable(sym))
newVar(sym);
--- 612,622 ----
lint = lint.augment(tree.sym.attributes_field);
try {
// define all the static fields
for (List<JCTree> l = tree.defs; l.nonEmpty(); l = l.tail) {
! if (l.head.getTag() == JCTree.Tag.VARDEF) {
JCVariableDecl def = (JCVariableDecl)l.head;
if ((def.mods.flags & STATIC) != 0) {
VarSymbol sym = def.sym;
if (trackable(sym))
newVar(sym);
*** 624,634 ****
}
}
// process all the static initializers
for (List<JCTree> l = tree.defs; l.nonEmpty(); l = l.tail) {
! if (l.head.getTag() != JCTree.METHODDEF &&
(TreeInfo.flags(l.head) & STATIC) != 0) {
scanDef(l.head);
errorUncaught();
}
}
--- 624,634 ----
}
}
// process all the static initializers
for (List<JCTree> l = tree.defs; l.nonEmpty(); l = l.tail) {
! if (l.head.getTag() != JCTree.Tag.METHODDEF &&
(TreeInfo.flags(l.head) & STATIC) != 0) {
scanDef(l.head);
errorUncaught();
}
}
*** 651,661 ****
}
}
// define all the instance fields
for (List<JCTree> l = tree.defs; l.nonEmpty(); l = l.tail) {
! if (l.head.getTag() == JCTree.VARDEF) {
JCVariableDecl def = (JCVariableDecl)l.head;
if ((def.mods.flags & STATIC) == 0) {
VarSymbol sym = def.sym;
if (trackable(sym))
newVar(sym);
--- 651,661 ----
}
}
// define all the instance fields
for (List<JCTree> l = tree.defs; l.nonEmpty(); l = l.tail) {
! if (l.head.getTag() == JCTree.Tag.VARDEF) {
JCVariableDecl def = (JCVariableDecl)l.head;
if ((def.mods.flags & STATIC) == 0) {
VarSymbol sym = def.sym;
if (trackable(sym))
newVar(sym);
*** 663,673 ****
}
}
// process all the instance initializers
for (List<JCTree> l = tree.defs; l.nonEmpty(); l = l.tail) {
! if (l.head.getTag() != JCTree.METHODDEF &&
(TreeInfo.flags(l.head) & STATIC) == 0) {
scanDef(l.head);
errorUncaught();
}
}
--- 663,673 ----
}
}
// process all the instance initializers
for (List<JCTree> l = tree.defs; l.nonEmpty(); l = l.tail) {
! if (l.head.getTag() != JCTree.Tag.METHODDEF &&
(TreeInfo.flags(l.head) & STATIC) == 0) {
scanDef(l.head);
errorUncaught();
}
}
*** 689,699 ****
thrownPrev = chk.union(thrown, thrownPrev);
}
// process all the methods
for (List<JCTree> l = tree.defs; l.nonEmpty(); l = l.tail) {
! if (l.head.getTag() == JCTree.METHODDEF) {
scan(l.head);
errorUncaught();
}
}
--- 689,699 ----
thrownPrev = chk.union(thrown, thrownPrev);
}
// process all the methods
for (List<JCTree> l = tree.defs; l.nonEmpty(); l = l.tail) {
! if (l.head.getTag() == JCTree.Tag.METHODDEF) {
scan(l.head);
errorUncaught();
}
}
*** 758,768 ****
pendingExits = new ListBuffer<PendingExit>();
while (exits.nonEmpty()) {
PendingExit exit = exits.head;
exits = exits.tail;
if (exit.thrown == null) {
! Assert.check(exit.tree.getTag() == JCTree.RETURN);
if (isInitialConstructor) {
inits = exit.inits;
for (int i = firstadr; i < nextadr; i++)
checkInit(exit.tree.pos(), vars[i]);
}
--- 758,768 ----
pendingExits = new ListBuffer<PendingExit>();
while (exits.nonEmpty()) {
PendingExit exit = exits.head;
exits = exits.tail;
if (exit.thrown == null) {
! Assert.check(exit.tree.getTag() == JCTree.Tag.RETURN);
if (isInitialConstructor) {
inits = exit.inits;
for (int i = firstadr; i < nextadr; i++)
checkInit(exit.tree.pos(), vars[i]);
}
*** 987,997 ****
/** Add any variables defined in stats to inits and uninits. */
private static void addVars(List<JCStatement> stats, Bits inits,
Bits uninits) {
for (;stats.nonEmpty(); stats = stats.tail) {
JCTree stat = stats.head;
! if (stat.getTag() == JCTree.VARDEF) {
int adr = ((JCVariableDecl) stat).sym.adr;
inits.excl(adr);
uninits.incl(adr);
}
}
--- 987,997 ----
/** Add any variables defined in stats to inits and uninits. */
private static void addVars(List<JCStatement> stats, Bits inits,
Bits uninits) {
for (;stats.nonEmpty(); stats = stats.tail) {
JCTree stat = stats.head;
! if (stat.getTag() == JCTree.Tag.VARDEF) {
int adr = ((JCVariableDecl) stat).sym.adr;
inits.excl(adr);
uninits.incl(adr);
}
}
*** 1344,1385 ****
letInit(tree.lhs);
}
public void visitUnary(JCUnary tree) {
switch (tree.getTag()) {
! case JCTree.NOT:
scanCond(tree.arg);
Bits t = initsWhenFalse;
initsWhenFalse = initsWhenTrue;
initsWhenTrue = t;
t = uninitsWhenFalse;
uninitsWhenFalse = uninitsWhenTrue;
uninitsWhenTrue = t;
break;
! case JCTree.PREINC: case JCTree.POSTINC:
! case JCTree.PREDEC: case JCTree.POSTDEC:
scanExpr(tree.arg);
letInit(tree.arg);
break;
default:
scanExpr(tree.arg);
}
}
public void visitBinary(JCBinary tree) {
switch (tree.getTag()) {
! case JCTree.AND:
scanCond(tree.lhs);
Bits initsWhenFalseLeft = initsWhenFalse;
Bits uninitsWhenFalseLeft = uninitsWhenFalse;
inits = initsWhenTrue;
uninits = uninitsWhenTrue;
scanCond(tree.rhs);
initsWhenFalse.andSet(initsWhenFalseLeft);
uninitsWhenFalse.andSet(uninitsWhenFalseLeft);
break;
! case JCTree.OR:
scanCond(tree.lhs);
Bits initsWhenTrueLeft = initsWhenTrue;
Bits uninitsWhenTrueLeft = uninitsWhenTrue;
inits = initsWhenFalse;
uninits = uninitsWhenFalse;
--- 1344,1385 ----
letInit(tree.lhs);
}
public void visitUnary(JCUnary tree) {
switch (tree.getTag()) {
! case NOT:
scanCond(tree.arg);
Bits t = initsWhenFalse;
initsWhenFalse = initsWhenTrue;
initsWhenTrue = t;
t = uninitsWhenFalse;
uninitsWhenFalse = uninitsWhenTrue;
uninitsWhenTrue = t;
break;
! case PREINC: case POSTINC:
! case PREDEC: case POSTDEC:
scanExpr(tree.arg);
letInit(tree.arg);
break;
default:
scanExpr(tree.arg);
}
}
public void visitBinary(JCBinary tree) {
switch (tree.getTag()) {
! case AND:
scanCond(tree.lhs);
Bits initsWhenFalseLeft = initsWhenFalse;
Bits uninitsWhenFalseLeft = uninitsWhenFalse;
inits = initsWhenTrue;
uninits = uninitsWhenTrue;
scanCond(tree.rhs);
initsWhenFalse.andSet(initsWhenFalseLeft);
uninitsWhenFalse.andSet(uninitsWhenFalseLeft);
break;
! case OR:
scanCond(tree.lhs);
Bits initsWhenTrueLeft = initsWhenTrue;
Bits uninitsWhenTrueLeft = uninitsWhenTrue;
inits = initsWhenFalse;
uninits = uninitsWhenFalse;
*** 1416,1426 ****
}
//where
private boolean is292targetTypeCast(JCTypeCast tree) {
boolean is292targetTypeCast = false;
JCExpression expr = TreeInfo.skipParens(tree.expr);
! if (expr.getTag() == JCTree.APPLY) {
JCMethodInvocation apply = (JCMethodInvocation)expr;
Symbol sym = TreeInfo.symbol(apply.meth);
is292targetTypeCast = sym != null &&
sym.kind == MTH &&
(sym.flags() & POLYMORPHIC_SIGNATURE) != 0;
--- 1416,1426 ----
}
//where
private boolean is292targetTypeCast(JCTypeCast tree) {
boolean is292targetTypeCast = false;
JCExpression expr = TreeInfo.skipParens(tree.expr);
! if (expr.getTag() == JCTree.Tag.APPLY) {
JCMethodInvocation apply = (JCMethodInvocation)expr;
Symbol sym = TreeInfo.symbol(apply.meth);
is292targetTypeCast = sym != null &&
sym.kind == MTH &&
(sym.flags() & POLYMORPHIC_SIGNATURE) != 0;