Global Metrics

path: .metrics.cyclomatic.sum
old: 20.0
new: 12.0

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

path: .metrics.mi.mi_original
old: 31.66001785761931
new: 54.03992747449787

path: .metrics.mi.mi_sei
old: 6.7193704208199705
new: 34.47948733819692

path: .metrics.mi.mi_visual_studio
old: 18.51463032609316
new: 31.602296768712208

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

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

path: .metrics.nexits.average
old: 0.26666666666666666
new: 0.25

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

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

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

path: .metrics.nargs.average
old: 0.9333333333333332
new: 2.5

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

path: .metrics.halstead.estimated_program_length
old: 481.4866257866323
new: 374.4314753670902

path: .metrics.halstead.purity_ratio
old: 0.6102492088550473
new: 1.2078434689260973

path: .metrics.halstead.time
old: 13887.906545443686
new: 2913.6476894359935

path: .metrics.halstead.volume
old: 5057.009448612646
new: 1906.4216070464515

path: .metrics.halstead.difficulty
old: 49.43283582089552
new: 27.51

path: .metrics.halstead.level
old: 0.020229468599033816
new: 0.03635041802980734

path: .metrics.halstead.bugs
old: 1.3227718343174604
new: 0.46703752187617587

path: .metrics.halstead.N1
old: 421.0
new: 179.0

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

path: .metrics.halstead.vocabulary
old: 85.0
new: 71.0

path: .metrics.halstead.n2
old: 67.0
new: 50.0

path: .metrics.halstead.effort
old: 249982.31781798633
new: 52445.658409847885

path: .metrics.halstead.N2
old: 368.0
new: 131.0

path: .metrics.halstead.length
old: 789.0
new: 310.0

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

path: .metrics.loc.lloc
old: 47.0
new: 19.0

path: .metrics.loc.cloc
old: 65.0
new: 19.0

path: .metrics.loc.sloc
old: 265.0
new: 102.0

path: .metrics.loc.ploc
old: 149.0
new: 81.0

Spaces Data

Minimal test - lines (42, 70)

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

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

path: .spaces[1].metrics.mi.mi_sei
old: 87.0839711908958
new: 65.26810548367183

path: .spaces[1].metrics.mi.mi_original
old: 88.52294225787176
new: 83.7157540016238

path: .spaces[1].metrics.mi.mi_visual_studio
old: 51.76780248998349
new: 48.95658128749929

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

path: .spaces[1].metrics.loc.lloc
old: 7.0
new: 8.0

path: .spaces[1].metrics.loc.sloc
old: 24.0
new: 29.0

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

path: .spaces[1].metrics.loc.ploc
old: 14.0
new: 27.0

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

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

path: .spaces[1].metrics.halstead.difficulty
old: 9.75
new: 15.0

path: .spaces[1].metrics.halstead.length
old: 78.0
new: 90.0

path: .spaces[1].metrics.halstead.vocabulary
old: 27.0
new: 33.0

path: .spaces[1].metrics.halstead.purity_ratio
old: 1.3280509620377232
new: 1.4851334328898822

path: .spaces[1].metrics.halstead.effort
old: 3616.0919453953175
new: 6809.932061133912

path: .spaces[1].metrics.halstead.N2
old: 39.0
new: 36.0

path: .spaces[1].metrics.halstead.N1
old: 39.0
new: 54.0

path: .spaces[1].metrics.halstead.time
old: 200.89399696640652
new: 378.329558951884

path: .spaces[1].metrics.halstead.estimated_program_length
old: 103.58797503894242
new: 133.6620089600894

path: .spaces[1].metrics.halstead.bugs
old: 0.07853050466071337
new: 0.11975875287263477

path: .spaces[1].metrics.halstead.level
old: 0.10256410256410256
new: 0.06666666666666667

path: .spaces[1].metrics.halstead.volume
old: 370.8812251687505
new: 453.9954707422608

path: .spaces[1].metrics.halstead.n1
old: 9.0
new: 15.0

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

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

Code

ProfilerBacktrace::ProfilerBacktrace(
    const char* aName,
    mozilla::ProfileChunkedBuffer* aExternalProfileChunkedBuffer,
    ProfileBuffer* aExternalProfileBuffer)
    : mName(aName),
      mProfileChunkedBuffer(aExternalProfileChunkedBuffer),
      mProfileBuffer(aExternalProfileBuffer) {
  MOZ_COUNT_CTOR(ProfilerBacktrace);
  if (!mProfileChunkedBuffer) {
    if (mProfileBuffer) {
      // We don't have a ProfileChunkedBuffer but we have a ProfileBuffer, use
      // the latter's ProfileChunkedBuffer.
      mProfileChunkedBuffer = &mProfileBuffer->UnderlyingChunkedBuffer();
      MOZ_ASSERT(!mProfileChunkedBuffer->IsThreadSafe(),
                 "ProfilerBacktrace only takes a non-thread-safe "
                 "ProfileChunkedBuffer");
    }
  } else {
    if (mProfileBuffer) {
      MOZ_RELEASE_ASSERT(
          mProfileChunkedBuffer == &mProfileBuffer->UnderlyingChunkedBuffer(),
          "If we reference both ProfileChunkedBuffer and ProfileBuffer, they "
          "must already be connected");
    }
    MOZ_ASSERT(!mProfileChunkedBuffer->IsThreadSafe(),
               "ProfilerBacktrace only takes a non-thread-safe "
               "ProfileChunkedBuffer");
  }
}

Minimal test - lines (15, 40)

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

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

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

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

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

path: .spaces[0].metrics.loc.cloc
old: 26.0
new: 1.0

path: .spaces[0].metrics.loc.lloc
old: 9.0
new: 5.0

path: .spaces[0].metrics.loc.blank
old: 13.0
new: 0.0

path: .spaces[0].metrics.loc.ploc
old: 42.0
new: 26.0

path: .spaces[0].metrics.loc.sloc
old: 81.0
new: 26.0

path: .spaces[0].metrics.cyclomatic.sum
old: 14.0
new: 3.0

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

path: .spaces[0].metrics.halstead.N1
old: 84.0
new: 55.0

path: .spaces[0].metrics.halstead.level
old: 0.06153846153846154
new: 0.07058823529411765

path: .spaces[0].metrics.halstead.vocabulary
old: 37.0
new: 41.0

path: .spaces[0].metrics.halstead.volume
old: 750.1612846505689
new: 508.967440438718

path: .spaces[0].metrics.halstead.difficulty
old: 16.25
new: 14.166666666666666

path: .spaces[0].metrics.halstead.length
old: 144.0
new: 95.0

path: .spaces[0].metrics.halstead.n1
old: 13.0
new: 17.0

path: .spaces[0].metrics.halstead.estimated_program_length
old: 158.14481635314195
new: 179.5259683185635

path: .spaces[0].metrics.halstead.purity_ratio
old: 1.0982278913412635
new: 1.8897470349322476

path: .spaces[0].metrics.halstead.bugs
old: 0.17655665274402377
new: 0.12440863619777662

path: .spaces[0].metrics.halstead.time
old: 677.2289375317636
new: 400.5762262712132

path: .spaces[0].metrics.halstead.effort
old: 12190.120875571743
new: 7210.372072881838

path: .spaces[0].metrics.halstead.N2
old: 60.0
new: 40.0

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

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

path: .spaces[0].metrics.mi.mi_visual_studio
old: 36.353464853990715
new: 49.77803452671861

path: .spaces[0].metrics.mi.mi_sei
old: 53.87274130533392
new: 62.365900579712545

path: .spaces[0].metrics.mi.mi_original
old: 62.16442490032412
new: 85.12043904068884

Code

ProfilerBacktrace::ProfilerBacktrace(
    const char* aName,
    mozilla::UniquePtr
        aProfileChunkedBufferStorage,
    mozilla::UniquePtr
        aProfileBufferStorageOrNull /* = nullptr */)
    : mName(aName),
      mOptionalProfileChunkedBufferStorage(
          std::move(aProfileChunkedBufferStorage)),
      mProfileChunkedBuffer(mOptionalProfileChunkedBufferStorage.get()),
      mOptionalProfileBufferStorage(std::move(aProfileBufferStorageOrNull)),
      mProfileBuffer(mOptionalProfileBufferStorage.get()) {
  MOZ_COUNT_CTOR(ProfilerBacktrace);
  if (mProfileBuffer) {
    MOZ_RELEASE_ASSERT(mProfileChunkedBuffer,
                       "If we take ownership of a ProfileBuffer, we must also "
                       "receive ownership of a ProfileChunkedBuffer");
    MOZ_RELEASE_ASSERT(
        mProfileChunkedBuffer == &mProfileBuffer->UnderlyingChunkedBuffer(),
        "If we take ownership of a ProfileBuffer, we must also receive "
        "ownership of its ProfileChunkedBuffer");
  }
  MOZ_ASSERT(
      !mProfileChunkedBuffer || !mProfileChunkedBuffer->IsThreadSafe(),
      "ProfilerBacktrace only takes a non-thread-safe ProfileChunkedBuffer");
}

Minimal test - lines (72, 72)

path: .spaces[2].metrics.halstead.bugs
old: 0.1609764176447935
new: 0.006927759642225941

path: .spaces[2].metrics.halstead.effort
old: 10612.684896647528
new: 94.74822861944416

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

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

path: .spaces[2].metrics.halstead.difficulty
old: 14.142857142857142
new: 3.75

path: .spaces[2].metrics.halstead.level
old: 0.0707070707070707
new: 0.26666666666666666

path: .spaces[2].metrics.halstead.N1
old: 75.0
new: 6.0

path: .spaces[2].metrics.halstead.N2
old: 66.0
new: 3.0

path: .spaces[2].metrics.halstead.n2
old: 28.0
new: 2.0

path: .spaces[2].metrics.halstead.time
old: 589.5936053693072
new: 5.2637904788580085

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

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

path: .spaces[2].metrics.halstead.purity_ratio
old: 1.2597552328104027
new: 1.5121822749374234

path: .spaces[2].metrics.halstead.estimated_program_length
old: 177.62548782626678
new: 13.60964047443681

path: .spaces[2].metrics.mi.mi_visual_studio
old: 46.05044709583131
new: 90.04489473439764

path: .spaces[2].metrics.mi.mi_sei
old: 69.94330373178894
new: 146.54249035246173

path: .spaces[2].metrics.mi.mi_original
old: 78.74626453387155
new: 153.97676999581998

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

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

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

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

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

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

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

Code

ProfilerBacktrace::~ProfilerBacktrace() { MOZ_COUNT_DTOR(ProfilerBacktrace); }

Minimal test - lines (74, 102)

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

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

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

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

path: .spaces[3].metrics.halstead.length
old: 152.0
new: 111.0

path: .spaces[3].metrics.halstead.estimated_program_length
old: 171.40151256706753
new: 123.1643663617958

path: .spaces[3].metrics.halstead.time
old: 684.3617095237935
new: 518.5162777264634

path: .spaces[3].metrics.halstead.N2
old: 69.0
new: 47.0

path: .spaces[3].metrics.halstead.purity_ratio
old: 1.1276415300464968
new: 1.1095888861423044

path: .spaces[3].metrics.halstead.effort
old: 12318.510771428282
new: 9333.29299907634

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

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

path: .spaces[3].metrics.halstead.level
old: 0.06521739130434782
new: 0.058919803600654665

path: .spaces[3].metrics.halstead.difficulty
old: 15.333333333333334
new: 16.97222222222222

path: .spaces[3].metrics.halstead.bugs
old: 0.17779418404574124
new: 0.14776401342432008

path: .spaces[3].metrics.halstead.volume
old: 803.3811372670618
new: 549.9157904529432

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

path: .spaces[3].metrics.halstead.N1
old: 83.0
new: 64.0

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

path: .spaces[3].metrics.loc.sloc
old: 35.0
new: 29.0

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

path: .spaces[3].metrics.loc.cloc
old: 6.0
new: 11.0

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

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

path: .spaces[3].metrics.cyclomatic.sum
old: 1.0
new: 3.0

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

path: .spaces[3].metrics.mi.mi_visual_studio
old: 45.84295283051471
new: 48.50820393648385

path: .spaces[3].metrics.mi.mi_original
old: 78.39144934018016
new: 82.94902873138739

path: .spaces[3].metrics.mi.mi_sei
old: 67.41289347982155
new: 85.06501419518486

Code

int ProfilerBacktrace::StreamJSON(SpliceableJSONWriter& aWriter,
                                  const mozilla::TimeStamp& aProcessStartTime,
                                  UniqueStacks& aUniqueStacks) {
  int processedThreadId = 0;

  // Unlike ProfiledThreadData::StreamJSON, we don't need to call
  // ProfileBuffer::AddJITInfoForRange because ProfileBuffer does not contain
  // any JitReturnAddr entries. For synchronous samples, JIT frames get expanded
  // at sample time.
  if (mProfileBuffer) {
    processedThreadId =
        StreamSamplesAndMarkers(mName.c_str(), 0, *mProfileBuffer, aWriter,
                                ""_ns, ""_ns, aProcessStartTime,
                                /* aRegisterTime */ mozilla::TimeStamp(),
                                /* aUnregisterTime */ mozilla::TimeStamp(),
                                /* aSinceTime */ 0, aUniqueStacks);
  } else if (mProfileChunkedBuffer) {
    ProfileBuffer profileBuffer(*mProfileChunkedBuffer);
    processedThreadId =
        StreamSamplesAndMarkers(mName.c_str(), 0, profileBuffer, aWriter, ""_ns,
                                ""_ns, aProcessStartTime,
                                /* aRegisterTime */ mozilla::TimeStamp(),
                                /* aUnregisterTime */ mozilla::TimeStamp(),
                                /* aSinceTime */ 0, aUniqueStacks);
  }
  // If there are no buffers, the backtrace is empty and nothing is streamed.

  return processedThreadId;
}