--- old/src/java.base/share/classes/java/lang/StackStreamFactory.java 2017-02-03 19:46:38.000000000 +0000 +++ new/src/java.base/share/classes/java/lang/StackStreamFactory.java 2017-02-03 19:46:38.000000000 +0000 @@ -25,6 +25,7 @@ package java.lang; import jdk.internal.reflect.MethodAccessor; +import jdk.internal.reflect.ConstructorAccessor; import java.lang.StackWalker.Option; import java.lang.StackWalker.StackFrame; @@ -980,8 +981,11 @@ private static boolean isReflectionFrame(Class c) { if (c.getName().startsWith("jdk.internal.reflect") && - !MethodAccessor.class.isAssignableFrom(c)) { - throw new InternalError("Not jdk.internal.reflect.MethodAccessor: " + c.toString()); + !MethodAccessor.class.isAssignableFrom(c) && + !ConstructorAccessor.class.isAssignableFrom(c)) { + throw new InternalError("Not jdk.internal.reflect.MethodAccessor" + + " or jdk.internal.reflect.ConstructorAccessor: " + + c.toString()); } // ## should filter all @Hidden frames? return c == Method.class || --- old/test/java/lang/StackWalker/Basic.java 2017-02-03 19:46:39.000000000 +0000 +++ new/test/java/lang/StackWalker/Basic.java 2017-02-03 19:46:39.000000000 +0000 @@ -23,14 +23,16 @@ /* * @test - * @bug 8140450 + * @bug 8140450 8173898 * @summary Basic test for the StackWalker::walk method * @run testng Basic */ import java.lang.StackWalker.StackFrame; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; +import java.util.stream.Stream; import static java.lang.StackWalker.Option.*; import org.testng.annotations.DataProvider; @@ -60,6 +62,20 @@ } } + @Test + /** + * @bug 8173898 + */ + public static void testConstructor() throws Exception { + System.out.println("testConstructor:"); + List found = ((Dummy)Dummy.class.getMethod("create") + .invoke(null)).found; + assertEquals(List.of(Dummy.class.getName()+"::", + Dummy.class.getName()+"::create", + Basic.class.getName()+"::testConstructor"), + found); + } + private final int depth; Basic(int depth) { this.depth = depth; @@ -77,6 +93,33 @@ assertEquals(limit, frames.size()); } + static class Dummy { + static final StackWalker walker = + StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); + List found; + public Dummy() { + found = walker.walk(this::parse); + } + public boolean accept(StackFrame f) { + if (!f.getDeclaringClass().getName().contains(".")) { + System.out.println(" " + f); + return true; + } + return false; + } + public String frame(StackFrame f) { + return f.getDeclaringClass().getName() + "::" + f.getMethodName(); + } + List parse(Stream s) { + return s.filter(this::accept) + .map(this::frame) + .collect(Collectors.toList()); + } + public static Dummy create() throws Exception { + return Dummy.class.getConstructor().newInstance(); + } + } + class StackBuilder { private final int stackDepth; private final int limit; @@ -136,4 +179,10 @@ throw new RuntimeException(x + " != " + y); } } + + static void assertEquals(Object x, Object y) { + if (!Objects.equals(x,y)) { + throw new RuntimeException(x + " != " + y); + } + } }