Global Metrics

path: .metrics.nargs.sum
old: 24.0
new: 0.0

path: .metrics.nargs.average
old: 0.631578947368421
new: null

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

path: .metrics.cognitive.sum
old: 4.0
new: 0.0

path: .metrics.cyclomatic.sum
old: 53.0
new: 2.0

path: .metrics.cyclomatic.average
old: 1.2325581395348837
new: 1.0

path: .metrics.nexits.sum
old: 28.0
new: 0.0

path: .metrics.nexits.average
old: 0.7368421052631579
new: null

path: .metrics.halstead.n2
old: 31.0
new: 53.0

path: .metrics.halstead.difficulty
old: 138.48387096774192
new: 6.90566037735849

path: .metrics.halstead.length
old: 843.0
new: 140.0

path: .metrics.halstead.n1
old: 27.0
new: 12.0

path: .metrics.halstead.purity_ratio
old: 0.3344745530016688
new: 2.4757095292893103

path: .metrics.halstead.N1
old: 525.0
new: 79.0

path: .metrics.halstead.level
old: 0.007221057535522945
new: 0.1448087431693989

path: .metrics.halstead.vocabulary
old: 58.0
new: 65.0

path: .metrics.halstead.N2
old: 318.0
new: 61.0

path: .metrics.halstead.estimated_program_length
old: 281.9620481804068
new: 346.5993341005034

path: .metrics.halstead.time
old: 37992.88057954424
new: 323.46554165574213

path: .metrics.halstead.bugs
old: 2.5873900103337553
new: 0.10788119880240292

path: .metrics.halstead.volume
old: 4938.277978892543
new: 843.1314938239836

path: .metrics.halstead.effort
old: 683871.8504317963
new: 5822.379749803358

path: .metrics.mi.mi_original
old: 25.267640108985844
new: 55.92195162016368

path: .metrics.mi.mi_visual_studio
old: 14.776397724553124
new: 32.70289568430625

path: .metrics.mi.mi_sei
old: -2.3508619400511748
new: 50.17193130042487

path: .metrics.nom.functions
old: 38.0
new: 0.0

path: .metrics.nom.total
old: 38.0
new: 0.0

path: .metrics.loc.lloc
old: 44.0
new: 0.0

path: .metrics.loc.sloc
old: 248.0
new: 136.0

path: .metrics.loc.blank
old: 44.0
new: 13.0

path: .metrics.loc.cloc
old: 48.0
new: 71.0

path: .metrics.loc.ploc
old: 156.0
new: 52.0

Spaces Data

Minimal test - lines (22, 134)

path: .spaces[0].metrics.nom.total
old: 36.0
new: 0.0

path: .spaces[0].metrics.nom.functions
old: 36.0
new: 0.0

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

path: .spaces[0].metrics.cyclomatic.sum
old: 50.0
new: 1.0

path: .spaces[0].metrics.halstead.bugs
old: 2.5871388246717792
new: 0.10017744822848294

path: .spaces[0].metrics.halstead.level
old: 0.00655076845553036
new: 0.14379084967320263

path: .spaces[0].metrics.halstead.difficulty
old: 152.65384615384616
new: 6.954545454545454

path: .spaces[0].metrics.halstead.n1
old: 27.0
new: 12.0

path: .spaces[0].metrics.halstead.n2
old: 26.0
new: 44.0

path: .spaces[0].metrics.halstead.vocabulary
old: 53.0
new: 56.0

path: .spaces[0].metrics.halstead.estimated_program_length
old: 250.593395230082
new: 283.2345412286949

path: .spaces[0].metrics.halstead.effort
old: 683772.2667005449
new: 5209.989277120496

path: .spaces[0].metrics.halstead.volume
old: 4479.233795468422
new: 749.1487849454309

path: .spaces[0].metrics.halstead.N1
old: 488.0
new: 78.0

path: .spaces[0].metrics.halstead.length
old: 782.0
new: 129.0

path: .spaces[0].metrics.halstead.purity_ratio
old: 0.3204519120589284
new: 2.1956165986720535

path: .spaces[0].metrics.halstead.time
old: 37987.34815003027
new: 289.44384872891646

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

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

path: .spaces[0].metrics.nargs.average
old: 0.5555555555555556
new: null

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

path: .spaces[0].metrics.nexits.average
old: 0.7222222222222222
new: null

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

path: .spaces[0].metrics.cognitive.average
old: 0.1111111111111111
new: null

path: .spaces[0].metrics.loc.ploc
old: 140.0
new: 41.0

path: .spaces[0].metrics.loc.lloc
old: 42.0
new: 0.0

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

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

path: .spaces[0].metrics.loc.sloc
old: 218.0
new: 113.0

path: .spaces[0].metrics.mi.mi_sei
old: 1.382327383470102
new: 56.21524853504389

path: .spaces[0].metrics.mi.mi_original
old: 28.55370211129538
new: 59.76784177226013

path: .spaces[0].metrics.mi.mi_visual_studio
old: 16.698071410114256
new: 34.9519542527837

Code

class nsBaseAppShell : public nsIAppShell,
                       public nsIThreadObserver,
                       public nsIObserver {
 public:
  NS_DECL_THREADSAFE_ISUPPORTS
  NS_DECL_NSIAPPSHELL

  NS_DECL_NSITHREADOBSERVER
  NS_DECL_NSIOBSERVER

  nsBaseAppShell();

 protected:
  virtual ~nsBaseAppShell();

  /**
   * This method is called by subclasses when the app shell singleton is
   * instantiated.
   */
  nsresult Init();

  /**
   * Called by subclasses from a native event. See ScheduleNativeEventCallback.
   */
  void NativeEventCallback();

  /**
   * Make a decision as to whether or not NativeEventCallback will
   * trigger gecko event processing when there are pending gecko
   * events.
   */
  virtual void DoProcessMoreGeckoEvents();

  /**
   * Implemented by subclasses.  Invoke NativeEventCallback from a native
   * event.  This method may be called on any thread.
   */
  virtual void ScheduleNativeEventCallback() = 0;

  /**
   * Implemented by subclasses.  Process the next native event.  Only wait for
   * the next native event if mayWait is true.  This method is only called on
   * the main application thread.
   *
   * @param mayWait
   *   If "true", then this method may wait if necessary for the next available
   *   native event.  DispatchNativeEvent may be called to unblock a call to
   *   ProcessNextNativeEvent that is waiting.
   * @return
   *   This method returns "true" if a native event was processed.
   */
  virtual bool ProcessNextNativeEvent(bool mayWait) = 0;

  int32_t mSuspendNativeCount;
  uint32_t mEventloopNestingLevel;

 private:
  bool DoProcessNextNativeEvent(bool mayWait);

  bool DispatchDummyEvent(nsIThread* target);

  void IncrementEventloopNestingLevel();
  void DecrementEventloopNestingLevel();

  nsCOMPtr mDummyEvent;
  /**
   * mBlockedWait points back to a slot that controls the wait loop in
   * an outer OnProcessNextEvent invocation.  Nested calls always set
   * it to false to unblock an outer loop, since all events may
   * have been consumed by the inner event loop(s).
   */
  bool* mBlockedWait;
  int32_t mFavorPerf;
  mozilla::Atomic mNativeEventPending;
  PRIntervalTime mStarvationDelay;
  PRIntervalTime mSwitchTime;
  PRIntervalTime mLastNativeEventTime;
  enum EventloopNestingState {
    eEventloopNone,   // top level thread execution
    eEventloopXPCOM,  // innermost native event loop is ProcessNextNativeEvent
    eEventloopOther   // innermost native event loop is a native library/plugin
                      // etc
  };
  EventloopNestingState mEventloopNestingState;
  bool mRunning;
  bool mExiting;
  /**
   * mBlockNativeEvent blocks the appshell from processing native events.
   * It is set to true while a nested native event loop (eEventloopOther)
   * is processing gecko events in NativeEventCallback(), thus queuing up
   * native events until we return to that loop (bug 420148).
   * We force mBlockNativeEvent to false in case handling one of the gecko
   * events spins up a nested XPCOM event loop (eg. modal window) which would
   * otherwise lead to a "deadlock" where native events aren't processed at all.
   */
  bool mBlockNativeEvent;
  /**
   * Tracks whether we have processed any gecko events in NativeEventCallback so
   * that we can avoid erroneously entering a blocking loop waiting for gecko
   * events to show up during OnProcessNextEvent.  This is required because on
   * OS X ProcessGeckoEvents may be invoked inside the context of
   * ProcessNextNativeEvent and may result in NativeEventCallback being invoked
   * and in turn invoking NS_ProcessPendingEvents.  Because
   * ProcessNextNativeEvent may be invoked prior to the NS_HasPendingEvents
   * waiting loop, this is the only way to make the loop aware that events may
   * have been processed.
   *
   * This variable is set to false in OnProcessNextEvent prior to the first
   * call to DoProcessNextNativeEvent.  It is set to true by
   * NativeEventCallback after calling NS_ProcessPendingEvents.
   */
  bool mProcessedGeckoEvents;
};