From 5fa446204e1e686412d84562750d9802bf1b9468 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Sat, 28 Apr 2018 15:45:31 +0100 Subject: ofz#7861 fuzzer ooms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit too many frequent tiny allocations in a short time span I believe Change-Id: Iaccae6db7d18c9cd2f909f94dbe81a7dc6458bc2 Reviewed-on: https://gerrit.libreoffice.org/53589 Tested-by: Jenkins Reviewed-by: Caolán McNamara Tested-by: Caolán McNamara --- starmath/inc/node.hxx | 26 ++-- starmath/source/mathmlimport.cxx | 6 +- starmath/source/node.cxx | 270 +++++++++++++++++++-------------------- 3 files changed, 151 insertions(+), 151 deletions(-) (limited to 'starmath') diff --git a/starmath/inc/node.hxx b/starmath/inc/node.hxx index 7479e3385503..b9a11864b1a8 100644 --- a/starmath/inc/node.hxx +++ b/starmath/inc/node.hxx @@ -162,7 +162,7 @@ public: void Move(const Point &rPosition); void MoveTo(const Point &rPosition) { Move(rPosition - GetTopLeft()); } virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) = 0; - virtual void CreateTextFromNode(OUString &rText); + virtual void CreateTextFromNode(OUStringBuffer &rText); virtual void GetAccessibleText( OUStringBuffer &rText ) const = 0; sal_Int32 GetAccessibleIndex() const { return mnAccIndex; } @@ -333,7 +333,7 @@ public: virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override; - void CreateTextFromNode(OUString &rText) override; + void CreateTextFromNode(OUStringBuffer &rText) override; void Accept(SmVisitor* pVisitor) override; }; @@ -414,7 +414,7 @@ public: virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) override; virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override; - virtual void CreateTextFromNode(OUString &rText) override; + virtual void CreateTextFromNode(OUStringBuffer &rText) override; virtual void GetAccessibleText( OUStringBuffer &rText ) const override; void Accept(SmVisitor* pVisitor) override; @@ -494,7 +494,7 @@ public: virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) override; virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override; - void CreateTextFromNode(OUString &rText) override; + void CreateTextFromNode(OUStringBuffer &rText) override; void Accept(SmVisitor* pVisitor) override; }; @@ -651,7 +651,7 @@ public: {} virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override; - void CreateTextFromNode(OUString &rText) override; + void CreateTextFromNode(OUStringBuffer &rText) override; void Accept(SmVisitor* pVisitor) override; }; @@ -693,7 +693,7 @@ public: } virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override; - void CreateTextFromNode(OUString &rText) override; + void CreateTextFromNode(OUStringBuffer &rText) override; void Accept(SmVisitor* pVisitor) override; SmNode* Argument(); @@ -759,7 +759,7 @@ public: virtual const SmNode * GetLeftMost() const override; virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override; - void CreateTextFromNode(OUString &rText) override; + void CreateTextFromNode(OUStringBuffer &rText) override; void Accept(SmVisitor* pVisitor) override; }; @@ -869,7 +869,7 @@ public: void SetSubSup(SmSubSup eSubSup, SmNode* pScript) { SetSubNode( 1 + eSubSup, pScript); } virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override; - void CreateTextFromNode(OUString &rText) override; + void CreateTextFromNode(OUStringBuffer &rText) override; void Accept(SmVisitor* pVisitor) override; }; @@ -904,7 +904,7 @@ public: const SmMathSymbolNode* ClosingBrace() const; virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override; - void CreateTextFromNode(OUString &rText) override; + void CreateTextFromNode(OUStringBuffer &rText) override; void Accept(SmVisitor* pVisitor) override; }; @@ -1035,7 +1035,7 @@ public: {} virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override; - void CreateTextFromNode(OUString &rText) override; + void CreateTextFromNode(OUStringBuffer &rText) override; void Accept(SmVisitor* pVisitor) override; SmNode* Attribute(); @@ -1068,7 +1068,7 @@ public: virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) override; virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override; - void CreateTextFromNode(OUString &rText) override; + void CreateTextFromNode(OUStringBuffer &rText) override; void Accept(SmVisitor* pVisitor) override; }; @@ -1098,7 +1098,7 @@ public: virtual const SmNode * GetLeftMost() const override; virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override; - void CreateTextFromNode(OUString &rText) override; + void CreateTextFromNode(OUStringBuffer &rText) override; void Accept(SmVisitor* pVisitor) override; }; @@ -1126,7 +1126,7 @@ public: virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) override; virtual void Arrange(OutputDevice &rDev, const SmFormat &rFormat) override; void Accept(SmVisitor* pVisitor) override; - virtual void CreateTextFromNode(OUString &rText) override; + virtual void CreateTextFromNode(OUStringBuffer &rText) override; }; diff --git a/starmath/source/mathmlimport.cxx b/starmath/source/mathmlimport.cxx index 6142db4a3ec4..8c0fc3f3d97c 100644 --- a/starmath/source/mathmlimport.cxx +++ b/starmath/source/mathmlimport.cxx @@ -515,9 +515,11 @@ void SmXMLImport::endDocument() pDocShell->SetFormulaTree(static_cast(pTree)); if (aText.isEmpty()) //If we picked up no annotation text { + OUStringBuffer aStrBuf; // Get text from imported formula - pTree->CreateTextFromNode(aText); - aText = comphelper::string::stripEnd(aText, ' '); + pTree->CreateTextFromNode(aStrBuf); + aStrBuf.stripEnd(' '); + aText = aStrBuf.makeStringAndClear(); } // Convert symbol names diff --git a/starmath/source/node.cxx b/starmath/source/node.cxx index 3d1190594002..55466245527d 100644 --- a/starmath/source/node.cxx +++ b/starmath/source/node.cxx @@ -251,16 +251,16 @@ void SmNode::Move(const Point& rPosition) ForEachNonNull(this, [&rPosition](SmNode *pNode){pNode->Move(rPosition);}); } -void SmNode::CreateTextFromNode(OUString &rText) +void SmNode::CreateTextFromNode(OUStringBuffer &rText) { auto nSize = GetNumSubNodes(); if (nSize > 1) - rText += "{"; + rText.append("{"); ForEachNonNull(this, [&rText](SmNode *pNode){pNode->CreateTextFromNode(rText);}); if (nSize > 1) { - rText = comphelper::string::stripEnd(rText, ' '); - rText += "} "; + rText.stripEnd(' '); + rText.append("} "); } } @@ -454,11 +454,11 @@ void SmGraphicNode::GetAccessibleText( OUStringBuffer &rText ) const rText.append(GetToken().aText); } -void SmExpressionNode::CreateTextFromNode(OUString &rText) +void SmExpressionNode::CreateTextFromNode(OUStringBuffer &rText) { size_t nSize = GetNumSubNodes(); if (nSize > 1) - rText += "{"; + rText.append("{"); for (size_t i = 0; i < nSize; ++i) { SmNode *pNode = GetSubNode(i); @@ -467,16 +467,16 @@ void SmExpressionNode::CreateTextFromNode(OUString &rText) pNode->CreateTextFromNode(rText); //Just a bit of foo to make unary +asd -asd +-asd -+asd look nice if (pNode->GetType() == SmNodeType::Math) - if ((nSize != 2) || - ( !rText.endsWith("+") && !rText.endsWith("-") )) - rText += " "; + if ((nSize != 2) || rText.isEmpty() || + (rText[rText.getLength() - 1] != '+' && rText[rText.getLength() - 1] != '-') ) + rText.append(" "); } } if (nSize > 1) { - rText = comphelper::string::stripEnd(rText, ' '); - rText += "} "; + rText.stripEnd(' '); + rText.append("} "); } } @@ -754,24 +754,24 @@ void SmRootNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat) } -void SmRootNode::CreateTextFromNode(OUString &rText) +void SmRootNode::CreateTextFromNode(OUStringBuffer &rText) { SmNode *pExtra = GetSubNode(0); if (pExtra) { - rText += "nroot "; + rText.append("nroot "); pExtra->CreateTextFromNode(rText); } else - rText += "sqrt "; + rText.append("sqrt "); if (!pExtra && GetSubNode(2)->GetNumSubNodes() > 1) - rText += "{ "; + rText.append("{ "); GetSubNode(2)->CreateTextFromNode(rText); if (!pExtra && GetSubNode(2)->GetNumSubNodes() > 1) - rText += "} "; + rText.append("} "); } /**************************************************************************/ @@ -873,16 +873,15 @@ void SmBinVerNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat) ExtendBy(*pDenom, RectCopyMBL::None).ExtendBy(*pLine, RectCopyMBL::None, pLine->GetCenterY()); } -void SmBinVerNode::CreateTextFromNode(OUString &rText) +void SmBinVerNode::CreateTextFromNode(OUStringBuffer &rText) { SmNode *pNum = GetSubNode(0), *pDenom = GetSubNode(2); pNum->CreateTextFromNode(rText); - rText += "over "; + rText.append("over "); pDenom->CreateTextFromNode(rText); } - const SmNode * SmBinVerNode::GetLeftMost() const { return this; @@ -1250,41 +1249,41 @@ void SmSubSupNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat) } } -void SmSubSupNode::CreateTextFromNode(OUString &rText) +void SmSubSupNode::CreateTextFromNode(OUStringBuffer &rText) { SmNode *pNode; GetSubNode(0)->CreateTextFromNode(rText); if (nullptr != (pNode = GetSubNode(LSUB+1))) { - rText += "lsub "; + rText.append("lsub "); pNode->CreateTextFromNode(rText); } if (nullptr != (pNode = GetSubNode(LSUP+1))) { - rText += "lsup "; + rText.append("lsup "); pNode->CreateTextFromNode(rText); } if (nullptr != (pNode = GetSubNode(CSUB+1))) { - rText += "csub "; + rText.append("csub "); pNode->CreateTextFromNode(rText); } if (nullptr != (pNode = GetSubNode(CSUP+1))) { - rText += "csup "; + rText.append("csup "); pNode->CreateTextFromNode(rText); } if (nullptr != (pNode = GetSubNode(RSUB+1))) { - rText = comphelper::string::stripEnd(rText, ' '); - rText += "_"; + rText.stripEnd(' '); + rText.append("_"); pNode->CreateTextFromNode(rText); } if (nullptr != (pNode = GetSubNode(RSUP+1))) { - rText = comphelper::string::stripEnd(rText, ' '); - rText += "^"; + rText.stripEnd(' '); + rText.append("^"); pNode->CreateTextFromNode(rText); } } @@ -1292,55 +1291,56 @@ void SmSubSupNode::CreateTextFromNode(OUString &rText) /**************************************************************************/ -void SmBraceNode::CreateTextFromNode(OUString &rText) +void SmBraceNode::CreateTextFromNode(OUStringBuffer &rText) { if (GetScaleMode() == SmScaleMode::Height) - rText += "left "; + rText.append("left "); { - OUString aStr; - OpeningBrace()->CreateTextFromNode(aStr); + OUStringBuffer aStrBuf; + OpeningBrace()->CreateTextFromNode(aStrBuf); + OUString aStr = aStrBuf.makeStringAndClear(); aStr = comphelper::string::strip(aStr, ' '); aStr = comphelper::string::stripStart(aStr, '\\'); if (!aStr.isEmpty()) { if (aStr == "divides") - rText += "lline"; + rText.append("lline"); else if (aStr == "parallel") - rText += "ldline"; + rText.append("ldline"); else if (aStr == "<") - rText += "langle"; + rText.append("langle"); else - rText += aStr; - rText += " "; + rText.append(aStr); + rText.append(" "); } else - rText += "none "; + rText.append("none "); } Body()->CreateTextFromNode(rText); if (GetScaleMode() == SmScaleMode::Height) - rText += "right "; + rText.append("right "); { - OUString aStr; - ClosingBrace()->CreateTextFromNode(aStr); + OUStringBuffer aStrBuf; + ClosingBrace()->CreateTextFromNode(aStrBuf); + OUString aStr = aStrBuf.makeStringAndClear(); aStr = comphelper::string::strip(aStr, ' '); aStr = comphelper::string::stripStart(aStr, '\\'); if (!aStr.isEmpty()) { if (aStr == "divides") - rText += "rline"; + rText.append("rline"); else if (aStr == "parallel") - rText += "rdline"; + rText.append("rdline"); else if (aStr == ">") - rText += "rangle"; + rText.append("rangle"); else - rText += aStr; - rText += " "; + rText.append(aStr); + rText.append(" "); } else - rText += "none "; + rText.append("none "); } - rText += " "; - + rText.append(" "); } void SmBraceNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat) @@ -1709,126 +1709,126 @@ void SmAttributNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat) ExtendBy(*pAttr, RectCopyMBL::This, true); } -void SmFontNode::CreateTextFromNode(OUString &rText) +void SmFontNode::CreateTextFromNode(OUStringBuffer &rText) { - rText += "{"; + rText.append("{"); switch (GetToken().eType) { case TBOLD: - rText += "bold "; + rText.append("bold "); break; case TNBOLD: - rText += "nbold "; + rText.append("nbold "); break; case TITALIC: - rText += "italic "; + rText.append("italic "); break; case TNITALIC: - rText += "nitalic "; + rText.append("nitalic "); break; case TPHANTOM: - rText += "phantom "; + rText.append("phantom "); break; case TSIZE: { - rText += "size "; + rText.append("size "); switch (meSizeType) { case FontSizeType::PLUS: - rText += "+"; + rText.append("+"); break; case FontSizeType::MINUS: - rText += "-"; + rText.append("-"); break; case FontSizeType::MULTIPLY: - rText += "*"; + rText.append("*"); break; case FontSizeType::DIVIDE: - rText += "/"; + rText.append("/"); break; case FontSizeType::ABSOLUT: default: break; } - rText += ::rtl::math::doubleToUString( + rText.append(::rtl::math::doubleToUString( static_cast(maFontSize), rtl_math_StringFormat_Automatic, - rtl_math_DecimalPlaces_Max, '.', true); - rText += " "; + rtl_math_DecimalPlaces_Max, '.', true)); + rText.append(" "); } break; case TBLACK: - rText += "color black "; + rText.append("color black "); break; case TWHITE: - rText += "color white "; + rText.append("color white "); break; case TRED: - rText += "color red "; + rText.append("color red "); break; case TGREEN: - rText += "color green "; + rText.append("color green "); break; case TBLUE: - rText += "color blue "; + rText.append("color blue "); break; case TCYAN: - rText += "color cyan "; + rText.append("color cyan "); break; case TMAGENTA: - rText += "color magenta "; + rText.append("color magenta "); break; case TYELLOW: - rText += "color yellow "; + rText.append("color yellow "); break; case TTEAL: - rText += "color teal "; + rText.append("color teal "); break; case TSILVER: - rText += "color silver "; + rText.append("color silver "); break; case TGRAY: - rText += "color gray "; + rText.append("color gray "); break; case TMAROON: - rText += "color maroon "; + rText.append("color maroon "); break; case TPURPLE: - rText += "color purple "; + rText.append("color purple "); break; case TLIME: - rText += "color lime "; + rText.append("color lime "); break; case TOLIVE: - rText += "color olive "; + rText.append("color olive "); break; case TNAVY: - rText += "color navy "; + rText.append("color navy "); break; case TAQUA: - rText += "color aqua "; + rText.append("color aqua "); break; case TFUCHSIA: - rText += "color fuchsia "; + rText.append("color fuchsia "); break; case TSANS: - rText += "font sans "; + rText.append("font sans "); break; case TSERIF: - rText += "font serif "; + rText.append("font serif "); break; case TFIXED: - rText += "font fixed "; + rText.append("font fixed "); break; default: break; } - if(GetNumSubNodes() > 1) + if (GetNumSubNodes() > 1) GetSubNode(1)->CreateTextFromNode(rText); - rText = comphelper::string::stripEnd(rText, ' '); - rText += "} "; + rText.stripEnd(' '); + rText.append("} "); } void SmFontNode::Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell, int nDepth) @@ -2091,12 +2091,12 @@ void SmTextNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat) SmRect::operator = (SmRect(aTmpDev, &rFormat, maText, GetFont().GetBorderWidth())); } -void SmTextNode::CreateTextFromNode(OUString &rText) +void SmTextNode::CreateTextFromNode(OUStringBuffer &rText) { bool bQuoted=false; if (GetToken().eType == TTEXT) { - rText += "\""; + rText.append("\""); bQuoted=true; } else @@ -2120,24 +2120,23 @@ void SmTextNode::CreateTextFromNode(OUString &rText) if ((GetToken().eType == TIDENT) && (GetFontDesc() == FNT_FUNCTION)) { //Search for existing functions and remove extraneous keyword - rText += "func "; + rText.append("func "); } else if (bQuoted) - rText += "italic "; + rText.append("italic "); if (bQuoted) - rText += "\""; + rText.append("\""); } - rText += GetToken().aText; + rText.append(GetToken().aText); if (bQuoted) - rText += "\""; - rText += " "; + rText.append("\""); + rText.append(" "); } - void SmTextNode::GetAccessibleText( OUStringBuffer &rText ) const { rText.append(maText); @@ -2209,9 +2208,9 @@ sal_Unicode SmTextNode::ConvertSymbolToUnicode(sal_Unicode nIn) /**************************************************************************/ -void SmMatrixNode::CreateTextFromNode(OUString &rText) +void SmMatrixNode::CreateTextFromNode(OUStringBuffer &rText) { - rText += "matrix {"; + rText.append("matrix {"); for (size_t i = 0; i < mnNumRows; ++i) { for (size_t j = 0; j < mnNumCols; ++j) @@ -2220,16 +2219,15 @@ void SmMatrixNode::CreateTextFromNode(OUString &rText) if (pNode) pNode->CreateTextFromNode(rText); if (j != mnNumCols - 1U) - rText += "# "; + rText.append("# "); } if (i != mnNumRows - 1U) - rText += "## "; + rText.append("## "); } - rText = comphelper::string::stripEnd(rText, ' '); - rText += "} "; + rText.stripEnd(' '); + rText.append("} "); } - void SmMatrixNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat) { SmNode *pNode; @@ -2447,7 +2445,7 @@ void SmMathSymbolNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat) SmRect::operator = (SmRect(aTmpDev, &rFormat, rText, GetFont().GetBorderWidth())); } -void SmMathSymbolNode::CreateTextFromNode(OUString &rText) +void SmMathSymbolNode::CreateTextFromNode(OUStringBuffer &rText) { OUString sStr; sal_Unicode cChar = GetToken().cMathChar; @@ -2455,99 +2453,99 @@ void SmMathSymbolNode::CreateTextFromNode(OUString &rText) sStr = "intd "; else MathType::LookupChar(cChar, sStr, 3); - rText += sStr; + rText.append(sStr); } -void SmRectangleNode::CreateTextFromNode(OUString &rText) +void SmRectangleNode::CreateTextFromNode(OUStringBuffer &rText) { switch (GetToken().eType) { case TUNDERLINE: - rText += "underline "; + rText.append("underline "); break; case TOVERLINE: - rText += "overline "; + rText.append("overline "); break; case TOVERSTRIKE: - rText += "overstrike "; + rText.append("overstrike "); break; default: break; } } -void SmAttributNode::CreateTextFromNode(OUString &rText) +void SmAttributNode::CreateTextFromNode(OUStringBuffer &rText) { SmNode *pNode; assert(GetNumSubNodes() == 2); - rText += "{"; + rText.append("{"); sal_Unicode nLast=0; if (nullptr != (pNode = Attribute())) { - OUString aStr; + OUStringBuffer aStr; pNode->CreateTextFromNode(aStr); if (aStr.getLength() > 1) - rText += aStr; + rText.append(aStr); else { nLast = aStr[0]; switch (nLast) { case MS_BAR: // MACRON - rText += "overline "; + rText.append("overline "); break; case MS_DOT: // DOT ABOVE - rText += "dot "; + rText.append("dot "); break; case 0x2dc: // SMALL TILDE - rText += "widetilde "; + rText.append("widetilde "); break; case MS_DDOT: // DIAERESIS - rText += "ddot "; + rText.append("ddot "); break; case 0xE082: break; case 0xE09B: case MS_DDDOT: // COMBINING THREE DOTS ABOVE - rText += "dddot "; + rText.append("dddot "); break; case MS_ACUTE: // ACUTE ACCENT case MS_COMBACUTE: // COMBINING ACUTE ACCENT - rText += "acute "; + rText.append("acute "); break; case MS_GRAVE: // GRAVE ACCENT case MS_COMBGRAVE: // COMBINING GRAVE ACCENT - rText += "grave "; + rText.append("grave "); break; case MS_CHECK: // CARON case MS_COMBCHECK: // COMBINING CARON - rText += "check "; + rText.append("check "); break; case MS_BREVE: // BREVE case MS_COMBBREVE: // COMBINING BREVE - rText += "breve "; + rText.append("breve "); break; case MS_CIRCLE: // RING ABOVE case MS_COMBCIRCLE: // COMBINING RING ABOVE - rText += "circle "; + rText.append("circle "); break; case MS_RIGHTARROW: // RIGHTWARDS ARROW case MS_VEC: // COMBINING RIGHT ARROW ABOVE - rText += "vec "; + rText.append("vec "); break; case MS_TILDE: // TILDE case MS_COMBTILDE: // COMBINING TILDE - rText += "tilde "; + rText.append("tilde "); break; case MS_HAT: // CIRCUMFLEX ACCENT case MS_COMBHAT: // COMBINING CIRCUMFLEX ACCENT - rText += "hat "; + rText.append("hat "); break; case MS_COMBBAR: // COMBINING MACRON - rText += "bar "; + rText.append("bar "); break; default: - rText += OUStringLiteral1( nLast ); + rText.append(OUStringLiteral1(nLast)); break; } } @@ -2556,12 +2554,12 @@ void SmAttributNode::CreateTextFromNode(OUString &rText) if (nullptr != (pNode = Body())) pNode->CreateTextFromNode(rText); - rText = comphelper::string::stripEnd(rText, ' '); + rText.stripEnd(' '); if (nLast == 0xE082) - rText += " overbrace {}"; + rText.append(" overbrace {}"); - rText += "} "; + rText.append("} "); } /**************************************************************************/ @@ -2777,17 +2775,17 @@ void SmBlankNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat) SetWidth(nSpace); } -void SmBlankNode::CreateTextFromNode(OUString &rText) +void SmBlankNode::CreateTextFromNode(OUStringBuffer &rText) { if (mnNum <= 0) return; sal_uInt16 nWide = mnNum / 4; sal_uInt16 nNarrow = mnNum % 4; for (sal_uInt16 i = 0; i < nWide; i++) - rText += "~"; + rText.append("~"); for (sal_uInt16 i = 0; i < nNarrow; i++) - rText += "`"; - rText += " "; + rText.append("`"); + rText.append(" "); } -- cgit