X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fmodule%2Fcoverage%2FCoverageBuilder.java;h=e4199401165b674f4a0780f9f6cef905b4ec6d62;hb=refs%2Fchanges%2F38%2F238%2F2;hp=b3bfcd88902bcaf5f9ce731ee1a2b54f05797b0d;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/coverage/CoverageBuilder.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/coverage/CoverageBuilder.java index b3bfcd889..e41994011 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/coverage/CoverageBuilder.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/coverage/CoverageBuilder.java @@ -1,61 +1,79 @@ -package org.simantics.scl.compiler.module.coverage; - -import org.simantics.scl.compiler.module.Module; -import org.simantics.scl.runtime.profiling.BranchPoint; - -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectObjectProcedure; - -public class CoverageBuilder { - THashMap> combined = - new THashMap>(); - - public void addCoverage(Module module) { - THashMap branchPointMap = module.getBranchPoints(); - if(branchPointMap == null) - return; - THashMap oldBranchPointMap = combined.get(module.getName()); - if(oldBranchPointMap == null) { - oldBranchPointMap = new THashMap(); - combined.put(module.getName(), oldBranchPointMap); - } - THashMap oldBranchPointMap_ = oldBranchPointMap; - branchPointMap.forEachEntry(new TObjectObjectProcedure() { - @Override - public boolean execute(String name, BranchPoint[] branchPoints) { - BranchPoint[] oldBranchPoints = oldBranchPointMap_.get(name); - if(oldBranchPoints == null) - oldBranchPointMap_.put(name, branchPoints); - else - combineCounters(oldBranchPoints, branchPoints); - return true; - } - }); - } - - private static void combineCounters(BranchPoint[] oldBranchPoints, BranchPoint[] branchPoints) { - if(oldBranchPoints.length != branchPoints.length) - throw new IllegalArgumentException("Incompatible branch points."); - for(int i=0;i moduleCoverages = - new THashMap(); - combined.forEachEntry(new TObjectObjectProcedure>() { - @Override - public boolean execute(String name, THashMap branchPoints) { - moduleCoverages.put(name, CoverageUtils.getCoverage(name, branchPoints)); - return true; - } - }); - return CoverageUtils.combineCoverages(moduleCoverages); - } -} +package org.simantics.scl.compiler.module.coverage; + +import org.simantics.scl.compiler.module.Module; +import org.simantics.scl.runtime.profiling.BranchPoint; + +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectObjectProcedure; + +public class CoverageBuilder { + THashMap> combined = + new THashMap>(); + + public void addCoverage(Module module, boolean persistOverBranchpointReset) { + THashMap branchPointMap = module.getBranchPoints(); + if(branchPointMap == null) + return; + THashMap oldBranchPointMap = combined.get(module.getName()); + if(oldBranchPointMap == null) { + oldBranchPointMap = new THashMap(); + combined.put(module.getName(), oldBranchPointMap); + } + THashMap oldBranchPointMap_ = oldBranchPointMap; + branchPointMap.forEachEntry(new TObjectObjectProcedure() { + @Override + public boolean execute(String name, BranchPoint[] branchPoints) { + BranchPoint[] oldBranchPoints = oldBranchPointMap_.get(name); + if(oldBranchPoints == null) { + if (persistOverBranchpointReset) { + // Clone the branchPoints array so that if will last over a reset + BranchPoint[] clonedBranchPoints = cloneBranchPoints(branchPoints); + oldBranchPointMap_.put(name, clonedBranchPoints); + } else { + // No need to copy so resetting branchpoints will reset this as well + oldBranchPointMap_.put(name, branchPoints); + } + } else { + combineCounters(oldBranchPoints, branchPoints); + } + return true; + } + }); + } + + private static BranchPoint[] cloneBranchPoints(BranchPoint[] oldBranchPoints) { + BranchPoint[] newBranchPoints = new BranchPoint[oldBranchPoints.length]; + for (int i = 0; i < oldBranchPoints.length; i++) { + BranchPoint bp = oldBranchPoints[i]; + BranchPoint[] children = cloneBranchPoints(bp.getChildren()); + newBranchPoints[i] = new BranchPoint(bp.getLocation(), bp.getCodeSize(), children); + } + return newBranchPoints; + } + + private static void combineCounters(BranchPoint[] oldBranchPoints, BranchPoint[] branchPoints) { + if(oldBranchPoints.length != branchPoints.length) + throw new IllegalArgumentException("Incompatible branch points."); + for(int i=0;i moduleCoverages = + new THashMap(); + combined.forEachEntry(new TObjectObjectProcedure>() { + @Override + public boolean execute(String name, THashMap branchPoints) { + moduleCoverages.put(name, CoverageUtils.getCoverage(name, branchPoints)); + return true; + } + }); + return CoverageUtils.combineCoverages(moduleCoverages); + } +}