Global Metrics

path: .metrics.nargs.average
old: 1.5128205128205128
new: 2.0

path: .metrics.nargs.sum
old: 59.0
new: 26.0

path: .metrics.cognitive.sum
old: 160.0
new: 9.0

path: .metrics.cognitive.average
old: 4.102564102564102
new: 0.6923076923076923

path: .metrics.cyclomatic.average
old: 6.0476190476190474
new: 1.6428571428571428

path: .metrics.cyclomatic.sum
old: 254.0
new: 23.0

path: .metrics.loc.blank
old: 141.0
new: 50.0

path: .metrics.loc.cloc
old: 165.0
new: 62.0

path: .metrics.loc.sloc
old: 1135.0
new: 310.0

path: .metrics.loc.ploc
old: 829.0
new: 198.0

path: .metrics.loc.lloc
old: 375.0
new: 86.0

path: .metrics.halstead.length
old: 4261.0
new: 1306.0

path: .metrics.halstead.time
old: 108635.26180757231
new: 30243.312664972986

path: .metrics.halstead.purity_ratio
old: 1.162666123643572
new: 0.4849689063245088

path: .metrics.halstead.N1
old: 2482.0
new: 744.0

path: .metrics.halstead.effort
old: 1955434.712536302
new: 544379.6279695136

path: .metrics.halstead.bugs
old: 5.212438680073819
new: 2.2223544219873395

path: .metrics.halstead.level
old: 0.019898819561551435
new: 0.01610788537179247

path: .metrics.halstead.N2
old: 1779.0
new: 562.0

path: .metrics.halstead.estimated_program_length
old: 4954.120352845261
new: 633.3693916598086

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

path: .metrics.halstead.n2
old: 531.0
new: 86.0

path: .metrics.halstead.vocabulary
old: 561.0
new: 105.0

path: .metrics.halstead.difficulty
old: 50.25423728813559
new: 62.08139534883721

path: .metrics.halstead.volume
old: 38910.84250915407
new: 8768.804646071956

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

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

path: .metrics.mi.mi_original
old: -56.33603120088797
new: 25.566958746975445

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

path: .metrics.mi.mi_sei
old: -103.26817092457038
new: -4.538180097985652

path: .metrics.nom.functions
old: 39.0
new: 13.0

path: .metrics.nom.total
old: 39.0
new: 13.0

Spaces Data

Minimal test - lines (67, 74)

path: .spaces[4].metrics.halstead.level
old: 0.08627450980392157
new: 0.2222222222222222

path: .spaces[4].metrics.halstead.time
old: 278.42949617054734
new: 30.0

path: .spaces[4].metrics.halstead.length
old: 83.0
new: 30.0

path: .spaces[4].metrics.halstead.purity_ratio
old: 1.888082584869257
new: 1.6243018651066852

path: .spaces[4].metrics.halstead.volume
old: 432.38462934720286
new: 120.0

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

path: .spaces[4].metrics.halstead.N1
old: 49.0
new: 15.0

path: .spaces[4].metrics.halstead.vocabulary
old: 37.0
new: 16.0

path: .spaces[4].metrics.halstead.N2
old: 34.0
new: 15.0

path: .spaces[4].metrics.halstead.estimated_program_length
old: 156.71085454414833
new: 48.72905595320056

path: .spaces[4].metrics.halstead.bugs
old: 0.09761964928073769
new: 0.022104188991842317

path: .spaces[4].metrics.halstead.n2
old: 22.0
new: 10.0

path: .spaces[4].metrics.halstead.difficulty
old: 11.590909090909092
new: 4.5

path: .spaces[4].metrics.halstead.effort
old: 5011.730931069852
new: 540.0

path: .spaces[4].metrics.mi.mi_original
old: 93.83362190298604
new: 112.18808996232003

path: .spaces[4].metrics.mi.mi_visual_studio
old: 54.873463101161434
new: 65.60707015340354

path: .spaces[4].metrics.mi.mi_sei
old: 59.97790857428866
new: 121.22556242600818

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

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

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

path: .spaces[4].metrics.loc.ploc
old: 14.0
new: 6.0

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

path: .spaces[4].metrics.loc.blank
old: 2.0
new: 0.0

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

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

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

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

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

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

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

Code

TEST(ArenaAllocator, BadAlignment)
{
  // This test causes build failures by triggering the static assert enforcing
  // a power-of-two alignment.
  ArenaAllocator<256, 3> a;
  ArenaAllocator<256, 7> b;
  ArenaAllocator<256, 17> c;
}

Minimal test - lines (97, 104)

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

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

path: .spaces[6].metrics.loc.lloc
old: 6.0
new: 1.0

path: .spaces[6].metrics.loc.ploc
old: 13.0
new: 7.0

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

path: .spaces[6].metrics.loc.sloc
old: 15.0
new: 8.0

path: .spaces[6].metrics.loc.blank
old: 2.0
new: 0.0

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

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

path: .spaces[6].metrics.halstead.N1
old: 45.0
new: 26.0

path: .spaces[6].metrics.halstead.n1
old: 14.0
new: 11.0

path: .spaces[6].metrics.halstead.effort
old: 4195.12185889503
new: 1913.293469362428

path: .spaces[6].metrics.halstead.N2
old: 31.0
new: 18.0

path: .spaces[6].metrics.halstead.bugs
old: 0.08670453212407479
new: 0.051372788298157376

path: .spaces[6].metrics.halstead.purity_ratio
old: 1.8387043527178115
new: 1.6198415625882705

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

path: .spaces[6].metrics.halstead.length
old: 76.0
new: 44.0

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

path: .spaces[6].metrics.halstead.difficulty
old: 10.85
new: 9.9

path: .spaces[6].metrics.halstead.time
old: 233.0623254941683
new: 106.294081631246

path: .spaces[6].metrics.halstead.level
old: 0.09216589861751152
new: 0.101010101010101

path: .spaces[6].metrics.halstead.n2
old: 20.0
new: 10.0

path: .spaces[6].metrics.halstead.volume
old: 386.64717593502576
new: 193.26196660226543

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

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

path: .spaces[6].metrics.mi.mi_sei
old: 62.32502825086047
new: 108.71626250306196

path: .spaces[6].metrics.mi.mi_original
old: 95.4605212892386
new: 109.71000466079514

path: .spaces[6].metrics.mi.mi_visual_studio
old: 55.824866251016715
new: 64.15789746245329

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

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

Code

TEST(ArenaAllocator, AllocateInDifferentChunks)
{
  // Test default 1-byte alignment.
  ArenaAllocator<4096> a;
  void* x = a.Allocate(4000);
  void* y = a.Allocate(4000);
  EXPECT_NE(uintptr_t(x) + 4000, uintptr_t(y));
}

Minimal test - lines (234, 278)

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

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

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

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

path: .spaces[11].metrics.halstead.N1
old: 20.0
new: 92.0

path: .spaces[11].metrics.halstead.purity_ratio
old: 2.235902344426084
new: 0.7660243308071072

path: .spaces[11].metrics.halstead.bugs
old: 0.036044128904624655
new: 0.24165245105969993

path: .spaces[11].metrics.halstead.n2
old: 9.0
new: 20.0

path: .spaces[11].metrics.halstead.level
old: 0.125
new: 0.04329004329004329

path: .spaces[11].metrics.halstead.vocabulary
old: 21.0
new: 32.0

path: .spaces[11].metrics.halstead.volume
old: 140.55415752892034
new: 845.0

path: .spaces[11].metrics.halstead.difficulty
old: 8.0
new: 23.1

path: .spaces[11].metrics.halstead.estimated_program_length
old: 71.54887502163469
new: 129.45811190640111

path: .spaces[11].metrics.halstead.length
old: 32.0
new: 169.0

path: .spaces[11].metrics.halstead.N2
old: 12.0
new: 77.0

path: .spaces[11].metrics.halstead.effort
old: 1124.4332602313627
new: 19519.5

path: .spaces[11].metrics.halstead.time
old: 62.46851445729793
new: 1084.4166666666667

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

path: .spaces[11].metrics.loc.ploc
old: 4.0
new: 28.0

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

path: .spaces[11].metrics.loc.cloc
old: 0.0
new: 8.0

path: .spaces[11].metrics.loc.sloc
old: 4.0
new: 45.0

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

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

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

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

path: .spaces[11].metrics.mi.mi_sei
old: 101.26809194433986
new: 61.39981061755206

path: .spaces[11].metrics.mi.mi_visual_studio
old: 71.69295227349863
new: 43.17398666869212

path: .spaces[11].metrics.mi.mi_original
old: 122.59494838768263
new: 73.82751720346353

Code

TEST(ArenaAllocator, Clear)
{
  // Tests that the Clear function works as expected. The best proxy for
  // checking if a clear is successful is to measure the size. If it's empty we
  // expect the size to be 0.
  static const size_t kArenaSize = 128;
  ArenaAllocator a;

  // Clearing an empty arena should work.
  a.Clear();

  size_t sz = a.SizeOfExcludingThis(TestSizeOf);
  EXPECT_EQ(sz, size_t(0));

  // Allocating should work after clearing an empty arena.
  void* x = a.Allocate(10);
  EXPECT_TRUE(x);

  size_t prev_sz = sz;
  sz = a.SizeOfExcludingThis(TestSizeOf);
  EXPECT_GT(sz, prev_sz);

  // Allocate enough for a few arena chunks to be necessary.
  for (size_t i = 0; i < kArenaSize * 2; i++) {
    x = a.Allocate(1);
    EXPECT_TRUE(x);
  }

  prev_sz = sz;
  sz = a.SizeOfExcludingThis(TestSizeOf);
  EXPECT_GT(sz, prev_sz);

  // Clearing should reduce the size back to zero.
  a.Clear();
  sz = a.SizeOfExcludingThis(TestSizeOf);
  EXPECT_EQ(sz, size_t(0));

  // Allocating should work after clearing an arena with allocations.
  x = a.Allocate(10);
  EXPECT_TRUE(x);

  prev_sz = sz;
  sz = a.SizeOfExcludingThis(TestSizeOf);
  EXPECT_GT(sz, prev_sz);
}

Minimal test - lines (121, 147)

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

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

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

path: .spaces[8].metrics.loc.sloc
old: 3.0
new: 27.0

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

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

path: .spaces[8].metrics.loc.ploc
old: 3.0
new: 18.0

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

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

path: .spaces[8].metrics.halstead.time
old: 9.417341628512643
new: 650.1663531617562

path: .spaces[8].metrics.halstead.estimated_program_length
old: 27.651484454403228
new: 133.6620089600894

path: .spaces[8].metrics.halstead.difficulty
old: 3.5
new: 20.0

path: .spaces[8].metrics.halstead.N2
old: 4.0
new: 48.0

path: .spaces[8].metrics.halstead.bugs
old: 0.01020969180116028
new: 0.1718211978376847

path: .spaces[8].metrics.halstead.length
old: 14.0
new: 116.0

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

path: .spaces[8].metrics.halstead.vocabulary
old: 11.0
new: 33.0

path: .spaces[8].metrics.halstead.n1
old: 7.0
new: 15.0

path: .spaces[8].metrics.halstead.purity_ratio
old: 1.9751060324573737
new: 1.152258697931805

path: .spaces[8].metrics.halstead.N1
old: 10.0
new: 68.0

path: .spaces[8].metrics.halstead.volume
old: 48.43204266092216
new: 585.1497178455805

path: .spaces[8].metrics.halstead.level
old: 0.2857142857142857
new: 0.05

path: .spaces[8].metrics.halstead.effort
old: 169.51214931322758
new: 11702.994356911611

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

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

path: .spaces[8].metrics.mi.mi_original
old: 132.79564043134943
new: 84.01373051009881

path: .spaces[8].metrics.mi.mi_sei
old: 115.98457976937348
new: 81.18476225718226

path: .spaces[8].metrics.mi.mi_visual_studio
old: 77.6582692580991
new: 49.13083655561334

path: .spaces[8].metrics.cognitive.average
old: 0.0
new: 1.0

path: .spaces[8].metrics.cognitive.sum
old: 0.0
new: 1.0

Code

TEST(ArenaAllocator, AllocationsPerChunk)
{
  // Test that expected number of allocations fit in one chunk.
  // We use an alignment of 64-bytes to avoid worrying about differences in
  // the header size on 32 and 64-bit platforms.
  const size_t kArenaSize = 1024;
  const size_t kAlignment = 64;
  ArenaAllocator a;

  // With an alignment of 64 bytes we expect the header to take up the first
  // alignment sized slot leaving bytes leaving the rest available for
  // allocation.
  const size_t kAllocationsPerChunk = (kArenaSize / kAlignment) - 1;
  void* x = nullptr;
  void* y = a.Allocate(kAlignment);
  EXPECT_TRUE(y);
  for (size_t i = 1; i < kAllocationsPerChunk; i++) {
    x = y;
    y = a.Allocate(kAlignment);
    EXPECT_EQ(uintptr_t(x) + kAlignment, uintptr_t(y));
  }

  // The next allocation should be in a different chunk.
  x = y;
  y = a.Allocate(kAlignment);
  EXPECT_NE(uintptr_t(x) + kAlignment, uintptr_t(y));
}

Minimal test - lines (30, 54)

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

path: .spaces[2].metrics.cyclomatic.average
old: 85.0
new: 2.0

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

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

path: .spaces[2].metrics.mi.mi_original
old: 33.95759580898587
new: 85.50132539347307

path: .spaces[2].metrics.mi.mi_visual_studio
old: 19.85824316314963
new: 50.00077508390238

path: .spaces[2].metrics.mi.mi_sei
old: -10.826374892786191
new: 84.40409525161638

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

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

path: .spaces[2].metrics.halstead.estimated_program_length
old: 761.2980076365207
new: 111.90632784293425

path: .spaces[2].metrics.halstead.level
old: 0.08800690250215702
new: 0.047619047619047616

path: .spaces[2].metrics.halstead.effort
old: 28852.541515337853
new: 11732.024103233089

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

path: .spaces[2].metrics.halstead.volume
old: 2539.2228080797763
new: 558.6678144396708

path: .spaces[2].metrics.halstead.n2
old: 102.0
new: 15.0

path: .spaces[2].metrics.halstead.N1
old: 245.0
new: 70.0

path: .spaces[2].metrics.halstead.length
old: 367.0
new: 115.0

path: .spaces[2].metrics.halstead.n1
old: 19.0
new: 14.0

path: .spaces[2].metrics.halstead.purity_ratio
old: 2.074381492197604
new: 0.9730985029820368

path: .spaces[2].metrics.halstead.time
old: 1602.918973074325
new: 651.7791168462826

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

path: .spaces[2].metrics.halstead.bugs
old: 0.3135702086747998
new: 0.1721052200733052

path: .spaces[2].metrics.halstead.difficulty
old: 11.362745098039216
new: 21.0

path: .spaces[2].metrics.loc.blank
old: 9.0
new: 4.0

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

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

path: .spaces[2].metrics.loc.lloc
old: 95.0
new: 4.0

path: .spaces[2].metrics.loc.ploc
old: 104.0
new: 14.0

Code

TEST(ArenaAllocator, AllocateAlignment)
{
  // Test non-default 8-byte alignment.
  static const size_t kAlignment = 8;
  ArenaAllocator<1024, kAlignment> a;

  // Make sure aligment is correct for 1-8.
  for (size_t i = 1; i <= kAlignment; i++) {
    // All of these should be 8 bytes
    void* x = a.Allocate(i);
    void* y = a.Allocate(i);
    EXPECT_EQ(uintptr_t(x) + kAlignment, uintptr_t(y));
  }

  // Test with slightly larger than specified alignment.
  void* x = a.Allocate(kAlignment + 1);
  void* y = a.Allocate(kAlignment + 1);

  // Given 8-byte aligment, and a non-8-byte aligned request we expect the
  // allocations to be padded.
  EXPECT_NE(uintptr_t(x) + kAlignment, uintptr_t(y));

  // We expect 7 bytes of padding to have been added.
  EXPECT_EQ(uintptr_t(x) + kAlignment * 2, uintptr_t(y));
}

Minimal test - lines (197, 232)

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

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

path: .spaces[10].metrics.loc.sloc
old: 20.0
new: 36.0

path: .spaces[10].metrics.loc.ploc
old: 13.0
new: 22.0

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

path: .spaces[10].metrics.loc.lloc
old: 6.0
new: 15.0

path: .spaces[10].metrics.loc.cloc
old: 4.0
new: 9.0

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

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

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

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

path: .spaces[10].metrics.mi.mi_sei
old: 86.91742806536371
new: 72.74366519428558

path: .spaces[10].metrics.mi.mi_original
old: 90.229526364278
new: 78.58299958795452

path: .spaces[10].metrics.mi.mi_visual_studio
old: 52.76580489139064
new: 45.95497051927165

path: .spaces[10].metrics.halstead.purity_ratio
old: 1.8836613095048704
new: 0.7705919062322578

path: .spaces[10].metrics.halstead.vocabulary
old: 35.0
new: 29.0

path: .spaces[10].metrics.halstead.time
old: 271.5314197095242
new: 917.8726444911624

path: .spaces[10].metrics.halstead.estimated_program_length
old: 145.04192083187502
new: 112.50641830990963

path: .spaces[10].metrics.halstead.n2
old: 20.0
new: 17.0

path: .spaces[10].metrics.halstead.length
old: 77.0
new: 146.0

path: .spaces[10].metrics.halstead.volume
old: 394.9547923047624
new: 709.2652252886255

path: .spaces[10].metrics.halstead.N2
old: 33.0
new: 66.0

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

path: .spaces[10].metrics.halstead.effort
old: 4887.565554771435
new: 16521.707600840924

path: .spaces[10].metrics.halstead.difficulty
old: 12.375
new: 23.294117647058822

path: .spaces[10].metrics.halstead.N1
old: 44.0
new: 80.0

path: .spaces[10].metrics.halstead.level
old: 0.08080808080808081
new: 0.04292929292929293

path: .spaces[10].metrics.halstead.bugs
old: 0.09600056939309404
new: 0.21622971031262103

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

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

Code

TEST(ArenaAllocator, SizeOf)
{
  // This tests the sizeof functionality. We can't test for equality as we
  // can't reliably guarantee what sizes the underlying allocator is going to
  // choose, so we just test that things grow (or not) as expected.
  static const size_t kArenaSize = 4096;
  ArenaAllocator a;

  // Excluding *this we expect an empty arena allocator to have no overhead.
  size_t sz = a.SizeOfExcludingThis(TestSizeOf);
  EXPECT_EQ(sz, size_t(0));

  // Cause one chunk to be allocated.
  (void)a.Allocate(kArenaSize / 2);
  size_t prev_sz = sz;
  sz = a.SizeOfExcludingThis(TestSizeOf);
  EXPECT_GT(sz, prev_sz);

  // Allocate within the current chunk.
  (void)a.Allocate(kArenaSize / 4);
  prev_sz = sz;
  sz = a.SizeOfExcludingThis(TestSizeOf);
  EXPECT_EQ(sz, prev_sz);

  // Overflow to a new chunk.
  (void)a.Allocate(kArenaSize / 2);
  prev_sz = sz;
  sz = a.SizeOfExcludingThis(TestSizeOf);
  EXPECT_GT(sz, prev_sz);

  // Allocate an oversized chunk with enough room for a header to fit in page
  // size. We expect the underlying allocator to round up to page alignment.
  (void)a.Allocate((kArenaSize * 2) - 64);
  sz = a.SizeOfExcludingThis(TestSizeOf);
  EXPECT_GT(sz, prev_sz);
}

Minimal test - lines (15, 16)

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

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

path: .spaces[0].metrics.halstead.estimated_program_length
old: 17.509775004326936
new: 31.019550008653873

path: .spaces[0].metrics.halstead.N1
old: 5.0
new: 7.0

path: .spaces[0].metrics.halstead.level
old: 0.6666666666666666
new: 0.2857142857142857

path: .spaces[0].metrics.halstead.time
old: 3.5
new: 9.75906458529648

path: .spaces[0].metrics.halstead.N2
old: 9.0
new: 7.0

path: .spaces[0].metrics.halstead.volume
old: 42.0
new: 50.18947501009619

path: .spaces[0].metrics.halstead.n1
old: 2.0
new: 6.0

path: .spaces[0].metrics.halstead.purity_ratio
old: 1.2506982145947811
new: 2.2156821434752767

path: .spaces[0].metrics.halstead.bugs
old: 0.0052776320879040755
new: 0.010455204778755302

path: .spaces[0].metrics.halstead.effort
old: 63.0
new: 175.66316253533665

path: .spaces[0].metrics.halstead.vocabulary
old: 8.0
new: 12.0

path: .spaces[0].metrics.halstead.difficulty
old: 1.5
new: 3.5

path: .spaces[0].metrics.mi.mi_sei
old: 94.12994940155043
new: 125.19357265873246

path: .spaces[0].metrics.mi.mi_original
old: 117.64716500971318
new: 139.1788278884052

path: .spaces[0].metrics.mi.mi_visual_studio
old: 68.79951170158665
new: 81.39112742012001

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

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

path: .spaces[0].metrics.loc.ploc
old: 6.0
new: 2.0

path: .spaces[0].metrics.loc.sloc
old: 8.0
new: 2.0

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

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

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

Code

TEST(ArenaAllocator, Constructor)
{ ArenaAllocator<4096, 4> a; }

Minimal test - lines (77, 95)

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

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

path: .spaces[5].metrics.halstead.purity_ratio
old: 1.807910125841804
new: 1.2509849429477655

path: .spaces[5].metrics.halstead.difficulty
old: 10.88888888888889
new: 14.147058823529411

path: .spaces[5].metrics.halstead.N1
old: 43.0
new: 57.0

path: .spaces[5].metrics.halstead.n2
old: 18.0
new: 17.0

path: .spaces[5].metrics.halstead.time
old: 214.7530864197531
new: 362.5165872383065

path: .spaces[5].metrics.halstead.level
old: 0.09183673469387754
new: 0.07068607068607069

path: .spaces[5].metrics.halstead.effort
old: 3865.555555555556
new: 6525.298570289517

path: .spaces[5].metrics.halstead.bugs
old: 0.08210192844875129
new: 0.11639804085663144

path: .spaces[5].metrics.halstead.n1
old: 14.0
new: 13.0

path: .spaces[5].metrics.halstead.volume
old: 355.0
new: 461.2477159872008

path: .spaces[5].metrics.halstead.N2
old: 28.0
new: 37.0

path: .spaces[5].metrics.halstead.estimated_program_length
old: 128.36161893476807
new: 117.59258463708996

path: .spaces[5].metrics.halstead.length
old: 71.0
new: 94.0

path: .spaces[5].metrics.halstead.vocabulary
old: 32.0
new: 30.0

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

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

path: .spaces[5].metrics.loc.cloc
old: 0.0
new: 4.0

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

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

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

path: .spaces[5].metrics.mi.mi_sei
old: 64.57813914782818
new: 88.09942430504881

path: .spaces[5].metrics.mi.mi_original
old: 97.02225875496066
new: 90.71362527102696

path: .spaces[5].metrics.mi.mi_visual_studio
old: 56.73816301459688
new: 53.04890366726724

Code

TEST(ArenaAllocator, AllocateMultipleSizes)
{
  // Test non-default 4-byte alignment.
  ArenaAllocator<4096, 4> a;

  for (int i = 1; i < 50; i++) {
    void* x = a.Allocate(i);
    // All the allocations should be aligned properly.
    EXPECT_EQ(uintptr_t(x) % 4, uintptr_t(0));
  }

  // Test a large 64-byte alignment
  ArenaAllocator<8192, 64> b;
  for (int i = 1; i < 100; i++) {
    void* x = b.Allocate(i);
    // All the allocations should be aligned properly.
    EXPECT_EQ(uintptr_t(x) % 64, uintptr_t(0));
  }
}

Minimal test - lines (18, 28)

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

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

path: .spaces[1].metrics.halstead.purity_ratio
old: 2.4
new: 1.6198415625882705

path: .spaces[1].metrics.halstead.N2
old: 10.0
new: 18.0

path: .spaces[1].metrics.halstead.N1
old: 10.0
new: 26.0

path: .spaces[1].metrics.halstead.n2
old: 8.0
new: 10.0

path: .spaces[1].metrics.halstead.volume
old: 80.0
new: 193.26196660226543

path: .spaces[1].metrics.halstead.length
old: 20.0
new: 44.0

path: .spaces[1].metrics.halstead.effort
old: 400.0
new: 1913.293469362428

path: .spaces[1].metrics.halstead.bugs
old: 0.01809611744396604
new: 0.051372788298157376

path: .spaces[1].metrics.halstead.difficulty
old: 5.0
new: 9.9

path: .spaces[1].metrics.halstead.level
old: 0.2
new: 0.101010101010101

path: .spaces[1].metrics.halstead.estimated_program_length
old: 48.0
new: 71.27302875388389

path: .spaces[1].metrics.halstead.time
old: 22.22222222222222
new: 106.294081631246

path: .spaces[1].metrics.mi.mi_visual_studio
old: 73.40672096465123
new: 61.140967378172434

path: .spaces[1].metrics.mi.mi_sei
old: 105.49597390658572
new: 111.41749572111696

path: .spaces[1].metrics.mi.mi_original
old: 125.5254928495536
new: 104.55105421667486

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

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

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

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

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

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

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

path: .spaces[1].metrics.loc.sloc
old: 4.0
new: 11.0

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

Code

TEST(ArenaAllocator, DefaultAllocate)
{
  // Test default 1-byte alignment.
  ArenaAllocator<1024> a;
  void* x = a.Allocate(101);
  void* y = a.Allocate(101);

  // Given 1-byte aligment, we expect the allocations to follow
  // each other exactly.
  EXPECT_EQ(uintptr_t(x) + 101, uintptr_t(y));
}

Minimal test - lines (106, 119)

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

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

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

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

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

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

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

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

path: .spaces[7].metrics.mi.mi_visual_studio
old: 59.390035514422706
new: 57.44296644067813

path: .spaces[7].metrics.mi.mi_original
old: 101.55696072966282
new: 98.2274726135596

path: .spaces[7].metrics.mi.mi_sei
old: 71.01851133923593
new: 93.74573262612287

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

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

path: .spaces[7].metrics.halstead.N2
old: 22.0
new: 30.0

path: .spaces[7].metrics.halstead.N1
old: 32.0
new: 38.0

path: .spaces[7].metrics.halstead.purity_ratio
old: 1.6875049323053346
new: 1.192254379612708

path: .spaces[7].metrics.halstead.time
old: 166.0178587844464
new: 234.97391271740597

path: .spaces[7].metrics.halstead.estimated_program_length
old: 91.12526634448808
new: 81.07329781366414

path: .spaces[7].metrics.halstead.bugs
old: 0.06915606717996642
new: 0.0871779892425027

path: .spaces[7].metrics.halstead.n1
old: 13.0
new: 11.0

path: .spaces[7].metrics.halstead.level
old: 0.08391608391608392
new: 0.07272727272727272

path: .spaces[7].metrics.halstead.length
old: 54.0
new: 68.0

path: .spaces[7].metrics.halstead.vocabulary
old: 25.0
new: 23.0

path: .spaces[7].metrics.halstead.difficulty
old: 11.916666666666666
new: 13.75

path: .spaces[7].metrics.halstead.effort
old: 2988.321458120035
new: 4229.530428913307

path: .spaces[7].metrics.halstead.volume
old: 250.76823424783512
new: 307.60221301187687

Code

TEST(ArenaAllocator, AllocateLargerThanArenaSize)
{
  // Test default 1-byte alignment.
  ArenaAllocator<256> a;
  void* x = a.Allocate(4000);
  void* y = a.Allocate(4000);
  EXPECT_TRUE(x);
  EXPECT_TRUE(y);

  // Now try a normal allocation, it should behave as expected.
  x = a.Allocate(8);
  y = a.Allocate(8);
  EXPECT_EQ(uintptr_t(x) + 8, uintptr_t(y));
}

Minimal test - lines (149, 193)

path: .spaces[9].metrics.mi.mi_sei
old: 67.74716944168748
new: 55.5317637965356

path: .spaces[9].metrics.mi.mi_visual_studio
old: 46.70561454438987
new: 41.36133347715981

path: .spaces[9].metrics.mi.mi_original
old: 79.86660087090667
new: 70.72788024594327

path: .spaces[9].metrics.loc.cloc
old: 4.0
new: 7.0

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

path: .spaces[9].metrics.loc.lloc
old: 10.0
new: 21.0

path: .spaces[9].metrics.loc.sloc
old: 29.0
new: 45.0

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

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

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

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

path: .spaces[9].metrics.halstead.difficulty
old: 14.875
new: 47.111111111111114

path: .spaces[9].metrics.halstead.N1
old: 74.0
new: 158.0

path: .spaces[9].metrics.halstead.length
old: 130.0
new: 264.0

path: .spaces[9].metrics.halstead.time
old: 603.1913978365436
new: 3515.2483987543083

path: .spaces[9].metrics.halstead.n2
old: 32.0
new: 18.0

path: .spaces[9].metrics.halstead.vocabulary
old: 49.0
new: 34.0

path: .spaces[9].metrics.halstead.N2
old: 56.0
new: 106.0

path: .spaces[9].metrics.halstead.bugs
old: 0.1634420653325189
new: 0.5292949634009615

path: .spaces[9].metrics.halstead.estimated_program_length
old: 229.48686830125575
new: 139.0586500259616

path: .spaces[9].metrics.halstead.effort
old: 10857.445161057783
new: 63274.47117757755

path: .spaces[9].metrics.halstead.level
old: 0.06722689075630252
new: 0.02122641509433962

path: .spaces[9].metrics.halstead.n1
old: 17.0
new: 16.0

path: .spaces[9].metrics.halstead.purity_ratio
old: 1.765283602317352
new: 0.5267373107044

path: .spaces[9].metrics.halstead.volume
old: 729.9122797349771
new: 1343.0901900900894

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

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

Code

TEST(ArenaAllocator, MemoryIsValid)
{
  // Make multiple allocations and actually access the memory. This is
  // expected to trip up ASAN or valgrind if out of bounds memory is
  // accessed.
  static const size_t kArenaSize = 1024;
  static const size_t kAlignment = 64;
  static const char kMark = char(0xBC);
  ArenaAllocator a;

  // Single allocation that should fill the arena.
  size_t sz = kArenaSize - kAlignment;
  char* x = (char*)a.Allocate(sz);
  EXPECT_EQ(uintptr_t(x) % kAlignment, uintptr_t(0));
  memset(x, kMark, sz);
  for (size_t i = 0; i < sz; i++) {
    EXPECT_EQ(x[i], kMark);
  }

  // Allocation over arena size.
  sz = kArenaSize * 2;
  x = (char*)a.Allocate(sz);
  EXPECT_EQ(uintptr_t(x) % kAlignment, uintptr_t(0));
  memset(x, kMark, sz);
  for (size_t i = 0; i < sz; i++) {
    EXPECT_EQ(x[i], kMark);
  }

  // Allocation half the arena size.
  sz = kArenaSize / 2;
  x = (char*)a.Allocate(sz);
  EXPECT_EQ(uintptr_t(x) % kAlignment, uintptr_t(0));
  memset(x, kMark, sz);
  for (size_t i = 0; i < sz; i++) {
    EXPECT_EQ(x[i], kMark);
  }

  // Repeat, this should actually end up in a new chunk.
  x = (char*)a.Allocate(sz);
  EXPECT_EQ(uintptr_t(x) % kAlignment, uintptr_t(0));
  memset(x, kMark, sz);
  for (size_t i = 0; i < sz; i++) {
    EXPECT_EQ(x[i], kMark);
  }
}

Minimal test - lines (57, 65)

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

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

path: .spaces[3].metrics.mi.mi_sei
old: 10.158111930749548
new: 123.1163133907484

path: .spaces[3].metrics.mi.mi_original
old: 32.30727992930949
new: 110.71141750490206

path: .spaces[3].metrics.mi.mi_visual_studio
old: 18.89314615749093
new: 64.74351900871466

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

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

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

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

path: .spaces[3].metrics.loc.cloc
old: 51.0
new: 3.0

path: .spaces[3].metrics.loc.ploc
old: 122.0
new: 6.0

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

path: .spaces[3].metrics.loc.lloc
old: 64.0
new: 1.0

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

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

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

path: .spaces[3].metrics.halstead.purity_ratio
old: 1.1230170560813184
new: 2.374946383148248

path: .spaces[3].metrics.halstead.bugs
old: 0.8560865657512976
new: 0.027180130408583855

path: .spaces[3].metrics.halstead.n1
old: 22.0
new: 10.0

path: .spaces[3].metrics.halstead.estimated_program_length
old: 714.2388476677185
new: 61.74860596185444

path: .spaces[3].metrics.halstead.vocabulary
old: 116.0
new: 19.0

path: .spaces[3].metrics.halstead.volume
old: 4361.675912901136
new: 110.44611534953322

path: .spaces[3].metrics.halstead.n2
old: 94.0
new: 9.0

path: .spaces[3].metrics.halstead.length
old: 636.0
new: 26.0

path: .spaces[3].metrics.halstead.N2
old: 255.0
new: 12.0

path: .spaces[3].metrics.halstead.difficulty
old: 29.840425531914892
new: 6.666666666666667

path: .spaces[3].metrics.halstead.level
old: 0.03351158645276293
new: 0.15

path: .spaces[3].metrics.halstead.time
old: 7230.792515181847
new: 40.905968647975264

path: .spaces[3].metrics.halstead.effort
old: 130154.26527327324
new: 736.3074356635548

path: .spaces[3].metrics.halstead.N1
old: 381.0
new: 14.0

Code

TEST(ArenaAllocator, AllocateZeroBytes)
{
  // This would have to be a death test. Since we chose to provide an
  // infallible allocator we can't just return nullptr in the 0 case as
  // there's no way to differentiate that from the OOM case.
  ArenaAllocator<1024> a;
  void* x = a.Allocate(0);
  EXPECT_FALSE(x);
}

Minimal test - lines (280, 310)

path: .spaces[12].metrics.halstead.level
old: 0.07017543859649122
new: 0.08

path: .spaces[12].metrics.halstead.volume
old: 663.2550430017876
new: 895.3467854565167

path: .spaces[12].metrics.halstead.N2
old: 57.0
new: 75.0

path: .spaces[12].metrics.halstead.n2
old: 28.0
new: 33.0

path: .spaces[12].metrics.halstead.estimated_program_length
old: 187.90890672641936
new: 204.51875374383923

path: .spaces[12].metrics.halstead.N1
old: 66.0
new: 89.0

path: .spaces[12].metrics.halstead.difficulty
old: 14.25
new: 12.5

path: .spaces[12].metrics.halstead.purity_ratio
old: 1.5277146888326778
new: 1.2470655716087755

path: .spaces[12].metrics.halstead.n1
old: 14.0
new: 11.0

path: .spaces[12].metrics.halstead.bugs
old: 0.14900780892249044
new: 0.16678088464009913

path: .spaces[12].metrics.halstead.length
old: 123.0
new: 164.0

path: .spaces[12].metrics.halstead.effort
old: 9451.384362775474
new: 11191.834818206458

path: .spaces[12].metrics.halstead.time
old: 525.0769090430819
new: 621.7686010114699

path: .spaces[12].metrics.halstead.vocabulary
old: 42.0
new: 44.0

path: .spaces[12].metrics.cyclomatic.sum
old: 2.0
new: 1.0

path: .spaces[12].metrics.cyclomatic.average
old: 2.0
new: 1.0

path: .spaces[12].metrics.nargs.average
old: 5.0
new: 2.0

path: .spaces[12].metrics.nargs.sum
old: 5.0
new: 2.0

path: .spaces[12].metrics.nexits.average
old: 2.0
new: 0.0

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

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

path: .spaces[12].metrics.loc.cloc
old: 1.0
new: 3.0

path: .spaces[12].metrics.loc.ploc
old: 18.0
new: 22.0

path: .spaces[12].metrics.loc.blank
old: 2.0
new: 6.0

path: .spaces[12].metrics.loc.sloc
old: 21.0
new: 31.0

path: .spaces[12].metrics.mi.mi_original
old: 87.4335066072916
new: 79.79390949968013

path: .spaces[12].metrics.mi.mi_visual_studio
old: 51.13070561829918
new: 46.66310497057317

path: .spaces[12].metrics.mi.mi_sei
old: 67.22563047890517
new: 62.693826898036846

path: .spaces[12].metrics.cognitive.average
old: 1.0
new: 0.0

path: .spaces[12].metrics.cognitive.sum
old: 1.0
new: 0.0

Code

TEST(ArenaAllocator, Extensions)
{
  ArenaAllocator<4096, 8> a;

  // Test with raw strings.
  const char* const kTestCStr = "This is a test string.";
  char* c_dup = mozilla::ArenaStrdup(kTestCStr, a);
  EXPECT_STREQ(c_dup, kTestCStr);

  const char16_t* const kTestStr = u"This is a wide test string.";
  char16_t* dup = mozilla::ArenaStrdup(kTestStr, a);
  EXPECT_TRUE(nsString(dup).Equals(kTestStr));

  // Make sure it works with literal strings.
  constexpr auto wideStr = u"A wide string."_ns;
  nsLiteralString::char_type* wide = mozilla::ArenaStrdup(wideStr, a);
  EXPECT_TRUE(wideStr.Equals(wide));

  constexpr auto cStr = "A c-string."_ns;
  nsLiteralCString::char_type* cstr = mozilla::ArenaStrdup(cStr, a);
  EXPECT_TRUE(cStr.Equals(cstr));

  // Make sure it works with normal strings.
  nsAutoString x(u"testing wide");
  nsAutoString::char_type* x_copy = mozilla::ArenaStrdup(x, a);
  EXPECT_TRUE(x.Equals(x_copy));

  nsAutoCString y("testing c-string");
  nsAutoCString::char_type* y_copy = mozilla::ArenaStrdup(y, a);
  EXPECT_TRUE(y.Equals(y_copy));
}