# Global Metrics

path: .metrics.halstead.n2
old: 225.0
new: 70.0
path: .metrics.halstead.purity_ratio
old: 1.717635026549021
new: 1.983484710902527
path: .metrics.halstead.difficulty
old: 8.042222222222222
new: 9.428571428571429
path: .metrics.halstead.effort
old: 65407.47640914336
new: 14266.34669836298
path: .metrics.halstead.volume
old: 8133.010329957036
new: 1513.097377099104
path: .metrics.halstead.N2
old: 517.0
new: 110.0
path: .metrics.halstead.level
old: 0.12434374136501795
new: 0.10606060606060606
path: .metrics.halstead.estimated_program_length
old: 1777.7522524782366
new: 472.0693611948015
path: .metrics.halstead.length
old: 1035.0
new: 238.0
path: .metrics.halstead.vocabulary
old: 232.0
new: 82.0
path: .metrics.halstead.N1
old: 518.0
new: 128.0
path: .metrics.halstead.n1
old: 7.0
new: 12.0
path: .metrics.halstead.time
old: 3633.7486893968535
new: 792.5748165757211
path: .metrics.halstead.bugs
old: 0.5411242631501212
new: 0.1960742644998949
path: .metrics.loc.ploc
old: 263.0
new: 72.0
path: .metrics.loc.sloc
old: 296.0
new: 159.0
path: .metrics.loc.blank
old: 0.0
new: 21.0
path: .metrics.loc.cloc
old: 271.0
new: 66.0
path: .metrics.cyclomatic.sum
old: 2.0
new: 7.0
path: .metrics.mi.mi_visual_studio
old: 18.442694454279387
new: 28.77181213430511
path: .metrics.mi.mi_original
old: 31.537007516817752
new: 49.19979874966174
path: .metrics.mi.mi_sei
old: 19.805535025481753
new: 38.01464683787641

# Spaces Data

## Minimal test - lines (15, 157)

path: .spaces[0].metrics.mi.mi_visual_studio
old: 19.279702394436125
new: 30.032462787172648
path: .spaces[0].metrics.mi.mi_original
old: 32.96829109448578
new: 51.35551136606523
path: .spaces[0].metrics.mi.mi_sei
old: 21.78422580631794
new: 40.70884597313859
path: .spaces[0].metrics.cyclomatic.sum
old: 1.0
new: 6.0
path: .spaces[0].metrics.loc.blank
old: 0.0
new: 20.0
path: .spaces[0].metrics.loc.sloc
old: 275.0
new: 143.0
path: .spaces[0].metrics.loc.ploc
old: 262.0
new: 65.0
path: .spaces[0].metrics.loc.cloc
old: 253.0
new: 58.0
path: .spaces[0].metrics.halstead.vocabulary
old: 231.0
new: 77.0
path: .spaces[0].metrics.halstead.volume
old: 8118.708508824203
new: 1453.894477441217
path: .spaces[0].metrics.halstead.bugs
old: 0.5413978536123474
new: 0.19323308695335148
path: .spaces[0].metrics.halstead.N2
old: 516.0
new: 104.0
path: .spaces[0].metrics.halstead.time
old: 3636.504852910841
new: 775.410387968649
path: .spaces[0].metrics.halstead.level
old: 0.12403100775193798
new: 0.10416666666666669
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.7103471827807606
new: 1.8727304217909628
path: .spaces[0].metrics.halstead.difficulty
old: 8.0625
new: 9.6
path: .spaces[0].metrics.halstead.estimated_program_length
old: 1768.4989869953065
new: 434.4734578555034
path: .spaces[0].metrics.halstead.effort
old: 65457.08735239514
new: 13957.386983435685
path: .spaces[0].metrics.halstead.length
old: 1034.0
new: 232.0
path: .spaces[0].metrics.halstead.N1
old: 518.0
new: 128.0
path: .spaces[0].metrics.halstead.n1
old: 7.0
new: 12.0
path: .spaces[0].metrics.halstead.n2
old: 224.0
new: 65.0

### Code

    namespace mozilla {

    /**
     * A module implements one or more XPCOM components. This structure is used
     * for both binary and script modules, but the registration members
     * (cids/contractids/categoryentries) are unused for modules which are loaded
     * via a module loader.
     */
    struct Module {
      static const unsigned int kVersion = 88;

      struct CIDEntry;

      typedef already_AddRefed (*GetFactoryProcPtr)(
          const Module& module, const CIDEntry& entry);

      typedef nsresult (*ConstructorProcPtr)(nsISupports* aOuter, const nsIID& aIID,
                                             void** aResult);

      typedef nsresult (*LoadFuncPtr)();
      typedef void (*UnloadFuncPtr)();

      /**
       * This selector allows CIDEntrys to be marked so that they're only loaded
       * into certain kinds of processes. Selectors can be combined.
       */
      // Note: This must be kept in sync with the selector matching in
      // nsComponentManager.cpp.
      enum ProcessSelector {
        ANY_PROCESS = 0x0,
        MAIN_PROCESS_ONLY = 0x1,
        CONTENT_PROCESS_ONLY = 0x2,

        /**
         * By default, modules are not loaded in the GPU process, even if
         * ANY_PROCESS is specified. This flag enables a module in the
         * GPU process.
         */
        ALLOW_IN_GPU_PROCESS = 0x4,
        ALLOW_IN_VR_PROCESS = 0x8,
        ALLOW_IN_SOCKET_PROCESS = 0x10,
        ALLOW_IN_RDD_PROCESS = 0x20,
        ALLOW_IN_GPU_AND_MAIN_PROCESS = ALLOW_IN_GPU_PROCESS | MAIN_PROCESS_ONLY,
        ALLOW_IN_GPU_AND_VR_PROCESS = ALLOW_IN_GPU_PROCESS | ALLOW_IN_VR_PROCESS,
        ALLOW_IN_GPU_AND_SOCKET_PROCESS =
            ALLOW_IN_GPU_PROCESS | ALLOW_IN_SOCKET_PROCESS,
        ALLOW_IN_GPU_VR_AND_SOCKET_PROCESS =
            ALLOW_IN_GPU_PROCESS | ALLOW_IN_VR_PROCESS | ALLOW_IN_SOCKET_PROCESS,
        ALLOW_IN_RDD_AND_SOCKET_PROCESS =
            ALLOW_IN_RDD_PROCESS | ALLOW_IN_SOCKET_PROCESS,
        ALLOW_IN_GPU_RDD_AND_SOCKET_PROCESS =
            ALLOW_IN_GPU_PROCESS | ALLOW_IN_RDD_PROCESS | ALLOW_IN_SOCKET_PROCESS,
        ALLOW_IN_GPU_RDD_VR_AND_SOCKET_PROCESS =
            ALLOW_IN_GPU_PROCESS | ALLOW_IN_RDD_PROCESS | ALLOW_IN_VR_PROCESS |
            ALLOW_IN_SOCKET_PROCESS
      };

      static constexpr size_t kMaxProcessSelector =
          size_t(ProcessSelector::ALLOW_IN_GPU_RDD_VR_AND_SOCKET_PROCESS);

      /**
       * This allows category entries to be marked so that they are or are
       * not loaded when in backgroundtask mode.
       */
      // Note: This must be kept in sync with the selector matching in
      // StaticComponents.cpp.in.
      enum BackgroundTasksSelector {
        NO_TASKS = 0x0,
        ALL_TASKS = 0xFFFF,
      };

      /**
       * The constructor callback is an implementation detail of the default binary
       * loader and may be null.
       */
      struct CIDEntry {
        const nsCID* cid;
        bool service;
        GetFactoryProcPtr getFactoryProc;
        ConstructorProcPtr constructorProc;
        ProcessSelector processSelector;
      };

      struct ContractIDEntry {
        const char* contractid;
        nsID const* cid;
        ProcessSelector processSelector;
      };

      struct CategoryEntry {
        const char* category;
        const char* entry;
        const char* value;
      };

      /**
       * Binary compatibility check, should be kModuleVersion.
       */
      unsigned int mVersion;

      /**
       * An array of CIDs (class IDs) implemented by this module. The final entry
       * should be { nullptr }.
       */
      const CIDEntry* mCIDs;

      /**
       * An array of mappings from contractid to CID. The final entry should
       * be { nullptr }.
       */
      const ContractIDEntry* mContractIDs;

      /**
       * An array of category manager entries. The final entry should be
       * { nullptr }.
       */
      const CategoryEntry* mCategoryEntries;

      /**
       * When the component manager tries to get the factory for a CID, it first
       * checks for this module-level getfactory callback. If this function is
       * not implemented, it checks the CIDEntry getfactory callback. If that is
       * also nullptr, a generic factory is generated using the CIDEntry
       * constructor callback which must be non-nullptr.
       */
      GetFactoryProcPtr getFactoryProc;

      /**
       * Optional Function which are called when this module is loaded and
       * at shutdown. These are not C++ constructor/destructors to avoid
       * calling them too early in startup or too late in shutdown.
       */
      LoadFuncPtr loadProc;
      UnloadFuncPtr unloadProc;

      /**
       * Optional flags which control whether the module loads on a process-type
       * basis.
       */
      ProcessSelector selector;
    };

    }  // namespace mozilla