Global Metrics

path: .metrics.nargs.average
old: 2.25
new: 1.5

path: .metrics.nargs.sum
old: 9.0
new: 3.0

path: .metrics.halstead.purity_ratio
old: 0.919895803516003
new: 1.2290153023259875

path: .metrics.halstead.N1
old: 314.0
new: 96.0

path: .metrics.halstead.effort
old: 185801.45182288604
new: 12830.683681359733

path: .metrics.halstead.difficulty
old: 51.2578125
new: 14.96551724137931

path: .metrics.halstead.n2
old: 64.0
new: 29.0

path: .metrics.halstead.level
old: 0.01950922115531169
new: 0.06682027649769585

path: .metrics.halstead.estimated_program_length
old: 512.3819625584136
new: 194.18441776750603

path: .metrics.halstead.volume
old: 3624.841614590674
new: 857.3498312429315

path: .metrics.halstead.N2
old: 243.0
new: 62.0

path: .metrics.halstead.time
old: 10322.302879049224
new: 712.8157600755408

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

path: .metrics.halstead.vocabulary
old: 91.0
new: 43.0

path: .metrics.halstead.bugs
old: 1.0853708348158726
new: 0.18268880885025013

path: .metrics.halstead.length
old: 557.0
new: 158.0

path: .metrics.loc.blank
old: 19.0
new: 11.0

path: .metrics.loc.sloc
old: 129.0
new: 88.0

path: .metrics.loc.lloc
old: 45.0
new: 1.0

path: .metrics.loc.cloc
old: 31.0
new: 38.0

path: .metrics.loc.ploc
old: 79.0
new: 39.0

path: .metrics.nom.total
old: 4.0
new: 2.0

path: .metrics.nom.functions
old: 4.0
new: 2.0

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

path: .metrics.cyclomatic.sum
old: 26.0
new: 8.0

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

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

path: .metrics.nexits.average
old: 3.0
new: 0.0

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

path: .metrics.mi.mi_visual_studio
old: 25.540407313182342
new: 35.96909017459029

path: .metrics.mi.mi_original
old: 43.67409650554181
new: 61.5071441985494

path: .metrics.mi.mi_sei
old: 24.380520604783356
new: 56.40324920725754

Spaces Data

Minimal test - lines (15, 86)

path: .spaces[0].metrics.halstead.estimated_program_length
old: 420.80302513413505
new: 169.39937365317456

path: .spaces[0].metrics.halstead.bugs
old: 0.6846192578632334
new: 0.18340604775746647

path: .spaces[0].metrics.halstead.difficulty
old: 37.77777777777778
new: 15.96

path: .spaces[0].metrics.halstead.effort
old: 93079.82308110672
new: 12906.317970195349

path: .spaces[0].metrics.halstead.N2
old: 170.0
new: 57.0

path: .spaces[0].metrics.halstead.level
old: 0.026470588235294117
new: 0.06265664160401002

path: .spaces[0].metrics.halstead.n2
old: 54.0
new: 25.0

path: .spaces[0].metrics.halstead.time
old: 5171.101282283707
new: 717.0176650108527

path: .spaces[0].metrics.halstead.purity_ratio
old: 1.073477104934018
new: 1.1071854487135593

path: .spaces[0].metrics.halstead.N1
old: 222.0
new: 96.0

path: .spaces[0].metrics.halstead.n1
old: 24.0
new: 14.0

path: .spaces[0].metrics.halstead.vocabulary
old: 78.0
new: 39.0

path: .spaces[0].metrics.halstead.volume
old: 2463.8776697940016
new: 808.6665394859241

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

path: .spaces[0].metrics.mi.mi_visual_studio
old: 34.283958777951746
new: 38.18245516105761

path: .spaces[0].metrics.mi.mi_sei
old: 37.96375219544194
new: 61.722671197798405

path: .spaces[0].metrics.mi.mi_original
old: 58.62556951029748
new: 65.29199832540851

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

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

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

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

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

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

path: .spaces[0].metrics.loc.ploc
old: 46.0
new: 33.0

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

path: .spaces[0].metrics.loc.sloc
old: 65.0
new: 72.0

path: .spaces[0].metrics.nargs.average
old: 3.0
new: 1.5

path: .spaces[0].metrics.cyclomatic.sum
old: 18.0
new: 7.0

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

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

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

Code

namespace mozilla {
namespace widget {

/* this is handy wrapper around JSAPI to make it more pleasant to use.
 * We collect the JSAPI errors and so that callers don't need to */
class MOZ_STACK_CLASS InfoObject {
  friend class GfxInfoBase;

 public:
  void DefineProperty(const char* name, int value);
  void DefineProperty(const char* name, nsAString& value);
  void DefineProperty(const char* name, const char* value);

 private:
  // We need to ensure that this object lives on the stack so that GC sees it
  // properly
  explicit InfoObject(JSContext* aCx);
  InfoObject(InfoObject&);

  JSContext* mCx;
  JS::Rooted mObj;
  bool mOk;
};

/*

   Here's an example usage:

   class Foo {
   Foo::Foo() : mInfoCollector(this, &Foo::GetAweseomeness) {}

   void GetAwesomeness(InfoObject &obj) {
     obj.DefineProperty("awesome", mAwesome);
   }

   int mAwesome;

   GfxInfoCollector mInfoCollector;
   }

   This will define a property on the object
   returned from calling getInfo() on a
   GfxInfo object. e.g.

       gfxInfo = Cc["@mozilla.org/gfx/info;1"].getService(Ci.nsIGfxInfo);
       info = gfxInfo.getInfo();
       if (info.awesome)
          alert(info.awesome);

*/

class GfxInfoCollectorBase {
 public:
  GfxInfoCollectorBase();
  virtual void GetInfo(InfoObject& obj) = 0;
  virtual ~GfxInfoCollectorBase();
};

template 
class GfxInfoCollector : public GfxInfoCollectorBase {
 public:
  GfxInfoCollector(T* aPointer, void (T::*aFunc)(InfoObject& obj))
      : mPointer(aPointer), mFunc(aFunc) {}
  virtual void GetInfo(InfoObject& obj) override { (mPointer->*mFunc)(obj); }

 protected:
  T* mPointer;
  void (T::*mFunc)(InfoObject& obj);
};

}  // namespace widget
}  // namespace mozilla