# Global Metrics

path: .metrics.cognitive.average
old: 1.25
new: 2.642857142857143
path: .metrics.cognitive.sum
old: 5.0
new: 37.0
path: .metrics.nargs.sum
old: 13.0
new: 8.0
path: .metrics.nargs.average
old: 3.25
new: 0.5714285714285714
path: .metrics.cyclomatic.average
old: 1.6666666666666667
new: 3.0
path: .metrics.cyclomatic.sum
old: 10.0
new: 45.0
path: .metrics.halstead.volume
old: 1918.1137466271807
new: 6659.136669114062
path: .metrics.halstead.difficulty
old: 22.333333333333332
new: 30.36470588235294
path: .metrics.halstead.effort
old: 42837.8736746737
new: 202202.7263880399
path: .metrics.halstead.N1
old: 173.0
new: 516.0
path: .metrics.halstead.level
old: 0.04477611940298508
new: 0.032932971716388995
path: .metrics.halstead.purity_ratio
old: 1.3458806304977795
new: 1.6060526467914091
path: .metrics.halstead.vocabulary
old: 76.0
new: 199.0
path: .metrics.halstead.estimated_program_length
old: 413.1853535628184
new: 1400.4779080021087
path: .metrics.halstead.N2
old: 134.0
new: 356.0
path: .metrics.halstead.length
old: 307.0
new: 872.0
path: .metrics.halstead.bugs
old: 0.40809757660024454
new: 1.1483389172527418
path: .metrics.halstead.time
old: 2379.8818708152053
new: 11233.48479933555
path: .metrics.halstead.n2
old: 57.0
new: 170.0
path: .metrics.halstead.n1
old: 19.0
new: 29.0
path: .metrics.loc.lloc
old: 18.0
new: 86.0
path: .metrics.loc.blank
old: 16.0
new: 27.0
path: .metrics.loc.cloc
old: 11.0
new: 39.0
path: .metrics.loc.sloc
old: 85.0
new: 309.0
path: .metrics.loc.ploc
old: 58.0
new: 243.0
path: .metrics.mi.mi_original
old: 57.42174234067893
new: 21.99039665973416
path: .metrics.mi.mi_sei
old: 34.60443157548037
new: -13.243178413147678
path: .metrics.mi.mi_visual_studio
old: 33.57996628109879
new: 12.859881087563837
path: .metrics.nexits.sum
old: 7.0
new: 10.0
path: .metrics.nexits.average
old: 1.75
new: 0.7142857142857143
path: .metrics.nom.closures
old: 0.0
new: 1.0
path: .metrics.nom.total
old: 4.0
new: 14.0
path: .metrics.nom.functions
old: 4.0
new: 13.0

# Spaces Data

## Minimal test - lines (99, 99)

path: .spaces[0].spaces[1].metrics.mi.mi_visual_studio
old: 68.10625337613413
new: 90.2012398141466
path: .spaces[0].spaces[1].metrics.mi.mi_original
old: 116.46169327318938
new: 154.24412008219068
path: .spaces[0].spaces[1].metrics.mi.mi_sei
old: 92.4196752061536
new: 146.92819499625
path: .spaces[0].spaces[1].metrics.loc.sloc
old: 6.0
new: 1.0
path: .spaces[0].spaces[1].metrics.loc.ploc
old: 6.0
new: 1.0
path: .spaces[0].spaces[1].metrics.halstead.N2
old: 14.0
new: 2.0
path: .spaces[0].spaces[1].metrics.halstead.level
old: 0.17857142857142858
new: 0.3333333333333333
path: .spaces[0].spaces[1].metrics.halstead.purity_ratio
old: 1.8457832564152783
new: 2.188721875540867
path: .spaces[0].spaces[1].metrics.halstead.n1
old: 8.0
new: 6.0
path: .spaces[0].spaces[1].metrics.halstead.estimated_program_length
old: 57.219280948873624
new: 17.509775004326936
path: .spaces[0].spaces[1].metrics.halstead.effort
old: 723.8989802503853
new: 72.0
path: .spaces[0].spaces[1].metrics.halstead.n2
old: 10.0
new: 2.0
path: .spaces[0].spaces[1].metrics.halstead.bugs
old: 0.026873901550463184
new: 0.0057689982812296325
path: .spaces[0].spaces[1].metrics.halstead.length
old: 31.0
new: 8.0
path: .spaces[0].spaces[1].metrics.halstead.time
old: 40.2166100139103
new: 4.0
path: .spaces[0].spaces[1].metrics.halstead.N1
old: 17.0
new: 6.0
path: .spaces[0].spaces[1].metrics.halstead.vocabulary
old: 18.0
new: 8.0
path: .spaces[0].spaces[1].metrics.halstead.difficulty
old: 5.6
new: 3.0
path: .spaces[0].spaces[1].metrics.halstead.volume
old: 129.26767504471167
new: 24.0
path: .spaces[0].spaces[1].metrics.nargs.sum
old: 4.0
new: 0.0
path: .spaces[0].spaces[1].metrics.nargs.average
old: 4.0
new: 0.0

### Code

    bool AppShutdown::IsShuttingDown() { return sIsShuttingDown; }

## Minimal test - lines (101, 101)

path: .spaces[0].spaces[2].metrics.halstead.length
old: 36.0
new: 8.0
path: .spaces[0].spaces[2].metrics.halstead.estimated_program_length
old: 67.01955000865388
new: 17.509775004326936
path: .spaces[0].spaces[2].metrics.halstead.bugs
old: 0.030649063926827792
new: 0.0057689982812296325
path: .spaces[0].spaces[2].metrics.halstead.purity_ratio
old: 1.8616541669070523
new: 2.188721875540867
path: .spaces[0].spaces[2].metrics.halstead.effort
old: 881.673331357022
new: 72.0
path: .spaces[0].spaces[2].metrics.halstead.N1
old: 19.0
new: 6.0
path: .spaces[0].spaces[2].metrics.halstead.time
old: 48.981851742056776
new: 4.0
path: .spaces[0].spaces[2].metrics.halstead.vocabulary
old: 20.0
new: 8.0
path: .spaces[0].spaces[2].metrics.halstead.n1
old: 8.0
new: 6.0
path: .spaces[0].spaces[2].metrics.halstead.volume
old: 155.58941141594505
new: 24.0
path: .spaces[0].spaces[2].metrics.halstead.difficulty
old: 5.666666666666667
new: 3.0
path: .spaces[0].spaces[2].metrics.halstead.n2
old: 12.0
new: 2.0
path: .spaces[0].spaces[2].metrics.halstead.level
old: 0.1764705882352941
new: 0.3333333333333333
path: .spaces[0].spaces[2].metrics.halstead.N2
old: 17.0
new: 2.0
path: .spaces[0].spaces[2].metrics.nargs.sum
old: 5.0
new: 0.0
path: .spaces[0].spaces[2].metrics.nargs.average
old: 5.0
new: 0.0
path: .spaces[0].spaces[2].metrics.mi.mi_sei
old: 120.58564297820168
new: 146.92819499625
path: .spaces[0].spaces[2].metrics.mi.mi_original
old: 115.49794968961136
new: 154.24412008219068
path: .spaces[0].spaces[2].metrics.mi.mi_visual_studio
old: 67.54266063719962
new: 90.2012398141466
path: .spaces[0].spaces[2].metrics.loc.cloc
old: 1.0
new: 0.0
path: .spaces[0].spaces[2].metrics.loc.sloc
old: 6.0
new: 1.0
path: .spaces[0].spaces[2].metrics.loc.ploc
old: 5.0
new: 1.0

### Code

    int AppShutdown::GetExitCode() { return sExitCode; }

## Minimal test - lines (42, 309)

path: .spaces[0].metrics.cyclomatic.average
old: 1.8
new: 3.142857142857143
path: .spaces[0].metrics.cyclomatic.sum
old: 9.0
new: 44.0
path: .spaces[0].metrics.halstead.volume
old: 1826.4488125766725
new: 6353.759594897354
path: .spaces[0].metrics.halstead.level
old: 0.04177109440267335
new: 0.03106554830692762
path: .spaces[0].metrics.halstead.N2
old: 126.0
new: 333.0
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.2137238536594124
new: 1.4431145493911444
path: .spaces[0].metrics.halstead.estimated_program_length
old: 362.9034322441643
new: 1225.2042524330816
path: .spaces[0].metrics.halstead.N1
old: 173.0
new: 516.0
path: .spaces[0].metrics.halstead.bugs
old: 0.41371364622993406
new: 1.157124037351947
path: .spaces[0].metrics.halstead.n1
old: 19.0
new: 29.0
path: .spaces[0].metrics.halstead.effort
old: 43725.18457308554
new: 204527.52135974585
path: .spaces[0].metrics.halstead.n2
old: 50.0
new: 150.0
path: .spaces[0].metrics.halstead.difficulty
old: 23.94
new: 32.19
path: .spaces[0].metrics.halstead.time
old: 2429.1769207269745
new: 11362.640075541434
path: .spaces[0].metrics.halstead.length
old: 299.0
new: 849.0
path: .spaces[0].metrics.halstead.vocabulary
old: 69.0
new: 179.0
path: .spaces[0].metrics.nexits.average
old: 1.75
new: 0.7142857142857143
path: .spaces[0].metrics.nexits.sum
old: 7.0
new: 10.0
path: .spaces[0].metrics.loc.cloc
old: 4.0
new: 32.0
path: .spaces[0].metrics.loc.ploc
old: 48.0
new: 214.0
path: .spaces[0].metrics.loc.sloc
old: 63.0
new: 268.0
path: .spaces[0].metrics.loc.lloc
old: 18.0
new: 86.0
path: .spaces[0].metrics.loc.blank
old: 11.0
new: 22.0
path: .spaces[0].metrics.nom.closures
old: 0.0
new: 1.0
path: .spaces[0].metrics.nom.total
old: 4.0
new: 14.0
path: .spaces[0].metrics.nom.functions
old: 4.0
new: 13.0
path: .spaces[0].metrics.nargs.sum
old: 13.0
new: 8.0
path: .spaces[0].metrics.nargs.average
old: 3.25
new: 0.5714285714285714
path: .spaces[0].metrics.cognitive.sum
old: 5.0
new: 37.0
path: .spaces[0].metrics.cognitive.average
old: 1.25
new: 2.642857142857143
path: .spaces[0].metrics.mi.mi_original
old: 62.75854756339457
new: 24.77064062557085
path: .spaces[0].metrics.mi.mi_sei
old: 34.78304132201173
new: -9.978496409587825
path: .spaces[0].metrics.mi.mi_visual_studio
old: 36.70090500783308
new: 14.48575475179582

### Code

    namespace mozilla {

    const char* sPhaseObserverKeys[] = {
        nullptr,                            // NotInShutdown
        "quit-application",                 // AppShutdownConfirmed
        "profile-change-net-teardown",      // AppShutdownNetTeardown
        "profile-change-teardown",          // AppShutdownTeardown
        "profile-before-change",            // AppShutdown
        "profile-before-change-qm",         // AppShutdownQM
        "profile-before-change-telemetry",  // AppShutdownTelemetry
        "xpcom-will-shutdown",              // XPCOMWillShutdown
        "xpcom-shutdown",                   // XPCOMShutdown
        "xpcom-shutdown-threads",           // XPCOMShutdownThreads
        nullptr,                            // XPCOMShutdownLoaders
        nullptr,                            // XPCOMShutdownFinal
        nullptr                             // CCPostLastCycleCollection
    };

    static_assert(sizeof(sPhaseObserverKeys) / sizeof(sPhaseObserverKeys[0]) ==
                  (size_t)ShutdownPhase::ShutdownPhase_Length);

    #ifndef ANDROID
    static nsTerminator* sTerminator = nullptr;
    #endif

    static ShutdownPhase sFastShutdownPhase = ShutdownPhase::NotInShutdown;
    static ShutdownPhase sLateWriteChecksPhase = ShutdownPhase::NotInShutdown;
    static AppShutdownMode sShutdownMode = AppShutdownMode::Normal;
    static Atomic sIsShuttingDown;
    static int sExitCode = 0;

    // These environment variable strings are all deliberately copied and leaked
    // due to requirements of PR_SetEnv and similar.
    static char* sSavedXulAppFile = nullptr;
    #ifdef XP_WIN
    static wchar_t* sSavedProfDEnvVar = nullptr;
    static wchar_t* sSavedProfLDEnvVar = nullptr;
    #else
    static char* sSavedProfDEnvVar = nullptr;
    static char* sSavedProfLDEnvVar = nullptr;
    #endif

    ShutdownPhase GetShutdownPhaseFromPrefValue(int32_t aPrefValue) {
      switch (aPrefValue) {
        case 1:
          return ShutdownPhase::CCPostLastCycleCollection;
        case 2:
          return ShutdownPhase::XPCOMShutdownThreads;
        case 3:
          return ShutdownPhase::XPCOMShutdown;
          // NOTE: the remaining values from the ShutdownPhase enum will be added
          // when we're at least reasonably confident that the world won't come
          // crashing down if we do a fast shutdown at that point.
      }
      return ShutdownPhase::NotInShutdown;
    }

    bool AppShutdown::IsShuttingDown() { return sIsShuttingDown; }

    int AppShutdown::GetExitCode() { return sExitCode; }

    void AppShutdown::SaveEnvVarsForPotentialRestart() {
      const char* s = PR_GetEnv("XUL_APP_FILE");
      if (s) {
        sSavedXulAppFile = Smprintf("%s=%s", "XUL_APP_FILE", s).release();
        MOZ_LSAN_INTENTIONALLY_LEAK_OBJECT(sSavedXulAppFile);
      }
    }

    const char* AppShutdown::GetObserverKey(ShutdownPhase aPhase) {
      return sPhaseObserverKeys[static_cast>(
          aPhase)];
    }

    void AppShutdown::MaybeDoRestart() {
      if (sShutdownMode == AppShutdownMode::Restart) {
        StopLateWriteChecks();

        // Since we'll be launching our child while we're still alive, make sure
        // we've unlocked the profile first, otherwise the child could hit its
        // profile lock check before we've exited and thus released our lock.
        UnlockProfile();

        if (sSavedXulAppFile) {
          PR_SetEnv(sSavedXulAppFile);
        }

    #ifdef XP_WIN
        if (sSavedProfDEnvVar && !EnvHasValue("XRE_PROFILE_PATH")) {
          SetEnvironmentVariableW(L"XRE_PROFILE_PATH", sSavedProfDEnvVar);
        }
        if (sSavedProfLDEnvVar && !EnvHasValue("XRE_PROFILE_LOCAL_PATH")) {
          SetEnvironmentVariableW(L"XRE_PROFILE_LOCAL_PATH", sSavedProfLDEnvVar);
        }
    #else
        if (sSavedProfDEnvVar && !EnvHasValue("XRE_PROFILE_PATH")) {
          PR_SetEnv(sSavedProfDEnvVar);
        }
        if (sSavedProfLDEnvVar && !EnvHasValue("XRE_PROFILE_LOCAL_PATH")) {
          PR_SetEnv(sSavedProfLDEnvVar);
        }
    #endif

        LaunchChild(true);
      }
    }

    #ifdef XP_WIN
    wchar_t* CopyPathIntoNewWCString(nsIFile* aFile) {
      wchar_t* result = nullptr;
      nsAutoString resStr;
      aFile->GetPath(resStr);
      if (resStr.Length() > 0) {
        result = (wchar_t*)malloc((resStr.Length() + 1) * sizeof(wchar_t));
        if (result) {
          wcscpy(result, resStr.get());
          result[resStr.Length()] = 0;
        }
      }

      return result;
    }
    #endif

    void AppShutdown::Init(AppShutdownMode aMode, int aExitCode) {
      if (sShutdownMode == AppShutdownMode::Normal) {
        sShutdownMode = aMode;
      }

      sExitCode = aExitCode;

    #ifndef ANDROID
      sTerminator = new nsTerminator();
    #endif

      // Late-write checks needs to find the profile directory, so it has to
      // be initialized before services::Shutdown or (because of
      // xpcshell tests replacing the service) modules being unloaded.
      InitLateWriteChecks();

      int32_t fastShutdownPref = StaticPrefs::toolkit_shutdown_fastShutdownStage();
      sFastShutdownPhase = GetShutdownPhaseFromPrefValue(fastShutdownPref);
      int32_t lateWriteChecksPref =
          StaticPrefs::toolkit_shutdown_lateWriteChecksStage();
      sLateWriteChecksPhase = GetShutdownPhaseFromPrefValue(lateWriteChecksPref);

      // Very early shutdowns can happen before the startup cache is even
      // initialized; don't bother initializing it during shutdown.
      if (auto* cache = scache::StartupCache::GetSingletonNoInit()) {
        cache->MaybeInitShutdownWrite();
      }
    }

    void AppShutdown::MaybeFastShutdown(ShutdownPhase aPhase) {
      // For writes which we want to ensure are recorded, we don't want to trip
      // the late write checking code. Anything that writes to disk and which
      // we don't want to skip should be listed out explicitly in this section.
      if (aPhase == sFastShutdownPhase || aPhase == sLateWriteChecksPhase) {
        if (auto* cache = scache::StartupCache::GetSingletonNoInit()) {
          cache->EnsureShutdownWriteComplete();
        }

        nsresult rv;
    #ifdef MOZ_NEW_XULSTORE
        rv = XULStore::Shutdown();
        NS_ASSERTION(NS_SUCCEEDED(rv), "XULStore::Shutdown() failed.");
    #endif

        nsCOMPtr certStorage =
            do_GetService("@mozilla.org/security/certstorage;1", &rv);
        if (NS_SUCCEEDED(rv)) {
          SpinEventLoopUntil([&]() {
            int32_t remainingOps;
            nsresult rv = certStorage->GetRemainingOperationCount(&remainingOps);
            NS_ASSERTION(NS_SUCCEEDED(rv),
                         "nsICertStorage::getRemainingOperationCount failed during "
                         "shutdown");
            return NS_FAILED(rv) || remainingOps <= 0;
          });
        }
      }
      if (aPhase == sFastShutdownPhase) {
        StopLateWriteChecks();
        RecordShutdownEndTimeStamp();
        MaybeDoRestart();

    #ifdef MOZ_GECKO_PROFILER
        profiler_shutdown(IsFastShutdown::Yes);
    #endif

        DoImmediateExit(sExitCode);
      } else if (aPhase == sLateWriteChecksPhase) {
    #ifdef XP_MACOSX
        OnlyReportDirtyWrites();
    #endif /* XP_MACOSX */
        BeginLateWriteChecks();
      }
    }

    void AppShutdown::OnShutdownConfirmed() {
      sIsShuttingDown = true;
      // If we're restarting, we need to save environment variables correctly
      // while everything is still alive to do so.
      if (sShutdownMode == AppShutdownMode::Restart) {
        nsCOMPtr profD;
        nsCOMPtr profLD;
        NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(profD));
        NS_GetSpecialDirectory(NS_APP_USER_PROFILE_LOCAL_50_DIR,
                               getter_AddRefs(profLD));
    #ifdef XP_WIN
        sSavedProfDEnvVar = CopyPathIntoNewWCString(profD);
        sSavedProfLDEnvVar = CopyPathIntoNewWCString(profLD);
    #else
        nsAutoCString profDStr;
        profD->GetNativePath(profDStr);
        sSavedProfDEnvVar =
            Smprintf("XRE_PROFILE_PATH=%s", profDStr.get()).release();
        nsAutoCString profLDStr;
        profLD->GetNativePath(profLDStr);
        sSavedProfLDEnvVar =
            Smprintf("XRE_PROFILE_LOCAL_PATH=%s", profLDStr.get()).release();
    #endif
        MOZ_LSAN_INTENTIONALLY_LEAK_OBJECT(sSavedProfDEnvVar);
        MOZ_LSAN_INTENTIONALLY_LEAK_OBJECT(sSavedProfLDEnvVar);
      }
    }

    void AppShutdown::DoImmediateExit(int aExitCode) {
    #ifdef XP_WIN
      HANDLE process = ::GetCurrentProcess();
      if (::TerminateProcess(process, aExitCode)) {
        ::WaitForSingleObject(process, INFINITE);
      }
      MOZ_CRASH("TerminateProcess failed.");
    #else
      _exit(aExitCode);
    #endif
    }

    bool AppShutdown::IsRestarting() {
      return sShutdownMode == AppShutdownMode::Restart;
    }

    void AppShutdown::AdvanceShutdownPhase(
        ShutdownPhase aPhase, const char16_t* aNotificationData,
        nsCOMPtr aNotificationSubject) {
    #ifndef ANDROID
      if (sTerminator) {
        sTerminator->AdvancePhase(aPhase);
      }
    #endif

      mozilla::KillClearOnShutdown(aPhase);

      MaybeFastShutdown(aPhase);

      const char* aTopic = AppShutdown::GetObserverKey(aPhase);
      if (aTopic) {
        nsCOMPtr obsService =
            mozilla::services::GetObserverService();
        if (obsService) {
          obsService->NotifyObservers(aNotificationSubject, aTopic,
                                      aNotificationData);
        }
      }
    }

    }  // namespace mozilla

## Minimal test - lines (103, 109)

path: .spaces[0].spaces[3].metrics.cyclomatic.sum
old: 5.0
new: 2.0
path: .spaces[0].spaces[3].metrics.cyclomatic.average
old: 5.0
new: 2.0
path: .spaces[0].spaces[3].metrics.loc.sloc
old: 38.0
new: 7.0
path: .spaces[0].spaces[3].metrics.loc.blank
old: 6.0
new: 0.0
path: .spaces[0].spaces[3].metrics.loc.lloc
old: 14.0
new: 3.0
path: .spaces[0].spaces[3].metrics.loc.cloc
old: 3.0
new: 0.0
path: .spaces[0].spaces[3].metrics.loc.ploc
old: 29.0
new: 7.0
path: .spaces[0].spaces[3].metrics.mi.mi_sei
old: 53.46986240751435
new: 87.75489591736567
path: .spaces[0].spaces[3].metrics.mi.mi_original
old: 74.56748372793686
new: 113.1577385127604
path: .spaces[0].spaces[3].metrics.mi.mi_visual_studio
old: 43.606715630372435
new: 66.17411608933357
path: .spaces[0].spaces[3].metrics.cognitive.average
old: 5.0
new: 1.0
path: .spaces[0].spaces[3].metrics.cognitive.sum
old: 5.0
new: 1.0
path: .spaces[0].spaces[3].metrics.halstead.n2
old: 37.0
new: 9.0
path: .spaces[0].spaces[3].metrics.halstead.time
old: 1116.271183605951
new: 57.95012225129829
path: .spaces[0].spaces[3].metrics.halstead.estimated_program_length
old: 267.8084245542328
new: 61.74860596185444
path: .spaces[0].spaces[3].metrics.halstead.bugs
old: 0.24636190735128896
new: 0.0342844078613968
path: .spaces[0].spaces[3].metrics.halstead.n1
old: 18.0
new: 10.0
path: .spaces[0].spaces[3].metrics.halstead.vocabulary
old: 55.0
new: 19.0
path: .spaces[0].spaces[3].metrics.halstead.purity_ratio
old: 1.424512896565068
new: 1.816135469466307
path: .spaces[0].spaces[3].metrics.halstead.N1
old: 112.0
new: 21.0
path: .spaces[0].spaces[3].metrics.halstead.effort
old: 20092.88130490711
new: 1043.1022005233692
path: .spaces[0].spaces[3].metrics.halstead.difficulty
old: 18.486486486486488
new: 7.222222222222222
path: .spaces[0].spaces[3].metrics.halstead.length
old: 188.0
new: 34.0
path: .spaces[0].spaces[3].metrics.halstead.volume
old: 1086.895626142636
new: 144.4295354570819
path: .spaces[0].spaces[3].metrics.halstead.level
old: 0.054093567251461985
new: 0.13846153846153847
path: .spaces[0].spaces[3].metrics.halstead.N2
old: 76.0
new: 13.0
path: .spaces[0].spaces[3].metrics.nexits.sum
old: 4.0
new: 0.0
path: .spaces[0].spaces[3].metrics.nexits.average
old: 4.0
new: 0.0

### Code

    void AppShutdown::SaveEnvVarsForPotentialRestart() {
      const char* s = PR_GetEnv("XUL_APP_FILE");
      if (s) {
        sSavedXulAppFile = Smprintf("%s=%s", "XUL_APP_FILE", s).release();
        MOZ_LSAN_INTENTIONALLY_LEAK_OBJECT(sSavedXulAppFile);
      }
    }

## Minimal test - lines (84, 97)

path: .spaces[0].spaces[0].metrics.nargs.sum
old: 4.0
new: 1.0
path: .spaces[0].spaces[0].metrics.nargs.average
old: 4.0
new: 1.0
path: .spaces[0].spaces[0].metrics.nexits.average
old: 1.0
new: 4.0
path: .spaces[0].spaces[0].metrics.nexits.sum
old: 1.0
new: 4.0
path: .spaces[0].spaces[0].metrics.halstead.purity_ratio
old: 2.1696491986782873
new: 1.7642458846244125
path: .spaces[0].spaces[0].metrics.halstead.bugs
old: 0.04598516146528687
new: 0.027171418130132206
path: .spaces[0].spaces[0].metrics.halstead.estimated_program_length
old: 91.12526634448808
new: 61.74860596185444
path: .spaces[0].spaces[0].metrics.halstead.n1
old: 12.0
new: 9.0
path: .spaces[0].spaces[0].metrics.halstead.difficulty
old: 8.307692307692308
new: 4.95
path: .spaces[0].spaces[0].metrics.halstead.n2
old: 13.0
new: 10.0
path: .spaces[0].spaces[0].metrics.halstead.effort
old: 1620.3485905244731
new: 735.9534417041011
path: .spaces[0].spaces[0].metrics.halstead.vocabulary
old: 25.0
new: 19.0
path: .spaces[0].spaces[0].metrics.halstead.length
old: 42.0
new: 35.0
path: .spaces[0].spaces[0].metrics.halstead.volume
old: 195.0419599705384
new: 148.67746297052548
path: .spaces[0].spaces[0].metrics.halstead.N2
old: 18.0
new: 11.0
path: .spaces[0].spaces[0].metrics.halstead.level
old: 0.12037037037037036
new: 0.202020202020202
path: .spaces[0].spaces[0].metrics.halstead.time
old: 90.01936614024851
new: 40.88630231689451
path: .spaces[0].spaces[0].metrics.cyclomatic.sum
old: 1.0
new: 4.0
path: .spaces[0].spaces[0].metrics.cyclomatic.average
old: 1.0
new: 4.0
path: .spaces[0].spaces[0].metrics.mi.mi_sei
old: 89.33387575203645
new: 103.73891487930167
path: .spaces[0].spaces[0].metrics.mi.mi_visual_studio
old: 66.85542694841793
new: 59.25030350640257
path: .spaces[0].spaces[0].metrics.mi.mi_original
old: 114.32278008179466
new: 101.3180189959484
path: .spaces[0].spaces[0].metrics.cognitive.average
old: 0.0
new: 1.0
path: .spaces[0].spaces[0].metrics.cognitive.sum
old: 0.0
new: 1.0
path: .spaces[0].spaces[0].metrics.loc.sloc
old: 6.0
new: 14.0
path: .spaces[0].spaces[0].metrics.loc.cloc
old: 0.0
new: 3.0
path: .spaces[0].spaces[0].metrics.loc.lloc
old: 2.0
new: 8.0
path: .spaces[0].spaces[0].metrics.loc.ploc
old: 6.0
new: 11.0

### Code

    ShutdownPhase GetShutdownPhaseFromPrefValue(int32_t aPrefValue) {
      switch (aPrefValue) {
        case 1:
          return ShutdownPhase::CCPostLastCycleCollection;
        case 2:
          return ShutdownPhase::XPCOMShutdownThreads;
        case 3:
          return ShutdownPhase::XPCOMShutdown;
          // NOTE: the remaining values from the ShutdownPhase enum will be added
          // when we're at least reasonably confident that the world won't come
          // crashing down if we do a fast shutdown at that point.
      }
      return ShutdownPhase::NotInShutdown;
    }