Global Metrics

path: .metrics.cognitive.average
old: 3.4
new: 0.10526315789473684

path: .metrics.cognitive.sum
old: 68.0
new: 2.0

path: .metrics.loc.cloc
old: 24.0
new: 94.0

path: .metrics.loc.lloc
old: 139.0
new: 28.0

path: .metrics.loc.blank
old: 51.0
new: 27.0

path: .metrics.loc.ploc
old: 325.0
new: 121.0

path: .metrics.loc.sloc
old: 400.0
new: 242.0

path: .metrics.nexits.average
old: 2.55
new: 0.3157894736842105

path: .metrics.nexits.sum
old: 51.0
new: 6.0

path: .metrics.mi.mi_sei
old: -46.49322313843211
new: 18.53726301315197

path: .metrics.mi.mi_visual_studio
old: 0.12178222454714711
new: 20.33558304923429

path: .metrics.mi.mi_original
old: 0.2082476039756216
new: 34.773847014190636

path: .metrics.halstead.purity_ratio
old: 0.4770057071514931
new: 0.9158522653365702

path: .metrics.halstead.length
old: 2165.0
new: 404.0

path: .metrics.halstead.time
old: 93468.9057258757
new: 4330.705674310324

path: .metrics.halstead.N1
old: 1299.0
new: 235.0

path: .metrics.halstead.N2
old: 866.0
new: 169.0

path: .metrics.halstead.n2
old: 126.0
new: 51.0

path: .metrics.halstead.bugs
old: 4.715255035519635
new: 0.6082743845817487

path: .metrics.halstead.estimated_program_length
old: 1032.7173559829826
new: 370.0043151959744

path: .metrics.halstead.vocabulary
old: 157.0
new: 70.0

path: .metrics.halstead.volume
old: 15792.853921350372
new: 2476.2303388457663

path: .metrics.halstead.level
old: 0.009386873277210757
new: 0.031765805045157275

path: .metrics.halstead.n1
old: 31.0
new: 19.0

path: .metrics.halstead.effort
old: 1682440.3030657624
new: 77952.70213758583

path: .metrics.halstead.difficulty
old: 106.53174603174604
new: 31.480392156862745

path: .metrics.nom.functions
old: 20.0
new: 19.0

path: .metrics.nom.total
old: 20.0
new: 19.0

path: .metrics.nargs.average
old: 2.3
new: 0.42105263157894735

path: .metrics.nargs.sum
old: 46.0
new: 8.0

path: .metrics.cyclomatic.average
old: 4.636363636363637
new: 1.2083333333333333

path: .metrics.cyclomatic.sum
old: 102.0
new: 29.0

Spaces Data

Minimal test - lines (29, 240)

path: .spaces[0].metrics.mi.mi_original
old: 1.2388195222120828
new: 37.64559154341711

path: .spaces[0].metrics.mi.mi_sei
old: -47.578522774738474
new: 21.36749300300314

path: .spaces[0].metrics.mi.mi_visual_studio
old: 0.7244558609427385
new: 22.01496581486381

path: .spaces[0].metrics.nexits.sum
old: 51.0
new: 6.0

path: .spaces[0].metrics.nexits.average
old: 2.55
new: 0.3157894736842105

path: .spaces[0].metrics.cyclomatic.sum
old: 101.0
new: 27.0

path: .spaces[0].metrics.cyclomatic.average
old: 4.809523809523809
new: 1.173913043478261

path: .spaces[0].metrics.loc.sloc
old: 382.0
new: 212.0

path: .spaces[0].metrics.loc.cloc
old: 17.0
new: 76.0

path: .spaces[0].metrics.loc.blank
old: 47.0
new: 24.0

path: .spaces[0].metrics.loc.ploc
old: 318.0
new: 112.0

path: .spaces[0].metrics.loc.lloc
old: 139.0
new: 28.0

path: .spaces[0].metrics.nom.total
old: 20.0
new: 19.0

path: .spaces[0].metrics.nom.functions
old: 20.0
new: 19.0

path: .spaces[0].metrics.nargs.sum
old: 46.0
new: 8.0

path: .spaces[0].metrics.nargs.average
old: 2.3
new: 0.42105263157894735

path: .spaces[0].metrics.cognitive.sum
old: 68.0
new: 1.0

path: .spaces[0].metrics.cognitive.average
old: 3.4
new: 0.05263157894736842

path: .spaces[0].metrics.halstead.bugs
old: 4.814764147181034
new: 0.5879999999999997

path: .spaces[0].metrics.halstead.N1
old: 1299.0
new: 231.0

path: .spaces[0].metrics.halstead.N2
old: 860.0
new: 161.0

path: .spaces[0].metrics.halstead.volume
old: 15627.715832202844
new: 2352.0

path: .spaces[0].metrics.halstead.time
old: 96443.2648348444
new: 4116.0

path: .spaces[0].metrics.halstead.purity_ratio
old: 0.45502869712599137
new: 0.8396492347055721

path: .spaces[0].metrics.halstead.level
old: 0.009002250562640661
new: 0.031746031746031744

path: .spaces[0].metrics.halstead.length
old: 2159.0
new: 392.0

path: .spaces[0].metrics.halstead.n2
old: 120.0
new: 46.0

path: .spaces[0].metrics.halstead.effort
old: 1735978.7670271993
new: 74088.0

path: .spaces[0].metrics.halstead.n1
old: 31.0
new: 18.0

path: .spaces[0].metrics.halstead.vocabulary
old: 151.0
new: 64.0

path: .spaces[0].metrics.halstead.difficulty
old: 111.08333333333331
new: 31.5

path: .spaces[0].metrics.halstead.estimated_program_length
old: 982.4069570950154
new: 329.14250000458424

Code

namespace mozilla {

/**
 * ReentrantMonitor
 * Java-like monitor.
 * When possible, use ReentrantMonitorAutoEnter to hold this monitor within a
 * scope, instead of calling Enter/Exit directly.
 **/
class ReentrantMonitor : BlockingResourceBase {
 public:
  /**
   * ReentrantMonitor
   * @param aName A name which can reference this monitor
   */
  explicit ReentrantMonitor(const char* aName)
      : BlockingResourceBase(aName, eReentrantMonitor)
#ifdef DEBUG
        ,
        mEntryCount(0)
#endif
  {
    MOZ_COUNT_CTOR(ReentrantMonitor);
    mReentrantMonitor = PR_NewMonitor();
    if (!mReentrantMonitor) {
      MOZ_CRASH("Can't allocate mozilla::ReentrantMonitor");
    }
  }

  /**
   * ~ReentrantMonitor
   **/
  ~ReentrantMonitor() {
    NS_ASSERTION(mReentrantMonitor,
                 "improperly constructed ReentrantMonitor or double free");
    PR_DestroyMonitor(mReentrantMonitor);
    mReentrantMonitor = 0;
    MOZ_COUNT_DTOR(ReentrantMonitor);
  }

#ifndef DEBUG
  /**
   * Enter
   * @see prmon.h
   **/
  void Enter() { PR_EnterMonitor(mReentrantMonitor); }

  /**
   * Exit
   * @see prmon.h
   **/
  void Exit() { PR_ExitMonitor(mReentrantMonitor); }

  /**
   * Wait
   * @see prmon.h
   **/
  nsresult Wait(PRIntervalTime aInterval = PR_INTERVAL_NO_TIMEOUT) {
#  ifdef MOZILLA_INTERNAL_API
    AUTO_PROFILER_THREAD_SLEEP;
#  endif  // MOZILLA_INTERNAL_API
    return PR_Wait(mReentrantMonitor, aInterval) == PR_SUCCESS
               ? NS_OK
               : NS_ERROR_FAILURE;
  }

#else  // ifndef DEBUG
  void Enter();
  void Exit();
  nsresult Wait(PRIntervalTime aInterval = PR_INTERVAL_NO_TIMEOUT);

#endif  // ifndef DEBUG

  /**
   * Notify
   * @see prmon.h
   **/
  nsresult Notify() {
    return PR_Notify(mReentrantMonitor) == PR_SUCCESS ? NS_OK
                                                      : NS_ERROR_FAILURE;
  }

  /**
   * NotifyAll
   * @see prmon.h
   **/
  nsresult NotifyAll() {
    return PR_NotifyAll(mReentrantMonitor) == PR_SUCCESS ? NS_OK
                                                         : NS_ERROR_FAILURE;
  }

#ifdef DEBUG
  /**
   * AssertCurrentThreadIn
   * @see prmon.h
   **/
  void AssertCurrentThreadIn() {
    PR_ASSERT_CURRENT_THREAD_IN_MONITOR(mReentrantMonitor);
  }

  /**
   * AssertNotCurrentThreadIn
   * @see prmon.h
   **/
  void AssertNotCurrentThreadIn() {
    // FIXME bug 476536
  }

#else
  void AssertCurrentThreadIn() {}
  void AssertNotCurrentThreadIn() {}

#endif  // ifdef DEBUG

 private:
  ReentrantMonitor();
  ReentrantMonitor(const ReentrantMonitor&);
  ReentrantMonitor& operator=(const ReentrantMonitor&);

  PRMonitor* mReentrantMonitor;
#ifdef DEBUG
  int32_t mEntryCount;
#endif
};

/**
 * ReentrantMonitorAutoEnter
 * Enters the ReentrantMonitor when it enters scope, and exits it when
 * it leaves scope.
 *
 * MUCH PREFERRED to bare calls to ReentrantMonitor.Enter and Exit.
 */
class MOZ_STACK_CLASS ReentrantMonitorAutoEnter {
 public:
  /**
   * Constructor
   * The constructor aquires the given lock.  The destructor
   * releases the lock.
   *
   * @param aReentrantMonitor A valid mozilla::ReentrantMonitor*.
   **/
  explicit ReentrantMonitorAutoEnter(
      mozilla::ReentrantMonitor& aReentrantMonitor)
      : mReentrantMonitor(&aReentrantMonitor) {
    NS_ASSERTION(mReentrantMonitor, "null monitor");
    mReentrantMonitor->Enter();
  }

  ~ReentrantMonitorAutoEnter(void) { mReentrantMonitor->Exit(); }

  nsresult Wait(PRIntervalTime aInterval = PR_INTERVAL_NO_TIMEOUT) {
    return mReentrantMonitor->Wait(aInterval);
  }

  nsresult Notify() { return mReentrantMonitor->Notify(); }
  nsresult NotifyAll() { return mReentrantMonitor->NotifyAll(); }

 private:
  ReentrantMonitorAutoEnter();
  ReentrantMonitorAutoEnter(const ReentrantMonitorAutoEnter&);
  ReentrantMonitorAutoEnter& operator=(const ReentrantMonitorAutoEnter&);
  static void* operator new(size_t) noexcept(true);

  friend class ReentrantMonitorAutoExit;

  mozilla::ReentrantMonitor* mReentrantMonitor;
};

/**
 * ReentrantMonitorAutoExit
 * Exit the ReentrantMonitor when it enters scope, and enters it when it leaves
 * scope.
 *
 * MUCH PREFERRED to bare calls to ReentrantMonitor.Exit and Enter.
 */
class MOZ_STACK_CLASS ReentrantMonitorAutoExit {
 public:
  /**
   * Constructor
   * The constructor releases the given lock.  The destructor
   * acquires the lock. The lock must be held before constructing
   * this object!
   *
   * @param aReentrantMonitor A valid mozilla::ReentrantMonitor*. It
   *                 must be already locked.
   **/
  explicit ReentrantMonitorAutoExit(ReentrantMonitor& aReentrantMonitor)
      : mReentrantMonitor(&aReentrantMonitor) {
    NS_ASSERTION(mReentrantMonitor, "null monitor");
    mReentrantMonitor->AssertCurrentThreadIn();
    mReentrantMonitor->Exit();
  }

  explicit ReentrantMonitorAutoExit(
      ReentrantMonitorAutoEnter& aReentrantMonitorAutoEnter)
      : mReentrantMonitor(aReentrantMonitorAutoEnter.mReentrantMonitor) {
    NS_ASSERTION(mReentrantMonitor, "null monitor");
    mReentrantMonitor->AssertCurrentThreadIn();
    mReentrantMonitor->Exit();
  }

  ~ReentrantMonitorAutoExit(void) { mReentrantMonitor->Enter(); }

 private:
  ReentrantMonitorAutoExit();
  ReentrantMonitorAutoExit(const ReentrantMonitorAutoExit&);
  ReentrantMonitorAutoExit& operator=(const ReentrantMonitorAutoExit&);
  static void* operator new(size_t) noexcept(true);

  ReentrantMonitor* mReentrantMonitor;
};

}  // namespace mozilla

Minimal test - lines (37, 151)

path: .spaces[0].spaces[0].metrics.nexits.sum
old: 1.0
new: 3.0

path: .spaces[0].spaces[0].metrics.nexits.average
old: 1.0
new: 0.2727272727272727

path: .spaces[0].spaces[0].metrics.cyclomatic.average
old: 2.0
new: 1.3333333333333333

path: .spaces[0].spaces[0].metrics.cyclomatic.sum
old: 2.0
new: 16.0

path: .spaces[0].spaces[0].metrics.nargs.average
old: 0.0
new: 0.18181818181818185

path: .spaces[0].spaces[0].metrics.nargs.sum
old: 0.0
new: 2.0

path: .spaces[0].spaces[0].metrics.loc.lloc
old: 1.0
new: 15.0

path: .spaces[0].spaces[0].metrics.loc.ploc
old: 4.0
new: 65.0

path: .spaces[0].spaces[0].metrics.loc.blank
old: 0.0
new: 10.0

path: .spaces[0].spaces[0].metrics.loc.cloc
old: 0.0
new: 40.0

path: .spaces[0].spaces[0].metrics.loc.sloc
old: 4.0
new: 115.0

path: .spaces[0].spaces[0].metrics.nom.functions
old: 1.0
new: 11.0

path: .spaces[0].spaces[0].metrics.nom.total
old: 1.0
new: 11.0

path: .spaces[0].spaces[0].metrics.cognitive.sum
old: 0.0
new: 1.0

path: .spaces[0].spaces[0].metrics.cognitive.average
old: 0.0
new: 0.09090909090909093

path: .spaces[0].spaces[0].metrics.halstead.bugs
old: 0.061340391791938176
new: 0.22845051344720704

path: .spaces[0].spaces[0].metrics.halstead.length
old: 42.0
new: 193.0

path: .spaces[0].spaces[0].metrics.halstead.effort
old: 2496.3283013448213
new: 17941.968497129645

path: .spaces[0].spaces[0].metrics.halstead.time
old: 138.68490563026785
new: 996.7760276183136

path: .spaces[0].spaces[0].metrics.halstead.vocabulary
old: 28.0
new: 54.0

path: .spaces[0].spaces[0].metrics.halstead.purity_ratio
old: 2.560490859673001
new: 1.371678992071272

path: .spaces[0].spaces[0].metrics.halstead.n2
old: 11.0
new: 39.0

path: .spaces[0].spaces[0].metrics.halstead.n1
old: 17.0
new: 15.0

path: .spaces[0].spaces[0].metrics.halstead.volume
old: 201.90890672641936
new: 1110.6932879175497

path: .spaces[0].spaces[0].metrics.halstead.N1
old: 26.0
new: 109.0

path: .spaces[0].spaces[0].metrics.halstead.difficulty
old: 12.363636363636363
new: 16.153846153846153

path: .spaces[0].spaces[0].metrics.halstead.N2
old: 16.0
new: 84.0

path: .spaces[0].spaces[0].metrics.halstead.estimated_program_length
old: 107.54061610626604
new: 264.7340454697555

path: .spaces[0].spaces[0].metrics.halstead.level
old: 0.08088235294117647
new: 0.06190476190476191

path: .spaces[0].spaces[0].metrics.mi.mi_original
old: 120.4813848276313
new: 53.98585316868311

path: .spaces[0].spaces[0].metrics.mi.mi_visual_studio
old: 70.45695019159726
new: 31.57067436765094

path: .spaces[0].spaces[0].metrics.mi.mi_sei
old: 98.32068413705466
new: 43.40076014594811

Code

class ReentrantMonitor : BlockingResourceBase {
 public:
  /**
   * ReentrantMonitor
   * @param aName A name which can reference this monitor
   */
  explicit ReentrantMonitor(const char* aName)
      : BlockingResourceBase(aName, eReentrantMonitor)
#ifdef DEBUG
        ,
        mEntryCount(0)
#endif
  {
    MOZ_COUNT_CTOR(ReentrantMonitor);
    mReentrantMonitor = PR_NewMonitor();
    if (!mReentrantMonitor) {
      MOZ_CRASH("Can't allocate mozilla::ReentrantMonitor");
    }
  }

  /**
   * ~ReentrantMonitor
   **/
  ~ReentrantMonitor() {
    NS_ASSERTION(mReentrantMonitor,
                 "improperly constructed ReentrantMonitor or double free");
    PR_DestroyMonitor(mReentrantMonitor);
    mReentrantMonitor = 0;
    MOZ_COUNT_DTOR(ReentrantMonitor);
  }

#ifndef DEBUG
  /**
   * Enter
   * @see prmon.h
   **/
  void Enter() { PR_EnterMonitor(mReentrantMonitor); }

  /**
   * Exit
   * @see prmon.h
   **/
  void Exit() { PR_ExitMonitor(mReentrantMonitor); }

  /**
   * Wait
   * @see prmon.h
   **/
  nsresult Wait(PRIntervalTime aInterval = PR_INTERVAL_NO_TIMEOUT) {
#  ifdef MOZILLA_INTERNAL_API
    AUTO_PROFILER_THREAD_SLEEP;
#  endif  // MOZILLA_INTERNAL_API
    return PR_Wait(mReentrantMonitor, aInterval) == PR_SUCCESS
               ? NS_OK
               : NS_ERROR_FAILURE;
  }

#else  // ifndef DEBUG
  void Enter();
  void Exit();
  nsresult Wait(PRIntervalTime aInterval = PR_INTERVAL_NO_TIMEOUT);

#endif  // ifndef DEBUG

  /**
   * Notify
   * @see prmon.h
   **/
  nsresult Notify() {
    return PR_Notify(mReentrantMonitor) == PR_SUCCESS ? NS_OK
                                                      : NS_ERROR_FAILURE;
  }

  /**
   * NotifyAll
   * @see prmon.h
   **/
  nsresult NotifyAll() {
    return PR_NotifyAll(mReentrantMonitor) == PR_SUCCESS ? NS_OK
                                                         : NS_ERROR_FAILURE;
  }

#ifdef DEBUG
  /**
   * AssertCurrentThreadIn
   * @see prmon.h
   **/
  void AssertCurrentThreadIn() {
    PR_ASSERT_CURRENT_THREAD_IN_MONITOR(mReentrantMonitor);
  }

  /**
   * AssertNotCurrentThreadIn
   * @see prmon.h
   **/
  void AssertNotCurrentThreadIn() {
    // FIXME bug 476536
  }

#else
  void AssertCurrentThreadIn() {}
  void AssertNotCurrentThreadIn() {}

#endif  // ifdef DEBUG

 private:
  ReentrantMonitor();
  ReentrantMonitor(const ReentrantMonitor&);
  ReentrantMonitor& operator=(const ReentrantMonitor&);

  PRMonitor* mReentrantMonitor;
#ifdef DEBUG
  int32_t mEntryCount;
#endif
};

Minimal test - lines (203, 238)

path: .spaces[0].spaces[2].metrics.cyclomatic.sum
old: 5.0
new: 4.0

path: .spaces[0].spaces[2].metrics.cyclomatic.average
old: 5.0
new: 1.0

path: .spaces[0].spaces[2].metrics.nexits.sum
old: 1.0
new: 0.0

path: .spaces[0].spaces[2].metrics.nexits.average
old: 1.0
new: 0.0

path: .spaces[0].spaces[2].metrics.halstead.N1
old: 81.0
new: 57.0

path: .spaces[0].spaces[2].metrics.halstead.effort
old: 16207.5518752584
new: 7210.934721451216

path: .spaces[0].spaces[2].metrics.halstead.vocabulary
old: 40.0
new: 23.0

path: .spaces[0].spaces[2].metrics.halstead.purity_ratio
old: 1.3102218835892585
new: 0.8624818916347249

path: .spaces[0].spaces[2].metrics.halstead.length
old: 132.0
new: 94.0

path: .spaces[0].spaces[2].metrics.halstead.estimated_program_length
old: 172.9492886337821
new: 81.07329781366414

path: .spaces[0].spaces[2].metrics.halstead.level
old: 0.04334365325077399
new: 0.05896805896805897

path: .spaces[0].spaces[2].metrics.halstead.n2
old: 21.0
new: 12.0

path: .spaces[0].spaces[2].metrics.halstead.time
old: 900.4195486254667
new: 400.60748452506755

path: .spaces[0].spaces[2].metrics.halstead.volume
old: 702.4945085251319
new: 425.2148238693592

path: .spaces[0].spaces[2].metrics.halstead.n1
old: 19.0
new: 11.0

path: .spaces[0].spaces[2].metrics.halstead.difficulty
old: 23.071428571428573
new: 16.958333333333332

path: .spaces[0].spaces[2].metrics.halstead.N2
old: 51.0
new: 37.0

path: .spaces[0].spaces[2].metrics.halstead.bugs
old: 0.2134799171040084
new: 0.1244151081181466

path: .spaces[0].spaces[2].metrics.mi.mi_sei
old: 69.64394896711335
new: 75.89195846894884

path: .spaces[0].spaces[2].metrics.mi.mi_visual_studio
old: 48.52907640150256
new: 47.10731096459038

path: .spaces[0].spaces[2].metrics.mi.mi_original
old: 82.98472064656937
new: 80.55350174944955

path: .spaces[0].spaces[2].metrics.nom.total
old: 1.0
new: 3.0

path: .spaces[0].spaces[2].metrics.nom.functions
old: 1.0
new: 3.0

path: .spaces[0].spaces[2].metrics.nargs.average
old: 0.0
new: 1.0

path: .spaces[0].spaces[2].metrics.nargs.sum
old: 0.0
new: 3.0

path: .spaces[0].spaces[2].metrics.cognitive.sum
old: 3.0
new: 0.0

path: .spaces[0].spaces[2].metrics.cognitive.average
old: 3.0
new: 0.0

path: .spaces[0].spaces[2].metrics.loc.blank
old: 3.0
new: 4.0

path: .spaces[0].spaces[2].metrics.loc.ploc
old: 20.0
new: 23.0

path: .spaces[0].spaces[2].metrics.loc.cloc
old: 3.0
new: 9.0

path: .spaces[0].spaces[2].metrics.loc.sloc
old: 26.0
new: 36.0

Code

class MOZ_STACK_CLASS ReentrantMonitorAutoExit {
 public:
  /**
   * Constructor
   * The constructor releases the given lock.  The destructor
   * acquires the lock. The lock must be held before constructing
   * this object!
   *
   * @param aReentrantMonitor A valid mozilla::ReentrantMonitor*. It
   *                 must be already locked.
   **/
  explicit ReentrantMonitorAutoExit(ReentrantMonitor& aReentrantMonitor)
      : mReentrantMonitor(&aReentrantMonitor) {
    NS_ASSERTION(mReentrantMonitor, "null monitor");
    mReentrantMonitor->AssertCurrentThreadIn();
    mReentrantMonitor->Exit();
  }

  explicit ReentrantMonitorAutoExit(
      ReentrantMonitorAutoEnter& aReentrantMonitorAutoEnter)
      : mReentrantMonitor(aReentrantMonitorAutoEnter.mReentrantMonitor) {
    NS_ASSERTION(mReentrantMonitor, "null monitor");
    mReentrantMonitor->AssertCurrentThreadIn();
    mReentrantMonitor->Exit();
  }

  ~ReentrantMonitorAutoExit(void) { mReentrantMonitor->Enter(); }

 private:
  ReentrantMonitorAutoExit();
  ReentrantMonitorAutoExit(const ReentrantMonitorAutoExit&);
  ReentrantMonitorAutoExit& operator=(const ReentrantMonitorAutoExit&);
  static void* operator new(size_t) noexcept(true);

  ReentrantMonitor* mReentrantMonitor;
};

Minimal test - lines (160, 194)

path: .spaces[0].spaces[1].metrics.cyclomatic.sum
old: 2.0
new: 6.0

path: .spaces[0].spaces[1].metrics.cyclomatic.average
old: 2.0
new: 1.0

path: .spaces[0].spaces[1].metrics.nom.functions
old: 1.0
new: 5.0

path: .spaces[0].spaces[1].metrics.nom.total
old: 1.0
new: 5.0

path: .spaces[0].spaces[1].metrics.nexits.average
old: 1.0
new: 0.6

path: .spaces[0].spaces[1].metrics.nexits.sum
old: 1.0
new: 3.0

path: .spaces[0].spaces[1].metrics.loc.cloc
old: 0.0
new: 7.0

path: .spaces[0].spaces[1].metrics.loc.ploc
old: 4.0
new: 22.0

path: .spaces[0].spaces[1].metrics.loc.sloc
old: 4.0
new: 35.0

path: .spaces[0].spaces[1].metrics.loc.blank
old: 0.0
new: 6.0

path: .spaces[0].spaces[1].metrics.loc.lloc
old: 1.0
new: 6.0

path: .spaces[0].spaces[1].metrics.halstead.N2
old: 16.0
new: 39.0

path: .spaces[0].spaces[1].metrics.halstead.purity_ratio
old: 2.560490859673001
new: 1.1759258463708997

path: .spaces[0].spaces[1].metrics.halstead.level
old: 0.08088235294117647
new: 0.0670611439842209

path: .spaces[0].spaces[1].metrics.halstead.difficulty
old: 12.363636363636363
new: 14.911764705882351

path: .spaces[0].spaces[1].metrics.halstead.effort
old: 2496.3283013448213
new: 7317.039799922115

path: .spaces[0].spaces[1].metrics.halstead.bugs
old: 0.061340391791938176
new: 0.12563260263831297

path: .spaces[0].spaces[1].metrics.halstead.estimated_program_length
old: 107.54061610626604
new: 117.59258463708996

path: .spaces[0].spaces[1].metrics.halstead.n1
old: 17.0
new: 13.0

path: .spaces[0].spaces[1].metrics.halstead.volume
old: 201.90890672641936
new: 490.6890595608519

path: .spaces[0].spaces[1].metrics.halstead.length
old: 42.0
new: 100.0

path: .spaces[0].spaces[1].metrics.halstead.n2
old: 11.0
new: 17.0

path: .spaces[0].spaces[1].metrics.halstead.time
old: 138.68490563026785
new: 406.50221110678416

path: .spaces[0].spaces[1].metrics.halstead.vocabulary
old: 28.0
new: 30.0

path: .spaces[0].spaces[1].metrics.halstead.N1
old: 26.0
new: 61.0

path: .spaces[0].spaces[1].metrics.mi.mi_sei
old: 98.32068413705466
new: 71.9800461237941

path: .spaces[0].spaces[1].metrics.mi.mi_original
old: 120.4813848276313
new: 79.80514603806076

path: .spaces[0].spaces[1].metrics.mi.mi_visual_studio
old: 70.45695019159726
new: 46.66967604564957

path: .spaces[0].spaces[1].metrics.nargs.sum
old: 0.0
new: 3.0

path: .spaces[0].spaces[1].metrics.nargs.average
old: 0.0
new: 0.6

Code

class MOZ_STACK_CLASS ReentrantMonitorAutoEnter {
 public:
  /**
   * Constructor
   * The constructor aquires the given lock.  The destructor
   * releases the lock.
   *
   * @param aReentrantMonitor A valid mozilla::ReentrantMonitor*.
   **/
  explicit ReentrantMonitorAutoEnter(
      mozilla::ReentrantMonitor& aReentrantMonitor)
      : mReentrantMonitor(&aReentrantMonitor) {
    NS_ASSERTION(mReentrantMonitor, "null monitor");
    mReentrantMonitor->Enter();
  }

  ~ReentrantMonitorAutoEnter(void) { mReentrantMonitor->Exit(); }

  nsresult Wait(PRIntervalTime aInterval = PR_INTERVAL_NO_TIMEOUT) {
    return mReentrantMonitor->Wait(aInterval);
  }

  nsresult Notify() { return mReentrantMonitor->Notify(); }
  nsresult NotifyAll() { return mReentrantMonitor->NotifyAll(); }

 private:
  ReentrantMonitorAutoEnter();
  ReentrantMonitorAutoEnter(const ReentrantMonitorAutoEnter&);
  ReentrantMonitorAutoEnter& operator=(const ReentrantMonitorAutoEnter&);
  static void* operator new(size_t) noexcept(true);

  friend class ReentrantMonitorAutoExit;

  mozilla::ReentrantMonitor* mReentrantMonitor;
};