From ad4cd7db08a9e9138600c01679cd2341c54b5be2 Mon Sep 17 00:00:00 2001 From: yanyir Date: Tue, 24 Oct 2023 19:03:15 +0800 Subject: [PATCH] Revert "Revert changes in Decompiler and StringUtils related to "\\R" handling" This reverts commit dd10ba69d665bcb99ba5f9844abf43de090babe0. --- .../taobao/arthas/core/util/Decompiler.java | 19 ++++++++++------- .../taobao/arthas/core/util/StringUtils.java | 21 +++++++++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/util/Decompiler.java b/core/src/main/java/com/taobao/arthas/core/util/Decompiler.java index 44baf75ea0..b6617bff0b 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/Decompiler.java +++ b/core/src/main/java/com/taobao/arthas/core/util/Decompiler.java @@ -114,23 +114,26 @@ private static String addLineNumber(String src, Map lineMappin StringBuilder sb = new StringBuilder(); - String[] lines = src.split("\\R"); + List lines = StringUtils.toLines(src); - if (maxLineNumber >= 100) { - formatStr = "/*%3d*/ "; - emptyStr = " "; - } else if (maxLineNumber >= 1000) { + if (maxLineNumber >= 1000) { formatStr = "/*%4d*/ "; emptyStr = " "; + } else if (maxLineNumber >= 100) { + formatStr = "/*%3d*/ "; + emptyStr = " "; } - for (int i = 0; i < lines.length; ++i) { - Integer srcLineNumber = lineMapping.get(i + 1); + + int index = 0; + for (String line : lines) { + Integer srcLineNumber = lineMapping.get(index + 1); if (srcLineNumber != null) { sb.append(String.format(formatStr, srcLineNumber)); } else { sb.append(emptyStr); } - sb.append(lines[i]).append("\n"); + sb.append(line).append("\n"); + index++; } return sb.toString(); diff --git a/core/src/main/java/com/taobao/arthas/core/util/StringUtils.java b/core/src/main/java/com/taobao/arthas/core/util/StringUtils.java index dc7d663a60..58993479b5 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/StringUtils.java +++ b/core/src/main/java/com/taobao/arthas/core/util/StringUtils.java @@ -909,6 +909,27 @@ public static String humanReadableByteCount(long bytes) { : String.format("%.1f EiB", (bytes >> 20) / 0x1p40); } + public static List toLines(String text) { + List result = new ArrayList(); + BufferedReader reader = new BufferedReader(new StringReader(text)); + try { + String line = reader.readLine(); + while (line != null) { + result.add(line); + line = reader.readLine(); + } + } catch (IOException exc) { + // quit + } finally { + try { + reader.close(); + } catch (IOException e) { + // ignore + } + } + return result; + } + public static String randomString(int length) { StringBuilder sb = new StringBuilder(length); for (int i = 0; i < length; i++)