提交 7cc46a88 编写于 作者: A asaha

Merge

...@@ -668,6 +668,8 @@ b353281f73db9617d993353e468342d3420c29f1 jdk8u112-b14 ...@@ -668,6 +668,8 @@ b353281f73db9617d993353e468342d3420c29f1 jdk8u112-b14
6116c6644be0c85556931aaeb9b4f2dbc9c79157 jdk8u112-b15 6116c6644be0c85556931aaeb9b4f2dbc9c79157 jdk8u112-b15
ee37eafc48cb6fb20cb6c1e31cfecfe1ccc800da jdk8u112-b16 ee37eafc48cb6fb20cb6c1e31cfecfe1ccc800da jdk8u112-b16
de1c3df992adb0c704005583210d1ed6dac758cd jdk8u112-b31 de1c3df992adb0c704005583210d1ed6dac758cd jdk8u112-b31
c94fd1b737d005962ba62fa03106de791692f39c jdk8u112-b32
721ea56edf4196b37a081ac47206202d7560e16c jdk8u112-b33
5710d574a99aeff3600c49a4aed34fa1b373f7b8 jdk8u121-b00 5710d574a99aeff3600c49a4aed34fa1b373f7b8 jdk8u121-b00
ab5d32d8cf5f6d81482692f801385a869b2d83c1 jdk8u121-b01 ab5d32d8cf5f6d81482692f801385a869b2d83c1 jdk8u121-b01
e260d46661d2da3ede78aae434d5420acce99950 jdk8u121-b02 e260d46661d2da3ede78aae434d5420acce99950 jdk8u121-b02
...@@ -682,6 +684,12 @@ dc1dd2e6cf8e094c4a8437d54ebc7bac1f7ab964 jdk8u121-b06 ...@@ -682,6 +684,12 @@ dc1dd2e6cf8e094c4a8437d54ebc7bac1f7ab964 jdk8u121-b06
b634abfcd98fb8b201da9208e398ea17cabd2b32 jdk8u121-b11 b634abfcd98fb8b201da9208e398ea17cabd2b32 jdk8u121-b11
7fc347da372c8c4e5530a7fa32084b5dbc4ee8b6 jdk8u121-b12 7fc347da372c8c4e5530a7fa32084b5dbc4ee8b6 jdk8u121-b12
f634736433d9fc1cffbdc55611f97ecb2cd44059 jdk8u121-b13 f634736433d9fc1cffbdc55611f97ecb2cd44059 jdk8u121-b13
1dc3121986c615c2ac1f5e7d6705b197c5dfcae6 jdk8u121-b31
970edd6f01b76e916cf223fbc53dcef085a0255b jdk8u121-b32
edc3e462837bcc5916a2aace14e6b137ba88d4b6 jdk8u121-b33
ae7a4fec2fd96e417285536967aa8eff6442df23 jdk8u121-b34
8bcb0ed6a82367e0a40c9cda20720b34441f7846 jdk8u121-b35
176bae232abb77c08c4dcafba5a44e4dac941127 jdk8u121-b36
8b331e7199f74a2dea8a8a866f0d7f1977f146ee jdk8u131-b00 8b331e7199f74a2dea8a8a866f0d7f1977f146ee jdk8u131-b00
0d04068f82fe680c65619e08ef012ead7483873b jdk8u131-b01 0d04068f82fe680c65619e08ef012ead7483873b jdk8u131-b01
452448c6347af8f7bd827dd4632ac06c991a15b8 jdk8u131-b02 452448c6347af8f7bd827dd4632ac06c991a15b8 jdk8u131-b02
...@@ -694,6 +702,10 @@ bc4f253725f93d9b832ec60d521cd5426a9489ea jdk8u131-b07 ...@@ -694,6 +702,10 @@ bc4f253725f93d9b832ec60d521cd5426a9489ea jdk8u131-b07
2f2c4931d13c44bb6a0f808809e723de0677e302 jdk8u131-b09 2f2c4931d13c44bb6a0f808809e723de0677e302 jdk8u131-b09
676a07884de49a7c60379da8ac892fe1403de6b6 jdk8u131-b10 676a07884de49a7c60379da8ac892fe1403de6b6 jdk8u131-b10
5162417b51bdf68b95696198181f2e662a14ff8a jdk8u131-b11 5162417b51bdf68b95696198181f2e662a14ff8a jdk8u131-b11
12f40d1f41c2cea8b61d046796a753000e61196f jdk8u131-b31
508e7f6446deede595bbdbdc6d6cf9fc1ae8e728 jdk8u131-b32
df2b65224ab78a312559ae3054aeb3ef73abaf9e jdk8u131-b33
08a21473de54fd89fd53a01351cad954f60d2652 jdk8u131-b34
1175fac90fdbbd864f7b1f306397644d26eb9781 jdk8u141-b00 1175fac90fdbbd864f7b1f306397644d26eb9781 jdk8u141-b00
bb163efa3276e129c69bad28299a6283b869caa3 jdk8u141-b01 bb163efa3276e129c69bad28299a6283b869caa3 jdk8u141-b01
5864e3781953daa69efd54b329a358a568229268 jdk8u141-b02 5864e3781953daa69efd54b329a358a568229268 jdk8u141-b02
...@@ -710,5 +722,7 @@ b5259d2465fa61256f485860f986bd575f13fe92 jdk8u141-b12 ...@@ -710,5 +722,7 @@ b5259d2465fa61256f485860f986bd575f13fe92 jdk8u141-b12
9a5ddb594b491ec32e9fafa7008631291ab66d6e jdk8u141-b13 9a5ddb594b491ec32e9fafa7008631291ab66d6e jdk8u141-b13
553043f3a2319af6fd6bc704bc8fd7fa4500ee80 jdk8u141-b14 553043f3a2319af6fd6bc704bc8fd7fa4500ee80 jdk8u141-b14
027f6df9fe82624fb7d489ffd848a26796de4868 jdk8u141-b15 027f6df9fe82624fb7d489ffd848a26796de4868 jdk8u141-b15
716e712f0db45c8231208bc70ab4d2a8a40c4d3a jdk8u141-b31
09c2459991619ef7061ad2bc66373ed29f500acf jdk8u141-b32
4c355f7002c36bb626b42d5c1d42ea91d77ba5d6 jdk8u144-b00 4c355f7002c36bb626b42d5c1d42ea91d77ba5d6 jdk8u144-b00
816907853a15d9b22a87032d07327a400f8568b3 jdk8u144-b01 816907853a15d9b22a87032d07327a400f8568b3 jdk8u144-b01
...@@ -27,6 +27,7 @@ package com.sun.tools.javac.jvm; ...@@ -27,6 +27,7 @@ package com.sun.tools.javac.jvm;
import java.util.*; import java.util.*;
import com.sun.tools.javac.tree.TreeInfo.PosKind;
import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.List;
...@@ -1531,12 +1532,16 @@ public class Gen extends JCTree.Visitor { ...@@ -1531,12 +1532,16 @@ public class Gen extends JCTree.Visitor {
catchallpc, 0); catchallpc, 0);
startseg = env.info.gaps.next().intValue(); startseg = env.info.gaps.next().intValue();
} }
code.statBegin(TreeInfo.finalizerPos(env.tree)); code.statBegin(TreeInfo.finalizerPos(env.tree, PosKind.FIRST_STAT_POS));
code.markStatBegin(); code.markStatBegin();
Item excVar = makeTemp(syms.throwableType); Item excVar = makeTemp(syms.throwableType);
excVar.store(); excVar.store();
genFinalizer(env); genFinalizer(env);
code.resolvePending();
code.statBegin(TreeInfo.finalizerPos(env.tree, PosKind.END_POS));
code.markStatBegin();
excVar.load(); excVar.load();
registerCatch(body.pos(), startseg, registerCatch(body.pos(), startseg,
env.info.gaps.next().intValue(), env.info.gaps.next().intValue(),
...@@ -1550,7 +1555,7 @@ public class Gen extends JCTree.Visitor { ...@@ -1550,7 +1555,7 @@ public class Gen extends JCTree.Visitor {
code.resolve(env.info.cont); code.resolve(env.info.cont);
// Mark statement line number // Mark statement line number
code.statBegin(TreeInfo.finalizerPos(env.tree)); code.statBegin(TreeInfo.finalizerPos(env.tree, PosKind.FIRST_STAT_POS));
code.markStatBegin(); code.markStatBegin();
// Save return address. // Save return address.
......
/* /*
* Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -35,6 +35,7 @@ import com.sun.tools.javac.comp.Env; ...@@ -35,6 +35,7 @@ import com.sun.tools.javac.comp.Env;
import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.tree.JCTree.JCPolyExpression.*; import com.sun.tools.javac.tree.JCTree.JCPolyExpression.*;
import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.*;
import static com.sun.tools.javac.code.TypeTag.BOT; import static com.sun.tools.javac.code.TypeTag.BOT;
...@@ -611,13 +612,21 @@ public class TreeInfo { ...@@ -611,13 +612,21 @@ public class TreeInfo {
}; };
} }
public enum PosKind {
START_POS() { int toPos(JCTree tree) { return TreeInfo.getStartPos(tree); } },
FIRST_STAT_POS() { int toPos(JCTree tree) { return firstStatPos(tree); } },
END_POS() { int toPos(JCTree tree) { return endPos(tree); } };
abstract int toPos(JCTree tree);
}
/** The position of the finalizer of given try/synchronized statement. /** The position of the finalizer of given try/synchronized statement.
*/ */
public static int finalizerPos(JCTree tree) { public static int finalizerPos(JCTree tree, PosKind posKind) {
if (tree.hasTag(TRY)) { if (tree.hasTag(TRY)) {
JCTry t = (JCTry) tree; JCTry t = (JCTry) tree;
Assert.checkNonNull(t.finalizer); Assert.checkNonNull(t.finalizer);
return firstStatPos(t.finalizer); return posKind.toPos(t.finalizer);
} else if (tree.hasTag(SYNCHRONIZED)) { } else if (tree.hasTag(SYNCHRONIZED)) {
return endPos(((JCSynchronized) tree).body); return endPos(((JCSynchronized) tree).body);
} else { } else {
......
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -64,6 +64,7 @@ public class InlinedFinallyConfuseDebuggersTest { ...@@ -64,6 +64,7 @@ public class InlinedFinallyConfuseDebuggersTest {
{9, 21}, //System.out.println("finally"); {9, 21}, //System.out.println("finally");
{10, 29}, {10, 29},
{9, 32}, //System.out.println("finally"); {9, 32}, //System.out.println("finally");
{10, 41}, //}
{11, 43}, {11, 43},
}; };
......
/*
* Copyright (c) 2017, 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.
*/
/*
* @test
* @bug 8180141
* @summary Missing entry in LineNumberTable for break statement that jumps out of try-finally
* @compile -g MissingLNTEntryForFinalizerTest.java
* @run main MissingLNTEntryForFinalizerTest
*/
import java.io.File;
import java.net.URI;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import com.sun.tools.classfile.*;
import com.sun.tools.javac.comp.Attr;
import com.sun.tools.javac.comp.AttrContext;
import com.sun.tools.javac.comp.Env;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.main.JavaCompiler;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.List;
import static com.sun.tools.javac.util.List.of;
import static com.sun.tools.javac.tree.JCTree.Tag.*;
public class MissingLNTEntryForFinalizerTest {
protected ReusableJavaCompiler tool;
Context context;
MissingLNTEntryForFinalizerTest() {
context = new Context();
JavacFileManager.preRegister(context);
MyAttr.preRegister(context);
tool = new ReusableJavaCompiler(context);
}
public static void main(String... args) throws Throwable {
new MissingLNTEntryForFinalizerTest().test();
}
void test() throws Throwable {
JavaSource source = new JavaSource("1");
tool.clear();
List<JavaFileObject> inputs = of(source);
try {
tool.compile(inputs);
} catch (Throwable ex) {
throw new AssertionError(ex);
}
File testClasses = new File(".");
File file = new File(testClasses, "Test1.class");
ClassFile classFile = ClassFile.read(file);
for (Method m : classFile.methods) {
if (classFile.constant_pool.getUTF8Value(m.name_index).equals("foo")) {
Code_attribute code = (Code_attribute)m.attributes.get(Attribute.Code);
LineNumberTable_attribute lnt = (LineNumberTable_attribute)code.attributes.get(Attribute.LineNumberTable);
checkLNT(lnt, MyAttr.lineNumber);
}
}
}
void checkLNT(LineNumberTable_attribute lnt, int lineToCheckFor) {
for (LineNumberTable_attribute.Entry e: lnt.line_number_table) {
if (e.line_number == lineToCheckFor) {
return;
}
}
throw new AssertionError("seek line number not found in the LNT for method foo()");
}
class JavaSource extends SimpleJavaFileObject {
String id;
String template =
"import java.util.*;\n" +
"class Test#Id {\n" +
" void foo() {\n" +
" List<String> l = null;\n" +
" String first = null;\n" +
" try {\n" +
" first = l.get(0);\n" +
" } finally {\n" +
" if (first != null) {\n" +
" System.out.println(\"finalizer\");\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
JavaSource(String id) {
super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
this.id = id;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return template.replace("#Id", id);
}
}
/* this class has been set up to do not depend on a fixed line number, this Attr subclass will
* look for 'break' or 'continue' statements in order to find the actual line number they occupy.
* This way the test can find if that line number appears in the LNT generated for a given class.
*/
static class MyAttr extends Attr {
static int lineNumber;
static void preRegister(Context context) {
context.put(attrKey, (com.sun.tools.javac.util.Context.Factory<Attr>) c -> new MyAttr(c));
}
MyAttr(Context context) {
super(context);
}
@Override
public com.sun.tools.javac.code.Type attribStat(JCTree tree, Env<AttrContext> env) {
com.sun.tools.javac.code.Type result = super.attribStat(tree, env);
if (tree.hasTag(TRY)) {
JCTry tryTree = (JCTry)tree;
lineNumber = env.toplevel.lineMap.getLineNumber(tryTree.finalizer.endpos);
}
return result;
}
}
static class ReusableJavaCompiler extends JavaCompiler {
ReusableJavaCompiler(Context context) {
super(context);
}
protected void checkReusable() {
// do nothing
}
@Override
public void close() {
//do nothing
}
void clear() {
//do nothing
}
}
}
/* /*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -36,7 +36,6 @@ import com.sun.tools.classfile.Code_attribute; ...@@ -36,7 +36,6 @@ import com.sun.tools.classfile.Code_attribute;
import com.sun.tools.classfile.LineNumberTable_attribute; import com.sun.tools.classfile.LineNumberTable_attribute;
import com.sun.tools.classfile.LineNumberTable_attribute.Entry; import com.sun.tools.classfile.LineNumberTable_attribute.Entry;
import java.io.File;
import java.io.IOException; import java.io.IOException;
public class FinallyLineNumberTest { public class FinallyLineNumberTest {
...@@ -46,13 +45,13 @@ public class FinallyLineNumberTest { ...@@ -46,13 +45,13 @@ public class FinallyLineNumberTest {
if (lines == null) { if (lines == null) {
throw new Exception("finally line number table could not be loaded"); throw new Exception("finally line number table could not be loaded");
} }
if (lines.length != 4) { if (lines.length != 5) {
// Help debug // Help debug
System.err.println("LineTable error, got lines:"); System.err.println("LineTable error, got lines:");
for (Entry e : lines) { for (Entry e : lines) {
System.err.println(e.line_number); System.err.println(e.line_number);
} }
throw new Exception("finally line number table incorrect: length=" + lines.length + " expected length=4"); throw new Exception("finally line number table incorrect: length=" + lines.length + " expected length=5");
} }
// return null line, for the load null operation // return null line, for the load null operation
...@@ -71,11 +70,17 @@ public class FinallyLineNumberTest { ...@@ -71,11 +70,17 @@ public class FinallyLineNumberTest {
throw new Exception("finally line number table incorrect: got=" + current + " expected=" + first); throw new Exception("finally line number table incorrect: got=" + current + " expected=" + first);
} }
// finally line, for when exception is thrown // for when exception is thrown
current = lines[3].line_number; current = lines[3].line_number;
if (current != first + 2) { if (current != first + 2) {
throw new Exception("finally line number table incorrect: got=" + current + " expected=" + (first + 2)); throw new Exception("finally line number table incorrect: got=" + current + " expected=" + (first + 2));
} }
// the '}' closing the finally block
current = lines[4].line_number;
if (current != first + 3) {
throw new Exception("finally line number table incorrect: got=" + current + " expected=" + (first + 3));
}
} }
static Entry[] findEntries() throws IOException, ConstantPoolException { static Entry[] findEntries() throws IOException, ConstantPoolException {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册