MCPcopy Create free account
hub / github.com/LibreCAD/LibreCAD / AddOp

Method AddOp

libraries/muparser/src/muParserBytecode.cpp:199–342  ·  view source on GitHub ↗

\brief Add an operator identifier to bytecode. Operator entries in byte code consist of: value array position of the result the operator code according to ParserToken::ECmdCode \sa ParserToken::ECmdCode */

Source from the content-addressed store, hash-verified

197 \sa ParserToken::ECmdCode
198 */
199 void ParserByteCode::AddOp(ECmdCode a_Oprt)
200 {
201 bool bOptimized = false;
202
203 if (m_bEnableOptimizer)
204 {
205 std::size_t sz = m_vRPN.size();
206
207 // Check for foldable constants like:
208 // cmVAL cmVAL cmADD
209 // where cmADD can stand fopr any binary operator applied to
210 // two constant values.
211 if (sz >= 2 && m_vRPN[sz - 2].Cmd == cmVAL && m_vRPN[sz - 1].Cmd == cmVAL)
212 {
213 ConstantFolding(a_Oprt);
214 bOptimized = true;
215 }
216 else
217 {
218 switch (a_Oprt)
219 {
220 case cmPOW:
221 // Optimization for polynomials of low order
222 if (m_vRPN[sz - 2].Cmd == cmVAR && m_vRPN[sz - 1].Cmd == cmVAL)
223 {
224 if (m_vRPN[sz - 1].Val.data2 == 0)
225 {
226 m_vRPN[sz - 2].Cmd = cmVAL;
227 m_vRPN[sz - 2].Val.ptr = nullptr;
228 m_vRPN[sz - 2].Val.data = 0;
229 m_vRPN[sz - 2].Val.data2 = 1;
230 }
231 else if (m_vRPN[sz - 1].Val.data2 == 1)
232 m_vRPN[sz - 2].Cmd = cmVAR;
233 else if (m_vRPN[sz - 1].Val.data2 == 2)
234 m_vRPN[sz - 2].Cmd = cmVARPOW2;
235 else if (m_vRPN[sz - 1].Val.data2 == 3)
236 m_vRPN[sz - 2].Cmd = cmVARPOW3;
237 else if (m_vRPN[sz - 1].Val.data2 == 4)
238 m_vRPN[sz - 2].Cmd = cmVARPOW4;
239 else
240 break;
241
242 m_vRPN.pop_back();
243 bOptimized = true;
244 }
245 break;
246
247 case cmSUB:
248 case cmADD:
249 // Simple optimization based on pattern recognition for a shitload of different
250 // bytecode combinations of addition/subtraction
251 if ((m_vRPN[sz - 1].Cmd == cmVAR && m_vRPN[sz - 2].Cmd == cmVAL) ||
252 (m_vRPN[sz - 1].Cmd == cmVAL && m_vRPN[sz - 2].Cmd == cmVAR) ||
253 (m_vRPN[sz - 1].Cmd == cmVAL && m_vRPN[sz - 2].Cmd == cmVARMUL) ||
254 (m_vRPN[sz - 1].Cmd == cmVARMUL && m_vRPN[sz - 2].Cmd == cmVAL) ||
255 (m_vRPN[sz - 1].Cmd == cmVAR && m_vRPN[sz - 2].Cmd == cmVAR && m_vRPN[sz - 2].Val.ptr == m_vRPN[sz - 1].Val.ptr) ||
256 (m_vRPN[sz - 1].Cmd == cmVAR && m_vRPN[sz - 2].Cmd == cmVARMUL && m_vRPN[sz - 2].Val.ptr == m_vRPN[sz - 1].Val.ptr) ||

Callers 1

ApplyBinOprtMethod · 0.80

Calls 3

pop_backMethod · 0.80
sizeMethod · 0.45
push_backMethod · 0.45

Tested by

no test coverage detected