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: