diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index 3301fd14c8cb..05601db40470 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -161,6 +161,7 @@ #include "nsIJARChannel.h" #include "prlog.h" +#include "prmem.h" #include "nsISelectionDisplay.h" diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index 2716ace3ca22..f2f4977f01ed 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -32,6 +32,7 @@ // Helper Classes #include "nsXPIDLString.h" #include "nsJSUtils.h" +#include "prmem.h" #include "jsapi.h" // for JSAutoRequest #include "jsdbgapi.h" // for JS_ClearWatchPointsForObject #include "jsfriendapi.h" // for JS_GetGlobalForFrame diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp index b35b9a522526..24543dca21ba 100644 --- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -49,6 +49,7 @@ #include "nsIObjectInputStream.h" #include "nsIObjectOutputStream.h" #include "nsDOMScriptObjectHolder.h" +#include "prmem.h" #include "WrapperFactory.h" #include "nsGlobalWindow.h" #include "nsScriptNameSpaceManager.h" @@ -4105,18 +4106,24 @@ public: protected: JSContext *mContext; - FallibleTArray mArgv; + jsval *mArgv; + uint32_t mArgc; }; nsJSArgArray::nsJSArgArray(JSContext *aContext, uint32_t argc, jsval *argv, nsresult *prv) : - mContext(aContext) + mContext(aContext), + mArgv(nullptr), + mArgc(argc) { // copy the array - we don't know its lifetime, and ours is tied to xpcom // refcounting. Alloc zero'd array so cleanup etc is safe. - if (!mArgv.EnsureLengthAtLeast(argc)) { - *prv = NS_ERROR_OUT_OF_MEMORY; - return; + if (argc) { + mArgv = (jsval *) PR_CALLOC(argc * sizeof(jsval)); + if (!mArgv) { + *prv = NS_ERROR_OUT_OF_MEMORY; + return; + } } // Callers are allowed to pass in a null argv even for argc > 0. They can @@ -4141,10 +4148,13 @@ nsJSArgArray::~nsJSArgArray() void nsJSArgArray::ReleaseJSObjects() { - if (!mArgv.IsEmpty()) + if (mArgv) { + PR_DELETE(mArgv); + } + if (mArgc > 0) { + mArgc = 0; NS_DROP_JS_OBJECTS(this, nsJSArgArray); - - mArgv.Clear(); + } } // QueryInterface implementation for nsJSArgArray @@ -4157,10 +4167,12 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsJSArgArray) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsJSArgArray) - uint32_t length = tmp->mArgv.Length(); - for (uint32_t i = 0; i < length; i++) { - if (JSVAL_IS_GCTHING(tmp->mArgv[i])) { - NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(JSVAL_TO_GCTHING(tmp->mArgv[i]), + jsval *argv = tmp->mArgv; + if (argv) { + jsval *end; + for (end = argv + tmp->mArgc; argv < end; ++argv) { + if (JSVAL_IS_GCTHING(*argv)) + NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(JSVAL_TO_GCTHING(*argv), "mArgv[i]") } } @@ -4178,15 +4190,15 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(nsJSArgArray) nsresult nsJSArgArray::GetArgs(uint32_t *argc, void **argv) { - *argv = (void *)mArgv.Elements(); - *argc = mArgv.Length(); + *argv = (void *)mArgv; + *argc = mArgc; return NS_OK; } // nsIArray impl NS_IMETHODIMP nsJSArgArray::GetLength(uint32_t *aLength) { - *aLength = mArgv.Length(); + *aLength = mArgc; return NS_OK; } @@ -4194,7 +4206,7 @@ NS_IMETHODIMP nsJSArgArray::GetLength(uint32_t *aLength) NS_IMETHODIMP nsJSArgArray::QueryElementAt(uint32_t index, const nsIID & uuid, void * *result) { *result = nullptr; - if (index >= mArgv.Length()) + if (index >= mArgc) return NS_ERROR_INVALID_ARG; if (uuid.Equals(NS_GET_IID(nsIVariant)) || uuid.Equals(NS_GET_IID(nsISupports))) { diff --git a/dom/file/ArchiveZipEvent.cpp b/dom/file/ArchiveZipEvent.cpp index 4ddfbeef755b..d9cb8c9b58f7 100644 --- a/dom/file/ArchiveZipEvent.cpp +++ b/dom/file/ArchiveZipEvent.cpp @@ -191,7 +191,7 @@ ArchiveReaderZipEvent::Exec() } // Read the name: - nsAutoArrayPtr filename(new char[filenameLen + 1]); + char* filename = (char*)PR_Malloc(filenameLen + 1); rv = inputStream->Read(filename, filenameLen, &ret); if (NS_FAILED(rv) || ret != filenameLen) { return RunShare(NS_ERROR_UNEXPECTED); @@ -204,6 +204,8 @@ ArchiveReaderZipEvent::Exec() mFileList.AppendElement(new ArchiveZipItem(filename, centralStruct, mOptions)); } + PR_Free(filename); + // Ignore the rest seekableStream->Seek(nsISeekableStream::NS_SEEK_CUR, extraLen + commentLen); } diff --git a/dom/plugins/base/nsPluginDirServiceProvider.cpp b/dom/plugins/base/nsPluginDirServiceProvider.cpp index b7e9c006b72c..6a205f6e7726 100644 --- a/dom/plugins/base/nsPluginDirServiceProvider.cpp +++ b/dom/plugins/base/nsPluginDirServiceProvider.cpp @@ -8,6 +8,7 @@ #include "nsCRT.h" #include "nsIFile.h" #include "nsDependentString.h" +#include "prmem.h" #include "nsArrayEnumerator.h" #include "mozilla/Preferences.h"