Make cfx_globalarray a move-only type. Prevents the need for a complicated deep-copy in copy assignment. Change-Id: I06bfb12768ddcfc05a14e200a91e5c090bcc2be5 Reviewed-on: https://pdfium-review.googlesource.com/c/45110 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/cfx_globalarray.cpp b/fxjs/cfx_globalarray.cpp index 4fbaba1..6d0b6e5 100644 --- a/fxjs/cfx_globalarray.cpp +++ b/fxjs/cfx_globalarray.cpp
@@ -13,54 +13,11 @@ CFX_GlobalArray::CFX_GlobalArray() = default; +CFX_GlobalArray::CFX_GlobalArray(CFX_GlobalArray&& that) = default; + CFX_GlobalArray::~CFX_GlobalArray() = default; -CFX_GlobalArray& CFX_GlobalArray::operator=(const CFX_GlobalArray& that) { - if (this == &that) - return *this; - - m_Array.clear(); - for (size_t i = 0, sz = that.Count(); i < sz; i++) { - CFX_KeyValue* pOldObjData = that.GetAt(i); - switch (pOldObjData->nType) { - case CFX_KeyValue::DataType::NUMBER: { - auto pNewObjData = pdfium::MakeUnique<CFX_KeyValue>(); - pNewObjData->sKey = pOldObjData->sKey; - pNewObjData->nType = pOldObjData->nType; - pNewObjData->dData = pOldObjData->dData; - Add(std::move(pNewObjData)); - } break; - case CFX_KeyValue::DataType::BOOLEAN: { - auto pNewObjData = pdfium::MakeUnique<CFX_KeyValue>(); - pNewObjData->sKey = pOldObjData->sKey; - pNewObjData->nType = pOldObjData->nType; - pNewObjData->bData = pOldObjData->bData; - Add(std::move(pNewObjData)); - } break; - case CFX_KeyValue::DataType::STRING: { - auto pNewObjData = pdfium::MakeUnique<CFX_KeyValue>(); - pNewObjData->sKey = pOldObjData->sKey; - pNewObjData->nType = pOldObjData->nType; - pNewObjData->sData = pOldObjData->sData; - Add(std::move(pNewObjData)); - } break; - case CFX_KeyValue::DataType::OBJECT: { - auto pNewObjData = pdfium::MakeUnique<CFX_KeyValue>(); - pNewObjData->sKey = pOldObjData->sKey; - pNewObjData->nType = pOldObjData->nType; - pNewObjData->objData = pOldObjData->objData; - Add(std::move(pNewObjData)); - } break; - case CFX_KeyValue::DataType::NULLOBJ: { - auto pNewObjData = pdfium::MakeUnique<CFX_KeyValue>(); - pNewObjData->sKey = pOldObjData->sKey; - pNewObjData->nType = pOldObjData->nType; - Add(std::move(pNewObjData)); - } break; - } - } - return *this; -} +CFX_GlobalArray& CFX_GlobalArray::operator=(CFX_GlobalArray&& array) = default; void CFX_GlobalArray::Add(std::unique_ptr<CFX_KeyValue> pKeyValue) { m_Array.push_back(std::move(pKeyValue));
diff --git a/fxjs/cfx_globalarray.h b/fxjs/cfx_globalarray.h index a943860..e7e0bde 100644 --- a/fxjs/cfx_globalarray.h +++ b/fxjs/cfx_globalarray.h
@@ -15,9 +15,12 @@ class CFX_GlobalArray { public: CFX_GlobalArray(); + CFX_GlobalArray(const CFX_GlobalArray& that) = delete; + CFX_GlobalArray(CFX_GlobalArray&& that); ~CFX_GlobalArray(); - CFX_GlobalArray& operator=(const CFX_GlobalArray& array); + CFX_GlobalArray& operator=(const CFX_GlobalArray& array) = delete; + CFX_GlobalArray& operator=(CFX_GlobalArray&& array); void Add(std::unique_ptr<CFX_KeyValue> pKeyValue); size_t Count() const;
diff --git a/fxjs/cfx_globaldata.cpp b/fxjs/cfx_globaldata.cpp index f199025..c6f9e91 100644 --- a/fxjs/cfx_globaldata.cpp +++ b/fxjs/cfx_globaldata.cpp
@@ -147,20 +147,20 @@ } void CFX_GlobalData::SetGlobalVariableObject(ByteString sPropName, - const CFX_GlobalArray& array) { + CFX_GlobalArray array) { if (!TrimPropName(&sPropName)) return; CFX_GlobalData::Element* pData = GetGlobalVariable(sPropName); if (pData) { pData->data.nType = CFX_KeyValue::DataType::OBJECT; - pData->data.objData = array; + pData->data.objData = std::move(array); return; } auto pNewData = pdfium::MakeUnique<CFX_GlobalData::Element>(); pNewData->data.sKey = std::move(sPropName); pNewData->data.nType = CFX_KeyValue::DataType::OBJECT; - pNewData->data.objData = array; + pNewData->data.objData = std::move(array); m_arrayGlobalData.push_back(std::move(pNewData)); }
diff --git a/fxjs/cfx_globaldata.h b/fxjs/cfx_globaldata.h index dac044c..b567017 100644 --- a/fxjs/cfx_globaldata.h +++ b/fxjs/cfx_globaldata.h
@@ -44,8 +44,7 @@ void SetGlobalVariableNumber(ByteString propname, double dData); void SetGlobalVariableBoolean(ByteString propname, bool bData); void SetGlobalVariableString(ByteString propname, const ByteString& sData); - void SetGlobalVariableObject(ByteString propname, - const CFX_GlobalArray& array); + void SetGlobalVariableObject(ByteString propname, CFX_GlobalArray array); void SetGlobalVariableNull(ByteString propname); bool SetGlobalVariablePersistent(ByteString propname, bool bPersistent); bool DeleteGlobalVariable(ByteString propname);
diff --git a/fxjs/cjs_global.cpp b/fxjs/cjs_global.cpp index 5b548cd..fd3a9ac 100644 --- a/fxjs/cjs_global.cpp +++ b/fxjs/cjs_global.cpp
@@ -400,7 +400,7 @@ v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(GetIsolate(), pData->pData); ObjectToArray(pRuntime, obj, &array); - m_pGlobalData->SetGlobalVariableObject(name, array); + m_pGlobalData->SetGlobalVariableObject(name, std::move(array)); m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); } break; case CFX_KeyValue::DataType::NULLOBJ: