Global Metrics
path: .metrics.loc.ploc
old: 74.0
new: 274.0
path: .metrics.loc.cloc
old: 95.0
new: 18.0
path: .metrics.loc.blank
old: 32.0
new: 71.0
path: .metrics.loc.lloc
old: 0.0
new: 112.0
path: .metrics.loc.sloc
old: 201.0
new: 363.0
path: .metrics.nargs.average
old: 0.5
new: 2.090909090909091
path: .metrics.nargs.sum
old: 2.0
new: 46.0
path: .metrics.nexits.sum
old: 0.0
new: 25.0
path: .metrics.nexits.average
old: 0.0
new: 1.1363636363636365
path: .metrics.cognitive.sum
old: 0.0
new: 28.0
path: .metrics.cognitive.average
old: 0.0
new: 1.2727272727272727
path: .metrics.halstead.N1
old: 143.0
new: 679.0
path: .metrics.halstead.N2
old: 102.0
new: 501.0
path: .metrics.halstead.n2
old: 61.0
new: 134.0
path: .metrics.halstead.length
old: 245.0
new: 1180.0
path: .metrics.halstead.vocabulary
old: 76.0
new: 158.0
path: .metrics.halstead.volume
old: 1530.7422407936783
new: 8618.46128284898
path: .metrics.halstead.bugs
old: 0.2389834665848911
new: 1.7691908487568369
path: .metrics.halstead.purity_ratio
old: 1.7158299450018932
new: 0.8956737724903806
path: .metrics.halstead.level
old: 0.07973856209150326
new: 0.022288755821689953
path: .metrics.halstead.estimated_program_length
old: 420.37833652546385
new: 1056.895051538649
path: .metrics.halstead.effort
old: 19197.013347658427
new: 386673.0539737916
path: .metrics.halstead.n1
old: 15.0
new: 24.0
path: .metrics.halstead.time
old: 1066.5007415365792
new: 21481.83633187731
path: .metrics.halstead.difficulty
old: 12.540983606557376
new: 44.865671641791046
path: .metrics.nom.total
old: 4.0
new: 22.0
path: .metrics.nom.functions
old: 4.0
new: 22.0
path: .metrics.cyclomatic.sum
old: 12.0
new: 51.0
path: .metrics.cyclomatic.average
old: 1.0909090909090908
new: 2.125
path: .metrics.mi.mi_original
old: 44.1922187778859
new: 16.660032505189733
path: .metrics.mi.mi_visual_studio
old: 25.84340279408532
new: 9.742709067362416
path: .metrics.mi.mi_sei
old: 33.01750305461307
new: -29.56400032990724
Spaces Data
Minimal test - lines (12, 363)
path: .spaces[0].metrics.cognitive.sum
old: 0.0
new: 28.0
path: .spaces[0].metrics.cognitive.average
old: 0.0
new: 1.2727272727272727
path: .spaces[0].metrics.nom.functions
old: 4.0
new: 22.0
path: .spaces[0].metrics.nom.total
old: 4.0
new: 22.0
path: .spaces[0].metrics.nargs.sum
old: 2.0
new: 46.0
path: .spaces[0].metrics.nargs.average
old: 0.5
new: 2.090909090909091
path: .spaces[0].metrics.loc.blank
old: 29.0
new: 70.0
path: .spaces[0].metrics.loc.ploc
old: 63.0
new: 270.0
path: .spaces[0].metrics.loc.cloc
old: 88.0
new: 12.0
path: .spaces[0].metrics.loc.sloc
old: 180.0
new: 352.0
path: .spaces[0].metrics.loc.lloc
old: 0.0
new: 112.0
path: .spaces[0].metrics.mi.mi_original
old: 46.40411779660957
new: 17.432595764759043
path: .spaces[0].metrics.mi.mi_sei
old: 36.539354007083006
new: -31.352230879204228
path: .spaces[0].metrics.mi.mi_visual_studio
old: 27.13691099216934
new: 10.194500447227512
path: .spaces[0].metrics.halstead.time
old: 1034.8154914699735
new: 21780.68340006682
path: .spaces[0].metrics.halstead.level
old: 0.07916666666666666
new: 0.021797451374916163
path: .spaces[0].metrics.halstead.effort
old: 18626.678846459527
new: 392052.3012012028
path: .spaces[0].metrics.halstead.n1
old: 15.0
new: 24.0
path: .spaces[0].metrics.halstead.length
old: 239.0
new: 1176.0
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.6363099989184855
new: 0.8698528194821487
path: .spaces[0].metrics.halstead.N2
old: 96.0
new: 497.0
path: .spaces[0].metrics.halstead.N1
old: 143.0
new: 679.0
path: .spaces[0].metrics.halstead.vocabulary
old: 72.0
new: 154.0
path: .spaces[0].metrics.halstead.difficulty
old: 12.63157894736842
new: 45.87692307692308
path: .spaces[0].metrics.halstead.volume
old: 1474.6120753447126
new: 8545.740971857203
path: .spaces[0].metrics.halstead.bugs
old: 0.23422632069460053
new: 1.785561241022543
path: .spaces[0].metrics.halstead.n2
old: 57.0
new: 130.0
path: .spaces[0].metrics.halstead.estimated_program_length
old: 391.07808974151806
new: 1022.9469157110068
path: .spaces[0].metrics.nexits.sum
old: 0.0
new: 25.0
path: .spaces[0].metrics.nexits.average
old: 0.0
new: 1.1363636363636365
path: .spaces[0].metrics.cyclomatic.average
old: 1.1
new: 2.1739130434782608
path: .spaces[0].metrics.cyclomatic.sum
old: 11.0
new: 50.0
Code
namespace mozilla {
using namespace ipc;
NS_IMPL_ADDREF(InputStreamLengthWrapper);
NS_IMPL_RELEASE(InputStreamLengthWrapper);
NS_INTERFACE_MAP_BEGIN(InputStreamLengthWrapper)
NS_INTERFACE_MAP_ENTRY(nsIInputStream)
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsICloneableInputStream,
mWeakCloneableInputStream || !mInputStream)
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(
nsIIPCSerializableInputStream,
mWeakIPCSerializableInputStream || !mInputStream)
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsISeekableStream,
mWeakSeekableInputStream || !mInputStream)
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsITellableStream,
mWeakTellableInputStream || !mInputStream)
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIAsyncInputStream,
mWeakAsyncInputStream || !mInputStream)
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIInputStreamCallback,
mWeakAsyncInputStream || !mInputStream)
NS_INTERFACE_MAP_ENTRY(nsIInputStreamLength)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIInputStream)
NS_INTERFACE_MAP_END
/* static */
already_AddRefed InputStreamLengthWrapper::MaybeWrap(
already_AddRefed aInputStream, int64_t aLength) {
nsCOMPtr inputStream = std::move(aInputStream);
MOZ_ASSERT(inputStream);
nsCOMPtr length = do_QueryInterface(inputStream);
if (length) {
return inputStream.forget();
}
nsCOMPtr asyncLength =
do_QueryInterface(inputStream);
if (asyncLength) {
return inputStream.forget();
}
nsCOMPtr asyncStream = do_QueryInterface(inputStream);
if (!asyncStream) {
return inputStream.forget();
}
inputStream = new InputStreamLengthWrapper(inputStream.forget(), aLength);
return inputStream.forget();
}
InputStreamLengthWrapper::InputStreamLengthWrapper(
already_AddRefed aInputStream, int64_t aLength)
: mWeakCloneableInputStream(nullptr),
mWeakIPCSerializableInputStream(nullptr),
mWeakSeekableInputStream(nullptr),
mWeakTellableInputStream(nullptr),
mWeakAsyncInputStream(nullptr),
mLength(aLength),
mConsumed(false),
mMutex("InputStreamLengthWrapper::mMutex") {
MOZ_ASSERT(mLength >= 0);
nsCOMPtr inputStream = std::move(aInputStream);
SetSourceStream(inputStream.forget());
}
InputStreamLengthWrapper::InputStreamLengthWrapper()
: mWeakCloneableInputStream(nullptr),
mWeakIPCSerializableInputStream(nullptr),
mWeakSeekableInputStream(nullptr),
mWeakTellableInputStream(nullptr),
mWeakAsyncInputStream(nullptr),
mLength(-1),
mConsumed(false),
mMutex("InputStreamLengthWrapper::mMutex") {}
InputStreamLengthWrapper::~InputStreamLengthWrapper() = default;
void InputStreamLengthWrapper::SetSourceStream(
already_AddRefed aInputStream) {
MOZ_ASSERT(!mInputStream);
mInputStream = std::move(aInputStream);
nsCOMPtr cloneableStream =
do_QueryInterface(mInputStream);
if (cloneableStream && SameCOMIdentity(mInputStream, cloneableStream)) {
mWeakCloneableInputStream = cloneableStream;
}
nsCOMPtr serializableStream =
do_QueryInterface(mInputStream);
if (serializableStream && SameCOMIdentity(mInputStream, serializableStream)) {
mWeakIPCSerializableInputStream = serializableStream;
}
nsCOMPtr seekableStream = do_QueryInterface(mInputStream);
if (seekableStream && SameCOMIdentity(mInputStream, seekableStream)) {
mWeakSeekableInputStream = seekableStream;
}
nsCOMPtr tellableStream = do_QueryInterface(mInputStream);
if (tellableStream && SameCOMIdentity(mInputStream, tellableStream)) {
mWeakTellableInputStream = tellableStream;
}
nsCOMPtr asyncInputStream =
do_QueryInterface(mInputStream);
if (asyncInputStream && SameCOMIdentity(mInputStream, asyncInputStream)) {
mWeakAsyncInputStream = asyncInputStream;
}
}
// nsIInputStream interface
NS_IMETHODIMP
InputStreamLengthWrapper::Close() {
NS_ENSURE_STATE(mInputStream);
return mInputStream->Close();
}
NS_IMETHODIMP
InputStreamLengthWrapper::Available(uint64_t* aLength) {
NS_ENSURE_STATE(mInputStream);
return mInputStream->Available(aLength);
}
NS_IMETHODIMP
InputStreamLengthWrapper::Read(char* aBuffer, uint32_t aCount,
uint32_t* aReadCount) {
NS_ENSURE_STATE(mInputStream);
mConsumed = true;
return mInputStream->Read(aBuffer, aCount, aReadCount);
}
NS_IMETHODIMP
InputStreamLengthWrapper::ReadSegments(nsWriteSegmentFun aWriter,
void* aClosure, uint32_t aCount,
uint32_t* aResult) {
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
InputStreamLengthWrapper::IsNonBlocking(bool* aNonBlocking) {
NS_ENSURE_STATE(mInputStream);
return mInputStream->IsNonBlocking(aNonBlocking);
}
// nsICloneableInputStream interface
NS_IMETHODIMP
InputStreamLengthWrapper::GetCloneable(bool* aCloneable) {
NS_ENSURE_STATE(mInputStream);
NS_ENSURE_STATE(mWeakCloneableInputStream);
mWeakCloneableInputStream->GetCloneable(aCloneable);
return NS_OK;
}
NS_IMETHODIMP
InputStreamLengthWrapper::Clone(nsIInputStream** aResult) {
NS_ENSURE_STATE(mInputStream);
NS_ENSURE_STATE(mWeakCloneableInputStream);
nsCOMPtr clonedStream;
nsresult rv = mWeakCloneableInputStream->Clone(getter_AddRefs(clonedStream));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
nsCOMPtr stream =
new InputStreamLengthWrapper(clonedStream.forget(), mLength);
stream.forget(aResult);
return NS_OK;
}
// nsIAsyncInputStream interface
NS_IMETHODIMP
InputStreamLengthWrapper::CloseWithStatus(nsresult aStatus) {
NS_ENSURE_STATE(mInputStream);
NS_ENSURE_STATE(mWeakAsyncInputStream);
mConsumed = true;
return mWeakAsyncInputStream->CloseWithStatus(aStatus);
}
NS_IMETHODIMP
InputStreamLengthWrapper::AsyncWait(nsIInputStreamCallback* aCallback,
uint32_t aFlags, uint32_t aRequestedCount,
nsIEventTarget* aEventTarget) {
NS_ENSURE_STATE(mInputStream);
NS_ENSURE_STATE(mWeakAsyncInputStream);
nsCOMPtr callback = this;
{
MutexAutoLock lock(mMutex);
if (mAsyncWaitCallback && aCallback) {
return NS_ERROR_FAILURE;
}
bool hadCallback = !!mAsyncWaitCallback;
mAsyncWaitCallback = aCallback;
if (!mAsyncWaitCallback) {
if (!hadCallback) {
// No pending operation.
return NS_OK;
}
// Abort current operation.
callback = nullptr;
}
}
return mWeakAsyncInputStream->AsyncWait(callback, aFlags, aRequestedCount,
aEventTarget);
}
// nsIInputStreamCallback
NS_IMETHODIMP
InputStreamLengthWrapper::OnInputStreamReady(nsIAsyncInputStream* aStream) {
MOZ_ASSERT(mInputStream);
MOZ_ASSERT(mWeakAsyncInputStream);
MOZ_ASSERT(mWeakAsyncInputStream == aStream);
nsCOMPtr callback;
{
MutexAutoLock lock(mMutex);
// We have been canceled in the meanwhile.
if (!mAsyncWaitCallback) {
return NS_OK;
}
callback.swap(mAsyncWaitCallback);
}
MOZ_ASSERT(callback);
return callback->OnInputStreamReady(this);
}
// nsIIPCSerializableInputStream
void InputStreamLengthWrapper::Serialize(
mozilla::ipc::InputStreamParams& aParams,
FileDescriptorArray& aFileDescriptors, bool aDelayedStart,
uint32_t aMaxSize, uint32_t* aSizeUsed,
mozilla::ipc::ParentToChildStreamActorManager* aManager) {
SerializeInternal(aParams, aFileDescriptors, aDelayedStart, aMaxSize,
aSizeUsed, aManager);
}
void InputStreamLengthWrapper::Serialize(
mozilla::ipc::InputStreamParams& aParams,
FileDescriptorArray& aFileDescriptors, bool aDelayedStart,
uint32_t aMaxSize, uint32_t* aSizeUsed,
mozilla::ipc::ChildToParentStreamActorManager* aManager) {
SerializeInternal(aParams, aFileDescriptors, aDelayedStart, aMaxSize,
aSizeUsed, aManager);
}
template
void InputStreamLengthWrapper::SerializeInternal(
mozilla::ipc::InputStreamParams& aParams,
FileDescriptorArray& aFileDescriptors, bool aDelayedStart,
uint32_t aMaxSize, uint32_t* aSizeUsed, M* aManager) {
MOZ_ASSERT(mInputStream);
MOZ_ASSERT(mWeakIPCSerializableInputStream);
InputStreamLengthWrapperParams params;
InputStreamHelper::SerializeInputStream(mInputStream, params.stream(),
aFileDescriptors, aDelayedStart,
aMaxSize, aSizeUsed, aManager);
params.length() = mLength;
params.consumed() = mConsumed;
aParams = params;
}
bool InputStreamLengthWrapper::Deserialize(
const mozilla::ipc::InputStreamParams& aParams,
const FileDescriptorArray& aFileDescriptors) {
MOZ_ASSERT(!mInputStream);
MOZ_ASSERT(!mWeakIPCSerializableInputStream);
if (aParams.type() != InputStreamParams::TInputStreamLengthWrapperParams) {
NS_ERROR("Received unknown parameters from the other process!");
return false;
}
const InputStreamLengthWrapperParams& params =
aParams.get_InputStreamLengthWrapperParams();
nsCOMPtr stream = InputStreamHelper::DeserializeInputStream(
params.stream(), aFileDescriptors);
if (!stream) {
NS_WARNING("Deserialize failed!");
return false;
}
SetSourceStream(stream.forget());
mLength = params.length();
mConsumed = params.consumed();
return true;
}
// nsISeekableStream
NS_IMETHODIMP
InputStreamLengthWrapper::Seek(int32_t aWhence, int64_t aOffset) {
NS_ENSURE_STATE(mInputStream);
NS_ENSURE_STATE(mWeakSeekableInputStream);
mConsumed = true;
return mWeakSeekableInputStream->Seek(aWhence, aOffset);
}
NS_IMETHODIMP
InputStreamLengthWrapper::SetEOF() {
NS_ENSURE_STATE(mInputStream);
NS_ENSURE_STATE(mWeakSeekableInputStream);
mConsumed = true;
return mWeakSeekableInputStream->SetEOF();
}
// nsITellableStream
NS_IMETHODIMP
InputStreamLengthWrapper::Tell(int64_t* aResult) {
NS_ENSURE_STATE(mInputStream);
NS_ENSURE_STATE(mWeakTellableInputStream);
return mWeakTellableInputStream->Tell(aResult);
}
// nsIInputStreamLength
NS_IMETHODIMP
InputStreamLengthWrapper::Length(int64_t* aLength) {
NS_ENSURE_STATE(mInputStream);
*aLength = mLength;
return NS_OK;
}
} // namespace mozilla
Minimal test - lines (39, 62)
path: .spaces[0].spaces[0].metrics.cognitive.average
old: null
new: 3.0
path: .spaces[0].spaces[0].metrics.cognitive.sum
old: 0.0
new: 3.0
path: .spaces[0].spaces[0].metrics.halstead.level
old: null
new: 0.05714285714285714
path: .spaces[0].spaces[0].metrics.halstead.n1
old: 0.0
new: 14.0
path: .spaces[0].spaces[0].metrics.halstead.vocabulary
old: 1.0
new: 32.0
path: .spaces[0].spaces[0].metrics.halstead.difficulty
old: 0.0
new: 17.5
path: .spaces[0].spaces[0].metrics.halstead.bugs
old: 0.0
new: 0.15082705019460738
path: .spaces[0].spaces[0].metrics.halstead.N1
old: 0.0
new: 65.0
path: .spaces[0].spaces[0].metrics.halstead.length
old: 1.0
new: 110.0
path: .spaces[0].spaces[0].metrics.halstead.n2
old: 1.0
new: 18.0
path: .spaces[0].spaces[0].metrics.halstead.volume
old: 0.0
new: 550.0
path: .spaces[0].spaces[0].metrics.halstead.N2
old: 1.0
new: 45.0
path: .spaces[0].spaces[0].metrics.halstead.purity_ratio
old: null
new: 1.1669238084978917
path: .spaces[0].spaces[0].metrics.halstead.effort
old: 0.0
new: 9625.0
path: .spaces[0].spaces[0].metrics.halstead.time
old: 0.0
new: 534.7222222222222
path: .spaces[0].spaces[0].metrics.halstead.estimated_program_length
old: null
new: 128.36161893476807
path: .spaces[0].spaces[0].metrics.nom.functions
old: 0.0
new: 1.0
path: .spaces[0].spaces[0].metrics.nom.total
old: 0.0
new: 1.0
path: .spaces[0].spaces[0].metrics.nexits.sum
old: 0.0
new: 4.0
path: .spaces[0].spaces[0].metrics.nexits.average
old: null
new: 4.0
path: .spaces[0].spaces[0].metrics.loc.sloc
old: 1.0
new: 24.0
path: .spaces[0].spaces[0].metrics.loc.ploc
old: 1.0
new: 20.0
path: .spaces[0].spaces[0].metrics.loc.lloc
old: 0.0
new: 9.0
path: .spaces[0].spaces[0].metrics.loc.blank
old: 0.0
new: 4.0
path: .spaces[0].spaces[0].metrics.cyclomatic.average
old: 1.0
new: 4.0
path: .spaces[0].spaces[0].metrics.cyclomatic.sum
old: 1.0
new: 4.0
path: .spaces[0].spaces[0].metrics.mi.mi_visual_studio
old: null
new: 50.16605432841252
path: .spaces[0].spaces[0].metrics.mi.mi_sei
old: null
new: 48.46651088457476
path: .spaces[0].spaces[0].metrics.mi.mi_original
old: null
new: 85.78395290158542
path: .spaces[0].spaces[0].metrics.nargs.sum
old: 0.0
new: 2.0
path: .spaces[0].spaces[0].metrics.nargs.average
old: null
new: 2.0
Code
already_AddRefed InputStreamLengthWrapper::MaybeWrap(
already_AddRefed aInputStream, int64_t aLength) {
nsCOMPtr inputStream = std::move(aInputStream);
MOZ_ASSERT(inputStream);
nsCOMPtr length = do_QueryInterface(inputStream);
if (length) {
return inputStream.forget();
}
nsCOMPtr asyncLength =
do_QueryInterface(inputStream);
if (asyncLength) {
return inputStream.forget();
}
nsCOMPtr asyncStream = do_QueryInterface(inputStream);
if (!asyncStream) {
return inputStream.forget();
}
inputStream = new InputStreamLengthWrapper(inputStream.forget(), aLength);
return inputStream.forget();
}
Minimal test - lines (64, 78)
path: .spaces[0].spaces[1].metrics.nargs.average
old: 0.5
new: 2.0
path: .spaces[0].spaces[1].metrics.cyclomatic.sum
old: 9.0
new: 1.0
path: .spaces[0].spaces[1].metrics.cyclomatic.average
old: 1.125
new: 1.0
path: .spaces[0].spaces[1].metrics.halstead.length
old: 234.0
new: 68.0
path: .spaces[0].spaces[1].metrics.halstead.N1
old: 140.0
new: 36.0
path: .spaces[0].spaces[1].metrics.halstead.purity_ratio
old: 1.640236045168178
new: 2.1626687499700763
path: .spaces[0].spaces[1].metrics.halstead.level
old: 0.07943262411347518
new: 0.11979166666666669
path: .spaces[0].spaces[1].metrics.halstead.bugs
old: 0.2299295990737218
new: 0.06796803650515304
path: .spaces[0].spaces[1].metrics.halstead.volume
old: 1439.0408259640956
new: 348.7912451522577
path: .spaces[0].spaces[1].metrics.halstead.n1
old: 15.0
new: 12.0
path: .spaces[0].spaces[1].metrics.halstead.effort
old: 18116.496112583704
new: 2911.6486551840644
path: .spaces[0].spaces[1].metrics.halstead.estimated_program_length
old: 383.8152345693536
new: 147.06147499796518
path: .spaces[0].spaces[1].metrics.halstead.vocabulary
old: 71.0
new: 35.0
path: .spaces[0].spaces[1].metrics.halstead.n2
old: 56.0
new: 23.0
path: .spaces[0].spaces[1].metrics.halstead.difficulty
old: 12.589285714285714
new: 8.347826086956522
path: .spaces[0].spaces[1].metrics.halstead.N2
old: 94.0
new: 32.0
path: .spaces[0].spaces[1].metrics.halstead.time
old: 1006.4720062546502
new: 161.75825862133692
path: .spaces[0].spaces[1].metrics.nom.total
old: 4.0
new: 1.0
path: .spaces[0].spaces[1].metrics.nom.functions
old: 4.0
new: 1.0
path: .spaces[0].spaces[1].metrics.loc.lloc
old: 0.0
new: 2.0
path: .spaces[0].spaces[1].metrics.loc.cloc
old: 87.0
new: 0.0
path: .spaces[0].spaces[1].metrics.loc.sloc
old: 172.0
new: 15.0
path: .spaces[0].spaces[1].metrics.loc.blank
old: 25.0
new: 1.0
path: .spaces[0].spaces[1].metrics.loc.ploc
old: 60.0
new: 14.0
path: .spaces[0].spaces[1].metrics.mi.mi_sei
old: 38.67289301098203
new: 63.5580282579424
path: .spaces[0].spaces[1].metrics.mi.mi_original
old: 47.72758267235686
new: 96.45632406472026
path: .spaces[0].spaces[1].metrics.mi.mi_visual_studio
old: 27.91086705985781
new: 56.40720705539197
Code
InputStreamLengthWrapper::InputStreamLengthWrapper(
already_AddRefed aInputStream, int64_t aLength)
: mWeakCloneableInputStream(nullptr),
mWeakIPCSerializableInputStream(nullptr),
mWeakSeekableInputStream(nullptr),
mWeakTellableInputStream(nullptr),
mWeakAsyncInputStream(nullptr),
mLength(aLength),
mConsumed(false),
mMutex("InputStreamLengthWrapper::mMutex") {
MOZ_ASSERT(mLength >= 0);
nsCOMPtr inputStream = std::move(aInputStream);
SetSourceStream(inputStream.forget());
}