# HG changeset patch # User rriggs # Date 1566583478 14400 # Node ID 1e85670cb9eef8669a57a00aa5421514250133c7 # Parent 489b8e142559403176f55fea9021ed0c112a1e15 8230058: Replace exception from sun.rmi.runtime.Log#getSource() with StackWalker Reviewed-by: mchung, rriggs Contributed-by: kustos@gmx.net diff -r 489b8e142559 -r 1e85670cb9ee src/java.rmi/share/classes/sun/rmi/runtime/Log.java --- a/src/java.rmi/share/classes/sun/rmi/runtime/Log.java Fri Aug 23 10:39:34 2019 -0700 +++ b/src/java.rmi/share/classes/sun/rmi/runtime/Log.java Fri Aug 23 14:04:38 2019 -0400 @@ -28,8 +28,10 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.OutputStream; +import java.lang.StackWalker.StackFrame; import java.rmi.server.LogStream; import java.security.PrivilegedAction; +import java.util.Set; import java.util.logging.Handler; import java.util.logging.SimpleFormatter; import java.util.logging.Level; @@ -62,6 +64,8 @@ public static final Level BRIEF = Level.FINE; public static final Level VERBOSE = Level.FINER; + private static final StackWalker WALKER = StackWalker.getInstance(Set.of(), 4); + /* selects log implementation */ private static final LogFactory logFactory; static { @@ -217,16 +221,16 @@ public void log(Level level, String message) { if (isLoggable(level)) { - String[] source = getSource(); - logger.logp(level, source[0], source[1], + StackFrame sourceFrame = getSource(); + logger.logp(level, sourceFrame.getClassName(), sourceFrame.getMethodName(), Thread.currentThread().getName() + ": " + message); } } public void log(Level level, String message, Throwable thrown) { if (isLoggable(level)) { - String[] source = getSource(); - logger.logp(level, source[0], source[1], + StackFrame sourceFrame = getSource(); + logger.logp(level, sourceFrame.getClassName(), sourceFrame.getMethodName(), Thread.currentThread().getName() + ": " + message, thrown); } @@ -390,9 +394,9 @@ public void log(Level messageLevel, String message) { if (isLoggable(messageLevel)) { - String[] source = getSource(); - stream.println(unqualifiedName(source[0]) + - "." + source[1] + ": " + message); + StackFrame sourceFrame = getSource(); + stream.println(unqualifiedName(sourceFrame.getClassName()) + + "." + sourceFrame.getMethodName() + ": " + message); } } @@ -403,9 +407,9 @@ * RemoteServer.getLog */ synchronized (stream) { - String[] source = getSource(); - stream.println(unqualifiedName(source[0]) + "." + - source[1] + ": " + message); + StackFrame sourceFrame = getSource(); + stream.println(unqualifiedName(sourceFrame.getClassName()) + "." + + sourceFrame.getMethodName() + ": " + message); thrown.printStackTrace(stream); } } @@ -441,13 +445,12 @@ } /** - * Obtain class and method names of code calling a log method. + * Obtain stack frame of code calling a log method. */ - private static String[] getSource() { - StackTraceElement[] trace = (new Exception()).getStackTrace(); - return new String[] { - trace[3].getClassName(), - trace[3].getMethodName() - }; + private static StackFrame getSource() { + return WALKER.walk(s -> s + .skip(3) + .findFirst() + .get()); } }