diff options
author | Gaming4JC <g4jc@hyperbola.info> | 2020-01-18 13:20:59 -0500 |
---|---|---|
committer | Gaming4JC <g4jc@hyperbola.info> | 2020-01-26 15:50:34 -0500 |
commit | 016a21c414f35e0d1af6ee2ffcc17224aab77637 (patch) | |
tree | 900b4fafbbd7d25bd9c605dcf934ad0b4009fdeb /parser/html/nsHtml5Tokenizer.cpp | |
parent | e387308d9b996542565175c7895724c86e24e0dc (diff) | |
download | UXP-016a21c414f35e0d1af6ee2ffcc17224aab77637.tar UXP-016a21c414f35e0d1af6ee2ffcc17224aab77637.tar.gz UXP-016a21c414f35e0d1af6ee2ffcc17224aab77637.tar.lz UXP-016a21c414f35e0d1af6ee2ffcc17224aab77637.tar.xz UXP-016a21c414f35e0d1af6ee2ffcc17224aab77637.zip |
Bug 1355769 - Avoid malloc for nsHtml5ElementName when processing a non-interned element name.
HTML Regen.
Tag UXP Issue #1344
Diffstat (limited to 'parser/html/nsHtml5Tokenizer.cpp')
-rw-r--r-- | parser/html/nsHtml5Tokenizer.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/parser/html/nsHtml5Tokenizer.cpp b/parser/html/nsHtml5Tokenizer.cpp index 73c6d986f..aa5b3df28 100644 --- a/parser/html/nsHtml5Tokenizer.cpp +++ b/parser/html/nsHtml5Tokenizer.cpp @@ -97,6 +97,7 @@ nsHtml5Tokenizer::nsHtml5Tokenizer(nsHtml5TreeBuilder* tokenHandler, bool viewin bmpChar(jArray<char16_t,int32_t>::newJArray(1)), astralChar(jArray<char16_t,int32_t>::newJArray(2)), tagName(nullptr), + nonInternedTagName(new nsHtml5ElementName()), attributeName(nullptr), doctypeName(nullptr), publicIdentifier(nullptr), @@ -279,6 +280,10 @@ void nsHtml5Tokenizer::strBufToElementNameString() { tagName = nsHtml5ElementName::elementNameByBuffer(strBuf, 0, strBufLen, interner); + if (!tagName) { + nonInternedTagName->setNameForNonInterned(nsHtml5Portability::newLocalNameFromBuffer(strBuf, 0, strBufLen, interner)); + tagName = nonInternedTagName; + } clearStrBufAfterUse(); } @@ -307,7 +312,6 @@ nsHtml5Tokenizer::emitCurrentTagToken(bool selfClosing, int32_t pos) tokenHandler->startTag(tagName, attrs, selfClosing); } } - tagName->release(); tagName = nullptr; if (newAttributesEachTime) { attributes = nullptr; @@ -3935,10 +3939,8 @@ nsHtml5Tokenizer::end() publicIdentifier.Release(); publicIdentifier = nullptr; } - if (tagName) { - tagName->release(); - tagName = nullptr; - } + tagName = nullptr; + nonInternedTagName->setNameForNonInterned(nullptr); if (attributeName) { attributeName->release(); attributeName = nullptr; @@ -3983,7 +3985,6 @@ nsHtml5Tokenizer::resetToDataState() shouldSuspend = false; initDoctypeFields(); if (tagName) { - tagName->release(); tagName = nullptr; } if (attributeName) { @@ -4043,13 +4044,13 @@ nsHtml5Tokenizer::loadState(nsHtml5Tokenizer* other) } else { publicIdentifier = nsHtml5Portability::newStringFromString(other->publicIdentifier); } - if (tagName) { - tagName->release(); - } if (!other->tagName) { tagName = nullptr; + } else if (other->tagName->isInterned()) { + tagName = other->tagName; } else { - tagName = other->tagName->cloneElementName(interner); + nonInternedTagName->setNameForNonInterned(nsHtml5Portability::newLocalFromLocal(other->tagName->getName(), interner)); + tagName = nonInternedTagName; } if (attributeName) { attributeName->release(); @@ -4087,6 +4088,8 @@ nsHtml5Tokenizer::setEncodingDeclarationHandler(nsHtml5StreamParser* encodingDec nsHtml5Tokenizer::~nsHtml5Tokenizer() { MOZ_COUNT_DTOR(nsHtml5Tokenizer); + delete nonInternedTagName; + nonInternedTagName = nullptr; delete attributes; attributes = nullptr; } |