summaryrefslogtreecommitdiff
path: root/starmath
diff options
context:
space:
mode:
authorTakeshi Abe <tabe@fixedpoint.jp>2017-03-23 12:10:46 +0900
committerTakeshi Abe <tabe@fixedpoint.jp>2017-03-23 04:20:59 +0000
commitfaeda4e29e0be16050dd919a62ecf69a4ffdf2f8 (patch)
tree346d720d3effe2ea1446eda3159fdcfa4fb64ad6 /starmath
parent1670cc25bc2771e87f7956a4b0dd634abaa4128b (diff)
starmath: Make DoProduct()/DoSum()/DoRelation() return SmNode
to reduce an excessive number of stack operations. Change-Id: Ia4ef08dce76d318c56bf7d112f686e13d1b2660e Reviewed-on: https://gerrit.libreoffice.org/35551 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Takeshi Abe <tabe@fixedpoint.jp>
Diffstat (limited to 'starmath')
-rw-r--r--starmath/inc/parse.hxx6
-rw-r--r--starmath/source/parse.cxx53
2 files changed, 22 insertions, 37 deletions
diff --git a/starmath/inc/parse.hxx b/starmath/inc/parse.hxx
index d158c3995151..8872b8edac9a 100644
--- a/starmath/inc/parse.hxx
+++ b/starmath/inc/parse.hxx
@@ -64,9 +64,9 @@ class SmParser
SmTableNode *DoTable();
void DoLine();
SmNode *DoExpression();
- void DoRelation();
- void DoSum();
- void DoProduct();
+ SmNode *DoRelation();
+ SmNode *DoSum();
+ SmNode *DoProduct();
SmNode *DoSubSup(TG nActiveGroup, SmNode *pGivenNode);
SmNode *DoOpSubSup();
SmNode *DoPower();
diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx
index 14ab62aad504..07383f3e359e 100644
--- a/starmath/source/parse.cxx
+++ b/starmath/source/parse.cxx
@@ -1037,15 +1037,9 @@ SmNode *SmParser::DoExpression()
}
SmNodeArray RelationArray;
-
- DoRelation();
- RelationArray.push_back(popOrZero(m_aNodeStack));
-
+ RelationArray.push_back(DoRelation());
while (m_aCurToken.nLevel >= 4)
- {
- DoRelation();
- RelationArray.push_back(popOrZero(m_aNodeStack));
- }
+ RelationArray.push_back(DoRelation());
if (RelationArray.size() > 1)
{
@@ -1061,41 +1055,35 @@ SmNode *SmParser::DoExpression()
}
}
-void SmParser::DoRelation()
+SmNode *SmParser::DoRelation()
{
- DoSum();
+ SmNode *pFirst = DoSum();
while (TokenInGroup(TG::Relation))
{
std::unique_ptr<SmStructureNode> pSNode(new SmBinHorNode(m_aCurToken));
- SmNode *pFirst = popOrZero(m_aNodeStack);
-
SmNode *pSecond = DoOpSubSup();
-
- DoSum();
-
- pSNode->SetSubNodes(pFirst, pSecond, popOrZero(m_aNodeStack));
- m_aNodeStack.push_front(std::move(pSNode));
+ SmNode *pThird = DoSum();
+ pSNode->SetSubNodes(pFirst, pSecond, pThird);
+ pFirst = pSNode.release();
}
+ return pFirst;
}
-void SmParser::DoSum()
+SmNode *SmParser::DoSum()
{
- DoProduct();
+ SmNode *pFirst = DoProduct();
while (TokenInGroup(TG::Sum))
{
std::unique_ptr<SmStructureNode> pSNode(new SmBinHorNode(m_aCurToken));
- SmNode *pFirst = popOrZero(m_aNodeStack);
-
SmNode *pSecond = DoOpSubSup();
-
- DoProduct();
-
- pSNode->SetSubNodes(pFirst, pSecond, popOrZero(m_aNodeStack));
- m_aNodeStack.push_front(std::move(pSNode));
+ SmNode *pThird = DoProduct();
+ pSNode->SetSubNodes(pFirst, pSecond, pThird);
+ pFirst = pSNode.release();
}
+ return pFirst;
}
-void SmParser::DoProduct()
+SmNode *SmParser::DoProduct()
{
SmNode *pFirst = DoPower();
@@ -1165,7 +1153,7 @@ void SmParser::DoProduct()
}
pFirst = pSNode;
}
- m_aNodeStack.emplace_front(pFirst);
+ return pFirst;
}
SmNode *SmParser::DoSubSup(TG nActiveGroup, SmNode *pGivenNode)
@@ -1197,7 +1185,7 @@ SmNode *SmParser::DoSubSup(TG nActiveGroup, SmNode *pGivenNode)
if (eType == TFROM || eType == TTO)
{
// parse limits in old 4.0 and 5.0 style
- DoRelation();
+ m_aNodeStack.emplace_front(DoRelation());
}
else
m_aNodeStack.emplace_front(DoTerm(true));
@@ -2072,11 +2060,8 @@ SmTableNode *SmParser::DoBinom()
NextToken();
- DoSum();
- DoSum();
-
- SmNode *pSecond = popOrZero(m_aNodeStack);
- SmNode *pFirst = popOrZero(m_aNodeStack);
+ SmNode *pFirst = DoSum();
+ SmNode *pSecond = DoSum();
pSNode->SetSubNodes(pFirst, pSecond);
return pSNode.release();
}