Global Metrics

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

path: .metrics.cognitive.average
old: 3.1578947368421053
new: 0.0

path: .metrics.nargs.average
old: 1.0
new: 0.14285714285714285

path: .metrics.nargs.sum
old: 38.0
new: 1.0

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

path: .metrics.cyclomatic.sum
old: 169.0
new: 14.0

path: .metrics.mi.mi_original
old: -28.349308259643426
new: 50.046447030757605

path: .metrics.mi.mi_visual_studio
old: 0.0
new: 29.266928088162345

path: .metrics.mi.mi_sei
old: -70.13760114468748
new: 39.79639446083858

path: .metrics.halstead.n1
old: 28.0
new: 16.0

path: .metrics.halstead.purity_ratio
old: 0.73447436514
new: 1.7277201379627245

path: .metrics.halstead.level
old: 0.016979591836734694
new: 0.07224770642201835

path: .metrics.halstead.estimated_program_length
old: 1736.2973991909598
new: 440.5686351804948

path: .metrics.halstead.n2
old: 208.0
new: 63.0

path: .metrics.halstead.time
old: 60970.475445104035
new: 1236.074680039383

path: .metrics.halstead.vocabulary
old: 236.0
new: 79.0

path: .metrics.halstead.effort
old: 1097468.5580118727
new: 22249.3442407089

path: .metrics.halstead.volume
old: 18634.568168691392
new: 1607.4640907851613

path: .metrics.halstead.bugs
old: 3.5465558479303168
new: 0.2636879125839582

path: .metrics.halstead.N2
old: 875.0
new: 109.0

path: .metrics.halstead.length
old: 2364.0
new: 255.0

path: .metrics.halstead.N1
old: 1489.0
new: 146.0

path: .metrics.halstead.difficulty
old: 58.89423076923077
new: 13.841269841269842

path: .metrics.nexits.average
old: 2.526315789473684
new: 0.5714285714285714

path: .metrics.nexits.sum
old: 96.0
new: 4.0

path: .metrics.loc.blank
old: 121.0
new: 26.0

path: .metrics.loc.cloc
old: 139.0
new: 55.0

path: .metrics.loc.ploc
old: 594.0
new: 53.0

path: .metrics.loc.lloc
old: 300.0
new: 5.0

path: .metrics.loc.sloc
old: 854.0
new: 134.0

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

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

Spaces Data

Minimal test - lines (18, 18)

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

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

path: .spaces[2].metrics.nexits.average
old: 2.0
new: null

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

path: .spaces[2].metrics.loc.lloc
old: 5.0
new: 0.0

path: .spaces[2].metrics.loc.ploc
old: 10.0
new: 1.0

path: .spaces[2].metrics.loc.cloc
old: 2.0
new: 0.0

path: .spaces[2].metrics.loc.sloc
old: 15.0
new: 1.0

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

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

path: .spaces[2].metrics.mi.mi_original
old: 100.5584011597944
new: null

path: .spaces[2].metrics.mi.mi_visual_studio
old: 58.80608254958737
new: null

path: .spaces[2].metrics.mi.mi_sei
old: 96.37762401441884
new: null

path: .spaces[2].metrics.halstead.bugs
old: 0.03129573791184525
new: 0.0

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

path: .spaces[2].metrics.halstead.N1
old: 22.0
new: 0.0

path: .spaces[2].metrics.halstead.n2
old: 11.0
new: 1.0

path: .spaces[2].metrics.halstead.level
old: 0.16666666666666666
new: null

path: .spaces[2].metrics.halstead.time
old: 50.5402250112227
new: 0.0

path: .spaces[2].metrics.halstead.length
old: 34.0
new: 1.0

path: .spaces[2].metrics.halstead.volume
old: 151.6206750336681
new: 0.0

path: .spaces[2].metrics.halstead.N2
old: 12.0
new: 1.0

path: .spaces[2].metrics.halstead.difficulty
old: 6.0
new: 0.0

path: .spaces[2].metrics.halstead.effort
old: 909.7240502020086
new: 0.0

path: .spaces[2].metrics.halstead.purity_ratio
old: 2.238455753235898
new: null

path: .spaces[2].metrics.halstead.estimated_program_length
old: 76.10749561002054
new: null

path: .spaces[2].metrics.halstead.vocabulary
old: 22.0
new: 1.0

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

path: .spaces[2].metrics.cyclomatic.sum
old: 2.0
new: 1.0

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

path: .spaces[2].metrics.cognitive.average
old: 1.0
new: null

Code

class nsIThread;

Minimal test - lines (17, 17)

path: .spaces[1].metrics.mi.mi_visual_studio
old: 55.97967198826951
new: null

path: .spaces[1].metrics.mi.mi_sei
old: 81.15655305879856
new: null

path: .spaces[1].metrics.mi.mi_original
old: 95.72523909994086
new: null

path: .spaces[1].metrics.nargs.average
old: 1.0
new: null

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

path: .spaces[1].metrics.cyclomatic.sum
old: 4.0
new: 1.0

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

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

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

path: .spaces[1].metrics.loc.ploc
old: 13.0
new: 1.0

path: .spaces[1].metrics.loc.sloc
old: 17.0
new: 1.0

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

path: .spaces[1].metrics.halstead.n1
old: 16.0
new: 0.0

path: .spaces[1].metrics.halstead.bugs
old: 0.061241202589591495
new: 0.0

path: .spaces[1].metrics.halstead.level
old: 0.09558823529411764
new: null

path: .spaces[1].metrics.halstead.difficulty
old: 10.461538461538462
new: 0.0

path: .spaces[1].metrics.halstead.length
old: 49.0
new: 1.0

path: .spaces[1].metrics.halstead.vocabulary
old: 29.0
new: 1.0

path: .spaces[1].metrics.halstead.n2
old: 13.0
new: 1.0

path: .spaces[1].metrics.halstead.N1
old: 32.0
new: 0.0

path: .spaces[1].metrics.halstead.estimated_program_length
old: 112.1057163358342
new: null

path: .spaces[1].metrics.halstead.purity_ratio
old: 2.2878717619558
new: null

path: .spaces[1].metrics.halstead.volume
old: 238.041068761251
new: 0.0

path: .spaces[1].metrics.halstead.N2
old: 17.0
new: 1.0

path: .spaces[1].metrics.halstead.time
old: 138.34865534841938
new: 0.0

path: .spaces[1].metrics.halstead.effort
old: 2490.275796271549
new: 0.0

path: .spaces[1].metrics.nexits.average
old: 2.0
new: null

path: .spaces[1].metrics.nexits.sum
old: 2.0
new: 0.0

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

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

path: .spaces[1].metrics.cognitive.average
old: 4.0
new: null

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

Code

class nsIRunnable;

Minimal test - lines (16, 16)

path: .spaces[0].metrics.halstead.volume
old: 34.86917501586544
new: 0.0

path: .spaces[0].metrics.halstead.time
old: 6.053676218032194
new: 0.0

path: .spaces[0].metrics.halstead.estimated_program_length
old: 19.60964047443681
new: null

path: .spaces[0].metrics.halstead.effort
old: 108.9661719245795
new: 0.0

path: .spaces[0].metrics.halstead.difficulty
old: 3.125
new: 0.0

path: .spaces[0].metrics.halstead.level
old: 0.32
new: null

path: .spaces[0].metrics.halstead.N2
old: 5.0
new: 1.0

path: .spaces[0].metrics.halstead.N1
old: 6.0
new: 0.0

path: .spaces[0].metrics.halstead.n2
old: 4.0
new: 1.0

path: .spaces[0].metrics.halstead.purity_ratio
old: 1.7826945885851644
new: null

path: .spaces[0].metrics.halstead.bugs
old: 0.007604544540941429
new: 0.0

path: .spaces[0].metrics.halstead.length
old: 11.0
new: 1.0

path: .spaces[0].metrics.halstead.n1
old: 5.0
new: 0.0

path: .spaces[0].metrics.halstead.vocabulary
old: 9.0
new: 1.0

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

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

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

path: .spaces[0].metrics.mi.mi_original
old: 152.30166335190526
new: null

path: .spaces[0].metrics.mi.mi_sei
old: 144.12582230432585
new: null

path: .spaces[0].metrics.mi.mi_visual_studio
old: 89.06530020579255
new: null

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

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

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

Code

class nsIEventTarget;

Minimal test - lines (20, 132)

path: .spaces[3].metrics.nom.total
old: 1.0
new: 7.0

path: .spaces[3].metrics.nom.functions
old: 1.0
new: 7.0

path: .spaces[3].metrics.nexits.average
old: 3.0
new: 0.5714285714285714

path: .spaces[3].metrics.nexits.sum
old: 3.0
new: 4.0

path: .spaces[3].metrics.cognitive.average
old: 5.0
new: 0.0

path: .spaces[3].metrics.cognitive.sum
old: 5.0
new: 0.0

path: .spaces[3].metrics.nargs.average
old: 1.0
new: 0.14285714285714285

path: .spaces[3].metrics.halstead.bugs
old: 0.075962752756843
new: 0.2397473955335632

path: .spaces[3].metrics.halstead.estimated_program_length
old: 122.60335893412778
new: 391.07808974151806

path: .spaces[3].metrics.halstead.n1
old: 16.0
new: 15.0

path: .spaces[3].metrics.halstead.level
old: 0.08928571428571429
new: 0.07676767676767676

path: .spaces[3].metrics.halstead.vocabulary
old: 31.0
new: 72.0

path: .spaces[3].metrics.halstead.N2
old: 21.0
new: 99.0

path: .spaces[3].metrics.halstead.n2
old: 15.0
new: 57.0

path: .spaces[3].metrics.halstead.purity_ratio
old: 1.977473531195609
new: 1.6294920405896585

path: .spaces[3].metrics.halstead.N1
old: 41.0
new: 141.0

path: .spaces[3].metrics.halstead.difficulty
old: 11.2
new: 13.026315789473683

path: .spaces[3].metrics.halstead.effort
old: 3440.193917932646
new: 19289.133951877546

path: .spaces[3].metrics.halstead.volume
old: 307.16017124398627
new: 1480.782000346155

path: .spaces[3].metrics.halstead.length
old: 62.0
new: 240.0

path: .spaces[3].metrics.halstead.time
old: 191.12188432959144
new: 1071.618552882086

path: .spaces[3].metrics.loc.cloc
old: 2.0
new: 49.0

path: .spaces[3].metrics.loc.blank
old: 3.0
new: 22.0

path: .spaces[3].metrics.loc.ploc
old: 17.0
new: 42.0

path: .spaces[3].metrics.loc.lloc
old: 8.0
new: 5.0

path: .spaces[3].metrics.loc.sloc
old: 22.0
new: 113.0

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

path: .spaces[3].metrics.cyclomatic.sum
old: 5.0
new: 10.0

path: .spaces[3].metrics.mi.mi_visual_studio
old: 52.62736355400771
new: 31.669370869331313

path: .spaces[3].metrics.mi.mi_original
old: 89.99279167735318
new: 54.154624186556546

path: .spaces[3].metrics.mi.mi_sei
old: 77.15531512072465
new: 46.05530512268063

Code

namespace mozilla {

class TaskDispatcher;

/*
 * We often want to run tasks on a target that guarantees that events will never
 * run in parallel. There are various target types that achieve this - namely
 * nsIThread and TaskQueue. Note that nsIThreadPool (which implements
 * nsIEventTarget) does not have this property, so we do not want to use
 * nsIEventTarget for this purpose. This class encapsulates the specifics of
 * the structures we might use here and provides a consistent interface.
 *
 * At present, the supported AbstractThread implementations are TaskQueue,
 * AbstractThread::MainThread() and XPCOMThreadWrapper which can wrap any
 * nsThread.
 *
 * The primary use of XPCOMThreadWrapper is to allow any threads to provide
 * Direct Task dispatching which is similar (but not identical to) the microtask
 * semantics of JS promises. Instantiating a XPCOMThreadWrapper on the current
 * nsThread is sufficient to enable direct task dispatching.
 *
 * You shouldn't use pointers when comparing AbstractThread or nsIThread to
 * determine if you are currently on the thread, but instead use the
 * nsISerialEventTarget::IsOnCurrentThread() method.
 */
class AbstractThread : public nsISerialEventTarget {
 public:
  // Returns the AbstractThread that the caller is currently running in, or null
  // if the caller is not running in an AbstractThread.
  static AbstractThread* GetCurrent() { return sCurrentThreadTLS.get(); }

  AbstractThread(bool aSupportsTailDispatch)
      : mSupportsTailDispatch(aSupportsTailDispatch) {}

  // Returns an AbstractThread wrapper of a nsIThread.
  static already_AddRefed CreateXPCOMThreadWrapper(
      nsIThread* aThread, bool aRequireTailDispatch, bool aOnThread = false);

  NS_DECL_THREADSAFE_ISUPPORTS

  // We don't use NS_DECL_NSIEVENTTARGET so that we can remove the default
  // |flags| parameter from Dispatch. Otherwise, a single-argument Dispatch call
  // would be ambiguous.
  NS_IMETHOD_(bool) IsOnCurrentThreadInfallible(void) override;
  NS_IMETHOD IsOnCurrentThread(bool* _retval) override;
  NS_IMETHOD Dispatch(already_AddRefed event,
                      uint32_t flags) override;
  NS_IMETHOD DispatchFromScript(nsIRunnable* event, uint32_t flags) override;
  NS_IMETHOD DelayedDispatch(already_AddRefed event,
                             uint32_t delay) override;

  enum DispatchReason { NormalDispatch, TailDispatch };
  virtual nsresult Dispatch(already_AddRefed aRunnable,
                            DispatchReason aReason = NormalDispatch) = 0;

  virtual bool IsCurrentThreadIn() const = 0;

  // Returns a TaskDispatcher that will dispatch its tasks when the currently-
  // running tasks pops off the stack.
  //
  // May only be called when running within the it is invoked up, and only on
  // threads which support it.
  virtual TaskDispatcher& TailDispatcher() = 0;

  // Returns true if we have tail tasks scheduled, or if this isn't known.
  // Returns false if we definitely don't have any tail tasks.
  virtual bool MightHaveTailTasks() { return true; }

  // Returns true if the tail dispatcher is available. In certain edge cases
  // like shutdown, it might not be.
  virtual bool IsTailDispatcherAvailable() { return true; }

  // Helper functions for methods on the tail TasklDispatcher. These check
  // HasTailTasks to avoid allocating a TailDispatcher if it isn't
  // needed.
  nsresult TailDispatchTasksFor(AbstractThread* aThread);
  bool HasTailTasksFor(AbstractThread* aThread);

  // Returns true if this supports the tail dispatcher.
  bool SupportsTailDispatch() const { return mSupportsTailDispatch; }

  // Returns true if this thread requires all dispatches originating from
  // aThread go through the tail dispatcher.
  bool RequiresTailDispatch(AbstractThread* aThread) const;
  bool RequiresTailDispatchFromCurrentThread() const;

  virtual nsIEventTarget* AsEventTarget() { MOZ_CRASH("Not an event target!"); }

  // Returns the non-DocGroup version of AbstractThread on the main thread.
  // A DocGroup-versioned one is available in
  // DispatcherTrait::AbstractThreadFor(). Note:
  // DispatcherTrait::AbstractThreadFor() SHALL be used when possible.
  static AbstractThread* MainThread();

  // Must be called exactly once during startup.
  static void InitTLS();
  static void InitMainThread();
  static void ShutdownMainThread();

  void DispatchStateChange(already_AddRefed aRunnable);

  static void DispatchDirectTask(already_AddRefed aRunnable);

 protected:
  virtual ~AbstractThread() = default;
  static MOZ_THREAD_LOCAL(AbstractThread*) sCurrentThreadTLS;

  // True if we want to require that every task dispatched from tasks running in
  // this queue go through our queue's tail dispatcher.
  const bool mSupportsTailDispatch;
};

}  // namespace mozilla