зеркало из https://github.com/mozilla/gecko-dev.git
Bug 852950 - Kill libxpcom. r=bsmedberg
Also refactored the xpcom standalone glue to reside in a single file and removed its use of realpath(). --HG-- rename : xpcom/stub/dependentlibs.py => toolkit/library/dependentlibs.py rename : xpcom/stub/nsXPComStub.cpp => xpcom/build/FrozenFunctions.cpp
This commit is contained in:
Родитель
8376bad5eb
Коммит
347a7c2d09
|
@ -54,7 +54,6 @@
|
||||||
@BINPATH@/@DLL_PREFIX@plds4@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@plds4@DLL_SUFFIX@
|
||||||
@BINPATH@/@DLL_PREFIX@nspr4@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@nspr4@DLL_SUFFIX@
|
||||||
#endif
|
#endif
|
||||||
@BINPATH@/@DLL_PREFIX@xpcom@DLL_SUFFIX@
|
|
||||||
@BINPATH@/@DLL_PREFIX@mozalloc@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@mozalloc@DLL_SUFFIX@
|
||||||
#ifdef MOZ_DMD
|
#ifdef MOZ_DMD
|
||||||
@BINPATH@/@DLL_PREFIX@dmd@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@dmd@DLL_SUFFIX@
|
||||||
|
|
|
@ -20,3 +20,4 @@ components/dom_sms.xpt
|
||||||
@DLL_PREFIX@nssutil3@DLL_SUFFIX@
|
@DLL_PREFIX@nssutil3@DLL_SUFFIX@
|
||||||
@DLL_PREFIX@mozsqlite3@DLL_SUFFIX@
|
@DLL_PREFIX@mozsqlite3@DLL_SUFFIX@
|
||||||
#endif
|
#endif
|
||||||
|
@DLL_PREFIX@xpcom@DLL_SUFFIX@
|
||||||
|
|
|
@ -69,7 +69,6 @@
|
||||||
@BINPATH@/@DLL_PREFIX@plds4@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@plds4@DLL_SUFFIX@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@BINPATH@/@DLL_PREFIX@xpcom@DLL_SUFFIX@
|
|
||||||
#ifdef XP_MACOSX
|
#ifdef XP_MACOSX
|
||||||
@BINPATH@/XUL
|
@BINPATH@/XUL
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
@DLL_PREFIX@nssutil3@DLL_SUFFIX@
|
@DLL_PREFIX@nssutil3@DLL_SUFFIX@
|
||||||
@DLL_PREFIX@mozsqlite3@DLL_SUFFIX@
|
@DLL_PREFIX@mozsqlite3@DLL_SUFFIX@
|
||||||
#endif
|
#endif
|
||||||
|
@DLL_PREFIX@xpcom@DLL_SUFFIX@
|
||||||
LICENSE
|
LICENSE
|
||||||
browserconfig.properties
|
browserconfig.properties
|
||||||
chrome/US.jar
|
chrome/US.jar
|
||||||
|
|
26
configure.in
26
configure.in
|
@ -1019,10 +1019,10 @@ MOZ_PNG_LIBS='$(call EXPAND_LIBNAME_PATH,mozpng,$(DEPTH)/media/libpng)'
|
||||||
|
|
||||||
MOZ_JS_STATIC_LIBS='$(call EXPAND_LIBNAME_PATH,js_static,$(LIBXUL_DIST)/lib)'
|
MOZ_JS_STATIC_LIBS='$(call EXPAND_LIBNAME_PATH,js_static,$(LIBXUL_DIST)/lib)'
|
||||||
MOZ_JS_SHARED_LIBS='$(call EXPAND_LIBNAME_PATH,mozjs,$(LIBXUL_DIST)/lib)'
|
MOZ_JS_SHARED_LIBS='$(call EXPAND_LIBNAME_PATH,mozjs,$(LIBXUL_DIST)/lib)'
|
||||||
DYNAMIC_XPCOM_LIBS='-L$(LIBXUL_DIST)/bin -lxpcom -lxpcom_core -lmozalloc'
|
DYNAMIC_XPCOM_LIBS='-L$(LIBXUL_DIST)/bin -lxul -lxpcom_core -lmozalloc'
|
||||||
MOZ_FIX_LINK_PATHS='-Wl,-rpath-link,$(LIBXUL_DIST)/bin -Wl,-rpath-link,$(prefix)/lib'
|
MOZ_FIX_LINK_PATHS='-Wl,-rpath-link,$(LIBXUL_DIST)/bin -Wl,-rpath-link,$(prefix)/lib'
|
||||||
XPCOM_FROZEN_LDOPTS='-L$(LIBXUL_DIST)/bin -lxpcom -lmozalloc'
|
XPCOM_FROZEN_LDOPTS='-L$(LIBXUL_DIST)/bin -lxul -lmozalloc'
|
||||||
LIBXUL_LIBS='$(XPCOM_FROZEN_LDOPTS) -lxul'
|
LIBXUL_LIBS='$(XPCOM_FROZEN_LDOPTS)'
|
||||||
XPCOM_GLUE_LDOPTS='$(LIBXUL_DIST)/lib/$(LIB_PREFIX)xpcomglue_s.$(LIB_SUFFIX) $(XPCOM_FROZEN_LDOPTS)'
|
XPCOM_GLUE_LDOPTS='$(LIBXUL_DIST)/lib/$(LIB_PREFIX)xpcomglue_s.$(LIB_SUFFIX) $(XPCOM_FROZEN_LDOPTS)'
|
||||||
XPCOM_STANDALONE_GLUE_LDOPTS='$(LIBXUL_DIST)/lib/$(LIB_PREFIX)xpcomglue.$(LIB_SUFFIX)'
|
XPCOM_STANDALONE_GLUE_LDOPTS='$(LIBXUL_DIST)/lib/$(LIB_PREFIX)xpcomglue.$(LIB_SUFFIX)'
|
||||||
|
|
||||||
|
@ -2116,8 +2116,8 @@ ia64*-hpux*)
|
||||||
# mingw doesn't require kernel32, user32, and advapi32 explicitly
|
# mingw doesn't require kernel32, user32, and advapi32 explicitly
|
||||||
LIBS="$LIBS -luuid -lgdi32 -lwinmm -lwsock32 -luserenv -lsecur32 -lnetapi32"
|
LIBS="$LIBS -luuid -lgdi32 -lwinmm -lwsock32 -luserenv -lsecur32 -lnetapi32"
|
||||||
MOZ_FIX_LINK_PATHS=
|
MOZ_FIX_LINK_PATHS=
|
||||||
DYNAMIC_XPCOM_LIBS='-L$(LIBXUL_DIST)/lib -lxpcom -lxpcom_core -lmozalloc'
|
DYNAMIC_XPCOM_LIBS='-L$(LIBXUL_DIST)/lib -lxul -lxpcom_core -lmozalloc'
|
||||||
XPCOM_FROZEN_LDOPTS='-L$(LIBXUL_DIST)/lib -lxpcom -lmozalloc'
|
XPCOM_FROZEN_LDOPTS='-L$(LIBXUL_DIST)/lib -lxul -lmozalloc'
|
||||||
DLL_PREFIX=
|
DLL_PREFIX=
|
||||||
IMPORT_LIB_SUFFIX=dll.a
|
IMPORT_LIB_SUFFIX=dll.a
|
||||||
|
|
||||||
|
@ -2182,9 +2182,9 @@ ia64*-hpux*)
|
||||||
WARNINGS_AS_ERRORS='-WX'
|
WARNINGS_AS_ERRORS='-WX'
|
||||||
MOZ_OPTIMIZE_FLAGS='-O1'
|
MOZ_OPTIMIZE_FLAGS='-O1'
|
||||||
MOZ_FIX_LINK_PATHS=
|
MOZ_FIX_LINK_PATHS=
|
||||||
DYNAMIC_XPCOM_LIBS='$(LIBXUL_DIST)/lib/xpcom.lib $(LIBXUL_DIST)/lib/xpcom_core.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
|
DYNAMIC_XPCOM_LIBS='$(LIBXUL_DIST)/lib/xul.lib $(LIBXUL_DIST)/lib/xpcom_core.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
|
||||||
XPCOM_FROZEN_LDOPTS='$(LIBXUL_DIST)/lib/xpcom.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
|
XPCOM_FROZEN_LDOPTS='$(LIBXUL_DIST)/lib/xul.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
|
||||||
LIBXUL_LIBS='$(LIBXUL_DIST)/lib/xpcom.lib $(LIBXUL_DIST)/lib/xul.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
|
LIBXUL_LIBS='$(LIBXUL_DIST)/lib/xul.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
|
||||||
MOZ_COMPONENT_NSPR_LIBS='$(NSPR_LIBS)'
|
MOZ_COMPONENT_NSPR_LIBS='$(NSPR_LIBS)'
|
||||||
LDFLAGS="$LDFLAGS -LARGEADDRESSAWARE -NXCOMPAT"
|
LDFLAGS="$LDFLAGS -LARGEADDRESSAWARE -NXCOMPAT"
|
||||||
dnl For profile-guided optimization
|
dnl For profile-guided optimization
|
||||||
|
@ -2360,8 +2360,8 @@ ia64*-hpux*)
|
||||||
MOZ_DEBUG_FLAGS="-g -fno-inline"
|
MOZ_DEBUG_FLAGS="-g -fno-inline"
|
||||||
MOZ_OPTIMIZE_FLAGS="-O2"
|
MOZ_OPTIMIZE_FLAGS="-O2"
|
||||||
MOZ_OPTIMIZE_LDFLAGS="-s -Zlinker /EXEPACK:2 -Zlinker /PACKCODE -Zlinker /PACKDATA"
|
MOZ_OPTIMIZE_LDFLAGS="-s -Zlinker /EXEPACK:2 -Zlinker /PACKCODE -Zlinker /PACKDATA"
|
||||||
DYNAMIC_XPCOM_LIBS='-L$(LIBXUL_DIST)/lib $(LIBXUL_DIST)/lib/xpcom.lib $(LIBXUL_DIST)/lib/xpcom_core.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
|
DYNAMIC_XPCOM_LIBS='-L$(LIBXUL_DIST)/lib $(LIBXUL_DIST)/lib/xul.lib $(LIBXUL_DIST)/lib/xpcom_core.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
|
||||||
LIBXUL_LIBS='-L$(LIBXUL_DIST)/lib $(LIBXUL_DIST)/lib/xpcom.lib $(LIBXUL_DIST)/lib/xul.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
|
LIBXUL_LIBS='-L$(LIBXUL_DIST)/lib $(LIBXUL_DIST)/lib/xul.lib $(LIBXUL_DIST)/lib/mozalloc.lib'
|
||||||
TARGET_MD_ARCH=os2
|
TARGET_MD_ARCH=os2
|
||||||
_PLATFORM_DEFAULT_TOOLKIT="cairo-os2"
|
_PLATFORM_DEFAULT_TOOLKIT="cairo-os2"
|
||||||
RC=rc.exe
|
RC=rc.exe
|
||||||
|
@ -4596,7 +4596,8 @@ cairo-cocoa)
|
||||||
TK_CFLAGS="-DNO_X11"
|
TK_CFLAGS="-DNO_X11"
|
||||||
CFLAGS="$CFLAGS $TK_CFLAGS"
|
CFLAGS="$CFLAGS $TK_CFLAGS"
|
||||||
CXXFLAGS="$CXXFLAGS $TK_CFLAGS"
|
CXXFLAGS="$CXXFLAGS $TK_CFLAGS"
|
||||||
LIBXUL_LIBS='$(XPCOM_FROZEN_LDOPTS) $(LIBXUL_DIST)/bin/XUL'
|
DYNAMIC_XPCOM_LIBS='$(LIBXUL_DIST)/bin/XUL -lxpcom_core -lmozalloc'
|
||||||
|
XPCOM_FROZEN_LDOPTS='$(LIBXUL_DIST)/bin/XUL -lmozalloc'
|
||||||
MOZ_USER_DIR="Mozilla"
|
MOZ_USER_DIR="Mozilla"
|
||||||
MOZ_FS_LAYOUT=bundle
|
MOZ_FS_LAYOUT=bundle
|
||||||
MOZ_WEBGL=1
|
MOZ_WEBGL=1
|
||||||
|
@ -4611,7 +4612,8 @@ cairo-uikit)
|
||||||
TK_LIBS='-framework Foundation -framework CoreFoundation -framework CoreGraphics -framework CoreText'
|
TK_LIBS='-framework Foundation -framework CoreFoundation -framework CoreGraphics -framework CoreText'
|
||||||
CFLAGS="$CFLAGS $TK_CFLAGS"
|
CFLAGS="$CFLAGS $TK_CFLAGS"
|
||||||
CXXFLAGS="$CXXFLAGS $TK_CFLAGS"
|
CXXFLAGS="$CXXFLAGS $TK_CFLAGS"
|
||||||
LIBXUL_LIBS='$(XPCOM_FROZEN_LDOPTS) $(LIBXUL_DIST)/bin/XUL'
|
DYNAMIC_XPCOM_LIBS='$(LIBXUL_DIST)/bin/XUL -lxpcom_core -lmozalloc'
|
||||||
|
XPCOM_FROZEN_LDOPTS='$(LIBXUL_DIST)/bin/XUL -lmozalloc'
|
||||||
MOZ_USER_DIR="Mozilla"
|
MOZ_USER_DIR="Mozilla"
|
||||||
MOZ_FS_LAYOUT=bundle
|
MOZ_FS_LAYOUT=bundle
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -40,7 +40,6 @@
|
||||||
@BINPATH@/@DLL_PREFIX@plds4@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@plds4@DLL_SUFFIX@
|
||||||
@BINPATH@/@DLL_PREFIX@nspr4@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@nspr4@DLL_SUFFIX@
|
||||||
#endif
|
#endif
|
||||||
@BINPATH@/@DLL_PREFIX@xpcom@DLL_SUFFIX@
|
|
||||||
@BINPATH@/@DLL_PREFIX@mozalloc@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@mozalloc@DLL_SUFFIX@
|
||||||
@BINPATH@/@DLL_PREFIX@mozglue@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@mozglue@DLL_SUFFIX@
|
||||||
@BINPATH@/@DLL_PREFIX@omxplugin@DLL_SUFFIX@
|
@BINPATH@/@DLL_PREFIX@omxplugin@DLL_SUFFIX@
|
||||||
|
|
|
@ -224,11 +224,9 @@ loadGeckoLibs(const char *apkName)
|
||||||
file_ids = (char *)extractBuf("lib.id", zip);
|
file_ids = (char *)extractBuf("lib.id", zip);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char *file = new char[strlen(apkName) + sizeof("!/libxpcom.so")];
|
char *file = new char[strlen(apkName) + sizeof("!/libxul.so")];
|
||||||
sprintf(file, "%s!/libxpcom.so", apkName);
|
sprintf(file, "%s!/libxul.so", apkName);
|
||||||
__wrap_dlopen(file, RTLD_GLOBAL | RTLD_LAZY);
|
xul_handle = __wrap_dlopen(file, RTLD_GLOBAL | RTLD_LAZY);
|
||||||
// libxul.so is pulled from libxpcom.so, so we don't need to give the full path
|
|
||||||
xul_handle = __wrap_dlopen("libxul.so", RTLD_GLOBAL | RTLD_LAZY);
|
|
||||||
delete[] file;
|
delete[] file;
|
||||||
|
|
||||||
#ifdef MOZ_CRASHREPORTER
|
#ifdef MOZ_CRASHREPORTER
|
||||||
|
|
|
@ -689,3 +689,8 @@ ifeq (WINNT_1,$(OS_TARGET)_$(MOZ_PROFILE_USE))
|
||||||
# Wrap linker to measure peak virtual memory usage.
|
# Wrap linker to measure peak virtual memory usage.
|
||||||
LD := $(PYTHON) $(topsrcdir)/build/link.py $(CURDIR)/linker-vsize $(LD)
|
LD := $(PYTHON) $(topsrcdir)/build/link.py $(CURDIR)/linker-vsize $(LD)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
libs:: $(FINAL_TARGET)/dependentlibs.list
|
||||||
|
|
||||||
|
$(FINAL_TARGET)/dependentlibs.list: dependentlibs.py $(SHARED_LIBRARY) $(wildcard $(if $(wildcard $(FINAL_TARGET)/dependentlibs.list),$(addprefix $(FINAL_TARGET)/,$(shell cat $(FINAL_TARGET)/dependentlibs.list))))
|
||||||
|
$(PYTHON) $< $(SHARED_LIBRARY) -L $(FINAL_TARGET) $(if $(TOOLCHAIN_PREFIX),$(addprefix -p ,$(TOOLCHAIN_PREFIX))) > $@
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
'''Given a library, dependentlibs.py prints the list of libraries it depends
|
'''Given a library, dependentlibs.py prints the list of libraries it depends
|
||||||
upon that are in the same directory.
|
upon that are in the same directory, followed by the library itself.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser
|
||||||
|
@ -92,7 +92,7 @@ def dependentlibs_otool(lib):
|
||||||
|
|
||||||
def dependentlibs(lib, libpaths, func):
|
def dependentlibs(lib, libpaths, func):
|
||||||
'''For a given library, returns the list of recursive dependencies that can
|
'''For a given library, returns the list of recursive dependencies that can
|
||||||
be found in the given list of paths'''
|
be found in the given list of paths, followed by the library itself.'''
|
||||||
assert(libpaths)
|
assert(libpaths)
|
||||||
assert(isinstance(libpaths, list))
|
assert(isinstance(libpaths, list))
|
||||||
deps = []
|
deps = []
|
||||||
|
@ -129,7 +129,7 @@ def main():
|
||||||
if not options.libpaths:
|
if not options.libpaths:
|
||||||
options.libpaths = [os.path.dirname(lib)]
|
options.libpaths = [os.path.dirname(lib)]
|
||||||
|
|
||||||
print '\n'.join(dependentlibs(lib, options.libpaths, func))
|
print '\n'.join(dependentlibs(lib, options.libpaths, func) + [lib])
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
|
@ -207,7 +207,6 @@ add_tier_dir('platform', app_libxul_dirs)
|
||||||
add_tier_dir('platform', app_libxul_static_dirs, static=True)
|
add_tier_dir('platform', app_libxul_static_dirs, static=True)
|
||||||
|
|
||||||
add_tier_dir('platform', 'toolkit/library')
|
add_tier_dir('platform', 'toolkit/library')
|
||||||
add_tier_dir('platform', 'xpcom/stub')
|
|
||||||
|
|
||||||
if CONFIG['MOZ_REPLACE_MALLOC']:
|
if CONFIG['MOZ_REPLACE_MALLOC']:
|
||||||
add_tier_dir('platform', 'memory/replace')
|
add_tier_dir('platform', 'memory/replace')
|
||||||
|
|
|
@ -0,0 +1,131 @@
|
||||||
|
/* 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 exitRoutine, uint32_t priority);
|
||||||
|
|
||||||
|
XPCOM_API(nsresult)
|
||||||
|
NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine);
|
||||||
|
|
||||||
|
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,
|
||||||
|
&NS_GetTraceRefcnt,
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
&NS_Alloc,
|
||||||
|
&NS_Realloc,
|
||||||
|
&NS_Free,
|
||||||
|
&NS_StringContainerInit2,
|
||||||
|
&NS_CStringContainerInit2,
|
||||||
|
&NS_StringGetMutableData,
|
||||||
|
&NS_CStringGetMutableData,
|
||||||
|
NULL,
|
||||||
|
|
||||||
|
// 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
|
||||||
|
&NS_CycleCollectorSuspect2,
|
||||||
|
&NS_CycleCollectorForget2
|
||||||
|
};
|
||||||
|
|
||||||
|
EXPORT_XPCOM_API(nsresult)
|
||||||
|
NS_GetFrozenFunctions(XPCOMFunctions *functions, const char* /* libraryPath */)
|
||||||
|
{
|
||||||
|
if (!functions)
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
if (functions->version != XPCOM_GLUE_VERSION)
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
uint32_t size = functions->size;
|
||||||
|
if (size > sizeof(XPCOMFunctions))
|
||||||
|
size = sizeof(XPCOMFunctions);
|
||||||
|
|
||||||
|
size -= offsetof(XPCOMFunctions, init);
|
||||||
|
|
||||||
|
memcpy(&functions->init, &kFrozenFunctions.init, size);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stubs for nsXPCOMPrivate.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
EXPORT_XPCOM_API(nsresult)
|
||||||
|
NS_RegisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine, uint32_t priority)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPORT_XPCOM_API(nsresult)
|
||||||
|
NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
|
@ -37,6 +37,7 @@ CPPSRCS = \
|
||||||
Services.cpp \
|
Services.cpp \
|
||||||
Omnijar.cpp \
|
Omnijar.cpp \
|
||||||
FileLocation.cpp \
|
FileLocation.cpp \
|
||||||
|
FrozenFunctions.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
ifeq (Darwin, $(OS_ARCH))
|
ifeq (Darwin, $(OS_ARCH))
|
||||||
|
|
|
@ -6,34 +6,6 @@
|
||||||
#ifndef nsXPCOM_h__
|
#ifndef nsXPCOM_h__
|
||||||
#define nsXPCOM_h__
|
#define nsXPCOM_h__
|
||||||
|
|
||||||
/* Map frozen functions to private symbol names if not using strict API. */
|
|
||||||
#ifdef MOZILLA_INTERNAL_API
|
|
||||||
# define NS_InitXPCOM2 NS_InitXPCOM2_P
|
|
||||||
# define NS_ShutdownXPCOM NS_ShutdownXPCOM_P
|
|
||||||
# define NS_GetServiceManager NS_GetServiceManager_P
|
|
||||||
# define NS_GetComponentManager NS_GetComponentManager_P
|
|
||||||
# define NS_GetComponentRegistrar NS_GetComponentRegistrar_P
|
|
||||||
# define NS_GetMemoryManager NS_GetMemoryManager_P
|
|
||||||
# define NS_NewLocalFile NS_NewLocalFile_P
|
|
||||||
# define NS_NewNativeLocalFile NS_NewNativeLocalFile_P
|
|
||||||
# define NS_GetDebug NS_GetDebug_P
|
|
||||||
# define NS_GetTraceRefcnt NS_GetTraceRefcnt_P
|
|
||||||
# define NS_Alloc NS_Alloc_P
|
|
||||||
# define NS_Realloc NS_Realloc_P
|
|
||||||
# define NS_Free NS_Free_P
|
|
||||||
# define NS_DebugBreak NS_DebugBreak_P
|
|
||||||
# define NS_LogInit NS_LogInit_P
|
|
||||||
# define NS_LogTerm NS_LogTerm_P
|
|
||||||
# define NS_LogAddRef NS_LogAddRef_P
|
|
||||||
# define NS_LogRelease NS_LogRelease_P
|
|
||||||
# define NS_LogCtor NS_LogCtor_P
|
|
||||||
# define NS_LogDtor NS_LogDtor_P
|
|
||||||
# define NS_LogCOMPtrAddRef NS_LogCOMPtrAddRef_P
|
|
||||||
# define NS_LogCOMPtrRelease NS_LogCOMPtrRelease_P
|
|
||||||
# define NS_CycleCollectorSuspect2 NS_CycleCollectorSuspect2_P
|
|
||||||
# define NS_CycleCollectorForget2 NS_CycleCollectorForget2_P
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "nscore.h"
|
#include "nscore.h"
|
||||||
#include "nsXPCOMCID.h"
|
#include "nsXPCOMCID.h"
|
||||||
|
|
||||||
|
|
|
@ -217,15 +217,15 @@ void LogTerm();
|
||||||
#define XPCOM_SEARCH_KEY "PATH"
|
#define XPCOM_SEARCH_KEY "PATH"
|
||||||
#define GRE_CONF_NAME "gre.config"
|
#define GRE_CONF_NAME "gre.config"
|
||||||
#define GRE_WIN_REG_LOC L"Software\\mozilla.org\\GRE"
|
#define GRE_WIN_REG_LOC L"Software\\mozilla.org\\GRE"
|
||||||
#define XPCOM_DLL "xpcom.dll"
|
#define XPCOM_DLL XUL_DLL
|
||||||
#define LXPCOM_DLL L"xpcom.dll"
|
#define LXPCOM_DLL LXUL_DLL
|
||||||
#define XUL_DLL "xul.dll"
|
#define XUL_DLL "xul.dll"
|
||||||
#define LXUL_DLL L"xul.dll"
|
#define LXUL_DLL L"xul.dll"
|
||||||
|
|
||||||
#else // Unix
|
#else // Unix
|
||||||
#include <limits.h> // for PATH_MAX
|
#include <limits.h> // for PATH_MAX
|
||||||
|
|
||||||
#define XPCOM_DLL "libxpcom" MOZ_DLL_SUFFIX
|
#define XPCOM_DLL XUL_DLL
|
||||||
|
|
||||||
// you have to love apple..
|
// you have to love apple..
|
||||||
#ifdef XP_MACOSX
|
#ifdef XP_MACOSX
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
#include "mozilla/threads/nsThreadIDs.h"
|
#include "mozilla/threads/nsThreadIDs.h"
|
||||||
|
|
||||||
#if defined(MOZILLA_INTERNAL_API)
|
#if defined(MOZILLA_INTERNAL_API)
|
||||||
#define NS_IsCycleCollectorThread NS_IsCycleCollectorThread_P
|
|
||||||
#if defined(XP_WIN)
|
#if defined(XP_WIN)
|
||||||
bool NS_IsCycleCollectorThread();
|
bool NS_IsCycleCollectorThread();
|
||||||
#elif defined(NS_TLS)
|
#elif defined(NS_TLS)
|
||||||
|
|
|
@ -19,23 +19,6 @@
|
||||||
#include "mozilla/threads/nsThreadIDs.h"
|
#include "mozilla/threads/nsThreadIDs.h"
|
||||||
#include "mozilla/Likely.h"
|
#include "mozilla/Likely.h"
|
||||||
|
|
||||||
// This is needed on some systems to prevent collisions between the symbols
|
|
||||||
// appearing in xpcom_core and xpcomglue. It may be unnecessary in the future
|
|
||||||
// with better toolchain support.
|
|
||||||
#ifdef MOZILLA_INTERNAL_API
|
|
||||||
# define NS_SetThreadName NS_SetThreadName_P
|
|
||||||
# define NS_NewThread NS_NewThread_P
|
|
||||||
# define NS_NewNamedThread NS_NewNamedThread_P
|
|
||||||
# define NS_GetCurrentThread NS_GetCurrentThread_P
|
|
||||||
# define NS_GetMainThread NS_GetMainThread_P
|
|
||||||
# define NS_IsMainThread NS_IsMainThread_P
|
|
||||||
# define NS_DispatchToCurrentThread NS_DispatchToCurrentThread_P
|
|
||||||
# define NS_DispatchToMainThread NS_DispatchToMainThread_P
|
|
||||||
# define NS_ProcessPendingEvents NS_ProcessPendingEvents_P
|
|
||||||
# define NS_HasPendingEvents NS_HasPendingEvents_P
|
|
||||||
# define NS_ProcessNextEvent NS_ProcessNextEvent_P
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// These methods are alternatives to the methods on nsIThreadManager, provided
|
// These methods are alternatives to the methods on nsIThreadManager, provided
|
||||||
// for convenience.
|
// for convenience.
|
||||||
|
|
|
@ -20,29 +20,6 @@ LOCAL_INCLUDES = \
|
||||||
-I$(srcdir)/../../build \
|
-I$(srcdir)/../../build \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
ifeq (Darwin,$(OS_ARCH))
|
|
||||||
ifeq (uikit,$(MOZ_WIDGET_TOOLKIT))
|
|
||||||
LINKSRC = nsGlueLinkingDlopen.cpp
|
|
||||||
else
|
|
||||||
LINKSRC = nsGlueLinkingOSX.cpp
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(OS_ARCH),WINNT)
|
|
||||||
LINKSRC = nsGlueLinkingWin.cpp
|
|
||||||
endif
|
|
||||||
ifneq (,$(filter AIX DragonFly FreeBSD GNU GNU_% Linux NetBSD OpenBSD SunOS,$(OS_ARCH)))
|
|
||||||
LINKSRC = nsGlueLinkingDlopen.cpp
|
|
||||||
endif
|
|
||||||
ifeq (OS2,$(OS_ARCH))
|
|
||||||
LINKSRC = nsGlueLinkingOS2.cpp
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifndef LINKSRC
|
|
||||||
LINKSRC = nsGlueLinkingNull.cpp
|
|
||||||
$(warning TinderboxPrint:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=298044">Error: XPCOM Glue</a>)
|
|
||||||
endif
|
|
||||||
|
|
||||||
CPPSRCS = \
|
CPPSRCS = \
|
||||||
$(XPCOM_GLUE_SRC_LCPPSRCS) \
|
$(XPCOM_GLUE_SRC_LCPPSRCS) \
|
||||||
nsStringAPI.cpp \
|
nsStringAPI.cpp \
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
/* 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/. */
|
|
||||||
|
|
||||||
#ifndef nsGlueLinking_h__
|
|
||||||
#define nsGlueLinking_h__
|
|
||||||
|
|
||||||
#include "nsXPCOMPrivate.h"
|
|
||||||
|
|
||||||
#define XPCOM_DEPENDENT_LIBS_LIST "dependentlibs.list"
|
|
||||||
|
|
||||||
NS_HIDDEN_(nsresult)
|
|
||||||
XPCOMGlueLoad(const char *xpcomFile, GetFrozenFunctionsFunc *func);
|
|
||||||
|
|
||||||
NS_HIDDEN_(void)
|
|
||||||
XPCOMGlueUnload();
|
|
||||||
|
|
||||||
typedef void (*DependentLibsCallback)(const char *aDependentLib, bool do_preload);
|
|
||||||
|
|
||||||
NS_HIDDEN_(void)
|
|
||||||
XPCOMGlueLoadDependentLibs(const char *xpcomDir, DependentLibsCallback cb);
|
|
||||||
|
|
||||||
#endif // nsGlueLinking_h__
|
|
|
@ -1,248 +0,0 @@
|
||||||
/* -*- Mode: C++; tab-width: 6; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
||||||
/* 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 "nsGlueLinking.h"
|
|
||||||
#include "nsXPCOMGlue.h"
|
|
||||||
#include "nscore.h"
|
|
||||||
#include "mozilla/FileUtils.h"
|
|
||||||
|
|
||||||
#if defined(LINUX) && !defined(ANDROID)
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <dlfcn.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#if defined(SUNOS4) || defined(NEXTSTEP) || \
|
|
||||||
(defined(OPENBSD) || defined(NETBSD)) && !defined(__ELF__)
|
|
||||||
#define LEADING_UNDERSCORE "_"
|
|
||||||
#else
|
|
||||||
#define LEADING_UNDERSCORE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(MOZ_LINKER) && !defined(ANDROID)
|
|
||||||
extern "C" {
|
|
||||||
NS_HIDDEN __typeof(dlopen) __wrap_dlopen;
|
|
||||||
NS_HIDDEN __typeof(dlsym) __wrap_dlsym;
|
|
||||||
NS_HIDDEN __typeof(dlclose) __wrap_dlclose;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define dlopen __wrap_dlopen
|
|
||||||
#define dlsym __wrap_dlsym
|
|
||||||
#define dlclose __wrap_dlclose
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NS_TRACE_MALLOC
|
|
||||||
extern "C" {
|
|
||||||
NS_EXPORT_(__ptr_t) __libc_malloc(size_t);
|
|
||||||
NS_EXPORT_(__ptr_t) __libc_calloc(size_t, size_t);
|
|
||||||
NS_EXPORT_(__ptr_t) __libc_realloc(__ptr_t, size_t);
|
|
||||||
NS_EXPORT_(void) __libc_free(__ptr_t);
|
|
||||||
NS_EXPORT_(__ptr_t) __libc_memalign(size_t, size_t);
|
|
||||||
NS_EXPORT_(__ptr_t) __libc_valloc(size_t);
|
|
||||||
}
|
|
||||||
|
|
||||||
static __ptr_t (*_malloc)(size_t) = __libc_malloc;
|
|
||||||
static __ptr_t (*_calloc)(size_t, size_t) = __libc_calloc;
|
|
||||||
static __ptr_t (*_realloc)(__ptr_t, size_t) = __libc_realloc;
|
|
||||||
static void (*_free)(__ptr_t) = __libc_free;
|
|
||||||
static __ptr_t (*_memalign)(size_t, size_t) = __libc_memalign;
|
|
||||||
static __ptr_t (*_valloc)(size_t) = __libc_valloc;
|
|
||||||
|
|
||||||
NS_EXPORT_(__ptr_t) malloc(size_t size)
|
|
||||||
{
|
|
||||||
return _malloc(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_EXPORT_(__ptr_t) calloc(size_t nmemb, size_t size)
|
|
||||||
{
|
|
||||||
return _calloc(nmemb, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_EXPORT_(__ptr_t) realloc(__ptr_t ptr, size_t size)
|
|
||||||
{
|
|
||||||
return _realloc(ptr, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_EXPORT_(void) free(__ptr_t ptr)
|
|
||||||
{
|
|
||||||
_free(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_EXPORT_(void) cfree(__ptr_t ptr)
|
|
||||||
{
|
|
||||||
_free(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_EXPORT_(__ptr_t) memalign(size_t boundary, size_t size)
|
|
||||||
{
|
|
||||||
return _memalign(boundary, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_EXPORT_(int)
|
|
||||||
posix_memalign(void **memptr, size_t alignment, size_t size)
|
|
||||||
{
|
|
||||||
__ptr_t ptr = _memalign(alignment, size);
|
|
||||||
if (!ptr)
|
|
||||||
return ENOMEM;
|
|
||||||
*memptr = ptr;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_EXPORT_(__ptr_t) valloc(size_t size)
|
|
||||||
{
|
|
||||||
return _valloc(size);
|
|
||||||
}
|
|
||||||
#endif /* NS_TRACE_MALLOC */
|
|
||||||
|
|
||||||
struct DependentLib
|
|
||||||
{
|
|
||||||
void *libHandle;
|
|
||||||
DependentLib *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
static DependentLib *sTop;
|
|
||||||
static void* sXULLibHandle;
|
|
||||||
|
|
||||||
static void
|
|
||||||
AppendDependentLib(void *libHandle)
|
|
||||||
{
|
|
||||||
DependentLib *d = new DependentLib;
|
|
||||||
if (!d)
|
|
||||||
return;
|
|
||||||
|
|
||||||
d->next = sTop;
|
|
||||||
d->libHandle = libHandle;
|
|
||||||
|
|
||||||
sTop = d;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ReadDependentCB(const char *aDependentLib, bool do_preload)
|
|
||||||
{
|
|
||||||
#if defined(LINUX) && !defined(ANDROID)
|
|
||||||
if (do_preload)
|
|
||||||
mozilla::ReadAheadLib(aDependentLib);
|
|
||||||
#endif
|
|
||||||
void *libHandle = dlopen(aDependentLib, RTLD_GLOBAL | RTLD_LAZY);
|
|
||||||
if (!libHandle)
|
|
||||||
return;
|
|
||||||
|
|
||||||
AppendDependentLib(libHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
XPCOMGlueLoad(const char *xpcomFile, GetFrozenFunctionsFunc *func)
|
|
||||||
{
|
|
||||||
char xpcomDir[MAXPATHLEN];
|
|
||||||
if (realpath(xpcomFile, xpcomDir)) {
|
|
||||||
char *lastSlash = strrchr(xpcomDir, '/');
|
|
||||||
if (lastSlash) {
|
|
||||||
*lastSlash = '\0';
|
|
||||||
|
|
||||||
XPCOMGlueLoadDependentLibs(xpcomDir, ReadDependentCB);
|
|
||||||
|
|
||||||
#ifdef __GLIBC__
|
|
||||||
// XUL_DLL is already loaded by XPCOMGlueLoadDependentLibs, so
|
|
||||||
// dlopening without the full path will return that one.
|
|
||||||
sXULLibHandle = dlopen(XUL_DLL, RTLD_GLOBAL | RTLD_LAZY);
|
|
||||||
#else
|
|
||||||
snprintf(lastSlash, MAXPATHLEN - strlen(xpcomDir), "/" XUL_DLL);
|
|
||||||
|
|
||||||
sXULLibHandle = dlopen(xpcomDir, RTLD_GLOBAL | RTLD_LAZY);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NS_TRACE_MALLOC
|
|
||||||
_malloc = (__ptr_t(*)(size_t)) dlsym(sXULLibHandle, "malloc");
|
|
||||||
_calloc = (__ptr_t(*)(size_t, size_t)) dlsym(sXULLibHandle, "calloc");
|
|
||||||
_realloc = (__ptr_t(*)(__ptr_t, size_t)) dlsym(sXULLibHandle, "realloc");
|
|
||||||
_free = (void(*)(__ptr_t)) dlsym(sXULLibHandle, "free");
|
|
||||||
_memalign = (__ptr_t(*)(size_t, size_t)) dlsym(sXULLibHandle, "memalign");
|
|
||||||
_valloc = (__ptr_t(*)(size_t)) dlsym(sXULLibHandle, "valloc");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// RTLD_DEFAULT is not defined in non-GNU toolchains, and it is
|
|
||||||
// (void*) 0 in any case.
|
|
||||||
|
|
||||||
void *libHandle = nullptr;
|
|
||||||
|
|
||||||
if (xpcomFile[0] != '.' || xpcomFile[1] != '\0') {
|
|
||||||
libHandle = dlopen(xpcomFile, RTLD_GLOBAL | RTLD_LAZY);
|
|
||||||
if (libHandle) {
|
|
||||||
AppendDependentLib(libHandle);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "XPCOMGlueLoad error for file %s:\n%s\n", xpcomFile,
|
|
||||||
dlerror());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GetFrozenFunctionsFunc sym =
|
|
||||||
(GetFrozenFunctionsFunc) dlsym(libHandle,
|
|
||||||
LEADING_UNDERSCORE "NS_GetFrozenFunctions");
|
|
||||||
|
|
||||||
if (!sym) { // No symbol found.
|
|
||||||
XPCOMGlueUnload();
|
|
||||||
return NS_ERROR_NOT_AVAILABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
*func = sym;
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
XPCOMGlueUnload()
|
|
||||||
{
|
|
||||||
while (sTop) {
|
|
||||||
dlclose(sTop->libHandle);
|
|
||||||
|
|
||||||
DependentLib *temp = sTop;
|
|
||||||
sTop = sTop->next;
|
|
||||||
|
|
||||||
delete temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sXULLibHandle) {
|
|
||||||
#ifdef NS_TRACE_MALLOC
|
|
||||||
_malloc = __libc_malloc;
|
|
||||||
_calloc = __libc_calloc;
|
|
||||||
_realloc = __libc_realloc;
|
|
||||||
_free = __libc_free;
|
|
||||||
_memalign = __libc_memalign;
|
|
||||||
_valloc = __libc_valloc;
|
|
||||||
#endif
|
|
||||||
dlclose(sXULLibHandle);
|
|
||||||
sXULLibHandle = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
XPCOMGlueLoadXULFunctions(const nsDynamicFunctionLoad *symbols)
|
|
||||||
{
|
|
||||||
// We don't null-check sXULLibHandle because this might work even
|
|
||||||
// if it is null (same as RTLD_DEFAULT)
|
|
||||||
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
while (symbols->functionName) {
|
|
||||||
char buffer[512];
|
|
||||||
snprintf(buffer, sizeof(buffer),
|
|
||||||
LEADING_UNDERSCORE "%s", symbols->functionName);
|
|
||||||
|
|
||||||
*symbols->function = (NSFuncPtr) dlsym(sXULLibHandle, buffer);
|
|
||||||
if (!*symbols->function)
|
|
||||||
rv = NS_ERROR_LOSS_OF_SIGNIFICANT_DATA;
|
|
||||||
|
|
||||||
++symbols;
|
|
||||||
}
|
|
||||||
return rv;
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
/* -*- Mode: C++; tab-width: 6; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
||||||
/* 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 "nsGlueLinking.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
XPCOMGlueLoad(const char *xpcomFile, GetFrozenFunctionsFunc *func)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "XPCOM glue dynamic linking is not implemented on this platform!");
|
|
||||||
|
|
||||||
*func = nullptr;
|
|
||||||
|
|
||||||
return NS_ERROR_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
XPCOMGlueUnload()
|
|
||||||
{
|
|
||||||
}
|
|
|
@ -1,156 +0,0 @@
|
||||||
/* -*- Mode: C++; tab-width: 6; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
||||||
/* 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 "nsGlueLinking.h"
|
|
||||||
#include "nsXPCOMGlue.h"
|
|
||||||
|
|
||||||
#define INCL_DOS
|
|
||||||
#define INCL_DOSERRORS
|
|
||||||
#include <os2.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
struct DependentLib
|
|
||||||
{
|
|
||||||
HMODULE libHandle;
|
|
||||||
DependentLib *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
static DependentLib *sTop;
|
|
||||||
HMODULE sXULLibrary = NULLHANDLE;
|
|
||||||
|
|
||||||
static void
|
|
||||||
AppendDependentLib(HMODULE libHandle)
|
|
||||||
{
|
|
||||||
DependentLib *d = new DependentLib;
|
|
||||||
if (!d)
|
|
||||||
return;
|
|
||||||
|
|
||||||
d->next = sTop;
|
|
||||||
d->libHandle = libHandle;
|
|
||||||
|
|
||||||
sTop = d;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ReadDependentCB(const char *aDependentLib, bool do_preload)
|
|
||||||
{
|
|
||||||
CHAR pszError[_MAX_PATH];
|
|
||||||
ULONG ulrc = NO_ERROR;
|
|
||||||
HMODULE h;
|
|
||||||
|
|
||||||
ulrc = DosLoadModule(pszError, _MAX_PATH, aDependentLib, &h);
|
|
||||||
|
|
||||||
if (ulrc != NO_ERROR)
|
|
||||||
return;
|
|
||||||
|
|
||||||
AppendDependentLib(h);
|
|
||||||
}
|
|
||||||
|
|
||||||
// like strpbrk but finds the *last* char, not the first
|
|
||||||
static char*
|
|
||||||
ns_strrpbrk(char *string, const char *strCharSet)
|
|
||||||
{
|
|
||||||
char *found = NULL;
|
|
||||||
for (; *string; ++string) {
|
|
||||||
for (const char *search = strCharSet; *search; ++search) {
|
|
||||||
if (*search == *string) {
|
|
||||||
found = string;
|
|
||||||
// Since we're looking for the last char, we save "found"
|
|
||||||
// until we're at the end of the string.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
XPCOMGlueLoad(const char *xpcomFile, GetFrozenFunctionsFunc *func)
|
|
||||||
{
|
|
||||||
CHAR pszError[_MAX_PATH];
|
|
||||||
ULONG ulrc = NO_ERROR;
|
|
||||||
HMODULE h;
|
|
||||||
|
|
||||||
if (xpcomFile[0] == '.' && xpcomFile[1] == '\0') {
|
|
||||||
xpcomFile = XPCOM_DLL;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
char xpcomDir[MAXPATHLEN];
|
|
||||||
|
|
||||||
_fullpath(xpcomDir, xpcomFile, sizeof(xpcomDir));
|
|
||||||
char *lastSlash = ns_strrpbrk(xpcomDir, "/\\");
|
|
||||||
if (lastSlash) {
|
|
||||||
*lastSlash = '\0';
|
|
||||||
|
|
||||||
XPCOMGlueLoadDependentLibs(xpcomDir, ReadDependentCB);
|
|
||||||
|
|
||||||
snprintf(lastSlash, MAXPATHLEN - strlen(xpcomDir), "\\" XUL_DLL);
|
|
||||||
|
|
||||||
DosLoadModule(pszError, _MAX_PATH, xpcomDir, &sXULLibrary);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ulrc = DosLoadModule(pszError, _MAX_PATH, xpcomFile, &h);
|
|
||||||
|
|
||||||
if (ulrc != NO_ERROR)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
AppendDependentLib(h);
|
|
||||||
|
|
||||||
GetFrozenFunctionsFunc sym;
|
|
||||||
|
|
||||||
ulrc = DosQueryProcAddr(h, 0, "_NS_GetFrozenFunctions", (PFN*)&sym);
|
|
||||||
|
|
||||||
if (ulrc != NO_ERROR) {
|
|
||||||
XPCOMGlueUnload();
|
|
||||||
return NS_ERROR_NOT_AVAILABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
*func = sym;
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
XPCOMGlueUnload()
|
|
||||||
{
|
|
||||||
while (sTop) {
|
|
||||||
DosFreeModule(sTop->libHandle);
|
|
||||||
|
|
||||||
DependentLib *temp = sTop;
|
|
||||||
sTop = sTop->next;
|
|
||||||
|
|
||||||
delete temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sXULLibrary) {
|
|
||||||
DosFreeModule(sXULLibrary);
|
|
||||||
sXULLibrary = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
XPCOMGlueLoadXULFunctions(const nsDynamicFunctionLoad *symbols)
|
|
||||||
{
|
|
||||||
ULONG ulrc = NO_ERROR;
|
|
||||||
|
|
||||||
if (!sXULLibrary)
|
|
||||||
return NS_ERROR_NOT_INITIALIZED;
|
|
||||||
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
while (symbols->functionName) {
|
|
||||||
char buffer[512];
|
|
||||||
snprintf(buffer, sizeof(buffer), "_%s", symbols->functionName);
|
|
||||||
ulrc = DosQueryProcAddr(sXULLibrary, 0, buffer, (PFN*)symbols->function);
|
|
||||||
|
|
||||||
if (ulrc != NO_ERROR)
|
|
||||||
rv = NS_ERROR_LOSS_OF_SIGNIFICANT_DATA;
|
|
||||||
|
|
||||||
++symbols;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
|
@ -1,124 +0,0 @@
|
||||||
/* -*- Mode: C++; tab-width: 6; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
||||||
/* 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 "nsGlueLinking.h"
|
|
||||||
#include "nsXPCOMGlue.h"
|
|
||||||
#include "mozilla/FileUtils.h"
|
|
||||||
|
|
||||||
#include <mach-o/dyld.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
static const mach_header* sXULLibImage;
|
|
||||||
|
|
||||||
static void
|
|
||||||
ReadDependentCB(const char *aDependentLib, bool do_preload)
|
|
||||||
{
|
|
||||||
if (do_preload)
|
|
||||||
mozilla::ReadAheadLib(aDependentLib);
|
|
||||||
(void) NSAddImage(aDependentLib,
|
|
||||||
NSADDIMAGE_OPTION_RETURN_ON_ERROR |
|
|
||||||
NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void*
|
|
||||||
LookupSymbol(const mach_header* aLib, const char* aSymbolName)
|
|
||||||
{
|
|
||||||
// Try to use |NSLookupSymbolInImage| since it is faster than searching
|
|
||||||
// the global symbol table. If we couldn't get a mach_header pointer
|
|
||||||
// for the XPCOM dylib, then use |NSLookupAndBindSymbol| to search the
|
|
||||||
// global symbol table (this shouldn't normally happen, unless the user
|
|
||||||
// has called XPCOMGlueStartup(".") and relies on libxpcom.dylib
|
|
||||||
// already being loaded).
|
|
||||||
NSSymbol sym = nullptr;
|
|
||||||
if (aLib) {
|
|
||||||
sym = NSLookupSymbolInImage(aLib, aSymbolName,
|
|
||||||
NSLOOKUPSYMBOLINIMAGE_OPTION_BIND |
|
|
||||||
NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
|
|
||||||
} else {
|
|
||||||
if (NSIsSymbolNameDefined(aSymbolName))
|
|
||||||
sym = NSLookupAndBindSymbol(aSymbolName);
|
|
||||||
}
|
|
||||||
if (!sym)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
return NSAddressOfSymbol(sym);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
XPCOMGlueLoad(const char *xpcomFile, GetFrozenFunctionsFunc *func)
|
|
||||||
{
|
|
||||||
const mach_header* lib = nullptr;
|
|
||||||
|
|
||||||
if (xpcomFile[0] != '.' || xpcomFile[1] != '\0') {
|
|
||||||
char xpcomDir[PATH_MAX];
|
|
||||||
if (realpath(xpcomFile, xpcomDir)) {
|
|
||||||
char *lastSlash = strrchr(xpcomDir, '/');
|
|
||||||
if (lastSlash) {
|
|
||||||
*lastSlash = '\0';
|
|
||||||
|
|
||||||
XPCOMGlueLoadDependentLibs(xpcomDir, ReadDependentCB);
|
|
||||||
|
|
||||||
snprintf(lastSlash, PATH_MAX - strlen(xpcomDir), "/" XUL_DLL);
|
|
||||||
|
|
||||||
sXULLibImage = NSAddImage(xpcomDir,
|
|
||||||
NSADDIMAGE_OPTION_RETURN_ON_ERROR |
|
|
||||||
NSADDIMAGE_OPTION_WITH_SEARCHING |
|
|
||||||
NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lib = NSAddImage(xpcomFile,
|
|
||||||
NSADDIMAGE_OPTION_RETURN_ON_ERROR |
|
|
||||||
NSADDIMAGE_OPTION_WITH_SEARCHING |
|
|
||||||
NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME);
|
|
||||||
|
|
||||||
if (!lib) {
|
|
||||||
NSLinkEditErrors linkEditError;
|
|
||||||
int errorNum;
|
|
||||||
const char *errorString;
|
|
||||||
const char *fileName;
|
|
||||||
NSLinkEditError(&linkEditError, &errorNum, &fileName, &errorString);
|
|
||||||
fprintf(stderr, "XPCOMGlueLoad error %d:%d for file %s:\n%s\n",
|
|
||||||
linkEditError, errorNum, fileName, errorString);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*func = (GetFrozenFunctionsFunc) LookupSymbol(lib, "_NS_GetFrozenFunctions");
|
|
||||||
|
|
||||||
return *func ? NS_OK : NS_ERROR_NOT_AVAILABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
XPCOMGlueUnload()
|
|
||||||
{
|
|
||||||
// nothing to do, since we cannot unload dylibs on OS X
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
XPCOMGlueLoadXULFunctions(const nsDynamicFunctionLoad *symbols)
|
|
||||||
{
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
while (symbols->functionName) {
|
|
||||||
char buffer[512];
|
|
||||||
snprintf(buffer, sizeof(buffer), "_%s", symbols->functionName);
|
|
||||||
|
|
||||||
*symbols->function = (NSFuncPtr) LookupSymbol(sXULLibImage, buffer);
|
|
||||||
if (!*symbols->function)
|
|
||||||
rv = NS_ERROR_LOSS_OF_SIGNIFICANT_DATA;
|
|
||||||
|
|
||||||
++symbols;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
|
@ -1,216 +0,0 @@
|
||||||
/* -*- Mode: C++; tab-width: 6; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
||||||
/* 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 "nsGlueLinking.h"
|
|
||||||
#include "nsXPCOMGlue.h"
|
|
||||||
#include "mozilla/FileUtils.h"
|
|
||||||
|
|
||||||
#include "nsStringAPI.h"
|
|
||||||
#include <windows.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <tchar.h>
|
|
||||||
|
|
||||||
#define MOZ_LOADLIBRARY_FLAGS LOAD_WITH_ALTERED_SEARCH_PATH
|
|
||||||
|
|
||||||
struct DependentLib
|
|
||||||
{
|
|
||||||
HINSTANCE libHandle;
|
|
||||||
DependentLib *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
static DependentLib *sTop;
|
|
||||||
HINSTANCE sXULLibrary;
|
|
||||||
|
|
||||||
static void
|
|
||||||
AppendDependentLib(HINSTANCE libHandle)
|
|
||||||
{
|
|
||||||
DependentLib *d = new DependentLib;
|
|
||||||
if (!d)
|
|
||||||
return;
|
|
||||||
|
|
||||||
d->next = sTop;
|
|
||||||
d->libHandle = libHandle;
|
|
||||||
|
|
||||||
sTop = d;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ReadDependentCB(const char *aDependentLib, bool do_preload)
|
|
||||||
{
|
|
||||||
wchar_t wideDependentLib[MAX_PATH];
|
|
||||||
MultiByteToWideChar(CP_UTF8, 0, aDependentLib, -1, wideDependentLib, MAX_PATH);
|
|
||||||
|
|
||||||
if (do_preload)
|
|
||||||
mozilla::ReadAheadLib(wideDependentLib);
|
|
||||||
|
|
||||||
HINSTANCE h =
|
|
||||||
LoadLibraryExW(wideDependentLib, NULL, MOZ_LOADLIBRARY_FLAGS);
|
|
||||||
|
|
||||||
if (!h)
|
|
||||||
return;
|
|
||||||
|
|
||||||
AppendDependentLib(h);
|
|
||||||
}
|
|
||||||
|
|
||||||
// like strpbrk but finds the *last* char, not the first
|
|
||||||
static wchar_t*
|
|
||||||
ns_wcspbrk(wchar_t *string, const wchar_t *strCharSet)
|
|
||||||
{
|
|
||||||
wchar_t *found = NULL;
|
|
||||||
for (; *string; ++string) {
|
|
||||||
for (const wchar_t *search = strCharSet; *search; ++search) {
|
|
||||||
if (*search == *string) {
|
|
||||||
found = string;
|
|
||||||
// Since we're looking for the last char, we save "found"
|
|
||||||
// until we're at the end of the string.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ns_isRelPath(wchar_t* path)
|
|
||||||
{
|
|
||||||
return !(path[1] == ':');
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
XPCOMGlueLoad(const char *aXpcomFile, GetFrozenFunctionsFunc *func)
|
|
||||||
{
|
|
||||||
wchar_t xpcomFile[MAXPATHLEN];
|
|
||||||
MultiByteToWideChar(CP_UTF8, 0, aXpcomFile,-1,
|
|
||||||
xpcomFile, MAXPATHLEN);
|
|
||||||
|
|
||||||
|
|
||||||
if (xpcomFile[0] == '.' && xpcomFile[1] == '\0') {
|
|
||||||
wcscpy(xpcomFile, LXPCOM_DLL);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
wchar_t xpcomDir[MAXPATHLEN];
|
|
||||||
|
|
||||||
if (ns_isRelPath(xpcomFile))
|
|
||||||
{
|
|
||||||
_wfullpath(xpcomDir, xpcomFile, sizeof(xpcomDir)/sizeof(wchar_t));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wcscpy(xpcomDir, xpcomFile);
|
|
||||||
}
|
|
||||||
wchar_t *lastSlash = ns_wcspbrk(xpcomDir, L"/\\");
|
|
||||||
if (lastSlash) {
|
|
||||||
*lastSlash = '\0';
|
|
||||||
char xpcomDir_narrow[MAXPATHLEN];
|
|
||||||
WideCharToMultiByte(CP_UTF8, 0, xpcomDir,-1,
|
|
||||||
xpcomDir_narrow, MAX_PATH, NULL, NULL);
|
|
||||||
|
|
||||||
XPCOMGlueLoadDependentLibs(xpcomDir_narrow, ReadDependentCB);
|
|
||||||
|
|
||||||
_snwprintf(lastSlash, MAXPATHLEN - wcslen(xpcomDir), L"\\" LXUL_DLL);
|
|
||||||
sXULLibrary =
|
|
||||||
LoadLibraryExW(xpcomDir, NULL, MOZ_LOADLIBRARY_FLAGS);
|
|
||||||
|
|
||||||
if (!sXULLibrary)
|
|
||||||
{
|
|
||||||
DWORD err = GetLastError();
|
|
||||||
#ifdef DEBUG
|
|
||||||
LPVOID lpMsgBuf;
|
|
||||||
FormatMessage(
|
|
||||||
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
||||||
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
||||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
||||||
NULL,
|
|
||||||
GetLastError(),
|
|
||||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
|
||||||
(LPTSTR) &lpMsgBuf,
|
|
||||||
0,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
wprintf(L"Error loading %s: %s\n", xpcomDir, lpMsgBuf);
|
|
||||||
LocalFree(lpMsgBuf);
|
|
||||||
#endif //DEBUG
|
|
||||||
return (err == ERROR_NOT_ENOUGH_MEMORY || err == ERROR_OUTOFMEMORY)
|
|
||||||
? NS_ERROR_OUT_OF_MEMORY : NS_ERROR_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
HINSTANCE h =
|
|
||||||
LoadLibraryExW(xpcomFile, NULL, MOZ_LOADLIBRARY_FLAGS);
|
|
||||||
|
|
||||||
if (!h)
|
|
||||||
{
|
|
||||||
DWORD err = GetLastError();
|
|
||||||
#ifdef DEBUG
|
|
||||||
LPVOID lpMsgBuf;
|
|
||||||
FormatMessage(
|
|
||||||
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
||||||
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
||||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
||||||
NULL,
|
|
||||||
err,
|
|
||||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
|
||||||
(LPTSTR) &lpMsgBuf,
|
|
||||||
0,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
wprintf(L"Error loading %s: %s\n", xpcomFile, lpMsgBuf);
|
|
||||||
LocalFree(lpMsgBuf);
|
|
||||||
#endif
|
|
||||||
return (err == ERROR_NOT_ENOUGH_MEMORY || err == ERROR_OUTOFMEMORY)
|
|
||||||
? NS_ERROR_OUT_OF_MEMORY : NS_ERROR_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
AppendDependentLib(h);
|
|
||||||
|
|
||||||
GetFrozenFunctionsFunc sym =
|
|
||||||
(GetFrozenFunctionsFunc) GetProcAddress(h, "NS_GetFrozenFunctions");
|
|
||||||
|
|
||||||
if (!sym) { // No symbol found.
|
|
||||||
XPCOMGlueUnload();
|
|
||||||
return NS_ERROR_NOT_AVAILABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
*func = sym;
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
XPCOMGlueUnload()
|
|
||||||
{
|
|
||||||
while (sTop) {
|
|
||||||
FreeLibrary(sTop->libHandle);
|
|
||||||
|
|
||||||
DependentLib *temp = sTop;
|
|
||||||
sTop = sTop->next;
|
|
||||||
|
|
||||||
delete temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sXULLibrary) {
|
|
||||||
FreeLibrary(sXULLibrary);
|
|
||||||
sXULLibrary = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
XPCOMGlueLoadXULFunctions(const nsDynamicFunctionLoad *symbols)
|
|
||||||
{
|
|
||||||
if (!sXULLibrary)
|
|
||||||
return NS_ERROR_NOT_INITIALIZED;
|
|
||||||
|
|
||||||
nsresult rv = NS_OK;
|
|
||||||
while (symbols->functionName) {
|
|
||||||
*symbols->function =
|
|
||||||
(NSFuncPtr) GetProcAddress(sXULLibrary, symbols->functionName);
|
|
||||||
if (!*symbols->function)
|
|
||||||
rv = NS_ERROR_LOSS_OF_SIGNIFICANT_DATA;
|
|
||||||
|
|
||||||
++symbols;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
|
@ -5,7 +5,6 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
#include "nsXPCOMGlue.h"
|
#include "nsXPCOMGlue.h"
|
||||||
#include "nsGlueLinking.h"
|
|
||||||
|
|
||||||
#include "nspr.h"
|
#include "nspr.h"
|
||||||
#include "nsDebug.h"
|
#include "nsDebug.h"
|
||||||
|
@ -15,46 +14,15 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#ifdef XP_WIN
|
#include "mozilla/FileUtils.h"
|
||||||
#include <windows.h>
|
|
||||||
#include <mbstring.h>
|
using namespace mozilla;
|
||||||
#include <malloc.h>
|
|
||||||
#define snprintf _snprintf
|
#define XPCOM_DEPENDENT_LIBS_LIST "dependentlibs.list"
|
||||||
#endif
|
|
||||||
|
|
||||||
static XPCOMFunctions xpcomFunctions;
|
static XPCOMFunctions xpcomFunctions;
|
||||||
static bool do_preload = false;
|
static bool do_preload = false;
|
||||||
|
|
||||||
extern "C"
|
|
||||||
void XPCOMGlueEnablePreload()
|
|
||||||
{
|
|
||||||
do_preload = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
nsresult XPCOMGlueStartup(const char* xpcomFile)
|
|
||||||
{
|
|
||||||
xpcomFunctions.version = XPCOM_GLUE_VERSION;
|
|
||||||
xpcomFunctions.size = sizeof(XPCOMFunctions);
|
|
||||||
|
|
||||||
GetFrozenFunctionsFunc func = nullptr;
|
|
||||||
|
|
||||||
if (!xpcomFile)
|
|
||||||
xpcomFile = XPCOM_DLL;
|
|
||||||
|
|
||||||
nsresult rv = XPCOMGlueLoad(xpcomFile, &func);
|
|
||||||
if (NS_FAILED(rv))
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
rv = (*func)(&xpcomFunctions, nullptr);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
XPCOMGlueUnload();
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(XP_WIN)
|
#if defined(XP_WIN)
|
||||||
#define READ_TEXTMODE L"rt"
|
#define READ_TEXTMODE L"rt"
|
||||||
#elif defined(XP_OS2)
|
#elif defined(XP_OS2)
|
||||||
|
@ -63,7 +31,294 @@ nsresult XPCOMGlueStartup(const char* xpcomFile)
|
||||||
#define READ_TEXTMODE "r"
|
#define READ_TEXTMODE "r"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(SUNOS4) || defined(NEXTSTEP) || \
|
||||||
|
defined(XP_DARWIN) || defined(XP_OS2) || \
|
||||||
|
(defined(OPENBSD) || defined(NETBSD)) && !defined(__ELF__)
|
||||||
|
#define LEADING_UNDERSCORE "_"
|
||||||
|
#else
|
||||||
|
#define LEADING_UNDERSCORE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(XP_WIN)
|
||||||
|
#include <windows.h>
|
||||||
|
#include <mbstring.h>
|
||||||
|
#define snprintf _snprintf
|
||||||
|
|
||||||
|
typedef HINSTANCE LibHandleType;
|
||||||
|
|
||||||
|
static LibHandleType
|
||||||
|
GetLibHandle(pathstr_t aDependentLib)
|
||||||
|
{
|
||||||
|
LibHandleType libHandle =
|
||||||
|
LoadLibraryExW(aDependentLib, nullptr, LOAD_WITH_ALTERED_SEARCH_PATH);
|
||||||
|
|
||||||
|
if (!libHandle) {
|
||||||
|
DWORD err = GetLastError();
|
||||||
|
#ifdef DEBUG
|
||||||
|
LPVOID lpMsgBuf;
|
||||||
|
FormatMessage(
|
||||||
|
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||||
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
||||||
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
|
nullptr,
|
||||||
|
err,
|
||||||
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||||
|
(LPTSTR) &lpMsgBuf,
|
||||||
|
0,
|
||||||
|
nullptr
|
||||||
|
);
|
||||||
|
wprintf(L"Error loading %ls: %s\n", aDependentLib, lpMsgBuf);
|
||||||
|
LocalFree(lpMsgBuf);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return libHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NSFuncPtr
|
||||||
|
GetSymbol(LibHandleType aLibHandle, const char *aSymbol)
|
||||||
|
{
|
||||||
|
return (NSFuncPtr) GetProcAddress(aLibHandle, aSymbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
CloseLibHandle(LibHandleType aLibHandle)
|
||||||
|
{
|
||||||
|
FreeLibrary(aLibHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(XP_OS2)
|
||||||
|
#define INCL_DOS
|
||||||
|
#define INCL_DOSERRORS
|
||||||
|
#include <os2.h>
|
||||||
|
|
||||||
|
typedef HMODULE LibHandleType;
|
||||||
|
|
||||||
|
static LibHandleType
|
||||||
|
GetLibHandle(pathstr_t aDependentLib)
|
||||||
|
{
|
||||||
|
CHAR pszError[_MAX_PATH];
|
||||||
|
ULONG ulrc = NO_ERROR;
|
||||||
|
LibHandleType libHandle;
|
||||||
|
ulrc = DosLoadModule(pszError, _MAX_PATH, aDependentLib, &libHandle);
|
||||||
|
return (ulrc == NO_ERROR) ? libHandle : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NSFuncPtr
|
||||||
|
GetSymbol(LibHandleType aLibHandle, const char *aSymbol)
|
||||||
|
{
|
||||||
|
ULONG ulrc = NO_ERROR;
|
||||||
|
GetFrozenFunctionsFunc sym;
|
||||||
|
ulrc = DosQueryProcAddr(aLibHandle, 0, aSymbol, (PFN*)&sym);
|
||||||
|
return (ulrc == NO_ERROR) ? sym : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
CloseLibHandle(LibHandleType aLibHandle)
|
||||||
|
{
|
||||||
|
DosFreeModule(aLibHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(XP_MACOSX)
|
||||||
|
#include <mach-o/dyld.h>
|
||||||
|
|
||||||
|
typedef const mach_header *LibHandleType;
|
||||||
|
|
||||||
|
static LibHandleType
|
||||||
|
GetLibHandle(pathstr_t aDependentLib)
|
||||||
|
{
|
||||||
|
LibHandleType libHandle = NSAddImage(aDependentLib,
|
||||||
|
NSADDIMAGE_OPTION_RETURN_ON_ERROR |
|
||||||
|
NSADDIMAGE_OPTION_MATCH_FILENAME_BY_INSTALLNAME);
|
||||||
|
if (!libHandle) {
|
||||||
|
NSLinkEditErrors linkEditError;
|
||||||
|
int errorNum;
|
||||||
|
const char *errorString;
|
||||||
|
const char *fileName;
|
||||||
|
NSLinkEditError(&linkEditError, &errorNum, &fileName, &errorString);
|
||||||
|
fprintf(stderr, "XPCOMGlueLoad error %d:%d for file %s:\n%s\n",
|
||||||
|
linkEditError, errorNum, fileName, errorString);
|
||||||
|
}
|
||||||
|
return libHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NSFuncPtr
|
||||||
|
GetSymbol(LibHandleType aLibHandle, const char *aSymbol)
|
||||||
|
{
|
||||||
|
// Try to use |NSLookupSymbolInImage| since it is faster than searching
|
||||||
|
// the global symbol table. If we couldn't get a mach_header pointer
|
||||||
|
// for the XPCOM dylib, then use |NSLookupAndBindSymbol| to search the
|
||||||
|
// global symbol table (this shouldn't normally happen, unless the user
|
||||||
|
// has called XPCOMGlueStartup(".") and relies on libxpcom.dylib
|
||||||
|
// already being loaded).
|
||||||
|
NSSymbol sym = nullptr;
|
||||||
|
if (aLibHandle) {
|
||||||
|
sym = NSLookupSymbolInImage(aLibHandle, aSymbol,
|
||||||
|
NSLOOKUPSYMBOLINIMAGE_OPTION_BIND |
|
||||||
|
NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
|
||||||
|
} else {
|
||||||
|
if (NSIsSymbolNameDefined(aSymbol))
|
||||||
|
sym = NSLookupAndBindSymbol(aSymbol);
|
||||||
|
}
|
||||||
|
if (!sym)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
return (NSFuncPtr) NSAddressOfSymbol(sym);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
CloseLibHandle(LibHandleType aLibHandle)
|
||||||
|
{
|
||||||
|
// we cannot unload dylibs on OS X
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
#include <dlfcn.h>
|
||||||
|
|
||||||
|
#if defined(MOZ_LINKER) && !defined(ANDROID)
|
||||||
|
extern "C" {
|
||||||
|
NS_HIDDEN __typeof(dlopen) __wrap_dlopen;
|
||||||
|
NS_HIDDEN __typeof(dlsym) __wrap_dlsym;
|
||||||
|
NS_HIDDEN __typeof(dlclose) __wrap_dlclose;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define dlopen __wrap_dlopen
|
||||||
|
#define dlsym __wrap_dlsym
|
||||||
|
#define dlclose __wrap_dlclose
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef NS_TRACE_MALLOC
|
||||||
|
extern "C" {
|
||||||
|
NS_EXPORT_(__ptr_t) __libc_malloc(size_t);
|
||||||
|
NS_EXPORT_(__ptr_t) __libc_calloc(size_t, size_t);
|
||||||
|
NS_EXPORT_(__ptr_t) __libc_realloc(__ptr_t, size_t);
|
||||||
|
NS_EXPORT_(void) __libc_free(__ptr_t);
|
||||||
|
NS_EXPORT_(__ptr_t) __libc_memalign(size_t, size_t);
|
||||||
|
NS_EXPORT_(__ptr_t) __libc_valloc(size_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __ptr_t (*_malloc)(size_t) = __libc_malloc;
|
||||||
|
static __ptr_t (*_calloc)(size_t, size_t) = __libc_calloc;
|
||||||
|
static __ptr_t (*_realloc)(__ptr_t, size_t) = __libc_realloc;
|
||||||
|
static void (*_free)(__ptr_t) = __libc_free;
|
||||||
|
static __ptr_t (*_memalign)(size_t, size_t) = __libc_memalign;
|
||||||
|
static __ptr_t (*_valloc)(size_t) = __libc_valloc;
|
||||||
|
|
||||||
|
NS_EXPORT_(__ptr_t) malloc(size_t size)
|
||||||
|
{
|
||||||
|
return _malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_EXPORT_(__ptr_t) calloc(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
return _calloc(nmemb, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_EXPORT_(__ptr_t) realloc(__ptr_t ptr, size_t size)
|
||||||
|
{
|
||||||
|
return _realloc(ptr, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_EXPORT_(void) free(__ptr_t ptr)
|
||||||
|
{
|
||||||
|
_free(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_EXPORT_(void) cfree(__ptr_t ptr)
|
||||||
|
{
|
||||||
|
_free(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_EXPORT_(__ptr_t) memalign(size_t boundary, size_t size)
|
||||||
|
{
|
||||||
|
return _memalign(boundary, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_EXPORT_(int)
|
||||||
|
posix_memalign(void **memptr, size_t alignment, size_t size)
|
||||||
|
{
|
||||||
|
__ptr_t ptr = _memalign(alignment, size);
|
||||||
|
if (!ptr)
|
||||||
|
return ENOMEM;
|
||||||
|
*memptr = ptr;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_EXPORT_(__ptr_t) valloc(size_t size)
|
||||||
|
{
|
||||||
|
return _valloc(size);
|
||||||
|
}
|
||||||
|
#endif /* NS_TRACE_MALLOC */
|
||||||
|
|
||||||
|
typedef void *LibHandleType;
|
||||||
|
|
||||||
|
static LibHandleType
|
||||||
|
GetLibHandle(pathstr_t aDependentLib)
|
||||||
|
{
|
||||||
|
LibHandleType libHandle = dlopen(aDependentLib, RTLD_GLOBAL | RTLD_LAZY);
|
||||||
|
if (!libHandle) {
|
||||||
|
fprintf(stderr, "XPCOMGlueLoad error for file %s:\n%s\n", aDependentLib, dlerror());
|
||||||
|
}
|
||||||
|
return libHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NSFuncPtr
|
||||||
|
GetSymbol(LibHandleType aLibHandle, const char *aSymbol)
|
||||||
|
{
|
||||||
|
return (NSFuncPtr) dlsym(aLibHandle, aSymbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
CloseLibHandle(LibHandleType aLibHandle)
|
||||||
|
{
|
||||||
|
dlclose(aLibHandle);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct DependentLib
|
||||||
|
{
|
||||||
|
LibHandleType libHandle;
|
||||||
|
DependentLib *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
static DependentLib *sTop;
|
||||||
|
|
||||||
|
static void
|
||||||
|
AppendDependentLib(LibHandleType libHandle)
|
||||||
|
{
|
||||||
|
DependentLib *d = new DependentLib;
|
||||||
|
if (!d)
|
||||||
|
return;
|
||||||
|
|
||||||
|
d->next = sTop;
|
||||||
|
d->libHandle = libHandle;
|
||||||
|
|
||||||
|
sTop = d;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
ReadDependentCB(pathstr_t aDependentLib, bool do_preload)
|
||||||
|
{
|
||||||
|
if (do_preload) {
|
||||||
|
ReadAheadLib(aDependentLib);
|
||||||
|
}
|
||||||
|
LibHandleType libHandle = GetLibHandle(aDependentLib);
|
||||||
|
if (libHandle) {
|
||||||
|
AppendDependentLib(libHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
return libHandle;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef XP_WIN
|
#ifdef XP_WIN
|
||||||
|
static bool
|
||||||
|
ReadDependentCB(const char *aDependentLib, bool do_preload)
|
||||||
|
{
|
||||||
|
wchar_t wideDependentLib[MAX_PATH];
|
||||||
|
MultiByteToWideChar(CP_UTF8, 0, aDependentLib, -1, wideDependentLib, MAX_PATH);
|
||||||
|
return ReadDependentCB(wideDependentLib, do_preload);
|
||||||
|
}
|
||||||
|
|
||||||
inline FILE *TS_tfopen (const char *path, const wchar_t *mode)
|
inline FILE *TS_tfopen (const char *path, const wchar_t *mode)
|
||||||
{
|
{
|
||||||
wchar_t wPath[MAX_PATH];
|
wchar_t wPath[MAX_PATH];
|
||||||
|
@ -77,36 +332,189 @@ inline FILE *TS_tfopen (const char *path, const char *mode)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
/* RAII wrapper for FILE descriptors */
|
||||||
XPCOMGlueLoadDependentLibs(const char *xpcomDir, DependentLibsCallback cb)
|
struct ScopedCloseFileTraits
|
||||||
{
|
{
|
||||||
char buffer[MAXPATHLEN];
|
typedef FILE *type;
|
||||||
sprintf(buffer, "%s" XPCOM_FILE_PATH_SEPARATOR XPCOM_DEPENDENT_LIBS_LIST,
|
static type empty() { return nullptr; }
|
||||||
xpcomDir);
|
static void release(type f) {
|
||||||
|
if (f) {
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
typedef Scoped<ScopedCloseFileTraits> ScopedCloseFile;
|
||||||
|
|
||||||
FILE *flist = TS_tfopen(buffer, READ_TEXTMODE);
|
static void
|
||||||
if (!flist)
|
XPCOMGlueUnload()
|
||||||
return;
|
{
|
||||||
|
#if !defined(XP_WIN) && !defined(XP_OS2) && !defined(XP_MACOSX) \
|
||||||
|
&& defined(NS_TRACE_MALLOC)
|
||||||
|
if (sTop) {
|
||||||
|
_malloc = __libc_malloc;
|
||||||
|
_calloc = __libc_calloc;
|
||||||
|
_realloc = __libc_realloc;
|
||||||
|
_free = __libc_free;
|
||||||
|
_memalign = __libc_memalign;
|
||||||
|
_valloc = __libc_valloc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
while (sTop) {
|
||||||
|
CloseLibHandle(sTop->libHandle);
|
||||||
|
|
||||||
|
DependentLib *temp = sTop;
|
||||||
|
sTop = sTop->next;
|
||||||
|
|
||||||
|
delete temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(XP_WIN) || defined(XP_OS2)
|
||||||
|
// 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) {
|
||||||
|
for (const char *search = strCharSet; *search; ++search) {
|
||||||
|
if (*search == *string) {
|
||||||
|
found = string;
|
||||||
|
// Since we're looking for the last char, we save "found"
|
||||||
|
// until we're at the end of the string.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static GetFrozenFunctionsFunc
|
||||||
|
XPCOMGlueLoad(const char *xpcomFile)
|
||||||
|
{
|
||||||
|
char xpcomDir[MAXPATHLEN];
|
||||||
|
#if defined(XP_WIN) || defined(XP_OS2)
|
||||||
|
const char *lastSlash = ns_strrpbrk(xpcomFile, "/\\");
|
||||||
|
#else
|
||||||
|
const char *lastSlash = strrchr(xpcomFile, '/');
|
||||||
|
#endif
|
||||||
|
char *cursor;
|
||||||
|
if (lastSlash) {
|
||||||
|
size_t len = size_t(lastSlash - xpcomFile);
|
||||||
|
|
||||||
|
if (len > MAXPATHLEN - sizeof(XPCOM_FILE_PATH_SEPARATOR
|
||||||
|
XPCOM_DEPENDENT_LIBS_LIST)) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
memcpy(xpcomDir, xpcomFile, len);
|
||||||
|
strcpy(xpcomDir + len, XPCOM_FILE_PATH_SEPARATOR
|
||||||
|
XPCOM_DEPENDENT_LIBS_LIST);
|
||||||
|
cursor = xpcomDir + len + 1;
|
||||||
|
} else {
|
||||||
|
strcpy(xpcomDir, XPCOM_DEPENDENT_LIBS_LIST);
|
||||||
|
cursor = xpcomDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScopedCloseFile flist;
|
||||||
|
flist = TS_tfopen(xpcomDir, READ_TEXTMODE);
|
||||||
|
if (!flist) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
*cursor = '\0';
|
||||||
|
|
||||||
|
char buffer[MAXPATHLEN];
|
||||||
|
|
||||||
while (fgets(buffer, sizeof(buffer), flist)) {
|
while (fgets(buffer, sizeof(buffer), flist)) {
|
||||||
int l = strlen(buffer);
|
int l = strlen(buffer);
|
||||||
|
|
||||||
// ignore empty lines and comments
|
// ignore empty lines and comments
|
||||||
if (l == 0 || *buffer == '#')
|
if (l == 0 || *buffer == '#') {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// cut the trailing newline, if present
|
// cut the trailing newline, if present
|
||||||
if (buffer[l - 1] == '\n')
|
if (buffer[l - 1] == '\n')
|
||||||
buffer[l - 1] = '\0';
|
buffer[l - 1] = '\0';
|
||||||
|
|
||||||
char buffer2[MAXPATHLEN];
|
if (l + size_t(cursor - xpcomDir) > MAXPATHLEN) {
|
||||||
snprintf(buffer2, sizeof(buffer2),
|
return nullptr;
|
||||||
"%s" XPCOM_FILE_PATH_SEPARATOR "%s",
|
|
||||||
xpcomDir, buffer);
|
|
||||||
cb(buffer2, do_preload);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(flist);
|
strcpy(cursor, buffer);
|
||||||
|
if (!ReadDependentCB(xpcomDir, do_preload)) {
|
||||||
|
XPCOMGlueUnload();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GetFrozenFunctionsFunc sym =
|
||||||
|
(GetFrozenFunctionsFunc) GetSymbol(sTop->libHandle, LEADING_UNDERSCORE "NS_GetFrozenFunctions");
|
||||||
|
|
||||||
|
if (!sym) { // No symbol found.
|
||||||
|
XPCOMGlueUnload();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined(XP_WIN) && !defined(XP_OS2) && !defined(XP_MACOSX) \
|
||||||
|
&& defined(NS_TRACE_MALLOC)
|
||||||
|
_malloc = (__ptr_t(*)(size_t)) GetSymbol(sTop->libHandle, "malloc");
|
||||||
|
_calloc = (__ptr_t(*)(size_t, size_t)) GetSymbol(sTop->libHandle, "calloc");
|
||||||
|
_realloc = (__ptr_t(*)(__ptr_t, size_t)) GetSymbol(sTop->libHandle, "realloc");
|
||||||
|
_free = (void(*)(__ptr_t)) GetSymbol(sTop->libHandle, "free");
|
||||||
|
_memalign = (__ptr_t(*)(size_t, size_t)) GetSymbol(sTop->libHandle, "memalign");
|
||||||
|
_valloc = (__ptr_t(*)(size_t)) GetSymbol(sTop->libHandle, "valloc");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return sym;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
XPCOMGlueLoadXULFunctions(const nsDynamicFunctionLoad *symbols)
|
||||||
|
{
|
||||||
|
// We don't null-check sXULLibHandle because this might work even
|
||||||
|
// if it is null (same as RTLD_DEFAULT)
|
||||||
|
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
while (symbols->functionName) {
|
||||||
|
char buffer[512];
|
||||||
|
snprintf(buffer, sizeof(buffer),
|
||||||
|
LEADING_UNDERSCORE "%s", symbols->functionName);
|
||||||
|
|
||||||
|
*symbols->function = (NSFuncPtr) GetSymbol(sTop->libHandle, buffer);
|
||||||
|
if (!*symbols->function)
|
||||||
|
rv = NS_ERROR_LOSS_OF_SIGNIFICANT_DATA;
|
||||||
|
|
||||||
|
++symbols;
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
void XPCOMGlueEnablePreload()
|
||||||
|
{
|
||||||
|
do_preload = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsresult XPCOMGlueStartup(const char* xpcomFile)
|
||||||
|
{
|
||||||
|
xpcomFunctions.version = XPCOM_GLUE_VERSION;
|
||||||
|
xpcomFunctions.size = sizeof(XPCOMFunctions);
|
||||||
|
|
||||||
|
if (!xpcomFile)
|
||||||
|
xpcomFile = XPCOM_DLL;
|
||||||
|
|
||||||
|
GetFrozenFunctionsFunc func = XPCOMGlueLoad(xpcomFile);
|
||||||
|
if (!func)
|
||||||
|
return NS_ERROR_NOT_AVAILABLE;
|
||||||
|
|
||||||
|
nsresult rv = (*func)(&xpcomFunctions, nullptr);
|
||||||
|
if (NS_FAILED(rv)) {
|
||||||
|
XPCOMGlueUnload();
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
XPCOM_API(nsresult)
|
XPCOM_API(nsresult)
|
||||||
|
|
|
@ -19,34 +19,10 @@ LOCAL_INCLUDES = \
|
||||||
-I$(srcdir)/../../../build \
|
-I$(srcdir)/../../../build \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
ifeq (Darwin,$(OS_ARCH))
|
|
||||||
ifeq (uikit,$(MOZ_WIDGET_TOOLKIT))
|
|
||||||
LINKSRC = nsGlueLinkingDlopen.cpp
|
|
||||||
else
|
|
||||||
LINKSRC = nsGlueLinkingOSX.cpp
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(OS_ARCH),WINNT)
|
|
||||||
LINKSRC = nsGlueLinkingWin.cpp
|
|
||||||
endif
|
|
||||||
ifneq (,$(filter AIX DragonFly FreeBSD GNU GNU_% Linux NetBSD OpenBSD SunOS,$(OS_ARCH)))
|
|
||||||
LINKSRC = nsGlueLinkingDlopen.cpp
|
|
||||||
endif
|
|
||||||
ifeq (OS2,$(OS_ARCH))
|
|
||||||
LINKSRC = nsGlueLinkingOS2.cpp
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifndef LINKSRC
|
|
||||||
LINKSRC = nsGlueLinkingNull.cpp
|
|
||||||
$(warning TinderboxPrint:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=298044">Error: XPCOM Glue</a>)
|
|
||||||
endif
|
|
||||||
|
|
||||||
CPPSRCS = \
|
CPPSRCS = \
|
||||||
$(XPCOM_GLUE_SRC_LCPPSRCS) \
|
$(XPCOM_GLUE_SRC_LCPPSRCS) \
|
||||||
nsXPCOMGlue.cpp \
|
nsXPCOMGlue.cpp \
|
||||||
nsStringAPI.cpp \
|
nsStringAPI.cpp \
|
||||||
$(LINKSRC) \
|
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
SDK_LIBRARY = \
|
SDK_LIBRARY = \
|
||||||
|
@ -75,10 +51,10 @@ OS_COMPILE_CFLAGS += -Zl
|
||||||
DEFINES += -D_USE_ANSI_CPP
|
DEFINES += -D_USE_ANSI_CPP
|
||||||
endif
|
endif
|
||||||
|
|
||||||
export:: $(XPCOM_GLUE_SRC_CPPSRCS) $(topsrcdir)/xpcom/glue/nsStringAPI.cpp ../nsXPCOMGlue.cpp ../nsGlueLinking.h ../$(LINKSRC)
|
export:: $(XPCOM_GLUE_SRC_CPPSRCS) $(topsrcdir)/xpcom/glue/nsStringAPI.cpp ../nsXPCOMGlue.cpp
|
||||||
$(INSTALL) $^ .
|
$(INSTALL) $^ .
|
||||||
|
|
||||||
GARBAGE += nsStringAPI.cpp nsXPCOMGlue.cpp nsGlueLinking.h $(LINKSRC)
|
GARBAGE += nsStringAPI.cpp nsXPCOMGlue.cpp
|
||||||
|
|
||||||
DEFINES += -DXPCOM_GLUE
|
DEFINES += -DXPCOM_GLUE
|
||||||
|
|
||||||
|
|
|
@ -8,12 +8,6 @@
|
||||||
#ifndef xptcall_h___
|
#ifndef xptcall_h___
|
||||||
#define xptcall_h___
|
#define xptcall_h___
|
||||||
|
|
||||||
#ifdef MOZILLA_INTERNAL_API
|
|
||||||
# define NS_GetXPTCallStub NS_GetXPTCallStub_P
|
|
||||||
# define NS_DestroyXPTCallStub NS_DestroyXPTCallStub_P
|
|
||||||
# define NS_InvokeByIndex NS_InvokeByIndex_P
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "nscore.h"
|
#include "nscore.h"
|
||||||
#include "nsISupports.h"
|
#include "nsISupports.h"
|
||||||
#include "xpt_struct.h"
|
#include "xpt_struct.h"
|
||||||
|
|
|
@ -61,20 +61,20 @@ invoke_copy_to_stack(uint64_t* d, uint32_t paramCount, nsXPTCVariant* s)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* EXPORT_XPCOM_API(nsresult)
|
* EXPORT_XPCOM_API(nsresult)
|
||||||
* NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
* NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
* uint32_t paramCount, nsXPTCVariant* params)
|
* uint32_t paramCount, nsXPTCVariant* params)
|
||||||
*/
|
*/
|
||||||
__asm__(
|
__asm__(
|
||||||
"#### NS_InvokeByIndex_P ####\n"
|
"#### NS_InvokeByIndex ####\n"
|
||||||
".text\n\t"
|
".text\n\t"
|
||||||
".align 5\n\t"
|
".align 5\n\t"
|
||||||
".globl NS_InvokeByIndex_P\n\t"
|
".globl NS_InvokeByIndex\n\t"
|
||||||
".ent NS_InvokeByIndex_P\n"
|
".ent NS_InvokeByIndex\n"
|
||||||
"NS_InvokeByIndex_P:\n\t"
|
"NS_InvokeByIndex:\n\t"
|
||||||
".frame $15,32,$26,0\n\t"
|
".frame $15,32,$26,0\n\t"
|
||||||
".mask 0x4008000,-32\n\t"
|
".mask 0x4008000,-32\n\t"
|
||||||
"ldgp $29,0($27)\n"
|
"ldgp $29,0($27)\n"
|
||||||
"$NS_InvokeByIndex_P..ng:\n\t"
|
"$NS_InvokeByIndex..ng:\n\t"
|
||||||
"subq $30,32,$30\n\t"
|
"subq $30,32,$30\n\t"
|
||||||
"stq $26,0($30)\n\t"
|
"stq $26,0($30)\n\t"
|
||||||
"stq $15,8($30)\n\t"
|
"stq $15,8($30)\n\t"
|
||||||
|
@ -140,5 +140,5 @@ __asm__(
|
||||||
"ldq $15,8($30)\n\t"
|
"ldq $15,8($30)\n\t"
|
||||||
"addq $30,32,$30\n\t"
|
"addq $30,32,$30\n\t"
|
||||||
"ret $31,($26),1\n\t"
|
"ret $31,($26),1\n\t"
|
||||||
".end NS_InvokeByIndex_P"
|
".end NS_InvokeByIndex"
|
||||||
);
|
);
|
||||||
|
|
|
@ -100,7 +100,7 @@ invoke_copy_to_stack(uint64_t * d, uint32_t paramCount, nsXPTCVariant * s,
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports * that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports * that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant * params)
|
uint32_t paramCount, nsXPTCVariant * params)
|
||||||
{
|
{
|
||||||
uint32_t nr_gpr, nr_fpr, nr_stack;
|
uint32_t nr_gpr, nr_fpr, nr_stack;
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
.psr msb
|
.psr msb
|
||||||
// Section has executable code
|
// Section has executable code
|
||||||
.section .text, "ax","progbits"
|
.section .text, "ax","progbits"
|
||||||
// procedure named 'NS_InvokeByIndex_P'
|
// procedure named 'NS_InvokeByIndex'
|
||||||
.proc NS_InvokeByIndex_P
|
.proc NS_InvokeByIndex
|
||||||
// manual bundling
|
// manual bundling
|
||||||
.explicit
|
.explicit
|
||||||
|
|
||||||
|
@ -19,12 +19,12 @@
|
||||||
// .exclass invoke_copy_to_stack, @fullyvisible
|
// .exclass invoke_copy_to_stack, @fullyvisible
|
||||||
.type invoke_copy_to_stack,@function
|
.type invoke_copy_to_stack,@function
|
||||||
|
|
||||||
// .exclass NS_InvokeByIndex_P, @fullyvisible
|
// .exclass NS_InvokeByIndex, @fullyvisible
|
||||||
.type NS_InvokeByIndex_P,@function
|
.type NS_InvokeByIndex,@function
|
||||||
|
|
||||||
// NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
// NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
// uint32_t paramCount, nsXPTCVariant* params);
|
// uint32_t paramCount, nsXPTCVariant* params);
|
||||||
NS_InvokeByIndex_P::
|
NS_InvokeByIndex::
|
||||||
.prologue
|
.prologue
|
||||||
.save ar.pfs, r37
|
.save ar.pfs, r37
|
||||||
// allocate 4 input args, 6 local args, and 8 output args
|
// allocate 4 input args, 6 local args, and 8 output args
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
.psr lsb
|
.psr lsb
|
||||||
// Section has executable code
|
// Section has executable code
|
||||||
.section .text, "ax","progbits"
|
.section .text, "ax","progbits"
|
||||||
// procedure named 'NS_InvokeByIndex_P'
|
// procedure named 'NS_InvokeByIndex'
|
||||||
.proc NS_InvokeByIndex_P
|
.proc NS_InvokeByIndex
|
||||||
// manual bundling
|
// manual bundling
|
||||||
.explicit
|
.explicit
|
||||||
|
|
||||||
|
@ -19,12 +19,12 @@
|
||||||
// .exclass invoke_copy_to_stack, @fullyvisible
|
// .exclass invoke_copy_to_stack, @fullyvisible
|
||||||
.type invoke_copy_to_stack,@function
|
.type invoke_copy_to_stack,@function
|
||||||
|
|
||||||
// .exclass NS_InvokeByIndex_P, @fullyvisible
|
// .exclass NS_InvokeByIndex, @fullyvisible
|
||||||
.type NS_InvokeByIndex_P,@function
|
.type NS_InvokeByIndex,@function
|
||||||
|
|
||||||
// XPTC_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
// XPTC_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
// uint32_t paramCount, nsXPTCVariant* params);
|
// uint32_t paramCount, nsXPTCVariant* params);
|
||||||
NS_InvokeByIndex_P::
|
NS_InvokeByIndex::
|
||||||
.prologue
|
.prologue
|
||||||
.save ar.pfs, r37
|
.save ar.pfs, r37
|
||||||
// allocate 4 input args, 6 local args, and 8 output args
|
// allocate 4 input args, 6 local args, and 8 output args
|
||||||
|
|
|
@ -38,15 +38,15 @@
|
||||||
.text
|
.text
|
||||||
|
|
||||||
#
|
#
|
||||||
# _NS_InvokeByIndex_P(that, methodIndex, paramCount, params)
|
# _NS_InvokeByIndex(that, methodIndex, paramCount, params)
|
||||||
# a0 a1 a2 a3
|
# a0 a1 a2 a3
|
||||||
|
|
||||||
.globl _NS_InvokeByIndex_P
|
.globl _NS_InvokeByIndex
|
||||||
.align 2
|
.align 2
|
||||||
.type _NS_InvokeByIndex_P,@function
|
.type _NS_InvokeByIndex,@function
|
||||||
.ent _NS_InvokeByIndex_P,0
|
.ent _NS_InvokeByIndex,0
|
||||||
.frame fp, FRAMESZ, ra
|
.frame fp, FRAMESZ, ra
|
||||||
_NS_InvokeByIndex_P:
|
_NS_InvokeByIndex:
|
||||||
SETUP_GP
|
SETUP_GP
|
||||||
subu sp, FRAMESZ
|
subu sp, FRAMESZ
|
||||||
|
|
||||||
|
@ -131,4 +131,4 @@ _NS_InvokeByIndex_P:
|
||||||
|
|
||||||
addiu sp, FRAMESZ
|
addiu sp, FRAMESZ
|
||||||
j ra
|
j ra
|
||||||
END(_NS_InvokeByIndex_P)
|
END(_NS_InvokeByIndex)
|
||||||
|
|
|
@ -21,12 +21,12 @@ S0OFF=FRAMESZ-(6*SZREG)
|
||||||
GPOFF=FRAMESZ-(7*SZREG)
|
GPOFF=FRAMESZ-(7*SZREG)
|
||||||
|
|
||||||
#
|
#
|
||||||
# _NS_InvokeByIndex_P(that, methodIndex, paramCount, params)
|
# _NS_InvokeByIndex(that, methodIndex, paramCount, params)
|
||||||
# a0 a1 a2 a3
|
# a0 a1 a2 a3
|
||||||
|
|
||||||
NESTED(_NS_InvokeByIndex_P, FRAMESZ, ra)
|
NESTED(_NS_InvokeByIndex, FRAMESZ, ra)
|
||||||
PTR_SUBU sp, FRAMESZ
|
PTR_SUBU sp, FRAMESZ
|
||||||
SETUP_GP64(GPOFF, _NS_InvokeByIndex_P)
|
SETUP_GP64(GPOFF, _NS_InvokeByIndex)
|
||||||
|
|
||||||
REG_S ra, RAOFF(sp)
|
REG_S ra, RAOFF(sp)
|
||||||
REG_S a0, A0OFF(sp)
|
REG_S a0, A0OFF(sp)
|
||||||
|
@ -119,4 +119,4 @@ NESTED(_NS_InvokeByIndex_P, FRAMESZ, ra)
|
||||||
REG_L s0, S0OFF(sp)
|
REG_L s0, S0OFF(sp)
|
||||||
PTR_ADDU sp, FRAMESZ
|
PTR_ADDU sp, FRAMESZ
|
||||||
j ra
|
j ra
|
||||||
.end _NS_InvokeByIndex_P
|
.end _NS_InvokeByIndex
|
||||||
|
|
|
@ -12,11 +12,11 @@
|
||||||
framesz:
|
framesz:
|
||||||
.equ 128
|
.equ 128
|
||||||
|
|
||||||
.globl NS_InvokeByIndex_P
|
.globl NS_InvokeByIndex
|
||||||
.type NS_InvokeByIndex_P, @function
|
.type NS_InvokeByIndex, @function
|
||||||
|
|
||||||
|
|
||||||
NS_InvokeByIndex_P:
|
NS_InvokeByIndex:
|
||||||
.PROC
|
.PROC
|
||||||
.CALLINFO FRAME=72, CALLER,SAVE_RP, SAVE_SP, ENTRY_GR=3
|
.CALLINFO FRAME=72, CALLER,SAVE_RP, SAVE_SP, ENTRY_GR=3
|
||||||
.ENTRY
|
.ENTRY
|
||||||
|
@ -104,5 +104,5 @@ NS_InvokeByIndex_P:
|
||||||
NOP
|
NOP
|
||||||
.EXIT
|
.EXIT
|
||||||
.PROCEND ;in=23,24,25,26;
|
.PROCEND ;in=23,24,25,26;
|
||||||
.SIZE NS_InvokeByIndex_P, .-NS_InvokeByIndex_P
|
.SIZE NS_InvokeByIndex, .-NS_InvokeByIndex
|
||||||
|
|
||||||
|
|
|
@ -19,21 +19,21 @@
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
# NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
# uint32_t paramCount, nsXPTCVariant* params)
|
# uint32_t paramCount, nsXPTCVariant* params)
|
||||||
#
|
#
|
||||||
|
|
||||||
.section ".toc","aw"
|
.section ".toc","aw"
|
||||||
.section ".text"
|
.section ".text"
|
||||||
.align 2
|
.align 2
|
||||||
.globl NS_InvokeByIndex_P
|
.globl NS_InvokeByIndex
|
||||||
.section ".opd","aw"
|
.section ".opd","aw"
|
||||||
.align 3
|
.align 3
|
||||||
NS_InvokeByIndex_P:
|
NS_InvokeByIndex:
|
||||||
.quad .NS_InvokeByIndex_P,.TOC.@tocbase
|
.quad .NS_InvokeByIndex,.TOC.@tocbase
|
||||||
.previous
|
.previous
|
||||||
.type NS_InvokeByIndex_P,@function
|
.type NS_InvokeByIndex,@function
|
||||||
.NS_InvokeByIndex_P:
|
.NS_InvokeByIndex:
|
||||||
mflr 0
|
mflr 0
|
||||||
std 0,16(r1)
|
std 0,16(r1)
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ NS_InvokeByIndex_P:
|
||||||
mtlr 0
|
mtlr 0
|
||||||
blr
|
blr
|
||||||
|
|
||||||
.size NS_InvokeByIndex_P,.-.NS_InvokeByIndex_P
|
.size NS_InvokeByIndex,.-.NS_InvokeByIndex
|
||||||
|
|
||||||
# Magic indicating no need for an executable stack
|
# Magic indicating no need for an executable stack
|
||||||
.section .note.GNU-stack, "", @progbits ; .previous
|
.section .note.GNU-stack, "", @progbits ; .previous
|
||||||
|
|
|
@ -25,24 +25,24 @@
|
||||||
|
|
||||||
|
|
||||||
.rename H.10.NO_SYMBOL{PR},""
|
.rename H.10.NO_SYMBOL{PR},""
|
||||||
.rename H.18.NS_InvokeByIndex_P{TC},"NS_InvokeByIndex_P"
|
.rename H.18.NS_InvokeByIndex{TC},"NS_InvokeByIndex"
|
||||||
|
|
||||||
|
|
||||||
# .text section
|
# .text section
|
||||||
|
|
||||||
.csect H.10.NO_SYMBOL{PR}
|
.csect H.10.NO_SYMBOL{PR}
|
||||||
.globl .NS_InvokeByIndex_P
|
.globl .NS_InvokeByIndex
|
||||||
.globl NS_InvokeByIndex_P{DS}
|
.globl NS_InvokeByIndex{DS}
|
||||||
.extern .invoke_copy_to_stack
|
.extern .invoke_copy_to_stack
|
||||||
.extern ._ptrgl{PR}
|
.extern ._ptrgl{PR}
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
# NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
# uint32_t paramCount, nsXPTCVariant* params)
|
# uint32_t paramCount, nsXPTCVariant* params)
|
||||||
#
|
#
|
||||||
|
|
||||||
.NS_InvokeByIndex_P:
|
.NS_InvokeByIndex:
|
||||||
mflr r0
|
mflr r0
|
||||||
stw r31,-4(sp)
|
stw r31,-4(sp)
|
||||||
#
|
#
|
||||||
|
@ -117,13 +117,13 @@
|
||||||
# .data section
|
# .data section
|
||||||
|
|
||||||
.toc # 0x00000038
|
.toc # 0x00000038
|
||||||
T.18.NS_InvokeByIndex_P:
|
T.18.NS_InvokeByIndex:
|
||||||
.tc H.18.NS_InvokeByIndex_P{TC},NS_InvokeByIndex_P{DS}
|
.tc H.18.NS_InvokeByIndex{TC},NS_InvokeByIndex{DS}
|
||||||
|
|
||||||
.csect NS_InvokeByIndex_P{DS}
|
.csect NS_InvokeByIndex{DS}
|
||||||
.long .NS_InvokeByIndex_P # "\0\0\0\0"
|
.long .NS_InvokeByIndex # "\0\0\0\0"
|
||||||
.long TOC{TC0} # "\0\0\0008"
|
.long TOC{TC0} # "\0\0\0008"
|
||||||
.long 0x00000000 # "\0\0\0\0"
|
.long 0x00000000 # "\0\0\0\0"
|
||||||
# End csect NS_InvokeByIndex_P{DS}
|
# End csect NS_InvokeByIndex{DS}
|
||||||
|
|
||||||
# .bss section
|
# .bss section
|
||||||
|
|
|
@ -20,23 +20,23 @@
|
||||||
.set CR0_EQ,2
|
.set CR0_EQ,2
|
||||||
|
|
||||||
.rename H.10.NO_SYMBOL{PR},""
|
.rename H.10.NO_SYMBOL{PR},""
|
||||||
.rename H.18.NS_InvokeByIndex_P{TC},"NS_InvokeByIndex_P"
|
.rename H.18.NS_InvokeByIndex{TC},"NS_InvokeByIndex"
|
||||||
|
|
||||||
|
|
||||||
# .text section
|
# .text section
|
||||||
|
|
||||||
.csect H.10.NO_SYMBOL{PR}
|
.csect H.10.NO_SYMBOL{PR}
|
||||||
.globl .NS_InvokeByIndex_P
|
.globl .NS_InvokeByIndex
|
||||||
.globl NS_InvokeByIndex_P{DS}
|
.globl NS_InvokeByIndex{DS}
|
||||||
.extern .invoke_copy_to_stack
|
.extern .invoke_copy_to_stack
|
||||||
.extern ._ptrgl{PR}
|
.extern ._ptrgl{PR}
|
||||||
|
|
||||||
#
|
#
|
||||||
# NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
# NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
# uint32_t paramCount, nsXPTCVariant* params)
|
# uint32_t paramCount, nsXPTCVariant* params)
|
||||||
#
|
#
|
||||||
|
|
||||||
.NS_InvokeByIndex_P:
|
.NS_InvokeByIndex:
|
||||||
mflr r0
|
mflr r0
|
||||||
std r31,-8(sp)
|
std r31,-8(sp)
|
||||||
#
|
#
|
||||||
|
@ -116,13 +116,13 @@
|
||||||
# .data section
|
# .data section
|
||||||
|
|
||||||
.toc # 0x00000038
|
.toc # 0x00000038
|
||||||
T.18.NS_InvokeByIndex_P:
|
T.18.NS_InvokeByIndex:
|
||||||
.tc H.18.NS_InvokeByIndex_P{TC},NS_InvokeByIndex_P{DS}
|
.tc H.18.NS_InvokeByIndex{TC},NS_InvokeByIndex{DS}
|
||||||
|
|
||||||
.csect NS_InvokeByIndex_P{DS}
|
.csect NS_InvokeByIndex{DS}
|
||||||
.llong .NS_InvokeByIndex_P # "\0\0\0\0"
|
.llong .NS_InvokeByIndex # "\0\0\0\0"
|
||||||
.llong TOC{TC0} # "\0\0\0008"
|
.llong TOC{TC0} # "\0\0\0008"
|
||||||
.llong 0x00000000 # "\0\0\0\0"
|
.llong 0x00000000 # "\0\0\0\0"
|
||||||
# End csect NS_InvokeByIndex_P{DS}
|
# End csect NS_InvokeByIndex{DS}
|
||||||
|
|
||||||
# .bss section
|
# .bss section
|
||||||
|
|
|
@ -25,24 +25,24 @@
|
||||||
|
|
||||||
|
|
||||||
.rename H.10.NO_SYMBOL{PR},""
|
.rename H.10.NO_SYMBOL{PR},""
|
||||||
.rename H.18.NS_InvokeByIndex_P{TC},"NS_InvokeByIndex_P"
|
.rename H.18.NS_InvokeByIndex{TC},"NS_InvokeByIndex"
|
||||||
|
|
||||||
|
|
||||||
# .text section
|
# .text section
|
||||||
|
|
||||||
.csect H.10.NO_SYMBOL{PR}
|
.csect H.10.NO_SYMBOL{PR}
|
||||||
.globl .NS_InvokeByIndex_P
|
.globl .NS_InvokeByIndex
|
||||||
.globl NS_InvokeByIndex_P{DS}
|
.globl NS_InvokeByIndex{DS}
|
||||||
.extern .invoke_copy_to_stack
|
.extern .invoke_copy_to_stack
|
||||||
.extern ._ptrgl{PR}
|
.extern ._ptrgl{PR}
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
# NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
# uint32_t paramCount, nsXPTCVariant* params)
|
# uint32_t paramCount, nsXPTCVariant* params)
|
||||||
#
|
#
|
||||||
|
|
||||||
.NS_InvokeByIndex_P:
|
.NS_InvokeByIndex:
|
||||||
mflr r0
|
mflr r0
|
||||||
stw r31,-4(sp)
|
stw r31,-4(sp)
|
||||||
#
|
#
|
||||||
|
@ -112,13 +112,13 @@
|
||||||
# .data section
|
# .data section
|
||||||
|
|
||||||
.toc # 0x00000038
|
.toc # 0x00000038
|
||||||
T.18.NS_InvokeByIndex_P:
|
T.18.NS_InvokeByIndex:
|
||||||
.tc H.18.NS_InvokeByIndex_P{TC},NS_InvokeByIndex_P{DS}
|
.tc H.18.NS_InvokeByIndex{TC},NS_InvokeByIndex{DS}
|
||||||
|
|
||||||
.csect NS_InvokeByIndex_P{DS}
|
.csect NS_InvokeByIndex{DS}
|
||||||
.long .NS_InvokeByIndex_P # "\0\0\0\0"
|
.long .NS_InvokeByIndex # "\0\0\0\0"
|
||||||
.long TOC{TC0} # "\0\0\0008"
|
.long TOC{TC0} # "\0\0\0008"
|
||||||
.long 0x00000000 # "\0\0\0\0"
|
.long 0x00000000 # "\0\0\0\0"
|
||||||
# End csect NS_InvokeByIndex_P{DS}
|
# End csect NS_InvokeByIndex{DS}
|
||||||
|
|
||||||
# .bss section
|
# .bss section
|
||||||
|
|
|
@ -21,15 +21,15 @@
|
||||||
|
|
||||||
.section ".text"
|
.section ".text"
|
||||||
.align 2
|
.align 2
|
||||||
.globl NS_InvokeByIndex_P
|
.globl NS_InvokeByIndex
|
||||||
.type NS_InvokeByIndex_P,@function
|
.type NS_InvokeByIndex,@function
|
||||||
|
|
||||||
//
|
//
|
||||||
// NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
// NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
// uint32_t paramCount, nsXPTCVariant* params)
|
// uint32_t paramCount, nsXPTCVariant* params)
|
||||||
//
|
//
|
||||||
|
|
||||||
NS_InvokeByIndex_P:
|
NS_InvokeByIndex:
|
||||||
stwu sp,-32(sp) // setup standard stack frame
|
stwu sp,-32(sp) // setup standard stack frame
|
||||||
mflr r0 // save LR
|
mflr r0 // save LR
|
||||||
stw r3,8(sp) // r3 <= that
|
stw r3,8(sp) // r3 <= that
|
||||||
|
|
|
@ -21,15 +21,15 @@
|
||||||
|
|
||||||
.section ".text"
|
.section ".text"
|
||||||
.align 2
|
.align 2
|
||||||
.globl NS_InvokeByIndex_P
|
.globl NS_InvokeByIndex
|
||||||
.type NS_InvokeByIndex_P,@function
|
.type NS_InvokeByIndex,@function
|
||||||
|
|
||||||
//
|
//
|
||||||
// NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
// NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
// uint32_t paramCount, nsXPTCVariant* params)
|
// uint32_t paramCount, nsXPTCVariant* params)
|
||||||
//
|
//
|
||||||
|
|
||||||
NS_InvokeByIndex_P:
|
NS_InvokeByIndex:
|
||||||
stwu sp,-32(sp) // setup standard stack frame
|
stwu sp,-32(sp) // setup standard stack frame
|
||||||
mflr r0 // save LR
|
mflr r0 // save LR
|
||||||
stw r3,8(sp) // r3 <= that
|
stw r3,8(sp) // r3 <= that
|
||||||
|
|
|
@ -14,12 +14,12 @@
|
||||||
.text
|
.text
|
||||||
.align 2
|
.align 2
|
||||||
#
|
#
|
||||||
# NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
# NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
# uint32_t paramCount, nsXPTCVariant* params)
|
# uint32_t paramCount, nsXPTCVariant* params)
|
||||||
#
|
#
|
||||||
|
|
||||||
.globl __NS_InvokeByIndex_P
|
.globl __NS_InvokeByIndex
|
||||||
__NS_InvokeByIndex_P:
|
__NS_InvokeByIndex:
|
||||||
mflr r0
|
mflr r0
|
||||||
stw r31,-4(r1)
|
stw r31,-4(r1)
|
||||||
#
|
#
|
||||||
|
|
|
@ -14,15 +14,15 @@
|
||||||
The SCD is available from http://www.sparc.com/.
|
The SCD is available from http://www.sparc.com/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.global NS_InvokeByIndex_P
|
.global NS_InvokeByIndex
|
||||||
.type NS_InvokeByIndex_P, #function
|
.type NS_InvokeByIndex, #function
|
||||||
|
|
||||||
/*
|
/*
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params);
|
uint32_t paramCount, nsXPTCVariant* params);
|
||||||
|
|
||||||
*/
|
*/
|
||||||
NS_InvokeByIndex_P:
|
NS_InvokeByIndex:
|
||||||
save %sp,-(128 + 64),%sp ! room for the register window and
|
save %sp,-(128 + 64),%sp ! room for the register window and
|
||||||
! struct pointer, rounded up to 0 % 64
|
! struct pointer, rounded up to 0 % 64
|
||||||
sll %i2,4,%l0 ! assume the worst case
|
sll %i2,4,%l0 ! assume the worst case
|
||||||
|
@ -83,4 +83,4 @@ NS_InvokeByIndex_P:
|
||||||
ret
|
ret
|
||||||
restore
|
restore
|
||||||
|
|
||||||
.size NS_InvokeByIndex_P, .-NS_InvokeByIndex
|
.size NS_InvokeByIndex, .-NS_InvokeByIndex
|
||||||
|
|
|
@ -8,13 +8,13 @@
|
||||||
* Platform specific code to invoke XPCOM methods on native objects for
|
* Platform specific code to invoke XPCOM methods on native objects for
|
||||||
* Linux/Sparc with gcc 3 ABI.
|
* Linux/Sparc with gcc 3 ABI.
|
||||||
*/
|
*/
|
||||||
.global NS_InvokeByIndex_P
|
.global NS_InvokeByIndex
|
||||||
/*
|
/*
|
||||||
* NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
* NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
* uint32_t paramCount, nsXPTCVariant* params);
|
* uint32_t paramCount, nsXPTCVariant* params);
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
NS_InvokeByIndex_P:
|
NS_InvokeByIndex:
|
||||||
save %sp,-(64 + 16),%sp ! room for the register window and
|
save %sp,-(64 + 16),%sp ! room for the register window and
|
||||||
! struct pointer, rounded up to 0 % 16
|
! struct pointer, rounded up to 0 % 16
|
||||||
mov %i2,%o0 ! paramCount
|
mov %i2,%o0 ! paramCount
|
||||||
|
|
|
@ -8,12 +8,12 @@
|
||||||
* Platform specific code to invoke XPCOM methods on native objects for
|
* Platform specific code to invoke XPCOM methods on native objects for
|
||||||
* solaris/sparc with gcc 3 ABI.
|
* solaris/sparc with gcc 3 ABI.
|
||||||
*/
|
*/
|
||||||
.global NS_InvokeByIndex_P
|
.global NS_InvokeByIndex
|
||||||
/*
|
/*
|
||||||
* NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
* NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
* uint32_t paramCount, nsXPTCVariant* params);
|
* uint32_t paramCount, nsXPTCVariant* params);
|
||||||
*/
|
*/
|
||||||
NS_InvokeByIndex_P:
|
NS_InvokeByIndex:
|
||||||
save %sp,-(64 + 32),%sp ! room for the register window and
|
save %sp,-(64 + 32),%sp ! room for the register window and
|
||||||
! struct pointer, rounded up to 0 % 32
|
! struct pointer, rounded up to 0 % 32
|
||||||
mov %i2,%o0 ! paramCount
|
mov %i2,%o0 ! paramCount
|
||||||
|
|
|
@ -6,14 +6,14 @@
|
||||||
|
|
||||||
/* Platform specific code to invoke XPCOM methods on native objects */
|
/* Platform specific code to invoke XPCOM methods on native objects */
|
||||||
|
|
||||||
.global NS_InvokeByIndex_P
|
.global NS_InvokeByIndex
|
||||||
.type NS_InvokeByIndex_P, #function
|
.type NS_InvokeByIndex, #function
|
||||||
/*
|
/*
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params);
|
uint32_t paramCount, nsXPTCVariant* params);
|
||||||
|
|
||||||
*/
|
*/
|
||||||
NS_InvokeByIndex_P:
|
NS_InvokeByIndex:
|
||||||
save %sp,-(64 + 32),%sp ! room for the register window and
|
save %sp,-(64 + 32),%sp ! room for the register window and
|
||||||
! struct pointer, rounded up to 0 % 32
|
! struct pointer, rounded up to 0 % 32
|
||||||
sll %i2,3,%l0 ! assume the worst case
|
sll %i2,3,%l0 ! assume the worst case
|
||||||
|
@ -53,4 +53,4 @@ NS_InvokeByIndex_P:
|
||||||
ret
|
ret
|
||||||
restore
|
restore
|
||||||
|
|
||||||
.size NS_InvokeByIndex_P, .-NS_InvokeByIndex_P
|
.size NS_InvokeByIndex, .-NS_InvokeByIndex
|
||||||
|
|
|
@ -14,15 +14,15 @@
|
||||||
The SCD is available from http://www.sparc.com/.
|
The SCD is available from http://www.sparc.com/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.global NS_InvokeByIndex_P
|
.global NS_InvokeByIndex
|
||||||
.type NS_InvokeByIndex_P, #function
|
.type NS_InvokeByIndex, #function
|
||||||
|
|
||||||
/*
|
/*
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params);
|
uint32_t paramCount, nsXPTCVariant* params);
|
||||||
|
|
||||||
*/
|
*/
|
||||||
NS_InvokeByIndex_P:
|
NS_InvokeByIndex:
|
||||||
save %sp,-(128 + 64),%sp ! room for the register window and
|
save %sp,-(128 + 64),%sp ! room for the register window and
|
||||||
! struct pointer, rounded up to 0 % 64
|
! struct pointer, rounded up to 0 % 64
|
||||||
sll %i2,4,%l0 ! assume the worst case
|
sll %i2,4,%l0 ! assume the worst case
|
||||||
|
@ -82,4 +82,4 @@ NS_InvokeByIndex_P:
|
||||||
ret
|
ret
|
||||||
restore
|
restore
|
||||||
|
|
||||||
.size NS_InvokeByIndex_P, .-NS_InvokeByIndex_P
|
.size NS_InvokeByIndex, .-NS_InvokeByIndex
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
.globl NS_InvokeByIndex_P
|
.globl NS_InvokeByIndex
|
||||||
.type NS_InvokeByIndex_P, @function
|
.type NS_InvokeByIndex, @function
|
||||||
NS_InvokeByIndex_P:
|
NS_InvokeByIndex:
|
||||||
push %ebp
|
push %ebp
|
||||||
movl %esp,%ebp
|
movl %esp,%ebp
|
||||||
push %ebx
|
push %ebx
|
||||||
|
@ -51,5 +51,5 @@ NS_InvokeByIndex_P:
|
||||||
movl %ebp,%esp
|
movl %ebp,%esp
|
||||||
pop %ebp
|
pop %ebp
|
||||||
ret
|
ret
|
||||||
.size NS_InvokeByIndex_P, . - NS_InvokeByIndex_P
|
.size NS_InvokeByIndex, . - NS_InvokeByIndex
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ invoke_copy_to_stack(uint32_t paramCount, nsXPTCVariant* s, uint32_t* d)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params);
|
uint32_t paramCount, nsXPTCVariant* params);
|
||||||
|
|
||||||
Each param takes at most two 4-byte words.
|
Each param takes at most two 4-byte words.
|
||||||
|
@ -52,11 +52,11 @@ __asm__ (
|
||||||
/* alignment here seems unimportant here; this was 16, now it's 2 which
|
/* alignment here seems unimportant here; this was 16, now it's 2 which
|
||||||
is what xptcstubs uses. */
|
is what xptcstubs uses. */
|
||||||
".align 2\n\t"
|
".align 2\n\t"
|
||||||
".globl " SYMBOL_UNDERSCORE "NS_InvokeByIndex_P\n\t"
|
".globl " SYMBOL_UNDERSCORE "NS_InvokeByIndex\n\t"
|
||||||
#ifndef XP_MACOSX
|
#ifndef XP_MACOSX
|
||||||
".type " SYMBOL_UNDERSCORE "NS_InvokeByIndex_P,@function\n"
|
".type " SYMBOL_UNDERSCORE "NS_InvokeByIndex,@function\n"
|
||||||
#endif
|
#endif
|
||||||
SYMBOL_UNDERSCORE "NS_InvokeByIndex_P:\n\t"
|
SYMBOL_UNDERSCORE "NS_InvokeByIndex:\n\t"
|
||||||
"pushl %ebp\n\t"
|
"pushl %ebp\n\t"
|
||||||
"movl %esp, %ebp\n\t"
|
"movl %esp, %ebp\n\t"
|
||||||
"movl 0x10(%ebp), %eax\n\t"
|
"movl 0x10(%ebp), %eax\n\t"
|
||||||
|
@ -92,6 +92,6 @@ __asm__ (
|
||||||
"popl %ebp\n\t"
|
"popl %ebp\n\t"
|
||||||
"ret\n"
|
"ret\n"
|
||||||
#ifndef XP_MACOSX
|
#ifndef XP_MACOSX
|
||||||
".size " SYMBOL_UNDERSCORE "NS_InvokeByIndex_P, . -" SYMBOL_UNDERSCORE "NS_InvokeByIndex_P\n\t"
|
".size " SYMBOL_UNDERSCORE "NS_InvokeByIndex, . -" SYMBOL_UNDERSCORE "NS_InvokeByIndex\n\t"
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
|
|
@ -61,20 +61,20 @@ invoke_copy_to_stack(uint64_t* d, uint32_t paramCount, nsXPTCVariant* s)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* EXPORT_XPCOM_API(nsresult)
|
* EXPORT_XPCOM_API(nsresult)
|
||||||
* NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
* NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
* uint32_t paramCount, nsXPTCVariant* params)
|
* uint32_t paramCount, nsXPTCVariant* params)
|
||||||
*/
|
*/
|
||||||
__asm__(
|
__asm__(
|
||||||
"#### NS_InvokeByIndex_P ####\n"
|
"#### NS_InvokeByIndex ####\n"
|
||||||
".text\n\t"
|
".text\n\t"
|
||||||
".align 5\n\t"
|
".align 5\n\t"
|
||||||
".globl NS_InvokeByIndex_P\n\t"
|
".globl NS_InvokeByIndex\n\t"
|
||||||
".ent NS_InvokeByIndex_P\n"
|
".ent NS_InvokeByIndex\n"
|
||||||
"NS_InvokeByIndex_P:\n\t"
|
"NS_InvokeByIndex:\n\t"
|
||||||
".frame $15,32,$26,0\n\t"
|
".frame $15,32,$26,0\n\t"
|
||||||
".mask 0x4008000,-32\n\t"
|
".mask 0x4008000,-32\n\t"
|
||||||
"ldgp $29,0($27)\n"
|
"ldgp $29,0($27)\n"
|
||||||
"$NS_InvokeByIndex_P..ng:\n\t"
|
"$NS_InvokeByIndex..ng:\n\t"
|
||||||
"subq $30,32,$30\n\t"
|
"subq $30,32,$30\n\t"
|
||||||
"stq $26,0($30)\n\t"
|
"stq $26,0($30)\n\t"
|
||||||
"stq $15,8($30)\n\t"
|
"stq $15,8($30)\n\t"
|
||||||
|
@ -140,5 +140,5 @@ __asm__(
|
||||||
"ldq $15,8($30)\n\t"
|
"ldq $15,8($30)\n\t"
|
||||||
"addq $30,32,$30\n\t"
|
"addq $30,32,$30\n\t"
|
||||||
"ret $31,($26),1\n\t"
|
"ret $31,($26),1\n\t"
|
||||||
".end NS_InvokeByIndex_P"
|
".end NS_InvokeByIndex"
|
||||||
);
|
);
|
||||||
|
|
|
@ -97,7 +97,7 @@ extern "C" {
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params)
|
uint32_t paramCount, nsXPTCVariant* params)
|
||||||
{
|
{
|
||||||
uint32_t result, n;
|
uint32_t result, n;
|
||||||
|
|
|
@ -87,13 +87,13 @@ invoke_copy_to_stack(uint32_t* d, uint32_t paramCount,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" nsresult _NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
extern "C" nsresult _NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount,
|
uint32_t paramCount,
|
||||||
nsXPTCVariant* params);
|
nsXPTCVariant* params);
|
||||||
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params)
|
uint32_t paramCount, nsXPTCVariant* params)
|
||||||
{
|
{
|
||||||
return _NS_InvokeByIndex_P(that, methodIndex, paramCount, params);
|
return _NS_InvokeByIndex(that, methodIndex, paramCount, params);
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,13 +128,13 @@ invoke_copy_to_stack(uint64_t* d, uint32_t paramCount,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" nsresult _NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
extern "C" nsresult _NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount,
|
uint32_t paramCount,
|
||||||
nsXPTCVariant* params);
|
nsXPTCVariant* params);
|
||||||
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params)
|
uint32_t paramCount, nsXPTCVariant* params)
|
||||||
{
|
{
|
||||||
return _NS_InvokeByIndex_P(that, methodIndex, paramCount, params);
|
return _NS_InvokeByIndex(that, methodIndex, paramCount, params);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
|
|
||||||
// Platform specific code to invoke XPCOM methods on native objects
|
// Platform specific code to invoke XPCOM methods on native objects
|
||||||
|
|
||||||
// The purpose of NS_InvokeByIndex_P() is to map a platform
|
// The purpose of NS_InvokeByIndex() is to map a platform
|
||||||
// independent call to the platform ABI. To do that,
|
// independent call to the platform ABI. To do that,
|
||||||
// NS_InvokeByIndex_P() has to determine the method to call via vtable
|
// NS_InvokeByIndex() has to determine the method to call via vtable
|
||||||
// access. The parameters for the method are read from the
|
// access. The parameters for the method are read from the
|
||||||
// nsXPTCVariant* and prepared for the native ABI.
|
// nsXPTCVariant* and prepared for the native ABI.
|
||||||
|
|
||||||
|
@ -90,6 +90,6 @@ invoke_copy_to_stack(uint64_t* gpregs,
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params);
|
uint32_t paramCount, nsXPTCVariant* params);
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
|
|
||||||
// Platform specific code to invoke XPCOM methods on native objects
|
// Platform specific code to invoke XPCOM methods on native objects
|
||||||
|
|
||||||
// The purpose of NS_InvokeByIndex_P() is to map a platform
|
// The purpose of NS_InvokeByIndex() is to map a platform
|
||||||
// indepenpent call to the platform ABI. To do that,
|
// indepenpent call to the platform ABI. To do that,
|
||||||
// NS_InvokeByIndex_P() has to determine the method to call via vtable
|
// NS_InvokeByIndex() has to determine the method to call via vtable
|
||||||
// access. The parameters for the method are read from the
|
// access. The parameters for the method are read from the
|
||||||
// nsXPTCVariant* and prepared for th native ABI. For the Linux/PPC
|
// nsXPTCVariant* and prepared for th native ABI. For the Linux/PPC
|
||||||
// ABI this means that the first 8 integral and floating point
|
// ABI this means that the first 8 integral and floating point
|
||||||
|
@ -120,5 +120,5 @@ invoke_copy_to_stack(uint32_t* d,
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params);
|
uint32_t paramCount, nsXPTCVariant* params);
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
|
|
||||||
// Platform specific code to invoke XPCOM methods on native objects
|
// Platform specific code to invoke XPCOM methods on native objects
|
||||||
|
|
||||||
// The purpose of NS_InvokeByIndex_P() is to map a platform
|
// The purpose of NS_InvokeByIndex() is to map a platform
|
||||||
// indepenpent call to the platform ABI. To do that,
|
// indepenpent call to the platform ABI. To do that,
|
||||||
// NS_InvokeByIndex_P() has to determine the method to call via vtable
|
// NS_InvokeByIndex() has to determine the method to call via vtable
|
||||||
// access. The parameters for the method are read from the
|
// access. The parameters for the method are read from the
|
||||||
// nsXPTCVariant* and prepared for th native ABI. For the Linux/PPC
|
// nsXPTCVariant* and prepared for th native ABI. For the Linux/PPC
|
||||||
// ABI this means that the first 8 integral and floating point
|
// ABI this means that the first 8 integral and floating point
|
||||||
|
@ -102,5 +102,5 @@ invoke_copy_to_stack(uint32_t* d,
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params);
|
uint32_t paramCount, nsXPTCVariant* params);
|
||||||
|
|
|
@ -101,13 +101,13 @@ invoke_copy_to_stack(uint32_t* d, uint32_t paramCount, nsXPTCVariant* s, double
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" nsresult _NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
extern "C" nsresult _NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount,
|
uint32_t paramCount,
|
||||||
nsXPTCVariant* params);
|
nsXPTCVariant* params);
|
||||||
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params)
|
uint32_t paramCount, nsXPTCVariant* params)
|
||||||
{
|
{
|
||||||
return _NS_InvokeByIndex_P(that, methodIndex, paramCount, params);
|
return _NS_InvokeByIndex(that, methodIndex, paramCount, params);
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,7 @@ invoke_copy_to_stack(uint64_t * d, uint32_t paramCount, nsXPTCVariant * s,
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports * that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports * that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant * params)
|
uint32_t paramCount, nsXPTCVariant * params)
|
||||||
{
|
{
|
||||||
uint32_t nr_gpr, nr_fpr, nr_stack;
|
uint32_t nr_gpr, nr_fpr, nr_stack;
|
||||||
|
|
|
@ -102,7 +102,7 @@ invoke_copy_to_stack(uint64_t * d, uint32_t paramCount, nsXPTCVariant * s,
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports * that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports * that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant * params)
|
uint32_t paramCount, nsXPTCVariant * params)
|
||||||
{
|
{
|
||||||
uint32_t nr_stack;
|
uint32_t nr_stack;
|
||||||
|
|
|
@ -49,7 +49,7 @@ invoke_copy_to_stack(uint32_t* d, uint32_t paramCount, nsXPTCVariant* s)
|
||||||
// a custom FPO program.
|
// a custom FPO program.
|
||||||
#pragma optimize( "y", off )
|
#pragma optimize( "y", off )
|
||||||
extern "C" NS_EXPORT nsresult NS_FROZENCALL
|
extern "C" NS_EXPORT nsresult NS_FROZENCALL
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params)
|
uint32_t paramCount, nsXPTCVariant* params)
|
||||||
{
|
{
|
||||||
__asm {
|
__asm {
|
||||||
|
|
|
@ -51,7 +51,7 @@ XPTC__InvokebyIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params)
|
uint32_t paramCount, nsXPTCVariant* params)
|
||||||
{
|
{
|
||||||
return XPTC__InvokebyIndex(that, methodIndex, paramCount, params);
|
return XPTC__InvokebyIndex(that, methodIndex, paramCount, params);
|
||||||
|
|
|
@ -45,7 +45,7 @@ invoke_copy_to_stack(uint32_t paramCount, nsXPTCVariant* s, uint32_t* d)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
EXPORT_XPCOM_API(nsresult)
|
EXPORT_XPCOM_API(nsresult)
|
||||||
NS_InvokeByIndex_P(nsISupports* that, uint32_t methodIndex,
|
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||||
uint32_t paramCount, nsXPTCVariant* params);
|
uint32_t paramCount, nsXPTCVariant* params);
|
||||||
|
|
||||||
Each param takes at most two 4-byte words.
|
Each param takes at most two 4-byte words.
|
||||||
|
@ -64,8 +64,8 @@ __asm__ (
|
||||||
/* alignment here seems unimportant here; this was 16, now it's 2 which
|
/* alignment here seems unimportant here; this was 16, now it's 2 which
|
||||||
is what xptcstubs uses. */
|
is what xptcstubs uses. */
|
||||||
".align 2\n\t"
|
".align 2\n\t"
|
||||||
".globl _NS_InvokeByIndex_P\n\t"
|
".globl _NS_InvokeByIndex\n\t"
|
||||||
"_NS_InvokeByIndex_P:\n\t"
|
"_NS_InvokeByIndex:\n\t"
|
||||||
"pushl %ebp\n\t"
|
"pushl %ebp\n\t"
|
||||||
"movl %esp, %ebp\n\t"
|
"movl %esp, %ebp\n\t"
|
||||||
"movl 0x10(%ebp), %eax\n\t"
|
"movl 0x10(%ebp), %eax\n\t"
|
||||||
|
@ -101,6 +101,6 @@ __asm__ (
|
||||||
"popl %ebp\n\t"
|
"popl %ebp\n\t"
|
||||||
"ret\n"
|
"ret\n"
|
||||||
".section .drectve\n\t"
|
".section .drectve\n\t"
|
||||||
".ascii \" -export:NS_InvokeByIndex_P\"\n\t"
|
".ascii \" -export:NS_InvokeByIndex\"\n\t"
|
||||||
".text\n\t"
|
".text\n\t"
|
||||||
);
|
);
|
||||||
|
|
|
@ -18,34 +18,6 @@
|
||||||
* dependency on the implementation details of the abstract string types.
|
* dependency on the implementation details of the abstract string types.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Map frozen functions to private symbol names if not using strict API.
|
|
||||||
#ifdef MOZILLA_INTERNAL_API
|
|
||||||
# define NS_StringContainerInit NS_StringContainerInit_P
|
|
||||||
# define NS_StringContainerInit2 NS_StringContainerInit2_P
|
|
||||||
# define NS_StringContainerFinish NS_StringContainerFinish_P
|
|
||||||
# define NS_StringGetData NS_StringGetData_P
|
|
||||||
# define NS_StringGetMutableData NS_StringGetMutableData_P
|
|
||||||
# define NS_StringCloneData NS_StringCloneData_P
|
|
||||||
# define NS_StringSetData NS_StringSetData_P
|
|
||||||
# define NS_StringSetDataRange NS_StringSetDataRange_P
|
|
||||||
# define NS_StringCopy NS_StringCopy_P
|
|
||||||
# define NS_StringSetIsVoid NS_StringSetIsVoid_P
|
|
||||||
# define NS_StringGetIsVoid NS_StringGetIsVoid_P
|
|
||||||
# define NS_CStringContainerInit NS_CStringContainerInit_P
|
|
||||||
# define NS_CStringContainerInit2 NS_CStringContainerInit2_P
|
|
||||||
# define NS_CStringContainerFinish NS_CStringContainerFinish_P
|
|
||||||
# define NS_CStringGetData NS_CStringGetData_P
|
|
||||||
# define NS_CStringGetMutableData NS_CStringGetMutableData_P
|
|
||||||
# define NS_CStringCloneData NS_CStringCloneData_P
|
|
||||||
# define NS_CStringSetData NS_CStringSetData_P
|
|
||||||
# define NS_CStringSetDataRange NS_CStringSetDataRange_P
|
|
||||||
# define NS_CStringCopy NS_CStringCopy_P
|
|
||||||
# define NS_CStringSetIsVoid NS_CStringSetIsVoid_P
|
|
||||||
# define NS_CStringGetIsVoid NS_CStringGetIsVoid_P
|
|
||||||
# define NS_CStringToUTF16 NS_CStringToUTF16_P
|
|
||||||
# define NS_UTF16ToCString NS_UTF16ToCString_P
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "nscore.h"
|
#include "nscore.h"
|
||||||
|
|
||||||
/* The base string types */
|
/* The base string types */
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
# vim:set ts=8 sw=8 sts=8 noet:
|
|
||||||
# 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/.
|
|
||||||
|
|
||||||
DEPTH = @DEPTH@
|
|
||||||
topsrcdir = @top_srcdir@
|
|
||||||
srcdir = @srcdir@
|
|
||||||
VPATH = @srcdir@
|
|
||||||
|
|
||||||
include $(DEPTH)/config/autoconf.mk
|
|
||||||
|
|
||||||
LIBRARY_NAME = xpcom
|
|
||||||
|
|
||||||
# The XPCOM glue uses realpath() on libxpcom.so to resolve any symlinks. We
|
|
||||||
# want it to find dist/bin and not xpcom/stub so we copy instead of symlinking.
|
|
||||||
NSDISTMODE = copy
|
|
||||||
|
|
||||||
# Do not set EXPORT_LIBRARY as we do not want xpcom in the static libs list
|
|
||||||
#EXPORT_LIBRARY = 1
|
|
||||||
MOZILLA_INTERNAL_API = 1
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL_INCLUDES = -I$(srcdir)/../build
|
|
||||||
|
|
||||||
CPPSRCS = nsXPComStub.cpp
|
|
||||||
|
|
||||||
# If we have an import library, then copy that to the SDK. Otherwise,
|
|
||||||
# copy the shared library.
|
|
||||||
ifneq (,$(filter OS2 WINNT,$(OS_ARCH)))
|
|
||||||
SDK_LIBRARY = $(IMPORT_LIBRARY)
|
|
||||||
else
|
|
||||||
SDK_LIBRARY = $(SHARED_LIBRARY)
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
FORCE_SHARED_LIB = 1
|
|
||||||
|
|
||||||
EXTRA_DSO_LDOPTS = $(LIBS_DIR)
|
|
||||||
|
|
||||||
ifeq (bundle,$(MOZ_FS_LAYOUT))
|
|
||||||
EXTRA_DSO_LDOPTS += $(DIST)/bin/XUL
|
|
||||||
else
|
|
||||||
EXTRA_DSO_LIBS = xul
|
|
||||||
endif
|
|
||||||
|
|
||||||
EXTRA_DSO_LDOPTS += \
|
|
||||||
$(EXTRA_DSO_LIBS) \
|
|
||||||
$(NSPR_LIBS) \
|
|
||||||
$(MOZALLOC_LIB) \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
include $(topsrcdir)/config/rules.mk
|
|
||||||
|
|
||||||
libs:: $(FINAL_TARGET)/dependentlibs.list
|
|
||||||
|
|
||||||
$(FINAL_TARGET)/dependentlibs.list: dependentlibs.py $(SHARED_LIBRARY) $(wildcard $(if $(wildcard $(FINAL_TARGET)/dependentlibs.list),$(addprefix $(FINAL_TARGET)/,$(shell cat $(FINAL_TARGET)/dependentlibs.list))))
|
|
||||||
$(PYTHON) $< $(SHARED_LIBRARY) -L $(FINAL_TARGET) $(if $(TOOLCHAIN_PREFIX),$(addprefix -p ,$(TOOLCHAIN_PREFIX))) > $@
|
|
|
@ -1,7 +0,0 @@
|
||||||
# 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/.
|
|
||||||
|
|
||||||
MODULE = 'xpcom'
|
|
||||||
|
|
|
@ -1,514 +0,0 @@
|
||||||
/* 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 exitRoutine, uint32_t priority);
|
|
||||||
|
|
||||||
XPCOM_API(nsresult)
|
|
||||||
NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine);
|
|
||||||
|
|
||||||
static const XPCOMFunctions kFrozenFunctions = {
|
|
||||||
XPCOM_GLUE_VERSION,
|
|
||||||
sizeof(XPCOMFunctions),
|
|
||||||
&NS_InitXPCOM2_P,
|
|
||||||
&NS_ShutdownXPCOM_P,
|
|
||||||
&NS_GetServiceManager_P,
|
|
||||||
&NS_GetComponentManager_P,
|
|
||||||
&NS_GetComponentRegistrar_P,
|
|
||||||
&NS_GetMemoryManager_P,
|
|
||||||
&NS_NewLocalFile_P,
|
|
||||||
&NS_NewNativeLocalFile_P,
|
|
||||||
&NS_RegisterXPCOMExitRoutine,
|
|
||||||
&NS_UnregisterXPCOMExitRoutine,
|
|
||||||
|
|
||||||
// these functions were added post 1.4
|
|
||||||
&NS_GetDebug_P,
|
|
||||||
&NS_GetTraceRefcnt_P,
|
|
||||||
|
|
||||||
// these functions were added post 1.6
|
|
||||||
&NS_StringContainerInit_P,
|
|
||||||
&NS_StringContainerFinish_P,
|
|
||||||
&NS_StringGetData_P,
|
|
||||||
&NS_StringSetData_P,
|
|
||||||
&NS_StringSetDataRange_P,
|
|
||||||
&NS_StringCopy_P,
|
|
||||||
&NS_CStringContainerInit_P,
|
|
||||||
&NS_CStringContainerFinish_P,
|
|
||||||
&NS_CStringGetData_P,
|
|
||||||
&NS_CStringSetData_P,
|
|
||||||
&NS_CStringSetDataRange_P,
|
|
||||||
&NS_CStringCopy_P,
|
|
||||||
&NS_CStringToUTF16_P,
|
|
||||||
&NS_UTF16ToCString_P,
|
|
||||||
&NS_StringCloneData_P,
|
|
||||||
&NS_CStringCloneData_P,
|
|
||||||
|
|
||||||
// these functions were added post 1.7 (post Firefox 1.0)
|
|
||||||
&NS_Alloc_P,
|
|
||||||
&NS_Realloc_P,
|
|
||||||
&NS_Free_P,
|
|
||||||
&NS_StringContainerInit2_P,
|
|
||||||
&NS_CStringContainerInit2_P,
|
|
||||||
&NS_StringGetMutableData_P,
|
|
||||||
&NS_CStringGetMutableData_P,
|
|
||||||
NULL,
|
|
||||||
|
|
||||||
// these functions were added post 1.8
|
|
||||||
&NS_DebugBreak_P,
|
|
||||||
&NS_LogInit_P,
|
|
||||||
&NS_LogTerm_P,
|
|
||||||
&NS_LogAddRef_P,
|
|
||||||
&NS_LogRelease_P,
|
|
||||||
&NS_LogCtor_P,
|
|
||||||
&NS_LogDtor_P,
|
|
||||||
&NS_LogCOMPtrAddRef_P,
|
|
||||||
&NS_LogCOMPtrRelease_P,
|
|
||||||
&NS_GetXPTCallStub_P,
|
|
||||||
&NS_DestroyXPTCallStub_P,
|
|
||||||
&NS_InvokeByIndex_P,
|
|
||||||
nullptr,
|
|
||||||
nullptr,
|
|
||||||
&NS_StringSetIsVoid_P,
|
|
||||||
&NS_StringGetIsVoid_P,
|
|
||||||
&NS_CStringSetIsVoid_P,
|
|
||||||
&NS_CStringGetIsVoid_P,
|
|
||||||
|
|
||||||
// these functions were added post 1.9
|
|
||||||
&NS_CycleCollectorSuspect2_P,
|
|
||||||
&NS_CycleCollectorForget2_P
|
|
||||||
};
|
|
||||||
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_GetFrozenFunctions(XPCOMFunctions *functions, const char* /* libraryPath */)
|
|
||||||
{
|
|
||||||
if (!functions)
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
|
|
||||||
if (functions->version != XPCOM_GLUE_VERSION)
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
|
|
||||||
uint32_t size = functions->size;
|
|
||||||
if (size > sizeof(XPCOMFunctions))
|
|
||||||
size = sizeof(XPCOMFunctions);
|
|
||||||
|
|
||||||
size -= offsetof(XPCOMFunctions, init);
|
|
||||||
|
|
||||||
memcpy(&functions->init, &kFrozenFunctions.init, size);
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Stubs for nsXPCOM.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef NS_InitXPCOM2
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_InitXPCOM2(nsIServiceManager **result,
|
|
||||||
nsIFile *binDirectory,
|
|
||||||
nsIDirectoryServiceProvider *dirProvider)
|
|
||||||
{
|
|
||||||
return NS_InitXPCOM2_P(result, binDirectory, dirProvider);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_ShutdownXPCOM
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_ShutdownXPCOM(nsIServiceManager *svcMgr)
|
|
||||||
{
|
|
||||||
return NS_ShutdownXPCOM_P(svcMgr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_GetServiceManager
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_GetServiceManager(nsIServiceManager* *result)
|
|
||||||
{
|
|
||||||
return NS_GetServiceManager_P(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_GetComponentManager
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_GetComponentManager(nsIComponentManager* *result)
|
|
||||||
{
|
|
||||||
return NS_GetComponentManager_P(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_GetComponentRegistrar
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_GetComponentRegistrar(nsIComponentRegistrar** result)
|
|
||||||
{
|
|
||||||
return NS_GetComponentRegistrar_P(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_GetMemoryManager
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_GetMemoryManager(nsIMemory* *result)
|
|
||||||
{
|
|
||||||
return NS_GetMemoryManager_P(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_NewLocalFile
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_NewLocalFile(const nsAString &path,
|
|
||||||
bool followLinks,
|
|
||||||
nsIFile **result)
|
|
||||||
{
|
|
||||||
return NS_NewLocalFile_P(path, followLinks, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_NewNativeLocalFile
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_NewNativeLocalFile(const nsACString &path,
|
|
||||||
bool followLinks,
|
|
||||||
nsIFile **result)
|
|
||||||
{
|
|
||||||
return NS_NewNativeLocalFile_P(path, followLinks, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_GetDebug
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_GetDebug(nsIDebug **result)
|
|
||||||
{
|
|
||||||
return NS_GetDebug_P(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_GetTraceRefcnt
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_GetTraceRefcnt(nsITraceRefcnt **result)
|
|
||||||
{
|
|
||||||
return NS_GetTraceRefcnt_P(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_Alloc
|
|
||||||
EXPORT_XPCOM_API(void*)
|
|
||||||
NS_Alloc(size_t size)
|
|
||||||
{
|
|
||||||
return NS_Alloc_P(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_Realloc
|
|
||||||
EXPORT_XPCOM_API(void*)
|
|
||||||
NS_Realloc(void* ptr, size_t size)
|
|
||||||
{
|
|
||||||
return NS_Realloc_P(ptr, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_Free
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_Free(void* ptr)
|
|
||||||
{
|
|
||||||
NS_Free_P(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_DebugBreak
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_DebugBreak(uint32_t aSeverity, const char *aStr, const char *aExpr,
|
|
||||||
const char *aFile, int32_t aLine)
|
|
||||||
{
|
|
||||||
NS_DebugBreak_P(aSeverity, aStr, aExpr, aFile, aLine);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_LogInit
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_LogInit()
|
|
||||||
{
|
|
||||||
NS_LogInit_P();
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_LogTerm
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_LogTerm()
|
|
||||||
{
|
|
||||||
NS_LogTerm_P();
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_LogAddRef
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_LogAddRef(void* aPtr, nsrefcnt aNewRefCnt,
|
|
||||||
const char *aTypeName, uint32_t aInstanceSize)
|
|
||||||
{
|
|
||||||
NS_LogAddRef_P(aPtr, aNewRefCnt, aTypeName, aInstanceSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_LogRelease
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_LogRelease(void* aPtr, nsrefcnt aNewRefCnt, const char *aTypeName)
|
|
||||||
{
|
|
||||||
NS_LogRelease_P(aPtr, aNewRefCnt, aTypeName);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_LogCtor
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_LogCtor(void *aPtr, const char *aTypeName, uint32_t aInstanceSize)
|
|
||||||
{
|
|
||||||
NS_LogCtor_P(aPtr, aTypeName, aInstanceSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_LogDtor
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_LogDtor(void *aPtr, const char *aTypeName, uint32_t aInstanceSize)
|
|
||||||
{
|
|
||||||
NS_LogDtor_P(aPtr, aTypeName, aInstanceSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_LogCOMPtrAddRef
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_LogCOMPtrAddRef(void *aCOMPtr, nsISupports* aObject)
|
|
||||||
{
|
|
||||||
NS_LogCOMPtrAddRef_P(aCOMPtr, aObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_LogCOMPtrRelease
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_LogCOMPtrRelease(void *aCOMPtr, nsISupports* aObject)
|
|
||||||
{
|
|
||||||
NS_LogCOMPtrRelease_P(aCOMPtr, aObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_GetXPTCallStub
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_GetXPTCallStub(REFNSIID aIID, nsIXPTCProxy* aOuter,
|
|
||||||
nsISomeInterface* *aStub)
|
|
||||||
{
|
|
||||||
return NS_GetXPTCallStub_P(aIID, aOuter, aStub);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_DestroyXPTCallStub
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_DestroyXPTCallStub(nsISomeInterface* aStub)
|
|
||||||
{
|
|
||||||
NS_DestroyXPTCallStub_P(aStub);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_InvokeByIndex
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
|
||||||
uint32_t paramCount, nsXPTCVariant* params)
|
|
||||||
{
|
|
||||||
return NS_InvokeByIndex_P(that, methodIndex, paramCount, params);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Stubs for nsXPCOMPrivate.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_RegisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine, uint32_t priority)
|
|
||||||
{
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine)
|
|
||||||
{
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Stubs for nsStringAPI.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef NS_StringContainerInit
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_StringContainerInit(nsStringContainer &aStr)
|
|
||||||
{
|
|
||||||
return NS_StringContainerInit_P(aStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_StringContainerInit2
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_StringContainerInit2(nsStringContainer &aStr,
|
|
||||||
const PRUnichar *aData,
|
|
||||||
uint32_t aDataLength,
|
|
||||||
uint32_t aFlags)
|
|
||||||
{
|
|
||||||
return NS_StringContainerInit2_P(aStr, aData, aDataLength, aFlags);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_StringContainerFinish
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_StringContainerFinish(nsStringContainer &aStr)
|
|
||||||
{
|
|
||||||
NS_StringContainerFinish_P(aStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_StringGetData
|
|
||||||
EXPORT_XPCOM_API(uint32_t)
|
|
||||||
NS_StringGetData(const nsAString &aStr, const PRUnichar **aBuf, bool *aTerm)
|
|
||||||
{
|
|
||||||
return NS_StringGetData_P(aStr, aBuf, aTerm);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_StringGetMutableData
|
|
||||||
EXPORT_XPCOM_API(uint32_t)
|
|
||||||
NS_StringGetMutableData(nsAString &aStr, uint32_t aLen, PRUnichar **aBuf)
|
|
||||||
{
|
|
||||||
return NS_StringGetMutableData_P(aStr, aLen, aBuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_StringCloneData
|
|
||||||
EXPORT_XPCOM_API(PRUnichar *)
|
|
||||||
NS_StringCloneData(const nsAString &aStr)
|
|
||||||
{
|
|
||||||
return NS_StringCloneData_P(aStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_StringSetData
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_StringSetData(nsAString &aStr, const PRUnichar *aBuf, uint32_t aCount)
|
|
||||||
{
|
|
||||||
return NS_StringSetData_P(aStr, aBuf, aCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_StringSetDataRange
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_StringSetDataRange(nsAString &aStr, uint32_t aCutStart, uint32_t aCutLength,
|
|
||||||
const PRUnichar *aBuf, uint32_t aCount)
|
|
||||||
{
|
|
||||||
return NS_StringSetDataRange_P(aStr, aCutStart, aCutLength, aBuf, aCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_StringCopy
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_StringCopy(nsAString &aDest, const nsAString &aSrc)
|
|
||||||
{
|
|
||||||
return NS_StringCopy_P(aDest, aSrc);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_StringSetIsVoid
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_StringSetIsVoid(nsAString &aStr, const bool aIsVoid)
|
|
||||||
{
|
|
||||||
NS_StringSetIsVoid_P(aStr, aIsVoid);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_StringGetIsVoid
|
|
||||||
EXPORT_XPCOM_API(bool)
|
|
||||||
NS_StringGetIsVoid(const nsAString &aStr)
|
|
||||||
{
|
|
||||||
return NS_StringGetIsVoid_P(aStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CStringContainerInit
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_CStringContainerInit(nsCStringContainer &aStr)
|
|
||||||
{
|
|
||||||
return NS_CStringContainerInit_P(aStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CStringContainerInit2
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_CStringContainerInit2(nsCStringContainer &aStr,
|
|
||||||
const char *aData,
|
|
||||||
uint32_t aDataLength,
|
|
||||||
uint32_t aFlags)
|
|
||||||
{
|
|
||||||
return NS_CStringContainerInit2_P(aStr, aData, aDataLength, aFlags);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CStringContainerFinish
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_CStringContainerFinish(nsCStringContainer &aStr)
|
|
||||||
{
|
|
||||||
NS_CStringContainerFinish_P(aStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CStringGetData
|
|
||||||
EXPORT_XPCOM_API(uint32_t)
|
|
||||||
NS_CStringGetData(const nsACString &aStr, const char **aBuf, bool *aTerm)
|
|
||||||
{
|
|
||||||
return NS_CStringGetData_P(aStr, aBuf, aTerm);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CStringGetMutableData
|
|
||||||
EXPORT_XPCOM_API(uint32_t)
|
|
||||||
NS_CStringGetMutableData(nsACString &aStr, uint32_t aLen, char **aBuf)
|
|
||||||
{
|
|
||||||
return NS_CStringGetMutableData_P(aStr, aLen, aBuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CStringCloneData
|
|
||||||
EXPORT_XPCOM_API(char *)
|
|
||||||
NS_CStringCloneData(const nsACString &aStr)
|
|
||||||
{
|
|
||||||
return NS_CStringCloneData_P(aStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CStringSetData
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_CStringSetData(nsACString &aStr, const char *aBuf, uint32_t aCount)
|
|
||||||
{
|
|
||||||
return NS_CStringSetData_P(aStr, aBuf, aCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CStringSetDataRange
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_CStringSetDataRange(nsACString &aStr, uint32_t aCutStart, uint32_t aCutLength,
|
|
||||||
const char *aBuf, uint32_t aCount)
|
|
||||||
{
|
|
||||||
return NS_CStringSetDataRange_P(aStr, aCutStart, aCutLength, aBuf, aCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CStringCopy
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_CStringCopy(nsACString &aDest, const nsACString &aSrc)
|
|
||||||
{
|
|
||||||
return NS_CStringCopy_P(aDest, aSrc);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CStringSetIsVoid
|
|
||||||
EXPORT_XPCOM_API(void)
|
|
||||||
NS_CStringSetIsVoid(nsACString &aStr, const bool aIsVoid)
|
|
||||||
{
|
|
||||||
NS_CStringSetIsVoid_P(aStr, aIsVoid);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CStringGetIsVoid
|
|
||||||
EXPORT_XPCOM_API(bool)
|
|
||||||
NS_CStringGetIsVoid(const nsACString &aStr)
|
|
||||||
{
|
|
||||||
return NS_CStringGetIsVoid_P(aStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CStringToUTF16
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_CStringToUTF16(const nsACString &aSrc, nsCStringEncoding aSrcEncoding, nsAString &aDest)
|
|
||||||
{
|
|
||||||
return NS_CStringToUTF16_P(aSrc, aSrcEncoding, aDest);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_UTF16ToCString
|
|
||||||
EXPORT_XPCOM_API(nsresult)
|
|
||||||
NS_UTF16ToCString(const nsAString &aSrc, nsCStringEncoding aDestEncoding, nsACString &aDest)
|
|
||||||
{
|
|
||||||
return NS_UTF16ToCString_P(aSrc, aDestEncoding, aDest);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CycleCollectorSuspect2
|
|
||||||
EXPORT_XPCOM_API(nsPurpleBufferEntry*)
|
|
||||||
NS_CycleCollectorSuspect2(void *obj, nsCycleCollectionParticipant *p)
|
|
||||||
{
|
|
||||||
return NS_CycleCollectorSuspect2_P(obj, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef NS_CycleCollectorForget2
|
|
||||||
EXPORT_XPCOM_API(bool)
|
|
||||||
NS_CycleCollectorForget2(nsPurpleBufferEntry* e)
|
|
||||||
{
|
|
||||||
return NS_CycleCollectorForget2_P(e);
|
|
||||||
}
|
|
Загрузка…
Ссылка в новой задаче