Compare commits

..
Author SHA1 Message Date
Moonchild 9edf1b7bea Issue #1896 - Port GetNativePath changes from GRE. 2022-05-09 22:38:16 +00:00
Moonchild 930ddd693b No Issue - Break overly long tooltips into multiple lines.
A very very old bug and annoyance: tooltips with very long content without
spaces (e.g. long URLs or gibberish data) would just cut off and leave an
un-styled right border going over the widget's constrained space.
Because of an additional bug (still unsolved), this was never properly
addressed because solutions attempted didn't work.
The workaround for the secondary bug allows for word-break to now work and this
primary problem to be resolved.
2022-05-08 21:07:03 +00:00
Moonchild 4cdd532738 Merge pull request 'Fix ASAN and clang crashes on Linux, BSD and MacOS.' (#1892) from dbsoft/UXP:fixxptcinvoke into master
Reviewed-on: https://repo.palemoon.org/MoonchildProductions/UXP/pulls/1892
2022-05-08 11:52:32 +00:00
Moonchild 6f8d063b18 Issue #1895 - Implement queueMicroTask(callback()) 2022-05-07 14:39:41 +00:00
Brian Smith b1957eb7c9 Issue #1891 - Fix ASAN and clang crashes on Linux, BSD and MacOS.
Merge with the existing Solaris fix, by folding Solaris into the Linux/BSD section.
Add Apple Silicon (ARM64) support.
This should also address Issue #1884 by moving the offending code into assembly.
2022-05-05 15:53:25 -05:00
60 changed files with 401 additions and 274 deletions

No files matched your search

+1 -1
View File
@@ -160,7 +160,7 @@ nsChromeProtocolHandler::NewChannel2(nsIURI* aURI,
file->Exists(&exists);
if (!exists) {
nsAutoCString path;
file->GetNativePath(path);
file->GetPersistentDescriptor(path);
printf("Chrome file doesn't exist: %s\n", path.get());
}
}
+1 -1
View File
@@ -8,4 +8,4 @@
# Referenced by milestone.py.
#--------------------------------------------------------
5.1.0
5.1.0+
+2 -5
View File
@@ -25,6 +25,7 @@
#include "nsIDocument.h"
#include "mozilla/dom/Animation.h"
#include "nsIAnimationObserver.h"
#include "nsGlobalWindow.h"
class nsDOMMutationObserver;
using mozilla::dom::MutationObservingInfo;
@@ -599,11 +600,7 @@ protected:
bool Suppressed()
{
if (mOwner) {
nsCOMPtr<nsIDocument> d = mOwner->GetExtantDoc();
return d && d->IsInSyncOperation();
}
return false;
return mOwner && nsGlobalWindow::Cast(mOwner)->IsInSyncOperation();
}
static void HandleMutationsInternal(mozilla::AutoSlowOperation& aAso);
+6
View File
@@ -1224,6 +1224,12 @@ public:
already_AddRefed<nsWindowRoot> GetWindowRoot(mozilla::ErrorResult& aError);
mozilla::dom::Performance* GetPerformance();
virtual bool IsInSyncOperation() override
{
return GetExtantDoc() && GetExtantDoc()->IsInSyncOperation();
}
protected:
// Web IDL helpers
+38
View File
@@ -4,10 +4,20 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsIGlobalObject.h"
#include "mozilla/CycleCollectedJSContext.h"
#include "mozilla/dom/FunctionBinding.h"
#include "nsContentUtils.h"
#include "nsThreadUtils.h"
#include "nsHostObjectProtocolHandler.h"
using mozilla::AutoSlowOperation;
using mozilla::CycleCollectedJSContext;
using mozilla::ErrorResult;
using mozilla::IgnoredErrorResult;
using mozilla::MicroTaskRunnable;
using mozilla::dom::VoidFunction;
nsIGlobalObject::~nsIGlobalObject()
{
UnlinkHostObjectURIs();
@@ -110,3 +120,31 @@ nsIGlobalObject::TraverseHostObjectURIs(nsCycleCollectionTraversalCallback &aCb)
nsHostObjectProtocolHandler::Traverse(mHostObjectURIs[index], aCb);
}
}
class QueuedMicrotask : public MicroTaskRunnable {
public:
QueuedMicrotask(nsIGlobalObject* aGlobal, VoidFunction& aCallback)
: mGlobal(aGlobal)
, mCallback(&aCallback)
{}
/* unsafe */
void Run(AutoSlowOperation& aAso) final {
IgnoredErrorResult rv;
mCallback->Call(static_cast<ErrorResult&>(rv));
}
bool Suppressed() final { return mGlobal->IsInSyncOperation(); }
private:
nsCOMPtr<nsIGlobalObject> mGlobal;
RefPtr<VoidFunction> mCallback;
};
void nsIGlobalObject::QueueMicrotask(VoidFunction& aCallback) {
CycleCollectedJSContext* context = CycleCollectedJSContext::Get();
if (context) {
RefPtr<MicroTaskRunnable> mt = new QueuedMicrotask(this, aCallback);
context->DispatchMicroTaskRunnable(mt.forget());
}
}
+11
View File
@@ -19,6 +19,13 @@ class nsCString;
class nsCycleCollectionTraversalCallback;
class nsIPrincipal;
namespace mozilla{
namespace dom{
class VoidFunction;
}
}
class nsIGlobalObject : public nsISupports
{
nsTArray<nsCString> mHostObjectURIs;
@@ -72,6 +79,10 @@ public:
void UnlinkHostObjectURIs();
void TraverseHostObjectURIs(nsCycleCollectionTraversalCallback &aCb);
virtual bool IsInSyncOperation() { return false; }
void QueueMicrotask(mozilla::dom::VoidFunction& aCallback);
protected:
virtual ~nsIGlobalObject();
+2 -3
View File
@@ -1018,12 +1018,11 @@ GeckoMediaPluginServiceParent::PluginTerminated(const RefPtr<GMPParent>& aPlugin
MOZ_ASSERT(NS_GetCurrentThread() == mGMPThread);
if (aPlugin->IsMarkedForDeletion()) {
nsCString path8;
nsString path;
RefPtr<nsIFile> dir = aPlugin->GetDirectory();
nsresult rv = dir->GetNativePath(path8);
nsresult rv = dir->GetPath(path);
NS_ENSURE_SUCCESS_VOID(rv);
nsString path = NS_ConvertUTF8toUTF16(path8);
if (mPluginsWaitingForDeletion.Contains(path)) {
RemoveOnGMPThread(path, true /* delete */, true /* can defer */);
}
+9 -1
View File
@@ -2037,10 +2037,14 @@ nsresult nsPluginHost::ScanPluginsDirectory(nsIFile *pluginsDir,
#ifdef PLUGIN_LOGGING
nsAutoCString dirPath;
#ifdef XP_WIN
pluginsDir->GetPersistentDescriptor(dirPath);
#else
pluginsDir->GetNativePath(dirPath);
#endif
PLUGIN_LOG(PLUGIN_LOG_BASIC,
("nsPluginHost::ScanPluginsDirectory dir=%s\n", dirPath.get()));
#endif
#endif // PLUGIN_LOGGING
nsCOMPtr<nsISimpleEnumerator> iter;
rv = pluginsDir->GetDirectoryEntries(getter_AddRefs(iter));
@@ -3615,7 +3619,11 @@ nsPluginHost::CreateTempFileToPost(const char *aPostDataURL, nsIFile **aTmpFile)
}
rv = inFile->GetFileSize(&fileSize);
if (NS_FAILED(rv)) return rv;
#ifdef XP_WIN
rv = inFile->GetPersistentDescriptor(filename);
#else
rv = inFile->GetNativePath(filename);
#endif
if (NS_FAILED(rv)) return rv;
if (fileSize != 0) {
@@ -1265,7 +1265,11 @@ nsPluginStreamListenerPeer::OnFileAvailable(nsIFile* aFile)
return NS_ERROR_FAILURE;
nsAutoCString path;
#ifdef XP_WIN
rv = aFile->GetPersistentDescriptor(path);
#else
rv = aFile->GetNativePath(path);
#endif
if (NS_FAILED(rv)) return rv;
if (path.IsEmpty()) {
+1 -1
View File
@@ -239,7 +239,7 @@ static bool CanLoadPlugin(char16ptr_t aBinaryPath)
bool nsPluginsDir::IsPluginFile(nsIFile* file)
{
nsAutoCString path;
if (NS_FAILED(file->GetNativePath(path)))
if (NS_FAILED(file->GetPersistentDescriptor(path)))
return false;
const char *cPath = path.get();
+5 -3
View File
@@ -6,9 +6,11 @@
* The origin of this IDL file is
* http://www.whatwg.org/specs/web-apps/current-work/#functiocn
*
* © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and
* Opera Software ASA. You are granted a license to use, reproduce
* and create derivative works of this document.
* © Copyright 2004-2022 Apple Computer, Inc., Mozilla Foundation,
* Opera Software ASA and Moonchild Productions. You are granted a license to use,
* reproduce and create derivative works of this document.
*/
callback Function = any(any... arguments);
callback VoidFunction = void ();
@@ -36,6 +36,9 @@ interface WindowOrWorkerGlobalScope {
long setInterval(DOMString handler, optional long timeout, any... unused);
void clearInterval(optional long handle = 0);
// microtask queuing
void queueMicrotask(VoidFunction callback);
// ImageBitmap
[Throws]
Promise<ImageBitmap> createImageBitmap(ImageBitmapSource aImage);
+4
View File
@@ -466,7 +466,11 @@ nsXULPrototypeCache::BeginCaching(nsIURI* aURI)
if (NS_FAILED(rv))
return rv;
nsAutoCString chromePath;
#ifdef XP_WIN
rv = chromeDir->GetPersistentDescriptor(chromePath);
#else
rv = chromeDir->GetNativePath(chromePath);
#endif
if (NS_FAILED(rv))
return rv;
@@ -169,13 +169,20 @@ NS_IMETHODIMP mozHunspell::SetDictionary(const char16_t *aDictionary)
nsAutoCString dictFileName, affFileName;
// XXX This isn't really good. nsIFile->NativePath isn't safe for all
// character sets on Windows.
// A better way would be to QI to nsIFile, and get a filehandle
// from there. Only problem is that hunspell wants a path
#ifdef XP_WIN
// nsIFile->NativePath isn't safe for all character sets on Windows.
// Use GetPath and pass it as a UTF-8 to the hunspell lib instead.
// Hunspell 1.5+ supports UTF-8 file paths on Windows
// by prefixing "\\\\?\\".
nsAutoString affFileNameU;
nsresult rv = affFile->GetPath(affFileNameU);
NS_ENSURE_SUCCESS(rv, rv);
affFileName.AssignLiteral("\\\\?\\");
AppendUTF16toUTF8(affFileNameU, affFileName);
#else
nsresult rv = affFile->GetNativePath(affFileName);
NS_ENSURE_SUCCESS(rv, rv);
#endif
if (mAffixFileName.Equals(affFileName.get()))
return NS_OK;
+4
View File
@@ -364,7 +364,11 @@ FPSCounter::WriteFrameTimeStamps()
PR_Close(fd);
nsAutoCString path;
#ifdef XP_WIN
rv = resultFile->GetPersistentDescriptor(path);
#else
rv = resultFile->GetNativePath(path);
#endif
NS_ENSURE_SUCCESS(rv, rv);
printf_stderr("Wrote FPS data to file: %s\n", path.get());
+6 -1
View File
@@ -490,7 +490,7 @@ void RecordingPrefChanged(const char *aPrefName, void *aClosure)
nsAdoptingString prefFileName = Preferences::GetString("gfx.2d.recordingfile");
if (prefFileName) {
fileName.Append(NS_ConvertUTF16toUTF8(prefFileName));
CopyUTF16toUTF8(prefFileName, fileName);
} else {
nsCOMPtr<nsIFile> tmpFile;
if (NS_FAILED(NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(tmpFile)))) {
@@ -502,7 +502,12 @@ void RecordingPrefChanged(const char *aPrefName, void *aClosure)
if (NS_FAILED(rv))
return;
#ifdef XP_WIN
rv = tmpFile->GetPath(prefFileName);
CopyUTF16toUTF8(prefFileName, fileName);
#else
rv = tmpFile->GetNativePath(fileName);
#endif
if (NS_FAILED(rv))
return;
}
+17 -1
View File
@@ -666,8 +666,23 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector<std::string>& aExt
// Make sure that child processes can find the omnijar
// See XRE_InitCommandLine in nsAppRunner.cpp
newEnvVars["UXP_CUSTOM_OMNI"] = 1;
nsAutoCString path;
nsCOMPtr<nsIFile> file = Omnijar::GetPath(Omnijar::GRE);
#ifdef XP_WIN
nsString path;
nsAutoCString childPath;
if (file && NS_SUCCEEDED(file->GetPath(path))) {
CopyUTF16toUTF8(path, childPath);
childArgv.push_back("-greomni");
childArgv.push_back(childPath.get());
}
file = Omnijar::GetPath(Omnijar::APP);
if (file && NS_SUCCEEDED(file->GetPath(path))) {
CopyUTF16toUTF8(path, childPath);
childArgv.push_back("-appomni");
childArgv.push_back(childPath.get());
}
#else
nsAutoCString path;
if (file && NS_SUCCEEDED(file->GetNativePath(path))) {
childArgv.push_back("-greomni");
childArgv.push_back(path.get());
@@ -677,6 +692,7 @@ GeckoChildProcessHost::PerformAsyncLaunchInternal(std::vector<std::string>& aExt
childArgv.push_back("-appomni");
childArgv.push_back(path.get());
}
#endif
}
// Add the application directory path (-appdir path)
@@ -117,7 +117,11 @@ RemotePrintJobParent::PrintPage(const nsCString& aPageFileName)
}
nsAutoCString recordingPath;
#ifdef XP_WIN
rv = recordingFile->GetPersistentDescriptor(recordingPath);
#else
rv = recordingFile->GetNativePath(recordingPath);
#endif
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
+4
View File
@@ -482,7 +482,11 @@ NS_IMETHODIMP nsAddrDatabase::OpenMDB(nsIFile *dbName, bool create)
nsIMdbThumb *thumb = nullptr;
nsAutoCString filePath;
#ifdef XP_WIN
ret = dbName->GetPersistentDescriptor(filePath);
#else
ret = dbName->GetNativePath(filePath);
#endif
NS_ENSURE_SUCCESS(ret, ret);
nsIMdbHeap* dbHeap = nullptr;
+12
View File
@@ -598,7 +598,11 @@ nsMessenger::DetachAttachmentsWOPrompts(nsIFile* aDestFolder,
NS_ENSURE_SUCCESS(rv, rv);
nsAutoCString path;
#ifdef XP_WIN
rv = attachmentDestination->GetPersistentDescriptor(path);
#else
rv = attachmentDestination->GetNativePath(path);
#endif
NS_ENSURE_SUCCESS(rv, rv);
nsAutoString unescapedFileName;
@@ -860,7 +864,11 @@ nsMessenger::SaveOneAttachment(const char * aContentType, const char * aURL,
SetLastSaveDirectory(localFile);
nsCString dirName;
#ifdef XP_WIN
rv = localFile->GetPersistentDescriptor(dirName);
#else
rv = localFile->GetNativePath(dirName);
#endif
NS_ENSURE_SUCCESS(rv, rv);
nsSaveAllAttachmentsState *saveState =
@@ -927,7 +935,11 @@ nsMessenger::SaveAllAttachments(uint32_t count,
nsCString dirName;
nsSaveAllAttachmentsState *saveState = nullptr;
#ifdef XP_WIN
rv = localFile->GetPersistentDescriptor(dirName);
#else
rv = localFile->GetNativePath(dirName);
#endif
NS_ENSURE_SUCCESS(rv, rv);
saveState = new nsSaveAllAttachmentsState(count,
+4
View File
@@ -236,7 +236,11 @@ NS_IMETHODIMP nsMsgFolderCache::Init(nsIFile *aFile)
aFile->Exists(&exists);
nsAutoCString dbPath;
#ifdef XP_WIN
aFile->GetPersistentDescriptor(dbPath);
#else
aFile->GetNativePath(dbPath);
#endif
// ### evil cast until MDB supports file streams.
nsresult rv = OpenMDB(dbPath, exists);
// if this fails and panacea.dat exists, try blowing away the db and recreating it
+4
View File
@@ -118,7 +118,11 @@ nsMsgCreateTempFileName(const char *tFileName)
return nullptr;
nsCString tempString;
#ifdef XP_WIN
rv = tmpFile->GetPersistentDescriptor(tempString);
#else
rv = tmpFile->GetNativePath(tempString);
#endif
if (NS_FAILED(rv))
return nullptr;
+4
View File
@@ -4518,7 +4518,11 @@ nsMsgCompose::ProcessSignature(nsIMsgIdentity *identity, bool aQuoted, nsString
{
rv = identity->GetSignature(getter_AddRefs(sigFile));
if (NS_SUCCEEDED(rv) && sigFile) {
#ifdef XP_WIN
rv = sigFile->GetPersistentDescriptor(sigNativePath);
#else
rv = sigFile->GetNativePath(sigNativePath);
#endif
if (NS_SUCCEEDED(rv) && !sigNativePath.IsEmpty()) {
bool exists = false;
sigFile->Exists(&exists);
+8
View File
@@ -939,7 +939,11 @@ NS_IMETHODIMP nsMsgDatabase::NotifyAnnouncerGoingAway(void)
bool nsMsgDatabase::MatchDbName(nsIFile *dbName) // returns true if they match
{
nsCString dbPath;
#ifdef XP_WIN
dbName->GetPersistentDescriptor(dbPath);
#else
dbName->GetNativePath(dbPath);
#endif
return dbPath.Equals(m_dbName);
}
@@ -1197,7 +1201,11 @@ nsresult nsMsgDatabase::OpenInternal(nsMsgDBService *aDBService,
bool aLeaveInvalidDB, bool sync)
{
nsAutoCString summaryFilePath;
#ifdef XP_WIN
summaryFile->GetPersistentDescriptor(summaryFilePath);
#else
summaryFile->GetNativePath(summaryFilePath);
#endif
MOZ_LOG(DBLog, LogLevel::Info, ("nsMsgDatabase::Open(%s, %s, %p, %s)\n",
(const char*)summaryFilePath.get(), aCreate ? "TRUE":"FALSE",
+8
View File
@@ -3203,7 +3203,11 @@ NS_IMETHODIMP nsImapMailFolder::BeginCopy(nsIMsgDBHdr *message)
if (NS_FAILED(rv))
{
nsCString nativePath;
#ifdef XP_WIN
m_copyState->m_tmpFile->GetPersistentDescriptor(nativePath);
#else
m_copyState->m_tmpFile->GetNativePath(nativePath);
#endif
MOZ_LOG(IMAP, mozilla::LogLevel::Info, ("couldn't remove prev temp file %s: %lx\n", nativePath.get(), rv));
}
m_copyState->m_tmpFile = nullptr;
@@ -8883,7 +8887,11 @@ NS_IMETHODIMP nsImapMailFolder::RenameSubFolders(nsIMsgWindow *msgWindow, nsIMsg
newParentPathFile->AppendNative(oldLeafName);
nsCString newPathStr;
#ifdef XP_WIN
newParentPathFile->GetPersistentDescriptor(newPathStr);
#else
newParentPathFile->GetNativePath(newPathStr);
#endif
nsCOMPtr<nsIFile> newPathFile = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
@@ -887,7 +887,11 @@ bool CMapiMessage::CopyBinAttachToFile(LPATTACH lpAttach,
NS_ENSURE_SUCCESS(rv, false);
nsCString tmpPath;
#ifdef XP_WIN
_tmp_file->GetPersistentDescriptor(tmpPath);
#else
_tmp_file->GetNativePath(tmpPath);
#endif
LPSTREAM lpStreamFile;
HRESULT hr = CMapiApi::OpenStreamOnFile(gpMapiAllocateBuffer, gpMapiFreeBuffer, STGM_READWRITE | STGM_CREATE,
const_cast<char*>(tmpPath.get()), NULL, &lpStreamFile);
+4
View File
@@ -150,7 +150,11 @@ nsLocalURI2Path(const char* rootURI, const char* uriStr,
nsCString localNativePath;
#ifdef XP_WIN
localPath->GetPersistentDescriptor(localNativePath);
#else
localPath->GetNativePath(localNativePath);
#endif
nsEscapeNativePath(localNativePath);
pathResult = localNativePath.get();
const char *curPos = uriStr + PL_strlen(rootURI);
+4
View File
@@ -52,7 +52,11 @@ nsresult nsMailboxService::ParseMailbox(nsIMsgWindow *aMsgWindow, nsIFile *aMail
// okay now generate the url string
nsCString mailboxPath;
#ifdef XP_WIN
aMailboxPath->GetPersistentDescriptor(mailboxPath);
#else
aMailboxPath->GetNativePath(mailboxPath);
#endif
nsAutoCString buf;
MsgEscapeURL(mailboxPath,
nsINetUtil::ESCAPE_URL_MINIMAL | nsINetUtil::ESCAPE_URL_FORCED, buf);
+32 -7
View File
@@ -271,11 +271,7 @@ nsJAR::Extract(const nsACString &aEntryName, nsIFile* outFile)
if (NS_FAILED(rv)) return rv;
// ExtractFile also closes the fd handle and resolves the symlink if needed
nsAutoCString path;
rv = outFile->GetNativePath(path);
if (NS_FAILED(rv)) return rv;
rv = mZip->ExtractFile(item, path.get(), fd);
rv = mZip->ExtractFile(item, outFile, fd);
}
if (NS_FAILED(rv)) return rv;
@@ -422,7 +418,11 @@ nsJAR::GetJarPath(nsACString& aResult)
{
NS_ENSURE_ARG_POINTER(mZipFile);
#ifdef XP_WIN
return mZipFile->GetPersistentDescriptor(aResult);
#else
return mZipFile->GetNativePath(aResult);
#endif
}
nsresult
@@ -1124,7 +1124,11 @@ nsZipReaderCache::IsCached(nsIFile* zipFile, bool* aResult)
MutexAutoLock lock(mLock);
nsAutoCString uri;
#ifdef XP_WIN
rv = zipFile->GetPersistentDescriptor(uri);
#else
rv = zipFile->GetNativePath(uri);
#endif
if (NS_FAILED(rv))
return rv;
@@ -1146,8 +1150,14 @@ nsZipReaderCache::GetZip(nsIFile* zipFile, nsIZipReader* *result)
#endif
nsAutoCString uri;
#ifdef XP_WIN
rv = zipFile->GetPersistentDescriptor(uri);
#else
rv = zipFile->GetNativePath(uri);
if (NS_FAILED(rv)) return rv;
#endif
if (NS_FAILED(rv)) {
return rv;
}
uri.Insert(NS_LITERAL_CSTRING("file:"), 0);
@@ -1190,8 +1200,14 @@ nsZipReaderCache::GetInnerZip(nsIFile* zipFile, const nsACString &entry,
#endif
nsAutoCString uri;
#ifdef XP_WIN
rv = zipFile->GetPersistentDescriptor(uri);
#else
rv = zipFile->GetNativePath(uri);
if (NS_FAILED(rv)) return rv;
#endif
if (NS_FAILED(rv)) {
return rv;
}
uri.Insert(NS_LITERAL_CSTRING("jar:"), 0);
uri.AppendLiteral("!/");
@@ -1233,7 +1249,11 @@ nsZipReaderCache::GetFd(nsIFile* zipFile, PRFileDesc** aRetVal)
nsresult rv;
nsAutoCString uri;
#ifdef XP_WIN
rv = zipFile->GetPersistentDescriptor(uri);
#else
rv = zipFile->GetNativePath(uri);
#endif
if (NS_FAILED(rv)) {
return rv;
}
@@ -1374,8 +1394,13 @@ nsZipReaderCache::Observe(nsISupports *aSubject,
return NS_OK;
nsAutoCString uri;
#ifdef XP_WIN
if (NS_FAILED(file->GetPersistentDescriptor(uri)))
return NS_OK;
#else
if (NS_FAILED(file->GetNativePath(uri)))
return NS_OK;
#endif
uri.Insert(NS_LITERAL_CSTRING("file:"), 0);
+10 -5
View File
@@ -486,7 +486,7 @@ MOZ_WIN_MEM_TRY_CATCH(return nullptr)
// On extraction error(s) it removes the file.
// When needed, it also resolves the symlink.
//---------------------------------------------
nsresult nsZipArchive::ExtractFile(nsZipItem *item, const char *outname,
nsresult nsZipArchive::ExtractFile(nsZipItem *item, nsIFile* outFile,
PRFileDesc* aFd)
{
if (!item)
@@ -524,11 +524,16 @@ nsresult nsZipArchive::ExtractFile(nsZipItem *item, const char *outname,
//-- delete the file on errors, or resolve symlink if needed
if (aFd) {
PR_Close(aFd);
if (rv != NS_OK)
PR_Delete(outname);
if (NS_FAILED(rv) && outFile) {
outFile->Remove(false);
}
#ifdef XP_UNIX
else if (item->IsSymlink())
rv = ResolveSymlink(outname);
else if (item->IsSymlink()) {
nsAutoCString path;
rv = outFile->GetNativePath(path);
if (NS_FAILED(rv)) return rv;
rv = ResolveSymlink(path.get());
}
#endif
}
+2 -2
View File
@@ -159,10 +159,10 @@ public:
*
* @param zipEntry Name of file in archive to extract
* @param outFD Filedescriptor to write contents to
* @param outname Name of file to write to
* @param outFile Handle of file to write to
* @return status code
*/
nsresult ExtractFile(nsZipItem * zipEntry, const char *outname, PRFileDesc * outFD);
nsresult ExtractFile(nsZipItem * zipEntry, nsIFile* outFile, PRFileDesc * outFD);
/**
* FindInit
+9 -5
View File
@@ -1,17 +1,13 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim:set sw=4 sts=4 et cin: */
/* 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/. */
/*
The converts a filesystem directory into an "HTTP index" stream per
This converts a filesystem directory into an "HTTP index" stream per
Lou Montulli's original spec:
http://www.mozilla.org/projects/netlib/dirindexformat.html
*/
#include "nsEscape.h"
@@ -92,7 +88,11 @@ nsDirectoryIndexStream::Init(nsIFile* aDir)
if (MOZ_LOG_TEST(gLog, LogLevel::Debug)) {
nsAutoCString path;
#ifdef XP_WIN
aDir->GetPersistentDescriptor(path);
#else
aDir->GetNativePath(path);
#endif
MOZ_LOG(gLog, LogLevel::Debug,
("nsDirectoryIndexStream[%p]: initialized on %s",
this, path.get()));
@@ -239,7 +239,11 @@ nsDirectoryIndexStream::Read(char* aBuf, uint32_t aCount, uint32_t* aReadCount)
if (MOZ_LOG_TEST(gLog, LogLevel::Debug)) {
nsAutoCString path;
#ifdef XP_WIN
current->GetPersistentDescriptor(path);
#else
current->GetNativePath(path);
#endif
MOZ_LOG(gLog, LogLevel::Debug,
("nsDirectoryIndexStream[%p]: iterated %s",
this, path.get()));
+4 -1
View File
@@ -1,5 +1,4 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim:set ts=4 sw=4 sts=4 et cindent: */
/* 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/. */
@@ -3159,7 +3158,11 @@ nsStandardURL::GetFile(nsIFile **result)
if (LOG_ENABLED()) {
nsAutoCString path;
#ifdef XP_WIN
mFile->GetPersistentDescriptor(path);
#else
mFile->GetNativePath(path);
#endif
LOG(("nsStandardURL::GetFile [this=%p spec=%s resulting_path=%s]\n",
this, mSpec.get(), path.get()));
}
+8
View File
@@ -20,11 +20,19 @@ void
CacheLogPrintPath(mozilla::LogLevel level, const char * format, nsIFile * item)
{
nsAutoCString path;
#ifdef XP_WIN
nsresult rv = item->GetPersistentDescriptor(path);
#else
nsresult rv = item->GetNativePath(path);
#endif
if (NS_SUCCEEDED(rv)) {
MOZ_LOG(gCacheLog, level, (format, path.get()));
} else {
#ifdef XP_WIN
MOZ_LOG(gCacheLog, level, ("GetPersistentDescriptor failed: %x", rv));
#else
MOZ_LOG(gCacheLog, level, ("GetNativePath failed: %x", rv));
#endif
}
}
+12
View File
@@ -1739,7 +1739,11 @@ nsCacheService::CreateCustomOfflineDevice(nsIFile *aProfileDir,
if (MOZ_LOG_TEST(gCacheLog, LogLevel::Info)) {
nsAutoCString profilePath;
#ifdef XP_WIN
aProfileDir->GetPersistentDescriptor(profilePath);
#else
aProfileDir->GetNativePath(profilePath);
#endif
CACHE_LOG_INFO(("Creating custom offline device, %s, %d",
profilePath.BeginReading(), aQuota));
}
@@ -3093,7 +3097,11 @@ nsCacheService::MoveOrRemoveDiskCache(nsIFile *aOldCacheDir,
return;
nsAutoCString newPath;
#ifdef XP_WIN
rv = aNewCacheSubdir->GetPersistentDescriptor(newPath);
#else
rv = aNewCacheSubdir->GetNativePath(newPath);
#endif
if (NS_FAILED(rv))
return;
@@ -3105,7 +3113,11 @@ nsCacheService::MoveOrRemoveDiskCache(nsIFile *aOldCacheDir,
rv = aNewCacheDir->Create(nsIFile::DIRECTORY_TYPE, 0777);
if (NS_SUCCEEDED(rv) || NS_ERROR_FILE_ALREADY_EXISTS == rv) {
nsAutoCString oldPath;
#ifdef XP_WIN
rv = aOldCacheSubdir->GetPersistentDescriptor(oldPath);
#else
rv = aOldCacheSubdir->GetNativePath(oldPath);
#endif
if (NS_FAILED(rv))
return;
if (rename(oldPath.get(), newPath.get()) == 0)
+4
View File
@@ -287,7 +287,11 @@ nsOfflineCacheEvictionFunction::Apply()
for (int32_t i = 0; i < items.Count(); i++) {
if (MOZ_LOG_TEST(gCacheLog, LogLevel::Debug)) {
nsAutoCString path;
#ifdef XP_WIN
items[i]->GetPersistentDescriptor(path);
#else
items[i]->GetNativePath(path);
#endif
LOG((" removing %s\n", path.get()));
}
@@ -269,7 +269,11 @@ CacheFileContextEvictor::PersistEvictionInfoToDisk(
}
nsAutoCString path;
#ifdef XP_WIN
file->GetPersistentDescriptor(path);
#else
file->GetNativePath(path);
#endif
PRFileDesc *fd;
rv = file->OpenNSPRFileDesc(PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE, 0600,
@@ -306,7 +310,11 @@ CacheFileContextEvictor::RemoveEvictInfoFromDisk(
}
nsAutoCString path;
#ifdef XP_WIN
file->GetPersistentDescriptor(path);
#else
file->GetNativePath(path);
#endif
rv = file->Remove(false);
if (NS_WARN_IF(NS_FAILED(rv))) {
+12
View File
@@ -3096,7 +3096,11 @@ nsresult
CacheFileIOManager::TrashDirectory(nsIFile *aFile)
{
nsAutoCString path;
#ifdef XP_WIN
aFile->GetPersistentDescriptor(path);
#else
aFile->GetNativePath(path);
#endif
LOG(("CacheFileIOManager::TrashDirectory() [file=%s]", path.get()));
nsresult rv;
@@ -3340,7 +3344,11 @@ CacheFileIOManager::RemoveTrashInternal()
"recursively, but this can block IO thread for a while!");
if (LOG_ENABLED()) {
nsAutoCString path;
#ifdef XP_WIN
file->GetPersistentDescriptor(path);
#else
file->GetNativePath(path);
#endif
LOG(("CacheFileIOManager::RemoveTrashInternal() - Found a directory in a trash "
"directory! It will be removed recursively, but this can block IO "
"thread for a while! [file=%s]", path.get()));
@@ -3873,7 +3881,11 @@ CacheFileIOManager::SyncRemoveDir(nsIFile *aFile, const char *aDir)
if (LOG_ENABLED()) {
nsAutoCString path;
#ifdef XP_WIN
file->GetPersistentDescriptor(path);
#else
file->GetNativePath(path);
#endif
LOG(("CacheFileIOManager::SyncRemoveDir() - Removing directory %s",
path.get()));
}
+2 -2
View File
@@ -323,8 +323,8 @@ Test(CreateFun create, uint32_t count,
nsAutoCString inDir;
nsAutoCString outDir;
(void)inDirSpec->GetNativePath(inDir);
(void)outDirSpec->GetNativePath(outDir);
(void)inDirSpec->GetPersistentDescriptor(inDir);
(void)outDirSpec->GetPersistentDescriptor(outDir);
printf("###########\nTest: from %s to %s, bufSize = %d\n",
inDir.get(), outDir.get(), bufSize);
gTimeSampler.Reset();
+1 -1
View File
@@ -186,7 +186,7 @@ FileSystemDataSource::Init()
NS_NewFileURI(getter_AddRefs(furi), file);
NS_ENSURE_TRUE(furi, NS_ERROR_FAILURE);
file->GetNativePath(ieFavoritesDir);
file->GetPersistentDescriptor(ieFavoritesDir);
}
#endif
+4
View File
@@ -193,7 +193,11 @@ CertBlocklist::Init()
return rv;
}
nsAutoCString path;
#ifdef XP_WIN
rv = mBackingFile->GetPersistentDescriptor(path);
#else
rv = mBackingFile->GetNativePath(path);
#endif
if (NS_FAILED(rv)) {
return rv;
}
+8
View File
@@ -197,7 +197,11 @@ nsresult nsProfileLock::LockWithFcntl(nsIFile *aLockFile)
nsresult rv = NS_OK;
nsAutoCString lockFilePath;
#ifdef XP_WIN
rv = aLockFile->GetPersistentDescriptor(lockFilePath);
#else
rv = aLockFile->GetNativePath(lockFilePath);
#endif
if (NS_FAILED(rv)) {
NS_ERROR("Could not get native path");
return rv;
@@ -303,7 +307,11 @@ nsresult nsProfileLock::LockWithSymlink(nsIFile *aLockFile, bool aHaveFcntlLock)
{
nsresult rv;
nsAutoCString lockFilePath;
#ifdef XP_WIN
rv = aLockFile->GetPersistentDescriptor(lockFilePath);
#else
rv = aLockFile->GetNativePath(lockFilePath);
#endif
if (NS_FAILED(rv)) {
NS_ERROR("Could not get native path");
return rv;
+3
View File
@@ -244,6 +244,9 @@ label[disabled="true"] {
.tooltip-label {
margin: 0;
word-wrap: break-word;
/* We must specify a min-width, otherwise word-wrap:break-word doesn't work. Bug 630864. */
min-width: 1px;
}
.header {
+3
View File
@@ -254,6 +254,9 @@ label[disabled="true"]:-moz-system-metric(windows-classic) {
.tooltip-label {
margin: 0;
word-wrap: break-word;
/* We must specify a min-width, otherwise word-wrap:break-word doesn't work. Bug 630864. */
min-width: 1px;
}
.header {
+27 -4
View File
@@ -2031,8 +2031,13 @@ SelectProfile(nsIProfileLock* *aResult, nsIToolkitProfileService* aProfileSvc, n
profile->GetRootDir(getter_AddRefs(prefsJSFile));
prefsJSFile->AppendNative(NS_LITERAL_CSTRING("prefs.js"));
nsAutoCString pathStr;
#ifdef XP_WIN
prefsJSFile->GetPersistentDescriptor(pathStr);
#else
prefsJSFile->GetNativePath(pathStr);
#endif
PR_fprintf(PR_STDERR, "Success: created profile '%s' at '%s'\n", arg, pathStr.get());
bool exists;
prefsJSFile->Exists(&exists);
if (!exists) {
@@ -2271,11 +2276,15 @@ CheckCompatibility(nsIFile* aProfileDir, const nsCString& aVersion,
return false;
nsCOMPtr<nsIFile> lf;
rv = NS_NewNativeLocalFile(buf, false,
rv = NS_NewNativeLocalFile(EmptyCString(), false,
getter_AddRefs(lf));
if (NS_FAILED(rv))
return false;
rv = lf->SetPersistentDescriptor(buf);
if (NS_FAILED(rv))
return false;
bool eq;
rv = lf->Equals(aXULRunnerDir, &eq);
if (NS_FAILED(rv) || !eq)
@@ -2286,11 +2295,15 @@ CheckCompatibility(nsIFile* aProfileDir, const nsCString& aVersion,
if (NS_FAILED(rv))
return false;
rv = NS_NewNativeLocalFile(buf, false,
rv = NS_NewNativeLocalFile(EmptyCString(), false,
getter_AddRefs(lf));
if (NS_FAILED(rv))
return false;
rv = lf->SetPersistentDescriptor(buf);
if (NS_FAILED(rv))
return false;
rv = lf->Equals(aAppDir, &eq);
if (NS_FAILED(rv) || !eq)
return false;
@@ -2330,11 +2343,11 @@ WriteVersion(nsIFile* aProfileDir, const nsCString& aVersion,
file->AppendNative(FILE_COMPATIBILITY_INFO);
nsAutoCString platformDir;
aXULRunnerDir->GetNativePath(platformDir);
Unused << aXULRunnerDir->GetPersistentDescriptor(platformDir);
nsAutoCString appDir;
if (aAppDir)
aAppDir->GetNativePath(appDir);
Unused << aAppDir->GetPersistentDescriptor(appDir);
PRFileDesc *fd;
nsresult rv =
@@ -3673,6 +3686,16 @@ XREMain::XRE_mainRun()
}
}
#ifndef XP_WIN
nsCOMPtr<nsIFile> profileDir;
nsAutoCString path;
rv = mDirProvider.GetProfileStartupDir(getter_AddRefs(profileDir));
if (NS_SUCCEEDED(rv) && NS_SUCCEEDED(profileDir->GetNativePath(path)) && !IsUTF8(path)) {
PR_fprintf(PR_STDERR, "Error: The profile path is not valid UTF-8. Unable to continue.\n");
return NS_ERROR_FAILURE;
}
#endif
mDirProvider.DoStartup();
// As FilePreferences need the profile directory, we must initialize right here.
+6
View File
@@ -1075,7 +1075,13 @@ nsUpdateProcessor::ProcessUpdate(nsIUpdate* aUpdate)
rv = ds->Get(XRE_EXECUTABLE_FILE, NS_GET_IID(nsIFile),
getter_AddRefs(binary));
NS_ASSERTION(NS_SUCCEEDED(rv), "Can't get the binary path");
#ifdef XP_WIN
nsAutoString binPathW;
binary->GetPath(binPathW);
NS_ConvertUTF16toUTF8 binPath(binPathW);
#else
binary->GetNativePath(binPath);
#endif
}
// Copy the parameters to the StagedUpdateInfo structure shared with the
+8
View File
@@ -305,7 +305,11 @@ nsMIMEInfoBase::LaunchWithFile(nsIFile* aFile)
NS_ENSURE_SUCCESS(rv, rv);
nsAutoCString path;
#ifdef XP_WIN
aFile->GetPersistentDescriptor(path);
#else
aFile->GetNativePath(path);
#endif
return LaunchWithIProcess(executable, path);
}
@@ -423,7 +427,11 @@ nsMIMEInfoImpl::LaunchDefaultWithFile(nsIFile* aFile)
return NS_ERROR_FILE_NOT_FOUND;
nsAutoCString nativePath;
#ifdef XP_WIN
aFile->GetPersistentDescriptor(nativePath);
#else
aFile->GetNativePath(nativePath);
#endif
return LaunchWithIProcess(mDefaultApplication, nativePath);
}
+4
View File
@@ -169,7 +169,11 @@ nsDeviceContextSpecProxy::CreateUniqueTempPath(nsACString& aFilePath)
return rv;
}
#ifdef XP_WIN
return recordingFile->GetPersistentDescriptor(aFilePath);
#else
return recordingFile->GetNativePath(aFilePath);
#endif
}
NS_IMETHODIMP
+1 -2
View File
@@ -1,4 +1,3 @@
/* vim: se cin sw=2 ts=2 et : */
/* -*- 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
@@ -246,7 +245,7 @@ WinTaskbar::GetAppUserModelID(nsAString & aDefaultGroupId) {
bool exists = false;
if (profileDir && NS_SUCCEEDED(profileDir->Exists(&exists)) && exists) {
nsAutoCString path;
if (NS_SUCCEEDED(profileDir->GetNativePath(path))) {
if (NS_SUCCEEDED(profileDir->GetPersistentDescriptor(path))) {
nsAutoString id;
id.AppendInt(HashString(path));
if (!id.IsEmpty()) {
+1 -1
View File
@@ -1294,7 +1294,7 @@ nsDataObj :: GetFileContentsInternetShortcut ( FORMATETC& aFE, STGMEDIUM& aSTG )
rv = mozilla::widget::FaviconHelper::GetOutputIconPath(aUri, icoFile, true);
NS_ENSURE_SUCCESS(rv, E_FAIL);
rv = icoFile->GetNativePath(path);
rv = icoFile->GetPersistentDescriptor(path);
NS_ENSURE_SUCCESS(rv, E_FAIL);
shortcutFormatStr = "[InternetShortcut]\r\nURL=%s\r\n"
+1 -1
View File
@@ -137,7 +137,7 @@ struct CycleCollectorResults
class MicroTaskRunnable
{
public:
MicroTaskRunnable() {}
MicroTaskRunnable() = default;
NS_INLINE_DECL_REFCOUNTING(MicroTaskRunnable)
virtual void Run(AutoSlowOperation& aAso) = 0;
virtual bool Suppressed() { return false; }
+4
View File
@@ -324,7 +324,11 @@ FifoWatcher::OpenFd()
}
nsAutoCString path;
#ifdef XP_WIN
rv = file->GetPersistentDescriptor(path);
#else
rv = file->GetNativePath(path);
#endif
if (NS_WARN_IF(NS_FAILED(rv))) {
return -1;
}
+11 -4
View File
@@ -122,10 +122,17 @@ InitLateWriteChecks()
nsCOMPtr<nsIFile> mozFile;
NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(mozFile));
if (mozFile) {
nsAutoCString nativePath;
nsresult rv = mozFile->GetNativePath(nativePath);
if (NS_SUCCEEDED(rv) && nativePath.get()) {
sLateWriteObserver = new LateWriteObserver(nativePath.get());
nsAutoCString writeObserverPath;
#ifdef XP_WIN
nsAutoString U16Path;
nsresult rv = mozFile->GetPath(U16Path);
CopyUTF16toUTF8(U16Path, writeObserverPath);
#else
// On non-Windows just get the native path.
nsresult rv = mozFile->GetNativePath(writeObserverPath);
#endif
if (NS_SUCCEEDED(rv) && writeObserverPath.get()) {
sLateWriteObserver = new LateWriteObserver(writeObserverPath.get());
}
}
}
+5 -1
View File
@@ -688,9 +688,13 @@ NS_InitXPCOM2(nsIServiceManager** aResult,
getter_AddRefs(greDir));
MOZ_ASSERT(greDir);
nsAutoCString nativeGREPath;
#ifdef XP_WIN
greDir->GetPersistentDescriptor(nativeGREPath);
#else
greDir->GetNativePath(nativeGREPath);
u_setDataDirectory(nativeGREPath.get());
#endif
u_setDataDirectory(nativeGREPath.get());
#endif // MOZ_ICU_DATA_ARCHIVE
// Initialize the JS engine.
const char* jsInitFailureReason = JS_InitWithFailureDiagnostic();
@@ -104,7 +104,13 @@ nsNativeModuleLoader::LoadModule(FileLocation& aFile)
}
nsAutoCString filePath;
#ifdef XP_WIN
nsAutoString filePathW;
file->GetPath(filePathW);
CopyUTF16toUTF8(filePathW, filePath);
#else
file->GetNativePath(filePath);
#endif
NativeLoadData data;
+3 -3
View File
@@ -3564,7 +3564,7 @@ nsLocalFile::SetNativeLeafName(const nsACString& aLeafName)
NS_IMETHODIMP
nsLocalFile::GetNativePath(nsACString& aResult)
{
//NS_WARNING("This API is lossy. Use GetPath !");
NS_WARNING("The GetNativePath API is lossy. Use GetPath!");
nsAutoString tmp;
nsresult rv = GetPath(tmp);
if (NS_SUCCEEDED(rv)) {
@@ -3578,7 +3578,7 @@ nsLocalFile::GetNativePath(nsACString& aResult)
NS_IMETHODIMP
nsLocalFile::GetNativeCanonicalPath(nsACString& aResult)
{
NS_WARNING("This method is lossy. Use GetCanonicalPath !");
NS_WARNING("This method is lossy. Use GetCanonicalPath!");
EnsureShortPath();
NS_CopyUnicodeToNative(mShortWorkingPath, aResult);
return NS_OK;
@@ -3646,7 +3646,7 @@ nsLocalFile::GetNativeTarget(nsACString& aResult)
// Check we are correctly initialized.
CHECK_mWorkingPath();
NS_WARNING("This API is lossy. Use GetTarget !");
NS_WARNING("This API is lossy. Use GetTarget!");
nsAutoString tmp;
nsresult rv = GetTarget(tmp);
if (NS_SUCCEEDED(rv)) {
+6 -17
View File
@@ -13,6 +13,10 @@ if CONFIG['OS_ARCH'] == 'Darwin':
'!xptcstubs_asm_ppc_darwin.s',
'xptcinvoke_asm_ppc_rhapsody.s',
]
if CONFIG['OS_TEST'] == 'x86_64':
SOURCES += [
'xptcinvoke_asm_x86_64_unix.S',
]
if '86' in CONFIG['OS_TEST'] and CONFIG['OS_TEST'] != 'x86_64':
DEFINES['MOZ_NEED_LEADING_UNDERSCORE'] = True
@@ -23,10 +27,11 @@ if CONFIG['OS_ARCH'] == 'GNU':
'xptcstubs_gcc_x86_unix.cpp'
]
if CONFIG['OS_ARCH'] in ('Linux', 'Bitrig', 'DragonFly', 'FreeBSD', 'NetBSD', 'OpenBSD') or \
if CONFIG['OS_ARCH'] in ('Linux', 'Bitrig', 'DragonFly', 'FreeBSD', 'NetBSD', 'OpenBSD', 'SunOS') or \
CONFIG['OS_ARCH'].startswith('GNU_'):
if CONFIG['OS_TEST'] == 'x86_64':
SOURCES += [
'xptcinvoke_asm_x86_64_unix.S',
'xptcinvoke_x86_64_unix.cpp',
'xptcstubs_x86_64_linux.cpp',
]
@@ -45,22 +50,6 @@ if CONFIG['OS_ARCH'] in ('Linux', 'FreeBSD'):
'xptcstubs_ipf64.cpp'
]
# Without the need to accomodate the Sun compiler, Solaris/GCC support is pretty
# standard, actually. Not all that different from Linux.
if CONFIG['OS_ARCH'] == 'SunOS':
if CONFIG['OS_TEST'] == 'x86_64':
SOURCES += [
'xptcinvoke_asm_x86_64_unix.S',
'xptcinvoke_x86_64_solaris.cpp',
'xptcstubs_x86_64_linux.cpp'
]
elif '86' in CONFIG['OS_TEST']:
SOURCES += [
'xptcinvoke_gcc_x86_unix.cpp',
'xptcstubs_gcc_x86_unix.cpp'
]
if CONFIG['OS_TEST'] == 'alpha':
if CONFIG['OS_ARCH'] in ('Linux', 'FreeBSD', 'NetBSD'):
SOURCES += [
@@ -11,6 +11,8 @@
#include "xptcinvoke_ppc_rhapsody.cpp"
#elif defined(__arm__)
#include "xptcinvoke_arm.cpp"
#elif defined(__aarch64__)
#include "xptcinvoke_aarch64.cpp"
#else
#error unknown cpu architecture
#endif
@@ -1,75 +0,0 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// Platform specific code to invoke XPCOM methods on native objects
#include "xptcprivate.h"
// 6 integral parameters are passed in registers, but 1 is |this| which isn't
// considered here.
const uint32_t GPR_COUNT = 5;
// 8 floating point parameters are passed in SSE registers
const uint32_t FPR_COUNT = 8;
extern "C" void
InvokeCopyToStack(uint64_t * gpregs, double * fpregs,
uint32_t paramCount, nsXPTCVariant * s,
uint64_t* d)
{
uint32_t nr_gpr = 0u; // skip one GP register for 'that'
uint32_t nr_fpr = 0u;
uint64_t value = 0u;
for (uint32_t i = 0; i < paramCount; i++, s++) {
if (s->IsPtrData())
value = (uint64_t) s->ptr;
else {
switch (s->type) {
case nsXPTType::T_FLOAT: break;
case nsXPTType::T_DOUBLE: break;
case nsXPTType::T_I8: value = s->val.i8; break;
case nsXPTType::T_I16: value = s->val.i16; break;
case nsXPTType::T_I32: value = s->val.i32; break;
case nsXPTType::T_I64: value = s->val.i64; break;
case nsXPTType::T_U8: value = s->val.u8; break;
case nsXPTType::T_U16: value = s->val.u16; break;
case nsXPTType::T_U32: value = s->val.u32; break;
case nsXPTType::T_U64: value = s->val.u64; break;
case nsXPTType::T_BOOL: value = s->val.b; break;
case nsXPTType::T_CHAR: value = s->val.c; break;
case nsXPTType::T_WCHAR: value = s->val.wc; break;
default: value = (uint64_t) s->val.p; break;
}
}
if (!s->IsPtrData() && s->type == nsXPTType::T_DOUBLE) {
if (nr_fpr < FPR_COUNT)
fpregs[nr_fpr++] = s->val.d;
else {
*((double *)d) = s->val.d;
d++;
}
}
else if (!s->IsPtrData() && s->type == nsXPTType::T_FLOAT) {
if (nr_fpr < FPR_COUNT)
// The value in %xmm register is already prepared to
// be retrieved as a float. Therefore, we pass the
// value verbatim, as a double without conversion.
fpregs[nr_fpr++] = s->val.d;
else {
*((float *)d) = s->val.f;
d++;
}
}
else {
if (nr_gpr < GPR_COUNT)
gpregs[nr_gpr++] = value;
else
*d++ = value;
}
}
}
@@ -8,46 +8,19 @@
#include "xptcprivate.h"
// 6 integral parameters are passed in registers
const uint32_t GPR_COUNT = 6;
// 6 integral parameters are passed in registers, but 1 is |this| which isn't
// considered here.
const uint32_t GPR_COUNT = 5;
// 8 floating point parameters are passed in SSE registers
const uint32_t FPR_COUNT = 8;
// Remember that these 'words' are 64-bit long
static inline void
invoke_count_words(uint32_t paramCount, nsXPTCVariant * s,
uint32_t & nr_stack)
extern "C" void
InvokeCopyToStack(uint64_t * gpregs, double * fpregs,
uint32_t paramCount, nsXPTCVariant * s,
uint64_t* d)
{
uint32_t nr_gpr;
uint32_t nr_fpr;
nr_gpr = 1; // skip one GP register for 'that'
nr_fpr = 0;
nr_stack = 0;
/* Compute number of eightbytes of class MEMORY. */
for (uint32_t i = 0; i < paramCount; i++, s++) {
if (!s->IsPtrData()
&& (s->type == nsXPTType::T_FLOAT || s->type == nsXPTType::T_DOUBLE)) {
if (nr_fpr < FPR_COUNT)
nr_fpr++;
else
nr_stack++;
}
else {
if (nr_gpr < GPR_COUNT)
nr_gpr++;
else
nr_stack++;
}
}
}
static void
invoke_copy_to_stack(uint64_t * d, uint32_t paramCount, nsXPTCVariant * s,
uint64_t * gpregs, double * fpregs)
{
uint32_t nr_gpr = 1u; // skip one GP register for 'that'
uint32_t nr_gpr = 0u;
uint32_t nr_fpr = 0u;
uint64_t value = 0u;
@@ -100,89 +73,3 @@ invoke_copy_to_stack(uint64_t * d, uint32_t paramCount, nsXPTCVariant * s,
}
}
}
// Disable avx for the next function to allow compilation with
// -march=native on new machines, or similar hardcoded -march options.
// Having avx enabled appears to change the alignment behavior of alloca
// (apparently adding an extra 16 bytes) of padding/alignment (and using
// 32-byte alignment instead of 16-byte). This seems to be the best
// available workaround, given that this code, which should perhaps
// better be written in assembly, is written in C++.
#ifndef __clang__
#pragma GCC push_options
#pragma GCC target ("no-avx")
#endif
// Avoid AddressSanitizer instrumentation for the next function because it
// depends on __builtin_alloca behavior and alignment that cannot be relied on
// once the function is compiled with a version of ASan that has dynamic-alloca
// instrumentation enabled.
MOZ_ASAN_BLACKLIST
EXPORT_XPCOM_API(nsresult)
NS_InvokeByIndex(nsISupports * that, uint32_t methodIndex,
uint32_t paramCount, nsXPTCVariant * params)
{
uint32_t nr_stack;
invoke_count_words(paramCount, params, nr_stack);
// Stack, if used, must be 16-bytes aligned
if (nr_stack)
nr_stack = (nr_stack + 1) & ~1;
// Load parameters to stack, if necessary
uint64_t *stack = (uint64_t *) __builtin_alloca(nr_stack * 8);
uint64_t gpregs[GPR_COUNT];
double fpregs[FPR_COUNT];
invoke_copy_to_stack(stack, paramCount, params, gpregs, fpregs);
// We used to have switches to make sure we would only load the registers
// that are needed for this call. That produced larger code that was
// not faster in practice. It also caused compiler warnings about the
// variables being used uninitialized.
// We now just load every every register. There could still be a warning
// from a memory analysis tools that we are loading uninitialized stack
// positions.
// FIXME: this function depends on the above __builtin_alloca placing
// the array in the correct spot for the ABI.
// Load FPR registers from fpregs[]
double d0, d1, d2, d3, d4, d5, d6, d7;
d7 = fpregs[7];
d6 = fpregs[6];
d5 = fpregs[5];
d4 = fpregs[4];
d3 = fpregs[3];
d2 = fpregs[2];
d1 = fpregs[1];
d0 = fpregs[0];
// Load GPR registers from gpregs[]
uint64_t a0, a1, a2, a3, a4, a5;
a5 = gpregs[5];
a4 = gpregs[4];
a3 = gpregs[3];
a2 = gpregs[2];
a1 = gpregs[1];
a0 = (uint64_t) that;
// Get pointer to method
uint64_t methodAddress = *((uint64_t *)that);
methodAddress += 8 * methodIndex;
methodAddress = *((uint64_t *)methodAddress);
typedef nsresult (*Method)(uint64_t, uint64_t, uint64_t, uint64_t,
uint64_t, uint64_t, double, double, double,
double, double, double, double, double);
nsresult result = ((Method)methodAddress)(a0, a1, a2, a3, a4, a5,
d0, d1, d2, d3, d4, d5,
d6, d7);
return result;
}
#ifndef __clang__
#pragma GCC pop_options
#endif