aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvromero <none@none>2014-06-27 20:32:12 +0100
committervromero <none@none>2014-06-27 20:32:12 +0100
commit202eb3e4f8bc099b2ab5f7c8783b45e931958bf1 (patch)
tree92a848e8a894c4bb36a9a21216019f42fa1f48ad
parente4004974c526c5e1a089a0b481478653fae2692c (diff)
8047719: Incorrect LVT in switch statement
Reviewed-by: jjg, jlahoda
-rw-r--r--src/share/classes/com/sun/tools/javac/jvm/Code.java10
-rw-r--r--src/share/classes/com/sun/tools/javac/jvm/Gen.java2
-rw-r--r--test/tools/javac/flow/LVTHarness.java2
-rw-r--r--test/tools/javac/flow/tests/TestCaseSwitch.java25
4 files changed, 25 insertions, 14 deletions
diff --git a/src/share/classes/com/sun/tools/javac/jvm/Code.java b/src/share/classes/com/sun/tools/javac/jvm/Code.java
index 5e32dc4b..044a9983 100644
--- a/src/share/classes/com/sun/tools/javac/jvm/Code.java
+++ b/src/share/classes/com/sun/tools/javac/jvm/Code.java
@@ -1953,12 +1953,12 @@ public class Code {
}
}
- public void closeRange(char end) {
- if (isLastRangeInitialized()) {
+ public void closeRange(char length) {
+ if (isLastRangeInitialized() && length > 0) {
Range range = lastRange();
if (range != null) {
if (range.length == Character.MAX_VALUE) {
- range.length = end;
+ range.length = length;
}
}
} else {
@@ -2022,7 +2022,7 @@ public class Code {
}
if (localVar.sym == aliveLocal && localVar.lastRange() != null) {
char length = (char)(closingCP - localVar.lastRange().start_pc);
- if (length > 0 && length < Character.MAX_VALUE) {
+ if (length < Character.MAX_VALUE) {
localVar.closeRange(length);
}
}
@@ -2093,7 +2093,7 @@ public class Code {
lvar[adr].isLastRangeInitialized()) {
LocalVar v = lvar[adr];
char length = (char)(curCP() - v.lastRange().start_pc);
- if (length > 0 && length < Character.MAX_VALUE) {
+ if (length < Character.MAX_VALUE) {
lvar[adr] = v.dup();
v.closeRange(length);
putVar(v);
diff --git a/src/share/classes/com/sun/tools/javac/jvm/Gen.java b/src/share/classes/com/sun/tools/javac/jvm/Gen.java
index 83981bb8..d14a0620 100644
--- a/src/share/classes/com/sun/tools/javac/jvm/Gen.java
+++ b/src/share/classes/com/sun/tools/javac/jvm/Gen.java
@@ -2786,7 +2786,7 @@ public class Gen extends JCTree.Visitor {
boolean trackVar(VarSymbol var) {
return (var.owner.kind == MTH &&
- (var.flags() & (PARAMETER | HASINIT)) == 0 &&
+ (var.flags() & PARAMETER) == 0 &&
analyzer.trackable(var));
}
diff --git a/test/tools/javac/flow/LVTHarness.java b/test/tools/javac/flow/LVTHarness.java
index 7039a626..c176e5e8 100644
--- a/test/tools/javac/flow/LVTHarness.java
+++ b/test/tools/javac/flow/LVTHarness.java
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 7047734 8027660 8037937
+ * @bug 7047734 8027660 8037937 8047719
* @summary The LVT is not generated correctly during some try/catch scenarios
* javac crash while creating LVT entry for a local variable defined in
* an inner block
diff --git a/test/tools/javac/flow/tests/TestCaseSwitch.java b/test/tools/javac/flow/tests/TestCaseSwitch.java
index d96850ff..e67e1911 100644
--- a/test/tools/javac/flow/tests/TestCaseSwitch.java
+++ b/test/tools/javac/flow/tests/TestCaseSwitch.java
@@ -5,7 +5,7 @@ public class TestCaseSwitch {
@AliveRange(varName="o", bytecodeStart=31, bytecodeLength=16)
@AliveRange(varName="o", bytecodeStart=50, bytecodeLength=15)
@AliveRange(varName="o", bytecodeStart=68, bytecodeLength=1)
- @AliveRange(varName="oo", bytecodeStart=39, bytecodeLength=26)
+ @AliveRange(varName="oo", bytecodeStart=39, bytecodeLength=8)
@AliveRange(varName="uu", bytecodeStart=59, bytecodeLength=6)
void m1(String[] args) {
Object o;
@@ -29,7 +29,7 @@ public class TestCaseSwitch {
@AliveRange(varName="o", bytecodeStart=95, bytecodeLength=18)
@AliveRange(varName="o", bytecodeStart=116, bytecodeLength=15)
@AliveRange(varName="o", bytecodeStart=134, bytecodeLength=1)
- @AliveRange(varName="oo", bytecodeStart=104, bytecodeLength=27)
+ @AliveRange(varName="oo", bytecodeStart=104, bytecodeLength=9)
@AliveRange(varName="uu", bytecodeStart=125, bytecodeLength=6)
void m2(String[] args) {
Object o;
@@ -50,12 +50,14 @@ public class TestCaseSwitch {
o = "return";
}
- @AliveRange(varName="o", bytecodeStart=31, bytecodeLength=8)
- @AliveRange(varName="o", bytecodeStart=42, bytecodeLength=8)
- @AliveRange(varName="o", bytecodeStart=53, bytecodeLength=9)
- void m3(String[] args) {
+ @AliveRange(varName="o", bytecodeStart=35, bytecodeLength=8)
+ @AliveRange(varName="o", bytecodeStart=46, bytecodeLength=8)
+ @AliveRange(varName="o", bytecodeStart=78, bytecodeLength=5)
+ @AliveRange(varName="o", bytecodeStart=86, bytecodeLength=1)
+ @AliveRange(varName="oo", bytecodeStart=56, bytecodeLength=16)
+ void m3(int i) {
Object o;
- switch (args.length) {
+ switch (i) {
case 0:
o = "0";
o.hashCode();
@@ -64,10 +66,19 @@ public class TestCaseSwitch {
o = "1";
o.hashCode();
break;
+ case 2:
+ int oo = i;
+ if (oo > 1) {
+ System.out.println("greater");
+ }
+ break;
+ case 3:
+ int uu = i;
default:
o = "default";
o.hashCode();
}
o = "finish";
}
+
}