# Global Metrics

path: .metrics.nom.functions
old: 22.0
new: 1.0
path: .metrics.nom.total
old: 22.0
new: 1.0
path: .metrics.loc.sloc
old: 497.0
new: 64.0
path: .metrics.loc.lloc
old: 159.0
new: 1.0
path: .metrics.loc.ploc
old: 369.0
new: 23.0
path: .metrics.loc.blank
old: 75.0
new: 14.0
path: .metrics.loc.cloc
old: 53.0
new: 27.0
path: .metrics.mi.mi_visual_studio
old: 0.0
new: 41.01665277073896
path: .metrics.mi.mi_original
old: -2.166936762350332
new: 70.13847623796362
path: .metrics.mi.mi_sei
old: -44.31349530737786
new: 68.13591089458687
path: .metrics.halstead.N2
old: 623.0
new: 37.0
path: .metrics.halstead.n2
old: 219.0
new: 31.0
path: .metrics.halstead.n1
old: 29.0
new: 7.0
path: .metrics.halstead.difficulty
old: 41.24885844748859
new: 4.17741935483871
path: .metrics.halstead.level
old: 0.024243095145846015
new: 0.23938223938223935
path: .metrics.halstead.N1
old: 1043.0
new: 63.0
path: .metrics.halstead.effort
old: 546617.12843936
new: 2192.2793967449816
path: .metrics.halstead.estimated_program_length
old: 1843.5598149113569
new: 173.23157007639637
path: .metrics.halstead.length
old: 1666.0
new: 100.0
path: .metrics.halstead.vocabulary
old: 248.0
new: 38.0
path: .metrics.halstead.purity_ratio
old: 1.106578520354956
new: 1.7323157007639636
path: .metrics.halstead.bugs
old: 2.228439781893775
new: 0.056252610335630074
path: .metrics.halstead.volume
old: 13251.691053104534
new: 524.7927513443585
path: .metrics.halstead.time
old: 30367.618246631107
new: 121.79329981916564
path: .metrics.nexits.average
old: 2.090909090909091
new: 0.0
path: .metrics.nexits.sum
old: 46.0
new: 0.0
path: .metrics.cyclomatic.average
old: 4.391304347826087
new: 1.0
path: .metrics.cyclomatic.sum
old: 101.0
new: 4.0
path: .metrics.nargs.sum
old: 21.0
new: 1.0
path: .metrics.nargs.average
old: 0.9545454545454546
new: 1.0
path: .metrics.cognitive.sum
old: 75.0
new: 0.0
path: .metrics.cognitive.average
old: 3.409090909090909
new: 0.0

# Spaces Data

## Minimal test - lines (12, 62)

path: .spaces[0].metrics.cyclomatic.average
old: 3.0
new: 1.0
path: .spaces[0].metrics.nexits.average
old: 3.0
new: 0.0
path: .spaces[0].metrics.nexits.sum
old: 3.0
new: 0.0
path: .spaces[0].metrics.halstead.volume
old: 202.04660144782295
new: 501.4827251399043
path: .spaces[0].metrics.halstead.N2
old: 16.0
new: 34.0
path: .spaces[0].metrics.halstead.n2
old: 11.0
new: 29.0
path: .spaces[0].metrics.halstead.difficulty
old: 7.272727272727272
new: 4.103448275862069
path: .spaces[0].metrics.halstead.effort
old: 1469.4298287114398
new: 2057.8084238499523
path: .spaces[0].metrics.halstead.length
old: 46.0
new: 97.0
path: .spaces[0].metrics.halstead.n1
old: 10.0
new: 7.0
path: .spaces[0].metrics.halstead.N1
old: 30.0
new: 63.0
path: .spaces[0].metrics.halstead.estimated_program_length
old: 71.27302875388389
new: 160.5329333131028
path: .spaces[0].metrics.halstead.bugs
old: 0.04308353332155985
new: 0.05392813141276745
path: .spaces[0].metrics.halstead.time
old: 81.63499048396888
new: 114.32269021388625
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.5494136685626934
new: 1.6549786939495137
path: .spaces[0].metrics.halstead.vocabulary
old: 21.0
new: 36.0
path: .spaces[0].metrics.halstead.level
old: 0.1375
new: 0.2436974789915966
path: .spaces[0].metrics.cognitive.average
old: 2.0
new: 0.0
path: .spaces[0].metrics.cognitive.sum
old: 2.0
new: 0.0
path: .spaces[0].metrics.mi.mi_sei
old: 100.17984829106916
new: 73.02073026198644
path: .spaces[0].metrics.mi.mi_original
old: 93.38454497952068
new: 74.28306511564213
path: .spaces[0].metrics.mi.mi_visual_studio
old: 54.61084501726356
new: 43.44038895651587
path: .spaces[0].metrics.loc.sloc
old: 21.0
new: 51.0
path: .spaces[0].metrics.loc.blank
old: 3.0
new: 12.0
path: .spaces[0].metrics.loc.ploc
old: 10.0
new: 19.0
path: .spaces[0].metrics.loc.lloc
old: 5.0
new: 1.0
path: .spaces[0].metrics.loc.cloc
old: 8.0
new: 20.0

### Code

    namespace lul {

    class Summariser {
     public:
      Summariser(SecMap* aSecMap, uintptr_t aTextBias, void (*aLog)(const char*));

      virtual void Entry(uintptr_t aAddress, uintptr_t aLength);
      virtual void End();

      // Tell the summariser that the value for |aNewReg| at |aAddress| is
      // recovered using the LExpr that can be constructed using the
      // components |how|, |oldReg| and |offset|.  The summariser will
      // inspect the components and may reject them for various reasons,
      // but the hope is that it will find them acceptable and record this
      // rule permanently.
      virtual void Rule(uintptr_t aAddress, int aNewReg, LExprHow how,
                        int16_t oldReg, int64_t offset);

      virtual uint32_t AddPfxInstr(PfxInstr pfxi);

      // Send output to the logging sink, for debugging.
      virtual void Log(const char* str) { mLog(str); }

     private:
      // The SecMap in which we park the finished summaries (RuleSets) and
      // also any PfxInstrs derived from Dwarf expressions.
      SecMap* mSecMap;

      // Running state for the current summary (RuleSet) under construction.
      RuleSet mCurrRules;

      // The start of the address range to which the RuleSet under
      // construction applies.
      uintptr_t mCurrAddr;

      // The highest address, plus one, for which the RuleSet under
      // construction could possibly apply.  If there are no further
      // incoming events then mCurrRules will eventually be emitted
      // as-is, for the range mCurrAddr.. mMax1Addr - 1, if that is
      // nonempty.
      uintptr_t mMax1Addr;

      // The bias value (to add to the SVMAs, to get AVMAs) to be used
      // when adding entries into mSecMap.
      uintptr_t mTextBias;

      // A logging sink, for debugging.
      void (*mLog)(const char* aFmt);
    };

    }  // namespace lul