--- old/src/java.base/share/classes/java/lang/StackFrameInfo.java 2016-04-11 14:14:47.000000000 -0700 +++ new/src/java.base/share/classes/java/lang/StackFrameInfo.java 2016-04-11 14:14:47.000000000 -0700 @@ -29,12 +29,9 @@ import static java.lang.StackWalker.Option.*; import java.lang.StackWalker.StackFrame; -import java.lang.reflect.Module; -import java.util.Optional; -import java.util.OptionalInt; class StackFrameInfo implements StackFrame { - private final static JavaLangInvokeAccess jlInvokeAccess = + private final static JavaLangInvokeAccess JLIA = SharedSecrets.getJavaLangInvokeAccess(); // Footprint improvement: MemberName::clazz can replace @@ -54,7 +51,7 @@ this.walker = walker; this.declaringClass = null; this.bci = -1; - this.memberName = jlInvokeAccess.newMemberName(); + this.memberName = JLIA.newMemberName(); } @Override @@ -70,25 +67,12 @@ @Override public String getMethodName() { - return jlInvokeAccess.getName(memberName); - } - - @Override - public final Optional getFileName() { - StackTraceElement ste = toStackTraceElement(); - return ste.getFileName() != null ? Optional.of(ste.getFileName()) : Optional.empty(); - } - - @Override - public final OptionalInt getLineNumber() { - StackTraceElement ste = toStackTraceElement(); - return ste.getLineNumber() > 0 ? OptionalInt.of(ste.getLineNumber()) : OptionalInt.empty(); + return JLIA.getName(memberName); } @Override public final boolean isNativeMethod() { - StackTraceElement ste = toStackTraceElement(); - return ste.isNativeMethod(); + return JLIA.isNative(memberName); } @Override --- old/src/java.base/share/classes/java/lang/StackWalker.java 2016-04-11 14:14:48.000000000 -0700 +++ new/src/java.base/share/classes/java/lang/StackWalker.java 2016-04-11 14:14:47.000000000 -0700 @@ -127,37 +127,6 @@ public Class getDeclaringClass(); /** - * Returns the name of the source file containing the execution point - * represented by this stack frame. Generally, this corresponds - * to the {@code SourceFile} attribute of the relevant {@code class} - * file as defined by The Java Virtual Machine Specification. - * In some systems, the name may refer to some source code unit - * other than a file, such as an entry in a source repository. - * - * @return the name of the file containing the execution point - * represented by this stack frame, or empty {@code Optional} - * is unavailable. - * - * @jvms 4.7.10 The {@code SourceFile} Attribute - */ - public Optional getFileName(); - - /** - * Returns the line number of the source line containing the execution - * point represented by this stack frame. Generally, this is - * derived from the {@code LineNumberTable} attribute of the relevant - * {@code class} file as defined by The Java Virtual Machine - * Specification. - * - * @return the line number of the source line containing the execution - * point represented by this stack frame, or empty - * {@code Optional} if this information is unavailable. - * - * @jvms 4.7.12 The {@code LineNumberTable} Attribute - */ - public OptionalInt getLineNumber(); - - /** * Returns {@code true} if the method containing the execution point * represented by this stack frame is a native method. * --- old/src/java.base/share/classes/java/lang/invoke/MemberName.java 2016-04-11 14:14:48.000000000 -0700 +++ new/src/java.base/share/classes/java/lang/invoke/MemberName.java 2016-04-11 14:14:48.000000000 -0700 @@ -43,6 +43,9 @@ import static java.lang.invoke.MethodHandleStatics.*; import java.util.Objects; +import jdk.internal.misc.JavaLangInvokeAccess; +import jdk.internal.misc.SharedSecrets; + /** * A {@code MemberName} is a compact symbolic datum which fully characterizes * a method or field reference. @@ -1127,15 +1130,25 @@ } static { - // Allow privileged classes outside of java.lang - jdk.internal.misc.SharedSecrets.setJavaLangInvokeAccess(new jdk.internal.misc.JavaLangInvokeAccess() { + // StackFrameInfo stores Member and this provides the shared secrets + // for stack walker to access MemberName information. + SharedSecrets.setJavaLangInvokeAccess(new JavaLangInvokeAccess() { + @Override public Object newMemberName() { return new MemberName(); } + + @Override public String getName(Object mname) { MemberName memberName = (MemberName)mname; return memberName.getName(); } + + @Override + public boolean isNative(Object mname) { + MemberName memberName = (MemberName)mname; + return memberName.isNative(); + } }); } } --- old/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java 2016-04-11 14:14:49.000000000 -0700 +++ new/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java 2016-04-11 14:14:49.000000000 -0700 @@ -35,4 +35,9 @@ * Returns the name for the given MemberName */ String getName(Object mname); + + /** + * Tests if the given MemberName is a native method + */ + boolean isNative(Object mname); } --- old/test/java/lang/StackWalker/EmbeddedStackWalkTest.java 2016-04-11 14:14:50.000000000 -0700 +++ new/test/java/lang/StackWalker/EmbeddedStackWalkTest.java 2016-04-11 14:14:49.000000000 -0700 @@ -140,16 +140,9 @@ s.limit(BIG_LOOP) .filter(f -> c.getName().equals(f.getClassName()) && mn.equals(f.getMethodName())) .forEach(f -> { - assertEquals(f.getFileName().get(), fileName); - int line = f.getLineNumber().getAsInt(); - assertTrue(line >= BEGIN_LINE && line <= END_LINE); - StackTraceElement st = f.toStackTraceElement(); assertEquals(c.getName(), st.getClassName()); assertEquals(mn, st.getMethodName()); - assertEquals(st.getFileName(), fileName); - line = st.getLineNumber(); - assertTrue(line >= BEGIN_LINE && line <= END_LINE); }); return null; }); --- old/test/java/lang/StackWalker/StackRecorderUtil.java 2016-04-11 14:14:50.000000000 -0700 +++ new/test/java/lang/StackWalker/StackRecorderUtil.java 2016-04-11 14:14:50.000000000 -0700 @@ -100,8 +100,6 @@ } if (!Objects.equals(ste.getClassName(), sf.getClassName()) || !Objects.equals(ste.getMethodName(), sf.getMethodName()) - || !Objects.equals(ste.getFileName(), sf.getFileName().orElse(null)) - || !Objects.equals(ste.getLineNumber(), sf.getLineNumber().orElse(-1)) || !Objects.equals(ste.isNativeMethod(), sf.isNativeMethod())) { throw new RuntimeException("StackFrame and StackTraceElement differ: " + "sf=" + sf + ", ste=" + ste);