Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_5_X 7f9d36f4f -> dbb8beb0f


Add `groovy.log.classgen.stacktrace.max.depth` option to control max depth of 
stacktrace(default value is 0).

For example:
```
                                                                                
        // org.codehaus.groovy.classgen.AsmClassGenerator#onLineNumber:2215
                                                                                
        // org.codehaus.groovy.classgen.asm.StatementWriter#writeReturn:593
                                                                                
        // 
org.codehaus.groovy.classgen.AsmClassGenerator#visitReturnStatement:677
LINENUMBER 13 L1
```

(cherry picked from commit 49c0d8c)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/dbb8beb0
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/dbb8beb0
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/dbb8beb0

Branch: refs/heads/GROOVY_2_5_X
Commit: dbb8beb0fd48f112488359e0362f181dfb73a7a2
Parents: 7f9d36f
Author: sunlan <sun...@apache.org>
Authored: Thu Mar 8 09:01:27 2018 +0800
Committer: sunlan <sun...@apache.org>
Committed: Thu Mar 8 09:02:23 2018 +0800

----------------------------------------------------------------------
 .../classgen/asm/util/LoggableTextifier.java    | 30 +++++++++++++++-----
 1 file changed, 23 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/dbb8beb0/src/main/java/org/codehaus/groovy/classgen/asm/util/LoggableTextifier.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/codehaus/groovy/classgen/asm/util/LoggableTextifier.java 
b/src/main/java/org/codehaus/groovy/classgen/asm/util/LoggableTextifier.java
index fe1d39e..46d22f4 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/util/LoggableTextifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/util/LoggableTextifier.java
@@ -19,7 +19,6 @@
 package org.codehaus.groovy.classgen.asm.util;
 
 import org.codehaus.groovy.control.CompilerConfiguration;
-import org.codehaus.groovy.runtime.StringGroovyMethods;
 import org.objectweb.asm.Attribute;
 import org.objectweb.asm.Handle;
 import org.objectweb.asm.Label;
@@ -36,8 +35,10 @@ import java.util.List;
  * @since 2.5.0
  */
 public class LoggableTextifier extends Textifier {
+    private static final String GROOVY_LOG_CLASSGEN_STACKTRACE_MAX_DEPTH = 
"groovy.log.classgen.stacktrace.max.depth";
     private static final String GROOVY = ".groovy.";
     private static final String LOGGABLE_TEXTIFIER = ".LoggableTextifier";
+    private static final int STACKTRACE_MAX_DEPTH = 
Integer.getInteger(GROOVY_LOG_CLASSGEN_STACKTRACE_MAX_DEPTH, 0);
     private int loggedLineCnt = 0;
 
     public LoggableTextifier() {
@@ -64,9 +65,9 @@ public class LoggableTextifier extends Textifier {
         }
 
         if (bcList.size() > 0) {
-            String invocationPositionInfo = getInvocationPositionInfo();
-            if (!StringGroovyMethods.isBlank(invocationPositionInfo)) {
-                
System.out.println("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//
 " + invocationPositionInfo);
+            List<StackTraceElement> invocationPositionInfo = 
getInvocationPositionInfo();
+            if (invocationPositionInfo.size() > 0) {
+                
System.out.print(formatInvocationPositionInfo(invocationPositionInfo));
             }
 
             for (Object bc : bcList) {
@@ -77,17 +78,32 @@ public class LoggableTextifier extends Textifier {
         loggedLineCnt = textSize;
     }
 
-    private String getInvocationPositionInfo() {
+    private List<StackTraceElement> getInvocationPositionInfo() {
         StackTraceElement[] stackTraceElements = new 
Throwable().getStackTrace();
+        List<StackTraceElement> stackTraceElementList = new LinkedList<>();
 
         for (StackTraceElement stackTraceElement : stackTraceElements) {
             String className = stackTraceElement.getClassName();
             if (className.contains(GROOVY) && 
!className.endsWith(LOGGABLE_TEXTIFIER)) {
-                return String.format("%s#%s:%s", className, 
stackTraceElement.getMethodName(), stackTraceElement.getLineNumber());
+                if (stackTraceElementList.size() >= STACKTRACE_MAX_DEPTH) {
+                    break;
+                }
+
+                stackTraceElementList.add(stackTraceElement);
             }
         }
 
-        return "";
+        return stackTraceElementList;
+    }
+
+    private String formatInvocationPositionInfo(List<StackTraceElement> 
stackTraceElementList) {
+        StringBuilder sb = new StringBuilder(128);
+        for (StackTraceElement stackTraceElement : stackTraceElementList) {
+            
sb.append("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// ");
+            sb.append(String.format("%s#%s:%s%n", 
stackTraceElement.getClassName(), stackTraceElement.getMethodName(), 
stackTraceElement.getLineNumber()));
+        }
+
+        return sb.toString();
     }
 
 

Reply via email to