diff --git a/dom/fetch/InternalRequest.cpp b/dom/fetch/InternalRequest.cpp index 9ef834f2287d..380edd673f3e 100644 --- a/dom/fetch/InternalRequest.cpp +++ b/dom/fetch/InternalRequest.cpp @@ -180,7 +180,7 @@ void InternalRequest::ToIPC( MOZ_ASSERT(!mURLList.IsEmpty()); aIPCRequest->method() = mMethod; - aIPCRequest->urlList() = mURLList; + aIPCRequest->urlList() = mURLList.Clone(); mHeaders->ToIPC(aIPCRequest->headers(), aIPCRequest->headersGuard()); if (mBodyStream) { diff --git a/dom/ipc/JSProcessActorProtocol.cpp b/dom/ipc/JSProcessActorProtocol.cpp index df6527958630..17c39ebfc700 100644 --- a/dom/ipc/JSProcessActorProtocol.cpp +++ b/dom/ipc/JSProcessActorProtocol.cpp @@ -38,9 +38,9 @@ JSProcessActorInfo JSProcessActorProtocol::ToIPC() { JSProcessActorInfo info; info.name() = mName; - info.remoteTypes() = mRemoteTypes; + info.remoteTypes() = mRemoteTypes.Clone(); info.url() = mChild.mModuleURI; - info.observers() = mChild.mObservers; + info.observers() = mChild.mObservers.Clone(); return info; } diff --git a/dom/ipc/JSWindowActorProtocol.cpp b/dom/ipc/JSWindowActorProtocol.cpp index c7df4f549801..76eece54991b 100644 --- a/dom/ipc/JSWindowActorProtocol.cpp +++ b/dom/ipc/JSWindowActorProtocol.cpp @@ -56,9 +56,9 @@ JSWindowActorInfo JSWindowActorProtocol::ToIPC() { JSWindowActorInfo info; info.name() = mName; info.allFrames() = mAllFrames; - info.matches() = mMatches; - info.remoteTypes() = mRemoteTypes; - info.messageManagerGroups() = mMessageManagerGroups; + info.matches() = mMatches.Clone(); + info.remoteTypes() = mRemoteTypes.Clone(); + info.messageManagerGroups() = mMessageManagerGroups.Clone(); info.url() = mChild.mModuleURI; info.events().SetCapacity(mChild.mEvents.Length()); @@ -73,7 +73,7 @@ JSWindowActorInfo JSWindowActorProtocol::ToIPC() { } } - info.observers() = mChild.mObservers; + info.observers() = mChild.mObservers.Clone(); return info; } diff --git a/dom/media/platforms/agnostic/eme/ChromiumCDMVideoDecoder.cpp b/dom/media/platforms/agnostic/eme/ChromiumCDMVideoDecoder.cpp index cbe19f4b3070..e92cb7dedb75 100644 --- a/dom/media/platforms/agnostic/eme/ChromiumCDMVideoDecoder.cpp +++ b/dom/media/platforms/agnostic/eme/ChromiumCDMVideoDecoder.cpp @@ -57,7 +57,7 @@ RefPtr ChromiumCDMVideoDecoder::Init() { config.mCodec() = cdm::VideoCodec::kCodecH264; config.mProfile() = ToCDMH264Profile(mConfig.mExtraData->SafeElementAt(1, 0)); - config.mExtraData() = *mConfig.mExtraData; + config.mExtraData() = mConfig.mExtraData->Clone(); mConvertToAnnexB = true; } else if (VPXDecoder::IsVP8(mConfig.mMimeType)) { config.mCodec() = cdm::VideoCodec::kCodecVp8; diff --git a/gfx/layers/ipc/ShadowLayers.cpp b/gfx/layers/ipc/ShadowLayers.cpp index f686b1e1b681..6dde300d59d9 100644 --- a/gfx/layers/ipc/ShadowLayers.cpp +++ b/gfx/layers/ipc/ShadowLayers.cpp @@ -630,9 +630,10 @@ bool ShadowLayerForwarder::EndTransaction( common.maskLayer() = LayerHandle(); } common.compositorAnimations().id() = mutant->GetCompositorAnimationsId(); - common.compositorAnimations().animations() = mutant->GetAnimations(); + common.compositorAnimations().animations() = + mutant->GetAnimations().Clone(); common.invalidRegion() = mutant->GetInvalidRegion().GetRegion(); - common.scrollMetadata() = mutant->GetAllScrollMetadata(); + common.scrollMetadata() = mutant->GetAllScrollMetadata().Clone(); for (size_t i = 0; i < mutant->GetAncestorMaskLayerCount(); i++) { auto layer = Shadow(mutant->GetAncestorMaskLayerAt(i)->AsShadowableLayer()); @@ -659,10 +660,10 @@ bool ShadowLayerForwarder::EndTransaction( info.setSimpleAttrs() = std::move(setSimpleAttrs); info.setAttrs() = std::move(setAttrs); info.paints() = std::move(mTxn->mPaints); - info.toDestroy() = mTxn->mDestroyedActors; + info.toDestroy() = mTxn->mDestroyedActors.Clone(); info.fwdTransactionId() = GetFwdTransactionId(); info.id() = aId; - info.plugins() = mPluginWindowData; + info.plugins() = mPluginWindowData.Clone(); info.isFirstPaint() = mIsFirstPaint; info.focusTarget() = mFocusTarget; info.scheduleComposite() = aScheduleComposite; @@ -677,7 +678,7 @@ bool ShadowLayerForwarder::EndTransaction( #if defined(ENABLE_FRAME_LATENCY_LOG) info.fwdTime() = TimeStamp::Now(); #endif - info.payload() = aPayload; + info.payload() = aPayload.Clone(); TargetConfig targetConfig(mTxn->mTargetBounds, mTxn->mTargetRotation, mTxn->mTargetOrientation, aRegionToClear); diff --git a/ipc/ipdl/ipdl/lower.py b/ipc/ipdl/ipdl/lower.py index 1292d408a614..228a1ae55fc1 100644 --- a/ipc/ipdl/ipdl/lower.py +++ b/ipc/ipdl/ipdl/lower.py @@ -942,6 +942,8 @@ IPDL union type.""" def callOperatorEq(self, rhs): if self.ipdltype.isIPDL() and self.ipdltype.isActor(): rhs = ExprCast(rhs, self.bareType(), const=True) + elif self.ipdltype.isIPDL() and self.ipdltype.isArray() and not isinstance(rhs, ExprMove): + rhs = ExprCall(ExprSelect(rhs, '.', 'Clone'), args=[]) return ExprAssn(ExprDeref(self.callGetPtr()), rhs) def callCtor(self, expr=None): @@ -951,6 +953,8 @@ IPDL union type.""" args = None elif self.ipdltype.isIPDL() and self.ipdltype.isActor(): args = [ExprCast(expr, self.bareType(), const=True)] + elif self.ipdltype.isIPDL() and self.ipdltype.isArray() and not isinstance(expr, ExprMove): + args = [ExprCall(ExprSelect(expr, '.', 'Clone'), args=[])] else: args = [expr] @@ -2519,11 +2523,22 @@ def _generateCxxStruct(sd): struct.addstmts([method]) # members - struct.addstmts([StmtDecl(Decl(f.bareType(), f.memberVar().name)) + struct.addstmts([StmtDecl(Decl(_effectiveMemberType(f), f.memberVar().name)) for f in sd.fields_member_order()]) return forwarddeclstmts, fulldecltypes, struct + +def _effectiveMemberType(f): + effective_type = f.bareType() + # Structs must be copyable for backwards compatibility reasons, so we use + # CopyableTArray as their member type for arrays. This is not exposed + # in the method signatures, these keep using nsTArray, which is a base + # class of CopyableTArray. + if effective_type.name == "nsTArray": + effective_type.name = "CopyableTArray" + return effective_type + # -------------------------------------------------- @@ -3004,9 +3019,12 @@ def _generateCxxUnion(ud): readvalue = MethodDefn(MethodDecl( 'get', ret=Type.VOID, const=True, params=[Decl(c.ptrToType(), 'aOutValue')])) + rhs = ExprCall(getConstValueVar) + if c.ipdltype.isIPDL() and c.ipdltype.isArray(): + rhs = ExprCall(ExprSelect(rhs, '.', 'Clone'), args=[]) readvalue.addstmts([ StmtExpr(ExprAssn(ExprDeref(ExprVar('aOutValue')), - ExprCall(getConstValueVar))) + rhs)) ]) cls.addstmt(readvalue) diff --git a/media/mtransport/ipc/WebrtcTCPSocket.cpp b/media/mtransport/ipc/WebrtcTCPSocket.cpp index 68fbed9dc382..f6345bd84768 100644 --- a/media/mtransport/ipc/WebrtcTCPSocket.cpp +++ b/media/mtransport/ipc/WebrtcTCPSocket.cpp @@ -29,7 +29,7 @@ namespace net { class WebrtcTCPData { public: - explicit WebrtcTCPData(nsTArray&& aData) : mData(aData) { + explicit WebrtcTCPData(nsTArray&& aData) : mData(std::move(aData)) { MOZ_COUNT_CTOR(WebrtcTCPData); } diff --git a/media/mtransport/nr_socket_tcp.cpp b/media/mtransport/nr_socket_tcp.cpp index 39aa65632742..46f086803462 100644 --- a/media/mtransport/nr_socket_tcp.cpp +++ b/media/mtransport/nr_socket_tcp.cpp @@ -52,7 +52,8 @@ using std::shared_ptr; class NrTcpSocketData { public: - explicit NrTcpSocketData(nsTArray&& aData) : mData(aData) { + explicit NrTcpSocketData(nsTArray&& aData) + : mData(std::move(aData)) { MOZ_COUNT_CTOR(NrTcpSocketData); } diff --git a/netwerk/base/nsMIMEInputStream.cpp b/netwerk/base/nsMIMEInputStream.cpp index 82ea96c77ff2..35ca7bb5c5e3 100644 --- a/netwerk/base/nsMIMEInputStream.cpp +++ b/netwerk/base/nsMIMEInputStream.cpp @@ -375,7 +375,7 @@ void nsMIMEInputStream::SerializeInternal(InputStreamParams& aParams, params.optionalStream().emplace(wrappedParams); } - params.headers() = mHeaders; + params.headers() = mHeaders.Clone(); params.startedReading() = mStartedReading; aParams = params; diff --git a/netwerk/ipc/DocumentLoadListener.cpp b/netwerk/ipc/DocumentLoadListener.cpp index 065db09ed86d..5e0bcf1b6827 100644 --- a/netwerk/ipc/DocumentLoadListener.cpp +++ b/netwerk/ipc/DocumentLoadListener.cpp @@ -1137,7 +1137,7 @@ void DocumentLoadListener::SerializeRedirectData( aArgs.newLoadFlags() = aLoadFlags; aArgs.redirectFlags() = aRedirectFlags; - aArgs.redirects() = mRedirects; + aArgs.redirects() = mRedirects.Clone(); aArgs.redirectIdentifier() = mCrossProcessRedirectIdentifier; aArgs.properties() = do_QueryObject(mChannel.get()); aArgs.lastVisitInfo() = LastVisitInfo(); diff --git a/netwerk/protocol/http/HttpChannelChild.cpp b/netwerk/protocol/http/HttpChannelChild.cpp index 26d995b1fcbc..131835774e3e 100644 --- a/netwerk/protocol/http/HttpChannelChild.cpp +++ b/netwerk/protocol/http/HttpChannelChild.cpp @@ -2692,7 +2692,7 @@ nsresult HttpChannelChild::ContinueAsyncOpen() { openArgs.loadFlags() = mLoadFlags; openArgs.requestHeaders() = mClientSetRequestHeaders; mRequestHead.Method(openArgs.requestMethod()); - openArgs.preferredAlternativeTypes() = mPreferredCachedAltDataTypes; + openArgs.preferredAlternativeTypes() = mPreferredCachedAltDataTypes.Clone(); openArgs.referrerInfo() = mReferrerInfo; AutoIPCStream autoStream(openArgs.uploadStream()); @@ -3398,7 +3398,7 @@ void HttpChannelChild::GetClientSetCorsPreflightParameters( Maybe& aArgs) { if (mRequireCORSPreflight) { CorsPreflightArgs args; - args.unsafeHeaders() = mUnsafeHeaders; + args.unsafeHeaders() = mUnsafeHeaders.Clone(); aArgs.emplace(args); } else { aArgs = Nothing(); diff --git a/netwerk/protocol/http/nsHttpConnectionInfo.cpp b/netwerk/protocol/http/nsHttpConnectionInfo.cpp index 40ea20ea1ffb..61176b972c86 100644 --- a/netwerk/protocol/http/nsHttpConnectionInfo.cpp +++ b/netwerk/protocol/http/nsHttpConnectionInfo.cpp @@ -371,7 +371,7 @@ void nsHttpConnectionInfo::SerializeHttpConnectionInfo( nsTArray proxyInfoArray; nsProxyInfo::SerializeProxyInfo(aInfo->ProxyInfo(), proxyInfoArray); - aArgs.proxyInfo() = proxyInfoArray; + aArgs.proxyInfo() = std::move(proxyInfoArray); } // This function needs to be synced with nsHttpConnectionInfo::Clone. diff --git a/security/manager/ssl/DataStorage.cpp b/security/manager/ssl/DataStorage.cpp index c628d7fde8e6..19e525ae9d1b 100644 --- a/security/manager/ssl/DataStorage.cpp +++ b/security/manager/ssl/DataStorage.cpp @@ -279,7 +279,7 @@ void DataStorage::SetCachedStorageEntries( entry.filename() = NS_LITERAL_STRING(#_ ".txt"); \ for (auto& e : aEntries) { \ if (entry.filename().Equals(e.filename())) { \ - entry.items() = std::move(e.items()); \ + entry.items() = e.items().Clone(); \ break; \ } \ } \ diff --git a/tools/profiler/gecko/ProfilerParent.cpp b/tools/profiler/gecko/ProfilerParent.cpp index 61e353e99dff..c8dc83b94f01 100644 --- a/tools/profiler/gecko/ProfilerParent.cpp +++ b/tools/profiler/gecko/ProfilerParent.cpp @@ -190,7 +190,7 @@ void ProfilerParent::ProfilerStarted(nsIProfilerStartParams* aParams) { } aParams->GetInterval(&ipcParams.interval()); aParams->GetFeatures(&ipcParams.features()); - ipcParams.filters() = aParams->GetFilters(); + ipcParams.filters() = aParams->GetFilters().Clone(); aParams->GetActiveBrowsingContextID(&ipcParams.activeBrowsingContextID()); ProfilerParentTracker::Enumerate([&](ProfilerParent* profilerParent) {