diff options
Diffstat (limited to 'xpcom')
27 files changed, 22 insertions, 1444 deletions
diff --git a/xpcom/base/CycleCollectedJSContext.cpp b/xpcom/base/CycleCollectedJSContext.cpp index 87e123078..4af8fe4dd 100644 --- a/xpcom/base/CycleCollectedJSContext.cpp +++ b/xpcom/base/CycleCollectedJSContext.cpp @@ -82,10 +82,6 @@ #include "nsJSUtils.h" #include "nsWrapperCache.h" -#ifdef MOZ_CRASHREPORTER -#include "nsExceptionHandler.h" -#endif - #include "nsIException.h" #include "nsIPlatformInfo.h" #include "nsThread.h" @@ -539,10 +535,6 @@ CycleCollectedJSContext::Initialize(JSContext* aParentContext, JS_SetSweepZoneCallback(mJSContext, XPCStringConvert::ClearZoneCache); JS::SetBuildIdOp(mJSContext, GetBuildId); JS::SetWarningReporter(mJSContext, MozCrashWarningReporter); -#ifdef MOZ_CRASHREPORTER - js::AutoEnterOOMUnsafeRegion::setAnnotateOOMAllocationSizeCallback( - CrashReporter::AnnotateOOMAllocationSize); -#endif static js::DOMCallbacks DOMcallbacks = { InstanceClassHasProtoAtDepth @@ -1607,16 +1599,6 @@ CycleCollectedJSContext::AnnotateAndSetOutOfMemory(OOMState* aStatePtr, MOZ_ASSERT(mJSContext); *aStatePtr = aNewState; -#ifdef MOZ_CRASHREPORTER - CrashReporter::AnnotateCrashReport(aStatePtr == &mOutOfMemoryState - ? NS_LITERAL_CSTRING("JSOutOfMemory") - : NS_LITERAL_CSTRING("JSLargeAllocationFailure"), - aNewState == OOMState::Reporting - ? NS_LITERAL_CSTRING("Reporting") - : aNewState == OOMState::Reported - ? NS_LITERAL_CSTRING("Reported") - : NS_LITERAL_CSTRING("Recovered")); -#endif } void @@ -1630,14 +1612,6 @@ CycleCollectedJSContext::OnGC(JSGCStatus aStatus) mZonesWaitingForGC.Clear(); break; case JSGC_END: { -#ifdef MOZ_CRASHREPORTER - if (mOutOfMemoryState == OOMState::Reported) { - AnnotateAndSetOutOfMemory(&mOutOfMemoryState, OOMState::Recovered); - } - if (mLargeAllocationFailureState == OOMState::Reported) { - AnnotateAndSetOutOfMemory(&mLargeAllocationFailureState, OOMState::Recovered); - } -#endif // Do any deferred finalization of native objects. FinalizeDeferredThings(JS::WasIncrementalGC(mJSContext) ? FinalizeIncrementally : diff --git a/xpcom/base/ErrorList.h b/xpcom/base/ErrorList.h index cfa461fe4..5ab4bfa29 100644 --- a/xpcom/base/ErrorList.h +++ b/xpcom/base/ErrorList.h @@ -327,13 +327,15 @@ ERROR(NS_NET_STATUS_WRITING, FAILURE(9)), /* nsISocketTransport */ - ERROR(NS_NET_STATUS_RESOLVING_HOST, FAILURE(3)), - ERROR(NS_NET_STATUS_RESOLVED_HOST, FAILURE(11)), - ERROR(NS_NET_STATUS_CONNECTING_TO, FAILURE(7)), - ERROR(NS_NET_STATUS_CONNECTED_TO, FAILURE(4)), - ERROR(NS_NET_STATUS_SENDING_TO, FAILURE(5)), - ERROR(NS_NET_STATUS_WAITING_FOR, FAILURE(10)), - ERROR(NS_NET_STATUS_RECEIVING_FROM, FAILURE(6)), + ERROR(NS_NET_STATUS_RESOLVING_HOST, FAILURE(3)), + ERROR(NS_NET_STATUS_RESOLVED_HOST, FAILURE(11)), + ERROR(NS_NET_STATUS_CONNECTING_TO, FAILURE(7)), + ERROR(NS_NET_STATUS_CONNECTED_TO, FAILURE(4)), + ERROR(NS_NET_STATUS_TLS_HANDSHAKE_STARTING, FAILURE(12)), + ERROR(NS_NET_STATUS_TLS_HANDSHAKE_ENDED, FAILURE(13)), + ERROR(NS_NET_STATUS_SENDING_TO, FAILURE(5)), + ERROR(NS_NET_STATUS_WAITING_FOR, FAILURE(10)), + ERROR(NS_NET_STATUS_RECEIVING_FROM, FAILURE(6)), /* nsIInterceptedChannel */ /* Generic error for non-specific failures during service worker interception */ diff --git a/xpcom/base/nsCrashOnException.cpp b/xpcom/base/nsCrashOnException.cpp index 0f8042531..06c48738f 100644 --- a/xpcom/base/nsCrashOnException.cpp +++ b/xpcom/base/nsCrashOnException.cpp @@ -8,22 +8,11 @@ #include "nsCOMPtr.h" #include "nsServiceManagerUtils.h" -#ifdef MOZ_CRASHREPORTER -#include "nsICrashReporter.h" -#endif - namespace mozilla { static int ReportException(EXCEPTION_POINTERS* aExceptionInfo) { -#ifdef MOZ_CRASHREPORTER - nsCOMPtr<nsICrashReporter> cr = - do_GetService("@mozilla.org/toolkit/crash-reporter;1"); - if (cr) { - cr->WriteMinidumpForException(aExceptionInfo); - } -#endif return EXCEPTION_EXECUTE_HANDLER; } diff --git a/xpcom/base/nsCycleCollector.cpp b/xpcom/base/nsCycleCollector.cpp index ca7057628..b2c15a1dd 100644 --- a/xpcom/base/nsCycleCollector.cpp +++ b/xpcom/base/nsCycleCollector.cpp @@ -188,10 +188,6 @@ #include "mozilla/Telemetry.h" #include "mozilla/ThreadLocal.h" -#ifdef MOZ_CRASHREPORTER -#include "nsExceptionHandler.h" -#endif - using namespace mozilla; //#define COLLECT_TIME_DEBUG @@ -2690,7 +2686,7 @@ public: void* aClosure) const override { const JS::Value& val = aValue->unbarrieredGet(); - if (val.isMarkable() && ValueIsGrayCCThing(val)) { + if (val.isGCThing() && ValueIsGrayCCThing(val)) { MOZ_ASSERT(!js::gc::IsInsideNursery(val.toGCThing())); mCollector->GetJSPurpleBuffer()->mValues.InfallibleAppend(val); } @@ -3150,14 +3146,6 @@ nsCycleCollector::ScanWhiteNodes(bool aFullySynchGraphBuild) } if (pi->mInternalRefs > pi->mRefCount) { -#ifdef MOZ_CRASHREPORTER - const char* piName = "Unknown"; - if (pi->mParticipant) { - piName = pi->mParticipant->ClassName(); - } - nsPrintfCString msg("More references to an object than its refcount, for class %s", piName); - CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("CycleCollector"), msg); -#endif MOZ_CRASH(); } diff --git a/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp b/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp index eb06a389c..7c48002e3 100644 --- a/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp +++ b/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp @@ -36,7 +36,7 @@ void TraceCallbackFunc::Trace(JS::Heap<JS::Value>* aPtr, const char* aName, void* aClosure) const { - if (aPtr->unbarrieredGet().isMarkable()) { + if (aPtr->unbarrieredGet().isGCThing()) { mCallback(JS::GCCellPtr(aPtr->unbarrieredGet()), aName, aClosure); } } diff --git a/xpcom/base/nsDebugImpl.cpp b/xpcom/base/nsDebugImpl.cpp index 36288d203..96487acda 100644 --- a/xpcom/base/nsDebugImpl.cpp +++ b/xpcom/base/nsDebugImpl.cpp @@ -11,9 +11,6 @@ #include "nsDebugImpl.h" #include "nsDebug.h" -#ifdef MOZ_CRASHREPORTER -# include "nsExceptionHandler.h" -#endif #include "nsString.h" #include "nsXULAppAPI.h" #include "prprf.h" @@ -380,22 +377,6 @@ NS_DebugBreak(uint32_t aSeverity, const char* aStr, const char* aExpr, return; case NS_DEBUG_ABORT: { -#if defined(MOZ_CRASHREPORTER) - // Updating crash annotations in the child causes us to do IPC. This can - // really cause trouble if we're asserting from within IPC code. So we - // have to do without the annotations in that case. - if (XRE_IsParentProcess()) { - // Don't include the PID in the crash report annotation to - // allow faceting on crash-stats.mozilla.org. - nsCString note("xpcom_runtime_abort("); - note += nonPIDBuf.buffer; - note += ")"; - CrashReporter::AppendAppNotesToCrashReport(note); - CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("AbortMessage"), - nsDependentCString(nonPIDBuf.buffer)); - } -#endif // MOZ_CRASHREPORTER - #if defined(DEBUG) && defined(_WIN32) RealBreak(); #endif @@ -600,8 +581,5 @@ NS_ErrorAccordingToNSPR() void NS_ABORT_OOM(size_t aSize) { -#if defined(MOZ_CRASHREPORTER) - CrashReporter::AnnotateOOMAllocationSize(aSize); -#endif MOZ_CRASH("OOM"); } diff --git a/xpcom/base/nsObjCExceptions.h b/xpcom/base/nsObjCExceptions.h index e63c92af5..b3ed532ec 100644 --- a/xpcom/base/nsObjCExceptions.h +++ b/xpcom/base/nsObjCExceptions.h @@ -17,12 +17,6 @@ #import <ExceptionHandling/NSExceptionHandler.h> #endif -#if defined(MOZ_CRASHREPORTER) && defined(__cplusplus) -#include "nsICrashReporter.h" -#include "nsCOMPtr.h" -#include "nsServiceManagerUtils.h" -#endif - #include <unistd.h> #include <signal.h> #include "nsError.h" @@ -47,15 +41,6 @@ nsObjCExceptionLog(NSException* aException) NSLog(@"Mozilla has caught an Obj-C exception [%@: %@]", [aException name], [aException reason]); -#if defined(MOZ_CRASHREPORTER) && defined(__cplusplus) - // Attach exception info to the crash report. - nsCOMPtr<nsICrashReporter> crashReporter = - do_GetService("@mozilla.org/toolkit/crash-reporter;1"); - if (crashReporter) { - crashReporter->AppendObjCExceptionInfoToAppNotes(static_cast<void*>(aException)); - } -#endif - #ifdef DEBUG @try { // Try to get stack information out of the exception. 10.5 returns the stack diff --git a/xpcom/build/XPCOMInit.cpp b/xpcom/build/XPCOMInit.cpp index c72ea48d7..6ead5cdc7 100644 --- a/xpcom/build/XPCOMInit.cpp +++ b/xpcom/build/XPCOMInit.cpp @@ -111,7 +111,6 @@ extern nsresult nsStringInputStreamConstructor(nsISupports*, REFNSIID, void**); #include "SpecialSystemDirectory.h" #if defined(XP_WIN) -#include "mozilla/WindowsVersion.h" #include "nsWindowsRegKey.h" #endif @@ -584,8 +583,6 @@ NS_InitXPCOM2(nsIServiceManager** aResult, NS_StartupLocalFile(); - StartupSpecialSystemDirectory(); - nsDirectoryService::RealInit(); bool value; diff --git a/xpcom/build/nsXULAppAPI.h b/xpcom/build/nsXULAppAPI.h index 426a58f06..aae248ca1 100644 --- a/xpcom/build/nsXULAppAPI.h +++ b/xpcom/build/nsXULAppAPI.h @@ -426,17 +426,6 @@ XRE_API(const char*, XRE_API(void, XRE_SetProcessType, (const char* aProcessTypeString)) -#if defined(MOZ_CRASHREPORTER) -// Used in the "master" parent process hosting the crash server -XRE_API(bool, - XRE_TakeMinidumpForChild, (uint32_t aChildPid, nsIFile** aDump, - uint32_t* aSequence)) - -// Used in child processes. -XRE_API(bool, - XRE_SetRemoteExceptionHandler, (const char* aPipe)) -#endif - namespace mozilla { namespace gmp { class GMPLoader; diff --git a/xpcom/glue/nsThreadUtils.cpp b/xpcom/glue/nsThreadUtils.cpp index 287ada7be..2f2383fd8 100644 --- a/xpcom/glue/nsThreadUtils.cpp +++ b/xpcom/glue/nsThreadUtils.cpp @@ -20,15 +20,10 @@ #ifdef XP_WIN #include <windows.h> -#include "mozilla/WindowsVersion.h" -using mozilla::IsVistaOrLater; #elif defined(XP_MACOSX) #include <sys/resource.h> #endif -#include <pratom.h> -#include <prthread.h> - using namespace mozilla; #ifndef XPCOM_GLUE_AVOID_NSPR @@ -443,8 +438,7 @@ nsThreadPoolNaming::SetThreadPoolName(const nsACString& aPoolName, nsAutoLowPriorityIO::nsAutoLowPriorityIO() { #if defined(XP_WIN) - lowIOPrioritySet = IsVistaOrLater() && - SetThreadPriority(GetCurrentThread(), + lowIOPrioritySet = SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN); #elif defined(XP_MACOSX) oldPriority = getiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_THREAD); diff --git a/xpcom/io/SpecialSystemDirectory.cpp b/xpcom/io/SpecialSystemDirectory.cpp index 9ce8eb85b..ab65d38f9 100644 --- a/xpcom/io/SpecialSystemDirectory.cpp +++ b/xpcom/io/SpecialSystemDirectory.cpp @@ -12,7 +12,6 @@ #if defined(XP_WIN) #include <windows.h> -#include <shlobj.h> #include <stdlib.h> #include <stdio.h> #include <string.h> @@ -20,9 +19,6 @@ #include <shlobj.h> #include <knownfolders.h> #include <guiddef.h> -#include "mozilla/WindowsVersion.h" - -using mozilla::IsWin7OrLater; #elif defined(XP_UNIX) @@ -51,40 +47,17 @@ using mozilla::IsWin7OrLater; #endif #endif -#ifdef XP_WIN -typedef HRESULT (WINAPI* nsGetKnownFolderPath)(GUID& rfid, - DWORD dwFlags, - HANDLE hToken, - PWSTR* ppszPath); - -static nsGetKnownFolderPath gGetKnownFolderPath = nullptr; -#endif - -void -StartupSpecialSystemDirectory() -{ -#if defined (XP_WIN) - // SHGetKnownFolderPath is only available on Windows Vista - // so that we need to use GetProcAddress to get the pointer. - HMODULE hShell32DLLInst = GetModuleHandleW(L"shell32.dll"); - if (hShell32DLLInst) { - gGetKnownFolderPath = (nsGetKnownFolderPath) - GetProcAddress(hShell32DLLInst, "SHGetKnownFolderPath"); - } -#endif -} - #if defined (XP_WIN) static nsresult GetKnownFolder(GUID* aGuid, nsIFile** aFile) { - if (!aGuid || !gGetKnownFolderPath) { + if (!aGuid) { return NS_ERROR_FAILURE; } PWSTR path = nullptr; - gGetKnownFolderPath(*aGuid, 0, nullptr, &path); + SHGetKnownFolderPath(*aGuid, 0, nullptr, &path); if (!path) { return NS_ERROR_FAILURE; @@ -139,19 +112,13 @@ SHLoadLibraryFromKnownFolder(REFKNOWNFOLDERID aFolderId, DWORD aMode, } /* - * Check to see if we're on Win7 and up, and if so, returns the default - * save-to location for the Windows Library passed in through aFolderId. - * Otherwise falls back on pre-win7 GetWindowsFolder. + * Return the default save-to location for the Windows Library passed in + * through aFolderId. */ static nsresult GetLibrarySaveToPath(int aFallbackFolderId, REFKNOWNFOLDERID aFolderId, nsIFile** aFile) { - // Skip off checking for library support if the os is Vista or lower. - if (!IsWin7OrLater()) { - return GetWindowsFolder(aFallbackFolderId, aFile); - } - RefPtr<IShellLibrary> shellLib; RefPtr<IShellItem> savePath; HRESULT hr = @@ -740,8 +707,6 @@ GetSpecialSystemDirectory(SystemDirectories aSystemSystemDirectory, } #if defined(MOZ_CONTENT_SANDBOX) case Win_LocalAppdataLow: { - // This should only really fail on versions pre-Vista, in which case this - // shouldn't have been used in the first place. GUID localAppDataLowGuid = FOLDERID_LocalAppDataLow; return GetKnownFolder(&localAppDataLowGuid, aFile); } diff --git a/xpcom/io/SpecialSystemDirectory.h b/xpcom/io/SpecialSystemDirectory.h index dd3d88379..7c7f8fa42 100644 --- a/xpcom/io/SpecialSystemDirectory.h +++ b/xpcom/io/SpecialSystemDirectory.h @@ -16,9 +16,6 @@ #include "prenv.h" #endif -extern void StartupSpecialSystemDirectory(); - - enum SystemDirectories { OS_DriveDirectory = 1, OS_TemporaryDirectory = 2, diff --git a/xpcom/io/nsLocalFileWin.cpp b/xpcom/io/nsLocalFileWin.cpp index 3a7e570f5..66e267807 100644 --- a/xpcom/io/nsLocalFileWin.cpp +++ b/xpcom/io/nsLocalFileWin.cpp @@ -7,7 +7,6 @@ #include "mozilla/ArrayUtils.h" #include "mozilla/DebugOnly.h" #include "mozilla/UniquePtrExtensions.h" -#include "mozilla/WindowsVersion.h" #include "nsCOMPtr.h" #include "nsAutoPtr.h" @@ -1970,13 +1969,11 @@ nsLocalFile::CopySingleFile(nsIFile* aSourceFile, nsIFile* aDestParent, // So we only use COPY_FILE_NO_BUFFERING when we have a remote drive. int copyOK; DWORD dwCopyFlags = COPY_FILE_ALLOW_DECRYPTED_DESTINATION; - if (IsVistaOrLater()) { - bool path1Remote, path2Remote; - if (!IsRemoteFilePath(filePath.get(), path1Remote) || - !IsRemoteFilePath(destPath.get(), path2Remote) || - path1Remote || path2Remote) { - dwCopyFlags |= COPY_FILE_NO_BUFFERING; - } + bool path1Remote, path2Remote; + if (!IsRemoteFilePath(filePath.get(), path1Remote) || + !IsRemoteFilePath(destPath.get(), path2Remote) || + path1Remote || path2Remote) { + dwCopyFlags |= COPY_FILE_NO_BUFFERING; } if (!move) { diff --git a/xpcom/moz.build b/xpcom/moz.build index 45a83c5c8..fe94edfce 100644 --- a/xpcom/moz.build +++ b/xpcom/moz.build @@ -31,7 +31,6 @@ if CONFIG['OS_ARCH'] == 'WINNT' and CONFIG['MOZ_DEBUG']: TEST_DIRS += [ 'tests', - 'rust/nsstring/gtest', ] # Can't build internal xptcall tests that use symbols which are not exported. diff --git a/xpcom/rust/nsstring/Cargo.toml b/xpcom/rust/nsstring/Cargo.toml deleted file mode 100644 index d86a1ad26..000000000 --- a/xpcom/rust/nsstring/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[package] -name = "nsstring" -version = "0.1.0" -authors = ["nobody@mozilla.com"] -license = "MPL-2.0" -description = "Rust bindings to xpcom string types" - -[dependencies] diff --git a/xpcom/rust/nsstring/gtest/Cargo.toml b/xpcom/rust/nsstring/gtest/Cargo.toml deleted file mode 100644 index 44897ec98..000000000 --- a/xpcom/rust/nsstring/gtest/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "nsstring-gtest" -version = "0.1.0" -authors = ["nobody@mozilla.com"] -license = "MPL-2.0" -description = "Tests for rust bindings to xpcom string types" - -[dependencies] -nsstring = { path = "../" } - -[lib] -path = "test.rs" diff --git a/xpcom/rust/nsstring/gtest/Test.cpp b/xpcom/rust/nsstring/gtest/Test.cpp deleted file mode 100644 index 93d2ee1d7..000000000 --- a/xpcom/rust/nsstring/gtest/Test.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include "gtest/gtest.h" -#include <stdint.h> -#include "nsString.h" - -extern "C" { - // This function is called by the rust code in test.rs if a non-fatal test - // failure occurs. - void GTest_ExpectFailure(const char* aMessage) { - EXPECT_STREQ(aMessage, ""); - } -} - -#define SIZE_ALIGN_CHECK(Clazz) \ - extern "C" void Rust_Test_ReprSizeAlign_##Clazz(size_t* size, size_t* align); \ - TEST(RustNsString, ReprSizeAlign_##Clazz) { \ - size_t size, align; \ - Rust_Test_ReprSizeAlign_##Clazz(&size, &align); \ - EXPECT_EQ(size, sizeof(Clazz)); \ - EXPECT_EQ(align, alignof(Clazz)); \ - } - -SIZE_ALIGN_CHECK(nsString) -SIZE_ALIGN_CHECK(nsCString) -SIZE_ALIGN_CHECK(nsFixedString) -SIZE_ALIGN_CHECK(nsFixedCString) - -#define MEMBER_CHECK(Clazz, Member) \ - extern "C" void Rust_Test_Member_##Clazz##_##Member(size_t* size, \ - size_t* align, \ - size_t* offset); \ - TEST(RustNsString, ReprMember_##Clazz##_##Member) { \ - class Hack : public Clazz { \ - public: \ - static void RunTest() { \ - size_t size, align, offset; \ - Rust_Test_Member_##Clazz##_##Member(&size, &align, &offset); \ - EXPECT_EQ(size, sizeof(mozilla::DeclVal<Hack>().Member)); \ - EXPECT_EQ(size, alignof(decltype(mozilla::DeclVal<Hack>().Member))); \ - EXPECT_EQ(offset, offsetof(Hack, Member)); \ - } \ - }; \ - static_assert(sizeof(Clazz) == sizeof(Hack), "Hack matches class"); \ - Hack::RunTest(); \ - } - -MEMBER_CHECK(nsString, mData) -MEMBER_CHECK(nsString, mLength) -MEMBER_CHECK(nsString, mFlags) -MEMBER_CHECK(nsCString, mData) -MEMBER_CHECK(nsCString, mLength) -MEMBER_CHECK(nsCString, mFlags) -MEMBER_CHECK(nsFixedString, mFixedCapacity) -MEMBER_CHECK(nsFixedString, mFixedBuf) -MEMBER_CHECK(nsFixedCString, mFixedCapacity) -MEMBER_CHECK(nsFixedCString, mFixedBuf) - -extern "C" void Rust_Test_NsStringFlags(uint32_t* f_none, - uint32_t* f_terminated, - uint32_t* f_voided, - uint32_t* f_shared, - uint32_t* f_owned, - uint32_t* f_fixed, - uint32_t* f_literal, - uint32_t* f_class_fixed); -TEST(RustNsString, NsStringFlags) { - uint32_t f_none, f_terminated, f_voided, f_shared, f_owned, f_fixed, f_literal, f_class_fixed; - Rust_Test_NsStringFlags(&f_none, &f_terminated, - &f_voided, &f_shared, - &f_owned, &f_fixed, - &f_literal, &f_class_fixed); - EXPECT_EQ(f_none, nsAString::F_NONE); - EXPECT_EQ(f_none, nsACString::F_NONE); - EXPECT_EQ(f_terminated, nsAString::F_TERMINATED); - EXPECT_EQ(f_terminated, nsACString::F_TERMINATED); - EXPECT_EQ(f_voided, nsAString::F_VOIDED); - EXPECT_EQ(f_voided, nsACString::F_VOIDED); - EXPECT_EQ(f_shared, nsAString::F_SHARED); - EXPECT_EQ(f_shared, nsACString::F_SHARED); - EXPECT_EQ(f_owned, nsAString::F_OWNED); - EXPECT_EQ(f_owned, nsACString::F_OWNED); - EXPECT_EQ(f_fixed, nsAString::F_FIXED); - EXPECT_EQ(f_fixed, nsACString::F_FIXED); - EXPECT_EQ(f_literal, nsAString::F_LITERAL); - EXPECT_EQ(f_literal, nsACString::F_LITERAL); - EXPECT_EQ(f_class_fixed, nsAString::F_CLASS_FIXED); - EXPECT_EQ(f_class_fixed, nsACString::F_CLASS_FIXED); -} - -extern "C" void Rust_StringFromCpp(const nsACString* aCStr, const nsAString* aStr); -TEST(RustNsString, StringFromCpp) { - nsAutoCString foo; - foo.AssignASCII("Hello, World!"); - - nsAutoString bar; - bar.AssignASCII("Hello, World!"); - - Rust_StringFromCpp(&foo, &bar); -} - -extern "C" void Rust_AssignFromRust(nsACString* aCStr, nsAString* aStr); -TEST(RustNsString, AssignFromRust) { - nsAutoCString cs; - nsAutoString s; - Rust_AssignFromRust(&cs, &s); - EXPECT_TRUE(cs.EqualsASCII("Hello, World!")); - EXPECT_TRUE(s.EqualsASCII("Hello, World!")); -} - -extern "C" { - void Cpp_AssignFromCpp(nsACString* aCStr, nsAString* aStr) { - aCStr->AssignASCII("Hello, World!"); - aStr->AssignASCII("Hello, World!"); - } -} -extern "C" void Rust_AssignFromCpp(); -TEST(RustNsString, AssignFromCpp) { - Rust_AssignFromCpp(); -} -extern "C" void Rust_FixedAssignFromCpp(); -TEST(RustNsString, FixedAssignFromCpp) { - Rust_FixedAssignFromCpp(); -} -extern "C" void Rust_AutoAssignFromCpp(); -TEST(RustNsString, AutoAssignFromCpp) { - Rust_AutoAssignFromCpp(); -} - -extern "C" void Rust_StringWrite(); -TEST(RustNsString, StringWrite) { - Rust_StringWrite(); -} diff --git a/xpcom/rust/nsstring/gtest/moz.build b/xpcom/rust/nsstring/gtest/moz.build deleted file mode 100644 index 5bed9e57e..000000000 --- a/xpcom/rust/nsstring/gtest/moz.build +++ /dev/null @@ -1,12 +0,0 @@ -# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- -# vim: set filetype=python: -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -if CONFIG['MOZ_RUST']: - UNIFIED_SOURCES += [ - 'Test.cpp' - ] - -FINAL_LIBRARY = 'xul-gtest' diff --git a/xpcom/rust/nsstring/gtest/test.rs b/xpcom/rust/nsstring/gtest/test.rs deleted file mode 100644 index 2968a1be7..000000000 --- a/xpcom/rust/nsstring/gtest/test.rs +++ /dev/null @@ -1,112 +0,0 @@ -#![allow(non_snake_case)] - -#[macro_use] -extern crate nsstring; - -use std::fmt::Write; -use std::ffi::CString; -use std::os::raw::c_char; -use nsstring::*; - -fn nonfatal_fail(msg: String) { - extern "C" { - fn GTest_ExpectFailure(message: *const c_char); - } - unsafe { - GTest_ExpectFailure(CString::new(msg).unwrap().as_ptr()); - } -} - -/// This macro checks if the two arguments are equal, and causes a non-fatal -/// GTest test failure if they are not. -macro_rules! expect_eq { - ($x:expr, $y:expr) => { - match (&$x, &$y) { - (x, y) => if *x != *y { - nonfatal_fail(format!("check failed: (`{:?}` == `{:?}`) at {}:{}", - x, y, file!(), line!())) - } - } - } -} - -#[no_mangle] -pub extern fn Rust_StringFromCpp(cs: *const nsACString, s: *const nsAString) { - unsafe { - expect_eq!(&*cs, "Hello, World!"); - expect_eq!(&*s, "Hello, World!"); - } -} - -#[no_mangle] -pub extern fn Rust_AssignFromRust(cs: *mut nsACString, s: *mut nsAString) { - unsafe { - (*cs).assign(&nsCString::from("Hello, World!")); - expect_eq!(&*cs, "Hello, World!"); - (*s).assign(&nsString::from("Hello, World!")); - expect_eq!(&*s, "Hello, World!"); - } -} - -extern "C" { - fn Cpp_AssignFromCpp(cs: *mut nsACString, s: *mut nsAString); -} - -#[no_mangle] -pub extern fn Rust_AssignFromCpp() { - let mut cs = nsCString::new(); - let mut s = nsString::new(); - unsafe { - Cpp_AssignFromCpp(&mut *cs, &mut *s); - } - expect_eq!(cs, "Hello, World!"); - expect_eq!(s, "Hello, World!"); -} - -#[no_mangle] -pub extern fn Rust_FixedAssignFromCpp() { - let mut cs_buf: [u8; 64] = [0; 64]; - let cs_buf_ptr = &cs_buf as *const _ as usize; - let mut s_buf: [u16; 64] = [0; 64]; - let s_buf_ptr = &s_buf as *const _ as usize; - let mut cs = nsFixedCString::new(&mut cs_buf); - let mut s = nsFixedString::new(&mut s_buf); - unsafe { - Cpp_AssignFromCpp(&mut *cs, &mut *s); - } - expect_eq!(cs, "Hello, World!"); - expect_eq!(s, "Hello, World!"); - expect_eq!(cs.as_ptr() as usize, cs_buf_ptr); - expect_eq!(s.as_ptr() as usize, s_buf_ptr); -} - -#[no_mangle] -pub extern fn Rust_AutoAssignFromCpp() { - ns_auto_cstring!(cs); - ns_auto_string!(s); - unsafe { - Cpp_AssignFromCpp(&mut *cs, &mut *s); - } - expect_eq!(cs, "Hello, World!"); - expect_eq!(s, "Hello, World!"); -} - -#[no_mangle] -pub extern fn Rust_StringWrite() { - ns_auto_cstring!(cs); - ns_auto_string!(s); - - write!(s, "a").unwrap(); - write!(cs, "a").unwrap(); - expect_eq!(s, "a"); - expect_eq!(cs, "a"); - write!(s, "bc").unwrap(); - write!(cs, "bc").unwrap(); - expect_eq!(s, "abc"); - expect_eq!(cs, "abc"); - write!(s, "{}", 123).unwrap(); - write!(cs, "{}", 123).unwrap(); - expect_eq!(s, "abc123"); - expect_eq!(cs, "abc123"); -} - diff --git a/xpcom/rust/nsstring/src/lib.rs b/xpcom/rust/nsstring/src/lib.rs deleted file mode 100644 index cd518f3c5..000000000 --- a/xpcom/rust/nsstring/src/lib.rs +++ /dev/null @@ -1,853 +0,0 @@ -//! This module provides rust bindings for the XPCOM string types. -//! -//! # TL;DR (what types should I use) -//! -//! Use `&{mut,} nsA[C]String` for functions in rust which wish to take or -//! mutate XPCOM strings. The other string types `Deref` to this type. -//! -//! Use `ns[C]String<'a>` for string struct members which don't leave rust, and -//! as an intermediate between rust string data structures (such as `String`, -//! `Vec<u16>`, `&str`, and `&[u16]`) and `&{mut,} nsA[C]String` (using -//! `ns[C]String::from(value)`). These conversions, when possible, will not -//! perform any allocations. -//! -//! Use `nsFixed[C]String` or `ns_auto_[c]string!` for dynamic stack allocated -//! strings which are expected to hold short string values. -//! -//! Use `*{const,mut} nsA[C]String` (`{const,} nsA[C]String*` in C++) for -//! function arguments passed across the rust/C++ language boundary. -//! -//! Use `ns[C]StringRepr` for string struct members which are shared between -//! rust and C++, but be careful, because this type lacks a `Drop` -//! implementation. -//! -//! # String Types -//! -//! ## `nsA[C]String` -//! -//! The core types in this module are `nsAString` and `nsACString`. These types -//! are zero-sized as far as rust is concerned, and are safe to pass around -//! behind both references (in rust code), and pointers (in C++ code). They -//! represent a handle to a XPCOM string which holds either `u16` or `u8` -//! characters respectively. The backing character buffer is guaranteed to live -//! as long as the reference to the `nsAString` or `nsACString`. -//! -//! These types in rust are simply used as dummy types. References to them -//! represent a pointer to the beginning of a variable-sized `#[repr(C)]` struct -//! which is common between both C++ and Rust implementations. In C++, their -//! corresponding types are also named `nsAString` or `nsACString`, and they are -//! defined within the `nsTSubstring.{cpp,h}` file. -//! -//! ### Valid Operations -//! -//! An `&nsA[C]String` acts like rust's `&str`, in that it is a borrowed -//! reference to the backing data. When used as an argument to other functions -//! on `&mut nsA[C]String`, optimizations can be performed to avoid copying -//! buffers, as information about the backing storage is preserved. -//! -//! An `&mut nsA[C]String` acts like rust's `&mut Cow<str>`, in that it is a -//! mutable reference to a potentially borrowed string, which when modified will -//! ensure that it owns its own backing storage. This type can be appended to -//! with the methods `.append`, `.append_utf{8,16}`, and with the `write!` -//! macro, and can be assigned to with `.assign`. -//! -//! ## `ns[C]String<'a>` -//! -//! This type is an maybe-owned string type. It acts similarially to a -//! `Cow<[{u8,u16}]>`. This type provides `Deref` and `DerefMut` implementations -//! to `nsA[C]String`, which provides the methods for manipulating this type. -//! This type's lifetime parameter, `'a`, represents the lifetime of the backing -//! storage. When modified this type may re-allocate in order to ensure that it -//! does not mutate its backing storage. -//! -//! `ns[C]String`s can be constructed either with `ns[C]String::new()`, which -//! creates an empty `ns[C]String<'static>`, or through one of the provided -//! `From` implementations. Both string types may be constructed `From<&'a -//! str>`, with `nsCString` having a `'a` lifetime, as the storage is shared -//! with the `str`, while `nsString` has a `'static` lifetime, as its storage -//! has to be transcoded. -//! -//! When passing this type by reference, prefer passing a `&nsA[C]String` or -//! `&mut nsA[C]String`. to passing this type. -//! -//! This type is _not_ `#[repr(C)]`, as it has a `Drop` impl, which in versions -//! of `rustc < 1.13` adds drop flags to the struct, which messes up the layout, -//! making it unsafe to pass across the FFI boundary. The rust compiler will -//! warn if this type appears in `extern "C"` function definitions. -//! -//! When passing this type across the language boundary, pass it as `*const -//! nsA[C]String` for an immutable reference, or `*mut nsA[C]String` for a -//! mutable reference. -//! -//! This type is similar to the C++ type of the same name. -//! -//! ## `nsFixed[C]String<'a>` -//! -//! This type is a string type with fixed backing storage. It is created with -//! `nsFixed[C]String::new(buffer)`, passing a mutable reference to a buffer as -//! the argument. This buffer will be used as backing storage whenever the -//! resulting string will fit within it, falling back to heap allocations only -//! when the string size exceeds that of the backing buffer. -//! -//! Like `ns[C]String`, this type dereferences to `nsA[C]String` which provides -//! the methods for manipulating the type, and is not `#[repr(C)]`. -//! -//! When passing this type by reference, prefer passing a `&nsA[C]String` or -//! `&mut nsA[C]String`. to passing this type. -//! -//! This type is _not_ `#[repr(C)]`, as it has a `Drop` impl, which in versions -//! of `rustc < 1.13` adds drop flags to the struct, which messes up the layout, -//! making it unsafe to pass across the FFI boundary. The rust compiler will -//! warn if this type appears in `extern "C"` function definitions. -//! -//! When passing this type across the language boundary, pass it as `*const -//! nsA[C]String` for an immutable reference, or `*mut nsA[C]String` for a -//! mutable reference. -//! -//! This type is similar to the C++ type of the same name. -//! -//! ## `ns_auto_[c]string!($name)` -//! -//! This is a helper macro which defines a fixed size, (currently 64 character), -//! backing array on the stack, and defines a local variable with name `$name` -//! which is a `nsFixed[C]String` using this buffer as its backing storage. -//! -//! Usage of this macro is similar to the C++ type `nsAuto[C]String`, but could -//! not be implemented as a basic type due to the differences between rust and -//! C++'s move semantics. -//! -//! ## `ns[C]StringRepr` -//! -//! This type represents a C++ `ns[C]String`. This type is `#[repr(C)]` and is -//! safe to use in struct definitions which are shared across the language -//! boundary. It automatically dereferences to `&{mut,} nsA[C]String`, and thus -//! can be treated similarially to `ns[C]String`. -//! -//! If this type is dropped in rust, it will not free its backing storage. This -//! is because types implementing `Drop` have a drop flag added, which messes up -//! the layout of this type. When drop flags are removed, which should happen in -//! `rustc 1.13` (see rust-lang/rust#35764), this type will likely be removed, -//! and replaced with direct usage of `ns[C]String<'a>`, as its layout may be -//! identical. This module provides rust bindings to our xpcom ns[C]String -//! types. - -#![allow(non_camel_case_types)] - -use std::ops::{Deref, DerefMut}; -use std::marker::PhantomData; -use std::slice; -use std::ptr; -use std::mem; -use std::fmt; -use std::cmp; -use std::str; -use std::u32; - -////////////////////////////////// -// Internal Implemenation Flags // -////////////////////////////////// - -const F_NONE: u32 = 0; // no flags - -// data flags are in the lower 16-bits -const F_TERMINATED: u32 = 1 << 0; // IsTerminated returns true -const F_VOIDED: u32 = 1 << 1; // IsVoid returns true -const F_SHARED: u32 = 1 << 2; // mData points to a heap-allocated, shared buffer -const F_OWNED: u32 = 1 << 3; // mData points to a heap-allocated, raw buffer -const F_FIXED: u32 = 1 << 4; // mData points to a fixed-size writable, dependent buffer -const F_LITERAL: u32 = 1 << 5; // mData points to a string literal; F_TERMINATED will also be set - -// class flags are in the upper 16-bits -const F_CLASS_FIXED: u32 = 1 << 16; // indicates that |this| is of type nsTFixedString - -//////////////////////////////////// -// Generic String Bindings Macros // -//////////////////////////////////// - -macro_rules! define_string_types { - { - char_t = $char_t: ty; - AString = $AString: ident; - String = $String: ident; - FixedString = $FixedString: ident; - - StringRepr = $StringRepr: ident; - FixedStringRepr = $FixedStringRepr: ident; - AutoStringRepr = $AutoStringRepr: ident; - } => { - /// The representation of a ns[C]String type in C++. This type is - /// used internally by our definition of ns[C]String to ensure layout - /// compatibility with the C++ ns[C]String type. - /// - /// This type may also be used in place of a C++ ns[C]String inside of - /// struct definitions which are shared with C++, as it has identical - /// layout to our ns[C]String type. Due to drop flags, our ns[C]String - /// type does not have identical layout. When drop flags are removed, - /// this type will likely be made a private implementation detail, and - /// its uses will be replaced with `ns[C]String`. - /// - /// This struct will leak its data if dropped from rust. See the module - /// documentation for more information on this type. - #[repr(C)] - pub struct $StringRepr { - data: *const $char_t, - length: u32, - flags: u32, - } - - impl Deref for $StringRepr { - type Target = $AString; - fn deref(&self) -> &$AString { - unsafe { - mem::transmute(self) - } - } - } - - impl DerefMut for $StringRepr { - fn deref_mut(&mut self) -> &mut $AString { - unsafe { - mem::transmute(self) - } - } - } - - /// The representation of a nsFixed[C]String type in C++. This type is - /// used internally by our definition of nsFixed[C]String to ensure layout - /// compatibility with the C++ nsFixed[C]String type. - #[repr(C)] - struct $FixedStringRepr { - base: $StringRepr, - capacity: u32, - buffer: *mut $char_t, - } - - /// This type is the abstract type which is used for interacting with - /// strings in rust. Each string type can derefence to an instance of - /// this type, which provides the useful operations on strings. - /// - /// NOTE: Rust thinks this type has a size of 0, because the data - /// associated with it is not necessarially safe to move. It is not safe - /// to construct a nsAString yourself, unless it is received by - /// dereferencing one of these types. - /// - /// NOTE: The `[u8; 0]` member is zero sized, and only exists to prevent - /// the construction by code outside of this module. It is used instead - /// of a private `()` member because the `improper_ctypes` lint complains - /// about some ZST members in `extern "C"` function declarations. - #[repr(C)] - pub struct $AString { - _prohibit_constructor: [u8; 0], - } - - impl Deref for $AString { - type Target = [$char_t]; - fn deref(&self) -> &[$char_t] { - unsafe { - // This is legal, as all $AString values actually point to a - // $StringRepr - let this: &$StringRepr = mem::transmute(self); - if this.data.is_null() { - debug_assert!(this.length == 0); - // Use an arbitrary non-null value as the pointer - slice::from_raw_parts(0x1 as *const $char_t, 0) - } else { - slice::from_raw_parts(this.data, this.length as usize) - } - } - } - } - - impl cmp::PartialEq for $AString { - fn eq(&self, other: &$AString) -> bool { - &self[..] == &other[..] - } - } - - impl cmp::PartialEq<[$char_t]> for $AString { - fn eq(&self, other: &[$char_t]) -> bool { - &self[..] == other - } - } - - impl<'a> cmp::PartialEq<$String<'a>> for $AString { - fn eq(&self, other: &$String<'a>) -> bool { - self.eq(&**other) - } - } - - impl<'a> cmp::PartialEq<$FixedString<'a>> for $AString { - fn eq(&self, other: &$FixedString<'a>) -> bool { - self.eq(&**other) - } - } - - pub struct $String<'a> { - hdr: $StringRepr, - _marker: PhantomData<&'a [$char_t]>, - } - - impl $String<'static> { - pub fn new() -> $String<'static> { - $String { - hdr: $StringRepr { - data: ptr::null(), - length: 0, - flags: F_NONE, - }, - _marker: PhantomData, - } - } - } - - impl<'a> Deref for $String<'a> { - type Target = $AString; - fn deref(&self) -> &$AString { - &self.hdr - } - } - - impl<'a> DerefMut for $String<'a> { - fn deref_mut(&mut self) -> &mut $AString { - &mut self.hdr - } - } - - impl<'a> From<&'a String> for $String<'a> { - fn from(s: &'a String) -> $String<'a> { - $String::from(&s[..]) - } - } - - impl<'a> From<&'a Vec<$char_t>> for $String<'a> { - fn from(s: &'a Vec<$char_t>) -> $String<'a> { - $String::from(&s[..]) - } - } - - impl<'a> From<&'a [$char_t]> for $String<'a> { - fn from(s: &'a [$char_t]) -> $String<'a> { - assert!(s.len() < (u32::MAX as usize)); - $String { - hdr: $StringRepr { - data: s.as_ptr(), - length: s.len() as u32, - flags: F_NONE, - }, - _marker: PhantomData, - } - } - } - - impl From<Box<[$char_t]>> for $String<'static> { - fn from(s: Box<[$char_t]>) -> $String<'static> { - assert!(s.len() < (u32::MAX as usize)); - // SAFETY NOTE: This method produces an F_OWNED ns[C]String from - // a Box<[$char_t]>. this is only safe because in the Gecko - // tree, we use the same allocator for Rust code as for C++ - // code, meaning that our box can be legally freed with - // libc::free(). - let length = s.len() as u32; - let ptr = s.as_ptr(); - mem::forget(s); - $String { - hdr: $StringRepr { - data: ptr, - length: length, - flags: F_OWNED, - }, - _marker: PhantomData, - } - } - } - - impl From<Vec<$char_t>> for $String<'static> { - fn from(s: Vec<$char_t>) -> $String<'static> { - s.into_boxed_slice().into() - } - } - - impl<'a> From<&'a $AString> for $String<'static> { - fn from(s: &'a $AString) -> $String<'static> { - let mut string = $String::new(); - string.assign(s); - string - } - } - - impl<'a> fmt::Write for $String<'a> { - fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> { - $AString::write_str(self, s) - } - } - - impl<'a> fmt::Display for $String<'a> { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - <$AString as fmt::Display>::fmt(self, f) - } - } - - impl<'a> fmt::Debug for $String<'a> { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - <$AString as fmt::Debug>::fmt(self, f) - } - } - - impl<'a> cmp::PartialEq for $String<'a> { - fn eq(&self, other: &$String<'a>) -> bool { - $AString::eq(self, other) - } - } - - impl<'a> cmp::PartialEq<[$char_t]> for $String<'a> { - fn eq(&self, other: &[$char_t]) -> bool { - $AString::eq(self, other) - } - } - - impl<'a, 'b> cmp::PartialEq<&'b [$char_t]> for $String<'a> { - fn eq(&self, other: &&'b [$char_t]) -> bool { - $AString::eq(self, *other) - } - } - - impl<'a> cmp::PartialEq<str> for $String<'a> { - fn eq(&self, other: &str) -> bool { - $AString::eq(self, other) - } - } - - impl<'a, 'b> cmp::PartialEq<&'b str> for $String<'a> { - fn eq(&self, other: &&'b str) -> bool { - $AString::eq(self, *other) - } - } - - impl<'a> Drop for $String<'a> { - fn drop(&mut self) { - unsafe { - self.finalize(); - } - } - } - - /// A nsFixed[C]String is a string which uses a fixed size mutable - /// backing buffer for storing strings which will fit within that - /// buffer, rather than using heap allocations. - pub struct $FixedString<'a> { - hdr: $FixedStringRepr, - _marker: PhantomData<&'a mut [$char_t]>, - } - - impl<'a> $FixedString<'a> { - pub fn new(buf: &'a mut [$char_t]) -> $FixedString<'a> { - let len = buf.len(); - assert!(len < (u32::MAX as usize)); - let buf_ptr = buf.as_mut_ptr(); - $FixedString { - hdr: $FixedStringRepr { - base: $StringRepr { - data: ptr::null(), - length: 0, - flags: F_CLASS_FIXED, - }, - capacity: len as u32, - buffer: buf_ptr, - }, - _marker: PhantomData, - } - } - } - - impl<'a> Deref for $FixedString<'a> { - type Target = $AString; - fn deref(&self) -> &$AString { - &self.hdr.base - } - } - - impl<'a> DerefMut for $FixedString<'a> { - fn deref_mut(&mut self) -> &mut $AString { - &mut self.hdr.base - } - } - - impl<'a> fmt::Write for $FixedString<'a> { - fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> { - $AString::write_str(self, s) - } - } - - impl<'a> fmt::Display for $FixedString<'a> { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - <$AString as fmt::Display>::fmt(self, f) - } - } - - impl<'a> fmt::Debug for $FixedString<'a> { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - <$AString as fmt::Debug>::fmt(self, f) - } - } - - impl<'a> cmp::PartialEq for $FixedString<'a> { - fn eq(&self, other: &$FixedString<'a>) -> bool { - $AString::eq(self, other) - } - } - - impl<'a> cmp::PartialEq<[$char_t]> for $FixedString<'a> { - fn eq(&self, other: &[$char_t]) -> bool { - $AString::eq(self, other) - } - } - - impl<'a, 'b> cmp::PartialEq<&'b [$char_t]> for $FixedString<'a> { - fn eq(&self, other: &&'b [$char_t]) -> bool { - $AString::eq(self, *other) - } - } - - impl<'a> cmp::PartialEq<str> for $FixedString<'a> { - fn eq(&self, other: &str) -> bool { - $AString::eq(self, other) - } - } - - impl<'a, 'b> cmp::PartialEq<&'b str> for $FixedString<'a> { - fn eq(&self, other: &&'b str) -> bool { - $AString::eq(self, *other) - } - } - - impl<'a> Drop for $FixedString<'a> { - fn drop(&mut self) { - unsafe { - self.finalize(); - } - } - } - } -} - -/////////////////////////////////////////// -// Bindings for nsCString (u8 char type) // -/////////////////////////////////////////// - -define_string_types! { - char_t = u8; - - AString = nsACString; - String = nsCString; - FixedString = nsFixedCString; - - StringRepr = nsCStringRepr; - FixedStringRepr = nsFixedCStringRepr; - AutoStringRepr = nsAutoCStringRepr; -} - -impl nsACString { - /// Leaves the nsACString in an unstable state with a dangling data pointer. - /// Should only be used in drop implementations of rust types which wrap - /// this type. - unsafe fn finalize(&mut self) { - Gecko_FinalizeCString(self); - } - - pub fn assign(&mut self, other: &nsACString) { - unsafe { - Gecko_AssignCString(self as *mut _, other as *const _); - } - } - - pub fn assign_utf16(&mut self, other: &nsAString) { - self.assign(&nsCString::new()); - self.append_utf16(other); - } - - pub fn append(&mut self, other: &nsACString) { - unsafe { - Gecko_AppendCString(self as *mut _, other as *const _); - } - } - - pub fn append_utf16(&mut self, other: &nsAString) { - unsafe { - Gecko_AppendUTF16toCString(self as *mut _, other as *const _); - } - } - - pub unsafe fn as_str_unchecked(&self) -> &str { - str::from_utf8_unchecked(self) - } -} - -impl<'a> From<&'a str> for nsCString<'a> { - fn from(s: &'a str) -> nsCString<'a> { - s.as_bytes().into() - } -} - -impl From<Box<str>> for nsCString<'static> { - fn from(s: Box<str>) -> nsCString<'static> { - s.into_string().into() - } -} - -impl From<String> for nsCString<'static> { - fn from(s: String) -> nsCString<'static> { - s.into_bytes().into() - } -} - -// Support for the write!() macro for appending to nsACStrings -impl fmt::Write for nsACString { - fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> { - self.append(&nsCString::from(s)); - Ok(()) - } -} - -impl fmt::Display for nsACString { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - fmt::Display::fmt(&String::from_utf8_lossy(&self[..]), f) - } -} - -impl fmt::Debug for nsACString { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - fmt::Debug::fmt(&String::from_utf8_lossy(&self[..]), f) - } -} - -impl cmp::PartialEq<str> for nsACString { - fn eq(&self, other: &str) -> bool { - &self[..] == other.as_bytes() - } -} - -#[macro_export] -macro_rules! ns_auto_cstring { - ($name:ident) => { - let mut buf: [u8; 64] = [0; 64]; - let mut $name = $crate::nsFixedCString::new(&mut buf); - } -} - -/////////////////////////////////////////// -// Bindings for nsString (u16 char type) // -/////////////////////////////////////////// - -define_string_types! { - char_t = u16; - - AString = nsAString; - String = nsString; - FixedString = nsFixedString; - - StringRepr = nsStringRepr; - FixedStringRepr = nsFixedStringRepr; - AutoStringRepr = nsAutoStringRepr; -} - -impl nsAString { - /// Leaves the nsAString in an unstable state with a dangling data pointer. - /// Should only be used in drop implementations of rust types which wrap - /// this type. - unsafe fn finalize(&mut self) { - Gecko_FinalizeString(self); - } - - pub fn assign(&mut self, other: &nsAString) { - unsafe { - Gecko_AssignString(self as *mut _, other as *const _); - } - } - - pub fn assign_utf8(&mut self, other: &nsACString) { - self.assign(&nsString::new()); - self.append_utf8(other); - } - - pub fn append(&mut self, other: &nsAString) { - unsafe { - Gecko_AppendString(self as *mut _, other as *const _); - } - } - - pub fn append_utf8(&mut self, other: &nsACString) { - unsafe { - Gecko_AppendUTF8toString(self as *mut _, other as *const _); - } - } -} - -// NOTE: The From impl for a string slice for nsString produces a <'static> -// lifetime, as it allocates. -impl<'a> From<&'a str> for nsString<'static> { - fn from(s: &'a str) -> nsString<'static> { - s.encode_utf16().collect::<Vec<u16>>().into() - } -} - -// Support for the write!() macro for writing to nsStrings -impl fmt::Write for nsAString { - fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> { - // Directly invoke gecko's routines for appending utf8 strings to - // nsAString values, to avoid as much overhead as possible - self.append_utf8(&nsCString::from(s)); - Ok(()) - } -} - -impl fmt::Display for nsAString { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - fmt::Display::fmt(&String::from_utf16_lossy(&self[..]), f) - } -} - -impl fmt::Debug for nsAString { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - fmt::Debug::fmt(&String::from_utf16_lossy(&self[..]), f) - } -} - -impl cmp::PartialEq<str> for nsAString { - fn eq(&self, other: &str) -> bool { - other.encode_utf16().eq(self.iter().cloned()) - } -} - -#[macro_export] -macro_rules! ns_auto_string { - ($name:ident) => { - let mut buf: [u16; 64] = [0; 64]; - let mut $name = $crate::nsFixedString::new(&mut buf); - } -} - -// NOTE: These bindings currently only expose infallible operations. Perhaps -// consider allowing for fallible methods? -extern "C" { - // Gecko implementation in nsSubstring.cpp - fn Gecko_FinalizeCString(this: *mut nsACString); - fn Gecko_AssignCString(this: *mut nsACString, other: *const nsACString); - fn Gecko_AppendCString(this: *mut nsACString, other: *const nsACString); - - fn Gecko_FinalizeString(this: *mut nsAString); - fn Gecko_AssignString(this: *mut nsAString, other: *const nsAString); - fn Gecko_AppendString(this: *mut nsAString, other: *const nsAString); - - // Gecko implementation in nsReadableUtils.cpp - fn Gecko_AppendUTF16toCString(this: *mut nsACString, other: *const nsAString); - fn Gecko_AppendUTF8toString(this: *mut nsAString, other: *const nsACString); -} - -////////////////////////////////////// -// Repr Validation Helper Functions // -////////////////////////////////////// - -pub mod test_helpers { - //! This module only exists to help with ensuring that the layout of the - //! structs inside of rust and C++ are identical. - //! - //! It is public to ensure that these testing functions are avaliable to - //! gtest code. - - use super::{ - nsFixedCStringRepr, - nsFixedStringRepr, - nsCStringRepr, - nsStringRepr, - F_NONE, - F_TERMINATED, - F_VOIDED, - F_SHARED, - F_OWNED, - F_FIXED, - F_LITERAL, - F_CLASS_FIXED, - }; - use std::mem; - - /// Generates an #[no_mangle] extern "C" function which returns the size and - /// alignment of the given type with the given name. - macro_rules! size_align_check { - ($T:ty, $fname:ident) => { - #[no_mangle] - #[allow(non_snake_case)] - pub extern fn $fname(size: *mut usize, align: *mut usize) { - unsafe { - *size = mem::size_of::<$T>(); - *align = mem::align_of::<$T>(); - } - } - } - } - - size_align_check!(nsStringRepr, Rust_Test_ReprSizeAlign_nsString); - size_align_check!(nsCStringRepr, Rust_Test_ReprSizeAlign_nsCString); - size_align_check!(nsFixedStringRepr, Rust_Test_ReprSizeAlign_nsFixedString); - size_align_check!(nsFixedCStringRepr, Rust_Test_ReprSizeAlign_nsFixedCString); - - /// Generates a $[no_mangle] extern "C" function which returns the size, - /// alignment and offset in the parent struct of a given member, with the - /// given name. - /// - /// This method can trigger Undefined Behavior if the accessing the member - /// $member on a given type would use that type's `Deref` implementation. - macro_rules! member_check { - ($T:ty, $member:ident, $method:ident) => { - #[no_mangle] - #[allow(non_snake_case)] - pub extern fn $method(size: *mut usize, - align: *mut usize, - offset: *mut usize) { - unsafe { - // Create a temporary value of type T to get offsets, sizes - // and aligns off of - let tmp: $T = mem::zeroed(); - *size = mem::size_of_val(&tmp.$member); - *align = mem::align_of_val(&tmp.$member); - *offset = - (&tmp.$member as *const _ as usize) - - (&tmp as *const _ as usize); - mem::forget(tmp); - } - } - } - } - - member_check!(nsStringRepr, data, Rust_Test_Member_nsString_mData); - member_check!(nsStringRepr, length, Rust_Test_Member_nsString_mLength); - member_check!(nsStringRepr, flags, Rust_Test_Member_nsString_mFlags); - member_check!(nsCStringRepr, data, Rust_Test_Member_nsCString_mData); - member_check!(nsCStringRepr, length, Rust_Test_Member_nsCString_mLength); - member_check!(nsCStringRepr, flags, Rust_Test_Member_nsCString_mFlags); - member_check!(nsFixedStringRepr, capacity, Rust_Test_Member_nsFixedString_mFixedCapacity); - member_check!(nsFixedStringRepr, buffer, Rust_Test_Member_nsFixedString_mFixedBuf); - member_check!(nsFixedCStringRepr, capacity, Rust_Test_Member_nsFixedCString_mFixedCapacity); - member_check!(nsFixedCStringRepr, buffer, Rust_Test_Member_nsFixedCString_mFixedBuf); - - #[no_mangle] - #[allow(non_snake_case)] - pub extern fn Rust_Test_NsStringFlags(f_none: *mut u32, - f_terminated: *mut u32, - f_voided: *mut u32, - f_shared: *mut u32, - f_owned: *mut u32, - f_fixed: *mut u32, - f_literal: *mut u32, - f_class_fixed: *mut u32) { - unsafe { - *f_none = F_NONE; - *f_terminated = F_TERMINATED; - *f_voided = F_VOIDED; - *f_shared = F_SHARED; - *f_owned = F_OWNED; - *f_fixed = F_FIXED; - *f_literal = F_LITERAL; - *f_class_fixed = F_CLASS_FIXED; - } - } -} diff --git a/xpcom/system/moz.build b/xpcom/system/moz.build index 8a4f88efe..1d8e7ea1f 100644 --- a/xpcom/system/moz.build +++ b/xpcom/system/moz.build @@ -18,9 +18,4 @@ XPIDL_SOURCES += [ 'nsIXULRuntime.idl', ] -if CONFIG['MOZ_CRASHREPORTER']: - XPIDL_SOURCES += [ - 'nsICrashReporter.idl', - ] - XPIDL_MODULE = 'xpcom_system' diff --git a/xpcom/tests/gtest/TestDeadlockDetector.cpp b/xpcom/tests/gtest/TestDeadlockDetector.cpp index 646ee3e1d..877c5f5c3 100644 --- a/xpcom/tests/gtest/TestDeadlockDetector.cpp +++ b/xpcom/tests/gtest/TestDeadlockDetector.cpp @@ -15,12 +15,6 @@ #include "mozilla/ReentrantMonitor.h" #include "mozilla/Mutex.h" -#ifdef MOZ_CRASHREPORTER -#include "nsCOMPtr.h" -#include "nsICrashReporter.h" -#include "nsServiceManagerUtils.h" -#endif - #include "gtest/gtest.h" using namespace mozilla; @@ -62,13 +56,7 @@ private: void DisableCrashReporter() { -#ifdef MOZ_CRASHREPORTER - nsCOMPtr<nsICrashReporter> crashreporter = - do_GetService("@mozilla.org/toolkit/crash-reporter;1"); - if (crashreporter) { - crashreporter->SetEnabled(false); - } -#endif + /*** STUB ***/ } //----------------------------------------------------------------------------- diff --git a/xpcom/tests/gtest/TestPLDHash.cpp b/xpcom/tests/gtest/TestPLDHash.cpp index e7a73ae1b..4405b102c 100644 --- a/xpcom/tests/gtest/TestPLDHash.cpp +++ b/xpcom/tests/gtest/TestPLDHash.cpp @@ -21,10 +21,6 @@ extern unsigned int _gdb_sleep_duration; #endif -#ifdef MOZ_CRASHREPORTER -#include "nsICrashReporter.h" -#endif - // We can test that certain operations cause expected aborts by forking // and then checking that the child aborted in the expected way (i.e. via // MOZ_CRASH). We skip this for the following configurations. @@ -46,17 +42,6 @@ TestCrashyOperation(void (*aCrashyOperation)()) ASSERT_NE(pid, -1); if (pid == 0) { - // Disable the crashreporter -- writing a crash dump in the child will - // prevent the parent from writing a subsequent dump. Crashes here are - // expected, so we don't want their stacks to show up in the log anyway. -#ifdef MOZ_CRASHREPORTER - nsCOMPtr<nsICrashReporter> crashreporter = - do_GetService("@mozilla.org/toolkit/crash-reporter;1"); - if (crashreporter) { - crashreporter->SetEnabled(false); - } -#endif - // Child: perform the crashy operation. fprintf(stderr, "TestCrashyOperation: The following crash is expected. Do not panic.\n"); aCrashyOperation(); diff --git a/xpcom/tests/gtest/TestSTLWrappers.cpp b/xpcom/tests/gtest/TestSTLWrappers.cpp index 9559548a3..295aa7434 100644 --- a/xpcom/tests/gtest/TestSTLWrappers.cpp +++ b/xpcom/tests/gtest/TestSTLWrappers.cpp @@ -10,12 +10,6 @@ # error "failed to wrap <vector>" #endif -#ifdef MOZ_CRASHREPORTER -#include "nsCOMPtr.h" -#include "nsICrashReporter.h" -#include "nsServiceManagerUtils.h" -#endif - // gcc errors out if we |try ... catch| with -fno-exceptions, but we // can still test on windows #ifdef _MSC_VER @@ -40,14 +34,6 @@ void ShouldAbort() _gdb_sleep_duration = 0; #endif -#ifdef MOZ_CRASHREPORTER - nsCOMPtr<nsICrashReporter> crashreporter = - do_GetService("@mozilla.org/toolkit/crash-reporter;1"); - if (crashreporter) { - crashreporter->SetEnabled(false); - } -#endif - std::vector<int> v; int rv = 1; diff --git a/xpcom/threads/HangMonitor.cpp b/xpcom/threads/HangMonitor.cpp index 71cc67ca4..bd415be50 100644 --- a/xpcom/threads/HangMonitor.cpp +++ b/xpcom/threads/HangMonitor.cpp @@ -22,10 +22,6 @@ #include "nsThreadUtils.h" #include "nsXULAppAPI.h" -#ifdef MOZ_CRASHREPORTER -#include "nsExceptionHandler.h" -#endif - #ifdef XP_WIN #include <windows.h> #endif @@ -111,15 +107,6 @@ Crash() } #endif -#ifdef MOZ_CRASHREPORTER - // If you change this, you must also deal with the threadsafety of AnnotateCrashReport in - // non-chrome processes! - if (GeckoProcessType_Default == XRE_GetProcessType()) { - CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("Hang"), - NS_LITERAL_CSTRING("1")); - } -#endif - NS_RUNTIMEABORT("HangMonitor triggered"); } diff --git a/xpcom/threads/nsThread.cpp b/xpcom/threads/nsThread.cpp index 63bd28ca3..7c1af08f4 100644 --- a/xpcom/threads/nsThread.cpp +++ b/xpcom/threads/nsThread.cpp @@ -39,12 +39,6 @@ #include "nsThreadSyncDispatch.h" #include "LeakRefPtr.h" -#ifdef MOZ_CRASHREPORTER -#include "nsServiceManagerUtils.h" -#include "nsICrashReporter.h" -#include "mozilla/dom/ContentChild.h" -#endif - #ifdef XP_LINUX #include <sys/time.h> #include <sys/resource.h> @@ -520,73 +514,6 @@ nsThread::ThreadFunc(void* aArg) //----------------------------------------------------------------------------- -#ifdef MOZ_CRASHREPORTER -// Tell the crash reporter to save a memory report if our heuristics determine -// that an OOM failure is likely to occur soon. -// Memory usage will not be checked more than every 30 seconds or saved more -// than every 3 minutes -// If |aShouldSave == kForceReport|, a report will be saved regardless of -// whether the process is low on memory or not. However, it will still not be -// saved if a report was saved less than 3 minutes ago. -bool -nsThread::SaveMemoryReportNearOOM(ShouldSaveMemoryReport aShouldSave) -{ - // Keep an eye on memory usage (cheap, ~7ms) somewhat frequently, - // but save memory reports (expensive, ~75ms) less frequently. - const size_t kLowMemoryCheckSeconds = 30; - const size_t kLowMemorySaveSeconds = 3 * 60; - - static TimeStamp nextCheck = TimeStamp::NowLoRes() - + TimeDuration::FromSeconds(kLowMemoryCheckSeconds); - static bool recentlySavedReport = false; // Keeps track of whether a report - // was saved last time we checked - - // Are we checking again too soon? - TimeStamp now = TimeStamp::NowLoRes(); - if ((aShouldSave == ShouldSaveMemoryReport::kMaybeReport || - recentlySavedReport) && now < nextCheck) { - return false; - } - - bool needMemoryReport = (aShouldSave == ShouldSaveMemoryReport::kForceReport); -#ifdef XP_WIN // XXX implement on other platforms as needed - // If the report is forced there is no need to check whether it is necessary - if (aShouldSave != ShouldSaveMemoryReport::kForceReport) { - const size_t LOWMEM_THRESHOLD_VIRTUAL = 200 * 1024 * 1024; - MEMORYSTATUSEX statex; - statex.dwLength = sizeof(statex); - if (GlobalMemoryStatusEx(&statex)) { - if (statex.ullAvailVirtual < LOWMEM_THRESHOLD_VIRTUAL) { - needMemoryReport = true; - } - } - } -#endif - - if (needMemoryReport) { - if (XRE_IsContentProcess()) { - dom::ContentChild* cc = dom::ContentChild::GetSingleton(); - if (cc) { - cc->SendNotifyLowMemory(); - } - } else { - nsCOMPtr<nsICrashReporter> cr = - do_GetService("@mozilla.org/toolkit/crash-reporter;1"); - if (cr) { - cr->SaveMemoryReport(); - } - } - recentlySavedReport = true; - nextCheck = now + TimeDuration::FromSeconds(kLowMemorySaveSeconds); - } else { - recentlySavedReport = false; - nextCheck = now + TimeDuration::FromSeconds(kLowMemoryCheckSeconds); - } - - return recentlySavedReport; -} -#endif - #ifdef MOZ_CANARY int sCanaryOutputFD = -1; #endif @@ -1459,12 +1386,6 @@ nsThread::DoMainThreadSpecificProcessing(bool aReallyWait) } } } - -#ifdef MOZ_CRASHREPORTER - if (!ShuttingDown()) { - SaveMemoryReportNearOOM(ShouldSaveMemoryReport::kMaybeReport); - } -#endif } //----------------------------------------------------------------------------- diff --git a/xpcom/threads/nsThread.h b/xpcom/threads/nsThread.h index 836123747..037ef1952 100644 --- a/xpcom/threads/nsThread.h +++ b/xpcom/threads/nsThread.h @@ -83,16 +83,6 @@ public: void WaitForAllAsynchronousShutdowns(); -#ifdef MOZ_CRASHREPORTER - enum class ShouldSaveMemoryReport - { - kMaybeReport, - kForceReport - }; - - static bool SaveMemoryReportNearOOM(ShouldSaveMemoryReport aShouldSave); -#endif - private: void DoMainThreadSpecificProcessing(bool aReallyWait); |