Global Metrics

path: .metrics.cyclomatic.sum
old: 244.0
new: 69.0

path: .metrics.cyclomatic.average
old: 4.206896551724138
new: 4.6

path: .metrics.halstead.N2
old: 2865.0
new: 487.0

path: .metrics.halstead.volume
old: 50825.103433972625
new: 8900.68478491864

path: .metrics.halstead.time
old: 671409.218946423
new: 46657.51326316552

path: .metrics.halstead.N1
old: 3356.0
new: 823.0

path: .metrics.halstead.estimated_program_length
old: 2182.906338390757
new: 659.3343332129821

path: .metrics.halstead.vocabulary
old: 288.0
new: 111.0

path: .metrics.halstead.n2
old: 247.0
new: 80.0

path: .metrics.halstead.purity_ratio
old: 0.3508931583974854
new: 0.5033086513076199

path: .metrics.halstead.effort
old: 12085365.941035615
new: 839835.2387369794

path: .metrics.halstead.bugs
old: 17.5543713825519
new: 2.9671634739032093

path: .metrics.halstead.n1
old: 41.0
new: 31.0

path: .metrics.halstead.difficulty
old: 237.7834008097166
new: 94.35625

path: .metrics.halstead.length
old: 6221.0
new: 1310.0

path: .metrics.halstead.level
old: 0.004205508023666624
new: 0.010598132079221036

path: .metrics.mi.mi_sei
old: -115.79271643215212
new: -29.953524258640225

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

path: .metrics.mi.mi_original
old: -59.099803992637945
new: 10.739630704226244

path: .metrics.nargs.sum
old: 133.0
new: 20.0

path: .metrics.nargs.average
old: 2.418181818181818
new: 1.818181818181818

path: .metrics.cognitive.average
old: 3.9454545454545458
new: 7.181818181818182

path: .metrics.cognitive.sum
old: 217.0
new: 79.0

path: .metrics.nexits.sum
old: 94.0
new: 37.0

path: .metrics.nexits.average
old: 1.709090909090909
new: 3.363636363636364

path: .metrics.nom.functions
old: 55.0
new: 11.0

path: .metrics.nom.total
old: 55.0
new: 11.0

path: .metrics.loc.ploc
old: 1100.0
new: 284.0

path: .metrics.loc.sloc
old: 1424.0
new: 401.0

path: .metrics.loc.cloc
old: 104.0
new: 39.0

path: .metrics.loc.lloc
old: 512.0
new: 144.0

path: .metrics.loc.blank
old: 220.0
new: 78.0

Spaces Data

Minimal test - lines (327, 401)

path: .spaces[11].metrics.cyclomatic.sum
old: 1.0
new: 13.0

path: .spaces[11].metrics.cyclomatic.average
old: 1.0
new: 4.333333333333333

path: .spaces[11].metrics.cognitive.average
old: 0.0
new: 6.0

path: .spaces[11].metrics.cognitive.sum
old: 0.0
new: 12.0

path: .spaces[11].metrics.loc.sloc
old: 5.0
new: 75.0

path: .spaces[11].metrics.loc.ploc
old: 5.0
new: 56.0

path: .spaces[11].metrics.loc.blank
old: 0.0
new: 19.0

path: .spaces[11].metrics.loc.lloc
old: 1.0
new: 26.0

path: .spaces[11].metrics.mi.mi_visual_studio
old: 72.9358359574522
new: 35.723543555648966

path: .spaces[11].metrics.mi.mi_original
old: 124.72027948724326
new: 61.08725948015973

path: .spaces[11].metrics.mi.mi_sei
old: 104.33429658192304
new: 13.753092493769016

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

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

path: .spaces[11].metrics.nexits.sum
old: 0.0
new: 6.0

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

path: .spaces[11].metrics.halstead.length
old: 13.0
new: 239.0

path: .spaces[11].metrics.halstead.n1
old: 7.0
new: 14.0

path: .spaces[11].metrics.halstead.N2
old: 6.0
new: 90.0

path: .spaces[11].metrics.halstead.level
old: 0.23809523809523808
new: 0.03333333333333333

path: .spaces[11].metrics.halstead.estimated_program_length
old: 31.26112492884004
new: 145.54163478716043

path: .spaces[11].metrics.halstead.vocabulary
old: 12.0
new: 35.0

path: .spaces[11].metrics.halstead.volume
old: 46.60451250937503
new: 1225.898641049847

path: .spaces[11].metrics.halstead.bugs
old: 0.011237341657241998
new: 0.3686344827603722

path: .spaces[11].metrics.halstead.N1
old: 7.0
new: 149.0

path: .spaces[11].metrics.halstead.n2
old: 5.0
new: 21.0

path: .spaces[11].metrics.halstead.effort
old: 195.73895253937513
new: 36776.959231495406

path: .spaces[11].metrics.halstead.time
old: 10.874386252187508
new: 2043.164401749745

path: .spaces[11].metrics.halstead.purity_ratio
old: 2.40470191760308
new: 0.6089608150090394

path: .spaces[11].metrics.halstead.difficulty
old: 4.2
new: 30.0

path: .spaces[11].metrics.nargs.sum
old: 1.0
new: 4.0

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

Code

namespace mozilla {

#ifdef XP_WIN
int32_t CompareVersions(const char16_t* aStrA, const char16_t* aStrB) {
  wchar_t* A2 = wcsdup(char16ptr_t(aStrA));
  if (!A2) {
    return 1;
  }

  wchar_t* B2 = wcsdup(char16ptr_t(aStrB));
  if (!B2) {
    free(A2);
    return 1;
  }

  int32_t result;
  wchar_t* a = A2;
  wchar_t* b = B2;

  do {
    VersionPartW va, vb;

    a = ParseVP(a, va);
    b = ParseVP(b, vb);

    result = CompareVP(va, vb);
    if (result) {
      break;
    }

  } while (a || b);

  free(A2);
  free(B2);

  return result;
}
#endif

int32_t CompareVersions(const char* aStrA, const char* aStrB) {
  char* A2 = strdup(aStrA);
  if (!A2) {
    return 1;
  }

  char* B2 = strdup(aStrB);
  if (!B2) {
    free(A2);
    return 1;
  }

  int32_t result;
  char* a = A2;
  char* b = B2;

  do {
    VersionPart va, vb;

    a = ParseVP(a, va);
    b = ParseVP(b, vb);

    result = CompareVP(va, vb);
    if (result) {
      break;
    }

  } while (a || b);

  free(A2);
  free(B2);

  return result;
}

}  // namespace mozilla

Minimal test - lines (276, 293)

path: .spaces[9].metrics.nexits.average
old: 0.0
new: 4.0

path: .spaces[9].metrics.nexits.sum
old: 0.0
new: 4.0

path: .spaces[9].metrics.loc.lloc
old: 8.0
new: 9.0

path: .spaces[9].metrics.loc.sloc
old: 14.0
new: 18.0

path: .spaces[9].metrics.loc.ploc
old: 13.0
new: 15.0

path: .spaces[9].metrics.loc.blank
old: 1.0
new: 3.0

path: .spaces[9].metrics.cognitive.average
old: 4.0
new: 3.0

path: .spaces[9].metrics.cognitive.sum
old: 4.0
new: 3.0

path: .spaces[9].metrics.cyclomatic.average
old: 5.0
new: 4.0

path: .spaces[9].metrics.cyclomatic.sum
old: 5.0
new: 4.0

path: .spaces[9].metrics.mi.mi_visual_studio
old: 55.45824757839937
new: 53.874542401776615

path: .spaces[9].metrics.mi.mi_original
old: 94.83360335906292
new: 92.125467507038

path: .spaces[9].metrics.mi.mi_sei
old: 61.62421658076058
new: 57.615382557586145

path: .spaces[9].metrics.halstead.n2
old: 10.0
new: 13.0

path: .spaces[9].metrics.halstead.level
old: 0.031446540880503145
new: 0.06842105263157895

path: .spaces[9].metrics.halstead.estimated_program_length
old: 76.2388309575275
new: 81.32499728470782

path: .spaces[9].metrics.halstead.n1
old: 12.0
new: 10.0

path: .spaces[9].metrics.halstead.vocabulary
old: 22.0
new: 23.0

path: .spaces[9].metrics.halstead.length
old: 111.0
new: 88.0

path: .spaces[9].metrics.halstead.N1
old: 58.0
new: 50.0

path: .spaces[9].metrics.halstead.bugs
old: 0.20936230142434528
new: 0.10782704935943677

path: .spaces[9].metrics.halstead.difficulty
old: 31.8
new: 14.615384615384617

path: .spaces[9].metrics.halstead.effort
old: 15740.901727465933
new: 5817.996608097943

path: .spaces[9].metrics.halstead.time
old: 874.4945404147741
new: 323.22203378321905

path: .spaces[9].metrics.halstead.volume
old: 494.99690966874
new: 398.0734521330171

path: .spaces[9].metrics.halstead.N2
old: 53.0
new: 38.0

path: .spaces[9].metrics.halstead.purity_ratio
old: 0.6868363149326802
new: 0.9241476964171343

Code

static int32_t CompareVP(VersionPart& aVer1, VersionPart& aVer2) {
  int32_t r = ns_cmp(aVer1.numA, aVer2.numA);
  if (r) {
    return r;
  }

  r = ns_strnncmp(aVer1.strB, aVer1.strBlen, aVer2.strB, aVer2.strBlen);
  if (r) {
    return r;
  }

  r = ns_cmp(aVer1.numC, aVer2.numC);
  if (r) {
    return r;
  }

  return ns_strcmp(aVer1.extraD, aVer2.extraD);
}

Minimal test - lines (156, 218)

path: .spaces[5].metrics.mi.mi_original
old: 101.58542825248946
new: 63.276032022030776

path: .spaces[5].metrics.mi.mi_sei
old: 71.05958129324432
new: 16.707184066751353

path: .spaces[5].metrics.mi.mi_visual_studio
old: 59.406683188590335
new: 37.003527498263615

path: .spaces[5].metrics.cyclomatic.average
old: 2.0
new: 11.0

path: .spaces[5].metrics.cyclomatic.sum
old: 2.0
new: 11.0

path: .spaces[5].metrics.loc.blank
old: 2.0
new: 11.0

path: .spaces[5].metrics.loc.ploc
old: 12.0
new: 52.0

path: .spaces[5].metrics.loc.lloc
old: 6.0
new: 32.0

path: .spaces[5].metrics.loc.sloc
old: 14.0
new: 63.0

path: .spaces[5].metrics.halstead.N1
old: 23.0
new: 172.0

path: .spaces[5].metrics.halstead.bugs
old: 0.040716530044603606
new: 0.5379702360814241

path: .spaces[5].metrics.halstead.vocabulary
old: 18.0
new: 46.0

path: .spaces[5].metrics.halstead.purity_ratio
old: 1.54646705267226
new: 0.760346973075628

path: .spaces[5].metrics.halstead.time
old: 75.00073440094158
new: 3602.0252227838996

path: .spaces[5].metrics.halstead.effort
old: 1350.0132192169483
new: 64836.45401011019

path: .spaces[5].metrics.halstead.difficulty
old: 8.75
new: 42.84

path: .spaces[5].metrics.halstead.estimated_program_length
old: 57.219280948873624
new: 208.33507062272207

path: .spaces[5].metrics.halstead.volume
old: 154.28722505336555
new: 1513.4559759596216

path: .spaces[5].metrics.halstead.N2
old: 14.0
new: 102.0

path: .spaces[5].metrics.halstead.level
old: 0.11428571428571428
new: 0.023342670401493928

path: .spaces[5].metrics.halstead.n2
old: 8.0
new: 25.0

path: .spaces[5].metrics.halstead.length
old: 37.0
new: 274.0

path: .spaces[5].metrics.halstead.n1
old: 10.0
new: 21.0

path: .spaces[5].metrics.cognitive.sum
old: 1.0
new: 21.0

path: .spaces[5].metrics.cognitive.average
old: 1.0
new: 21.0

Code

static wchar_t* ParseVP(wchar_t* aPart, VersionPartW& aResult) {
  wchar_t* dot;

  aResult.numA = 0;
  aResult.strB = nullptr;
  aResult.strBlen = 0;
  aResult.numC = 0;
  aResult.extraD = nullptr;

  if (!aPart) {
    return aPart;
  }

  dot = wcschr(aPart, '.');
  if (dot) {
    *dot = '\0';
  }

  if (aPart[0] == '*' && aPart[1] == '\0') {
    static wchar_t kEmpty[] = L"";

    aResult.numA = INT32_MAX;
    aResult.strB = kEmpty;
  } else {
    aResult.numA = ns_wcstol(aPart, const_cast(&aResult.strB));
  }

  if (!*aResult.strB) {
    aResult.strB = nullptr;
    aResult.strBlen = 0;
  } else {
    if (aResult.strB[0] == '+') {
      static wchar_t kPre[] = L"pre";

      ++aResult.numA;
      aResult.strB = kPre;
      aResult.strBlen = sizeof(kPre) - 1;
    } else {
      const wchar_t* numstart = wcspbrk(aResult.strB, L"0123456789+-");
      if (!numstart) {
        aResult.strBlen = wcslen(aResult.strB);
      } else {
        aResult.strBlen = numstart - aResult.strB;
        aResult.numC =
            ns_wcstol(numstart, const_cast(&aResult.extraD));

        if (!*aResult.extraD) {
          aResult.extraD = nullptr;
        }
      }
    }
  }

  if (dot) {
    ++dot;

    if (!*dot) {
      dot = nullptr;
    }
  }

  return dot;
}

Minimal test - lines (31, 40)

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

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

path: .spaces[1].metrics.mi.mi_visual_studio
old: 35.428854994671234
new: 65.44690228041927

path: .spaces[1].metrics.mi.mi_original
old: 60.583342040887814
new: 111.91420289951697

path: .spaces[1].metrics.mi.mi_sei
old: 12.211534427878291
new: 117.79452392841635

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

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

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

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

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

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

path: .spaces[1].metrics.loc.sloc
old: 68.0
new: 10.0

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

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

path: .spaces[1].metrics.loc.blank
old: 12.0
new: 1.0

path: .spaces[1].metrics.loc.ploc
old: 56.0
new: 7.0

path: .spaces[1].metrics.halstead.difficulty
old: 48.65853658536585
new: 2.0

path: .spaces[1].metrics.halstead.N2
old: 210.0
new: 6.0

path: .spaces[1].metrics.halstead.bugs
old: 0.8423751986917077
new: 0.008388055489567838

path: .spaces[1].metrics.halstead.n1
old: 19.0
new: 4.0

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

path: .spaces[1].metrics.halstead.length
old: 442.0
new: 19.0

path: .spaces[1].metrics.halstead.estimated_program_length
old: 300.37025494476956
new: 23.509775004326936

path: .spaces[1].metrics.halstead.purity_ratio
old: 0.6795707125447275
new: 1.237356579175102

path: .spaces[1].metrics.halstead.time
old: 7057.773791736633
new: 7.012959311428876

path: .spaces[1].metrics.halstead.vocabulary
old: 60.0
new: 10.0

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

path: .spaces[1].metrics.halstead.effort
old: 127039.9282512594
new: 126.23326760571976

path: .spaces[1].metrics.halstead.volume
old: 2610.845643258965
new: 63.11663380285988

path: .spaces[1].metrics.halstead.level
old: 0.02055137844611529
new: 0.5

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

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

Code

struct VersionPartW {
  int32_t numA;

  wchar_t* strB;  // NOT null-terminated, can be a null pointer
  uint32_t strBlen;

  int32_t numC;

  wchar_t* extraD;  // null-terminated
};

Minimal test - lines (236, 262)

path: .spaces[7].metrics.cyclomatic.average
old: 1.0
new: 9.0

path: .spaces[7].metrics.cyclomatic.sum
old: 1.0
new: 9.0

path: .spaces[7].metrics.nargs.average
old: 1.0
new: 4.0

path: .spaces[7].metrics.nargs.sum
old: 1.0
new: 4.0

path: .spaces[7].metrics.cognitive.average
old: 0.0
new: 9.0

path: .spaces[7].metrics.cognitive.sum
old: 0.0
new: 9.0

path: .spaces[7].metrics.nexits.sum
old: 0.0
new: 6.0

path: .spaces[7].metrics.nexits.average
old: 0.0
new: 6.0

path: .spaces[7].metrics.halstead.estimated_program_length
old: 23.21928094887362
new: 104.71062275542812

path: .spaces[7].metrics.halstead.N2
old: 7.0
new: 29.0

path: .spaces[7].metrics.halstead.length
old: 15.0
new: 94.0

path: .spaces[7].metrics.halstead.volume
old: 49.82892142331043
new: 446.9594252033661

path: .spaces[7].metrics.halstead.effort
old: 174.40122498158652
new: 15392.16520544092

path: .spaces[7].metrics.halstead.difficulty
old: 3.5
new: 34.4375

path: .spaces[7].metrics.halstead.vocabulary
old: 10.0
new: 27.0

path: .spaces[7].metrics.halstead.level
old: 0.2857142857142857
new: 0.029038112522686024

path: .spaces[7].metrics.halstead.bugs
old: 0.010405072229378904
new: 0.206258516269291

path: .spaces[7].metrics.halstead.purity_ratio
old: 1.5479520632582413
new: 1.113942795270512

path: .spaces[7].metrics.halstead.time
old: 9.688956943421474
new: 855.1202891911621

path: .spaces[7].metrics.halstead.N1
old: 8.0
new: 65.0

path: .spaces[7].metrics.halstead.n2
old: 5.0
new: 8.0

path: .spaces[7].metrics.halstead.n1
old: 5.0
new: 19.0

path: .spaces[7].metrics.loc.lloc
old: 2.0
new: 12.0

path: .spaces[7].metrics.loc.ploc
old: 6.0
new: 21.0

path: .spaces[7].metrics.loc.sloc
old: 6.0
new: 27.0

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

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

path: .spaces[7].metrics.mi.mi_visual_studio
old: 71.00514599442104
new: 49.00854392469018

path: .spaces[7].metrics.mi.mi_original
old: 121.41879965046
new: 83.8046101112202

path: .spaces[7].metrics.mi.mi_sei
old: 99.57126799380096
new: 60.80727524770389

Code

static int32_t ns_strnncmp(const char* aStr1, uint32_t aLen1, const char* aStr2,
                           uint32_t aLen2) {
  // any string is *before* no string
  if (!aStr1) {
    return aStr2 != 0;
  }

  if (!aStr2) {
    return -1;
  }

  for (; aLen1 && aLen2; --aLen1, --aLen2, ++aStr1, ++aStr2) {
    if (*aStr1 < *aStr2) {
      return -1;
    }

    if (*aStr1 > *aStr2) {
      return 1;
    }
  }

  if (aLen1 == 0) {
    return aLen2 == 0 ? 0 : -1;
  }

  return 1;
}

Minimal test - lines (222, 233)

path: .spaces[6].metrics.cognitive.sum
old: 1.0
new: 2.0

path: .spaces[6].metrics.cognitive.average
old: 1.0
new: 2.0

path: .spaces[6].metrics.cyclomatic.average
old: 2.0
new: 3.0

path: .spaces[6].metrics.cyclomatic.sum
old: 2.0
new: 3.0

path: .spaces[6].metrics.mi.mi_visual_studio
old: 58.21377055906012
new: 60.94238778692351

path: .spaces[6].metrics.mi.mi_sei
old: 68.11665567267298
new: 96.57273942851076

path: .spaces[6].metrics.mi.mi_original
old: 99.5455476559928
new: 104.2114831156392

path: .spaces[6].metrics.loc.ploc
old: 12.0
new: 9.0

path: .spaces[6].metrics.loc.sloc
old: 14.0
new: 12.0

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

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

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

path: .spaces[6].metrics.halstead.length
old: 52.0
new: 36.0

path: .spaces[6].metrics.halstead.volume
old: 228.40050598449557
new: 144.0

path: .spaces[6].metrics.halstead.n2
old: 11.0
new: 6.0

path: .spaces[6].metrics.halstead.bugs
old: 0.05954978847813364
new: 0.0401108038901437

path: .spaces[6].metrics.halstead.difficulty
old: 10.454545454545457
new: 9.166666666666666

path: .spaces[6].metrics.halstead.vocabulary
old: 21.0
new: 16.0

path: .spaces[6].metrics.halstead.time
old: 132.65685953644945
new: 73.33333333333333

path: .spaces[6].metrics.halstead.N1
old: 29.0
new: 25.0

path: .spaces[6].metrics.halstead.effort
old: 2387.82347165609
new: 1320.0

path: .spaces[6].metrics.halstead.N2
old: 23.0
new: 11.0

path: .spaces[6].metrics.halstead.estimated_program_length
old: 71.27302875388389
new: 48.72905595320056

path: .spaces[6].metrics.halstead.level
old: 0.09565217391304348
new: 0.1090909090909091

path: .spaces[6].metrics.halstead.purity_ratio
old: 1.370635168343921
new: 1.3535848875889045

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

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

Code

static int32_t ns_strcmp(const char* aStr1, const char* aStr2) {
  // any string is *before* no string
  if (!aStr1) {
    return aStr2 != 0;
  }

  if (!aStr2) {
    return -1;
  }

  return strcmp(aStr1, aStr2);
}

Minimal test - lines (139, 154)

path: .spaces[4].metrics.nexits.average
old: 3.3333333333333335
new: 3.0

path: .spaces[4].metrics.nexits.sum
old: 10.0
new: 3.0

path: .spaces[4].metrics.cyclomatic.average
old: 9.666666666666666
new: 3.0

path: .spaces[4].metrics.cyclomatic.sum
old: 29.0
new: 3.0

path: .spaces[4].metrics.halstead.estimated_program_length
old: 293.5877465509226
new: 101.62290894278166

path: .spaces[4].metrics.halstead.bugs
old: 0.9838338031161136
new: 0.08126901714648174

path: .spaces[4].metrics.halstead.effort
old: 160348.34890912392
new: 3806.881806419626

path: .spaces[4].metrics.halstead.n1
old: 19.0
new: 15.0

path: .spaces[4].metrics.halstead.level
old: 0.018306636155606407
new: 0.0761904761904762

path: .spaces[4].metrics.halstead.time
old: 8908.24160606244
new: 211.49343368997927

path: .spaces[4].metrics.halstead.N1
old: 269.0
new: 40.0

path: .spaces[4].metrics.halstead.difficulty
old: 54.625
new: 13.125

path: .spaces[4].metrics.halstead.length
old: 499.0
new: 61.0

path: .spaces[4].metrics.halstead.purity_ratio
old: 0.5883521974968389
new: 1.665949326930847

path: .spaces[4].metrics.halstead.n2
old: 40.0
new: 12.0

path: .spaces[4].metrics.halstead.vocabulary
old: 59.0
new: 27.0

path: .spaces[4].metrics.halstead.volume
old: 2935.438881631559
new: 290.04813763197154

path: .spaces[4].metrics.halstead.N2
old: 230.0
new: 21.0

path: .spaces[4].metrics.nom.functions
old: 3.0
new: 1.0

path: .spaces[4].metrics.nom.total
old: 3.0
new: 1.0

path: .spaces[4].metrics.cognitive.average
old: 11.333333333333334
new: 2.0

path: .spaces[4].metrics.cognitive.sum
old: 34.0
new: 2.0

path: .spaces[4].metrics.loc.sloc
old: 108.0
new: 16.0

path: .spaces[4].metrics.loc.blank
old: 18.0
new: 3.0

path: .spaces[4].metrics.loc.lloc
old: 62.0
new: 6.0

path: .spaces[4].metrics.loc.ploc
old: 89.0
new: 12.0

path: .spaces[4].metrics.mi.mi_sei
old: 2.4261326510817405
new: 81.8576393562118

path: .spaces[4].metrics.mi.mi_original
old: 46.95949039532192
new: 95.90981881430868

path: .spaces[4].metrics.mi.mi_visual_studio
old: 27.46169028966194
new: 56.08761334170098

path: .spaces[4].metrics.nargs.sum
old: 6.0
new: 2.0

Code

static int32_t ns_wcstol(const wchar_t* aPart, wchar_t** aNext) {
  errno = 0;
  long result_long = wcstol(aPart, aNext, 10);

  // See above for the rationale for using 0 here.
  if (errno != 0) {
    return 0;
  }

  mozilla::CheckedInt result = result_long;
  if (!result.isValid()) {
    return 0;
  }

  return result.value();
}

Minimal test - lines (299, 324)

path: .spaces[10].metrics.halstead.vocabulary
old: 47.0
new: 28.0

path: .spaces[10].metrics.halstead.volume
old: 1016.4897598570076
new: 548.0384611145669

path: .spaces[10].metrics.halstead.length
old: 183.0
new: 114.0

path: .spaces[10].metrics.halstead.difficulty
old: 27.310344827586206
new: 17.625

path: .spaces[10].metrics.halstead.N2
old: 88.0
new: 47.0

path: .spaces[10].metrics.halstead.bugs
old: 0.30560857769743804
new: 0.1511838919172457

path: .spaces[10].metrics.halstead.effort
old: 27760.685855405176
new: 9659.17787714424

path: .spaces[10].metrics.halstead.n2
old: 29.0
new: 16.0

path: .spaces[10].metrics.halstead.n1
old: 18.0
new: 12.0

path: .spaces[10].metrics.halstead.N1
old: 95.0
new: 67.0

path: .spaces[10].metrics.halstead.estimated_program_length
old: 215.9400988846612
new: 107.01955000865388

path: .spaces[10].metrics.halstead.purity_ratio
old: 1.1800005403533398
new: 0.9387679825320516

path: .spaces[10].metrics.halstead.time
old: 1542.2603253002876
new: 536.62099317468

path: .spaces[10].metrics.halstead.level
old: 0.036616161616161616
new: 0.05673758865248227

path: .spaces[10].metrics.mi.mi_visual_studio
old: 42.23577965992596
new: 49.14961382763022

path: .spaces[10].metrics.mi.mi_sei
old: 49.20335454630021
new: 46.16258322796189

path: .spaces[10].metrics.mi.mi_original
old: 72.2231832184734
new: 84.04583964524767

path: .spaces[10].metrics.loc.cloc
old: 3.0
new: 0.0

path: .spaces[10].metrics.loc.blank
old: 6.0
new: 5.0

path: .spaces[10].metrics.loc.ploc
old: 34.0
new: 21.0

path: .spaces[10].metrics.loc.lloc
old: 18.0
new: 13.0

path: .spaces[10].metrics.loc.sloc
old: 43.0
new: 26.0

path: .spaces[10].metrics.cyclomatic.sum
old: 8.0
new: 6.0

path: .spaces[10].metrics.cyclomatic.average
old: 8.0
new: 6.0

path: .spaces[10].metrics.cognitive.sum
old: 11.0
new: 5.0

path: .spaces[10].metrics.cognitive.average
old: 11.0
new: 5.0

path: .spaces[10].metrics.nexits.sum
old: 2.0
new: 6.0

path: .spaces[10].metrics.nexits.average
old: 2.0
new: 6.0

path: .spaces[10].metrics.nargs.sum
old: 3.0
new: 2.0

path: .spaces[10].metrics.nargs.average
old: 3.0
new: 2.0

Code

static int32_t CompareVP(VersionPartW& aVer1, VersionPartW& aVer2) {
  int32_t r = ns_cmp(aVer1.numA, aVer2.numA);
  if (r) {
    return r;
  }

  r = wcsncmp(aVer1.strB, aVer2.strB, XPCOM_MIN(aVer1.strBlen, aVer2.strBlen));
  if (r) {
    return r;
  }

  r = ns_cmp(aVer1.numC, aVer2.numC);
  if (r) {
    return r;
  }

  if (!aVer1.extraD) {
    return aVer2.extraD != 0;
  }

  if (!aVer2.extraD) {
    return -1;
  }

  return wcscmp(aVer1.extraD, aVer2.extraD);
}

Minimal test - lines (265, 271)

path: .spaces[8].metrics.halstead.n2
old: 12.0
new: 4.0

path: .spaces[8].metrics.halstead.volume
old: 171.8953543301665
new: 85.11011351724513

path: .spaces[8].metrics.halstead.N2
old: 18.0
new: 8.0

path: .spaces[8].metrics.halstead.estimated_program_length
old: 81.07329781366414
new: 36.529325012980806

path: .spaces[8].metrics.halstead.bugs
old: 0.042075001229485993
new: 0.02790580347525356

path: .spaces[8].metrics.halstead.difficulty
old: 8.25
new: 9.0

path: .spaces[8].metrics.halstead.length
old: 38.0
new: 23.0

path: .spaces[8].metrics.halstead.purity_ratio
old: 2.133507837201688
new: 1.5882315223035133

path: .spaces[8].metrics.halstead.level
old: 0.12121212121212122
new: 0.1111111111111111

path: .spaces[8].metrics.halstead.vocabulary
old: 23.0
new: 13.0

path: .spaces[8].metrics.halstead.n1
old: 11.0
new: 9.0

path: .spaces[8].metrics.halstead.effort
old: 1418.1366732238737
new: 765.9910216552062

path: .spaces[8].metrics.halstead.time
old: 78.78537073465965
new: 42.55505675862256

path: .spaces[8].metrics.halstead.N1
old: 20.0
new: 15.0

path: .spaces[8].metrics.mi.mi_visual_studio
old: 61.3627426727086
new: 67.78230237120323

path: .spaces[8].metrics.mi.mi_sei
old: 75.88519670603468
new: 91.72230517635676

path: .spaces[8].metrics.mi.mi_original
old: 104.9302899703317
new: 115.90773705475752

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

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

path: .spaces[8].metrics.loc.blank
old: 2.0
new: 1.0

path: .spaces[8].metrics.loc.ploc
old: 9.0
new: 6.0

path: .spaces[8].metrics.loc.sloc
old: 11.0
new: 7.0

path: .spaces[8].metrics.loc.lloc
old: 4.0
new: 3.0

Code

static int32_t ns_cmp(int32_t aNum1, int32_t aNum2) {
  if (aNum1 < aNum2) {
    return -1;
  }

  return aNum1 != aNum2;
}

Minimal test - lines (71, 130)

path: .spaces[3].metrics.nexits.average
old: 0.5
new: 2.0

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

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

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

path: .spaces[3].metrics.halstead.time
old: 276.69643130741065
new: 3577.3320863591907

path: .spaces[3].metrics.halstead.n1
old: 13.0
new: 21.0

path: .spaces[3].metrics.halstead.vocabulary
old: 25.0
new: 45.0

path: .spaces[3].metrics.halstead.purity_ratio
old: 1.3806858537043647
new: 0.7547677831927676

path: .spaces[3].metrics.halstead.volume
old: 306.49450852513183
new: 1471.8166298163528

path: .spaces[3].metrics.halstead.difficulty
old: 16.25
new: 43.75

path: .spaces[3].metrics.halstead.N2
old: 30.0
new: 100.0

path: .spaces[3].metrics.halstead.estimated_program_length
old: 91.12526634448808
new: 202.27776589566173

path: .spaces[3].metrics.halstead.effort
old: 4980.535763533392
new: 64391.97755446543

path: .spaces[3].metrics.halstead.length
old: 66.0
new: 268.0

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

path: .spaces[3].metrics.halstead.bugs
old: 0.0972141434389765
new: 0.5355087695494655

path: .spaces[3].metrics.halstead.level
old: 0.06153846153846154
new: 0.022857142857142857

path: .spaces[3].metrics.halstead.n2
old: 12.0
new: 24.0

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

path: .spaces[3].metrics.nargs.sum
old: 3.0
new: 0.0

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

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

path: .spaces[3].metrics.mi.mi_visual_studio
old: 56.66581729939733
new: 37.55058710593923

path: .spaces[3].metrics.mi.mi_original
old: 96.89854758196944
new: 64.21150395115609

path: .spaces[3].metrics.mi.mi_sei
old: 64.29784179264676
new: 18.05678477979129

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

path: .spaces[3].metrics.cyclomatic.sum
old: 2.0
new: 11.0

path: .spaces[3].metrics.loc.blank
old: 2.0
new: 10.0

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

path: .spaces[3].metrics.loc.sloc
old: 15.0
new: 60.0

path: .spaces[3].metrics.loc.ploc
old: 13.0
new: 50.0

Code

static char* ParseVP(char* aPart, VersionPart& aResult) {
  char* dot;

  aResult.numA = 0;
  aResult.strB = nullptr;
  aResult.strBlen = 0;
  aResult.numC = 0;
  aResult.extraD = nullptr;

  if (!aPart) {
    return aPart;
  }

  dot = strchr(aPart, '.');
  if (dot) {
    *dot = '\0';
  }

  if (aPart[0] == '*' && aPart[1] == '\0') {
    aResult.numA = INT32_MAX;
    aResult.strB = "";
  } else {
    aResult.numA = ns_strtol(aPart, const_cast(&aResult.strB));
  }

  if (!*aResult.strB) {
    aResult.strB = nullptr;
    aResult.strBlen = 0;
  } else {
    if (aResult.strB[0] == '+') {
      static const char kPre[] = "pre";

      ++aResult.numA;
      aResult.strB = kPre;
      aResult.strBlen = sizeof(kPre) - 1;
    } else {
      const char* numstart = strpbrk(aResult.strB, "0123456789+-");
      if (!numstart) {
        aResult.strBlen = strlen(aResult.strB);
      } else {
        aResult.strBlen = numstart - aResult.strB;
        aResult.numC = ns_strtol(numstart, const_cast(&aResult.extraD));

        if (!*aResult.extraD) {
          aResult.extraD = nullptr;
        }
      }
    }
  }

  if (dot) {
    ++dot;

    if (!*dot) {
      dot = nullptr;
    }
  }

  return dot;
}

Minimal test - lines (19, 28)

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.halstead.difficulty
old: 16.176470588235293
new: 2.0

path: .spaces[0].metrics.halstead.n2
old: 34.0
new: 6.0

path: .spaces[0].metrics.halstead.estimated_program_length
old: 211.0274844075218
new: 23.509775004326936

path: .spaces[0].metrics.halstead.volume
old: 1120.3380316512537
new: 63.11663380285988

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

path: .spaces[0].metrics.halstead.effort
old: 18123.115217887927
new: 126.23326760571976

path: .spaces[0].metrics.halstead.length
old: 204.0
new: 19.0

path: .spaces[0].metrics.halstead.bugs
old: 0.2299856009097745
new: 0.008388055489567838

path: .spaces[0].metrics.halstead.time
old: 1006.8397343271072
new: 7.012959311428876

path: .spaces[0].metrics.halstead.level
old: 0.06181818181818182
new: 0.5

path: .spaces[0].metrics.halstead.vocabulary
old: 45.0
new: 10.0

path: .spaces[0].metrics.halstead.N1
old: 104.0
new: 13.0

path: .spaces[0].metrics.halstead.N2
old: 100.0
new: 6.0

path: .spaces[0].metrics.halstead.purity_ratio
old: 1.034448452978048
new: 1.237356579175102

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

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

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

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

path: .spaces[0].metrics.loc.ploc
old: 23.0
new: 7.0

path: .spaces[0].metrics.loc.sloc
old: 27.0
new: 10.0

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

path: .spaces[0].metrics.mi.mi_sei
old: 41.066286905729754
new: 117.79452392841635

path: .spaces[0].metrics.mi.mi_original
old: 80.86623696055054
new: 111.91420289951697

path: .spaces[0].metrics.mi.mi_visual_studio
old: 47.29019705295353
new: 65.44690228041927

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

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

Code

struct VersionPart {
  int32_t numA;

  const char* strB;  // NOT null-terminated, can be a null pointer
  uint32_t strBlen;

  int32_t numC;

  char* extraD;  // null-terminated
};

Minimal test - lines (43, 64)

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

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

path: .spaces[2].metrics.nexits.sum
old: 1.0
new: 3.0

path: .spaces[2].metrics.nexits.average
old: 0.5
new: 3.0

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

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

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

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

path: .spaces[2].metrics.halstead.N2
old: 62.0
new: 21.0

path: .spaces[2].metrics.halstead.difficulty
old: 25.1875
new: 13.125

path: .spaces[2].metrics.halstead.length
old: 139.0
new: 61.0

path: .spaces[2].metrics.halstead.effort
old: 17008.095087753823
new: 3806.881806419626

path: .spaces[2].metrics.halstead.level
old: 0.03970223325062035
new: 0.0761904761904762

path: .spaces[2].metrics.halstead.bugs
old: 0.22045292327814067
new: 0.08126901714648174

path: .spaces[2].metrics.halstead.estimated_program_length
old: 112.1057163358342
new: 101.62290894278166

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

path: .spaces[2].metrics.halstead.time
old: 944.8941715418792
new: 211.49343368997927

path: .spaces[2].metrics.halstead.vocabulary
old: 29.0
new: 27.0

path: .spaces[2].metrics.halstead.N1
old: 77.0
new: 40.0

path: .spaces[2].metrics.halstead.n2
old: 16.0
new: 12.0

path: .spaces[2].metrics.halstead.purity_ratio
old: 0.8065159448621164
new: 1.665949326930847

path: .spaces[2].metrics.halstead.volume
old: 675.2593583227325
new: 290.04813763197154

path: .spaces[2].metrics.nargs.average
old: 1.5
new: 2.0

path: .spaces[2].metrics.nargs.sum
old: 3.0
new: 2.0

path: .spaces[2].metrics.mi.mi_original
old: 84.51570800868235
new: 90.7508683701884

path: .spaces[2].metrics.mi.mi_sei
old: 46.433180548141905
new: 93.87114169268705

path: .spaces[2].metrics.mi.mi_visual_studio
old: 49.42439064835226
new: 53.07068325742013

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

path: .spaces[2].metrics.loc.ploc
old: 20.0
new: 12.0

path: .spaces[2].metrics.loc.sloc
old: 25.0
new: 22.0

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

path: .spaces[2].metrics.loc.lloc
old: 10.0
new: 6.0

Code

static int32_t ns_strtol(const char* aPart, char** aNext) {
  errno = 0;
  long result_long = strtol(aPart, aNext, 10);

  // Different platforms seem to disagree on what to return when the value
  // is out of range so we ensure that it is always what we want it to be.
  // We choose 0 firstly because that is the default when the number doesn't
  // exist at all and also because it would be easier to recover from should
  // you somehow end up in a situation where an old version is invalid. It is
  // much easier to create a version either larger or smaller than 0, much
  // harder to do the same with INT_MAX.
  if (errno != 0) {
    return 0;
  }

  mozilla::CheckedInt result = result_long;
  if (!result.isValid()) {
    return 0;
  }

  return result.value();
}