| Index: core/fpdfapi/page/cpdf_streamparser.cpp
|
| diff --git a/core/fpdfapi/page/cpdf_streamparser.cpp b/core/fpdfapi/page/cpdf_streamparser.cpp
|
| index f271e58d78e36e2a8dc4f74a6c40634c7020fd79..2901d3b50baf25f91257706f121c0f0af5fe73f7 100644
|
| --- a/core/fpdfapi/page/cpdf_streamparser.cpp
|
| +++ b/core/fpdfapi/page/cpdf_streamparser.cpp
|
| @@ -8,6 +8,7 @@
|
|
|
| #include <limits.h>
|
|
|
| +#include <memory>
|
| #include <utility>
|
|
|
| #include "core/fpdfapi/cpdf_modulemgr.h"
|
| @@ -112,7 +113,6 @@ CPDF_StreamParser::CPDF_StreamParser(const uint8_t* pData, uint32_t dwSize)
|
| : m_pBuf(pData),
|
| m_Size(dwSize),
|
| m_Pos(0),
|
| - m_pLastObj(nullptr),
|
| m_pPool(nullptr) {}
|
|
|
| CPDF_StreamParser::CPDF_StreamParser(
|
| @@ -122,16 +122,14 @@ CPDF_StreamParser::CPDF_StreamParser(
|
| : m_pBuf(pData),
|
| m_Size(dwSize),
|
| m_Pos(0),
|
| - m_pLastObj(nullptr),
|
| m_pPool(pPool) {}
|
|
|
| -CPDF_StreamParser::~CPDF_StreamParser() {
|
| - delete m_pLastObj;
|
| -}
|
| +CPDF_StreamParser::~CPDF_StreamParser() {}
|
|
|
| -CPDF_Stream* CPDF_StreamParser::ReadInlineStream(CPDF_Document* pDoc,
|
| - CPDF_Dictionary* pDict,
|
| - CPDF_Object* pCSObj) {
|
| +std::unique_ptr<CPDF_Stream> CPDF_StreamParser::ReadInlineStream(
|
| + CPDF_Document* pDoc,
|
| + CPDF_Dictionary* pDict,
|
| + CPDF_Object* pCSObj) {
|
| if (m_Pos == m_Size)
|
| return nullptr;
|
|
|
| @@ -233,15 +231,13 @@ CPDF_Stream* CPDF_StreamParser::ReadInlineStream(CPDF_Document* pDoc,
|
| m_Pos += dwStreamSize;
|
| }
|
| pDict->SetNewFor<CPDF_Number>("Length", (int)dwStreamSize);
|
| - return new CPDF_Stream(pData, dwStreamSize, pdfium::WrapUnique(pDict));
|
| + return pdfium::MakeUnique<CPDF_Stream>(pData, dwStreamSize,
|
| + pdfium::WrapUnique(pDict));
|
| }
|
|
|
| CPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement() {
|
| - delete m_pLastObj;
|
| - m_pLastObj = nullptr;
|
| -
|
| + m_pLastObj.reset();
|
| m_WordSize = 0;
|
| - bool bIsNumber = true;
|
| if (!PositionIsInBounds())
|
| return EndOfData;
|
|
|
| @@ -273,6 +269,7 @@ CPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement() {
|
| return Others;
|
| }
|
|
|
| + bool bIsNumber = true;
|
| while (1) {
|
| if (m_WordSize < kMaxWordBuffer)
|
| m_WordBuffer[m_WordSize++] = ch;
|
| @@ -300,30 +297,25 @@ CPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement() {
|
|
|
| if (m_WordSize == 4) {
|
| if (memcmp(m_WordBuffer, "true", 4) == 0) {
|
| - m_pLastObj = new CPDF_Boolean(true);
|
| + m_pLastObj = pdfium::MakeUnique<CPDF_Boolean>(true);
|
| return Others;
|
| }
|
| if (memcmp(m_WordBuffer, "null", 4) == 0) {
|
| - m_pLastObj = new CPDF_Null;
|
| + m_pLastObj = pdfium::MakeUnique<CPDF_Null>();
|
| return Others;
|
| }
|
| } else if (m_WordSize == 5) {
|
| if (memcmp(m_WordBuffer, "false", 5) == 0) {
|
| - m_pLastObj = new CPDF_Boolean(false);
|
| + m_pLastObj = pdfium::MakeUnique<CPDF_Boolean>(false);
|
| return Others;
|
| }
|
| }
|
| return Keyword;
|
| }
|
|
|
| -CPDF_Object* CPDF_StreamParser::GetObject() {
|
| - CPDF_Object* pObj = m_pLastObj;
|
| - m_pLastObj = nullptr;
|
| - return pObj;
|
| -}
|
| -
|
| -CPDF_Object* CPDF_StreamParser::ReadNextObject(bool bAllowNestedArray,
|
| - uint32_t dwInArrayLevel) {
|
| +std::unique_ptr<CPDF_Object> CPDF_StreamParser::ReadNextObject(
|
| + bool bAllowNestedArray,
|
| + uint32_t dwInArrayLevel) {
|
| bool bIsNumber;
|
| GetNextWord(bIsNumber);
|
| if (!m_WordSize)
|
| @@ -331,47 +323,45 @@ CPDF_Object* CPDF_StreamParser::ReadNextObject(bool bAllowNestedArray,
|
|
|
| if (bIsNumber) {
|
| m_WordBuffer[m_WordSize] = 0;
|
| - return new CPDF_Number(CFX_ByteStringC(m_WordBuffer, m_WordSize));
|
| + return pdfium::MakeUnique<CPDF_Number>(
|
| + CFX_ByteStringC(m_WordBuffer, m_WordSize));
|
| }
|
|
|
| int first_char = m_WordBuffer[0];
|
| if (first_char == '/') {
|
| CFX_ByteString name =
|
| PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1));
|
| - return new CPDF_Name(m_pPool, name);
|
| + return pdfium::MakeUnique<CPDF_Name>(m_pPool, name);
|
| }
|
|
|
| if (first_char == '(') {
|
| CFX_ByteString str = ReadString();
|
| - return new CPDF_String(m_pPool, str, false);
|
| + return pdfium::MakeUnique<CPDF_String>(m_pPool, str, false);
|
| }
|
|
|
| if (first_char == '<') {
|
| if (m_WordSize == 1)
|
| - return new CPDF_String(m_pPool, ReadHexString(), true);
|
| + return pdfium::MakeUnique<CPDF_String>(m_pPool, ReadHexString(), true);
|
|
|
| - CPDF_Dictionary* pDict = new CPDF_Dictionary(m_pPool);
|
| + auto pDict = pdfium::MakeUnique<CPDF_Dictionary>(m_pPool);
|
| while (1) {
|
| GetNextWord(bIsNumber);
|
| if (m_WordSize == 2 && m_WordBuffer[0] == '>')
|
| break;
|
|
|
| - if (!m_WordSize || m_WordBuffer[0] != '/') {
|
| - delete pDict;
|
| + if (!m_WordSize || m_WordBuffer[0] != '/')
|
| return nullptr;
|
| - }
|
|
|
| CFX_ByteString key =
|
| PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1));
|
| - auto pObj = pdfium::WrapUnique(ReadNextObject(true, 0));
|
| - if (!pObj) {
|
| - delete pDict;
|
| + std::unique_ptr<CPDF_Object> pObj = ReadNextObject(true, 0);
|
| + if (!pObj)
|
| return nullptr;
|
| - }
|
| +
|
| if (!key.IsEmpty())
|
| pDict->SetFor(key, std::move(pObj));
|
| }
|
| - return pDict;
|
| + return std::move(pDict);
|
| }
|
|
|
| if (first_char == '[') {
|
| @@ -380,28 +370,28 @@ CPDF_Object* CPDF_StreamParser::ReadNextObject(bool bAllowNestedArray,
|
| return nullptr;
|
| }
|
|
|
| - CPDF_Array* pArray = new CPDF_Array;
|
| + auto pArray = pdfium::MakeUnique<CPDF_Array>();
|
| while (1) {
|
| - CPDF_Object* pObj = ReadNextObject(bAllowNestedArray, dwInArrayLevel + 1);
|
| + std::unique_ptr<CPDF_Object> pObj =
|
| + ReadNextObject(bAllowNestedArray, dwInArrayLevel + 1);
|
| if (pObj) {
|
| - pArray->Add(pdfium::WrapUnique(pObj));
|
| + pArray->Add(std::move(pObj));
|
| continue;
|
| }
|
| if (!m_WordSize || m_WordBuffer[0] == ']')
|
| break;
|
| }
|
| - return pArray;
|
| + return std::move(pArray);
|
| }
|
|
|
| if (m_WordSize == 5 && !memcmp(m_WordBuffer, "false", 5))
|
| - return new CPDF_Boolean(false);
|
| + return pdfium::MakeUnique<CPDF_Boolean>(false);
|
|
|
| if (m_WordSize == 4) {
|
| if (memcmp(m_WordBuffer, "true", 4) == 0)
|
| - return new CPDF_Boolean(true);
|
| -
|
| + return pdfium::MakeUnique<CPDF_Boolean>(true);
|
| if (memcmp(m_WordBuffer, "null", 4) == 0)
|
| - return new CPDF_Null;
|
| + return pdfium::MakeUnique<CPDF_Null>();
|
| }
|
|
|
| return nullptr;
|
|
|