8027660: javac crash while creating LVT entry for a local variable defined in an inner block
Co-authored-by: Jan Lahoda <jan.lahoda@oracle.com> Reviewed-by: jjg
This commit is contained in:
parent
6dcdc5b742
commit
96d9e95176
@ -1790,8 +1790,9 @@ public class Code {
|
||||
|
||||
void markInitialized(UninitializedType old) {
|
||||
Type newtype = old.initializedType();
|
||||
for (int i=0; i<stacksize; i++)
|
||||
for (int i=0; i<stacksize; i++) {
|
||||
if (stack[i] == old) stack[i] = newtype;
|
||||
}
|
||||
for (int i=0; i<lvar.length; i++) {
|
||||
LocalVar lv = lvar[i];
|
||||
if (lv != null && lv.sym.type == old) {
|
||||
@ -2112,7 +2113,6 @@ public class Code {
|
||||
private void endScope(int adr) {
|
||||
LocalVar v = lvar[adr];
|
||||
if (v != null) {
|
||||
lvar[adr] = null;
|
||||
if (v.isLastRangeInitialized()) {
|
||||
char length = (char)(curCP() - v.lastRange().start_pc);
|
||||
if (length < Character.MAX_VALUE) {
|
||||
@ -2121,6 +2121,12 @@ public class Code {
|
||||
fillLocalVarPosition(v);
|
||||
}
|
||||
}
|
||||
/** the call to curCP() can implicitly adjust the current cp, if so
|
||||
* the alive range of local variables may be modified. Thus we need
|
||||
* all of them. For this reason assigning null to the given address
|
||||
* should be the last action to do.
|
||||
*/
|
||||
lvar[adr] = null;
|
||||
}
|
||||
state.defined.excl(adr);
|
||||
}
|
||||
|
@ -23,8 +23,10 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 7047734
|
||||
* @summary The LVT is not generated correctly during some try/catch scenarios
|
||||
* @bug 7047734 8027660
|
||||
* @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
|
||||
* @library /tools/javac/lib
|
||||
* @build JavacTestingAbstractProcessor LVTHarness
|
||||
* @run main LVTHarness
|
||||
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
public class TestCaseLocalInInnerBlock {
|
||||
|
||||
@AliveRange(varName="fm", bytecodeStart=23, bytecodeLength=10)
|
||||
@AliveRange(varName="newWidth", bytecodeStart=2, bytecodeLength=33)
|
||||
@AliveRange(varName="tc", bytecodeStart=5, bytecodeLength=30)
|
||||
int m() {
|
||||
int newWidth = 0;
|
||||
String tc = "b";
|
||||
if (tc != null) {
|
||||
String fm;
|
||||
if (tc.trim() != null) {
|
||||
} else if ((fm = "b") != null) {
|
||||
newWidth += fm.length();
|
||||
}
|
||||
}
|
||||
return newWidth;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user