| Index: core/src/fxcodec/jbig2/JBig2_Context.cpp
|
| diff --git a/core/src/fxcodec/jbig2/JBig2_Context.cpp b/core/src/fxcodec/jbig2/JBig2_Context.cpp
|
| index f2c44b726aeb8562d00395ecf3ef7b05d6b3f019..ca895e5b9c0378fd4985c2d8493c658bb248b228 100644
|
| --- a/core/src/fxcodec/jbig2/JBig2_Context.cpp
|
| +++ b/core/src/fxcodec/jbig2/JBig2_Context.cpp
|
| @@ -25,7 +25,10 @@
|
| //
|
| // Disabled until we can figure out how to clear cache between documents.
|
| // https://code.google.com/p/pdfium/issues/detail?id=207
|
| +#define DISABLE_SYMBOL_CACHE
|
| +#ifndef DISABLE_SYMBOL_CACHE
|
| static const int kSymbolDictCacheMaxSize = 2;
|
| +#endif
|
|
|
| CJBig2_Context* CJBig2_Context::CreateContext(
|
| const uint8_t* pGlobalData,
|
| @@ -623,7 +626,8 @@ int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment* pSegment,
|
| for (std::list<CJBig2_CachePair>::iterator it = m_pSymbolDictCache->begin();
|
| it != m_pSymbolDictCache->end(); ++it) {
|
| if (it->first == key) {
|
| - pSegment->m_Result.sd = it->second->DeepCopy();
|
| + nonstd::unique_ptr<CJBig2_SymbolDict> copy(it->second->DeepCopy());
|
| + pSegment->m_Result.sd = copy.release();
|
| m_pSymbolDictCache->push_front(*it);
|
| m_pSymbolDictCache->erase(it);
|
| cache_hit = true;
|
| @@ -651,14 +655,17 @@ int32_t CJBig2_Context::parseSymbolDict(CJBig2_Segment* pSegment,
|
| }
|
| m_pStream->alignByte();
|
| }
|
| - CJBig2_SymbolDict* value = pSegment->m_Result.sd->DeepCopy();
|
| +#ifndef DISABLE_SYMBOL_CACHE
|
| + nonstd::unique_ptr<CJBig2_SymbolDict> value =
|
| + pSegment->m_Result.sd->DeepCopy();
|
| if (value && kSymbolDictCacheMaxSize > 0) {
|
| while (m_pSymbolDictCache->size() >= kSymbolDictCacheMaxSize) {
|
| delete m_pSymbolDictCache->back().second;
|
| m_pSymbolDictCache->pop_back();
|
| }
|
| - m_pSymbolDictCache->push_front(CJBig2_CachePair(key, value));
|
| + m_pSymbolDictCache->push_front(CJBig2_CachePair(key, value.release()));
|
| }
|
| +#endif
|
| }
|
| if (wFlags & 0x0200) {
|
| pSegment->m_Result.sd->m_bContextRetained = TRUE;
|
|
|