8047719: Incorrect LVT in switch statement
Reviewed-by: jjg, jlahoda
This commit is contained in:
parent
2f5e083cee
commit
ce0935812b
@ -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);
|
||||
|
@ -2766,7 +2766,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));
|
||||
}
|
||||
|
||||
|
@ -153,7 +153,6 @@ public class LocalVariableTableTest extends LocalVariableTestBase {
|
||||
@ExpectedLocals(name = "inTry", type = "D")
|
||||
@ExpectedLocals(name = "inSync", type = "F")
|
||||
@ExpectedLocals(name = "inDo", type = "B")
|
||||
@ExpectedLocals(name = "inSwitch", type = "S")
|
||||
@ExpectedLocals(name = "inFor", type = "J")
|
||||
@ExpectedLocals(name = "s", type = "Ljava/util/stream/Stream;")
|
||||
public void deepScope() {
|
||||
@ -179,17 +178,6 @@ public class LocalVariableTableTest extends LocalVariableTestBase {
|
||||
}
|
||||
}
|
||||
|
||||
@ExpectedLocals(name = "i", type = "I", scope = 0)
|
||||
@ExpectedLocals(name = "i", type = "J", scope = 1)
|
||||
public void reuseByLong() {
|
||||
{
|
||||
int i = 0;
|
||||
}
|
||||
{
|
||||
long i = 1;
|
||||
}
|
||||
}
|
||||
|
||||
class LocalVariableTable implements VariableTable {
|
||||
|
||||
final LocalVariableTable_attribute att;
|
||||
|
@ -104,7 +104,6 @@ public class LocalVariableTypeTableTest<THIS> extends LocalVariableTestBase {
|
||||
@ExpectedLocals(name = "inTry", type = "TTHIS;")
|
||||
@ExpectedLocals(name = "inSync", type = "TTHIS;")
|
||||
@ExpectedLocals(name = "inDo", type = "TTHIS;")
|
||||
@ExpectedLocals(name = "inSwitch", type = "TTHIS;")
|
||||
@ExpectedLocals(name = "inFor", type = "LLocalVariableTypeTableTest<-TTHIS;>;")
|
||||
@ExpectedLocals(name = "s", type = "Ljava/util/stream/Stream<+Ljava/lang/Integer;>;")
|
||||
public void deepScope() {
|
||||
@ -130,17 +129,6 @@ public class LocalVariableTypeTableTest<THIS> extends LocalVariableTestBase {
|
||||
}
|
||||
}
|
||||
|
||||
@ExpectedLocals(name = "i", type = "TTHIS;", scope = 0)
|
||||
@ExpectedLocals(name = "i", type = "Ljava/util/List<TTHIS;>;", scope = 1)
|
||||
public void reuseByLong() {
|
||||
{
|
||||
THIS i = null;
|
||||
}
|
||||
{
|
||||
List<THIS> i = null;
|
||||
}
|
||||
}
|
||||
|
||||
class LocalVariableTypeTable implements VariableTable {
|
||||
|
||||
final LocalVariableTypeTable_attribute att;
|
||||
|
@ -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
|
||||
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user