|
6 | 6 | import com.oracle.graal.pointsto.reports.CallTreePrinter.MethodNode;
|
7 | 7 | import com.oracle.graal.pointsto.reports.CallTreePrinter.MethodNodeReference;
|
8 | 8 | import com.oracle.graal.pointsto.reports.CallTreePrinter.Node;
|
| 9 | +import jdk.vm.ci.meta.JavaKind; |
9 | 10 | import jdk.vm.ci.meta.ResolvedJavaMethod;
|
| 11 | +import jdk.vm.ci.meta.ResolvedJavaType; |
10 | 12 |
|
11 | 13 | import java.io.File;
|
12 | 14 | import java.io.PrintWriter;
|
|
21 | 23 | import java.util.Objects;
|
22 | 24 | import java.util.Set;
|
23 | 25 | import java.util.concurrent.atomic.AtomicInteger;
|
| 26 | +import java.util.regex.MatchResult; |
| 27 | +import java.util.regex.Matcher; |
| 28 | +import java.util.regex.Pattern; |
24 | 29 | import java.util.stream.Collectors;
|
25 | 30 | import java.util.stream.Stream;
|
26 | 31 |
|
27 | 32 | public class CallTreeCypher {
|
28 | 33 |
|
29 | 34 | private static final AtomicInteger virtualNodeId = new AtomicInteger(-1);
|
| 35 | + public static final Pattern DISPLAY_PATTERN = Pattern.compile( |
| 36 | + "\\b[a-zA-Z]|[A-Z]|\\." |
| 37 | + ); |
30 | 38 |
|
31 | 39 | public static void print(BigBang bigbang, String path, String reportName) {
|
32 | 40 | // Re-initialize method ids back to 0 to better diagnose disparities
|
@@ -91,11 +99,11 @@ private static void printCypher(String vmFileName, String methodsFileName, Strin
|
91 | 99 | writer.println("RETURN count(v);");
|
92 | 100 | writer.println("");
|
93 | 101 | writer.println(String.format("LOAD CSV WITH HEADERS FROM 'file:///%s' AS row", methodsFileName));
|
94 |
| - writer.println("MERGE (m:Method {methodId: row.Id, name: row.Name, type: row.Type, parameters: row.Parameters, return: row.Return})"); |
| 102 | + writer.println("MERGE (m:Method {methodId: row.Id, name: row.Name, type: row.Type, parameters: row.Parameters, return: row.Return, display: row.Display})"); |
95 | 103 | writer.println("RETURN count(m);");
|
96 | 104 | writer.println("");
|
97 | 105 | writer.println(String.format("LOAD CSV WITH HEADERS FROM 'file:///%s' AS row", virtualMethodsFileName));
|
98 |
| - writer.println("MERGE (m:Method {methodId: row.Id, name: row.Name, type: row.Type, parameters: row.Parameters, return: row.Return})"); |
| 106 | + writer.println("MERGE (m:Method {methodId: row.Id, name: row.Name, type: row.Type, parameters: row.Parameters, return: row.Return, display: row.Display})"); |
99 | 107 | writer.println("RETURN count(m);");
|
100 | 108 | writer.println("");
|
101 | 109 | writer.println(String.format("LOAD CSV WITH HEADERS FROM 'file:///%s' AS row", entryPointsFileName));
|
@@ -152,7 +160,7 @@ private static void walkNodes(MethodNode methodNode, Map<Integer, Set<BciEndEdge
|
152 | 160 | }
|
153 | 161 |
|
154 | 162 | private static void printMethodNodes(Collection<MethodNode> methods, PrintWriter writer) {
|
155 |
| - writer.println(convertToCSV("Id", "Name", "Type", "Parameters", "Return")); |
| 163 | + writer.println(convertToCSV("Id", "Name", "Type", "Parameters", "Return", "Display")); |
156 | 164 | methods.stream()
|
157 | 165 | .map(CallTreeCypher::methodNodeInfo)
|
158 | 166 | .map(CallTreeCypher::convertToCSV)
|
@@ -189,7 +197,7 @@ private static List<Integer> bytecodeIndexes(InvokeNode node) {
|
189 | 197 | }
|
190 | 198 |
|
191 | 199 | private static void printVirtualNodes(Map<List<String>, Integer> virtualNodes, PrintWriter writer) {
|
192 |
| - writer.println(convertToCSV("Id", "Name", "Type", "Parameters", "Return")); |
| 200 | + writer.println(convertToCSV("Id", "Name", "Type", "Parameters", "Return", "Display")); |
193 | 201 | virtualNodes.entrySet().stream()
|
194 | 202 | .map(CallTreeCypher::virtualMethodAndIdInfo)
|
195 | 203 | .map(CallTreeCypher::convertToCSV)
|
@@ -266,10 +274,27 @@ private static List<String> resolvedJavaMethodInfo(Integer id, ResolvedJavaMetho
|
266 | 274 | method.getName(),
|
267 | 275 | method.getDeclaringClass().toJavaName(true),
|
268 | 276 | parameters,
|
269 |
| - method.getSignature().getReturnType(null).toJavaName(true) |
| 277 | + method.getSignature().getReturnType(null).toJavaName(true), |
| 278 | + display(method) |
270 | 279 | );
|
271 | 280 | }
|
272 | 281 |
|
| 282 | + private static String display(ResolvedJavaMethod method) { |
| 283 | + final ResolvedJavaType type = method.getDeclaringClass(); |
| 284 | + final String typeName = type.toJavaName(true); |
| 285 | + if (type.getJavaKind() == JavaKind.Object) { |
| 286 | + List<String> matchResults = new ArrayList<>(); |
| 287 | + Matcher matcher = DISPLAY_PATTERN.matcher(typeName); |
| 288 | + while (matcher.find()) { |
| 289 | + matchResults.add(matcher.toMatchResult().group()); |
| 290 | + } |
| 291 | + |
| 292 | + return String.join("", matchResults) + "." + method.getName(); |
| 293 | + } |
| 294 | + |
| 295 | + return typeName + "." + method.getName(); |
| 296 | + } |
| 297 | + |
273 | 298 | private static String convertToCSV(String... data) {
|
274 | 299 | return String.join(",", data);
|
275 | 300 | }
|
|
0 commit comments