# Global Metrics

path: .metrics.mi.mi_sei
old: 80.90327420749804
new: 40.98894487277423
path: .metrics.mi.mi_original
old: 82.19312757080608
new: 50.30085361761073
path: .metrics.mi.mi_visual_studio
old: 48.066156474155605
new: 29.41570386994779
path: .metrics.cognitive.average
old: 0.0
new: 0.07692307692307693
path: .metrics.cognitive.sum
old: 0.0
new: 1.0
path: .metrics.cyclomatic.average
old: 1.0
new: 1.0588235294117647
path: .metrics.cyclomatic.sum
old: 5.0
new: 18.0
path: .metrics.halstead.time
old: 65.62535730260053
new: 1429.7698283152797
path: .metrics.halstead.n2
old: 19.0
new: 36.0
path: .metrics.halstead.purity_ratio
old: 2.5893159932795853
new: 1.2556536061436772
path: .metrics.halstead.bugs
old: 0.0372484497658234
new: 0.29056134294297764
path: .metrics.halstead.n1
old: 10.0
new: 18.0
path: .metrics.halstead.vocabulary
old: 29.0
new: 54.0
path: .metrics.halstead.estimated_program_length
old: 113.92990370430176
new: 261.17595007788486
path: .metrics.halstead.length
old: 44.0
new: 208.0
path: .metrics.halstead.N2
old: 21.0
new: 86.0
path: .metrics.halstead.N1
old: 23.0
new: 122.0
path: .metrics.halstead.effort
old: 1181.2564314468095
new: 25735.85690967503
path: .metrics.halstead.volume
old: 213.75116378561316
new: 1197.0166004500013
path: .metrics.halstead.level
old: 0.18095238095238095
new: 0.046511627906976744
path: .metrics.halstead.difficulty
old: 5.526315789473684
new: 21.5
path: .metrics.nom.functions
old: 1.0
new: 13.0
path: .metrics.nom.total
old: 1.0
new: 13.0
path: .metrics.nargs.sum
old: 0.0
new: 6.0
path: .metrics.nargs.average
old: 0.0
new: 0.4615384615384616
path: .metrics.loc.blank
old: 6.0
new: 15.0
path: .metrics.loc.cloc
old: 12.0
new: 58.0
path: .metrics.loc.ploc
old: 22.0
new: 64.0
path: .metrics.loc.lloc
old: 0.0
new: 9.0
path: .metrics.loc.sloc
old: 40.0
new: 137.0
path: .metrics.nexits.average
old: 0.0
new: 0.07692307692307693
path: .metrics.nexits.sum
old: 0.0
new: 1.0

# Spaces Data

## Minimal test - lines (40, 41)

path: .spaces[0].spaces[0].spaces[0].metrics.halstead.n1
old: 10.0
new: 7.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.N2
old: 14.0
new: 9.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.bugs
old: 0.029395995827303116
new: 0.01686225011146998
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.vocabulary
old: 23.0
new: 14.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.volume
old: 153.80110650593844
new: 79.9544533632097
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.time
old: 46.008878014596974
new: 19.988613340802424
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.length
old: 34.0
new: 21.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.N1
old: 20.0
new: 12.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.purity_ratio
old: 2.391911684844348
new: 1.8715699480384027
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.level
old: 0.1857142857142857
new: 0.2222222222222222
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.estimated_program_length
old: 81.32499728470782
new: 39.302968908806456
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.effort
old: 828.1598042627455
new: 359.79504013444364
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.difficulty
old: 5.384615384615385
new: 4.5
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.n2
old: 13.0
new: 7.0
path: .spaces[0].spaces[0].spaces[0].metrics.cyclomatic.sum
old: 2.0
new: 1.0
path: .spaces[0].spaces[0].spaces[0].metrics.nargs.average
old: 0.0
new: 2.0
path: .spaces[0].spaces[0].spaces[0].metrics.nargs.sum
old: 0.0
new: 2.0
path: .spaces[0].spaces[0].spaces[0].metrics.mi.mi_original
old: 100.48415343438268
new: 136.75743854910016
path: .spaces[0].spaces[0].spaces[0].metrics.mi.mi_sei
old: 88.9416946899383
new: 121.70024626685564
path: .spaces[0].spaces[0].spaces[0].metrics.mi.mi_visual_studio
old: 58.76266282712437
new: 79.97511026263167
path: .spaces[0].spaces[0].spaces[0].metrics.loc.cloc
old: 1.0
new: 0.0
path: .spaces[0].spaces[0].spaces[0].metrics.loc.ploc
old: 12.0
new: 2.0
path: .spaces[0].spaces[0].spaces[0].metrics.loc.sloc
old: 15.0
new: 2.0
path: .spaces[0].spaces[0].spaces[0].metrics.loc.blank
old: 2.0
new: 0.0

### Code

      OffTheBooksCondVar(OffTheBooksMutex& aLock, const char* aName)
          : BlockingResourceBase(aName, eCondVar), mLock(&aLock) {}

## Minimal test - lines (27, 113)

path: .spaces[0].spaces[0].metrics.nargs.sum
old: 0.0
new: 4.0
path: .spaces[0].spaces[0].metrics.nargs.average
old: 0.0
new: 0.3333333333333333
path: .spaces[0].spaces[0].metrics.nexits.sum
old: 0.0
new: 1.0
path: .spaces[0].spaces[0].metrics.nexits.average
old: 0.0
new: 0.08333333333333333
path: .spaces[0].spaces[0].metrics.cyclomatic.sum
old: 3.0
new: 13.0
path: .spaces[0].spaces[0].metrics.mi.mi_sei
old: 90.23279709869324
new: 56.55458026751417
path: .spaces[0].spaces[0].metrics.mi.mi_original
old: 93.5398730895066
new: 60.91491340056997
path: .spaces[0].spaces[0].metrics.mi.mi_visual_studio
old: 54.701680169302115
new: 35.622756374602325
path: .spaces[0].spaces[0].metrics.loc.cloc
old: 4.0
new: 39.0
path: .spaces[0].spaces[0].metrics.loc.sloc
old: 22.0
new: 87.0
path: .spaces[0].spaces[0].metrics.loc.blank
old: 4.0
new: 8.0
path: .spaces[0].spaces[0].metrics.loc.ploc
old: 14.0
new: 40.0
path: .spaces[0].spaces[0].metrics.loc.lloc
old: 0.0
new: 8.0
path: .spaces[0].spaces[0].metrics.halstead.purity_ratio
old: 2.338439185342705
new: 1.2581853558896512
path: .spaces[0].spaces[0].metrics.halstead.N1
old: 22.0
new: 90.0
path: .spaces[0].spaces[0].metrics.halstead.difficulty
old: 5.357142857142857
new: 17.846153846153847
path: .spaces[0].spaces[0].metrics.halstead.n2
old: 14.0
new: 26.0
path: .spaces[0].spaces[0].metrics.halstead.n1
old: 10.0
new: 16.0
path: .spaces[0].spaces[0].metrics.halstead.volume
old: 169.64361252668277
new: 798.0629785712566
path: .spaces[0].spaces[0].metrics.halstead.effort
old: 908.8050671072292
new: 14242.354694502426
path: .spaces[0].spaces[0].metrics.halstead.length
old: 37.0
new: 148.0
path: .spaces[0].spaces[0].metrics.halstead.time
old: 50.48917039484606
new: 791.241927472357
path: .spaces[0].spaces[0].metrics.halstead.level
old: 0.18666666666666668
new: 0.05603448275862069
path: .spaces[0].spaces[0].metrics.halstead.bugs
old: 0.03127465818742369
new: 0.19585437480070325
path: .spaces[0].spaces[0].metrics.halstead.N2
old: 15.0
new: 58.0
path: .spaces[0].spaces[0].metrics.halstead.vocabulary
old: 24.0
new: 42.0
path: .spaces[0].spaces[0].metrics.halstead.estimated_program_length
old: 86.52224985768008
new: 186.2114326716684
path: .spaces[0].spaces[0].metrics.nom.total
old: 1.0
new: 12.0
path: .spaces[0].spaces[0].metrics.nom.functions
old: 1.0
new: 12.0

### Code

    class OffTheBooksCondVar : BlockingResourceBase {
     public:
      /**
       * OffTheBooksCondVar
       *
       * The CALLER owns |aLock|.
       *
       * @param aLock A Mutex to associate with this condition variable.
       * @param aName A name which can reference this monitor
       * @returns If failure, nullptr.
       *          If success, a valid Monitor* which must be destroyed
       *          by Monitor::DestroyMonitor()
       **/
      OffTheBooksCondVar(OffTheBooksMutex& aLock, const char* aName)
          : BlockingResourceBase(aName, eCondVar), mLock(&aLock) {}

      /**
       * ~OffTheBooksCondVar
       * Clean up after this OffTheBooksCondVar, but NOT its associated Mutex.
       **/
      ~OffTheBooksCondVar() = default;

      /**
       * Wait
       * @see prcvar.h
       **/
    #ifndef DEBUG
      void Wait() {
    #  ifdef MOZILLA_INTERNAL_API
        AUTO_PROFILER_THREAD_SLEEP;
    #  endif  // MOZILLA_INTERNAL_API
        mImpl.wait(*mLock);
      }

      CVStatus Wait(TimeDuration aDuration) {
    #  ifdef MOZILLA_INTERNAL_API
        AUTO_PROFILER_THREAD_SLEEP;
    #  endif  // MOZILLA_INTERNAL_API
        return mImpl.wait_for(*mLock, aDuration);
      }
    #else
      // NOTE: debug impl is in BlockingResourceBase.cpp
      void Wait();
      CVStatus Wait(TimeDuration aDuration);
    #endif

      /**
       * Notify
       * @see prcvar.h
       **/
      void Notify() { mImpl.notify_one(); }

      /**
       * NotifyAll
       * @see prcvar.h
       **/
      void NotifyAll() { mImpl.notify_all(); }

    #ifdef DEBUG
      /**
       * AssertCurrentThreadOwnsMutex
       * @see Mutex::AssertCurrentThreadOwns
       **/
      void AssertCurrentThreadOwnsMutex() { mLock->AssertCurrentThreadOwns(); }

      /**
       * AssertNotCurrentThreadOwnsMutex
       * @see Mutex::AssertNotCurrentThreadOwns
       **/
      void AssertNotCurrentThreadOwnsMutex() {
        mLock->AssertNotCurrentThreadOwns();
      }

    #else
      void AssertCurrentThreadOwnsMutex() {}
      void AssertNotCurrentThreadOwnsMutex() {}

    #endif  // ifdef DEBUG

     private:
      OffTheBooksCondVar();
      OffTheBooksCondVar(const OffTheBooksCondVar&) = delete;
      OffTheBooksCondVar& operator=(const OffTheBooksCondVar&) = delete;

      OffTheBooksMutex* mLock;
      detail::ConditionVariableImpl mImpl;
    };

## Minimal test - lines (19, 135)

path: .spaces[0].metrics.mi.mi_visual_studio
old: 53.54396075254491
new: 31.50073993832539
path: .spaces[0].metrics.mi.mi_original
old: 91.5601728868518
new: 53.86626529453642
path: .spaces[0].metrics.mi.mi_sei
old: 89.2816817664054
new: 46.05514092919787
path: .spaces[0].metrics.nom.total
old: 1.0
new: 13.0
path: .spaces[0].metrics.nom.functions
old: 1.0
new: 13.0
path: .spaces[0].metrics.nexits.average
old: 0.0
new: 0.07692307692307693
path: .spaces[0].metrics.nexits.sum
old: 0.0
new: 1.0
path: .spaces[0].metrics.loc.ploc
old: 16.0
new: 54.0
path: .spaces[0].metrics.loc.blank
old: 3.0
new: 13.0
path: .spaces[0].metrics.loc.lloc
old: 0.0
new: 9.0
path: .spaces[0].metrics.loc.cloc
old: 5.0
new: 50.0
path: .spaces[0].metrics.loc.sloc
old: 24.0
new: 117.0
path: .spaces[0].metrics.halstead.time
old: 53.662338192952376
new: 1228.6856706695714
path: .spaces[0].metrics.halstead.vocabulary
old: 25.0
new: 46.0
path: .spaces[0].metrics.halstead.effort
old: 965.9220874731428
new: 22116.342072052284
path: .spaces[0].metrics.halstead.n2
old: 15.0
new: 30.0
path: .spaces[0].metrics.halstead.purity_ratio
old: 2.354426663666703
new: 1.083111373683362
path: .spaces[0].metrics.halstead.N2
old: 16.0
new: 77.0
path: .spaces[0].metrics.halstead.difficulty
old: 5.333333333333333
new: 20.533333333333335
path: .spaces[0].metrics.halstead.length
old: 39.0
new: 195.0
path: .spaces[0].metrics.halstead.level
old: 0.1875
new: 0.0487012987012987
path: .spaces[0].metrics.halstead.volume
old: 181.11039140121423
new: 1077.0945814311176
path: .spaces[0].metrics.halstead.n1
old: 10.0
new: 16.0
path: .spaces[0].metrics.halstead.N1
old: 23.0
new: 118.0
path: .spaces[0].metrics.halstead.bugs
old: 0.0325716787930348
new: 0.26263601345647686
path: .spaces[0].metrics.halstead.estimated_program_length
old: 91.8226398830014
new: 211.20671786825557
path: .spaces[0].metrics.nargs.average
old: 0.0
new: 0.4615384615384616
path: .spaces[0].metrics.nargs.sum
old: 0.0
new: 6.0
path: .spaces[0].metrics.cyclomatic.sum
old: 4.0
new: 16.0

### Code

    namespace mozilla {

    /**
     * Similarly to OffTheBooksMutex, OffTheBooksCondvar is identical to CondVar,
     * except that OffTheBooksCondVar doesn't include leak checking.  Sometimes
     * you want to intentionally "leak" a CondVar until shutdown; in these cases,
     * OffTheBooksCondVar is for you.
     */
    class OffTheBooksCondVar : BlockingResourceBase {
     public:
      /**
       * OffTheBooksCondVar
       *
       * The CALLER owns |aLock|.
       *
       * @param aLock A Mutex to associate with this condition variable.
       * @param aName A name which can reference this monitor
       * @returns If failure, nullptr.
       *          If success, a valid Monitor* which must be destroyed
       *          by Monitor::DestroyMonitor()
       **/
      OffTheBooksCondVar(OffTheBooksMutex& aLock, const char* aName)
          : BlockingResourceBase(aName, eCondVar), mLock(&aLock) {}

      /**
       * ~OffTheBooksCondVar
       * Clean up after this OffTheBooksCondVar, but NOT its associated Mutex.
       **/
      ~OffTheBooksCondVar() = default;

      /**
       * Wait
       * @see prcvar.h
       **/
    #ifndef DEBUG
      void Wait() {
    #  ifdef MOZILLA_INTERNAL_API
        AUTO_PROFILER_THREAD_SLEEP;
    #  endif  // MOZILLA_INTERNAL_API
        mImpl.wait(*mLock);
      }

      CVStatus Wait(TimeDuration aDuration) {
    #  ifdef MOZILLA_INTERNAL_API
        AUTO_PROFILER_THREAD_SLEEP;
    #  endif  // MOZILLA_INTERNAL_API
        return mImpl.wait_for(*mLock, aDuration);
      }
    #else
      // NOTE: debug impl is in BlockingResourceBase.cpp
      void Wait();
      CVStatus Wait(TimeDuration aDuration);
    #endif

      /**
       * Notify
       * @see prcvar.h
       **/
      void Notify() { mImpl.notify_one(); }

      /**
       * NotifyAll
       * @see prcvar.h
       **/
      void NotifyAll() { mImpl.notify_all(); }

    #ifdef DEBUG
      /**
       * AssertCurrentThreadOwnsMutex
       * @see Mutex::AssertCurrentThreadOwns
       **/
      void AssertCurrentThreadOwnsMutex() { mLock->AssertCurrentThreadOwns(); }

      /**
       * AssertNotCurrentThreadOwnsMutex
       * @see Mutex::AssertNotCurrentThreadOwns
       **/
      void AssertNotCurrentThreadOwnsMutex() {
        mLock->AssertNotCurrentThreadOwns();
      }

    #else
      void AssertCurrentThreadOwnsMutex() {}
      void AssertNotCurrentThreadOwnsMutex() {}

    #endif  // ifdef DEBUG

     private:
      OffTheBooksCondVar();
      OffTheBooksCondVar(const OffTheBooksCondVar&) = delete;
      OffTheBooksCondVar& operator=(const OffTheBooksCondVar&) = delete;

      OffTheBooksMutex* mLock;
      detail::ConditionVariableImpl mImpl;
    };

    /**
     * CondVar
     * Vanilla condition variable.  Please don't use this unless you have a
     * compelling reason --- Monitor provides a simpler API.
     */
    class CondVar : public OffTheBooksCondVar {
     public:
      CondVar(OffTheBooksMutex& aLock, const char* aName)
          : OffTheBooksCondVar(aLock, aName) {
        MOZ_COUNT_CTOR(CondVar);
      }

      MOZ_COUNTED_DTOR(CondVar)

     private:
      CondVar();
      CondVar(const CondVar&);
      CondVar& operator=(const CondVar&);
    };

    }  // namespace mozilla