diff --git a/ecmascript/class_linker/panda_file_translator.cpp b/ecmascript/class_linker/panda_file_translator.cpp index 1bed3ea3f5db40312262e0db9849e01a56358c79..3d15a2348f3e7d00df4fa603ed4be603e54c4526 100644 --- a/ecmascript/class_linker/panda_file_translator.cpp +++ b/ecmascript/class_linker/panda_file_translator.cpp @@ -144,7 +144,8 @@ Program *PandaFileTranslator::GenerateProgram(const panda_file::File &pf) if (value.GetConstpoolType() == ConstPoolType::STRING) { panda_file::File::EntityId id(it.first); auto foundStr = pf.GetStringData(id); - auto string = factory_->GetRawStringFromStringTable(foundStr.data, foundStr.utf16_length); + auto string = factory_->GetRawStringFromStringTable(foundStr.data, + foundStr.utf16_length, foundStr.is_ascii); constpool->Set(thread_, value.GetConstpoolIndex(), JSTaggedValue(string)); } else if (value.GetConstpoolType() == ConstPoolType::BASE_FUNCTION) { ASSERT(mainMethodIndex_ != it.first); diff --git a/ecmascript/literal_data_extractor.cpp b/ecmascript/literal_data_extractor.cpp index d69fb147fbe737c2f48e9b3116aa03e587045a8c..15fb9bd39cd21d3190f534d496dfed77e9e984a4 100644 --- a/ecmascript/literal_data_extractor.cpp +++ b/ecmascript/literal_data_extractor.cpp @@ -45,8 +45,8 @@ void LiteralDataExtractor::ExtractObjectDatas(JSThread *thread, const panda_file uint32_t methodId; FunctionKind kind; lda.EnumerateLiteralVals( - index, [elements, properties, &epos, &ppos, factory, thread, pft, &methodId, &kind](const LiteralValue &value, - const LiteralTag &tag) { + index, [elements, properties, &epos, &ppos, factory, thread, pft, pf, &methodId, &kind] + (const LiteralValue &value, const LiteralTag &tag) { JSTaggedValue jt = JSTaggedValue::Null(); bool flag = false; switch (tag) { @@ -63,8 +63,8 @@ void LiteralDataExtractor::ExtractObjectDatas(JSThread *thread, const panda_file break; } case LiteralTag::STRING: { - StringData sd = std::get(value); - EcmaString *str = factory->GetRawStringFromStringTable(sd.data, sd.utf16_length); + StringData sd = pf->GetStringData(panda_file::File::EntityId(std::get(value))); + EcmaString *str = factory->GetRawStringFromStringTable(sd.data, sd.utf16_length, sd.is_ascii); jt = JSTaggedValue(str); uint32_t index = 0; if (JSTaggedValue::ToElementIndex(jt, &index) && ppos % pairSize == 0) { @@ -129,9 +129,8 @@ JSHandle LiteralDataExtractor::GetDatasIgnoreType(JSThread *thread, uint32_t methodId; FunctionKind kind; lda.EnumerateLiteralVals( - index, [literals, &pos, factory, thread, pft, - &methodId, &kind](const panda_file::LiteralDataAccessor::LiteralValue &value, - const LiteralTag &tag) { + index, [literals, &pos, factory, thread, pft, pf, &methodId, &kind] + (const panda_file::LiteralDataAccessor::LiteralValue &value, const LiteralTag &tag) { JSTaggedValue jt = JSTaggedValue::Null(); switch (tag) { case LiteralTag::INTEGER: { @@ -147,8 +146,8 @@ JSHandle LiteralDataExtractor::GetDatasIgnoreType(JSThread *thread, break; } case LiteralTag::STRING: { - StringData sd = std::get(value); - EcmaString *str = factory->GetRawStringFromStringTable(sd.data, sd.utf16_length); + StringData sd = pf->GetStringData(panda_file::File::EntityId(std::get(value))); + EcmaString *str = factory->GetRawStringFromStringTable(sd.data, sd.utf16_length, sd.is_ascii); jt = JSTaggedValue(str); break; } diff --git a/ecmascript/object_factory.cpp b/ecmascript/object_factory.cpp index 0e4ed0a3000e3f2b8c446f60f5d208e1ccacdf1c..8b136d3f764206c02c063d7292e431e2b2664832 100644 --- a/ecmascript/object_factory.cpp +++ b/ecmascript/object_factory.cpp @@ -1728,13 +1728,14 @@ JSHandle ObjectFactory::GetStringFromStringTable(EcmaString *string) } // NB! don't do special case for C0 80, it means '\u0000', so don't convert to UTF-8 -EcmaString *ObjectFactory::GetRawStringFromStringTable(const uint8_t *mutf8Data, uint32_t utf16Len) const +EcmaString *ObjectFactory::GetRawStringFromStringTable(const uint8_t *mutf8Data, + uint32_t utf16Len, bool canBeCompressed) const { if (UNLIKELY(utf16Len == 0)) { return *GetEmptyString(); } - if (utf::IsMUtf8OnlySingleBytes(mutf8Data)) { + if (canBeCompressed) { return EcmaString::Cast(vm_->GetEcmaStringTable()->GetOrInternString(mutf8Data, utf16Len, true)); } @@ -2102,7 +2103,7 @@ EcmaString *ObjectFactory::ResolveString(uint32_t stringId) auto id = panda_file::File::EntityId(stringId); auto foundStr = pf->GetStringData(id); - return GetRawStringFromStringTable(foundStr.data, foundStr.utf16_length); + return GetRawStringFromStringTable(foundStr.data, foundStr.utf16_length, foundStr.is_ascii); } uintptr_t ObjectFactory::NewSpaceBySnapShotAllocator(size_t size) diff --git a/ecmascript/object_factory.h b/ecmascript/object_factory.h index 3c9426247ae017f3f312994e8593b735c62ed278..c4912c5e920f2883cdb4878699a2919ec7d9307b 100644 --- a/ecmascript/object_factory.h +++ b/ecmascript/object_factory.h @@ -447,7 +447,7 @@ private: JSHandle GetStringFromStringTable(const uint8_t *utf8Data, uint32_t utf8Len, bool canBeCompress) const; // For MUtf-8 string data - EcmaString *GetRawStringFromStringTable(const uint8_t *mutf8Data, uint32_t utf16Len) const; + EcmaString *GetRawStringFromStringTable(const uint8_t *mutf8Data, uint32_t utf16Len, bool canBeCompressed) const; JSHandle GetStringFromStringTable(const uint16_t *utf16Data, uint32_t utf16Len, bool canBeCompress) const;