diff --git a/b2g/app/nsBrowserApp.cpp b/b2g/app/nsBrowserApp.cpp index e1a4875b2a4..38354a66584 100644 --- a/b2g/app/nsBrowserApp.cpp +++ b/b2g/app/nsBrowserApp.cpp @@ -42,6 +42,7 @@ #endif #include "mozilla/Telemetry.h" +#include "mozilla/WindowsDllBlocklist.h" static void Output(const char *fmt, ... ) { @@ -92,9 +93,6 @@ public: XRE_GetFileFromPathType XRE_GetFileFromPath; XRE_CreateAppDataType XRE_CreateAppData; XRE_FreeAppDataType XRE_FreeAppData; -#ifdef XRE_HAS_DLL_BLOCKLIST -XRE_SetupDllBlocklistType XRE_SetupDllBlocklist; -#endif XRE_TelemetryAccumulateType XRE_TelemetryAccumulate; XRE_mainType XRE_main; @@ -102,9 +100,6 @@ static const nsDynamicFunctionLoad kXULFuncs[] = { { "XRE_GetFileFromPath", (NSFuncPtr*) &XRE_GetFileFromPath }, { "XRE_CreateAppData", (NSFuncPtr*) &XRE_CreateAppData }, { "XRE_FreeAppData", (NSFuncPtr*) &XRE_FreeAppData }, -#ifdef XRE_HAS_DLL_BLOCKLIST - { "XRE_SetupDllBlocklist", (NSFuncPtr*) &XRE_SetupDllBlocklist }, -#endif { "XRE_TelemetryAccumulate", (NSFuncPtr*) &XRE_TelemetryAccumulate }, { "XRE_main", (NSFuncPtr*) &XRE_main }, { nullptr, nullptr } @@ -210,6 +205,10 @@ int main(int argc, char* argv[]) gotCounters = GetProcessIoCounters(GetCurrentProcess(), &ioCounters); #endif +#ifdef HAS_DLL_BLOCKLIST + DllBlocklist_Initialize(); +#endif + // We do this because of data in bug 771745 XPCOMGlueEnablePreload(); @@ -227,10 +226,6 @@ int main(int argc, char* argv[]) return 255; } -#ifdef XRE_HAS_DLL_BLOCKLIST - XRE_SetupDllBlocklist(); -#endif - if (gotCounters) { #if defined(XP_WIN) XRE_TelemetryAccumulate(mozilla::Telemetry::EARLY_GLUESTARTUP_READ_OPS, diff --git a/browser/app/nsBrowserApp.cpp b/browser/app/nsBrowserApp.cpp index 9dee6248258..a452a9dc1c1 100644 --- a/browser/app/nsBrowserApp.cpp +++ b/browser/app/nsBrowserApp.cpp @@ -46,6 +46,7 @@ #include "nsXPCOMPrivate.h" // for MAXPATHLEN and XPCOM_DLL #include "mozilla/Telemetry.h" +#include "mozilla/WindowsDllBlocklist.h" using namespace mozilla; @@ -78,9 +79,19 @@ static void Output(const char *fmt, ... ) #if MOZ_WINCONSOLE fwprintf_s(stderr, wide_msg); #else - MessageBoxW(nullptr, wide_msg, L"Firefox", MB_OK - | MB_ICONERROR - | MB_SETFOREGROUND); + // Linking user32 at load-time interferes with the DLL blocklist (bug 932100). + // This is a rare codepath, so we can load user32 at run-time instead. + HMODULE user32 = LoadLibraryW(L"user32.dll"); + if (user32) { + typedef int (WINAPI * MessageBoxWFn)(HWND, LPCWSTR, LPCWSTR, UINT); + MessageBoxWFn messageBoxW = (MessageBoxWFn)GetProcAddress(user32, "MessageBoxW"); + if (messageBoxW) { + messageBoxW(nullptr, wide_msg, L"Firefox", MB_OK + | MB_ICONERROR + | MB_SETFOREGROUND); + } + FreeLibrary(user32); + } #endif #endif @@ -144,9 +155,6 @@ static void AttachToTestHarness() XRE_GetFileFromPathType XRE_GetFileFromPath; XRE_CreateAppDataType XRE_CreateAppData; XRE_FreeAppDataType XRE_FreeAppData; -#ifdef XRE_HAS_DLL_BLOCKLIST -XRE_SetupDllBlocklistType XRE_SetupDllBlocklist; -#endif XRE_TelemetryAccumulateType XRE_TelemetryAccumulate; XRE_StartupTimelineRecordType XRE_StartupTimelineRecord; XRE_mainType XRE_main; @@ -156,9 +164,6 @@ static const nsDynamicFunctionLoad kXULFuncs[] = { { "XRE_GetFileFromPath", (NSFuncPtr*) &XRE_GetFileFromPath }, { "XRE_CreateAppData", (NSFuncPtr*) &XRE_CreateAppData }, { "XRE_FreeAppData", (NSFuncPtr*) &XRE_FreeAppData }, -#ifdef XRE_HAS_DLL_BLOCKLIST - { "XRE_SetupDllBlocklist", (NSFuncPtr*) &XRE_SetupDllBlocklist }, -#endif { "XRE_TelemetryAccumulate", (NSFuncPtr*) &XRE_TelemetryAccumulate }, { "XRE_StartupTimelineRecord", (NSFuncPtr*) &XRE_StartupTimelineRecord }, { "XRE_main", (NSFuncPtr*) &XRE_main }, @@ -597,6 +602,17 @@ int main(int argc, char* argv[]) nsIFile *xreDirectory; +#ifdef HAS_DLL_BLOCKLIST + DllBlocklist_Initialize(); + + // In order to be effective against AppInit DLLs, the blocklist must be + // initialized before user32.dll is loaded into the process. If this assert + // ever fires, then the fix for bug 932100 has been defeated and the + // blocklist will miss AppInit DLLs. You should use a delayload or reorder + // the code to prevent user32.dll from loading during early startup. + MOZ_ASSERT(!GetModuleHandleA("user32.dll")); +#endif + nsresult rv = InitXPCOMGlue(argv[0], &xreDirectory); if (NS_FAILED(rv)) { return 255; @@ -604,10 +620,6 @@ int main(int argc, char* argv[]) XRE_StartupTimelineRecord(mozilla::StartupTimeline::START, start); -#ifdef XRE_HAS_DLL_BLOCKLIST - XRE_SetupDllBlocklist(); -#endif - if (gotCounters) { #if defined(XP_WIN) XRE_TelemetryAccumulate(mozilla::Telemetry::EARLY_GLUESTARTUP_READ_OPS, diff --git a/config/rules.mk b/config/rules.mk index 93cd9426e73..42d10170b03 100644 --- a/config/rules.mk +++ b/config/rules.mk @@ -800,7 +800,7 @@ else # !WINNT || GNU_CC endif # WINNT && !GNU_CC ifdef ENABLE_STRIP - $(STRIP) $@ + $(STRIP) $(STRIP_FLAGS) $@ endif ifdef MOZ_POST_PROGRAM_COMMAND $(MOZ_POST_PROGRAM_COMMAND) $@ @@ -856,7 +856,7 @@ else endif # WINNT && !GNU_CC ifdef ENABLE_STRIP - $(STRIP) $@ + $(STRIP) $(STRIP_FLAGS) $@ endif ifdef MOZ_POST_PROGRAM_COMMAND $(MOZ_POST_PROGRAM_COMMAND) $@ @@ -883,7 +883,6 @@ $(filter %.$(LIB_SUFFIX),$(LIBRARY)): $(OBJS) $(EXTRA_DEPS) $(GLOBAL_DEPS) $(REPORT_BUILD) $(RM) $(LIBRARY) $(EXPAND_AR) $(AR_FLAGS) $(OBJS) $(SHARED_LIBRARY_LIBS) - $(RANLIB) $@ $(filter-out %.$(LIB_SUFFIX),$(LIBRARY)): $(filter %.$(LIB_SUFFIX),$(LIBRARY)) $(OBJS) $(EXTRA_DEPS) $(GLOBAL_DEPS) # When we only build a library descriptor, blow out any existing library @@ -917,14 +916,12 @@ $(IMPORT_LIBRARY): $(SHARED_LIBRARY) $(REPORT_BUILD) $(RM) $@ $(IMPLIB) $@ $^ - $(RANLIB) $@ endif # OS/2 $(HOST_LIBRARY): $(HOST_OBJS) Makefile $(REPORT_BUILD) $(RM) $@ $(EXPAND_LIBS_EXEC) --extract -- $(HOST_AR) $(HOST_AR_FLAGS) $(HOST_OBJS) - $(HOST_RANLIB) $@ ifdef HAVE_DTRACE ifndef XP_MACOSX @@ -975,7 +972,7 @@ endif # WINNT && !GCC @$(RM) foodummyfilefoo $(DELETE_AFTER_LINK) chmod +x $@ ifdef ENABLE_STRIP - $(STRIP) $@ + $(STRIP) $(STRIP_FLAGS) $@ endif ifdef MOZ_POST_DSO_LIB_COMMAND $(MOZ_POST_DSO_LIB_COMMAND) $@ diff --git a/configure.in b/configure.in index 12cd4eb112f..048f99023ac 100644 --- a/configure.in +++ b/configure.in @@ -306,7 +306,7 @@ dnl to use the cross-compile setup for now dnl ======================================================== dnl AR_FLAGS set here so HOST_AR_FLAGS can be set correctly (see bug 538269) -AR_FLAGS='cr $@' +AR_FLAGS='crs $@' if test "$COMPILE_ENVIRONMENT"; then @@ -8872,7 +8872,27 @@ dnl so that regeneration via dependencies works correctly WEBRTC_CONFIG="${WEBRTC_CONFIG} -D have_ethtool_cmd_speed_hi=0" fi - GYP_WEBRTC_OPTIONS="--format=mozmake ${WEBRTC_CONFIG} -D target_arch=${WEBRTC_TARGET_ARCH} ${EXTRA_GYP_DEFINES} --depth=${srcdir}/media/webrtc/trunk --toplevel-dir=${srcdir} -G OBJDIR=${_objdir}" + if test -n "$CROSS_COMPILE"; then + case "$target" in + *-mingw*) + GYP_MOZMAKE_OPTIONS="-G os=win" + ;; + *-darwin*) + GYP_MOZMAKE_OPTIONS="-G os=mac" + if test "$MACOS_SDK_DIR"; then + GYP_MOZMAKE_OPTIONS="${GYP_MOZMAKE_OPTIONS} -D mac_sdk_path=$MACOS_SDK_DIR" + fi + ;; + *-android*) + GYP_MOZMAKE_OPTIONS="-G os=linux" + ;; + *) + AC_MSG_ERROR([Don't know what options to give to WebRTC for cross-compilation]) + ;; + esac + fi + + GYP_WEBRTC_OPTIONS="--format=mozmake ${GYP_MOZMAKE_OPTIONS} ${WEBRTC_CONFIG} -D target_arch=${WEBRTC_TARGET_ARCH} ${EXTRA_GYP_DEFINES} --depth=${srcdir}/media/webrtc/trunk --toplevel-dir=${srcdir} -G OBJDIR=${_objdir}" $PYTHON ${srcdir}/media/webrtc/trunk/build/gyp_chromium \ $GYP_WEBRTC_OPTIONS \ diff --git a/content/base/test/csp/test_policyuri_regression_from_multipolicy.html b/content/base/test/csp/test_policyuri_regression_from_multipolicy.html index 2b2b59e9027..0cb040cbec0 100644 --- a/content/base/test/csp/test_policyuri_regression_from_multipolicy.html +++ b/content/base/test/csp/test_policyuri_regression_from_multipolicy.html @@ -15,12 +15,14 @@ SpecialPowers.pushPrefEnv( {'set':[["security.csp.speccompliant", true]]}, function() { + SimpleTest.waitForExplicitFinish(); var testframe = document.getElementById('testframe'); testframe.src = 'file_policyuri_regression_from_multipolicy.html'; testframe.addEventListener('load', function checkInlineScriptExecuted () { is(this.contentDocument.getElementById('testdiv').innerHTML, 'Inline Script Executed', 'Inline script should execute (it would be blocked by the policy, but the policy is report-only)'); + SimpleTest.finish(); }); } ); diff --git a/content/canvas/src/WebGLContextGL.cpp b/content/canvas/src/WebGLContextGL.cpp index af2ee6087f9..df9de19d6d7 100644 --- a/content/canvas/src/WebGLContextGL.cpp +++ b/content/canvas/src/WebGLContextGL.cpp @@ -2716,6 +2716,7 @@ WebGLContext::Uniform1i(WebGLUniformLocation *location_object, GLint a1) if (!ValidateUniformSetter("Uniform1i", location_object, location)) return; + // Only uniform1i can take sampler settings. if (!ValidateSamplerUniformSetter("Uniform1i", location_object, a1)) return; @@ -2731,12 +2732,6 @@ WebGLContext::Uniform2i(WebGLUniformLocation *location_object, GLint a1, if (!ValidateUniformSetter("Uniform2i", location_object, location)) return; - if (!ValidateSamplerUniformSetter("Uniform2i", location_object, a1) || - !ValidateSamplerUniformSetter("Uniform2i", location_object, a2)) - { - return; - } - MakeContextCurrent(); gl->fUniform2i(location, a1, a2); } @@ -2749,13 +2744,6 @@ WebGLContext::Uniform3i(WebGLUniformLocation *location_object, GLint a1, if (!ValidateUniformSetter("Uniform3i", location_object, location)) return; - if (!ValidateSamplerUniformSetter("Uniform3i", location_object, a1) || - !ValidateSamplerUniformSetter("Uniform3i", location_object, a2) || - !ValidateSamplerUniformSetter("Uniform3i", location_object, a3)) - { - return; - } - MakeContextCurrent(); gl->fUniform3i(location, a1, a2, a3); } @@ -2768,14 +2756,6 @@ WebGLContext::Uniform4i(WebGLUniformLocation *location_object, GLint a1, if (!ValidateUniformSetter("Uniform4i", location_object, location)) return; - if (!ValidateSamplerUniformSetter("Uniform4i", location_object, a1) || - !ValidateSamplerUniformSetter("Uniform4i", location_object, a2) || - !ValidateSamplerUniformSetter("Uniform4i", location_object, a3) || - !ValidateSamplerUniformSetter("Uniform4i", location_object, a4)) - { - return; - } - MakeContextCurrent(); gl->fUniform4i(location, a1, a2, a3, a4); } diff --git a/content/html/content/test/file_iframe_sandbox_d_if5.html b/content/html/content/test/file_iframe_sandbox_d_if5.html index bf08d5b7bf9..ba31053ad0e 100644 --- a/content/html/content/test/file_iframe_sandbox_d_if5.html +++ b/content/html/content/test/file_iframe_sandbox_d_if5.html @@ -8,8 +8,8 @@ diff --git a/content/html/content/test/test_iframe_sandbox_navigation.html b/content/html/content/test/test_iframe_sandbox_navigation.html index 64f1cc812b6..dca2f0277bb 100644 --- a/content/html/content/test/test_iframe_sandbox_navigation.html +++ b/content/html/content/test/test_iframe_sandbox_navigation.html @@ -267,8 +267,8 @@ function doIf10TestPart2() { + - diff --git a/dom/base/nsWrapperCache.cpp b/dom/base/nsWrapperCache.cpp index 49efa8c54ca..4531145e133 100644 --- a/dom/base/nsWrapperCache.cpp +++ b/dom/base/nsWrapperCache.cpp @@ -55,7 +55,8 @@ public: { } NS_IMETHOD_(void) DescribeGCedNode(bool aIsMarked, - const char* aObjName) + const char* aObjName, + uint64_t aCompartmentAddress) { } diff --git a/dom/media/PeerConnection.js b/dom/media/PeerConnection.js index ee0aced29d7..95107fe5aa1 100644 --- a/dom/media/PeerConnection.js +++ b/dom/media/PeerConnection.js @@ -490,13 +490,17 @@ RTCPeerConnection.prototype = { constraints = {}; } this._mustValidateConstraints(constraints, "createOffer passed invalid constraints"); - this._onCreateOfferSuccess = onSuccess; - this._onCreateOfferFailure = onError; - this._queueOrRun({ func: this._createOffer, args: [constraints], wait: true }); + this._queueOrRun({ + func: this._createOffer, + args: [onSuccess, onError, constraints], + wait: true + }); }, - _createOffer: function(constraints) { + _createOffer: function(onSuccess, onError, constraints) { + this._onCreateOfferSuccess = onSuccess; + this._onCreateOfferFailure = onError; this._getPC().createOffer(constraints); }, @@ -542,12 +546,6 @@ RTCPeerConnection.prototype = { }, setLocalDescription: function(desc, onSuccess, onError) { - // TODO -- if we have two setLocalDescriptions in the - // queue,this code overwrites the callbacks for the first - // one with the callbacks for the second one. See Bug 831759. - this._onSetLocalDescriptionSuccess = onSuccess; - this._onSetLocalDescriptionFailure = onError; - let type; switch (desc.type) { case "offer": @@ -565,23 +563,19 @@ RTCPeerConnection.prototype = { this._queueOrRun({ func: this._setLocalDescription, - args: [type, desc.sdp], + args: [type, desc.sdp, onSuccess, onError], wait: true, type: desc.type }); }, - _setLocalDescription: function(type, sdp) { + _setLocalDescription: function(type, sdp, onSuccess, onError) { + this._onSetLocalDescriptionSuccess = onSuccess; + this._onSetLocalDescriptionFailure = onError; this._getPC().setLocalDescription(type, sdp); }, setRemoteDescription: function(desc, onSuccess, onError) { - // TODO -- if we have two setRemoteDescriptions in the - // queue, this code overwrites the callbacks for the first - // one with the callbacks for the second one. See Bug 831759. - this._onSetRemoteDescriptionSuccess = onSuccess; - this._onSetRemoteDescriptionFailure = onError; - let type; switch (desc.type) { case "offer": @@ -599,13 +593,15 @@ RTCPeerConnection.prototype = { this._queueOrRun({ func: this._setRemoteDescription, - args: [type, desc.sdp], + args: [type, desc.sdp, onSuccess, onError], wait: true, type: desc.type }); }, - _setRemoteDescription: function(type, sdp) { + _setRemoteDescription: function(type, sdp, onSuccess, onError) { + this._onSetRemoteDescriptionSuccess = onSuccess; + this._onSetRemoteDescriptionFailure = onError; this._getPC().setRemoteDescription(type, sdp); }, diff --git a/editor/composer/src/moz.build b/editor/composer/src/moz.build index 96426d6b702..4dd75d8caf3 100644 --- a/editor/composer/src/moz.build +++ b/editor/composer/src/moz.build @@ -6,7 +6,7 @@ MODULE = 'editor' -SOURCES += [ +UNIFIED_SOURCES += [ 'nsComposerCommands.cpp', 'nsComposerCommandsUpdater.cpp', 'nsComposerController.cpp', diff --git a/editor/libeditor/base/CreateElementTxn.cpp b/editor/libeditor/base/CreateElementTxn.cpp index 1e37bb0ebcb..c4440708ba3 100644 --- a/editor/libeditor/base/CreateElementTxn.cpp +++ b/editor/libeditor/base/CreateElementTxn.cpp @@ -23,10 +23,6 @@ #include "nsAString.h" #include -#ifdef DEBUG -static bool gNoisy = false; -#endif - using namespace mozilla; CreateElementTxn::CreateElementTxn() @@ -61,16 +57,6 @@ NS_IMETHODIMP CreateElementTxn::Init(nsEditor *aEditor, NS_IMETHODIMP CreateElementTxn::DoTransaction(void) { -#ifdef DEBUG - if (gNoisy) - { - char* nodename = ToNewCString(mTag); - printf("Do Create Element parent = %p <%s>, offset = %d\n", - static_cast(mParent.get()), nodename, mOffsetInParent); - nsMemory::Free(nodename); - } -#endif - NS_ASSERTION(mEditor && mParent, "bad state"); NS_ENSURE_TRUE(mEditor && mParent, NS_ERROR_NOT_INITIALIZED); @@ -85,13 +71,6 @@ NS_IMETHODIMP CreateElementTxn::DoTransaction(void) // Try to insert formatting whitespace for the new node: mEditor->MarkNodeDirty(mNewNode); -#ifdef DEBUG - if (gNoisy) - { - printf(" newNode = %p\n", static_cast(mNewNode.get())); - } -#endif - // insert the new node if (CreateElementTxn::eAppend == int32_t(mOffsetInParent)) { ErrorResult rv; @@ -133,15 +112,6 @@ NS_IMETHODIMP CreateElementTxn::DoTransaction(void) NS_IMETHODIMP CreateElementTxn::UndoTransaction(void) { -#ifdef DEBUG - if (gNoisy) - { - printf("Undo Create Element, mParent = %p, node = %p\n", - static_cast(mParent.get()), - static_cast(mNewNode.get())); - } -#endif - NS_ASSERTION(mEditor && mParent, "bad state"); NS_ENSURE_TRUE(mEditor && mParent, NS_ERROR_NOT_INITIALIZED); @@ -152,10 +122,6 @@ NS_IMETHODIMP CreateElementTxn::UndoTransaction(void) NS_IMETHODIMP CreateElementTxn::RedoTransaction(void) { -#ifdef DEBUG - if (gNoisy) { printf("Redo Create Element\n"); } -#endif - NS_ASSERTION(mEditor && mParent, "bad state"); NS_ENSURE_TRUE(mEditor && mParent, NS_ERROR_NOT_INITIALIZED); diff --git a/editor/libeditor/base/InsertElementTxn.cpp b/editor/libeditor/base/InsertElementTxn.cpp index 5d5df7ed108..1043cd1d8ac 100644 --- a/editor/libeditor/base/InsertElementTxn.cpp +++ b/editor/libeditor/base/InsertElementTxn.cpp @@ -19,11 +19,6 @@ using namespace mozilla; -#ifdef DEBUG -static bool gNoisy = false; -#endif - - InsertElementTxn::InsertElementTxn() : EditTxn() { @@ -57,23 +52,6 @@ NS_IMETHODIMP InsertElementTxn::Init(nsINode *aNode, NS_IMETHODIMP InsertElementTxn::DoTransaction(void) { -#ifdef DEBUG - if (gNoisy) - { - nsCOMPtrnodeAsContent = do_QueryInterface(mNode); - nsCOMPtrparentAsContent = do_QueryInterface(mParent); - nsString namestr = mNode->NodeName(); - char* nodename = ToNewCString(namestr); - printf("%p Do Insert Element of %p <%s> into parent %p at offset %d\n", - static_cast(this), - static_cast(nodeAsContent.get()), - nodename, - static_cast(parentAsContent.get()), - mOffset); - nsMemory::Free(nodename); - } -#endif - NS_ENSURE_TRUE(mNode && mParent, NS_ERROR_NOT_INITIALIZED); nsCOMPtr parent = do_QueryInterface(mParent); @@ -115,17 +93,6 @@ NS_IMETHODIMP InsertElementTxn::DoTransaction(void) NS_IMETHODIMP InsertElementTxn::UndoTransaction(void) { -#ifdef DEBUG - if (gNoisy) - { - printf("%p Undo Insert Element of %p into parent %p at offset %d\n", - static_cast(this), - static_cast(mNode.get()), - static_cast(mParent.get()), - mOffset); - } -#endif - NS_ENSURE_TRUE(mNode && mParent, NS_ERROR_NOT_INITIALIZED); ErrorResult rv; diff --git a/editor/libeditor/base/InsertTextTxn.cpp b/editor/libeditor/base/InsertTextTxn.cpp index 2722be8279b..af61724c5ae 100644 --- a/editor/libeditor/base/InsertTextTxn.cpp +++ b/editor/libeditor/base/InsertTextTxn.cpp @@ -15,10 +15,6 @@ #include "nsISupportsUtils.h" // for NS_ADDREF_THIS, NS_RELEASE #include "nsITransaction.h" // for nsITransaction -#ifdef DEBUG -static bool gNoisy = false; -#endif - InsertTextTxn::InsertTextTxn() : EditTxn() { @@ -62,14 +58,6 @@ NS_IMETHODIMP InsertTextTxn::Init(nsIDOMCharacterData *aElement, NS_IMETHODIMP InsertTextTxn::DoTransaction(void) { -#ifdef DEBUG - if (gNoisy) - { - printf("Do Insert Text element = %p\n", - static_cast(mElement.get())); - } -#endif - NS_ASSERTION(mElement && mEditor, "bad state"); if (!mElement || !mEditor) { return NS_ERROR_NOT_INITIALIZED; } @@ -98,14 +86,6 @@ NS_IMETHODIMP InsertTextTxn::DoTransaction(void) NS_IMETHODIMP InsertTextTxn::UndoTransaction(void) { -#ifdef DEBUG - if (gNoisy) - { - printf("Undo Insert Text element = %p\n", - static_cast(mElement.get())); - } -#endif - NS_ASSERTION(mElement && mEditor, "bad state"); if (!mElement || !mEditor) { return NS_ERROR_NOT_INITIALIZED; } @@ -133,13 +113,6 @@ NS_IMETHODIMP InsertTextTxn::Merge(nsITransaction *aTransaction, bool *aDidMerge otherInsTxn->GetData(otherData); mStringToInsert += otherData; *aDidMerge = true; -#ifdef DEBUG - if (gNoisy) - { - printf("InsertTextTxn assimilated %p\n", - static_cast(aTransaction)); - } -#endif } NS_RELEASE(otherInsTxn); } diff --git a/editor/libeditor/base/JoinElementTxn.cpp b/editor/libeditor/base/JoinElementTxn.cpp index ee92b9e2984..e37f32c8cee 100644 --- a/editor/libeditor/base/JoinElementTxn.cpp +++ b/editor/libeditor/base/JoinElementTxn.cpp @@ -17,10 +17,6 @@ using namespace mozilla; -#ifdef DEBUG -static bool gNoisy = false; -#endif - JoinElementTxn::JoinElementTxn() : EditTxn() { @@ -54,16 +50,6 @@ NS_IMETHODIMP JoinElementTxn::Init(nsEditor *aEditor, // After DoTransaction() and RedoTransaction(), the left node is removed from the content tree and right node remains. NS_IMETHODIMP JoinElementTxn::DoTransaction(void) { -#ifdef DEBUG - if (gNoisy) - { - printf("%p Do Join of %p and %p\n", - static_cast(this), - static_cast(mLeftNode.get()), - static_cast(mRightNode.get())); - } -#endif - NS_PRECONDITION((mEditor && mLeftNode && mRightNode), "null arg"); if (!mEditor || !mLeftNode || !mRightNode) { return NS_ERROR_NOT_INITIALIZED; } @@ -85,30 +71,13 @@ NS_IMETHODIMP JoinElementTxn::DoTransaction(void) mParent = leftParent; mOffset = mLeftNode->Length(); - nsresult rv = mEditor->JoinNodesImpl(mRightNode, mLeftNode, mParent); - -#ifdef DEBUG - if (NS_SUCCEEDED(rv) && gNoisy) { - printf(" left node = %p removed\n", static_cast(mLeftNode.get())); - } -#endif - - return rv; + return mEditor->JoinNodesImpl(mRightNode, mLeftNode, mParent); } //XXX: what if instead of split, we just deleted the unneeded children of mRight // and re-inserted mLeft? NS_IMETHODIMP JoinElementTxn::UndoTransaction(void) { -#ifdef DEBUG - if (gNoisy) - { - printf("%p Undo Join, right node = %p\n", - static_cast(this), - static_cast(mRightNode.get())); - } -#endif - NS_ASSERTION(mRightNode && mLeftNode && mParent, "bad state"); if (!mRightNode || !mLeftNode || !mParent) { return NS_ERROR_NOT_INITIALIZED; } // first, massage the existing node so it is in its post-split state diff --git a/editor/libeditor/base/SplitElementTxn.cpp b/editor/libeditor/base/SplitElementTxn.cpp index fea95f5601e..4023abde885 100644 --- a/editor/libeditor/base/SplitElementTxn.cpp +++ b/editor/libeditor/base/SplitElementTxn.cpp @@ -18,11 +18,6 @@ using namespace mozilla; -#ifdef DEBUG -static bool gNoisy = false; -#endif - - // note that aEditor is not refcounted SplitElementTxn::SplitElementTxn() : EditTxn() @@ -53,16 +48,6 @@ NS_IMETHODIMP SplitElementTxn::Init(nsEditor *aEditor, NS_IMETHODIMP SplitElementTxn::DoTransaction(void) { -#ifdef DEBUG - if (gNoisy) - { - printf("%p Do Split of node %p offset %d\n", - static_cast(this), - static_cast(mExistingRightNode.get()), - mOffset); - } -#endif - NS_ASSERTION(mExistingRightNode && mEditor, "bad state"); if (!mExistingRightNode || !mEditor) { return NS_ERROR_NOT_INITIALIZED; } @@ -74,14 +59,6 @@ NS_IMETHODIMP SplitElementTxn::DoTransaction(void) NS_ENSURE_TRUE(mNewLeftNode, NS_ERROR_NULL_POINTER); mEditor->MarkNodeDirty(mExistingRightNode); -#ifdef DEBUG - if (gNoisy) - { - printf(" created left node = %p\n", - static_cast(mNewLeftNode.get())); - } -#endif - // get the parent node mParent = mExistingRightNode->GetParentNode(); NS_ENSURE_TRUE(mParent, NS_ERROR_NULL_POINTER); @@ -113,43 +90,13 @@ NS_IMETHODIMP SplitElementTxn::DoTransaction(void) NS_IMETHODIMP SplitElementTxn::UndoTransaction(void) { -#ifdef DEBUG - if (gNoisy) { - printf("%p Undo Split of existing node %p and new node %p offset %d\n", - static_cast(this), - static_cast(mExistingRightNode.get()), - static_cast(mNewLeftNode.get()), - mOffset); - } -#endif - NS_ASSERTION(mEditor && mExistingRightNode && mNewLeftNode && mParent, "bad state"); if (!mEditor || !mExistingRightNode || !mNewLeftNode || !mParent) { return NS_ERROR_NOT_INITIALIZED; } // this assumes Do inserted the new node in front of the prior existing node - nsresult rv = mEditor->JoinNodesImpl(mExistingRightNode, mNewLeftNode, - mParent); -#ifdef DEBUG - if (gNoisy) - { - printf("** after join left child node %p into right node %p\n", - static_cast(mNewLeftNode.get()), - static_cast(mExistingRightNode.get())); - if (gNoisy) {mEditor->DebugDumpContent(); } // DEBUG - } - if (NS_SUCCEEDED(rv)) - { - if (gNoisy) - { - printf(" left node = %p removed\n", - static_cast(mNewLeftNode.get())); - } - } -#endif - - return rv; + return mEditor->JoinNodesImpl(mExistingRightNode, mNewLeftNode, mParent); } /* redo cannot simply resplit the right node, because subsequent transactions @@ -162,32 +109,12 @@ NS_IMETHODIMP SplitElementTxn::RedoTransaction(void) return NS_ERROR_NOT_INITIALIZED; } -#ifdef DEBUG - if (gNoisy) { - printf("%p Redo Split of existing node %p and new node %p offset %d\n", - static_cast(this), - static_cast(mExistingRightNode.get()), - static_cast(mNewLeftNode.get()), - mOffset); - if (gNoisy) {mEditor->DebugDumpContent(); } // DEBUG - } -#endif - // first, massage the existing node so it is in its post-split state nsCOMPtrrightNodeAsText = do_QueryInterface(mExistingRightNode); if (rightNodeAsText) { nsresult result = rightNodeAsText->DeleteData(0, mOffset); NS_ENSURE_SUCCESS(result, result); -#ifdef DEBUG - if (gNoisy) - { - printf("** after delete of text in right text node %p offset %d\n", - static_cast(rightNodeAsText.get()), - mOffset); - mEditor->DebugDumpContent(); // DEBUG - } -#endif } else { @@ -201,16 +128,6 @@ NS_IMETHODIMP SplitElementTxn::RedoTransaction(void) { mNewLeftNode->AppendChild(*child, rv); NS_ENSURE_SUCCESS(rv.ErrorCode(), rv.ErrorCode()); -#ifdef DEBUG - if (gNoisy) - { - printf("** move child node %p from right node %p to left node %p\n", - static_cast(child), - static_cast(mExistingRightNode.get()), - static_cast(mNewLeftNode.get())); - if (gNoisy) {mEditor->DebugDumpContent(); } // DEBUG - } -#endif } child = child->GetNextSibling(); } @@ -218,15 +135,6 @@ NS_IMETHODIMP SplitElementTxn::RedoTransaction(void) // second, re-insert the left node into the tree ErrorResult rv; mParent->InsertBefore(*mNewLeftNode, mExistingRightNode, rv); -#ifdef DEBUG - if (gNoisy) - { - printf("** reinsert left child node %p before right node %p\n", - static_cast(mNewLeftNode.get()), - static_cast(mExistingRightNode.get())); - if (gNoisy) {mEditor->DebugDumpContent(); } // DEBUG - } -#endif return rv.ErrorCode(); } diff --git a/editor/libeditor/base/moz.build b/editor/libeditor/base/moz.build index 9426c63a424..eef991303ea 100644 --- a/editor/libeditor/base/moz.build +++ b/editor/libeditor/base/moz.build @@ -8,7 +8,7 @@ TEST_DIRS += ['tests'] MODULE = 'editor' -SOURCES += [ +UNIFIED_SOURCES += [ 'ChangeAttributeTxn.cpp', 'ChangeCSSInlineStyleTxn.cpp', 'CreateElementTxn.cpp', diff --git a/editor/libeditor/base/nsEditor.cpp b/editor/libeditor/base/nsEditor.cpp index 80879e36d94..f91d1de17e4 100644 --- a/editor/libeditor/base/nsEditor.cpp +++ b/editor/libeditor/base/nsEditor.cpp @@ -112,10 +112,6 @@ class nsIOutputStream; class nsIParserService; class nsITransferable; -#ifdef NS_DEBUG_EDITOR -static bool gNoisy = false; -#endif - #ifdef DEBUG #include "nsIDOMHTMLDocument.h" // for nsIDOMHTMLDocument #endif @@ -779,10 +775,6 @@ nsEditor::SetTransactionManager(nsITransactionManager *aTxnManager) NS_IMETHODIMP nsEditor::Undo(uint32_t aCount) { -#ifdef NS_DEBUG_EDITOR - if (gNoisy) { printf("Editor::Undo ----------\n"); } -#endif - ForceCompositionEnd(); bool hasTxnMgr, hasTransaction = false; @@ -824,10 +816,6 @@ NS_IMETHODIMP nsEditor::CanUndo(bool *aIsEnabled, bool *aCanUndo) NS_IMETHODIMP nsEditor::Redo(uint32_t aCount) { -#ifdef NS_DEBUG_EDITOR - if (gNoisy) { printf("Editor::Redo ----------\n"); } -#endif - bool hasTxnMgr, hasTransaction = false; CanRedo(&hasTxnMgr, &hasTransaction); NS_ENSURE_TRUE(hasTransaction, NS_OK); @@ -2714,10 +2702,6 @@ nsEditor::SplitNodeImpl(nsIDOMNode * aExistingRightNode, nsIDOMNode* aNewLeftNode, nsIDOMNode* aParent) { -#ifdef NS_DEBUG_EDITOR - if (gNoisy) { printf("SplitNodeImpl: left=%p, right=%p, offset=%d\n", (void*)aNewLeftNode, (void*)aExistingRightNode, aOffset); } -#endif - NS_ASSERTION(((nullptr!=aExistingRightNode) && (nullptr!=aNewLeftNode) && (nullptr!=aParent)), diff --git a/editor/libeditor/html/moz.build b/editor/libeditor/html/moz.build index b3bf8225b6c..0c38dfd44e3 100644 --- a/editor/libeditor/html/moz.build +++ b/editor/libeditor/html/moz.build @@ -8,7 +8,7 @@ TEST_DIRS += ['tests'] MODULE = 'editor' -SOURCES += [ +UNIFIED_SOURCES += [ 'nsEditProperty.cpp', 'nsHTMLAbsPosition.cpp', 'nsHTMLAnonymousUtils.cpp', diff --git a/editor/libeditor/text/moz.build b/editor/libeditor/text/moz.build index ad70d96677a..c4431e88a8f 100644 --- a/editor/libeditor/text/moz.build +++ b/editor/libeditor/text/moz.build @@ -8,7 +8,7 @@ TEST_DIRS += ['tests'] MODULE = 'editor' -SOURCES += [ +UNIFIED_SOURCES += [ 'nsInternetCiter.cpp', 'nsPlaintextDataTransfer.cpp', 'nsPlaintextEditor.cpp', diff --git a/editor/txmgr/src/moz.build b/editor/txmgr/src/moz.build index 5d8070760cc..07ab4bcda5e 100644 --- a/editor/txmgr/src/moz.build +++ b/editor/txmgr/src/moz.build @@ -6,7 +6,7 @@ MODULE = 'txmgr' -SOURCES += [ +UNIFIED_SOURCES += [ 'nsTransactionItem.cpp', 'nsTransactionList.cpp', 'nsTransactionManager.cpp', diff --git a/editor/txtsvc/src/moz.build b/editor/txtsvc/src/moz.build index 970dc52c6a8..2ff7258e951 100644 --- a/editor/txtsvc/src/moz.build +++ b/editor/txtsvc/src/moz.build @@ -6,7 +6,7 @@ MODULE = 'txtsvc' -SOURCES += [ +UNIFIED_SOURCES += [ 'nsFilteredContentIterator.cpp', 'nsTextServicesDocument.cpp', ] diff --git a/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/upstream-hunspell.diff b/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/upstream-hunspell.diff index 1b2107eaec0..3aafa2750bd 100644 --- a/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/upstream-hunspell.diff +++ b/extensions/spellcheck/locales/en-US/hunspell/dictionary-sources/upstream-hunspell.diff @@ -2137,14 +2137,18 @@ --- > D'Arcy > D/MN -2424a3788 +2418a3782 +> DRM +2422a3787 +> DVR/S +2424a3790 > Dacey/M -2425a3790,3791 +2425a3792,3793 > Dacia > Dacie/M -2426a3793 +2426a3795 > Dacy/M -2429a3797,3803 +2429a3799,3805 > Dael/M > Daffi/M > Daffie/M @@ -2152,221 +2156,221 @@ > Dag/M > Dagmar/M > Dagny/M -2431a3806 +2431a3808 > Dahlia/M -2432a3808 +2432a3810 > Daile/M -2433a3810,3812 +2433a3812,3814 > Daisey/M > Daisi/M > Daisie/M -2437a3817 +2437a3819 > Dal/M -2438a3819 +2438a3821 > Dalenna/M -2440c3821,3822 +2440c3823,3824 < Dali --- > Dali/S > Dalia/M -2441a3824,3825 +2441a3826,3827 > Dalila/M > Dall/M -2442a3827,3828 +2442a3829,3830 > Dalli/MS > Dallon/M -2444a3831,3833 +2444a3833,3835 > Daloris/M > Dalston/M > Dalt/M -2445a3835,3836 +2445a3837,3838 > Damara/M > Damaris/M -2448a3840 +2448a3842 > Damiano/M -2450a3843 +2450a3845 > Damita/M -2457a3851,3853 +2457a3853,3855 > Danell/M > Danella/M > Danette/M -2458a3855,3856 +2458a3857,3858 > Dani/M > Dania/M -2459a3858,3860 +2459a3860,3862 > Danica/M > Danice/M > Danie/M -2460a3862,3864 +2460a3864,3866 > Daniela/M > Daniele/M > Daniella/M -2461a3866,3867 +2461a3868,3869 > Danika/M > Danila/M -2462a3869,3873 +2462a3871,3875 > Danit/M > Danita/M > Danna/M > Dannel/M > Danni/M -2464a3876 +2464a3878 > Dannye/M -2469a3882,3886 +2469a3884,3888 > Danya/M > Danyelle/M > Danyette/M > Daphene/M > Daphna/M -2470a3888,3892 +2470a3890,3894 > Dar/MNH > Dara/M > Darb/M > Darbee/M > Darbie/M -2471a3894,3897 +2471a3896,3899 > Darcee/M > Darcey/M > Darci/M > Darcie/M -2472a3899 +2472a3901 > Darda/M -2474a3902,3904 +2474a3904,3906 > Dareen/M > Darell/M > Darelle/M -2476a3907,3910 +2476a3909,3912 > Dari/M > Daria/M > Darice/M > Darill/M -2481a3916 +2481a3918 > Darleen/M -2482a3918 +2482a3920 > Darline/M -2483a3920,3922 +2483a3922,3924 > Darlleen/M > Darn/M > Darnall/M -2484a3924 +2484a3926 > Daron/M -2486a3927 +2486a3929 > Darrelle/M -2487a3929 +2487a3931 > Darrick/M -2490a3933,3934 +2490a3935,3936 > Darsey/M > Darsie/M -2498a3943 +2498a3945 > Darya/M -2499a3945,3950 +2499a3947,3952 > Daryle/M > Daryn/M > Dasha/M > Dasi/M > Dasie/M > Dasya/M -2500a3952 +2500a3954 > Datha/M -2502a3955,3956 +2502a3957,3958 > Daune/M > Dav/MN -2504a3959,3960 +2504a3961,3962 > Daveen/M > Daven/M -2505a3962,3963 +2505a3964,3965 > Daveta/M > Davey/M -2506a3965,3967 +2506a3967,3969 > Davida/M > Davidde/M > Davide/M -2507a3969,3972 +2507a3971,3974 > Davie/MS > Davin/M > Davina/M > Davine/M -2511a3977 +2511a3979 > Dawna/M -2514a3981,3982 +2514a3983,3984 > Dayle/M > Dayna/M -2515a3984,3985 +2515a3986,3987 > Ddene/M > De/RSMN -2516a3987 +2516a3989 > DeKalb/M -2520a3992 +2520a3994 > Deane/M -2523a3996,3997 +2523a3998,3999 > Deb/SM > Debbi/M -2525a4000,4002 +2525a4002,4004 > Debee/M > Debera/M > Debi/M -2526a4004 +2526a4006 > Debor/M -2540c4018,4019 +2540c4020,4021 < Decker --- > Deck/MR > Dede/M -2541a4021,4022 +2541a4023,4024 > Dedie/M > Dedra/M -2542a4024,4026 +2542a4026,4028 > Deeann/M > Deeanne/M > Deedee/M -2543a4028 +2543a4030 > Deerdre/M -2544a4030 +2544a4032 > Deeyn/M -2546a4033 +2546a4035 > Dehlia/M -2548a4036 +2548a4038 > Deina/M -2552c4040,4041 +2552c4042,4043 < Del --- > Del/Y > Dela/M -2554a4044 +2554a4046 > Delainey/M -2559a4050,4051 +2559a4052,4053 > Delcina/M > Delcine/M -2565a4058 +2565a4060 > Delila/M -2567a4061 +2567a4063 > Delinda/M -2570a4065 +2570a4067 > Delly/M -2574a4070,4072 +2574a4072,4074 > Delmor/M > Delmore/M > Delora/M -2575a4074 +2575a4076 > Deloria/M -2578a4078,4079 +2578a4080,4081 > Delphine/M > Delphinia/M -2584a4086,4089 +2584a4088,4091 > Demetra/M > Demetre/M > Demetri/SM > Demetria/M -2590a4096 +2590a4098 > Demott/M -2593a4100 +2593a4102 > Dene -2597c4104,4105 +2597c4106,4107 < Denis --- > Deni/SM > Denice/M -2600c4108,4113 +2600c4110,4115 < Dennis --- > Denna/M @@ -2375,155 +2379,155 @@ > Denni/MS > Dennie/M > Dennison/M -2602a4116,4118 +2602a4118,4120 > Deny/M > Denys > Denyse/M -2603a4120 +2603a4122 > Deonne/M -2604a4122 +2604a4124 > Der/M -2607a4126,4128 +2607a4128,4130 > Derk/M > Dermot/M > Derrek/M -2609a4131,4136 +2609a4133,4138 > Derrik/M > Derril/M > Derron/M > Derry > Derward/M > Derwin/M -2611a4139,4140 +2611a4141,4142 > Desi/M > Desirae/M -2612a4142 +2612a4144 > Desiri/M -2613a4144 +2613a4146 > Desmund/M -2616a4148,4150 +2616a4150,4152 > Dev/M > Deva/M > Devan/M -2620a4155,4159 +2620a4157,4161 > Devina/M > Devinne/M > Devland/M > Devlen/M > Devlin/M -2621a4161 +2621a4163 > Devondra/M -2622a4163,4168 +2622a4165,4170 > Devonna/M > Devonne/M > Devora/M > Devy/M > Dew/M > Dewain/M -2625a4172 +2625a4174 > Dewie/M -2626a4174 +2626a4176 > Dex/M -2628a4177 +2628a4179 > Dhabi -2634a4184 +2634a4186 > Diahann/M -2635a4186 +2635a4188 > Dian/M -2636a4188 +2636a4190 > Diandra/M -2637a4190 +2637a4192 > Dianemarie/M -2640a4194,4195 +2640a4196,4197 > Diannne/M > Diarmid/M -2646a4202 +2646a4204 > Dickie/M -2648a4205 +2648a4207 > Dicky/M -2650a4208 +2650a4210 > Didi/M -2655a4214,4215 +2655a4216,4217 > Diena/M > Dierdre/M -2656a4217 +2656a4219 > Dieter/M -2659a4221 +2659a4223 > Dilan/M -2660a4223 +2660a4225 > Dill/M -2661a4225 +2661a4227 > Dillie/M -2663a4228,4230 +2663a4230,4232 > Dilly/M > Dimitri/M > Dimitry/M -2665a4233,4234 +2665a4235,4236 > Dinnie/M > Dinny/M -2669a4239,4241 +2669a4241,4243 > Dione > Dionis/M > Dionisio/M -2683a4256 +2683a4258 > Dita/M -2697a4271 +2697a4273 > Dniren/M -2702a4277 +2702a4279 > Dode/M -2704a4280,4281 +2704a4282,4283 > Dodi/M > Dodie/M -2706a4284 +2706a4286 > Dody/M -2710a4289,4292 +2710a4291,4294 > Dolf/M > Doll/M > Dolley/M > Dolli/M -2713a4296,4301 +2713a4298,4303 > Dolorita/SM > Dolph/M > Dom > Domenic/M > Domenico/M > Domeniga/M -2714a4303 +2714a4305 > Dominga/M -2716a4306 +2716a4308 > Domini/M -2720a4311 +2720a4313 > Dominik/M -2724a4316 +2724a4318 > Don't -2726a4319 +2726a4321 > Donal/M -2728a4322,4323 +2728a4324,4325 > Donall/M > Donalt/M -2729a4325,4328 +2729a4327,4330 > Donaugh/M > Donavon/M > Donella/M > Donelle/M -2730a4330,4333 +2730a4332,4335 > Donetta/M > Donia/M > Donica/M > Donielle/M -2733a4337 +2733a4339 > Donnamarie/M -2736a4341 +2736a4343 > Donni/M -2744a4350,4354 +2744a4352,4356 > Doralia/M > Doralin/M > Doralyn/M > Doralynn/M > Doralynne/M -2745a4356 +2745a4358 > Dore/M -2746a4358,4367 +2746a4360,4369 > Dorelia/M > Dorella/M > Dorelle/M @@ -2534,51 +2538,51 @@ > Dorey/M > Dori/SM > Doria/M -2748a4370,4372 +2748a4372,4374 > Dorice/M > Dorie/M > Dorine/M -2749a4374,4376 +2749a4376,4378 > Dorisa/M > Dorise/M > Dorita/M -2750a4378,4382 +2750a4380,4384 > Doro/M > Dorolice/M > Dorolisa/M > Dorotea/M > Doroteya/M -2751a4384 +2751a4386 > Dorothee/M -2752a4386,4389 +2752a4388,4391 > Dorree/M > Dorri/SM > Dorrie/M > Dorry/M -2754a4392 +2754a4394 > Dorthea/M -2756a4395,4396 +2756a4397,4398 > Dory/M > Dosi/M -2759a4400 +2759a4402 > Doti/M -2760a4402,4404 +2760a4404,4406 > Dotti/M > Dottie/M > Dotty/M -2764a4409 +2764a4411 > Dougie/M -2766a4412 +2766a4414 > Dougy/M -2767a4414 +2767a4416 > Dov/MR -2771a4419 +2771a4421 > Doy/M -2781a4430,4432 +2781a4432,4434 > Dre/M > Dreddy/M > Dredi/M -2786a4438,4444 +2786a4440,4446 > Drona/M > Dru/M > Druci/M @@ -2586,20 +2590,20 @@ > Drucill/M > Drucy/M > Drud/M -2787a4446,4450 +2787a4448,4452 > Drugi/M > Drusi/M > Drusie/M > Drusilla/M > Drusy/M -2799a4463 +2799a4465 > Dud/M -2800a4465,4466 +2800a4467,4468 > Duff/M > Duffie/M -2801a4468 +2801a4470 > Dugald/M -2803a4471,4482 +2803a4473,4484 > Dukey/M > Dukie/M > Duky/M @@ -2612,143 +2616,143 @@ > Dulcine/M > Dulcinea/M > Dulcy/M -2804a4484 +2804a4486 > Dulsea/M -2809a4490 +2809a4492 > Dun/M -2811a4493 +2811a4495 > Dunc/M -2818a4501,4502 +2818a4503,4504 > Dunstan > Dur/R -2820a4505 +2820a4507 > Durand/M -2829a4515 +2829a4517 > Durward/M -2842a4529 +2842a4531 > Dwain/M -2845a4533,4538 +2845a4535,4540 > Dyan/M > Dyana/M > Dyane/M > Dyann/M > Dyanna/M > Dyanne/M -2847a4541,4542 +2847a4543,4544 > Dyna/M > Dynah/M -2851c4546 +2851c4548 < E/SM --- > E/SMY -2853a4549 +2853a4551 > ECMAScript/M -2879a4576,4580 +2879a4578,4582 > Eachelle/M > Eada/M > Eadie/M > Eadith/M > Eadmund/M -2880a4582,4584 +2880a4584,4586 > Eal/M > Ealasaid/M > Eamon/M -2884a4589 +2884a4591 > Earlie/M -2885a4591 +2885a4593 > Early/M -2890a4597,4598 +2890a4599,4600 > Eartha/M > Earvin/M -2896a4605,4607 +2896a4607,4609 > Eb/MN > Eba/M > Ebba/M -2898a4610,4612 +2898a4612,4614 > Ebeneser/M > Ebenezer/M > Eberhard/M -2899a4614 +2899a4616 > Eberto/M -2900a4616 +2900a4618 > Ebonee/M -2904a4621 +2904a4623 > Ecma/M -2911a4629 +2911a4631 > Eda/M -2912a4631,4632 +2912a4633,4634 > Edan/M > Edd/M -2913a4634 +2913a4636 > Eddi/M -2916a4638,4640 +2916a4640,4642 > Ede > Edee/M > Edeline/M -2918a4643 +2918a4645 > Edgard/M -2919a4645,4648 +2919a4647,4650 > Edi/MH > Edie/M > Edik/M > Edin/M -2921a4651 +2921a4653 > Edita/M -2922a4653,4657 +2922a4655,4659 > Editha/M > Edithe/M > Ediva/M > Edlin/M > Edmon/M -2926a4662 +2926a4664 > Edouard/M -2927a4664 +2927a4666 > Eduard/M -2928a4666,4667 +2928a4668,4669 > Eduino/M > Edvard/M -2933a4673,4675 +2933a4675,4677 > Edy/M > Edyth/M > Edythe/M -2936a4679 +2936a4681 > Efrem/M -2937a4681,4682 +2937a4683,4684 > Egan/M > Egbert -2938a4684,4685 +2938a4686,4687 > Egon/M > Egor/M -2946a4694,4695 +2946a4696,4697 > Eilis/M > Eimile/M -2948a4698 +2948a4700 > Eirena/M -2951a4702,4704 +2951a4704,4706 > Ekaterina/M > El/Y > Elaina/M -2953a4707,4708 +2953a4709,4710 > Elana/M > Elane/M -2954a4710 +2954a4712 > Elayne/M -2958a4715,4717 +2958a4717,4719 > Elberta/M > Elbertina/M > Elbertine/M -2959a4719,4720 +2959a4721,4722 > Elden/M > Eldin/M -2960a4722,4723 +2960a4724,4725 > Eldredge/M > Eldridge/M -2962a4726,4727 +2962a4728,4729 > Eleanora/M > Eleanore/M -2964a4730 +2964a4732 > Eleen/M -2965a4732,4741 +2965a4734,4743 > Elene/M > Eleni/M > Elenore/M @@ -2759,7 +2763,7 @@ > Elfrida/M > Elfrieda/M > Elga/M -2968c4744,4749 +2968c4746,4751 < Elias --- > Elia/S @@ -2768,32 +2772,32 @@ > Elicia/M > Elie/M > Elihu/M -2970a4752 +2970a4754 > Elinore/M -2972a4755 +2972a4757 > Elisabet/M -2973a4757 +2973a4759 > Elisabetta/M -2976a4761,4762 +2976a4763,4764 > Elissa/M > Elita/M -2977a4764 +2977a4766 > Elizabet/M -2979a4767,4768 +2979a4769,4770 > Elka/M > Elke/M -2980a4770,4772 +2980a4772,4774 > Elladine/M > Ellary/M > Elle/M -2981a4774,4776 +2981a4776,4778 > Ellene/M > Ellerey/M > Ellery/M -2982a4778,4779 +2982a4780,4781 > Ellette/M > Elli/SM -2988a4786,4792 +2988a4788,4794 > Ellissa/M > Ellswerth/M > Ellsworth/M @@ -2801,53 +2805,53 @@ > Elly/M > Ellyn/M > Ellynn/M -2990a4795 +2990a4797 > Elmira/M -2991a4797,4799 +2991a4799,4801 > Elmore/M > Elna/MH > Elnar/M -2993a4802 +2993a4804 > Elnore/M -2994a4804 +2994a4806 > Eloisa/M -2995a4806,4807 +2995a4808,4809 > Elonore/M > Elora/M -2998a4811,4815 +2998a4813,4817 > Elsbeth/M > Else/M > Elset/M > Elsey/M > Elsi/M -3000a4818,4821 +3000a4820,4823 > Elspeth/M > Elston/M > Elsworth/M > Elsy/M -3004a4826 +3004a4828 > Elvera/M -3006a4829 +3006a4831 > Elvina/M -3008a4832,4834 +3008a4834,4836 > Elvyn/M > Elwin/M > Elwira/M -3010a4837,4839 +3010a4839,4841 > Elwyn/M > Elyn/M > Elyse/M -3011a4841,4842 +3011a4843,4844 > Elysha/M > Elysia -3013a4845,4847 +3013a4847,4849 > Elyssa/M > Em/M > Ema/M -3014a4849,4850 +3014a4851,4852 > Emalee/M > Emalia/M -3015a4852,4860 +3015a4854,4862 > Emanuele/M > Emelda/M > Emelen/M @@ -2857,81 +2861,81 @@ > Emelita/M > Emelyne/M > Emera/M -3019a4865,4866 +3019a4867,4868 > Emilee/M > Emili/M -3020a4868,4869 +3020a4870,4871 > Emilie/M > Emiline/M -3024a4874,4877 +3024a4876,4879 > Emlen/M > Emlyn/M > Emlynn/M > Emlynne/M -3025a4879,4883 +3025a4881,4885 > Emmalee/M > Emmaline/M > Emmalyn/M > Emmalynn/M > Emmalynne/M -3026a4885,4888 +3026a4887,4890 > Emmeline/M > Emmerich/M > Emmery/M > Emmet/M -3027a4890,4894 +3027a4892,4896 > Emmey/M > Emmi/M > Emmie/M > Emmit/M > Emmott/M -3028a4896,4897 +3028a4898,4899 > Emmye/M > Emogene/M -3029a4899,4900 +3029a4901,4902 > Emyle/M > Emylee/M -3032a4904 +3032a4906 > Engelbert/M -3034a4907 +3034a4909 > Englebert/M -3039a4913 +3039a4915 > Engracia/M -3043a4918 +3043a4920 > Ennis -3045a4921,4922 +3045a4923,4924 > Enrica/M > Enrichetta/M -3046a4924 +3046a4926 > Enrika/M -3047a4926 +3047a4928 > Enriqueta/M -3050a4930,4931 +3050a4932,4933 > Eolanda/M > Eolande/M -3054a4936,4937 +3054a4938,4939 > Ephrayim/M > Ephrem/M -3067a4951 +3067a4953 > Eran/M -3068a4953 +3068a4955 > Erastus/M -3070a4956 +3070a4958 > Erda/M -3072a4959,4960 +3072a4961,4962 > Erek/M > Erena/M -3074a4963 +3074a4965 > Erhart/M -3077a4967 +3077a4969 > Ericha/M -3088a4979,4981 +3088a4981,4983 > Erina/M > Erinn/M > Erinna/M -3091a4985 +3091a4987 > Erl/M -3093a4988,4994 +3093a4990,4996 > Ermanno/M > Ermengarde/M > Ermentrude/M @@ -2939,107 +2943,107 @@ > Ermina/M > Erminia/M > Erminie/M -3094a4996 +3094a4998 > Ernaline/M -3095a4998 +3095a5000 > Ernesta/M -3097a5001 +3097a5003 > Ernestus/M -3099a5004 +3099a5006 > Erny/M -3100a5006 +3100a5008 > Errick/M -3101a5008 +3101a5010 > Erroll/M -3102a5010,5012 +3102a5012,5014 > Erskine > Ertha/M > Erv/M -3104a5015 +3104a5017 > Eryn/M -3108a5020 +3108a5022 > Esdras -3109a5022,5024 +3109a5024,5026 > Esma/M > Esmaria/M > Esme/M -3115a5031,5032 +3115a5033,5034 > Esra/M > Essa/M -3120a5038,5039 +3120a5040,5041 > Essy/M > Esta/M -3122a5042 +3122a5044 > Estel/M -3123a5044,5045 +3123a5046,5047 > Estele/M > Estell/M -3128a5051 +3128a5053 > Estevan/M -3132a5056,5058 +3132a5058,5060 > Estrella/M > Estrellita/M > Etan/M -3133a5060 +3133a5062 > Ethe/M -3134a5062,5066 +3134a5064,5068 > Ethelbert > Ethelda/M > Ethelin/M > Ethelind/M > Etheline/M -3135a5068 +3135a5070 > Ethelyn/M -3138a5072,5073 +3138a5074,5075 > Ethyl/M > Etienne/M -3143a5079,5082 +3143a5081,5084 > Etti/M > Ettie/M > Ettore/M > Etty/M -3148a5088,5090 +3148a5090,5092 > Eudora/M > Euell/M > Eugen/M -3152a5095,5096 +3152a5097,5098 > Eugenius/M > Eugine/M -3153a5098 +3153a5100 > Eulalie/M -3156a5102 +3156a5104 > Euphemia/M -3166a5113 +3166a5115 > Eustace/M -3167a5115 +3167a5117 > Eustacia/M -3168a5117 +3168a5119 > Ev/MN -3169a5119 +3169a5121 > Evaleen/M -3170a5121 +3170a5123 > Evangelia/M -3171a5123 +3171a5125 > Evangelin/M -3174a5127,5128 +3174a5129,5130 > Evania/M > Evanne/M -3176a5131,5134 +3176a5133,5136 > Eveleen/M > Evelin/M > Evelina/M > Eveline/M -3177a5136 +3177a5138 > Even/M -3179a5139,5140 +3179a5141,5142 > Everard/M > Evered/M -3184a5146 +3184a5148 > Evey/M -3185a5148,5149 +3185a5150,5151 > Evie/M > Evin/M -3186a5151,5160 +3186a5153,5162 > Evonne/M > Evvie/M > Evvy/M @@ -3050,38 +3054,38 @@ > Ewart/M > Ewell/M > Ewen/M -3196a5171,5172 +3196a5173,5174 > Eyde/M > Eydie/M -3198a5175 +3198a5177 > Ezechiel/M -3199a5177,5179 +3199a5179,5181 > Ezequiel/M > Eziechiele/M > Ezmeralda/M -3200a5181 +3200a5183 > Ezri/M -3224a5206,5207 +3224a5208,5209 > Fabe/RM > Faber/M -3226a5210,5213 +3226a5212,5215 > Fabiano/M > Fabien/M > Fabio/M > Fae/M -3231a5219,5220 +3231a5221,5222 > Faina/M > Fair/M -3232a5222,5224 +3232a5224,5226 > Fairfax > Fairleigh/M > Fairlie/M -3236a5229 +3236a5231 > Falito/M -3237a5231,5232 +3237a5233,5234 > Falkner > Fallon/M -3240a5236,5243 +3240a5238,5245 > Fan > Fanchette/M > Fanchon/M @@ -3090,103 +3094,103 @@ > Fanechka/M > Fania/M > Fanni/M -3242a5246,5248 +3242a5248,5250 > Fanya/M > Far/MY > Fara/M -3243a5250,5251 +3243a5252,5253 > Farah/M > Farand/M -3244a5253,5256 +3244a5255,5258 > Farica/M > Farlay/M > Farlee/M > Farleigh/M -3245a5258,5259 +3245a5260,5261 > Farlie/M > Farly/M -3246a5261,5262 +3246a5263,5264 > Farr/M > Farra/M -3247a5264 +3247a5266 > Farrah/M -3248a5266,5267 +3248a5268,5269 > Farrand/M > Farrel/M -3249a5269 +3249a5271 > Farris/M -3261a5282,5283 +3261a5284,5285 > Faun/M > Faunie/M -3264a5287,5288 +3264a5289,5290 > Faustina/M > Faustine/M -3267a5292,5295 +3267a5294,5297 > Fawn/M > Fawne/M > Fawnia/M > Fax/M -3268a5297 +3268a5299 > Faydra/M -3269a5299,5303 +3269a5301,5305 > Fayette/M > Fayina/M > Fayre/M > Fayth/M > Faythe/M -3276a5311 +3276a5313 > Federica/M -3277a5313,5314 +3277a5315,5316 > Fedora/M > Fee/M -3278a5316,5317 +3278a5318,5319 > Felic/M > Felicdad/M -3280a5320 +3280a5322 > Felicio/M -3281a5322,5325 +3281a5324,5327 > Felicle/M > Felike/M > Feliks/M > Felipa/M -3282a5327,5328 +3282a5329,5330 > Felisha/M > Felita/M -3283a5330,5331 +3283a5332,5333 > Feliza/M > Felizio/M -3284a5333 +3284a5335 > Fenelia/M -3285a5335,5336 +3285a5337,5338 > Feodor/M > Feodora/M -3286a5338,5339 +3286a5340,5341 > Ferd/M > Ferdie/M -3287a5341,5343 +3287a5343,5345 > Ferdinanda/M > Ferdinande/M > Ferdy/M -3293a5350,5351 +3293a5352,5353 > Fernanda/M > Fernande/M -3294a5353 +3294a5355 > Fernandina/M -3295a5355 +3295a5357 > Ferne/M -3297a5358 +3297a5360 > Ferrel/M -3299a5361 +3299a5363 > Fey/M -3301a5364,5365 +3301a5366,5367 > Fiann/M > Fianna -3306a5371,5374 +3306a5373,5376 > Fidela/M > Fidelia/M > Fidelio/M > Fidelity/M -3308,3309c5376,5379 +3308,3309c5378,5381 < Fielding < Fields --- @@ -3194,40 +3198,40 @@ > Field/GS > Fifi/M > Fifine/M -3313a5384,5389 +3313a5386,5391 > Filbert/M > Filberte/M > Filberto/M > Filia/M > Filide/M > Filip/M -3314a5391,5392 +3314a5393,5394 > Filippa/M > Filippo/M -3315a5394,5395 +3315a5396,5397 > Filmer/M > Filmore/M -3316a5397,5398 +3316a5399,5400 > Fin > Fina/M -3317a5400,5401 +3317a5402,5403 > Findlay/M > Findley/M -3318a5403 +3318a5405 > Finlay/M -3325c5410,5412 +3325c5412,5414 < Firefox/M --- > Fionna/M > Fionnula/M > Fiorenze/M -3330a5418 +3330a5420 > Fitz/M -3342c5430 +3342c5432 < Fleming --- > Flem/G -3344c5432,5437 +3344c5434,5439 < Fletcher --- > Flemming/M @@ -3236,70 +3240,70 @@ > Fleurette/M > Flin/M > Flinn/M -3347a5441 +3347a5443 > Flor/M -3348a5443,5445 +3348a5445,5447 > Florance/M > Flore/SM > Florella/M -3349a5447,5448 +3349a5449,5450 > Florencia/M > Florentia/M -3351a5451,5455 +3351a5453,5457 > Florenza/M > Florette/M > Flori/SM > Floria/M > Florian/M -3354a5459,5461 +3354a5461,5463 > Florie/M > Florina/M > Florinda/M -3355a5463,5465 +3355a5465,5467 > Florri/M > Florrie/M > Florry/M -3357a5468 +3357a5470 > Flossi/M -3358a5470 +3358a5472 > Flossy/M -3360a5473 +3360a5475 > Flss/M -3369a5483,5486 +3369a5485,5488 > Fons > Fonsie/M > Fonz/M > Fonzie/M -3378c5495,5496 +3378c5497,5498 < Forrest --- > Forrest/R > Forrester/M -3380a5499 +3380a5501 > Foss/M -3392c5511 +3392c5513 < Fran/M --- > Fran/SM -3393a5513 +3393a5515 > Francene/M -3394a5515,5516 +3394a5517,5518 > Francesco/M > Franchot/M -3399a5522,5523 +3399a5524,5525 > Franciska/M > Franciskus/M -3400a5525,5526 +3400a5527,5528 > Francklin/M > Francklyn/M -3403a5530 +3403a5532 > Francyne/M -3412a5540,5543 +3412a5542,5545 > Franklyn/M > Franky/M > Franni/M > Frannie/M -3414c5545,5549 +3414c5547,5551 < Franz/M --- > Fransisco/M @@ -3307,49 +3311,49 @@ > Franz/MN > Franzen/M > Frasco/M -3415a5551,5552 +3415a5553,5554 > Frasier/M > Frasquito/M -3417a5555,5556 +3417a5557,5558 > Frayda/M > Fraze/RM -3420a5560 +3420a5562 > Freddi/M -3422a5563,5564 +3422a5565,5566 > Fredek/M > Fredelia/M -3423a5566,5567 +3423a5568,5569 > Frederica/M > Frederich/M -3424a5569,5570 +3424a5571,5572 > Fredericka/M > Frederico/M -3425a5572,5577 +3425a5574,5579 > Frederigo/M > Frederik/M > Frederique/M > Fredi/M > Fredia/M > Fredra/M -3427a5580,5583 +3427a5582,5585 > Fredrika/M > Free/M > Freedman/M > Freeland/M -3430a5587 +3430a5589 > Freemon/M -3449a5607 +3449a5609 > Friederike/M -3450a5609,5610 +3450a5611,5612 > Friedrich > Friedrick/M -3481a5642 +3481a5644 > Fulvia/M -3498c5659 +3498c5661 < GHz --- > GHz/M -3513a5675,5682 +3513a5677,5684 > Gabbey/M > Gabbi/M > Gabbie/M @@ -3358,58 +3362,58 @@ > Gabey/M > Gabi/M > Gabie/M -3518a5688,5690 +3518a5690,5692 > Gabriele/M > Gabriell/M > Gabriella/M -3519a5692,5695 +3519a5694,5697 > Gabriellia/M > Gabriello/M > Gabrila/M > Gaby/M -3522a5699 +3522a5701 > Gae/M -3524a5702 +3524a5704 > Gaelan/M -3528a5707 +3528a5709 > Gaile/M -3531a5711 +3531a5713 > Gal/N -3544a5725 +3544a5727 > Galina/M -3546a5728 +3546a5730 > Gallard/M -3554a5737 +3554a5739 > Galvan/M -3555a5739 +3555a5741 > Galven/M -3556a5741 +3556a5743 > Galvin/M -3557a5743 +3557a5745 > Gamaliel/M -3562a5749 +3562a5751 > Gan/M -3567a5755,5757 +3567a5757,5759 > Gannie/M > Gannon/M > Ganny/M -3570a5761,5762 +3570a5763,5764 > Gar/MH > Garald/M -3572a5765,5768 +3572a5767,5770 > Gard > Gardener/M > Gardie/M > Gardiner -3573a5770,5772 +3573a5772,5774 > Gardy/M > Gare/MH > Garek/M -3574a5774 +3574a5776 > Garey/M -3578a5779 +3578a5781 > Garik/M -3580a5782,5788 +3580a5784,5790 > Garnet/M > Garnette/M > Garold/M @@ -3417,39 +3421,39 @@ > Garrek/M > Garret/M > Garreth/M -3582a5791 +3582a5793 > Garrik/M -3583a5793,5794 +3583a5795,5796 > Garrot/M > Garrott/M -3585a5797 +3585a5799 > Garv/M -3586a5799,5802 +3586a5801,5804 > Garvin/M > Garvy/M > Garwin/M > Garwood/M -3589a5806,5809 +3589a5808,5811 > Gaspar > Gaspard/M > Gasparo/M > Gasper/M -3590a5811 +3590a5813 > Gaston/M -3598a5820 +3598a5822 > Gaultiero/M -3601a5824 +3601a5826 > Gauthier/M -3602a5826,5828 +3602a5828,5830 > Gav/MN > Gavan/M > Gaven/M -3603a5830,5831 +3603a5832,5833 > Gavra/M > Gavrielle/M -3604a5833 +3604a5835 > Gawen/M -3606c5835,5845 +3606c5837,5847 < Gayle/M --- > Gaye/M @@ -3463,16 +3467,16 @@ > Gaylor/M > Gaylord/M > Gaynor/M -3608a5848 +3608a5850 > Gbps -3611a5852,5853 +3611a5854,5855 > Gearalt/M > Gearard/M -3618a5861 +3618a5863 > Gelya/M -3626a5870 +3626a5872 > Genevra/M -3627a5872,5878 +3627a5874,5880 > Genia/M > Genna/M > Genni/M @@ -3480,37 +3484,37 @@ > Gennifer/M > Genny/M > Geno/M -3628a5880 +3628a5882 > Genovera/M -3631a5884 +3631a5886 > Genvieve/M -3632a5886 +3632a5888 > Geoff/M -3633a5888,5891 +3633a5890,5893 > Geoffry/M > Georas/M > Geordie > Georg/M -3634a5893,5896 +3634a5895,5898 > Georgeanna/M > Georgeanne/M > Georgena/M > Georgeta/M -3635a5898 +3635a5900 > Georgetta/M -3636a5900 +3636a5902 > Georgi/M -3638a5903,5906 +3638a5905,5908 > Georgiana/M > Georgianna/M > Georgianne/M > Georgie/M -3639a5908,5909 +3639a5910,5911 > Georgine/M > Georgy/M -3640a5911 +3640a5913 > Geralda/M -3644a5916,5925 +3644a5918,5927 > Gerda/M > Gerek/M > Gerhard/M @@ -3521,37 +3525,37 @@ > Gerianne/M > Gerick/M > Gerik/M -3645a5927,5929 +3645a5929,5931 > Gerladina/M > Germain/M > Germaine/M -3646a5931 +3646a5933 > Germana/M -3648a5934,5935 +3648a5936,5937 > Germayne/M > Gerome/M -3649a5937,5940 +3649a5939,5942 > Gerrard/M > Gerri/M > Gerrie/M > Gerrilee/M -3651a5943,5948 +3651a5945,5950 > Gert/M > Gerta/M > Gerti/M > Gertie/M > Gertrud/M > Gertruda/M -3652a5950,5952 +3652a5952,5954 > Gertrudis/M > Gerty/M > Gery/M -3663a5964 +3663a5966 > Gherardo/M -3664a5966,5967 +3664a5968,5969 > Giacinta/M > Giacobo/M -3665a5969,5975 +3665a5971,5977 > Giacomo/M > Giacopo/M > Gian/M @@ -3559,14 +3563,14 @@ > Gianina/M > Gianna/M > Gianni/M -3667a5978,5981 +3667a5980,5983 > Giavani/M > Gib/M > Gibb/SM > Gibbie/M -3669a5984 +3669a5986 > Gibby/M -3676c5991,5998 +3676c5993,6000 < Gil/M --- > Giff/MR @@ -3577,189 +3581,189 @@ > Giffy/M > Gigi/M > Gil/MY -3678a6001,6004 +3678a6003,6006 > Gilberta/M > Gilberte/M > Gilbertina/M > Gilbertine -3679a6006 +3679a6008 > Gilburt/M -3682a6010 +3682a6012 > Gilemette/M -3685a6014,6015 +3685a6016,6017 > Gillan/M > Gilles -3687a6018 +3687a6020 > Gilli/M -3689a6021 +3689a6023 > Gillie/M -3690a6023 +3690a6025 > Gilly/M -3692a6026,6027 +3692a6028,6029 > Ginelle/M > Ginevra/M -3694a6030,6032 +3694a6032,6034 > Ginni/M > Ginnie/M > Ginnifer/M -3699a6038,6041 +3699a6040,6043 > Giordano/M > Giorgi/M > Giorgia/M > Giorgio/M -3701a6044 +3701a6046 > Giovanna/M -3703a6047,6049 +3703a6049,6051 > Giralda/M > Giraldo/M > Giraud -3704a6051,6054 +3704a6053,6056 > Gisela/M > Giselbert/M > Gisele/M > Gisella/M -3706a6057,6058 +3706a6059,6060 > Giuditta/M > Giulia/M -3707a6060,6061 +3707a6062,6063 > Giulietta/M > Giulio/M -3708a6063,6065 +3708a6065,6067 > Giustina/M > Giustino/M > Giusto/M -3709a6067 +3709a6069 > Gizela/M -3710a6069,6070 +3710a6071,6072 > Glad/M > Gladi/M -3719a6080 +3719a6082 > Gleda/M -3722a6084,6086 +3722a6086,6088 > Glenden/M > Glendon/M > Glenine/M -3725a6090,6092 +3725a6092,6094 > Glennie/M > Glennis/M > Glori/M -3726a6094,6096 +3726a6096,6098 > Gloriana/M > Gloriane/M > Glory/M -3728a6099,6104 +3728a6101,6106 > Glyn/M > Glynda/M > Glynis/M > Glynn/M > Glynnis/M > Gnni/M -3734a6111 +3734a6113 > Godart/M -3735a6113 +3735a6115 > Goddart/M -3736a6115,6117 +3736a6117,6119 > Godfree/M > Godfrey/M > Godfry/M -3742a6124 +3742a6126 > Godwin -3754a6137 +3754a6139 > Goldarina/M -3756a6140,6141 +3756a6142,6143 > Goldi/M > Goldia/M -3758a6144 +3758a6146 > Goldina/M -3763a6150 +3763a6152 > Goldy/M -3774a6162 +3774a6164 > Goober/M -3784a6173,6174 +3784a6175,6176 > Goran/M > Goraud/M -3785a6176,6177 +3785a6178,6179 > Gordan/M > Gorden/M -3786a6179 +3786a6181 > Gordie/M -3788a6182 +3788a6184 > Gordy/M -3799a6194 +3799a6196 > Gothart/M -3801a6197 +3801a6199 > Gottfried/M -3811a6208 +3811a6210 > Gracia/M -3813a6211,6212 +3813a6213,6214 > Gradeigh/M > Gradey/M -3814a6214,6215 +3814a6216,6217 > Graehme/M > Graeme/M -3818a6220 +3818a6222 > Graig/M -3819a6222 +3819a6224 > Gram/M -3821a6225 +3821a6227 > Gran/M -3822a6227,6229 +3822a6229,6231 > Grange/R > Grannie/M > Granny/M -3823a6231,6234 +3823a6233,6236 > Grantham/M > Granthem/M > Grantley/M > Granville/M -3824a6236,6238 +3824a6238,6240 > Grata/M > Gratia/M > Gratiana/M -3826a6241,6242 +3826a6243,6244 > Grayce/M > Grazia/M -3842a6259,6262 +3842a6261,6264 > Greggory/M > Gregoire/M > Gregoor/M > Gregor/M -3844a6265 +3844a6267 > Gregorius/M -3850a6272 +3850a6274 > Grenville -3852a6275 +3852a6277 > Gretal/M -3853a6277 +3853a6279 > Grete/M -3854a6279,6281 +3854a6281,6283 > Grethel/M > Gretna/M > Gretta/M -3857a6285,6287 +3857a6287,6289 > Grier/M > Griff/M > Griffie/M -3859a6290 +3859a6292 > Griffy/M -3863a6295,6298 +3863a6297,6300 > Griselda > Grissel/M > Griswold/M > Griz/M -3868a6304 +3868a6306 > Grove/RM -3881a6318 +3881a6320 > Gualterio/M -3892a6330,6332 +3892a6332,6334 > Guendolen/M > Guenevere/M > Guenna/M -3897a6338,6340 +3897a6340,6342 > Guglielma/M > Guglielmo/M > Gui/M -3899c6342,6346 +3899c6344,6348 < Guido --- > Guido/M @@ -3767,16 +3771,16 @@ > Guillaume/M > Guillema/M > Guillemette/M -3903a6351 +3903a6353 > Guinna/M -3912a6361,6366 +3912a6363,6368 > Gun/M > Gunar/M > Gunilla/M > Gunner/M > Guntar/M > Gunter -3917a6372,6378 +3917a6374,6380 > Gusella/M > Guss > Gussi/M @@ -3784,20 +3788,20 @@ > Gussy/M > Gusta/M > Gustaf/M -3918a6380 +3918a6382 > Gustave/M -3920a6383,6385 +3920a6385,6387 > Gusti/M > Gustie/M > Gusty/M -3921a6387 +3921a6389 > Guthrey/M -3922a6389 +3922a6391 > Guthry/M -3929a6397,6398 +3929a6399,6400 > Gwendolen/M > Gwendolin/M -3931a6401,6408 +3931a6403,6410 > Gweneth/M > Gwenette/M > Gwenneth/M @@ -3806,151 +3810,151 @@ > Gwenny/M > Gwenora/M > Gwenore/M -3932a6410,6411 +3932a6412,6413 > Gwyneth/M > Gwynne/M -3954a6434 +3954a6436 > HTTPS -3959a6440 +3959a6442 > Had/M -3961a6443,6446 +3961a6445,6448 > Hadlee/M > Hadleigh/M > Hadley/M > Hadria/M -3963a6449 +3963a6451 > Hagan/M -3964a6451 +3964a6453 > Hagen -3970a6458,6460 +3970a6460,6462 > Hailee/M > Hailey/M > Haily/M -3973a6464,6465 +3973a6466,6467 > Hakeem/M > Hakim/M -3976c6468 +3976c6470 < Hal/SM --- > Hal/SMY -3979a6472,6473 +3979a6474,6475 > Haleigh/M > Halette/M -3980a6475,6476 +3980a6477,6478 > Hali/M > Halie/M -3981a6478 +3981a6480 > Halimeda/M -3983a6481 +3983a6483 > Halli/M -3987d6484 +3987d6486 < Hallowe'en -3989a6487,6488 +3989a6489,6490 > Hallsy/M > Hally/M -3991a6491 +3991a6493 > Halsy/M -3994a6495 +3994a6497 > Hamel/M -3995a6497,6498 +3995a6499,6500 > Hamid/M > Hamil/M -3999a6503 +3999a6505 > Hamish/M -4000a6505 +4000a6507 > Hamlen/M -4002a6508 +4002a6510 > Hammad/M -4007a6514 +4007a6516 > Hamnet/M -4011a6519,6520 +4011a6521,6522 > Hana/M > Hanan/M -4020c6529,6530 +4020c6531,6532 < Hannah --- > Hannah/M > Hanni/SM -4021a6532,6533 +4021a6534,6535 > Hannie/M > Hanny/M -4026a6539 +4026a6541 > Hansiain/M -4029d6541 +4029d6543 < Hanukah/M -4031a6544 +4031a6546 > Happy/M -4032a6546 +4032a6548 > Harald/M -4033a6548 +4033a6550 > Harbert/M -4034a6550 +4034a6552 > Harcourt/M -4039a6556 +4039a6558 > Harland/M -4040a6558,6559 +4040a6560,6561 > Harlen/M > Harlene/M -4042a6562,6564 +4042a6564,6566 > Harli/M > Harlie/M > Harlin/M -4043a6566 +4043a6568 > Harman/M -4044a6568,6570 +4044a6570,6572 > Harmonia/M > Harmonie/M > Harmony/M -4045a6572,6573 +4045a6574,6575 > Haroun/M > Harp/MR -4048a6577,6578 +4048a6579,6580 > Harri/SM > Harrie/M -4050a6581,6582 +4050a6583,6584 > Harrietta/M > Harriette/M -4052c6584,6585 +4052c6586,6587 < Harris --- > Harriot/M > Harriott/M -4059a6593 +4059a6595 > Hartley -4061a6596,6597 +4061a6598,6599 > Hartwell/M > Harv/M -4063a6600,6601 +4063a6602,6603 > Harwell/M > Harwilll/M -4064a6603,6604 +4064a6605,6606 > Hasheem/M > Hashim/M -4065a6606,6609 +4065a6608,6611 > Haskel/M > Haskell/M > Haslett/M > Hastie/M -4066a6611 +4066a6613 > Hasty/M -4070a6616 +4070a6618 > Hatti/M -4071a6618 +4071a6620 > Hatty/M -4077a6625 +4077a6627 > Haven/M -4088a6637 +4088a6639 > Haydon/M -4089a6639 +4089a6641 > Hayley/M -4093a6644,6645 +4093a6646,6647 > Hayyim/M > Haze/M -4094a6647 +4094a6649 > Hazlett/M -4097a6651 +4097a6653 > Heall/M -4112a6667,6676 +4112a6669,6678 > Heda/M > Hedda/M > Heddi/M @@ -3961,120 +3965,120 @@ > Hedwig/M > Hedwiga/M > Hedy/M -4117a6682 +4117a6684 > Heida/M -4120a6686 +4120a6688 > Heidie/M -4122a6689 +4122a6691 > Heindrick/M -4126a6694,6695 +4126a6696,6697 > Heinrick/M > Heinrik/M -4130c6699,6701 +4130c6701,6703 < Hejira --- > Hejira/MS > Helaina/M > Helaine/M -4133a6705 +4133a6707 > Helenka/M -4134a6707 +4134a6709 > Helge/M -4145c6718,6719 +4145c6720,6721 < Hellenize --- > Hellenize/DSG > Heller -4146a6721 +4146a6723 > Helli/M -4149a6725 +4149a6727 > Helsa/M -4151a6728 +4151a6730 > Helvetica -4152a6730 +4152a6732 > Helyn/M -4156c6734,6736 +4156c6736,6738 < Hendricks --- > Hendrick/MS > Hendrik/M > Hendrika/M -4157a6738 +4157a6740 > Henka/M -4160a6742,6743 +4160a6744,6745 > Henrie/M > Henrieta/M -4161a6745,6746 +4161a6747,6748 > Henriette/M > Henrik/M -4162a6748 +4162a6750 > Henryetta/M -4166a6753 +4166a6755 > Hephzibah/M -4171a6759 +4171a6761 > Herb/M -4173a6762,6764 +4173a6764,6766 > Herbie/M > Herby/M > Herc/M -4174a6766 +4174a6768 > Hercule/MS -4176a6769 +4176a6771 > Herculie/M -4181a6775 +4181a6777 > Hermann/M -4183a6778,6781 +4183a6780,6783 > Hermia/M > Hermie/M > Hermina/M > Hermine/M -4184a6783 +4184a6785 > Hermione/M -4186a6786 +4186a6788 > Hermon -4187a6788 +4187a6790 > Hermy/M -4188a6790 +4188a6792 > Hernando/M -4190a6793 +4190a6795 > Herold/M -4194a6798 +4194a6800 > Hersch/M -4196a6801 +4196a6803 > Hersh/M -4198a6804,6805 +4198a6806,6807 > Herta/M > Hertha/M -4200a6808,6809 +4200a6810,6811 > Herve/M > Hervey/M -4209a6819,6820 +4209a6821,6822 > Hesther/M > Hestia/M -4210a6822 +4210a6824 > Hetti/M -4211a6824,6829 +4211a6826,6831 > Hetty/M > Hew/M > Hewe/M > Hewet/M > Hewett/M > Hewie/M -4219a6838 +4219a6840 > Hi/M -4233a6853 +4233a6855 > Hilarius/M -4236a6857,6859 +4236a6859,6861 > Hildagard/M > Hildagarde/M > Hilde/M -4237a6861,6863 +4237a6863,6865 > Hildegaard/M > Hildegarde/M > Hildy/M -4239a6866 +4239a6868 > Hillard/M -4241a6869,6875 +4241a6871,6877 > Hillery/M > Hilliard > Hilliary/M @@ -4082,155 +4086,155 @@ > Hillier/M > Hilly/RM > Hillyer/M -4246a6881 +4246a6883 > Hinda/M -4255a6891 +4255a6893 > Hinze/M -4262a6899 +4262a6901 > Hirsch/M -4271a6909 +4271a6911 > Hobard/M -4274a6913,6914 +4274a6915,6916 > Hobey/M > Hobie/M -4277a6918 +4277a6920 > Hoebart/M -4301a6943 +4301a6945 > Holli/SM -4303d6944 +4303d6946 < Hollis -4305a6947 +4305a6949 > Hollyanne/M -4314a6957 +4314a6959 > Homere/M -4315a6959 +4315a6961 > Homerus/M -4320a6965 +4320a6967 > Honey/M -4324c6969,6970 +4324c6971,6972 < Honorable --- > Honor/B > Honoria/M -4338a6985 +4338a6987 > Horatia/M -4339a6987 +4339a6989 > Horatius/M -4345a6994,6998 +4345a6996,7000 > Horst/M > Hort/MN > Horten/M > Hortense > Hortensia/M -4361a7015,7016 +4361a7017,7018 > Howey/M > Howie/M -4363a7019 +4363a7021 > Hoyt/M -4368a7025 +4368a7027 > Hube/RM -4370a7028,7030 +4370a7030,7032 > Huberto/M > Hubey/M > Hubie/M -4379a7040,7041 +4379a7042,7043 > Hughie > Hugibert/M -4381a7044 +4381a7046 > Hugues/M -4383a7047 +4383a7049 > Hulda/M -4384a7049 +4384a7051 > Humbert/M -4387a7053,7055 +4387a7055,7057 > Humfrey/M > Humfrid/M > Humfried/M -4391a7060 +4391a7062 > Hunfredo/M -4398a7068 +4398a7070 > Huntlee/M -4400a7071,7072 +4400a7073,7074 > Hurlee/M > Hurleigh/M -4404a7077 +4404a7079 > Husein/M -4413a7087,7092 +4413a7089,7094 > Hy/M > Hyacinth/M > Hyacintha/M > Hyacinthe/M > Hyacinthia/M > Hyacinthie/M -4414a7094 +4414a7096 > Hyatt/M -4417a7098 +4417a7100 > Hyman/M -4418a7100,7101 +4418a7102,7103 > Hymie > Hynda/M -4455a7139 +4455a7141 > Iain/M -4456a7141 +4456a7143 > Ianthe/M -4458a7144,7145 +4458a7146,7147 > Ibbie/M > Ibby/M -4463a7151 +4463a7153 > Ibrahim/M -4470a7159 +4470a7161 > Ichabod/M -4474a7164,7169 +4474a7166,7171 > Idalia/M > Idalina/M > Idaline/M > Idell/M > Idelle/M > Idette/M -4475a7171,7173 +4475a7173,7175 > Iggie/M > Iggy/M > Ignace/M -4476a7175 +4476a7177 > Ignacius/M -4477a7177,7178 +4477a7179,7180 > Ignaz/M > Ignazio/M -4483c7184,7185 +4483c7186,7187 < Ikea/M --- > IKEA/M > Ikey/M -4485a7188,7191 +4485a7190,7193 > Ilaire/M > Ilario/M > Ileana/M > Ileane/M -4487a7194,7195 +4487a7196,7197 > Ilise/M > Ilka/M -4488a7197 +4488a7199 > Illa/M -4491a7201,7205 +4491a7203,7207 > Ilsa/M > Ilse/M > Ilysa/M > Ilyse/M > Ilyssa/M -4495a7210 +4495a7212 > Immanuel -4496a7212 +4496a7214 > Imogen/M -4497a7214 +4497a7216 > Imojean/M -4499c7216 +4499c7218 < In/M --- > In/MP -4522a7240,7241 +4522a7242,7243 > Inesita/M > Inessa/M -4524c7243,7254 +4524c7245,7256 < Inge --- > Inga/M @@ -4245,67 +4249,67 @@ > Ingemar/M > Inger/M > Inglebert/M -4525a7256,7258 +4525a7258,7260 > Inglis/M > Ingmar/M > Ingra/M -4528a7262,7267 +4528a7264,7269 > Ingrim/M > Ingunna/M > Inigo/M > Inna/M > Inness/M > Innis/M -4543a7283,7285 +4543a7285,7287 > Iolande/M > Iolanthe/M > Iona -4546a7289,7291 +4546a7291,7293 > Iorgo/MS > Iormina/M > Iosep/M -4560a7306 +4560a7308 > Irena/M -4561a7308 +4561a7310 > Irina/M -4567a7315 +4567a7317 > Irita/M -4573a7322 +4573a7324 > Irv/MG -4577a7327,7328 +4577a7329,7330 > Irwinn/M > Isa -4578a7330 +4578a7332 > Isaak/M -4579a7332 +4579a7334 > Isabelita/M -4581a7335,7340 +4581a7337,7342 > Isac/M > Isacco/M > Isador/M > Isadora/M > Isadore/M > Isahella/M -4582a7342 +4582a7344 > Isak/M -4583a7344 +4583a7346 > Iseabal/M -4589a7351,7355 +4589a7353,7357 > Isiahi/M > Isidor/M > Isidora/M > Isidore/M > Isidoro/M -4598a7365 +4598a7367 > Isobel/M -4606a7374,7377 +4606a7376,7379 > Issi/M > Issiah/M > Issie/M > Issy/M -4615a7387 +4615a7389 > Itch/M -4622c7394,7401 +4622c7396,7403 < Ives --- > Ivar/M @@ -4316,69 +4320,69 @@ > Ivie/M > Ivonne/M > Ivor/M -4627a7407,7408 +4627a7409,7410 > Izabel/M > Izak/M -4634c7415,7416 +4634c7417,7418 < J/MD --- > Izzy/M > J/MDNX -4639a7422,7427 +4639a7424,7429 > Jabez/M > Jacenta/M > Jacinda/M > Jacinta/M > Jacintha/M > Jacinthe/M -4640a7429,7430 +4640a7431,7432 > Jackelyn/M > Jacki/M -4641a7432 +4641a7434 > Jacklin/M -4642a7434,7435 +4642a7436,7437 > Jackquelin/M > Jackqueline/M -4646a7440 +4646a7442 > Jaclin/M -4652a7447 +4652a7449 > Jacobo/M -4654a7450 +4654a7452 > Jacquelin/M -4656a7453,7455 +4656a7455,7457 > Jacquelynn/M > Jacquenetta/M > Jacquenette/M -4657a7457,7460 +4657a7459,7462 > Jacquetta/M > Jacquette/M > Jacqui/M > Jacquie/M -4658a7462,7465 +4658a7464,7467 > Jacynth/M > Jada/M > Jade/M > Jae/M -4663a7471 +4663a7473 > Jaimie/M -4664a7473 +4664a7475 > Jaine/M -4668a7478,7479 +4668a7480,7481 > Jakie/M > Jakob/M -4676a7488 +4676a7490 > Jameson -4677a7490,7491 +4677a7492,7493 > Jamesy/M > Jamey/M -4679a7494,7499 +4679a7496,7501 > Jamil/M > Jamill/M > Jamima/M > Jamison/M > Jammal/M > Jammie/M -4683c7503,7512 +4683c7505,7514 < Jane --- > Janaya/M @@ -4391,9 +4395,9 @@ > Janek/M > Janel/M > Janela/M -4684a7514 +4684a7516 > Janella/M -4686c7516,7521 +4686c7518,7523 < Janet --- > Janene/M @@ -4402,26 +4406,26 @@ > Janet/M > Janeta/M > Janetta/M -4687a7523,7525 +4687a7525,7527 > Janeva/M > Janey/M > Jania/M -4689a7528,7529 +4689a7530,7531 > Janifer/M > Janina -4692a7533 +4692a7535 > Janith/M -4693a7535 +4693a7537 > Janka/M -4694a7537,7538 +4694a7539,7540 > Jannel/M > Jannelle/M -4695a7540,7541 +4695a7542,7543 > Janos/M > Janot/M -4699a7546 +4699a7548 > Jany/M -4702a7550,7557 +4702a7552,7559 > Jaquelin/M > Jaquelyn/M > Jaquenetta/M @@ -4430,56 +4434,56 @@ > Jarad/M > Jard/M > Jareb/M -4703a7559,7560 +4703a7561,7562 > Jarib/M > Jarid/M -4704a7562 +4704a7564 > Jarrad/M -4705a7564 +4705a7566 > Jarret/M -4706a7566 +4706a7568 > Jarrid/M -4708a7569,7572 +4708a7571,7574 > Jase/M > Jasen/M > Jasmin/M > Jasmina/M -4711a7576 +4711a7578 > Jasun/M -4714d7578 +4714d7580 < JavaScript/M -4721a7586,7589 +4721a7588,7591 > Jaye/M > Jayme/M > Jaymee/M > Jaymie/M -4722a7591 +4722a7593 > Jaynell/M -4723a7593,7594 +4723a7595,7596 > Jazmin/M > Jdavie/M -4724a7596,7598 +4724a7598,7600 > Jeana/M > Jeane/M > Jeanelle/M -4727a7602 +4727a7604 > Jeanna/M -4731a7607 +4731a7609 > Jecho/M -4732a7609,7611 +4732a7611,7613 > Jedd/M > Jeddy/M > Jedediah/M -4733a7613 +4733a7615 > Jedidiah/M -4740a7621 +4740a7623 > Jeffie/M -4742a7624,7625 +4742a7626,7627 > Jeffy/M > Jehanna/M -4744a7628 +4744a7630 > Jehu -4745a7630,7642 +4745a7632,7644 > Jelene/M > Jemie/M > Jemima/M @@ -4493,95 +4497,95 @@ > Jeni/M > Jenica/M > Jeniece/M -4746a7644,7646 +4746a7646,7648 > Jeniffer/M > Jenilee/M > Jenine/M -4747a7648 +4747a7650 > Jenn/MRJ -4749c7650,7653 +4749c7652,7655 < Jenner --- > Jennee/M > Jennette/M > Jenni/M > Jennica/M -4751a7656,7657 +4751a7658,7659 > Jennilee/M > Jennine/M -4753a7660 +4753a7662 > Jeno/M -4755a7663 +4755a7665 > Jerad/M -4756a7665,7669 +4756a7667,7671 > Jeralee/M > Jeramey/M > Jeramie/M > Jere/M > Jereme/M -4758a7672,7673 +4758a7674,7675 > Jeremias/M > Jeremie/M -4761a7677 +4761a7679 > Jermain/M -4762a7679 +4762a7681 > Jermayne/M -4765a7683 +4765a7685 > Jeromy/M -4766a7685,7688 +4766a7687,7690 > Jerrie/M > Jerrilee/M > Jerrilyn/M > Jerrine/M -4768a7691 +4768a7693 > Jerrome/M -4769a7693 +4769a7695 > Jerrylee/M -4771a7696 +4771a7698 > Jervis/M -4772a7698,7702 +4772a7700,7704 > Jessa/M > Jessalin/M > Jessalyn/M > Jessamine/M > Jessamyn/M -4773a7704,7707 +4773a7706,7709 > Jessee/M > Jesselyn/M > Jessey/M > Jessi/M -4775a7710,7711 +4775a7712,7713 > Jessika/M > Jessy/M -4777a7714,7715 +4777a7716,7717 > Jeth/M > Jethro -4781a7720 +4781a7722 > Jewelle/M -4788a7728,7733 +4788a7730,7735 > Jillana/M > Jillane/M > Jillayne/M > Jilleen/M > Jillene/M > Jilli/M -4789a7735,7736 +4789a7737,7738 > Jillie/M > Jilly/M -4798c7745,7746 +4798c7747,7748 < Jo/M --- > Jo/MY > Joachim -4799a7748,7750 +4799a7750,7752 > Joana/M > Joane/M > Joanie/M -4802c7753 +4802c7755 < Joanne/M --- > Joanne/SM -4804a7756,7762 +4804a7758,7764 > Jobey/M > Jobi/M > Jobie/M @@ -4589,15 +4593,15 @@ > Joby/M > Jobye/M > Jobyna/M -4805a7764,7765 +4805a7766,7767 > Jocelin/M > Joceline/M -4806a7767 +4806a7769 > Jocelyne/M -4808a7770,7771 +4808a7772,7773 > Jocko/M > Jodee/M -4813c7776,7786 +4813c7778,7788 < Joel --- > Joeann/M @@ -4611,36 +4615,36 @@ > Joelly/M > Joellyn/M > Joelynn/M -4814a7788 +4814a7790 > Joete/M -4816a7791 +4816a7793 > Johan/M -4818a7794 +4818a7796 > Johannah/M -4821a7798,7799 +4821a7800,7801 > Johna/MH > Johnath/M -4823a7802 +4823a7804 > Johnette/M -4824a7804 +4824a7806 > Johnna/M -4828a7809,7813 +4828a7811,7815 > Johny/M > Joice/M > Jojo/M > Jolee/M > Joleen/M -4829a7815,7817 +4829a7817,7819 > Joletta/M > Joli/M > Jolie/M -4830a7819 +4830a7821 > Joline/M -4831a7821,7823 +4831a7823,7825 > Joly/M > Jolyn/M > Jolynn/M -4838,4839c7830,7833 +4838,4839c7832,7835 < Jones < Joni/M --- @@ -4648,137 +4652,137 @@ > Jonell/M > Joni/SM > Jonie/M -4841a7836 +4841a7838 > Jordain/M -4842a7838 +4842a7840 > Jordana/M -4843a7840,7843 +4843a7842,7845 > Jordanna/M > Jordon/M > Jorey/M > Jorgan/M -4844a7845,7850 +4844a7847,7852 > Jori/M > Jorie/M > Jorrie/M > Jorry/M > Jory/M > Joscelin/M -4845a7852 +4845a7854 > Josee/M -4848a7856 +4848a7858 > Joseito/M -4849a7858,7859 +4849a7860,7861 > Josepha/M > Josephina/M -4853a7864 +4853a7866 > Josey/M -4854a7866 +4854a7868 > Joshia/M -4855a7868,7869 +4855a7870,7871 > Joshuah/M > Josi/M -4856a7871 +4856a7873 > Josias/M -4857a7873 +4857a7875 > Josselyn/M -4858a7875 +4858a7877 > Josy/M -4859a7877,7878 +4859a7879,7880 > Jourdain/M > Jourdan/M -4862a7882,7884 +4862a7884,7886 > Joya/M > Joyan/M > Joyann/M -4864a7887,7888 +4864a7889,7890 > Joycelin/M > Joye/M -4865a7890 +4865a7892 > Jozef/M -4867a7893 +4867a7895 > Jsandye/M -4872a7899 +4872a7901 > Jud -4881a7909,7910 +4881a7911,7912 > Judi/MH > Judie/M -4882a7912,7913 +4882a7914,7915 > Juditha/M > Judon/M -4884a7916 +4884a7918 > Judye/M -4885a7918 +4885a7920 > Juieta/M -4887c7920,7922 +4887c7922,7924 < Jules --- > Jule/SM > Julee/M > Juli/M -4890a7926,7928 +4890a7928,7930 > Juliane/M > Juliann/M > Julianna/M -4892a7931 +4892a7933 > Julienne/M -4893a7933,7934 +4893a7935,7936 > Julieta/M > Julietta/M -4894a7936,7937 +4894a7938,7939 > Julina/M > Juline/M -4895a7939,7940 +4895a7941,7942 > Julissa/M > Julita/M -4901a7947 +4901a7949 > Junette/M -4904a7951,7953 +4904a7953,7955 > Junia/M > Junie/M > Junina/M -4910a7960 +4910a7962 > Justen/M -4912a7963 +4912a7965 > Justina/M -4914a7966,7969 +4914a7968,7971 > Justinn/M > Justino/M > Justis/M > Justus/M -4917c7972,7973 +4917c7974,7975 < K/SMNGJ --- > Jyoti/M > K/SMNRGJ -4929a7986,7989 +4929a7988,7991 > Kacey/M > Kacie/M > Kacy/M > Kaela/M -4932a7993,7994 +4932a7995,7996 > Kahaleel/M > Kahlil/M -4933a7996,7997 +4933a7998,7999 > Kai/M > Kaia/M -4934a7999,8003 +4934a8001,8005 > Kaila/M > Kaile/M > Kailey/M > Kain/M > Kaine/M -4936a8006,8010 +4936a8008,8012 > Kaitlyn/M > Kaitlynn/M > Kaja/M > Kakalina/M > Kala/M -4940a8015,8017 +4940a8017,8019 > Kale/M > Kaleb/M > Kaleena/M -4943a8021,8029 +4943a8023,8031 > Kalie/M > Kalil/M > Kalila/M @@ -4788,38 +4792,38 @@ > Kalle/M > Kalli/M > Kally/M -4944a8031 +4944a8033 > Kalvin/M -4947a8035,8038 +4947a8037,8040 > Kameko/M > Kamila/M > Kamilah/M > Kamillah/M -4951a8043 +4951a8045 > Kandace/M -4953a8046 +4953a8048 > Kandy -4954a8048 +4954a8050 > Kania/M -4961a8056 +4961a8058 > Kanya/M -4967a8063,8064 +4967a8065,8066 > Karalee/M > Karalynn/M -4968a8066,8067 +4968a8068,8069 > Kare/M > Karee/M -4969a8069 +4969a8071 > Karel/M -4970a8071 +4970a8073 > Karena/M -4972a8074,8078 +4972a8076,8080 > Karia/M > Karie/M > Karil/M > Karilynn/M > Karim/M -4975c8081,8086 +4975c8083,8088 < Karl/M --- > Karine/M @@ -4828,7 +4832,7 @@ > Karissa/M > Karita/M > Karl/MNX -4976a8088,8095 +4976a8090,8097 > Karlan/M > Karlee/M > Karleen/M @@ -4837,7 +4841,7 @@ > Karlie/M > Karlik/M > Karlis -4978c8097,8104 +4978c8099,8106 < Karo/M --- > Karlotta/M @@ -4848,7 +4852,7 @@ > Karna/M > Karney/M > Karo/MY -4979a8106,8113 +4979a8108,8115 > Karola/M > Karole/M > Karolina/M @@ -4857,14 +4861,14 @@ > Karon/M > Karrah/M > Karrie/M -4980a8115,8118 +4980a8117,8120 > Karry/M > Kary/M > Karyl/M > Karylin/M -4984a8123 +4984a8125 > Kaspar/M -4985a8125,8134 +4985a8127,8136 > Kasper/M > Kass > Kassandra/M @@ -4875,57 +4879,57 @@ > Kat/M > Kata/M > Katalin/M -4986a8136 +4986a8138 > Katee/M -4987a8138,8143 +4987a8140,8145 > Katerina/M > Katerine/M > Katey/M > Kath/M > Katha/M > Katharina/M -4988a8145,8147 +4988a8147,8149 > Katharyn/M > Kathe/M > Katherina/M -4990a8150 +4990a8152 > Kathi/M -4993a8154 +4993a8156 > Kathlin/M -4996a8158 +4996a8160 > Kathryne/M -4997a8160,8161 +4997a8162,8163 > Kathye/M > Kati/M -4999a8164,8167 +4999a8166,8169 > Katine/M > Katinka/M > Katleen/M > Katlin/M -5003a8172,8177 +5003a8174,8179 > Katrine > Katrinka/M > Katti/M > Kattie/M > Katuscha/M > Katusha/M -5004a8179 +5004a8181 > Katya/M -5011a8187 +5011a8189 > Kaycee/M -5013a8190,8195 +5013a8192,8197 > Kayle/M > Kaylee/M > Kayley/M > Kaylil/M > Kaylyn/M > Kayne/M -5019a8202,8205 +5019a8204,8207 > Kean > Keane/M > Kearney/M > Keary/M -5022a8209,8215 +5022a8211,8217 > Keefe/RM > Keefer/M > Keelby/M @@ -4933,11 +4937,11 @@ > Keelia/M > Keely/M > Keen/M -5023a8217 +5023a8219 > Keene/M -5025a8220 +5025a8222 > Keir/M -5027a8223,8232 +5027a8225,8234 > Kelbee/M > Kelby/M > Kelcey/M @@ -4948,51 +4952,51 @@ > Kelila/M > Kellby/M > Kellen/M -5030a8236 +5030a8238 > Kellia/M -5031a8238 +5031a8240 > Kellina/M -5032a8240 +5032a8242 > Kellsie/M -5033a8242 +5033a8244 > Kellyann/M -5034a8244,8245 +5034a8246,8247 > Kelsi/M > Kelsy/M -5036a8248 +5036a8250 > Kelwin/M -5039a8252 +5039a8254 > Kendal/M -5040a8254 +5040a8256 > Kendell/M -5042c8256,8257 +5042c8258,8259 < Kendrick/M --- > Kendre/M > Kendrick/MS -5043a8259,8260 +5043a8261,8262 > Kenn/M > Kenna/M -5046a8264,8265 +5046a8266,8267 > Kennett/M > Kennie/M -5048a8268 +5048a8270 > Kenon/M -5059a8280,8281 +5059a8282,8283 > Ker/M > Kerby/M -5061a8284,8287 +5061a8286,8289 > Keriann/M > Kerianne/M > Kerk/M > Kermie/M -5062a8289 +5062a8291 > Kermy/M -5066a8294,8296 +5066a8296,8298 > Kerrie/M > Kerrill/M > Kerrin/M -5067a8298,8304 +5067a8300,8306 > Kerstin/M > Kerwin/M > Kerwinn/M @@ -5000,46 +5004,46 @@ > Keslie/M > Kessia/M > Kessiah/M -5068a8306,8310 +5068a8308,8312 > Ketti/M > Kettie/M > Ketty/M > Kev/MN > Kevan/M -5070a8313 +5070a8315 > Kevina/M -5071a8315 +5071a8317 > Kevon/M -5072a8317 +5072a8319 > Kevyn/M -5079a8325 +5079a8327 > Khalil/M -5094a8341,8343 +5094a8343,8345 > Ki/M > Kiah/M > Kial/M -5097a8347,8348 +5097a8349,8350 > Kiele/M > Kienan/M -5098a8350 +5098a8352 > Kiersten/M -5101a8354 +5101a8356 > Kikelia/M -5103a8357,8359 +5103a8359,8361 > Kile/M > Kiley/M > Kilian/M -5104a8361,8363 +5104a8363,8365 > Killian/M > Killie/M > Killy/M -5106a8366,8368 +5106a8368,8370 > Kimball/M > Kimbell/M > Kimberlee/M -5107a8370 +5107a8372 > Kimberli/M -5108a8372,8379 +5108a8374,8381 > Kimberlyn/M > Kimble/M > Kimbra/M @@ -5048,17 +5052,17 @@ > Kimmy/M > Kin/M > Kincaid/M -5109a8381,8382 +5109a8383,8384 > Kingsley > Kingsly/M -5112a8386 +5112a8388 > Kinna/M -5113a8388,8389 +5113a8390,8391 > Kinnie/M > Kinny/M -5115a8392 +5115a8394 > Kinsley/M -5118a8396,8403 +5118a8398,8405 > Kipp/MR > Kippar/M > Kipper/M @@ -5067,129 +5071,129 @@ > Kira/M > Kirbee/M > Kirbie/M -5124a8410 +5124a8412 > Kiri/M -5131a8418,8421 +5131a8420,8423 > Kirsteni/M > Kirsti/M > Kirstin/M > Kirstyn/M -5134a8425,8427 +5134a8427,8429 > Kissee/M > Kissiah/M > Kissie/M -5138a8432,8433 +5138a8434,8435 > Kitti/M > Kittie/M -5140a8436,8437 +5140a8438,8439 > Kizzee/M > Kizzie/M -5142a8440,8442 +5142a8442,8444 > Klara/M > Klarika/M > Klarrisa/M -5146a8447,8450 +5146a8449,8452 > Klemens/M > Klement/M > Kleon/M > Kliment/M -5172a8477 +5172a8479 > Koenraad/M -5183a8489,8493 +5183a8491,8495 > Konstance/M > Konstantin/M > Konstantine/M > Konstanze/M > Koo/M -5185a8496,8498 +5185a8498,8500 > Kora/M > Koral/M > Koralle/M -5187a8501,8502 +5187a8503,8504 > Kordula/M > Kore/M -5189a8505,8510 +5189a8507,8512 > Korella/M > Koren/M > Koressa/M > Korey/M > Kori/M > Korie/M -5190a8512,8515 +5190a8514,8517 > Korney/M > Korrie/M > Korry/M > Kort/M -5212a8538 +5212a8540 > Krisha/M -5213a8540 +5213a8542 > Krishnah/M -5214a8542,8544 +5214a8544,8546 > Krispin/M > Krissie/M > Krissy/M -5215a8546,8549 +5215a8548,8551 > Kristal/M > Kristan/M > Kriste/M > Kristel/M -5217c8551,8552 +5217c8553,8554 < Kristi/M --- > Kristi/MN > Kristian/M -5218a8554 +5218a8556 > Kristien/M -5221a8558,8562 +5221a8560,8564 > Kristo/SM > Kristofer/M > Kristoffer/M > Kristofor/M > Kristoforo/M -5223a8565 +5223a8567 > Kristyn/M -5230a8573 +5230a8575 > Krysta/M -5231a8575,8577 +5231a8577,8579 > Krystalle/M > Krystle/M > Krystyna/M -5259a8606 +5259a8608 > Kyla/M -5260a8608,8613 +5260a8610,8615 > Kylen/M > Kylie/M > Kylila/M > Kylynn/M > Kym/M > Kynthia/M -5262a8616 +5262a8618 > Kyrstin/M -5277c8631 +5277c8633 < LG --- > LG/M -5295a8650 +5295a8652 > Lacee/M -5297a8653 +5297a8655 > Lacie/M -5302a8659 +5302a8661 > Laetitia/M -5308a8666,8668 +5308a8668,8670 > Laina/M > Lainey/M > Laird/M -5315a8676 +5315a8678 > Lalo/M -5324a8686,8687 +5324a8688,8689 > Lammond/M > Lamond/M -5326a8690 +5326a8692 > Lanae/M -5337a8702,8703 +5337a8704,8705 > Lanette/M > Laney/M -5342a8709,8716 +5342a8711,8718 > Langsdon/M > Langston/M > Lani/M @@ -5198,190 +5202,190 @@ > Lanna/M > Lanni/M > Lannie/M -5352a8727 +5352a8729 > Laraine/M -5355a8731,8736 +5355a8733,8738 > Lari/M > Larina/M > Larine/M > Larisa/M > Larissa/M > Lark/M -5360a8742 +5360a8744 > Laryssa/M -5366a8749 +5366a8751 > Latashia/M -5367a8751 +5367a8753 > Latia/M -5373a8758,8759 +5373a8760,8761 > Latrena/M > Latrina/M -5378a8765,8766 +5378a8767,8768 > Laughton > Launce/M -5380a8769,8771 +5380a8771,8773 > Lauraine/M > Laural/M > Lauralee/M -5381a8773,8775 +5381a8775,8777 > Laure/M > Lauree/M > Laureen/M -5383c8777,8779 +5383c8779,8781 < Lauren/M --- > Laurella/M > Lauren/SM > Laurena/M -5384a8781 +5384a8783 > Laurene/M -5385a8783,8784 +5385a8785,8786 > Lauretta/M > Laurette/M -5386a8786,8787 +5386a8788,8789 > Laurianne/M > Laurice/M -5387a8789,8790 +5387a8791,8792 > Lauritz/M > Lauryn/M -5388a8792 +5388a8794 > Lavena/M -5389a8794 +5389a8796 > Laverna/M -5390a8796,8798 +5390a8798,8800 > Lavina/M > Lavinia/M > Lavinie/M -5392a8801 +5392a8803 > Law -5394a8804 +5394a8806 > Lawry/M -5395a8806,8807 +5395a8808,8809 > Lawton/M > Lay/M -5397a8810,8814 +5397a8812,8816 > Layne/M > Layney/M > Layton/M > Lazar/M > Lazare/M -5400c8817 +5400c8819 < Le/SM --- > Le/SMN -5407a8825 +5407a8827 > Leandra/M -5410a8829,8830 +5410a8831,8832 > Leanor/M > Leanora/M -5416a8837 +5416a8839 > Lebbie/M -5421a8843,8844 +5421a8845,8846 > Leeann/M > Leeanne/M -5422a8846,8851 +5422a8848,8853 > Leela/M > Leelah/M > Leeland/M > Leena/M > Leesa/M > Leese/M -5425a8855 +5425a8857 > Lefty/M -5429a8860 +5429a8862 > Legra/M -5431a8863 +5431a8865 > Leia/M -5436a8869,8870 +5436a8871,8872 > Leigha/M > Leighton/M -5437a8872 +5437a8874 > Leilah/M -5438a8874,8875 +5438a8876,8877 > Leisha/M > Lek/M -5439a8877 +5439a8879 > Lelah/M -5441a8880 +5441a8882 > Lem/M -5442a8882,8884 +5442a8884,8886 > Lemar/M > Lemmie/M > Lemmy/M -5447a8890,8892 +5447a8892,8894 > Lenci/M > Lenee/M > Lenette/M -5451a8897,8900 +5451a8899,8902 > Lenka/M > Lenna/M > Lennard/M > Lennie/M -5459a8909,8910 +5459a8911,8912 > Leodora/M > Leoine/M -5460a8912 +5460a8914 > Leoline/M -5462a8915 +5462a8917 > Leonanie/M -5465a8919 +5465a8921 > Leone/M -5466a8921,8923 +5466a8923,8925 > Leonelle/M > Leonerd/M > Leonhard/M -5468a8926 +5468a8928 > Leonie/M -5469a8928,8931 +5469a8930,8933 > Leonora/M > Leonore/M > Leontine/M > Leontyne/M -5471a8934 +5471a8936 > Leora/M -5475a8939 +5475a8941 > Leroi/M -5477a8942 +5477a8944 > Leshia/M -5478a8944 +5478a8946 > Lesli/M -5479a8946 +5479a8948 > Lesly/M -5484a8952 +5484a8954 > Lesya/M -5487a8956 +5487a8958 > Lethia/M -5488a8958 +5488a8960 > Letisha/M -5489a8960,8961 +5489a8962,8963 > Letizia/M > Letta/M -5490a8963,8967 +5490a8965,8969 > Letti/M > Lettie/M > Letty/M > Leupold/M > Lev -5492a8970 +5492a8972 > Levey/M -5494a8973 +5494a8975 > Levin/M -5497a8977 +5497a8979 > Levon/M -5499a8980,8981 +5499a8982,8983 > Lewes > Lewie/M -5501a8984,8987 +5501a8986,8989 > Lewiss > Lexi/SM > Lexie/M > Lexine/M -5503a8990,8993 +5503a8992,8995 > Lexy/M > Leyla/M > Lezley/M > Lezlie/M -5506a8997,9007 +5506a8999,9009 > Lia/M > Liam/M > Lian/M @@ -5393,15 +5397,15 @@ > Libbey/M > Libbi/M > Libbie/M -5515a9017 +5515a9019 > Licha/M -5516a9019 +5516a9021 > Lida/M -5522a9026 +5522a9028 > Lief/M -5523a9028 +5523a9030 > Liesa/M -5525,5526c9030,9033 +5525,5526c9032,9035 < Lila/M < Lilia/M --- @@ -5409,47 +5413,47 @@ > Lila/SM > Lilah/M > Lilia/MS -5528a9036 +5528a9038 > Liliane/M -5530a9039 +5530a9041 > Lilla/M -5531a9041 +5531a9043 > Lilli/MS -5535a9046 +5535a9048 > Lilllie/M -5538a9050 +5538a9052 > Lilyan/M -5547a9060 +5547a9062 > Linc/M -5551a9065,9067 +5551a9067,9069 > Lindi/M > Lindie/M > Lindon/M -5553a9070 +5553a9072 > Lindsy/M -5554a9072,9077 +5554a9074,9079 > Linea/M > Linell/M > Linet/M > Linette/M > Link/M > Linn/M -5555a9079,9083 +5555a9081,9085 > Linnea/M > Linnell/M > Linnet/M > Linnie/M > Linoel/M -5560a9089 +5560a9091 > Linzy/M -5561a9091 +5561a9093 > Lionello/M -5566a9097 +5566a9099 > Lira/M -5567a9099,9100 +5567a9101,9102 > Lisabeth/M > Lisbeth/M -5568a9102,9108 +5568a9104,9110 > Lise/M > Lisetta/M > Lisette/M @@ -5457,172 +5461,172 @@ > Lishe/M > Lisle/M > Lissa/M -5569a9110,9112 +5569a9112,9114 > Lissi/M > Lissie/M > Lissy/M -5573a9117 +5573a9119 > Lita/M -5577a9122,9124 +5577a9124,9126 > Liuka/M > Liv/M > Liva/M -5583a9131,9133 +5583a9133,9135 > Livvie/M > Livvy/M > Livvyy/M -5586a9137,9139 +5586a9139,9141 > Lizabeth/M > Lizbeth/M > Lizette/M -5591a9145 +5591a9147 > Llywellyn/M -5595a9150 +5595a9152 > Lock/M -5600a9156 +5600a9158 > Lodovico/M -5601a9158 +5601a9160 > Loella/M -5608a9166 +5608a9168 > Loise/M -5610a9169 +5610a9171 > Loleta/M -5613a9173 +5613a9175 > Lolly/M -5618a9179 +5618a9181 > Lona/M -5620a9182 +5620a9184 > Lonee/M -5624a9187,9190 +5624a9189,9192 > Loni/M > Lonna/M > Lonnard/M > Lonni/M -5625a9192 +5625a9194 > Lonny/M -5627a9195 +5627a9197 > Lorain/M -5628a9197,9200 +5628a9199,9202 > Loralee/M > Loralie/M > Loralyn/M > Lorant/M -5630a9203,9204 +5630a9205,9206 > Loree/M > Loreen/M -5632c9206,9207 +5632c9208,9209 < Loren --- > Lorelle/M > Loren/S -5636a9212 +5636a9214 > Lorenza/M -5638a9215 +5638a9217 > Lorette/M -5639a9217,9219 +5639a9219,9221 > Loria/M > Lorianna/M > Lorianne/M -5640a9221,9226 +5640a9223,9228 > Lorilee/M > Lorilyn/M > Lorin/M > Lorinda/M > Lorine/M > Lorita/M -5641a9228 +5641a9230 > Lorne/M -5642a9230 +5642a9232 > Lorrayne/M -5643a9232 +5643a9234 > Lorri/M -5644a9234,9236 +5644a9236,9238 > Lorrin/M > Lorry/M > Lory/M -5645a9238 +5645a9240 > Lothaire/M -5647a9241,9243 +5647a9243,9245 > Lotta/M > Lotte/M > Lotti/M -5648a9245 +5648a9247 > Lotty/M -5654a9252 +5654a9254 > Louisette/M -5659a9258 +5659a9260 > Loutitia/M -5663a9263 +5663a9265 > Lovell -5668a9269,9270 +5668a9271,9272 > Lowrance/M > Loy/M -5670a9273 +5670a9275 > Loydie/M -5681c9284,9285 +5681c9286,9287 < Lucas --- > Luca/SM > Lucais/M -5683c9287,9289 +5683c9289,9291 < Lucia/M --- > Lucho/M > Luci/MN > Lucia/MS -5684a9291 +5684a9293 > Luciana/M -5685a9293 +5685a9295 > Lucie/M -5686a9295 +5686a9297 > Lucienne/M -5687a9297 +5687a9299 > Lucila/M -5688a9299 +5688a9301 > Lucilia/M -5689a9301 +5689a9303 > Lucina -5690a9303 +5690a9305 > Lucine/M -5691a9305 +5691a9307 > Lucita/M -5694a9309 +5694a9311 > Lucky/M -5699a9315,9317 +5699a9317,9319 > Ludovico/M > Ludovika/M > Ludvig/M -5701a9320 +5701a9322 > Luelle/M -5708a9328,9329 +5708a9330,9331 > Luise/M > Lukas/M -5710a9332 +5710a9334 > Lulita/M -5717a9340,9341 +5717a9342,9343 > Lura/M > Lurette/M -5718a9343,9346 +5718a9345,9348 > Lurleen/M > Lurlene/M > Lurline/M > Lusa/M -5720a9349 +5720a9351 > Lutero/M -5731a9361 +5731a9363 > Ly/MY -5735a9366 +5735a9368 > Lyda/M -5737a9369,9370 +5737a9371,9372 > Lydie/M > Lydon/M -5742a9376 +5742a9378 > Lyn/M -5744a9379,9381 +5744a9381,9383 > Lynde/M > Lyndel/M > Lyndell/M -5745a9383,9389 +5745a9385,9391 > Lyndsay/M > Lyndsey/M > Lyndsie/M @@ -5630,158 +5634,158 @@ > Lynea/M > Lynelle/M > Lynett/M -5747a9392 +5747a9394 > Lynna/M -5748a9394,9398 +5748a9396,9400 > Lynnea/M > Lynnell/M > Lynnelle/M > Lynnet/M > Lynnett/M -5749a9400 +5749a9402 > Lynsey/M -5754a9406 +5754a9408 > Lyssa/M -5768c9420 +5768c9422 < MHz --- > MHz/M -5789a9442 +5789a9444 > Mab -5790a9444 +5790a9446 > Mabelle/M -5818a9473 +5818a9475 > Mada/M -5820a9476,9478 +5820a9478,9480 > Madalena/M > Madalyn/M > Maddalena/M -5821a9480,9481 +5821a9482,9483 > Maddi/M > Maddie/M -5822a9483 +5822a9485 > Maddy/M -5823a9485,9486 +5823a9487,9488 > Madel/M > Madelaine/M -5824a9488,9491 +5824a9490,9493 > Madelena/M > Madelene/M > Madelin/M > Madelina/M -5825a9493,9495 +5825a9495,9497 > Madella/M > Madelle/M > Madelon/M -5828a9499,9500 +5828a9501,9502 > Madlen/M > Madlin/M -5832a9505 +5832a9507 > Mady/M -5833a9507 +5833a9509 > Maegan/M -5836a9511,9514 +5836a9513,9516 > Mag/M > Magda/M > Magdaia/M > Magdalen -5840a9519,9520 +5840a9521,9522 > Maggee/M > Maggi/M -5841a9522 +5841a9524 > Maggy/M -5845a9527 +5845a9529 > Magnum -5852a9535,9536 +5852a9537,9538 > Mahala/M > Mahalia/M -5860a9545,9546 +5860a9547,9548 > Mahmoud/M > Mahmud/M -5862a9549,9550 +5862a9551,9552 > Maia/M > Maible/M -5863a9552,9553 +5863a9554,9555 > Maiga/M > Maighdiln/M -5870a9561,9563 +5870a9563,9565 > Mair/M > Maire/M > Maisey/M -5871a9565,9566 +5871a9567,9568 > Maison/M > Maitilde/M -5873a9569 +5873a9571 > Maje/M -5879a9576,9577 +5879a9578,9579 > Mal > Mala/M -5885a9584 +5885a9586 > Malanie/M -5894a9594 +5894a9596 > Malchy/M -5900a9601 +5900a9603 > Malena/M -5901a9603 +5901a9605 > Malia/M -5903a9606 +5903a9608 > Malina/M -5904a9608 +5904a9610 > Malinde/M -5905a9610,9611 +5905a9612,9613 > Malissa/M > Malissia/M -5906a9613 +5906a9615 > Mallissa/M -5907a9615 +5907a9617 > Mallorie/M -5909a9618 +5909a9620 > Malorie/M -5916a9626,9630 +5916a9628,9632 > Malva/M > Malvin/M > Malvina/M > Malynda/M > Mame/M -5932a9647 +5932a9649 > Manda/M -5934a9650 +5934a9652 > Mandel/M -5936a9653,9654 +5936a9655,9656 > Mandi/M > Mandie/M -5938a9657 +5938a9659 > Mandriva/M -5950a9670,9674 +5950a9672,9676 > Mannie/M > Manny/M > Mano/M > Manolo/M > Manon/M -5957a9682 +5957a9684 > Manya/M -5964c9689 +5964c9691 < Mar/SM --- > Mar/SMN -5965a9691 +5965a9693 > Marabel/M -5973a9700,9701 +5973a9702,9703 > Marcela/M > Marcelia/M -5975a9704,9708 +5975a9706,9710 > Marcelle/M > Marcellina/M > Marcelline/M > Marcello/M > Marcellus -5977a9711,9712 +5977a9713,9714 > Marchall/M > Marchelle/M -5981a9717,9718 +5981a9719,9720 > Marcile/M > Marcille/M -5987a9725,9731 +5987a9727,9733 > Mareah/M > Maren/M > Marena/M @@ -5789,46 +5793,46 @@ > Marga/M > Margalit/M > Margalo/M -5988a9733,9738 +5988a9735,9740 > Margareta/M > Margarete/M > Margaretha/M > Margarethe/M > Margaretta/M > Margarette/M -5990a9741 +5990a9743 > Margaux -5991a9743 +5991a9745 > Margeaux/M -5992a9745,9747 +5992a9747,9749 > Marget/M > Margette/M > Margi/M -5993a9749 +5993a9751 > Margit/M -5994a9751 +5994a9753 > Margot/M -5997a9755 +5997a9757 > Margy/M -5999a9758 +5999a9760 > Mariam/M -6001a9761,9762 +6001a9763,9764 > Mariann/M > Marianna/M -6004a9766,9768 +6004a9768,9770 > Maribelle/M > Maribeth/M > Marice/M -6005a9770 +6005a9772 > Maridel/M -6006a9772,9777 +6006a9774,9779 > Marieann/M > Mariejeanne/M > Mariel/M > Mariele/M > Marielle/M > Mariellen/M -6007a9779,9786 +6007a9781,9788 > Mariette/M > Marigold/M > Marijn/M @@ -5837,225 +5841,225 @@ > Marilee/M > Marilin/M > Marillin/M -6011a9791 +6011a9793 > Marinna/M -6013a9794 +6013a9796 > Mariquilla/M -6014a9796 +6014a9798 > Mariska/M -6016a9799 +6016a9801 > Marita/M -6017a9801 +6017a9803 > Maritsa -6020a9805,9810 +6020a9807,9812 > Mariya/M > Marj/M > Marja/M > Marje/M > Marji/M > Marjie/M -6022a9813 +6022a9815 > Marjy/M -6024a9816 +6024a9818 > Marketa/M -6025a9818 +6025a9820 > Markos -6026a9820 +6026a9822 > Markus/M -6027a9822 +6027a9824 > Marlane/M -6029a9825,9828 +6029a9827,9830 > Marleah/M > Marlee/M > Marleen/M > Marlena/M -6031a9831 +6031a9833 > Marlie/M -6032a9833,9834 +6032a9835,9836 > Marline/M > Marlo/M -6033a9836 +6033a9838 > Marlow/M -6034a9838,9839 +6034a9840,9841 > Marlyn/M > Marmaduke/M -6035a9841 +6035a9843 > Marna/M -6036a9843,9846 +6036a9845,9848 > Marney/M > Marni/M > Marnia/M > Marnie/M -6044a9855 +6044a9857 > Marrilee/M -6045a9857,9858 +6045a9859,9860 > Marris/M > Marrissa/M -6051a9865 +6051a9867 > Marshal/M -6052a9867,9868 +6052a9869,9870 > Marsiella/M > Mart/MN -6053a9870 +6053a9872 > Martainn/M -6054a9872,9874 +6054a9874,9876 > Martelle/M > Marten/M > Martguerita/M -6055a9876,9878 +6055a9878,9880 > Marthe/M > Marthena/M > Marti/M -6057a9881,9882 +6057a9883,9884 > Martica/M > Martie/M -6061a9887,9888 +6061a9889,9890 > Martino/M > Martita/M -6062a9890,9892 +6062a9892,9894 > Martyn/M > Martynne/M > Marv/MN -6063a9894 +6063a9896 > Marve/M -6064a9896 +6064a9898 > Marven/M -6065a9898 +6065a9900 > Marwin/M -6070a9904 +6070a9906 > Marya/M -6071a9906 +6071a9908 > Maryanna/M -6072a9908,9909 +6072a9910,9911 > Marybelle/M > Marybeth/M -6073a9911,9913 +6073a9913,9915 > Maryjane/M > Maryjo/M > Maryl/M -6074a9915,9917 +6074a9917,9919 > Marylee/M > Marylin/M > Marylinda/M -6075a9919,9922 +6075a9921,9924 > Marylynne/M > Maryrose/M > Marys > Marysa/M -6082a9930 +6082a9932 > Masha/M -6091a9940,9941 +6091a9942,9943 > Massimiliano/M > Massimo/M -6094c9944,9947 +6094c9946,9949 < Mather --- > Mata/M > Matelda/M > Mateo/M > Mathe/MR -6096a9950 +6096a9952 > Mathian/M -6097a9952,9953 +6097a9954,9955 > Mathilda/M > Mathilde/M -6098a9955 +6098a9957 > Matias/M -6099a9957 +6099a9959 > Matilde/M -6102a9961 +6102a9963 > Matteo/M -6103a9963,9964 +6103a9965,9966 > Matthaeus/M > Mattheus/M -6105a9967,9971 +6105a9969,9973 > Matthieu/M > Matthiew/M > Matthus/M > Matti/M > Mattias/M -6106a9973 +6106a9975 > Matty/M -6108a9976 +6108a9978 > Maudie/M -6112a9981 +6112a9983 > Maure/M -6113a9983,9984 +6113a9985,9986 > Maureene/M > Maurene/M -6116a9988 +6116a9990 > Maurie/M -6117a9990,9991 +6117a9992,9993 > Maurise/M > Maurita/M -6121a9996,9998 +6121a9998,10000 > Maurits/M > Maurizia/M > Maurizio/M -6123a10001 +6123a10003 > Maury -6126a10005 +6126a10007 > Mavra/M -6127a10007,10009 +6127a10009,10011 > Maxi/M > Maxie/M > Maxim -6128a10011,10013 +6128a10013,10015 > Maximilianus/M > Maximilien/M > Maximo/M -6130a10016 +6130a10018 > Maxy/M -6133a10020,10021 +6133a10022,10023 > Maybelle/M > Maye/M -6136a10025,10026 +6136a10027,10028 > Mayne/M > Maynord/M -6137a10028 +6137a10030 > Mayor/M -6203a10095 +6203a10097 > Meaghan/M -6204a10097 +6204a10099 > Meara/M -6205a10099 +6205a10101 > Mechelle/M -6216c10110 +6216c10112 < Meg/M --- > Meg/MN -6217a10112,10115 +6217a10114,10117 > Megen/M > Meggi/M > Meggie/M > Meggy/M -6218a10117,10119 +6218a10119,10121 > Meghann/M > Mehetabel/M > Mei/MR -6225c10126,10128 +6225c10128,10130 < Mel/M --- > Mel/MY > Mela/M > Melamie/M -6227a10131 +6227a10133 > Melania/M -6228a10133,10134 +6228a10135,10136 > Melantha/M > Melany/M -6233a10140,10143 +6233a10142,10145 > Melesa/M > Melessa/M > Melicent/M > Melina/M -6234a10145 +6234a10147 > Melinde/M -6236a10148,10150 +6236a10150,10152 > Melisandra/M > Melisenda/M > Melisent/M -6237a10152,10160 +6237a10154,10162 > Melisse/M > Melita/M > Melitta/M @@ -6065,31 +6069,31 @@ > Mellie/M > Mellisa/M > Mellisent/M -6238a10162,10165 +6238a10164,10167 > Melloney/M > Melly/M > Melodee/M > Melodie/M -6239a10167,10169 +6239a10169,10171 > Melonie/M > Melony/M > Melosa/M -6244a10175 +6244a10177 > Melvyn/M -6247a10179 +6247a10181 > Menard/M -6254a10187 +6254a10189 > Mendie/M -6256a10190 +6256a10192 > Mendy/M -6277a10212 +6277a10214 > Merci/M -6278a10214 +6278a10216 > Mercie/M -6281a10218,10219 +6281a10220,10221 > Mercy/M > Meredeth/M -6282a10221,10228 +6282a10223,10230 > Meredithe/M > Merell/M > Meridel/M @@ -6098,360 +6102,360 @@ > Merilee/M > Merill/M > Merilyn/M -6283a10230,10233 +6283a10232,10235 > Meris > Merissa/M > Merl/M > Merla/M -6285a10236,10237 +6285a10238,10239 > Merlina/M > Merline/M -6286a10239,10240 +6286a10241,10242 > Merna/M > Merola/M -6287a10242,10243 +6287a10244,10245 > Merralee/M > Merrel/M -6289a10246,10251 +6289a10248,10253 > Merridie/M > Merrie/M > Merrielle/M > Merrile/M > Merrilee/M > Merrili/M -6290a10253 +6290a10255 > Merrily/M -6292a10256,10257 +6292a10258,10259 > Merry/M > Mersey -6294a10260 +6294a10262 > Merv/M -6295a10262,10264 +6295a10264,10266 > Merwin/M > Merwyn/M > Meryl/M -6329a10299,10300 +6329a10301,10302 > Mic > Micaela/M -6333a10305,10308 +6333a10307,10310 > Michaela/M > Michaelina/M > Michaeline/M > Michaella/M -6334a10310,10312 +6334a10312,10314 > Michail/M > Michal/M > Michale/M -6335a10314 +6335a10316 > Micheil/M -6339a10319,10321 +6339a10321,10323 > Michelina/M > Micheline/M > Michell/M -6347a10330 +6347a10332 > Micki/M -6357a10341 +6357a10343 > Midge/M -6361a10346,10347 +6361a10348,10349 > Mignon/M > Mignonne/M -6362a10349,10352 +6362a10351,10354 > Miguela/M > Miguelita/M > Mikael/M > Mikaela/M -6363a10354,10355 +6363a10356,10357 > Mikel/M > Mikey/M -6364a10357,10358 +6364a10359,10360 > Mikkel/M > Mikol/M -6365a10360 +6365a10362 > Mil/MY -6370c10365,10367 +6370c10367,10369 < Miles --- > Mildrid/M > Mile/SM > Milena/M -6371a10369,10371 +6371a10371,10373 > Milicent/M > Milissent/M > Milka/M -6376a10377 +6376a10379 > Milli/M -6379a10381,10382 +6379a10383,10384 > Millisent/M > Milly/M -6383a10387 +6383a10389 > Milt/M -6384a10389 +6384a10391 > Miltie/M -6387a10393 +6387a10395 > Milty/M -6388a10395 +6388a10397 > Milzie/M -6391c10398,10399 +6391c10400,10401 < Min/M --- > Min/MR > Mina/M -6392a10401 +6392a10403 > Minda/M -6395a10405 +6395a10407 > Miner/M -6396a10407,10408 +6396a10409,10410 > Minetta/M > Minette/M -6398a10411,10413 +6398a10413,10415 > Minna > Minnaminnie/M > Minne/M -6402a10418 +6402a10420 > Minni/M -6403a10420,10421 +6403a10422,10423 > Minnnie/M > Minny/M -6405a10424 +6405a10426 > Minor/M -6410a10430 +6410a10432 > Minta/M -6414a10435 +6414a10437 > Miquela/M -6417a10439,10441 +6417a10441,10443 > Mirabel/M > Mirabella/M > Mirabelle/M -6418a10443 +6418a10445 > Miran/M -6419a10445,10448 +6419a10447,10450 > Mireielle/M > Mireille/M > Mirella/M > Mirelle/M -6421a10451,10452 +6421a10453,10454 > Mirilla/M > Mirna/M -6423a10455,10456 +6423a10457,10458 > Mischa/M > Misha/M -6425a10459 +6425a10461 > Missie/M -6433a10468 +6433a10470 > Misti -6436a10472 +6436a10474 > Mitchael/M -6457a10494,10496 +6457a10496,10498 > Modesta/M > Modestia/M > Modestine/M -6458a10498 +6458a10500 > Modesty/M -6469a10510,10511 +6469a10512,10513 > Mohandas/M > Mohandis/M -6475a10518 +6475a10520 > Moina/M -6477c10520 +6477c10522 < Moises --- > Moise/MS -6478a10522 +6478a10524 > Moishe/M -6486a10531,10532 +6486a10533,10534 > Mollee/M > Molli/M -6494a10541 +6494a10543 > Mommy/M -6498a10546 +6498a10548 > Monah/M -6510a10559 +6510a10561 > Monika/M -6514a10564 +6514a10566 > Monro/M -6535a10586 +6535a10588 > Monti/M -6549a10601 +6549a10603 > Mora/M -6553a10606,10607 +6553a10608,10609 > Mord/M > Mordecai -6554a10609 +6554a10611 > Mordy/M -6555a10611,10612 +6555a10613,10614 > Moreen/M > Morena/M -6556a10614 +6556a10616 > Morey/M -6557a10616,10621 +6557a10618,10623 > Morgana/M > Morganica/M > Morganne/M > Morgen/M > Morgun/M > Moria/M -6558a10623 +6558a10625 > Morie/M -6560a10626 +6560a10628 > Morissa/M -6561a10628,10629 +6561a10630,10631 > Moritz/M > Morlee/M -6562a10631 +6562a10633 > Morly/M -6564a10634 +6564a10636 > Morna/M -6570a10641 +6570a10643 > Morrie/M -6573a10645 +6573a10647 > Morry/M -6575c10647,10649 +6575c10649,10651 < Mort/M --- > Mort/MN > Morten/M > Mortie/M -6577a10652 +6577a10654 > Morty/M -6579a10655 +6579a10657 > Mose/SM -6582a10659 +6582a10661 > Moshe/M -6596a10674,10675 +6596a10676,10677 > Moyna/M > Moyra/M -6600c10679,10680 +6600c10681,10682 < Mozilla/M --- > Mozelle/M > Mozes/M -6608a10689,10691 +6608a10691,10693 > Muffin/M > Mufi/M > Mufinella/M -6613a10697 +6613a10699 > Muire/M -6628a10713 +6628a10715 > Munmro/M -6630a10716 +6630a10718 > Munroe/M -6637a10724,10726 +6637a10726,10728 > Murdock/M > Mureil/M > Murial/M -6638a10728 +6638a10730 > Murielle/M -6645a10736,10737 +6645a10738,10739 > Murry/M > Murvyn/M -6657a10750 +6657a10752 > My/M -6659a10753,10754 +6659a10755,10756 > Myca/M > Mycah/M -6662c10757,10758 +6662c10759,10760 < Myers --- > Mychal/M > Myer/SM -6664a10761 +6664a10763 > Mylo/M -6665a10763,10764 +6665a10765,10766 > Myrah/M > Myranda/M -6666a10766,10769 +6666a10768,10771 > Myriam/M > Myrilla/M > Myrle/M > Myrlene/M -6668a10772,10775 +6668a10774,10777 > Myrta/M > Myrtia/M > Myrtice/M > Myrtie/M -6669a10777,10778 +6669a10779,10780 > Myrvyn/M > Myrwyn/M -6670a10780 +6670a10782 > MySpell/M -6720a10831,10833 +6720a10833,10835 > Nada/M > Nadean/M > Nadeen/M -6723a10837,10839 +6723a10839,10841 > Nadiya/M > Nady/M > Nadya/M -6733a10850 +6733a10852 > Nalani/M -6738a10856 +6738a10858 > Nana/M -6739a10858,10861 +6739a10860,10863 > Nananne/M > Nance/M > Nancee/M > Nancey/M -6740a10863,10864 +6740a10865,10866 > Nanci/M > Nancie/M -6741a10866 +6741a10868 > Nanete/M -6742a10868,10870 +6742a10870,10872 > Nani/M > Nanice/M > Nanine/M -6744a10873,10874 +6744a10875,10876 > Nannette/M > Nanni/M -6745a10876,10877 +6745a10878,10879 > Nanny/M > Nanon/M -6749a10882 +6749a10884 > Naoma/M -6750a10884 +6750a10886 > Nap/M -6755a10890,10891 +6755a10892,10893 > Nappie/M > Nappy/M -6756a10893 +6756a10895 > Nara -6757a10895,10896 +6757a10897,10898 > Nari/M > Nariko/M -6767a10907,10911 +6767a10909,10913 > Nata/M > Natal/M > Natala/M > Natale/M > Natalee/M -6769a10914,10917 +6769a10916,10919 > Natalina/M > Nataline/M > Natalya/M > Nataniel/M -6770a10919 +6770a10921 > Natassia/M -6772a10922,10923 +6772a10924,10925 > Nathalia/M > Nathalie/M -6773a10925,10926 +6773a10927,10928 > Nathanael > Nathanial/M -6774a10928 +6774a10930 > Nathanil/M -6775a10930 +6775a10932 > Natividad/M -6776a10932,10933 +6776a10934,10935 > Natka/M > Natty/M -6800a10958,10963 +6800a10960,10965 > Neala/M > Neale/M > Neall/M > Nealon/M > Nealson/M > Nealy/M -6808a10972,10979 +6808a10974,10981 > Neda/M > Nedda/M > Neddie/M @@ -6460,7 +6464,7 @@ > Neel/M > Neely/M > Nefen/M -6818c10989,10994 +6818c10991,10996 < Neil/M --- > Neil/SM @@ -6469,18 +6473,18 @@ > Neill/M > Neilla/M > Neille/M -6819a10996,10997 +6819a10998,10999 > Nelia/M > Nelie/M -6820a10999,11000 +6820a11001,11002 > Nelle/M > Nelli/M -6822a11003 +6822a11005 > Nels/N -6834a11016,11017 +6834a11018,11019 > Nerissa/M > Nerita/M -6835a11019,11025 +6835a11021,11027 > Neron/M > Nert/M > Nerta/M @@ -6488,45 +6492,45 @@ > Nerti/M > Nertie/M > Nerty/M -6837a11028 +6837a11030 > Nessa/M -6838a11030,11034 +6838a11032,11036 > Nessi/M > Nessie/M > Nessy/M > Nesta/M > Nester/M -6844c11040,11041 +6844c11042,11043 < Netscape/M --- > Netta/M > Netti/M -6845a11043,11044 +6845a11045,11046 > Nettle/M > Netty/M -6851a11051,11054 +6851a11053,11056 > Nevil/M > Nevile/M > Neville/M > Nevin/MS -6852a11056 +6852a11058 > Nevsa/M -6862a11067 +6862a11069 > Neysa/M -6866a11072,11073 +6866a11074,11075 > Nial/M > Niall/M -6875a11083 +6875a11085 > Nichol/SM -6878c11086 +6878c11088 < Nichols --- > Nicholle/M -6881a11090,11092 +6881a11092,11094 > Nickey/M > Nicki/M > Nickie/M -6883c11094,11099 +6883c11096,11101 < Nickolas --- > Nicko/M @@ -6535,221 +6539,221 @@ > Nickolaus/M > Nicky/M > Nico/M -6885a11102 +6885a11104 > Nicol/M -6886a11104 +6886a11106 > Nicolai/S -6887a11106,11111 +6887a11108,11113 > Nicolea/M > Nicolette/M > Nicoli/SM > Nicolina/M > Nicoline/M > Nicolle/M -6890c11114,11115 +6890c11116,11117 < Nielsen --- > Niel/SM > Niels/N -6899a11125 +6899a11127 > Nikaniki/M -6900a11127 +6900a11129 > Niki/M -6903a11131,11133 +6903a11133,11135 > Nikkie/M > Niko/SM > Nikola/SM -6904a11135,11136 +6904a11137,11138 > Nikolaos/M > Nikolaus/M -6905a11138,11140 +6905a11140,11142 > Nikoletta/M > Nikolia/M > Nikolos/M -6907c11142,11144 +6907c11144,11146 < Nile/M --- > Nil/SM > Nile/SM > Nilson/M -6910a11148,11149 +6910a11150,11151 > Ninetta/M > Ninette/M -6911a11151,11153 +6911a11153,11155 > Ninnetta/M > Ninnette/M > Ninon/M -6919a11162 +6919a11164 > Nissa/M -6920a11164,11166 +6920a11166,11168 > Nisse/M > Nissie/M > Nissy/M -6922a11169,11170 +6922a11171,11172 > Niven/M > Nixie -6926a11175 +6926a11177 > Noach/M -6927a11177,11180 +6927a11179,11182 > Noak/M > Noam/M > Noami/M > Nobe/M -6929a11183 +6929a11185 > Nobie/M -6930a11185 +6930a11187 > Noby/M -6932a11188,11190 +6932a11190,11192 > Noelani/M > Noell/M > Noella/M -6933a11192,11193 +6933a11194,11195 > Noellyn/M > Noelyn/M -6938a11199,11204 +6938a11201,11206 > Nolana/M > Noland/M > Nolie/M > Noll/M > Nollie/M > Nolly/M -6939a11206 +6939a11208 > Nomi/M -6940a11208,11212 +6940a11210,11214 > Nonah/M > Noni/M > Nonie/M > Nonna/M > Nonnah/M -6942a11215 +6942a11217 > Norah/M -6944a11218,11219 +6944a11220,11221 > Norbie/M > Norby/M -6945a11221 +6945a11223 > Norean/M -6946a11223 +6946a11225 > Norene/M -6948a11226,11227 +6948a11228,11229 > Norina/M > Norine/M -6952a11232,11233 +6952a11234,11235 > Normie/M > Normy/M -6954c11235,11237 +6954c11237,11239 < Norris --- > Norri/MS > Norrie/M > Norry/M -6973a11257 +6973a11259 > Notre -6979a11264 +6979a11266 > Novelia/M -6985a11271 +6985a11273 > Nowell/M -7001a11288,11289 +7001a11290,11291 > Nydia/M > Nye/M -7002a11291 +7002a11293 > Nyssa/M -7042c11331 +7042c11333 < Ob/M --- > Ob/MD -7043a11333,11335 +7043a11335,11337 > Obadias/M > Obed/M > Obediah/M -7046a11339,11341 +7046a11341,11343 > Obidiah/M > Obie > Oby/M -7057a11353 +7057a11355 > Octavius/M -7058a11355,11358 +7058a11357,11360 > Ode/RM > Odele/M > Odelia/M > Odelinda/M -7059a11360,11361 +7059a11362,11363 > Odella/M > Odelle/M -7062a11365,11370 +7062a11367,11372 > Odetta/M > Odette/M > Odey/M > Odie/M > Odilia/M > Odille/M -7064a11373 +7064a11375 > Odo/M -7065a11375 +7065a11377 > Ody/M -7071a11382 +7071a11384 > Ofella/M -7073a11385 +7073a11387 > Ofilia/M -7074a11387 +7074a11389 > Ogdan/M -7075a11389 +7075a11391 > Ogdon/M -7094a11409 +7094a11411 > Olag/M -7100a11416 +7100a11418 > Ole/MV -7102a11419,11420 +7102a11421,11422 > Olenka/M > Olenolin/M -7103a11422 +7103a11424 > Olia/M -7104a11424 +7104a11426 > Olimpia/M -7106a11427,11428 +7106a11429,11430 > Olivero/M > Olivette/M -7109c11431,11433 +7109c11433,11435 < Olivier --- > Olivie/MR > Oliviero/M > Oliy/M -7110a11435 +7110a11437 > Olly/M -7114a11440,11443 +7114a11442,11445 > Olva/M > Olvan/M > Olwen/M > Olympe/M -7118a11448 +7118a11450 > Olympie/M -7125a11456 +7125a11458 > Omero/M -7128a11460 +7128a11462 > Ondrea/M -7132a11465,11467 +7132a11467,11469 > Onfre/M > Onfroi/M > Onida/M -7134a11470 +7134a11472 > Onofredo/M -7139a11476 +7139a11478 > Oona/M -7141a11479,11480 +7141a11481,11482 > Opalina/M > Opaline/M -7143a11483 +7143a11485 > Ophelie/M -7148a11489,11493 +7148a11491,11495 > Oralee/M > Oralia/M > Oralie/M > Oralla/M > Oralle/M -7151a11497,11498 +7151a11499,11500 > Orazio/M > Orbadiah/M -7157a11505,11511 +7157a11507,11513 > Orel > Orelee/M > Orelia/M @@ -6757,12 +6761,12 @@ > Orella/M > Orelle/M > Oren/M -7159a11514 +7159a11516 > Oriana/M -7167a11523,11524 +7167a11525,11526 > Orlan/M > Orland/M -7174c11531,11537 +7174c11533,11539 < Orr/M --- > Orr/MN @@ -6772,348 +6776,348 @@ > Orsa/M > Orsola/M > Orson/M -7175a11539 +7175a11541 > Ortensia/M -7177a11542,11543 +7177a11544,11545 > Orton/M > Orv/M -7186a11553,11554 +7186a11555,11556 > Osbourn/M > Osbourne/M -7194a11563,11565 +7194a11565,11567 > Osmond/M > Osmund/M > Ossie/M -7198a11570,11574 +7198a11572,11576 > Oswell/M > Otes > Otha/M > Othelia/M > Othella/M -7199a11576,11578 +7199a11578,11580 > Othilia/M > Othilie/M > Otho/M -7201a11581 +7201a11583 > Ottilie/M -7217a11598 +7217a11600 > Ozzy/M -7264a11646,11648 +7264a11648,11650 > Packston/M > Paco/M > Pacorro/M -7265a11650,11651 +7265a11652,11653 > Paddie/M > Paddy/M -7266a11653,11654 +7266a11655,11656 > Padget/M > Padgett/M -7267a11656,11658 +7267a11658,11660 > Padraic/M > Padraig/M > Padriac/M -7272a11664 +7272a11666 > Pail/M -7288a11681 +7288a11683 > Palin/MS -7289a11683 +7289a11685 > Pall/M -7291c11685 +7291c11687 < Palmer --- > Palm/MR -7294a11689 +7294a11691 > Paloma/M -7297a11693,11694 +7297a11695,11696 > Pamelina/M > Pamella/M -7298a11696,11698 +7298a11698,11700 > Pammi/M > Pammie/M > Pammy/M -7303a11704,11705 +7303a11706,11707 > Panchito/M > Pancho/M -7307a11710 +7307a11712 > Pansie/M -7312a11716,11721 +7312a11718,11723 > Paola/M > Paolina/M > Paolo/M > Papagena/M > Papageno/M > Paquito/M -7325a11735 +7325a11737 > Parke/M -7335a11746,11747 +7335a11748,11749 > Parrnell/M > Parry -7341a11754 +7341a11756 > Pascale/M -7347c11760 +7347c11762 < Pat --- > Pat/N -7351a11765 +7351a11767 > Paten/M -7352a11767,11768 +7352a11769,11770 > Patience/M > Patin/M -7353a11770,11771 +7353a11772,11773 > Paton > Patric/M -7356a11775 +7356a11777 > Patricio/M -7357a11777,11779 +7357a11779,11781 > Patrizia/M > Patrizio/M > Patrizius/M -7358a11781 +7358a11783 > Patten/M -7360a11784,11785 +7360a11786,11787 > Pattie/M > Pattin/M -7364a11790,11791 +7364a11792,11793 > Paule/M > Pauletta/M -7366a11794,11795 +7366a11796,11797 > Paulie/M > Paulina/M -7367a11797,11799 +7367a11799,11801 > Paulita/M > Paulo/M > Pauly/M -7368a11801,11803 +7368a11803,11805 > Pavel/M > Pavia/M > Pavla/M -7372a11808,11809 +7372a11810,11811 > Paxon/M > Paxton -7375c11812 +7375c11814 < Paypal/M --- > Payton/M -7379a11817 +7379a11819 > Peadar/M -7380a11819 +7380a11821 > Pearce/M -7381a11821,11822 +7381a11823,11824 > Pearla/M > Pearle/M -7382a11824 +7382a11826 > Pearline/M -7384a11827 +7384a11829 > Pebrook/M -7388a11832 +7388a11834 > Peder/M -7392a11837,11839 +7392a11839,11841 > Pegeen/M > Peggi/M > Peggie/M -7395a11843 +7395a11845 > Peirce/M -7405c11853 +7405c11855 < Penelope/M --- > Penelopa/M -7408a11857,11858 +7408a11859,11860 > Penni/M > Pennie/M -7413a11864 +7413a11866 > Penrod/M -7422a11874,11876 +7422a11876,11878 > Pepe/M > Pepi/M > Pepillo/M -7423a11878,11879 +7423a11880,11881 > Pepita/M > Pepito/M -7426a11883 +7426a11885 > Perceval -7431a11889,11891 +7431a11891,11893 > Peri/M > Peria/M > Perice/M -7434c11894 +7434c11896 < Perkins --- > Perkin/MS -7435a11896,11897 +7435a11898,11899 > Perla/M > Perle/M -7438a11901 +7438a11903 > Pernell/M -7441a11905,11907 +7441a11907,11909 > Perren/M > Perri/M > Perrine/M -7449a11916 +7449a11918 > Persis -7453a11921,11922 +7453a11923,11924 > Pet > Peta/M -7458a11928,11930 +7458a11930,11932 > Peterus/M > Petey/M > Petr/M -7460a11933,11937 +7460a11935,11939 > Petrina/M > Petronella/M > Petronia/M > Petronilla/M > Petronille/M -7461a11939 +7461a11941 > Petunia/M -7462a11941,11942 +7462a11943,11944 > Peyter/M > Peyton/M -7467a11948 +7467a11950 > Phaidra/M -7473a11955,11956 +7473a11957,11958 > Phebe > Phedra/M -7474a11958 +7474a11960 > Phelia/M -7478a11963 +7478a11965 > Philbert/M -7481a11967,11968 +7481a11969,11970 > Philipa/M > Philippa/M -7484a11972 +7484a11974 > Philis/M -7485a11974,11975 +7485a11976,11977 > Phillida/M > Phillie/M -7487a11978,11980 +7487a11980,11982 > Phillipe/M > Phillipp/M > Phillis/M -7488a11982,11984 +7488a11984,11986 > Philomena/M > Phineas/M > Phip/M -7494a11991,11992 +7494a11993,11994 > Photoshopped > Photoshopping -7498a11997,11998 +7498a11999,12000 > Phylis/M > Phyllida/M -7499a12000,12002 +7499a12002,12004 > Phyllys/M > Phylys/M > Pia/M -7509a12013 +7509a12015 > Pictor -7510a12015 +7510a12017 > Pier/M -7511a12017 +7511a12019 > Pierette/M -7512a12019 +7512a12021 > Pierrette/M -7513a12021,12026 +7513a12023,12028 > Pierson/M > Pieter/M > Pietra/M > Pietrek/M > Pietro/M > Piggy/M -7520a12034,12035 +7520a12036,12037 > Pincas/M > Pinchas/M -7527a12043,12046 +7527a12045,12048 > Piotr/M > Pip/MR > Piper/M > Pippa/M -7528a12048,12049 +7528a12050,12051 > Pippo/M > Pippy/M -7559c12080 +7559c12082 < Pleiades's --- > Pleiades/M -7620a12142 +7620a12144 > Poppy/M -7626a12149 +7626a12151 > Portie/M -7631a12155 +7631a12157 > Porty/M -7639a12164 +7639a12166 > Poul/M -7647c12172 +7647c12174 < Pr/M --- > Pr/MN -7661a12187 +7661a12189 > Pren/M -7662a12189 +7662a12191 > Prent/M -7663a12191 +7663a12193 > Prentiss/M -7679a12208,12211 +7679a12210,12213 > Prinz > Pris > Prisca/M > Priscella/M -7680a12213 +7680a12215 > Prissie/M -7707a12241 +7707a12243 > Pru/M -7709a12244,12246 +7709a12246,12248 > Prudi/M > Prudy/M > Prue/M -7713a12251 +7713a12253 > Pryce/M -7727a12266 +7727a12268 > Puff/M -7751a12291 +7751a12293 > Putnem/M -7793a12334 +7793a12336 > Queenie/M -7795a12337 +7795a12339 > Quent/M -7796a12339 +7796a12341 > Querida/M -7798a12342,12344 +7798a12344,12346 > Quill/M > Quillan/M > Quincey/M -7799a12346 +7799a12348 > Quinlan/M -7800a12348,12350 +7800a12350,12352 > Quint/M > Quinta/M > Quintana/M -7801a12352,12354 +7801a12354,12356 > Quintilla/M > Quintin/M > Quintina/M -7802a12356 +7802a12358 > Quintus/M -7811c12365 +7811c12367 < R/MD --- > R/MGD -7841a12396 +7841a12398 > Rab/M -7842a12398 +7842a12400 > Rabbi/M -7844a12401 +7844a12403 > Rabi -7847a12405 +7847a12407 > Rachele/M -7850a12409 +7850a12411 > Rad/M -7851a12411,12412 +7851a12413,12414 > Raddie/M > Raddy/M -7852a12414,12416 +7852a12416,12418 > Raeann/M > Raf/M > Rafa/M -7853a12418,12427 +7853a12420,12429 > Rafaela/M > Rafaelia/M > Rafaelita/M @@ -7124,10 +7128,10 @@ > Raffaello/M > Raffarty/M > Rafferty/M -7854a12429,12430 +7854a12431,12432 > Rafi/M > Ragnar/M -7855a12432,12439 +7855a12434,12441 > Rahal/M > Rahel/M > Raimondo/M @@ -7136,74 +7140,74 @@ > Raina/M > Raine/MR > Rainer/M -7856a12441 +7856a12443 > Rakel/M -7857a12443,12444 +7857a12445,12446 > Ralf/M > Ralina/M -7858a12446 +7858a12448 > Ram -7869a12458 +7869a12460 > Ramonda/M -7873a12463,12465 +7873a12465,12467 > Rana/M > Rance/M > Rancell/M -7874a12467 +7874a12469 > Randa/M -7876a12470 +7876a12472 > Randee/M -7877a12472 +7877a12474 > Randene/M -7878a12474,12475 +7878a12476,12477 > Randie/M > Randolf/M -7880a12478 +7880a12480 > Ranee/M -7881a12480,12483 +7881a12482,12485 > Rani/M > Rania/M > Ranice/M > Ranique/M -7883a12486,12488 +7883a12488,12490 > Ranna/M > Ransell/M > Ransom/M -7885a12491 +7885a12493 > Raphaela/M -7887a12494 +7887a12496 > Raquela/M -7889a12497,12498 +7889a12499,12500 > Rasia/M > Rasla/M -7897a12507,12510 +7897a12509,12512 > Raven/M > Ravi/M > Ravid/M > Raviv/M -7898a12512 +7898a12514 > Rawley/M -7901a12516,12517 +7901a12518,12519 > Raychel/M > Raye/M -7903a12520 +7903a12522 > Raymund/M -7904a12522,12527 +7904a12524,12529 > Rayna/M > Raynard/M > Raynell/M > Rayner/M > Raynor/M > Rayshell/M -7907a12531,12533 +7907a12533,12535 > Rea/M > Read/GM > Reade -7910a12537 +7910a12539 > Reagen/M -7911a12539 +7911a12541 > Reamonn/M -7914c12542,12546 +7914c12544,12548 < Rebecca --- > Rebbecca/M @@ -7211,38 +7215,38 @@ > Rebeca/M > Rebecka/M > Rebeka/M -7915a12548 +7915a12550 > Rebekkah/M -7918a12552 +7918a12554 > Redd/M -7922a12557,12558 +7922a12559,12560 > Ree/DSM > Reeba/M -7923a12560 +7923a12562 > Reece/M -7924a12562 +7924a12564 > Reena/M -7925a12564,12565 +7925a12566,12567 > Reeta/M > Reeva/M -7928a12569,12572 +7928a12571,12574 > Reg/N > Regan/M > Regen/M > Reggi/MS -7929a12574 +7929a12576 > Reggy/M -7932a12578,12579 +7932a12580,12581 > Reginauld/M > Regine/M -7937c12584,12587 +7937c12586,12589 < Reid --- > Reid/R > Reidar/M > Reider/M > Reiko/M -7939c12589,12593 +7939c12591,12595 < Reinaldo/M --- > Reina/M @@ -7250,122 +7254,122 @@ > Reinaldo/SM > Reine/M > Reinhard/M -7941a12596,12600 +7941a12598,12602 > Reinold/M > Reinwald/M > Rem/M > Remanence/S > Remanent -7945a12605 +7945a12607 > Remy/M -7946a12607,12608 +7946a12609,12610 > Renado/M > Renae/M -7947a12610,12611 +7947a12612,12613 > Renaldo/M > Renard/M -7948a12613,12616 +7948a12615,12618 > Renata/M > Renate/M > Renato/M > Renaud/M -7951a12620,12623 +7951a12622,12625 > Renell/M > Renelle/M > Renie/M > Rennie/M -7961a12634,12636 +7961a12636,12638 > Reta/M > Retha/M > Reube/M -7965a12641 +7965a12643 > Reuven/M -7970a12647 +7970a12649 > Revkah/M -7972a12650 +7972a12652 > Rey/M -7977c12655,12656 +7977c12657,12658 < Reynolds --- > Reynard/M > Reynold/MS -7980a12660 +7980a12662 > Rheba/M -7983a12664,12668 +7983a12666,12670 > Rheta/M > Rhett/M > Rhetta/M > Rhiamon/M > Rhianna/M -7984a12670 +7984a12672 > Rhianon/M -7987a12674 +7987a12676 > Rhode -7990a12678,12681 +7990a12680,12683 > Rhodia/M > Rhodie/M > Rhody/M > Rhona/M -7992a12684,12687 +7992a12686,12689 > Rhys/M > Riane/M > Riannon/M > Rianon/M -7993a12689,12691 +7993a12691,12693 > Ric/M > Rica/M > Ricard/M -7994a12693,12694 +7994a12695,12696 > Ricca/M > Riccardo/M -7997a12698 +7997a12700 > Richardo/M -7998a12700 +7998a12702 > Richart/M -8001a12704 +8001a12706 > Richmound/M -8003a12707,12708 +8003a12709,12710 > Richy/M > Rici/M -8004a12710 +8004a12712 > Rickard/M -8005a12712 +8005a12714 > Rickert/M -8006a12714 +8006a12716 > Ricki/M -8010a12719 +8010a12721 > Ricoriki/M -8022a12732,12734 +8022a12734,12736 > Rik/M > Riki/M > Rikki/M -8025a12738,12740 +8025a12740,12742 > Rina/M > Rinaldo/M > Ring/M -8028a12744,12746 +8028a12746,12748 > Riobard/M > Riordan/M > Rip/M -8029a12748 +8029a12750 > Risa/M -8032a12752 +8032a12754 > Ritchie/M -8034c12754,12755 +8034c12756,12757 < Rivas --- > Riva/SM > Rivalee/M -8037a12759 +8037a12761 > Rivi/M -8038a12761,12762 +8038a12763,12764 > Rivkah/M > Rivy/M -8042a12767,12769 +8042a12769,12771 > Roana/M > Roanna/M > Roanne/M -8044c12771,12775 +8044c12773,12777 < Rob/M --- > Roarke/M @@ -7373,167 +7377,167 @@ > Robb/M > Robbert/M > Robbi/M -8047a12779,12782 +8047a12781,12784 > Robbyn/M > Robena/M > Robenia/M > Robers/M -8055a12791,12796 +8055a12793,12798 > Robina/M > Robinet/M > Robinett/M > Robinetta/M > Robinette/M > Robinia/M -8060a12802 +8060a12804 > Roby/M -8062a12805 +8062a12807 > Roch/M -8065a12809,12810 +8065a12811,12812 > Rochell/M > Rochella/M -8067a12813 +8067a12815 > Rochette/M -8069a12816 +8069a12818 > Rockey/M -8070a12818 +8070a12820 > Rockie/M -8075a12824,12825 +8075a12826,12827 > Roda/M > Rodd/M -8076a12827,12830 +8076a12829,12832 > Roddie/M > Roddy/M > Roderic/M > Roderich/M -8077a12832,12833 +8077a12834,12835 > Roderigo/M > Rodge/MZR -8078a12835,12837 +8078a12837,12839 > Rodham/M > Rodi/M > Rodie/M -8079a12839 +8079a12841 > Rodina/M -8081a12842,12843 +8081a12844,12845 > Rodolph/M > Rodolphe/M -8084a12847 +8084a12849 > Rodrique/M -8087a12851 +8087a12853 > Rog/MRZ -8089c12853 +8089c12855 < Roger/S --- > Rogerio/M -8090a12855 +8090a12857 > Roi/SM -8094a12860 +8094a12862 > Roldan/M -8095a12862,12864 +8095a12864,12866 > Roley/M > Rolf > Rolfe/M -8098c12867,12869 +8098c12869,12871 < Rollins --- > Rollie/M > Rollin/MS > Rollo -8099a12871 +8099a12873 > Rolph/M -8101a12874,12875 +8101a12876,12877 > Roma/M > Romain/M -8116a12891,12893 +8116a12893,12895 > Romola/M > Romona/M > Romonda/M -8117a12895 +8117a12897 > Romy/M -8118a12897 +8118a12899 > Rona/M -8119a12899 +8119a12901 > Ronalda/M -8120a12901,12904 +8120a12903,12906 > Ronica/M > Ronna/M > Ronni/M > Ronnica/M -8124a12909,12910 +8124a12911,12912 > Roobbie/M > Roomba/MS -8128a12915,12918 +8128a12917,12920 > Rora/M > Rori/M > Rorie/M > Rorke/M -8130a12921 +8130a12923 > Ros -8131a12923,12926 +8131a12925,12928 > Rosabel/M > Rosabella/M > Rosabelle/M > Rosaleen/M -8132a12928 +8132a12930 > Rosalia/M -8135a12932,12933 +8135a12934,12935 > Rosalinde/M > Rosaline/M -8136a12935,12938 +8136a12937,12940 > Rosalynd/M > Rosamond/M > Rosamund/M > Rosana/M -8139a12942 +8139a12944 > Rosco/M -8142a12946,12947 +8142a12948,12949 > Roseanna/M > Roseanne/M -8144a12950,12952 +8144a12952,12954 > Roselia/M > Roselin/M > Roseline/M -8145a12954,12955 +8145a12956,12957 > Roselle/M > Rosemaria/M -8147a12958 +8147a12960 > Rosemonde/M -8149a12961 +8149a12963 > Rosene/M -8151a12964,12965 +8151a12966,12967 > Rosette/M > Roshelle/M -8153a12968,12969 +8153a12970,12971 > Rosina/M > Rosita/M -8154a12971 +8154a12973 > Rosmunda/M -8156a12974 +8156a12976 > Rossie/M -8157a12976 +8157a12978 > Rossy/M -8161a12981 +8161a12983 > Rosy/M -8170a12991 +8170a12993 > Rouvin/M -8171a12993,12994 +8171a12995,12996 > Row/MN > Rowan/M -8172a12996 +8172a12998 > Rowen/M -8175a13000,13003 +8175a13002,13005 > Rowney/M > Roxana/M > Roxane/M > Roxanna/M -8176a13005 +8176a13007 > Roxi/M -8177a13007 +8177a13009 > Roxine/M -8180a13011 +8180a13013 > Royall/M -8181a13013,13021 +8181a13015,13023 > Roz/M > Rozalie/M > Rozalin/M @@ -7543,229 +7547,229 @@ > Roze/M > Rozele/M > Rozella/M -8182a13023,13024 +8182a13025,13026 > Rozina/M > Rriocard/M -8186a13029 +8186a13031 > Rube/M -8187a13031,13033 +8187a13033,13035 > Rubetta/M > Rubi/M > Rubia/M -8188a13035 +8188a13037 > Rubie/M -8190a13038 +8190a13040 > Rubina/M -8193a13042,13046 +8193a13044,13048 > Rudd/M > Ruddie/M > Ruddy/M > Rudie/M > Rudiger/M -8194a13048 +8194a13050 > Rudolfo/M -8197a13052 +8197a13054 > Rufe/M -8199a13055 +8199a13057 > Ruggiero/M -8209a13066,13069 +8209a13068,13071 > Ruperta/M > Ruperto/M > Ruprecht/M > Rurik -8220a13081,13082 +8220a13083,13084 > Rustie/M > Rustin/M -8223c13085 +8223c13087 < Rutgers --- > Rutger/MS -8224a13087,13089 +8224a13089,13091 > Ruthann/M > Ruthanne/M > Ruthe/M -8225a13091 +8225a13093 > Ruthi/M -8226a13093 +8226a13095 > Ruthy/M -8227a13095,13097 +8227a13097,13099 > Rutter/M > Ruttger/M > Ruy/M -8233a13104,13105 +8233a13106,13107 > Ryann/M > Rycca/M -8235a13108,13109 +8235a13110,13111 > Ryley/M > Ryon/M -8237c13111,13112 +8237c13113,13114 < S/MN --- > Ryun/M > S/MNY -8285a13161 +8285a13163 > Saba/M -8291a13168 +8291a13170 > Sabra -8295a13173 +8295a13175 > Sacha/M -8297a13176 +8297a13178 > Sada/M -8301a13181 +8301a13183 > Sadella/M -8303a13184 +8303a13186 > Sadye/M -8311a13193 +8311a13195 > Saidee/M -8322a13205 +8322a13207 > Salaidh/M -8325a13209 +8325a13211 > Saleem/M -8327a13212 +8327a13214 > Salim/M -8332a13218,13219 +8332a13220,13221 > Sallee/M > Salli/M -8335a13223,13226 +8335a13225,13228 > Sallyann/M > Sallyanne/M > Salmon/M > Saloma/M -8336a13228,13231 +8336a13230,13233 > Salomi/M > Salomo/M > Salomon/M > Salomone/M -8343a13239 +8343a13241 > Salvidor/M -8349a13246 +8349a13248 > Samaria -8362a13260 +8362a13262 > Samuele/M -8371a13270,13274 +8371a13272,13276 > Sande/MZR > Sander/M > Sanderson/M > Sandi/M > Sandie/M -8372a13276 +8372a13278 > Sandor/M -8374a13279 +8374a13281 > Sandro/M -8375a13281 +8375a13283 > Sandye/M -8382a13289,13290 +8382a13291,13292 > Sanson/M > Sansone/M -8388a13297,13298 +8388a13299,13300 > Sapphira > Sapphire/M -8391a13302 +8391a13304 > Saraann/M -8394a13306 +8394a13308 > Sarajane/M -8400a13313,13316 +8400a13315,13318 > Saree/M > Sarena/M > Sarene/M > Sarette/M -8401a13318 +8401a13320 > Sarge/M -8403a13321,13324 +8403a13323,13326 > Sari/M > Sarina/M > Sarine/M > Sarita/M -8407a13329 +8407a13331 > Sascha/M -8408a13331 +8408a13333 > Sashenka/M -8422a13346 +8422a13348 > Saudra/M -8424c13348,13350 +8424c13350,13352 < Saunders --- > Sauncho/M > Saunder/MS > Saunderson/M -8427a13354 +8427a13356 > Sauveur/M -8429a13357 +8429a13359 > Savina/M -8433a13362 +8433a13364 > Saw/M -8434a13364,13366 +8434a13366,13368 > Sawyere/M > Sax > Saxe/M -8437c13369,13371 +8437c13371,13373 < Sayers --- > Say/MRZ > Sayer/MS > Sayre/MS -8444a13379 +8444a13381 > Scarface/M -8445a13381,13382 +8445a13383,13384 > Scarlet/M > Scarlett/M -8498a13436 +8498a13438 > Scotti/M -8518a13457 +8518a13459 > Seamus/M -8519a13459 +8519a13461 > Seana/M -8522a13463,13464 +8522a13465,13466 > Sebastiano/M > Sebastien/M -8528a13471 +8528a13473 > See/M -8537a13481,13482 +8537a13483,13484 > Seka/M > Sela/M -8538a13484 +8538a13486 > Selby/M -8540a13487,13488 +8540a13489,13490 > Selene/M > Selestina/M -8542a13491,13493 +8542a13493,13495 > Selia/M > Selie/M > Selig/M -8543a13495,13497 +8543a13497,13499 > Selina/M > Selinda/M > Seline/M -8545a13500,13501 +8545a13502,13503 > Sella/M > Selle/MZ -8554a13511 +8554a13513 > Sena/M -8567a13525 +8567a13527 > Sephira/M -8571a13530 +8571a13532 > sequitur -8576a13536 +8576a13538 > Serene -8577a13538,13539 +8577a13540,13541 > Serge/M > Sergeant/M -8578a13541 +8578a13543 > Sergent/M -8585a13549 +8585a13551 > Seumas/M -8600a13565,13566 +8600a13567,13568 > Shadow/M > Shae/M -8601a13568,13569 +8601a13570,13571 > Shaina/M > Shaine/M -8605a13574,13577 +8605a13576,13579 > Shalna/M > Shalne/M > Shalom/M > Shamus/M -8606a13579,13585 +8606a13581,13587 > Shanan/M > Shanda/M > Shandee/M @@ -7773,36 +7777,36 @@ > Shandie/M > Shandra/M > Shandy/M -8608a13588,13589 +8608a13590,13591 > Shani/M > Shanie/M -8610a13592,13594 +8610a13594,13596 > Shannah/M > Shannan/M > Shannen/M -8611a13596,13598 +8611a13598,13600 > Shanon/M > Shanta/M > Shantee/M -8613a13601,13602 +8613a13603,13604 > Shara/M > Sharai/M -8615a13605 +8615a13607 > Sharia/M -8616a13607,13610 +8616a13609,13612 > Sharity/M > Sharl/M > Sharla/M > Sharleen/M -8617a13612 +8617a13614 > Sharline/M -8618a13614 +8618a13616 > Sharona/M -8621a13618 +8621a13620 > Sharyl/M -8622a13620 +8622a13622 > Shaughn/M -8631a13630,13636 +8631a13632,13638 > Shay/M > Shayla/M > Shaylah/M @@ -7810,74 +7814,74 @@ > Shaylynn/M > Shayna/M > Shayne/M -8635a13641,13643 +8635a13643,13645 > Sheela/M > Sheelagh/M > Sheelah/M -8636a13645 +8636a13647 > Sheeree/M -8637a13647,13648 +8637a13649,13650 > Sheff/M > Sheffie/M -8638a13650 +8638a13652 > Sheffy/M -8639a13652,13657 +8639a13654,13659 > Sheilah/M > Shel/MY > Shela/M > Shelagh/M > Shelba/M > Shelbi/M -8640a13659 +8640a13661 > Shelden/M -8644a13664,13665 +8644a13666,13667 > Shelli/M > Shellie/M -8646a13668,13669 +8646a13670,13671 > Shem/M > Shena/M -8649a13673 +8649a13675 > Shep/M -8652a13677,13678 +8652a13679,13680 > Shepperd/M > Sher/M -8657a13684,13687 +8657a13686,13689 > Sherie/M > Sherill/M > Sherilyn/M > Sherline/M -8658a13689,13690 +8658a13691,13692 > Sherlocke/M > Sherm/M -8659a13692,13693 +8659a13694,13695 > Shermie/M > Shermy/M -8663a13698 +8663a13700 > Sherwin/M -8664a13700,13701 +8664a13702,13703 > Sherwynd/M > Sherye/M -8675a13713 +8675a13715 > Shina/M -8678a13717 +8678a13719 > Shir/M -8679a13719,13722 +8679a13721,13724 > Shirl/M > Shirlee/M > Shirleen/M > Shirlene/M -8680a13724 +8680a13726 > Shirline/M -8682a13727 +8682a13729 > Sholom/M -8684a13730,13731 +8684a13732,13733 > Shoshana/M > Shoshanna/M -8692a13740,13742 +8692a13742,13744 > Shurlock/M > Shurlocke/M > Shurwood/M -8698a13749,13755 +8698a13751,13757 > Siana/M > Sianna/M > Sib/M @@ -7885,245 +7889,245 @@ > Sibby/M > Sibeal/M > Sibel/M -8699a13757,13758 +8699a13759,13760 > Sibella/M > Sibelle/M -8701a13761,13762 +8701a13763,13764 > Sibilla/M > Sibley/M -8702a13764,13765 +8702a13766,13767 > Sibylla/M > Sibylle/M -8706a13770 +8706a13772 > Sidnee/M -8707a13772,13774 +8707a13774,13776 > Sidoney/M > Sidonia/M > Sidonnie/M -8711a13779,13784 +8711a13781,13786 > Siffre/M > Sig > Sigfrid/M > Sigfried/M > Sigismond/M > Sigismondo/M -8712a13786 +8712a13788 > Sigismundo/M -8713a13788 +8713a13790 > Sigrid/M -8714a13790 +8714a13792 > Sigvard/M -8722a13799,13800 +8722a13801,13802 > Sile/M > Sileas/M -8725a13804,13809 +8725a13806,13811 > Silvain/M > Silvan/M > Silvana/M > Silvano/M > Silvanus/M > Silvester/M -8726a13811,13813 +8726a13813,13815 > Silvie/M > Silvio/M > Sim/SM -8727a13815 +8727a13817 > Simeon/M -8728a13817 +8728a13819 > Simmonds/M -8730a13820 +8730a13822 > Simona/M -8731a13822,13823 +8731a13824,13825 > Simonette/M > Simonne/M -8736a13829 +8736a13831 > Sinclare/M -8737a13831 +8737a13833 > Sindee/M -8745a13840 +8745a13842 > Siobhan/M -8746a13842 +8746a13844 > Siouxie/M -8748a13845,13848 +8748a13847,13850 > Sisely/M > Sisile/M > Sissie/M > Sissy/M -8752a13853 +8752a13855 > Siusan/M -8754a13856 +8754a13858 > Siward/M -8755a13858,13859 +8755a13860,13861 > Skell/M > Skelly/M -8756a13861,13864 +8756a13863,13866 > Skip/M > Skipp/MR > Skipper/M > Skippie/M -8757a13866 +8757a13868 > Skipton/M -8758a13868 +8758a13870 > Sky/M -8760a13871,13872 +8760a13873,13874 > Skylar/M > Skyler/M -8762a13875 +8762a13877 > Slade/M -8778a13892 +8778a13894 > Sly/M -8785a13900 +8785a13902 > Smitty/M -8809a13925 +8809a13927 > Sofie/M -8811c13927 +8811c13929 < Sol/M --- > Sol/MY -8812a13929,13930 +8812a13931,13932 > Sollie/M > Solly/M -8818a13937 +8818a13939 > Somerset -8827a13947,13949 +8827a13949,13951 > Sonni/M > Sonnie/M > Sonnnie/M -8832a13955,13956 +8832a13957,13958 > Sophey/M > Sophi/M -8836a13961 +8836a13963 > Sophronia/M -8838a13964 +8838a13966 > Sorcha/M -8839a13966 +8839a13968 > Sosanna/M -8847c13974 +8847c13976 < Southerner/M --- > Southerner/SM -8875a14003 +8875a14005 > Spense/RM -8881a14010 +8881a14012 > Spike/M -8903a14033,14034 +8903a14035,14036 > Stace/M > Stacee/M -8905a14037 +8905a14039 > Stacia/M -8908a14041,14042 +8908a14043,14044 > Stafani/M > Staffard/M -8909a14044 +8909a14046 > Staford/M -8916c14051,14052 +8916c14053,14054 < Stan/M --- > Stan/MY > Standford/M -8917a14054 +8917a14056 > Stanfield/M -8918a14056,14057 +8918a14058,14059 > Stanislas/M > Stanislaus/M -8919a14059,14060 +8919a14061,14062 > Stanislaw/M > Stanleigh/M -8920a14062 +8920a14064 > Stanly/M -8921a14064 +8921a14066 > Stanwood/M -8922a14066 +8922a14068 > Star/M -8925a14070,14072 +8925a14072,14074 > Starla/M > Starlene/M > Starlin/M -8929a14077 +8929a14079 > Stavro/MS -8933a14082,14083 +8933a14084,14085 > Stearn/M > Stearne/M -8934a14085 +8934a14087 > Stefa/M -8935a14087 +8935a14089 > Stefania/M -8936a14089,14093 +8936a14091,14095 > Stefano/M > Steffane/M > Steffen/M > Steffi/M > Steffie/M -8944a14102 +8944a14104 > Stepha/M -8945a14104,14105 +8945a14106,14107 > Stephana/M > Stephani/M -8946a14107,14108 +8946a14109,14110 > Stephannie/M > Stephanus/M -8947a14110 +8947a14112 > Stephenie/M -8948a14112,14114 +8948a14114,14116 > Stephi/M > Stephie/M > Stephine/M -8952a14119 +8952a14121 > Stesha/M -8954a14122 +8954a14124 > Stevana/M -8956a14125 +8956a14127 > Stevena/M -8958a14128,14129 +8958a14130,14131 > Stevy/M > Steward/M -8960a14132,14133 +8960a14134,14135 > Stillman/M > Stillmann/M -8963a14137 +8963a14139 > Stinky/M -8967a14142 +8967a14144 > Stoddard/M -8975a14151,14154 +8975a14153,14156 > Storm/M > Stormi/M > Stormie/M > Stormy/M -9007a14187 +9007a14189 > Suellen/M -9015a14196,14197 +9015a14198,14199 > Sukey/M > Suki/M -9018a14201 +9018a14203 > Sula/M -9022a14206 +9022a14208 > Sully -9039a14224 +9039a14226 > Sunny/M -9040a14226 +9040a14228 > Sunshine/M -9055a14242,14243 +9055a14244,14245 > Susanetta/M > Susann/M -9056a14245 +9056a14247 > Susannah/M -9057a14247,14248 +9057a14249,14250 > Susette/M > Susi/M -9060a14252,14253 +9060a14254,14255 > Susy/M > Sutherlan/M -9064a14258,14259 +9064a14260,14261 > Suzann/M > Suzanna/M -9067a14263,14264 +9067a14265,14266 > Suzi/M > Suzie/M -9071a14269 +9071a14271 > Svend/M -9087a14286 +9087a14288 > Swen/M -9094a14294,14300 +9094a14296,14302 > Sybila/M > Sybilla/M > Sybille/M @@ -8131,19 +8135,19 @@ > Syd/M > Sydel/M > Sydelle/M -9096a14303,14304 +9096a14305,14306 > Sylas/M > Sylvan/M -9099a14308,14309 +9099a14310,14311 > Syman/M > Symon/M -9120a14331 +9120a14333 > TEirtza/M -9121a14333 +9121a14335 > THz/M -9135a14348 +9135a14350 > Tab/MR -9137a14351,14357 +9137a14353,14359 > Tabb/M > Tabbatha/M > Tabbi/M @@ -8151,11 +8155,11 @@ > Tabbitha/M > Tabby/M > Taber/M -9138a14359 +9138a14361 > Tabina/M -9139a14361 +9139a14363 > Tabor -9143a14366,14372 +9143a14368,14374 > Tadd/M > Taddeo/M > Taddeusz/M @@ -8163,245 +8167,245 @@ > Tadeo/M > Tades > Tadio/M -9147a14377 +9147a14379 > Taffy/M -9155a14386 +9155a14388 > Tailor/M -9159a14391,14392 +9159a14393,14394 > Tait/M > Taite/M -9164a14398 +9164a14400 > Talbert/M -9165a14400 +9165a14402 > Talia/M -9171a14407,14408 +9171a14409,14410 > Tallia/M > Tallie/M -9172a14410,14412 +9172a14412,14414 > Tallou/M > Tallulah/M > Tally/M -9175a14416,14419 +9175a14418,14421 > Talya/M > Talyah/M > Tam/M > Tamar/M -9176a14421,14423 +9176a14423,14425 > Tamarah/M > Tamarra/M > Tamas -9181a14429 +9181a14431 > Tamiko/M -9182a14431 +9182a14433 > Tamma/M -9183a14433 +9183a14435 > Tammara/M -9189a14440 +9189a14442 > Tamqrah/M -9191a14443,14444 +9191a14445,14446 > Tan > Tana -9192a14446,14448 +9192a14448,14450 > Tandi/M > Tandie/M > Tandy/M -9196a14453,14454 +9196a14455,14456 > Tanhya/M > Tani/M -9198a14457,14458 +9198a14459,14460 > Tanitansy/M > Tann/MR -9199a14460 +9199a14462 > Tanney/M -9200a14462,14464 +9200a14464,14466 > Tannie/M > Tanny/M > Tansy/M -9208a14473 +9208a14475 > Tarah/M -9216a14482,14484 +9216a14484,14486 > Tarra/M > Tarrah/M > Tarrance/M -9219a14488 +9219a14490 > Taryn/M -9222a14492 +9222a14494 > Tasia/M -9228a14499,14500 +9228a14501,14502 > Tatiana/M > Tatiania/M -9231a14504,14505 +9231a14506,14507 > Tawnya/M > Tawsha/M -9239a14514 +9239a14516 > Teador/M -9243a14519,14522 +9243a14521,14524 > Tedd/M > Tedda/M > Teddi/M > Teddie/M -9244a14524,14529 +9244a14526,14531 > Tedi/M > Tedie/M > Tedman/M > Tedmund/M > Tedra/M > Teena/M -9255a14541 +9255a14543 > Temp/M -9257a14544,14545 +9257a14546,14547 > Temple/M > Templeton/M -9262a14551,14555 +9262a14553,14557 > Teodoor/M > Teodor/M > Teodora/M > Teodorico/M > Teodoro/M -9263a14557 +9263a14559 > Tera/M -9264a14559 +9264a14561 > Terencio/M -9265a14561 +9265a14563 > Terese/M -9266a14563,14565 +9266a14565,14567 > Teresina > Teresita/M > Teressa/M -9267a14567 +9267a14569 > Teriann/M -9273a14574 +9273a14576 > Terrel/M -9277a14579,14580 +9277a14581,14582 > Terrijo/M > Terrill/M -9280a14584,14585 +9280a14586,14587 > Terrye/M > Tersina/M -9281a14587 +9281a14589 > Terza/M -9284a14591 +9284a14593 > Tessi/M -9285a14593 +9285a14595 > Tessy/M -9296a14605 +9296a14607 > Thacher/M -9299a14609,14610 +9299a14611,14612 > Thaddus/M > Thadeus/M -9301a14613,14614 +9301a14615,14616 > Thain/M > Thaine/M -9304a14618 +9304a14620 > Thane/M -9310c14624,14627 +9310c14626,14629 < Thatcher --- > Thatch/MR > Thatcherism > Thaxter/M > Thayne/M -9311a14629,14630 +9311a14631,14632 > Theadora/M > Thebault/M -9312a14632,14634 +9312a14634,14636 > Theda/M > Thedric/M > Thedrick/M -9313a14636 +9313a14638 > Thekla/M -9315a14639,14641 +9315a14641,14643 > The > Theo/M > Theobald/M -9316a14643 +9316a14645 > Theodor/M -9319a14647 +9319a14649 > Theodosia/M -9324a14653,14656 +9324a14655,14658 > Theresina/M > Theresita/M > Theressa/M > Therine/M -9333a14666,14668 +9333a14668,14670 > Thia/M > Thibaud/M > Thibaut/M -9336a14672,14673 +9336a14674,14675 > Thom/M > Thoma/SM -9337a14675,14678 +9337a14677,14680 > Thomasa/M > Thomasin/M > Thomasina/M > Thomasine/M -9344a14686,14689 +9344a14688,14691 > Thorin/M > Thorn > Thorndike > Thornie/M -9345a14691 +9345a14693 > Thorny/M -9347a14694,14696 +9347a14696,14698 > Thorstein/M > Thorsten/M > Thorvald/M -9354d14702 +9354d14704 < Thunderbird/M -9359a14708,14709 +9359a14710,14711 > Thurstan/M > Thurston/M -9367a14718 +9367a14720 > Tibold/M -9370a14722,14724 +9370a14724,14726 > Tiebold/M > Tiebout/M > Tiena/M -9372a14727,14731 +9372a14729,14733 > Tierney/M > Tiertza/M > Tiff/M > Tiffani/M > Tiffanie/M -9373a14733,14735 +9373a14735,14737 > Tiffi/M > Tiffie/M > Tiffy/M -9375a14738,14742 +9375a14740,14744 > Tilda/M > Tildi/M > Tildie/M > Tildy/M > Tiler/M -9376a14744 +9376a14746 > Tillie/M -9377a14746 +9377a14748 > Tilly/M -9381a14751,14753 +9381a14753,14755 > Timi/M > Timmi/M > Timmie/M -9382a14755 +9382a14757 > Timofei/M -9384a14758,14761 +9384a14760,14763 > Timoteo/M > Timothea/M > Timothee/M > Timotheus/M -9388a14766 +9388a14768 > Tine/M -9393a14772,14774 +9393a14774,14776 > Tiphani/M > Tiphanie/M > Tiphany/M -9400a14782,14783 +9400a14784,14785 > Tirrell/M > Tish/M -9408c14791 +9408c14793 < Tito/M --- > Tito/SM -9414a14798,14804 +9414a14800,14806 > Tobe/M > Tobey > Tobi/M @@ -8409,147 +8413,147 @@ > Tobias/M > Tobie/M > Tobin/M -9416a14807 +9416a14809 > Tobye/M -9420a14812,14813 +9420a14814,14815 > Toddie/M > Toddy/M -9422a14816,14817 +9422a14818,14819 > Toiboid/M > Toinette/M -9434c14829,14832 +9434c14831,14834 < Tomas --- > Toma/SM > Tomasina/M > Tomasine/M > Tomaso/M -9435a14834,14836 +9435a14836,14838 > Tome/M > Tomi/M > Tomkin/M -9436a14838 +9436a14840 > Tommi/M -9444a14847,14848 +9444a14849,14850 > Tonie/M > Tonnie/M -9447a14852,14853 +9447a14854,14855 > Tonye/M > Tootsie/M -9451a14858,14862 +9451a14860,14864 > Tore/M > Torey/M > Tori/M > Torie/M > Torin/M -9453a14865 +9453a14867 > Torr/MX -9454a14867,14868 +9454a14869,14870 > Torre/SM > Torrence/M -9456a14871 +9456a14873 > Torrey/M -9457a14873,14875 +9457a14875,14877 > Torrie/M > Torrin/M > Torry/M -9466a14885,14887 +9466a14887,14889 > Tova/M > Tove/M > Town/M -9467a14889,14890 +9467a14891,14892 > Towney/M > Townie/M -9468a14892 +9468a14894 > Towny/M -9471a14896,14897 +9471a14898,14899 > Trace/M > Tracee/M -9483a14910 +9483a14912 > Traver/MS -9485a14913 +9485a14915 > Travus/M -9487a14916 +9487a14918 > Trefor/M -9488a14918,14921 +9488a14920,14923 > Tremain/M > Tremaine/M > Tremayne/M > Trenna/M -9490a14924,14928 +9490a14926,14930 > Tresa/M > Trescha/M > Tressa/M > Trev/MR > Trevar/M -9491a14930 +9491a14932 > Trever/M -9504a14944 +9504a14946 > Trip/M -9506a14947 +9506a14949 > Tripp/M -9507a14949,14950 +9507a14951,14952 > Tris > Trish/M -9508a14952,14953 +9508a14954,14955 > Trista/M > Tristam/M -9510a14956,14959 +9510a14958,14961 > Trix/M > Trixi/M > Trixie/M > Trixy/M -9518a14968 +9518a14970 > Trstram/M -9519a14970,14971 +9519a14972,14973 > Truda/M > Trude/M -9520a14973,14975 +9520a14975,14977 > Trudey/M > Trudi/M > Trudie/M -9521a14977 +9521a14979 > Trueman/M -9523a14980,14981 +9523a14982,14983 > Trula/M > Trumaine/M -9524a14983 +9524a14985 > Trumann/M -9537a14997 +9537a14999 > Tuck/R -9538a14999,15000 +9538a15001,15002 > Tuckie/M > Tucky/M -9546a15009,15010 +9546a15011,15012 > Tulley/M > Tully/M -9590a15055 +9590a15057 > Twyla/M -9591a15057,15059 +9591a15059,15061 > Tybalt/M > Tybi/M > Tybie/M -9592a15061 +9592a15063 > Tye/M -9594a15064,15066 +9594a15066,15068 > Tymon/M > Tymothy/M > Tynan/M -9596a15069 +9596a15071 > Tyne/M -9601a15075 +9601a15077 > Tyrus/M -9609a15084 +9609a15086 > UI/MS -9638a15114 +9638a15116 > Udale/M -9639a15116 +9639a15118 > Udell/M -9642a15120 +9642a15122 > Ugo/M -9646a15125 +9646a15127 > Ula/M -9647a15127,15137 +9647a15129,15139 > Ulberto/M > Ulick/M > Ulises/M @@ -8561,238 +8565,238 @@ > Ulrika/M > Ulrikaumeko/M > Ulrike/M -9651a15142 +9651a15144 > Umberto/M -9652a15144,15145 +9652a15146,15147 > Umeko/M > Una/M -9672a15166 +9672a15168 > Urbain/M -9673a15168,15169 +9673a15170,15171 > Urbano/M > Urbanus/M -9675a15172 +9675a15174 > Uri/SM -9680a15178,15180 +9680a15180,15182 > Ursala/M > Ursola/M > Urson/M -9681a15182 +9681a15184 > Ursulina/M -9687a15189 +9687a15191 > Uta/M -9723a15226,15227 +9723a15228,15229 > Vachel/M > Vaclav/M -9726c15230,15233 +9726c15232,15235 < Val/M --- > Vail/M > Val/MY > Valaree/M > Valaria/M -9727a15235 +9727a15237 > Valdemar/M -9728a15237,15238 +9728a15239,15240 > Vale/M > Valeda/M -9729a15240,15241 +9729a15242,15243 > Valene/M > Valenka/M -9730a15243,15244 +9730a15245,15246 > Valentia/M > Valentijn/M -9731a15246 +9731a15248 > Valentina/M -9734a15250 +9734a15252 > Valera -9738a15255 +9738a15257 > Valerye/M -9739a15257,15258 +9739a15259,15260 > Valida/M > Valina/M -9741a15261 +9741a15263 > Valle/M -9743a15264,15267 +9743a15266,15269 > Valli/M > Vallie/M > Vally/M > Valma/M -9745a15270 +9745a15272 > Valry/M -9749a15275 +9749a15277 > Vanda/M -9754a15281,15285 +9754a15283,15287 > Vania/M > Vanna/M > Vanni/M > Vannie/M > Vanny/M -9755a15287 +9755a15289 > Vanya/M -9760a15293,15294 +9760a15295,15296 > Vasili/MS > Vasily/M -9762a15297,15298 +9762a15299,15300 > Vassili/M > Vassily/M -9780a15317 +9780a15319 > Velvet/M -9784a15322 +9784a15324 > Venita/M -9790a15329 +9790a15331 > Veradis -9793a15333,15336 +9793a15335,15338 > Vere/M > Verena/M > Verene/M > Verge/M -9794a15338,15341 +9794a15340,15343 > Veriee/M > Verile/M > Verina/M > Verine/M -9795a15343 +9795a15345 > Verla/M -9800c15348 +9800c15350 < Vern/M --- > Vern/MN -9802a15351,15353 +9802a15353,15355 > Vernen/M > Verney/M > Vernice/M -9803a15355 +9803a15357 > Vernor/M -9806a15359,15361 +9806a15361,15363 > Veronika/M > Veronike/M > Veronique -9813a15369,15370 +9813a15371,15372 > Vevay/M > Vi/M -9818a15376 +9818a15378 > Vick/M -9822a15381 +9822a15383 > Victoir/M -9827a15387 +9827a15389 > Vida/M -9828a15389,15390 +9828a15391,15392 > Vidovic/M > Vidovik/M -9837a15400 +9837a15402 > Viki/M -9838a15402,15403 +9838a15404,15405 > Vikki/M > Vikky/M -9839a15405 +9839a15407 > Vilhelmina/M -9845a15412,15413 +9845a15414,15415 > Vin/M > Vina/M -9847c15415,15417 +9847c15417,15419 < Vincent/M --- > Vincent/MS > Vincenty/M > Vincenz/M -9848a15419,15422 +9848a15421,15424 > Vinita/M > Vinni/M > Vinnie/M > Vinny/M -9850a15425,15426 +9850a15427,15428 > Violante/M > Viole/M -9851a15428,15430 +9851a15430,15432 > Violetta/M > Violette/M > Virge/M -9853a15433,15434 +9853a15435,15436 > Virgilio/M > Virgina/M -9855a15437 +9855a15439 > Virginie/M -9863a15446,15448 +9863a15448,15450 > Vita/M > Vite/M > Vitia/M -9865a15451,15453 +9865a15453,15455 > Vitoria > Vittoria/M > Vittorio/M -9866a15455,15456 +9866a15457,15458 > Viv/M > Viva/M -9868a15459,15460 +9868a15461,15462 > Vivi/MN > Vivia/M -9869a15462,15467 +9869a15464,15469 > Viviana/M > Vivianna/M > Vivianne/M > Vivie/M > Vivien/M > Viviene/M -9870a15469,15471 +9870a15471,15473 > Viviyan/M > Vivyan/M > Vivyanne/M -9871a15473 +9871a15475 > Vladamir/M -9885a15488 +9885a15490 > Von/M -9887a15491,15493 +9887a15493,15495 > Vonni/M > Vonnie/M > Vonny/M -9895a15502 +9895a15504 > Vyky/M -9899c15506 +9899c15508 < WASP/M --- > WASP/SM -9917a15525 +9917a15527 > Wadsworth/M -9921a15530,15532 +9921a15532,15534 > Wain/M > Wainwright/M > Wait/MR -9922a15534 +9922a15536 > Waiter/M -9923a15536 +9923a15538 > Wakefield -9930a15544 +9930a15546 > Waldon/M -9938a15553,15554 +9938a15555,15556 > Wallache/M > Wallas/M -9939a15556 +9939a15558 > Wallie/M -9940a15558 +9940a15560 > Walliw/M -9941a15560 +9941a15562 > Wally/M -9945a15565 +9945a15567 > Walther/M -9946a15567 +9946a15569 > Waly/M -9948a15570,15572 +9948a15572,15574 > Wandie/M > Wandis/M > Waneta/M -9949a15574 +9949a15576 > Wanids/M -9951c15576,15577 +9951c15578,15579 < Ward --- > Ward/N > Warde/M -9963d15588 +9963d15590 < Wasp -9964a15590 +9964a15592 > Wat/MZ -9976a15603,15610 +9976a15605,15612 > Waverley/M > Waverly/M > Way/M @@ -8801,207 +8805,207 @@ > Waylen/M > Waylin/M > Waylon/M -9989a15624,15625 +9989a15626,15627 > Weidar/M > Weider/M -9995a15632,15633 +9995a15634,15635 > Welbie/M > Welby/M -10006a15645,15648 +10006a15647,15650 > Wenda/M > Wendall/M > Wendel/M > Wendeline/M -10008a15651 +10008a15653 > Wendie/M -10009a15653,15658 +10009a15655,15660 > Wendye/M > Wenona/M > Wenonah/M > Werner/M > Wernher/M > Wes -10015a15665,15666 +10015a15667,15668 > Westbrook/M > Westbrooke/M -10017a15669,15670 +10017a15671,15672 > Westleigh/M > Westley/M -10021a15675 +10021a15677 > Weylin/M -10031a15686 +10031a15688 > Whit -10032a15688 +10032a15690 > Whitby/M -10043a15700 +10043a15702 > Whittaker/M -10044a15702 +10044a15704 > Wiatt/M -10057a15716 +10057a15718 > Wilburt/M -10060a15720,15723 +10060a15722,15725 > Wilden/M > Wildon/M > Wileen/M > Wilek/M -10065a15729 +10065a15731 > Wilfrid/M -10067a15732,15733 +10067a15734,15735 > Wilhelmine > Wilie/M -10073a15740 +10073a15742 > Willabella/M -10074a15742 +10074a15744 > Willamina/M -10075a15744,15745 +10075a15746,15747 > Willdon/M > Willem/M -10076a15747,15750 +10076a15749,15752 > Willetta/M > Willette/M > Willey/M > Willi/MS -10080a15755 +10080a15757 > Willow/M -10081a15757 +10081a15759 > Willyt/M -10082a15759 +10082a15761 > Wilmar/M -10083a15761 +10083a15763 > Wilmette/M -10084a15763,15765 +10084a15765,15767 > Wilona/M > Wilone/M > Wilow/M -10086a15768 +10086a15770 > Wilt/M -10089a15772 +10089a15774 > Win/M -10093a15777 +10093a15779 > Windham/M -10097a15782 +10097a15784 > Windy/M -10098a15784 +10098a15786 > Winfield/M -10100a15787,15788 +10100a15789,15790 > Wini/M > Winifield/M -10102a15791,15794 +10102a15793,15796 > Winn/M > Winna/M > Winnah/M > Winne/M -10103a15796 +10103a15798 > Winni/M -10104a15798 +10104a15800 > Winnifred/M -10105a15800,15803 +10105a15802,15805 > Winny/M > Winona/M > Winonah/M > Winslow/M -10113a15812 +10113a15814 > Wit/M -10115a15815,15816 +10115a15817,15818 > Wittie/M > Witty/M -10123a15825,15826 +10123a15827,15828 > Wolfie/M > Wolfy/M -10133a15837,15838 +10133a15839,15840 > Woodie/M > Woodman -10136a15842 +10136a15844 > Woody/M -10144a15851 +10144a15853 > Worden/M -10147a15855,15857 +10147a15857,15859 > Worth > Worthington/M > Worthy/M -10153a15864 +10153a15866 > Wrennie/M -10159a15871 +10159a15873 > Wyatan/M -10163c15875 +10163c15877 < Wyeth --- > Wye/H -10164a15877,15879 +10164a15879,15881 > Wylma/M > Wyn/M > Wyndham/M -10165a15881,15883 +10165a15883,15885 > Wynne/M > Wynnie/M > Wynny/M -10177a15896 +10177a15898 > Xaviera/M -10178a15898 +10178a15900 > Xena/M -10181a15902 +10181a15904 > Xenos -10183a15905 +10183a15907 > Xever/M -10188a15911 +10188a15913 > Ximenez/M -10193a15917,15919 +10193a15919,15921 > Xylia/M > Xylina/M > Xymenes/M -10209a15936 +10209a15938 > Yalonda/M -10215a15943,15946 +10215a15945,15948 > Yanaton/M > Yance/M > Yancey/M > Yancy/M -10223a15955,15956 +10223a15957,15958 > Yard/M > Yardley/M -10225a15959,15960 +10225a15961,15962 > Yasmeen/M > Yasmin/M -10230a15966,15967 +10230a15968,15969 > Yehudi/M > Yehudit/M -10231a15969 +10231a15971 > Yelena/M -10241a15980,15983 +10241a15982,15985 > Yetta/M > Yettie/M > Yetty/M > Yevette/M -10245a15988,15989 +10245a15990,15991 > Ynes/M > Ynez/M -10250a15995,15997 +10250a15997,15999 > Yolande/M > Yolane/M > Yolanthe/M -10253c16000,16003 +10253c16002,16005 < York/M --- > Yorgo/MS > York/MR > Yorke/M > Yorker/M -10258a16009,16010 +10258a16011,16012 > Yoshi/M > Yoshiko/M -10262a16015 +10262a16017 > Yovonnda/M -10264a16018 +10264a16020 > Ysabel/M -10271a16026 +10271a16028 > Yul/M -10273a16029 +10273a16031 > Yulma/M -10276a16033 +10276a16035 > Yurik/M -10278a16036 +10278a16038 > Yvon/M -10280c16038,16043 +10280c16040,16045 < Z/SMNXT --- > Yvor/M @@ -9010,24 +9014,24 @@ > Zaccaria/M > Zach > Zacharia/SM -10281a16045 +10281a16047 > Zacharie/M -10282a16047 +10282a16049 > Zacherie/M -10283a16049,16050 +10283a16051,16052 > Zack/M > Zackariah/M -10284a16052 +10284a16054 > Zahara/M -10286a16055 +10286a16057 > Zak/M -10292a16062 +10292a16064 > Zandra/M -10293a16064 +10293a16066 > Zaneta/M -10300a16072 +10300a16074 > Zarah/M -10301a16074,16080 +10301a16076,16082 > Zared/M > Zaria/M > Zarla/M @@ -9035,31 +9039,31 @@ > Zealand/M > Zeb/M > Zebadiah/M -10302a16082,16083 +10302a16084,16085 > Zebulen/M > Zebulon/M -10303a16085 +10303a16087 > Zed/M -10307a16090 +10307a16092 > Zelda/M -10310a16094 +10310a16096 > Zena/M -10311a16096 +10311a16098 > Zenia/M -10315a16101 +10315a16103 > Zerk/M -10321a16108 +10321a16110 > Zia/M -10325a16113 +10325a16115 > Zilvia/M -10333a16122,16123 +10333a16124,16125 > Zita/M > Zitella/M -10336a16127 +10336a16129 > Zollie/M -10337a16129 +10337a16131 > Zolly/M -10339a16132,16139 +10339a16134,16141 > Zonda/M > Zondra/M > Zonnya/M @@ -9068,544 +9072,546 @@ > Zorana/M > Zorina/M > Zorine/M -10346a16147 +10346a16149 > Zsazsa/M -10350a16152 +10350a16154 > Zulema/M -10354a16157 +10354a16159 > Zuzana/M -10460a16264 +10460a16266 > abridgement/MS -10488a16293,16294 +10488a16295,16296 > absorbance/S > absorbancy/M -10665a16472 +10665a16474 > acknowledgement/MS -10824c16631 +10824c16633 < admin/S --- > admin/MS -10936a16744 +10936a16746 > advocator/SM -11045c16853 +11045c16855 < afterward --- > afterward/S -11393d17200 +11393d17202 < altho -11579a17387 +11579a17389 > analyses -11631c17439 +11631c17441 < anecdotal --- > anecdotal/Y -11804c17612 +11804c17614 < anthropomorphizing --- > anthropomorphize/DSG -11983c17791 +11983c17793 < app/S --- > app/MS -12137a17946 +12137a17948 > archaeology/M -12152c17961 +12152c17963 < archeological --- > archeological/Y -12432c18241 +12432c18243 < assignees --- > assignee/MS -12685c18494 +12685c18496 < auteur --- > auteur/MS -12713a18523 +12713a18525 > autocomplete/S -12754a18565 +12754a18567 > avant-garde -12827d18637 +12827d18639 < awol -12829a18640 +12829a18642 > axe/M -13864a19676 +13864a19678 > biodiesel/M -14210d20021 +14210d20023 < blueing's -14434a20246 +14434a20248 > bookselling -14841c20653 +14841c20655 < broadcast/AMGS --- > broadcast/AMGSD -15039,15040c20851 +15039,15040c20853 < bullshitter's < bullshitter/S! --- > bullshitter/SM! -15230d21040 +15230d21042 < byelaw/SM -15383d21192 +15383d21194 < callisthenics/M -15460a21270,21272 +15460a21272,21274 > cancelled/U > canceller/M > cancelling -15559a21372 +15559a21374 > capita -15629,15630d21441 +15629,15630d21443 < carburetter/SM < carburettor/SM -15701a21513 +15701a21515 > carnitas -15788d21599 +15788d21601 < cashpoint/S -15797d21607 +15797d21609 < cassino/M -15832a21643 +15832a21645 > catalyses -15940d21750 +15940d21752 < caviare/M -16372c22182 +16372c22184 < chickenshit/S! --- > chickenshit/SM! -16404c22214 +16404c22216 < children --- > children/M -16488d22297 +16488d22299 < chlorophyl/M -16629,16630c22438 +16629,16630c22440 < cider's < cider/S --- > cider/MS -17072d22879 +17072d22881 < cocain/M -17102,17103c22909 +17102,17103c22911 < cocksucker's < cocksucker/S! --- > cocksucker/SM! -17755c23561 +17755c23563 < confer/S --- > confer/SB -17800a23607 +17800a23609 > conformant -18151d23957 +18151d23959 < convenor/S -18206c24012 +18206c24014 < cookie/M --- > cookie/SM -18467a24274 +18467a24276 > could've -19035a24843 +19035a24845 > cul-de-sac -19246c25054 +19246c25056 < cysteine --- > cysteine/M -20196,20197c26004,26005 +20196,20197c26006,26007 < dialog/SM < dialogue/SM --- > dialog/SMGD > dialogue/SMRGD -20481a26290 +20481a26292 > disclose/DSG -20830c26639 +20830c26641 < dogie/M --- > dogie/SM -20895a26705 +20895a26707 > donator/MS -21820a27631 +21820a27633 > elicitor/MS -22071a27883 +22071a27885 > encyclopaedia -22556a28369 +22556a28371 > estoppel -22638c28451 +22638c28453 < euthanize --- > euthanize/DSG -22719a28533 +22719a28535 > exabyte/MS -22947a28762 +22947a28764 > experimentalism -23207,23208d29021 +23207,23208d29023 < faecal < faeces/M -23215c29028 +23215c29030 < faggoting's --- > faggot/SMG -23701a29515 +23701a29517 > filesystem/MS -24155c29969 +24155c29971 < fluidized --- > fluidize/DSG -24216a30031 +24216a30033 > foci -24736d30550 +24736d30552 < frier/M -24855,24856c30669,30670 +24855,24856c30671,30672 < fucker/M! < fuckhead/S! --- > fucker/SM! > fuckhead/SM! -24953d30766 +24953d30768 < furore/MS -25125c30938 +25125c30940 < gaolbird/S --- > gaolbirds -25180d30992 +25180d30994 < gasolene/M -25190a31003 +25190a31005 > gastroenterologist/M -25262c31075 +25262c31077 < geezer/M --- > geezer/MS -25327c31140 +25327c31142 < genomic --- > genomic/S -25462a31276 +25462a31278 > gigabit/MS -25464a31279,31281 +25464a31281,31283 > gigajoule/MS > gigapixel/MS > gigawatt/MS -25560d31376 +25560d31378 < glamourize/DSG -25674c31490 +25674c31492 < glycerine's --- > glycerine/M -25905c31721 +25905c31723 < gram/MS --- > gram/KMS -25909d31724 +25909d31726 < gramme/SM -26063c31878,31879 +26063c31880,31881 < greybeard --- > grey/MDRTGSP > greybeard/SM -26066c31882 +26066c31884 < greyness --- > greyness/M -26246,26247d32061 +26246,26247d32063 < guerilla's < guerillas -26432,26436d32245 +26432,26436d32247 < haemoglobin's < haemophilia/M < haemorrhage/DSMG < haemorrhoid/S < haemorrhoids/M -27167c32976 +27167c32978 < hexane --- > hexane/SM -27273a33083 +27273a33085 > hippopotami -27875d33684 +27875d33686 < hyaena/SM -28017c33826 +28017c33828 < iPod/M --- > iPod/MS -28105a33915 +28105a33917 > idolator/SM -28513c34323 +28513c34325 < inbound --- > inbound/s -28650a34461 +28650a34463 > indices -28812d34622 +28812d34624 < inflexion/SM -29216a35027 +29216a35029 > intern/GDL -29266a35078 +29266a35080 > interruptible/U -29272a35085,35088 +29272a35087,35090 > intersex > intersexual/MS > intersexualism > intersexuality -29724c35540 +29724c35542 < jewellery's --- > jewellery/M -29870a35687 +29870a35689 > judgement/MS -30066c35883 +30066c35885 < kiddie/M --- > kiddie/SM -30262,30263c36079 +30262,30263c36081 < kraut's < kraut/S! --- > kraut/MS! -30665a36482 +30665a36484 > lector/MS -31031c36848 +31031c36850 < linguini's --- > linguini/M -31151,31152c36968 +31151,31152c36970 < liver's < liver/S --- > liver/MS -32230c38046 +32230c38048 < meanie/M --- > meanie/MS -32317,32318c38133 +32317,32318c38135 < megadeath/M < megadeaths --- > megadeath/SM -32320c38135 +32320c38137 < megajoules --- > megajoule/SM -32329c38144 +32329c38146 < megapixel/S --- > megapixel/MS -32708a38524 +32708a38526 > might've -32717a38534 +32717a38536 > migrator/SM -32777d38593 +32760a38580 +> millennia +32777d38596 < millionnaire/M -32934a38751 +32934a38754 > miscommunication/S -32991a38809 +32991a38812 > misjudgement/MS -33784a39603 +33784a39606 > must've -33963c39782 +33963c39785 < native/MS --- > native/MSY -34169,34171c39988,39989 +34169,34171c39991,39992 < neurone/S < neurophysiology < neuroscience --- > neurophysiology/M > neuroscience/MS -34275c40093 +34275c40096 < nightie/M --- > nightie/SM -35104a40923 +35104a40926 > octopi -35219d41037 +35219d41040 < oleomargarin/M -35226a41045 +35226a41048 > oligo -35913c41732 +35913c41735 < oversize/D --- > oversize -36056,36059d41874 +36056,36059d41877 < paederast/S < paediatrician's < paediatricians < paediatrics/M -36291a42107 +36291a42110 > paralyses -36403d42218 +36403d42221 < parrakeet/MS -36449d42263 +36449d42266 < partizan/SM -37093a42908 +37093a42911 > petabyte/MS -37102c42917 +37102c42920 < petitioner/M --- > petitioner/MS -37264a43080 +37264a43083 > phosphorylate/DSGN -37316d43131 +37316d43134 < phrenetic -37796a43612 +37796a43615 > plugin/MS -37987c43803 +37987c43806 < polypeptide/S --- > polypeptide/MS -38291d44106 +38291d44109 < practise's -38451a44267 +38451a44270 > prejudgement/MS -38805a44622 +38805a44625 > profiler/SM -38835a44653 +38835a44656 > programmatically -38891a44710,44711 +38891a44713,44714 > pronate/DSGN > pronator/MS -38951c44771 +38951c44774 < proprietorship/M --- > proprietorship/MS -39039a44860 +39039a44863 > provender/M -39564a45386 +39564a45389 > quinoa -40036a45859 +40036a45862 > recency -40140a45964 +40140a45967 > recurse/DGSV -40141a45966 +40141a45969 > recuse/DGS -40208a46034 +40208a46037 > refactor/SMDG -40244d46069 +40244d46072 < reflexion/SM -40659d46483 +40659d46486 < resizing -40829c46653 +40829c46656 < reverie/M --- > reverie/MS -41415a47240 +41415a47243 > sabre/MS -41914c47739 +41914c47742 < schnaps's --- > schnaps/M -41949c47774 +41949c47777 < schrod's --- > schrod/SM -41998a47824 +41998a47827 > scot-free -42883,42885c48709 +42883,42885c48712 < shit's < shit/S! < shite/S! --- > shit/MS! -42887,42888c48711,48712 +42887,42888c48714,48715 < shithead/S! < shitload/! --- > shithead/MS! > shitload/MS! -42891c48715 +42891c48718 < shitty/RT! --- > shitty/TR! -42976a48801 +42976a48804 > should've -43008c48833 +43008c48836 < showtime --- > showtime/MS -43328c49153 +43328c49156 < size/MGBDRS --- > size/AMGBDRS -43724,43726c49549 +43724,43726c49552 < smoulder's < smouldered < smoulders --- > smoulder/GSMD -44062c49885 +44062c49888 < sonofabitch --- > sonofabitch/! -44346a50170 +44346a50173 > spelled -44348a50173 +44348a50176 > spelt -44371a50197 +44371a50200 > spick/S! -44383c50209 +44383c50212 < spik/S --- > spik/S! -46106a51933 +46106a51936 > syllabi -46160c51987 +46160c51990 < synch/GMD --- > synch/GMDS -46167d51993 +46167d51996 < synchs -46203,46204c52029,52030 +46203,46204c52032,52033 < sysadmin/S < sysop/S --- > sysadmin/MS > sysop/MS -46752a52579 +46752a52582 > terabit/MS -46753a52581,52582 +46753a52584,52585 > terahertz/M > terapixel/MS -46817a52647 +46817a52650 > testcase/MS -46831a52662 +46831a52665 > testsuite/MS -46925a52757 +46925a52760 > theremin/MS -47455c53287 +47455c53290 < toolbar --- > toolbar/MS -47755a53588 +47755a53591 > transfect/DSMG -47774a53608,53609 +47774a53611,53612 > transgenderism > transgene/MS -47951c53786 +47951c53789 < triage/M --- > triage/MG -48869a54705 +48869a54708 > unlikeable -49211c55047 +49211c55050 < vagina/M --- > vagina/MS -49368,49369c55204 +49368,49369c55207 < velour's < velours's --- > velour/MS -49478a55314 +49478a55317 > vertices -50148a55985 +50148a55988 > weaponize/DSG -50260,50261d56096 +50260,50261d56099 < werwolf/M < werwolves -50728c56563 +50728c56566 < women --- > women/M -50794c56629 +50794c56632 < wop/S! --- > wop/MS! diff --git a/extensions/spellcheck/locales/en-US/hunspell/en-US.dic b/extensions/spellcheck/locales/en-US/hunspell/en-US.dic index df67e5ba361..9f23b3c7cf1 100644 --- a/extensions/spellcheck/locales/en-US/hunspell/en-US.dic +++ b/extensions/spellcheck/locales/en-US/hunspell/en-US.dic @@ -1,4 +1,4 @@ -57451 +57454 0/nm 0th/pt 1/n1 @@ -3828,11 +3828,13 @@ DOS/M DOT DP/SM DPT +DRM DST DTP DUI DVD DVDs +DVR/S DWI Dacca/M Dacey/M @@ -38880,6 +38882,7 @@ milky/RTP mill/MDRSZGJ millage/M millenarian +millennia millennial millennium/SM millepede/MS diff --git a/extensions/spellcheck/src/mozInlineSpellWordUtil.cpp b/extensions/spellcheck/src/mozInlineSpellWordUtil.cpp index 46cdc1f3692..80974ec1905 100644 --- a/extensions/spellcheck/src/mozInlineSpellWordUtil.cpp +++ b/extensions/spellcheck/src/mozInlineSpellWordUtil.cpp @@ -44,7 +44,8 @@ inline bool IsIgnorableCharacter(PRUnichar ch) inline bool IsConditionalPunctuation(PRUnichar ch) { return (ch == '\'' || - ch == 0x2019); // RIGHT SINGLE QUOTATION MARK + ch == 0x2019 || // RIGHT SINGLE QUOTATION MARK + ch == 0x00B7); // MIDDLE DOT } // mozInlineSpellWordUtil::Init diff --git a/gfx/2d/PathD2D.cpp b/gfx/2d/PathD2D.cpp index a6bd78e1736..d3aa5af479a 100644 --- a/gfx/2d/PathD2D.cpp +++ b/gfx/2d/PathD2D.cpp @@ -345,7 +345,7 @@ PathD2D::TransformedCopyToBuilder(const Matrix &aTransform, FillRule aFillRule) sink); } - RefPtr pathBuilder = new PathBuilderD2D(sink, path, mFillRule); + RefPtr pathBuilder = new PathBuilderD2D(sink, path, aFillRule); pathBuilder->mCurrentPoint = aTransform * mEndPoint; diff --git a/gfx/layers/composite/APZCTreeManager.cpp b/gfx/layers/composite/APZCTreeManager.cpp index dd802972683..0dbbfa64759 100644 --- a/gfx/layers/composite/APZCTreeManager.cpp +++ b/gfx/layers/composite/APZCTreeManager.cpp @@ -107,6 +107,8 @@ APZCTreeManager::UpdatePanZoomControllerTree(CompositorParent* aCompositor, bool aIsFirstPaint, uint64_t aFirstPaintLayersId, nsTArray< nsRefPtr >* aApzcsToDestroy) { + mTreeLock.AssertCurrentThreadOwns(); + ContainerLayer* container = aLayer->AsContainerLayer(); AsyncPanZoomController* apzc = nullptr; if (container) { @@ -315,7 +317,7 @@ APZCTreeManager::ReceiveInputEvent(const InputData& aEvent, return result; } -AsyncPanZoomController* +already_AddRefed APZCTreeManager::GetTouchInputBlockAPZC(const WidgetTouchEvent& aEvent, ScreenPoint aPoint) { @@ -324,7 +326,7 @@ APZCTreeManager::GetTouchInputBlockAPZC(const WidgetTouchEvent& aEvent, // Reset the cached apz transform mCachedTransformToApzcForInputBlock = transformToApzc; if (!apzc) { - return nullptr; + return apzc.forget(); } for (size_t i = 1; i < aEvent.touches.Length(); i++) { nsIntPoint point = aEvent.touches[i]->mRefPoint; @@ -341,7 +343,7 @@ APZCTreeManager::GetTouchInputBlockAPZC(const WidgetTouchEvent& aEvent, // Cache apz transform so it can be used for future events in this block. GetInputTransforms(apzc, mCachedTransformToApzcForInputBlock, transformToGecko); } - return apzc.get(); + return apzc.forget(); } nsEventStatus @@ -349,6 +351,8 @@ APZCTreeManager::ProcessTouchEvent(const WidgetTouchEvent& aEvent, ScrollableLayerGuid* aOutTargetGuid, WidgetTouchEvent* aOutEvent) { + MOZ_ASSERT(NS_IsMainThread()); + nsEventStatus ret = nsEventStatus_eIgnore; if (!aEvent.touches.Length()) { return ret; @@ -421,6 +425,8 @@ APZCTreeManager::ProcessMouseEvent(const WidgetMouseEvent& aEvent, ScrollableLayerGuid* aOutTargetGuid, WidgetMouseEvent* aOutEvent) { + MOZ_ASSERT(NS_IsMainThread()); + nsRefPtr apzc = GetTargetAPZC(ScreenPoint(aEvent.refPoint.x, aEvent.refPoint.y)); if (!apzc) { return nsEventStatus_eIgnore; @@ -441,6 +447,8 @@ APZCTreeManager::ProcessEvent(const WidgetInputEvent& aEvent, ScrollableLayerGuid* aOutTargetGuid, WidgetInputEvent* aOutEvent) { + MOZ_ASSERT(NS_IsMainThread()); + // Transform the refPoint nsRefPtr apzc = GetTargetAPZC(ScreenPoint(aEvent.refPoint.x, aEvent.refPoint.y)); if (!apzc) { @@ -645,6 +653,8 @@ APZCTreeManager::GetTargetAPZC(const ScreenPoint& aPoint) AsyncPanZoomController* APZCTreeManager::FindTargetAPZC(AsyncPanZoomController* aApzc, const ScrollableLayerGuid& aGuid) { + mTreeLock.AssertCurrentThreadOwns(); + // This walks the tree in depth-first, reverse order, so that it encounters // APZCs front-to-back on the screen. for (AsyncPanZoomController* child = aApzc->GetLastChild(); child; child = child->GetPrevSibling()) { @@ -663,6 +673,8 @@ APZCTreeManager::FindTargetAPZC(AsyncPanZoomController* aApzc, const ScrollableL AsyncPanZoomController* APZCTreeManager::GetAPZCAtPoint(AsyncPanZoomController* aApzc, const gfxPoint& aHitTestPoint) { + mTreeLock.AssertCurrentThreadOwns(); + // The comments below assume there is a chain of layers L..R with L and P having APZC instances as // explained in the comment on GetInputTransforms. This function will recurse with aApzc at L and P, and the // comments explain what values are stored in the variables at these two levels. All the comments @@ -796,6 +808,8 @@ void APZCTreeManager::GetInputTransforms(AsyncPanZoomController *aApzc, gfx3DMatrix& aTransformToApzcOut, gfx3DMatrix& aTransformToGeckoOut) { + MonitorAutoLock lock(mTreeLock); + // The comments below assume there is a chain of layers L..R with L and P having APZC instances as // explained in the comment above. This function is called with aApzc at L, and the loop // below performs one iteration, where parent is at P. The comments explain what values are stored @@ -835,9 +849,12 @@ APZCTreeManager::GetInputTransforms(AsyncPanZoomController *aApzc, gfx3DMatrix& } } -AsyncPanZoomController* +already_AddRefed APZCTreeManager::CommonAncestor(AsyncPanZoomController* aApzc1, AsyncPanZoomController* aApzc2) { + MonitorAutoLock lock(mTreeLock); + nsRefPtr ancestor; + // If either aApzc1 or aApzc2 is null, min(depth1, depth2) will be 0 and this function // will return null. @@ -866,7 +883,8 @@ APZCTreeManager::CommonAncestor(AsyncPanZoomController* aApzc1, AsyncPanZoomCont // either APZC, and return the the first common ancestor encountered. while (true) { if (aApzc1 == aApzc2) { - return aApzc1; + ancestor = aApzc1; + break; } if (depth1 <= 0) { break; @@ -874,16 +892,18 @@ APZCTreeManager::CommonAncestor(AsyncPanZoomController* aApzc1, AsyncPanZoomCont aApzc1 = aApzc1->GetParent(); aApzc2 = aApzc2->GetParent(); } - return nullptr; + return ancestor.forget(); } -AsyncPanZoomController* +already_AddRefed APZCTreeManager::RootAPZCForLayersId(AsyncPanZoomController* aApzc) { - while (aApzc && !aApzc->IsRootForLayersId()) { - aApzc = aApzc->GetParent(); + MonitorAutoLock lock(mTreeLock); + nsRefPtr apzc = aApzc; + while (apzc && !apzc->IsRootForLayersId()) { + apzc = apzc->GetParent(); } - return aApzc; + return apzc.forget(); } } diff --git a/gfx/layers/composite/APZCTreeManager.h b/gfx/layers/composite/APZCTreeManager.h index c28a8272628..9b21b50b05d 100644 --- a/gfx/layers/composite/APZCTreeManager.h +++ b/gfx/layers/composite/APZCTreeManager.h @@ -310,9 +310,9 @@ private: /* Helpers */ AsyncPanZoomController* FindTargetAPZC(AsyncPanZoomController* aApzc, const ScrollableLayerGuid& aGuid); AsyncPanZoomController* GetAPZCAtPoint(AsyncPanZoomController* aApzc, const gfxPoint& aHitTestPoint); - AsyncPanZoomController* CommonAncestor(AsyncPanZoomController* aApzc1, AsyncPanZoomController* aApzc2); - AsyncPanZoomController* RootAPZCForLayersId(AsyncPanZoomController* aApzc); - AsyncPanZoomController* GetTouchInputBlockAPZC(const WidgetTouchEvent& aEvent, ScreenPoint aPoint); + already_AddRefed CommonAncestor(AsyncPanZoomController* aApzc1, AsyncPanZoomController* aApzc2); + already_AddRefed RootAPZCForLayersId(AsyncPanZoomController* aApzc); + already_AddRefed GetTouchInputBlockAPZC(const WidgetTouchEvent& aEvent, ScreenPoint aPoint); nsEventStatus ProcessTouchEvent(const WidgetTouchEvent& touchEvent, ScrollableLayerGuid* aOutTargetGuid, WidgetTouchEvent* aOutEvent); nsEventStatus ProcessMouseEvent(const WidgetMouseEvent& mouseEvent, ScrollableLayerGuid* aOutTargetGuid, WidgetMouseEvent* aOutEvent); nsEventStatus ProcessEvent(const WidgetInputEvent& inputEvent, ScrollableLayerGuid* aOutTargetGuid, WidgetInputEvent* aOutEvent); diff --git a/gfx/tests/crashtests/624198.xhtml b/gfx/tests/crashtests/624198.xhtml new file mode 100644 index 00000000000..67d207b7a17 --- /dev/null +++ b/gfx/tests/crashtests/624198.xhtml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gfx/tests/crashtests/crashtests.list b/gfx/tests/crashtests/crashtests.list index 258750e3f26..437f697c6ca 100644 --- a/gfx/tests/crashtests/crashtests.list +++ b/gfx/tests/crashtests/crashtests.list @@ -85,6 +85,7 @@ load 580233-1.html load 580719-1.html load 594654-1.xhtml load 595727-1.html +load 624198.xhtml load 633453-1.html load 633322-1.html load 665218.html diff --git a/gfx/thebes/gfxFont.cpp b/gfx/thebes/gfxFont.cpp index f9cedc2daee..21843d00398 100644 --- a/gfx/thebes/gfxFont.cpp +++ b/gfx/thebes/gfxFont.cpp @@ -3344,11 +3344,14 @@ gfxFont::ShapeTextWithoutWordCache(gfxContext *aContext, } // fragment was terminated by an invalid char: skip it, + // unless it's a control char that we want to show as a hexbox, // but record where TAB or NEWLINE occur if (ch == '\t') { aTextRun->SetIsTab(aOffset + i); } else if (ch == '\n') { aTextRun->SetIsNewline(aOffset + i); + } else if ((ch & 0x7f) < 0x20 || ch == 0x7f) { + aTextRun->SetMissingGlyph(aOffset + i, ch, this); } fragStart = i + 1; } @@ -3485,11 +3488,14 @@ gfxFont::SplitAndInitTextRun(gfxContext *aContext, "how did we get here except via an invalid char?"); // word was terminated by an invalid char: skip it, + // unless it's a control char that we want to show as a hexbox, // but record where TAB or NEWLINE occur if (ch == '\t') { aTextRun->SetIsTab(aRunStart + i); } else if (ch == '\n') { aTextRun->SetIsNewline(aRunStart + i); + } else if ((ch & 0x7f) < 0x20 || ch == 0x7f) { + aTextRun->SetMissingGlyph(aRunStart + i, ch, this); } hash = 0; diff --git a/js/public/Value.h b/js/public/Value.h index 7a772bcfba1..77b91dbb638 100644 --- a/js/public/Value.h +++ b/js/public/Value.h @@ -1602,33 +1602,51 @@ class MutableValueOperations : public UnbarrieredMutableValueOperations * type-querying, value-extracting, and mutating operations. */ template <> -class HeapBase : public UnbarrieredMutableValueOperations > +class HeapBase : public ValueOperations > { typedef JS::Heap Outer; friend class ValueOperations; - friend class UnbarrieredMutableValueOperations; const JS::Value * extract() const { return static_cast(this)->address(); } - JS::Value * extractMutable() { return static_cast(this)->unsafeGet(); } - /* - * Setters that potentially change the value to a GC thing from a non-GC - * thing must call JS::Heap::set() to trigger the post barrier. - * - * Changing from a GC thing to a non-GC thing value will leave the heap - * value in the store buffer, but it will be ingored so this is not a - * problem. - */ void setBarriered(const JS::Value &v) { static_cast *>(this)->set(v); } public: + void setNull() { setBarriered(JS::NullValue()); } + void setUndefined() { setBarriered(JS::UndefinedValue()); } + void setInt32(int32_t i) { setBarriered(JS::Int32Value(i)); } + void setDouble(double d) { setBarriered(JS::DoubleValue(d)); } + void setNaN() { setDouble(JS::GenericNaN()); } + void setBoolean(bool b) { setBarriered(JS::BooleanValue(b)); } + void setMagic(JSWhyMagic why) { setBarriered(JS::MagicValue(why)); } void setString(JSString *str) { setBarriered(JS::StringValue(str)); } void setString(const JS::Anchor &str) { setBarriered(JS::StringValue(str.get())); } void setObject(JSObject &obj) { setBarriered(JS::ObjectValue(obj)); } + bool setNumber(uint32_t ui) { + if (ui > JSVAL_INT_MAX) { + setDouble((double)ui); + return false; + } else { + setInt32((int32_t)ui); + return true; + } + } + + bool setNumber(double d) { + int32_t i; + if (mozilla::DoubleIsInt32(d, &i)) { + setInt32(i); + return true; + } + + setDouble(d); + return false; + } + void setObjectOrNull(JSObject *arg) { if (arg) setObject(*arg); diff --git a/js/src/assembler/assembler/MacroAssemblerX86Common.cpp b/js/src/assembler/assembler/MacroAssemblerX86Common.cpp index 15e98762ce0..9965a9ff758 100644 --- a/js/src/assembler/assembler/MacroAssemblerX86Common.cpp +++ b/js/src/assembler/assembler/MacroAssemblerX86Common.cpp @@ -16,6 +16,8 @@ MacroAssemblerX86Common::SSECheckState MacroAssemblerX86Common::s_sseCheckState #ifdef DEBUG bool MacroAssemblerX86Common::s_floatingPointDisabled = false; +bool MacroAssemblerX86Common::s_SSE3Disabled = false; +bool MacroAssemblerX86Common::s_SSE4Disabled = false; #endif #endif /* WTF_CPU_X86 || WTF_CPU_X86_64 */ diff --git a/js/src/assembler/assembler/MacroAssemblerX86Common.h b/js/src/assembler/assembler/MacroAssemblerX86Common.h index 39505bfcf87..a58b0777f8f 100644 --- a/js/src/assembler/assembler/MacroAssemblerX86Common.h +++ b/js/src/assembler/assembler/MacroAssemblerX86Common.h @@ -1403,6 +1403,13 @@ private: s_sseCheckState = HasSSE; else s_sseCheckState = NoSSE; + +#ifdef DEBUG + if (s_sseCheckState >= HasSSE4_1 && s_SSE4Disabled) + s_sseCheckState = HasSSE3; + if (s_sseCheckState >= HasSSE3 && s_SSE3Disabled) + s_sseCheckState = HasSSE2; +#endif } #if WTF_CPU_X86 @@ -1505,11 +1512,19 @@ private: #ifdef DEBUG static bool s_floatingPointDisabled; + static bool s_SSE3Disabled; + static bool s_SSE4Disabled; public: static void SetFloatingPointDisabled() { s_floatingPointDisabled = true; } + static void SetSSE3Disabled() { + s_SSE3Disabled = true; + } + static void SetSSE4Disabled() { + s_SSE4Disabled = true; + } #endif }; diff --git a/js/src/builtin/TypedObject.cpp b/js/src/builtin/TypedObject.cpp index 287272aa754..a8e4cdcef2c 100644 --- a/js/src/builtin/TypedObject.cpp +++ b/js/src/builtin/TypedObject.cpp @@ -529,6 +529,7 @@ const JSPropertySpec ArrayType::typedObjectProperties[] = { const JSFunctionSpec ArrayType::typedObjectMethods[] = { JS_FN("subarray", ArrayType::subarray, 2, 0), {"forEach", {nullptr, nullptr}, 1, 0, "ArrayForEach"}, + {"redimension", {nullptr, nullptr}, 1, 0, "TypedArrayRedimension"}, JS_FS_END }; diff --git a/js/src/builtin/TypedObject.js b/js/src/builtin/TypedObject.js index e5c7932c9eb..b67a77ae2fd 100644 --- a/js/src/builtin/TypedObject.js +++ b/js/src/builtin/TypedObject.js @@ -415,6 +415,73 @@ function TypeObjectEquivalent(otherTypeObj) { return TYPE_TYPE_REPR(this) === TYPE_TYPE_REPR(otherTypeObj); } +// TypedArray.redimension(newArrayType) +// +// Method that "repackages" the data from this array into a new typed +// object whose type is `newArrayType`. Once you strip away all the +// outer array dimensions, the type of `this` array and `newArrayType` +// must share the same innermost element type. Moreover, those +// stripped away dimensions must amount to the same total number of +// elements. +// +// For example, given two equivalent types `T` and `U`, it is legal to +// interconvert between arrays types like: +// T[32] +// U[2][16] +// U[2][2][8] +// Because they all share the same total number (32) of equivalent elements. +// But it would be illegal to convert `T[32]` to `U[31]` or `U[2][17]`, since +// the number of elements differs. And it's just plain incompatible to convert +// if the base element types are not equivalent. +// +// Warning: user exposed! +function TypedArrayRedimension(newArrayType) { + if (!IsObject(this) || !ObjectIsTypedDatum(this)) + ThrowError(JSMSG_TYPEDOBJECT_HANDLE_BAD_ARGS, "this", "typed array"); + + if (!IsObject(newArrayType) || !ObjectIsTypeObject(newArrayType)) + ThrowError(JSMSG_TYPEDOBJECT_HANDLE_BAD_ARGS, 1, "type object"); + + // Peel away the outermost array layers from the type of `this` to find + // the core element type. In the process, count the number of elements. + var oldArrayType = DATUM_TYPE_OBJ(this); + var oldElementType = oldArrayType; + var oldElementCount = 1; + while (REPR_KIND(TYPE_TYPE_REPR(oldElementType)) == JS_TYPEREPR_ARRAY_KIND) { + oldElementCount *= oldElementType.length; + oldElementType = oldElementType.elementType; + } + + // Peel away the outermost array layers from `newArrayType`. In the + // process, count the number of elements. + var newElementType = newArrayType; + var newElementCount = 1; + while (REPR_KIND(TYPE_TYPE_REPR(newElementType)) == JS_TYPEREPR_ARRAY_KIND) { + newElementCount *= newElementType.length; + newElementType = newElementType.elementType; + } + + // Check that the total number of elements does not change. + if (oldElementCount !== newElementCount) { + ThrowError(JSMSG_TYPEDOBJECT_HANDLE_BAD_ARGS, 1, + "New number of elements does not match old number of elements"); + } + + // Check that the element types are equivalent. + if (TYPE_TYPE_REPR(oldElementType) !== TYPE_TYPE_REPR(newElementType)) { + ThrowError(JSMSG_TYPEDOBJECT_HANDLE_BAD_ARGS, 1, + "New element type is not equivalent to old element type"); + } + + // Together, this should imply that the sizes are unchanged. + assert(REPR_SIZE(TYPE_TYPE_REPR(oldArrayType)) == + REPR_SIZE(TYPE_TYPE_REPR(newArrayType)), + "Byte sizes should be equal"); + + // Rewrap the data from `this` in a new type. + return NewDerivedTypedDatum(newArrayType, this, 0); +} + /////////////////////////////////////////////////////////////////////////// // Handles // diff --git a/js/src/config/rules.mk b/js/src/config/rules.mk index 93cd9426e73..42d10170b03 100644 --- a/js/src/config/rules.mk +++ b/js/src/config/rules.mk @@ -800,7 +800,7 @@ else # !WINNT || GNU_CC endif # WINNT && !GNU_CC ifdef ENABLE_STRIP - $(STRIP) $@ + $(STRIP) $(STRIP_FLAGS) $@ endif ifdef MOZ_POST_PROGRAM_COMMAND $(MOZ_POST_PROGRAM_COMMAND) $@ @@ -856,7 +856,7 @@ else endif # WINNT && !GNU_CC ifdef ENABLE_STRIP - $(STRIP) $@ + $(STRIP) $(STRIP_FLAGS) $@ endif ifdef MOZ_POST_PROGRAM_COMMAND $(MOZ_POST_PROGRAM_COMMAND) $@ @@ -883,7 +883,6 @@ $(filter %.$(LIB_SUFFIX),$(LIBRARY)): $(OBJS) $(EXTRA_DEPS) $(GLOBAL_DEPS) $(REPORT_BUILD) $(RM) $(LIBRARY) $(EXPAND_AR) $(AR_FLAGS) $(OBJS) $(SHARED_LIBRARY_LIBS) - $(RANLIB) $@ $(filter-out %.$(LIB_SUFFIX),$(LIBRARY)): $(filter %.$(LIB_SUFFIX),$(LIBRARY)) $(OBJS) $(EXTRA_DEPS) $(GLOBAL_DEPS) # When we only build a library descriptor, blow out any existing library @@ -917,14 +916,12 @@ $(IMPORT_LIBRARY): $(SHARED_LIBRARY) $(REPORT_BUILD) $(RM) $@ $(IMPLIB) $@ $^ - $(RANLIB) $@ endif # OS/2 $(HOST_LIBRARY): $(HOST_OBJS) Makefile $(REPORT_BUILD) $(RM) $@ $(EXPAND_LIBS_EXEC) --extract -- $(HOST_AR) $(HOST_AR_FLAGS) $(HOST_OBJS) - $(HOST_RANLIB) $@ ifdef HAVE_DTRACE ifndef XP_MACOSX @@ -975,7 +972,7 @@ endif # WINNT && !GCC @$(RM) foodummyfilefoo $(DELETE_AFTER_LINK) chmod +x $@ ifdef ENABLE_STRIP - $(STRIP) $@ + $(STRIP) $(STRIP_FLAGS) $@ endif ifdef MOZ_POST_DSO_LIB_COMMAND $(MOZ_POST_DSO_LIB_COMMAND) $@ diff --git a/js/src/configure.in b/js/src/configure.in index f065f5a4466..bb900b5b8c3 100644 --- a/js/src/configure.in +++ b/js/src/configure.in @@ -284,7 +284,7 @@ dnl to use the cross-compile setup for now dnl ======================================================== dnl AR_FLAGS set here so HOST_AR_FLAGS can be set correctly (see bug 538269) -AR_FLAGS='cr $@' +AR_FLAGS='crs $@' if test "$COMPILE_ENVIRONMENT"; then diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index c99d9b04be9..e72a3b0a200 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -59,6 +59,7 @@ struct frontend::StmtInfoBCE : public StmtInfoBase ptrdiff_t update; /* loop update offset (top if none) */ ptrdiff_t breaks; /* offset of last break in loop */ ptrdiff_t continues; /* offset of last continue in loop */ + uint32_t blockScopeIndex; /* index of scope in BlockScopeArray */ StmtInfoBCE(ExclusiveContext *cx) : StmtInfoBase(cx) {} @@ -100,10 +101,11 @@ BytecodeEmitter::BytecodeEmitter(BytecodeEmitter *parent, atomIndices(sc->context), firstLine(lineNum), stackDepth(0), maxStackDepth(0), - tryNoteList(sc->context), arrayCompDepth(0), emitLevel(0), constList(sc->context), + tryNoteList(sc->context), + blockScopeList(sc->context), typesetCount(0), hasSingletons(false), emittingForInit(false), @@ -686,13 +688,23 @@ EnclosingStaticScope(BytecodeEmitter *bce) } // Push a block scope statement and link blockObj into bce->blockChain. -static void -PushBlockScopeBCE(BytecodeEmitter *bce, StmtInfoBCE *stmt, StaticBlockObject &blockObj, +static bool +PushBlockScopeBCE(BytecodeEmitter *bce, StmtInfoBCE *stmt, ObjectBox *objbox, ptrdiff_t top) { + StaticBlockObject &blockObj = objbox->object->as(); + PushStatementBCE(bce, stmt, STMT_BLOCK, top); + + unsigned scopeObjectIndex = bce->objectList.add(objbox); + stmt->blockScopeIndex = bce->blockScopeList.length(); + if (!bce->blockScopeList.append(scopeObjectIndex, bce->offset())) + return false; + blockObj.initEnclosingStaticScope(EnclosingStaticScope(bce)); FinishPushBlockScope(bce, stmt, blockObj); + + return true; } // Patches |breaks| and |continues| unless the top statement info record @@ -707,6 +719,10 @@ PopStatementBCE(ExclusiveContext *cx, BytecodeEmitter *bce) { return false; } + + if (stmt->isBlockScope) + bce->blockScopeList.recordEnd(stmt->blockScopeIndex, bce->offset()); + FinishPopStatement(bce); return true; } @@ -770,10 +786,17 @@ EmitAtomOp(ExclusiveContext *cx, ParseNode *pn, JSOp op, BytecodeEmitter *bce) } static bool -EmitObjectOp(ExclusiveContext *cx, ObjectBox *objbox, JSOp op, BytecodeEmitter *bce) +EmitInternedObjectOp(ExclusiveContext *cx, uint32_t index, JSOp op, BytecodeEmitter *bce) { JS_ASSERT(JOF_OPTYPE(op) == JOF_OBJECT); - return EmitIndex32(cx, op, bce->objectList.add(objbox), bce); + JS_ASSERT(index < bce->objectList.length); + return EmitIndex32(cx, op, index, bce); +} + +static bool +EmitObjectOp(ExclusiveContext *cx, ObjectBox *objbox, JSOp op, BytecodeEmitter *bce) +{ + return EmitInternedObjectOp(cx, bce->objectList.add(objbox), op, bce); } static bool @@ -1061,7 +1084,15 @@ static bool EmitEnterBlock(ExclusiveContext *cx, BytecodeEmitter *bce, ParseNode *pn, JSOp op) { JS_ASSERT(pn->isKind(PNK_LEXICALSCOPE)); - if (!EmitObjectOp(cx, pn->pn_objbox, op, bce)) + StmtInfoBCE *stmt = bce->topStmt; + JS_ASSERT(stmt->type == STMT_BLOCK || stmt->type == STMT_SWITCH); + JS_ASSERT(stmt->isBlockScope); + JS_ASSERT(stmt->blockScopeIndex == bce->blockScopeList.length() - 1); + JS_ASSERT(bce->blockScopeList.list[stmt->blockScopeIndex].length == 0); + uint32_t scopeObjectIndex = bce->blockScopeList.list[stmt->blockScopeIndex].index; + JS_ASSERT(scopeObjectIndex == bce->objectList.length - 1); + JS_ASSERT(pn->pn_objbox == bce->objectList.lastbox); + if (!EmitInternedObjectOp(cx, scopeObjectIndex, op, bce)) return false; Rooted blockObj(cx, &pn->pn_objbox->object->as()); @@ -2305,7 +2336,8 @@ EmitSwitch(ExclusiveContext *cx, BytecodeEmitter *bce, ParseNode *pn) return false; if (pn2->isKind(PNK_LEXICALSCOPE)) { - PushBlockScopeBCE(bce, &stmtInfo, pn2->pn_objbox->object->as(), -1); + if (!PushBlockScopeBCE(bce, &stmtInfo, pn2->pn_objbox, -1)) + return false; stmtInfo.type = STMT_SWITCH; if (!EmitEnterBlock(cx, bce, pn2, JSOP_ENTERLET1)) return false; @@ -4193,7 +4225,8 @@ EmitLet(ExclusiveContext *cx, BytecodeEmitter *bce, ParseNode *pnLet) } StmtInfoBCE stmtInfo(cx); - PushBlockScopeBCE(bce, &stmtInfo, *blockObj, bce->offset()); + if (!PushBlockScopeBCE(bce, &stmtInfo, letBody->pn_objbox, bce->offset())) + return false; DebugOnly bodyBegin = bce->offset(); if (!EmitEnterBlock(cx, bce, letBody, JSOP_ENTERLET0)) @@ -4226,7 +4259,8 @@ EmitLexicalScope(ExclusiveContext *cx, BytecodeEmitter *bce, ParseNode *pn) ObjectBox *objbox = pn->pn_objbox; StaticBlockObject &blockObj = objbox->object->as(); size_t slots = blockObj.slotCount(); - PushBlockScopeBCE(bce, &stmtInfo, blockObj, bce->offset()); + if (!PushBlockScopeBCE(bce, &stmtInfo, objbox, bce->offset())) + return false; if (!EmitEnterBlock(cx, bce, pn, JSOP_ENTERBLOCK)) return false; @@ -4316,7 +4350,8 @@ EmitForOf(ExclusiveContext *cx, BytecodeEmitter *bce, ParseNode *pn, ptrdiff_t t // Enter the block before the loop body, after evaluating the obj. StmtInfoBCE letStmt(cx); if (letDecl) { - PushBlockScopeBCE(bce, &letStmt, *blockObj, bce->offset()); + if (!PushBlockScopeBCE(bce, &letStmt, pn1->pn_objbox, bce->offset())) + return false; letStmt.isForLetBlock = true; if (!EmitEnterBlock(cx, bce, pn1, JSOP_ENTERLET2)) return false; @@ -4492,7 +4527,8 @@ EmitForIn(ExclusiveContext *cx, BytecodeEmitter *bce, ParseNode *pn, ptrdiff_t t /* Enter the block before the loop body, after evaluating the obj. */ StmtInfoBCE letStmt(cx); if (letDecl) { - PushBlockScopeBCE(bce, &letStmt, *blockObj, bce->offset()); + if (!PushBlockScopeBCE(bce, &letStmt, pn1->pn_objbox, bce->offset())) + return false; letStmt.isForLetBlock = true; if (!EmitEnterBlock(cx, bce, pn1, JSOP_ENTERLET1)) return false; @@ -6775,25 +6811,8 @@ frontend::FinishTakingSrcNotes(ExclusiveContext *cx, BytecodeEmitter *bce, jssrc return true; } -bool -CGTryNoteList::append(JSTryNoteKind kind, unsigned stackDepth, size_t start, size_t end) -{ - JS_ASSERT(unsigned(uint16_t(stackDepth)) == stackDepth); - JS_ASSERT(start <= end); - JS_ASSERT(size_t(uint32_t(start)) == start); - JS_ASSERT(size_t(uint32_t(end)) == end); - - JSTryNote note; - note.kind = kind; - note.stackDepth = uint16_t(stackDepth); - note.start = uint32_t(start); - note.length = uint32_t(end - start); - - return list.append(note); -} - void -CGTryNoteList::finish(TryNoteArray *array) +CGConstList::finish(ConstArray *array) { JS_ASSERT(length() == array->length); @@ -6878,8 +6897,56 @@ CGObjectList::finish(ObjectArray *array) JS_ASSERT(cursor == array->vector); } +bool +CGTryNoteList::append(JSTryNoteKind kind, unsigned stackDepth, size_t start, size_t end) +{ + JS_ASSERT(unsigned(uint16_t(stackDepth)) == stackDepth); + JS_ASSERT(start <= end); + JS_ASSERT(size_t(uint32_t(start)) == start); + JS_ASSERT(size_t(uint32_t(end)) == end); + + JSTryNote note; + note.kind = kind; + note.stackDepth = uint16_t(stackDepth); + note.start = uint32_t(start); + note.length = uint32_t(end - start); + + return list.append(note); +} + void -CGConstList::finish(ConstArray *array) +CGTryNoteList::finish(TryNoteArray *array) +{ + JS_ASSERT(length() == array->length); + + for (unsigned i = 0; i < length(); i++) + array->vector[i] = list[i]; +} + +bool +CGBlockScopeList::append(uint32_t scopeObject, uint32_t offset) +{ + BlockScopeNote note; + mozilla::PodZero(¬e); + + note.index = scopeObject; + note.start = offset; + + return list.append(note); +} + +void +CGBlockScopeList::recordEnd(uint32_t index, uint32_t offset) +{ + JS_ASSERT(index < length()); + JS_ASSERT(offset >= list[index].start); + JS_ASSERT(list[index].length == 0); + + list[index].length = offset - list[index].start; +} + +void +CGBlockScopeList::finish(BlockScopeArray *array) { JS_ASSERT(length() == array->length); diff --git a/js/src/frontend/BytecodeEmitter.h b/js/src/frontend/BytecodeEmitter.h index a66d219d200..7266f40cf32 100644 --- a/js/src/frontend/BytecodeEmitter.h +++ b/js/src/frontend/BytecodeEmitter.h @@ -28,13 +28,13 @@ template class Parser; class SharedContext; class TokenStream; -struct CGTryNoteList { - Vector list; - CGTryNoteList(ExclusiveContext *cx) : list(cx) {} - - bool append(JSTryNoteKind kind, unsigned stackDepth, size_t start, size_t end); +class CGConstList { + Vector list; + public: + CGConstList(ExclusiveContext *cx) : list(cx) {} + bool append(Value v) { JS_ASSERT_IF(v.isString(), v.toString()->isAtom()); return list.append(v); } size_t length() const { return list.length(); } - void finish(TryNoteArray *array); + void finish(ConstArray *array); }; struct CGObjectList { @@ -48,13 +48,23 @@ struct CGObjectList { void finish(ObjectArray *array); }; -class CGConstList { - Vector list; - public: - CGConstList(ExclusiveContext *cx) : list(cx) {} - bool append(Value v) { JS_ASSERT_IF(v.isString(), v.toString()->isAtom()); return list.append(v); } +struct CGTryNoteList { + Vector list; + CGTryNoteList(ExclusiveContext *cx) : list(cx) {} + + bool append(JSTryNoteKind kind, unsigned stackDepth, size_t start, size_t end); size_t length() const { return list.length(); } - void finish(ConstArray *array); + void finish(TryNoteArray *array); +}; + +struct CGBlockScopeList { + Vector list; + CGBlockScopeList(ExclusiveContext *cx) : list(cx) {} + + bool append(uint32_t scopeObject, uint32_t offset); + void recordEnd(uint32_t index, uint32_t offset); + size_t length() const { return list.length(); } + void finish(BlockScopeArray *array); }; struct StmtInfoBCE; @@ -104,8 +114,6 @@ struct BytecodeEmitter int stackDepth; /* current stack depth in script frame */ unsigned maxStackDepth; /* maximum stack depth so far */ - CGTryNoteList tryNoteList; /* list of emitted try notes */ - unsigned arrayCompDepth; /* stack depth of array in comprehension */ unsigned emitLevel; /* js::frontend::EmitTree recursion level */ @@ -115,6 +123,8 @@ struct BytecodeEmitter CGObjectList objectList; /* list of emitted objects */ CGObjectList regexpList; /* list of emitted regexp that will be cloned during execution */ + CGTryNoteList tryNoteList; /* list of emitted try notes */ + CGBlockScopeList blockScopeList;/* list of emitted block scope notes */ uint16_t typesetCount; /* Number of JOF_TYPESET opcodes generated */ diff --git a/js/src/jit-test/jit_test.py b/js/src/jit-test/jit_test.py index 1386bf49b22..37b47dca428 100755 --- a/js/src/jit-test/jit_test.py +++ b/js/src/jit-test/jit_test.py @@ -164,7 +164,7 @@ def main(argv): flags = [ [], # no flags, normal baseline and ion ['--ion-eager'], # implies --baseline-eager - ['--ion-eager', '--ion-check-range-analysis'], + ['--ion-eager', '--ion-check-range-analysis', '--no-sse3'], ['--baseline-eager'], ['--baseline-eager', '--no-ti', '--no-fpu'], ['--no-baseline', '--no-ion'], diff --git a/js/src/jit-test/tests/asm.js/bug928450.js b/js/src/jit-test/tests/asm.js/bug928450.js index 172860fa0e7..a12036735d0 100644 --- a/js/src/jit-test/tests/asm.js/bug928450.js +++ b/js/src/jit-test/tests/asm.js/bug928450.js @@ -1,6 +1,18 @@ (function() { - "use asm" + "use asm"; function f() { - i((1.5 != 2.) ? 3 : 0) + i((1.5 != 2.) ? 3 : 0); } + return f; +})(); + +// Bug 933104 +(function() { + "use asm"; + function f(x) { + x = +x; + x = -2.; + (x > -1.5) ? 0 : 0; + } + return f; })() diff --git a/js/src/jit-test/tests/ion/bug936361.js b/js/src/jit-test/tests/ion/bug936361.js index e64873632f3..cd9325f63a9 100644 --- a/js/src/jit-test/tests/ion/bug936361.js +++ b/js/src/jit-test/tests/ion/bug936361.js @@ -1,3 +1,5 @@ +if (typeof ParallelArray === "undefined") + quit(); x = ParallelArray([1942], function() {}) x + watch.call(x, "length", (function() {})); diff --git a/js/src/jit/BacktrackingAllocator.cpp b/js/src/jit/BacktrackingAllocator.cpp index 38d0fc3341c..16829a9b566 100644 --- a/js/src/jit/BacktrackingAllocator.cpp +++ b/js/src/jit/BacktrackingAllocator.cpp @@ -113,12 +113,12 @@ BacktrackingAllocator::go() return false; IonSpew(IonSpew_RegAlloc, "Liveness analysis complete"); - if (IonSpewEnabled(IonSpew_RegAlloc)) - dumpLiveness(); - if (!init()) return false; + if (IonSpewEnabled(IonSpew_RegAlloc)) + dumpLiveness(); + if (!allocationQueue.reserve(graph.numVirtualRegisters() * 3 / 2)) return false; @@ -317,7 +317,9 @@ BacktrackingAllocator::tryGroupReusedRegister(uint32_t def, uint32_t use) if (!newIntervals.append(preInterval) || !newIntervals.append(postInterval)) return false; - if (!distributeUses(interval, newIntervals) || !split(interval, newIntervals)) + distributeUses(interval, newIntervals); + + if (!split(interval, newIntervals)) return false; JS_ASSERT(usedReg.numIntervals() == 2); @@ -331,7 +333,9 @@ bool BacktrackingAllocator::groupAndQueueRegisters() { // Try to group registers with their reused inputs. - for (size_t i = 0; i < graph.numVirtualRegisters(); i++) { + // Virtual register number 0 is unused. + JS_ASSERT(vregs[0u].numIntervals() == 0); + for (size_t i = 1; i < graph.numVirtualRegisters(); i++) { BacktrackingVirtualRegister ® = vregs[i]; if (!reg.numIntervals()) continue; @@ -357,7 +361,9 @@ BacktrackingAllocator::groupAndQueueRegisters() } } - for (size_t i = 0; i < graph.numVirtualRegisters(); i++) { + // Virtual register number 0 is unused. + JS_ASSERT(vregs[0u].numIntervals() == 0); + for (size_t i = 1; i < graph.numVirtualRegisters(); i++) { if (mir->shouldCancel("Backtracking Enqueue Registers")) return false; @@ -491,19 +497,17 @@ BacktrackingAllocator::processInterval(LiveInterval *interval) return true; } } - } - // Failed to allocate a register for this interval. - - if (attempt < MAX_ATTEMPTS && - canAllocate && - !fixed && - conflict && - computeSpillWeight(conflict) < computeSpillWeight(interval)) - { - if (!evictInterval(conflict)) - return false; - continue; + // Failed to allocate a register for this interval. + if (attempt < MAX_ATTEMPTS && + !fixed && + conflict && + computeSpillWeight(conflict) < computeSpillWeight(interval)) + { + if (!evictInterval(conflict)) + return false; + continue; + } } // A minimal interval cannot be split any further. If we try to split @@ -757,7 +761,7 @@ BacktrackingAllocator::evictInterval(LiveInterval *interval) return allocationQueue.insert(QueueItem(interval, priority)); } -bool +void BacktrackingAllocator::distributeUses(LiveInterval *interval, const LiveIntervalVector &newIntervals) { @@ -782,8 +786,6 @@ BacktrackingAllocator::distributeUses(LiveInterval *interval, } addInterval->addUse(new UsePosition(iter->use, iter->pos)); } - - return true; } bool @@ -791,7 +793,7 @@ BacktrackingAllocator::split(LiveInterval *interval, const LiveIntervalVector &newIntervals) { if (IonSpewEnabled(IonSpew_RegAlloc)) { - IonSpew(IonSpew_RegAlloc, "splitting interval v%u %s:", + IonSpew(IonSpew_RegAlloc, "splitting interval v%u %s into:", interval->vreg(), IntervalString(interval)); for (size_t i = 0; i < newIntervals.length(); i++) IonSpew(IonSpew_RegAlloc, " %s", IntervalString(newIntervals[i])); @@ -885,7 +887,9 @@ BacktrackingAllocator::spill(LiveInterval *interval) bool BacktrackingAllocator::resolveControlFlow() { - for (size_t i = 0; i < graph.numVirtualRegisters(); i++) { + // Virtual register number 0 is unused. + JS_ASSERT(vregs[0u].numIntervals() == 0); + for (size_t i = 1; i < graph.numVirtualRegisters(); i++) { BacktrackingVirtualRegister *reg = &vregs[i]; if (mir->shouldCancel("Backtracking Resolve Control Flow (vreg loop)")) @@ -1001,11 +1005,11 @@ BacktrackingAllocator::isReusedInput(LUse *use, LInstruction *ins, bool consider } bool -BacktrackingAllocator::isRegisterUse(LUse *use, LInstruction *ins) +BacktrackingAllocator::isRegisterUse(LUse *use, LInstruction *ins, bool considerCopy) { switch (use->policy()) { case LUse::ANY: - return isReusedInput(use, ins); + return isReusedInput(use, ins, considerCopy); case LUse::REGISTER: case LUse::FIXED: @@ -1035,7 +1039,9 @@ BacktrackingAllocator::isRegisterDefinition(LiveInterval *interval) bool BacktrackingAllocator::reifyAllocations() { - for (size_t i = 0; i < graph.numVirtualRegisters(); i++) { + // Virtual register number 0 is unused. + JS_ASSERT(vregs[0u].numIntervals() == 0); + for (size_t i = 1; i < graph.numVirtualRegisters(); i++) { VirtualRegister *reg = &vregs[i]; if (mir->shouldCancel("Backtracking Reify Allocations (main loop)")) @@ -1095,7 +1101,9 @@ BacktrackingAllocator::populateSafepoints() { size_t firstSafepoint = 0; - for (uint32_t i = 0; i < vregs.numVirtualRegisters(); i++) { + // Virtual register number 0 is unused. + JS_ASSERT(!vregs[0u].def()); + for (uint32_t i = 1; i < vregs.numVirtualRegisters(); i++) { BacktrackingVirtualRegister *reg = &vregs[i]; if (!reg->def() || (!IsTraceable(reg) && !IsSlotsOrElements(reg) && !IsNunbox(reg))) @@ -1132,7 +1140,7 @@ BacktrackingAllocator::populateSafepoints() for (size_t k = 0; k < reg->numIntervals(); k++) { LiveInterval *interval = reg->getInterval(k); - if (!interval->covers(inputOf(ins))) + if (!interval->covers(outputOf(ins))) continue; LAllocation *a = interval->getAllocation(); @@ -1172,7 +1180,10 @@ void BacktrackingAllocator::dumpRegisterGroups() { fprintf(stderr, "Register groups:\n"); - for (size_t i = 0; i < graph.numVirtualRegisters(); i++) { + + // Virtual register number 0 is unused. + JS_ASSERT(!vregs[0u].group()); + for (size_t i = 1; i < graph.numVirtualRegisters(); i++) { VirtualRegisterGroup *group = vregs[i].group(); if (group && i == group->canonicalReg()) { for (size_t j = 0; j < group->registers.length(); j++) @@ -1200,11 +1211,12 @@ BacktrackingAllocator::dumpLiveness() for (size_t i = 0; i < block->numPhis(); i++) { LPhi *phi = block->getPhi(i); - fprintf(stderr, "[%u,%u Phi v%u <-", - inputOf(phi).pos(), outputOf(phi).pos(), + // Don't print the inputOf for phi nodes, since it's never used. + fprintf(stderr, "[,%u Phi [def v%u] <-", + outputOf(phi).pos(), phi->getDef(0)->virtualRegister()); for (size_t j = 0; j < phi->numOperands(); j++) - fprintf(stderr, " v%u", phi->getOperand(j)->toUse()->virtualRegister()); + fprintf(stderr, " %s", phi->getOperand(j)->toString()); fprintf(stderr, "]\n"); } @@ -1224,10 +1236,8 @@ BacktrackingAllocator::dumpLiveness() fprintf(stderr, " [def v%u]", def->virtualRegister()); } - for (LInstruction::InputIterator alloc(*ins); alloc.more(); alloc.next()) { - if (alloc->isUse()) - fprintf(stderr, " [use v%u]", alloc->toUse()->virtualRegister()); - } + for (LInstruction::InputIterator alloc(*ins); alloc.more(); alloc.next()) + fprintf(stderr, " [use %s]", alloc->toString()); fprintf(stderr, "\n"); } @@ -1236,9 +1246,12 @@ BacktrackingAllocator::dumpLiveness() fprintf(stderr, "\nLive Ranges:\n\n"); for (size_t i = 0; i < AnyRegister::Total; i++) - fprintf(stderr, "reg %s: %s\n", AnyRegister::FromCode(i).name(), IntervalString(fixedIntervals[i])); + if (registers[i].allocatable) + fprintf(stderr, "reg %s: %s\n", AnyRegister::FromCode(i).name(), IntervalString(fixedIntervals[i])); - for (size_t i = 0; i < graph.numVirtualRegisters(); i++) { + // Virtual register number 0 is unused. + JS_ASSERT(vregs[0u].numIntervals() == 0); + for (size_t i = 1; i < graph.numVirtualRegisters(); i++) { fprintf(stderr, "v%lu:", static_cast(i)); VirtualRegister &vreg = vregs[i]; for (size_t j = 0; j < vreg.numIntervals(); j++) { @@ -1259,9 +1272,13 @@ struct BacktrackingAllocator::PrintLiveIntervalRange void operator()(const AllocatedRange &item) { if (item.range == item.interval->getRange(0)) { - fprintf(stderr, " v%u: %s\n", - item.interval->hasVreg() ? item.interval->vreg() : 0, - IntervalString(item.interval)); + if (item.interval->hasVreg()) + fprintf(stderr, " v%u: %s\n", + item.interval->vreg(), + IntervalString(item.interval)); + else + fprintf(stderr, " fixed: %s\n", + IntervalString(item.interval)); } } }; @@ -1273,7 +1290,9 @@ BacktrackingAllocator::dumpAllocations() #ifdef DEBUG fprintf(stderr, "Allocations:\n"); - for (size_t i = 0; i < graph.numVirtualRegisters(); i++) { + // Virtual register number 0 is unused. + JS_ASSERT(vregs[0u].numIntervals() == 0); + for (size_t i = 1; i < graph.numVirtualRegisters(); i++) { fprintf(stderr, "v%lu:", static_cast(i)); VirtualRegister &vreg = vregs[i]; for (size_t j = 0; j < vreg.numIntervals(); j++) { @@ -1288,8 +1307,10 @@ BacktrackingAllocator::dumpAllocations() fprintf(stderr, "\n"); for (size_t i = 0; i < AnyRegister::Total; i++) { - fprintf(stderr, "reg %s:\n", AnyRegister::FromCode(i).name()); - registers[i].allocations.forEach(PrintLiveIntervalRange()); + if (registers[i].allocatable) { + fprintf(stderr, "reg %s:\n", AnyRegister::FromCode(i).name()); + registers[i].allocations.forEach(PrintLiveIntervalRange()); + } } fprintf(stderr, "\n"); @@ -1342,7 +1363,7 @@ BacktrackingAllocator::minimalDef(const LiveInterval *interval, LInstruction *in { // Whether interval is a minimal interval capturing a definition at ins. return (interval->end() <= minimalDefEnd(ins).next()) && - (interval->start() == inputOf(ins) || interval->start() == outputOf(ins)); + ((!ins->isPhi() && interval->start() == inputOf(ins)) || interval->start() == outputOf(ins)); } bool @@ -1530,10 +1551,10 @@ BacktrackingAllocator::trySplitAcrossHotcode(LiveInterval *interval, bool *succe if (postInterval && !newIntervals.append(postInterval)) return false; + distributeUses(interval, newIntervals); + *success = true; - return distributeUses(interval, newIntervals) && - split(interval, newIntervals) && - requeueIntervals(newIntervals); + return split(interval, newIntervals) && requeueIntervals(newIntervals); } bool @@ -1555,22 +1576,9 @@ BacktrackingAllocator::trySplitAfterLastRegisterUse(LiveInterval *interval, bool JS_ASSERT(iter->pos >= lastUse); lastUse = inputOf(ins); - switch (use->policy()) { - case LUse::ANY: - if (isReusedInput(iter->use, ins, /* considerCopy = */ true)) { - lastRegisterFrom = inputOf(ins); - lastRegisterTo = iter->pos.next(); - } - break; - - case LUse::REGISTER: - case LUse::FIXED: + if (isRegisterUse(use, ins, /* considerCopy = */ true)) { lastRegisterFrom = inputOf(ins); lastRegisterTo = iter->pos.next(); - break; - - default: - break; } } @@ -1602,10 +1610,10 @@ BacktrackingAllocator::trySplitAfterLastRegisterUse(LiveInterval *interval, bool if (!newIntervals.append(preInterval) || !newIntervals.append(postInterval)) return false; + distributeUses(interval, newIntervals); + *success = true; - return distributeUses(interval, newIntervals) && - split(interval, newIntervals) && - requeueIntervals(newIntervals); + return split(interval, newIntervals) && requeueIntervals(newIntervals); } bool diff --git a/js/src/jit/BacktrackingAllocator.h b/js/src/jit/BacktrackingAllocator.h index 9e10f2b8c82..a42cf8dea7a 100644 --- a/js/src/jit/BacktrackingAllocator.h +++ b/js/src/jit/BacktrackingAllocator.h @@ -192,13 +192,13 @@ class BacktrackingAllocator : public LiveRangeAllocatoradd(MFunctionBoundary::New(script(), MFunctionBoundary::Enter)); + // Guard against over-recursion. Do this before we start unboxing, since + // this will create an OSI point that will read the incoming argument + // values, which is nice to do before their last real use, to minimize + // register/stack pressure. + MCheckOverRecursed *check = new MCheckOverRecursed; + current->add(check); + check->setResumePoint(current->entryResumePoint()); + // Parameters have been checked to correspond to the typeset, now we unbox // what we can in an infallible manner. rewriteParameters(); @@ -607,11 +615,6 @@ IonBuilder::build() if (info().needsArgsObj() && !initArgumentsObject()) return false; - // Guard against over-recursion. - MCheckOverRecursed *check = new MCheckOverRecursed; - current->add(check); - check->setResumePoint(current->entryResumePoint()); - // Prevent |this| from being DCE'd: necessary for constructors. if (info().fun()) current->getSlot(info().thisSlot())->setGuard(); @@ -6529,9 +6532,9 @@ IonBuilder::getElemTryScalarElemOfTypedObject(bool *emitted, JS_ASSERT(objTypeReprs.allOfArrayKind()); // Must always be loading the same scalar type - if (elemTypeReprs.length() != 1) + if (!elemTypeReprs.singleton()) return true; - ScalarTypeRepresentation *elemTypeRepr = elemTypeReprs.get(0)->asScalar(); + ScalarTypeRepresentation *elemTypeRepr = elemTypeReprs.getTypeRepresentation()->asScalar(); // Get the length. size_t lenOfAll = objTypeReprs.arrayLength(); @@ -6550,40 +6553,19 @@ IonBuilder::getElemTryScalarElemOfTypedObject(bool *emitted, // Typed-object accesses usually in bounds (bail out otherwise). index = addBoundsCheck(index, length); + // Since we passed the bounds check, it is impossible for the + // result of multiplication to overflow; so enable imul path. + const int32_t alignment = elemTypeRepr->alignment(); + MMul *indexAsByteOffset = MMul::New(index, constantInt(alignment), + MIRType_Int32, MMul::Integer); + current->add(indexAsByteOffset); + // Find location within the owner object. - MDefinition *owner; - MDefinition *indexFromOwner; - if (obj->isNewDerivedTypedObject()) { - MNewDerivedTypedObject *ins = obj->toNewDerivedTypedObject(); - MDefinition *ownerOffset = ins->offset(); - - // Typed array offsets are expressed in units of the (array) - // element alignment. The binary data uses byte units for - // offsets (such as the owner offset here). - - MConstant *alignment = MConstant::New(Int32Value(elemTypeRepr->alignment())); - current->add(alignment); - - MDiv *scaledOffset = MDiv::NewAsmJS(ownerOffset, alignment, MIRType_Int32); - current->add(scaledOffset); - - MAdd *scaledOffsetPlusIndex = MAdd::NewAsmJS(scaledOffset, index, - MIRType_Int32); - current->add(scaledOffsetPlusIndex); - - owner = ins->owner(); - indexFromOwner = scaledOffsetPlusIndex; - } else { - owner = obj; - indexFromOwner = index; - } - - // Load the element data. - MTypedObjectElements *elements = MTypedObjectElements::New(owner); - current->add(elements); + MDefinition *elements, *scaledOffset; + loadTypedObjectElements(obj, indexAsByteOffset, alignment, &elements, &scaledOffset); // Load the element. - MLoadTypedArrayElement *load = MLoadTypedArrayElement::New(elements, indexFromOwner, elemTypeRepr->type()); + MLoadTypedArrayElement *load = MLoadTypedArrayElement::New(elements, scaledOffset, elemTypeRepr->type()); current->add(load); current->push(load); @@ -6613,8 +6595,7 @@ IonBuilder::getElemTryComplexElemOfTypedObject(bool *emitted, JS_ASSERT(objTypeReprs.allOfArrayKind()); MDefinition *type = loadTypedObjectType(obj); - MInstruction *elemType = MLoadFixedSlot::New(type, JS_TYPEOBJ_SLOT_ARRAY_ELEM_TYPE); - current->add(elemType); + MDefinition *elemType = typeObjectForElementFromArrayStructType(type); // Get the length. size_t lenOfAll = objTypeReprs.arrayLength(); @@ -6644,33 +6625,14 @@ IonBuilder::getElemTryComplexElemOfTypedObject(bool *emitted, current->add(indexAsByteOffset); // Find location within the owner object. - MDefinition *owner; - MDefinition *indexAsByteOffsetFromOwner; - if (obj->isNewDerivedTypedObject()) { - MNewDerivedTypedObject *ins = obj->toNewDerivedTypedObject(); - MDefinition *ownerOffset = ins->offset(); - - MAdd *offsetPlusScaledIndex = MAdd::NewAsmJS(ownerOffset, - indexAsByteOffset, - MIRType_Int32); - current->add(offsetPlusScaledIndex); - - owner = ins->owner(); - indexAsByteOffsetFromOwner = offsetPlusScaledIndex; - } else { - owner = obj; - indexAsByteOffsetFromOwner = indexAsByteOffset; - } - - // Load the element data. - MTypedObjectElements *elements = MTypedObjectElements::New(owner); - current->add(elements); + MDefinition *owner, *ownerOffset; + loadTypedObjectData(obj, indexAsByteOffset, &owner, &ownerOffset); // Create the derived type object. MInstruction *derived = new MNewDerivedTypedObject(elemTypeReprs, elemType, owner, - indexAsByteOffsetFromOwner); + ownerOffset); types::TemporaryTypeSet *resultTypes = bytecodeTypes(pc); derived->setResultTypeSet(resultTypes); @@ -8228,22 +8190,19 @@ IonBuilder::getPropTryScalarPropOfTypedObject(bool *emitted, types::TemporaryTypeSet *resultTypes) { // Must always be loading the same scalar type - if (fieldTypeReprs.length() != 1) + if (!fieldTypeReprs.singleton()) return true; - ScalarTypeRepresentation *fieldTypeRepr = fieldTypeReprs.get(0)->asScalar(); + ScalarTypeRepresentation *fieldTypeRepr = fieldTypeReprs.getTypeRepresentation()->asScalar(); - // OK! - *emitted = true; + // OK, perform the optimization MDefinition *typedObj = current->pop(); // Find location within the owner object. - MDefinition *owner, *ownerOffset; - loadTypedObjectData(typedObj, fieldOffset, &owner, &ownerOffset); - - // Load the element data. - MTypedObjectElements *elements = MTypedObjectElements::New(owner); - current->add(elements); + MDefinition *elements, *scaledOffset; + loadTypedObjectElements(typedObj, constantInt(fieldOffset), + fieldTypeRepr->alignment(), + &elements, &scaledOffset); // Reading from an Uint32Array will result in a double for values // that don't fit in an int32. We have to bailout if this happens @@ -8251,14 +8210,6 @@ IonBuilder::getPropTryScalarPropOfTypedObject(bool *emitted, bool allowDouble = resultTypes->hasType(types::Type::DoubleType()); MIRType knownType = MIRTypeForTypedArrayRead(fieldTypeRepr->type(), allowDouble); - // Typed array offsets are expressed in units of the alignment, - // and the binary data API guarantees all offsets are properly - // aligned. So just do the divide. - MConstant *alignment = MConstant::New(Int32Value(fieldTypeRepr->alignment())); - current->add(alignment); - MDiv *scaledOffset = MDiv::NewAsmJS(ownerOffset, alignment, MIRType_Int32); - current->add(scaledOffset); - MLoadTypedArrayElement *load = MLoadTypedArrayElement::New(elements, scaledOffset, fieldTypeRepr->type()); @@ -8266,6 +8217,7 @@ IonBuilder::getPropTryScalarPropOfTypedObject(bool *emitted, load->setResultTypeSet(resultTypes); current->add(load); current->push(load); + *emitted = true; return true; } @@ -8281,7 +8233,8 @@ IonBuilder::getPropTryComplexPropOfTypedObject(bool *emitted, if (fieldIndex == SIZE_MAX) return true; - *emitted = true; + // OK, perform the optimization + MDefinition *typedObj = current->pop(); // Identify the type object for the field. @@ -8290,7 +8243,8 @@ IonBuilder::getPropTryComplexPropOfTypedObject(bool *emitted, // Find location within the owner object. MDefinition *owner, *ownerOffset; - loadTypedObjectData(typedObj, fieldOffset, &owner, &ownerOffset); + loadTypedObjectData(typedObj, constantInt(fieldOffset), + &owner, &ownerOffset); // Create the derived type object. MInstruction *derived = new MNewDerivedTypedObject(fieldTypeReprs, @@ -8300,6 +8254,7 @@ IonBuilder::getPropTryComplexPropOfTypedObject(bool *emitted, derived->setResultTypeSet(resultTypes); current->add(derived); current->push(derived); + *emitted = true; return true; } @@ -8749,43 +8704,34 @@ IonBuilder::setPropTryTypedObject(bool *emitted, MDefinition *obj, return true; case TypeRepresentation::Scalar: - break; + return setPropTryScalarPropOfTypedObject(emitted, obj, fieldOffset, + value, fieldTypeReprs); } + MOZ_ASSUME_UNREACHABLE("Unknown kind"); +} + +bool +IonBuilder::setPropTryScalarPropOfTypedObject(bool *emitted, + MDefinition *obj, + int32_t fieldOffset, + MDefinition *value, + TypeRepresentationSet fieldTypeReprs) +{ // Must always be storing the same scalar type - if (fieldTypeReprs.length() != 1) + if (!fieldTypeReprs.singleton()) return true; - ScalarTypeRepresentation *fieldTypeRepr = fieldTypeReprs.get(0)->asScalar(); + ScalarTypeRepresentation *fieldTypeRepr = + fieldTypeReprs.getTypeRepresentation()->asScalar(); - // OK! - *emitted = true; + // OK! Perform the optimization. - MTypedObjectElements *elements = MTypedObjectElements::New(obj); - current->add(elements); - - // Typed array offsets are expressed in units of the alignment, - // and the binary data API guarantees all offsets are properly - // aligned. - JS_ASSERT(fieldOffset % fieldTypeRepr->alignment() == 0); - int32_t scaledFieldOffset = fieldOffset / fieldTypeRepr->alignment(); - - MConstant *offset = MConstant::New(Int32Value(scaledFieldOffset)); - current->add(offset); - - // Clamp value to [0, 255] for Uint8ClampedArray. - MDefinition *toWrite = value; - if (fieldTypeRepr->type() == ScalarTypeRepresentation::TYPE_UINT8_CLAMPED) { - toWrite = MClampToUint8::New(value); - current->add(toWrite->toInstruction()); - } - - MStoreTypedArrayElement *store = - MStoreTypedArrayElement::New(elements, offset, toWrite, - fieldTypeRepr->type()); - current->add(store); + if (!storeScalarTypedObjectValue(obj, constantInt(fieldOffset), fieldTypeRepr, value)) + return false; current->push(value); + *emitted = true; return true; } @@ -9620,12 +9566,12 @@ IonBuilder::loadTypedObjectType(MDefinition *typedObj) // into dead code). void IonBuilder::loadTypedObjectData(MDefinition *typedObj, - int32_t offset, + MDefinition *offset, MDefinition **owner, MDefinition **ownerOffset) { - MConstant *offsetDef = MConstant::New(Int32Value(offset)); - current->add(offsetDef); + JS_ASSERT(typedObj->type() == MIRType_Object); + JS_ASSERT(offset->type() == MIRType_Int32); // Shortcircuit derived type objects, meaning the intermediate // objects created to represent `a.b` in an expression like @@ -9636,8 +9582,7 @@ IonBuilder::loadTypedObjectData(MDefinition *typedObj, // If we see that the MNewDerivedTypedObject *ins = typedObj->toNewDerivedTypedObject(); - MAdd *offsetAdd = MAdd::NewAsmJS(ins->offset(), offsetDef, - MIRType_Int32); + MAdd *offsetAdd = MAdd::NewAsmJS(ins->offset(), offset, MIRType_Int32); current->add(offsetAdd); *owner = ins->owner(); @@ -9646,7 +9591,38 @@ IonBuilder::loadTypedObjectData(MDefinition *typedObj, } *owner = typedObj; - *ownerOffset = offsetDef; + *ownerOffset = offset; +} + +// Takes as input a typed object, an offset into that typed object's +// memory, and the type repr of the data found at that offset. Returns +// the elements pointer and a scaled offset. The scaled offset is +// expressed in units of `unit`; when working with typed array MIR, +// this is typically the alignment. +void +IonBuilder::loadTypedObjectElements(MDefinition *typedObj, + MDefinition *offset, + int32_t unit, + MDefinition **ownerElements, + MDefinition **ownerScaledOffset) +{ + MDefinition *owner, *ownerOffset; + loadTypedObjectData(typedObj, offset, &owner, &ownerOffset); + + // Load the element data. + MTypedObjectElements *elements = MTypedObjectElements::New(owner); + current->add(elements); + + // Scale to a different unit for compat with typed array MIRs. + if (unit != 1) { + MDiv *scaledOffset = MDiv::NewAsmJS(ownerOffset, constantInt(unit), MIRType_Int32); + current->add(scaledOffset); + *ownerScaledOffset = scaledOffset; + } else { + *ownerScaledOffset = ownerOffset; + } + + *ownerElements = elements; } // Looks up the offset/type-repr-set of the field `id`, given the type @@ -9674,7 +9650,7 @@ IonBuilder::lookupTypedObjectField(MDefinition *typedObj, fieldTypeReprs, fieldIndex)) return false; if (fieldTypeReprs->empty()) - return false; + return true; // Field offset must be representable as signed integer. if (offset >= size_t(INT_MAX)) { @@ -9688,6 +9664,18 @@ IonBuilder::lookupTypedObjectField(MDefinition *typedObj, return true; } +MDefinition * +IonBuilder::typeObjectForElementFromArrayStructType(MDefinition *typeObj) +{ + MInstruction *elemType = MLoadFixedSlot::New(typeObj, JS_TYPEOBJ_SLOT_ARRAY_ELEM_TYPE); + current->add(elemType); + + MInstruction *unboxElemType = MUnbox::New(elemType, MIRType_Object, MUnbox::Infallible); + current->add(unboxElemType); + + return unboxElemType; +} + MDefinition * IonBuilder::typeObjectForFieldFromStructType(MDefinition *typeObj, size_t fieldIndex) @@ -9697,16 +9685,60 @@ IonBuilder::typeObjectForFieldFromStructType(MDefinition *typeObj, MInstruction *fieldTypes = MLoadFixedSlot::New(typeObj, JS_TYPEOBJ_SLOT_STRUCT_FIELD_TYPES); current->add(fieldTypes); + MInstruction *unboxFieldTypes = MUnbox::New(fieldTypes, MIRType_Object, MUnbox::Infallible); + current->add(unboxFieldTypes); + // Index into list with index of field. - MInstruction *fieldTypesElements = MElements::New(fieldTypes); + MInstruction *fieldTypesElements = MElements::New(unboxFieldTypes); current->add(fieldTypesElements); - MConstant *fieldIndexDef = MConstant::New(Int32Value(fieldIndex)); - current->add(fieldIndexDef); + MConstant *fieldIndexDef = constantInt(fieldIndex); MInstruction *fieldType = MLoadElement::New(fieldTypesElements, fieldIndexDef, false, false); current->add(fieldType); - return fieldType; + MInstruction *unboxFieldType = MUnbox::New(fieldType, MIRType_Object, MUnbox::Infallible); + current->add(unboxFieldType); + + return unboxFieldType; +} + +bool +IonBuilder::storeScalarTypedObjectValue(MDefinition *typedObj, + MDefinition *offset, + ScalarTypeRepresentation *typeRepr, + MDefinition *value) +{ + // Find location within the owner object. + MDefinition *elements, *scaledOffset; + loadTypedObjectElements(typedObj, offset, typeRepr->alignment(), &elements, &scaledOffset); + + // Clamp value to [0, 255] when type is Uint8Clamped + MDefinition *toWrite = value; + if (typeRepr->type() == ScalarTypeRepresentation::TYPE_UINT8_CLAMPED) { + toWrite = MClampToUint8::New(value); + current->add(toWrite->toInstruction()); + } + + MStoreTypedArrayElement *store = + MStoreTypedArrayElement::New(elements, scaledOffset, toWrite, + typeRepr->type()); + current->add(store); + + return true; +} + +MConstant * +IonBuilder::constant(const Value &v) +{ + MConstant *c = MConstant::New(v); + current->add(c); + return c; +} + +MConstant * +IonBuilder::constantInt(int32_t i) +{ + return constant(Int32Value(i)); } diff --git a/js/src/jit/IonBuilder.h b/js/src/jit/IonBuilder.h index 5950f2560df..e07da6de604 100644 --- a/js/src/jit/IonBuilder.h +++ b/js/src/jit/IonBuilder.h @@ -327,6 +327,9 @@ class IonBuilder : public MIRGenerator bool initArgumentsObject(); bool pushConstant(const Value &v); + MConstant *constant(const Value &v); + MConstant *constantInt(int32_t i); + // Add a guard which ensure that the set of type which goes through this // generated code correspond to the observed types for the bytecode. bool pushTypeBarrier(MInstruction *ins, types::TemporaryTypeSet *observed, bool needBarrier); @@ -400,6 +403,11 @@ class IonBuilder : public MIRGenerator types::TemporaryTypeSet *objTypes); bool setPropTryTypedObject(bool *emitted, MDefinition *obj, PropertyName *name, MDefinition *value); + bool setPropTryScalarPropOfTypedObject(bool *emitted, + MDefinition *obj, + int32_t fieldOffset, + MDefinition *value, + TypeRepresentationSet fieldTypeReprs); bool setPropTryCache(bool *emitted, MDefinition *obj, PropertyName *name, MDefinition *value, bool barrier, types::TemporaryTypeSet *objTypes); @@ -413,12 +421,22 @@ class IonBuilder : public MIRGenerator TypeRepresentationSet *fieldTypeReprs, size_t *fieldIndex); MDefinition *loadTypedObjectType(MDefinition *value); - void loadTypedObjectData(MDefinition *inOwner, - int32_t inOffset, - MDefinition **outOwner, - MDefinition **outOffset); + void loadTypedObjectData(MDefinition *typedObj, + MDefinition *offset, + MDefinition **owner, + MDefinition **ownerOffset); + void loadTypedObjectElements(MDefinition *typedObj, + MDefinition *offset, + int32_t unit, + MDefinition **ownerElements, + MDefinition **ownerScaledOffset); + MDefinition *typeObjectForElementFromArrayStructType(MDefinition *typedObj); MDefinition *typeObjectForFieldFromStructType(MDefinition *type, size_t fieldIndex); + bool storeScalarTypedObjectValue(MDefinition *typedObj, + MDefinition *offset, + ScalarTypeRepresentation *typeRepr, + MDefinition *value); // jsop_setelem() helpers. bool setElemTryTyped(bool *emitted, MDefinition *object, diff --git a/js/src/jit/IonCaches.cpp b/js/src/jit/IonCaches.cpp index e271d87de81..f241ca43b43 100644 --- a/js/src/jit/IonCaches.cpp +++ b/js/src/jit/IonCaches.cpp @@ -3156,12 +3156,27 @@ GetElementIC::attachDenseElement(JSContext *cx, IonScript *ion, JSObject *obj, c GetElementIC::canAttachTypedArrayElement(JSObject *obj, const Value &idval, TypedOrValueRegister output) { - if (!obj->is() || - (!(idval.isInt32()) && - !(idval.isString() && GetIndexFromString(idval.toString()) != UINT32_MAX))) - { + if (!obj->is()) return false; + + if (!idval.isInt32() && !idval.isString()) + return false; + + + // Don't emit a stub if the access is out of bounds. We make to make + // certain that we monitor the type coming out of the typed array when + // we generate the stub. Out of bounds accesses will hit the fallback + // path. + uint32_t index; + if (idval.isInt32()) { + index = idval.toInt32(); + } else { + index = GetIndexFromString(idval.toString()); + if (index == UINT32_MAX) + return false; } + if (index >= obj->as().length()) + return false; // The output register is not yet specialized as a float register, the only // way to accept float typed arrays for now is to return a Value type. diff --git a/js/src/jit/IonFrames.cpp b/js/src/jit/IonFrames.cpp index b2d68d0132b..a9819bc86ca 100644 --- a/js/src/jit/IonFrames.cpp +++ b/js/src/jit/IonFrames.cpp @@ -549,30 +549,41 @@ HandleException(ResumeFromException *rfe) // Search each inlined frame for live iterator objects, and close // them. InlineFrameIterator frames(cx, &iter); + + // Invalidation state will be the same for all inlined scripts in the frame. + IonScript *ionScript = nullptr; + bool invalidated = iter.checkInvalidation(&ionScript); + for (;;) { HandleExceptionIon(cx, frames, rfe, &overrecursed); if (rfe->kind == ResumeFromException::RESUME_BAILOUT) { - IonScript *ionScript = nullptr; - if (iter.checkInvalidation(&ionScript)) + if (invalidated) ionScript->decref(cx->runtime()->defaultFreeOp()); return; } JS_ASSERT(rfe->kind == ResumeFromException::RESUME_ENTRY_FRAME); + // Figure out whether SPS frame was pushed for this frame or not. + // Even if profiler is enabled, the frame being popped might have + // been entered prior to SPS being enabled, and thus not have + // a pushed SPS frame. + bool popSPSFrame = cx->runtime()->spsProfiler.enabled(); + if (invalidated) + popSPSFrame = ionScript->hasSPSInstrumentation(); + // When profiling, each frame popped needs a notification that // the function has exited, so invoke the probe that a function // is exiting. JSScript *script = frames.script(); - probes::ExitScript(cx, script, script->function(), nullptr); + probes::ExitScript(cx, script, script->function(), popSPSFrame); if (!frames.more()) break; ++frames; } - IonScript *ionScript = nullptr; - if (iter.checkInvalidation(&ionScript)) + if (invalidated) ionScript->decref(cx->runtime()->defaultFreeOp()); } else if (iter.isBaselineJS()) { @@ -585,7 +596,8 @@ HandleException(ResumeFromException *rfe) // Unwind profiler pseudo-stack JSScript *script = iter.script(); - probes::ExitScript(cx, script, script->function(), iter.baselineFrame()); + probes::ExitScript(cx, script, script->function(), + iter.baselineFrame()->hasPushedSPSFrame()); // After this point, any pushed SPS frame would have been popped if it needed // to be. Unset the flag here so that if we call DebugEpilogue below, // it doesn't try to pop the SPS frame again. diff --git a/js/src/jit/LIR.cpp b/js/src/jit/LIR.cpp index 24b8059fba6..ee895f6d38b 100644 --- a/js/src/jit/LIR.cpp +++ b/js/src/jit/LIR.cpp @@ -236,8 +236,17 @@ PrintUse(char *buf, size_t size, const LUse *use) JS_snprintf(buf, size, "v%d:%s", use->virtualRegister(), Registers::GetName(Registers::Code(use->registerCode()))); break; - default: + case LUse::ANY: + JS_snprintf(buf, size, "v%d:r?", use->virtualRegister()); + break; + case LUse::KEEPALIVE: JS_snprintf(buf, size, "v%d:*", use->virtualRegister()); + break; + case LUse::RECOVERED_INPUT: + JS_snprintf(buf, size, "v%d:**", use->virtualRegister()); + break; + default: + MOZ_ASSUME_UNREACHABLE("invalid use policy"); } } diff --git a/js/src/jit/LiveRangeAllocator.cpp b/js/src/jit/LiveRangeAllocator.cpp index 553cb9d7080..e577ff3e8e3 100644 --- a/js/src/jit/LiveRangeAllocator.cpp +++ b/js/src/jit/LiveRangeAllocator.cpp @@ -36,9 +36,7 @@ Requirement::priority() const bool LiveInterval::Range::contains(const Range *other) const { - Range pre, inside, post; - intersect(other, &pre, &inside, &post); - return inside.from == other->from && inside.to == other->to; + return from <= other->from && to >= other->to; } void @@ -420,7 +418,7 @@ LiveRangeAllocator::init() // Build virtual register objects for (size_t i = 0; i < graph.numBlocks(); i++) { - if (mir->shouldCancel("LSRA create data structures (main loop)")) + if (mir->shouldCancel("Create data structures (main loop)")) return false; LBlock *block = graph.getBlock(i); @@ -498,7 +496,7 @@ LiveRangeAllocator::buildLivenessInfo() return false; for (size_t i = graph.numBlocks(); i > 0; i--) { - if (mir->shouldCancel("LSRA Build Liveness Info (main loop)")) + if (mir->shouldCancel("Build Liveness Info (main loop)")) return false; LBlock *block = graph.getBlock(i - 1); diff --git a/js/src/jit/LiveRangeAllocator.h b/js/src/jit/LiveRangeAllocator.h index c4570a01095..3fecfcb89b4 100644 --- a/js/src/jit/LiveRangeAllocator.h +++ b/js/src/jit/LiveRangeAllocator.h @@ -51,7 +51,9 @@ class Requirement Requirement(LAllocation fixed) : kind_(FIXED), allocation_(fixed) - { } + { + JS_ASSERT(fixed == LAllocation() || !fixed.isUse()); + } // Only useful as a hint, encodes where the fixed requirement is used to // avoid allocating a fixed register too early. @@ -59,7 +61,9 @@ class Requirement : kind_(FIXED), allocation_(fixed), position_(at) - { } + { + JS_ASSERT(fixed == LAllocation() || !fixed.isUse()); + } Requirement(uint32_t vreg, CodePosition at) : kind_(SAME_AS_OTHER), @@ -78,6 +82,7 @@ class Requirement uint32_t virtualRegister() const { JS_ASSERT(allocation_.isUse()); + JS_ASSERT(kind() == SAME_AS_OTHER); return allocation_.toUse()->virtualRegister(); } @@ -618,6 +623,17 @@ class LiveRangeAllocator : public RegisterAllocator return addMove(moves, from, to); } + size_t findFirstNonCallSafepoint(CodePosition from) const + { + size_t i = 0; + for (; i < graph.numNonCallSafepoints(); i++) { + const LInstruction *ins = graph.getNonCallSafepoint(i); + if (from <= (forLSRA ? inputOf(ins) : outputOf(ins))) + break; + } + return i; + } + void addLiveRegistersForInterval(VirtualRegister *reg, LiveInterval *interval) { // Fill in the live register sets for all non-call safepoints. @@ -633,7 +649,7 @@ class LiveRangeAllocator : public RegisterAllocator size_t i = findFirstNonCallSafepoint(start); for (; i < graph.numNonCallSafepoints(); i++) { LInstruction *ins = graph.getNonCallSafepoint(i); - CodePosition pos = inputOf(ins); + CodePosition pos = forLSRA ? inputOf(ins) : outputOf(ins); // Safepoints are sorted, so we can shortcut out of this loop // if we go out of range. diff --git a/js/src/jit/MIR.h b/js/src/jit/MIR.h index 395c66be334..e9a290c57c6 100644 --- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -3673,8 +3673,15 @@ class MPowHalf : public MUnaryInstruction, public DoublePolicy<0> { + bool operandIsNeverNegativeInfinity_; + bool operandIsNeverNegativeZero_; + bool operandIsNeverNaN_; + MPowHalf(MDefinition *input) - : MUnaryInstruction(input) + : MUnaryInstruction(input), + operandIsNeverNegativeInfinity_(false), + operandIsNeverNegativeZero_(false), + operandIsNeverNaN_(false) { setResultType(MIRType_Double); setMovable(); @@ -3688,12 +3695,22 @@ class MPowHalf bool congruentTo(MDefinition *ins) const { return congruentIfOperandsEqual(ins); } + bool operandIsNeverNegativeInfinity() const { + return operandIsNeverNegativeInfinity_; + } + bool operandIsNeverNegativeZero() const { + return operandIsNeverNegativeZero_; + } + bool operandIsNeverNaN() const { + return operandIsNeverNaN_; + } TypePolicy *typePolicy() { return this; } AliasSet getAliasSet() const { return AliasSet::None(); } + void collectRangeInfo(); }; // Inline implementation of Math.random(). diff --git a/js/src/jit/RangeAnalysis.cpp b/js/src/jit/RangeAnalysis.cpp index ff42cf3baea..79e33501b51 100644 --- a/js/src/jit/RangeAnalysis.cpp +++ b/js/src/jit/RangeAnalysis.cpp @@ -25,6 +25,7 @@ using mozilla::Abs; using mozilla::CountLeadingZeroes32; using mozilla::DoubleEqualsInt32; using mozilla::ExponentComponent; +using mozilla::FloorLog2; using mozilla::IsInfinite; using mozilla::IsFinite; using mozilla::IsNaN; @@ -284,6 +285,25 @@ SymbolicBound::print(Sprinter &sp) const sum.print(sp); } +// Test whether the given range's exponent tells us anything that its lower +// and upper bound values don't. +static bool +IsExponentInteresting(const Range *r) +{ + // If it lacks either a lower or upper bound, the exponent is interesting. + if (!r->hasInt32Bounds()) + return true; + + // Otherwise if there's no fractional part, the lower and upper bounds, + // which are integers, are perfectly precise. + if (!r->canHaveFractionalPart()) + return false; + + // Otherwise, if the bounds are conservatively rounded across a power-of-two + // boundary, the exponent may imply a tighter range. + return FloorLog2(Max(Abs(r->lower()), Abs(r->upper()))) > r->exponent(); +} + void Range::print(Sprinter &sp) const { @@ -320,12 +340,14 @@ Range::print(Sprinter &sp) const } sp.printf("]"); - if (max_exponent_ == IncludesInfinityAndNaN) - sp.printf(" (U inf U NaN)", max_exponent_); - else if (max_exponent_ == IncludesInfinity) - sp.printf(" (U inf)"); - else if (!hasInt32UpperBound_ || !hasInt32LowerBound_) - sp.printf(" (< pow(2, %d+1))", max_exponent_); + if (IsExponentInteresting(this)) { + if (max_exponent_ == IncludesInfinityAndNaN) + sp.printf(" (U inf U NaN)", max_exponent_); + else if (max_exponent_ == IncludesInfinity) + sp.printf(" (U inf)"); + else + sp.printf(" (< pow(2, %d+1))", max_exponent_); + } } void @@ -390,11 +412,23 @@ Range::intersect(const Range *lhs, const Range *rhs, bool *emptyRange) // than our newLower and newUpper. This is unusual, so we handle it here // instead of in optimize(). // - // For example, when the floating-point range has an actual maximum value - // of 1.5, it may have a range like [0,2] and the max_exponent may be zero. + // For example, consider the range F[0,1.5]. Range analysis represents the + // lower and upper bound as integers, so we'd actually have + // F[0,2] (< pow(2, 0+1)). In this case, the exponent gives us a slightly + // more precise upper bound than the integer upper bound. + // // When intersecting such a range with an integer range, the fractional part - // of the range is dropped, but the max exponent of 0 remains valid. - if (lhs->canHaveFractionalPart_ != rhs->canHaveFractionalPart_) { + // of the range is dropped. The max exponent of 0 remains valid, so the + // upper bound needs to be adjusted to 1. + // + // When intersecting F[0,2] (< pow(2, 0+1)) with a range like F[2,4], + // the naive intersection is I[2,2], but since the max exponent tells us + // that the value is always less than 2, the intersection is actually empty. + if (lhs->canHaveFractionalPart_ != rhs->canHaveFractionalPart_ || + (lhs->canHaveFractionalPart_ && + newHasInt32LowerBound && newHasInt32UpperBound && + newLower == newUpper)) + { refineInt32BoundsByExponent(newExponent, &newLower, &newUpper); // If we're intersecting two ranges that don't overlap, this could also @@ -2424,3 +2458,13 @@ MNot::collectRangeInfo() { operandIsNeverNaN_ = !Range(operand()).canBeNaN(); } + +void +MPowHalf::collectRangeInfo() +{ + Range inputRange(input()); + operandIsNeverNegativeInfinity_ = !inputRange.canBeInfiniteOrNaN() || + inputRange.hasInt32LowerBound(); + operandIsNeverNegativeZero_ = !inputRange.canBeZero(); + operandIsNeverNaN_ = !inputRange.canBeNaN(); +} diff --git a/js/src/jit/RegisterAllocator.cpp b/js/src/jit/RegisterAllocator.cpp index dc58cafd9d3..46347a77757 100644 --- a/js/src/jit/RegisterAllocator.cpp +++ b/js/src/jit/RegisterAllocator.cpp @@ -374,11 +374,16 @@ AllocationIntegrityState::dump() for (size_t i = 0; i < block->numPhis(); i++) { InstructionInfo &info = blocks[blockIndex].phis[i]; LPhi *phi = block->getPhi(i); + CodePosition output(phi->id(), CodePosition::OUTPUT); - fprintf(stderr, "Phi v%u <-", info.outputs[0].virtualRegister()); + // Don't print the inputOf for phi nodes, since it's never used. + fprintf(stderr, "[,%u Phi [def v%u %s] <-", + output.pos(), + info.outputs[0].virtualRegister(), + phi->getDef(0)->output()->toString()); for (size_t j = 0; j < phi->numOperands(); j++) fprintf(stderr, " %s", info.inputs[j].toString()); - fprintf(stderr, "\n"); + fprintf(stderr, "]\n"); } for (LInstructionIterator iter = block->begin(); iter != block->end(); iter++) { @@ -388,7 +393,10 @@ AllocationIntegrityState::dump() CodePosition input(ins->id(), CodePosition::INPUT); CodePosition output(ins->id(), CodePosition::OUTPUT); - fprintf(stderr, "[%u,%u %s]", input.pos(), output.pos(), ins->opName()); + fprintf(stderr, "["); + if (input != CodePosition::MIN) + fprintf(stderr, "%u,%u ", input.pos(), output.pos()); + fprintf(stderr, "%s]", ins->opName()); if (ins->isMoveGroup()) { LMoveGroup *group = ins->toMoveGroup(); diff --git a/js/src/jit/RegisterAllocator.h b/js/src/jit/RegisterAllocator.h index e11ba14cda9..9a207c123b4 100644 --- a/js/src/jit/RegisterAllocator.h +++ b/js/src/jit/RegisterAllocator.h @@ -328,6 +328,8 @@ class RegisterAllocator return CodePosition(pos, CodePosition::INPUT); } CodePosition inputOf(const LInstruction *ins) const { + // Phi nodes "use" their inputs before the beginning of the block. + JS_ASSERT(!ins->isPhi()); return CodePosition(ins->id(), CodePosition::INPUT); } @@ -341,17 +343,6 @@ class RegisterAllocator return getMoveGroupAfter(pos.ins()); } - size_t findFirstNonCallSafepoint(CodePosition from) const - { - size_t i = 0; - for (; i < graph.numNonCallSafepoints(); i++) { - const LInstruction *ins = graph.getNonCallSafepoint(i); - if (from <= inputOf(ins)) - break; - } - return i; - } - CodePosition minimalDefEnd(LInstruction *ins) { // Compute the shortest interval that captures vregs defined by ins. // Watch for instructions that are followed by an OSI point and/or Nop. diff --git a/js/src/jit/TypeRepresentationSet.cpp b/js/src/jit/TypeRepresentationSet.cpp index e7f56ce8de1..5f6207a9cff 100644 --- a/js/src/jit/TypeRepresentationSet.cpp +++ b/js/src/jit/TypeRepresentationSet.cpp @@ -162,20 +162,20 @@ TypeRepresentationSet::TypeRepresentationSet() bool TypeRepresentationSet::empty() { - return length() == 0; + return length_ == 0; } -size_t -TypeRepresentationSet::length() +bool +TypeRepresentationSet::singleton() { - return length_; + return length_ == 1; } TypeRepresentation * -TypeRepresentationSet::get(size_t i) +TypeRepresentationSet::getTypeRepresentation() { - JS_ASSERT(i < length()); - return entries_[i]; + JS_ASSERT(singleton()); + return get(0); } bool diff --git a/js/src/jit/TypeRepresentationSet.h b/js/src/jit/TypeRepresentationSet.h index 556add84338..fbc7df521ac 100644 --- a/js/src/jit/TypeRepresentationSet.h +++ b/js/src/jit/TypeRepresentationSet.h @@ -55,6 +55,7 @@ class TypeRepresentationSetBuilder { class TypeRepresentationSet { private: + friend struct TypeRepresentationSetHasher; friend class TypeRepresentationSetBuilder; size_t length_; @@ -62,6 +63,14 @@ class TypeRepresentationSet { TypeRepresentationSet(size_t length, TypeRepresentation **entries); + size_t length() const { + return length_; + } + + TypeRepresentation *get(uint32_t i) const { + return entries_[i]; + } + public: ////////////////////////////////////////////////////////////////////// // Constructors @@ -76,8 +85,7 @@ class TypeRepresentationSet { // Query the set bool empty(); - size_t length(); - TypeRepresentation *get(size_t i); + bool singleton(); bool allOfKind(TypeRepresentation::Kind kind); // Returns true only when non-empty and `kind()` is @@ -99,6 +107,11 @@ class TypeRepresentationSet { TypeRepresentation::Kind kind(); + ////////////////////////////////////////////////////////////////////// + // The following operations are only valid on a singleton set: + + TypeRepresentation *getTypeRepresentation(); + ////////////////////////////////////////////////////////////////////// // Array operations // diff --git a/js/src/jit/shared/CodeGenerator-x86-shared.cpp b/js/src/jit/shared/CodeGenerator-x86-shared.cpp index a4d9df53ece..c34f24edb37 100644 --- a/js/src/jit/shared/CodeGenerator-x86-shared.cpp +++ b/js/src/jit/shared/CodeGenerator-x86-shared.cpp @@ -551,19 +551,29 @@ CodeGeneratorX86Shared::visitPowHalfD(LPowHalfD *ins) Label done, sqrt; - // Branch if not -Infinity. - masm.loadConstantDouble(NegativeInfinity(), ScratchFloatReg); - masm.branchDouble(Assembler::DoubleNotEqualOrUnordered, input, ScratchFloatReg, &sqrt); + if (!ins->mir()->operandIsNeverNegativeInfinity()) { + // Branch if not -Infinity. + masm.loadConstantDouble(NegativeInfinity(), ScratchFloatReg); - // Math.pow(-Infinity, 0.5) == Infinity. - masm.xorpd(input, input); - masm.subsd(ScratchFloatReg, input); - masm.jump(&done); + Assembler::DoubleCondition cond = Assembler::DoubleNotEqualOrUnordered; + if (ins->mir()->operandIsNeverNaN()) + cond = Assembler::DoubleNotEqual; + masm.branchDouble(cond, input, ScratchFloatReg, &sqrt); + + // Math.pow(-Infinity, 0.5) == Infinity. + masm.xorpd(input, input); + masm.subsd(ScratchFloatReg, input); + masm.jump(&done); + + masm.bind(&sqrt); + } + + if (!ins->mir()->operandIsNeverNegativeZero()) { + // Math.pow(-0, 0.5) == 0 == Math.pow(0, 0.5). Adding 0 converts any -0 to 0. + masm.xorpd(ScratchFloatReg, ScratchFloatReg); + masm.addsd(ScratchFloatReg, input); + } - // Math.pow(-0, 0.5) == 0 == Math.pow(0, 0.5). Adding 0 converts any -0 to 0. - masm.bind(&sqrt); - masm.xorpd(ScratchFloatReg, ScratchFloatReg); - masm.addsd(ScratchFloatReg, input); masm.sqrtsd(input, input); masm.bind(&done); diff --git a/js/src/jit/shared/LIR-x86-shared.h b/js/src/jit/shared/LIR-x86-shared.h index 6d4f8854d4e..e38e293d9ab 100644 --- a/js/src/jit/shared/LIR-x86-shared.h +++ b/js/src/jit/shared/LIR-x86-shared.h @@ -171,6 +171,9 @@ class LPowHalfD : public LInstructionHelper<1, 1, 0> const LDefinition *output() { return getDef(0); } + MPowHalf *mir() const { + return mir_->toPowHalf(); + } }; // Takes a tableswitch with an integer to decide diff --git a/js/src/jsopcode.cpp b/js/src/jsopcode.cpp index 4449b332617..00f9eecb48c 100644 --- a/js/src/jsopcode.cpp +++ b/js/src/jsopcode.cpp @@ -1437,43 +1437,21 @@ js_QuoteString(ExclusiveContext *cx, JSString *str, jschar quote) static JSObject * GetBlockChainAtPC(JSContext *cx, JSScript *script, jsbytecode *pc) { - jsbytecode *start = script->main(); + JS_ASSERT(pc >= script->main() && pc < script->code + script->length); - JS_ASSERT(pc >= start && pc < script->code + script->length); + ptrdiff_t offset = pc - script->main(); + if (!script->hasBlockScopes()) + return nullptr; + + BlockScopeArray *blockScopes = script->blockScopes(); JSObject *blockChain = nullptr; - for (jsbytecode *p = start; p < pc; p += GetBytecodeLength(p)) { - JSOp op = JSOp(*p); - - switch (op) { - case JSOP_ENTERBLOCK: - case JSOP_ENTERLET0: - case JSOP_ENTERLET1: - case JSOP_ENTERLET2: { - JSObject *child = script->getObject(p); - JS_ASSERT_IF(blockChain, child->as().stackDepth() >= - blockChain->as().stackDepth()); - blockChain = child; + for (uint32_t n = 0; n < blockScopes->length; n++) { + const BlockScopeNote *note = &blockScopes->vector[n]; + if (note->start > offset) break; - } - case JSOP_LEAVEBLOCK: - case JSOP_LEAVEBLOCKEXPR: - case JSOP_LEAVEFORLETIN: { - // Some LEAVEBLOCK instructions are due to early exits via - // return/break/etc. from block-scoped loops and functions. We - // should ignore these instructions, since they don't really signal - // the end of the block. - jssrcnote *sn = js_GetSrcNote(cx, script, p); - if (!(sn && SN_TYPE(sn) == SRC_HIDDEN)) { - JS_ASSERT(blockChain); - blockChain = blockChain->as().enclosingBlock(); - JS_ASSERT_IF(blockChain, blockChain->is()); - } - break; - } - default: - break; - } + if (offset <= note->start + note->length) + blockChain = script->getObject(note->index); } return blockChain; diff --git a/js/src/jsscript.cpp b/js/src/jsscript.cpp index b326f8db75f..67cc33d0dcb 100644 --- a/js/src/jsscript.cpp +++ b/js/src/jsscript.cpp @@ -416,7 +416,8 @@ js::XDRScript(XDRState *xdr, HandleObject enclosingScope, HandleScript enc }; uint32_t length, lineno, nslots; - uint32_t natoms, nsrcnotes, ntrynotes, nobjects, nregexps, nconsts, i; + uint32_t natoms, nsrcnotes, i; + uint32_t nconsts, nobjects, nregexps, ntrynotes, nblockscopes; uint32_t prologLength, version; uint32_t funLength = 0; uint32_t nTypeSets = 0; @@ -424,7 +425,8 @@ js::XDRScript(XDRState *xdr, HandleObject enclosingScope, HandleScript enc JSContext *cx = xdr->cx(); RootedScript script(cx); - nsrcnotes = ntrynotes = natoms = nobjects = nregexps = nconsts = 0; + natoms = nsrcnotes = 0; + nconsts = nobjects = nregexps = ntrynotes = nblockscopes = 0; /* XDR arguments and vars. */ uint16_t nargs = 0, nvars = 0; @@ -468,6 +470,8 @@ js::XDRScript(XDRState *xdr, HandleObject enclosingScope, HandleScript enc nregexps = script->regexps()->length; if (script->hasTrynotes()) ntrynotes = script->trynotes()->length; + if (script->hasBlockScopes()) + nblockscopes = script->blockScopes()->length; nTypeSets = script->nTypeSets; funLength = script->funLength; @@ -512,21 +516,20 @@ js::XDRScript(XDRState *xdr, HandleObject enclosingScope, HandleScript enc if (!xdr->codeUint32(&version)) return false; - /* - * To fuse allocations, we need srcnote, atom, objects, regexp, and trynote - * counts early. - */ + // To fuse allocations, we need lengths of all embedded arrays early. if (!xdr->codeUint32(&natoms)) return false; if (!xdr->codeUint32(&nsrcnotes)) return false; - if (!xdr->codeUint32(&ntrynotes)) + if (!xdr->codeUint32(&nconsts)) return false; if (!xdr->codeUint32(&nobjects)) return false; if (!xdr->codeUint32(&nregexps)) return false; - if (!xdr->codeUint32(&nconsts)) + if (!xdr->codeUint32(&ntrynotes)) + return false; + if (!xdr->codeUint32(&nblockscopes)) return false; if (!xdr->codeUint32(&nTypeSets)) return false; @@ -569,8 +572,11 @@ js::XDRScript(XDRState *xdr, HandleObject enclosingScope, HandleScript enc return false; if (mode == XDR_DECODE) { - if (!JSScript::partiallyInit(cx, script, nobjects, nregexps, ntrynotes, nconsts, nTypeSets)) + if (!JSScript::partiallyInit(cx, script, nconsts, nobjects, nregexps, ntrynotes, + nblockscopes, nTypeSets)) + { return false; + } JS_ASSERT(!script->mainOffset); script->mainOffset = prologLength; @@ -664,6 +670,14 @@ js::XDRScript(XDRState *xdr, HandleObject enclosingScope, HandleScript enc return false; } + if (nconsts) { + HeapValue *vector = script->consts()->vector; + for (i = 0; i != nconsts; ++i) { + if (!XDRScriptConst(xdr, &vector[i])) + return false; + } + } + /* * Here looping from 0-to-length to xdr objects is essential to ensure that * all references to enclosing blocks (via FindBlockIndex below) happen @@ -740,6 +754,7 @@ js::XDRScript(XDRState *xdr, HandleObject enclosingScope, HandleScript enc *objp = tmp; } } + for (i = 0; i != nregexps; ++i) { if (!XDRScriptRegExpObject(xdr, &script->regexps()->vector[i])) return false; @@ -776,11 +791,13 @@ js::XDRScript(XDRState *xdr, HandleObject enclosingScope, HandleScript enc } while (tn != tnfirst); } - if (nconsts) { - HeapValue *vector = script->consts()->vector; - for (i = 0; i != nconsts; ++i) { - if (!XDRScriptConst(xdr, &vector[i])) - return false; + for (i = 0; i < nblockscopes; ++i) { + BlockScopeNote *note = &script->blockScopes()->vector[i]; + if (!xdr->codeUint32(¬e->index) || + !xdr->codeUint32(¬e->start) || + !xdr->codeUint32(¬e->length)) + { + return false; } } @@ -1580,6 +1597,7 @@ js::FreeScriptData(JSRuntime *rt) * ObjectArray Objects objects() * ObjectArray Regexps regexps() * TryNoteArray Try notes trynotes() + * BlockScopeArray Scope notes blockScopes() * * Then are the elements of several arrays. * - Most of these arrays have headers listed above (if present). For each of @@ -1595,6 +1613,7 @@ js::FreeScriptData(JSRuntime *rt) * Objects objects()->vector objects()->length * Regexps regexps()->vector regexps()->length * Try notes trynotes()->vector trynotes()->length + * Scope notes blockScopes()->vector blockScopes()->length * * IMPORTANT: This layout has two key properties. * - It ensures that everything has sufficient alignment; in particular, the @@ -1640,6 +1659,7 @@ js::FreeScriptData(JSRuntime *rt) JS_STATIC_ASSERT(KEEPS_JSVAL_ALIGNMENT(ConstArray)); JS_STATIC_ASSERT(KEEPS_JSVAL_ALIGNMENT(ObjectArray)); /* there are two of these */ JS_STATIC_ASSERT(KEEPS_JSVAL_ALIGNMENT(TryNoteArray)); +JS_STATIC_ASSERT(KEEPS_JSVAL_ALIGNMENT(BlockScopeArray)); /* These assertions ensure there is no padding required between array elements. */ JS_STATIC_ASSERT(HAS_JSVAL_ALIGNMENT(HeapValue)); @@ -1649,9 +1669,15 @@ JS_STATIC_ASSERT(NO_PADDING_BETWEEN_ENTRIES(HeapPtrObject, JSTryNote)); JS_STATIC_ASSERT(NO_PADDING_BETWEEN_ENTRIES(JSTryNote, uint32_t)); JS_STATIC_ASSERT(NO_PADDING_BETWEEN_ENTRIES(uint32_t, uint32_t)); +JS_STATIC_ASSERT(NO_PADDING_BETWEEN_ENTRIES(HeapValue, BlockScopeNote)); +JS_STATIC_ASSERT(NO_PADDING_BETWEEN_ENTRIES(BlockScopeNote, BlockScopeNote)); +JS_STATIC_ASSERT(NO_PADDING_BETWEEN_ENTRIES(JSTryNote, BlockScopeNote)); +JS_STATIC_ASSERT(NO_PADDING_BETWEEN_ENTRIES(HeapPtrObject, BlockScopeNote)); +JS_STATIC_ASSERT(NO_PADDING_BETWEEN_ENTRIES(BlockScopeNote, uint32_t)); + static inline size_t -ScriptDataSize(uint32_t nbindings, uint32_t nobjects, uint32_t nregexps, - uint32_t ntrynotes, uint32_t nconsts) +ScriptDataSize(uint32_t nbindings, uint32_t nconsts, uint32_t nobjects, uint32_t nregexps, + uint32_t ntrynotes, uint32_t nblockscopes) { size_t size = 0; @@ -1663,6 +1689,8 @@ ScriptDataSize(uint32_t nbindings, uint32_t nobjects, uint32_t nregexps, size += sizeof(ObjectArray) + nregexps * sizeof(JSObject *); if (ntrynotes != 0) size += sizeof(TryNoteArray) + ntrynotes * sizeof(JSTryNote); + if (nblockscopes != 0) + size += sizeof(BlockScopeArray) + nblockscopes * sizeof(BlockScopeNote); if (nbindings != 0) { // Make sure bindings are sufficiently aligned. @@ -1736,10 +1764,12 @@ AllocScriptData(ExclusiveContext *cx, size_t size) } /* static */ bool -JSScript::partiallyInit(ExclusiveContext *cx, HandleScript script, uint32_t nobjects, - uint32_t nregexps, uint32_t ntrynotes, uint32_t nconsts, uint32_t nTypeSets) +JSScript::partiallyInit(ExclusiveContext *cx, HandleScript script, uint32_t nconsts, + uint32_t nobjects, uint32_t nregexps, uint32_t ntrynotes, + uint32_t nblockscopes, uint32_t nTypeSets) { - size_t size = ScriptDataSize(script->bindings.count(), nobjects, nregexps, ntrynotes, nconsts); + size_t size = ScriptDataSize(script->bindings.count(), nconsts, nobjects, nregexps, ntrynotes, + nblockscopes); script->data = AllocScriptData(cx, size); if (!script->data) return false; @@ -1765,6 +1795,10 @@ JSScript::partiallyInit(ExclusiveContext *cx, HandleScript script, uint32_t nobj script->setHasArray(TRYNOTES); cursor += sizeof(TryNoteArray); } + if (nblockscopes != 0) { + script->setHasArray(BLOCK_SCOPES); + cursor += sizeof(BlockScopeArray); + } if (nconsts != 0) { JS_ASSERT(reinterpret_cast(cursor) % sizeof(jsval) == 0); @@ -1795,6 +1829,16 @@ JSScript::partiallyInit(ExclusiveContext *cx, HandleScript script, uint32_t nobj cursor += vectorSize; } + if (nblockscopes != 0) { + script->blockScopes()->length = nblockscopes; + script->blockScopes()->vector = reinterpret_cast(cursor); + size_t vectorSize = nblockscopes * sizeof(script->blockScopes()->vector[0]); +#ifdef DEBUG + memset(cursor, 0, vectorSize); +#endif + cursor += vectorSize; + } + if (script->bindings.count() != 0) { // Make sure bindings are sufficiently aligned. cursor = reinterpret_cast @@ -1809,7 +1853,7 @@ JSScript::partiallyInit(ExclusiveContext *cx, HandleScript script, uint32_t nobj /* static */ bool JSScript::fullyInitTrivial(ExclusiveContext *cx, Handle script) { - if (!partiallyInit(cx, script, 0, 0, 0, 0, 0)) + if (!partiallyInit(cx, script, 0, 0, 0, 0, 0, 0)) return false; SharedScriptData *ssd = SharedScriptData::new_(cx, 1, 1, 0); @@ -1835,8 +1879,8 @@ JSScript::fullyInitFromEmitter(ExclusiveContext *cx, HandleScript script, Byteco uint32_t nsrcnotes = uint32_t(bce->countFinalSourceNotes()); uint32_t natoms = bce->atomIndices->count(); if (!partiallyInit(cx, script, - bce->objectList.length, bce->regexpList.length, bce->tryNoteList.length(), - bce->constList.length(), bce->typesetCount)) + bce->constList.length(), bce->objectList.length, bce->regexpList.length, + bce->tryNoteList.length(), bce->blockScopeList.length(), bce->typesetCount)) { return false; } @@ -1873,14 +1917,16 @@ JSScript::fullyInitFromEmitter(ExclusiveContext *cx, HandleScript script, Byteco FunctionBox *funbox = bce->sc->isFunctionBox() ? bce->sc->asFunctionBox() : nullptr; - if (bce->tryNoteList.length() != 0) - bce->tryNoteList.finish(script->trynotes()); + if (bce->constList.length() != 0) + bce->constList.finish(script->consts()); if (bce->objectList.length != 0) bce->objectList.finish(script->objects()); if (bce->regexpList.length != 0) bce->regexpList.finish(script->regexps()); - if (bce->constList.length() != 0) - bce->constList.finish(script->consts()); + if (bce->tryNoteList.length() != 0) + bce->tryNoteList.finish(script->trynotes()); + if (bce->blockScopeList.length() != 0) + bce->blockScopeList.finish(script->blockScopes()); script->strict = bce->sc->strict; script->explicitUseStrict = bce->sc->hasExplicitUseStrict(); script->bindingsAccessedDynamically = bce->sc->bindingsAccessedDynamically(); @@ -2279,6 +2325,7 @@ js::CloneScript(JSContext *cx, HandleObject enclosingScope, HandleFunction fun, uint32_t nobjects = src->hasObjects() ? src->objects()->length : 0; uint32_t nregexps = src->hasRegexps() ? src->regexps()->length : 0; uint32_t ntrynotes = src->hasTrynotes() ? src->trynotes()->length : 0; + uint32_t nblockscopes = src->hasBlockScopes() ? src->blockScopes()->length : 0; /* Script data */ @@ -2444,6 +2491,8 @@ js::CloneScript(JSContext *cx, HandleObject enclosingScope, HandleFunction fun, } if (ntrynotes != 0) dst->trynotes()->vector = Rebase(dst, src, src->trynotes()->vector); + if (nblockscopes != 0) + dst->blockScopes()->vector = Rebase(dst, src, src->blockScopes()->vector); return dst; } diff --git a/js/src/jsscript.h b/js/src/jsscript.h index ea762a95e6c..21e00a1af31 100644 --- a/js/src/jsscript.h +++ b/js/src/jsscript.h @@ -81,19 +81,31 @@ struct JSTryNote { namespace js { +struct BlockScopeNote { + uint32_t index; // Index of StaticScopeObject in the object array. + uint32_t start; // Bytecode offset at which this scope starts. + uint32_t length; // Bytecode length of scope. + uint32_t padding; // Pad to 64-bit boundary. +}; + struct ConstArray { js::HeapValue *vector; /* array of indexed constant values */ uint32_t length; }; struct ObjectArray { - js::HeapPtrObject *vector; /* array of indexed objects */ - uint32_t length; /* count of indexed objects */ + js::HeapPtrObject *vector; // Array of indexed objects. + uint32_t length; // Count of indexed objects. }; struct TryNoteArray { - JSTryNote *vector; /* array of indexed try notes */ - uint32_t length; /* count of indexed try notes */ + JSTryNote *vector; // Array of indexed try notes. + uint32_t length; // Count of indexed try notes. +}; + +struct BlockScopeArray { + BlockScopeNote *vector; // Array of indexed BlockScopeNote records. + uint32_t length; // Count of indexed try notes. }; /* @@ -552,6 +564,7 @@ class JSScript : public js::gc::BarrieredCell OBJECTS, REGEXPS, TRYNOTES, + BLOCK_SCOPES, ARRAY_KIND_BITS }; @@ -564,7 +577,7 @@ class JSScript : public js::gc::BarrieredCell uint8_t generatorKindBits_:2; // Unused padding; feel free to steal these if you need them. - uint8_t padToByte_:2; + uint8_t padToByte_:1; // 1-bit fields. @@ -650,8 +663,9 @@ class JSScript : public js::gc::BarrieredCell // successfully creating any kind (function or other) of new JSScript. // However, callers of fullyInitFromEmitter() do not need to do this. static bool partiallyInit(js::ExclusiveContext *cx, JS::Handle script, - uint32_t nobjects, uint32_t nregexps, - uint32_t ntrynotes, uint32_t nconsts, uint32_t nTypeSets); + uint32_t nconsts, uint32_t nobjects, uint32_t nregexps, + uint32_t ntrynotes, uint32_t nblockscopes, + uint32_t nTypeSets); static bool fullyInitFromEmitter(js::ExclusiveContext *cx, JS::Handle script, js::frontend::BytecodeEmitter *bce); // Initialize a no-op script. @@ -913,6 +927,7 @@ class JSScript : public js::gc::BarrieredCell bool hasObjects() { return hasArray(OBJECTS); } bool hasRegexps() { return hasArray(REGEXPS); } bool hasTrynotes() { return hasArray(TRYNOTES); } + bool hasBlockScopes() { return hasArray(BLOCK_SCOPES); } #define OFF(fooOff, hasFoo, t) (fooOff() + (hasFoo() ? sizeof(t) : 0)) @@ -920,6 +935,7 @@ class JSScript : public js::gc::BarrieredCell size_t objectsOffset() { return OFF(constsOffset, hasConsts, js::ConstArray); } size_t regexpsOffset() { return OFF(objectsOffset, hasObjects, js::ObjectArray); } size_t trynotesOffset() { return OFF(regexpsOffset, hasRegexps, js::ObjectArray); } + size_t blockScopesOffset(){ return OFF(trynotesOffset, hasTrynotes, js::TryNoteArray); } js::ConstArray *consts() { JS_ASSERT(hasConsts()); @@ -941,6 +957,11 @@ class JSScript : public js::gc::BarrieredCell return reinterpret_cast(data + trynotesOffset()); } + js::BlockScopeArray *blockScopes() { + JS_ASSERT(hasBlockScopes()); + return reinterpret_cast(data + blockScopesOffset()); + } + bool hasLoops(); js::HeapPtrAtom &getAtom(size_t index) const { diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp index b93db5b9322..a76968824d7 100644 --- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -5796,6 +5796,10 @@ main(int argc, char **argv, char **envp) "(default: 10)", -1) || !op.addBoolOption('\0', "no-fpu", "Pretend CPU does not support floating-point operations " "to test JIT codegen (no-op on platforms other than x86).") + || !op.addBoolOption('\0', "no-sse3", "Pretend CPU does not support SSE3 instructions and above " + "to test JIT codegen (no-op on platforms other than x86 and x64).") + || !op.addBoolOption('\0', "no-sse4", "Pretend CPU does not support SSE4 instructions" + "to test JIT codegen (no-op on platforms other than x86 and x64).") || !op.addBoolOption('\0', "fuzzing-safe", "Don't expose functions that aren't safe for " "fuzzers to call") #ifdef DEBUG @@ -5840,6 +5844,17 @@ main(int argc, char **argv, char **envp) if (op.getBoolOption("no-fpu")) JSC::MacroAssembler::SetFloatingPointDisabled(); #endif + +#if (defined(JS_CPU_X86) || defined(JS_CPU_X64)) && defined(JS_ION) + if (op.getBoolOption("no-sse3")) { + JSC::MacroAssembler::SetSSE3Disabled(); + PropagateFlagToNestedShells("--no-sse3"); + } + if (op.getBoolOption("no-sse4")) { + JSC::MacroAssembler::SetSSE4Disabled(); + PropagateFlagToNestedShells("--no-sse4"); + } +#endif #endif // Start the engine. diff --git a/js/src/tests/ecma_6/TypedObject/redimension.js b/js/src/tests/ecma_6/TypedObject/redimension.js new file mode 100644 index 00000000000..4d250da8684 --- /dev/null +++ b/js/src/tests/ecma_6/TypedObject/redimension.js @@ -0,0 +1,61 @@ +// |reftest| skip-if(!this.hasOwnProperty("TypedObject")) +var BUGNUMBER = 922172; +var summary = 'redimension method'; + +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +var T = TypedObject; + +function runTests() { + var counter; + + // create an array of 40 bytes with some initial data + var Bytes40 = new T.ArrayType(T.uint8, 40); + var bytes40 = new Bytes40(); + for (var i = 0, counter = 0; i < 40; i++) + bytes40[i] = counter++; + + // redimension to an array of 10x4 bytes, check data is unchanged + var Bytes10times4 = new T.ArrayType(new T.ArrayType(T.uint8, 4), 10); + var bytes10times4 = bytes40.redimension(Bytes10times4); + counter = 0; + for (var i = 0; i < 10; i++) + for (var j = 0; j < 4; j++) + assertEq(counter++, bytes10times4[i][j]); + + // redimension to an array of 2x5x2x2, check data is unchanged + var Bytes2times5times2times2 = + new T.ArrayType( + new T.ArrayType( + new T.ArrayType( + new T.ArrayType(T.uint8, 2), 2), 5), 2); + var bytes2times5times2times2 = bytes10times4.redimension(Bytes2times5times2times2); + counter = 0; + for (var i = 0; i < 2; i++) + for (var j = 0; j < 5; j++) + for (var k = 0; k < 2; k++) + for (var l = 0; l < 2; l++) + assertEq(counter++, bytes2times5times2times2[i][j][k][l]); + + // test what happens if number of elements does not match + assertThrowsInstanceOf(() => { + var Bytes10times5 = new T.ArrayType(new T.ArrayType(T.uint8, 5), 10); + bytes40.redimension(Bytes10times5); + }, TypeError, "New number of elements does not match old number of elements"); + + // test what happens if inner type does not match, even if size is the same + assertThrowsInstanceOf(() => { + var Words40 = new T.ArrayType(T.uint8Clamped, 40); + bytes40.redimension(Words40); + }, TypeError, "New element type is not equivalent to old element type"); + + reportCompare(true, true); + print("Tests complete"); +} + +runTests(); + + diff --git a/js/src/vm/Interpreter.cpp b/js/src/vm/Interpreter.cpp index 3aeeadb0e0e..eccc54332c6 100644 --- a/js/src/vm/Interpreter.cpp +++ b/js/src/vm/Interpreter.cpp @@ -1660,7 +1660,7 @@ CASE(JSOP_RETRVAL) if (!REGS.fp()->isYielding()) REGS.fp()->epilogue(cx); else - probes::ExitScript(cx, script, script->function(), REGS.fp()); + probes::ExitScript(cx, script, script->function(), REGS.fp()->hasPushedSPSFrame()); #if defined(JS_ION) jit_return_pop_frame: @@ -3437,7 +3437,7 @@ DEFAULT() if (!REGS.fp()->isYielding()) REGS.fp()->epilogue(cx); else - probes::ExitScript(cx, script, script->function(), REGS.fp()); + probes::ExitScript(cx, script, script->function(), REGS.fp()->hasPushedSPSFrame()); gc::MaybeVerifyBarriers(cx, true); diff --git a/js/src/vm/Probes-inl.h b/js/src/vm/Probes-inl.h index a252ea7ab49..3d12c2b3cc0 100644 --- a/js/src/vm/Probes-inl.h +++ b/js/src/vm/Probes-inl.h @@ -63,8 +63,7 @@ probes::EnterScript(JSContext *cx, JSScript *script, JSFunction *maybeFun, } inline bool -probes::ExitScript(JSContext *cx, JSScript *script, JSFunction *maybeFun, - AbstractFramePtr fp) +probes::ExitScript(JSContext *cx, JSScript *script, JSFunction *maybeFun, bool popSPSFrame) { bool ok = true; @@ -76,22 +75,10 @@ probes::ExitScript(JSContext *cx, JSScript *script, JSFunction *maybeFun, cx->doFunctionCallback(maybeFun, script, 0); #endif - JSRuntime *rt = cx->runtime(); - /* - * Coming from IonMonkey, the fp might not be known (fp == nullptr), but - * IonMonkey will only call exitScript() when absolutely necessary, so it is - * guaranteed that fp->hasPushedSPSFrame() would have been true - */ - if ((!fp && rt->spsProfiler.enabled()) || (fp && fp.hasPushedSPSFrame())) - rt->spsProfiler.exit(cx, script, maybeFun); - return ok; -} + if (popSPSFrame) + cx->runtime()->spsProfiler.exit(cx, script, maybeFun); -inline bool -probes::ExitScript(JSContext *cx, JSScript *script, JSFunction *maybeFun, - StackFrame *fp) -{ - return probes::ExitScript(cx, script, maybeFun, fp ? AbstractFramePtr(fp) : AbstractFramePtr()); + return ok; } inline bool diff --git a/js/src/vm/Probes.h b/js/src/vm/Probes.h index d8c60adf34d..1a67f98fa2d 100644 --- a/js/src/vm/Probes.h +++ b/js/src/vm/Probes.h @@ -69,8 +69,7 @@ bool WantNativeAddressInfo(JSContext *); bool EnterScript(JSContext *, JSScript *, JSFunction *, StackFrame *); /* About to leave a JS function */ -bool ExitScript(JSContext *, JSScript *, JSFunction *, AbstractFramePtr); -bool ExitScript(JSContext *, JSScript *, JSFunction *, StackFrame *); +bool ExitScript(JSContext *, JSScript *, JSFunction *, bool popSPSFrame); /* Executing a script */ bool StartExecution(JSScript *script); diff --git a/js/src/vm/Stack.cpp b/js/src/vm/Stack.cpp index e92bca1ace4..53cc3c47300 100644 --- a/js/src/vm/Stack.cpp +++ b/js/src/vm/Stack.cpp @@ -300,7 +300,7 @@ StackFrame::epilogue(JSContext *cx) JS_ASSERT(!hasBlockChain()); RootedScript script(cx, this->script()); - probes::ExitScript(cx, script, script->function(), this); + probes::ExitScript(cx, script, script->function(), hasPushedSPSFrame()); if (isEvalFrame()) { if (isStrictEvalFrame()) { diff --git a/js/src/vm/Xdr.h b/js/src/vm/Xdr.h index a587d5c0ed2..ec08bc4e4f5 100644 --- a/js/src/vm/Xdr.h +++ b/js/src/vm/Xdr.h @@ -22,7 +22,7 @@ namespace js { * and saved versions. If deserialization fails, the data should be * invalidated if possible. */ -static const uint32_t XDR_BYTECODE_VERSION = uint32_t(0xb973c0de - 153); +static const uint32_t XDR_BYTECODE_VERSION = uint32_t(0xb973c0de - 154); class XDRBuffer { public: diff --git a/js/xpconnect/shell/xpcshell.cpp b/js/xpconnect/shell/xpcshell.cpp index 327f84b44ee..1fac33fe90b 100644 --- a/js/xpconnect/shell/xpcshell.cpp +++ b/js/xpconnect/shell/xpcshell.cpp @@ -10,6 +10,7 @@ #include #include "mozilla/Util.h" +#include "mozilla/WindowsDllBlocklist.h" #include "nsXULAppAPI.h" #ifdef XP_MACOSX @@ -38,8 +39,8 @@ main(int argc, char** argv, char** envp) setbuf(stdout, 0); #endif -#ifdef XRE_HAS_DLL_BLOCKLIST - XRE_SetupDllBlocklist(); +#ifdef HAS_DLL_BLOCKLIST + DllBlocklist_Initialize(); #endif int result = XRE_XPCShellMain(argc, argv, envp); diff --git a/layout/base/crashtests/806056-1.html b/layout/base/crashtests/806056-1.html new file mode 100644 index 00000000000..7472bac74a9 --- /dev/null +++ b/layout/base/crashtests/806056-1.html @@ -0,0 +1,16 @@ + + + + + + +
X
+ + diff --git a/layout/base/crashtests/806056-2.html b/layout/base/crashtests/806056-2.html new file mode 100644 index 00000000000..c0fd20fecec --- /dev/null +++ b/layout/base/crashtests/806056-2.html @@ -0,0 +1,18 @@ + + + + + + +
+ + diff --git a/layout/base/crashtests/crashtests.list b/layout/base/crashtests/crashtests.list index 762f5d05790..d0abf1c223f 100644 --- a/layout/base/crashtests/crashtests.list +++ b/layout/base/crashtests/crashtests.list @@ -403,6 +403,8 @@ load 788360.html load 793848.html load 795646.html skip-if(1) load 802902.html # bug 901752 +load 806056-1.html +load 806056-2.html load 813372-1.html asserts-if(gtk2Widget,0-1) load 822865.html # bug 540078 load 833604-1.html diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index a0665d4762f..841a9b776a2 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -3455,6 +3455,9 @@ PresShell::DispatchSynthMouseMove(WidgetGUIEvent* aEvent, if (!targetView) return; targetView->GetViewManager()->DispatchEvent(aEvent, targetView, &status); + if (MOZ_UNLIKELY(mIsDestroying)) { + return; + } if (aFlushOnHoverChange && hoverGenerationBefore != restyleManager->GetHoverGeneration()) { // Flush so that the resulting reflow happens now so that our caller diff --git a/layout/base/nsPresShell.h b/layout/base/nsPresShell.h index 0e6e3bd3705..cb6e2791a3b 100644 --- a/layout/base/nsPresShell.h +++ b/layout/base/nsPresShell.h @@ -600,8 +600,10 @@ protected: } } virtual void WillRefresh(mozilla::TimeStamp aTime) MOZ_OVERRIDE { - if (mPresShell) - mPresShell->ProcessSynthMouseMoveEvent(mFromScroll); + if (mPresShell) { + nsRefPtr shell = mPresShell; + shell->ProcessSynthMouseMoveEvent(mFromScroll); + } } private: PresShell* mPresShell; diff --git a/layout/reftests/bugs/388367-1.html b/layout/generic/crashtests/388367-1.html similarity index 100% rename from layout/reftests/bugs/388367-1.html rename to layout/generic/crashtests/388367-1.html diff --git a/layout/generic/crashtests/463785.xhtml b/layout/generic/crashtests/463785.xhtml new file mode 100644 index 00000000000..befeaf8fdd3 --- /dev/null +++ b/layout/generic/crashtests/463785.xhtml @@ -0,0 +1,40 @@ + + + + + +
+
+
+ + + + +
+ + + + +
+m + +
+
+
+ + +
+
+ + + diff --git a/layout/generic/crashtests/489477.html b/layout/generic/crashtests/489477.html new file mode 100644 index 00000000000..34ef7362600 --- /dev/null +++ b/layout/generic/crashtests/489477.html @@ -0,0 +1,21 @@ + + + + + +

+ + diff --git a/layout/generic/crashtests/537645.xhtml b/layout/generic/crashtests/537645.xhtml new file mode 100644 index 00000000000..de3123dc951 --- /dev/null +++ b/layout/generic/crashtests/537645.xhtml @@ -0,0 +1,11 @@ + + + + + +
+ + diff --git a/layout/generic/crashtests/654002-1.html b/layout/generic/crashtests/654002-1.html new file mode 100644 index 00000000000..b96b0ef35cd --- /dev/null +++ b/layout/generic/crashtests/654002-1.html @@ -0,0 +1,24 @@ + + + + Testcase for bug 654002 + + + + +
+ + + diff --git a/layout/generic/crashtests/654002-2.html b/layout/generic/crashtests/654002-2.html new file mode 100644 index 00000000000..28f820d99bd --- /dev/null +++ b/layout/generic/crashtests/654002-2.html @@ -0,0 +1,26 @@ + + + + + + +
+ diff --git a/layout/generic/crashtests/777838.html b/layout/generic/crashtests/777838.html new file mode 100644 index 00000000000..02aadfe5664 --- /dev/null +++ b/layout/generic/crashtests/777838.html @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/layout/generic/crashtests/784600.html b/layout/generic/crashtests/784600.html new file mode 100644 index 00000000000..8706877121e --- /dev/null +++ b/layout/generic/crashtests/784600.html @@ -0,0 +1,17 @@ +>
> diff --git a/layout/generic/crashtests/crashtests.list b/layout/generic/crashtests/crashtests.list index 8eb981531ac..6e8eec41e30 100644 --- a/layout/generic/crashtests/crashtests.list +++ b/layout/generic/crashtests/crashtests.list @@ -136,6 +136,7 @@ load 387233-1.html load 387233-2.html load 387282-1.html load 388175-1.html +load 388367-1.html load 388709-1.html load 389635-1.html load 390050-1.html @@ -169,7 +170,7 @@ load 398322-1.html load 398322-2.html load 398332-1.html load 398332-2.html -asserts(2) load 398332-3.html # bug 436123 and bug 457397 +asserts(0-2) load 398332-3.html # bug 436123 and bug 457397 load 399407-1.xhtml load 399412-1.html load 399843-1.html @@ -302,6 +303,7 @@ load 463350-1.html load 463350-2.html load 463350-3.html load 463741-1.html +load 463785.xhtml load 465651-1.html load 467137-1.html load 467213-1.html @@ -331,6 +333,7 @@ asserts-if(!Android,1) load 479938-1.html # Bug 575011 load 480345-1.html skip-if(Android) load 481921.html load 489462-1.html +load 489477.html load 489480-1.xhtml load 493111-1.html load 493118-1.html @@ -373,6 +376,7 @@ load 534082-1.html load 534366-1.html load 534366-2.html load 536692-1.xhtml +load 537645.xhtml load 541277-1.html load 541277-2.html load 541714-1.html @@ -421,6 +425,8 @@ load 646561-1.html load 646983-1.html load 647332-1.html load 650499-1.html +load 654002-1.html +load 654002-2.html load 655462-1.html load 656130-1.html load 656130-2.html @@ -464,6 +470,8 @@ asserts(0-200) load 767765.html # bug 407550, bug 871758, and various nscoord_MA load 769303-1.html load 769303-2.html load 769120.html +load 777838.html +load 784600.html load 786740-1.html asserts(0-4) test-pref(font.size.inflation.emPerLine,15) load 791601.xhtml # 3 counts of bug 871327, 1 bug 367185 test-pref(font.size.inflation.minTwips,120) load 794693.html diff --git a/layout/generic/crashtests/simple_blank.swf b/layout/generic/crashtests/simple_blank.swf new file mode 100644 index 00000000000..b846387eb8b Binary files /dev/null and b/layout/generic/crashtests/simple_blank.swf differ diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list index d138713d48b..456882a5176 100644 --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -758,7 +758,6 @@ fails == 387344-1.html 387344-1-ref.html # scrolling rowgroups were removed in b == 387876-3a.html 387876-3-ref.html == 387876-3b.html 387876-3-ref.html == 388026-1.html 388026-1-ref.html -== 388367-1.html about:blank == 389074-1.html 389074-1-ref.html == 389224-1.html 389224-1-ref.html == 389224-2.html about:blank diff --git a/media/webrtc/trunk/build/mac/find_sdk.py b/media/webrtc/trunk/build/mac/find_sdk.py index 067be638d21..ca58284eacd 100755 --- a/media/webrtc/trunk/build/mac/find_sdk.py +++ b/media/webrtc/trunk/build/mac/find_sdk.py @@ -34,30 +34,33 @@ def main(): (options, args) = parser.parse_args() min_sdk_version = args[0] - job = subprocess.Popen(['xcode-select', '-print-path'], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) - out, err = job.communicate() - if job.returncode != 0: - print >>sys.stderr, out - print >>sys.stderr, err - raise Exception(('Error %d running xcode-select, you might have to run ' - '|sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer| ' - 'if you are using Xcode 4.') % job.returncode) - # The Developer folder moved in Xcode 4.3. - xcode43_sdk_path = os.path.join( + if sys.platform == 'darwin': + job = subprocess.Popen(['xcode-select', '-print-path'], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + out, err = job.communicate() + if job.returncode != 0: + print >>sys.stderr, out + print >>sys.stderr, err + raise Exception(('Error %d running xcode-select, you might have to run ' + '|sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer| ' + 'if you are using Xcode 4.') % job.returncode) + # The Developer folder moved in Xcode 4.3. + xcode43_sdk_path = os.path.join( out.rstrip(), 'Platforms/MacOSX.platform/Developer/SDKs') - if os.path.isdir(xcode43_sdk_path): - sdk_dir = xcode43_sdk_path + if os.path.isdir(xcode43_sdk_path): + sdk_dir = xcode43_sdk_path + else: + sdk_dir = os.path.join(out.rstrip(), 'SDKs') + sdks = [re.findall('^MacOSX(10\.\d+)\.sdk$', s) for s in os.listdir(sdk_dir)] + sdks = [s[0] for s in sdks if s] # [['10.5'], ['10.6']] => ['10.5', '10.6'] + sdks = [s for s in sdks # ['10.5', '10.6'] => ['10.6'] + if parse_version(s) >= parse_version(min_sdk_version)] + if not sdks: + raise Exception('No %s+ SDK found' % min_sdk_version) + best_sdk = sorted(sdks, key=parse_version)[0] else: - sdk_dir = os.path.join(out.rstrip(), 'SDKs') - sdks = [re.findall('^MacOSX(10\.\d+)\.sdk$', s) for s in os.listdir(sdk_dir)] - sdks = [s[0] for s in sdks if s] # [['10.5'], ['10.6']] => ['10.5', '10.6'] - sdks = [s for s in sdks # ['10.5', '10.6'] => ['10.6'] - if parse_version(s) >= parse_version(min_sdk_version)] - if not sdks: - raise Exception('No %s+ SDK found' % min_sdk_version) - best_sdk = sorted(sdks, key=parse_version)[0] + best_sdk = "" if options.verify and best_sdk != min_sdk_version and not options.sdk_path: print >>sys.stderr, '' @@ -77,6 +80,4 @@ def main(): if __name__ == '__main__': - if sys.platform != 'darwin': - raise Exception("This script only runs on Mac") print main() diff --git a/mozglue/build/Makefile.in b/mozglue/build/Makefile.in index cd4dae23975..22546d545fe 100644 --- a/mozglue/build/Makefile.in +++ b/mozglue/build/Makefile.in @@ -45,7 +45,14 @@ ifneq (,$(filter -DEFAULTLIB:mozcrt,$(MOZ_GLUE_LDFLAGS))) NO_INSTALL_IMPORT_LIBRARY = 1 endif -EXTRA_DSO_LDOPTS += $(MOZ_ZLIB_LIBS) + +EXTRA_DSO_LDOPTS += \ + $(MOZ_ZLIB_LIBS) \ + version.lib \ + $(NULL) + +STL_FLAGS= + endif ifeq (Darwin_1,$(OS_TARGET)_$(MOZ_REPLACE_MALLOC)) diff --git a/toolkit/xre/nsWindowsDllBlocklist.cpp b/mozglue/build/WindowsDllBlocklist.cpp similarity index 87% rename from toolkit/xre/nsWindowsDllBlocklist.cpp rename to mozglue/build/WindowsDllBlocklist.cpp index 73d21e87d08..8a8943c888a 100644 --- a/toolkit/xre/nsWindowsDllBlocklist.cpp +++ b/mozglue/build/WindowsDllBlocklist.cpp @@ -5,18 +5,15 @@ #include #include +#include -#include -#include - +#pragma warning( push ) +#pragma warning( disable : 4275 4530 ) // See msvc-stl-wrapper.template.h #include +#pragma warning( pop ) -#include "nsXULAppAPI.h" - +#define MOZ_NO_MOZALLOC #include "nsAutoPtr.h" -#include "nsThreadUtils.h" - -#include "prlog.h" #include "nsWindowsDllInterceptor.h" #include "mozilla/WindowsVersion.h" @@ -24,10 +21,6 @@ using namespace mozilla; -#ifdef MOZ_CRASHREPORTER -#include "nsExceptionHandler.h" -#endif - #define ALL_VERSIONS ((unsigned long long)-1LL) // DLLs sometimes ship without a version number, particularly early @@ -153,7 +146,47 @@ static DllBlockInfo sWindowsDllBlocklist[] = { // define this for very verbose dll load debug spew #undef DEBUG_very_verbose -extern bool gInXPCOMLoadOnMainThread; +static const char kBlockedDllsParameter[] = "BlockedDllList="; +static const int kBlockedDllsParameterLen = + sizeof(kBlockedDllsParameter) - 1; + +static const char kBlocklistInitFailedParameter[] = "BlocklistInitFailed="; +static const int kBlocklistInitFailedParameterLen = + sizeof(kBlocklistInitFailedParameter) - 1; + +static const char kUser32BeforeBlocklistParameter[] = "User32BeforeBlocklist="; +static const int kUser32BeforeBlocklistParameterLen = + sizeof(kUser32BeforeBlocklistParameterLen) - 1; + +static DWORD sThreadLoadingXPCOMModule; +static bool sBlocklistInitFailed; +static bool sUser32BeforeBlocklist; + +// Duplicated from xpcom glue. Ideally this should be shared. +static void +printf_stderr(const char *fmt, ...) +{ + if (IsDebuggerPresent()) { + char buf[2048]; + va_list args; + va_start(args, fmt); + vsnprintf(buf, sizeof(buf), fmt, args); + buf[sizeof(buf) - 1] = '\0'; + va_end(args); + OutputDebugStringA(buf); + } + + FILE *fp = _fdopen(_dup(2), "a"); + if (!fp) + return; + + va_list args; + va_start(args, fmt); + vfprintf(fp, fmt, args); + va_end(args); + + fclose(fp); +} namespace { @@ -170,7 +203,7 @@ struct RVAMap { DWORD alignedOffset = (offset / info.dwAllocationGranularity) * info.dwAllocationGranularity; - NS_ASSERTION(offset - alignedOffset < info.dwAllocationGranularity, "Wtf"); + MOZ_ASSERT(offset - alignedOffset < info.dwAllocationGranularity, "Wtf"); mRealView = ::MapViewOfFile(map, FILE_MAP_READ, 0, alignedOffset, sizeof(T) + (offset - alignedOffset)); @@ -544,7 +577,7 @@ continue_loading: printf_stderr("LdrLoadDll: continuing load... ('%S')\n", moduleFileName->Buffer); #endif - if (gInXPCOMLoadOnMainThread && NS_IsMainThread()) { + if (GetCurrentThreadId() == sThreadLoadingXPCOMModule) { // Check to ensure that the DLL has ASLR. full_fname = getFullPath(filePath, fname); if (!full_fname) { @@ -566,31 +599,56 @@ WindowsDllInterceptor NtDllIntercept; } // anonymous namespace -void -XRE_SetupDllBlocklist() +NS_EXPORT void +DllBlocklist_Initialize() { + if (GetModuleHandleA("user32.dll")) { + sUser32BeforeBlocklist = true; + } + NtDllIntercept.Init("ntdll.dll"); ReentrancySentinel::InitializeStatics(); bool ok = NtDllIntercept.AddHook("LdrLoadDll", reinterpret_cast(patched_LdrLoadDll), (void**) &stub_LdrLoadDll); + if (!ok) { + sBlocklistInitFailed = true; #ifdef DEBUG - if (!ok) printf_stderr ("LdrLoadDll hook failed, no dll blocklisting active\n"); #endif - -#ifdef MOZ_CRASHREPORTER - if (!ok) { - CrashReporter::AppendAppNotesToCrashReport(NS_LITERAL_CSTRING("DllBlockList Failed\n")); } -#endif } -#ifdef MOZ_CRASHREPORTER -void -CrashReporter::WriteBlockedDlls(HANDLE file) +NS_EXPORT void +DllBlocklist_SetInXPCOMLoadOnMainThread(bool inXPCOMLoadOnMainThread) { - DllBlockSet::Write(file); + if (inXPCOMLoadOnMainThread) { + MOZ_ASSERT(sThreadLoadingXPCOMModule == 0, "Only one thread should be doing this"); + sThreadLoadingXPCOMModule = GetCurrentThreadId(); + } else { + sThreadLoadingXPCOMModule = 0; + } +} + +NS_EXPORT void +DllBlocklist_WriteNotes(HANDLE file) +{ + DWORD nBytes; + + WriteFile(file, kBlockedDllsParameter, kBlockedDllsParameterLen, &nBytes, nullptr); + DllBlockSet::Write(file); + WriteFile(file, "\n", 1, &nBytes, nullptr); + + if (sBlocklistInitFailed) { + WriteFile(file, kBlocklistInitFailedParameter, + kBlocklistInitFailedParameterLen, &nBytes, nullptr); + WriteFile(file, "1\n", 2, &nBytes, nullptr); + } + + if (sUser32BeforeBlocklist) { + WriteFile(file, kUser32BeforeBlocklistParameter, + kUser32BeforeBlocklistParameterLen, &nBytes, nullptr); + WriteFile(file, "1\n", 2, &nBytes, nullptr); + } } -#endif diff --git a/mozglue/build/WindowsDllBlocklist.h b/mozglue/build/WindowsDllBlocklist.h new file mode 100644 index 00000000000..e33ec908fe7 --- /dev/null +++ b/mozglue/build/WindowsDllBlocklist.h @@ -0,0 +1,38 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_windowsdllblocklist_h +#define mozilla_windowsdllblocklist_h + +#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) + +#include +#include "mozilla/GuardObjects.h" +#include "nscore.h" + +#define HAS_DLL_BLOCKLIST + +NS_IMPORT void DllBlocklist_Initialize(); +NS_IMPORT void DllBlocklist_SetInXPCOMLoadOnMainThread(bool inXPCOMLoadOnMainThread); +NS_IMPORT void DllBlocklist_WriteNotes(HANDLE file); + +class AutoSetXPCOMLoadOnMainThread +{ + public: + AutoSetXPCOMLoadOnMainThread(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM) { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + DllBlocklist_SetInXPCOMLoadOnMainThread(true); + } + + ~AutoSetXPCOMLoadOnMainThread() { + DllBlocklist_SetInXPCOMLoadOnMainThread(false); + } + + private: + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER +}; + +#endif // defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) +#endif // mozilla_windowsdllblocklist_h diff --git a/mozglue/build/moz.build b/mozglue/build/moz.build index 861e8b49720..9e9ddbb6172 100644 --- a/mozglue/build/moz.build +++ b/mozglue/build/moz.build @@ -31,6 +31,11 @@ if CONFIG['OS_TARGET'] == 'Android': 'BionicGlue.cpp', ] +if CONFIG['OS_TARGET'] == 'WINNT': + SOURCES += [ + 'WindowsDllBlocklist.cpp', + ] + if CONFIG['MOZ_NUWA_PROCESS']: EXPORTS.ipc += [ 'Nuwa.h', @@ -42,6 +47,7 @@ if CONFIG['MOZ_NUWA_PROCESS']: EXPORTS.mozilla += [ 'arm.h', 'SSE.h', + 'WindowsDllBlocklist.h', ] if CONFIG['CPU_ARCH'].startswith('x86'): diff --git a/toolkit/crashreporter/nsExceptionHandler.cpp b/toolkit/crashreporter/nsExceptionHandler.cpp index ee92ed58519..21ffcf65aa3 100644 --- a/toolkit/crashreporter/nsExceptionHandler.cpp +++ b/toolkit/crashreporter/nsExceptionHandler.cpp @@ -83,6 +83,7 @@ using mozilla::InjectCrashRunnable; #include "mozilla/mozalloc_oom.h" #include "mozilla/LateWriteChecks.h" +#include "mozilla/WindowsDllBlocklist.h" #if defined(XP_MACOSX) CFStringRef reporterClientAppID = CFSTR("org.mozilla.crashreporter"); @@ -222,11 +223,6 @@ static const char kIsGarbageCollectingParameter[] = "IsGarbageCollecting="; static const int kIsGarbageCollectingParameterLen = sizeof(kIsGarbageCollectingParameter)-1; -#ifdef XP_WIN -static const char kBlockedDllsParameter[] = "BlockedDllList="; -static const int kBlockedDllsParameterLen = sizeof(kBlockedDllsParameter) - 1; -#endif - // this holds additional data sent via the API static Mutex* crashReporterAPILock; static Mutex* notesFieldLock; @@ -545,9 +541,10 @@ bool MinidumpCallback( WriteFile(hFile, isGarbageCollecting ? "1" : "0", 1, &nBytes, nullptr); WriteFile(hFile, "\n", 1, &nBytes, nullptr); } - WriteFile(hFile, kBlockedDllsParameter, kBlockedDllsParameterLen, &nBytes, nullptr); - WriteBlockedDlls(hFile); - WriteFile(hFile, "\n", 1, &nBytes, nullptr); + +#ifdef HAS_DLL_BLOCKLIST + DllBlocklist_WriteNotes(hFile); +#endif // Try to get some information about memory. MEMORYSTATUSEX statex; diff --git a/toolkit/crashreporter/nsExceptionHandler.h b/toolkit/crashreporter/nsExceptionHandler.h index 7e64f745843..1131306c6c4 100644 --- a/toolkit/crashreporter/nsExceptionHandler.h +++ b/toolkit/crashreporter/nsExceptionHandler.h @@ -44,11 +44,6 @@ nsresult AppendAppNotesToCrashReport(const nsACString& data); nsresult SetGarbageCollecting(bool collecting); -#ifdef XP_WIN -// Implemented by the blocklist, this method writes the blocklist annotation -void WriteBlockedDlls(HANDLE file); -#endif - nsresult SetRestartArgs(int argc, char** argv); nsresult SetupExtraData(nsIFile* aAppDataDirectory, const nsACString& aBuildID); diff --git a/toolkit/system/gnome/Makefile.in b/toolkit/system/gnome/Makefile.in index 35057ea518f..bf829176e5a 100644 --- a/toolkit/system/gnome/Makefile.in +++ b/toolkit/system/gnome/Makefile.in @@ -11,6 +11,7 @@ EXTRA_DSO_LDOPTS += \ $(MOZ_GNOMEVFS_LIBS) \ $(GLIB_LIBS) \ $(MOZ_GIO_LIBS) \ + $(MOZ_DBUS_GLIB_LIBS) \ $(NULL) LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/components/build/ @@ -22,6 +23,7 @@ CXXFLAGS += \ $(MOZ_GNOMEVFS_CFLAGS) \ $(MOZ_GIO_CFLAGS) \ $(GLIB_CFLAGS) \ + $(MOZ_DBUS_GLIB_CFLAGS) \ $(NULL) ifdef MOZ_ENABLE_GTK diff --git a/toolkit/system/gnome/nsGIOService.cpp b/toolkit/system/gnome/nsGIOService.cpp index 11e28d912c5..f83ff791d1a 100644 --- a/toolkit/system/gnome/nsGIOService.cpp +++ b/toolkit/system/gnome/nsGIOService.cpp @@ -12,6 +12,8 @@ #include #include +#include +#include char * @@ -377,6 +379,56 @@ nsGIOService::ShowURIForInput(const nsACString& aUri) return rv; } +NS_IMETHODIMP +nsGIOService::OrgFreedesktopFileManager1ShowItems(const nsACString& aPath) +{ + GError* error = nullptr; + static bool org_freedesktop_FileManager1_exists = true; + + if (!org_freedesktop_FileManager1_exists) { + return NS_ERROR_NOT_AVAILABLE; + } + + DBusGConnection* dbusGConnection = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + + if (!dbusGConnection) { + if (error) { + g_printerr("Failed to open connection to session bus: %s\n", error->message); + g_error_free(error); + } + return NS_ERROR_FAILURE; + } + + char *uri = g_filename_to_uri(PromiseFlatCString(aPath).get(), nullptr, nullptr); + if (uri == NULL) { + return NS_ERROR_FAILURE; + } + + DBusConnection* dbusConnection = dbus_g_connection_get_connection(dbusGConnection); + // Make sure we do not exit the entire program if DBus connection get lost. + dbus_connection_set_exit_on_disconnect(dbusConnection, false); + + DBusGProxy* dbusGProxy = dbus_g_proxy_new_for_name(dbusGConnection, + "org.freedesktop.FileManager1", + "/org/freedesktop/FileManager1", + "org.freedesktop.FileManager1"); + + const char *uris[2] = { uri, nullptr }; + gboolean rv_dbus_call = dbus_g_proxy_call (dbusGProxy, "ShowItems", nullptr, G_TYPE_STRV, uris, + G_TYPE_STRING, "", G_TYPE_INVALID, G_TYPE_INVALID); + + g_object_unref(dbusGProxy); + dbus_g_connection_unref(dbusGConnection); + g_free(uri); + + if (!rv_dbus_call) { + org_freedesktop_FileManager1_exists = false; + return NS_ERROR_NOT_AVAILABLE; + } + + return NS_OK; +} + /** * Create or find already existing application info for specified command * and application name. diff --git a/toolkit/xre/moz.build b/toolkit/xre/moz.build index 1ee6996d1fd..880b38cbd3d 100644 --- a/toolkit/xre/moz.build +++ b/toolkit/xre/moz.build @@ -24,7 +24,6 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': EXPORTS += ['nsWindowsDllInterceptor.h'] SOURCES += [ 'nsNativeAppSupportWin.cpp', - 'nsWindowsDllBlocklist.cpp', ] elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': EXPORTS += ['MacQuirks.h'] diff --git a/tools/profiler/shared-libraries-linux.cc b/tools/profiler/shared-libraries-linux.cc index d5b016714bf..f6a8e18d77d 100644 --- a/tools/profiler/shared-libraries-linux.cc +++ b/tools/profiler/shared-libraries-linux.cc @@ -11,24 +11,10 @@ #include #include #include +#include #include "platform.h" #include "shared-libraries.h" -#if !defined(__GLIBC__) && ANDROID_VERSION < 18 -/* a crapy version of getline, because it's not included in old bionics */ -static ssize_t getline(char **lineptr, size_t *n, FILE *stream) -{ - char *ret; - if (!*lineptr) { - *lineptr = (char*)malloc(4096); - } - ret = fgets(*lineptr, 4096, stream); - if (!ret) - return 0; - return strlen(*lineptr); -} -#endif - #if !defined(MOZ_WIDGET_GONK) // TODO fix me with proper include #include "nsDebug.h" @@ -91,11 +77,10 @@ SharedLibraryInfo SharedLibraryInfo::GetInfoForSelf() pid_t pid = getpid(); char path[PATH_MAX]; snprintf(path, PATH_MAX, "/proc/%d/maps", pid); - FILE *maps = fopen(path, "r"); - char *line = NULL; + std::ifstream maps(path); + std::string line; int count = 0; - size_t line_size = 0; - while (maps && getline (&line, &line_size, maps) > 0) { + while (std::getline(maps, line)) { int ret; //XXX: needs input sanitizing unsigned long start; @@ -103,7 +88,7 @@ SharedLibraryInfo SharedLibraryInfo::GetInfoForSelf() char perm[6] = ""; unsigned long offset; char name[PATH_MAX] = ""; - ret = sscanf(line, + ret = sscanf(line.c_str(), "%lx-%lx %6s %lx %*s %*x %" PATH_MAX_STRING(PATH_MAX) "s\n", &start, &end, perm, &offset, name); if (!strchr(perm, 'x')) { @@ -128,6 +113,5 @@ SharedLibraryInfo SharedLibraryInfo::GetInfoForSelf() } count++; } - free(line); return info; } diff --git a/xpcom/base/CycleCollectedJSRuntime.cpp b/xpcom/base/CycleCollectedJSRuntime.cpp index 1956832e024..1358d4aa40d 100644 --- a/xpcom/base/CycleCollectedJSRuntime.cpp +++ b/xpcom/base/CycleCollectedJSRuntime.cpp @@ -518,8 +518,10 @@ CycleCollectedJSRuntime::DescribeGCThing(bool aIsMarked, void* aThing, } char name[72]; + uint64_t compartmentAddress = 0; if (aTraceKind == JSTRACE_OBJECT) { JSObject* obj = static_cast(aThing); + compartmentAddress = (uint64_t)js::GetObjectCompartment(obj); const js::Class* clasp = js::GetObjectClass(obj); // Give the subclass a chance to do something @@ -555,7 +557,7 @@ CycleCollectedJSRuntime::DescribeGCThing(bool aIsMarked, void* aThing, } // Disable printing global for objects while we figure out ObjShrink fallout. - aCb.DescribeGCedNode(aIsMarked, name); + aCb.DescribeGCedNode(aIsMarked, name, compartmentAddress); } void diff --git a/xpcom/base/nsCycleCollector.cpp b/xpcom/base/nsCycleCollector.cpp index 16073d487bc..9eacc50b854 100644 --- a/xpcom/base/nsCycleCollector.cpp +++ b/xpcom/base/nsCycleCollector.cpp @@ -1115,7 +1115,7 @@ GraphWalker::DoWalk(nsDeque &aQueue) struct CCGraphDescriber : public LinkedListElement { CCGraphDescriber() - : mAddress("0x"), mToAddress("0x"), mCnt(0), mType(eUnknown) {} + : mAddress("0x"), mCnt(0), mType(eUnknown) {} enum Type { @@ -1129,8 +1129,8 @@ struct CCGraphDescriber : public LinkedListElement }; nsCString mAddress; - nsCString mToAddress; nsCString mName; + nsCString mCompartmentOrToAddress; uint32_t mCnt; Type mType; }; @@ -1290,7 +1290,8 @@ public: return NS_OK; } NS_IMETHOD NoteGCedObject(uint64_t aAddress, bool aMarked, - const char *aObjectDescription) + const char *aObjectDescription, + uint64_t aCompartmentAddress) { if (!mDisableLog) { fprintf(mStream, "%p [gc%s] %s\n", (void*)aAddress, @@ -1305,6 +1306,12 @@ public: CCGraphDescriber::eGCedObject; d->mAddress = mCurrentAddress; d->mName.Append(aObjectDescription); + if (aCompartmentAddress) { + d->mCompartmentOrToAddress.AssignLiteral("0x"); + d->mCompartmentOrToAddress.AppendInt(aCompartmentAddress, 16); + } else { + d->mCompartmentOrToAddress.SetIsVoid(true); + } } return NS_OK; } @@ -1318,7 +1325,8 @@ public: mDescribers.insertBack(d); d->mType = CCGraphDescriber::eEdge; d->mAddress = mCurrentAddress; - d->mToAddress.AppendInt(aToAddress, 16); + d->mCompartmentOrToAddress.AssignLiteral("0x"); + d->mCompartmentOrToAddress.AppendInt(aToAddress, 16); d->mName.Append(aEdgeName); } return NS_OK; @@ -1421,11 +1429,12 @@ public: aHandler->NoteGCedObject(d->mAddress, d->mType == CCGraphDescriber::eGCMarkedObject, - d->mName); + d->mName, + d->mCompartmentOrToAddress); break; case CCGraphDescriber::eEdge: aHandler->NoteEdge(d->mAddress, - d->mToAddress, + d->mCompartmentOrToAddress, d->mName); break; case CCGraphDescriber::eRoot: @@ -1598,7 +1607,8 @@ public: // nsCycleCollectionTraversalCallback methods. NS_IMETHOD_(void) DescribeRefCountedNode(nsrefcnt refCount, const char *objName); - NS_IMETHOD_(void) DescribeGCedNode(bool isMarked, const char *objName); + NS_IMETHOD_(void) DescribeGCedNode(bool isMarked, const char *objName, + uint64_t aCompartmentAddress); NS_IMETHOD_(void) NoteXPCOMChild(nsISupports *child); NS_IMETHOD_(void) NoteJSChild(void *child); @@ -1782,14 +1792,15 @@ GCGraphBuilder::DescribeRefCountedNode(nsrefcnt refCount, const char *objName) } NS_IMETHODIMP_(void) -GCGraphBuilder::DescribeGCedNode(bool isMarked, const char *objName) +GCGraphBuilder::DescribeGCedNode(bool isMarked, const char *objName, + uint64_t aCompartmentAddress) { uint32_t refCount = isMarked ? UINT32_MAX : 0; mCollector->mVisitedGCed++; if (mListener) { mListener->NoteGCedObject((uint64_t)mCurrPi->mPointer, isMarked, - objName); + objName, aCompartmentAddress); } DescribeNode(refCount, objName); @@ -1923,7 +1934,8 @@ public: NS_IMETHOD_(void) DescribeRefCountedNode(nsrefcnt refcount, const char *objname) {} NS_IMETHOD_(void) DescribeGCedNode(bool ismarked, - const char *objname) {} + const char *objname, + uint64_t aCompartmentAddress) {} NS_IMETHOD_(void) NoteNextEdgeName(const char* name) {} bool MayHaveChild() { return mMayHaveChild; diff --git a/xpcom/base/nsICycleCollectorListener.idl b/xpcom/base/nsICycleCollectorListener.idl index 1ee71f8d495..91f15694da1 100644 --- a/xpcom/base/nsICycleCollectorListener.idl +++ b/xpcom/base/nsICycleCollectorListener.idl @@ -4,7 +4,7 @@ #include "nsISupports.idl" -[scriptable, uuid(0ef15f15-7783-4991-af68-4976d7ec2267)] +[scriptable, uuid(39a8f80e-7eee-4141-b9ef-6e2a7d6e466d)] interface nsICycleCollectorHandler : nsISupports { void noteRefCountedObject(in ACString aAddress, @@ -12,7 +12,8 @@ interface nsICycleCollectorHandler : nsISupports in ACString aObjectDescription); void noteGCedObject(in ACString aAddress, in boolean aMarked, - in ACString aObjectDescription); + in ACString aObjectDescription, + in ACString aCompartmentAddress); void noteEdge(in ACString aFromAddress, in ACString aToAddress, in ACString aEdgeName); @@ -34,7 +35,7 @@ interface nsICycleCollectorHandler : nsISupports * a call to end(). If begin() returns an error none of the other * functions will be called. */ -[scriptable, builtinclass, uuid(32a3ab19-82a3-4096-a12a-de37274f51c3)] +[scriptable, builtinclass, uuid(7096e77d-7834-4996-b52c-50564144d4be)] interface nsICycleCollectorListener : nsISupports { nsICycleCollectorListener allTraces(); @@ -55,7 +56,8 @@ interface nsICycleCollectorListener : nsISupports in string aObjectDescription); void noteGCedObject (in unsigned long long aAddress, in boolean aMarked, - in string aObjectDescription); + in string aObjectDescription, + in unsigned long long aCompartmentAddress); void noteEdge(in unsigned long long aToAddress, in string aEdgeName); void noteWeakMapEntry(in unsigned long long aMap, diff --git a/xpcom/build/nsXULAppAPI.h b/xpcom/build/nsXULAppAPI.h index e5af71623e8..bf93e08683a 100644 --- a/xpcom/build/nsXULAppAPI.h +++ b/xpcom/build/nsXULAppAPI.h @@ -437,12 +437,6 @@ XRE_API(bool, XRE_API(void, XRE_InstallX11ErrorHandler, ()) -#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) -#define XRE_HAS_DLL_BLOCKLIST -XRE_API(void, - XRE_SetupDllBlocklist, ()) -#endif - XRE_API(void, XRE_TelemetryAccumulate, (int aID, uint32_t aSample)) diff --git a/xpcom/components/nsNativeComponentLoader.cpp b/xpcom/components/nsNativeComponentLoader.cpp index 3d52eccc29c..098b320db50 100644 --- a/xpcom/components/nsNativeComponentLoader.cpp +++ b/xpcom/components/nsNativeComponentLoader.cpp @@ -32,6 +32,7 @@ #include "nsTraceRefcntImpl.h" #include "nsIFile.h" +#include "mozilla/WindowsDllBlocklist.h" #ifdef XP_WIN #include @@ -61,8 +62,6 @@ GetNativeModuleLoaderLog() return sLog; } -bool gInXPCOMLoadOnMainThread = false; - #define LOG(level, args) PR_LOG(GetNativeModuleLoaderLog(), level, args) NS_IMPL_QUERY_INTERFACE1(nsNativeModuleLoader, @@ -140,10 +139,12 @@ nsNativeModuleLoader::LoadModule(FileLocation &aFile) } // We haven't loaded this module before - - gInXPCOMLoadOnMainThread = true; - rv = file->Load(&data.library); - gInXPCOMLoadOnMainThread = false; + { +#ifdef HAS_DLL_BLOCKLIST + AutoSetXPCOMLoadOnMainThread guard; +#endif + rv = file->Load(&data.library); + } if (NS_FAILED(rv)) { char errorMsg[1024] = ""; diff --git a/xpcom/glue/nsCycleCollectionTraversalCallback.h b/xpcom/glue/nsCycleCollectionTraversalCallback.h index 8bf7b41da8c..d90ba694a71 100644 --- a/xpcom/glue/nsCycleCollectionTraversalCallback.h +++ b/xpcom/glue/nsCycleCollectionTraversalCallback.h @@ -19,8 +19,10 @@ public: // WANT_DEBUG_INFO in mFlags. NS_IMETHOD_(void) DescribeRefCountedNode(nsrefcnt refcount, const char* objname) = 0; + // Note, aCompartmentAddress is 0 if it is unknown. NS_IMETHOD_(void) DescribeGCedNode(bool ismarked, - const char* objname) = 0; + const char* objname, + uint64_t aCompartmentAddress = 0) = 0; NS_IMETHOD_(void) NoteXPCOMChild(nsISupports *child) = 0; NS_IMETHOD_(void) NoteJSChild(void *child) = 0; diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp index 7b1e9a392f3..09407c8008d 100644 --- a/xpcom/io/nsLocalFileUnix.cpp +++ b/xpcom/io/nsLocalFileUnix.cpp @@ -1782,6 +1782,8 @@ nsLocalFile::Reveal() else /* Fallback to GnomeVFS */ return gnomevfs->ShowURIForInput(mPath); + } else if (giovfs && NS_SUCCEEDED(giovfs->OrgFreedesktopFileManager1ShowItems(mPath))) { + return NS_OK; } else { nsCOMPtr parentDir; nsAutoCString dirPath; diff --git a/xpcom/system/nsIGIOService.idl b/xpcom/system/nsIGIOService.idl index d53591fc086..cbbdabe7e25 100644 --- a/xpcom/system/nsIGIOService.idl +++ b/xpcom/system/nsIGIOService.idl @@ -72,6 +72,9 @@ interface nsIGIOService : nsISupports /* Open the given URI in the default application */ void showURI(in nsIURI uri); [noscript] void showURIForInput(in ACString uri); + + /* Open path in file manager using org.freedesktop.FileManager1 interface */ + [noscript] void orgFreedesktopFileManager1ShowItems(in ACString path); }; %{C++