Bug 1306327 - Remove everything related to frozen functions from the XPCOM glue. r=bsmedberg draft
authorMike Hommey <mh+mozilla@glandium.org>
Tue, 10 Jan 2017 17:12:43 +0900
changeset 462692 0392b89e52281f982069297cb07aa3a9017cb91e
parent 462691 604ba9db47bc2dbcef3bb7bfebf6833cb660564d
child 542473 0e0f18cc52d4bce79f4b0578647260137b81b209
push id41842
push userbmo:mh+mozilla@glandium.org
push dateTue, 17 Jan 2017 22:08:05 +0000
reviewersbsmedberg
bugs1306327
milestone53.0a1
Bug 1306327 - Remove everything related to frozen functions from the XPCOM glue. r=bsmedberg Now that nothing is using those functions, we can remove them and limit the scope of the standalone glue to initialize the new Bootstrap API.
js/src/devtools/rootAnalysis/annotations.js
xpcom/build/FrozenFunctions.cpp
xpcom/build/moz.build
xpcom/build/nsXPCOMPrivate.h
xpcom/glue/standalone/moz.build
xpcom/glue/standalone/nsXPCOMGlue.cpp
xpcom/glue/standalone/nsXPCOMGlue.h
xpcom/glue/standalone/staticruntime/moz.build
--- a/js/src/devtools/rootAnalysis/annotations.js
+++ b/js/src/devtools/rootAnalysis/annotations.js
@@ -58,17 +58,16 @@ function indirectCallCannotGC(fullCaller
 // Ignore calls through functions pointers with these types
 var ignoreClasses = {
     "JSStringFinalizer" : true,
     "SprintfState" : true,
     "SprintfStateStr" : true,
     "JSLocaleCallbacks" : true,
     "JSC::ExecutableAllocator" : true,
     "PRIOMethods": true,
-    "XPCOMFunctions" : true, // I'm a little unsure of this one
     "_MD_IOVector" : true,
     "malloc_table_t": true, // replace_malloc
     "malloc_hook_table_t": true, // replace_malloc
 };
 
 // Ignore calls through TYPE.FIELD, where TYPE is the class or struct name containing
 // a function pointer field named FIELD.
 var ignoreCallees = {
deleted file mode 100644
--- a/xpcom/build/FrozenFunctions.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "nsXPCOM.h"
-#include "nsXPCOMPrivate.h"
-#include "nsXPCOMStrings.h"
-#include "xptcall.h"
-
-#include <string.h>
-
-/**
- * Private Method to register an exit routine.  This method
- * used to allow you to setup a callback that will be called from
- * the NS_ShutdownXPCOM function after all services and
- * components have gone away. It was fatally flawed in that the component
- * DLL could be released before the exit function was called; it is now a
- * stub implementation that does nothing.
- */
-XPCOM_API(nsresult)
-NS_RegisterXPCOMExitRoutine(XPCOMExitRoutine aExitRoutine, uint32_t aPriority);
-
-XPCOM_API(nsresult)
-NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine aExitRoutine);
-
-static const XPCOMFunctions kFrozenFunctions = {
-  XPCOM_GLUE_VERSION,
-  sizeof(XPCOMFunctions),
-  &NS_InitXPCOM2,
-  &NS_ShutdownXPCOM,
-  &NS_GetServiceManager,
-  &NS_GetComponentManager,
-  &NS_GetComponentRegistrar,
-  &NS_GetMemoryManager,
-  &NS_NewLocalFile,
-  &NS_NewNativeLocalFile,
-  &NS_RegisterXPCOMExitRoutine,
-  &NS_UnregisterXPCOMExitRoutine,
-
-  // these functions were added post 1.4
-  &NS_GetDebug,
-  nullptr,
-
-  // these functions were added post 1.6
-  &NS_StringContainerInit,
-  &NS_StringContainerFinish,
-  &NS_StringGetData,
-  &NS_StringSetData,
-  &NS_StringSetDataRange,
-  &NS_StringCopy,
-  &NS_CStringContainerInit,
-  &NS_CStringContainerFinish,
-  &NS_CStringGetData,
-  &NS_CStringSetData,
-  &NS_CStringSetDataRange,
-  &NS_CStringCopy,
-  &NS_CStringToUTF16,
-  &NS_UTF16ToCString,
-  &NS_StringCloneData,
-  &NS_CStringCloneData,
-
-  // these functions were added post 1.7 (post Firefox 1.0)
-  &moz_xmalloc,
-  &moz_xrealloc,
-  &free,
-  &NS_StringContainerInit2,
-  &NS_CStringContainerInit2,
-  &NS_StringGetMutableData,
-  &NS_CStringGetMutableData,
-  nullptr,
-
-  // these functions were added post 1.8
-  &NS_DebugBreak,
-  &NS_LogInit,
-  &NS_LogTerm,
-  &NS_LogAddRef,
-  &NS_LogRelease,
-  &NS_LogCtor,
-  &NS_LogDtor,
-  &NS_LogCOMPtrAddRef,
-  &NS_LogCOMPtrRelease,
-  &NS_GetXPTCallStub,
-  &NS_DestroyXPTCallStub,
-  &NS_InvokeByIndex,
-  nullptr,
-  nullptr,
-  &NS_StringSetIsVoid,
-  &NS_StringGetIsVoid,
-  &NS_CStringSetIsVoid,
-  &NS_CStringGetIsVoid,
-
-  // these functions were added post 1.9, but then made obsolete
-  nullptr,
-  nullptr,
-
-  &NS_CycleCollectorSuspect3,
-};
-
-EXPORT_XPCOM_API(nsresult)
-NS_GetFrozenFunctions(XPCOMFunctions* aFunctions, const char* /* aLibraryPath */)
-{
-  if (!aFunctions) {
-    return NS_ERROR_OUT_OF_MEMORY;
-  }
-
-  if (aFunctions->version != XPCOM_GLUE_VERSION) {
-    return NS_ERROR_FAILURE;
-  }
-
-  uint32_t size = aFunctions->size;
-  if (size > sizeof(XPCOMFunctions)) {
-    size = sizeof(XPCOMFunctions);
-  }
-
-  size -= offsetof(XPCOMFunctions, init);
-
-  memcpy(&aFunctions->init, &kFrozenFunctions.init, size);
-
-  return NS_OK;
-}
-
-/*
- * Stubs for nsXPCOMPrivate.h
- */
-
-EXPORT_XPCOM_API(nsresult)
-NS_RegisterXPCOMExitRoutine(XPCOMExitRoutine aExitRoutine, uint32_t aPriority)
-{
-  return NS_OK;
-}
-
-EXPORT_XPCOM_API(nsresult)
-NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine aExitRoutine)
-{
-  return NS_OK;
-}
--- a/xpcom/build/moz.build
+++ b/xpcom/build/moz.build
@@ -45,17 +45,16 @@ else:
     SOURCES += ['PoisonIOInterposerStub.cpp']
 
 include('../glue/objs.mozbuild')
 
 UNIFIED_SOURCES += xpcom_gluens_src_cppsrcs
 UNIFIED_SOURCES += xpcom_glue_src_cppsrcs
 
 UNIFIED_SOURCES += [
-    'FrozenFunctions.cpp',
     'IOInterposer.cpp',
     'LateWriteChecks.cpp',
     'MainThreadIOLogger.cpp',
     'nsXPCOMStrings.cpp',
     'Services.cpp',
     'XPCOMInit.cpp',
 ]
 
--- a/xpcom/build/nsXPCOMPrivate.h
+++ b/xpcom/build/nsXPCOMPrivate.h
@@ -4,208 +4,31 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef nsXPCOMPrivate_h__
 #define nsXPCOMPrivate_h__
 
 #include "nscore.h"
 #include "nsXPCOM.h"
-#include "nsXPCOMStrings.h"
 #include "xptcall.h"
 
-class nsStringContainer;
-class nsCStringContainer;
-class nsPurpleBufferEntry;
-
 /**
  * During this shutdown notification all threads which run XPCOM code must
  * be joined.
  */
 #define NS_XPCOM_SHUTDOWN_THREADS_OBSERVER_ID "xpcom-shutdown-threads"
 
 /**
  * During this shutdown notification all module loaders must unload XPCOM
  * modules.
  */
 #define NS_XPCOM_SHUTDOWN_LOADERS_OBSERVER_ID "xpcom-shutdown-loaders"
 
 // PUBLIC
-typedef nsresult   (*InitFunc)(nsIServiceManager** aResult,
-                               nsIFile* aBinDirectory,
-                               nsIDirectoryServiceProvider* aAppFileLocationProvider);
-typedef nsresult   (*ShutdownFunc)(nsIServiceManager* aServMgr);
-typedef nsresult   (*GetServiceManagerFunc)(nsIServiceManager** aResult);
-typedef nsresult   (*GetComponentManagerFunc)(nsIComponentManager** aResult);
-typedef nsresult   (*GetComponentRegistrarFunc)(nsIComponentRegistrar** aResult);
-typedef nsresult   (*GetMemoryManagerFunc)(nsIMemory** aResult);
-typedef nsresult   (*NewLocalFileFunc)(const nsAString& aPath,
-                                       bool aFollowLinks, nsIFile** aResult);
-typedef nsresult   (*NewNativeLocalFileFunc)(const nsACString& aPath,
-                                             bool aFollowLinks,
-                                             nsIFile** aResult);
-
-typedef nsresult   (*GetDebugFunc)(nsIDebug2** aResult);
-
-typedef nsresult   (*StringContainerInitFunc)(nsStringContainer&);
-typedef nsresult   (*StringContainerInit2Func)(nsStringContainer&,
-                                               const char16_t*,
-                                               uint32_t, uint32_t);
-typedef void       (*StringContainerFinishFunc)(nsStringContainer&);
-typedef uint32_t   (*StringGetDataFunc)(const nsAString&, const char16_t**,
-                                        bool*);
-typedef uint32_t   (*StringGetMutableDataFunc)(nsAString&, uint32_t,
-                                               char16_t**);
-typedef char16_t*  (*StringCloneDataFunc)(const nsAString&);
-typedef nsresult   (*StringSetDataFunc)(nsAString&, const char16_t*, uint32_t);
-typedef nsresult   (*StringSetDataRangeFunc)(nsAString&, uint32_t, uint32_t,
-                                             const char16_t*, uint32_t);
-typedef nsresult   (*StringCopyFunc)(nsAString&, const nsAString&);
-typedef void       (*StringSetIsVoidFunc)(nsAString&, const bool);
-typedef bool       (*StringGetIsVoidFunc)(const nsAString&);
-
-typedef nsresult   (*CStringContainerInitFunc)(nsCStringContainer&);
-typedef nsresult   (*CStringContainerInit2Func)(nsCStringContainer&,
-                                                const char*,
-                                                uint32_t, uint32_t);
-typedef void       (*CStringContainerFinishFunc)(nsCStringContainer&);
-typedef uint32_t   (*CStringGetDataFunc)(const nsACString&, const char**,
-                                         bool*);
-typedef uint32_t   (*CStringGetMutableDataFunc)(nsACString&, uint32_t, char**);
-typedef char*      (*CStringCloneDataFunc)(const nsACString&);
-typedef nsresult   (*CStringSetDataFunc)(nsACString&, const char*, uint32_t);
-typedef nsresult   (*CStringSetDataRangeFunc)(nsACString&, uint32_t, uint32_t,
-                                              const char*, uint32_t);
-typedef nsresult   (*CStringCopyFunc)(nsACString&, const nsACString&);
-typedef void       (*CStringSetIsVoidFunc)(nsACString&, const bool);
-typedef bool       (*CStringGetIsVoidFunc)(const nsACString&);
-
-typedef nsresult   (*CStringToUTF16)(const nsACString&, nsCStringEncoding,
-                                     nsAString&);
-typedef nsresult   (*UTF16ToCString)(const nsAString&, nsCStringEncoding,
-                                     nsACString&);
-
-typedef void*      (*AllocFunc)(size_t aSize);
-typedef void*      (*ReallocFunc)(void* aPtr, size_t aSize);
-typedef void       (*FreeFunc)(void* aPtr);
-
-typedef void       (*DebugBreakFunc)(uint32_t aSeverity,
-                                     const char* aStr, const char* aExpr,
-                                     const char* aFile, int32_t aLine);
-
-typedef void       (*xpcomVoidFunc)();
-typedef void       (*LogAddRefFunc)(void*, nsrefcnt, const char*, uint32_t);
-typedef void       (*LogReleaseFunc)(void*, nsrefcnt, const char*);
-typedef void       (*LogCtorFunc)(void*, const char*, uint32_t);
-typedef void       (*LogCOMPtrFunc)(void*, nsISupports*);
-
-typedef nsresult   (*GetXPTCallStubFunc)(REFNSIID, nsIXPTCProxy*,
-                                         nsISomeInterface**);
-typedef void       (*DestroyXPTCallStubFunc)(nsISomeInterface*);
-typedef nsresult   (*InvokeByIndexFunc)(nsISupports*, uint32_t, uint32_t,
-                                        nsXPTCVariant*);
-typedef bool       (*CycleCollectorFunc)(nsISupports*);
-typedef nsPurpleBufferEntry*
-                   (*CycleCollectorSuspect2Func)(void*,
-                                                 nsCycleCollectionParticipant*);
-typedef bool       (*CycleCollectorForget2Func)(nsPurpleBufferEntry*);
-typedef void       (*CycleCollectorSuspect3Func)(void*,
-                                                 nsCycleCollectionParticipant*,
-                                                 nsCycleCollectingAutoRefCnt*,
-                                                 bool*);
-// PRIVATE AND DEPRECATED
-typedef NS_CALLBACK_(nsresult, XPCOMExitRoutine)(void);
-
-typedef nsresult   (*RegisterXPCOMExitRoutineFunc)(XPCOMExitRoutine aExitRoutine,
-                                                   uint32_t aPriority);
-typedef nsresult   (*UnregisterXPCOMExitRoutineFunc)(XPCOMExitRoutine aExitRoutine);
-
-typedef struct XPCOMFunctions
-{
-  uint32_t version;
-  uint32_t size;
-
-  InitFunc init;
-  ShutdownFunc shutdown;
-  GetServiceManagerFunc getServiceManager;
-  GetComponentManagerFunc getComponentManager;
-  GetComponentRegistrarFunc getComponentRegistrar;
-  GetMemoryManagerFunc getMemoryManager;
-  NewLocalFileFunc newLocalFile;
-  NewNativeLocalFileFunc newNativeLocalFile;
-
-  RegisterXPCOMExitRoutineFunc registerExitRoutine;
-  UnregisterXPCOMExitRoutineFunc unregisterExitRoutine;
-
-  // Added for Mozilla 1.5
-  GetDebugFunc getDebug;
-  void* getTraceRefcnt;
-
-  // Added for Mozilla 1.7
-  StringContainerInitFunc stringContainerInit;
-  StringContainerFinishFunc stringContainerFinish;
-  StringGetDataFunc stringGetData;
-  StringSetDataFunc stringSetData;
-  StringSetDataRangeFunc stringSetDataRange;
-  StringCopyFunc stringCopy;
-  CStringContainerInitFunc cstringContainerInit;
-  CStringContainerFinishFunc cstringContainerFinish;
-  CStringGetDataFunc cstringGetData;
-  CStringSetDataFunc cstringSetData;
-  CStringSetDataRangeFunc cstringSetDataRange;
-  CStringCopyFunc cstringCopy;
-  CStringToUTF16 cstringToUTF16;
-  UTF16ToCString utf16ToCString;
-  StringCloneDataFunc stringCloneData;
-  CStringCloneDataFunc cstringCloneData;
-
-  // Added for Mozilla 1.8
-  AllocFunc allocFunc;
-  ReallocFunc reallocFunc;
-  FreeFunc freeFunc;
-  StringContainerInit2Func stringContainerInit2;
-  CStringContainerInit2Func cstringContainerInit2;
-  StringGetMutableDataFunc stringGetMutableData;
-  CStringGetMutableDataFunc cstringGetMutableData;
-  void* init3; // obsolete
-
-  // Added for Mozilla 1.9
-  DebugBreakFunc debugBreakFunc;
-  xpcomVoidFunc logInitFunc;
-  xpcomVoidFunc logTermFunc;
-  LogAddRefFunc logAddRefFunc;
-  LogReleaseFunc logReleaseFunc;
-  LogCtorFunc logCtorFunc;
-  LogCtorFunc logDtorFunc;
-  LogCOMPtrFunc logCOMPtrAddRefFunc;
-  LogCOMPtrFunc logCOMPtrReleaseFunc;
-  GetXPTCallStubFunc getXPTCallStubFunc;
-  DestroyXPTCallStubFunc destroyXPTCallStubFunc;
-  InvokeByIndexFunc invokeByIndexFunc;
-  CycleCollectorFunc cycleSuspectFunc; // obsolete: use cycleSuspect3Func
-  CycleCollectorFunc cycleForgetFunc; // obsolete
-  StringSetIsVoidFunc stringSetIsVoid;
-  StringGetIsVoidFunc stringGetIsVoid;
-  CStringSetIsVoidFunc cstringSetIsVoid;
-  CStringGetIsVoidFunc cstringGetIsVoid;
-
-  // Added for Mozilla 1.9.1
-  CycleCollectorSuspect2Func cycleSuspect2Func; // obsolete: use cycleSuspect3Func
-  CycleCollectorForget2Func cycleForget2Func; // obsolete
-
-  CycleCollectorSuspect3Func cycleSuspect3Func;
-
-} XPCOMFunctions;
-
-typedef nsresult (*GetFrozenFunctionsFunc)(XPCOMFunctions* aEntryPoints,
-                                           const char* aLibraryPath);
-XPCOM_API(nsresult) NS_GetFrozenFunctions(XPCOMFunctions* aEntryPoints,
-                                          const char* aLibraryPath);
-
-
 namespace mozilla {
 
 /**
  * Shutdown XPCOM. You must call this method after you are finished
  * using xpcom.
  *
  * @param aServMgr          The service manager which was returned by NS_InitXPCOM.
  *                          This will release servMgr.  You may pass null.
@@ -222,20 +45,16 @@ void SetICUMemoryFunctions();
 /**
  * C++ namespaced version of NS_LogTerm.
  */
 void LogTerm();
 
 } // namespace mozilla
 
 
-// think hard before changing this
-#define XPCOM_GLUE_VERSION 1
-
-
 /* XPCOM Specific Defines
  *
  * XPCOM_DLL              - name of the loadable xpcom library on disk.
  * XUL_DLL                - name of the loadable XUL library on disk
  * XPCOM_SEARCH_KEY       - name of the environment variable that can be
  *                          modified to include additional search paths.
  * GRE_CONF_NAME          - Name of the GRE Configuration file
  */
--- a/xpcom/glue/standalone/moz.build
+++ b/xpcom/glue/standalone/moz.build
@@ -4,22 +4,18 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 # On win we build two glue libs - glue linked to crt dlls here and in staticruntime we build
 # a statically linked glue lib.
 if CONFIG['OS_ARCH'] == 'WINNT':
     DIRS += ['staticruntime']
 
-include('../objs.mozbuild')
-
-SOURCES += xpcom_glue_src_cppsrcs
-
 SOURCES += [
-    '../nsStringAPI.cpp',
+    '../FileUtils.cpp',
     'nsXPCOMGlue.cpp',
 ]
 
 Library('xpcomglue')
 
 EXPORTS += [
     'nsXPCOMGlue.h',
 ]
--- a/xpcom/glue/standalone/nsXPCOMGlue.cpp
+++ b/xpcom/glue/standalone/nsXPCOMGlue.cpp
@@ -16,18 +16,16 @@
 
 #include "mozilla/FileUtils.h"
 #include "mozilla/Sprintf.h"
 
 using namespace mozilla;
 
 #define XPCOM_DEPENDENT_LIBS_LIST "dependentlibs.list"
 
-static XPCOMFunctions xpcomFunctions;
-
 #if defined(XP_WIN)
 #define READ_TEXTMODE L"rt"
 #else
 #define READ_TEXTMODE "r"
 #endif
 
 #if defined(XP_WIN)
 #include <windows.h>
@@ -110,22 +108,24 @@ GetLibHandle(pathstr_t aDependentLib)
 }
 
 static NSFuncPtr
 GetSymbol(LibHandleType aLibHandle, const char* aSymbol)
 {
   return (NSFuncPtr)dlsym(aLibHandle, aSymbol);
 }
 
+#ifndef MOZ_LINKER
 static void
 CloseLibHandle(LibHandleType aLibHandle)
 {
   dlclose(aLibHandle);
 }
 #endif
+#endif
 
 struct DependentLib
 {
   LibHandleType libHandle;
   DependentLib* next;
 };
 
 static DependentLib* sTop;
@@ -192,28 +192,30 @@ struct ScopedCloseFileTraits
   {
     if (aFile) {
       fclose(aFile);
     }
   }
 };
 typedef Scoped<ScopedCloseFileTraits> ScopedCloseFile;
 
+#ifndef MOZ_LINKER
 static void
 XPCOMGlueUnload()
 {
   while (sTop) {
     CloseLibHandle(sTop->libHandle);
 
     DependentLib* temp = sTop;
     sTop = sTop->next;
 
     delete temp;
   }
 }
+#endif
 
 #if defined(XP_WIN)
 // like strpbrk but finds the *last* char, not the first
 static const char*
 ns_strrpbrk(const char* string, const char* strCharSet)
 {
   const char* found = nullptr;
   for (; *string; ++string) {
@@ -225,36 +227,36 @@ ns_strrpbrk(const char* string, const ch
       }
     }
   }
 
   return found;
 }
 #endif
 
-static GetFrozenFunctionsFunc
+static nsresult
 XPCOMGlueLoad(const char* aXPCOMFile)
 {
 #ifdef MOZ_LINKER
   if (!ReadDependentCB(aXPCOMFile)) {
-    return nullptr;
+    return NS_ERROR_FAILURE;
   }
 #else
   char xpcomDir[MAXPATHLEN];
 #ifdef XP_WIN
   const char* lastSlash = ns_strrpbrk(aXPCOMFile, "/\\");
 #elif XP_MACOSX
   // On OSX, the dependentlibs.list file lives under Contents/Resources.
   // However, the actual libraries listed in dependentlibs.list live under
   // Contents/MacOS. We want to read the list from Contents/Resources, then
   // load the libraries from Contents/MacOS.
   const char *tempSlash = strrchr(aXPCOMFile, '/');
   size_t tempLen = size_t(tempSlash - aXPCOMFile);
   if (tempLen > MAXPATHLEN) {
-    return nullptr;
+    return NS_ERROR_FAILURE;
   }
   char tempBuffer[MAXPATHLEN];
   memcpy(tempBuffer, aXPCOMFile, tempLen);
   tempBuffer[tempLen] = '\0';
   const char *slash = strrchr(tempBuffer, '/');
   tempLen = size_t(slash - tempBuffer);
   const char *lastSlash = aXPCOMFile + tempLen;
 #else
@@ -265,17 +267,17 @@ XPCOMGlueLoad(const char* aXPCOMFile)
     size_t len = size_t(lastSlash - aXPCOMFile);
 
     if (len > MAXPATHLEN - sizeof(XPCOM_FILE_PATH_SEPARATOR
 #ifdef XP_MACOSX
                                   "Resources"
                                   XPCOM_FILE_PATH_SEPARATOR
 #endif
                                   XPCOM_DEPENDENT_LIBS_LIST)) {
-      return nullptr;
+      return NS_ERROR_FAILURE;
     }
     memcpy(xpcomDir, aXPCOMFile, len);
     strcpy(xpcomDir + len, XPCOM_FILE_PATH_SEPARATOR
 #ifdef XP_MACOSX
                            "Resources"
                            XPCOM_FILE_PATH_SEPARATOR
 #endif
                            XPCOM_DEPENDENT_LIBS_LIST);
@@ -287,23 +289,23 @@ XPCOMGlueLoad(const char* aXPCOMFile)
 
   if (getenv("MOZ_RUN_GTEST")) {
     strcat(xpcomDir, ".gtest");
   }
 
   ScopedCloseFile flist;
   flist = TS_tfopen(xpcomDir, READ_TEXTMODE);
   if (!flist) {
-    return nullptr;
+    return NS_ERROR_FAILURE;
   }
 
 #ifdef XP_MACOSX
   tempLen = size_t(cursor - xpcomDir);
   if (tempLen > MAXPATHLEN - sizeof("MacOS" XPCOM_FILE_PATH_SEPARATOR) - 1) {
-    return nullptr;
+    return NS_ERROR_FAILURE;
   }
   strcpy(cursor, "MacOS" XPCOM_FILE_PATH_SEPARATOR);
   cursor += strlen(cursor);
 #endif
   *cursor = '\0';
 
   char buffer[MAXPATHLEN];
 
@@ -316,58 +318,27 @@ XPCOMGlueLoad(const char* aXPCOMFile)
     }
 
     // cut the trailing newline, if present
     if (buffer[l - 1] == '\n') {
       buffer[l - 1] = '\0';
     }
 
     if (l + size_t(cursor - xpcomDir) > MAXPATHLEN) {
-      return nullptr;
+      return NS_ERROR_FAILURE;
     }
 
     strcpy(cursor, buffer);
     if (!ReadDependentCB(xpcomDir)) {
       XPCOMGlueUnload();
-      return nullptr;
+      return NS_ERROR_FAILURE;
     }
   }
 #endif
-
-  GetFrozenFunctionsFunc sym =
-    (GetFrozenFunctionsFunc)GetSymbol(sTop->libHandle,
-                                      "NS_GetFrozenFunctions");
-
-  if (!sym) { // No symbol found.
-    XPCOMGlueUnload();
-    return nullptr;
-  }
-
-  return sym;
-}
-
-nsresult
-XPCOMGlueLoadXULFunctions(const nsDynamicFunctionLoad* aSymbols)
-{
-  // We don't null-check sXULLibHandle because this might work even
-  // if it is null (same as RTLD_DEFAULT)
-
-  nsresult rv = NS_OK;
-  while (aSymbols->functionName) {
-    char buffer[512];
-    SprintfLiteral(buffer, "%s", aSymbols->functionName);
-
-    *aSymbols->function = (NSFuncPtr)GetSymbol(sTop->libHandle, buffer);
-    if (!*aSymbols->function) {
-      rv = NS_ERROR_LOSS_OF_SIGNIFICANT_DATA;
-    }
-
-    ++aSymbols;
-  }
-  return rv;
+  return NS_OK;
 }
 
 #if defined(MOZ_WIDGET_GTK) && (defined(MOZ_MEMORY) || defined(__FreeBSD__) || defined(__NetBSD__))
 #define MOZ_GSLICE_INIT
 #endif
 
 #ifdef MOZ_GSLICE_INIT
 #include <glib.h>
@@ -403,547 +374,37 @@ public:
     }
   }
 
 private:
   bool mHadGSlice;
 };
 #endif
 
-nsresult
-XPCOMGlueStartup(const char* aXPCOMFile)
+namespace mozilla {
+
+Bootstrap::UniquePtr
+GetBootstrap(const char* aXPCOMFile)
 {
 #ifdef MOZ_GSLICE_INIT
   GSliceInit gSliceInit;
 #endif
-  xpcomFunctions.version = XPCOM_GLUE_VERSION;
-  xpcomFunctions.size    = sizeof(XPCOMFunctions);
 
   if (!aXPCOMFile) {
     aXPCOMFile = XPCOM_DLL;
   }
 
-  GetFrozenFunctionsFunc func = XPCOMGlueLoad(aXPCOMFile);
-  if (!func) {
-    return NS_ERROR_NOT_AVAILABLE;
-  }
-
-  nsresult rv = (*func)(&xpcomFunctions, nullptr);
-  if (NS_FAILED(rv)) {
-    XPCOMGlueUnload();
-    return rv;
-  }
-
-  return NS_OK;
-}
-
-namespace mozilla {
-
-Bootstrap::UniquePtr
-GetBootstrap(const char* aXPCOMFile)
-{
-  if (NS_FAILED(XPCOMGlueStartup(aXPCOMFile))) {
+  if (NS_FAILED(XPCOMGlueLoad(aXPCOMFile))) {
     return nullptr;
   }
 
   GetBootstrapType func = (GetBootstrapType)GetSymbol(sTop->libHandle, "XRE_GetBootstrap");
   if (!func) {
     return nullptr;
   }
 
   Bootstrap::UniquePtr b;
   (*func)(b);
 
   return b;
 }
 
 } // namespace mozilla
-
-XPCOM_API(nsresult)
-NS_InitXPCOM2(nsIServiceManager** aResult,
-              nsIFile* aBinDirectory,
-              nsIDirectoryServiceProvider* aAppFileLocationProvider)
-{
-  if (!xpcomFunctions.init) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.init(aResult, aBinDirectory, aAppFileLocationProvider);
-}
-
-XPCOM_API(nsresult)
-NS_ShutdownXPCOM(nsIServiceManager* aServMgr)
-{
-  if (!xpcomFunctions.shutdown) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.shutdown(aServMgr);
-}
-
-XPCOM_API(nsresult)
-NS_GetServiceManager(nsIServiceManager** aResult)
-{
-  if (!xpcomFunctions.getServiceManager) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.getServiceManager(aResult);
-}
-
-XPCOM_API(nsresult)
-NS_GetComponentManager(nsIComponentManager** aResult)
-{
-  if (!xpcomFunctions.getComponentManager) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.getComponentManager(aResult);
-}
-
-XPCOM_API(nsresult)
-NS_GetComponentRegistrar(nsIComponentRegistrar** aResult)
-{
-  if (!xpcomFunctions.getComponentRegistrar) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.getComponentRegistrar(aResult);
-}
-
-XPCOM_API(nsresult)
-NS_GetMemoryManager(nsIMemory** aResult)
-{
-  if (!xpcomFunctions.getMemoryManager) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.getMemoryManager(aResult);
-}
-
-XPCOM_API(nsresult)
-NS_NewLocalFile(const nsAString& aPath, bool aFollowLinks, nsIFile** aResult)
-{
-  if (!xpcomFunctions.newLocalFile) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.newLocalFile(aPath, aFollowLinks, aResult);
-}
-
-XPCOM_API(nsresult)
-NS_NewNativeLocalFile(const nsACString& aPath, bool aFollowLinks,
-                      nsIFile** aResult)
-{
-  if (!xpcomFunctions.newNativeLocalFile) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.newNativeLocalFile(aPath, aFollowLinks, aResult);
-}
-
-XPCOM_API(nsresult)
-NS_GetDebug(nsIDebug2** aResult)
-{
-  if (!xpcomFunctions.getDebug) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.getDebug(aResult);
-}
-
-
-XPCOM_API(nsresult)
-NS_StringContainerInit(nsStringContainer& aStr)
-{
-  if (!xpcomFunctions.stringContainerInit) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.stringContainerInit(aStr);
-}
-
-XPCOM_API(nsresult)
-NS_StringContainerInit2(nsStringContainer& aStr, const char16_t* aData,
-                        uint32_t aDataLength, uint32_t aFlags)
-{
-  if (!xpcomFunctions.stringContainerInit2) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.stringContainerInit2(aStr, aData, aDataLength, aFlags);
-}
-
-XPCOM_API(void)
-NS_StringContainerFinish(nsStringContainer& aStr)
-{
-  if (xpcomFunctions.stringContainerFinish) {
-    xpcomFunctions.stringContainerFinish(aStr);
-  }
-}
-
-XPCOM_API(uint32_t)
-NS_StringGetData(const nsAString& aStr, const char16_t** aBuf, bool* aTerm)
-{
-  if (!xpcomFunctions.stringGetData) {
-    *aBuf = nullptr;
-    return 0;
-  }
-  return xpcomFunctions.stringGetData(aStr, aBuf, aTerm);
-}
-
-XPCOM_API(uint32_t)
-NS_StringGetMutableData(nsAString& aStr, uint32_t aLen, char16_t** aBuf)
-{
-  if (!xpcomFunctions.stringGetMutableData) {
-    *aBuf = nullptr;
-    return 0;
-  }
-  return xpcomFunctions.stringGetMutableData(aStr, aLen, aBuf);
-}
-
-XPCOM_API(char16_t*)
-NS_StringCloneData(const nsAString& aStr)
-{
-  if (!xpcomFunctions.stringCloneData) {
-    return nullptr;
-  }
-  return xpcomFunctions.stringCloneData(aStr);
-}
-
-XPCOM_API(nsresult)
-NS_StringSetData(nsAString& aStr, const char16_t* aBuf, uint32_t aCount)
-{
-  if (!xpcomFunctions.stringSetData) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-
-  return xpcomFunctions.stringSetData(aStr, aBuf, aCount);
-}
-
-XPCOM_API(nsresult)
-NS_StringSetDataRange(nsAString& aStr, uint32_t aCutStart, uint32_t aCutLength,
-                      const char16_t* aBuf, uint32_t aCount)
-{
-  if (!xpcomFunctions.stringSetDataRange) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.stringSetDataRange(aStr, aCutStart, aCutLength, aBuf,
-                                           aCount);
-}
-
-XPCOM_API(nsresult)
-NS_StringCopy(nsAString& aDest, const nsAString& aSrc)
-{
-  if (!xpcomFunctions.stringCopy) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.stringCopy(aDest, aSrc);
-}
-
-XPCOM_API(void)
-NS_StringSetIsVoid(nsAString& aStr, const bool aIsVoid)
-{
-  if (xpcomFunctions.stringSetIsVoid) {
-    xpcomFunctions.stringSetIsVoid(aStr, aIsVoid);
-  }
-}
-
-XPCOM_API(bool)
-NS_StringGetIsVoid(const nsAString& aStr)
-{
-  if (!xpcomFunctions.stringGetIsVoid) {
-    return false;
-  }
-  return xpcomFunctions.stringGetIsVoid(aStr);
-}
-
-XPCOM_API(nsresult)
-NS_CStringContainerInit(nsCStringContainer& aStr)
-{
-  if (!xpcomFunctions.cstringContainerInit) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.cstringContainerInit(aStr);
-}
-
-XPCOM_API(nsresult)
-NS_CStringContainerInit2(nsCStringContainer& aStr, const char* aData,
-                         uint32_t aDataLength, uint32_t aFlags)
-{
-  if (!xpcomFunctions.cstringContainerInit2) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.cstringContainerInit2(aStr, aData, aDataLength, aFlags);
-}
-
-XPCOM_API(void)
-NS_CStringContainerFinish(nsCStringContainer& aStr)
-{
-  if (xpcomFunctions.cstringContainerFinish) {
-    xpcomFunctions.cstringContainerFinish(aStr);
-  }
-}
-
-XPCOM_API(uint32_t)
-NS_CStringGetData(const nsACString& aStr, const char** aBuf, bool* aTerm)
-{
-  if (!xpcomFunctions.cstringGetData) {
-    *aBuf = nullptr;
-    return 0;
-  }
-  return xpcomFunctions.cstringGetData(aStr, aBuf, aTerm);
-}
-
-XPCOM_API(uint32_t)
-NS_CStringGetMutableData(nsACString& aStr, uint32_t aLen, char** aBuf)
-{
-  if (!xpcomFunctions.cstringGetMutableData) {
-    *aBuf = nullptr;
-    return 0;
-  }
-  return xpcomFunctions.cstringGetMutableData(aStr, aLen, aBuf);
-}
-
-XPCOM_API(char*)
-NS_CStringCloneData(const nsACString& aStr)
-{
-  if (!xpcomFunctions.cstringCloneData) {
-    return nullptr;
-  }
-  return xpcomFunctions.cstringCloneData(aStr);
-}
-
-XPCOM_API(nsresult)
-NS_CStringSetData(nsACString& aStr, const char* aBuf, uint32_t aCount)
-{
-  if (!xpcomFunctions.cstringSetData) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.cstringSetData(aStr, aBuf, aCount);
-}
-
-XPCOM_API(nsresult)
-NS_CStringSetDataRange(nsACString& aStr, uint32_t aCutStart,
-                       uint32_t aCutLength, const char* aBuf, uint32_t aCount)
-{
-  if (!xpcomFunctions.cstringSetDataRange) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.cstringSetDataRange(aStr, aCutStart, aCutLength, aBuf,
-                                            aCount);
-}
-
-XPCOM_API(nsresult)
-NS_CStringCopy(nsACString& aDest, const nsACString& aSrc)
-{
-  if (!xpcomFunctions.cstringCopy) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.cstringCopy(aDest, aSrc);
-}
-
-XPCOM_API(void)
-NS_CStringSetIsVoid(nsACString& aStr, const bool aIsVoid)
-{
-  if (xpcomFunctions.cstringSetIsVoid) {
-    xpcomFunctions.cstringSetIsVoid(aStr, aIsVoid);
-  }
-}
-
-XPCOM_API(bool)
-NS_CStringGetIsVoid(const nsACString& aStr)
-{
-  if (!xpcomFunctions.cstringGetIsVoid) {
-    return false;
-  }
-  return xpcomFunctions.cstringGetIsVoid(aStr);
-}
-
-XPCOM_API(nsresult)
-NS_CStringToUTF16(const nsACString& aSrc, nsCStringEncoding aSrcEncoding,
-                  nsAString& aDest)
-{
-  if (!xpcomFunctions.cstringToUTF16) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.cstringToUTF16(aSrc, aSrcEncoding, aDest);
-}
-
-XPCOM_API(nsresult)
-NS_UTF16ToCString(const nsAString& aSrc, nsCStringEncoding aDestEncoding,
-                  nsACString& aDest)
-{
-  if (!xpcomFunctions.utf16ToCString) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-  return xpcomFunctions.utf16ToCString(aSrc, aDestEncoding, aDest);
-}
-
-XPCOM_API(void*)
-NS_Alloc(size_t aSize)
-{
-  if (!xpcomFunctions.allocFunc) {
-    return nullptr;
-  }
-  return xpcomFunctions.allocFunc(aSize);
-}
-
-XPCOM_API(void*)
-NS_Realloc(void* aPtr, size_t aSize)
-{
-  if (!xpcomFunctions.reallocFunc) {
-    return nullptr;
-  }
-  return xpcomFunctions.reallocFunc(aPtr, aSize);
-}
-
-XPCOM_API(void)
-NS_Free(void* aPtr)
-{
-  if (xpcomFunctions.freeFunc) {
-    xpcomFunctions.freeFunc(aPtr);
-  }
-}
-
-XPCOM_API(void)
-NS_DebugBreak(uint32_t aSeverity, const char* aStr, const char* aExpr,
-              const char* aFile, int32_t aLine)
-{
-  if (xpcomFunctions.debugBreakFunc) {
-    xpcomFunctions.debugBreakFunc(aSeverity, aStr, aExpr, aFile, aLine);
-  }
-}
-
-XPCOM_API(void)
-NS_LogInit()
-{
-  if (xpcomFunctions.logInitFunc) {
-    xpcomFunctions.logInitFunc();
-  }
-}
-
-XPCOM_API(void)
-NS_LogTerm()
-{
-  if (xpcomFunctions.logTermFunc) {
-    xpcomFunctions.logTermFunc();
-  }
-}
-
-XPCOM_API(void)
-NS_LogAddRef(void* aPtr, nsrefcnt aNewRefCnt,
-             const char* aTypeName, uint32_t aInstanceSize)
-{
-  if (xpcomFunctions.logAddRefFunc)
-    xpcomFunctions.logAddRefFunc(aPtr, aNewRefCnt,
-                                 aTypeName, aInstanceSize);
-}
-
-XPCOM_API(void)
-NS_LogRelease(void* aPtr, nsrefcnt aNewRefCnt, const char* aTypeName)
-{
-  if (xpcomFunctions.logReleaseFunc) {
-    xpcomFunctions.logReleaseFunc(aPtr, aNewRefCnt, aTypeName);
-  }
-}
-
-XPCOM_API(void)
-NS_LogCtor(void* aPtr, const char* aTypeName, uint32_t aInstanceSize)
-{
-  if (xpcomFunctions.logCtorFunc) {
-    xpcomFunctions.logCtorFunc(aPtr, aTypeName, aInstanceSize);
-  }
-}
-
-XPCOM_API(void)
-NS_LogDtor(void* aPtr, const char* aTypeName, uint32_t aInstanceSize)
-{
-  if (xpcomFunctions.logDtorFunc) {
-    xpcomFunctions.logDtorFunc(aPtr, aTypeName, aInstanceSize);
-  }
-}
-
-XPCOM_API(void)
-NS_LogCOMPtrAddRef(void* aCOMPtr, nsISupports* aObject)
-{
-  if (xpcomFunctions.logCOMPtrAddRefFunc) {
-    xpcomFunctions.logCOMPtrAddRefFunc(aCOMPtr, aObject);
-  }
-}
-
-XPCOM_API(void)
-NS_LogCOMPtrRelease(void* aCOMPtr, nsISupports* aObject)
-{
-  if (xpcomFunctions.logCOMPtrReleaseFunc) {
-    xpcomFunctions.logCOMPtrReleaseFunc(aCOMPtr, aObject);
-  }
-}
-
-XPCOM_API(nsresult)
-NS_GetXPTCallStub(REFNSIID aIID, nsIXPTCProxy* aOuter,
-                  nsISomeInterface** aStub)
-{
-  if (!xpcomFunctions.getXPTCallStubFunc) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-
-  return xpcomFunctions.getXPTCallStubFunc(aIID, aOuter, aStub);
-}
-
-XPCOM_API(void)
-NS_DestroyXPTCallStub(nsISomeInterface* aStub)
-{
-  if (xpcomFunctions.destroyXPTCallStubFunc) {
-    xpcomFunctions.destroyXPTCallStubFunc(aStub);
-  }
-}
-
-XPCOM_API(nsresult)
-NS_InvokeByIndex(nsISupports* aThat, uint32_t aMethodIndex,
-                 uint32_t aParamCount, nsXPTCVariant* aParams)
-{
-  if (!xpcomFunctions.invokeByIndexFunc) {
-    return NS_ERROR_NOT_INITIALIZED;
-  }
-
-  return xpcomFunctions.invokeByIndexFunc(aThat, aMethodIndex,
-                                          aParamCount, aParams);
-}
-
-XPCOM_API(bool)
-NS_CycleCollectorSuspect(nsISupports* aObj)
-{
-  if (!xpcomFunctions.cycleSuspectFunc) {
-    return false;
-  }
-
-  return xpcomFunctions.cycleSuspectFunc(aObj);
-}
-
-XPCOM_API(bool)
-NS_CycleCollectorForget(nsISupports* aObj)
-{
-  if (!xpcomFunctions.cycleForgetFunc) {
-    return false;
-  }
-
-  return xpcomFunctions.cycleForgetFunc(aObj);
-}
-
-XPCOM_API(nsPurpleBufferEntry*)
-NS_CycleCollectorSuspect2(void* aObj, nsCycleCollectionParticipant* aCp)
-{
-  if (!xpcomFunctions.cycleSuspect2Func) {
-    return nullptr;
-  }
-
-  return xpcomFunctions.cycleSuspect2Func(aObj, aCp);
-}
-
-XPCOM_API(void)
-NS_CycleCollectorSuspect3(void* aObj, nsCycleCollectionParticipant* aCp,
-                          nsCycleCollectingAutoRefCnt* aRefCnt,
-                          bool* aShouldDelete)
-{
-  if (xpcomFunctions.cycleSuspect3Func) {
-    xpcomFunctions.cycleSuspect3Func(aObj, aCp, aRefCnt, aShouldDelete);
-  }
-}
-
-XPCOM_API(bool)
-NS_CycleCollectorForget2(nsPurpleBufferEntry* aEntry)
-{
-  if (!xpcomFunctions.cycleForget2Func) {
-    return false;
-  }
-
-  return xpcomFunctions.cycleForget2Func(aEntry);
-}
--- a/xpcom/glue/standalone/nsXPCOMGlue.h
+++ b/xpcom/glue/standalone/nsXPCOMGlue.h
@@ -8,45 +8,18 @@
 #define nsXPCOMGlue_h__
 
 #include "nscore.h"
 
 #ifdef XPCOM_GLUE
 
 #include "mozilla/Bootstrap.h"
 
-/**
- * The following functions are only available in the standalone glue.
- */
-
-/**
- * Initialize the XPCOM glue by dynamically linking against the XPCOM
- * shared library indicated by xpcomFile.
- */
-extern "C" NS_HIDDEN_(nsresult) XPCOMGlueStartup(const char* aXPCOMFile);
-
 typedef void (*NSFuncPtr)();
 
-struct nsDynamicFunctionLoad
-{
-  const char* functionName;
-  NSFuncPtr* function;
-};
-
-/**
- * Dynamically load functions from libxul.
- *
- * @throws NS_ERROR_NOT_INITIALIZED if XPCOMGlueStartup() was not called or
- *         if the libxul DLL was not found.
- * @throws NS_ERROR_LOSS_OF_SIGNIFICANT_DATA if only some of the required
- *         functions were found.
- */
-extern "C" NS_HIDDEN_(nsresult)
-XPCOMGlueLoadXULFunctions(const nsDynamicFunctionLoad* aSymbols);
-
 namespace mozilla {
 
 /**
  * Initialize the XPCOM glue by dynamically linking against the XPCOM
  * shared library indicated by xpcomFile and return a Bootstrap instance.
  */
 NS_HIDDEN_(Bootstrap::UniquePtr) GetBootstrap(const char* aXPCOMFile);
 
--- a/xpcom/glue/standalone/staticruntime/moz.build
+++ b/xpcom/glue/standalone/staticruntime/moz.build
@@ -1,20 +1,16 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-include('../../objs.mozbuild')
-
-SOURCES += xpcom_glue_src_cppsrcs
-
 SOURCES += [
-    '../../nsStringAPI.cpp',
+    '../../FileUtils.cpp',
     '../nsXPCOMGlue.cpp',
 ]
 
 Library('xpcomglue_staticruntime')
 
 SDK_LIBRARY = True
 
 # create a static lib