]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/coverage/CoverageBuilder.java
Merge commit 'ffdf837'
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / module / coverage / CoverageBuilder.java
1 package org.simantics.scl.compiler.module.coverage;\r
2 \r
3 import org.simantics.scl.compiler.module.Module;\r
4 import org.simantics.scl.runtime.profiling.BranchPoint;\r
5 \r
6 import gnu.trove.map.hash.THashMap;\r
7 import gnu.trove.procedure.TObjectObjectProcedure;\r
8 \r
9 public class CoverageBuilder {\r
10     THashMap<String, THashMap<String, BranchPoint[]>> combined =\r
11             new THashMap<String, THashMap<String, BranchPoint[]>>();\r
12     \r
13     public void addCoverage(Module module, boolean persistOverBranchpointReset) {\r
14         THashMap<String, BranchPoint[]> branchPointMap = module.getBranchPoints();\r
15         if(branchPointMap == null)\r
16             return;\r
17         THashMap<String, BranchPoint[]> oldBranchPointMap = combined.get(module.getName());\r
18         if(oldBranchPointMap == null) {\r
19             oldBranchPointMap = new THashMap<String, BranchPoint[]>();\r
20             combined.put(module.getName(), oldBranchPointMap);\r
21         }\r
22         THashMap<String, BranchPoint[]> oldBranchPointMap_ = oldBranchPointMap;\r
23         branchPointMap.forEachEntry(new TObjectObjectProcedure<String, BranchPoint[]>() {\r
24             @Override\r
25             public boolean execute(String name, BranchPoint[] branchPoints) {\r
26                 BranchPoint[] oldBranchPoints = oldBranchPointMap_.get(name);\r
27                 if(oldBranchPoints == null) {\r
28                     if (persistOverBranchpointReset) {\r
29                         // Clone the branchPoints array so that if will last over a reset\r
30                         BranchPoint[] clonedBranchPoints = cloneBranchPoints(branchPoints);\r
31                         oldBranchPointMap_.put(name, clonedBranchPoints);\r
32                     } else {\r
33                         // No need to copy so resetting branchpoints will reset this as well\r
34                         oldBranchPointMap_.put(name, branchPoints);\r
35                     }\r
36                 } else {\r
37                     combineCounters(oldBranchPoints, branchPoints);\r
38                 }\r
39                 return true;\r
40             }\r
41         });\r
42     }\r
43     \r
44     private static BranchPoint[] cloneBranchPoints(BranchPoint[] oldBranchPoints) {\r
45         BranchPoint[] newBranchPoints = new BranchPoint[oldBranchPoints.length];\r
46         for (int i = 0; i < oldBranchPoints.length; i++) {\r
47             BranchPoint bp = oldBranchPoints[i];\r
48             BranchPoint[] children = cloneBranchPoints(bp.getChildren());\r
49             newBranchPoints[i] = new BranchPoint(bp.getLocation(), bp.getCodeSize(), children);\r
50         }\r
51         return newBranchPoints;\r
52     }\r
53     \r
54     private static void combineCounters(BranchPoint[] oldBranchPoints, BranchPoint[] branchPoints) {\r
55         if(oldBranchPoints.length != branchPoints.length)\r
56             throw new IllegalArgumentException("Incompatible branch points.");\r
57         for(int i=0;i<branchPoints.length;++i) {\r
58             BranchPoint oldBP = oldBranchPoints[i];\r
59             BranchPoint newBP = branchPoints[i];\r
60             if(oldBP.getLocation() != newBP.getLocation())\r
61                 throw new IllegalArgumentException("Incompatible branch points.");\r
62             oldBP.incrementVisitCounter(newBP.getVisitCounter());\r
63             combineCounters(oldBP.getChildren(), newBP.getChildren());\r
64         }\r
65     }\r
66     \r
67     public CombinedCoverage getCoverage() {\r
68         THashMap<String,ModuleCoverage> moduleCoverages =\r
69                 new THashMap<String,ModuleCoverage>();\r
70         combined.forEachEntry(new TObjectObjectProcedure<String, THashMap<String, BranchPoint[]>>() {\r
71             @Override\r
72             public boolean execute(String name, THashMap<String, BranchPoint[]> branchPoints) {\r
73                 moduleCoverages.put(name, CoverageUtils.getCoverage(name, branchPoints));\r
74                 return true;\r
75             }\r
76         });\r
77         return CoverageUtils.combineCoverages(moduleCoverages);\r
78     }\r
79 }\r