Global Metrics

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

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

path: .metrics.mi.mi_sei
old: -11.287668715533744
new: 11.331361009775016

path: .metrics.mi.mi_visual_studio
old: 15.589820948356088
new: 19.750064897994527

path: .metrics.mi.mi_original
old: 26.65859382168891
new: 33.77261097557064

path: .metrics.loc.lloc
old: 71.0
new: 37.0

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

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

path: .metrics.loc.sloc
old: 257.0
new: 213.0

path: .metrics.loc.ploc
old: 182.0
new: 126.0

path: .metrics.halstead.purity_ratio
old: 0.954619732374659
new: 0.5412076665671524

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

path: .metrics.halstead.time
old: 13591.492552991707
new: 9030.939379924155

path: .metrics.halstead.effort
old: 244646.86595385073
new: 162556.9088386348

path: .metrics.halstead.vocabulary
old: 167.0
new: 60.0

path: .metrics.halstead.volume
old: 8949.049602478552
new: 3278.324280562728

path: .metrics.halstead.estimated_program_length
old: 1156.9991156380868
new: 300.37025494476956

path: .metrics.halstead.N1
old: 696.0
new: 341.0

path: .metrics.halstead.bugs
old: 1.303882679684064
new: 0.9928470888551232

path: .metrics.halstead.length
old: 1212.0
new: 555.0

path: .metrics.halstead.level
old: 0.03657945736434108
new: 0.02016724053123463

path: .metrics.halstead.n2
old: 151.0
new: 41.0

path: .metrics.halstead.N2
old: 516.0
new: 214.0

path: .metrics.halstead.difficulty
old: 27.337748344370866
new: 49.58536585365854

path: .metrics.nom.total
old: 21.0
new: 28.0

path: .metrics.nom.functions
old: 21.0
new: 28.0

path: .metrics.nargs.average
old: 1.5238095238095235
new: 0.5

path: .metrics.nargs.sum
old: 32.0
new: 14.0

path: .metrics.nexits.average
old: 0.3333333333333333
new: 0.5

path: .metrics.nexits.sum
old: 7.0
new: 14.0

path: .metrics.cyclomatic.sum
old: 31.0
new: 36.0

path: .metrics.cyclomatic.average
old: 1.4090909090909092
new: 1.1612903225806452

Spaces Data

Minimal test - lines (192, 193)

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

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

path: .spaces[1].metrics.halstead.difficulty
old: 11.25
new: 6.0

path: .spaces[1].metrics.halstead.estimated_program_length
old: 203.01955000865388
new: 39.50977500432694

path: .spaces[1].metrics.halstead.effort
old: 9335.62806786978
new: 502.5708497116037

path: .spaces[1].metrics.halstead.n2
old: 32.0
new: 6.0

path: .spaces[1].metrics.halstead.volume
old: 829.8336060328692
new: 83.76180828526729

path: .spaces[1].metrics.halstead.level
old: 0.08888888888888889
new: 0.16666666666666666

path: .spaces[1].metrics.halstead.purity_ratio
old: 1.3356549342674595
new: 1.7958988638330426

path: .spaces[1].metrics.halstead.bugs
old: 0.14778865815587683
new: 0.021070601904317903

path: .spaces[1].metrics.halstead.n1
old: 12.0
new: 8.0

path: .spaces[1].metrics.halstead.vocabulary
old: 44.0
new: 14.0

path: .spaces[1].metrics.halstead.N1
old: 92.0
new: 13.0

path: .spaces[1].metrics.halstead.N2
old: 60.0
new: 9.0

path: .spaces[1].metrics.halstead.length
old: 152.0
new: 22.0

path: .spaces[1].metrics.halstead.time
old: 518.6460037705433
new: 27.920602761755763

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

path: .spaces[1].metrics.nexits.average
old: 3.0
new: 0.0

path: .spaces[1].metrics.mi.mi_sei
old: 68.8665549820994
new: 121.35125244839124

path: .spaces[1].metrics.mi.mi_original
old: 76.20073314105721
new: 136.51553446779872

path: .spaces[1].metrics.mi.mi_visual_studio
old: 44.56183224623229
new: 79.83364588760159

path: .spaces[1].metrics.loc.sloc
old: 38.0
new: 2.0

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

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

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

path: .spaces[1].metrics.loc.ploc
old: 23.0
new: 2.0

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

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

Code

nsCOMPtr::nsCOMPtr(const mozilla::OwningNonNull& aOther)
    : nsCOMPtr(aOther.get()) {}

Minimal test - lines (204, 205)

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

path: .spaces[3].metrics.loc.blank
old: 1.0
new: 0.0

path: .spaces[3].metrics.loc.sloc
old: 9.0
new: 2.0

path: .spaces[3].metrics.loc.ploc
old: 8.0
new: 2.0

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

path: .spaces[3].metrics.nargs.sum
old: 2.0
new: 1.0

path: .spaces[3].metrics.halstead.level
old: 0.11285266457680251
new: 0.16666666666666666

path: .spaces[3].metrics.halstead.difficulty
old: 8.86111111111111
new: 6.0

path: .spaces[3].metrics.halstead.vocabulary
old: 29.0
new: 14.0

path: .spaces[3].metrics.halstead.length
old: 65.0
new: 22.0

path: .spaces[3].metrics.halstead.N1
old: 36.0
new: 13.0

path: .spaces[3].metrics.halstead.n1
old: 11.0
new: 8.0

path: .spaces[3].metrics.halstead.volume
old: 315.76876468329215
new: 83.76180828526729

path: .spaces[3].metrics.halstead.N2
old: 29.0
new: 9.0

path: .spaces[3].metrics.halstead.bugs
old: 0.06618866864658426
new: 0.021070601904317903

path: .spaces[3].metrics.halstead.estimated_program_length
old: 113.11239783097189
new: 39.50977500432694

path: .spaces[3].metrics.halstead.n2
old: 18.0
new: 6.0

path: .spaces[3].metrics.halstead.time
old: 155.4478949598305
new: 27.920602761755763

path: .spaces[3].metrics.halstead.purity_ratio
old: 1.7401907358611055
new: 1.7958988638330426

path: .spaces[3].metrics.halstead.effort
old: 2798.0621092769497
new: 502.5708497116037

path: .spaces[3].metrics.mi.mi_visual_studio
old: 61.5490695131712
new: 79.83364588760159

path: .spaces[3].metrics.mi.mi_original
old: 105.24890886752276
new: 136.51553446779872

path: .spaces[3].metrics.mi.mi_sei
old: 76.24304674954124
new: 121.35125244839124

Code

RefPtr::RefPtr(const mozilla::OwningNonNull& aOther)
    : RefPtr(aOther.get()) {}

Minimal test - lines (197, 199)

path: .spaces[2].metrics.halstead.N2
old: 59.0
new: 10.0

path: .spaces[2].metrics.halstead.n2
old: 27.0
new: 7.0

path: .spaces[2].metrics.halstead.effort
old: 10658.343660699697
new: 817.4925682500678

path: .spaces[2].metrics.halstead.length
old: 141.0
new: 28.0

path: .spaces[2].metrics.halstead.time
old: 592.1302033722054
new: 45.416253791670435

path: .spaces[2].metrics.halstead.N1
old: 82.0
new: 18.0

path: .spaces[2].metrics.halstead.n1
old: 13.0
new: 10.0

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

path: .spaces[2].metrics.halstead.estimated_program_length
old: 176.48767889424784
new: 52.87076540327685

path: .spaces[2].metrics.halstead.level
old: 0.07040417209908735
new: 0.14

path: .spaces[2].metrics.halstead.volume
old: 750.3918613791182
new: 114.4489595550095

path: .spaces[2].metrics.halstead.purity_ratio
old: 1.251685665916651
new: 1.8882416215456015

path: .spaces[2].metrics.halstead.difficulty
old: 14.203703703703704
new: 7.142857142857143

path: .spaces[2].metrics.halstead.bugs
old: 0.16143779784598294
new: 0.029143024456734404

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

path: .spaces[2].metrics.loc.ploc
old: 21.0
new: 3.0

path: .spaces[2].metrics.loc.lloc
old: 12.0
new: 1.0

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

path: .spaces[2].metrics.loc.sloc
old: 37.0
new: 3.0

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

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

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

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

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

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

path: .spaces[2].metrics.mi.mi_visual_studio
old: 45.120487102434865
new: 75.04316395018249

path: .spaces[2].metrics.mi.mi_sei
old: 72.0740039268881
new: 109.53309269425488

path: .spaces[2].metrics.mi.mi_original
old: 77.15603294516362
new: 128.32381035481205

Code

nsCOMPtr& nsCOMPtr::operator=(const mozilla::OwningNonNull& aOther) {
  return operator=(aOther.get());
}

Minimal test - lines (209, 211)

path: .spaces[4].metrics.loc.lloc
old: 2.0
new: 1.0

path: .spaces[4].metrics.loc.ploc
old: 11.0
new: 3.0

path: .spaces[4].metrics.loc.sloc
old: 11.0
new: 3.0

path: .spaces[4].metrics.nargs.average
old: 4.0
new: 0.0

path: .spaces[4].metrics.nargs.sum
old: 4.0
new: 0.0

path: .spaces[4].metrics.mi.mi_original
old: 100.50108827090916
new: 128.32381035481205

path: .spaces[4].metrics.mi.mi_sei
old: 69.3933895197763
new: 109.53309269425488

path: .spaces[4].metrics.mi.mi_visual_studio
old: 58.77256624029775
new: 75.04316395018249

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

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

path: .spaces[4].metrics.halstead.length
old: 85.0
new: 28.0

path: .spaces[4].metrics.halstead.level
old: 0.10769230769230768
new: 0.14

path: .spaces[4].metrics.halstead.time
old: 217.23757630863085
new: 45.416253791670435

path: .spaces[4].metrics.halstead.N2
old: 39.0
new: 10.0

path: .spaces[4].metrics.halstead.difficulty
old: 9.285714285714286
new: 7.142857142857143

path: .spaces[4].metrics.halstead.volume
old: 421.1066863828844
new: 114.4489595550095

path: .spaces[4].metrics.halstead.bugs
old: 0.0827339414310516
new: 0.029143024456734404

path: .spaces[4].metrics.halstead.estimated_program_length
old: 125.4579468272276
new: 52.87076540327685

path: .spaces[4].metrics.halstead.N1
old: 46.0
new: 18.0

path: .spaces[4].metrics.halstead.effort
old: 3910.2763735553553
new: 817.4925682500678

path: .spaces[4].metrics.halstead.vocabulary
old: 31.0
new: 17.0

path: .spaces[4].metrics.halstead.purity_ratio
old: 1.475975845026207
new: 1.8882416215456015

path: .spaces[4].metrics.halstead.n2
old: 21.0
new: 7.0

Code

RefPtr& RefPtr::operator=(const mozilla::OwningNonNull& aOther) {
  return operator=(aOther.get());
}

Minimal test - lines (15, 187)

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

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

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

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

path: .spaces[0].metrics.halstead.volume
old: 286.7268228066066
new: 2468.6405976750298

path: .spaces[0].metrics.halstead.level
old: 0.09404388714733544
new: 0.023106546854942234

path: .spaces[0].metrics.halstead.difficulty
old: 10.633333333333333
new: 43.27777777777778

path: .spaces[0].metrics.halstead.length
old: 61.0
new: 427.0

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

path: .spaces[0].metrics.halstead.bugs
old: 0.07008696366961947
new: 0.7505171572084167

path: .spaces[0].metrics.halstead.vocabulary
old: 26.0
new: 55.0

path: .spaces[0].metrics.halstead.effort
old: 3048.8618825102503
new: 106837.27919938046

path: .spaces[0].metrics.halstead.time
old: 169.3812156950139
new: 5935.4043999655805

path: .spaces[0].metrics.halstead.N2
old: 29.0
new: 164.0

path: .spaces[0].metrics.halstead.purity_ratio
old: 1.5845427334284925
new: 0.6248897489633521

path: .spaces[0].metrics.halstead.N1
old: 32.0
new: 263.0

path: .spaces[0].metrics.halstead.estimated_program_length
old: 96.65710673913804
new: 266.82792280735134

path: .spaces[0].metrics.halstead.n2
old: 15.0
new: 36.0

path: .spaces[0].metrics.nargs.average
old: 4.0
new: 0.5

path: .spaces[0].metrics.nargs.sum
old: 4.0
new: 12.0

path: .spaces[0].metrics.loc.sloc
old: 9.0
new: 173.0

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

path: .spaces[0].metrics.loc.blank
old: 1.0
new: 28.0

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

path: .spaces[0].metrics.loc.ploc
old: 8.0
new: 103.0

path: .spaces[0].metrics.mi.mi_original
old: 105.7506062342182
new: 39.7672770225672

path: .spaces[0].metrics.mi.mi_sei
old: 76.96684305249981
new: 19.39385834851037

path: .spaces[0].metrics.mi.mi_visual_studio
old: 61.84245978609252
new: 23.255717557056844

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

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

Code

namespace mozilla {

// OwningNonNull is similar to a RefPtr, which is not null after initial
// initialization. It has a restricted interface compared to RefPtr, with some
// additional operations defined. The main use is in DOM bindings. Use it
// outside DOM bindings only if you can ensure it never escapes without being
// properly initialized, and you don't need to move it. Otherwise, use a
// RefPtr instead.
//
// Compared to a plain RefPtr, in particular
// - it is copyable but not movable
// - it can be constructed and assigned from T& and is convertible to T&
// implicitly
// - it cannot be cleared by the user once initialized, though it can be
//   re-assigned a new (non-null) value
// - it is not convertible to bool, but there is an explicit isInitialized
//   member function
//
// Beware that there are two cases where an OwningNonNull actually is nullptr
// - it was default-constructed and not yet initialized
// - it was cleared during CC unlinking.
// All attempts to use it in an invalid state will trigger an assertion in debug
// builds.
//
// The original intent of OwningNonNull was to implement a class with the
// same auto-conversion and annotation semantics as mozilla::dom::NonNull
// (i.e. never null once you have properly initialized it, auto-converts to T&),
// but that holds a strong reference to the object involved. This was designed
// for use in DOM bindings and in particular for storing what WebIDL represents
// as InterfaceName (as opposed to `InterfaceName?`) in various containers
// (dictionaries, sequences). DOM bindings never allow a default-constructed
// uninitialized OwningNonNull to escape. RefPtr could have been used for this
// use case, just like we could have used T* instead of NonNull, but it
// seemed desirable to explicitly annotate the non-null nature of the things
// involved to eliminate pointless null-checks, which otherwise tend to
// proliferate.
template 
class MOZ_IS_SMARTPTR_TO_REFCOUNTED OwningNonNull {
 public:
  using element_type = T;

  OwningNonNull() = default;

  MOZ_IMPLICIT OwningNonNull(T& aValue) { init(&aValue); }

  template 
  MOZ_IMPLICIT OwningNonNull(already_AddRefed&& aValue) {
    init(aValue);
  }

  template 
  MOZ_IMPLICIT OwningNonNull(RefPtr&& aValue) {
    init(std::move(aValue));
  }

  template 
  MOZ_IMPLICIT OwningNonNull(const OwningNonNull& aValue) {
    init(aValue);
  }

  // This is no worse than get() in terms of const handling.
  operator T&() const { return ref(); }

  operator T*() const { return get(); }

  // Conversion to bool is always true, so delete to catch errors
  explicit operator bool() const = delete;

  T* operator->() const { return get(); }

  T& operator*() const { return ref(); }

  OwningNonNull& operator=(T* aValue) {
    init(aValue);
    return *this;
  }

  OwningNonNull& operator=(T& aValue) {
    init(&aValue);
    return *this;
  }

  template 
  OwningNonNull& operator=(already_AddRefed&& aValue) {
    init(aValue);
    return *this;
  }

  template 
  OwningNonNull& operator=(RefPtr&& aValue) {
    init(std::move(aValue));
    return *this;
  }

  template 
  OwningNonNull& operator=(const OwningNonNull& aValue) {
    init(aValue);
    return *this;
  }

  // Don't allow assigning nullptr, it makes no sense
  void operator=(decltype(nullptr)) = delete;

  T& ref() const {
    MOZ_ASSERT(mInited);
    MOZ_ASSERT(mPtr, "OwningNonNull was set to null");
    return *mPtr;
  }

  // Make us work with smart pointer helpers that expect a get().
  T* get() const {
    MOZ_ASSERT(mInited);
    MOZ_ASSERT(mPtr, "OwningNonNull was set to null");
    return mPtr;
  }

  template 
  void swap(U& aOther) {
    mPtr.swap(aOther);
#ifdef DEBUG
    mInited = mPtr;
#endif
  }

  // We have some consumers who want to check whether we're inited in non-debug
  // builds as well.  Luckily, we have the invariant that we're inited precisely
  // when mPtr is non-null.
  bool isInitialized() const {
    MOZ_ASSERT(!!mPtr == mInited, "mInited out of sync with mPtr?");
    return mPtr;
  }

 private:
  void unlinkForCC() {
#ifdef DEBUG
    mInited = false;
#endif
    mPtr = nullptr;
  }

  // Allow ImplCycleCollectionUnlink to call unlinkForCC().
  template 
  friend void ImplCycleCollectionUnlink(OwningNonNull& aField);

 protected:
  template 
  void init(U&& aValue) {
    mPtr = aValue;
    MOZ_ASSERT(mPtr);
#ifdef DEBUG
    mInited = true;
#endif
  }

  RefPtr mPtr;
#ifdef DEBUG
  bool mInited = false;
#endif
};

template 
inline void ImplCycleCollectionUnlink(OwningNonNull& aField) {
  aField.unlinkForCC();
}

template 
inline void ImplCycleCollectionTraverse(
    nsCycleCollectionTraversalCallback& aCallback, OwningNonNull& aField,
    const char* aName, uint32_t aFlags = 0) {
  CycleCollectionNoteChild(aCallback, aField.get(), aName, aFlags);
}

}  // namespace mozilla