Global Metrics

path: .metrics.halstead.vocabulary
old: 98.0
new: 221.0

path: .metrics.halstead.difficulty
old: 9.807692307692308
new: 22.89

path: .metrics.halstead.estimated_program_length
old: 611.8607967124846
new: 1621.0099038332987

path: .metrics.halstead.n1
old: 7.0
new: 21.0

path: .metrics.halstead.N1
old: 273.0
new: 575.0

path: .metrics.halstead.n2
old: 91.0
new: 200.0

path: .metrics.halstead.length
old: 528.0
new: 1011.0

path: .metrics.halstead.time
old: 1903.0011397685291
new: 10012.555864994392

path: .metrics.halstead.effort
old: 34254.02051583352
new: 180226.00556989905

path: .metrics.halstead.purity_ratio
old: 1.1588272665009178
new: 1.6033728030002954

path: .metrics.halstead.N2
old: 255.0
new: 436.0

path: .metrics.halstead.bugs
old: 0.3515764535284321
new: 1.0635478896463355

path: .metrics.halstead.level
old: 0.10196078431372547
new: 0.043687199650502405

path: .metrics.halstead.volume
old: 3492.56679769283
new: 7873.569487544737

path: .metrics.nexits.sum
old: 1.0
new: 16.0

path: .metrics.nexits.average
old: 0.2
new: 0.6666666666666666

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

path: .metrics.loc.lloc
old: 65.0
new: 40.0

path: .metrics.loc.sloc
old: 92.0
new: 359.0

path: .metrics.loc.blank
old: 7.0
new: 82.0

path: .metrics.loc.ploc
old: 80.0
new: 246.0

path: .metrics.nargs.average
old: 0.0
new: 0.75

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

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

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

path: .metrics.cyclomatic.sum
old: 6.0
new: 46.0

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

path: .metrics.nom.total
old: 5.0
new: 24.0

path: .metrics.nom.functions
old: 5.0
new: 24.0

path: .metrics.mi.mi_original
old: 53.943385523469615
new: 18.45958997343747

path: .metrics.mi.mi_sei
old: 20.401789600462
new: -22.401740490113728

path: .metrics.mi.mi_visual_studio
old: 31.545839487409133
new: 10.795081855811388

Spaces Data

Minimal test - lines (342, 357)

path: .spaces[3].metrics.mi.mi_original
old: 86.30256601397451
new: 101.62945356612114

path: .spaces[3].metrics.mi.mi_sei
old: 48.90925187174513
new: 71.02127653548986

path: .spaces[3].metrics.mi.mi_visual_studio
old: 50.4693368502775
new: 59.43242898603575

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

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

path: .spaces[3].metrics.halstead.n2
old: 41.0
new: 8.0

path: .spaces[3].metrics.halstead.vocabulary
old: 46.0
new: 15.0

path: .spaces[3].metrics.halstead.difficulty
old: 4.695121951219512
new: 4.8125

path: .spaces[3].metrics.halstead.estimated_program_length
old: 231.26927266377825
new: 43.65148445440323

path: .spaces[3].metrics.halstead.n1
old: 5.0
new: 7.0

path: .spaces[3].metrics.halstead.bugs
old: 0.08463289861734552
new: 0.021212372729746045

path: .spaces[3].metrics.halstead.N1
old: 79.0
new: 16.0

path: .spaces[3].metrics.halstead.N2
old: 77.0
new: 11.0

path: .spaces[3].metrics.halstead.length
old: 156.0
new: 27.0

path: .spaces[3].metrics.halstead.level
old: 0.21298701298701295
new: 0.2077922077922078

path: .spaces[3].metrics.halstead.time
old: 224.75957390297037
new: 28.202866487048993

path: .spaces[3].metrics.halstead.volume
old: 861.6756651448941
new: 105.48604608143

path: .spaces[3].metrics.halstead.effort
old: 4045.672330253466
new: 507.6515967668819

path: .spaces[3].metrics.halstead.purity_ratio
old: 1.482495337588322
new: 1.616721646459379

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

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

path: .spaces[3].metrics.loc.ploc
old: 21.0
new: 11.0

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

path: .spaces[3].metrics.loc.sloc
old: 21.0
new: 16.0

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

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

Code

class nsAndroidBridge final : public nsIAndroidBridge {
 public:
  NS_DECL_ISUPPORTS
  NS_DECL_NSIANDROIDBRIDGE

  NS_FORWARD_SAFE_NSIANDROIDEVENTDISPATCHER(mEventDispatcher)

  nsAndroidBridge();

 private:
  ~nsAndroidBridge();

  nsCOMPtr mEventDispatcher;

 protected:
};

Minimal test - lines (43, 43)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

path: .spaces[0].metrics.loc.sloc
old: 13.0
new: 1.0

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

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

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

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

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

Code

class nsPIDOMWindowOuter;

Minimal test - lines (48, 333)

path: .spaces[2].metrics.loc.lloc
old: 11.0
new: 40.0

path: .spaces[2].metrics.loc.ploc
old: 13.0
new: 205.0

path: .spaces[2].metrics.loc.sloc
old: 13.0
new: 286.0

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

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

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

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

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

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

path: .spaces[2].metrics.mi.mi_original
old: 97.43318940979545
new: 23.51177680921947

path: .spaces[2].metrics.mi.mi_visual_studio
old: 56.97847333906166
new: 13.749577081414891

path: .spaces[2].metrics.mi.mi_sei
old: 64.96734704689862
new: -16.67560193045425

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

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

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

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

path: .spaces[2].metrics.halstead.bugs
old: 0.053466680637861336
new: 1.062349383498191

path: .spaces[2].metrics.halstead.N1
old: 47.0
new: 553.0

path: .spaces[2].metrics.halstead.time
old: 112.85848369899593
new: 9995.635994440858

path: .spaces[2].metrics.halstead.length
old: 92.0
new: 954.0

path: .spaces[2].metrics.halstead.effort
old: 2031.4527065819263
new: 179921.44789993545

path: .spaces[2].metrics.halstead.estimated_program_length
old: 127.70604521880492
new: 1342.9872906100431

path: .spaces[2].metrics.halstead.volume
old: 451.4339347959837
new: 7221.642250347724

path: .spaces[2].metrics.halstead.difficulty
old: 4.5
new: 24.914201183431953

path: .spaces[2].metrics.halstead.n1
old: 5.0
new: 21.0

path: .spaces[2].metrics.halstead.level
old: 0.2222222222222222
new: 0.04013775086094288

path: .spaces[2].metrics.halstead.n2
old: 25.0
new: 169.0

path: .spaces[2].metrics.halstead.N2
old: 45.0
new: 401.0

path: .spaces[2].metrics.halstead.vocabulary
old: 30.0
new: 190.0

path: .spaces[2].metrics.halstead.purity_ratio
old: 1.3881091871609232
new: 1.407743491205496

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

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

Code

namespace mozilla {

class AutoLocalJNIFrame;

namespace hal {
class BatteryInformation;
class NetworkInformation;
}  // namespace hal

// The order and number of the members in this structure must correspond
// to the attrsAppearance array in GeckoAppShell.getSystemColors()
typedef struct AndroidSystemColors {
  nscolor textColorPrimary;
  nscolor textColorPrimaryInverse;
  nscolor textColorSecondary;
  nscolor textColorSecondaryInverse;
  nscolor textColorTertiary;
  nscolor textColorTertiaryInverse;
  nscolor textColorHighlight;
  nscolor colorForeground;
  nscolor colorBackground;
  nscolor panelColorForeground;
  nscolor panelColorBackground;
} AndroidSystemColors;

class AndroidBridge final {
 public:
  enum {
    // Values for NotifyIME, in addition to values from the Gecko
    // IMEMessage enum; use negative values here to prevent conflict
    NOTIFY_IME_OPEN_VKB = -2,
    NOTIFY_IME_REPLY_EVENT = -1,
  };

  enum {
    LAYER_CLIENT_TYPE_NONE = 0,
    LAYER_CLIENT_TYPE_GL = 2  // AndroidGeckoGLLayerClient
  };

  static bool IsJavaUiThread() {
    return mozilla::jni::GetUIThreadId() == gettid();
  }

  static void ConstructBridge();
  static void DeconstructBridge();

  static AndroidBridge* Bridge() { return sBridge; }

  bool GetHandlersForURL(const nsAString& aURL,
                         nsIMutableArray* handlersArray = nullptr,
                         nsIHandlerApp** aDefaultApp = nullptr,
                         const nsAString& aAction = u""_ns);

  bool GetHandlersForMimeType(const nsAString& aMimeType,
                              nsIMutableArray* handlersArray = nullptr,
                              nsIHandlerApp** aDefaultApp = nullptr,
                              const nsAString& aAction = u""_ns);

  bool HasHWVP8Encoder();
  bool HasHWVP8Decoder();
  bool HasHWH264();

  void GetMimeTypeFromExtensions(const nsACString& aFileExt,
                                 nsCString& aMimeType);
  void GetExtensionFromMimeType(const nsACString& aMimeType,
                                nsACString& aFileExt);

  gfx::Rect getScreenSize();
  int GetScreenDepth();

  void Vibrate(const nsTArray& aPattern);

  void GetIconForExtension(const nsACString& aFileExt, uint32_t aIconSize,
                           uint8_t* const aBuf);

  bool GetStaticStringField(const char* classID, const char* field,
                            nsAString& result, JNIEnv* env = nullptr);

  bool GetStaticIntField(const char* className, const char* fieldName,
                         int32_t* aInt, JNIEnv* env = nullptr);

  // Returns a global reference to the Context for Fennec's Activity. The
  // caller is responsible for ensuring this doesn't leak by calling
  // DeleteGlobalRef() when the context is no longer needed.
  jobject GetGlobalContextRef(void);

  void GetCurrentBatteryInformation(hal::BatteryInformation* aBatteryInfo);

  void GetCurrentNetworkInformation(hal::NetworkInformation* aNetworkInfo);

  // These methods don't use a ScreenOrientation because it's an
  // enum and that would require including the header which requires
  // include IPC headers which requires including basictypes.h which
  // requires a lot of changes...
  uint32_t GetScreenOrientation();
  uint16_t GetScreenAngle();

  int GetAPIVersion() { return mAPIVersion; }

  nsresult GetProxyForURI(const nsACString& aSpec, const nsACString& aScheme,
                          const nsACString& aHost, const int32_t aPort,
                          nsACString& aResult);

  bool PumpMessageLoop();

  // Utility methods.
  static jfieldID GetFieldID(JNIEnv* env, jclass jClass, const char* fieldName,
                             const char* fieldType);
  static jfieldID GetStaticFieldID(JNIEnv* env, jclass jClass,
                                   const char* fieldName,
                                   const char* fieldType);
  static jmethodID GetMethodID(JNIEnv* env, jclass jClass,
                               const char* methodName, const char* methodType);
  static jmethodID GetStaticMethodID(JNIEnv* env, jclass jClass,
                                     const char* methodName,
                                     const char* methodType);

  static jni::Object::LocalRef ChannelCreate(jni::Object::Param);

  static void InputStreamClose(jni::Object::Param obj);
  static uint32_t InputStreamAvailable(jni::Object::Param obj);
  static nsresult InputStreamRead(jni::Object::Param obj, char* aBuf,
                                  uint32_t aCount, uint32_t* aRead);

 protected:
  static nsTHashMap sStoragePaths;

  static AndroidBridge* sBridge;

  AndroidBridge();
  ~AndroidBridge();

  int mAPIVersion;

  // intput stream
  jclass jReadableByteChannel;
  jclass jChannels;
  jmethodID jChannelCreate;
  jmethodID jByteBufferRead;

  jclass jInputStream;
  jmethodID jClose;
  jmethodID jAvailable;

  jmethodID jCalculateLength;

  // some convinient types to have around
  jclass jStringClass;

  jni::Object::GlobalRef mMessageQueue;
  jfieldID mMessageQueueMessages;
  jmethodID mMessageQueueNext;
};

class AutoJNIClass {
 private:
  JNIEnv* const mEnv;
  const jclass mClass;

 public:
  AutoJNIClass(JNIEnv* jEnv, const char* name)
      : mEnv(jEnv), mClass(jni::GetClassRef(jEnv, name)) {}

  ~AutoJNIClass() { mEnv->DeleteLocalRef(mClass); }

  jclass getRawRef() const { return mClass; }

  jclass getGlobalRef() const {
    return static_cast(mEnv->NewGlobalRef(mClass));
  }

  jfieldID getField(const char* name, const char* type) const {
    return AndroidBridge::GetFieldID(mEnv, mClass, name, type);
  }

  jfieldID getStaticField(const char* name, const char* type) const {
    return AndroidBridge::GetStaticFieldID(mEnv, mClass, name, type);
  }

  jmethodID getMethod(const char* name, const char* type) const {
    return AndroidBridge::GetMethodID(mEnv, mClass, name, type);
  }

  jmethodID getStaticMethod(const char* name, const char* type) const {
    return AndroidBridge::GetStaticMethodID(mEnv, mClass, name, type);
  }
};

class AutoJObject {
 public:
  explicit AutoJObject(JNIEnv* aJNIEnv = nullptr) : mObject(nullptr) {
    mJNIEnv = aJNIEnv ? aJNIEnv : jni::GetGeckoThreadEnv();
  }

  AutoJObject(JNIEnv* aJNIEnv, jobject aObject) {
    mJNIEnv = aJNIEnv ? aJNIEnv : jni::GetGeckoThreadEnv();
    mObject = aObject;
  }

  ~AutoJObject() {
    if (mObject) mJNIEnv->DeleteLocalRef(mObject);
  }

  jobject operator=(jobject aObject) {
    if (mObject) {
      mJNIEnv->DeleteLocalRef(mObject);
    }
    return mObject = aObject;
  }

  operator jobject() { return mObject; }

 private:
  JNIEnv* mJNIEnv;
  jobject mObject;
};

class AutoLocalJNIFrame {
 public:
  explicit AutoLocalJNIFrame(int nEntries = 15)
      : mEntries(nEntries),
        mJNIEnv(jni::GetGeckoThreadEnv()),
        mHasFrameBeenPushed(false) {
    MOZ_ASSERT(mJNIEnv);
    Push();
  }

  explicit AutoLocalJNIFrame(JNIEnv* aJNIEnv, int nEntries = 15)
      : mEntries(nEntries),
        mJNIEnv(aJNIEnv ? aJNIEnv : jni::GetGeckoThreadEnv()),
        mHasFrameBeenPushed(false) {
    MOZ_ASSERT(mJNIEnv);
    Push();
  }

  ~AutoLocalJNIFrame() {
    if (mHasFrameBeenPushed) {
      Pop();
    }
  }

  JNIEnv* GetEnv() { return mJNIEnv; }

  bool CheckForException() {
    if (mJNIEnv->ExceptionCheck()) {
      MOZ_CATCH_JNI_EXCEPTION(mJNIEnv);
      return true;
    }
    return false;
  }

  // Note! Calling Purge makes all previous local refs created in
  // the AutoLocalJNIFrame's scope INVALID; be sure that you locked down
  // any local refs that you need to keep around in global refs!
  void Purge() {
    Pop();
    Push();
  }

  template 
  ReturnType Pop(ReturnType aResult = nullptr) {
    MOZ_ASSERT(mHasFrameBeenPushed);
    mHasFrameBeenPushed = false;
    return static_cast(
        mJNIEnv->PopLocalFrame(static_cast(aResult)));
  }

 private:
  void Push() {
    MOZ_ASSERT(!mHasFrameBeenPushed);
    // Make sure there is enough space to store a local ref to the
    // exception.  I am not completely sure this is needed, but does
    // not hurt.
    if (mJNIEnv->PushLocalFrame(mEntries + 1) != 0) {
      CheckForException();
      return;
    }
    mHasFrameBeenPushed = true;
  }

  const int mEntries;
  JNIEnv* const mJNIEnv;
  bool mHasFrameBeenPushed;
};

}  // namespace mozilla

Minimal test - lines (46, 46)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

path: .spaces[1].metrics.halstead.n2
old: 41.0
new: 1.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

Code

class nsIRunnable;