summaryrefslogtreecommitdiffstats
path: root/src/libs/xpcom18a4/xpcom/build
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/xpcom18a4/xpcom/build')
-rw-r--r--src/libs/xpcom18a4/xpcom/build/.cvsignore1
-rw-r--r--src/libs/xpcom18a4/xpcom/build/Makefile.in165
-rw-r--r--src/libs/xpcom18a4/xpcom/build/dlldeps.cpp202
-rw-r--r--src/libs/xpcom18a4/xpcom/build/malloc.c5126
-rw-r--r--src/libs/xpcom18a4/xpcom/build/nsOS2VACLegacy.cpp753
-rw-r--r--src/libs/xpcom18a4/xpcom/build/nsStringAPI.cpp261
-rw-r--r--src/libs/xpcom18a4/xpcom/build/nsXPCOM.h217
-rw-r--r--src/libs/xpcom18a4/xpcom/build/nsXPCOMCID.h174
-rw-r--r--src/libs/xpcom18a4/xpcom/build/nsXPCOMPrivate.h228
-rw-r--r--src/libs/xpcom18a4/xpcom/build/nsXPComInit.cpp1079
-rw-r--r--src/libs/xpcom18a4/xpcom/build/win32.order1514
-rw-r--r--src/libs/xpcom18a4/xpcom/build/xpcom-tests.pkg47
-rw-r--r--src/libs/xpcom18a4/xpcom/build/xpcom.pkg106
-rw-r--r--src/libs/xpcom18a4/xpcom/build/xpcom_alpha.def252
14 files changed, 10125 insertions, 0 deletions
diff --git a/src/libs/xpcom18a4/xpcom/build/.cvsignore b/src/libs/xpcom18a4/xpcom/build/.cvsignore
new file mode 100644
index 00000000..f3c7a7c5
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/.cvsignore
@@ -0,0 +1 @@
+Makefile
diff --git a/src/libs/xpcom18a4/xpcom/build/Makefile.in b/src/libs/xpcom18a4/xpcom/build/Makefile.in
new file mode 100644
index 00000000..5c2386ce
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/Makefile.in
@@ -0,0 +1,165 @@
+#
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either of the GNU General Public License Version 2 or later (the "GPL"),
+# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+DEPTH = ../..
+topsrcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+MODULE = xpcom
+LIBRARY_NAME = xpcom
+
+PACKAGE_FILE = xpcom.pkg
+PACKAGE_VARS += USE_SHORT_LIBNAME
+
+ifdef ENABLE_TESTS
+PACKAGE_FILE += xpcom-tests.pkg
+endif
+
+# Do not set EXPORT_LIBRARY as we do not want xpcom in the static libs list
+#EXPORT_LIBRARY = 1
+GRE_MODULE = 1
+
+REQUIRES = string \
+ $(NULL)
+
+# pull in MoreFiles for MacOSX
+ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
+REQUIRES += macmorefiles
+endif
+
+CPPSRCS = nsXPComInit.cpp \
+ nsStringAPI.cpp \
+ $(NULL)
+
+ifeq ($(OS_ARCH),WINNT)
+CPPSRCS += dlldeps.cpp
+endif
+
+ifdef XPCOM_USE_LEA
+CSRCS += malloc.c
+endif
+
+ifeq ($(OS_TARGET),OS2)
+CPPSRCS += nsOS2VACLegacy.cpp
+endif
+
+ifdef GC_LEAK_DETECTOR
+EXTRA_DSO_LIBS = boehm
+endif
+
+SHARED_LIBRARY_LIBS = \
+ $(DIST)/lib/$(LIB_PREFIX)xpcomds_s.$(LIB_SUFFIX) \
+ $(DIST)/lib/$(LIB_PREFIX)xpcomio_s.$(LIB_SUFFIX) \
+ $(DIST)/lib/$(LIB_PREFIX)xpcomcomponents_s.$(LIB_SUFFIX) \
+ $(DIST)/lib/$(LIB_PREFIX)xpcomthreads_s.$(LIB_SUFFIX) \
+ $(DIST)/lib/$(LIB_PREFIX)xpcomproxy_s.$(LIB_SUFFIX) \
+ $(DIST)/lib/$(LIB_PREFIX)xpcombase_s.$(LIB_SUFFIX) \
+ $(DIST)/lib/$(LIB_PREFIX)xptcall.$(LIB_SUFFIX) \
+ $(DIST)/lib/$(LIB_PREFIX)xptinfo.$(LIB_SUFFIX) \
+ $(DIST)/lib/$(LIB_PREFIX)xpt.$(LIB_SUFFIX) \
+ $(DIST)/lib/$(LIB_PREFIX)xptcmd.$(LIB_SUFFIX) \
+ $(DIST)/lib/$(LIB_PREFIX)string_s.$(LIB_SUFFIX) \
+ $(DIST)/lib/$(LIB_PREFIX)xpcomglue_s.$(LIB_SUFFIX) \
+ $(NULL)
+
+LOCAL_INCLUDES = \
+ -I.. \
+ -I$(srcdir)/../glue \
+ -I$(srcdir)/../base \
+ -I$(srcdir)/../ds \
+ -I$(srcdir)/../io \
+ -I$(srcdir)/../components \
+ -I$(srcdir)/../threads \
+ -I$(srcdir)/../threads/_xpidlgen \
+ -I$(srcdir)/../proxy/src \
+ $(NULL)
+
+SDK_HEADERS = \
+ nsXPCOM.h \
+ nsXPCOMCID.h \
+ $(NULL)
+
+SDK_LIBRARY = $(IMPORT_LIBRARY)
+SDK_BINARY = $(SHARED_LIBRARY)
+
+# pull in MoreFiles for MacOSX
+ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
+EXTRA_DSO_LIBS = macmorefiles_s
+EXTRA_DSO_LDOPTS += $(EXTRA_DSO_LIBS)
+EXTRA_DEPS += $(DIST)/lib/$(LIB_PREFIX)macmorefiles_s.$(LIB_SUFFIX)
+endif
+
+# Force use of PIC
+FORCE_USE_PIC = 1
+
+FORCE_SHARED_LIB = 1
+
+# UNIX98 iconv support
+OS_LIBS += $(LIBICONV)
+
+include $(topsrcdir)/config/rules.mk
+
+DEFINES += \
+ -D_IMPL_NS_COM \
+ -DEXPORT_XPT_API \
+ -DEXPORT_XPTC_API \
+ -DEXPORT_XPTI_API
+
+EXTRA_DSO_LDOPTS += $(NSPR_LIBS)
+
+ifdef GC_LEAK_DETECTOR
+DEFINES += -DGC_LEAK_DETECTOR
+endif
+
+ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
+CXXFLAGS += $(TK_CFLAGS)
+EXTRA_DSO_LDOPTS += $(TK_LIBS)
+endif
+
+ifeq ($(OS_ARCH),BeOS)
+EXTRA_DSO_LDOPTS += -lbe
+endif
+
+ifeq ($(OS_ARCH),WINNT)
+EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME,shell32 ole32 uuid)
+ifneq (,$(MOZ_DEBUG)$(NS_TRACE_MALLOC))
+EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME,imagehlp)
+endif
+endif # WINNT
diff --git a/src/libs/xpcom18a4/xpcom/build/dlldeps.cpp b/src/libs/xpcom18a4/xpcom/build/dlldeps.cpp
new file mode 100644
index 00000000..5fc31189
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/dlldeps.cpp
@@ -0,0 +1,202 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+// Force references to all of the symbols that we want exported from
+// the dll that are located in the .lib files we link with
+
+#include "nsVoidArray.h"
+#include "nsValueArray.h"
+#include "nsIAtom.h"
+//#include "nsIBuffer.h"
+#include "nsIByteArrayInputStream.h"
+#include "nsFixedSizeAllocator.h"
+#include "nsRecyclingAllocator.h"
+#include "nsIThread.h"
+#include "nsDeque.h"
+#include "nsTraceRefcnt.h"
+#include "nsTraceRefcntImpl.h"
+#include "nsXPIDLString.h"
+#include "nsIEnumerator.h"
+#include "nsEnumeratorUtils.h"
+#include "nsQuickSort.h"
+#include "nsString.h"
+#include "nsPrintfCString.h"
+#include "nsSupportsArray.h"
+#include "nsArray.h"
+#include "nsArrayEnumerator.h"
+#include "nsProxyEventPrivate.h"
+#include "nsProxyRelease.h"
+#include "xpt_xdr.h"
+#include "xptcall.h"
+#include "nsILocalFile.h"
+#include "nsIGenericFactory.h"
+#include "nsIPipe.h"
+#include "nsStreamUtils.h"
+#include "nsWeakReference.h"
+#include "nsTextFormatter.h"
+#include "nsIStorageStream.h"
+#include "nsLinebreakConverter.h"
+#include "nsIBinaryInputStream.h"
+#include "nsIInterfaceRequestor.h"
+#include "nsIInterfaceRequestorUtils.h"
+#include "nsReadableUtils.h"
+#include "nsStaticNameTable.h"
+#include "nsProcess.h"
+#include "nsStringEnumerator.h"
+#include "nsIInputStreamTee.h"
+#include "nsCheapSets.h"
+#ifdef DEBUG
+#include "pure.h"
+#endif
+#include "nsHashKeys.h"
+#include "nsTHashtable.h"
+#include "pldhash.h"
+#include "nsVariant.h"
+#include "nsEscape.h"
+#include "nsStreamUtils.h"
+
+#define NS_STRINGAPI_IMPL
+#include "nsStringAPI.h"
+
+void XXXNeverCalled()
+{
+ nsTextFormatter::snprintf(nsnull,0,nsnull);
+ nsTextFormatter::smprintf(nsnull, nsnull);
+ nsTextFormatter::smprintf_free(nsnull);
+ nsVoidArray();
+ nsSmallVoidArray();
+ nsStringHashSet();
+ nsCStringHashSet();
+ nsInt32HashSet();
+ nsVoidHashSet();
+ nsCheapStringSet();
+ nsCheapInt32Set();
+ nsValueArray(0);
+ nsSupportsArray();
+ NS_GetNumberOfAtoms();
+ NS_NewPipe2(nsnull, nsnull, PR_FALSE, PR_FALSE, 0, 0, nsnull);
+ NS_NewInputStreamReadyEvent(nsnull, nsnull, nsnull);
+ NS_NewOutputStreamReadyEvent(nsnull, nsnull, nsnull);
+ NS_AsyncCopy(nsnull, nsnull, nsnull, NS_ASYNCCOPY_VIA_READSEGMENTS, 0, nsnull, nsnull);
+ PL_DHashStubEnumRemove(nsnull, nsnull, nsnull, nsnull);
+ nsIDHashKey::HashKey(nsnull);
+ nsFixedSizeAllocator a;
+ nsRecyclingAllocator recyclingAllocator(2);
+ a.Init(0, 0, 0, 0, 0);
+ a.Alloc(0);
+ a.Free(0, 0);
+ nsIThread::GetCurrent(nsnull);
+ nsDeque(nsnull);
+ nsTraceRefcnt::LogAddCOMPtr(nsnull, nsnull);
+ nsTraceRefcntImpl::DumpStatistics();
+ NS_NewEmptyEnumerator(nsnull);
+ new nsArrayEnumerator(nsnull);
+ NS_QuickSort(nsnull, 0, 0, nsnull, nsnull);
+ nsString();
+ nsProxyObject(nsnull, 0, nsnull);
+ NS_ProxyRelease(nsnull, nsnull, PR_FALSE);
+ XPT_DoString(nsnull, nsnull, nsnull);
+ XPT_DoHeader(nsnull, nsnull, nsnull);
+#ifdef DEBUG
+ PurePrintf(0);
+#endif
+ XPTC_InvokeByIndex(nsnull, 0, 0, nsnull);
+ xptc_dummy();
+ xptc_dummy2();
+ XPTI_GetInterfaceInfoManager();
+ NS_NewGenericFactory(nsnull, nsnull);
+ NS_NewGenericModule2(nsnull, nsnull);
+ NS_GetWeakReference(nsnull);
+ nsCOMPtr<nsISupports> dummyFoo(do_GetInterface(nsnull));
+ NS_NewByteArrayInputStream(nsnull, nsnull, 0);
+ NS_NewStorageStream(0,0, nsnull);
+ nsString foo;
+ nsPrintfCString bar("");
+ nsLinebreakConverter::ConvertStringLineBreaks(foo,
+ nsLinebreakConverter::eLinebreakAny, nsLinebreakConverter::eLinebreakContent);
+ NS_NewLocalFile(nsString(), PR_FALSE, nsnull);
+ NS_NewNativeLocalFile(nsCString(), PR_FALSE, nsnull);
+ new nsProcess();
+ nsStaticCaseInsensitiveNameTable();
+ nsAutoString str1;
+ str1.AssignWithConversion(nsnull, 0);
+ nsCAutoString str2;
+ ToNewUnicode(str1);
+ ToNewUnicode(str2);
+ ToNewCString(str1);
+ ToNewCString(str2);
+ PL_DHashTableFinish(nsnull);
+ NS_NewInputStreamTee(nsnull, nsnull, nsnull);
+ NS_NewArray(nsnull);
+ nsCOMArray<nsISupports> dummyArray;
+ NS_NewArray(nsnull, dummyArray);
+ NS_NewArrayEnumerator(nsnull, dummyArray);
+ new nsVariant();
+ nsUnescape(nsnull);
+ nsEscape(nsnull, url_XAlphas);
+ nsStringArray array;
+ NS_NewStringEnumerator(nsnull, &array);
+ NS_NewAdoptingStringEnumerator(nsnull, &array);
+ nsCStringArray carray;
+ NS_NewUTF8StringEnumerator(nsnull, &carray);
+ NS_NewAdoptingUTF8StringEnumerator(nsnull, &carray);
+ nsVoidableString str3;
+ nsCStringContainer sc1;
+ NS_CStringContainerInit(sc1);
+ NS_CStringContainerFinish(sc1);
+ NS_CStringGetData(str2, nsnull, nsnull);
+ NS_CStringSetData(str2, nsnull, 0);
+ NS_CStringSetDataRange(str2, 0, 0, nsnull, 0);
+ NS_CStringCopy(str2, str2);
+ nsStringContainer sc2;
+ NS_StringContainerInit(sc2);
+ NS_StringContainerFinish(sc2);
+ NS_StringGetData(str1, nsnull, nsnull);
+ NS_StringSetData(str1, nsnull, 0);
+ NS_StringSetDataRange(str1, 0, 0, nsnull, 0);
+ NS_StringCopy(str1, str1);
+ {
+ nsAdoptingCString foo, bar;
+ foo = bar;
+ }
+ {
+ nsAdoptingString foo, bar;
+ foo = bar;
+ }
+ NS_UTF16ToCString(str1, NS_CSTRING_ENCODING_ASCII, str2);
+ NS_CStringToUTF16(str2, NS_CSTRING_ENCODING_ASCII, str1);
+}
diff --git a/src/libs/xpcom18a4/xpcom/build/malloc.c b/src/libs/xpcom18a4/xpcom/build/malloc.c
new file mode 100644
index 00000000..96691829
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/malloc.c
@@ -0,0 +1,5126 @@
+#define USE_MALLOC_LOCK
+#define DEFAULT_TRIM_THRESHOLD (256 * 1024)
+
+/* ---------- To make a malloc.h, start cutting here ------------ */
+
+/*
+ ****************************************************************
+ * THIS IS A PRERELEASE. It has not yet been tested adequately. *
+ * If you use it, please send back comments, suggestions, *
+ * performance reports, etc. *
+ ****************************************************************
+*/
+
+/*
+ A version (aka dlmalloc) of malloc/free/realloc written by Doug
+ Lea and released to the public domain. Use this code without
+ permission or acknowledgement in any way you wish. Send questions,
+ comments, complaints, performance data, etc to dl@cs.oswego.edu
+
+* VERSION 2.7.0pre7 Wed Jan 10 13:33:01 2001 Doug Lea (dl at gee)
+
+ Note: There may be an updated version of this malloc obtainable at
+ ftp://gee.cs.oswego.edu/pub/misc/malloc.c
+ Check before installing!
+
+* Quickstart
+
+ This library is all in one file to simplify the most common usage:
+ ftp it, compile it (-O), and link it into another program. All
+ of the compile-time options default to reasonable values for use on
+ most unix platforms. Compile -DWIN32 for reasonable defaults on windows.
+ You might later want to step through various compile options.
+
+* Why use this malloc?
+
+ This is not the fastest, most space-conserving, most portable, or
+ most tunable malloc ever written. However it is among the fastest
+ while also being among the most space-conserving, portable and tunable.
+ Consistent balance across these factors results in a good general-purpose
+ allocator for malloc-intensive programs.
+
+ The main properties of the algorithms are:
+ * For large (>= 512 bytes) requests, it is a pure best-fit allocator,
+ with ties normally decided via FIFO (i.e. least recently used).
+ * For small (<= 64 bytes by default) requests, it is a caching
+ allocator, that maintains pools of quickly recycled chunks.
+ * In between, and for combinations of large and small requests, it does
+ the best it can trying to meet both goals at once.
+
+ Compared to 2.6.X versions, this version is generally faster,
+ especially for programs that allocate and free many small chunks.
+
+ For a longer but slightly out of date high-level description, see
+ http://gee.cs.oswego.edu/dl/html/malloc.html
+
+ You may already by default be using a c library containing a malloc
+ that is somehow based on some version of this malloc (for example in
+ linux). You might still want to use the one in this file in order to
+ customize settings or to avoid overheads associated with library
+ versions.
+
+* Synopsis of public routines
+
+ (Much fuller descriptions are contained in the program documentation below.)
+
+ malloc(size_t n);
+ Return a pointer to a newly allocated chunk of at least n bytes, or null
+ if no space is available.
+ free(Void_t* p);
+ Release the chunk of memory pointed to by p, or no effect if p is null.
+ realloc(Void_t* p, size_t n);
+ Return a pointer to a chunk of size n that contains the same data
+ as does chunk p up to the minimum of (n, p's size) bytes, or null
+ if no space is available. The returned pointer may or may not be
+ the same as p. If p is null, equivalent to malloc. Unless the
+ #define REALLOC_ZERO_BYTES_FREES below is set, realloc with a
+ size argument of zero (re)allocates a minimum-sized chunk.
+ memalign(size_t alignment, size_t n);
+ Return a pointer to a newly allocated chunk of n bytes, aligned
+ in accord with the alignment argument, which must be a power of
+ two.
+ valloc(size_t n);
+ Equivalent to memalign(pagesize, n), where pagesize is the page
+ size of the system (or as near to this as can be figured out from
+ all the includes/defines below.)
+ pvalloc(size_t n);
+ Equivalent to valloc(minimum-page-that-holds(n)), that is,
+ round up n to nearest pagesize.
+ calloc(size_t unit, size_t quantity);
+ Returns a pointer to quantity * unit bytes, with all locations
+ set to zero.
+ cfree(Void_t* p);
+ Equivalent to free(p).
+ malloc_trim(size_t pad);
+ Release all but pad bytes of freed top-most memory back
+ to the system. Return 1 if successful, else 0.
+ malloc_usable_size(Void_t* p);
+ Report the number usable allocated bytes associated with allocated
+ chunk p. This may or may not report more bytes than were requested,
+ due to alignment and minimum size constraints.
+ malloc_stats();
+ Prints brief summary statistics on stderr.
+ mallinfo()
+ Returns (by copy) a struct containing various summary statistics.
+ mallopt(int parameter_number, int parameter_value)
+ Changes one of the tunable parameters described below. Returns
+ 1 if successful in changing the parameter, else 0.
+
+* Vital statistics:
+
+ Assumed pointer representation: 4 or 8 bytes
+ (Thanks to Wolfram Gloger for contributing most of the
+ changes supporting dual 4/8.)
+
+ Assumed size_t representation: 4 or 8 bytes
+ Note that size_t is allowed to be 4 bytes even if pointers are 8.
+ You can adjust this by defining INTERNAL_SIZE_T
+
+ Alignment: 2 * sizeof(size_t)
+ (i.e., 8 byte alignment with 4byte size_t). This suffices for
+ nearly all current machines and C compilers. However, you can
+ define MALLOC_ALIGNMENT to be wider than this if necessary.
+
+ Minimum overhead per allocated chunk: 4 or 8 bytes
+ Each malloced chunk has a hidden word of overhead holding size
+ and status information.
+
+ Minimum allocated size: 4-byte ptrs: 16 bytes (including 4 overhead)
+ 8-byte ptrs: 24/32 bytes (including, 4/8 overhead)
+
+ When a chunk is freed, 12 (for 4byte ptrs) or 20 (for 8 byte
+ ptrs but 4 byte size) or 24 (for 8/8) additional bytes are
+ needed; 4 (8) for a trailing size field and 8 (16) bytes for
+ free list pointers. Thus, the minimum allocatable size is
+ 16/24/32 bytes.
+
+ Even a request for zero bytes (i.e., malloc(0)) returns a
+ pointer to something of the minimum allocatable size.
+
+ The maximum overhead wastage (i.e., number of extra bytes
+ allocated than were requested in malloc) is less than or equal
+ to the minimum size, except for requests >= mmap_threshold that
+ are serviced via mmap(), where the worst case wastage is 2 *
+ sizeof(size_t) bytes plus the remainder from a system page (the
+ minimal mmap unit); typically 4096 bytes.
+
+ Maximum allocated size: 4-byte size_t: 2^31 minus about two pages
+ 8-byte size_t: 2^63 minus about two pages
+
+ It is assumed that (possibly signed) size_t values suffice
+ to represent chunk sizes. `Possibly signed' is due to the fact
+ that `size_t' may be defined on a system as either a signed or
+ an unsigned type. The ISO C standard says that it must be
+ unsigned, but a few systems are known not to adhere to this.
+ Additionally, even when size_t is unsigned, sbrk (which is by
+ default used to obtain memory from system) accepts signed
+ arguments, and may not be able to handle size_t-wide arguments
+ with negative sign bit. To be conservative, values that would
+ appear as negative after accounting for overhead and alignment
+ are rejected.
+
+ Requests for sizes outside this range will perform an optional
+ failure action and then return null. (Requests may also
+ also fail because a system is out of memory.)
+
+ Thread-safety: NOT thread-safe unless USE_MALLOC_LOCK defined
+
+ When USE_MALLOC_LOCK is defined, wrappers are created to
+ surround every public call with either a pthread mutex or
+ a win32 critical section (depending on WIN32). This is not
+ especially fast, and can be a major bottleneck in programs with
+ many threads. It is designed only to provide minimal protection
+ in concurrent environments, and to provide a basis for
+ extensions. If you are using malloc in a concurrent program,
+ you would be far better off obtaining ptmalloc, which is
+ derived from a version of this malloc, and is well-tuned for
+ concurrent programs. (See http://www.malloc.de)
+
+ Compliance: I believe it is compliant with the 1997 Single Unix Specification
+
+ (See http://www.opennc.org). Probably other standards as well.
+
+* Limitations
+
+ Here are some features that are NOT currently supported
+
+ * No automated mechanism for fully checking that all accesses
+ to malloced memory stay within their bounds. However, there
+ are several add-ons and adaptations of this or other mallocs
+ available that do this.
+ * No support for compaction.
+
+* Synopsis of compile-time options:
+
+ People have reported using previous versions of this malloc on all
+ versions of Unix, sometimes by tweaking some of the defines
+ below. It has been tested most extensively on Solaris and
+ Linux. It is also reported to work on WIN32 platforms.
+ People also report using it in stand-alone embedded systems.
+
+ The implementation is in straight, hand-tuned ANSI C. It is not
+ at all modular. (Sorry!) It uses a lot of macros. To be at all
+ usable, this code should be compiled using an optimizing compiler
+ (for example gcc -O3) that can simplify expressions and control
+ paths. (FAQ: some macros import variables as arguments rather than
+ declare locals because people reported that some debuggers
+ otherwise get confused.)
+
+ OPTION DEFAULT VALUE
+
+ Compilation Environment options:
+
+ __STD_C derived from C compiler defines
+ WIN32 NOT defined
+ HAVE_MEMCPY defined
+ USE_MEMCPY 1 if HAVE_MEMCPY is defined
+ HAVE_MMAP defined as 1
+ MMAP_AS_MORECORE_SIZE (1024 * 1024)
+ HAVE_MREMAP defined as 0 unless linux defined
+ malloc_getpagesize derived from system #includes, or 4096 if not
+ HAVE_USR_INCLUDE_MALLOC_H NOT defined
+ LACKS_UNISTD_H NOT defined unless WIN32
+ LACKS_SYS_PARAM_H NOT defined unless WIN32
+ LACKS_SYS_MMAN_H NOT defined unless WIN32
+
+ Changing default word sizes:
+
+ INTERNAL_SIZE_T size_t
+ MALLOC_ALIGNMENT 2 * sizeof(INTERNAL_SIZE_T)
+
+ Configuration and functionality options:
+
+ USE_DL_PREFIX NOT defined
+ USE_PUBLIC_MALLOC_WRAPPERS NOT defined
+ USE_MALLOC_LOCK NOT defined
+ DEBUG NOT defined
+ REALLOC_ZERO_BYTES_FREES NOT defined
+ MALLOC_FAILURE_ACTION errno = ENOMEM, if __STD_C defined, else no-op
+ TRIM_FASTBINS 0
+
+ Options for customizing MORECORE:
+
+ MORECORE sbrk
+ MORECORE_CONTIGUOUS 1
+
+ Tuning options that are also dynamically changeable via mallopt:
+
+ DEFAULT_MXFAST 64
+ DEFAULT_TRIM_THRESHOLD 128 * 1024
+ DEFAULT_TOP_PAD 0
+ DEFAULT_MMAP_THRESHOLD 128 * 1024
+ DEFAULT_MMAP_MAX 256
+
+ There are several other #defined constants and macros that you
+ probably don't want to touch unless you are extending or adapting malloc.
+
+*/
+#include "xpcom-private.h"
+
+
+
+/*
+ WIN32 sets up defaults for MS environment and compilers.
+ Otherwise defaults are for unix.
+*/
+
+/* #define WIN32 */
+
+#ifdef WIN32
+
+#include <windows.h>
+
+/* Win32 doesn't supply or need the following headers */
+#define LACKS_UNISTD_H
+#define LACKS_SYS_PARAM_H
+#define LACKS_SYS_MMAN_H
+
+/* Use the supplied emulation of sbrk */
+#define MORECORE sbrk
+#define MORECORE_CONTIGUOUS 1
+#define MORECORE_FAILURE ((void*)(-1))
+
+/* Use the supplied emulation mmap, munmap */
+#define HAVE_MMAP 1
+#define MUNMAP_FAILURE (-1)
+/* These values don't really matter in windows mmap emulation */
+#define MAP_PRIVATE 1
+#define MAP_ANONYMOUS 2
+#define PROT_READ 1
+#define PROT_WRITE 2
+
+/* Emulation functions defined at the end of this file */
+
+/* If USE_MALLOC_LOCK, use supplied critical-section-based lock functions */
+#ifdef USE_MALLOC_LOCK
+static int slwait(int *sl);
+static int slrelease(int *sl);
+#endif
+
+static long getpagesize(void);
+static long getregionsize(void);
+static void *sbrk(long size);
+static void *mmap(void *ptr, long size, long prot, long type, long handle, long arg);
+static long munmap(void *ptr, long size);
+
+static void vminfo (unsigned long *free, unsigned long *reserved, unsigned long *committed);
+static int cpuinfo (int whole, unsigned long *kernel, unsigned long *user);
+
+#endif
+
+
+
+/*
+ __STD_C should be nonzero if using ANSI-standard C compiler, a C++
+ compiler, or a C compiler sufficiently close to ANSI to get away
+ with it.
+*/
+
+#ifndef __STD_C
+#ifdef __STDC__
+#define __STD_C 1
+#else
+#if __cplusplus
+#define __STD_C 1
+#else
+#define __STD_C 0
+#endif /*__cplusplus*/
+#endif /*__STDC__*/
+#endif /*__STD_C*/
+
+
+/*
+ Void_t* is the pointer type that malloc should say it returns
+*/
+
+#ifndef Void_t
+#if (__STD_C || defined(WIN32))
+#define Void_t void
+#else
+#define Void_t char
+#endif
+#endif /*Void_t*/
+
+#if __STD_C
+#include <stddef.h> /* for size_t */
+#else
+#include <sys/types.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* define LACKS_UNISTD_H if your system does not have a <unistd.h>. */
+
+/* #define LACKS_UNISTD_H */
+
+#ifndef LACKS_UNISTD_H
+#include <unistd.h>
+#endif
+
+/* define LACKS_SYS_PARAM_H if your system does not have a <sys/param.h>. */
+
+/* #define LACKS_SYS_PARAM_H */
+
+
+#include <stdio.h> /* needed for malloc_stats */
+#include <errno.h> /* needed for optional MALLOC_FAILURE_ACTION */
+
+
+/*
+ Debugging:
+
+ Because freed chunks may be overwritten with bookkeeping fields, this
+ malloc will often die when freed memory is overwritten by user
+ programs. This can be very effective (albeit in an annoying way)
+ in helping track down dangling pointers.
+
+ If you compile with -DDEBUG, a number of assertion checks are
+ enabled that will catch more memory errors. You probably won't be
+ able to make much sense of the actual assertion errors, but they
+ should help you locate incorrectly overwritten memory. The
+ checking is fairly extensive, and will slow down execution
+ noticeably. Calling malloc_stats or mallinfo with DEBUG set will
+ attempt to check every non-mmapped allocated and free chunk in the
+ course of computing the summmaries. (By nature, mmapped regions
+ cannot be checked very much automatically.)
+
+ Setting DEBUG may also be helpful if you are trying to modify
+ this code. The assertions in the check routines spell out in more
+ detail the assumptions and invariants underlying the algorithms.
+
+*/
+
+#if DEBUG
+#include <assert.h>
+#else
+#define assert(x) ((void)0)
+#endif
+
+
+/*
+ INTERNAL_SIZE_T is the word-size used for internal bookkeeping
+ of chunk sizes.
+
+ The default version is the same as size_t.
+
+ While not strictly necessary, it is best to define this as an
+ unsigned type, even if size_t is a signed type. This may avoid some
+ artificial size limitations on some systems.
+
+ On a 64-bit machine, you may be able to reduce malloc overhead by
+ defining INTERNAL_SIZE_T to be a 32 bit `unsigned int' at the
+ expense of not being able to handle more than 2^32 of malloced
+ space. If this limitation is acceptable, you are encouraged to set
+ this unless you are on a platform requiring 16byte alignments. In
+ this case the alignment requirements turn out to negate any
+ potential advantages of decreasing size_t word size.
+
+ Note to implementors: To deal with all this, comparisons and
+ difference computations among INTERNAL_SIZE_Ts should normally cast
+ INTERNAL_SIZE_T's to long or unsigned long, as appropriate, being
+ aware of the fact that casting an unsigned int to a wider long does not
+ sign-extend. (This also makes checking for negative numbers awkward.)
+
+*/
+
+#ifndef INTERNAL_SIZE_T
+#define INTERNAL_SIZE_T size_t
+#endif
+
+/* The corresponding word size */
+#define SIZE_SZ (sizeof(INTERNAL_SIZE_T))
+
+
+/*
+ MALLOC_ALIGNMENT is the minimum alignment for malloc'ed chunks.
+ It must be a power of two at least 2 * SIZE_SZ, even on machines
+ for which smaller alignments would suffice. It may be defined as
+ larger than this though. (Note however that code and data structures
+ are optimized for the case of 8-byte alignment.)
+
+*/
+
+ /* #define MALLOC_ALIGNMENT 16 */
+
+#ifndef MALLOC_ALIGNMENT
+#define MALLOC_ALIGNMENT (2 * SIZE_SZ)
+#endif
+
+/* The corresponding bit mask value */
+#define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1)
+
+
+/*
+ REALLOC_ZERO_BYTES_FREES should be set if a call to
+ realloc with zero bytes should be the same as a call to free.
+ Some people think it should. Otherwise, since this malloc
+ returns a unique pointer for malloc(0), so does realloc(p, 0).
+*/
+
+/* #define REALLOC_ZERO_BYTES_FREES */
+
+
+/*
+ USE_DL_PREFIX will prefix all public routines with the string 'dl'.
+ This is necessary when you only want to use this malloc in one part
+ of a program, using your regular system malloc elsewhere.
+*/
+
+/* #define USE_DL_PREFIX */
+
+
+/*
+ USE_MALLOC_LOCK causes wrapper functions to surround each
+ callable routine with pthread mutex lock/unlock.
+
+ USE_MALLOC_LOCK forces USE_PUBLIC_MALLOC_WRAPPERS to be defined
+*/
+
+/* #define USE_MALLOC_LOCK */
+
+
+/*
+ If USE_PUBLIC_MALLOC_WRAPPERS is defined, every public routine is
+ actually a wrapper function that first calls MALLOC_PREACTION, then
+ calls the internal routine, and follows it with
+ MALLOC_POSTACTION. This is needed for locking, but you can also use
+ this, without USE_MALLOC_LOCK, for purposes of interception,
+ instrumentation, etc. It is a sad fact that using wrappers often
+ noticeably degrades performance of malloc-intensive programs.
+*/
+
+#ifdef USE_MALLOC_LOCK
+#define USE_PUBLIC_MALLOC_WRAPPERS
+#else
+/* #define USE_PUBLIC_MALLOC_WRAPPERS */
+#endif
+
+
+
+
+/*
+ HAVE_MEMCPY should be defined if you are not otherwise using
+ ANSI STD C, but still have memcpy and memset in your C library
+ and want to use them in calloc and realloc. Otherwise simple
+ macro versions are defined below.
+
+ USE_MEMCPY should be defined as 1 if you actually want to
+ have memset and memcpy called. People report that the macro
+ versions are faster than libc versions on some systems.
+
+ Even if USE_MEMCPY is set to 1, loops to copy/clear small chunks
+ (of <= 36 bytes) are manually unrolled in realloc and calloc.
+*/
+
+#define HAVE_MEMCPY
+
+#ifndef USE_MEMCPY
+#ifdef HAVE_MEMCPY
+#define USE_MEMCPY 1
+#else
+#define USE_MEMCPY 0
+#endif
+#endif
+
+
+#if (__STD_C || defined(HAVE_MEMCPY))
+
+#ifdef WIN32
+ /*
+ On Win32 platforms, 'memset()' and 'memcpy()' are already declared in
+ 'windows.h'
+ */
+#else
+#if __STD_C
+void* memset(void*, int, size_t);
+void* memcpy(void*, const void*, size_t);
+void* memmove(void*, const void*, size_t);
+#else
+Void_t* memset();
+Void_t* memcpy();
+Void_t* memmove();
+#endif
+#endif
+#endif
+
+
+/*
+ MALLOC_FAILURE_ACTION is the action to take before "return 0" when
+ malloc fails to be able to return memory, either because memory is
+ exhausted or because of illegal arguments.
+
+ By default, sets errno if running on STD_C platform, else does nothing.
+*/
+
+#ifndef MALLOC_FAILURE_ACTION
+#if __STD_C
+#define MALLOC_FAILURE_ACTION \
+ errno = ENOMEM;
+
+#else
+
+#define MALLOC_FAILURE_ACTION
+#endif
+#endif
+
+/*
+ Define HAVE_MMAP as true to optionally make malloc() use mmap() to
+ allocate very large blocks. These will be returned to the
+ operating system immediately after a free(). Also, if mmap
+ is available, it is used as a backup strategy in cases where
+ MORECORE fails to provide space from system.
+
+ This malloc is best tuned to work with mmap for large requests.
+ If you do not have mmap, allocation of very large chunks (1MB
+ or so) may be slower than you'd like.
+*/
+
+#ifndef HAVE_MMAP
+#define HAVE_MMAP 1
+#endif
+
+/*
+ MMAP_AS_MORECORE_SIZE is the minimum mmap size argument to use if
+ sbrk fails, and mmap is used as a backup (which is done only if
+ HAVE_MMAP). The value must be a multiple of page size. This
+ backup strategy generally applies only when systems have "holes" in
+ address space, so sbrk cannot perform contiguous expansion, but
+ there is still space available on system. On systems for which
+ this is known to be useful (i.e. most linux kernels), this occurs
+ only when programs allocate huge amounts of memory. Between this,
+ and the fact that mmap regions tend to be limited, the size should
+ be large, to avoid too many mmap calls and thus avoid running out
+ of kernel resources.
+*/
+
+#ifndef MMAP_AS_MORECORE_SIZE
+#define MMAP_AS_MORECORE_SIZE (1024 * 1024)
+#endif
+
+
+
+/*
+ Define HAVE_MREMAP to make realloc() use mremap() to re-allocate
+ large blocks. This is currently only possible on Linux with
+ kernel versions newer than 1.3.77.
+*/
+
+#ifndef HAVE_MREMAP
+#ifdef linux
+#define HAVE_MREMAP 1
+#else
+#define HAVE_MREMAP 0
+#endif
+
+#endif /* HAVE_MMAP */
+
+
+/*
+
+ This version of malloc supports the standard SVID/XPG mallinfo
+ routine that returns a struct containing usage properties and
+ statistics. It should work on any SVID/XPG compliant system that has
+ a /usr/include/malloc.h defining struct mallinfo. (If you'd like to
+ install such a thing yourself, cut out the preliminary declarations
+ as described above and below and save them in a malloc.h file. But
+ there's no compelling reason to bother to do this.)
+
+ The main declaration needed is the mallinfo struct that is returned
+ (by-copy) by mallinfo(). The SVID/XPG malloinfo struct contains a
+ bunch of field that are not even meaningful in this version of
+ malloc. These fields are are instead filled by mallinfo() with
+ other numbers that might be of interest.
+
+ HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
+ /usr/include/malloc.h file that includes a declaration of struct
+ mallinfo. If so, it is included; else an SVID2/XPG2 compliant
+ version is declared below. These must be precisely the same for
+ mallinfo() to work.
+
+*/
+
+/* #define HAVE_USR_INCLUDE_MALLOC_H */
+
+#ifdef HAVE_USR_INCLUDE_MALLOC_H
+#include "/usr/include/malloc.h"
+#else
+
+/* SVID2/XPG mallinfo structure */
+
+struct mallinfo {
+ int arena; /* non-mmapped space allocated from system */
+ int ordblks; /* number of free chunks */
+ int smblks; /* number of fastbin blocks */
+ int hblks; /* number of mmapped regions */
+ int hblkhd; /* space in mmapped regions */
+ int usmblks; /* maximum total allocated space */
+ int fsmblks; /* space available in freed fastbin blocks */
+ int uordblks; /* total allocated space */
+ int fordblks; /* total free space */
+ int keepcost; /* top-most, releasable (via malloc_trim) space */
+};
+
+/* SVID2/XPG mallopt options */
+
+#define M_MXFAST 1 /* Set maximum fastbin size */
+#define M_NLBLKS 2 /* UNUSED in this malloc */
+#define M_GRAIN 3 /* UNUSED in this malloc */
+#define M_KEEP 4 /* UNUSED in this malloc */
+
+
+#endif
+
+
+/* Additional mallopt options supported in this malloc */
+
+#ifndef M_TRIM_THRESHOLD
+#define M_TRIM_THRESHOLD -1
+#endif
+
+#ifndef M_TOP_PAD
+#define M_TOP_PAD -2
+#endif
+
+#ifndef M_MMAP_THRESHOLD
+#define M_MMAP_THRESHOLD -3
+#endif
+
+#ifndef M_MMAP_MAX
+#define M_MMAP_MAX -4
+#endif
+
+
+/*
+ MXFAST is the maximum request size used for "fastbins", special bins
+ that hold returned chunks without consolidating their spaces. This
+ enables future requests for chunks of the same size to be handled
+ very quickly, but can increase fragmentation, and thus increase the
+ overall memory footprint of a program.
+
+ This malloc manages fastbins very conservatively yet still
+ efficiently, so fragmentation is rarely a problem for values less
+ than or equal to the default. The maximum supported value of MXFAST
+ is 80. You wouldn't want it any higher than this anyway. Fastbins
+ are designed especially for use with many small structs, objects or
+ strings -- the default handles structs/objects/arrays with sizes up
+ to 8 4byte fields, or small strings representing words, tokens,
+ etc. Using fastbins for larger objects normally worsens
+ fragmentation without improving speed.
+
+ MXFAST is set in REQUEST size units. It is internally used in
+ chunksize units, which adds padding and alignment. You can reduce
+ MXFAST to 0 to disable all use of fastbins. This causes the malloc
+ algorithm to be a close approximation of fifo-best-fit in all cases,
+ not just for larger requests, but will generally cause it to be
+ slower.
+
+*/
+
+#ifndef DEFAULT_MXFAST
+#define DEFAULT_MXFAST 64
+#endif
+
+
+/*
+ M_TRIM_THRESHOLD is the maximum amount of unused top-most memory
+ to keep before releasing via malloc_trim in free().
+
+ Automatic trimming is mainly useful in long-lived programs.
+ Because trimming via sbrk can be slow on some systems, and can
+ sometimes be wasteful (in cases where programs immediately
+ afterward allocate more large chunks) the value should be high
+ enough so that your overall system performance would improve by
+ releasing.
+
+ The trim threshold and the mmap control parameters (see below)
+ can be traded off with one another. Trimming and mmapping are
+ two different ways of releasing unused memory back to the
+ system. Between these two, it is often possible to keep
+ system-level demands of a long-lived program down to a bare
+ minimum. For example, in one test suite of sessions measuring
+ the XF86 X server on Linux, using a trim threshold of 128K and a
+ mmap threshold of 192K led to near-minimal long term resource
+ consumption.
+
+ If you are using this malloc in a long-lived program, it should
+ pay to experiment with these values. As a rough guide, you
+ might set to a value close to the average size of a process
+ (program) running on your system. Releasing this much memory
+ would allow such a process to run in memory. Generally, it's
+ worth it to tune for trimming rather tham memory mapping when a
+ program undergoes phases where several large chunks are
+ allocated and released in ways that can reuse each other's
+ storage, perhaps mixed with phases where there are no such
+ chunks at all. And in well-behaved long-lived programs,
+ controlling release of large blocks via trimming versus mapping
+ is usually faster.
+
+ However, in most programs, these parameters serve mainly as
+ protection against the system-level effects of carrying around
+ massive amounts of unneeded memory. Since frequent calls to
+ sbrk, mmap, and munmap otherwise degrade performance, the default
+ parameters are set to relatively high values that serve only as
+ safeguards.
+
+ The default trim value is high enough to cause trimming only in
+ fairly extreme (by current memory consumption standards) cases.
+ It must be greater than page size to have any useful effect. To
+ disable trimming completely, you can set to (unsigned long)(-1);
+
+ Trim settings interact with fastbin (MXFAST) settings: Unless
+ TRIM_FASTBINS is defined, automatic trimming never takes place upon
+ freeing a chunk with size less than or equal to MXFAST. Trimming is
+ instead delayed until subsequent freeing of larger chunks. However,
+ you can still force an attempted trim by calling malloc_trim.
+
+ Also, trimming is not generally possible in cases where
+ the main arena is obtained via mmap.
+
+*/
+
+
+#ifndef DEFAULT_TRIM_THRESHOLD
+#define DEFAULT_TRIM_THRESHOLD (128 * 1024)
+#endif
+
+
+
+/*
+ M_TOP_PAD is the amount of extra `padding' space to allocate or
+ retain whenever sbrk is called. It is used in two ways internally:
+
+ * When sbrk is called to extend the top of the arena to satisfy
+ a new malloc request, this much padding is added to the sbrk
+ request.
+
+ * When malloc_trim is called automatically from free(),
+ it is used as the `pad' argument.
+
+ In both cases, the actual amount of padding is rounded
+ so that the end of the arena is always a system page boundary.
+
+ The main reason for using padding is to avoid calling sbrk so
+ often. Having even a small pad greatly reduces the likelihood
+ that nearly every malloc request during program start-up (or
+ after trimming) will invoke sbrk, which needlessly wastes
+ time.
+
+ Automatic rounding-up to page-size units is normally sufficient
+ to avoid measurable overhead, so the default is 0. However, in
+ systems where sbrk is relatively slow, it can pay to increase
+ this value, at the expense of carrying around more memory than
+ the program needs.
+
+*/
+
+#ifndef DEFAULT_TOP_PAD
+#define DEFAULT_TOP_PAD (0)
+#endif
+
+/*
+
+ M_MMAP_THRESHOLD is the request size threshold for using mmap()
+ to service a request. Requests of at least this size that cannot
+ be allocated using already-existing space will be serviced via mmap.
+ (If enough normal freed space already exists it is used instead.)
+
+ Using mmap segregates relatively large chunks of memory so that
+ they can be individually obtained and released from the host
+ system. A request serviced through mmap is never reused by any
+ other request (at least not directly; the system may just so
+ happen to remap successive requests to the same locations).
+
+ Segregating space in this way has the benefit that mmapped space
+ can ALWAYS be individually released back to the system, which
+ helps keep the system level memory demands of a long-lived
+ program low. Mapped memory can never become `locked' between
+ other chunks, as can happen with normally allocated chunks, which
+ means that even trimming via malloc_trim would not release them.
+
+ However, it has the disadvantages that:
+
+ 1. The space cannot be reclaimed, consolidated, and then
+ used to service later requests, as happens with normal chunks.
+ 2. It can lead to more wastage because of mmap page alignment
+ requirements
+ 3. It causes malloc performance to be more dependent on host
+ system memory management support routines which may vary in
+ implementation quality and may impose arbitrary
+ limitations. Generally, servicing a request via normal
+ malloc steps is faster than going through a system's mmap.
+
+ All together, these considerations should lead you to use mmap
+ only for relatively large requests.
+
+*/
+
+
+#ifndef DEFAULT_MMAP_THRESHOLD
+#define DEFAULT_MMAP_THRESHOLD (128 * 1024)
+#endif
+
+/*
+ M_MMAP_MAX is the maximum number of requests to simultaneously
+ service using mmap. This parameter exists because:
+
+ 1. Some systems have a limited number of internal tables for
+ use by mmap.
+ 2. In most systems, overreliance on mmap can degrade overall
+ performance.
+ 3. If a program allocates many large regions, it is probably
+ better off using normal sbrk-based allocation routines that
+ can reclaim and reallocate normal heap memory.
+
+ Setting to 0 disables use of mmap for servicing large requests. If
+ HAVE_MMAP is not set, the default value is 0, and attempts to set it
+ to non-zero values in mallopt will fail.
+*/
+
+
+
+#ifndef DEFAULT_MMAP_MAX
+#if HAVE_MMAP
+#define DEFAULT_MMAP_MAX (256)
+#else
+#define DEFAULT_MMAP_MAX (0)
+#endif
+#endif
+
+
+/*
+ TRIM_FASTBINS controls whether free() of a very small chunk can
+ immediately lead to trimming. Setting to true (1) can reduce memory
+ footprint, but will almost always slow down (by a few percent)
+ programs that use a lot of small chunks.
+
+ Define this only if you are willing to give up some speed to more
+ aggressively reduce system-level memory footprint when releasing
+ memory in programs that use many small chunks. You can get
+ essentially the same effect by setting MXFAST to 0, but this can
+ lead to even greater slowdowns in programs using many small chunks.
+ TRIM_FASTBINS is an in-between compile-time option, that disables
+ only those chunks bordering topmost memory from being placed in
+ fastbins.
+
+*/
+
+
+#ifndef TRIM_FASTBINS
+#define TRIM_FASTBINS 0
+#endif
+
+
+/*
+ MORECORE-related declarations. By default, rely on sbrk
+*/
+
+
+#ifdef LACKS_UNISTD_H
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
+#if __STD_C
+extern Void_t* sbrk(ptrdiff_t);
+#else
+extern Void_t* sbrk();
+#endif
+#endif
+#endif
+
+/*
+ MORECORE is the name of the routine to call to obtain more memory
+ from the system. See below for general guidance on writing
+ alternative MORECORE functions, as well as a version for WIN32 and a
+ sample version for pre-OSX macos.
+*/
+
+#ifndef MORECORE
+#define MORECORE sbrk
+#endif
+
+
+/*
+ MORECORE_FAILURE is the value returned upon failure of MORECORE
+ as well as mmap. Since it cannot be an otherwise valid memory address,
+ and must reflect values of standard sys calls, you probably ought not
+ try to redefine it.
+*/
+
+#ifndef MORECORE_FAILURE
+#define MORECORE_FAILURE (-1)
+#endif
+
+/*
+ If MORECORE_CONTIGUOUS is true, take advantage of fact that
+ consecutive calls to MORECORE with positive arguments always return
+ contiguous increasing addresses. This is true of unix sbrk. Even
+ if not defined, when regions happen to be contiguous, malloc will
+ permit allocations spanning regions obtained from different
+ calls. But defining this when applicable enables some stronger
+ consistency checks and space efficiencies.
+*/
+
+
+#ifndef MORECORE_CONTIGUOUS
+#define MORECORE_CONTIGUOUS 1
+#endif
+
+
+/*
+ The system page size. To the extent possible, this malloc manages
+ memory from the system in page-size units. Note that this value is
+ cached during initialization into a field of malloc_state. So even
+ if malloc_getpagesize is a function, it is only called once.
+
+ The following mechanics for getpagesize were adapted from bsd/gnu
+ getpagesize.h. If none of the system-probes here apply, a value of
+ 4096 is used, which should be OK: If they don't apply, then using
+ the actual value probably doesn't impact performance.
+*/
+
+#ifndef malloc_getpagesize
+
+#ifndef LACKS_UNISTD_H
+# include <unistd.h>
+#endif
+
+# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */
+# ifndef _SC_PAGE_SIZE
+# define _SC_PAGE_SIZE _SC_PAGESIZE
+# endif
+# endif
+
+# ifdef _SC_PAGE_SIZE
+# define malloc_getpagesize sysconf(_SC_PAGE_SIZE)
+# else
+# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
+ extern size_t getpagesize();
+# define malloc_getpagesize getpagesize()
+# else
+# ifdef WIN32 /* use supplied emulation of getpagesize */
+# define malloc_getpagesize getpagesize()
+# else
+# ifndef LACKS_SYS_PARAM_H
+# include <sys/param.h>
+# endif
+# ifdef EXEC_PAGESIZE
+# define malloc_getpagesize EXEC_PAGESIZE
+# else
+# ifdef NBPG
+# ifndef CLSIZE
+# define malloc_getpagesize NBPG
+# else
+# define malloc_getpagesize (NBPG * CLSIZE)
+# endif
+# else
+# ifdef NBPC
+# define malloc_getpagesize NBPC
+# else
+# ifdef PAGESIZE
+# define malloc_getpagesize PAGESIZE
+# else /* just guess */
+# define malloc_getpagesize (4096)
+# endif
+# endif
+# endif
+# endif
+# endif
+# endif
+# endif
+#endif
+
+
+/* Two-phase Name mangling */
+
+#ifndef USE_PUBLIC_MALLOC_WRAPPERS
+#define cALLOc public_cALLOc
+#define fREe public_fREe
+#define cFREe public_cFREe
+#define mALLOc public_mALLOc
+#define mEMALIGn public_mEMALIGn
+#define rEALLOc public_rEALLOc
+#define vALLOc public_vALLOc
+#define pVALLOc public_pVALLOc
+#define mALLINFo public_mALLINFo
+#define mALLOPt public_mALLOPt
+#define mTRIm public_mTRIm
+#define mSTATs public_mSTATs
+#define mUSABLe public_mUSABLe
+#endif
+
+#ifdef USE_DL_PREFIX
+#define public_cALLOc dlcalloc
+#define public_fREe dlfree
+#define public_cFREe dlcfree
+#define public_mALLOc dlmalloc
+#define public_mEMALIGn dlmemalign
+#define public_rEALLOc dlrealloc
+#define public_vALLOc dlvalloc
+#define public_pVALLOc dlpvalloc
+#define public_mALLINFo dlmallinfo
+#define public_mALLOPt dlmallopt
+#define public_mTRIm dlmalloc_trim
+#define public_mSTATs dlmalloc_stats
+#define public_mUSABLe dlmalloc_usable_size
+#else /* USE_DL_PREFIX */
+#define public_cALLOc calloc
+#define public_fREe free
+#define public_cFREe cfree
+#define public_mALLOc malloc
+#define public_mEMALIGn memalign
+#define public_rEALLOc realloc
+#define public_vALLOc valloc
+#define public_pVALLOc pvalloc
+#define public_mALLINFo mallinfo
+#define public_mALLOPt mallopt
+#define public_mTRIm malloc_trim
+#define public_mSTATs malloc_stats
+#define public_mUSABLe malloc_usable_size
+#endif /* USE_DL_PREFIX */
+
+#if __STD_C
+
+Void_t* public_mALLOc(size_t);
+void public_fREe(Void_t*);
+Void_t* public_rEALLOc(Void_t*, size_t);
+Void_t* public_mEMALIGn(size_t, size_t);
+Void_t* public_vALLOc(size_t);
+Void_t* public_pVALLOc(size_t);
+Void_t* public_cALLOc(size_t, size_t);
+void public_cFREe(Void_t*);
+int public_mTRIm(size_t);
+size_t public_mUSABLe(Void_t*);
+void public_mSTATs();
+int public_mALLOPt(int, int);
+struct mallinfo public_mALLINFo(void);
+#else
+Void_t* public_mALLOc();
+void public_fREe();
+Void_t* public_rEALLOc();
+Void_t* public_mEMALIGn();
+Void_t* public_vALLOc();
+Void_t* public_pVALLOc();
+Void_t* public_cALLOc();
+void public_cFREe();
+int public_mTRIm();
+size_t public_mUSABLe();
+void public_mSTATs();
+int public_mALLOPt();
+struct mallinfo public_mALLINFo();
+#endif
+
+
+#ifdef __cplusplus
+}; /* end of extern "C" */
+#endif
+
+
+
+/* ---------- To make a malloc.h, end cutting here ------------ */
+
+
+/* Declarations of internal utilities defined below */
+
+
+
+
+#ifdef USE_PUBLIC_MALLOC_WRAPPERS
+#if __STD_C
+
+static Void_t* mALLOc(size_t);
+static void fREe(Void_t*);
+static Void_t* rEALLOc(Void_t*, size_t);
+static Void_t* mEMALIGn(size_t, size_t);
+static Void_t* vALLOc(size_t);
+static Void_t* pVALLOc(size_t);
+static Void_t* cALLOc(size_t, size_t);
+static void cFREe(Void_t*);
+static int mTRIm(size_t);
+static size_t mUSABLe(Void_t*);
+static void mSTATs();
+static int mALLOPt(int, int);
+static struct mallinfo mALLINFo(void);
+#else
+static Void_t* mALLOc();
+static void fREe();
+static Void_t* rEALLOc();
+static Void_t* mEMALIGn();
+static Void_t* vALLOc();
+static Void_t* pVALLOc();
+static Void_t* cALLOc();
+static void cFREe();
+static int mTRIm();
+static size_t mUSABLe();
+static void mSTATs();
+static int mALLOPt();
+static struct mallinfo mALLINFo();
+#endif
+#endif
+
+
+
+/* ---------- public wrappers --------------- */
+
+#ifdef USE_PUBLIC_MALLOC_WRAPPERS
+
+/*
+ MALLOC_PREACTION and MALLOC_POSTACTION should be
+ defined to return 0 on success, and nonzero on failure.
+ The return value of MALLOC_POSTACTION is currently ignored
+ in wrapper functions since there is no reasonable default
+ action to take on failure.
+*/
+
+
+#ifdef USE_MALLOC_LOCK
+
+#ifdef WIN32
+
+static int mALLOC_MUTEx;
+
+#define MALLOC_PREACTION slwait(&mALLOC_MUTEx)
+#define MALLOC_POSTACTION slrelease(&mALLOC_MUTEx)
+
+#else
+
+#include <pthread.h>
+
+static pthread_mutex_t mALLOC_MUTEx = PTHREAD_MUTEX_INITIALIZER;
+
+#define MALLOC_PREACTION pthread_mutex_lock(&mALLOC_MUTEx)
+#define MALLOC_POSTACTION pthread_mutex_unlock(&mALLOC_MUTEx)
+
+#endif /* USE_MALLOC_LOCK */
+
+#else
+
+/* Substitute anything you like for these */
+
+#define MALLOC_PREACTION (0)
+#define MALLOC_POSTACTION (0)
+
+#endif
+
+Void_t* public_mALLOc(size_t bytes) {
+ Void_t* m;
+ if (MALLOC_PREACTION != 0) {
+ return 0;
+ }
+ m = mALLOc(bytes);
+ if (MALLOC_POSTACTION != 0) {
+ }
+ return m;
+}
+
+void public_fREe(Void_t* m) {
+ if (MALLOC_PREACTION != 0) {
+ return;
+ }
+ fREe(m);
+ if (MALLOC_POSTACTION != 0) {
+ }
+}
+
+Void_t* public_rEALLOc(Void_t* m, size_t bytes) {
+ if (MALLOC_PREACTION != 0) {
+ return 0;
+ }
+ m = rEALLOc(m, bytes);
+ if (MALLOC_POSTACTION != 0) {
+ }
+ return m;
+}
+
+Void_t* public_mEMALIGn(size_t alignment, size_t bytes) {
+ Void_t* m;
+ if (MALLOC_PREACTION != 0) {
+ return 0;
+ }
+ m = mEMALIGn(alignment, bytes);
+ if (MALLOC_POSTACTION != 0) {
+ }
+ return m;
+}
+
+Void_t* public_vALLOc(size_t bytes) {
+ Void_t* m;
+ if (MALLOC_PREACTION != 0) {
+ return 0;
+ }
+ m = vALLOc(bytes);
+ if (MALLOC_POSTACTION != 0) {
+ }
+ return m;
+}
+
+Void_t* public_pVALLOc(size_t bytes) {
+ Void_t* m;
+ if (MALLOC_PREACTION != 0) {
+ return 0;
+ }
+ m = pVALLOc(bytes);
+ if (MALLOC_POSTACTION != 0) {
+ }
+ return m;
+}
+
+Void_t* public_cALLOc(size_t n, size_t elem_size) {
+ Void_t* m;
+ if (MALLOC_PREACTION != 0) {
+ return 0;
+ }
+ m = cALLOc(n, elem_size);
+ if (MALLOC_POSTACTION != 0) {
+ }
+ return m;
+}
+
+void public_cFREe(Void_t* m) {
+ if (MALLOC_PREACTION != 0) {
+ return;
+ }
+ cFREe(m);
+ if (MALLOC_POSTACTION != 0) {
+ }
+}
+
+int public_mTRIm(size_t s) {
+ int result;
+ if (MALLOC_PREACTION != 0) {
+ return 0;
+ }
+ result = mTRIm(s);
+ if (MALLOC_POSTACTION != 0) {
+ }
+ return result;
+}
+
+
+size_t public_mUSABLe(Void_t* m) {
+ size_t result;
+ if (MALLOC_PREACTION != 0) {
+ return 0;
+ }
+ result = mUSABLe(m);
+ if (MALLOC_POSTACTION != 0) {
+ }
+ return result;
+}
+
+
+void public_mSTATs() {
+ if (MALLOC_PREACTION != 0) {
+ return;
+ }
+ mSTATs();
+ if (MALLOC_POSTACTION != 0) {
+ }
+}
+
+struct mallinfo public_mALLINFo() {
+ struct mallinfo m;
+ if (MALLOC_PREACTION != 0) {
+ return m;
+ }
+ m = mALLINFo();
+ if (MALLOC_POSTACTION != 0) {
+ }
+ return m;
+}
+
+int public_mALLOPt(int p, int v) {
+ int result;
+ if (MALLOC_PREACTION != 0) {
+ return 0;
+ }
+ result = mALLOPt(p, v);
+ if (MALLOC_POSTACTION != 0) {
+ }
+ return result;
+}
+
+#endif
+
+
+
+/* ------------- Optional versions of memcopy ---------------- */
+
+
+#if USE_MEMCPY
+
+#define MALLOC_COPY(dest, src, nbytes, overlap) \
+ ((overlap) ? memmove(dest, src, nbytes) : memcpy(dest, src, nbytes))
+#define MALLOC_ZERO(dest, nbytes) memset(dest, 0, nbytes)
+
+#else /* !USE_MEMCPY */
+
+/* Use Duff's device for good zeroing/copying performance. */
+
+#define MALLOC_ZERO(charp, nbytes) \
+do { \
+ INTERNAL_SIZE_T* mzp = (INTERNAL_SIZE_T*)(charp); \
+ long mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T), mcn; \
+ if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp %= 8; } \
+ switch (mctmp) { \
+ case 0: for(;;) { *mzp++ = 0; \
+ case 7: *mzp++ = 0; \
+ case 6: *mzp++ = 0; \
+ case 5: *mzp++ = 0; \
+ case 4: *mzp++ = 0; \
+ case 3: *mzp++ = 0; \
+ case 2: *mzp++ = 0; \
+ case 1: *mzp++ = 0; if(mcn <= 0) break; mcn--; } \
+ } \
+} while(0)
+
+/* For overlapping case, dest is always _below_ src. */
+
+#define MALLOC_COPY(dest,src,nbytes,overlap) \
+do { \
+ INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) src; \
+ INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) dest; \
+ long mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T), mcn; \
+ if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp %= 8; } \
+ switch (mctmp) { \
+ case 0: for(;;) { *mcdst++ = *mcsrc++; \
+ case 7: *mcdst++ = *mcsrc++; \
+ case 6: *mcdst++ = *mcsrc++; \
+ case 5: *mcdst++ = *mcsrc++; \
+ case 4: *mcdst++ = *mcsrc++; \
+ case 3: *mcdst++ = *mcsrc++; \
+ case 2: *mcdst++ = *mcsrc++; \
+ case 1: *mcdst++ = *mcsrc++; if(mcn <= 0) break; mcn--; } \
+ } \
+} while(0)
+
+#endif
+
+/* ------------------ MMAP support ------------------ */
+
+
+#if HAVE_MMAP
+
+#include <fcntl.h>
+#ifndef LACKS_SYS_MMAN_H
+#include <sys/mman.h>
+#endif
+
+#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+
+
+/*
+ Nearly all versions of mmap support MAP_ANONYMOUS,
+ so the following is unlikely to be needed, but is
+ supplied just in case.
+*/
+
+#ifndef MAP_ANONYMOUS
+
+static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
+
+#define MMAP(addr, size, prot, flags) ((dev_zero_fd < 0) ? \
+ (dev_zero_fd = open("/dev/zero", O_RDWR), \
+ mmap((addr), (size), (prot), (flags), dev_zero_fd, 0)) : \
+ mmap((addr), (size), (prot), (flags), dev_zero_fd, 0))
+
+#else
+
+#define MMAP(addr, size, prot, flags) \
+ (mmap((addr), (size), (prot), (flags)|MAP_ANONYMOUS, -1, 0))
+
+#endif
+
+#endif /* HAVE_MMAP */
+
+
+/* ---------- Alternative MORECORE functions ------------ */
+
+
+/*
+ General Requirements for MORECORE.
+
+ The MORECORE function must have the following properties:
+
+ If MORECORE_CONTIGUOUS is false:
+
+ * MORECORE must allocate in multiples of pagesize. It will
+ only be called with arguments that are multiples of pagesize.
+
+ * MORECORE must page-align. That is, MORECORE(0) must
+ return an address at a page boundary.
+
+ else (i.e. If MORECORE_CONTIGUOUS is true):
+
+ * Consecutive calls to MORECORE with positive arguments
+ return increasing addresses, indicating that space has been
+ contiguously extended.
+
+ * MORECORE need not allocate in multiples of pagesize.
+ Calls to MORECORE need not have args of multiples of pagesize.
+
+ * MORECORE need not page-align.
+
+ In either case:
+
+ * MORECORE may allocate more memory than requested. (Or even less,
+ but this will generally result in a malloc failure.)
+
+ * MORECORE must not allocate memory when given argument zero, but
+ instead return one past the end address of memory from previous
+ nonzero call. This malloc does NOT call MORECORE(0)
+ until at least one call with positive arguments is made, so
+ the initial value returned is not important.
+
+ * Even though consecutive calls to MORECORE need not return contiguous
+ addresses, it must be OK for malloc'ed chunks to span multiple
+ regions in those cases where they do happen to be contiguous.
+
+ * MORECORE need not handle negative arguments -- it may instead
+ just return MORECORE_FAILURE when given negative arguments.
+ Negative arguments are always multiples of pagesize. MORECORE
+ must not misinterpret negative args as large positive unsigned
+ args.
+
+ There is some variation across systems about the type of the
+ argument to sbrk/MORECORE. If size_t is unsigned, then it cannot
+ actually be size_t, because sbrk supports negative args, so it is
+ normally the signed type of the same width as size_t (sometimes
+ declared as "intptr_t", and sometimes "ptrdiff_t"). It doesn't much
+ matter though. Internally, we use "long" as arguments, which should
+ work across all reasonable possibilities.
+
+ Additionally, if MORECORE ever returns failure for a positive
+ request, and HAVE_MMAP is true, then mmap is used as a noncontiguous
+ system allocator. This is a useful backup strategy for systems with
+ holes in address spaces -- in this case sbrk cannot contiguously
+ expand the heap, but mmap may be able to map noncontiguous space.
+ If you'd like mmap to ALWAYS be used, you can define MORECORE to be
+ a function that always returns MORECORE_FAILURE.
+
+ If you are using this malloc with something other than unix sbrk to
+ supply memory regions, you probably want to set MORECORE_CONTIGUOUS
+ as false. As an example, here is a custom allocator kindly
+ contributed for pre-OSX macOS. It uses virtually but not
+ necessarily physically contiguous non-paged memory (locked in,
+ present and won't get swapped out). You can use it by uncommenting
+ this section, adding some #includes, and setting up the appropriate
+ defines above:
+
+ #define MORECORE osMoreCore
+ #define MORECORE_CONTIGUOUS 0
+
+ There is also a shutdown routine that should somehow be called for
+ cleanup upon program exit.
+
+ #define MAX_POOL_ENTRIES 100
+ #define MINIMUM_MORECORE_SIZE (64 * 1024)
+ static int next_os_pool;
+ void *our_os_pools[MAX_POOL_ENTRIES];
+
+ void *osMoreCore(int size)
+ {
+ void *ptr = 0;
+ static void *sbrk_top = 0;
+
+ if (size > 0)
+ {
+ if (size < MINIMUM_MORECORE_SIZE)
+ size = MINIMUM_MORECORE_SIZE;
+ if (CurrentExecutionLevel() == kTaskLevel)
+ ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
+ if (ptr == 0)
+ {
+ return (void *) MORECORE_FAILURE;
+ }
+ // save ptrs so they can be freed during cleanup
+ our_os_pools[next_os_pool] = ptr;
+ next_os_pool++;
+ ptr = (void *) ((((unsigned long) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
+ sbrk_top = (char *) ptr + size;
+ return ptr;
+ }
+ else if (size < 0)
+ {
+ // we don't currently support shrink behavior
+ return (void *) MORECORE_FAILURE;
+ }
+ else
+ {
+ return sbrk_top;
+ }
+ }
+
+ // cleanup any allocated memory pools
+ // called as last thing before shutting down driver
+
+ void osCleanupMem(void)
+ {
+ void **ptr;
+
+ for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
+ if (*ptr)
+ {
+ PoolDeallocate(*ptr);
+ *ptr = 0;
+ }
+ }
+
+*/
+
+
+
+
+
+/*
+ ----------------------- Chunk representations -----------------------
+*/
+
+
+/*
+ This struct declaration is misleading (but accurate and necessary).
+ It declares a "view" into memory allowing access to necessary
+ fields at known offsets from a given base. See explanation below.
+*/
+
+struct malloc_chunk {
+
+ INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
+ INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */
+
+ struct malloc_chunk* fd; /* double links -- used only if free. */
+ struct malloc_chunk* bk;
+};
+
+
+typedef struct malloc_chunk* mchunkptr;
+
+/*
+
+ malloc_chunk details:
+
+ (The following includes lightly edited explanations by Colin Plumb.)
+
+ Chunks of memory are maintained using a `boundary tag' method as
+ described in e.g., Knuth or Standish. (See the paper by Paul
+ Wilson ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a
+ survey of such techniques.) Sizes of free chunks are stored both
+ in the front of each chunk and at the end. This makes
+ consolidating fragmented chunks into bigger chunks very fast. The
+ size fields also hold bits representing whether chunks are free or
+ in use.
+
+ An allocated chunk looks like this:
+
+
+ chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of previous chunk, if allocated | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of chunk, in bytes |P|
+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | User data starts here... .
+ . .
+ . (malloc_usable_space() bytes) .
+ . |
+nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of chunk |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+ Where "chunk" is the front of the chunk for the purpose of most of
+ the malloc code, but "mem" is the pointer that is returned to the
+ user. "Nextchunk" is the beginning of the next contiguous chunk.
+
+ Chunks always begin on even word boundries, so the mem portion
+ (which is returned to the user) is also on an even word boundary, and
+ thus double-word aligned.
+
+ Free chunks are stored in circular doubly-linked lists, and look like this:
+
+ chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of previous chunk |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ `head:' | Size of chunk, in bytes |P|
+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Forward pointer to next chunk in list |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Back pointer to previous chunk in list |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Unused space (may be 0 bytes long) .
+ . .
+ . |
+nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ `foot:' | Size of chunk, in bytes |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ The P (PREV_INUSE) bit, stored in the unused low-order bit of the
+ chunk size (which is always a multiple of two words), is an in-use
+ bit for the *previous* chunk. If that bit is *clear*, then the
+ word before the current chunk size contains the previous chunk
+ size, and can be used to find the front of the previous chunk.
+ The very first chunk allocated always has this bit set,
+ preventing access to non-existent (or non-owned) memory. If
+ prev_inuse is set for any given chunk, then you CANNOT determine
+ the size of the previous chunk, and might even get a memory
+ addressing fault when trying to do so.
+
+ Note that the `foot' of the current chunk is actually represented
+ as the prev_size of the NEXT chunk. (This makes it easier to
+ deal with alignments etc).
+
+ The two exceptions to all this are
+
+ 1. The special chunk `top' doesn't bother using the
+ trailing size field since there is no next contiguous chunk
+ that would have to index off it. After initialization, `top'
+ is forced to always exist. If it would become less than
+ MINSIZE bytes long, it is replenished.
+
+ 2. Chunks allocated via mmap, which have the second-lowest-order
+ bit (IS_MMAPPED) set in their size fields. Because they are
+ allocated one-by-one, each must contain its own trailing size field.
+
+*/
+
+
+
+/*
+ Size and alignment checks and conversions
+*/
+
+/* conversion from malloc headers to user pointers, and back */
+
+#define chunk2mem(p) ((Void_t*)((char*)(p) + 2*SIZE_SZ))
+#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - 2*SIZE_SZ))
+
+/* The smallest possible chunk */
+#define MIN_CHUNK_SIZE (sizeof(struct malloc_chunk))
+
+/* The smallest size we can malloc is an aligned minimal chunk */
+
+#define MINSIZE ((MIN_CHUNK_SIZE+MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)
+
+/* Check if m has acceptable alignment */
+
+#define aligned_OK(m) (((unsigned long)((m)) & (MALLOC_ALIGN_MASK)) == 0)
+
+/*
+ Check for negative/huge sizes.
+ This cannot just test for < 0 because argument might
+ be an unsigned type of uncertain width.
+*/
+
+#define IS_NEGATIVE(x) \
+ ((unsigned long)x >= \
+ (unsigned long)((((INTERNAL_SIZE_T)(1)) << ((SIZE_SZ)*8 - 1))))
+
+
+/* pad request bytes into a usable size -- internal version */
+
+#define request2size(req) \
+ (((req) + SIZE_SZ + MALLOC_ALIGN_MASK < MINSIZE) ? \
+ MINSIZE : \
+ ((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)
+
+
+/*
+ Same, except check for negative/huge arguments.
+ This lets through args that are positive but wrap into
+ negatives when padded. However, these are trapped
+ elsewhere.
+*/
+
+#define checked_request2size(req, sz) \
+ if (IS_NEGATIVE(req)) { \
+ MALLOC_FAILURE_ACTION; \
+ return 0; \
+ } \
+ (sz) = request2size(req);
+
+
+
+
+/*
+ Physical chunk operations
+*/
+
+
+/* size field is or'ed with PREV_INUSE when previous adjacent chunk in use */
+
+#define PREV_INUSE 0x1
+
+
+/* size field is or'ed with IS_MMAPPED if the chunk was obtained with mmap() */
+
+#define IS_MMAPPED 0x2
+
+
+/* Bits to mask off when extracting size */
+
+#define SIZE_BITS (PREV_INUSE|IS_MMAPPED)
+
+
+/* Ptr to next physical malloc_chunk. */
+
+#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->size & ~PREV_INUSE) ))
+
+
+/* Ptr to previous physical malloc_chunk */
+
+#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_size) ))
+
+
+/* Treat space at ptr + offset as a chunk */
+
+#define chunk_at_offset(p, s) ((mchunkptr)(((char*)(p)) + (s)))
+
+
+
+
+/*
+ Dealing with use bits
+
+ Note: IS_MMAPPED is intentionally not masked off from size field in
+ macros for which mmapped chunks should never be seen. This should
+ cause helpful core dumps to occur if it is tried by accident by
+ people extending or adapting this malloc.
+
+*/
+
+
+/* extract p's inuse bit */
+
+#define inuse(p)\
+((((mchunkptr)(((char*)(p))+((p)->size & ~PREV_INUSE)))->size) & PREV_INUSE)
+
+
+/* extract inuse bit of previous chunk */
+
+#define prev_inuse(p) ((p)->size & PREV_INUSE)
+
+
+/* check for mmap()'ed chunk */
+
+#define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED)
+
+
+/* set/clear chunk as being inuse without otherwise disturbing */
+
+#define set_inuse(p)\
+((mchunkptr)(((char*)(p)) + ((p)->size & ~PREV_INUSE)))->size |= PREV_INUSE
+
+#define clear_inuse(p)\
+((mchunkptr)(((char*)(p)) + ((p)->size & ~PREV_INUSE)))->size &= ~(PREV_INUSE)
+
+
+/* check/set/clear inuse bits in known places */
+
+#define inuse_bit_at_offset(p, s)\
+ (((mchunkptr)(((char*)(p)) + (s)))->size & PREV_INUSE)
+
+#define set_inuse_bit_at_offset(p, s)\
+ (((mchunkptr)(((char*)(p)) + (s)))->size |= PREV_INUSE)
+
+#define clear_inuse_bit_at_offset(p, s)\
+ (((mchunkptr)(((char*)(p)) + (s)))->size &= ~(PREV_INUSE))
+
+
+
+
+/*
+ Dealing with size fields
+*/
+
+/* Get size, ignoring use bits */
+
+#define chunksize(p) ((p)->size & ~(SIZE_BITS))
+
+/* Set size at head, without disturbing its use bit */
+
+#define set_head_size(p, s) ((p)->size = (((p)->size & PREV_INUSE) | (s)))
+
+/* Set size/use field */
+
+#define set_head(p, s) ((p)->size = (s))
+
+/* Set size at footer (only when chunk is not in use) */
+
+#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_size = (s))
+
+
+
+
+
+/*
+ ------------------ Internal data structures --------------------
+
+ All internal state is held in an instance of malloc_state defined
+ below. There are no other static variables, except in two optional
+ cases:
+ * If USE_MALLOC_LOCK is defined, the mALLOC_MUTEx declared
+ above.
+ * If HAVE_MMAP is true, but mmap doesn't support
+ MAP_ANONYMOUS, a dummy file descriptor for mmap.
+
+ Beware of lots of tricks that minimize the total space
+ requirements. The result is a little over 1K bytes (for 4byte
+ pointers and size_t.)
+
+*/
+
+/*
+
+ Bins
+
+ An array of bin headers for free chunks. Each bin is doubly
+ linked. The bins are approximately proportionally (log) spaced.
+ There are a lot of these bins (128). This may look excessive, but
+ works very well in practice. Most bins hold sizes that are
+ unusual as malloc request sizes, but are more usual for fragments
+ and consolidated sets of chunks, which is what these bins hold, so
+ they can be found quickly. All procedures maintain the invariant
+ that no consolidated chunk physically borders another one, so each
+ chunk in a list is known to be preceeded and followed by either
+ inuse chunks or the ends of memory.
+
+ Chunks in bins are kept in size order, with ties going to the
+ approximately least recently used chunk. Ordering is irrelevant
+ for the small bins, which all contain the same-sized chunks, but
+ facilitates best-fit allocation for larger chunks. (These lists
+ are just sequential. Keeping them in order almost never requires
+ enough traversal to warrant using fancier ordered data
+ structures.) Chunks of the same size are linked with the most
+ recently freed at the front, and allocations are taken from the
+ back. This results in LRU (FIFO) allocation order, which tends
+ to give each chunk an equal opportunity to be consolidated with
+ adjacent freed chunks, resulting in larger free chunks and less
+ fragmentation.
+
+ To simplify use in double-linked lists, each bin header acts
+ as a malloc_chunk. This avoids special-casing for headers.
+ But to conserve space and (mainly) improve locality, we allocate
+ only the fd/bk pointers of bins, and then use repositioning tricks
+ to treat these as the fields of a malloc_chunk*.
+*/
+
+typedef struct malloc_chunk* mbinptr;
+
+#define NBINS 128
+
+
+/* addressing -- note that bin_at(0) does not exist */
+
+#define bin_at(m, i) ((mbinptr)((char*)&((m)->bins[(i)<<1]) - (SIZE_SZ<<1)))
+
+
+/* analog of ++bin */
+
+#define next_bin(b) ((mbinptr)((char*)(b) + (sizeof(mchunkptr)<<1)))
+
+
+/* Reminders about list directionality within bins */
+
+#define first(b) ((b)->fd)
+#define last(b) ((b)->bk)
+
+/*
+ Take a chunk off a bin list
+*/
+
+#define unlink(P, BK, FD) { \
+ FD = P->fd; \
+ BK = P->bk; \
+ FD->bk = BK; \
+ BK->fd = FD; \
+}
+
+/*
+ Indexing bins
+
+ Bins for sizes < 512 bytes contain chunks of all the same size, spaced
+ 8 bytes apart. Larger bins are approximately logarithmically spaced:
+
+ 64 bins of size 8
+ 32 bins of size 64
+ 16 bins of size 512
+ 8 bins of size 4096
+ 4 bins of size 32768
+ 2 bins of size 262144
+ 1 bin of size what's left
+
+ There is actually a little bit of slop in the numbers in bin_index
+ for the sake of speed. This makes no difference elsewhere.
+
+ The bins top out at around 1mb because we expect to service large
+ chunks via mmap.
+
+*/
+
+/* The first NSMALLBIN bins (and fastbins) hold only one size */
+#define NSMALLBINS 64
+#define SMALLBIN_WIDTH 8
+#define MIN_LARGE_SIZE 512
+
+#define in_smallbin_range(sz) ((sz) < MIN_LARGE_SIZE)
+
+#define smallbin_index(sz) (((unsigned)(sz)) >> 3)
+
+#define largebin_index(sz) \
+(((((unsigned long)(sz)) >> 6) <= 32)? 56 + (((unsigned long)(sz)) >> 6): \
+ ((((unsigned long)(sz)) >> 9) <= 20)? 91 + (((unsigned long)(sz)) >> 9): \
+ ((((unsigned long)(sz)) >> 12) <= 10)? 110 + (((unsigned long)(sz)) >> 12): \
+ ((((unsigned long)(sz)) >> 15) <= 4)? 119 + (((unsigned long)(sz)) >> 15): \
+ ((((unsigned long)(sz)) >> 18) <= 2)? 124 + (((unsigned long)(sz)) >> 18): \
+ 126)
+
+#define bin_index(sz) \
+ ((in_smallbin_range(sz)) ? smallbin_index(sz) : largebin_index(sz))
+
+
+/*
+ Unsorted chunks
+
+ All remainders from chunk splits, as well as all returned chunks,
+ are first placed in the "unsorted" bin. They are then placed
+ in regular bins after malloc gives them ONE chance to be used before
+ binning. So, basically, the unsorted_chunks list acts as a queue,
+ with chunks being placed on it in free (and malloc_consolidate),
+ and taken off (to be either used or placed in bins) in malloc.
+
+*/
+
+
+/* The otherwise unindexable 1-bin is used to hold unsorted chunks. */
+
+#define unsorted_chunks(M) (bin_at(M, 1))
+
+
+/*
+ Top
+
+ The top-most available chunk (i.e., the one bordering the end of
+ available memory) is treated specially. It is never included in
+ any bin, is used only if no other chunk is available, and is
+ released back to the system if it is very large (see
+ M_TRIM_THRESHOLD). `top' is never properly linked to its bin
+ since it is always handled specially. Because top initially
+ points to its own bin with initial zero size, thus forcing
+ extension on the first malloc request, we avoid having any special
+ code in malloc to check whether it even exists yet. But we still
+ need to do so when getting memory from system, so we make
+ initial_top treat the bin as a legal but unusable chunk during the
+ interval between initialization and the first call to
+ sYSMALLOc. (This is somewhat delicate, since it relies on
+ the 2 preceding words to be zero during this interval as well.)
+*/
+
+
+/* Conveniently, the unsorted bin can be used as dummy top on first call */
+#define initial_top(M) (unsorted_chunks(M))
+
+/*
+ Binmap
+
+ To help compensate for the large number of bins, a one-level index
+ structure is used for bin-by-bin searching. `binmap' is a
+ bitvector recording whether bins are definitely empty so they can
+ be skipped over during during traversals. The bits are NOT always
+ cleared as soon as bins are empty, but instead only
+ when they are noticed to be empty during traversal in malloc.
+
+*/
+
+/* Conservatively use 32 bits per map word, even if on 64bit system */
+#define BINMAPSHIFT 5
+#define BITSPERMAP (1U << BINMAPSHIFT)
+#define BINMAPSIZE (NBINS / BITSPERMAP)
+
+#define idx2block(i) ((i) >> BINMAPSHIFT)
+#define idx2bit(i) ((1U << ((i) & ((1U << BINMAPSHIFT)-1))))
+
+#define mark_bin(m,i) ((m)->binmap[idx2block(i)] |= idx2bit(i))
+#define unmark_bin(m,i) ((m)->binmap[idx2block(i)] &= ~(idx2bit(i)))
+#define get_binmap(m,i) ((m)->binmap[idx2block(i)] & idx2bit(i))
+
+
+/*
+ Fastbins
+
+ An array of lists holding recently freed small chunks. Fastbins
+ are not doubly linked. It is faster to single-link them, and
+ since chunks are never removed from the middles of these lists,
+ double linking is not necessary.
+
+ Chunks in fastbins keep their inuse bit set, so they cannot
+ be consolidated with other free chunks. malloc_consolidate
+ releases all chunks in fastbins and consolidates them with
+ other free chunks.
+*/
+
+typedef struct malloc_chunk* mfastbinptr;
+
+/* offset 2 to use otherwise unindexable first 2 bins */
+#define fastbin_index(sz) ((((unsigned int)(sz)) >> 3) - 2)
+
+/* The maximum fastbin request size we support */
+#define MAX_FAST_SIZE 80
+
+#define NFASTBINS (fastbin_index(request2size(MAX_FAST_SIZE))+1)
+
+
+
+/*
+ Flag bit held in max_fast indicating that there probably are some
+ fastbin chunks . It is set true on entering a chunk into any fastbin,
+ and cleared only in malloc_consolidate.
+
+ The truth value is inverted so that have_fastchunks will be true
+ upon startup (since statics are zero-filled).
+*/
+
+
+#define have_fastchunks(M) (((M)->max_fast & 1U) == 0)
+#define clear_fastchunks(M) ((M)->max_fast |= 1U)
+#define set_fastchunks(M) ((M)->max_fast &= ~1U)
+
+/*
+ Initialization value of max_fast.
+ Use impossibly small value if 0.
+ Value also has flag bit clear.
+*/
+#define req2max_fast(s) (((((s) == 0)? SMALLBIN_WIDTH: request2size(s))) | 1U)
+
+
+/*
+ NONCONTIGUOUS_REGIONS is a special value for sbrk_base indicating that
+ MORECORE does not return contiguous regions. In this case, we do not check
+ or assume that the address of each chunk is at least sbrk_base. Otherwise,
+ contiguity is exploited in merging together, when possible, results
+ from consecutive MORECORE calls.
+
+ The possible values for sbrk_base are:
+ MORECORE_FAILURE:
+ MORECORE has not yet been called, but we expect contiguous space
+ NONCONTIGUOUS_REGIONS:
+ we don't expect or rely on contiguous space
+ any other legal address:
+ the first address returned by MORECORE when contiguous
+*/
+
+#define NONCONTIGUOUS_REGIONS ((char*)(-3))
+
+
+/*
+ ----------- Internal state representation and initialization -----------
+*/
+
+
+struct malloc_state {
+
+ /* The maximum chunk size to be eligible for fastbin */
+ INTERNAL_SIZE_T max_fast; /* low bit used as fastbin flag */
+
+ /* Base of the topmost chunk -- not otherwise kept in a bin */
+ mchunkptr top;
+
+ /* The remainder from the most recent split of a small request */
+ mchunkptr last_remainder;
+
+ /* Fastbins */
+ mfastbinptr fastbins[NFASTBINS];
+
+ /* Normal bins packed as described above */
+ mchunkptr bins[NBINS * 2];
+
+ /* Bitmap of bins */
+ unsigned int binmap[BINMAPSIZE];
+
+ /* Tunable parameters */
+ unsigned long trim_threshold;
+ INTERNAL_SIZE_T top_pad;
+ INTERNAL_SIZE_T mmap_threshold;
+
+ /* Memory map support */
+ int n_mmaps;
+ int n_mmaps_max;
+ int max_n_mmaps;
+
+ /* Bookkeeping for sbrk */
+ unsigned int pagesize; /* Cache malloc_getpagesize */
+ char* sbrk_base; /* first address returned by sbrk,
+ or NONCONTIGUOUS_REGIONS */
+ /* Statistics */
+
+ INTERNAL_SIZE_T mmapped_mem;
+ INTERNAL_SIZE_T sbrked_mem;
+
+ INTERNAL_SIZE_T max_sbrked_mem;
+ INTERNAL_SIZE_T max_mmapped_mem;
+ INTERNAL_SIZE_T max_total_mem;
+};
+
+typedef struct malloc_state *mstate;
+
+/*
+ There is exactly one instance of this struct in this malloc.
+
+ If you are adapting this malloc in a way that does NOT use a static
+ malloc_state, you MUST explicitly zero-fill it before using. This
+ malloc relies on the property that malloc_state is initialized to
+ all zeroes (as is true of C statics).
+
+*/
+
+static struct malloc_state av_; /* never directly referenced */
+
+/*
+ All uses of av_ are via get_malloc_state().
+ This simplifies construction of multithreaded, etc extensions.
+
+ At most one call to get_malloc_state is made per invocation of
+ the public versions of malloc, free, and all other routines
+ except realloc, valloc, and vpalloc. Also, it is called
+ in check* routines if DEBUG is set.
+*/
+
+#define get_malloc_state() (&(av_))
+
+/*
+ Initialize a malloc_state struct.
+
+ This is called only from within malloc_consolidate, which needs
+ be called in the same contexts anyway. It is never called directly
+ outside of malloc_consolidate because some optimizing compilers try
+ to inline it at all call points, which turns out not to be an
+ optimization at all. (Inlining it only in malloc_consolidate is fine though.)
+*/
+
+#if __STD_C
+static void malloc_init_state(mstate av)
+#else
+static void malloc_init_state(av) mstate av;
+#endif
+{
+ int i;
+ mbinptr bin;
+
+
+ /* Uncomment this if you are not using a static av */
+ /* MALLOC_ZERO(av, sizeof(struct malloc_state); */
+
+ /* Establish circular links for normal bins */
+ for (i = 1; i < NBINS; ++i) {
+ bin = bin_at(av,i);
+ bin->fd = bin->bk = bin;
+ }
+
+ av->max_fast = req2max_fast(DEFAULT_MXFAST);
+
+ av->top_pad = DEFAULT_TOP_PAD;
+ av->n_mmaps_max = DEFAULT_MMAP_MAX;
+ av->mmap_threshold = DEFAULT_MMAP_THRESHOLD;
+
+#if MORECORE_CONTIGUOUS
+ av->trim_threshold = DEFAULT_TRIM_THRESHOLD;
+ av->sbrk_base = (char*)MORECORE_FAILURE;
+#else
+ av->trim_threshold = (unsigned long)(-1);
+ av->sbrk_base = NONCONTIGUOUS_REGIONS;
+#endif
+
+ av->top = initial_top(av);
+ av->pagesize = malloc_getpagesize;
+}
+
+/*
+ Other internal utilities operating on mstates
+*/
+
+#if __STD_C
+static Void_t* sYSMALLOc(INTERNAL_SIZE_T, mstate);
+static int sYSTRIm(size_t, mstate);
+static void malloc_consolidate(mstate);
+#else
+static Void_t* sYSMALLOc();
+static int sYSTRIm();
+static void malloc_consolidate();
+#endif
+
+
+/*
+ Debugging support
+
+ These routines make a number of assertions about the states
+ of data structures that should be true at all times. If any
+ are not true, it's very likely that a user program has somehow
+ trashed memory. (It's also possible that there is a coding error
+ in malloc. In which case, please report it!)
+
+*/
+
+#if ! DEBUG
+
+#define check_chunk(P)
+#define check_free_chunk(P)
+#define check_inuse_chunk(P)
+#define check_remalloced_chunk(P,N)
+#define check_malloced_chunk(P,N)
+#define check_malloc_state()
+
+#else
+#define check_chunk(P) do_check_chunk(P)
+#define check_free_chunk(P) do_check_free_chunk(P)
+#define check_inuse_chunk(P) do_check_inuse_chunk(P)
+#define check_remalloced_chunk(P,N) do_check_remalloced_chunk(P,N)
+#define check_malloced_chunk(P,N) do_check_malloced_chunk(P,N)
+#define check_malloc_state() do_check_malloc_state()
+
+
+/*
+ Properties of all chunks
+*/
+
+#if __STD_C
+static void do_check_chunk(mchunkptr p)
+#else
+static void do_check_chunk(p) mchunkptr p;
+#endif
+{
+
+ mstate av = get_malloc_state();
+ unsigned long sz = chunksize(p);
+
+ if (!chunk_is_mmapped(p)) {
+
+ /* Has legal address ... */
+ if (av->sbrk_base != NONCONTIGUOUS_REGIONS) {
+ assert(((char*)p) >= ((char*)(av->sbrk_base)));
+ }
+
+ if (p != av->top) {
+ if (av->sbrk_base != NONCONTIGUOUS_REGIONS) {
+ assert(((char*)p + sz) <= ((char*)(av->top)));
+ }
+ }
+ else {
+ if (av->sbrk_base != NONCONTIGUOUS_REGIONS) {
+ assert(((char*)p + sz) <= ((char*)(av->sbrk_base) + av->sbrked_mem));
+ }
+ /* top size is always at least MINSIZE */
+ assert((long)(sz) >= (long)(MINSIZE));
+ /* top predecessor always marked inuse */
+ assert(prev_inuse(p));
+ }
+
+ }
+ else {
+#if HAVE_MMAP
+ /* address is outside main heap */
+ /* unless mmap has been used as sbrk backup */
+ if (av->sbrk_base != NONCONTIGUOUS_REGIONS) {
+ assert(! (((char*)p) >= ((char*)av->sbrk_base) &&
+ ((char*)p) < ((char*)(av->sbrk_base) + av->sbrked_mem)));
+ }
+ /* chunk is page-aligned */
+ assert(((p->prev_size + sz) & (av->pagesize-1)) == 0);
+ /* mem is aligned */
+ assert(aligned_OK(chunk2mem(p)));
+#else
+ /* force an appropriate assert violation if debug set */
+ assert(!chunk_is_mmapped(p));
+#endif
+ }
+
+}
+
+/*
+ Properties of free chunks
+*/
+
+
+#if __STD_C
+static void do_check_free_chunk(mchunkptr p)
+#else
+static void do_check_free_chunk(p) mchunkptr p;
+#endif
+{
+ mstate av = get_malloc_state();
+
+ INTERNAL_SIZE_T sz = p->size & ~PREV_INUSE;
+ mchunkptr next = chunk_at_offset(p, sz);
+
+ do_check_chunk(p);
+
+ /* Chunk must claim to be free ... */
+ assert(!inuse(p));
+ assert (!chunk_is_mmapped(p));
+
+ /* Unless a special marker, must have OK fields */
+ if ((unsigned long)sz >= (unsigned long)MINSIZE)
+ {
+ assert((sz & MALLOC_ALIGN_MASK) == 0);
+ assert(aligned_OK(chunk2mem(p)));
+ /* ... matching footer field */
+ assert(next->prev_size == sz);
+ /* ... and is fully consolidated */
+ assert(prev_inuse(p));
+ assert (next == av->top || inuse(next));
+
+ /* ... and has minimally sane links */
+ assert(p->fd->bk == p);
+ assert(p->bk->fd == p);
+ }
+ else /* markers are always of size SIZE_SZ */
+ assert(sz == SIZE_SZ);
+}
+
+/*
+ Properties of inuse chunks
+*/
+
+
+#if __STD_C
+static void do_check_inuse_chunk(mchunkptr p)
+#else
+static void do_check_inuse_chunk(p) mchunkptr p;
+#endif
+{
+ mstate av = get_malloc_state();
+ mchunkptr next;
+ do_check_chunk(p);
+
+ if (chunk_is_mmapped(p))
+ return; /* mmapped chunks have no next/prev */
+
+ /* Check whether it claims to be in use ... */
+ assert(inuse(p));
+
+ next = next_chunk(p);
+
+ /* ... and is surrounded by OK chunks.
+ Since more things can be checked with free chunks than inuse ones,
+ if an inuse chunk borders them and debug is on, it's worth doing them.
+ */
+ if (!prev_inuse(p)) {
+ /* Note that we cannot even look at prev unless it is not inuse */
+ mchunkptr prv = prev_chunk(p);
+ assert(next_chunk(prv) == p);
+ do_check_free_chunk(prv);
+ }
+
+ if (next == av->top) {
+ assert(prev_inuse(next));
+ assert(chunksize(next) >= MINSIZE);
+ }
+ else if (!inuse(next))
+ do_check_free_chunk(next);
+
+}
+
+/*
+ Properties of chunks recycled from fastbins
+*/
+
+#if __STD_C
+static void do_check_remalloced_chunk(mchunkptr p, INTERNAL_SIZE_T s)
+#else
+static void do_check_remalloced_chunk(p, s) mchunkptr p; INTERNAL_SIZE_T s;
+#endif
+{
+
+ INTERNAL_SIZE_T sz = p->size & ~PREV_INUSE;
+
+ do_check_inuse_chunk(p);
+
+ /* Legal size ... */
+ assert((sz & MALLOC_ALIGN_MASK) == 0);
+ assert((long)sz - (long)MINSIZE >= 0);
+ assert((long)sz - (long)s >= 0);
+ assert((long)sz - (long)(s + MINSIZE) < 0);
+
+ /* ... and alignment */
+ assert(aligned_OK(chunk2mem(p)));
+
+}
+
+/*
+ Properties of nonrecycled chunks at the point they are malloced
+*/
+
+#if __STD_C
+static void do_check_malloced_chunk(mchunkptr p, INTERNAL_SIZE_T s)
+#else
+static void do_check_malloced_chunk(p, s) mchunkptr p; INTERNAL_SIZE_T s;
+#endif
+{
+ /* same as recycled case ... */
+ do_check_remalloced_chunk(p, s);
+
+ /*
+ ... plus, must obey implementation invariant that prev_inuse is
+ always true of any allocated chunk; i.e., that each allocated
+ chunk borders either a previously allocated and still in-use
+ chunk, or the base of its memory arena. This is ensured
+ by making all allocations from the the `lowest' part of any found
+ chunk. This does not necessarily hold however for chunks
+ recycled via fastbins.
+ */
+
+ assert(prev_inuse(p));
+}
+
+
+/*
+ Properties of malloc_state.
+
+ This may be useful for debugging malloc, as well as detecting user
+ programmer errors that somehow write into malloc_state.
+*/
+
+static void do_check_malloc_state()
+{
+ mstate av = get_malloc_state();
+ int i;
+ mchunkptr p;
+ mchunkptr q;
+ mbinptr b;
+ unsigned int biton;
+ int empty;
+ unsigned int idx;
+ INTERNAL_SIZE_T size;
+ unsigned long total = 0;
+ int max_fast_bin;
+
+
+ /* internal size_t must be no wider than pointer type */
+ assert(sizeof(INTERNAL_SIZE_T) <= sizeof(char*));
+
+ /* alignment is a power of 2 */
+ assert((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-1)) == 0);
+
+ /* cannot run remaining checks until fully initialized */
+ if (av->top == 0 || av->top == initial_top(av))
+ return;
+
+ /* pagesize is a power of 2 */
+ assert((av->pagesize & (av->pagesize-1)) == 0);
+
+ /* properties of fastbins */
+
+ /* max_fast is in allowed range */
+
+ assert((av->max_fast & ~1) <= request2size(MAX_FAST_SIZE));
+
+ max_fast_bin = fastbin_index(av->max_fast);
+
+ for (i = 0; i < NFASTBINS; ++i) {
+ p = av->fastbins[i];
+
+ /* all bins past max_fast are empty */
+ if (i > max_fast_bin)
+ assert(p == 0);
+
+ while (p != 0) {
+ /* each chunk claims to be inuse */
+ do_check_inuse_chunk(p);
+ total += chunksize(p);
+ /* chunk belongs in this bin */
+ assert(fastbin_index(chunksize(p)) == i);
+ p = p->fd;
+ }
+ }
+
+ if (total != 0)
+ assert(have_fastchunks(av));
+
+ /* check normal bins */
+ for (i = 1; i < NBINS; ++i) {
+ b = bin_at(av,i);
+
+ /* binmap is accurate (except for bin 1 == unsorted_chunks) */
+ if (i >= 2) {
+ biton = get_binmap(av,i);
+ empty = last(b) == b;
+ if (!biton)
+ assert(empty);
+ else if (!empty)
+ assert(biton);
+ }
+
+ for (p = last(b); p != b; p = p->bk) {
+ /* each chunk claims to be free */
+ do_check_free_chunk(p);
+ size = chunksize(p);
+ total += size;
+ if (i >= 2) {
+ /* chunk belongs in bin */
+ idx = bin_index(size);
+ assert(idx == i);
+ /* lists are sorted */
+ assert(p->bk == b || chunksize(p->bk) >= chunksize(p));
+ }
+ /* chunk is followed by a legal chain of inuse chunks */
+ for (q = next_chunk(p);
+ q != av->top && inuse(q) && (long)(chunksize(q)) >= (long)MINSIZE;
+ q = next_chunk(q))
+ do_check_inuse_chunk(q);
+
+ }
+ }
+
+ /* top chunk is OK */
+ check_chunk(av->top);
+
+ /* sanity checks for statistics */
+
+ assert(total <= (unsigned long)(av->max_total_mem));
+ assert(av->n_mmaps >= 0);
+ assert(av->n_mmaps <= av->n_mmaps_max);
+ assert(av->n_mmaps <= av->max_n_mmaps);
+ assert(av->max_n_mmaps <= av->n_mmaps_max);
+
+ assert((unsigned long)(av->sbrked_mem) <=
+ (unsigned long)(av->max_sbrked_mem));
+
+ assert((unsigned long)(av->mmapped_mem) <=
+ (unsigned long)(av->max_mmapped_mem));
+
+ assert((unsigned long)(av->max_total_mem) >=
+ (unsigned long)(av->mmapped_mem) + (unsigned long)(av->sbrked_mem));
+
+}
+
+
+#endif
+
+
+
+
+
+/* ----------- Routines dealing with system allocation -------------- */
+
+/*
+ Handle malloc cases requiring more memory from system.
+ malloc relays to sYSMALLOc if it cannot allocate out of
+ existing memory.
+
+ On entry, it is assumed that av->top does not have enough
+ space to service request for nb bytes, thus requiring more meory
+ from system.
+*/
+
+#if __STD_C
+static Void_t* sYSMALLOc(INTERNAL_SIZE_T nb, mstate av)
+#else
+static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
+#endif
+{
+ mchunkptr old_top; /* incoming value of av->top */
+ INTERNAL_SIZE_T old_size; /* its size */
+ char* old_end; /* its end address */
+
+ long size; /* arg to first MORECORE or mmap call */
+ char* brk; /* return value from MORECORE */
+ char* mm; /* return value from mmap call*/
+
+ long correction; /* arg to 2nd MORECORE call */
+ char* snd_brk; /* 2nd return val */
+
+ INTERNAL_SIZE_T front_misalign; /* unusable bytes at front of new space */
+ INTERNAL_SIZE_T end_misalign; /* partial page left at end of new space */
+ char* aligned_brk; /* aligned offset into brk */
+
+ mchunkptr p; /* the allocated/returned chunk */
+ mchunkptr remainder; /* remainder from allocation */
+ long remainder_size; /* its size */
+
+ unsigned long sum; /* for updating stats */
+
+ size_t pagemask = av->pagesize - 1;
+
+ /*
+ If have mmap, and the request size meets the mmap threshold, and
+ the system supports mmap, and there are few enough currently
+ allocated mmapped regions, and a call to mmap succeeds, try to
+ directly map this request rather than expanding top.
+ */
+
+#if HAVE_MMAP
+ if ((unsigned long)nb >= (unsigned long)(av->mmap_threshold) &&
+ (av->n_mmaps < av->n_mmaps_max)) {
+
+ /*
+ Round up size to nearest page. For mmapped chunks, the overhead
+ is one SIZE_SZ unit larger than for normal chunks, because there
+ is no following chunk whose prev_size field could be used.
+ */
+ size = (nb + SIZE_SZ + MALLOC_ALIGN_MASK + pagemask) & ~pagemask;
+
+ mm = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
+
+ if (mm != (char*)(MORECORE_FAILURE)) {
+
+ /*
+ The offset to the start of the mmapped region is stored
+ in the prev_size field of the chunk. This allows us to adjust
+ returned start address to meet alignment requirements here
+ and in memalign(), and still be able to compute proper
+ address argument for later munmap in free() and realloc().
+ */
+
+ front_misalign = (INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK;
+ if (front_misalign > 0) {
+ correction = MALLOC_ALIGNMENT - front_misalign;
+ p = (mchunkptr)(mm + correction);
+ p->prev_size = correction;
+ set_head(p, (size - correction) |IS_MMAPPED);
+ }
+ else {
+ p = (mchunkptr)mm;
+ set_head(p, size|IS_MMAPPED);
+ }
+
+ check_chunk(p);
+
+ /* update statistics */
+
+ if (++av->n_mmaps > av->max_n_mmaps)
+ av->max_n_mmaps = av->n_mmaps;
+
+ sum = av->mmapped_mem += size;
+ if (sum > (unsigned long)(av->max_mmapped_mem))
+ av->max_mmapped_mem = sum;
+ sum += av->sbrked_mem;
+ if (sum > (unsigned long)(av->max_total_mem))
+ av->max_total_mem = sum;
+
+ return chunk2mem(p);
+ }
+ }
+#endif
+
+ /* record incoming configuration of top */
+
+ old_top = av->top;
+ old_size = chunksize(old_top);
+ old_end = (char*)(chunk_at_offset(old_top, old_size));
+
+ brk = snd_brk = (char*)(MORECORE_FAILURE);
+
+ /*
+ If not the first time through, we require old_size to be
+ at least MINSIZE and to have prev_inuse set.
+ */
+
+ assert(old_top == initial_top(av) ||
+ ((unsigned long) (old_size) >= (unsigned long)(MINSIZE) &&
+ prev_inuse(old_top)));
+
+
+ /* Request enough space for nb + pad + overhead */
+
+ size = nb + av->top_pad + MINSIZE;
+
+ /*
+ If contiguous, we can subtract out existing space that we hope to
+ combine with new space. We add it back later only if
+ we don't actually get contiguous space.
+ */
+
+ if (av->sbrk_base != NONCONTIGUOUS_REGIONS)
+ size -= old_size;
+
+ /*
+ Round to a multiple of page size.
+ If MORECORE is not contiguous, this ensures that we only call it
+ with whole-page arguments. And if MORECORE is contiguous and
+ this is not first time through, this preserves page-alignment of
+ previous calls. Otherwise, we re-correct anyway to page-align below.
+ */
+
+ size = (size + pagemask) & ~pagemask;
+
+ /*
+ Don't try to call MORECORE if argument is so big as to appear
+ negative. Note that since mmap takes size_t arg, it may succeed
+ below even if we cannot call MORECORE.
+ */
+
+ if (size > 0)
+ brk = (char*)(MORECORE(size));
+
+ /*
+ If have mmap, try using it as a backup when MORECORE fails. This
+ is worth doing on systems that have "holes" in address space, so
+ sbrk cannot extend to give contiguous space, but space is available
+ elsewhere. Note that we ignore mmap max count and threshold limits,
+ since there is no reason to artificially limit use here.
+ */
+
+#if HAVE_MMAP
+ if (brk == (char*)(MORECORE_FAILURE)) {
+
+ /* Cannot merge with old top, so add its size back in */
+
+ if (av->sbrk_base != NONCONTIGUOUS_REGIONS)
+ size = (size + old_size + pagemask) & ~pagemask;
+
+ /* If we are relying on mmap as backup, then use larger units */
+
+ if ((unsigned long)size < (unsigned long)MMAP_AS_MORECORE_SIZE)
+ size = MMAP_AS_MORECORE_SIZE;
+
+ brk = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
+
+ if (brk != (char*)(MORECORE_FAILURE)) {
+
+ /* We do not need, and cannot use, another sbrk call to find end */
+ snd_brk = brk + size;
+
+ /*
+ Record that we no longer have a contiguous sbrk region.
+ After the first time mmap is used as backup, we cannot
+ ever rely on contiguous space.
+ */
+ av->sbrk_base = NONCONTIGUOUS_REGIONS;
+ }
+ }
+#endif
+
+ if (brk != (char*)(MORECORE_FAILURE)) {
+
+ av->sbrked_mem += size;
+
+ /*
+ If MORECORE extends previous space, we can likewise extend top size.
+ */
+
+ if (brk == old_end && snd_brk == (char*)(MORECORE_FAILURE)) {
+ set_head(old_top, (size + old_size) | PREV_INUSE);
+ }
+
+ /*
+ Otherwise, make adjustments guided by the special values of
+ av->sbrk_base (MORECORE_FAILURE or NONCONTIGUOUS_REGIONS):
+
+ * If the first time through or noncontiguous, we need to call sbrk
+ just to find out where the end of memory lies.
+
+ * We need to ensure that all returned chunks from malloc will meet
+ MALLOC_ALIGNMENT
+
+ * If there was an intervening foreign sbrk, we need to adjust sbrk
+ request size to account for fact that we will not be able to
+ combine new space with existing space in old_top.
+
+ * Almost all systems internally allocate whole pages at a time, in
+ which case we might as well use the whole last page of request.
+ So we allocate enough more memory to hit a page boundary now,
+ which in turn causes future contiguous calls to page-align.
+
+ */
+
+ else {
+ front_misalign = 0;
+ end_misalign = 0;
+ correction = 0;
+ aligned_brk = brk;
+
+ /* handle contiguous cases */
+ if (av->sbrk_base != NONCONTIGUOUS_REGIONS) {
+
+ /* Guarantee alignment of first new chunk made from this space */
+
+ front_misalign = (INTERNAL_SIZE_T)chunk2mem(brk) & MALLOC_ALIGN_MASK;
+ if (front_misalign > 0) {
+
+ /*
+ Skip over some bytes to arrive at an aligned position.
+ We don't need to specially mark these wasted front bytes.
+ They will never be accessed anyway because
+ prev_inuse of av->top (and any chunk created from its start)
+ is always true after initialization.
+ */
+
+ correction = MALLOC_ALIGNMENT - front_misalign;
+ aligned_brk += correction;
+ }
+
+ /*
+ If this isn't adjacent to a previous sbrk, then we will not
+ be able to merge with old_top space, so must add to 2nd request.
+ */
+
+ correction += old_size;
+
+ /* Pad out to hit a page boundary */
+
+ end_misalign = (INTERNAL_SIZE_T)(brk + size + correction);
+ correction += ((end_misalign + pagemask) & ~pagemask) - end_misalign;
+
+ assert(correction >= 0);
+
+ snd_brk = (char*)(MORECORE(correction));
+
+ /*
+ If can't allocate correction, try to at least find out current
+ brk. It might be enough to proceed without failing.
+
+ Note that if second sbrk did NOT fail, we assume that space
+ is contiguous with first sbrk. This is a safe assumption unless
+ program is multithreaded but doesn't use locks and a foreign sbrk
+ occurred between our first and second calls.
+ */
+
+ if (snd_brk == (char*)(MORECORE_FAILURE)) {
+ correction = 0;
+ snd_brk = (char*)(MORECORE(0));
+ }
+ }
+
+ /* handle non-contiguous cases */
+ else {
+
+ /* MORECORE/mmap must correctly align etc */
+ assert(((unsigned long)chunk2mem(brk) & MALLOC_ALIGN_MASK) == 0);
+
+ /* Find out current end of memory */
+ if (snd_brk == (char*)(MORECORE_FAILURE)) {
+ snd_brk = (char*)(MORECORE(0));
+ }
+
+ /* This must lie on a page boundary */
+ if (snd_brk != (char*)(MORECORE_FAILURE)) {
+ assert(((INTERNAL_SIZE_T)(snd_brk) & pagemask) == 0);
+ }
+ }
+
+ /* Adjust top based on results of second sbrk */
+ if (snd_brk != (char*)(MORECORE_FAILURE)) {
+
+ av->top = (mchunkptr)aligned_brk;
+ set_head(av->top, (snd_brk - aligned_brk + correction) | PREV_INUSE);
+
+ av->sbrked_mem += correction;
+
+ /* If first time through and contiguous, record base */
+ if (old_top == initial_top(av)) {
+ if (av->sbrk_base == (char*)(MORECORE_FAILURE))
+ av->sbrk_base = brk;
+ }
+
+ /*
+ Otherwise, we either have a gap due to foreign sbrk or a
+ non-contiguous region. Insert a double fencepost at old_top
+ to prevent consolidation with space we don't own. These
+ fenceposts are artificial chunks that are marked as inuse
+ and are in any case too small to use. We need two to make
+ sizes and alignments work out.
+ */
+
+ else {
+
+ /*
+ Shrink old_top to insert fenceposts, keeping size a
+ multiple of MALLOC_ALIGNMENT.
+ */
+ old_size = (old_size - 3*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
+ set_head(old_top, old_size | PREV_INUSE);
+
+ /*
+ Note that the following assignments overwrite old_top when
+ old_size was previously MINSIZE. This is intentional. We
+ need the fencepost, even if old_top otherwise gets lost.
+ */
+ chunk_at_offset(old_top, old_size )->size =
+ SIZE_SZ|PREV_INUSE;
+
+ chunk_at_offset(old_top, old_size + SIZE_SZ)->size =
+ SIZE_SZ|PREV_INUSE;
+
+ /* If possible, release the rest. */
+ if (old_size >= MINSIZE)
+ fREe(chunk2mem(old_top));
+
+ }
+ }
+ }
+
+ /* Update statistics */
+
+ sum = av->sbrked_mem;
+ if (sum > (unsigned long)(av->max_sbrked_mem))
+ av->max_sbrked_mem = sum;
+
+ sum += av->mmapped_mem;
+ if (sum > (unsigned long)(av->max_total_mem))
+ av->max_total_mem = sum;
+
+ check_malloc_state();
+
+ /* finally, do the allocation */
+
+ p = av->top;
+ size = chunksize(p);
+ remainder_size = (long)size - (long)nb;
+
+ /* check that one of the above allocation paths succeeded */
+ if (remainder_size >= (long)MINSIZE) {
+ remainder = chunk_at_offset(p, nb);
+ av->top = remainder;
+ set_head(p, nb | PREV_INUSE);
+ set_head(remainder, remainder_size | PREV_INUSE);
+
+ check_malloced_chunk(p, nb);
+ return chunk2mem(p);
+ }
+ }
+
+ /* catch all failure paths */
+ MALLOC_FAILURE_ACTION;
+ return 0;
+}
+
+
+/*
+ sYSTRIm is an inverse of sorts to sYSMALLOc.
+ It gives memory back to the system (via negative
+ arguments to sbrk) if there is unused memory at the `high' end of
+ the malloc pool. It is called automatically by free()
+ when top space exceeds the trim threshold.
+ returns 1 if it actually released any memory, else 0.
+*/
+
+#if __STD_C
+static int sYSTRIm(size_t pad, mstate av)
+#else
+static int sYSTRIm(pad, av) size_t pad; mstate av;
+#endif
+{
+ long top_size; /* Amount of top-most memory */
+ long extra; /* Amount to release */
+ long released; /* Amount actually released */
+ char* current_brk; /* address returned by pre-check sbrk call */
+ char* new_brk; /* address returned by post-check sbrk call */
+ size_t pagesz;
+
+ /* Don't bother trying if sbrk doesn't provide contiguous regions */
+ if (av->sbrk_base != NONCONTIGUOUS_REGIONS) {
+
+ pagesz = av->pagesize;
+ top_size = chunksize(av->top);
+
+ /* Release in pagesize units, keeping at least one page */
+ extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz;
+
+ if (extra > 0) {
+
+ /*
+ Only proceed if end of memory is where we last set it.
+ This avoids problems if there were foreign sbrk calls.
+ */
+ current_brk = (char*)(MORECORE(0));
+ if (current_brk == (char*)(av->top) + top_size) {
+
+ /*
+ Attempt to release memory. We ignore return value,
+ and instead call again to find out where new end of memory is.
+ This avoids problems if first call releases less than we asked,
+ of if failure somehow altered brk value. (We could still
+ encounter problems if it altered brk in some very bad way,
+ but the only thing we can do is adjust anyway, which will cause
+ some downstream failure.)
+ */
+
+ MORECORE(-extra);
+ new_brk = (char*)(MORECORE(0));
+
+ if (new_brk != (char*)MORECORE_FAILURE) {
+ released = (long)(current_brk - new_brk);
+
+ if (released != 0) {
+ /* Success. Adjust top. */
+ av->sbrked_mem -= released;
+ set_head(av->top, (top_size - released) | PREV_INUSE);
+ check_malloc_state();
+ return 1;
+ }
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* ----------------------- Main public routines ----------------------- */
+
+
+/*
+ Malloc routine. See running comments for algorithm description.
+*/
+
+#if __STD_C
+Void_t* mALLOc(size_t bytes)
+#else
+ Void_t* mALLOc(bytes) size_t bytes;
+#endif
+{
+ mstate av = get_malloc_state();
+
+ INTERNAL_SIZE_T nb; /* normalized request size */
+ unsigned int idx; /* associated bin index */
+ mbinptr bin; /* associated bin */
+ mfastbinptr* fb; /* associated fastbin */
+
+ mchunkptr victim; /* inspected/selected chunk */
+ INTERNAL_SIZE_T size; /* its size */
+ int victim_index; /* its bin index */
+
+ mchunkptr remainder; /* remainder from a split */
+ long remainder_size; /* its size */
+
+ unsigned int block; /* bit map traverser */
+ unsigned int bit; /* bit map traverser */
+ unsigned int map; /* current word of binmap */
+
+ mchunkptr fwd; /* misc temp for linking */
+ mchunkptr bck; /* misc temp for linking */
+
+
+ /*
+ Check request for legality and convert to internal form, nb.
+ This rejects negative arguments when size_t is treated as
+ signed. It also rejects arguments that are so large that the size
+ appears negative when aligned and padded. The converted form
+ adds SIZE_T bytes overhead plus possibly more to obtain necessary
+ alignment and/or to obtain a size of at least MINSIZE, the
+ smallest allocatable size.
+ */
+
+ checked_request2size(bytes, nb);
+
+ /*
+ If the size qualifies as a fastbin, first check corresponding bin.
+ This code is safe to execute even if av not yet initialized, so we
+ can try it first, which saves some time on this fast path.
+ */
+
+ if (nb <= av->max_fast) {
+ fb = &(av->fastbins[(fastbin_index(nb))]);
+ if ( (victim = *fb) != 0) {
+ *fb = victim->fd;
+ check_remalloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
+ }
+
+ /*
+ If a small request, check regular bin. Since these "smallbins"
+ hold one size each, no searching within bins is necessary.
+
+ (If a large request, we need to wait until unsorted chunks are
+ processed to find best fit. But for small ones, fits are exact
+ anyway, so we can check now, which is faster.)
+ */
+
+ if (in_smallbin_range(nb)) {
+ idx = smallbin_index(nb);
+ bin = bin_at(av,idx);
+
+ if ( (victim = last(bin)) != bin) {
+ if (victim == 0) /* initialization check */
+ malloc_consolidate(av);
+ else {
+ bck = victim->bk;
+ set_inuse_bit_at_offset(victim, nb);
+ bin->bk = bck;
+ bck->fd = bin;
+
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
+ }
+ }
+
+ /*
+ If a large request, consolidate fastbins before continuing.
+ While it might look excessive to kill all fastbins before
+ even seeing if there is space available, this avoids
+ fragmentation problems normally associated with fastbins.
+ Also, in practice, programs tend to have runs of either small or
+ large requests, but less often mixtures, so consolidation is not
+ usually invoked all that often.
+ */
+
+ else {
+ idx = largebin_index(nb);
+ if (have_fastchunks(av)) /* consolidation/initialization check */
+ malloc_consolidate(av);
+ }
+
+
+ /*
+ Process recently freed or remaindered chunks, taking one only if
+ it is exact fit, or, if a small request, it is the remainder from
+ the most recent non-exact fit. Place other traversed chunks in
+ bins. Note that this step is the only place in any routine where
+ chunks are placed in bins.
+
+ The outer loop here is needed because we might not realize until
+ near the end of malloc that we should have consolidated, so must
+ do so and retry. This happens at most once, and only when we would
+ otherwise need to expand memory to service a "small" request.
+ */
+
+
+ for(;;) {
+
+ while ( (victim = unsorted_chunks(av)->bk) != unsorted_chunks(av)) {
+ bck = victim->bk;
+ size = chunksize(victim);
+
+ /*
+ If a small request, try to use last remainder if it is the
+ only chunk in unsorted bin. This helps promote locality for
+ runs of consecutive small requests. This is the only
+ exception to best-fit.
+ */
+
+ if (in_smallbin_range(nb) &&
+ victim == av->last_remainder &&
+ bck == unsorted_chunks(av) &&
+ (remainder_size = (long)size - (long)nb) >= (long)MINSIZE) {
+
+ /* split and reattach remainder */
+ remainder = chunk_at_offset(victim, nb);
+ unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
+ av->last_remainder = remainder;
+ remainder->bk = remainder->fd = unsorted_chunks(av);
+
+ set_head(victim, nb | PREV_INUSE);
+ set_head(remainder, remainder_size | PREV_INUSE);
+ set_foot(remainder, remainder_size);
+
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
+
+ /* remove from unsorted list */
+ unsorted_chunks(av)->bk = bck;
+ bck->fd = unsorted_chunks(av);
+
+ /* Take now instead of binning if exact fit */
+
+ if (size == nb) {
+ set_inuse_bit_at_offset(victim, size);
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
+
+ /* place chunk in bin */
+
+ if (in_smallbin_range(size)) {
+ victim_index = smallbin_index(size);
+ bck = bin_at(av, victim_index);
+ fwd = bck->fd;
+ }
+ else {
+ victim_index = largebin_index(size);
+ bck = bin_at(av, victim_index);
+ fwd = bck->fd;
+
+ /* maintain large bins in sorted order */
+ if (fwd != bck) {
+ /* if smaller than smallest, bypass loop below */
+ if ((unsigned long)size <=
+ (unsigned long)(chunksize(bck->bk))) {
+ fwd = bck;
+ bck = bck->bk;
+ }
+ else {
+ while (fwd != bck &&
+ (unsigned long)size < (unsigned long)(chunksize(fwd))) {
+ fwd = fwd->fd;
+ }
+ bck = fwd->bk;
+ }
+ }
+ }
+
+ mark_bin(av, victim_index);
+ victim->bk = bck;
+ victim->fd = fwd;
+ fwd->bk = victim;
+ bck->fd = victim;
+ }
+
+ /*
+ If a large request, scan through the chunks of current bin in
+ sorted order to find smallest that fits. This is the only step
+ where an unbounded number of chunks might be scanned without doing
+ anything useful with them. However the lists tend to be very
+ short.
+ */
+
+ if (!in_smallbin_range(nb)) {
+ bin = bin_at(av, idx);
+
+ /* skip scan if largest chunk is too small */
+ if ((victim = last(bin)) != bin &&
+ (long)(chunksize(first(bin))) - (long)(nb) >= 0) {
+ do {
+ size = chunksize(victim);
+ remainder_size = (long)size - (long)nb;
+
+ if (remainder_size >= 0) {
+ unlink(victim, bck, fwd);
+
+ /* Exhaust */
+ if (remainder_size < (long)MINSIZE) {
+ set_inuse_bit_at_offset(victim, size);
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
+ /* Split */
+ else {
+ remainder = chunk_at_offset(victim, nb);
+ unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
+ remainder->bk = remainder->fd = unsorted_chunks(av);
+ set_head(victim, nb | PREV_INUSE);
+ set_head(remainder, remainder_size | PREV_INUSE);
+ set_foot(remainder, remainder_size);
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
+ }
+ } while ( (victim = victim->bk) != bin);
+ }
+ }
+
+ /*
+ Search for a chunk by scanning bins, starting with next largest
+ bin. This search is strictly by best-fit; i.e., the smallest
+ (with ties going to approximately the least recently used) chunk
+ that fits is selected.
+
+ The bitmap avoids needing to check that most blocks are nonempty.
+ The particular case of skipping all bins during warm-up phases
+ when no chunks have been returned yet is faster than it might look.
+ */
+
+ ++idx;
+ bin = bin_at(av,idx);
+ block = idx2block(idx);
+ map = av->binmap[block];
+ bit = idx2bit(idx);
+
+ for (;;) {
+ /*
+ Skip rest of block if there are no more set bits in this block.
+ */
+
+ if (bit > map || bit == 0) {
+ for (;;) {
+ if (++block >= BINMAPSIZE) /* out of bins */
+ break;
+
+ else if ( (map = av->binmap[block]) != 0) {
+ bin = bin_at(av, (block << BINMAPSHIFT));
+ bit = 1;
+ break;
+ }
+ }
+ /* Optimizers seem to like this double-break better than goto */
+ if (block >= BINMAPSIZE)
+ break;
+ }
+
+ /* Advance to bin with set bit. There must be one. */
+ while ((bit & map) == 0) {
+ bin = next_bin(bin);
+ bit <<= 1;
+ }
+
+ victim = last(bin);
+
+ /* False alarm -- the bin is empty. Clear the bit. */
+ if (victim == bin) {
+ av->binmap[block] = map &= ~bit; /* Write through */
+ bin = next_bin(bin);
+ bit <<= 1;
+ }
+
+ /* We know the first chunk in this bin is big enough to use. */
+ else {
+ size = chunksize(victim);
+ remainder_size = (long)size - (long)nb;
+
+ assert(remainder_size >= 0);
+
+ /* unlink */
+ bck = victim->bk;
+ bin->bk = bck;
+ bck->fd = bin;
+
+
+ /* Exhaust */
+ if (remainder_size < (long)MINSIZE) {
+ set_inuse_bit_at_offset(victim, size);
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
+
+ /* Split */
+ else {
+ remainder = chunk_at_offset(victim, nb);
+
+ unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
+ remainder->bk = remainder->fd = unsorted_chunks(av);
+ /* advertise as last remainder */
+ if (in_smallbin_range(nb))
+ av->last_remainder = remainder;
+
+ set_head(victim, nb | PREV_INUSE);
+ set_head(remainder, remainder_size | PREV_INUSE);
+ set_foot(remainder, remainder_size);
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
+ }
+ }
+
+ /*
+ If large enough, split off the chunk bordering the end of memory
+ ("top"). Note that this use of top is in accord with the best-fit search
+ rule. In effect, top is treated as larger (and thus less well
+ fitting) than any other available chunk since it can be extended
+ to be as large as necessary (up to system limitations).
+
+ We require that "top" always exists (i.e., has size >= MINSIZE)
+ after initialization, so if it would otherwise be exhuasted by
+ current request, it is replenished. (Among the reasons for
+ ensuring it exists is that we may need MINSIZE space to put in
+ fenceposts in sysmalloc.)
+ */
+
+ victim = av->top;
+ size = chunksize(victim);
+ remainder_size = (long)size - (long)nb;
+
+ if (remainder_size >= (long)MINSIZE) {
+ remainder = chunk_at_offset(victim, nb);
+ av->top = remainder;
+ set_head(victim, nb | PREV_INUSE);
+ set_head(remainder, remainder_size | PREV_INUSE);
+
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
+
+ /*
+ If there is space available in fastbins, consolidate and retry,
+ to possibly avoid expanding memory. This can occur only if nb is
+ in smallbin range so we didn't consolidate upon entry.
+ */
+
+ else if (have_fastchunks(av)) {
+ assert(in_smallbin_range(nb));
+ idx = smallbin_index(nb); /* restore original bin index */
+ malloc_consolidate(av);
+ }
+
+ /*
+ Otherwise, relay to handle system-dependent cases
+ */
+ else
+ return sYSMALLOc(nb, av);
+ }
+}
+
+
+
+/*
+ Free routine. See running comments for algorithm description.
+*/
+
+#if __STD_C
+void fREe(Void_t* mem)
+#else
+void fREe(mem) Void_t* mem;
+#endif
+{
+ mstate av = get_malloc_state();
+
+ mchunkptr p; /* chunk corresponding to mem */
+ INTERNAL_SIZE_T size; /* its size */
+ mfastbinptr* fb; /* associated fastbin */
+ mchunkptr nextchunk; /* next contiguous chunk */
+ INTERNAL_SIZE_T nextsize; /* its size */
+ int nextinuse; /* true if nextchunk is used */
+ INTERNAL_SIZE_T prevsize; /* size of previous contiguous chunk */
+ mchunkptr bck; /* misc temp for linking */
+ mchunkptr fwd; /* misc temp for linking */
+
+
+ /* free(0) has no effect */
+ if (mem != 0) {
+
+ p = mem2chunk(mem);
+ check_inuse_chunk(p);
+
+ size = chunksize(p);
+
+ /*
+ If eligible, place chunk on a fastbin so it can be found
+ and used quickly in malloc.
+ */
+
+ if ((unsigned long)size <= (unsigned long)av->max_fast
+
+#if TRIM_FASTBINS
+ /*
+ If TRIM_FASTBINS set, don't place chunks
+ bordering top into fastbins
+ */
+ && (chunk_at_offset(p, size) != av->top)
+#endif
+ ) {
+
+ set_fastchunks(av);
+ fb = &(av->fastbins[fastbin_index(size)]);
+ p->fd = *fb;
+ *fb = p;
+ }
+
+ /*
+ Consolidate non-mmapped chunks as they arrive.
+ */
+
+ else if (!chunk_is_mmapped(p)) {
+
+ nextchunk = chunk_at_offset(p, size);
+
+ /* consolidate backward */
+ if (!prev_inuse(p)) {
+ prevsize = p->prev_size;
+ size += prevsize;
+ p = chunk_at_offset(p, -((long) prevsize));
+ unlink(p, bck, fwd);
+ }
+
+ nextsize = chunksize(nextchunk);
+
+ if (nextchunk != av->top) {
+
+ /* get and clear inuse bit */
+ nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
+ set_head(nextchunk, nextsize);
+
+ /* consolidate forward */
+ if (!nextinuse) {
+ unlink(nextchunk, bck, fwd);
+ size += nextsize;
+ }
+
+ /*
+ Place chunk in unsorted chunk list. Chunks are
+ not placed into regular bins until after they have
+ been given one chance to be used in malloc.
+ */
+
+ bck = unsorted_chunks(av);
+ fwd = bck->fd;
+ p->bk = bck;
+ p->fd = fwd;
+ bck->fd = p;
+ fwd->bk = p;
+
+ set_head(p, size | PREV_INUSE);
+ set_foot(p, size);
+ }
+
+ /*
+ If the chunk borders the current high end of memory,
+ consolidate into top
+ */
+
+ else {
+ size += nextsize;
+ set_head(p, size | PREV_INUSE);
+ av->top = p;
+
+ /*
+ If the total unused topmost memory exceeds trim
+ threshold, ask malloc_trim to reduce top.
+
+ Unless max_fast is 0, we don't know if there are fastbins
+ bordering top, so we cannot tell for sure whether threshold has
+ been reached unless fastbins are consolidated. But we don't
+ want to consolidate on each free. As a compromise,
+ consolidation is performed if half the threshold is
+ reached.
+
+ */
+
+ if ((unsigned long)(size) > (unsigned long)(av->trim_threshold / 2)) {
+ if (have_fastchunks(av)) {
+ malloc_consolidate(av);
+ size = chunksize(av->top);
+ }
+
+ if ((unsigned long)(size) > (unsigned long)(av->trim_threshold))
+ sYSTRIm(av->top_pad, av);
+ }
+ }
+ }
+
+ /*
+ If the chunk was allocated via mmap, release via munmap()
+ Note that if HAVE_MMAP is false but chunk_is_mmapped is
+ true, then user must have overwritten memory. There's nothing
+ we can do to catch this error unless DEBUG is set, in which case
+ check_inuse_chunk (above) will have triggered error.
+ */
+
+ else {
+#if HAVE_MMAP
+ int ret;
+ INTERNAL_SIZE_T offset = p->prev_size;
+ av->n_mmaps--;
+ av->mmapped_mem -= (size + offset);
+ ret = munmap((char*)p - offset, size + offset);
+ /* munmap returns non-zero on failure */
+ assert(ret == 0);
+#endif
+ }
+ }
+}
+
+
+
+/*
+ malloc_consolidate is a specialized version of free() that tears
+ down chunks held in fastbins. Free itself cannot be used for this
+ purpose since, among other things, it might place chunks back onto
+ fastbins. So, instead, we need to use a minor variant of the same
+ code.
+
+ Also, because this routine needs to be called the first time through
+ malloc anyway, it turns out to be the perfect place to bury
+ initialization code.
+*/
+
+#if __STD_C
+static void malloc_consolidate(mstate av)
+#else
+static void malloc_consolidate(av) mstate av;
+#endif
+{
+ mfastbinptr* fb;
+ mfastbinptr* maxfb;
+ mchunkptr p;
+ mchunkptr nextp;
+ mchunkptr unsorted_bin;
+ mchunkptr first_unsorted;
+
+ /* These have same use as in free() */
+ mchunkptr nextchunk;
+ INTERNAL_SIZE_T size;
+ INTERNAL_SIZE_T nextsize;
+ INTERNAL_SIZE_T prevsize;
+ int nextinuse;
+ mchunkptr bck;
+ mchunkptr fwd;
+
+ /*
+ If max_fast is 0, we know that malloc hasn't
+ yet been initialized, in which case do so.
+ */
+
+ if (av->max_fast == 0) {
+ malloc_init_state(av);
+ check_malloc_state();
+ }
+ else if (have_fastchunks(av)) {
+ clear_fastchunks(av);
+
+ unsorted_bin = unsorted_chunks(av);
+
+ /*
+ Remove each chunk from fast bin and consolidate it, placing it
+ then in unsorted bin. Among other reasons for doing this,
+ placing in unsorted bin avoids needing to calculate actual bins
+ until malloc is sure that chunks aren't immediately going to be
+ reused anyway.
+ */
+
+ maxfb = &(av->fastbins[fastbin_index(av->max_fast)]);
+ fb = &(av->fastbins[0]);
+ do {
+ if ( (p = *fb) != 0) {
+ *fb = 0;
+
+ do {
+ check_inuse_chunk(p);
+ nextp = p->fd;
+
+ /* Slightly streamlined version of consolidation code in free() */
+ size = p->size & ~PREV_INUSE;
+ nextchunk = chunk_at_offset(p, size);
+
+ if (!prev_inuse(p)) {
+ prevsize = p->prev_size;
+ size += prevsize;
+ p = chunk_at_offset(p, -((long) prevsize));
+ unlink(p, bck, fwd);
+ }
+
+ nextsize = chunksize(nextchunk);
+
+ if (nextchunk != av->top) {
+
+ nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
+ set_head(nextchunk, nextsize);
+
+ if (!nextinuse) {
+ size += nextsize;
+ unlink(nextchunk, bck, fwd);
+ }
+
+ first_unsorted = unsorted_bin->fd;
+ unsorted_bin->fd = p;
+ first_unsorted->bk = p;
+
+ set_head(p, size | PREV_INUSE);
+ p->bk = unsorted_bin;
+ p->fd = first_unsorted;
+ set_foot(p, size);
+ }
+
+ else {
+ size += nextsize;
+ set_head(p, size | PREV_INUSE);
+ av->top = p;
+ }
+
+ } while ( (p = nextp) != 0);
+
+ }
+ } while (fb++ != maxfb);
+ }
+}
+
+
+
+
+/*
+ Realloc algorithm cases:
+
+ * Chunks that were obtained via mmap cannot be extended or shrunk
+ unless HAVE_MREMAP is defined, in which case mremap is used.
+ Otherwise, if the reallocation is for additional space, they are
+ copied. If for less, they are just left alone.
+
+ * Otherwise, if the reallocation is for additional space, and the
+ chunk can be extended, it is, else a malloc-copy-free sequence is
+ taken. There are several different ways that a chunk could be
+ extended. All are tried:
+
+ * Extending forward into following adjacent free chunk.
+ * Shifting backwards, joining preceding adjacent space
+ * Both shifting backwards and extending forward.
+ * Extending into newly sbrked space
+
+ * If there is not enough memory available to realloc, realloc
+ returns null, but does NOT free the existing space.
+
+ * If the reallocation is for less space, the newly unused space is
+ lopped off and freed. Unless the #define REALLOC_ZERO_BYTES_FREES
+ is set, realloc with a size argument of zero (re)allocates a
+ minimum-sized chunk.
+
+
+ The old unix realloc convention of allowing the last-free'd chunk
+ to be used as an argument to realloc is no longer supported.
+ I don't know of any programs still relying on this feature,
+ and allowing it would also allow too many other incorrect
+ usages of realloc to be sensible.
+*/
+
+#if __STD_C
+Void_t* rEALLOc(Void_t* oldmem, size_t bytes)
+#else
+Void_t* rEALLOc(oldmem, bytes) Void_t* oldmem; size_t bytes;
+#endif
+{
+ mstate av = get_malloc_state();
+
+ INTERNAL_SIZE_T nb; /* padded request size */
+
+ mchunkptr oldp; /* chunk corresponding to oldmem */
+ INTERNAL_SIZE_T oldsize; /* its size */
+
+ mchunkptr newp; /* chunk to return */
+ INTERNAL_SIZE_T newsize; /* its size */
+ Void_t* newmem; /* corresponding user mem */
+
+ mchunkptr next; /* next contiguous chunk after oldp */
+ mchunkptr prev; /* previous contiguous chunk before oldp */
+
+ mchunkptr remainder; /* extra space at end of newp */
+ long remainder_size; /* its size */
+
+ mchunkptr bck; /* misc temp for linking */
+ mchunkptr fwd; /* misc temp for linking */
+
+ INTERNAL_SIZE_T copysize; /* bytes to copy */
+ int ncopies; /* INTERNAL_SIZE_T words to copy */
+ INTERNAL_SIZE_T* s; /* copy source */
+ INTERNAL_SIZE_T* d; /* copy destination */
+
+
+#ifdef REALLOC_ZERO_BYTES_FREES
+ if (bytes == 0) {
+ fREe(oldmem);
+ return 0;
+ }
+#endif
+
+ /* realloc of null is supposed to be same as malloc */
+ if (oldmem == 0) return mALLOc(bytes);
+
+ checked_request2size(bytes, nb);
+
+ oldp = mem2chunk(oldmem);
+ oldsize = chunksize(oldp);
+
+ check_inuse_chunk(oldp);
+
+ if (!chunk_is_mmapped(oldp)) {
+
+ if ((unsigned long)(oldsize) >= (unsigned long)(nb)) {
+ /* already big enough; split below */
+ newp = oldp;
+ newsize = oldsize;
+ }
+
+ else {
+ newp = 0;
+ newsize = 0;
+
+ next = chunk_at_offset(oldp, oldsize);
+
+ if (next == av->top) { /* Expand forward into top */
+ newsize = oldsize + chunksize(next);
+
+ if ((unsigned long)(newsize) >= (unsigned long)(nb + MINSIZE)) {
+ set_head_size(oldp, nb);
+ av->top = chunk_at_offset(oldp, nb);
+ set_head(av->top, (newsize - nb) | PREV_INUSE);
+ return chunk2mem(oldp);
+ }
+
+ else if (!prev_inuse(oldp)) { /* Shift backwards + top */
+ prev = prev_chunk(oldp);
+ newsize += chunksize(prev);
+
+ if ((unsigned long)(newsize) >= (unsigned long)(nb + MINSIZE)) {
+ newp = prev;
+ unlink(prev, bck, fwd);
+ av->top = chunk_at_offset(newp, nb);
+ set_head(av->top, (newsize - nb) | PREV_INUSE);
+ newsize = nb;
+ }
+ }
+ }
+
+ else if (!inuse(next)) { /* Forward into next chunk */
+ newsize = oldsize + chunksize(next);
+
+ if (((unsigned long)(newsize) >= (unsigned long)(nb))) {
+ newp = oldp;
+ unlink(next, bck, fwd);
+ }
+
+ else if (!prev_inuse(oldp)) { /* Forward + backward */
+ prev = prev_chunk(oldp);
+ newsize += chunksize(prev);
+
+ if (((unsigned long)(newsize) >= (unsigned long)(nb))) {
+ newp = prev;
+ unlink(prev, bck, fwd);
+ unlink(next, bck, fwd);
+ }
+ }
+ }
+
+ else if (!prev_inuse(oldp)) { /* Backward only */
+ prev = prev_chunk(oldp);
+ newsize = oldsize + chunksize(prev);
+
+ if ((unsigned long)(newsize) >= (unsigned long)(nb)) {
+ newp = prev;
+ unlink(prev, bck, fwd);
+ }
+ }
+
+ if (newp != 0) {
+ if (newp != oldp) {
+ /* Backward copies are not worth unrolling */
+ MALLOC_COPY(chunk2mem(newp), oldmem, oldsize - SIZE_SZ, 1);
+ }
+ }
+
+ /* Must allocate */
+ else {
+ newmem = mALLOc(nb - MALLOC_ALIGN_MASK);
+ if (newmem == 0)
+ return 0; /* propagate failure */
+
+ newp = mem2chunk(newmem);
+ newsize = chunksize(newp);
+
+ /*
+ Avoid copy if newp is next chunk after oldp.
+ */
+ if (newp == next) {
+ newsize += oldsize;
+ newp = oldp;
+ }
+ else {
+
+ /*
+ Unroll copy of <= 36 bytes (72 if 8byte sizes)
+ We know that contents have an odd number of
+ INTERNAL_SIZE_T-sized words; minimally 3.
+ */
+
+ copysize = oldsize - SIZE_SZ;
+ s = (INTERNAL_SIZE_T*)oldmem;
+ d = (INTERNAL_SIZE_T*)(chunk2mem(newp));
+ ncopies = copysize / sizeof(INTERNAL_SIZE_T);
+ assert(ncopies >= 3);
+
+ if (ncopies > 9)
+ MALLOC_COPY(d, s, copysize, 0);
+
+ else {
+ *(d+0) = *(s+0);
+ *(d+1) = *(s+1);
+ *(d+2) = *(s+2);
+ if (ncopies > 4) {
+ *(d+3) = *(s+3);
+ *(d+4) = *(s+4);
+ if (ncopies > 6) {
+ *(d+5) = *(s+5);
+ *(d+6) = *(s+6);
+ if (ncopies > 8) {
+ *(d+7) = *(s+7);
+ *(d+8) = *(s+8);
+ }
+ }
+ }
+ }
+
+ fREe(oldmem);
+ check_inuse_chunk(newp);
+ return chunk2mem(newp);
+ }
+ }
+ }
+
+
+ /* If possible, free extra space in old or extended chunk */
+
+ remainder_size = (long)newsize - (long)nb;
+ assert(remainder_size >= 0);
+
+ if (remainder_size >= (long)MINSIZE) { /* split remainder */
+ remainder = chunk_at_offset(newp, nb);
+ set_head_size(newp, nb);
+ set_head(remainder, remainder_size | PREV_INUSE);
+ /* Mark remainder as inuse so free() won't complain */
+ set_inuse_bit_at_offset(remainder, remainder_size);
+ fREe(chunk2mem(remainder));
+ }
+
+ else { /* not enough extra to split off */
+ set_head_size(newp, newsize);
+ set_inuse_bit_at_offset(newp, newsize);
+ }
+
+ check_inuse_chunk(newp);
+ return chunk2mem(newp);
+ }
+
+ /*
+ Handle mmap cases
+ */
+
+ else {
+#if HAVE_MMAP
+
+#if HAVE_MREMAP
+ INTERNAL_SIZE_T offset = oldp->prev_size;
+ size_t pagemask = av->pagesize - 1;
+ char *cp;
+ unsigned long sum;
+
+ /* Note the extra SIZE_SZ overhead */
+ newsize = (nb + offset + SIZE_SZ + pagemask) & ~pagemask;
+
+ /* don't need to remap if still within same page */
+ if (oldsize == newsize - offset)
+ return oldmem;
+
+ cp = (char*)mremap((char*)oldp - offset, oldsize + offset, newsize, 1);
+
+ if (cp != (char*)MORECORE_FAILURE) {
+
+ newp = (mchunkptr)(cp + offset);
+ set_head(newp, (newsize - offset)|IS_MMAPPED);
+
+ assert(aligned_OK(chunk2mem(newp)));
+ assert((newp->prev_size == offset));
+
+ /* update statistics */
+ sum = av->mmapped_mem += newsize - oldsize;
+ if (sum > (unsigned long)(av->max_mmapped_mem))
+ av->max_mmapped_mem = sum;
+ sum += av->sbrked_mem;
+ if (sum > (unsigned long)(av->max_total_mem))
+ av->max_total_mem = sum;
+
+ return chunk2mem(newp);
+ }
+
+#endif
+
+ /* Note the extra SIZE_SZ overhead. */
+ if ((long)oldsize - (long)SIZE_SZ >= (long)nb)
+ newmem = oldmem; /* do nothing */
+ else {
+ /* Must alloc, copy, free. */
+ newmem = mALLOc(nb - MALLOC_ALIGN_MASK);
+ if (newmem != 0) {
+ MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ, 0);
+ fREe(oldmem);
+ }
+ }
+ return newmem;
+
+#else
+ /* If !HAVE_MMAP, but chunk_is_mmapped, user must have overwritten mem */
+ check_malloc_state();
+ MALLOC_FAILURE_ACTION;
+ return 0;
+#endif
+ }
+
+}
+
+
+
+/*
+ memalign requests more than enough space from malloc, finds a spot
+ within that chunk that meets the alignment request, and then
+ possibly frees the leading and trailing space.
+
+ Alignments must be powers of two. If the argument is not a
+ power of two, the nearest greater power is used.
+
+ 8-byte alignment is guaranteed by normal malloc calls, so don't
+ bother calling memalign with an argument of 8 or less.
+
+ Overreliance on memalign is a sure way to fragment space.
+*/
+
+
+#if __STD_C
+Void_t* mEMALIGn(size_t alignment, size_t bytes)
+#else
+Void_t* mEMALIGn(alignment, bytes) size_t alignment; size_t bytes;
+#endif
+{
+ INTERNAL_SIZE_T nb; /* padded request size */
+ char* m; /* memory returned by malloc call */
+ mchunkptr p; /* corresponding chunk */
+ char* brk; /* alignment point within p */
+ mchunkptr newp; /* chunk to return */
+ INTERNAL_SIZE_T newsize; /* its size */
+ INTERNAL_SIZE_T leadsize; /* leading space befor alignment point */
+ mchunkptr remainder; /* spare room at end to split off */
+ long remainder_size; /* its size */
+
+
+ /* If need less alignment than we give anyway, just relay to malloc */
+
+ if (alignment <= MALLOC_ALIGNMENT) return mALLOc(bytes);
+
+ /* Otherwise, ensure that it is at least a minimum chunk size */
+
+ if (alignment < MINSIZE) alignment = MINSIZE;
+
+ /* Make sure alignment is power of 2 (in case MINSIZE is not). */
+ if ((alignment & (alignment - 1)) != 0) {
+ size_t a = MALLOC_ALIGNMENT * 2;
+ while ((unsigned long)a < (unsigned long)alignment) a <<= 1;
+ alignment = a;
+ }
+
+ checked_request2size(bytes, nb);
+
+ /* Call malloc with worst case padding to hit alignment. */
+
+ m = (char*)(mALLOc(nb + alignment + MINSIZE));
+
+ if (m == 0) return 0; /* propagate failure */
+
+ p = mem2chunk(m);
+
+ if ((((unsigned long)(m)) % alignment) != 0) { /* misaligned */
+
+ /*
+ Find an aligned spot inside chunk. Since we need to give back
+ leading space in a chunk of at least MINSIZE, if the first
+ calculation places us at a spot with less than MINSIZE leader,
+ we can move to the next aligned spot -- we've allocated enough
+ total room so that this is always possible.
+ */
+
+ brk = (char*)mem2chunk(((unsigned long)(m + alignment - 1)) &
+ -((signed long) alignment));
+ if ((long)(brk - (char*)(p)) < (long)MINSIZE)
+ brk = brk + alignment;
+
+ newp = (mchunkptr)brk;
+ leadsize = brk - (char*)(p);
+ newsize = chunksize(p) - leadsize;
+
+ /* For mmapped chunks, just adjust offset */
+ if (chunk_is_mmapped(p)) {
+ newp->prev_size = p->prev_size + leadsize;
+ set_head(newp, newsize|IS_MMAPPED);
+ return chunk2mem(newp);
+ }
+
+ /* Otherwise, give back leader, use the rest */
+
+ set_head(newp, newsize | PREV_INUSE);
+ set_inuse_bit_at_offset(newp, newsize);
+ set_head_size(p, leadsize);
+ fREe(chunk2mem(p));
+ p = newp;
+
+ assert (newsize >= nb &&
+ (((unsigned long)(chunk2mem(p))) % alignment) == 0);
+ }
+
+ /* Also give back spare room at the end */
+ if (!chunk_is_mmapped(p)) {
+
+ remainder_size = (long)(chunksize(p)) - (long)nb;
+
+ if (remainder_size >= (long)MINSIZE) {
+ remainder = chunk_at_offset(p, nb);
+ set_head(remainder, remainder_size | PREV_INUSE);
+ set_head_size(p, nb);
+ fREe(chunk2mem(remainder));
+ }
+ }
+
+ check_inuse_chunk(p);
+ return chunk2mem(p);
+
+}
+
+
+
+
+/*
+ calloc calls malloc, then zeroes out the allocated chunk.
+*/
+
+#if __STD_C
+Void_t* cALLOc(size_t n_elements, size_t elem_size)
+#else
+Void_t* cALLOc(n_elements, elem_size) size_t n_elements; size_t elem_size;
+#endif
+{
+ mchunkptr p;
+ INTERNAL_SIZE_T clearsize;
+ int nclears;
+ INTERNAL_SIZE_T* d;
+
+ Void_t* mem = mALLOc(n_elements * elem_size);
+
+ if (mem != 0) {
+ p = mem2chunk(mem);
+ if (!chunk_is_mmapped(p)) { /* don't need to clear mmapped space */
+
+ /*
+ Unroll clear of <= 36 bytes (72 if 8byte sizes)
+ We know that contents have an odd number of
+ INTERNAL_SIZE_T-sized words; minimally 3.
+ */
+
+ d = (INTERNAL_SIZE_T*)mem;
+ clearsize = chunksize(p) - SIZE_SZ;
+ nclears = clearsize / sizeof(INTERNAL_SIZE_T);
+ assert(nclears >= 3);
+
+ if (nclears > 9)
+ MALLOC_ZERO(d, clearsize);
+
+ else {
+ *(d+0) = 0;
+ *(d+1) = 0;
+ *(d+2) = 0;
+ if (nclears > 4) {
+ *(d+3) = 0;
+ *(d+4) = 0;
+ if (nclears > 6) {
+ *(d+5) = 0;
+ *(d+6) = 0;
+ if (nclears > 8) {
+ *(d+7) = 0;
+ *(d+8) = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+ return mem;
+}
+
+
+/*
+ cfree just calls free. It is needed/defined on some systems
+ that pair it with calloc, presumably for odd historical reasons
+ (such as: cfree is used in example code in first edition of K&R).
+*/
+
+#if __STD_C
+void cFREe(Void_t *mem)
+#else
+void cFREe(mem) Void_t *mem;
+#endif
+{
+ fREe(mem);
+}
+
+
+
+
+
+/*
+ valloc just invokes memalign with alignment argument equal
+ to the page size of the system (or as near to this as can
+ be figured out from all the includes/defines above.)
+*/
+
+#if __STD_C
+Void_t* vALLOc(size_t bytes)
+#else
+Void_t* vALLOc(bytes) size_t bytes;
+#endif
+{
+ /* Ensure initialization/consolidation */
+ mstate av = get_malloc_state();
+ malloc_consolidate(av);
+ return mEMALIGn(av->pagesize, bytes);
+}
+
+/*
+ pvalloc just invokes valloc for the nearest pagesize
+ that will accommodate request
+*/
+
+
+#if __STD_C
+Void_t* pVALLOc(size_t bytes)
+#else
+Void_t* pVALLOc(bytes) size_t bytes;
+#endif
+{
+ mstate av = get_malloc_state();
+ size_t pagesz;
+
+ /* Ensure initialization/consolidation */
+ malloc_consolidate(av);
+
+ pagesz = av->pagesize;
+ return mEMALIGn(pagesz, (bytes + pagesz - 1) & ~(pagesz - 1));
+}
+
+
+/*
+ Malloc_Trim gives memory back to the system (via negative
+ arguments to sbrk) if there is unused memory at the `high' end of
+ the malloc pool. You can call this after freeing large blocks of
+ memory to potentially reduce the system-level memory requirements
+ of a program. However, it cannot guarantee to reduce memory. Under
+ some allocation patterns, some large free blocks of memory will be
+ locked between two used chunks, so they cannot be given back to
+ the system.
+
+ The `pad' argument to malloc_trim represents the amount of free
+ trailing space to leave untrimmed. If this argument is zero,
+ only the minimum amount of memory to maintain internal data
+ structures will be left (one page or less). Non-zero arguments
+ can be supplied to maintain enough trailing space to service
+ future expected allocations without having to re-obtain memory
+ from the system.
+
+ Malloc_trim returns 1 if it actually released any memory, else 0.
+*/
+
+#if __STD_C
+int mTRIm(size_t pad)
+#else
+int mTRIm(pad) size_t pad;
+#endif
+{
+ mstate av = get_malloc_state();
+ /* Ensure initialization/consolidation */
+ malloc_consolidate(av);
+
+ return sYSTRIm(pad, av);
+}
+
+/*
+ malloc_usable_size tells you how many bytes you can actually use in
+ an allocated chunk, which may be more than you requested (although
+ often not). You can use this many bytes without worrying about
+ overwriting other allocated objects. Not a particularly great
+ programming practice, but still sometimes useful.
+*/
+
+#if __STD_C
+size_t mUSABLe(Void_t* mem)
+#else
+size_t mUSABLe(mem) Void_t* mem;
+#endif
+{
+ mchunkptr p;
+ if (mem != 0) {
+ p = mem2chunk(mem);
+ if (chunk_is_mmapped(p))
+ return chunksize(p) - 2*SIZE_SZ;
+ else if (inuse(p))
+ return chunksize(p) - SIZE_SZ;
+ }
+ return 0;
+}
+
+
+
+
+/*
+ mallinfo returns a copy of updated current mallinfo.
+*/
+
+struct mallinfo mALLINFo()
+{
+ mstate av = get_malloc_state();
+ struct mallinfo mi;
+ int i;
+ mbinptr b;
+ mchunkptr p;
+ INTERNAL_SIZE_T avail;
+ int navail;
+ int nfastblocks;
+ int fastbytes;
+
+ /* Ensure initialization */
+ if (av->top == 0) malloc_consolidate(av);
+
+ check_malloc_state();
+
+ /* Account for top */
+ avail = chunksize(av->top);
+ navail = 1; /* top always exists */
+
+ /* traverse fastbins */
+ nfastblocks = 0;
+ fastbytes = 0;
+
+ for (i = 0; i < NFASTBINS; ++i) {
+ for (p = av->fastbins[i]; p != 0; p = p->fd) {
+ ++nfastblocks;
+ fastbytes += chunksize(p);
+ }
+ }
+
+ avail += fastbytes;
+
+ /* traverse regular bins */
+ for (i = 1; i < NBINS; ++i) {
+ b = bin_at(av, i);
+ for (p = last(b); p != b; p = p->bk) {
+ avail += chunksize(p);
+ navail++;
+ }
+ }
+
+ mi.smblks = nfastblocks;
+ mi.ordblks = navail;
+ mi.fordblks = avail;
+ mi.uordblks = av->sbrked_mem - avail;
+ mi.arena = av->sbrked_mem;
+ mi.hblks = av->n_mmaps;
+ mi.hblkhd = av->mmapped_mem;
+ mi.fsmblks = fastbytes;
+ mi.keepcost = chunksize(av->top);
+ mi.usmblks = av->max_total_mem;
+ return mi;
+}
+
+
+
+/*
+ malloc_stats prints on stderr the amount of space obtained from the
+ system (both via sbrk and mmap), the maximum amount (which may be
+ more than current if malloc_trim and/or munmap got called), and the
+ current number of bytes allocated via malloc (or realloc, etc) but
+ not yet freed. Note that this is the number of bytes allocated, not
+ the number requested. It will be larger than the number requested
+ because of alignment and bookkeeping overhead. Because it includes
+ alignment wastage as being in use, this figure may be greater than zero
+ even when no user-level chunks are allocated.
+
+ The reported current and maximum system memory can be inaccurate if
+ a program makes other calls to system memory allocation functions
+ (normally sbrk) outside of malloc.
+
+ malloc_stats prints only the most commonly interesting statistics.
+ More information can be obtained by calling mallinfo.
+*/
+
+void mSTATs()
+{
+ struct mallinfo mi = mALLINFo();
+
+#ifdef WIN32
+ {
+ unsigned long free, reserved, committed;
+ vminfo (&free, &reserved, &committed);
+ fprintf(stderr, "free bytes = %10lu\n",
+ free);
+ fprintf(stderr, "reserved bytes = %10lu\n",
+ reserved);
+ fprintf(stderr, "committed bytes = %10lu\n",
+ committed);
+ }
+#endif
+
+
+ fprintf(stderr, "max system bytes = %10lu\n",
+ (unsigned long)(mi.usmblks));
+ fprintf(stderr, "system bytes = %10lu\n",
+ (unsigned long)(mi.arena + mi.hblkhd));
+ fprintf(stderr, "in use bytes = %10lu\n",
+ (unsigned long)(mi.uordblks + mi.hblkhd));
+
+#ifdef WIN32
+ {
+ unsigned long kernel, user;
+ if (cpuinfo (TRUE, &kernel, &user)) {
+ fprintf(stderr, "kernel ms = %10lu\n",
+ kernel);
+ fprintf(stderr, "user ms = %10lu\n",
+ user);
+ }
+ }
+#endif
+}
+
+
+
+/*
+ mallopt is the general SVID/XPG interface to tunable parameters.
+ The format is to provide a (parameter-number, parameter-value)
+ pair. mallopt then sets the corresponding parameter to the
+ argument value if it can (i.e., so long as the value is
+ meaningful), and returns 1 if successful else 0. See descriptions
+ of tunable parameters above for meanings.
+*/
+
+#if __STD_C
+int mALLOPt(int param_number, int value)
+#else
+int mALLOPt(param_number, value) int param_number; int value;
+#endif
+{
+ mstate av = get_malloc_state();
+ /* Ensure initialization/consolidation */
+ malloc_consolidate(av);
+
+ switch(param_number) {
+ case M_MXFAST:
+ if (value >= 0 && value <= MAX_FAST_SIZE) {
+ av->max_fast = req2max_fast(value);
+ return 1;
+ }
+ else
+ return 0;
+
+ case M_TRIM_THRESHOLD:
+ av->trim_threshold = value;
+ return 1;
+
+ case M_TOP_PAD:
+ av->top_pad = value;
+ return 1;
+
+ case M_MMAP_THRESHOLD:
+ av->mmap_threshold = value;
+ return 1;
+
+ case M_MMAP_MAX:
+#if HAVE_MMAP
+ av->n_mmaps_max = value;
+ return 1;
+#else
+ if (value != 0)
+ return 0;
+ else {
+ av->n_mmaps_max = value;
+ return 1;
+ }
+#endif
+
+ default:
+ return 0;
+ }
+}
+
+
+/* -------------------------------------------------------------- */
+
+/*
+ Emulation of sbrk for win32.
+ Donated by J. Walter <Walter@GeNeSys-e.de>.
+ For additional information about this code, and malloc on Win32, see
+ http://www.genesys-e.de/jwalter/
+
+*/
+
+
+#ifdef WIN32
+
+#ifdef _DEBUG
+/* #define TRACE */
+#endif
+
+/* Support for USE_MALLOC_LOCK */
+#ifdef USE_MALLOC_LOCK
+
+/* Wait for spin lock */
+static int slwait (int *sl) {
+ while (InterlockedCompareExchange ((void **) sl, (void *) 1, (void *) 0) != 0)
+ Sleep (0);
+ return 0;
+}
+
+/* Release spin lock */
+static int slrelease (int *sl) {
+ InterlockedExchange (sl, 0);
+ return 0;
+}
+
+#ifdef NEEDED
+/* Spin lock for emulation code */
+static int g_sl;
+#endif
+
+#endif /* USE_MALLOC_LOCK */
+
+/* getpagesize for windows */
+static long getpagesize (void) {
+ static long g_pagesize = 0;
+ if (! g_pagesize) {
+ SYSTEM_INFO system_info;
+ GetSystemInfo (&system_info);
+ g_pagesize = system_info.dwPageSize;
+ }
+ return g_pagesize;
+}
+static long getregionsize (void) {
+ static long g_regionsize = 0;
+ if (! g_regionsize) {
+ SYSTEM_INFO system_info;
+ GetSystemInfo (&system_info);
+ g_regionsize = system_info.dwAllocationGranularity;
+ }
+ return g_regionsize;
+}
+
+/* A region list entry */
+typedef struct _region_list_entry {
+ void *top_allocated;
+ void *top_committed;
+ void *top_reserved;
+ long reserve_size;
+ struct _region_list_entry *previous;
+} region_list_entry;
+
+/* Allocate and link a region entry in the region list */
+static int region_list_append (region_list_entry **last, void *base_reserved, long reserve_size) {
+ region_list_entry *next = HeapAlloc (GetProcessHeap (), 0, sizeof (region_list_entry));
+ if (! next)
+ return FALSE;
+ next->top_allocated = (char *) base_reserved;
+ next->top_committed = (char *) base_reserved;
+ next->top_reserved = (char *) base_reserved + reserve_size;
+ next->reserve_size = reserve_size;
+ next->previous = *last;
+ *last = next;
+ return TRUE;
+}
+/* Free and unlink the last region entry from the region list */
+static int region_list_remove (region_list_entry **last) {
+ region_list_entry *previous = (*last)->previous;
+ if (! HeapFree (GetProcessHeap (), sizeof (region_list_entry), *last))
+ return FALSE;
+ *last = previous;
+ return TRUE;
+}
+
+#define CEIL(size,to) (((size)+(to)-1)&~((to)-1))
+#define FLOOR(size,to) ((size)&~((to)-1))
+
+#define SBRK_SCALE 0
+/* #define SBRK_SCALE 1 */
+/* #define SBRK_SCALE 2 */
+/* #define SBRK_SCALE 4 */
+
+/* sbrk for windows */
+static void *sbrk (long size) {
+ static long g_pagesize, g_my_pagesize;
+ static long g_regionsize, g_my_regionsize;
+ static region_list_entry *g_last;
+ void *result = (void *) MORECORE_FAILURE;
+#ifdef TRACE
+ printf ("sbrk %d\n", size);
+#endif
+#if defined (USE_MALLOC_LOCK) && defined (NEEDED)
+ /* Wait for spin lock */
+ slwait (&g_sl);
+#endif
+ /* First time initialization */
+ if (! g_pagesize) {
+ g_pagesize = getpagesize ();
+ g_my_pagesize = g_pagesize << SBRK_SCALE;
+ }
+ if (! g_regionsize) {
+ g_regionsize = getregionsize ();
+ g_my_regionsize = g_regionsize << SBRK_SCALE;
+ }
+ if (! g_last) {
+ if (! region_list_append (&g_last, 0, 0))
+ goto sbrk_exit;
+ }
+ /* Assert invariants */
+ assert (g_last);
+ assert ((char *) g_last->top_reserved - g_last->reserve_size <= (char *) g_last->top_allocated &&
+ g_last->top_allocated <= g_last->top_committed);
+ assert ((char *) g_last->top_reserved - g_last->reserve_size <= (char *) g_last->top_committed &&
+ g_last->top_committed <= g_last->top_reserved &&
+ (unsigned) g_last->top_committed % g_pagesize == 0);
+ assert ((unsigned) g_last->top_reserved % g_regionsize == 0);
+ assert ((unsigned) g_last->reserve_size % g_regionsize == 0);
+ /* Allocation requested? */
+ if (size >= 0) {
+ /* Allocation size is the requested size */
+ long allocate_size = size;
+ /* Compute the size to commit */
+ long to_commit = (char *) g_last->top_allocated + allocate_size - (char *) g_last->top_committed;
+ /* Do we reach the commit limit? */
+ if (to_commit > 0) {
+ /* Round size to commit */
+ long commit_size = CEIL (to_commit, g_my_pagesize);
+ /* Compute the size to reserve */
+ long to_reserve = (char *) g_last->top_committed + commit_size - (char *) g_last->top_reserved;
+ /* Do we reach the reserve limit? */
+ if (to_reserve > 0) {
+ /* Compute the remaining size to commit in the current region */
+ long remaining_commit_size = (char *) g_last->top_reserved - (char *) g_last->top_committed;
+ if (remaining_commit_size > 0) {
+ /* Assert preconditions */
+ assert ((unsigned) g_last->top_committed % g_pagesize == 0);
+ assert (0 < remaining_commit_size && remaining_commit_size % g_pagesize == 0); {
+ /* Commit this */
+ void *base_committed = VirtualAlloc (g_last->top_committed, remaining_commit_size,
+ MEM_COMMIT, PAGE_READWRITE);
+ /* Check returned pointer for consistency */
+ if (base_committed != g_last->top_committed)
+ goto sbrk_exit;
+ /* Assert postconditions */
+ assert ((unsigned) base_committed % g_pagesize == 0);
+#ifdef TRACE
+ printf ("Commit %p %d\n", base_committed, remaining_commit_size);
+#endif
+ /* Adjust the regions commit top */
+ g_last->top_committed = (char *) base_committed + remaining_commit_size;
+ }
+ } {
+ /* Now we are going to search and reserve. */
+ int contiguous = -1;
+ int found = FALSE;
+ MEMORY_BASIC_INFORMATION memory_info;
+ void *base_reserved;
+ long reserve_size;
+ do {
+ /* Assume contiguous memory */
+ contiguous = TRUE;
+ /* Round size to reserve */
+ reserve_size = CEIL (to_reserve, g_my_regionsize);
+ /* Start with the current region's top */
+ memory_info.BaseAddress = g_last->top_reserved;
+ /* Assert preconditions */
+ assert ((unsigned) memory_info.BaseAddress % g_pagesize == 0);
+ assert (0 < reserve_size && reserve_size % g_regionsize == 0);
+ while (VirtualQuery (memory_info.BaseAddress, &memory_info, sizeof (memory_info))) {
+ /* Assert postconditions */
+ assert ((unsigned) memory_info.BaseAddress % g_pagesize == 0);
+#ifdef TRACE
+ printf ("Query %p %d %s\n", memory_info.BaseAddress, memory_info.RegionSize,
+ memory_info.State == MEM_FREE ? "FREE":
+ (memory_info.State == MEM_RESERVE ? "RESERVED":
+ (memory_info.State == MEM_COMMIT ? "COMMITTED": "?")));
+#endif
+ /* Region is free, well aligned and big enough: we are done */
+ if (memory_info.State == MEM_FREE &&
+ (unsigned) memory_info.BaseAddress % g_regionsize == 0 &&
+ memory_info.RegionSize >= (unsigned) reserve_size) {
+ found = TRUE;
+ break;
+ }
+ /* From now on we can't get contiguous memory! */
+ contiguous = FALSE;
+ /* Recompute size to reserve */
+ reserve_size = CEIL (allocate_size, g_my_regionsize);
+ memory_info.BaseAddress = (char *) memory_info.BaseAddress + memory_info.RegionSize;
+ /* Assert preconditions */
+ assert ((unsigned) memory_info.BaseAddress % g_pagesize == 0);
+ assert (0 < reserve_size && reserve_size % g_regionsize == 0);
+ }
+ /* Search failed? */
+ if (! found)
+ goto sbrk_exit;
+ /* Assert preconditions */
+ assert ((unsigned) memory_info.BaseAddress % g_regionsize == 0);
+ assert (0 < reserve_size && reserve_size % g_regionsize == 0);
+ /* Try to reserve this */
+ base_reserved = VirtualAlloc (memory_info.BaseAddress, reserve_size,
+ MEM_RESERVE, PAGE_NOACCESS);
+ if (! base_reserved) {
+ int rc = GetLastError ();
+ if (rc != ERROR_INVALID_ADDRESS)
+ goto sbrk_exit;
+ }
+ /* A null pointer signals (hopefully) a race condition with another thread. */
+ /* In this case, we try again. */
+ } while (! base_reserved);
+ /* Check returned pointer for consistency */
+ if (memory_info.BaseAddress && base_reserved != memory_info.BaseAddress)
+ goto sbrk_exit;
+ /* Assert postconditions */
+ assert ((unsigned) base_reserved % g_regionsize == 0);
+#ifdef TRACE
+ printf ("Reserve %p %d\n", base_reserved, reserve_size);
+#endif
+ /* Did we get contiguous memory? */
+ if (contiguous) {
+ long start_size = (char *) g_last->top_committed - (char *) g_last->top_allocated;
+ /* Adjust allocation size */
+ allocate_size -= start_size;
+ /* Adjust the regions allocation top */
+ g_last->top_allocated = g_last->top_committed;
+ /* Recompute the size to commit */
+ to_commit = (char *) g_last->top_allocated + allocate_size - (char *) g_last->top_committed;
+ /* Round size to commit */
+ commit_size = CEIL (to_commit, g_my_pagesize);
+ }
+ /* Append the new region to the list */
+ if (! region_list_append (&g_last, base_reserved, reserve_size))
+ goto sbrk_exit;
+ /* Didn't we get contiguous memory? */
+ if (! contiguous) {
+ /* Recompute the size to commit */
+ to_commit = (char *) g_last->top_allocated + allocate_size - (char *) g_last->top_committed;
+ /* Round size to commit */
+ commit_size = CEIL (to_commit, g_my_pagesize);
+ }
+ }
+ }
+ /* Assert preconditions */
+ assert ((unsigned) g_last->top_committed % g_pagesize == 0);
+ assert (0 < commit_size && commit_size % g_pagesize == 0); {
+ /* Commit this */
+ void *base_committed = VirtualAlloc (g_last->top_committed, commit_size,
+ MEM_COMMIT, PAGE_READWRITE);
+ /* Check returned pointer for consistency */
+ if (base_committed != g_last->top_committed)
+ goto sbrk_exit;
+ /* Assert postconditions */
+ assert ((unsigned) base_committed % g_pagesize == 0);
+#ifdef TRACE
+ printf ("Commit %p %d\n", base_committed, commit_size);
+#endif
+ /* Adjust the regions commit top */
+ g_last->top_committed = (char *) base_committed + commit_size;
+ }
+ }
+ /* Adjust the regions allocation top */
+ g_last->top_allocated = (char *) g_last->top_allocated + allocate_size;
+ result = (char *) g_last->top_allocated - size;
+ /* Deallocation requested? */
+ } else if (size < 0) {
+ long deallocate_size = - size;
+ /* As long as we have a region to release */
+ while ((char *) g_last->top_allocated - deallocate_size < (char *) g_last->top_reserved - g_last->reserve_size) {
+ /* Get the size to release */
+ long release_size = g_last->reserve_size;
+ /* Get the base address */
+ void *base_reserved = (char *) g_last->top_reserved - release_size;
+ /* Assert preconditions */
+ assert ((unsigned) base_reserved % g_regionsize == 0);
+ assert (0 < release_size && release_size % g_regionsize == 0); {
+ /* Release this */
+ int rc = VirtualFree (base_reserved, 0,
+ MEM_RELEASE);
+ /* Check returned code for consistency */
+ if (! rc)
+ goto sbrk_exit;
+#ifdef TRACE
+ printf ("Release %p %d\n", base_reserved, release_size);
+#endif
+ }
+ /* Adjust deallocation size */
+ deallocate_size -= (char *) g_last->top_allocated - (char *) base_reserved;
+ /* Remove the old region from the list */
+ if (! region_list_remove (&g_last))
+ goto sbrk_exit;
+ } {
+ /* Compute the size to decommit */
+ long to_decommit = (char *) g_last->top_committed - ((char *) g_last->top_allocated - deallocate_size);
+ if (to_decommit >= g_my_pagesize) {
+ /* Compute the size to decommit */
+ long decommit_size = FLOOR (to_decommit, g_my_pagesize);
+ /* Compute the base address */
+ void *base_committed = (char *) g_last->top_committed - decommit_size;
+ /* Assert preconditions */
+ assert ((unsigned) base_committed % g_pagesize == 0);
+ assert (0 < decommit_size && decommit_size % g_pagesize == 0); {
+ /* Decommit this */
+ int rc = VirtualFree ((char *) base_committed, decommit_size,
+ MEM_DECOMMIT);
+ /* Check returned code for consistency */
+ if (! rc)
+ goto sbrk_exit;
+#ifdef TRACE
+ printf ("Decommit %p %d\n", base_committed, decommit_size);
+#endif
+ }
+ /* Adjust deallocation size and regions commit and allocate top */
+ deallocate_size -= (char *) g_last->top_allocated - (char *) base_committed;
+ g_last->top_committed = base_committed;
+ g_last->top_allocated = base_committed;
+ }
+ }
+ /* Adjust regions allocate top */
+ g_last->top_allocated = (char *) g_last->top_allocated - deallocate_size;
+ /* Check for underflow */
+ if ((char *) g_last->top_reserved - g_last->reserve_size > (char *) g_last->top_allocated ||
+ g_last->top_allocated > g_last->top_committed) {
+ /* Adjust regions allocate top */
+ g_last->top_allocated = (char *) g_last->top_reserved - g_last->reserve_size;
+ goto sbrk_exit;
+ }
+ result = g_last->top_allocated;
+ }
+ /* Assert invariants */
+ assert (g_last);
+ assert ((char *) g_last->top_reserved - g_last->reserve_size <= (char *) g_last->top_allocated &&
+ g_last->top_allocated <= g_last->top_committed);
+ assert ((char *) g_last->top_reserved - g_last->reserve_size <= (char *) g_last->top_committed &&
+ g_last->top_committed <= g_last->top_reserved &&
+ (unsigned) g_last->top_committed % g_pagesize == 0);
+ assert ((unsigned) g_last->top_reserved % g_regionsize == 0);
+ assert ((unsigned) g_last->reserve_size % g_regionsize == 0);
+
+sbrk_exit:
+#if defined (USE_MALLOC_LOCK) && defined (NEEDED)
+ /* Release spin lock */
+ slrelease (&g_sl);
+#endif
+ return result;
+}
+
+/* mmap for windows */
+static void *mmap (void *ptr, long size, long prot, long type, long handle, long arg) {
+ static long g_pagesize;
+ static long g_regionsize;
+#ifdef TRACE
+ printf ("mmap %d\n", size);
+#endif
+#if defined (USE_MALLOC_LOCK) && defined (NEEDED)
+ /* Wait for spin lock */
+ slwait (&g_sl);
+#endif
+ /* First time initialization */
+ if (! g_pagesize)
+ g_pagesize = getpagesize ();
+ if (! g_regionsize)
+ g_regionsize = getregionsize ();
+ /* Assert preconditions */
+ assert ((unsigned) ptr % g_regionsize == 0);
+ assert (size % g_pagesize == 0);
+ /* Allocate this */
+ ptr = VirtualAlloc (ptr, size,
+ MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);
+ if (! ptr) {
+ ptr = (void *) MORECORE_FAILURE;
+ goto mmap_exit;
+ }
+ /* Assert postconditions */
+ assert ((unsigned) ptr % g_regionsize == 0);
+#ifdef TRACE
+ printf ("Commit %p %d\n", ptr, size);
+#endif
+mmap_exit:
+#if defined (USE_MALLOC_LOCK) && defined (NEEDED)
+ /* Release spin lock */
+ slrelease (&g_sl);
+#endif
+ return ptr;
+}
+
+/* munmap for windows */
+static long munmap (void *ptr, long size) {
+ static long g_pagesize;
+ static long g_regionsize;
+ int rc = MUNMAP_FAILURE;
+#ifdef TRACE
+ printf ("munmap %p %d\n", ptr, size);
+#endif
+#if defined (USE_MALLOC_LOCK) && defined (NEEDED)
+ /* Wait for spin lock */
+ slwait (&g_sl);
+#endif
+ /* First time initialization */
+ if (! g_pagesize)
+ g_pagesize = getpagesize ();
+ if (! g_regionsize)
+ g_regionsize = getregionsize ();
+ /* Assert preconditions */
+ assert ((unsigned) ptr % g_regionsize == 0);
+ assert (size % g_pagesize == 0);
+ /* Free this */
+ if (! VirtualFree (ptr, 0,
+ MEM_RELEASE))
+ goto munmap_exit;
+ rc = 0;
+#ifdef TRACE
+ printf ("Release %p %d\n", ptr, size);
+#endif
+munmap_exit:
+#if defined (USE_MALLOC_LOCK) && defined (NEEDED)
+ /* Release spin lock */
+ slrelease (&g_sl);
+#endif
+ return rc;
+}
+
+static void vminfo (unsigned long *free, unsigned long *reserved, unsigned long *committed) {
+ MEMORY_BASIC_INFORMATION memory_info;
+ memory_info.BaseAddress = 0;
+ *free = *reserved = *committed = 0;
+ while (VirtualQuery (memory_info.BaseAddress, &memory_info, sizeof (memory_info))) {
+ switch (memory_info.State) {
+ case MEM_FREE:
+ *free += memory_info.RegionSize;
+ break;
+ case MEM_RESERVE:
+ *reserved += memory_info.RegionSize;
+ break;
+ case MEM_COMMIT:
+ *committed += memory_info.RegionSize;
+ break;
+ }
+ memory_info.BaseAddress = (char *) memory_info.BaseAddress + memory_info.RegionSize;
+ }
+}
+
+static int cpuinfo (int whole, unsigned long *kernel, unsigned long *user) {
+ if (whole) {
+ __int64 creation64, exit64, kernel64, user64;
+ int rc = GetProcessTimes (GetCurrentProcess (),
+ (FILETIME *) &creation64,
+ (FILETIME *) &exit64,
+ (FILETIME *) &kernel64,
+ (FILETIME *) &user64);
+ if (! rc) {
+ *kernel = 0;
+ *user = 0;
+ return FALSE;
+ }
+ *kernel = (unsigned long) (kernel64 / 10000);
+ *user = (unsigned long) (user64 / 10000);
+ return TRUE;
+ } else {
+ __int64 creation64, exit64, kernel64, user64;
+ int rc = GetThreadTimes (GetCurrentThread (),
+ (FILETIME *) &creation64,
+ (FILETIME *) &exit64,
+ (FILETIME *) &kernel64,
+ (FILETIME *) &user64);
+ if (! rc) {
+ *kernel = 0;
+ *user = 0;
+ return FALSE;
+ }
+ *kernel = (unsigned long) (kernel64 / 10000);
+ *user = (unsigned long) (user64 / 10000);
+ return TRUE;
+ }
+}
+
+#endif /* WIN32 */
+
+/*
+
+History:
+
+ V2.7.0
+ * new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>.
+ * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for
+ helping test this.)
+ * memalign: check alignment arg
+ * realloc: use memmove when regions may overlap.
+ * Collect all cases in malloc requiring system memory into sYSMALLOc
+ * Use mmap as backup to sbrk, if available; fold these mmap-related
+ operations into others.
+ * Place all internal state in malloc_state
+ * Introduce fastbins (although similar to 2.5.1)
+ * Many minor tunings and cosmetic improvements
+ * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK
+ * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS
+ Thanks to Tony E. Bennett <tbennett@nvidia.com> and others.
+ * Adjust request2size to fit with MALLOC_FAILURE_ACTION.
+ * Include errno.h to support default failure action.
+ * Further improve WIN32 'sbrk()' emulation's 'findRegion()' routine
+ to avoid infinite loop when allocating initial memory larger
+ than RESERVED_SIZE and/or subsequent memory larger than
+ NEXT_SIZE. Thanks to Andreas Mueller <a.mueller at paradatec.de>
+ for finding this one.
+
+ V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee)
+ * return null for negative arguments
+ * Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com>
+ * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
+ (e.g. WIN32 platforms)
+ * Cleanup header file inclusion for WIN32 platforms
+ * Cleanup code to avoid Microsoft Visual C++ compiler complaints
+ * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
+ memory allocation routines
+ * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
+ * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
+ usage of 'assert' in non-WIN32 code
+ * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
+ avoid infinite loop
+ * Always call 'fREe()' rather than 'free()'
+
+ V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee)
+ * Fixed ordering problem with boundary-stamping
+
+ V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee)
+ * Added pvalloc, as recommended by H.J. Liu
+ * Added 64bit pointer support mainly from Wolfram Gloger
+ * Added anonymously donated WIN32 sbrk emulation
+ * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
+ * malloc_extend_top: fix mask error that caused wastage after
+ foreign sbrks
+ * Add linux mremap support code from HJ Liu
+
+ V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee)
+ * Integrated most documentation with the code.
+ * Add support for mmap, with help from
+ Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
+ * Use last_remainder in more cases.
+ * Pack bins using idea from colin@nyx10.cs.du.edu
+ * Use ordered bins instead of best-fit threshhold
+ * Eliminate block-local decls to simplify tracing and debugging.
+ * Support another case of realloc via move into top
+ * Fix error occuring when initial sbrk_base not word-aligned.
+ * Rely on page size for units instead of SBRK_UNIT to
+ avoid surprises about sbrk alignment conventions.
+ * Add mallinfo, mallopt. Thanks to Raymond Nijssen
+ (raymond@es.ele.tue.nl) for the suggestion.
+ * Add `pad' argument to malloc_trim and top_pad mallopt parameter.
+ * More precautions for cases where other routines call sbrk,
+ courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
+ * Added macros etc., allowing use in linux libc from
+ H.J. Lu (hjl@gnu.ai.mit.edu)
+ * Inverted this history list
+
+ V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee)
+ * Re-tuned and fixed to behave more nicely with V2.6.0 changes.
+ * Removed all preallocation code since under current scheme
+ the work required to undo bad preallocations exceeds
+ the work saved in good cases for most test programs.
+ * No longer use return list or unconsolidated bins since
+ no scheme using them consistently outperforms those that don't
+ given above changes.
+ * Use best fit for very large chunks to prevent some worst-cases.
+ * Added some support for debugging
+
+ V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee)
+ * Removed footers when chunks are in use. Thanks to
+ Paul Wilson (wilson@cs.texas.edu) for the suggestion.
+
+ V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee)
+ * Added malloc_trim, with help from Wolfram Gloger
+ (wmglo@Dent.MED.Uni-Muenchen.DE).
+
+ V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g)
+
+ V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g)
+ * realloc: try to expand in both directions
+ * malloc: swap order of clean-bin strategy;
+ * realloc: only conditionally expand backwards
+ * Try not to scavenge used bins
+ * Use bin counts as a guide to preallocation
+ * Occasionally bin return list chunks in first scan
+ * Add a few optimizations from colin@nyx10.cs.du.edu
+
+ V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g)
+ * faster bin computation & slightly different binning
+ * merged all consolidations to one part of malloc proper
+ (eliminating old malloc_find_space & malloc_clean_bin)
+ * Scan 2 returns chunks (not just 1)
+ * Propagate failure in realloc if malloc returns 0
+ * Add stuff to allow compilation on non-ANSI compilers
+ from kpv@research.att.com
+
+ V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu)
+ * removed potential for odd address access in prev_chunk
+ * removed dependency on getpagesize.h
+ * misc cosmetics and a bit more internal documentation
+ * anticosmetics: mangled names in macros to evade debugger strangeness
+ * tested on sparc, hp-700, dec-mips, rs6000
+ with gcc & native cc (hp, dec only) allowing
+ Detlefs & Zorn comparison study (in SIGPLAN Notices.)
+
+ Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu)
+ * Based loosely on libg++-1.2X malloc. (It retains some of the overall
+ structure of old version, but most details differ.)
+
+*/
+
+
diff --git a/src/libs/xpcom18a4/xpcom/build/nsOS2VACLegacy.cpp b/src/libs/xpcom18a4/xpcom/build/nsOS2VACLegacy.cpp
new file mode 100644
index 00000000..c9c04b30
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/nsOS2VACLegacy.cpp
@@ -0,0 +1,753 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * innotek GmbH.
+ * Portions created by the Initial Developer are Copyright (C) 2003
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * innotek GmbH / Knut St. Osmundsen
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*
+ * This module contains wrappers for a handful of XPCOM methods which someone
+ * have been so kind as to link their plugins against. This module will only
+ * provide the minimum of what necessary to make legacy plugins work with
+ * the GCC based mozilla. Luckily this only means the IBM oji JAVA plugins.
+ *
+ * Actually, I haven't seen npoji6 calling any of these yet.
+ */
+
+/*******************************************************************************
+* Defined Constants And Macros *
+*******************************************************************************/
+/** @group Visual Age for C++ v3.6.5 target (OS/2). */
+/* @{ */
+/** Indicate Visual Age for C++ v3.6.5 target */
+#define VFT_VAC365 1
+/** VFTable/Interface Calling Convention for Win32. */
+#define VFTCALL _Optlink
+/** First Entry which VAC uses. */
+#define VFTFIRST_DECL unsigned uFirst[2]
+#define VFTFIRST_VAL() {0, 0},
+/** This deltas which VAC uses. */
+#define VFTDELTA_DECL(n) unsigned uDelta##n
+#define VFTDELTA_VAL() 0,
+/** @} */
+
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include "nscore.h"
+#include "nsIServiceManagerUtils.h"
+
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
+#ifndef __cplusplus
+typedef struct nsID
+{
+ PRUint32 m0;
+ PRUint16 m1;
+ PRUint16 m2;
+ PRUint8 m3[8];
+} nsID, nsCID, nsIID;
+#define REFNSIID const nsIID *
+
+typedef PRUint32 nsrefcnt;
+#endif
+
+
+/**
+ * nsISupports vftable.
+ */
+typedef struct vftable_nsISupports
+{
+ VFTFIRST_DECL;
+ nsresult (*VFTCALL QueryInterface)(void *pvThis, REFNSIID aIID, void** aInstancePtr);
+ VFTDELTA_DECL(QueryInterface);
+ nsrefcnt (*VFTCALL AddRef)(void *pvThis);
+ VFTDELTA_DECL(AddRef);
+ nsrefcnt (*VFTCALL Release)(void *pvThis);
+ VFTDELTA_DECL(Release);
+} VFTnsISupports;
+
+/**
+ * nsGetServiceByCID::nsCOMPtr_helper vftable.
+ */
+typedef struct vftable_nsGetServiceByCID_nsCOMPtr_helper
+{
+ VFTFIRST_DECL;
+ /* virtual nsresult operator()( const nsIID&, void** ) const; */
+ nsresult (*VFTCALL __operator_paratheses)(void *pvThis, REFNSIID aIID, void** aInstancePtr);
+ VFTDELTA_DECL(__operator_paratheses);
+ void * (*VFTCALL __destructor)(void *pvThis, unsigned __dtorFlags, unsigned __vtt);
+ VFTDELTA_DECL(__destructor);
+} VFTnsGetServiceByCID_nsCOMPtr_helper;
+
+/**
+ * nsQueryInterface::nsCOMPtr_helper vftable.
+ */
+typedef struct vftable_nsQueryInterface_nsCOMPtr_helper
+{
+ VFTFIRST_DECL;
+ nsresult (*VFTCALL __operator_paratheses)(void *pvThis, REFNSIID aIID, void** aInstancePtr);
+ VFTDELTA_DECL(__operator_paratheses);
+} VFTnsQueryInterface_nsCOMPtr_helper;
+
+
+
+
+/**
+ * nsISupport object.
+ */
+typedef struct obj_nsISupports
+{
+ VFTnsISupports *pVFT;
+} obj_nsISupports;
+
+/**
+ * nsCOMPtr_base object.
+ */
+typedef struct obj_nsCOMPtr_base
+{
+ obj_nsISupports *mRawPtr;
+} obj_nsCOMPtr_base;
+
+/**
+ * nsGetServiceByCID_nsCOMPtr_helper object.
+ */
+typedef struct obj_nsGetServiceByCID_nsCOMPtr_helper
+{
+ VFTnsGetServiceByCID_nsCOMPtr_helper *pVFT; /* ?? */
+ nsID *mCID; /* const nsCID& */
+ void *mServiceManager;/* nsCOMPtr<nsIServiceManager> */
+ nsresult *mErrorPtr;
+} obj_nsGetServiceByCID_nsCOMPtr_helper;
+
+/**
+ * nsQueryInterface_nsCOMPtr_helper object.
+ */
+typedef struct obj_nsQueryInterface_nsCOMPtr_helper
+{
+ VFTnsQueryInterface_nsCOMPtr_helper *pVFT; /* ?? */
+ obj_nsISupports *mRawPtr; /* const nsCID& */
+ nsresult *mErrorPtr;
+} obj_nsQueryInterface_nsCOMPtr_helper;
+
+
+
+
+/**
+ * nsCOMPtr_base::~nsCOMPtr_base()
+ *
+ * @remark This guys doing the oji plugin have been very unfortunate to link in this
+ * without any similar new operator. The object is thus created in the plugin
+ * but freed by xpcom.dll. As the plugin and mozilla have different CRTs this
+ * is a good way of asking for trouble. But, they guys've been lucky, the VAC
+ * CRT might just handle this ok.
+ * However, we cannot perform this delete as we have no VAC CRT around, and
+ * hence we will leak this object.
+ * ----
+ * assembly:
+ public __dt__13nsCOMPtr_baseFv
+__dt__13nsCOMPtr_baseFv proc
+ push ebp
+ mov ebp,esp
+ sub esp,08h
+ mov [ebp+08h],eax; this
+ mov [ebp+0ch],edx; __dtorFlags
+
+; 63 if ( mRawPtr )
+ mov eax,[ebp+08h]; this
+ cmp dword ptr [eax],0h
+ je @BLBL4
+
+; 64 NSCAP_RELEASE(this, mRawPtr);
+ mov ecx,[ebp+08h]; this
+ mov ecx,[ecx]
+ mov ecx,[ecx]
+ mov eax,[ebp+08h]; this
+ mov eax,[eax]
+ add eax,[ecx+01ch]
+ mov ecx,[ebp+08h]; this
+ mov ecx,[ecx]
+ mov ecx,[ecx]
+ call dword ptr [ecx+018h]
+@BLBL4:
+
+; 65 }
+ test byte ptr [ebp+0ch],01h; __dtorFlags
+ je @BLBL6
+ mov eax,[ebp+08h]; this
+ call __dl__FPv
+@BLBL6:
+ mov eax,[ebp+08h]; this
+ add esp,08h
+ pop ebp
+ ret
+__dt__13nsCOMPtr_baseFv endp
+*/
+extern "C" void * VFTCALL __dt__13nsCOMPtr_baseFv(void *pvThis, unsigned __dtorFlags)
+{
+ obj_nsCOMPtr_base *pThis = (obj_nsCOMPtr_base*)pvThis;
+//asm("int $3");
+ if (pThis->mRawPtr)
+ {
+ /* NSCAP_RELEASE(this, mRawPtr); */
+ pThis->mRawPtr->pVFT->Release((char*)pThis->mRawPtr + pThis->mRawPtr->pVFT->uDeltaRelease);
+ }
+
+ /*
+ * Delete the object...
+ * (As memtioned before we'll rather leak this.)
+ */
+ #if 0
+ if (!(__dtorFlags & 1))
+ __dl__FPv(this)
+ #endif
+
+ return pvThis;
+}
+
+/** workaround for _Optlink bug.. */
+extern "C" void * VFTCALL _dt__13nsCOMPtr_baseFv(void *pvThis, unsigned __dtorFlags)
+{
+ return __dt__13nsCOMPtr_baseFv(pvThis, __dtorFlags);
+}
+
+
+
+/**
+ *
+ * -----
+ * assembly:
+; 92 nsGetServiceByCID::operator()( const nsIID& aIID, void** aInstancePtr ) const
+ align 010h
+
+ public __cl__17nsGetServiceByCIDCFRC4nsIDPPv
+__cl__17nsGetServiceByCIDCFRC4nsIDPPv proc
+ push ebp
+ mov ebp,esp
+ sub esp,014h
+ push ebx
+ sub esp,08h
+ mov [ebp+08h],eax; this
+ mov [ebp+0ch],edx; aIID
+ mov [ebp+010h],ecx; aInstancePtr
+
+; 94 nsresult status = NS_ERROR_FAILURE;
+ mov dword ptr [ebp-04h],080004005h; status
+
+; 95 if ( mServiceManager ) {
+ mov eax,[ebp+08h]; this
+ add eax,08h
+ call __opP13nsDerivedSafeXT17nsIServiceManager___8nsCOMPtrXT17nsIServiceManager_CFv
+ test eax,eax
+ je @BLBL13
+
+; 96 status = mServiceManager->GetService(mCID, aIID, (void**)aInstancePtr);
+ mov eax,[ebp+08h]; this
+ add eax,08h
+ call __rf__8nsCOMPtrXT17nsIServiceManager_CFv
+ mov [ebp-08h],eax; __212
+ mov eax,[ebp+010h]; aInstancePtr
+ push eax
+ mov ecx,[ebp+0ch]; aIID
+ mov edx,[ebp+08h]; this
+ mov edx,[edx+04h]
+ mov ebx,[ebp-08h]; __212
+ mov ebx,[ebx]
+ mov eax,[ebp-08h]; __212
+ add eax,[ebx+024h]
+ sub esp,0ch
+ mov ebx,[ebp-08h]; __212
+ mov ebx,[ebx]
+ call dword ptr [ebx+020h]
+ add esp,010h
+ mov [ebp-04h],eax; status
+
+; 97 } else {
+ jmp @BLBL14
+ align 010h
+@BLBL13:
+
+; 95 if ( mServiceManager ) {
+
+; 98 nsCOMPtr<nsIServiceManager> mgr;
+ lea eax,[ebp-0ch]; mgr
+ call __ct__8nsCOMPtrXT17nsIServiceManager_Fv
+
+; 99 NS_GetServiceManager(getter_AddRefs(mgr));
+ lea edx,[ebp-0ch]; mgr
+ lea eax,[ebp-010h]; __216
+ call getter_AddRefs__FR8nsCOMPtrXT17nsIServiceManager_
+ sub esp,04h
+ lea eax,[ebp-010h]; __216
+ sub esp,04h
+ call __opPP17nsIServiceManager__15nsGetterAddRefsXT17nsIServiceManager_Fv
+ add esp,08h
+ call NS_GetServiceManager
+ mov edx,02h
+ lea eax,[ebp-010h]; __216
+ call __dt__15nsGetterAddRefsXT17nsIServiceManager_Fv
+
+; 100 if (mgr)
+ lea eax,[ebp-0ch]; mgr
+ call __opP13nsDerivedSafeXT17nsIServiceManager___8nsCOMPtrXT17nsIServiceManager_CFv
+ test eax,eax
+ je @BLBL15
+
+; 101 status = mgr->GetService(mCID, aIID, (void**)aInstancePtr);
+ lea eax,[ebp-0ch]; mgr
+ call __rf__8nsCOMPtrXT17nsIServiceManager_CFv
+ mov [ebp-014h],eax; __217
+ mov eax,[ebp+010h]; aInstancePtr
+ push eax
+ mov ecx,[ebp+0ch]; aIID
+ mov edx,[ebp+08h]; this
+ mov edx,[edx+04h]
+ mov ebx,[ebp-014h]; __217
+ mov ebx,[ebx]
+ mov eax,[ebp-014h]; __217
+ add eax,[ebx+024h]
+ sub esp,0ch
+ mov ebx,[ebp-014h]; __217
+ mov ebx,[ebx]
+ call dword ptr [ebx+020h]
+ add esp,010h
+ mov [ebp-04h],eax; status
+@BLBL15:
+
+; 102 }
+ mov edx,02h
+ lea eax,[ebp-0ch]; mgr
+ call __dt__8nsCOMPtrXT17nsIServiceManager_Fv
+@BLBL14:
+
+; 103 if ( NS_FAILED(status) )
+ test byte ptr [ebp-01h],080h; status
+ je @BLBL16
+
+; 104 *aInstancePtr = 0;
+ mov eax,[ebp+010h]; aInstancePtr
+ mov dword ptr [eax],0h
+@BLBL16:
+
+; 106 if ( mErrorPtr )
+ mov eax,[ebp+08h]; this
+ cmp dword ptr [eax+0ch],0h
+ je @BLBL17
+
+; 107 *mErrorPtr = status;
+ mov eax,[ebp+08h]; this
+ mov eax,[eax+0ch]
+ mov ebx,[ebp-04h]; status
+ mov [eax],ebx
+@BLBL17:
+
+; 108 return status;
+ mov eax,[ebp-04h]; status
+ add esp,08h
+ pop ebx
+ mov esp,ebp
+ pop ebp
+ ret
+__cl__17nsGetServiceByCIDCFRC4nsIDPPv endp
+
+ * -----
+ * C++ Code:
+nsresult
+nsGetServiceByCID::operator()( const nsIID& aIID, void** aInstancePtr ) const
+{
+ nsresult status = NS_ERROR_FAILURE;
+ if ( mServiceManager ) {
+ status = mServiceManager->GetService(mCID, aIID, (void**)aInstancePtr);
+ } else {
+ nsCOMPtr<nsIServiceManager> mgr;
+ NS_GetServiceManager(getter_AddRefs(mgr));
+ if (mgr)
+ status = mgr->GetService(mCID, aIID, (void**)aInstancePtr);
+ }
+ if ( NS_FAILED(status) )
+ *aInstancePtr = 0;
+
+ if ( mErrorPtr )
+ *mErrorPtr = status;
+ return status;
+}
+ */
+extern "C" nsresult VFTCALL GSBC_COM__operator_paratheses(void *pvThis, REFNSIID aIID, void** aInstancePtr)
+{
+ obj_nsGetServiceByCID_nsCOMPtr_helper *pThis = (obj_nsGetServiceByCID_nsCOMPtr_helper *)pvThis;
+ nsresult status = NS_ERROR_FAILURE;
+//asm("int $3");
+
+ /* For convenience we don't use mServiceManager here because it's a wrapped object.
+ * We ASSUME that there is only one service manager floating around....
+ */
+ nsCOMPtr<nsIServiceManager> mgr;
+ NS_GetServiceManager(getter_AddRefs(mgr));
+ if (mgr)
+ status = mgr->GetService(*pThis->mCID, aIID, (void**)aInstancePtr);
+
+ if (NS_FAILED(status))
+ *aInstancePtr = 0;
+
+ if (pThis->mErrorPtr)
+ *pThis->mErrorPtr = status;
+ return status;
+}
+
+/**
+ * Just a destructor.
+ * -----
+ * assembly:
+; 59 virtual ~nsGetServiceByCID() {};
+ align 010h
+
+__dt__17nsGetServiceByCIDFv proc
+ push ebp
+ mov ebp,esp
+ sub esp,08h
+ mov [ebp+08h],eax; this
+ mov [ebp+0ch],edx; __dtorFlags
+ mov [ebp+010h],ecx; __vtt
+ mov eax,[ebp+08h]; this
+ mov dword ptr [eax],offset FLAT:__vft17nsGetServiceByCID15nsCOMPtr_helper
+ mov edx,02h
+ mov eax,[ebp+08h]; this
+ add eax,08h
+ call __dt__8nsCOMPtrXT17nsIServiceManager_Fv
+ test byte ptr [ebp+0ch],01h; __dtorFlags
+ je @BLBL24
+ mov eax,[ebp+08h]; this
+ call __dl__FPv
+@BLBL24:
+ mov eax,[ebp+08h]; this
+ add esp,08h
+ pop ebp
+ ret
+__dt__17nsGetServiceByCIDFv endp
+ */
+extern "C" void * VFTCALL GSBC_COM__destructor(void *pvThis, unsigned __dtorFlags, unsigned __vtt)
+{
+ obj_nsGetServiceByCID_nsCOMPtr_helper *pThis = (obj_nsGetServiceByCID_nsCOMPtr_helper *)pvThis;
+//asm("int $3");
+
+ /*
+ * Because previously mentioned issues with VAC heaps, we'll
+ * not do anything in here.
+ * (We will then skip destruction of all parents and such, but
+ * I don't think that will hurt anyone.)
+ */
+ __dtorFlags = __dtorFlags;
+ __vtt = __vtt;
+ return pThis;
+}
+
+
+/**
+ * VFT for nsGetServiceByCID::nsCOMPtr_helper or something like that.
+ * It's just implementing an operator() and the destructor.
+ *
+ * @remark We need to skip an underscore to get the name right.
+ * ----
+ * assembly:
+__vft17nsGetServiceByCID15nsCOMPtr_helper dd 0
+ db 0h,0h,0h,0h
+ dd offset FLAT:__cl__17nsGetServiceByCIDCFRC4nsIDPPv
+ db 0h,0h,0h,0h
+ dd offset FLAT:__dt__17nsGetServiceByCIDFv
+ db 0h,0h,0h,0h
+ */
+extern const VFTnsGetServiceByCID_nsCOMPtr_helper _vft17nsGetServiceByCID15nsCOMPtr_helper =
+{
+ VFTFIRST_VAL()
+ GSBC_COM__operator_paratheses, VFTDELTA_VAL()
+ GSBC_COM__destructor, VFTDELTA_VAL()
+};
+
+
+
+/**
+ *
+ * -----
+ * assembly
+; 42 nsQueryInterface::operator()( const nsIID& aIID, void** answer ) const
+ align 010h
+
+ public __cl__16nsQueryInterfaceCFRC4nsIDPPv
+__cl__16nsQueryInterfaceCFRC4nsIDPPv proc
+ push ebp
+ mov ebp,esp
+ sub esp,08h
+ push ebx
+ sub esp,0ch
+ mov [ebp+08h],eax; this
+ mov [ebp+0ch],edx; aIID
+ mov [ebp+010h],ecx; answer
+
+; 45 if ( mRawPtr )
+ mov eax,[ebp+08h]; this
+ cmp dword ptr [eax+04h],0h
+ je @BLBL1
+
+; 46 {
+; 47 status = mRawPtr->QueryInterface(aIID, answer);
+ mov ecx,[ebp+010h]; answer
+ mov edx,[ebp+0ch]; aIID
+ mov ebx,[ebp+08h]; this
+ mov ebx,[ebx+04h]
+ mov ebx,[ebx]
+ mov eax,[ebp+08h]; this
+ mov eax,[eax+04h]
+ add eax,[ebx+0ch]
+ mov ebx,[ebp+08h]; this
+ mov ebx,[ebx+04h]
+ mov ebx,[ebx]
+ call dword ptr [ebx+08h]
+ mov [ebp-04h],eax; status
+
+; 48 #ifdef NSCAP_FEATURE_TEST_NONNULL_QUERY_SUCCEEDS
+; 49 NS_WARN_IF_FALSE(NS_SUCCEEDED(status), "interface not found---were you expecting that?");
+; 50 #endif
+; 51 }
+ jmp @BLBL2
+ align 010h
+@BLBL1:
+
+; 45 if ( mRawPtr )
+
+; 53 status = NS_ERROR_NULL_POINTER;
+ mov dword ptr [ebp-04h],080004003h; status
+@BLBL2:
+
+; 55 if ( mErrorPtr )
+ mov eax,[ebp+08h]; this
+ cmp dword ptr [eax+08h],0h
+ je @BLBL3
+
+; 56 *mErrorPtr = status;
+ mov eax,[ebp+08h]; this
+ mov eax,[eax+08h]
+ mov ebx,[ebp-04h]; status
+ mov [eax],ebx
+@BLBL3:
+
+; 57 return status;
+ mov eax,[ebp-04h]; status
+ add esp,0ch
+ pop ebx
+ mov esp,ebp
+ pop ebp
+ ret
+__cl__16nsQueryInterfaceCFRC4nsIDPPv endp
+
+ * -----
+ * C++ Code:
+nsresult
+nsQueryInterface::operator()( const nsIID& aIID, void** answer ) const
+ {
+ nsresult status;
+ if ( mRawPtr )
+ {
+ status = mRawPtr->QueryInterface(aIID, answer);
+#ifdef NSCAP_FEATURE_TEST_NONNULL_QUERY_SUCCEEDS
+ NS_WARN_IF_FALSE(NS_SUCCEEDED(status), "interface not found---were you expecting that?");
+#endif
+ }
+ else
+ status = NS_ERROR_NULL_POINTER;
+
+ if ( mErrorPtr )
+ *mErrorPtr = status;
+ return status;
+ }
+ */
+extern "C" nsresult VFTCALL QI_COM__operator_paratheses(void *pvThis, REFNSIID aIID, void** aInstancePtr)
+{
+ obj_nsQueryInterface_nsCOMPtr_helper *pThis = (obj_nsQueryInterface_nsCOMPtr_helper *)pvThis;
+ nsresult status = NS_ERROR_NULL_POINTER;
+//asm("int $3");
+
+ if (pThis->mRawPtr)
+ {
+ status = pThis->mRawPtr->pVFT->QueryInterface(pThis->mRawPtr, aIID, aInstancePtr);
+ /* don't care about warnings, do we? */
+ }
+
+ if (pThis->mErrorPtr)
+ *pThis->mErrorPtr = status;
+ return status;
+}
+
+
+
+/**
+ * VFT for nsQueryInterface::nsCOMPtr_helper or something like that.
+ * No destructor, only an operator().
+ *
+ * @remark We need to skip an underscore to get the name right.
+ * -----
+ * assembly:
+__vft16nsQueryInterface15nsCOMPtr_helper dd 0
+ db 0h,0h,0h,0h
+ dd offset FLAT:__cl__16nsQueryInterfaceCFRC4nsIDPPv
+ db 0h,0h,0h,0h
+ */
+extern const VFTnsQueryInterface_nsCOMPtr_helper _vft16nsQueryInterface15nsCOMPtr_helper =
+{
+ VFTFIRST_VAL()
+ QI_COM__operator_paratheses, VFTDELTA_VAL()
+};
+
+/**
+ *
+ * -----
+ * C++ Code:
+void
+assign_assuming_AddRef( nsISupports* newPtr )
+{
+ / *
+ |AddRef()|ing the new value (before entering this function) before
+ |Release()|ing the old lets us safely ignore the self-assignment case.
+ We must, however, be careful only to |Release()| _after_ doing the
+ assignment, in case the |Release()| leads to our _own_ destruction,
+ which would, in turn, cause an incorrect second |Release()| of our old
+ pointer. Thank <waterson@netscape.com> for discovering this.
+ * /
+ nsISupports* oldPtr = mRawPtr;
+ mRawPtr = newPtr;
+ NSCAP_LOG_ASSIGNMENT(this, newPtr);
+ NSCAP_LOG_RELEASE(this, oldPtr);
+ if ( oldPtr )
+ NSCAP_RELEASE(this, oldPtr);
+}
+ */
+extern "C" void VFTCALL assign_assuming_AddRef__13nsCOMPtr_baseFP11nsISupports(void *pvThis, obj_nsISupports *newPtr)
+{
+ obj_nsCOMPtr_base *pThis = (obj_nsCOMPtr_base *)pvThis;
+ obj_nsISupports *oldPtr;
+
+ oldPtr = pThis->mRawPtr;
+ pThis->mRawPtr = newPtr;
+ if (oldPtr)
+ {
+ /* NSCAP_RELEASE(this, oldPtr); */
+ pThis->mRawPtr->pVFT->Release(oldPtr + oldPtr->pVFT->uDeltaRelease);
+ }
+}
+
+
+
+
+/**
+ *
+ * -----
+ * Assembly:
+; 77 nsCOMPtr_base::assign_from_helper( const nsCOMPtr_helper& helper, const nsIID& iid )
+ align 010h
+
+ public assign_from_helper__13nsCOMPtr_baseFRC15nsCOMPtr_helperRC4nsID
+assign_from_helper__13nsCOMPtr_baseFRC15nsCOMPtr_helperRC4nsID proc
+ push ebp
+ mov ebp,esp
+ sub esp,08h
+ push ebx
+ sub esp,0ch
+ mov [ebp+08h],eax; this
+ mov [ebp+0ch],edx; helper
+ mov [ebp+010h],ecx; iid
+
+; 80 if ( NS_FAILED( helper(iid, NS_REINTERPRET_CAST(void**, &newRawPtr)) ) )
+ lea ecx,[ebp-04h]; newRawPtr
+ mov edx,[ebp+010h]; iid
+ mov ebx,[ebp+0ch]; helper
+ mov ebx,[ebx]
+ mov eax,[ebp+0ch]; helper
+ add eax,[ebx+0ch]
+ mov ebx,[ebp+0ch]; helper
+ mov ebx,[ebx]
+ call dword ptr [ebx+08h]
+ test eax,080000000h
+ je @BLBL8
+
+; 81 newRawPtr = 0;
+ mov dword ptr [ebp-04h],0h; newRawPtr
+@BLBL8:
+
+; 82 assign_assuming_AddRef(newRawPtr);
+ mov edx,[ebp-04h]; newRawPtr
+ mov eax,[ebp+08h]; this
+ call assign_assuming_AddRef__13nsCOMPtr_baseFP11nsISupports
+ add esp,0ch
+ pop ebx
+ mov esp,ebp
+ pop ebp
+ ret
+assign_from_helper__13nsCOMPtr_baseFRC15nsCOMPtr_helperRC4nsID endp
+
+ * -----
+ * C Code:
+void
+nsCOMPtr_base::assign_from_helper( const nsCOMPtr_helper& helper, const nsIID& iid )
+ {
+ nsISupports* newRawPtr;
+ if ( NS_FAILED( helper(iid, NS_REINTERPRET_CAST(void**, &newRawPtr)) ) )
+ newRawPtr = 0;
+ assign_assuming_AddRef(newRawPtr);
+ }
+ */
+extern "C" void VFTCALL assign_from_helper__13nsCOMPtr_baseFRC15nsCOMPtr_helperRC4nsID(
+ void *pvThis, void * helper, REFNSIID iid)
+{
+ obj_nsCOMPtr_base *pThis = (obj_nsCOMPtr_base *)pvThis;
+ obj_nsISupports* newRawPtr = NULL;
+ nsresult status = NS_ERROR_FAILURE;
+//asm("int $3");
+
+ /* this may or may not be correct but the layout is the same. */
+ obj_nsQueryInterface_nsCOMPtr_helper * pHelper = (obj_nsQueryInterface_nsCOMPtr_helper*)helper;
+
+ /* if ( NS_FAILED( helper(iid, NS_REINTERPRET_CAST(void**, &newRawPtr)) ) ) */
+ status = pHelper->pVFT->__operator_paratheses((char*)pHelper + pHelper->pVFT->uDelta__operator_paratheses,
+ iid, (void**)&newRawPtr);
+ if (NS_FAILED(status))
+ newRawPtr = 0;
+
+ /* assign_assuming_AddRef(newRawPtr); */
+ assign_assuming_AddRef__13nsCOMPtr_baseFP11nsISupports(pThis, newRawPtr);
+}
+
+
+
diff --git a/src/libs/xpcom18a4/xpcom/build/nsStringAPI.cpp b/src/libs/xpcom18a4/xpcom/build/nsStringAPI.cpp
new file mode 100644
index 00000000..ca9a76e4
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/nsStringAPI.cpp
@@ -0,0 +1,261 @@
+/* vim:set ts=2 sw=2 et cindent: */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla.
+ *
+ * The Initial Developer of the Original Code is IBM Corporation.
+ * Portions created by IBM Corporation are Copyright (C) 2003
+ * IBM Corporation. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Darin Fisher <darin@meer.net>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsString.h"
+#include "nsCharTraits.h"
+
+#define NS_STRINGAPI_IMPL
+#include "nsStringAPI.h"
+#include "nsNativeCharsetUtils.h"
+
+/* ------------------------------------------------------------------------- */
+
+NS_STRINGAPI(nsresult)
+NS_StringContainerInit(nsStringContainer &aContainer)
+{
+ NS_ASSERTION(sizeof(nsStringContainer) >= sizeof(nsString),
+ "nsStringContainer is not large enough");
+
+ // use placement new to avoid heap allocating nsString object
+ new (&aContainer) nsString();
+
+ return NS_OK;
+}
+
+NS_STRINGAPI(void)
+NS_StringContainerFinish(nsStringContainer &aContainer)
+{
+ // call the nsString dtor
+ NS_REINTERPRET_CAST(nsString *, &aContainer)->~nsString();
+}
+
+/* ------------------------------------------------------------------------- */
+
+NS_STRINGAPI(PRUint32)
+NS_StringGetData(const nsAString &aStr, const PRUnichar **aData,
+ PRBool *aTerminated)
+{
+ if (aTerminated)
+ *aTerminated = aStr.IsTerminated();
+
+ nsAString::const_iterator begin;
+ aStr.BeginReading(begin);
+ *aData = begin.get();
+ return begin.size_forward();
+}
+
+NS_STRINGAPI(PRUnichar *)
+NS_StringCloneData(const nsAString &aStr)
+{
+ return ToNewUnicode(aStr);
+}
+
+NS_STRINGAPI(nsresult)
+NS_StringSetData(nsAString &aStr, const PRUnichar *aData, PRUint32 aDataLength)
+{
+ aStr.Assign(aData, aDataLength);
+ return NS_OK; // XXX report errors
+}
+
+NS_STRINGAPI(nsresult)
+NS_StringSetDataRange(nsAString &aStr,
+ PRUint32 aCutOffset, PRUint32 aCutLength,
+ const PRUnichar *aData, PRUint32 aDataLength)
+{
+ if (aCutOffset == PR_UINT32_MAX)
+ {
+ // append case
+ if (aData)
+ aStr.Append(aData, aDataLength);
+ return NS_OK; // XXX report errors
+ }
+
+ if (aCutLength == PR_UINT32_MAX)
+ aCutLength = aStr.Length() - aCutOffset;
+
+ if (aData)
+ {
+ if (aDataLength == PR_UINT32_MAX)
+ aStr.Replace(aCutOffset, aCutLength, nsDependentString(aData));
+ else
+ aStr.Replace(aCutOffset, aCutLength, Substring(aData, aData + aDataLength));
+ }
+ else
+ aStr.Cut(aCutOffset, aCutLength);
+
+ return NS_OK; // XXX report errors
+}
+
+NS_STRINGAPI(nsresult)
+NS_StringCopy(nsAString &aDest, const nsAString &aSrc)
+{
+ aDest.Assign(aSrc);
+ return NS_OK; // XXX report errors
+}
+
+/* ------------------------------------------------------------------------- */
+
+NS_STRINGAPI(nsresult)
+NS_CStringContainerInit(nsCStringContainer &aContainer)
+{
+ NS_ASSERTION(sizeof(nsCStringContainer) >= sizeof(nsCString),
+ "nsCStringContainer is not large enough");
+
+ // use placement new to avoid heap allocating nsCString object
+ new (&aContainer) nsCString();
+
+ return NS_OK;
+}
+
+NS_STRINGAPI(void)
+NS_CStringContainerFinish(nsCStringContainer &aContainer)
+{
+ // call the nsCString dtor
+ NS_REINTERPRET_CAST(nsCString *, &aContainer)->~nsCString();
+}
+
+/* ------------------------------------------------------------------------- */
+
+NS_STRINGAPI(PRUint32)
+NS_CStringGetData(const nsACString &aStr, const char **aData,
+ PRBool *aTerminated)
+{
+ if (aTerminated)
+ *aTerminated = aStr.IsTerminated();
+
+ nsACString::const_iterator begin;
+ aStr.BeginReading(begin);
+ *aData = begin.get();
+ return begin.size_forward();
+}
+
+NS_STRINGAPI(char *)
+NS_CStringCloneData(const nsACString &aStr)
+{
+ return ToNewCString(aStr);
+}
+
+NS_STRINGAPI(nsresult)
+NS_CStringSetData(nsACString &aStr, const char *aData, PRUint32 aDataLength)
+{
+ aStr.Assign(aData, aDataLength);
+ return NS_OK; // XXX report errors
+}
+
+NS_STRINGAPI(nsresult)
+NS_CStringSetDataRange(nsACString &aStr,
+ PRUint32 aCutOffset, PRUint32 aCutLength,
+ const char *aData, PRUint32 aDataLength)
+{
+ if (aCutOffset == PR_UINT32_MAX)
+ {
+ // append case
+ if (aData)
+ aStr.Append(aData, aDataLength);
+ return NS_OK; // XXX report errors
+ }
+
+ if (aCutLength == PR_UINT32_MAX)
+ aCutLength = aStr.Length() - aCutOffset;
+
+ if (aData)
+ {
+ if (aDataLength == PR_UINT32_MAX)
+ aStr.Replace(aCutOffset, aCutLength, nsDependentCString(aData));
+ else
+ aStr.Replace(aCutOffset, aCutLength, Substring(aData, aData + aDataLength));
+ }
+ else
+ aStr.Cut(aCutOffset, aCutLength);
+
+ return NS_OK; // XXX report errors
+}
+
+NS_STRINGAPI(nsresult)
+NS_CStringCopy(nsACString &aDest, const nsACString &aSrc)
+{
+ aDest.Assign(aSrc);
+ return NS_OK; // XXX report errors
+}
+
+/* ------------------------------------------------------------------------- */
+
+NS_STRINGAPI(nsresult)
+NS_CStringToUTF16(const nsACString &aSrc,
+ nsCStringEncoding aSrcEncoding,
+ nsAString &aDest)
+{
+ switch (aSrcEncoding)
+ {
+ case NS_CSTRING_ENCODING_ASCII:
+ CopyASCIItoUTF16(aSrc, aDest);
+ break;
+ case NS_CSTRING_ENCODING_UTF8:
+ CopyUTF8toUTF16(aSrc, aDest);
+ break;
+ case NS_CSTRING_ENCODING_NATIVE_FILESYSTEM:
+ NS_CopyNativeToUnicode(aSrc, aDest);
+ break;
+ default:
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ return NS_OK; // XXX report errors
+}
+
+NS_STRINGAPI(nsresult)
+NS_UTF16ToCString(const nsAString &aSrc,
+ nsCStringEncoding aDestEncoding,
+ nsACString &aDest)
+{
+ switch (aDestEncoding)
+ {
+ case NS_CSTRING_ENCODING_ASCII:
+ LossyCopyUTF16toASCII(aSrc, aDest);
+ break;
+ case NS_CSTRING_ENCODING_UTF8:
+ CopyUTF16toUTF8(aSrc, aDest);
+ break;
+ case NS_CSTRING_ENCODING_NATIVE_FILESYSTEM:
+ NS_CopyUnicodeToNative(aSrc, aDest);
+ break;
+ default:
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ return NS_OK; // XXX report errors
+}
diff --git a/src/libs/xpcom18a4/xpcom/build/nsXPCOM.h b/src/libs/xpcom18a4/xpcom/build/nsXPCOM.h
new file mode 100644
index 00000000..4e60c74e
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/nsXPCOM.h
@@ -0,0 +1,217 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#ifndef nsXPCOM_h__
+#define nsXPCOM_h__
+
+#include "nscore.h"
+#include "nsXPCOMCID.h"
+
+#ifdef VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
+#define NS_InitXPCOM2 VBoxNsxpNS_InitXPCOM2
+#define NS_ShutdownXPCOM VBoxNsxpNS_ShutdownXPCOM
+#define NS_NewNativeLocalFile VBoxNsxpNS_NewNativeLocalFile
+#define NS_GetServiceManager VBoxNsxpNS_GetServiceManager
+#define NS_GetComponentManager VBoxNsxpNS_GetComponentManager
+#define NS_GetComponentRegistrar VBoxNsxpNS_GetComponentRegistrar
+#define NS_GetDebug VBoxNsxpNS_GetDebug
+#define NS_GetMemoryManager VBoxNsxpNS_GetMemoryManager
+#define NS_GetTraceRefcnt VBoxNsxpNS_GetTraceRefcnt
+#define NS_NewLocalFile VBoxNsxpNS_NewLocalFile
+#endif /* VBOX_WITH_XPCOM_NAMESPACE_CLEANUP */
+
+class nsAString;
+class nsACString;
+
+class nsIComponentManager;
+class nsIComponentRegistrar;
+class nsIServiceManager;
+class nsIFile;
+class nsILocalFile;
+class nsIDirectoryServiceProvider;
+class nsIMemory;
+class nsIDebug;
+class nsITraceRefcnt;
+
+/**
+ * Initialises XPCOM. You must call this method before proceeding
+ * to use xpcom. The one exception is that you may call
+ * NS_NewLocalFile to create a nsIFile.
+ *
+ * @status FROZEN
+ *
+ * @note Use <CODE>NS_NewLocalFile</CODE> or <CODE>NS_NewNativeLocalFile</CODE>
+ * to create the file object you supply as the bin directory path in this
+ * call. The function may be safely called before the rest of XPCOM or
+ * embedding has been initialised.
+ *
+ * @param result The service manager. You may pass null.
+ *
+ * @param binDirectory The directory containing the component
+ * registry and runtime libraries;
+ * or use <CODE>nsnull</CODE> to use the working
+ * directory.
+ *
+ * @param appFileLocationProvider The object to be used by Gecko that specifies
+ * to Gecko where to find profiles, the component
+ * registry preferences and so on; or use
+ * <CODE>nsnull</CODE> for the default behaviour.
+ *
+ * @see NS_NewLocalFile
+ * @see nsILocalFile
+ * @see nsIDirectoryServiceProvider
+ *
+ * @return NS_OK for success;
+ * NS_ERROR_NOT_INITIALIZED if static globals were not initialied, which
+ * can happen if XPCOM is reloaded, but did not completly shutdown.
+ * other error codes indicate a failure during initialisation.
+ *
+ */
+extern "C" NS_COM nsresult
+NS_InitXPCOM2(nsIServiceManager* *result,
+ nsIFile* binDirectory,
+ nsIDirectoryServiceProvider* appFileLocationProvider);
+/**
+ * Shutdown XPCOM. You must call this method after you are finished
+ * using xpcom.
+ *
+ * @status FROZEN
+ *
+ * @param servMgr The service manager which was returned by NS_InitXPCOM2.
+ * This will release servMgr. You may pass null.
+ *
+ * @return NS_OK for success;
+ * other error codes indicate a failure during initialisation.
+ *
+ */
+extern "C" NS_COM nsresult
+NS_ShutdownXPCOM(nsIServiceManager* servMgr);
+
+
+/**
+ * Public Method to access to the service manager.
+ *
+ * @status FROZEN
+ * @param result Interface pointer to the service manager
+ *
+ * @return NS_OK for success;
+ * other error codes indicate a failure during initialisation.
+ *
+ */
+extern "C" NS_COM nsresult
+NS_GetServiceManager(nsIServiceManager* *result);
+
+/**
+ * Public Method to access to the component manager.
+ *
+ * @status FROZEN
+ * @param result Interface pointer to the service
+ *
+ * @return NS_OK for success;
+ * other error codes indicate a failure during initialisation.
+ *
+ */
+extern "C" NS_COM nsresult
+NS_GetComponentManager(nsIComponentManager* *result);
+
+/**
+ * Public Method to access to the component registration manager.
+ *
+ * @status FROZEN
+ * @param result Interface pointer to the service
+ *
+ * @return NS_OK for success;
+ * other error codes indicate a failure during initialisation.
+ *
+ */
+extern "C" NS_COM nsresult
+NS_GetComponentRegistrar(nsIComponentRegistrar* *result);
+
+/**
+ * Public Method to access to the memory manager. See nsIMemory
+ *
+ * @status FROZEN
+ * @param result Interface pointer to the memory manager
+ *
+ * @return NS_OK for success;
+ * other error codes indicate a failure during initialisation.
+ *
+ */
+extern "C" NS_COM nsresult
+NS_GetMemoryManager(nsIMemory* *result);
+
+/**
+ * Public Method to create an instance of a nsILocalFile. This function
+ * may be called prior to NS_InitXPCOM2.
+ *
+ * @status FROZEN
+ *
+ * @param path
+ * A string which specifies a full file path to a
+ * location. Relative paths will be treated as an
+ * error (NS_ERROR_FILE_UNRECOGNIZED_PATH).
+ * |NS_NewNativeLocalFile|'s path must be in the
+ * filesystem charset.
+ * @param followLinks
+ * This attribute will determine if the nsLocalFile will auto
+ * resolve symbolic links. By default, this value will be false
+ * on all non unix systems. On unix, this attribute is effectively
+ * a noop.
+ * @param result Interface pointer to a new instance of an nsILocalFile
+ *
+ * @return NS_OK for success;
+ * other error codes indicate a failure.
+ */
+
+extern "C" NS_COM nsresult
+NS_NewLocalFile(const nsAString &path,
+ PRBool followLinks,
+ nsILocalFile* *result);
+
+extern "C" NS_COM nsresult
+NS_NewNativeLocalFile(const nsACString &path,
+ PRBool followLinks,
+ nsILocalFile* *result);
+
+
+extern "C" NS_COM nsresult
+NS_GetDebug(nsIDebug* *result);
+
+extern "C" NS_COM nsresult
+NS_GetTraceRefcnt(nsITraceRefcnt* *result);
+
+#endif
diff --git a/src/libs/xpcom18a4/xpcom/build/nsXPCOMCID.h b/src/libs/xpcom18a4/xpcom/build/nsXPCOMCID.h
new file mode 100644
index 00000000..d5bd039c
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/nsXPCOMCID.h
@@ -0,0 +1,174 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#ifndef nsXPCOMCID_h__
+#define nsXPCOMCID_h__
+
+/**
+ * XPCOM Directory Service Contract ID
+ * The directory service provides ways to obtain file system locations. The
+ * directory service is a singleton.
+ *
+ * This contract supports the nsIDirectoryService and the nsIProperties
+ * interfaces.
+ *
+ */
+#define NS_DIRECTORY_SERVICE_CONTRACTID "@mozilla.org/file/directory_service;1"
+
+/**
+ * XPCOM File
+ * The file abstraction provides ways to obtain and access files and
+ * directories located on the local system.
+ *
+ * This contract supports the nsIFile interface and the nsILocalFile interface.
+ * This contract may also support platform specific interfaces such as
+ * nsILocalFileMac on platforms where additional interfaces are required.
+ *
+ */
+#define NS_LOCAL_FILE_CONTRACTID "@mozilla.org/file/local;1"
+
+/**
+ * XPCOM Category Manager Contract ID
+ * The contract supports the nsICategoryManager interface. The
+ * category manager is a singleton.
+ */
+#define NS_CATEGORYMANAGER_CONTRACTID "@mozilla.org/categorymanager;1"
+
+/**
+ * XPCOM Properties Object Contract ID
+ * Simple mapping object which supports the nsIProperties interface.
+ */
+#define NS_PROPERTIES_CONTRACTID "@mozilla.org/properties;1"
+
+/**
+ * XPCOM Array Object ContractID
+ * Simple array implementation which supports the nsIArray and
+ * nsIMutableArray interfaces.
+ */
+#define NS_ARRAY_CONTRACTID "@mozilla.org/array;1"
+
+/**
+ * The following are the CIDs and Contract IDs of the nsISupports wrappers for
+ * primative types.
+ */
+#define NS_SUPPORTS_ID_CID \
+{ 0xacf8dc40, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_ID_CONTRACTID "@mozilla.org/supports-id;1"
+
+#define NS_SUPPORTS_CSTRING_CID \
+{ 0xacf8dc41, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_CSTRING_CONTRACTID "@mozilla.org/supports-cstring;1"
+
+#define NS_SUPPORTS_STRING_CID \
+{ 0xacf8dc42, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_STRING_CONTRACTID "@mozilla.org/supports-string;1"
+
+#define NS_SUPPORTS_PRBOOL_CID \
+{ 0xacf8dc43, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_PRBOOL_CONTRACTID "@mozilla.org/supports-PRBool;1"
+
+#define NS_SUPPORTS_PRUINT8_CID \
+{ 0xacf8dc44, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_PRUINT8_CONTRACTID "@mozilla.org/supports-PRUint8;1"
+
+#define NS_SUPPORTS_PRUINT16_CID \
+{ 0xacf8dc46, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_PRUINT16_CONTRACTID "@mozilla.org/supports-PRUint16;1"
+
+#define NS_SUPPORTS_PRUINT32_CID \
+{ 0xacf8dc47, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_PRUINT32_CONTRACTID "@mozilla.org/supports-PRUint32;1"
+
+#define NS_SUPPORTS_PRUINT64_CID \
+{ 0xacf8dc48, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_PRUINT64_CONTRACTID "@mozilla.org/supports-PRUint64;1"
+
+#define NS_SUPPORTS_PRTIME_CID \
+{ 0xacf8dc49, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_PRTIME_CONTRACTID "@mozilla.org/supports-PRTime;1"
+
+#define NS_SUPPORTS_CHAR_CID \
+{ 0xacf8dc4a, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_CHAR_CONTRACTID "@mozilla.org/supports-char;1"
+
+#define NS_SUPPORTS_PRINT16_CID \
+{ 0xacf8dc4b, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_PRINT16_CONTRACTID "@mozilla.org/supports-PRInt16;1"
+
+#define NS_SUPPORTS_PRINT32_CID \
+{ 0xacf8dc4c, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_PRINT32_CONTRACTID "@mozilla.org/supports-PRInt32;1"
+
+#define NS_SUPPORTS_PRINT64_CID \
+{ 0xacf8dc4d, 0x4a25, 0x11d3, \
+{ 0x98, 0x90, 0x0, 0x60, 0x8, 0x96, 0x24, 0x22 } }
+#define NS_SUPPORTS_PRINT64_CONTRACTID "@mozilla.org/supports-PRInt64;1"
+
+#define NS_SUPPORTS_FLOAT_CID \
+{ 0xcbf86870, 0x4ac0, 0x11d3, \
+{ 0xba, 0xea, 0x0, 0x80, 0x5f, 0x8a, 0x5d, 0xd7 } }
+#define NS_SUPPORTS_FLOAT_CONTRACTID "@mozilla.org/supports-float;1"
+
+#define NS_SUPPORTS_DOUBLE_CID \
+{ 0xcbf86871, 0x4ac0, 0x11d3, \
+{ 0xba, 0xea, 0x0, 0x80, 0x5f, 0x8a, 0x5d, 0xd7 } }
+#define NS_SUPPORTS_DOUBLE_CONTRACTID "@mozilla.org/supports-double;1"
+
+#define NS_SUPPORTS_VOID_CID \
+{ 0xaf10f3e0, 0x568d, 0x11d3, \
+{ 0xba, 0xf8, 0x0, 0x80, 0x5f, 0x8a, 0x5d, 0xd7 } }
+#define NS_SUPPORTS_VOID_CONTRACTID "@mozilla.org/supports-void;1"
+
+#define NS_SUPPORTS_INTERFACE_POINTER_CID \
+{ 0xA99FEBBA, 0x1DD1, 0x11B2, \
+{ 0xA9, 0x43, 0xB0, 0x23, 0x34, 0xA6, 0xD0, 0x83 } }
+#define NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID "@mozilla.org/supports-interface-pointer;1"
+
+
+#endif
diff --git a/src/libs/xpcom18a4/xpcom/build/nsXPCOMPrivate.h b/src/libs/xpcom18a4/xpcom/build/nsXPCOMPrivate.h
new file mode 100644
index 00000000..cd526ba3
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/nsXPCOMPrivate.h
@@ -0,0 +1,228 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim:set ts=4 sw=4 et cindent: */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#ifndef nsXPComPrivate_h__
+#define nsXPComPrivate_h__
+
+#include "nscore.h"
+#include "nsXPCOM.h"
+
+class nsStringContainer;
+class nsCStringContainer;
+
+#ifdef VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
+#define NS_GetFrozenFunctions VBoxNsxpNS_GetFrozenFunctions
+#define NS_RegisterXPCOMExitRoutine VBoxNsxpNS_RegisterXPCOMExitRoutine
+#define NS_UnregisterXPCOMExitRoutine VBoxNsxpNS_UnregisterXPCOMExitRoutine
+#endif /* VBOX_WITH_XPCOM_NAMESPACE_CLEANUP */
+
+/**
+ * Private Method to register an exit routine. This method
+ * allows you to setup a callback that will be called from
+ * the NS_ShutdownXPCOM function after all services and
+ * components have gone away.
+ *
+ * This API is for the exclusive use of the xpcom glue library.
+ *
+ * Note that these APIs are NOT threadsafe and must be called on the
+ * main thread.
+ *
+ * @status FROZEN
+ * @param exitRoutine pointer to user defined callback function
+ * of type XPCOMExitRoutine.
+ * @param priority higher priorities are called before lower
+ * priorities.
+ *
+ * @return NS_OK for success;
+ * other error codes indicate a failure.
+ *
+ */
+typedef NS_CALLBACK(XPCOMExitRoutine)(void);
+
+extern "C" NS_COM nsresult
+NS_RegisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine, PRUint32 priority);
+
+extern "C" NS_COM nsresult
+NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine);
+
+
+// PUBLIC
+typedef nsresult (* InitFunc)(nsIServiceManager* *result, nsIFile* binDirectory, nsIDirectoryServiceProvider* appFileLocationProvider);
+typedef nsresult (* ShutdownFunc)(nsIServiceManager* servMgr);
+typedef nsresult (* GetServiceManagerFunc)(nsIServiceManager* *result);
+typedef nsresult (* GetComponentManagerFunc)(nsIComponentManager* *result);
+typedef nsresult (* GetComponentRegistrarFunc)(nsIComponentRegistrar* *result);
+typedef nsresult (* GetMemoryManagerFunc)(nsIMemory* *result);
+typedef nsresult (* NewLocalFileFunc)(const nsAString &path, PRBool followLinks, nsILocalFile* *result);
+typedef nsresult (* NewNativeLocalFileFunc)(const nsACString &path, PRBool followLinks, nsILocalFile* *result);
+
+typedef nsresult (* GetDebugFunc)(nsIDebug* *result);
+typedef nsresult (* GetTraceRefcntFunc)(nsITraceRefcnt* *result);
+
+typedef nsresult (* StringContainerInitFunc)(nsStringContainer&);
+typedef void (* StringContainerFinishFunc)(nsStringContainer&);
+typedef PRUint32 (* StringGetDataFunc)(const nsAString&, const PRUnichar**, PRBool*);
+typedef PRUnichar* (* StringCloneDataFunc)(const nsAString&);
+typedef nsresult (* StringSetDataFunc)(nsAString&, const PRUnichar*, PRUint32);
+typedef nsresult (* StringSetDataRangeFunc)(nsAString&, PRUint32, PRUint32, const PRUnichar*, PRUint32);
+typedef nsresult (* StringCopyFunc)(nsAString &, const nsAString &);
+
+typedef nsresult (* CStringContainerInitFunc)(nsCStringContainer&);
+typedef void (* CStringContainerFinishFunc)(nsCStringContainer&);
+typedef PRUint32 (* CStringGetDataFunc)(const nsACString&, const char**, PRBool*);
+typedef char* (* CStringCloneDataFunc)(const nsACString&);
+typedef nsresult (* CStringSetDataFunc)(nsACString&, const char*, PRUint32);
+typedef nsresult (* CStringSetDataRangeFunc)(nsACString&, PRUint32, PRUint32, const char*, PRUint32);
+typedef nsresult (* CStringCopyFunc)(nsACString &, const nsACString &);
+
+typedef nsresult (* CStringToUTF16)(const nsACString &, PRUint32, const nsAString &);
+typedef nsresult (* UTF16ToCString)(const nsAString &, PRUint32, const nsACString &);
+
+// PRIVATE
+typedef nsresult (* RegisterXPCOMExitRoutineFunc)(XPCOMExitRoutine exitRoutine, PRUint32 priority);
+typedef nsresult (* UnregisterXPCOMExitRoutineFunc)(XPCOMExitRoutine exitRoutine);
+
+typedef struct XPCOMFunctions{
+ PRUint32 version;
+ PRUint32 size;
+
+ InitFunc init;
+ ShutdownFunc shutdown;
+ GetServiceManagerFunc getServiceManager;
+ GetComponentManagerFunc getComponentManager;
+ GetComponentRegistrarFunc getComponentRegistrar;
+ GetMemoryManagerFunc getMemoryManager;
+ NewLocalFileFunc newLocalFile;
+ NewNativeLocalFileFunc newNativeLocalFile;
+
+ RegisterXPCOMExitRoutineFunc registerExitRoutine;
+ UnregisterXPCOMExitRoutineFunc unregisterExitRoutine;
+
+ // Added for Mozilla 1.5
+ GetDebugFunc getDebug;
+ GetTraceRefcntFunc getTraceRefcnt;
+
+ // Added for Mozilla 1.7
+ StringContainerInitFunc stringContainerInit;
+ StringContainerFinishFunc stringContainerFinish;
+ StringGetDataFunc stringGetData;
+ StringSetDataFunc stringSetData;
+ StringSetDataRangeFunc stringSetDataRange;
+ StringCopyFunc stringCopy;
+ CStringContainerInitFunc cstringContainerInit;
+ CStringContainerFinishFunc cstringContainerFinish;
+ CStringGetDataFunc cstringGetData;
+ CStringSetDataFunc cstringSetData;
+ CStringSetDataRangeFunc cstringSetDataRange;
+ CStringCopyFunc cstringCopy;
+ CStringToUTF16 cstringToUTF16;
+ UTF16ToCString utf16ToCString;
+ StringCloneDataFunc stringCloneData;
+ CStringCloneDataFunc cstringCloneData;
+
+} XPCOMFunctions;
+
+typedef nsresult (PR_CALLBACK *GetFrozenFunctionsFunc)(XPCOMFunctions *entryPoints, const char* libraryPath);
+extern "C" NS_COM nsresult
+NS_GetFrozenFunctions(XPCOMFunctions *entryPoints, const char* libraryPath);
+
+// think hard before changing this
+#define XPCOM_GLUE_VERSION 1
+
+
+/* XPCOM Specific Defines
+ *
+ * XPCOM_DLL - name of the loadable xpcom library on disk.
+ * XPCOM_SEARCH_KEY - name of the environment variable that can be
+ * modified to include additional search paths.
+ * GRE_CONF_NAME - Name of the GRE Configuration file
+ */
+
+#ifdef XPCOM_DLL_BASE
+#define XPCOM_DLL XPCOM_DLL_BASE MOZ_DLL_SUFFIX
+#endif
+
+#if defined(XP_WIN32) || defined(XP_OS2)
+
+#define XPCOM_SEARCH_KEY "PATH"
+#define GRE_CONF_NAME "gre.config"
+#define GRE_WIN_REG_LOC "Software\\mozilla.org\\GRE\\"
+#ifndef XPCOM_DLL
+#define XPCOM_DLL "xpcom"MOZ_DLL_SUFFIX
+#endif
+
+#elif defined(XP_BEOS)
+
+#define XPCOM_SEARCH_KEY "ADDON_PATH"
+#define GRE_CONF_NAME ".gre.config"
+#define GRE_CONF_PATH "/boot/home/config/settings/GRE/gre.conf"
+#ifndef XPCOM_DLL
+#define XPCOM_DLL "libxpcom"MOZ_DLL_SUFFIX
+#endif
+
+#else // Unix
+
+#ifndef XPCOM_DLL
+#define XPCOM_DLL "libxpcom"MOZ_DLL_SUFFIX
+#endif
+
+// you have to love apple..
+#ifdef XP_MACOSX
+#define XPCOM_SEARCH_KEY "DYLD_LIBRARY_PATH"
+#else
+#define XPCOM_SEARCH_KEY "LD_LIBRARY_PATH"
+#endif
+
+#define GRE_CONF_NAME ".gre.config"
+#define GRE_CONF_PATH "/etc/gre.conf"
+#define GRE_CONF_DIR "/etc/gre.d/"
+#endif
+
+#if defined(XP_WIN) || defined(XP_OS2)
+ #define XPCOM_FILE_PATH_SEPARATOR "\\"
+ #define XPCOM_ENV_PATH_SEPARATOR ";"
+#elif defined(XP_UNIX) || defined(XP_BEOS)
+ #define XPCOM_FILE_PATH_SEPARATOR "/"
+ #define XPCOM_ENV_PATH_SEPARATOR ":"
+#else
+ #error need_to_define_your_file_path_separator_and_illegal_characters
+#endif
+
+#endif
+
+
diff --git a/src/libs/xpcom18a4/xpcom/build/nsXPComInit.cpp b/src/libs/xpcom18a4/xpcom/build/nsXPComInit.cpp
new file mode 100644
index 00000000..65d84b6b
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/nsXPComInit.cpp
@@ -0,0 +1,1079 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsXPCOM.h"
+#include "nsXPCOMPrivate.h"
+#include "nscore.h"
+#include "prlink.h"
+#include "nsCOMPtr.h"
+#include "nsObserverList.h"
+#include "nsObserverService.h"
+#include "nsProperties.h"
+#include "nsIProperties.h"
+#include "nsPersistentProperties.h"
+#include "nsScriptableInputStream.h"
+#include "nsBinaryStream.h"
+#include "nsStorageStream.h"
+
+#include "nsMemoryImpl.h"
+#include "nsDebugImpl.h"
+#include "nsTraceRefcntImpl.h"
+#include "nsErrorService.h"
+#include "nsByteBuffer.h"
+
+#include "nsSupportsArray.h"
+#include "nsArray.h"
+#include "nsSupportsPrimitives.h"
+#include "nsConsoleService.h"
+#include "nsExceptionService.h"
+
+#include "nsComponentManager.h"
+#include "nsCategoryManagerUtils.h"
+#include "nsIServiceManager.h"
+#include "nsGenericFactory.h"
+
+#include "nsEventQueueService.h"
+#include "nsEventQueue.h"
+#ifdef VBOX
+# include "nsEventQueueUtils.h"
+# include "nsProxyRelease.h"
+#endif /* VBOX */
+
+#include "nsIProxyObjectManager.h"
+#include "nsProxyEventPrivate.h" // access to the impl of nsProxyObjectManager for the generic factory registration.
+
+#include "xptinfo.h"
+#include "nsIInterfaceInfoManager.h"
+
+#include "nsTimerImpl.h"
+#include "TimerThread.h"
+
+#include "nsThread.h"
+#include "nsProcess.h"
+#include "nsEnvironment.h"
+
+#include "nsEmptyEnumerator.h"
+
+#include "nsILocalFile.h"
+#include "nsLocalFile.h"
+#if defined(XP_UNIX) || defined(XP_OS2)
+#include "nsNativeCharsetUtils.h"
+#endif
+#include "nsDirectoryService.h"
+#include "nsDirectoryServiceDefs.h"
+#include "nsCategoryManager.h"
+#include "nsICategoryManager.h"
+#include "nsStringStream.h"
+#include "nsMultiplexInputStream.h"
+
+#include "nsFastLoadService.h"
+
+#include "nsAtomService.h"
+#include "nsAtomTable.h"
+#include "nsTraceRefcnt.h"
+#include "nsTimelineService.h"
+
+#include "nsVariant.h"
+
+#ifdef GC_LEAK_DETECTOR
+#include "nsLeakDetector.h"
+#endif
+#include "nsRecyclingAllocator.h"
+
+#include "SpecialSystemDirectory.h"
+
+#include "ipcdclient.h"
+#include "ipcService.h"
+#include "ipcConfig.h"
+#include "ipcCID.h"
+#include "ipcLockService.h"
+#include "ipcLockCID.h"
+#include "tmTransactionService.h"
+#include "ipcDConnectService.h"
+
+#include <locale.h>
+
+// Registry Factory creation function defined in nsRegistry.cpp
+// We hook into this function locally to create and register the registry
+// Since noone outside xpcom needs to know about this and nsRegistry.cpp
+// does not have a local include file, we are putting this definition
+// here rather than in nsIRegistry.h
+extern nsresult NS_RegistryGetFactory(nsIFactory** aFactory);
+extern nsresult NS_CategoryManagerGetFactory( nsIFactory** );
+
+#ifdef DEBUG
+extern void _FreeAutoLockStatics();
+#endif
+
+static NS_DEFINE_CID(kComponentManagerCID, NS_COMPONENTMANAGER_CID);
+static NS_DEFINE_CID(kMemoryCID, NS_MEMORY_CID);
+static NS_DEFINE_CID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
+
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsProcess)
+NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsEventQueueServiceImpl, Init)
+
+#define NS_ENVIRONMENT_CLASSNAME "Environment Service"
+
+#include "nsXPCOM.h"
+// ds/nsISupportsPrimitives
+#define NS_SUPPORTS_ID_CLASSNAME "Supports ID"
+#define NS_SUPPORTS_CSTRING_CLASSNAME "Supports String"
+#define NS_SUPPORTS_STRING_CLASSNAME "Supports WString"
+#define NS_SUPPORTS_PRBOOL_CLASSNAME "Supports PRBool"
+#define NS_SUPPORTS_PRUINT8_CLASSNAME "Supports PRUint8"
+#define NS_SUPPORTS_PRUINT16_CLASSNAME "Supports PRUint16"
+#define NS_SUPPORTS_PRUINT32_CLASSNAME "Supports PRUint32"
+#define NS_SUPPORTS_PRUINT64_CLASSNAME "Supports PRUint64"
+#define NS_SUPPORTS_PRTIME_CLASSNAME "Supports PRTime"
+#define NS_SUPPORTS_CHAR_CLASSNAME "Supports Char"
+#define NS_SUPPORTS_PRINT16_CLASSNAME "Supports PRInt16"
+#define NS_SUPPORTS_PRINT32_CLASSNAME "Supports PRInt32"
+#define NS_SUPPORTS_PRINT64_CLASSNAME "Supports PRInt64"
+#define NS_SUPPORTS_FLOAT_CLASSNAME "Supports float"
+#define NS_SUPPORTS_DOUBLE_CLASSNAME "Supports double"
+#define NS_SUPPORTS_VOID_CLASSNAME "Supports void"
+#define NS_SUPPORTS_INTERFACE_POINTER_CLASSNAME "Supports interface pointer"
+
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsIDImpl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsStringImpl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsCStringImpl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsPRBoolImpl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsPRUint8Impl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsPRUint16Impl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsPRUint32Impl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsPRUint64Impl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsPRTimeImpl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsCharImpl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsPRInt16Impl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsPRInt32Impl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsPRInt64Impl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsFloatImpl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsDoubleImpl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsVoidImpl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsInterfacePointerImpl)
+
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsArray)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsConsoleService)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsAtomService)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsExceptionService)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsTimerImpl)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsTimerManager)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsBinaryOutputStream)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsBinaryInputStream)
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsStorageStream)
+
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsVariant)
+
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsRecyclingAllocatorImpl)
+
+#ifdef MOZ_TIMELINE
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsTimelineService)
+#endif
+
+static NS_METHOD
+nsXPTIInterfaceInfoManagerGetSingleton(nsISupports* outer,
+ const nsIID& aIID,
+ void* *aInstancePtr)
+{
+ NS_ENSURE_ARG_POINTER(aInstancePtr);
+ NS_ENSURE_TRUE(!outer, NS_ERROR_NO_AGGREGATION);
+
+ nsCOMPtr<nsIInterfaceInfoManager> iim(dont_AddRef(XPTI_GetInterfaceInfoManager()));
+ if (!iim) {
+ return NS_ERROR_FAILURE;
+ }
+
+ return iim->QueryInterface(aIID, aInstancePtr);
+}
+
+
+PR_STATIC_CALLBACK(nsresult)
+RegisterGenericFactory(nsIComponentRegistrar* registrar,
+ const nsModuleComponentInfo *info)
+{
+ nsresult rv;
+ nsIGenericFactory* fact;
+ rv = NS_NewGenericFactory(&fact, info);
+ if (NS_FAILED(rv)) return rv;
+
+ rv = registrar->RegisterFactory(info->mCID,
+ info->mDescription,
+ info->mContractID,
+ fact);
+ NS_RELEASE(fact);
+ return rv;
+}
+
+// In order to support the installer, we need
+// to be told out of band if we should cause
+// an autoregister. If the file ".autoreg" exists in the binary
+// directory, we check its timestamp against the timestamp of the
+// compreg.dat file. If the .autoreg file is newer, we autoregister.
+static PRBool CheckUpdateFile()
+{
+ nsresult rv;
+ nsCOMPtr<nsIProperties> directoryService;
+ nsDirectoryService::Create(nsnull,
+ NS_GET_IID(nsIProperties),
+ getter_AddRefs(directoryService));
+
+ if (!directoryService)
+ return PR_FALSE;
+
+ nsCOMPtr<nsIFile> file;
+ rv = directoryService->Get(NS_XPCOM_CURRENT_PROCESS_DIR,
+ NS_GET_IID(nsIFile),
+ getter_AddRefs(file));
+
+ if (NS_FAILED(rv)) {
+ NS_WARNING("Getting NS_XPCOM_CURRENT_PROCESS_DIR failed");
+ return PR_FALSE;
+ }
+
+ file->AppendNative(nsDependentCString(".autoreg"));
+
+ PRBool exists;
+ file->Exists(&exists);
+ if (!exists)
+ return PR_FALSE;
+
+ nsCOMPtr<nsIFile> compregFile;
+ rv = directoryService->Get(NS_XPCOM_COMPONENT_REGISTRY_FILE,
+ NS_GET_IID(nsIFile),
+ getter_AddRefs(compregFile));
+
+
+ if (NS_FAILED(rv)) {
+ NS_WARNING("Getting NS_XPCOM_COMPONENT_REGISTRY_FILE failed");
+ return PR_FALSE;
+ }
+
+ // Don't need to check whether compreg exists; if it doesn't
+ // we won't even be here.
+
+ PRInt64 compregModTime, autoregModTime;
+ compregFile->GetLastModifiedTime(&compregModTime);
+ file->GetLastModifiedTime(&autoregModTime);
+
+ return LL_CMP(autoregModTime, >, compregModTime);
+}
+
+#if 0 /// @todo later
+NS_GENERIC_FACTORY_CONSTRUCTOR(ipcService)
+NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(ipcLockService, Init)
+NS_GENERIC_FACTORY_CONSTRUCTOR(tmTransactionService)
+NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(ipcDConnectService, Init)
+
+// enable this code to make the IPC DCONNECT service auto-start.
+NS_METHOD
+ipcDConnectServiceRegisterProc(nsIComponentManager *aCompMgr,
+ nsIFile *aPath,
+ const char *registryLocation,
+ const char *componentType,
+ const nsModuleComponentInfo *info)
+{
+ //
+ // add ipcService to the XPCOM startup category
+ //
+ nsCOMPtr<nsICategoryManager> catman(do_GetService(NS_CATEGORYMANAGER_CONTRACTID));
+ if (catman) {
+ nsXPIDLCString prevEntry;
+ catman->AddCategoryEntry(NS_XPCOM_STARTUP_OBSERVER_ID, "ipcDConnectService",
+ IPC_DCONNECTSERVICE_CONTRACTID, PR_TRUE, PR_TRUE,
+ getter_Copies(prevEntry));
+ }
+ return NS_OK;
+}
+
+NS_METHOD
+ipcDConnectServiceUnregisterProc(nsIComponentManager *aCompMgr,
+ nsIFile *aPath,
+ const char *registryLocation,
+ const nsModuleComponentInfo *info)
+{
+ nsCOMPtr<nsICategoryManager> catman(do_GetService(NS_CATEGORYMANAGER_CONTRACTID));
+ if (catman)
+ catman->DeleteCategoryEntry(NS_XPCOM_STARTUP_OBSERVER_ID,
+ IPC_DCONNECTSERVICE_CONTRACTID, PR_TRUE);
+ return NS_OK;
+}
+#endif
+
+nsComponentManagerImpl* nsComponentManagerImpl::gComponentManager = NULL;
+nsIProperties *gDirectoryService = NULL;
+PRBool gXPCOMShuttingDown = PR_FALSE;
+
+// For each class that wishes to support nsIClassInfo, add a line like this
+// NS_DECL_CLASSINFO(nsMyClass)
+
+#define COMPONENT(NAME, Ctor) \
+ { NS_##NAME##_CLASSNAME, NS_##NAME##_CID, NS_##NAME##_CONTRACTID, Ctor }
+
+#define COMPONENT_CI(NAME, Ctor, Class) \
+ { NS_##NAME##_CLASSNAME, NS_##NAME##_CID, NS_##NAME##_CONTRACTID, Ctor, \
+ NULL, NULL, NULL, NS_CI_INTERFACE_GETTER_NAME(Class), NULL, \
+ &NS_CLASSINFO_NAME(Class) }
+
+static const nsModuleComponentInfo components[] = {
+ COMPONENT(MEMORY, nsMemoryImpl::Create),
+ COMPONENT(DEBUG, nsDebugImpl::Create),
+#define NS_ERRORSERVICE_CLASSNAME NS_ERRORSERVICE_NAME
+ COMPONENT(ERRORSERVICE, nsErrorService::Create),
+
+ COMPONENT(BYTEBUFFER, ByteBufferImpl::Create),
+ COMPONENT(SCRIPTABLEINPUTSTREAM, nsScriptableInputStream::Create),
+ COMPONENT(BINARYINPUTSTREAM, nsBinaryInputStreamConstructor),
+ COMPONENT(BINARYOUTPUTSTREAM, nsBinaryOutputStreamConstructor),
+ COMPONENT(STORAGESTREAM, nsStorageStreamConstructor),
+
+#define NS_PROPERTIES_CLASSNAME "Properties"
+ COMPONENT(PROPERTIES, nsProperties::Create),
+
+#define NS_PERSISTENTPROPERTIES_CID NS_IPERSISTENTPROPERTIES_CID /* sigh */
+ COMPONENT(PERSISTENTPROPERTIES, nsPersistentProperties::Create),
+
+ COMPONENT(SUPPORTSARRAY, nsSupportsArray::Create),
+ COMPONENT(ARRAY, nsArrayConstructor),
+ COMPONENT(CONSOLESERVICE, nsConsoleServiceConstructor),
+ COMPONENT(EXCEPTIONSERVICE, nsExceptionServiceConstructor),
+ COMPONENT(ATOMSERVICE, nsAtomServiceConstructor),
+#ifdef MOZ_TIMELINE
+ COMPONENT(TIMELINESERVICE, nsTimelineServiceConstructor),
+#endif
+ COMPONENT(OBSERVERSERVICE, nsObserverService::Create),
+ COMPONENT(GENERICFACTORY, nsGenericFactory::Create),
+ COMPONENT(EVENTQUEUESERVICE, nsEventQueueServiceImplConstructor),
+ COMPONENT(EVENTQUEUE, nsEventQueueImpl::Create),
+ COMPONENT(THREAD, nsThread::Create),
+
+#define NS_XPCOMPROXY_CID NS_PROXYEVENT_MANAGER_CID
+ COMPONENT(XPCOMPROXY, nsProxyObjectManager::Create),
+
+ COMPONENT(TIMER, nsTimerImplConstructor),
+ COMPONENT(TIMERMANAGER, nsTimerManagerConstructor),
+
+#define COMPONENT_SUPPORTS(TYPE, Type) \
+ COMPONENT(SUPPORTS_##TYPE, nsSupports##Type##ImplConstructor)
+
+ COMPONENT_SUPPORTS(ID, ID),
+ COMPONENT_SUPPORTS(STRING, String),
+ COMPONENT_SUPPORTS(CSTRING, CString),
+ COMPONENT_SUPPORTS(PRBOOL, PRBool),
+ COMPONENT_SUPPORTS(PRUINT8, PRUint8),
+ COMPONENT_SUPPORTS(PRUINT16, PRUint16),
+ COMPONENT_SUPPORTS(PRUINT32, PRUint32),
+ COMPONENT_SUPPORTS(PRUINT64, PRUint64),
+ COMPONENT_SUPPORTS(PRTIME, PRTime),
+ COMPONENT_SUPPORTS(CHAR, Char),
+ COMPONENT_SUPPORTS(PRINT16, PRInt16),
+ COMPONENT_SUPPORTS(PRINT32, PRInt32),
+ COMPONENT_SUPPORTS(PRINT64, PRInt64),
+ COMPONENT_SUPPORTS(FLOAT, Float),
+ COMPONENT_SUPPORTS(DOUBLE, Double),
+ COMPONENT_SUPPORTS(VOID, Void),
+ COMPONENT_SUPPORTS(INTERFACE_POINTER, InterfacePointer),
+
+#undef COMPONENT_SUPPORTS
+#define NS_LOCAL_FILE_CLASSNAME "Local File Specification"
+ COMPONENT(LOCAL_FILE, nsLocalFile::nsLocalFileConstructor),
+#define NS_DIRECTORY_SERVICE_CLASSNAME "nsIFile Directory Service"
+ COMPONENT(DIRECTORY_SERVICE, nsDirectoryService::Create),
+ COMPONENT(PROCESS, nsProcessConstructor),
+ COMPONENT(ENVIRONMENT, nsEnvironment::Create),
+
+ COMPONENT(STRINGINPUTSTREAM, nsStringInputStreamConstructor),
+ COMPONENT(MULTIPLEXINPUTSTREAM, nsMultiplexInputStreamConstructor),
+
+ COMPONENT(FASTLOADSERVICE, nsFastLoadService::Create),
+ COMPONENT(VARIANT, nsVariantConstructor),
+ COMPONENT(INTERFACEINFOMANAGER_SERVICE, nsXPTIInterfaceInfoManagerGetSingleton),
+
+ COMPONENT(RECYCLINGALLOCATOR, nsRecyclingAllocatorImplConstructor),
+
+#if 0 /// @todo later
+ { IPC_SERVICE_CLASSNAME,
+ IPC_SERVICE_CID,
+ IPC_SERVICE_CONTRACTID,
+ ipcServiceConstructor },
+ /*
+ ipcServiceRegisterProc,
+ ipcServiceUnregisterProc },
+ */
+ //
+ // extensions go here:
+ //
+ { IPC_LOCKSERVICE_CLASSNAME,
+ IPC_LOCKSERVICE_CID,
+ IPC_LOCKSERVICE_CONTRACTID,
+ ipcLockServiceConstructor },
+ { IPC_TRANSACTIONSERVICE_CLASSNAME,
+ IPC_TRANSACTIONSERVICE_CID,
+ IPC_TRANSACTIONSERVICE_CONTRACTID,
+ tmTransactionServiceConstructor },
+
+#ifdef BUILD_DCONNECT
+ { IPC_DCONNECTSERVICE_CLASSNAME,
+ IPC_DCONNECTSERVICE_CID,
+ IPC_DCONNECTSERVICE_CONTRACTID,
+ ipcDConnectServiceConstructor,
+ ipcDConnectServiceRegisterProc,
+ ipcDConnectServiceUnregisterProc },
+#endif
+#endif
+};
+
+#undef COMPONENT
+
+const int components_length = sizeof(components) / sizeof(components[0]);
+
+// gMemory will be freed during shutdown.
+static nsIMemory* gMemory = nsnull;
+nsresult NS_COM NS_GetMemoryManager(nsIMemory* *result)
+{
+ nsresult rv = NS_OK;
+ if (!gMemory)
+ {
+ rv = nsMemoryImpl::Create(nsnull,
+ NS_GET_IID(nsIMemory),
+ (void**)&gMemory);
+ }
+ NS_IF_ADDREF(*result = gMemory);
+ return rv;
+}
+
+// gDebug will be freed during shutdown.
+static nsIDebug* gDebug = nsnull;
+nsresult NS_COM NS_GetDebug(nsIDebug** result)
+{
+ nsresult rv = NS_OK;
+ if (!gDebug)
+ {
+ rv = nsDebugImpl::Create(nsnull,
+ NS_GET_IID(nsIDebug),
+ (void**)&gDebug);
+ }
+ NS_IF_ADDREF(*result = gDebug);
+ return rv;
+}
+
+#ifdef NS_BUILD_REFCNT_LOGGING
+// gTraceRefcnt will be freed during shutdown.
+static nsITraceRefcnt* gTraceRefcnt = nsnull;
+#endif
+
+nsresult NS_COM NS_GetTraceRefcnt(nsITraceRefcnt** result)
+{
+#ifdef NS_BUILD_REFCNT_LOGGING
+ nsresult rv = NS_OK;
+ if (!gTraceRefcnt)
+ {
+ rv = nsTraceRefcntImpl::Create(nsnull,
+ NS_GET_IID(nsITraceRefcnt),
+ (void**)&gTraceRefcnt);
+ }
+ NS_IF_ADDREF(*result = gTraceRefcnt);
+ return rv;
+#else
+ return NS_ERROR_NOT_INITIALIZED;
+#endif
+}
+
+nsresult NS_COM NS_InitXPCOM(nsIServiceManager* *result,
+ nsIFile* binDirectory)
+{
+ return NS_InitXPCOM2(result, binDirectory, nsnull);
+}
+
+nsresult NS_COM NS_InitXPCOM2(nsIServiceManager* *result,
+ nsIFile* binDirectory,
+ nsIDirectoryServiceProvider* appFileLocationProvider)
+{
+ nsresult rv = NS_OK;
+
+ // We are not shutting down
+ gXPCOMShuttingDown = PR_FALSE;
+
+#ifdef NS_BUILD_REFCNT_LOGGING
+ nsTraceRefcntImpl::Startup();
+#endif
+
+ // Establish the main thread here.
+ rv = nsIThread::SetMainThread();
+ if (NS_FAILED(rv)) return rv;
+
+ // Set up the timer globals/timer thread
+ rv = nsTimerImpl::Startup();
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // Startup the memory manager
+ rv = nsMemoryImpl::Startup();
+ if (NS_FAILED(rv)) return rv;
+
+ // If the locale hasn't already been setup by our embedder,
+ // get us out of the "C" locale and into the system
+ if (strcmp(setlocale(LC_ALL, NULL), "C") == 0)
+ setlocale(LC_ALL, "");
+
+#if defined(XP_UNIX) || defined(XP_OS2)
+ NS_StartupNativeCharsetUtils();
+#endif
+ NS_StartupLocalFile();
+
+ StartupSpecialSystemDirectory();
+
+ // Start the directory service so that the component manager init can use it.
+ rv = nsDirectoryService::Create(nsnull,
+ NS_GET_IID(nsIProperties),
+ (void**)&gDirectoryService);
+ if (NS_FAILED(rv))
+ return rv;
+
+ nsCOMPtr<nsIDirectoryService> dirService = do_QueryInterface(gDirectoryService, &rv);
+ if (NS_FAILED(rv))
+ return rv;
+ rv = dirService->Init();
+ if (NS_FAILED(rv))
+ return rv;
+
+ // Create the Component/Service Manager
+ nsComponentManagerImpl *compMgr = NULL;
+
+ if (nsComponentManagerImpl::gComponentManager == NULL)
+ {
+ compMgr = new nsComponentManagerImpl();
+ if (compMgr == NULL)
+ return NS_ERROR_OUT_OF_MEMORY;
+ NS_ADDREF(compMgr);
+
+ nsCOMPtr<nsIFile> xpcomLib;
+
+ PRBool value;
+ if (binDirectory)
+ {
+ rv = binDirectory->IsDirectory(&value);
+
+ if (NS_SUCCEEDED(rv) && value) {
+ gDirectoryService->Set(NS_XPCOM_INIT_CURRENT_PROCESS_DIR, binDirectory);
+ binDirectory->Clone(getter_AddRefs(xpcomLib));
+ }
+ }
+ else {
+ gDirectoryService->Get(NS_XPCOM_CURRENT_PROCESS_DIR,
+ NS_GET_IID(nsIFile),
+ getter_AddRefs(xpcomLib));
+ }
+
+ if (xpcomLib) {
+ xpcomLib->AppendNative(nsDependentCString(XPCOM_DLL));
+ gDirectoryService->Set(NS_XPCOM_LIBRARY_FILE, xpcomLib);
+ }
+
+ if (appFileLocationProvider) {
+ rv = dirService->RegisterProvider(appFileLocationProvider);
+ if (NS_FAILED(rv)) return rv;
+ }
+
+ rv = compMgr->Init();
+ if (NS_FAILED(rv))
+ {
+ NS_RELEASE(compMgr);
+ return rv;
+ }
+
+ nsComponentManagerImpl::gComponentManager = compMgr;
+
+ if (result) {
+ nsIServiceManager *serviceManager =
+ NS_STATIC_CAST(nsIServiceManager*, compMgr);
+
+ NS_ADDREF(*result = serviceManager);
+ }
+ }
+
+ nsCOMPtr<nsIMemory> memory;
+ NS_GetMemoryManager(getter_AddRefs(memory));
+ // dougt - these calls will be moved into a new interface when nsIComponentManager is frozen.
+ rv = compMgr->RegisterService(kMemoryCID, memory);
+ if (NS_FAILED(rv)) return rv;
+
+ rv = compMgr->RegisterService(kComponentManagerCID, NS_STATIC_CAST(nsIComponentManager*, compMgr));
+ if (NS_FAILED(rv)) return rv;
+
+#ifdef GC_LEAK_DETECTOR
+ rv = NS_InitLeakDetector();
+ if (NS_FAILED(rv)) return rv;
+#endif
+
+ // 2. Register the global services with the component manager so that
+ // clients can create new objects.
+
+ // Category Manager
+ {
+ nsCOMPtr<nsIFactory> categoryManagerFactory;
+ if ( NS_FAILED(rv = NS_CategoryManagerGetFactory(getter_AddRefs(categoryManagerFactory))) )
+ return rv;
+
+ NS_DEFINE_CID(kCategoryManagerCID, NS_CATEGORYMANAGER_CID);
+
+ rv = compMgr->RegisterFactory(kCategoryManagerCID,
+ NS_CATEGORYMANAGER_CLASSNAME,
+ NS_CATEGORYMANAGER_CONTRACTID,
+ categoryManagerFactory,
+ PR_TRUE);
+ if ( NS_FAILED(rv) ) return rv;
+ }
+
+ // what I want to do here is QI for a Component Registration Manager. Since this
+ // has not been invented yet, QI to the obsolete manager. Kids, don't do this at home.
+ nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(
+ NS_STATIC_CAST(nsIComponentManager*,compMgr), &rv);
+ if (registrar) {
+ for (int i = 0; i < components_length; i++)
+ RegisterGenericFactory(registrar, &components[i]);
+ }
+ rv = nsComponentManagerImpl::gComponentManager->ReadPersistentRegistry();
+#ifdef DEBUG
+ if (NS_FAILED(rv)) {
+ printf("No Persistent Registry Found.\n");
+ }
+#endif
+
+#if 0 /// @todo later
+ rv = IPC_Init();
+ if (NS_FAILED(rv))
+ return rv;
+#endif
+
+ if ( NS_FAILED(rv) || CheckUpdateFile()) {
+ // if we find no persistent registry, we will try to autoregister
+ // the default components directory.
+ nsComponentManagerImpl::gComponentManager->AutoRegister(nsnull);
+
+ // If the application is using a GRE, then,
+ // auto register components in the GRE directory as well.
+ //
+ // The application indicates that it's using an GRE by
+ // returning a valid nsIFile when queried (via appFileLocProvider)
+ // for the NS_GRE_DIR atom as shown below
+ //
+
+ if ( appFileLocationProvider ) {
+ nsCOMPtr<nsIFile> greDir;
+ PRBool persistent = PR_TRUE;
+
+ appFileLocationProvider->GetFile(NS_GRE_DIR, &persistent, getter_AddRefs(greDir));
+
+ if (greDir) {
+#ifdef DEBUG_dougt
+ printf("start - Registering GRE components\n");
+#endif
+ rv = gDirectoryService->Get(NS_GRE_COMPONENT_DIR,
+ NS_GET_IID(nsIFile),
+ getter_AddRefs(greDir));
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Could not get GRE components directory!");
+ return rv;
+ }
+
+ // If the GRE contains any loaders, we want to know about it so that we can cause another
+ // autoregistration of the applications component directory.
+ int loaderCount = nsComponentManagerImpl::gComponentManager->GetLoaderCount();
+ rv = nsComponentManagerImpl::gComponentManager->AutoRegister(greDir);
+
+ if (loaderCount != nsComponentManagerImpl::gComponentManager->GetLoaderCount())
+ nsComponentManagerImpl::gComponentManager->AutoRegisterNonNativeComponents(nsnull);
+
+#ifdef DEBUG_dougt
+ printf("end - Registering GRE components\n");
+#endif
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Could not AutoRegister GRE components");
+ return rv;
+ }
+ }
+ }
+
+ //
+ // If additional component directories have been specified, then
+ // register them as well.
+ //
+
+ nsCOMPtr<nsISimpleEnumerator> dirList;
+ gDirectoryService->Get(NS_XPCOM_COMPONENT_DIR_LIST,
+ NS_GET_IID(nsISimpleEnumerator),
+ getter_AddRefs(dirList));
+ if (dirList) {
+ PRBool hasMore;
+ while (NS_SUCCEEDED(dirList->HasMoreElements(&hasMore)) && hasMore) {
+ nsCOMPtr<nsISupports> elem;
+ dirList->GetNext(getter_AddRefs(elem));
+ if (elem) {
+ nsCOMPtr<nsIFile> dir = do_QueryInterface(elem);
+ if (dir)
+ nsComponentManagerImpl::gComponentManager->AutoRegister(dir);
+
+ // XXX should we worry about new component loaders being
+ // XXX defined by this process?
+ }
+ }
+ }
+
+
+ // Make sure the compreg file's mod time is current.
+ nsCOMPtr<nsIFile> compregFile;
+ rv = gDirectoryService->Get(NS_XPCOM_COMPONENT_REGISTRY_FILE,
+ NS_GET_IID(nsIFile),
+ getter_AddRefs(compregFile));
+ compregFile->SetLastModifiedTime(PR_Now() / 1000);
+ }
+
+ // Pay the cost at startup time of starting this singleton.
+ nsIInterfaceInfoManager* iim = XPTI_GetInterfaceInfoManager();
+ NS_IF_RELEASE(iim);
+#ifdef VBOX
+ // Must initialize the EventQueueService singleton before anyone is
+ // using it. The notification below creates a thread which races creating
+ // the EventQueueService creation otherwise, no matter what.
+ nsCOMPtr<nsIEventQueue> eventQ;
+ rv = NS_GetMainEventQ(getter_AddRefs(eventQ));
+ if (NS_FAILED(rv)) {
+ NS_ERROR("Could not create event queue for main thread");
+ /* this is just a build-time hack, to reference NS_ProxyRelease */
+ if (rv == 666)
+ NS_ProxyRelease(nsnull, nsnull);
+ return rv;
+ }
+#endif /* VBOX */
+
+ // Notify observers of xpcom autoregistration start
+ NS_CreateServicesFromCategory(NS_XPCOM_STARTUP_OBSERVER_ID,
+ nsnull,
+ NS_XPCOM_STARTUP_OBSERVER_ID);
+
+ return NS_OK;
+}
+
+
+static nsVoidArray* gExitRoutines;
+
+static void CallExitRoutines()
+{
+ if (!gExitRoutines)
+ return;
+
+ PRInt32 count = gExitRoutines->Count();
+ for (PRInt32 i = 0; i < count; i++) {
+ XPCOMExitRoutine func = (XPCOMExitRoutine) gExitRoutines->ElementAt(i);
+ func();
+ }
+ gExitRoutines->Clear();
+ delete gExitRoutines;
+ gExitRoutines = nsnull;
+}
+
+nsresult NS_COM
+NS_RegisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine, PRUint32 priority)
+{
+ // priority are not used right now. It will need to be implemented as more
+ // classes are moved into the glue library --dougt
+ if (!gExitRoutines) {
+ gExitRoutines = new nsVoidArray();
+ if (!gExitRoutines) {
+ NS_WARNING("Failed to allocate gExitRoutines");
+ return NS_ERROR_FAILURE;
+ }
+ }
+
+ PRBool okay = gExitRoutines->AppendElement((void*)exitRoutine);
+ return okay ? NS_OK : NS_ERROR_FAILURE;
+}
+
+nsresult NS_COM
+NS_UnregisterXPCOMExitRoutine(XPCOMExitRoutine exitRoutine)
+{
+ if (!gExitRoutines)
+ return NS_ERROR_FAILURE;
+
+ PRBool okay = gExitRoutines->RemoveElement((void*)exitRoutine);
+ return okay ? NS_OK : NS_ERROR_FAILURE;
+}
+
+
+//
+// NS_ShutdownXPCOM()
+//
+// The shutdown sequence for xpcom would be
+//
+// - Release the Global Service Manager
+// - Release all service instances held by the global service manager
+// - Release the Global Service Manager itself
+// - Release the Component Manager
+// - Release all factories cached by the Component Manager
+// - Unload Libraries
+// - Release Contractid Cache held by Component Manager
+// - Release dll abstraction held by Component Manager
+// - Release the Registry held by Component Manager
+// - Finally, release the component manager itself
+//
+nsresult NS_COM NS_ShutdownXPCOM(nsIServiceManager* servMgr)
+{
+
+ // Notify observers of xpcom shutting down
+ nsresult rv = NS_OK;
+ {
+ // Block it so that the COMPtr will get deleted before we hit
+ // servicemanager shutdown
+ nsCOMPtr<nsIObserverService> observerService =
+ do_GetService("@mozilla.org/observer-service;1", &rv);
+ if (NS_SUCCEEDED(rv))
+ {
+ nsCOMPtr<nsIServiceManager> mgr;
+ rv = NS_GetServiceManager(getter_AddRefs(mgr));
+ if (NS_SUCCEEDED(rv))
+ {
+ (void) observerService->NotifyObservers(mgr,
+ NS_XPCOM_SHUTDOWN_OBSERVER_ID,
+ nsnull);
+ }
+ }
+ }
+
+ // grab the event queue so that we can process events one last time before exiting
+ nsCOMPtr <nsIEventQueue> currentQ;
+ {
+ nsCOMPtr<nsIEventQueueService> eventQService =
+ do_GetService(kEventQueueServiceCID, &rv);
+
+ if (eventQService) {
+ eventQService->GetThreadEventQueue(NS_CURRENT_THREAD, getter_AddRefs(currentQ));
+ }
+ }
+ // XPCOM is officially in shutdown mode NOW
+ // Set this only after the observers have been notified as this
+ // will cause servicemanager to become inaccessible.
+ gXPCOMShuttingDown = PR_TRUE;
+
+#ifdef DEBUG_dougt
+ fprintf(stderr, "* * * * XPCOM shutdown. Access will be denied * * * * \n");
+#endif
+
+#if 0 /// @todo later
+ IPC_Shutdown();
+#endif
+
+ // We may have AddRef'd for the caller of NS_InitXPCOM, so release it
+ // here again:
+ NS_IF_RELEASE(servMgr);
+
+ // Shutdown global servicemanager
+ if (nsComponentManagerImpl::gComponentManager) {
+ nsComponentManagerImpl::gComponentManager->FreeServices();
+ }
+ nsServiceManager::ShutdownGlobalServiceManager(nsnull);
+
+ if (currentQ) {
+ currentQ->ProcessPendingEvents();
+ currentQ = 0;
+ }
+
+ nsProxyObjectManager::Shutdown();
+
+ // Release the directory service
+ NS_IF_RELEASE(gDirectoryService);
+
+ // Shutdown nsLocalFile string conversion
+ NS_ShutdownLocalFile();
+#ifdef XP_UNIX
+ NS_ShutdownNativeCharsetUtils();
+#endif
+
+ // Shutdown the timer thread and all timers that might still be alive before
+ // shutting down the component manager
+ nsTimerImpl::Shutdown();
+
+ CallExitRoutines();
+
+ // Shutdown xpcom. This will release all loaders and cause others holding
+ // a refcount to the component manager to release it.
+ if (nsComponentManagerImpl::gComponentManager) {
+ rv = (nsComponentManagerImpl::gComponentManager)->Shutdown();
+ NS_ASSERTION(NS_SUCCEEDED(rv), "Component Manager shutdown failed.");
+ } else
+ NS_WARNING("Component Manager was never created ...");
+
+ // Release our own singletons
+ // Do this _after_ shutting down the component manager, because the
+ // JS component loader will use XPConnect to call nsIModule::canUnload,
+ // and that will spin up the InterfaceInfoManager again -- bad mojo
+ XPTI_FreeInterfaceInfoManager();
+
+ // Finally, release the component manager last because it unloads the
+ // libraries:
+ if (nsComponentManagerImpl::gComponentManager) {
+ nsrefcnt cnt;
+ NS_RELEASE2(nsComponentManagerImpl::gComponentManager, cnt);
+ NS_WARN_IF_FALSE(cnt == 0, "Component Manager being held past XPCOM shutdown.");
+ }
+ nsComponentManagerImpl::gComponentManager = nsnull;
+
+#ifdef DEBUG
+ _FreeAutoLockStatics();
+#endif
+
+ ShutdownSpecialSystemDirectory();
+
+ EmptyEnumeratorImpl::Shutdown();
+ nsMemoryImpl::Shutdown();
+ NS_IF_RELEASE(gMemory);
+
+ nsThread::Shutdown();
+ NS_PurgeAtomTable();
+
+ NS_IF_RELEASE(gDebug);
+
+#ifdef NS_BUILD_REFCNT_LOGGING
+ nsTraceRefcntImpl::DumpStatistics();
+ nsTraceRefcntImpl::ResetStatistics();
+ nsTraceRefcntImpl::Shutdown();
+#endif
+
+#ifdef GC_LEAK_DETECTOR
+ // Shutdown the Leak detector.
+ NS_ShutdownLeakDetector();
+#endif
+
+ return NS_OK;
+}
+
+#define GET_FUNC(_tag, _decl, _name) \
+ functions->_tag = (_decl) PR_FindSymbol(xpcomLib, _name); \
+ if (!functions->_tag) goto end
+
+nsresult NS_COM PR_CALLBACK
+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;
+
+ PRLibrary *xpcomLib = PR_LoadLibrary(libraryPath);
+ if (!xpcomLib)
+ return NS_ERROR_FAILURE;
+
+ nsresult rv = NS_ERROR_FAILURE;
+
+#ifdef VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
+ GET_FUNC(init, InitFunc, "VBoxNsxpNS_InitXPCOM2");
+ GET_FUNC(shutdown, ShutdownFunc, "VBoxNsxpNS_ShutdownXPCOM");
+ GET_FUNC(getServiceManager, GetServiceManagerFunc, "VBoxNsxpNS_GetServiceManager");
+ GET_FUNC(getComponentManager, GetComponentManagerFunc, "VBoxNsxpNS_GetComponentManager");
+ GET_FUNC(getComponentRegistrar, GetComponentRegistrarFunc, "VBoxNsxpNS_GetComponentRegistrar");
+ GET_FUNC(getMemoryManager, GetMemoryManagerFunc, "VBoxNsxpNS_GetMemoryManager");
+ GET_FUNC(newLocalFile, NewLocalFileFunc, "VBoxNsxpNS_NewLocalFile");
+ GET_FUNC(newNativeLocalFile, NewNativeLocalFileFunc, "VBoxNsxpNS_NewNativeLocalFile");
+ GET_FUNC(registerExitRoutine, RegisterXPCOMExitRoutineFunc, "VBoxNsxpNS_RegisterXPCOMExitRoutine");
+ GET_FUNC(unregisterExitRoutine, UnregisterXPCOMExitRoutineFunc, "VBoxNsxpNS_UnregisterXPCOMExitRoutine");
+#else /* !VBOX_WITH_XPCOM_NAMESPACE_CLEANUP */
+ GET_FUNC(init, InitFunc, "NS_InitXPCOM2");
+ GET_FUNC(shutdown, ShutdownFunc, "NS_ShutdownXPCOM");
+ GET_FUNC(getServiceManager, GetServiceManagerFunc, "NS_GetServiceManager");
+ GET_FUNC(getComponentManager, GetComponentManagerFunc, "NS_GetComponentManager");
+ GET_FUNC(getComponentRegistrar, GetComponentRegistrarFunc, "NS_GetComponentRegistrar");
+ GET_FUNC(getMemoryManager, GetMemoryManagerFunc, "NS_GetMemoryManager");
+ GET_FUNC(newLocalFile, NewLocalFileFunc, "NS_NewLocalFile");
+ GET_FUNC(newNativeLocalFile, NewNativeLocalFileFunc, "NS_NewNativeLocalFile");
+ GET_FUNC(registerExitRoutine, RegisterXPCOMExitRoutineFunc, "NS_RegisterXPCOMExitRoutine");
+ GET_FUNC(unregisterExitRoutine, UnregisterXPCOMExitRoutineFunc, "NS_UnregisterXPCOMExitRoutine");
+#endif /* !VBOX_WITH_XPCOM_NAMESPACE_CLEANUP */
+
+ // these functions were added post 1.4 (need to check size of |functions|)
+ if (functions->size > offsetof(XPCOMFunctions, getTraceRefcnt)) {
+#ifdef VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
+ GET_FUNC(getDebug, GetDebugFunc, "VBoxNsxpNS_GetDebug");
+ GET_FUNC(getTraceRefcnt, GetTraceRefcntFunc, "VBoxNsxpNS_GetTraceRefcnt");
+#else /* !VBOX_WITH_XPCOM_NAMESPACE_CLEANUP */
+ GET_FUNC(getDebug, GetDebugFunc, "NS_GetDebug");
+ GET_FUNC(getTraceRefcnt, GetTraceRefcntFunc, "NS_GetTraceRefcnt");
+#endif /* !VBOX_WITH_XPCOM_NAMESPACE_CLEANUP */
+ }
+
+ // these functions were added post 1.6 (need to check size of |functions|)
+ if (functions->size > offsetof(XPCOMFunctions, cstringCloneData)) {
+#ifdef VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
+ GET_FUNC(stringContainerInit, StringContainerInitFunc, "VBoxNsxpNS_StringContainerInit");
+ GET_FUNC(stringContainerFinish, StringContainerFinishFunc, "VBoxNsxpNS_StringContainerFinish");
+ GET_FUNC(stringGetData, StringGetDataFunc, "VBoxNsxpNS_StringGetData");
+ GET_FUNC(stringSetData, StringSetDataFunc, "VBoxNsxpNS_StringSetData");
+ GET_FUNC(stringSetDataRange, StringSetDataRangeFunc, "VBoxNsxpNS_StringSetDataRange");
+ GET_FUNC(stringCopy, StringCopyFunc, "VBoxNsxpNS_StringCopy");
+ GET_FUNC(cstringContainerInit, CStringContainerInitFunc, "VBoxNsxpNS_CStringContainerInit");
+ GET_FUNC(cstringContainerFinish, CStringContainerFinishFunc, "VBoxNsxpNS_CStringContainerFinish");
+ GET_FUNC(cstringGetData, CStringGetDataFunc, "VBoxNsxpNS_CStringGetData");
+ GET_FUNC(cstringSetData, CStringSetDataFunc, "VBoxNsxpNS_CStringSetData");
+ GET_FUNC(cstringSetDataRange, CStringSetDataRangeFunc, "VBoxNsxpNS_CStringSetDataRange");
+ GET_FUNC(cstringCopy, CStringCopyFunc, "VBoxNsxpNS_CStringCopy");
+ GET_FUNC(cstringToUTF16, CStringToUTF16, "VBoxNsxpNS_CStringToUTF16");
+ GET_FUNC(utf16ToCString, UTF16ToCString, "VBoxNsxpNS_UTF16ToCString");
+ GET_FUNC(stringCloneData, StringCloneDataFunc, "VBoxNsxpNS_StringCloneData");
+ GET_FUNC(cstringCloneData, CStringCloneDataFunc, "VBoxNsxpNS_CStringCloneData");
+#else /* !VBOX_WITH_XPCOM_NAMESPACE_CLEANUP */
+ GET_FUNC(stringContainerInit, StringContainerInitFunc, "NS_StringContainerInit");
+ GET_FUNC(stringContainerFinish, StringContainerFinishFunc, "NS_StringContainerFinish");
+ GET_FUNC(stringGetData, StringGetDataFunc, "NS_StringGetData");
+ GET_FUNC(stringSetData, StringSetDataFunc, "NS_StringSetData");
+ GET_FUNC(stringSetDataRange, StringSetDataRangeFunc, "NS_StringSetDataRange");
+ GET_FUNC(stringCopy, StringCopyFunc, "NS_StringCopy");
+ GET_FUNC(cstringContainerInit, CStringContainerInitFunc, "NS_CStringContainerInit");
+ GET_FUNC(cstringContainerFinish, CStringContainerFinishFunc, "NS_CStringContainerFinish");
+ GET_FUNC(cstringGetData, CStringGetDataFunc, "NS_CStringGetData");
+ GET_FUNC(cstringSetData, CStringSetDataFunc, "NS_CStringSetData");
+ GET_FUNC(cstringSetDataRange, CStringSetDataRangeFunc, "NS_CStringSetDataRange");
+ GET_FUNC(cstringCopy, CStringCopyFunc, "NS_CStringCopy");
+ GET_FUNC(cstringToUTF16, CStringToUTF16, "NS_CStringToUTF16");
+ GET_FUNC(utf16ToCString, UTF16ToCString, "NS_UTF16ToCString");
+ GET_FUNC(stringCloneData, StringCloneDataFunc, "NS_StringCloneData");
+ GET_FUNC(cstringCloneData, CStringCloneDataFunc, "NS_CStringCloneData");
+#endif /* !VBOX_WITH_XPCOM_NAMESPACE_CLEANUP */
+ }
+
+ rv = NS_OK;
+end:
+ PR_UnloadLibrary(xpcomLib); // the library is refcnt'ed above by the caller.
+ return rv;
+}
diff --git a/src/libs/xpcom18a4/xpcom/build/win32.order b/src/libs/xpcom18a4/xpcom/build/win32.order
new file mode 100644
index 00000000..ce6856ba
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/win32.order
@@ -0,0 +1,1514 @@
+??1nsCOMPtr_base@@QAE@XZ ; 33017395
+?ElementAt@nsVoidArray@@QBEPAXH@Z ; 14120786
+?AddRef@nsEventQueueServiceImpl@@UAGKXZ ; 13612685
+?Release@AtomImpl@@UAGKXZ ; 13067618
+?Initialize@nsStr@@SAXAAU1@W4eCharSize@@@Z ; 9860800
+?Reference@nsCWeakProxy@@QAEPAXXZ ; 9283082
+?Free@nsStr@@CAHAAU1@@Z ; 8492496
+?Destroy@nsStr@@SAXAAU1@@Z ; 8159980
+??1nsString@@UAE@XZ ; 7681847
+??0nsString@@QAE@XZ ; 7538998
+?GetWritableFragment@nsString@@MAEPAGAAU?$nsWritableFragment@G@@W4nsFragmentRequest@@I@Z ; 7387979
+?Initialize@nsStr@@SAXAAU1@PADIIW4eCharSize@@H@Z ; 7301440
+??1nsAutoString@@UAE@XZ ; 6828894
+??0nsAutoString@@QAE@XZ ; 6681318
+?normalize_forward@?$nsReadingIterator@G@@QAEXXZ ; 6469200
+?normalize_forward@?$nsWritingIterator@D@@QAEXXZ ; 4717355
+?StrTruncate@nsStr@@SAXAAU1@I@Z ; 4534497
+?assign_from_helper@nsCOMPtr_base@@QAEXABVnsCOMPtr_helper@@ABUnsID@@@Z ; 4516612
+??0nsHashKey@@IAE@XZ ; 4270805
+??1nsHashKey@@UAE@XZ ; 4268636
+??RnsQueryInterface@@UBEIABUnsID@@PAPAX@Z ; 4148520
+?SetLength@nsCString@@UAEXI@Z ; 4098410
+?Get@nsHashtable@@QAEPAXPAVnsHashKey@@@Z ; 3790063
+?GetFlatBufferHandle@nsLocalString@@UBEPBV?$nsBufferHandle@G@@XZ ; 3747888
+?BeginReading@nsACString@@QBEAAV?$nsReadingIterator@D@@AAV2@@Z ; 3649883
+?FindChar1@@YAHPBDIHGHH@Z ; 2533672
+?BeginWriting@nsACString@@QAEAAV?$nsWritingIterator@D@@AAV2@@Z ; 2226534
+?advance@?$nsWritingIterator@G@@QAEAAV1@H@Z ; 2049632
+?advance@?$nsReadingIterator@G@@QAEAAV1@H@Z ; 1995545
+?GetReadableFragment@nsAFlatCString@@MBEPBDAAU?$nsReadableFragment@D@@W4nsFragmentRequest@@I@Z ; 1948988
+?Count@nsSupportsArray@@UAGIPAI@Z ; 1839978
+?readable_distance@?$nsCharSourceTraits@V?$nsReadingIterator@G@@@@SAIABV?$nsReadingIterator@G@@0@Z ; 1802375
+?GetReadableFragment@nsCString@@MBEPBDAAU?$nsReadableFragment@D@@W4nsFragmentRequest@@I@Z ; 1763345
+??0nsQueryInterface@@QAE@PAVnsISupports@@PAI@Z ; 1655422
+?copy_string@@YAAAV?$nsWritingIterator@G@@AAV?$nsReadingIterator@G@@ABV2@AAV1@@Z ; 1487171
+?GetWritableFragment@nsAFlatString@@MAEPAGAAU?$nsWritableFragment@G@@W4nsFragmentRequest@@I@Z ; 1391163
+?advance@?$nsWritingIterator@D@@QAEAAV1@H@Z ; 1335661
+?Equals@nsAString@@QBEHABV1@@Z ; 1318787
+?move@?$nsCharTraits@G@@SAPAGPAGPBGI@Z ; 1315826
+?assign_with_AddRef@nsCOMPtr_base@@QAEXPAVnsISupports@@@Z ; 1259090
+?write@?$nsWritingIterator@G@@QAEIPBGI@Z ; 1243674
+?Get@nsSupportsHashtable@@QAEPAVnsISupports@@PAVnsHashKey@@@Z ; 1199544
+?GetUnicode@nsString@@QBEPBGXZ ; 1141413
+?StrAppend@nsStr@@SAXAAU1@ABU1@IH@Z ; 1102413
+?FindChar@nsString@@QBEHGHHH@Z ; 1090463
+?FindChar@nsStr@@SAHABU1@GHHH@Z ; 1090463
+?FindChar2@@YAHPBDIHGHH@Z ; 1056090
+?ElementAt@nsSupportsArray@@UAGPAVnsISupports@@I@Z ; 1055798
+?InsertElementAt@nsVoidArray@@QAEHPAXH@Z ; 926721
+?Compare2To2@@YAHPBD0IH@Z ; 920121
+?EnumerateForwards@nsSupportsArray@@UAGHP6AHPAVnsISupports@@PAX@Z1@Z ; 908730
+?strncasecmp@nsCRT@@SAHPBG0I@Z ; 896894
+?StrCompare@nsStr@@SAHABU1@0HH@Z ; 886450
+?Free@nsMemoryImpl@@UAGXPAX@Z ; 842646
+?Free@nsMemory@@SAXPAX@Z ; 832569
+?Distance@@YAIABV?$nsReadingIterator@G@@0@Z ; 801833
+?copy_string@@YAAAV?$CalculateLength@G@@AAV?$nsReadingIterator@G@@ABV2@AAV1@@Z ; 801833
+?Compare2To1@@YAHPBD0IH@Z ; 797802
+?Alloc@nsMemoryImpl@@UAGPAXI@Z ; 795063
+?Length@nsAFlatString@@UBEIXZ ; 789895
+?advance@?$nsReadingIterator@D@@QAEAAV1@H@Z ; 778072
+?copy_string@@YAAAV?$nsWritingIterator@D@@AAV?$nsReadingIterator@D@@ABV2@AAV1@@Z ; 738318
+?Alloc@nsMemory@@SAPAXI@Z ; 731916
+?write@?$nsWritingIterator@D@@QAEIPBDI@Z ; 724438
+?EqualsWithConversion@nsString@@QBEHABV1@HH@Z ; 680848
+?EqualsIgnoreCase@nsString@@QBEHABV1@@Z ; 680848
+?Length@nsAFlatCString@@UBEIXZ ; 674814
+?GetReadableFragment@nsSlidingSubstring@@MBEPBGAAU?$nsReadableFragment@G@@W4nsFragmentRequest@@I@Z ; 671287
+?do_AppendFromReadable@nsAString@@MAEXABV1@@Z ; 657779
+?Compare@@YAHABVnsAString@@0@Z ; 630913
+?do_AssignFromReadable@nsAString@@MAEXABV1@@Z ; 630139
+?CopyChars2To2@@YAXPADHPBDII@Z ; 615216
+?do_AppendFromReadable@nsACString@@MAEXABV1@@Z ; 584996
+?ObjectAt@nsDeque@@QBEPAXH@Z ; 568869
+?InsertElementAt@nsSupportsArray@@UAGHPAVnsISupports@@I@Z ; 548718
+?AssignFromReadable@nsACString@@IAEXABV1@@Z ; 534684
+??0nsLocalCString@@QAE@PBD@Z ; 525422
+?strlen@nsCRT@@SAIPBG@Z ; 517372
+?get@nsString@@UBEPBGXZ ; 500471
+?GrowCapacity@nsStr@@SAHAAU1@I@Z ; 493115
+?Realloc@nsStr@@CAHAAU1@I@Z ; 493115
+?Alloc@nsStr@@CAHAAU1@I@Z ; 493115
+?EnsureCapacity@nsStr@@SAHAAU1@I@Z ; 493115
+??0nsVoidArray@@QAE@XZ ; 490358
+?strncmp@nsCRT@@SAHPBGPBDI@Z ; 489334
+??1nsVoidArray@@UAE@XZ ; 481308
+??1nsCString@@UAE@XZ ; 478019
+?RemoveElementAt@nsVoidArray@@QAEHH@Z ; 473592
+?AppendElement@nsSupportsArray@@UAGIPAVnsISupports@@@Z ; 464186
+?AppendWithConversion@nsCString@@QAEXG@Z ; 452063
+??0nsCString@@QAE@XZ ; 449721
+?do_AppendFromElementPtr@nsACString@@MAEXPBD@Z ; 427640
+?SetArraySize@nsVoidArray@@IAEXH@Z ; 425906
+?get@nsPromiseFlatCString@@UBEPBDXZ ; 413903
+?Alloc@nsFixedSizeAllocator@@QAEPAXI@Z ; 411293
+??0nsPromiseFlatString@@IAE@ABVnsAString@@@Z ; 410015
+?Free@nsFixedSizeAllocator@@SAXPAXI@Z ; 401028
+?strcmp@nsCRT@@SAHPBG0@Z ; 400500
+??1nsPromiseFlatString@@UAE@XZ ; 398346
+??1nsCAutoString@@UAE@XZ ; 391273
+?GetFlatBufferHandle@nsCString@@MBEPBV?$nsBufferHandle@D@@XZ ; 385981
+?Push@nsDeque@@QAEAAV1@PAX@Z ; 367628
+?Equals@nsIDKey@@UBEHPBVnsHashKey@@@Z ; 358933
+?Clear@nsSupportsArray@@UAGIXZ ; 352217
+?AppendFromReadable@nsAString@@IAEXABV1@@Z ; 352181
+?strncasecmp@nsCRT@@SAHPBGPBDI@Z ; 330906
+?IsAsciiAlpha@nsCRT@@SAHG@Z ; 327047
+??0nsCAutoString@@QAE@XZ ; 311314
+?Clear@nsVoidArray@@QAEXXZ ; 287750
+?Compare1To1@@YAHPBD0IH@Z ; 276525
+?Length@nsSlidingSubstring@@UBEIXZ ; 264724
+?PopFront@nsDeque@@QAEPAXXZ ; 260861
+?AcquireNonOwningReference@Buffer@nsSharedBufferList@@QBEXXZ ; 256259
+?Distance@Position@nsSharedBufferList@@SAHABU12@0@Z ; 254042
+?DiscardUnreferencedPrefix@nsSlidingSharedBufferList@@QAEXPAVBuffer@nsSharedBufferList@@@Z ; 254040
+?ReleaseNonOwningReference@Buffer@nsSharedBufferList@@QBEXXZ ; 254040
+??1nsCStringKey@@UAE@XZ ; 253255
+?HashCode@nsCRT@@SAIPBDPAI@Z ; 251093
+?HashCode@nsCStringKey@@UBEIXZ ; 250679
+?NS_GetGlobalComponentManager@@YAIPAPAVnsIComponentManager@@@Z ; 250625
+??1nsAFlatString@@UAE@XZ ; 249908
+??0nsAFlatString@@QAE@XZ ; 243174
+?Equals@nsCStringKey@@UBEHPBVnsHashKey@@@Z ; 238528
+?IsAsciiSpace@nsCRT@@SAHG@Z ; 238314
+?CopyChars1To2@@YAXPADHPBDII@Z ; 237716
+??0nsLocalString@@QAE@PBGI@Z ; 236845
+?NS_NewAtom@@YAPAVnsIAtom@@ABVnsAString@@@Z ; 235384
+?Release@nsSupportsArray@@UAGKXZ ; 229149
+?GetParameterCount@nsProxyObjectCallInfo@@QBEIXZ ; 228843
+??0nsAutoVoidArray@@QAE@XZ ; 223605
+?do_AppendFromElementPtrLength@nsAString@@MAEXPBGI@Z ; 221664
+?AppendWithConversion@nsString@@QAEXPBDH@Z ; 216212
+?ChangeCase@nsStr@@SAXAAU1@H@Z ; 211594
+?length@?$nsCharTraits@G@@SAIPBG@Z ; 206064
+??0nsLocalString@@QAE@PBG@Z ; 205367
+?SetArrayOwner@nsVoidArray@@IAEXH@Z ; 202301
+?GetFactoryEntry@nsComponentManagerImpl@@IAEPAVnsFactoryEntry@@ABUnsID@@H@Z ; 198436
+?FindFactory@nsComponentManagerImpl@@UAGIABUnsID@@PAPAVnsIFactory@@@Z ; 198385
+?GetFactory@nsFactoryEntry@@QAEIPAPAVnsIFactory@@PAVnsComponentManagerImpl@@@Z ; 198384
+?CreateInstance@nsComponentManagerImpl@@UAGIABUnsID@@PAVnsISupports@@0PAPAX@Z ; 198351
+?ToLowerCase@nsString@@QAEXXZ ; 198180
+?Remove@nsHashtable@@QAEPAXPAVnsHashKey@@@Z ; 191685
+?ToString@AtomImpl@@UAGIAAVnsAString@@@Z ; 189337
+?First@nsAString@@QBEGXZ ; 189245
+?release_ownership_of_buffer_list@nsSlidingSubstring@@AAEXXZ ; 188763
+?IndexOf@nsVoidArray@@QBEHPAX@Z ; 175677
+?StartAssignmentByValue@nsXPIDLString@@AAEPAPAGXZ ; 173850
+?SetCapacity@nsString@@UAEXI@Z ; 170493
+?CopyChars2To1@@YAXPADHPBDII@Z ; 168065
+?Put@nsHashtable@@QAEPAXPAVnsHashKey@@PAX@Z ; 160536
+?DiscardPrefix@nsSlidingString@@QAEXABV?$nsReadingIterator@G@@@Z ; 159450
+?StrAssign@nsStr@@SAXAAU1@ABU1@IH@Z ; 154324
+?Trim@nsStr@@SAXAAU1@PBDHH@Z ; 154152
+?SetCapacity@nsCString@@UAEXI@Z ; 151535
+?GetGlobalServiceManager@nsServiceManager@@SAIPAPAVnsIServiceManager@@@Z ; 148522
+?GetService@nsServiceManagerImpl@@UAGIABUnsID@@0PAPAVnsISupports@@PAVnsIShutdownListener@@@Z ; 146024
+?AddListener@nsServiceEntry@@QAEIPAVnsIShutdownListener@@@Z ; 146022
+?GetUnicode@AtomImpl@@UAGIPAPBG@Z ; 143965
+?Pop@nsDeque@@QAEPAXXZ ; 143309
+??RnsQueryReferent@@UBEIABUnsID@@PAPAX@Z ; 142474
+?normalize_backward@?$nsReadingIterator@G@@QAEXXZ ; 142302
+?QueryReferent@nsWeakReference@@UAGIABUnsID@@PAPAX@Z ; 142237
+?AddRef@nsStorageStream@@UAGKXZ ; 141846
+?Assign@nsACString@@QAEXPBD@Z ; 141606
+?FindCharInSet@nsStr@@SAHABU1@0HH@Z ; 138161
+?FindCharInSet@nsCString@@QBEHPBDH@Z ; 138161
+?CreateInstance@nsComponentManager@@SAIABUnsID@@PAVnsISupports@@0PAPAX@Z ; 137059
+??0nsCStringKey@@QAE@PBDHW4Ownership@0@@Z ; 136293
+??1nsXPIDLCString@@UAE@XZ ; 134911
+??0nsString@@QAE@ABV0@@Z ; 134194
+?do_AssignFromReadable@nsACString@@MAEXABV1@@Z ; 128929
+?ConvertCase1@@YAHPADIH@Z ; 128876
+?AssignWithConversion@nsCString@@QAEXPBGH@Z ; 122216
+?do_AppendFromElement@nsACString@@MAEXD@Z ; 120364
+?Write@FileImpl@@UAGIPBDIPAI@Z ; 120089
+?AssignWithConversion@nsCString@@QAEXABVnsString@@@Z ; 119962
+?AddRef@nsSupportsStringImpl@@UAGKXZ ; 118646
+??0nsCStringKey@@QAE@ABVnsCString@@@Z ; 117124
+?GetResolveState@xptiInterfaceInfo@@QBEEXZ ; 117066
+?AppendUnicodeTo@@YAXABV?$nsReadingIterator@G@@0AAVnsAString@@@Z ; 115792
+?AssignWithConversion@nsString@@QAEXPBD@Z ; 115695
+?Last@nsAString@@QBEGXZ ; 115018
+?ContractIDToClassID@nsComponentManagerImpl@@UAGIPBDPAUnsID@@@Z ; 112973
+?ToNewCString@nsCString@@QBEPADXZ ; 110413
+?LookupLowercasedKeyword@@YAHABVnsCString@@PAVnsHashtable@@@Z ; 110405
+?IsAsciiDigit@nsCRT@@SAHG@Z ; 107530
+?Remove@nsSupportsHashtable@@QAEHPAVnsHashKey@@PAPAVnsISupports@@@Z ; 106325
+??0nsAutoString@@QAE@ABVnsString@@@Z ; 103799
+?CompareWithConversion@nsString@@QBEHPBDHH@Z ; 102438
+?EqualsWithConversion@nsString@@QBEHPBDHH@Z ; 101441
+?Lookup@nsStaticCaseInsensitiveNameTable@@QAEHABVnsString@@@Z ; 101178
+?Trim@nsString@@QAEXPBDHHH@Z ; 100923
+?Release@nsWeakReference@@UAGKXZ ; 100809
+?GetReadableFragment@nsPromiseSubstring@@MBEPBGAAU?$nsReadableFragment@G@@W4nsFragmentRequest@@I@Z ; 98711
+?GetService@nsServiceManager@@SAIABUnsID@@0PAPAVnsISupports@@PAVnsIShutdownListener@@@Z ; 97630
+?write@nsOutputStream@@QAEHPBXH@Z ; 96747
+?Init@nsXPTCVariant@@QAEXABUnsXPTCMiniVariant@@ABVnsXPTType@@E@Z ; 95698
+?acquire_ownership_of_buffer_list@nsSlidingString@@ABEXXZ ; 94592
+?ReleaseReference@nsSlidingSharedBufferList@@QAEXXZ ; 94590
+??1nsSlidingSubstring@@UAE@XZ ; 94580
+??0nsSlidingSubstring@@QAE@XZ ; 94173
+?RemoveElement@nsVoidArray@@QAEHPAX@Z ; 91746
+??RnsGetServiceByCID@@UBEIABUnsID@@PAPAX@Z ; 91521
+??0nsGetServiceByCID@@QAE@ABUnsID@@PAVnsISupports@@PAI@Z ; 91521
+?Release@nsEventQueueImpl@@UAGKXZ ; 87880
+?EqualsIgnoreCase@nsString@@QBEHPBDH@Z ; 86030
+?Init@NS_ConvertUTF8toUCS2@@IAEXPBDI@Z ; 85607
+?Rebind@nsSlidingSubstring@@QAEXABVnsSlidingString@@ABV?$nsReadingIterator@G@@1@Z ; 83943
+?do_AppendFromElementPtr@nsAString@@MAEXPBG@Z ; 83867
+??0nsSupportsArray@@QAE@XZ ; 83106
+?ConvertCase2@@YAHPADIH@Z ; 82718
+?DeleteArray@nsSupportsArray@@IAEXXZ ; 82548
+??1nsSupportsArray@@UAE@XZ ; 82548
+?QueryInterface@nsSupportsArray@@UAGIABUnsID@@PAPAX@Z ; 81918
+?Create@nsSupportsArray@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 81725
+?NS_NewISupportsArray@@YAIPAPAVnsISupportsArray@@@Z ; 81666
+?CopyChars1To1@@YAXPADHPBDII@Z ; 81524
+??_EnsSupportsArray@@UAEPAXI@Z ; 81168
+?GetMethodInfo@xptiInterfaceInfo@@UAGIGPAPBVnsXPTMethodInfo@@@Z ; 78229
+?Release@xptiInterfaceInfo@@UAGKXZ ; 76117
+?do_AssignFromElementPtr@nsAString@@MAEXPBG@Z ; 73811
+?copy_string@@YAAAPAGAAV?$nsReadingIterator@G@@ABV1@AAPAG@Z ; 71847
+?GetReadableFragment@nsPromiseCSubstring@@MBEPBDAAU?$nsReadableFragment@D@@W4nsFragmentRequest@@I@Z ; 71331
+?GetBuffer@ByteBufferImpl@@UBGPADXZ ; 71201
+?Read@ConverterInputStream@@UAGIPAGIIPAI@Z ; 70839
+?Read@nsPersistentProperties@@QAEHXZ ; 70367
+?do_AssignFromElementPtr@nsACString@@MAEXPBD@Z ; 62916
+?Length@nsPromiseCSubstring@@UBEIXZ ; 62793
+?CompareWithConversion@nsCString@@QBEHPBDHH@Z ; 62172
+??0NS_ConvertASCIItoUCS2@@QAE@PBD@Z ; 61750
+?CreateInstanceByContractID@nsComponentManagerImpl@@UAGIPBDPAVnsISupports@@ABUnsID@@PAPAX@Z ; 61075
+?CreateInstance@nsComponentManager@@SAIPBDPAVnsISupports@@ABUnsID@@PAPAX@Z ; 61075
+?Exit@nsAutoMonitor@@QAEXXZ ; 59293
+?Enter@nsAutoMonitor@@QAEXXZ ; 59293
+PL_GetEventOwner ; 55295
+?RefCountInInterfacePointers@nsProxyObjectCallInfo@@AAEXH@Z ; 55218
+?Clone@nsMemory@@SAPAXPBXI@Z ; 53069
+?Promises@nsAString@@UBEHABV1@@Z ; 52421
+?Promises@nsPromiseSubstring@@UBEHABVnsAString@@@Z ; 52287
+?ContractIDToClassID@nsComponentManager@@SAIPBDPAUnsID@@@Z ; 51898
+?GetStringValue@nsStaticCaseInsensitiveNameTable@@QAEABVnsCString@@H@Z ; 51863
+?CopyUnicodeTo@@YAXABV?$nsReadingIterator@G@@0AAVnsAString@@@Z ; 51424
+??RnsGetInterface@@UBEIABUnsID@@PAPAX@Z ; 51014
+?GetService@nsServiceManager@@SAIPBDABUnsID@@PAPAVnsISupports@@PAVnsIShutdownListener@@@Z ; 50614
+?GetService@nsServiceManagerImpl@@UAGIPBDABUnsID@@PAPAVnsISupports@@PAVnsIShutdownListener@@@Z ; 50608
+?GetElementAt@nsSupportsArray@@UAGIIPAPAVnsISupports@@@Z ; 50421
+??0nsCAutoString@@QAE@PBD@Z ; 50288
+?Release@nsGenericFactory@@UAGKXZ ; 48967
+?Release@nsLocalFile@@UAGKXZ ; 48924
+?CreateInstance@nsGenericFactory@@UAGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 47807
+?ToNewUnicode@@YAPAGABVnsAString@@@Z ; 47476
+?Equals@nsSupportsArray@@UAGHPBVnsISupportsArray@@@Z ; 47394
+?QueryInterface@nsWeakReference@@UAGIABUnsID@@PAPAX@Z ; 47232
+?ToInteger@nsString@@QBEHPAHI@Z ; 46397
+??0nsGetServiceByContractID@@QAE@PBDPAVnsISupports@@PAI@Z ; 45960
+??RnsGetServiceByContractID@@UBEIABUnsID@@PAPAX@Z ; 45960
+?Reset@nsHashtable@@QAEXP6AHPAVnsHashKey@@PAX1@Z1@Z ; 45160
+?Reset@nsHashtable@@QAEXXZ ; 44779
+?strdup@nsCRT@@SAPAGPBG@Z ; 44542
+?strndup@nsCRT@@SAPAGPBGI@Z ; 44542
+PL_InitEvent ; 42216
+PL_DestroyEvent ; 42216
+?Release@nsProxyObject@@UAGKXZ ; 42053
+?HashCode@nsCRT@@SAIPBGPAI@Z ; 41515
+?MakeDirty@nsLocalFile@@AAEXXZ ; 40921
+?CompressSet@nsStr@@SAXAAU1@PBDHH@Z ; 40756
+?FindSubstr@nsStr@@SAHABU1@0HHH@Z ; 40557
+XPTC_InvokeByIndex ; 40446
+?QueryInterface@nsEventQueueImpl@@UAGIABUnsID@@PAPAX@Z ; 40010
+?Peek@nsDeque@@QAEPAXXZ ; 39695
+?ToUpper@nsCRT@@SAGG@Z ; 39657
+?CopyStrings@nsProxyObjectCallInfo@@AAEXH@Z ; 39492
+PL_DHashTableOperate ; 39446
+??0nsDeque@@QAE@PAVnsDequeFunctor@@@Z ; 38500
+?Empty@nsDeque@@QAEAAV1@XZ ; 38489
+??1nsDeque@@QAE@XZ ; 38489
+?Erase@nsDeque@@QAEAAV1@XZ ; 38489
+?GetSegmentCount@nsSegmentedBuffer@@QAEIXZ ; 38168
+?Release@nsProxyEventObject@@UAGKXZ ; 37461
+?ReplaceElementAt@nsVoidArray@@QAEHPAXH@Z ; 37379
+??0nsAutoString@@QAE@PBG@Z ; 35740
+PL_GetEvent ; 34422
+PL_HandleEvent ; 34415
+PL_PostEvent ; 34415
+?PostEvent@nsEventQueueImpl@@UAG?AW4PRStatus@@PAUPLEvent@@@Z ; 34353
+?strncmp@nsCRT@@SAHPBG0I@Z ; 34311
+?Cut@nsAString@@UAEXII@Z ; 33933
+?Release@nsThread@@UAGKXZ ; 32675
+?GetInstance@nsProxyObjectManager@@SAPAV1@XZ ; 31747
+?EqualsWithConversion@nsCString@@QBEHPBGHH@Z ; 31327
+?CompareWithConversion@nsCString@@QBEHPBGHH@Z ; 31327
+?GetRealObject@nsProxyObject@@QBEPAVnsISupports@@XZ ; 30180
+PL_DHashStringKey ; 29743
+?QueryInterface@nsEventQueueServiceImpl@@UAGIABUnsID@@PAPAX@Z ; 29645
+?GetReadSegment@nsPipe@@QAEIIPAPBDPAI@Z ; 29618
+??1nsXPIDLString@@UAE@XZ ; 29310
+?Release@nsProxyEventClass@@UAGKXZ ; 29259
+??0nsPromiseSubstring@@QAE@ABVnsAString@@II@Z ; 29232
+?Compact@nsSupportsArray@@UAGIXZ ; 28635
+?Mid@nsAString@@QBEIAAV1@II@Z ; 28616
+?AssignFromPromise@nsAString@@IAEXABV1@@Z ; 28510
+?get@nsAFlatString@@UBEPBGXZ ; 28400
+?Equals@nsACString@@QBEHABV1@@Z ; 28339
+?convertMiniVariantToVariant@nsProxyObject@@AAEIPAVnsXPTMethodInfo@@PAUnsXPTCMiniVariant@@PAPAUnsXPTCVariant@@PAE@Z ; 27609
+??_EnsProxyObjectCallInfo@@UAEPAXI@Z ; 27609
+?Post@nsProxyObject@@QAEIIPAVnsXPTMethodInfo@@PAUnsXPTCMiniVariant@@PAVnsIInterfaceInfo@@@Z ; 27609
+??1nsProxyObjectCallInfo@@UAE@XZ ; 27609
+?CallMethod@nsProxyEventObject@@UAGIGPBVnsXPTMethodInfo@@PAUnsXPTCMiniVariant@@@Z ; 27609
+??0nsProxyObjectCallInfo@@QAE@PAVnsProxyObject@@PAVnsXPTMethodInfo@@IPAUnsXPTCVariant@@IPAUPLEvent@@@Z ; 27609
+?Append@NS_ConvertUCS2toUTF8@@IAEXPBGI@Z ; 27265
+?ReplaceChar@nsString@@QAEXPBDG@Z ; 26980
+?CompressSet@nsString@@QAEXPBDGHH@Z ; 26980
+?CompressChars2@@YAHPADIPBD@Z ; 26980
+?CompressWhitespace@nsString@@QAEXHH@Z ; 26980
+?assign_assuming_AddRef@nsCOMPtr_base@@IAEXPAVnsISupports@@@Z ; 26695
+?do_AssignFromElement@nsAString@@MAEXG@Z ; 25781
+??0nsCAutoString@@QAE@ABVCBufDescriptor@@@Z ; 25669
+??0CBufDescriptor@@QAE@PADHIH@Z ; 25623
+?RemoveElementAt@nsSupportsArray@@UAGHI@Z ; 25489
+PL_IsQueueOnCurrentThread ; 25382
+?GetInterfaceInfo@nsProxyEventObject@@UAGIPAPAVnsIInterfaceInfo@@@Z ; 25038
+?Equals@nsACString@@QBEHPBD@Z ; 24972
+?ReadSegments@nsPipeInputStream@nsPipe@@UAGIP6GIPAVnsIInputStream@@PAXPBDIIPAI@Z1I3@Z ; 24934
+?Cut@nsACString@@UAEXII@Z ; 24343
+?RemoveElement@nsSupportsArray@@UAGHPBVnsISupports@@I@Z ; 24174
+?RemoveElement@nsSupportsArray@@UAGIPAVnsISupports@@@Z ; 24174
+??0nsPromiseCSubstring@@QAE@ABVnsACString@@II@Z ; 23764
+?Mid@nsACString@@QBEIAAV1@II@Z ; 23764
+?AssignFromPromise@nsACString@@IAEXABV1@@Z ; 23764
+?ToNewUnicode@nsString@@QBEPAGXZ ; 23688
+?Last@nsACString@@QBEDXZ ; 22996
+?AssignWithConversion@nsCString@@QAEXABVnsAString@@@Z ; 22923
+?IsQueueOnCurrentThread@nsEventQueueImpl@@UAGIPAH@Z ; 22307
+?AppendWithConversion@nsString@@QAEXD@Z ; 22276
+?Compare1To2@@YAHPBD0IH@Z ; 22272
+?GetIID@xptiInterfaceInfo@@UAGIPAPAUnsID@@@Z ; 21683
+?Find@nsString@@QBEHPBDHHH@Z ; 21620
+?AppendFromReadable@nsACString@@IAEXABV1@@Z ; 21546
+??0nsLocalCString@@QAE@PBDI@Z ; 21266
+??0nsAString@@QAE@XZ ; 20650
+?HashCode@nsProxyEventKey@@UBEIXZ ; 20409
+?QueryInterface@nsLocalFile@@UAGIABUnsID@@PAPAX@Z ; 19832
+?QueryElementAt@nsSupportsArray@@UAGIIABUnsID@@PAPAX@Z ; 19439
+?HashCode@nsStringKey@@UBEIXZ ; 19128
+??1nsStringKey@@UAE@XZ ; 18271
+??RnsCreateInstanceByContractID@@UBEIABUnsID@@PAPAX@Z ; 17842
+?GetTypelibGuts@xptiWorkingSet@@QAEPAVxptiTypelibGuts@@ABVxptiTypelib@@@Z ; 17499
+?GetInfoAtNoAddRef@xptiTypelibGuts@@QAEPAVxptiInterfaceInfo@@G@Z ; 17499
+?GetInfoForParam@xptiInterfaceInfo@@UAGIGPBVnsXPTParamInfo@@PAPAVnsIInterfaceInfo@@@Z ; 17441
+?GetIIDForParam@xptiInterfaceInfo@@UAGIGPBVnsXPTParamInfo@@PAPAUnsID@@@Z ; 17381
+?Find@nsString@@QBEHABV1@HHH@Z ; 17158
+?NS_NewAtom@@YAPAVnsIAtom@@PBG@Z ; 17124
+?Delete@nsStr@@SAXAAU1@II@Z ; 17080
+?QueryInterface@nsProxyEventObject@@UAGIABUnsID@@PAPAX@Z ; 17047
+?StripChars@nsStr@@SAXAAU1@PBD@Z ; 16392
+?StripChars@nsCString@@QAEXPBD@Z ; 16392
+?Equals@nsVoidKey@@UBEHPBVnsHashKey@@@Z ; 15797
+?StripChar@nsString@@QAEXGH@Z ; 15611
+?do_AppendFromElementPtrLength@nsACString@@MAEXPBDI@Z ; 15433
+?NS_NewAtom@@YAPAVnsIAtom@@PBD@Z ; 14915
+?strcasecmp@nsCRT@@SAHPBG0@Z ; 14605
+?GetNewOrUsedClass@nsProxyEventClass@@SAPAV1@ABUnsID@@@Z ; 14587
+?do_GetService@@YA?BVnsGetServiceByCID@@ABUnsID@@PAI@Z ; 14568
+??0nsProxyEventObject@@QAE@PAVnsIEventQueue@@HPAVnsISupports@@PAVnsProxyEventClass@@PAV0@@Z ; 14476
+??0nsProxyObject@@QAE@PAVnsIEventQueue@@HPAVnsISupports@@@Z ; 14476
+??1nsProxyEventObject@@UAE@XZ ; 14444
+??_EnsProxyObject@@UAEPAXI@Z ; 14444
+??_EnsProxyEventObject@@UAEPAXI@Z ; 14444
+??1nsProxyObject@@UAE@XZ ; 14444
+?ReleaseData@nsSimpleCharString@@IAEXXZ ; 14127
+??1?$nsSharedBufferHandle@G@@QAE@XZ ; 13784
+?CompressChars1@@YAHPADIPBD@Z ; 13776
+?CompressSet@nsCString@@QAEXPBDGHH@Z ; 13776
+?ReplaceChar@nsCString@@QAEXPBDG@Z ; 13776
+??0NS_ConvertUCS2toUTF8@@QAE@ABVnsAString@@@Z ; 13501
+??0nsCString@@QAE@ABVnsACString@@@Z ; 13490
+?Compact@nsVoidArray@@QAEXXZ ; 13069
+?ResolveAndStat@nsLocalFile@@AAEIH@Z ; 13042
+?Trim@nsCString@@QAEXPBDHHH@Z ; 12473
+?ToCString@nsString@@QBEPADPADII@Z ; 12467
+?Copy@nsXPIDLCString@@SAPADPBD@Z ; 12345
+?StripChars1@@YAHPADIPBD@Z ; 12243
+PL_ProcessPendingEvents ; 11979
+?copy_string@@YAAAV?$LossyConvertEncoding@GD@@AAV?$nsReadingIterator@G@@ABV2@AAV1@@Z ; 11800
+?ToNewCString@@YAPADABVnsAString@@@Z ; 11800
+?ToNewUTF8String@@YAPADABVnsAString@@@Z ; 11776
+?Release@nsProxyObjectManager@@UAGKXZ ; 11736
+??1nsCommonString@@UAE@XZ ; 11669
+?UnlinkBuffer@nsSharedBufferList@@QAEPAVBuffer@1@PAV21@@Z ; 11567
+?FindItem@nsAVLTree@@QBEPAXPAX@Z ; 11472
+?ReallocData@nsSimpleCharString@@IAEXI@Z ; 11366
+?ShiftCharsLeft@@YAXPADIII@Z ; 11222
+?GetYoungest@nsEventQueueImpl@@UAGIPAPAVnsIEventQueue@@@Z ; 10964
+?SetFollowLinks@nsLocalFile@@UAGIH@Z ; 10936
+?GetYoungestEventQueue@nsEventQueueServiceImpl@@AAEIPAVnsIEventQueue@@PAPAV2@@Z ; 10928
+?GetThreadEventQueue@nsEventQueueServiceImpl@@UAGIPAUPRThread@@PAPAVnsIEventQueue@@@Z ; 10925
+??0nsSharedBufferList@@QAE@PAVBuffer@0@@Z ; 10649
+?init_range_from_buffer_list@nsSlidingSubstring@@AAEXXZ ; 10649
+?DestroyBuffers@nsSharedBufferList@@IAEXXZ ; 10647
+??_EnsSlidingSharedBufferList@@UAEPAXI@Z ; 10647
+??1nsSharedBufferList@@UAE@XZ ; 10647
+??RnsCreateInstanceByCID@@UBEIABUnsID@@PAPAX@Z ; 10636
+?Put@nsSupportsHashtable@@QAEHPAVnsHashKey@@PAVnsISupports@@PAPAV3@@Z ; 10605
+?ToLowerCase@nsString@@QBEXAAV1@@Z ; 10514
+?GetPath@nsLocalFile@@UAGIPAPAD@Z ; 10449
+??0nsStringKey@@QAE@PBGHW4Ownership@0@@Z ; 10430
+?AddRef@nsPipeInputStream@nsPipe@@UAGKXZ ; 10377
+?Release@nsPipeInputStream@nsPipe@@UAGKXZ ; 10375
+?Rebind@nsSlidingSubstring@@QAEXABVnsAString@@@Z ; 10240
+?PeekFront@nsDeque@@QAEPAXXZ ; 10192
+??2AtomImpl@@SAPAXIABVnsAString@@@Z ; 10144
+??0AtomImpl@@QAE@XZ ; 10144
+?ResolveEventQueue@nsEventQueueServiceImpl@@UAGIPAVnsIEventQueue@@PAPAV2@@Z ; 10065
+?ToNewUTF8String@nsString@@QBEPADXZ ; 10047
+PL_DHashTableEnumerate ; 9813
+?AddBucket@nsFixedSizeAllocator@@IAEII@Z ; 9776
+?AppendWithConversion@nsCString@@QAEXABVnsString@@H@Z ; 9758
+?Right@nsACString@@QBEIAAV1@I@Z ; 9591
+?Lookup@nsStaticCaseInsensitiveNameTable@@QAEHABVnsCString@@@Z ; 9227
+?Enumerate@nsHashtable@@QAEXP6AHPAVnsHashKey@@PAX1@Z1@Z ; 9133
+?GetParent@xptiInterfaceInfo@@UAGIPAPAVnsIInterfaceInfo@@@Z ; 9105
+_md_EventReceiverProc@16 ; 9061
+?InitWithPath@nsLocalFile@@UAGIPBD@Z ; 8986
+??0nsLocalFile@@QAE@XZ ; 8981
+??_EnsLocalFile@@UAEPAXI@Z ; 8977
+??1nsLocalFile@@UAE@XZ ; 8977
+NS_NewLocalFile ; 8952
+?GetWriteSegment@nsPipe@@QAEIPAPADPAI@Z ; 8809
+?GetProxyForObject@nsProxyObjectManager@@UAGIPAVnsIEventQueue@@ABUnsID@@PAVnsISupports@@HPAPAX@Z ; 8762
+?GetNewOrUsedProxy@nsProxyEventObject@@SAPAV1@PAVnsIEventQueue@@HPAVnsISupports@@ABUnsID@@@Z ; 8762
+?Equals@nsProxyEventKey@@UBEHPBVnsHashKey@@@Z ; 8745
+?AddRef@nsPipeOutputStream@nsPipe@@UAGKXZ ; 8650
+?Release@nsPipeOutputStream@nsPipe@@UAGKXZ ; 8649
+?Read@nsPipeInputStream@nsPipe@@UAGIPADIPAI@Z ; 8617
+??4nsXPIDLCString@@QAEAAV0@PBD@Z ; 8570
+??1nsSimpleCharString@@QAE@XZ ; 8555
+?Equals@nsStringKey@@UBEHPBVnsHashKey@@@Z ; 8497
+?AddRefData@nsSimpleCharString@@IAEXXZ ; 8367
+?Init@nsFixedSizeAllocator@@QAEIPBDPBIHHH@Z ; 7954
+??0nsStringKey@@QAE@ABVnsAString@@@Z ; 7944
+?Release@nsArrayEnumerator@@UAGKXZ ; 7923
+?PostCompleted@nsProxyObjectCallInfo@@QAEXXZ ; 7863
+?SetCompleted@nsProxyObjectCallInfo@@QAEXXZ ; 7863
+??0nsCString@@QAE@ABV0@@Z ; 7622
+?AppendNewSegment@nsSegmentedBuffer@@QAEPADXZ ; 7622
+??_GAtomImpl@@UAEPAXI@Z ; 7566
+??1AtomImpl@@UAE@XZ ; 7566
+??0nsCString@@QAE@PBD@Z ; 7541
+??0nsAutoString@@QAE@ABVCBufDescriptor@@@Z ; 7529
+??0NS_ConvertASCIItoUCS2@@QAE@PBDI@Z ; 7452
+??0nsString@@QAE@ABVnsAString@@@Z ; 7419
+??0CBufDescriptor@@QAE@PAGHIH@Z ; 7406
+??0nsCreateInstanceByContractID@@QAE@PBDPAVnsISupports@@PAI@Z ; 7402
+?EnumerateForwards@nsVoidArray@@QAEHP6AHPAX0@Z0@Z ; 7195
+?AppendInt@nsCString@@QAEXHH@Z ; 7047
+??RnsGetWeakReference@@UBEIABUnsID@@PAPAX@Z ; 7028
+?NS_GetWeakReference@@YAPAVnsIWeakReference@@PAVnsISupports@@PAI@Z ; 7022
+?Clone@nsLocalFile@@UAGIPAPAVnsIFile@@@Z ; 6960
+?AppendRelativePath@nsLocalFile@@UAGIPBD@Z ; 6927
+?Empty@nsSegmentedBuffer@@QAEXXZ ; 6878
+??_EnsIDKey@@UAEPAXI@Z ; 6876
+?Append@nsLocalFile@@UAGIPBD@Z ; 6818
+?RFindChar@nsStr@@SAHABU1@GHHH@Z ; 6753
+?RFindChar@nsString@@QBEHGHHH@Z ; 6753
+?GetWeakReference@nsSupportsWeakReference@@UAGIPAPAVnsIWeakReference@@@Z ; 6751
+?Release@nsMemoryImpl@@UAGKXZ ; 6468
+??1nsSupportsWeakReference@@UAE@XZ ; 6428
+?SetNonBlocking@nsPipeInputStream@nsPipe@@UAGIH@Z ; 6306
+PL_DHashTableRawRemove ; 6270
+?GetNext@nsArrayEnumerator@@UAGIPAPAVnsISupports@@@Z ; 6180
+?ReleaseService@nsServiceManagerImpl@@UAGIABUnsID@@PAVnsISupports@@PAVnsIShutdownListener@@@Z ; 6156
+?RFindSubstr@nsStr@@SAHABU1@0HHH@Z ; 6056
+?RFind@nsCString@@QBEHPBDHHH@Z ; 6052
+?HasMoreElements@nsDirEnumerator@@UAGIPAH@Z ; 5962
+?QueryInterface@nsProxyObjectManager@@UAGIABUnsID@@PAPAX@Z ; 5920
+?GetReadableFragment@nsSlidingString@@MBEPBGAAU?$nsReadableFragment@G@@W4nsFragmentRequest@@I@Z ; 5909
+?ShiftDoubleCharsLeft@@YAXPADIII@Z ; 5858
+?Clone@nsProxyEventKey@@UBEPAVnsHashKey@@XZ ; 5832
+?IsManagerShutdown@nsProxyObjectManager@@SAHXZ ; 5823
+?ReleaseService@nsServiceManager@@SAIABUnsID@@PAVnsISupports@@PAVnsIShutdownListener@@@Z ; 5681
+??4nsSimpleCharString@@QAEXABV0@@Z ; 5572
+?Copy@nsXPIDLString@@SAPAGPBG@Z ; 5526
+??0nsString@@QAE@PBG@Z ; 5504
+?Find@nsProxyEventObject@@QAEPAV1@ABUnsID@@@Z ; 5501
+?WriteSegments@nsPipeOutputStream@nsPipe@@UAGIP6GIPAVnsIOutputStream@@PAXPADIIPAI@Z1I3@Z ; 5497
+?Read@StringUnicharInputStream@@UAGIPAGIIPAI@Z ; 5482
+?WriteFrom@nsPipeOutputStream@nsPipe@@UAGIPAVnsIInputStream@@IPAI@Z ; 5388
+?ToNewCString@nsString@@QBEPADXZ ; 5351
+?Release@nsInputStreamTee@@UAGKXZ ; 5341
+?IndexOf@nsSupportsArray@@UAGHPBVnsISupports@@@Z ; 5281
+?IndexOfStartingAt@nsSupportsArray@@UAGHPBVnsISupports@@I@Z ; 5281
+??6nsOutputStream@@QAEAAV0@PBD@Z ; 5112
+?ToInteger@nsCString@@QBEHPAHI@Z ; 5109
+?do_AssignFromElementPtrLength@nsACString@@MAEXPBDI@Z ; 5103
+?Exists@nsLocalFile@@UAGIPAH@Z ; 5085
+?PL_HashTableInit@@YA?AW4PRStatus@@PAUPLHashTable@@IP6AIPBX@ZP6AH11@Z3PBUPLHashAllocOps@@PAX@Z ; 4964
+??0nsHashtable@@QAE@IH@Z ; 4964
+?Get@nsInt2StrHashtable@@QAEPADI@Z ; 4864
+??BnsSimpleCharString@@QAEPADXZ ; 4785
+?GetConstant@xptiInterfaceInfo@@UAGIGPAPBVnsXPTConstant@@@Z ; 4716
+?PL_HashTableFinalize@@YAXPAUPLHashTable@@@Z ; 4596
+??1nsHashtable@@UAE@XZ ; 4596
+?do_AssignFromElementPtrLength@nsAString@@MAEXPBGI@Z ; 4541
+?Error@nsFileSpec@@QBEIXZ ; 4535
+?GetSpecialEventQueue@nsEventQueueServiceImpl@@UAGIHPAPAVnsIEventQueue@@@Z ; 4454
+?GetStringProperty@nsPersistentProperties@@UAGIABVnsString@@AAV2@@Z ; 4441
+?DumpStatistics@nsTraceRefcnt@@SAIW4StatisticsType@1@PAU_iobuf@@@Z ; 4434
+?GetBufferHandle@nsPrivateSharableString@@UBEPBV?$nsBufferHandle@G@@XZ ; 4434
+?Release@xptiInterfaceInfoManager@@UAGKXZ ; 4417
+?Clone@nsCStringKey@@UBEPAVnsHashKey@@XZ ; 4332
+?normalize_backward@?$nsWritingIterator@D@@QAEXXZ ; 4288
+??1nsFileSpec@@UAE@XZ ; 4256
+?AddRef@BasicStringImpl@@UAGKXZ ; 4185
+??_EnsCStringKey@@UAEPAXI@Z ; 4173
+?ToCString@nsCString@@QBEPADPADII@Z ; 4056
+?First@nsDequeIterator@@QAEAAV1@XZ ; 4049
+??_EnsSubsumeStr@@UAEPAXI@Z ; 4048
+?InsertStringAt@nsStringArray@@QAEHABVnsAString@@H@Z ; 4026
+?Release@BasicStringImpl@@UAGKXZ ; 3967
+?ReleaseValues@nsProperties@@SAHPAVnsHashKey@@PAX1@Z ; 3966
+?StripChars2@@YAHPADIPBD@Z ; 3927
+?ToFloat@nsString@@QBEMPAH@Z ; 3910
+?Release@nsThreadPool@@UAGKXZ ; 3896
+??0nsPromiseFlatCString@@IAE@ABVnsACString@@@Z ; 3888
+??1nsPromiseFlatCString@@UAE@XZ ; 3878
+?Clone@nsStringKey@@UBEPAVnsHashKey@@XZ ; 3824
+?RFindChar2@@YAHPBDIHGHH@Z ; 3738
+??_EnsStringKey@@UAEPAXI@Z ; 3721
+?Alloc@ArenaImpl@@UAGPAXI@Z ; 3688
+?DeleteFirstSegment@nsSegmentedBuffer@@QAEHXZ ; 3646
+?OpenANSIFileDesc@nsLocalFile@@UAGIPBDPAPAU_iobuf@@@Z ; 3547
+?EqualsWithConversion@nsCString@@QBEHPBDHH@Z ; 3544
+?EqualsIgnoreCase@nsCString@@QBEHPBDH@Z ; 3544
+?ResolvePath@nsLocalFile@@AAEIPBDHPAPAD@Z ; 3539
+?CopyFrom@nsSimpleCharString@@QAEXPBDI@Z ; 3498
+?FindCharInReadable@@YAHGAAV?$nsReadingIterator@G@@ABV1@@Z ; 3480
+??0nsPromiseSubstring@@QAE@ABV?$nsReadingIterator@G@@0@Z ; 3431
+?GetStringUTF8@nsRegistry@@UAGIIPBDPAPAD@Z ; 3345
+??0nsSegmentedBuffer@@QAE@XZ ; 3334
+??1nsSegmentedBuffer@@QAE@XZ ; 3333
+?GetInfoForName@xptiInterfaceInfoManager@@UAGIPBDPAPAVnsIInterfaceInfo@@@Z ; 3332
+?Init@nsSegmentedBuffer@@QAEIIIPAVnsIMemory@@@Z ; 3307
+?HasInterfaceRecord@xptiInterfaceInfo@@QBEHXZ ; 3300
+?Compare@@YAHABVnsACString@@0@Z ; 3236
+?vsmprintf@nsTextFormatter@@SAPAGPBGPAD@Z ; 3228
+?smprintf@nsTextFormatter@@SAPAGPBGZZ ; 3228
+?QueryInterface@nsMemoryImpl@@UAGIABUnsID@@PAPAX@Z ; 3156
+??0nsPipe@@QAE@XZ ; 3153
+?Close@nsPipeOutputStream@nsPipe@@UAGIXZ ; 3153
+?SetObserver@nsPipeInputStream@nsPipe@@UAGIPAVnsIInputStreamObserver@@@Z ; 3153
+?Initialize@nsPipe@@UAGIIIHHPAVnsIMemory@@@Z ; 3153
+?NS_NewPipe@@YAIPAPAVnsIInputStream@@PAPAVnsIOutputStream@@IIHHPAVnsIMemory@@@Z ; 3153
+?Close@nsPipeInputStream@nsPipe@@UAGIXZ ; 3152
+??1nsPipe@@UAE@XZ ; 3152
+??_GnsPipe@@UAEPAXI@Z ; 3152
+?GetLeafName@nsLocalFile@@UAGIPAPAD@Z ; 3138
+?Parse@nsID@@QAEHPBD@Z ; 3088
+?GetLeaf@nsSimpleCharString@@QBEPADD@Z ; 3070
+?GetLeafName@nsFileSpec@@QBEPADXZ ; 3070
+?Flush@nsPipeOutputStream@nsPipe@@UAGIXZ ; 3043
+?CheckForDeactivation@nsEventQueueImpl@@AAEXXZ ; 3018
+?RFindChar1@@YAHPBDIHGHH@Z ; 3015
+??0nsCAutoString@@QAE@ABVnsACString@@@Z ; 3014
+?GetNext@nsDirEnumerator@@UAGIPAPAVnsISupports@@@Z ; 2976
+?ProcessPendingEvents@nsEventQueueImpl@@UAGIXZ ; 2951
+?GetInterfaceInfoManagerNoAddRef@xptiInterfaceInfoManager@@SAPAV1@XZ ; 2948
+?CountChar@nsAString@@QBEIG@Z ; 2937
+?AppendInt@nsString@@QAEXHH@Z ; 2922
+?ToUpperCase@nsString@@QAEXXZ ; 2900
+nsUnescapeCount ; 2828
+nsUnescape ; 2828
+??0nsSimpleCharString@@QAE@ABV0@@Z ; 2795
+??4nsFileSpec@@QAEXABV0@@Z ; 2739
+??0nsFileSpec@@QAE@ABV0@@Z ; 2731
+?StripWhitespace@nsString@@QAEXXZ ; 2714
+XPTI_GetInterfaceInfoManager ; 2696
+?StringAt@nsStringArray@@QBEPAVnsString@@H@Z ; 2681
+??0nsArrayEnumerator@@QAE@PAVnsISupportsArray@@@Z ; 2637
+??1nsArrayEnumerator@@UAE@XZ ; 2637
+?GetPRThread@nsThread@@UAGIPAPAUPRThread@@@Z ; 2623
+?GetMainThread@nsIThread@@SAIPAPAV1@@Z ; 2622
+NS_NewArrayEnumerator ; 2582
+??_EnsArrayEnumerator@@UAEPAXI@Z ; 2582
+?CallQueryInterfaceOnProxy@nsProxyEventClass@@AAEIPAVnsProxyEventObject@@ABUnsID@@PAPAV2@@Z ; 2571
+?GetQueue@nsProxyEventObject@@QBEPAVnsIEventQueue@@XZ ; 2571
+?DelegatedQueryInterface@nsProxyEventClass@@UAGIPAVnsProxyEventObject@@ABUnsID@@PAPAX@Z ; 2571
+?GetRealObject@nsProxyEventObject@@QBEPAVnsISupports@@XZ ; 2571
+??_EnsWeakReference@@EAEPAXI@Z ; 2556
+?ReadSegments@ConstCharImpl@@MAGIP6GIPAVnsIInputStream@@PAXPBDIIPAI@Z1I3@Z ; 2520
+?IsDone@nsRegSubtreeEnumerator@@UAGIXZ ; 2490
+?Next@nsRegSubtreeEnumerator@@UAGIXZ ; 2490
+?advance@nsRegSubtreeEnumerator@@MAGIXZ ; 2451
+?GetErrorStringBundleKey@nsErrorService@@UAGIIPAPAD@Z ; 2432
+?GetErrorStringBundle@nsErrorService@@UAGIFPAPAD@Z ; 2432
+?GetIndexOf@nsSupportsArray@@UAGIPAVnsISupports@@PAH@Z ; 2409
+?ToNewUnicode@nsCString@@QBEPAGXZ ; 2376
+?ToNewCString@@YAPADABVnsACString@@@Z ; 2364
+?copy_string@@YAAAPADAAV?$nsReadingIterator@D@@ABV1@AAPAD@Z ; 2364
+?WriteSegmentFun@nsInputStreamTee@@CGIPAVnsIInputStream@@PAXPBDIIPAI@Z ; 2346
+?CurrentItemInPlaceUTF8@nsRegSubtreeEnumerator@@UAGIPAIPAPBD@Z ; 2320
+PL_DHashAllocTable ; 2253
+?Release@nsFileSpecImpl@@UAGKXZ ; 2241
+?GetSharedBufferHandle@nsCommonCString@@MBEPBV?$nsSharedBufferHandle@D@@XZ ; 2217
+?assign@nsCommonString@@IAEXABVnsAString@@@Z ; 2217
+?ReleaseReference@?$nsSharedBufferHandle@G@@QBEXXZ ; 2217
+?NS_AllocateContiguousHandleWithData@@YAPAV?$nsSharedBufferHandle@G@@PBV1@ABVnsAString@@I@Z ; 2217
+?QueryInterface@nsFileSpecImpl@@UAGIABUnsID@@PAPAX@Z ; 2172
+?GetRequest@nsThreadPool@@QAEPAVnsIRunnable@@PAVnsIThread@@@Z ; 2147
+PL_DHashFreeTable ; 2125
+?Clear@nsCStringArray@@QAEXXZ ; 2122
+?ReadSegments@nsInputStreamTee@@UAGIP6GIPAVnsIInputStream@@PAXPBDIIPAI@Z1I3@Z ; 2115
+?TeeSegment@nsInputStreamTee@@AAEIPBDI@Z ; 2045
+?DispatchRequest@nsThreadPool@@UAGIPAVnsIRunnable@@@Z ; 2038
+??1nsThreadPoolBusyBody@@QAE@XZ ; 2038
+??0nsThreadPoolBusyBody@@QAE@PAVnsThreadPool@@@Z ; 2038
+??0nsCreateInstanceByCID@@QAE@ABUnsID@@PAVnsISupports@@PAI@Z ; 2029
+?ReplaceChar@nsCString@@QAEXGG@Z ; 2022
+?CloseStream@nsFileSpecImpl@@UAGIXZ ; 1968
+?do_InsertFromReadable@nsACString@@MAEXABV1@I@Z ; 1965
+?do_InsertFromElement@nsACString@@MAEXDI@Z ; 1965
+??_EnsFileSpecImpl@@UAEPAXI@Z ; 1955
+??1nsFileSpecImpl@@UAE@XZ ; 1955
+??0nsSimpleCharString@@QAE@PBD@Z ; 1936
+?RFindCharInSet@nsCString@@QBEHPBDH@Z ; 1913
+?RFindCharInSet@nsStr@@SAHABU1@0HH@Z ; 1913
+?Release@ByteBufferImpl@@UAGKXZ ; 1905
+?SkipWhiteSpace@nsPersistentProperties@@QAEHH@Z ; 1898
+?First@nsACString@@QBEDXZ ; 1881
+??0nsVoidArray@@QAE@H@Z ; 1876
+?copy_string_backward@@YAAAV?$nsWritingIterator@D@@ABV?$nsReadingIterator@D@@AAV2@AAV1@@Z ; 1834
+?QueryInterface@nsPipeInputStream@nsPipe@@UAGIABUnsID@@PAPAX@Z ; 1782
+?QueryInterface@nsPipe@@UAGIABUnsID@@PAPAX@Z ; 1782
+?CountCharInReadable@@YAIABVnsAString@@G@Z ; 1767
+?IsDirectory@nsLocalFile@@UAGIPAH@Z ; 1765
+?GetFileSpec@nsFileSpecImpl@@UAGIPAVnsFileSpec@@@Z ; 1765
+?CopyUnicodeTo@@YAPAGABVnsAString@@IPAGI@Z ; 1749
+NS_QuickSort ; 1729
+??1nsStringArray@@UAE@XZ ; 1709
+??0nsStringArray@@QAE@XZ ; 1709
+?IsScriptable@xptiInterfaceInfo@@UAGIPAH@Z ; 1690
+?Find@nsCString@@QBEHPBGHHH@Z ; 1674
+?SetLeafName@nsFileSpec@@QAEXPBD@Z ; 1670
+?LeafReplace@nsSimpleCharString@@QAEXDPBD@Z ; 1670
+?NextLine@ManifestLineReader@@QAEHXZ ; 1658
+??0nsFileSpec@@QAE@XZ ; 1656
+PL_DHashTableInit ; 1622
+??4nsSimpleCharString@@QAEXPBD@Z ; 1598
+?GetInterfaceIsArgNumberForParam@xptiInterfaceInfo@@UAGIGPBVnsXPTParamInfo@@PAE@Z ; 1555
+?Init@nsInputStreamTee@@UAGIPAVnsIInputStream@@PAVnsIOutputStream@@@Z ; 1550
+?QueryInterface@nsInputStreamTee@@UAGIABUnsID@@PAPAX@Z ; 1550
+?Right@nsAString@@QBEIAAV1@I@Z ; 1518
+PL_DHashTableFinish ; 1494
+??0nsFileSpecImpl@@QAE@ABVnsFileSpec@@@Z ; 1446
+?MakeInterface@nsFileSpecImpl@@SAIABVnsFileSpec@@PAPAVnsIFileSpec@@@Z ; 1446
+?NS_NewFileSpecWithSpec@@YAIABVnsFileSpec@@PAPAVnsIFileSpec@@@Z ; 1437
+??0xptiInterfaceInfo@@QAE@PBDABUnsID@@ABVxptiTypelib@@PAVxptiWorkingSet@@@Z ; 1434
+?CopyName@xptiInterfaceInfo@@AAEXPBDPAVxptiWorkingSet@@@Z ; 1434
+?SetScriptableFlag@xptiInterfaceInfo@@QAEXH@Z ; 1434
+??1xptiInterfaceInfo@@UAE@XZ ; 1427
+??_GxptiInterfaceInfo@@UAEPAXI@Z ; 1427
+??1nsSupportsHashtable@@UAE@XZ ; 1406
+??0nsACString@@QAE@XZ ; 1361
+?Exists@nsHashtable@@QAEHPAVnsHashKey@@@Z ; 1348
+?SetData@nsSupportsVoidImpl@@UAGIPAX@Z ; 1337
+??0BasicStringImpl@@QAE@XZ ; 1319
+?QueryInterface@BasicStringImpl@@UAGIABUnsID@@PAPAX@Z ; 1319
+??0ConstCharImpl@@QAE@PBDH@Z ; 1319
+?NewMonitor@nsAutoMonitor@@SAPAUPRMonitor@@PBD@Z ; 1312
+??1BasicStringImpl@@UAE@XZ ; 1309
+?DestroyMonitor@nsAutoMonitor@@SAXPAUPRMonitor@@@Z ; 1309
+??_EBasicStringImpl@@UAEPAXI@Z ; 1309
+?Enter@nsAutoCMonitor@@QAEXXZ ; 1307
+?Exit@nsAutoCMonitor@@QAEXXZ ; 1307
+?StringAllocator_wchar_t@@YAAAV?$nsStringAllocator@G@@XZ ; 1306
+?get_allocator@?$nsSharedBufferHandle@G@@IBEAAV?$nsStringAllocator@G@@XZ ; 1306
+?Deallocate@?$XPCOM_StringAllocator@G@@UBEXPAG@Z ; 1306
+NS_NewCharInputStream ; 1303
+?Release@nsRegSubtreeEnumerator@@UAGKXZ ; 1289
+??0nsDequeIterator@@QAE@ABVnsDeque@@H@Z ; 1284
+??FnsDequeIterator@@QAEPAXXZ ; 1284
+?End@nsDeque@@QBE?AVnsDequeIterator@@XZ ; 1284
+?OpenNSPRFileDesc@nsLocalFile@@UAGIHHPAPAUPRFileDesc@@@Z ; 1275
+?StrInsert@nsStr@@SAXAAU1@IABU1@IH@Z ; 1266
+?InsertWithConversion@nsString@@QAEXPBDIH@Z ; 1266
+?ShiftDoubleCharsRight@@YAXPADIII@Z ; 1266
+??0nsSupportsVoidImpl@@QAE@XZ ; 1260
+??_GnsSupportsVoidImpl@@UAEPAXI@Z ; 1260
+??1nsSupportsVoidImpl@@UAE@XZ ; 1260
+?QueryInterface@nsSupportsVoidImpl@@UAGIABUnsID@@PAPAX@Z ; 1260
+?QueryInterface@ConverterInputStream@@UAGIABUnsID@@PAPAX@Z ; 1258
+?get_at_eof@nsRandomAccessInputStream@@MBEHXZ ; 1241
+?GetAtEOF@FileImpl@@UAGIPAH@Z ; 1241
+?get_at_eof@nsRandomAccessStoreClient@@MBEHXZ ; 1241
+?GetTargetArraySize@nsObserverListEnumerator@@ABEIXZ ; 1208
+??YnsSimpleCharString@@QAEXPBD@Z ; 1187
+??_EStringUnicharInputStream@@UAEPAXI@Z ; 1178
+??1StringUnicharInputStream@@UAE@XZ ; 1178
+??0StringUnicharInputStream@@QAE@PAVnsString@@@Z ; 1178
+?NS_NewStringUnicharInputStream@@YAIPAPAVnsIUnicharInputStream@@PAVnsString@@@Z ; 1178
+??0nsInputStreamTee@@QAE@XZ ; 1164
+??_GnsInputStreamTee@@UAEPAXI@Z ; 1164
+??1nsInputStreamTee@@UAE@XZ ; 1164
+?NS_NewInputStreamTee@@YAIPAPAVnsIInputStream@@PAV1@PAVnsIOutputStream@@@Z ; 1164
+?GetTypelibRecord@xptiInterfaceInfo@@QBEABVxptiTypelib@@XZ ; 1156
+?Write@nsStorageStream@@UAGIPBDIPAI@Z ; 1138
+?GetObserverList@nsObserverService@@EAGIPBGPAPAVnsIObserverList@@@Z ; 1119
+?HasMoreElements@nsArrayEnumerator@@UAGIPAH@Z ; 1100
+?GetCString@nsFileSpec@@QBEPBDXZ ; 1098
+PL_DHashVoidPtrKeyStub ; 1098
+?strtok@nsCRT@@SAPADPADPBDPAPAD@Z ; 1084
+?GetInfoForIID@xptiInterfaceInfoManager@@UAGIPBUnsID@@PAPAVnsIInterfaceInfo@@@Z ; 1081
+??_EnsSupportsArrayEnumerator@@UAEPAXI@Z ; 1065
+??0nsSupportsArrayEnumerator@@QAE@PAVnsISupportsArray@@@Z ; 1065
+??1nsSupportsArrayEnumerator@@UAE@XZ ; 1065
+?Enumerate@nsSupportsArray@@UAGIPAPAVnsIEnumerator@@@Z ; 1065
+?First@nsSupportsArrayEnumerator@@UAGIXZ ; 1065
+?WriteFully@nsBinaryOutputStream@@QAEIPBDI@Z ; 1055
+?CurrentItem@nsSupportsArrayEnumerator@@UAGIPAPAVnsISupports@@@Z ; 1053
+?GetConstantCount@xptiInterfaceInfo@@UAGIPAG@Z ; 1040
+?Clone@nsIDKey@@UBEPAVnsHashKey@@XZ ; 1035
+?SetStringProperty@nsPersistentProperties@@UAGIABVnsString@@AAV2@1@Z ; 1006
+?Next@nsSupportsArrayEnumerator@@UAGIXZ ; 993
+?Release@nsStorageInputStream@@UAGKXZ ; 981
+?GetMethodCount@xptiInterfaceInfo@@UAGIPAG@Z ; 970
+?QueryInterface@nsObserverService@@UAGIABUnsID@@PAPAX@Z ; 948
+?FindChar@nsAString@@QBEHGI@Z ; 941
+?LinkBuffer@nsSharedBufferList@@QAEXPAVBuffer@1@00@Z ; 920
+?IsIID@xptiInterfaceInfo@@UAGIPBUnsID@@PAH@Z ; 918
+?AppendBuffer@nsSlidingString@@QAEXPAG00@Z ; 900
+??1nsFilePath@@UAE@XZ ; 886
+?NativeToUnix@nsFileSpecHelpers@@YAXAAVnsSimpleCharString@@@Z ; 886
+?SetDeallocator@nsDeque@@QAEXPAVnsDequeFunctor@@@Z ; 885
+?IsASCII@@YAHABVnsAString@@@Z ; 875
+?SkipLine@nsPersistentProperties@@QAEHH@Z ; 862
+?EnumerateObserverList@nsObserverService@@UAGIPBGPAPAVnsIEnumerator@@@Z ; 855
+?EnumerateObserverList@nsObserverList@@UAGIPAPAVnsIEnumerator@@@Z ; 855
+??4nsPersistentFileDescriptor@@QAEXABVnsFileSpec@@@Z ; 849
+??1nsPersistentFileDescriptor@@UAE@XZ ; 849
+??0nsPersistentFileDescriptor@@QAE@ABVnsFileSpec@@@Z ; 849
+?GetData@nsPersistentFileDescriptor@@QBEXAAVnsSimpleCharString@@@Z ; 849
+?GetPersistentDescriptorString@nsFileSpecImpl@@UAGIPAPAD@Z ; 849
+?FindInReadable@@YAHABVnsAString@@AAV?$nsReadingIterator@G@@1@Z ; 819
+?nsCID_Destroy@@YAHPAVnsHashKey@@PAX1@Z ; 773
+?Read@nsInputStreamTee@@UAGIPADIPAI@Z ; 769
+??1nsFactoryEntry@@QAE@XZ ; 737
+?nsFactoryEntry_Destroy@@YAHPAVnsHashKey@@PAX1@Z ; 733
+??0nsFileSpecImpl@@QAE@XZ ; 726
+?NS_NewFileSpec@@YAIPAPAVnsIFileSpec@@@Z ; 726
+?Create@nsFileSpecImpl@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 726
+?UnixToNative@nsFileSpecHelpers@@YAXAAVnsSimpleCharString@@@Z ; 719
+?Invalidate@xptiInterfaceInfo@@QAEXXZ ; 717
+?AppendWithConversion@nsCString@@QAEXPBGH@Z ; 697
+??0nsFactoryEntry@@QAE@ABUnsID@@PBD1PAVnsIComponentLoader@@@Z ; 695
+?SetInfoAt@xptiTypelibGuts@@QAEIGPAVxptiInterfaceInfo@@@Z ; 683
+PL_DHashGetKeyStub ; 678
+PL_DHashMoveEntryStub ; 678
+?GrowCapacity@nsDeque@@AAEAAV1@XZ ; 673
+?AssignWithConversion@nsString@@QAEXPBDH@Z ; 665
+??4nsFilePath@@QAEXABVnsFileSpec@@@Z ; 659
+??0nsFilePath@@QAE@ABVnsFileSpec@@@Z ; 659
+?Canonify@nsFileSpecHelpers@@YAXAAVnsSimpleCharString@@H@Z ; 653
+?FromFileSpec@nsFileSpecImpl@@UAGIPBVnsIFileSpec@@@Z ; 652
+?GetValueType@nsRegistry@@UAGIIPBDPAI@Z ; 652
+?GetBytesUTF8@nsRegistry@@UAGIIPBDPAIPAPAE@Z ; 651
+?Write32@nsBinaryOutputStream@@UAGII@Z ; 649
+?EnumerateBackwards@nsSupportsArray@@UAGHP6AHPAVnsISupports@@PAX@Z1@Z ; 648
+?SetFromFileSpec@nsFileSpecImpl@@UAGIABVnsFileSpec@@@Z ; 634
+?smprintf_free@nsTextFormatter@@SAXPAG@Z ; 623
+?nsEndl@@YAAAVnsOutputStream@@AAV1@@Z ; 615
+?QueryInterface@nsGenericFactory@@UAGIABUnsID@@PAPAX@Z ; 606
+?Equals@nsAString@@QBEHPBG@Z ; 599
+?strcasecmp@nsCRT@@SAHPBGPBD@Z ; 585
+?put@nsOutputStream@@QAEXD@Z ; 572
+?IsFile@nsLocalFile@@UAGIPAH@Z ; 570
+?ForEach@nsDeque@@QBEXAAVnsDequeFunctor@@@Z ; 558
+?Release@EmptyEnumeratorImpl@@UAGKXZ ; 553
+NS_NewEmptyEnumerator ; 553
+?HasMoreElements@EmptyEnumeratorImpl@@UAGIPAH@Z ; 552
+?AddRef@FileImpl@@UAGKXZ ; 549
+?Release@FileImpl@@UAGKXZ ; 542
+?snprintf@nsTextFormatter@@SAIPAGIPBGZZ ; 534
+?vsnprintf@nsTextFormatter@@SAIPAGIPBGPAD@Z ; 534
+?Available@nsPipeInputStream@nsPipe@@UAGIPAI@Z ; 533
+?PushFront@nsDeque@@QAEAAV1@PAX@Z ; 522
+?AddItem@nsAVLTree@@QAE?AW4eAVLStatus@@PAX@Z ; 518
+??0nsAutoString@@QAE@PBGH@Z ; 509
+?IsDone@nsObserverListEnumerator@@UAGIXZ ; 479
+?MoveToIndex@nsObserverListEnumerator@@AAEII@Z ; 479
+?ReleaseService@nsServiceManager@@SAIPBDPAVnsISupports@@PAVnsIShutdownListener@@@Z ; 477
+?ReleaseService@nsServiceManagerImpl@@UAGIPBDPAVnsISupports@@PAVnsIShutdownListener@@@Z ; 477
+?AppendWithConversion@nsCString@@QAEXABVnsAString@@@Z ; 467
+?CreateDll@nsNativeComponentLoader@@AAEIPAVnsIFile@@PBDPA_J2PAPAVnsDll@@@Z ; 466
+?Flush@FileImpl@@UAGIXZ ; 455
+??1nsNSPRPath@@UAE@XZ ; 444
+??BnsNSPRPath@@QBEPBDXZ ; 444
+??0nsByteArrayInputStream@@QAE@PADI@Z ; 443
+??_EnsByteArrayInputStream@@UAEPAXI@Z ; 443
+??1nsByteArrayInputStream@@UAE@XZ ; 443
+?QueryInterface@nsByteArrayInputStream@@UAGIABUnsID@@PAPAX@Z ; 443
+?NS_NewByteArrayInputStream@@YAIPAPAVnsIByteArrayInputStream@@PADK@Z ; 443
+PL_DHashMatchEntryStub ; 442
+?ScriptableFlagIsValid@xptiInterfaceInfo@@ABEHXZ ; 439
+?PartiallyResolveLocked@xptiInterfaceInfo@@QAEHPAUXPTInterfaceDescriptor@@PAVxptiWorkingSet@@@Z ; 439
+??1xptiInterfaceGuts@@QAE@XZ ; 439
+?QueryInterface@FileImpl@@UAGIABUnsID@@PAPAX@Z ; 433
+??1xptiFile@@QAE@XZ ; 424
+?QueryInterface@nsSupportsStringImpl@@UAGIABUnsID@@PAPAX@Z ; 422
+?ReplaceChar@nsString@@QAEXGG@Z ; 421
+?Notify@nsObserverService@@UAGIPAVnsISupports@@PBG1@Z ; 416
+??0nsSlidingString@@QAE@PAG00@Z ; 408
+?NewWrappingBuffer@nsSharedBufferList@@SAPAVBuffer@1@PAG00@Z ; 408
+??0nsSlidingSubstring@@IAE@PAVnsSlidingSharedBufferList@@@Z ; 408
+??0nsCStringArray@@QAE@XZ ; 394
+??1nsCStringArray@@UAE@XZ ; 393
+??EnsDirectoryIterator@@QAEAAV0@XZ ; 377
+?Reset@nsSupportsHashtable@@QAEXXZ ; 370
+?ReadSegments@nsByteArrayInputStream@@UAGIP6GIPAVnsIInputStream@@PAXPBDIIPAI@Z1I3@Z ; 356
+?GetFileSize@nsLocalFile@@UAGIPA_J@Z ; 354
+?SetDataWithLength@nsSupportsStringImpl@@UAGIIPBD@Z ; 344
+??0nsSupportsStringImpl@@QAE@XZ ; 344
+??1nsSupportsStringImpl@@UAE@XZ ; 337
+??_EnsSupportsStringImpl@@UAEPAXI@Z ; 337
+?GetModule@nsDll@@QAEIPAVnsISupports@@PAPAVnsIModule@@@Z ; 331
+?Release@nsStorageStream@@UAGKXZ ; 328
+?Release@nsSupportsIDImpl@@UAGKXZ ; 327
+?CopyASCIItoUCS2@@YAXABVnsACString@@AAVnsAString@@@Z ; 327
+?copy_string@@YAAAV?$LossyConvertEncoding@DG@@AAV?$nsReadingIterator@D@@ABV2@AAV1@@Z ; 327
+??_EnsCString@@UAEPAXI@Z ; 324
+?StringAt@nsStringArray@@QBEXHAAVnsAString@@@Z ; 321
+?ToString@nsID@@QBEPADXZ ; 319
+?GetLength@UnicharBufferImpl@@UBGHXZ ; 316
+?Fill@ByteBufferImpl@@UAGHPAIPAVnsIInputStream@@I@Z ; 316
+?Fill@ConverterInputStream@@IAEHPAI@Z ; 316
+?copy_string_backward@@YAAAV?$nsWritingIterator@G@@ABV?$nsReadingIterator@G@@AAV2@AAV1@@Z ; 310
+?do_InsertFromReadable@nsAString@@MAEXABV1@I@Z ; 310
+??0nsFileSpec@@QAE@PBDH@Z ; 307
+?SetData@nsSupportsStringImpl@@UAGIPBD@Z ; 295
+?InsertCStringAt@nsCStringArray@@QAEHABVnsCString@@H@Z ; 288
+??YnsFileSpec@@QAEXPBD@Z ; 281
+?CompressWhitespace@nsCString@@QAEXHH@Z ; 278
+?GetFactory@nsNativeComponentLoader@@UAGIABUnsID@@PBD1PAPAVnsIFactory@@@Z ; 273
+?GetFactoryFromModule@nsNativeComponentLoader@@AAEIPAVnsDll@@ABUnsID@@PAPAVnsIFactory@@@Z ; 273
+?GetReadableFragment@nsPromiseConcatenation@@MBEPBGAAU?$nsReadableFragment@G@@W4nsFragmentRequest@@I@Z ; 268
+?Load@nsDll@@QAEHXZ ; 254
+?HasMoreElements@nsAdapterEnumerator@@UAGIPAH@Z ; 251
+?Next@nsObserverListEnumerator@@UAGIXZ ; 250
+??0nsSubsumeStr@@QAE@XZ ; 250
+?Subsume@nsSubsumeStr@@QAEHPAGHH@Z ; 250
+?CurrentItem@nsObserverListEnumerator@@UAGIPAPAVnsISupports@@@Z ; 250
+?Release@nsRegistryNode@@UAGKXZ ; 245
+?PrepareEncoder@nsFSStringConversion@@CAIXZ ; 241
+?UCSToNewFS@nsFSStringConversion@@SAIPBGPAPAD@Z ; 241
+?Write@nsBinaryOutputStream@@UAGIPBDIPAI@Z ; 238
+?IsDirectory@nsFileSpec@@QBEHXZ ; 236
+?QueryInterface@nsConjoiningEnumerator@@UAGIABUnsID@@PAPAX@Z ; 236
+_DllMain@12 ; 235
+??_GnsObserverListEnumerator@@UAEPAXI@Z ; 229
+?First@nsObserverListEnumerator@@UAGIXZ ; 229
+??0nsObserverListEnumerator@@QAE@PAVnsISupportsArray@@@Z ; 229
+?SetComponentInfo@nsGenericFactory@@UAGIPAUnsModuleComponentInfo@@@Z ; 228
+?NS_NewGenericFactory@@YAIPAPAVnsIGenericFactory@@PAUnsModuleComponentInfo@@@Z ; 228
+?Create@nsGenericFactory@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 228
+??0nsGenericFactory@@QAE@PAUnsModuleComponentInfo@@@Z ; 228
+?do_InsertFromElementPtrLength@nsAString@@MAEXPBGII@Z ; 227
+??1nsGenericFactory@@UAE@XZ ; 226
+?GetBufferSize@ByteBufferImpl@@UBGIXZ ; 226
+??_EnsGenericFactory@@UAEPAXI@Z ; 226
+??4nsFileSpec@@QAEXABVnsFilePath@@@Z ; 219
+?GetLastModifiedTime@nsLocalFile@@UAGIPA_J@Z ; 217
+?RFindInReadable@@YAHABVnsAString@@AAV?$nsReadingIterator@G@@1@Z ; 217
+?GetTarget@nsLocalFile@@UAGIPAPAD@Z ; 216
+?CopyFields@xptiFile@@AAEXABV1@@Z ; 212
+??0xptiFile@@QAE@XZ ; 212
+?ConvertStringLineBreaks@nsLinebreakConverter@@SAIAAVnsString@@W4ELinebreakType@1@1@Z ; 212
+??0xptiFile@@QAE@ABVnsInt64@@0PBDPAVxptiWorkingSet@@PAUXPTHeader@@@Z ; 212
+?QueryInterface@nsDirectoryService@@UAGIABUnsID@@PAPAX@Z ; 211
+?ReplaceSubstring@nsString@@QAEXABV1@0@Z ; 210
+?GetLongLong@nsRegistry@@UAGIIPBDPA_J@Z ; 210
+??0nsSimpleCharString@@QAE@ABVnsString@@@Z ; 209
+PL_DHashClearEntryStub ; 209
+??4nsSimpleCharString@@QAEXABVnsString@@@Z ; 209
+?Release@nsDirectoryService@@UAGKXZ ; 208
+?GetType@xptiFileType@@SA?AW4Type@1@PBD@Z ; 208
+?AutoRegisterComponent@nsNativeComponentLoader@@UAGIHPAVnsIFile@@PAH@Z ; 208
+?SetLeafName@nsFileSpecImpl@@UAGIPBD@Z ; 207
+?SetLeafName@nsFileSpec@@QAEXABVnsString@@@Z ; 203
+??0nsFilePath@@QAE@ABVnsString@@H@Z ; 203
+nsEscapeHTML ; 200
+?SetActivityIsLegal@nsTraceRefcnt@@SAXH@Z ; 198
+?GetProxy@nsCWeakReferent@@QAEPAVnsCWeakProxy@@XZ ; 196
+??0nsCWeakProxy@@QAE@PAXPAVnsCWeakReferent@@@Z ; 196
+??0nsCWeakReferent@@QAE@PAX@Z ; 196
+?ReleaseReference@nsCWeakProxy@@QAEXXZ ; 195
+??_EnsCWeakProxy@@UAEPAXI@Z ; 195
+??1nsCWeakProxy@@UAE@XZ ; 195
+??1nsCWeakReferent@@UAE@XZ ; 195
+nsEscape ; 178
+nsEscapeCount ; 178
+?GetIsOpen@FileImpl@@UAGIPAH@Z ; 177
+?Exists@nsFileSpec@@QBEHXZ ; 173
+?read@nsInputStream@@QAEHPAXH@Z ; 171
+?Read@FileImpl@@UAGIPADIPAI@Z ; 171
+??0nsAutoString@@QAE@G@Z ; 170
+?GetClassObject@nsGenericModule@@UAGIPAVnsIComponentManager@@ABUnsID@@1PAPAX@Z ; 169
+?Get@nsDirectoryService@@UAGIPBDABUnsID@@PAPAX@Z ; 165
+?Seek@nsStorageStream@@AAGIH@Z ; 164
+?SetLength@nsStorageStream@@UAGII@Z ; 164
+?Close@FileImpl@@UAGIXZ ; 163
+?WriteStringZ@nsBinaryOutputStream@@UAGIPBD@Z ; 163
+?AppendElements@nsSupportsArray@@UAGHPAVnsISupportsArray@@@Z ; 162
+?Write8@nsBinaryOutputStream@@UAGIE@Z ; 162
+?AddObserver@nsObserverService@@UAGIPAVnsIObserver@@PBG@Z ; 158
+?AddObserver@nsObserverList@@UAGIPAVnsIObserver@@@Z ; 158
+?read@ConstCharImpl@@MAEHPADI@Z ; 156
+?Read@BasicStringImpl@@UAGIPADIPAI@Z ; 156
+?GetGlobalMemoryService@nsMemory@@SAPAVnsIMemory@@XZ ; 155
+?GetData@nsSupportsStringImpl@@UAGIPAPAD@Z ; 153
+??0nsCAutoString@@QAE@PBDH@Z ; 152
+??0nsObjectHashtable@@QAE@P6APAXPAVnsHashKey@@PAX1@Z1P6AH011@Z1IH@Z ; 140
+??0ArenaImpl@@QAE@XZ ; 139
+?Init@ArenaImpl@@UAGII@Z ; 139
+?Create@ArenaImpl@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 139
+?NS_NewHeapArena@@YAIPAPAVnsIArena@@I@Z ; 139
+?QueryInterface@ArenaImpl@@UAGIABUnsID@@PAPAX@Z ; 139
+??1nsObjectHashtable@@UAE@XZ ; 138
+?Reset@nsObjectHashtable@@QAEXXZ ; 138
+?ResolveLocked@xptiInterfaceInfo@@AAEHPAVxptiWorkingSet@@@Z ; 129
+?GetNext@nsAdapterEnumerator@@UAGIPAPAVnsISupports@@@Z ; 129
+?GetCompleted@nsProxyObjectCallInfo@@QAEHXZ ; 124
+??0CBufDescriptor@@QAE@PBGHIH@Z ; 123
+??0nsServiceEntry@@QAE@ABUnsID@@PAVnsISupports@@@Z ; 122
+?NotifyListeners@nsServiceEntry@@QAEIXZ ; 122
+??1nsServiceEntry@@QAE@XZ ; 122
+?Resolve@xptiInterfaceInfo@@AAEHPAVxptiWorkingSet@@@Z ; 122
+??4nsFileSpec@@QAEXPBD@Z ; 121
+?QueryInterface@nsRegistryNode@@UAGIABUnsID@@PAPAX@Z ; 114
+?RegisterThreadSelf@nsThread@@QAEIXZ ; 114
+?FindSymbol@nsDll@@QAEPAXPBD@Z ; 114
+??_GnsRegistryNode@@UAEPAXI@Z ; 114
+??0nsThread@@QAE@XZ ; 114
+??0nsRegistryNode@@QAE@PAXPADJ@Z ; 114
+?CurrentItem@nsRegSubtreeEnumerator@@UAGIPAPAVnsISupports@@@Z ; 114
+??1nsRegistryNode@@UAE@XZ ; 114
+?Init@nsThread@@UAGIPAVnsIRunnable@@IW4PRThreadPriority@@W4PRThreadScope@@W4PRThreadState@@@Z ; 113
+?NS_NewThread@@YAIPAPAVnsIThread@@PAVnsIRunnable@@IW4PRThreadState@@W4PRThreadPriority@@W4PRThreadScope@@@Z ; 113
+?WaitUntilReadyToStartMain@nsThread@@QAEXXZ ; 113
+?Main@nsThread@@SAXPAX@Z ; 113
+??1ArenaImpl@@UAE@XZ ; 112
+??_GArenaImpl@@UAEPAXI@Z ; 112
+?GetKey@nsRegistryNode@@UAGIPAI@Z ; 112
+?Exit@nsThread@@SAXPAX@Z ; 111
+??1nsThread@@UAE@XZ ; 110
+?GetCurrent@nsIThread@@SAIPAPAV1@@Z ; 110
+??_GnsThread@@UAEPAXI@Z ; 110
+?WriteToLog@xptiInterfaceInfoManager@@SAXPBDZZ ; 110
+?GetIThread@nsIThread@@SAIPAUPRThread@@PAPAV1@@Z ; 110
+?Write@nsPipeOutputStream@nsPipe@@UAGIPBDIPAI@Z ; 109
+?AddThread@nsThreadPool@@IAEIXZ ; 109
+?Run@nsThreadPoolRunnable@@UAGIXZ ; 109
+??0nsThreadPoolRunnable@@QAE@PAVnsThreadPool@@@Z ; 109
+?DeleteLastElement@nsSupportsArray@@UAGIPAVnsISupports@@@Z ; 108
+??_GnsThreadPoolRunnable@@UAEPAXI@Z ; 108
+?RemoveLastElement@nsSupportsArray@@UAGHPBVnsISupports@@@Z ; 108
+?RemoveThread@nsThreadPool@@IAEIPAVnsIThread@@@Z ; 108
+??1nsThreadPoolRunnable@@UAE@XZ ; 108
+?GetNameUTF8@nsRegistryNode@@UAGIPAPAD@Z ; 108
+?RemoveObserver@nsObserverService@@UAGIPAVnsIObserver@@PBG@Z ; 106
+?RemoveObserver@nsObserverList@@UAGIPAVnsIObserver@@@Z ; 106
+?Contains@nsLocalFile@@UAGIPAVnsIFile@@HPAH@Z ; 104
+?RegistryLocationForSpec@nsComponentManagerImpl@@UAGIPAVnsIFile@@PAPAD@Z ; 104
+?Close@ConverterInputStream@@UAGIXZ ; 103
+??1nsDll@@QAE@XZ ; 103
+?Init@nsDll@@AAEXPAVnsIFile@@@Z ; 100
+??0nsDll@@QAE@PAVnsIFile@@PBDPA_J2@Z ; 100
+?SpecForRegistryLocation@nsComponentManagerImpl@@UAGIPBDPAPAVnsIFile@@@Z ; 100
+?UnescapeKey@nsRegistry@@UAGIPAEIPAIPAPAE@Z ; 99
+?GetRegistryDllInfo@nsNativeComponentLoader@@AAEIIPA_J0@Z ; 99
+NS_NewIOFileStream ; 98
+?Open@FileImpl@@UAGIABVnsFileSpec@@HH@Z ; 98
+??1FileImpl@@UAE@XZ ; 98
+??_GFileImpl@@UAEPAXI@Z ; 98
+??0FileImpl@@QAE@ABVnsFileSpec@@HH@Z ; 98
+?HasChanged@nsDll@@QAEHXZ ; 94
+?Read@nsByteArrayInputStream@@UAGIPADIPAI@Z ; 87
+PL_DHashGetStubOps ; 86
+??0nsStorageStream@@QAE@XZ ; 83
+?NS_NewStorageStream@@YAIIIPAPAVnsIStorageStream@@@Z ; 83
+??1nsStorageStream@@UAE@XZ ; 83
+?Init@nsStorageStream@@QAGIIIPAVnsIMemory@@@Z ; 83
+??_EnsStorageStream@@UAEPAXI@Z ; 83
+?GetOutputStream@nsStorageStream@@UAGIHPAPAVnsIOutputStream@@@Z ; 82
+?WriteBytes@nsBinaryOutputStream@@UAGIPBDI@Z ; 82
+??0nsBinaryOutputStream@@QAE@PAVnsIOutputStream@@@Z ; 81
+?Write16@nsBinaryOutputStream@@UAGIG@Z ; 81
+??1nsStorageInputStream@@UAE@XZ ; 81
+?Available@nsStorageInputStream@@UAGIPAI@Z ; 81
+?NewInputStream@nsStorageStream@@UAGIHPAPAVnsIInputStream@@@Z ; 81
+??_EnsStorageInputStream@@UAEPAXI@Z ; 81
+?WriteFloat@nsBinaryOutputStream@@UAGIM@Z ; 81
+?NS_NewBinaryOutputStream@@YAIPAPAVnsIBinaryOutputStream@@PAVnsIOutputStream@@@Z ; 81
+?Release@nsBinaryOutputStream@@UAGKXZ ; 81
+??_EnsBinaryOutputStream@@UAEPAXI@Z ; 81
+?Read@nsStorageInputStream@@UAGIPADIPAI@Z ; 81
+??0nsStorageInputStream@@QAE@PAVnsStorageStream@@I@Z ; 81
+??_EConverterInputStream@@UAEPAXI@Z ; 80
+??0ByteBufferImpl@@QAE@XZ ; 80
+?QueryInterface@nsSupportsPRInt32Impl@@UAGIABUnsID@@PAPAX@Z ; 80
+?NS_NewUnicharBuffer@@YAIPAPAVnsIUnicharBuffer@@PAVnsISupports@@I@Z ; 80
+?NS_NewB2UConverter@@YAIPAPAVnsIUnicodeDecoder@@PAVnsISupports@@PAVnsString@@@Z ; 80
+?QueryInterface@UnicharBufferImpl@@UAGIABUnsID@@PAPAX@Z ; 80
+??1ByteBufferImpl@@UAE@XZ ; 80
+?Init@UnicharBufferImpl@@UAGII@Z ; 80
+??0UnicharBufferImpl@@QAE@XZ ; 80
+?Create@UnicharBufferImpl@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 80
+?NS_NewByteBuffer@@YAIPAPAVnsIByteBuffer@@PAVnsISupports@@I@Z ; 80
+?Init@ByteBufferImpl@@UAGII@Z ; 80
+?QueryInterface@ByteBufferImpl@@UAGIABUnsID@@PAPAX@Z ; 80
+??0ConverterInputStream@@QAE@PAVnsIInputStream@@PAVnsIUnicodeDecoder@@I@Z ; 80
+??1UnicharBufferImpl@@UAE@XZ ; 80
+??_EUnicharBufferImpl@@UAEPAXI@Z ; 80
+?NS_NewConverterStream@@YAIPAPAVnsIUnicharInputStream@@PAVnsISupports@@PAVnsIInputStream@@HPAVnsString@@@Z ; 80
+??_EByteBufferImpl@@UAEPAXI@Z ; 80
+??1ConverterInputStream@@UAE@XZ ; 80
+?Create@ByteBufferImpl@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 80
+?is_open@nsFileClient@@QBEHXZ ; 79
+?GetData@nsSupportsPRBoolImpl@@UAGIPAH@Z ; 78
+??0nsSupportsPRInt32Impl@@QAE@XZ ; 77
+?SetNativePath@nsFileSpecImpl@@UAGIPBD@Z ; 74
+?InsertFromReadable@nsAString@@IAEXABV1@I@Z ; 74
+?ToString@nsSupportsStringImpl@@UAGIPAPAD@Z ; 74
+?IsDone@nsSupportsArrayEnumerator@@UAGIXZ ; 73
+?AllocateBuffers@FileImpl@@IAEIII@Z ; 71
+??1nsOutputStream@@UAE@XZ ; 71
+??_EnsSupportsPRInt32Impl@@UAEPAXI@Z ; 70
+??1nsOutputFileStream@@UAE@XZ ; 70
+?AssignFrom@nsOutputFileStream@@IAEXPAVnsISupports@@@Z ; 70
+??0nsRandomAccessOutputStream@@IAE@XZ ; 70
+??0nsOutputStream@@QAE@PAVnsIOutputStream@@@Z ; 70
+??1nsRandomAccessOutputStream@@UAE@XZ ; 70
+??1nsSupportsPRInt32Impl@@UAE@XZ ; 70
+??0nsDirectoryIterator@@QAE@ABVnsFileSpec@@H@Z ; 68
+??1nsDirectoryIterator@@UAE@XZ ; 68
+?Promises@nsPromiseCConcatenation@@UBEHABVnsACString@@@Z ; 67
+?Length@nsPromiseConcatenation@@UBEIXZ ; 67
+?AppendFromPromise@nsAString@@IAEXABV1@@Z ; 67
+?IndexOf@nsStringArray@@QBEHABVnsAString@@@Z ; 67
+??0nsOutputFileStream@@QAE@ABVnsFileSpec@@HH@Z ; 67
+?Available@nsInputStreamTee@@UAGIPAI@Z ; 66
+?HashContractID@nsComponentManagerImpl@@IAEIPBDABUnsID@@@Z ; 65
+??0nsSubsumeCStr@@QAE@PADHH@Z ; 65
+?close@nsInputStream@@QAEIXZ ; 65
+?HandleEvent@nsEventQueueImpl@@UAGIPAUPLEvent@@@Z ; 62
+?PostAndWait@nsProxyObject@@QAEIPAVnsProxyObjectCallInfo@@@Z ; 62
+?WaitForEvent@nsEventQueueImpl@@UAGIPAPAUPLEvent@@@Z ; 62
+?SetCallersQueue@nsProxyObjectCallInfo@@QAEXPAVnsIEventQueue@@@Z ; 62
+PL_PostSynchronousEvent ; 62
+?PostSynchronousEvent@nsEventQueueImpl@@UAGIPAUPLEvent@@PAPAX@Z ; 62
+PL_WaitForEvent ; 62
+?strcmp@nsCRT@@SAHPBGPBD@Z ; 60
+?ns_file_convert_result@@YAIH@Z ; 60
+?Load@nsLocalFile@@UAGIPAPAUPRLibrary@@@Z ; 54
+?hash_enumerator@@YAHPAVnsHashKey@@PAX1@Z ; 53
+?Shutdown@nsDll@@QAEIXZ ; 53
+??1nsAdapterEnumerator@@UAE@XZ ; 51
+?IsDone@nsHashtableEnumerator@@UAGIXZ ; 51
+?CurrentItem@nsHashtableEnumerator@@UAGIPAPAVnsISupports@@@Z ; 51
+?Next@nsHashtableEnumerator@@UAGIXZ ; 51
+??0nsAdapterEnumerator@@QAE@PAVnsIEnumerator@@@Z ; 51
+??HnsFileSpec@@QBE?AV0@PBD@Z ; 50
+?Read32@nsBinaryInputStream@@UAGIPAI@Z ; 50
+?Available@nsByteArrayInputStream@@UAGIPAI@Z ; 50
+?flush@nsOutputFileStream@@UAEIXZ ; 49
+?RegisterComponentCommon@nsComponentManagerImpl@@IAEIABUnsID@@PBD11HH1@Z ; 48
+??0nsString@@QAE@AAVnsSubsumeStr@@@Z ; 47
+??0nsSubsumeStr@@QAE@PAGHH@Z ; 47
+??0CBufDescriptor@@QAE@PBDHIH@Z ; 46
+?Initialize@nsGenericModule@@IAEIXZ ; 45
+??0nsGenericModule@@QAE@PBDIPAUnsModuleComponentInfo@@P6AXPAVnsIModule@@@Z@Z ; 45
+?CanUnload@nsGenericModule@@UAGIPAVnsIComponentManager@@PAH@Z ; 45
+?Shutdown@nsGenericModule@@IAEXXZ ; 45
+?NS_NewGenericModule@@YAIPBDIPAUnsModuleComponentInfo@@P6AXPAVnsIModule@@@ZPAPAV2@@Z ; 45
+?GetLoaderForType@nsComponentManagerImpl@@IAEIPBDPAPAVnsIComponentLoader@@@Z ; 45
+?QueryInterface@nsGenericModule@@UAGIABUnsID@@PAPAX@Z ; 45
+??_EnsGenericModule@@UAEPAXI@Z ; 45
+??1nsGenericModule@@UAE@XZ ; 45
+?OnRegister@nsNativeComponentLoader@@UAGIABUnsID@@PBD111HH@Z ; 44
+?GetLeafName@nsFileSpecImpl@@UAGIPAPAD@Z ; 44
+?QueryInterface@AtomImpl@@UAGIABUnsID@@PAPAX@Z ; 44
+?find_category@nsCategoryManager@@AAEPAVCategoryNode@@PBD@Z ; 44
+?RegistryNameForLib@nsComponentManagerImpl@@IAEIPBDPAPAD@Z ; 44
+?RegisterComponentLib@nsComponentManager@@SAIABUnsID@@PBD11HH@Z ; 44
+?RegisterComponentLib@nsComponentManagerImpl@@UAGIABUnsID@@PBD11HH@Z ; 44
+?RegisterFactory@nsComponentManagerImpl@@UAGIABUnsID@@PBD1PAVnsIFactory@@H@Z ; 42
+??0nsFactoryEntry@@QAE@ABUnsID@@PAVnsIFactory@@@Z ; 42
+?copy_string@@YAAAV?$ConvertToUpperCase@G@@AAV?$nsWritingIterator@G@@ABV2@AAV1@@Z ; 40
+?ResolveSymlink@nsFileSpec@@QAEIAAH@Z ; 40
+?ToUpperCase@@YAXAAVnsAString@@@Z ; 40
+?advance@nsRegValueEnumerator@@UAGIXZ ; 39
+?Release@nsPersistentProperties@@UAGKXZ ; 39
+?ToNewString@nsString@@QBEPAV1@XZ ; 38
+?IsValid@xptiWorkingSet@@QBEHXZ ; 38
+?GetComponentsDir@xptiInterfaceInfoManager@@QAEHPAPAVnsILocalFile@@@Z ; 37
+??1xptiTypelibGuts@@QAE@XZ ; 36
+??0xptiTypelibGuts@@QAE@PAUXPTHeader@@@Z ; 36
+?LoadFile@xptiInterfaceInfoManager@@QAEHABVxptiTypelib@@PAVxptiWorkingSet@@@Z ; 36
+?SetHeader@xptiFile@@QAEHPAUXPTHeader@@@Z ; 36
+?ReadXPTFile@xptiInterfaceInfoManager@@AAEPAUXPTHeader@@PAVnsILocalFile@@PAVxptiWorkingSet@@@Z ; 36
+?ConvertBreaks@@YAPAGPBGAAHPBD2@Z ; 35
+?ConvertUnicharLineBreaksInSitu@nsLinebreakConverter@@SAIPAPAGW4ELinebreakType@1@1HPAH@Z ; 35
+?CountLinebreaks@@YAHPBGHPBD@Z ; 35
+?FindFactory@nsComponentManager@@SAIABUnsID@@PAPAVnsIFactory@@@Z ; 34
+??1nsRegistryValue@@UAE@XZ ; 32
+??_GnsRegistryValue@@UAEPAXI@Z ; 32
+?getInfo@nsRegistryValue@@IAEIXZ ; 32
+?find_leaf@CategoryNode@@QAEPAVnsCString@@PBD@Z ; 32
+??0nsRegistryValue@@QAE@PAXJK@Z ; 32
+?QueryInterface@nsRegistryValue@@UAGIABUnsID@@PAPAX@Z ; 32
+?GetNameUTF8@nsRegistryValue@@UAGIPAPAD@Z ; 32
+?AddCategoryEntry@nsCategoryManager@@UAGIPBD00HHPAPAD@Z ; 32
+?CurrentItem@nsRegValueEnumerator@@UAGIPAPAVnsISupports@@@Z ; 32
+??1nsInputFileStream@@UAE@XZ ; 29
+??YnsFileSpec@@QAEXABVnsString@@@Z ; 29
+?Release@nsAppFileLocationProvider@@UAGKXZ ; 29
+??0nsInputStream@@QAE@PAVnsIInputStream@@@Z ; 29
+??1nsRandomAccessInputStream@@UAE@XZ ; 29
+??1nsInputStream@@UAE@XZ ; 29
+?IsLowMemory@nsMemoryImpl@@UAGIPAH@Z ; 29
+??8nsFileSpec@@QBEHABV0@@Z ; 28
+?QueryInterface@nsAppFileLocationProvider@@UAGIABUnsID@@PAPAX@Z ; 27
+?copy_string@@YAAAV?$CalculateLength@D@@AAV?$nsReadingIterator@D@@ABV2@AAV1@@Z ; 26
+?Distance@@YAIABV?$nsReadingIterator@D@@0@Z ; 26
+?GetFile@nsAppFileLocationProvider@@UAGIPBDPAHPAPAVnsIFile@@@Z ; 26
+?nsLocalFileConstructor@nsLocalFile@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 26
+?GetFactoryFromNSGetFactory@nsNativeComponentLoader@@AAEIPAVnsDll@@ABUnsID@@PAVnsIServiceManager@@PAPAVnsIFactory@@@Z ; 25
+?Release@nsRegistry@@UAGKXZ ; 25
+?First@nsRegSubtreeEnumerator@@UAGIXZ ; 24
+??1nsRegSubtreeEnumerator@@UAE@XZ ; 24
+??0nsRegSubtreeEnumerator@@QAE@PAXJH@Z ; 24
+?Set@nsDirectoryService@@UAGIPBDPAVnsISupports@@@Z ; 24
+??_GnsRegSubtreeEnumerator@@UAEPAXI@Z ; 24
+??0nsPersistentProperties@@QAE@XZ ; 23
+?Load@nsPersistentProperties@@UAGIPAVnsIInputStream@@@Z ; 23
+?Create@nsPersistentProperties@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 23
+?QueryInterface@nsPersistentProperties@@UAGIABUnsID@@PAPAX@Z ; 23
+??1nsFileURL@@UAE@XZ ; 20
+?SetPersistentDescriptor@nsLocalFile@@UAGIPBD@Z ; 20
+?Close@BasicStringImpl@@UAGIXZ ; 20
+??4nsFileURL@@QAEXABVnsFilePath@@@Z ; 20
+?ReplaceElementAt@nsSupportsArray@@UAGHPAVnsISupports@@I@Z ; 20
+?NS_AllocateContiguousHandleWithData@@YAPAVBuffer@nsSharedBufferList@@PBV12@ABVnsLocalString@@I@Z ; 20
+?QueryInterface@nsRegistry@@UAGIABUnsID@@PAPAX@Z ; 19
+?SetCharAt@nsCString@@QAEHGI@Z ; 19
+??0nsSpecialSystemDirectory@@QAE@W4SystemDirectories@0@@Z ; 18
+?GetFileSize@nsFileSpec@@QBEIXZ ; 18
+?Exists@nsFileSpecImpl@@UAGIPAH@Z ; 18
+?GetSubtree@nsRegistry@@UAGIIPBDPAI@Z ; 18
+??4nsSpecialSystemDirectory@@QAEXW4SystemDirectories@0@@Z ; 18
+??1nsSpecialSystemDirectory@@UAE@XZ ; 18
+??0nsRandomAccessInputStream@@IAE@XZ ; 17
+??0nsObserverList@@QAE@XZ ; 17
+??1nsObserverList@@UAE@XZ ; 17
+?EnumerateSubtrees@nsRegistry@@UAGIIPAPAVnsIEnumerator@@@Z ; 17
+?NS_NewObserverList@@YAIPAPAVnsIObserverList@@@Z ; 17
+?AssignFrom@nsInputFileStream@@IAEXPAVnsISupports@@@Z ; 17
+??0nsInputFileStream@@QAE@ABVnsFileSpec@@HH@Z ; 17
+?QueryInterface@nsObserverList@@UAGIABUnsID@@PAPAX@Z ; 17
+??_GnsObserverList@@UAEPAXI@Z ; 17
+?Unescape@nsSimpleCharString@@QAEXXZ ; 16
+?SetCharAt@nsString@@QAEHGI@Z ; 16
+??1nsOpaqueKey@@UAE@XZ ; 16
+??1nsPersistentProperties@@UAE@XZ ; 16
+??_EnsPersistentProperties@@UAEPAXI@Z ; 16
+??0nsFilePath@@QAE@PBDH@Z ; 16
+??0nsOpaqueKey@@QAE@PBDIW4Ownership@0@@Z ; 16
+?AppendRelativeUnixPath@nsFileSpecImpl@@UAGIPBD@Z ; 15
+??0nsCString@@QAE@PBDH@Z ; 15
+?GetString@nsRegistry@@UAGIIPBGPAPAG@Z ; 15
+?SetStringUTF8@nsRegistry@@UAGIIPBD0@Z ; 15
+?SetString@nsRegistry@@UAGIIPBG0@Z ; 15
+?ReleaseElements@nsHashtableEnumerator@@EAGIXZ ; 14
+PL_GetEventQueueMonitor ; 14
+?ReadStringZ@nsBinaryInputStream@@UAGIPAPAD@Z ; 14
+?EscapeKey@nsRegistry@@UAGIPAEIPAIPAPAE@Z ; 14
+?AppendFromPromise@nsACString@@IAEXABV1@@Z ; 13
+?FindCharInReadable@@YAHDAAV?$nsReadingIterator@D@@ABV1@@Z ; 13
+??0nsPromiseCSubstring@@QAE@ABV?$nsReadingIterator@D@@0@Z ; 13
+?GetName@xptiInterfaceInfo@@UAGIPAPAD@Z ; 12
+?StartAssignmentByReference@nsXPIDLCString@@AAEPAPBDXZ ; 12
+??0nsFileURL@@QAE@ABVnsFileSpec@@@Z ; 12
+?ConvertFromFileSystemCharset@nsFileSpec@@IAEPAGPBD@Z ; 12
+?Read8@nsBinaryInputStream@@UAGIPAE@Z ; 12
+?IsHidden@nsLocalFile@@UAGIPAH@Z ; 12
+?BufferHashCode@nsCRT@@SAIPBDI@Z ; 12
+?GetFileSystemCharset@nsFileSpec@@KAXAAVnsString@@@Z ; 12
+??0nsRandomAccessStoreClient@@QAE@ABV?$nsCOMPtr@VnsIRandomAccessStore@@@@@Z ; 12
+??0nsFileClient@@QAE@ABV?$nsCOMPtr@VnsIOpenFile@@@@@Z ; 12
+?SetLongLong@nsRegistry@@UAGIIPBDPA_J@Z ; 12
+??0nsInputFileStream@@QAE@PAVnsIInputStream@@@Z ; 12
+?HashCode@nsOpaqueKey@@UBEIXZ ; 12
+??0nsRandomAccessInputStream@@QAE@PAVnsIInputStream@@@Z ; 12
+??4nsFileURL@@QAEXABVnsFileSpec@@@Z ; 12
+?AddRef@nsCategoryManager@@UAGKXZ ; 11
+?Release@nsCategoryManager@@UAGKXZ ; 11
+?GetFile@nsDirectoryService@@UAGIPBDPAHPAPAVnsIFile@@@Z ; 11
+??0nsProxyEventClass@@IAE@ABUnsID@@PAVnsIInterfaceInfo@@@Z ; 11
+?Read@nsFileSpecImpl@@UAGIPAPADHPAH@Z ; 11
+?InsertReadable@nsSlidingString@@IAEXABVnsAString@@ABV?$nsReadingIterator@G@@@Z ; 10
+NS_NewTypicalInputFileStream ; 10
+??1nsCommonCString@@UAE@XZ ; 10
+?SplitBuffer@nsSharedBufferList@@QAEXABUPosition@1@W4SplitDisposition@1@@Z ; 10
+?OpenStreamForReading@nsFileSpecImpl@@UAGIXZ ; 10
+PL_IsQueueNative ; 10
+?Release@nsRegistryFactory@@UAGKXZ ; 10
+??0ConstStringImpl@@QAE@ABVnsCString@@@Z ; 10
+?ResolveSymlink@nsFileSpecImpl@@UAGIXZ ; 10
+?IsQueueNative@nsEventQueueImpl@@UAGIPAH@Z ; 10
+??1nsACString@@UAE@XZ ; 10
+?Clone@nsVoidKey@@UBEPAVnsHashKey@@XZ ; 10
+NS_NewCStringInputStream ; 10
+?QueryInterface@nsRegSubtreeEnumerator@@UAGIABUnsID@@PAPAX@Z ; 9
+?GetFileSize@nsFileSpecImpl@@UAGIPAI@Z ; 9
+?GetTypeForParam@xptiInterfaceInfo@@UAGIGPBVnsXPTParamInfo@@GPAVnsXPTType@@@Z ; 9
+?Exists@nsDirectoryIteratorImpl@@UAGIPAH@Z ; 9
+?do_InsertFromElement@nsAString@@MAEXGI@Z ; 9
+?Create@nsDirectoryService@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 9
+?QueryInterface@nsCategoryManager@@UAGIABUnsID@@PAPAX@Z ; 9
+?GetFileContents@nsFileSpecImpl@@UAGIPAPAD@Z ; 9
+?GetTypeInArray@xptiInterfaceInfo@@EAGIPBVnsXPTParamInfo@@GPAPBUXPTTypeDescriptor@@@Z ; 9
+?IsOpen@nsRegistry@@UAGIPAH@Z ; 9
+?set_at_eof@nsRandomAccessStoreClient@@MAEXH@Z ; 8
+??0nsFilePath@@QAE@ABVnsFileURL@@@Z ; 8
+?GetLengthIsArgNumberForParam@xptiInterfaceInfo@@UAGIGPBVnsXPTParamInfo@@GPAE@Z ; 8
+?SetAtEOF@FileImpl@@UAGIH@Z ; 8
+?GetSubtreeRaw@nsRegistry@@UAGIIPBDPAI@Z ; 8
+?Delete@nsFileSpec@@QBEXH@Z ; 8
+??_EnsDirEnumerator@@UAEPAXI@Z ; 8
+??_EnsHashtable@@UAEPAXI@Z ; 8
+?ReadBytes@nsBinaryInputStream@@UAGIPAPADI@Z ; 8
+?Next@nsDirectoryIteratorImpl@@UAGIXZ ; 8
+?GetDirectoryEntries@nsLocalFile@@UAGIPAPAVnsISimpleEnumerator@@@Z ; 8
+??0nsFileURL@@QAE@PBDH@Z ; 8
+?EnumerateCategory@nsCategoryManager@@UAGIPBDPAPAVnsISimpleEnumerator@@@Z ; 8
+??0nsDirEnumerator@@QAE@XZ ; 8
+?Put@nsInt2StrHashtable@@QAEIIPBD@Z ; 8
+??0nsFileSpec@@QAE@ABVnsFileURL@@@Z ; 8
+?GetCurrentSpec@nsDirectoryIteratorImpl@@UAGIPAPAVnsIFileSpec@@@Z ; 8
+?Init@nsDirEnumerator@@QAEIPAVnsILocalFile@@@Z ; 8
+??1nsDirEnumerator@@UAE@XZ ; 8
+?MakeAllDirectories@nsFileSpecHelpers@@YAXPBDH@Z ; 8
+?NotifyObservers@nsEventQueueImpl@@AAEXPBD@Z ; 8
+?Reset@nsHashtableEnumerator@@EAGIPAVnsHashtable@@P6GIPAVnsHashKey@@PAX2PAPAVnsISupports@@@Z2@Z ; 7
+NS_NewHashtableEnumerator ; 7
+?GetLeafName@nsFileSpec@@QAEXAAVnsString@@@Z ; 7
+??1nsHashtableEnumerator@@UAE@XZ ; 7
+??0CategoryNode@@QAE@XZ ; 7
+?IsASCII@nsString@@QAEHPBG@Z ; 7
+NS_NewAdapterEnumerator ; 7
+??0nsRegValueEnumerator@@QAE@PAXJ@Z ; 7
+??1nsProxyEventClass@@MAE@XZ ; 7
+?Realloc@nsMemoryImpl@@UAGPAXPAXI@Z ; 7
+?EnterMonitor@nsEventQueueImpl@@UAGIXZ ; 7
+??_EnsHashtableEnumerator@@UAEPAXI@Z ; 7
+?First@nsHashtableEnumerator@@UAGIXZ ; 7
+?RegisterErrorStringBundleKey@nsErrorService@@UAGIIPBD@Z ; 7
+?EnumerateValues@nsRegistry@@UAGIIPAPAVnsIEnumerator@@@Z ; 7
+?GetSizeIsArgNumberForParam@xptiInterfaceInfo@@UAGIGPBVnsXPTParamInfo@@GPAE@Z ; 7
+??0nsHashtableEnumerator@@QAE@PAVnsHashtable@@P6GIPAVnsHashKey@@PAX2PAPAVnsISupports@@@Z2@Z ; 7
+??_EnsAdapterEnumerator@@UAEPAXI@Z ; 7
+?Release@nsComponentManagerImpl@@UAGKXZ ; 7
+??_GCategoryNode@@UAEPAXI@Z ; 7
+?Delete@nsLocalFile@@UAGIH@Z ; 7
+??_GnsProxyEventClass@@MAEPAXI@Z ; 7
+?ExitMonitor@nsEventQueueImpl@@UAGIXZ ; 7
+??0nsBinaryInputStream@@QAE@PAVnsIInputStream@@@Z ; 6
+?OpenWellKnownRegistry@nsRegistry@@UAGIH@Z ; 6
+??0nsStaticCaseInsensitiveNameTable@@QAE@XZ ; 6
+??0nsXPIDLString@@QAE@XZ ; 6
+?NS_NewBinaryInputStream@@YAIPAPAVnsIBinaryInputStream@@PAVnsIInputStream@@@Z ; 6
+?SetYounger@nsEventQueueImpl@@UAGIPAVnsPIEventQueueChain@@@Z ; 6
+?MakeUnique@nsFileSpec@@QAEXXZ ; 6
+?Release@nsBinaryInputStream@@UAGKXZ ; 6
+??_GnsBinaryInputStream@@UAEPAXI@Z ; 6
+?ConvertUnknownBreaks@@YAPADPBDAAH0@Z ; 6
+?Read16@nsBinaryInputStream@@UAGIPAG@Z ; 6
+?AddSubtreeRaw@nsRegistry@@UAGIIPBDPAI@Z ; 6
+?Init@nsStaticCaseInsensitiveNameTable@@QAEHQAPBDH@Z ; 6
+?IsFile@nsFileSpec@@QBEHXZ ; 6
+??0nsFileSpec@@QAE@ABVnsString@@H@Z ; 6
+?ConvertLineBreaks@nsLinebreakConverter@@SAPADPBDW4ELinebreakType@1@1HPAH@Z ; 6
+NS_NewByteInputStream ; 6
+?ReadFloat@nsBinaryInputStream@@UAGIPAM@Z ; 6
+?Realloc@nsMemory@@SAPAXPAXI@Z ; 6
+??1nsStaticCaseInsensitiveNameTable@@QAE@XZ ; 6
+?GetLength@nsStorageStream@@UAGIPAI@Z ; 6
+??_GnsRegistry@@UAEPAXI@Z ; 5
+??_EnsObjectHashtable@@UAEPAXI@Z ; 5
+?CloneMozBinDirectory@nsAppFileLocationProvider@@IAGIPAPAVnsILocalFile@@@Z ; 5
+?StripWhitespace@nsCString@@QAEXXZ ; 5
+??0nsRegistry@@QAE@XZ ; 5
+?MakeNewQueue@nsEventQueueServiceImpl@@EAGIPAUPRThread@@HPAPAVnsIEventQueue@@@Z ; 5
+?StopAcceptingEvents@nsEventQueueImpl@@UAGIXZ ; 5
+??1nsRegistry@@UAE@XZ ; 5
+?Create@nsEventQueueImpl@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 5
+?Close@nsRegistry@@MAGIXZ ; 5
+?CreateInstance@nsRegistryFactory@@UAGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 5
+?InitFromPRThread@nsEventQueueImpl@@UAGIPAUPRThread@@H@Z ; 5
+??4nsFileSpec@@QAEXABVnsString@@@Z ; 5
+?NS_FileSpecToIFile@@YAIPAVnsFileSpec@@PAPAVnsILocalFile@@@Z ; 5
+?QueryInterface@nsComponentManagerImpl@@UAGIABUnsID@@PAPAX@Z ; 5
+?GetNativePathString@nsFileSpec@@QAEXAAVnsString@@@Z ; 5
+??0nsEventQueueImpl@@QAE@XZ ; 5
+?do_GetService@@YA?BVnsGetServiceByContractID@@PBDPAI@Z ; 5
+PL_EventAvailable ; 4
+?RFind@nsString@@QBEHABV1@HHH@Z ; 4
+?RegisterComponentSpec@nsComponentManagerImpl@@UAGIABUnsID@@PBD1PAVnsIFile@@HH@Z ; 4
+?FSToNewUCS@nsFSStringConversion@@SAIPBDPAPAG@Z ; 4
+?GetCategoryEntry@nsCategoryManager@@UAGIPBD0PAPAD@Z ; 4
+?RegisterComponentWithType@nsComponentManagerImpl@@UAGIABUnsID@@PBD1PAVnsIFile@@1HH1@Z ; 4
+PL_CreateNativeEventQueue ; 4
+?RemoveStringAt@nsStringArray@@QAEHH@Z ; 4
+?PrepareDecoder@nsFSStringConversion@@CAIXZ ; 4
+?GetName@nsRegistryNode@@UAGIPAPAG@Z ; 4
+?Clone@nsOpaqueKey@@UBEPAVnsHashKey@@XZ ; 4
+?SetBufferSize@nsRegistry@@QAEHH@Z ; 4
+?GetCategoryEntryRaw@nsCategoryManager@@UAGIPBD0PAPAD@Z ; 4
+?AddSubtree@nsRegistry@@UAGIIPBDPAI@Z ; 4
+??_EnsOpaqueKey@@UAEPAXI@Z ; 4
+?GetOutputStream@nsFileSpecImpl@@UAGIPAPAVnsIOutputStream@@@Z ; 3
+NS_NewTypicalOutputFileStream ; 3
+?PushThreadEventQueue@nsEventQueueServiceImpl@@UAGIPAPAVnsIEventQueue@@@Z ; 3
+?QueryInterface@nsConsoleService@@UAGIABUnsID@@PAPAX@Z ; 3
+?PopThreadEventQueue@nsEventQueueServiceImpl@@UAGIPAVnsIEventQueue@@@Z ; 3
+PL_MapEvents ; 3
+?Unlink@nsEventQueueImpl@@UAGIXZ ; 3
+?SetElder@nsEventQueueImpl@@UAGIPAVnsPIEventQueueChain@@@Z ; 3
+?AppendQueue@nsEventQueueImpl@@UAGIPAVnsIEventQueue@@@Z ; 3
+??1nsEventQueueImpl@@UAE@XZ ; 3
+?OpenStreamForWriting@nsFileSpecImpl@@UAGIXZ ; 3
+??0nsOutputFileStream@@QAE@PAVnsIFileSpec@@@Z ; 3
+?LogMessage@nsConsoleService@@UAGIPAVnsIConsoleMessage@@@Z ; 3
+PL_DestroyEventQueue ; 3
+?IsRegistered@nsComponentManagerImpl@@UAGIABUnsID@@PAH@Z ; 3
+?GetCurrentProcessDirectory@nsDirectoryService@@AAEIPAPAVnsILocalFile@@@Z ; 3
+??_EnsEventQueueImpl@@UAEPAXI@Z ; 3
+?CreateDirectory@nsFileSpec@@QAEXH@Z ; 3
+??0nsDll@@QAE@PBDH@Z ; 3
+??1nsAVLTree@@QAE@XZ ; 2
+?NewFileArray@xptiWorkingSet@@QAEHI@Z ; 2
+?ToUpper@nsCRT@@SADD@Z ; 2
+??1nsInt2StrHashtable@@UAE@XZ ; 2
+?GetUnicodeLeafName@nsLocalFile@@UAGIPAPAG@Z ; 2
+?CompareWithConversion@nsString@@QBEHABV1@HH@Z ; 2
+?Read@xptiManifest@@SAHPAVxptiInterfaceInfoManager@@PAVxptiWorkingSet@@@Z ; 2
+??0nsMemoryImpl@@QAE@XZ ; 2
+??1xptiWorkingSet@@QAE@XZ ; 2
+?Create@nsMemoryImpl@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 2
+??0nsRegistryFactory@@QAE@XZ ; 2
+?NS_ErrorAccordingToNSPR@@YAIXZ ; 2
+?ClearHashTables@xptiWorkingSet@@QAEXXZ ; 2
+??_ExptiFile@@QAEPAXI@Z ; 2
+?AppendUnicode@nsLocalFile@@UAGIPBG@Z ; 2
+?Release@MemoryFlusher@@UAGKXZ ; 2
+??_EnsSupportsHashtable@@UAEPAXI@Z ; 2
+?CreateEventQueue@nsEventQueueServiceImpl@@EAGIPAUPRThread@@H@Z ; 2
+??1xptiAutoLog@@QAE@XZ ; 2
+NS_RegistryGetFactory ; 2
+?ClearFiles@xptiWorkingSet@@QAEXXZ ; 2
+??0xptiWorkingSet@@QAE@XZ ; 2
+?Tell@FileImpl@@UAGIPAH@Z ; 2
+?RegisterProvider@nsDirectoryService@@UAGIPAVnsIDirectoryServiceProvider@@@Z ; 2
+?GetKey@nsRegistry@@UAGIIPBGPAI@Z ; 2
+?ClearZipItems@xptiWorkingSet@@QAEXXZ ; 2
+?readline@nsRandomAccessInputStream@@QAEHPADH@Z ; 2
+??0nsAVLTree@@QAE@AAVnsAVLNodeComparitor@@PAVnsAVLNodeFunctor@@@Z ; 2
+?GetManifestDir@xptiInterfaceInfoManager@@QAEHPAPAVnsILocalFile@@@Z ; 2
+??0xptiAutoLog@@QAE@PAVxptiInterfaceInfoManager@@PAVnsILocalFile@@H@Z ; 2
+?tell@nsRandomAccessStoreClient@@QAEHXZ ; 2
+NS_NewUnicodeLocalFile ; 2
+??0nsInt2StrHashtable@@QAE@XZ ; 2
+?seek@nsRandomAccessStoreClient@@QAEXW4PRSeekWhence@@H@Z ; 2
+?Open@nsRegistry@@UAGIPBD@Z ; 2
+?QueryInterface@nsErrorService@@UAGIABUnsID@@PAPAX@Z ; 2
+?RegisterService@nsServiceManagerImpl@@UAGIABUnsID@@PAVnsISupports@@@Z ; 2
+?Seek@FileImpl@@UAGIW4PRSeekWhence@@H@Z ; 2
+?GetUnicodePath@nsLocalFile@@UAGIPAPAG@Z ; 2
+?AddRef@MemoryFlusher@@UAGKXZ ; 2
+?PrepareFSCharset@nsFSStringConversion@@CAIXZ ; 2
+??_EnsDirectoryService@@UAEPAXI@Z ; 1
+?NS_ShutdownXPCOM@@YAIPAVnsIServiceManager@@@Z ; 1
+?AutoRegister@nsComponentManagerImpl@@UAGIHPAVnsIFile@@@Z ; 1
+?OnShutdown@HandleCaseConversionShutdown3@@UAGIABUnsID@@PAVnsISupports@@@Z ; 1
+?GetParent@nsFileSpec@@QBEXAAV1@@Z ; 1
+??1nsConsoleService@@UAE@XZ ; 1
+??0nsComponentManagerImpl@@QAE@XZ ; 1
+?PlatformVersionCheck@nsComponentManagerImpl@@IAEIPAI@Z ; 1
+?PlatformInit@nsComponentManagerImpl@@IAEIXZ ; 1
+??_EnsAppFileLocationProvider@@MAEPAXI@Z ; 1
+??_EnsVoidArray@@UAEPAXI@Z ; 1
+??RnsGetServiceFromCategory@@UBEIABUnsID@@PAPAX@Z ; 1
+??0nsIOFileStream@@QAE@ABVnsFileSpec@@HH@Z ; 1
+?NS_PurgeAtomTable@@YAXXZ ; 1
+??0nsProxyObjectManager@@QAE@XZ ; 1
+?NS_NewThreadPool@@YAIPAPAVnsIThreadPool@@IIIW4PRThreadPriority@@W4PRThreadScope@@@Z ; 1
+?GetNext@EmptyEnumeratorImpl@@UAGIPAPAVnsISupports@@@Z ; 1
+??_GxptiInterfaceInfoManager@@UAEPAXI@Z ; 1
+?ReallocLastSegment@nsSegmentedBuffer@@QAEHI@Z ; 1
+??0nsNativeComponentLoader@@QAE@XZ ; 1
+?Init@nsComponentManagerImpl@@QAEIXZ ; 1
+?CreateMonitoredThreadEventQueue@nsEventQueueServiceImpl@@UAGIXZ ; 1
+?UnloadLibraries@nsComponentManagerImpl@@IAEIPAVnsIServiceManager@@H@Z ; 1
+?Run@MemoryFlusher@@UAGIXZ ; 1
+??1nsDirectoryService@@UAE@XZ ; 1
+?SetRegistryDllInfo@nsNativeComponentLoader@@AAEIPBDPA_J1@Z ; 1
+??1nsDirectoryIteratorImpl@@UAE@XZ ; 1
+?DestroyThreadEventQueue@nsEventQueueServiceImpl@@UAGIXZ ; 1
+?GetInt@nsRegistry@@UAGIIPBDPAH@Z ; 1
+??0MemoryFlusher@@IAE@PAVnsMemoryImpl@@@Z ; 1
+?EnumerateBackwards@nsCStringArray@@QAEHP6AHAAVnsCString@@PAX@Z1@Z ; 1
+?GetParent@nsFileSpecImpl@@UAGIPAPAVnsIFileSpec@@@Z ; 1
+?BuildFileList@xptiInterfaceInfoManager@@AAEHPAPAVnsISupportsArray@@@Z ; 1
+??1nsServiceManagerImpl@@MAE@XZ ; 1
+??1nsObserverService@@UAE@XZ ; 1
+?GetRegistryDllInfo@nsNativeComponentLoader@@AAEIPBDPA_J1@Z ; 1
+?Shutdown@nsMemoryImpl@@SAIXZ ; 1
+NS_CategoryManagerGetFactory ; 1
+?Create@nsProxyObjectManager@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 1
+??_EnsDirectoryIteratorImpl@@UAEPAXI@Z ; 1
+??1nsAppFileLocationProvider@@MAE@XZ ; 1
+?GetProductDirectory@nsAppFileLocationProvider@@IAGIPAPAVnsILocalFile@@@Z ; 1
+??0?$nsCOMPtr@VnsIServiceManager@@@@QAE@ABVnsCOMPtr_helper@@@Z ; 1
+??_EnsNativeComponentLoader@@UAEPAXI@Z ; 1
+?Create@nsObserverService@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 1
+??0nsCategoryManager@@AAE@XZ ; 1
+??1nsIOFileStream@@UAE@XZ ; 1
+??1nsCategoryManager@@UAE@XZ ; 1
+?InvalidateInterfaceInfos@xptiWorkingSet@@QAEXXZ ; 1
+?PlatformPrePopulateRegistry@nsComponentManagerImpl@@QAEIXZ ; 1
+?NS_InitXPCOM2@@YAIPAPAVnsIServiceManager@@PAVnsIFile@@PAVnsIDirectoryServiceProvider@@@Z ; 1
+??_EnsDirectoryIterator@@UAEPAXI@Z ; 1
+?IsValid@xptiInterfaceInfoManager@@AAEHXZ ; 1
+?Shutdown@xptiZipLoader@@SAXXZ ; 1
+?Init@nsDirectoryService@@UAGIXZ ; 1
+?Create@nsErrorService@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 1
+?RegisterDeferredComponents@nsNativeComponentLoader@@UAGIHPAH@Z ; 1
+?Shutdown@nsComponentManagerImpl@@QAEIXZ ; 1
+?Shutdown@nsThread@@SAXXZ ; 1
+?Sync@nsDll@@QAEIXZ ; 1
+?Startup@nsMemoryImpl@@SAIXZ ; 1
+?Define@nsDirectoryService@@UAGIPBDPAVnsISupports@@@Z ; 1
+?SetMainThread@nsIThread@@SAIXZ ; 1
+?ShutdownSpecialSystemDirectory@@YAXXZ ; 1
+?Init@nsNativeComponentLoader@@UAGIPAVnsIComponentManager@@PAVnsISupports@@@Z ; 1
+??0nsCategoryManagerFactory@@QAE@XZ ; 1
+?RegisterErrorStringBundle@nsErrorService@@UAGIFPBD@Z ; 1
+??0nsDirectoryService@@QAE@XZ ; 1
+?RegisterFactory@nsComponentManager@@SAIABUnsID@@PBD1PAVnsIFactory@@H@Z ; 1
+?AutoRegisterImpl@nsComponentManagerImpl@@AAEIHPAVnsIFile@@@Z ; 1
+?DetermineAutoRegStrategy@xptiInterfaceInfoManager@@AAE?AW4AutoRegMode@1@PAVnsISupportsArray@@PAVxptiWorkingSet@@@Z ; 1
+??0nsAppFileLocationProvider@@QAE@XZ ; 1
+??1MemoryFlusher@@MAE@XZ ; 1
+?Create@nsLocalFile@@UAGIII@Z ; 1
+?Join@nsThread@@UAGIXZ ; 1
+??_GnsProxyObjectManager@@UAEPAXI@Z ; 1
+?LogStats@xptiInterfaceInfoManager@@AAEXXZ ; 1
+?Valid@nsFileSpec@@QBEHXZ ; 1
+?NS_InitXPCOM@@YAIPAPAVnsIServiceManager@@PAVnsIFile@@@Z ; 1
+?ShutdownGlobalServiceManager@nsServiceManager@@SAIPAPAVnsIServiceManager@@@Z ; 1
+??1xptiInterfaceInfoManager@@UAE@XZ ; 1
+??_GnsComponentManagerImpl@@UAEPAXI@Z ; 1
+?FreeInterfaceInfoManager@xptiInterfaceInfoManager@@SAXXZ ; 1
+?Create@MemoryFlusher@@SAIPAPAV1@PAVnsMemoryImpl@@@Z ; 1
+??_EnsErrorService@@UAEPAXI@Z ; 1
+??1nsProxyObjectManager@@UAE@XZ ; 1
+??0nsConsoleService@@QAE@XZ ; 1
+?AutoRegisterComponents@nsNativeComponentLoader@@UAGIHPAVnsIFile@@@Z ; 1
+?AutoRegister@nsComponentManager@@SAIHPAVnsIFile@@@Z ; 1
+?QueryInterface@nsDirectoryIteratorImpl@@UAGIABUnsID@@PAPAX@Z ; 1
+??_EMemoryFlusher@@MAEPAXI@Z ; 1
+?initialize@nsCategoryManager@@AAEIXZ ; 1
+?AutoRegisterInterfaces@xptiInterfaceInfoManager@@UAGIXZ ; 1
+PL_CreateMonitoredEventQueue ; 1
+??_GnsCategoryManager@@UAEPAXI@Z ; 1
+?Close@nsStorageStream@@UAGIXZ ; 1
+?Init@nsThreadPool@@UAGIIIIW4PRThreadPriority@@W4PRThreadScope@@@Z ; 1
+??0nsObserverService@@QAE@XZ ; 1
+?Create@nsEventQueueServiceImpl@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 1
+??0xptiInterfaceInfoManager@@AAE@XZ ; 1
+?GetDllSpec@nsDll@@QAEIPAPAVnsIFile@@@Z ; 1
+??_EnsServiceManagerImpl@@MAEPAXI@Z ; 1
+?SelfRegisterDll@nsNativeComponentLoader@@AAEIPAVnsDll@@PBDH@Z ; 1
+?UnloadAll@nsNativeComponentLoader@@UAGIH@Z ; 1
+??0?$nsCOMPtr@VnsIOutputStream@@@@QAE@ABVnsCOMPtr_helper@@@Z ; 1
+?Undefine@nsDirectoryService@@UAGIPBD@Z ; 1
+??0nsDirectoryIteratorImpl@@QAE@XZ ; 1
+??0CCaseConversionServiceInitializer@@QAE@XZ ; 1
+??1nsComponentManagerImpl@@UAE@XZ ; 1
+?RegisterComponentsInDir@nsNativeComponentLoader@@MAGIHPAVnsIFile@@@Z ; 1
+??0nsEventQueueServiceImpl@@QAE@XZ ; 1
+?CreateInstance@nsCategoryManagerFactory@@UAGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 1
+??_GnsObserverService@@UAEPAXI@Z ; 1
+XPTI_FreeInterfaceInfoManager ; 1
+?Stop@MemoryFlusher@@QAEIXZ ; 1
+?CreateThreadEventQueue@nsEventQueueServiceImpl@@UAGIXZ ; 1
+??0nsServiceManagerImpl@@QAE@XZ ; 1
+??1nsNativeComponentLoader@@UAE@XZ ; 1
+??0nsThreadPool@@QAE@XZ ; 1
+?NS_ShutdownLocalFile@@YAXXZ ; 1
+??_GHandleCaseConversionShutdown3@@UAEPAXI@Z ; 1
+?Init@nsDirectoryIteratorImpl@@UAGIPAVnsIFileSpec@@H@Z ; 1
+??0nsErrorService@@QAE@XZ ; 1
+??_EnsConsoleService@@UAEPAXI@Z ; 1
+??0nsSlidingSubstring@@QAE@ABVnsAString@@@Z ; 1
+?CleanUp@nsFSStringConversion@@SAXXZ ; 1
+?Create@nsDirectoryIteratorImpl@@SGIPAVnsISupports@@ABUnsID@@PAPAX@Z ; 1
diff --git a/src/libs/xpcom18a4/xpcom/build/xpcom-tests.pkg b/src/libs/xpcom18a4/xpcom/build/xpcom-tests.pkg
new file mode 100644
index 00000000..8a32b21f
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/xpcom-tests.pkg
@@ -0,0 +1,47 @@
+[xpcom-tests]
+#if USE_SHORT_LIBNAME
+dist/bin/components/@DLLP@tdynamic@DLLS@
+dist/bin/components/@DLLP@MyServce@DLLS@
+dist/bin/components/@DLLP@xpcomsmp@DLLS@
+#else
+dist/bin/components/@DLLP@testdynamic@DLLS@
+dist/bin/components/@DLLP@MyService@DLLS@
+dist/bin/components/@DLLP@xpcomsample@DLLS@
+#endif
+dist/bin/components/nsSample.js
+!xpt dist/bin/components/xpcomsample.xpt
+dist/bin/nsTestSample@BINS@
+dist/bin/res/test.properties
+dist/bin/res/samples/xpconnect-sample.html
+!xpt dist/bin/components/proxytest.xpt
+dist/bin/proxytests@BINS@
+
+dist/bin/PrimitiveTest@BINS@
+dist/bin/SimpleTypeLib@BINS@
+dist/bin/TestInterfaceInfo@BINS@
+dist/bin/TestXPTCInvoke@BINS@
+
+dist/bin/nsIFileEnumerator@BINS@
+dist/bin/nsIFileTest@BINS@
+dist/bin/TestArray@BINS@
+dist/bin/TestAtoms@BINS@
+dist/bin/TestAutoLock@BINS@
+dist/bin/TestCallTemplates@BINS@
+dist/bin/TestCOMPtr@BINS@
+dist/bin/TestCOMPtrEq@BINS@
+dist/bin/TestCRT@BINS@
+dist/bin/TestFactory@BINS@
+dist/bin/TestHashtables@BINS@
+dist/bin/TestID@BINS@
+dist/bin/TestObserverService@BINS@
+dist/bin/TestPermanentAtoms@BINS@
+dist/bin/TestPipes@BINS@
+dist/bin/TestServMgr@BINS@
+dist/bin/TestThreads@BINS@
+dist/bin/TestXPIDLString@BINS@
+dist/bin/TestDeque@BINS@
+dist/bin/TestAutoPtr@BINS@
+
+#if OS_ARCH==WINNT
+dist/bin/TestCOM.exe
+#endif
diff --git a/src/libs/xpcom18a4/xpcom/build/xpcom.pkg b/src/libs/xpcom18a4/xpcom/build/xpcom.pkg
new file mode 100644
index 00000000..eab0e19d
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/xpcom.pkg
@@ -0,0 +1,106 @@
+[xpcom]
+dist/bin/@DLLP@xpcom@DLLS@
+!xpt dist/bin/components/xpcom_base.xpt
+!xpt dist/bin/components/xpcom_components.xpt
+!xpt dist/bin/components/xpcom_ds.xpt
+!xpt dist/bin/components/xpcom_io.xpt
+!xpt dist/bin/components/xpcom_xpti.xpt
+
+#if OS_ARCH==WINNT
+!xpt dist/bin/components/xpcom_thread.xpt
+!xpt dist/bin/components/proxyObject.xpt
+#else
+!xpt dist/bin/components/xpcom_threads.xpt
+!xpt dist/bin/components/proxyObjInst.xpt
+#endif
+
+[gecko-support]
+dist/bin/regxpcom@BINS@
+dist/bin/xpt_dump@BINS@
+dist/bin/xpt_link@BINS@
+#if MOZ_DEBUG
+#if OS_ARCH==WINNT
+dist/bin/windbgdlg.exe
+#endif
+#endif
+
+# xpidl.exe is not licensed MPL, so we don't include it with applications.
+# It is only included in the developer (SDK) packages.
+[gecko-devel]
+dist/bin/xpidl@BINS@
+
+# put NSPR here, because hacking the NSPR build system is too painful
+# xxxbsmedberg: this doesn't obey --with-system-nspr
+[nspr]
+dist/bin/@DLLP@nspr4@DLLS@
+dist/bin/@DLLP@plc4@DLLS@
+dist/bin/@DLLP@plds4@DLLS@
+
+[nspr-devel]
+dist/lib/@LIBP@nspr4@LIBS@
+dist/lib/@LIBP@plc4@LIBS@
+dist/lib/@LIBP@plds4@LIBS@
+dist/include/nspr/private/pprio.h
+dist/include/nspr/private/pprthred.h
+dist/include/nspr/private/prpriv.h
+dist/include/nspr/prcpucfg.h
+dist/include/nspr/obsolete/pralarm.h
+dist/include/nspr/obsolete/probslet.h
+dist/include/nspr/obsolete/protypes.h
+dist/include/nspr/obsolete/prsem.h
+dist/include/nspr/nspr.h
+dist/include/nspr/pratom.h
+dist/include/nspr/prbit.h
+dist/include/nspr/prclist.h
+dist/include/nspr/prcmon.h
+dist/include/nspr/prcountr.h
+dist/include/nspr/prcvar.h
+dist/include/nspr/prdtoa.h
+dist/include/nspr/prenv.h
+dist/include/nspr/prerr.h
+dist/include/nspr/prerror.h
+dist/include/nspr/prinet.h
+dist/include/nspr/prinit.h
+dist/include/nspr/prinrval.h
+dist/include/nspr/prio.h
+dist/include/nspr/pripcsem.h
+dist/include/nspr/prlink.h
+dist/include/nspr/prlock.h
+dist/include/nspr/prlog.h
+dist/include/nspr/prlong.h
+dist/include/nspr/prmem.h
+dist/include/nspr/prmon.h
+dist/include/nspr/prmwait.h
+dist/include/nspr/prnetdb.h
+dist/include/nspr/prolock.h
+dist/include/nspr/prpdce.h
+dist/include/nspr/prprf.h
+dist/include/nspr/prproces.h
+dist/include/nspr/prrng.h
+dist/include/nspr/prrwlock.h
+dist/include/nspr/prshma.h
+dist/include/nspr/prshm.h
+dist/include/nspr/prsystem.h
+dist/include/nspr/prthread.h
+dist/include/nspr/prtime.h
+dist/include/nspr/prtpool.h
+dist/include/nspr/prtrace.h
+dist/include/nspr/prtypes.h
+dist/include/nspr/prvrsion.h
+dist/include/nspr/prwin16.h
+dist/include/nspr/plarenas.h
+dist/include/nspr/plarena.h
+dist/include/nspr/plhash.h
+dist/include/nspr/plbase64.h
+dist/include/nspr/plerror.h
+dist/include/nspr/plgetopt.h
+dist/include/nspr/plresolv.h
+dist/include/nspr/plstr.h
+
+[unpackaged-files]
+!optional dist/bin/.autoreg
+!optional dist/bin/components/xpti.dat
+!optional dist/bin/components/compreg.dat
+#if OS_ARCH==WINNT
+dist/bin/rebasedlls.exe
+#endif
diff --git a/src/libs/xpcom18a4/xpcom/build/xpcom_alpha.def b/src/libs/xpcom18a4/xpcom/build/xpcom_alpha.def
new file mode 100644
index 00000000..966f2ea4
--- /dev/null
+++ b/src/libs/xpcom18a4/xpcom/build/xpcom_alpha.def
@@ -0,0 +1,252 @@
+LIBRARY xpcom
+DESCRIPTION "xpcom library"
+
+EXPORTS
+ ?Stub3@nsXPTCStubBase@@UAAIXZ
+ ?Stub4@nsXPTCStubBase@@UAAIXZ
+ ?Stub5@nsXPTCStubBase@@UAAIXZ
+ ?Stub6@nsXPTCStubBase@@UAAIXZ
+ ?Stub7@nsXPTCStubBase@@UAAIXZ
+ ?Stub8@nsXPTCStubBase@@UAAIXZ
+ ?Stub9@nsXPTCStubBase@@UAAIXZ
+ ?Stub10@nsXPTCStubBase@@UAAIXZ
+ ?Stub11@nsXPTCStubBase@@UAAIXZ
+ ?Stub12@nsXPTCStubBase@@UAAIXZ
+ ?Stub13@nsXPTCStubBase@@UAAIXZ
+ ?Stub14@nsXPTCStubBase@@UAAIXZ
+ ?Stub15@nsXPTCStubBase@@UAAIXZ
+ ?Stub16@nsXPTCStubBase@@UAAIXZ
+ ?Stub17@nsXPTCStubBase@@UAAIXZ
+ ?Stub18@nsXPTCStubBase@@UAAIXZ
+ ?Stub19@nsXPTCStubBase@@UAAIXZ
+ ?Stub20@nsXPTCStubBase@@UAAIXZ
+ ?Stub21@nsXPTCStubBase@@UAAIXZ
+ ?Stub22@nsXPTCStubBase@@UAAIXZ
+ ?Stub23@nsXPTCStubBase@@UAAIXZ
+ ?Stub24@nsXPTCStubBase@@UAAIXZ
+ ?Stub25@nsXPTCStubBase@@UAAIXZ
+ ?Stub26@nsXPTCStubBase@@UAAIXZ
+ ?Stub27@nsXPTCStubBase@@UAAIXZ
+ ?Stub28@nsXPTCStubBase@@UAAIXZ
+ ?Stub29@nsXPTCStubBase@@UAAIXZ
+ ?Stub30@nsXPTCStubBase@@UAAIXZ
+ ?Stub31@nsXPTCStubBase@@UAAIXZ
+ ?Stub32@nsXPTCStubBase@@UAAIXZ
+ ?Stub33@nsXPTCStubBase@@UAAIXZ
+ ?Stub34@nsXPTCStubBase@@UAAIXZ
+ ?Stub35@nsXPTCStubBase@@UAAIXZ
+ ?Stub36@nsXPTCStubBase@@UAAIXZ
+ ?Stub37@nsXPTCStubBase@@UAAIXZ
+ ?Stub38@nsXPTCStubBase@@UAAIXZ
+ ?Stub39@nsXPTCStubBase@@UAAIXZ
+ ?Stub40@nsXPTCStubBase@@UAAIXZ
+ ?Stub41@nsXPTCStubBase@@UAAIXZ
+ ?Stub42@nsXPTCStubBase@@UAAIXZ
+ ?Stub43@nsXPTCStubBase@@UAAIXZ
+ ?Stub44@nsXPTCStubBase@@UAAIXZ
+ ?Stub45@nsXPTCStubBase@@UAAIXZ
+ ?Stub46@nsXPTCStubBase@@UAAIXZ
+ ?Stub47@nsXPTCStubBase@@UAAIXZ
+ ?Stub48@nsXPTCStubBase@@UAAIXZ
+ ?Stub49@nsXPTCStubBase@@UAAIXZ
+ ?Stub50@nsXPTCStubBase@@UAAIXZ
+ ?Stub51@nsXPTCStubBase@@UAAIXZ
+ ?Stub52@nsXPTCStubBase@@UAAIXZ
+ ?Stub53@nsXPTCStubBase@@UAAIXZ
+ ?Stub54@nsXPTCStubBase@@UAAIXZ
+ ?Stub55@nsXPTCStubBase@@UAAIXZ
+ ?Stub56@nsXPTCStubBase@@UAAIXZ
+ ?Stub57@nsXPTCStubBase@@UAAIXZ
+ ?Stub58@nsXPTCStubBase@@UAAIXZ
+ ?Stub59@nsXPTCStubBase@@UAAIXZ
+ ?Stub60@nsXPTCStubBase@@UAAIXZ
+ ?Stub61@nsXPTCStubBase@@UAAIXZ
+ ?Stub62@nsXPTCStubBase@@UAAIXZ
+ ?Stub63@nsXPTCStubBase@@UAAIXZ
+ ?Stub64@nsXPTCStubBase@@UAAIXZ
+ ?Stub65@nsXPTCStubBase@@UAAIXZ
+ ?Stub66@nsXPTCStubBase@@UAAIXZ
+ ?Stub67@nsXPTCStubBase@@UAAIXZ
+ ?Stub68@nsXPTCStubBase@@UAAIXZ
+ ?Stub69@nsXPTCStubBase@@UAAIXZ
+ ?Stub70@nsXPTCStubBase@@UAAIXZ
+ ?Stub71@nsXPTCStubBase@@UAAIXZ
+ ?Stub72@nsXPTCStubBase@@UAAIXZ
+ ?Stub73@nsXPTCStubBase@@UAAIXZ
+ ?Stub74@nsXPTCStubBase@@UAAIXZ
+ ?Stub75@nsXPTCStubBase@@UAAIXZ
+ ?Stub76@nsXPTCStubBase@@UAAIXZ
+ ?Stub77@nsXPTCStubBase@@UAAIXZ
+ ?Stub78@nsXPTCStubBase@@UAAIXZ
+ ?Stub79@nsXPTCStubBase@@UAAIXZ
+ ?Stub80@nsXPTCStubBase@@UAAIXZ
+ ?Stub81@nsXPTCStubBase@@UAAIXZ
+ ?Stub82@nsXPTCStubBase@@UAAIXZ
+ ?Stub83@nsXPTCStubBase@@UAAIXZ
+ ?Stub84@nsXPTCStubBase@@UAAIXZ
+ ?Stub85@nsXPTCStubBase@@UAAIXZ
+ ?Stub86@nsXPTCStubBase@@UAAIXZ
+ ?Stub87@nsXPTCStubBase@@UAAIXZ
+ ?Stub88@nsXPTCStubBase@@UAAIXZ
+ ?Stub89@nsXPTCStubBase@@UAAIXZ
+ ?Stub90@nsXPTCStubBase@@UAAIXZ
+ ?Stub91@nsXPTCStubBase@@UAAIXZ
+ ?Stub92@nsXPTCStubBase@@UAAIXZ
+ ?Stub93@nsXPTCStubBase@@UAAIXZ
+ ?Stub94@nsXPTCStubBase@@UAAIXZ
+ ?Stub95@nsXPTCStubBase@@UAAIXZ
+ ?Stub96@nsXPTCStubBase@@UAAIXZ
+ ?Stub97@nsXPTCStubBase@@UAAIXZ
+ ?Stub98@nsXPTCStubBase@@UAAIXZ
+ ?Stub99@nsXPTCStubBase@@UAAIXZ
+ ?Stub100@nsXPTCStubBase@@UAAIXZ
+ ?Stub101@nsXPTCStubBase@@UAAIXZ
+ ?Stub102@nsXPTCStubBase@@UAAIXZ
+ ?Stub103@nsXPTCStubBase@@UAAIXZ
+ ?Stub104@nsXPTCStubBase@@UAAIXZ
+ ?Stub105@nsXPTCStubBase@@UAAIXZ
+ ?Stub106@nsXPTCStubBase@@UAAIXZ
+ ?Stub107@nsXPTCStubBase@@UAAIXZ
+ ?Stub108@nsXPTCStubBase@@UAAIXZ
+ ?Stub109@nsXPTCStubBase@@UAAIXZ
+ ?Stub110@nsXPTCStubBase@@UAAIXZ
+ ?Stub111@nsXPTCStubBase@@UAAIXZ
+ ?Stub112@nsXPTCStubBase@@UAAIXZ
+ ?Stub113@nsXPTCStubBase@@UAAIXZ
+ ?Stub114@nsXPTCStubBase@@UAAIXZ
+ ?Stub115@nsXPTCStubBase@@UAAIXZ
+ ?Stub116@nsXPTCStubBase@@UAAIXZ
+ ?Stub117@nsXPTCStubBase@@UAAIXZ
+ ?Stub118@nsXPTCStubBase@@UAAIXZ
+ ?Stub119@nsXPTCStubBase@@UAAIXZ
+ ?Stub120@nsXPTCStubBase@@UAAIXZ
+ ?Stub121@nsXPTCStubBase@@UAAIXZ
+ ?Stub122@nsXPTCStubBase@@UAAIXZ
+ ?Stub123@nsXPTCStubBase@@UAAIXZ
+ ?Stub124@nsXPTCStubBase@@UAAIXZ
+ ?Stub125@nsXPTCStubBase@@UAAIXZ
+ ?Stub126@nsXPTCStubBase@@UAAIXZ
+ ?Stub127@nsXPTCStubBase@@UAAIXZ
+ ?Stub128@nsXPTCStubBase@@UAAIXZ
+ ?Stub129@nsXPTCStubBase@@UAAIXZ
+ ?Stub130@nsXPTCStubBase@@UAAIXZ
+ ?Stub131@nsXPTCStubBase@@UAAIXZ
+ ?Stub132@nsXPTCStubBase@@UAAIXZ
+ ?Stub133@nsXPTCStubBase@@UAAIXZ
+ ?Stub134@nsXPTCStubBase@@UAAIXZ
+ ?Stub135@nsXPTCStubBase@@UAAIXZ
+ ?Stub136@nsXPTCStubBase@@UAAIXZ
+ ?Stub137@nsXPTCStubBase@@UAAIXZ
+ ?Stub138@nsXPTCStubBase@@UAAIXZ
+ ?Stub139@nsXPTCStubBase@@UAAIXZ
+ ?Stub140@nsXPTCStubBase@@UAAIXZ
+ ?Stub141@nsXPTCStubBase@@UAAIXZ
+ ?Stub142@nsXPTCStubBase@@UAAIXZ
+ ?Stub143@nsXPTCStubBase@@UAAIXZ
+ ?Stub144@nsXPTCStubBase@@UAAIXZ
+ ?Stub145@nsXPTCStubBase@@UAAIXZ
+ ?Stub146@nsXPTCStubBase@@UAAIXZ
+ ?Stub147@nsXPTCStubBase@@UAAIXZ
+ ?Stub148@nsXPTCStubBase@@UAAIXZ
+ ?Stub149@nsXPTCStubBase@@UAAIXZ
+ ?Stub150@nsXPTCStubBase@@UAAIXZ
+ ?Stub151@nsXPTCStubBase@@UAAIXZ
+ ?Stub152@nsXPTCStubBase@@UAAIXZ
+ ?Stub153@nsXPTCStubBase@@UAAIXZ
+ ?Stub154@nsXPTCStubBase@@UAAIXZ
+ ?Stub155@nsXPTCStubBase@@UAAIXZ
+ ?Stub156@nsXPTCStubBase@@UAAIXZ
+ ?Stub157@nsXPTCStubBase@@UAAIXZ
+ ?Stub158@nsXPTCStubBase@@UAAIXZ
+ ?Stub159@nsXPTCStubBase@@UAAIXZ
+ ?Stub160@nsXPTCStubBase@@UAAIXZ
+ ?Stub161@nsXPTCStubBase@@UAAIXZ
+ ?Stub162@nsXPTCStubBase@@UAAIXZ
+ ?Stub163@nsXPTCStubBase@@UAAIXZ
+ ?Stub164@nsXPTCStubBase@@UAAIXZ
+ ?Stub165@nsXPTCStubBase@@UAAIXZ
+ ?Stub166@nsXPTCStubBase@@UAAIXZ
+ ?Stub167@nsXPTCStubBase@@UAAIXZ
+ ?Stub168@nsXPTCStubBase@@UAAIXZ
+ ?Stub169@nsXPTCStubBase@@UAAIXZ
+ ?Stub170@nsXPTCStubBase@@UAAIXZ
+ ?Stub171@nsXPTCStubBase@@UAAIXZ
+ ?Stub172@nsXPTCStubBase@@UAAIXZ
+ ?Stub173@nsXPTCStubBase@@UAAIXZ
+ ?Stub174@nsXPTCStubBase@@UAAIXZ
+ ?Stub175@nsXPTCStubBase@@UAAIXZ
+ ?Stub176@nsXPTCStubBase@@UAAIXZ
+ ?Stub177@nsXPTCStubBase@@UAAIXZ
+ ?Stub178@nsXPTCStubBase@@UAAIXZ
+ ?Stub179@nsXPTCStubBase@@UAAIXZ
+ ?Stub180@nsXPTCStubBase@@UAAIXZ
+ ?Stub181@nsXPTCStubBase@@UAAIXZ
+ ?Stub182@nsXPTCStubBase@@UAAIXZ
+ ?Stub183@nsXPTCStubBase@@UAAIXZ
+ ?Stub184@nsXPTCStubBase@@UAAIXZ
+ ?Stub185@nsXPTCStubBase@@UAAIXZ
+ ?Stub186@nsXPTCStubBase@@UAAIXZ
+ ?Stub187@nsXPTCStubBase@@UAAIXZ
+ ?Stub188@nsXPTCStubBase@@UAAIXZ
+ ?Stub189@nsXPTCStubBase@@UAAIXZ
+ ?Stub190@nsXPTCStubBase@@UAAIXZ
+ ?Stub191@nsXPTCStubBase@@UAAIXZ
+ ?Stub192@nsXPTCStubBase@@UAAIXZ
+ ?Stub193@nsXPTCStubBase@@UAAIXZ
+ ?Stub194@nsXPTCStubBase@@UAAIXZ
+ ?Stub195@nsXPTCStubBase@@UAAIXZ
+ ?Stub196@nsXPTCStubBase@@UAAIXZ
+ ?Stub197@nsXPTCStubBase@@UAAIXZ
+ ?Stub198@nsXPTCStubBase@@UAAIXZ
+ ?Stub199@nsXPTCStubBase@@UAAIXZ
+ ?Stub200@nsXPTCStubBase@@UAAIXZ
+ ?Stub201@nsXPTCStubBase@@UAAIXZ
+ ?Stub202@nsXPTCStubBase@@UAAIXZ
+ ?Stub203@nsXPTCStubBase@@UAAIXZ
+ ?Stub204@nsXPTCStubBase@@UAAIXZ
+ ?Stub205@nsXPTCStubBase@@UAAIXZ
+ ?Stub206@nsXPTCStubBase@@UAAIXZ
+ ?Stub207@nsXPTCStubBase@@UAAIXZ
+ ?Stub208@nsXPTCStubBase@@UAAIXZ
+ ?Stub209@nsXPTCStubBase@@UAAIXZ
+ ?Stub210@nsXPTCStubBase@@UAAIXZ
+ ?Stub211@nsXPTCStubBase@@UAAIXZ
+ ?Stub212@nsXPTCStubBase@@UAAIXZ
+ ?Stub213@nsXPTCStubBase@@UAAIXZ
+ ?Stub214@nsXPTCStubBase@@UAAIXZ
+ ?Stub215@nsXPTCStubBase@@UAAIXZ
+ ?Stub216@nsXPTCStubBase@@UAAIXZ
+ ?Stub217@nsXPTCStubBase@@UAAIXZ
+ ?Stub218@nsXPTCStubBase@@UAAIXZ
+ ?Stub219@nsXPTCStubBase@@UAAIXZ
+ ?Stub220@nsXPTCStubBase@@UAAIXZ
+ ?Stub221@nsXPTCStubBase@@UAAIXZ
+ ?Stub222@nsXPTCStubBase@@UAAIXZ
+ ?Stub223@nsXPTCStubBase@@UAAIXZ
+ ?Stub224@nsXPTCStubBase@@UAAIXZ
+ ?Stub225@nsXPTCStubBase@@UAAIXZ
+ ?Stub226@nsXPTCStubBase@@UAAIXZ
+ ?Stub227@nsXPTCStubBase@@UAAIXZ
+ ?Stub228@nsXPTCStubBase@@UAAIXZ
+ ?Stub229@nsXPTCStubBase@@UAAIXZ
+ ?Stub230@nsXPTCStubBase@@UAAIXZ
+ ?Stub231@nsXPTCStubBase@@UAAIXZ
+ ?Stub232@nsXPTCStubBase@@UAAIXZ
+ ?Stub233@nsXPTCStubBase@@UAAIXZ
+ ?Stub234@nsXPTCStubBase@@UAAIXZ
+ ?Stub235@nsXPTCStubBase@@UAAIXZ
+ ?Stub236@nsXPTCStubBase@@UAAIXZ
+ ?Stub237@nsXPTCStubBase@@UAAIXZ
+ ?Stub238@nsXPTCStubBase@@UAAIXZ
+ ?Stub239@nsXPTCStubBase@@UAAIXZ
+ ?Stub240@nsXPTCStubBase@@UAAIXZ
+ ?Stub241@nsXPTCStubBase@@UAAIXZ
+ ?Stub242@nsXPTCStubBase@@UAAIXZ
+ ?Stub243@nsXPTCStubBase@@UAAIXZ
+ ?Stub244@nsXPTCStubBase@@UAAIXZ
+ ?Stub245@nsXPTCStubBase@@UAAIXZ
+ ?Stub246@nsXPTCStubBase@@UAAIXZ
+ ?Stub247@nsXPTCStubBase@@UAAIXZ
+ ?Stub248@nsXPTCStubBase@@UAAIXZ
+ ?Stub249@nsXPTCStubBase@@UAAIXZ
+