mirror of
https://github.com/louisrubet/rpn
synced 2025-02-07 08:45:48 +01:00
Correct mpreal mem leaks due to perf issue correction
This commit is contained in:
parent
800dc3fc68
commit
8f5a334fe0
3 changed files with 14 additions and 7 deletions
|
@ -5,7 +5,7 @@ bool Lexer::lexer(string& entry, map<string, ReservedWord>& keywords, vector<Syn
|
|||
size_t jump;
|
||||
for (size_t i = 0; i < entry.size(); i++) {
|
||||
if (isspace(entry[i])) continue;
|
||||
SynElement element;
|
||||
SynElement element{.re = nullptr, .im = nullptr};
|
||||
switch (entry[i]) {
|
||||
case '"':
|
||||
if (!parseString(entry, i, jump, errors, elements)) return false;
|
||||
|
@ -116,8 +116,7 @@ int Lexer::getBaseAt(string& entry, size_t& nextIdx, bool& positive) {
|
|||
if (entry[scan] == '+') {
|
||||
scan++;
|
||||
nextIdx = scan;
|
||||
}
|
||||
else if (entry[scan] == '-') {
|
||||
} else if (entry[scan] == '-') {
|
||||
scan++;
|
||||
nextIdx = scan;
|
||||
positive = false;
|
||||
|
@ -169,8 +168,10 @@ bool Lexer::getNumberAt(string& entry, size_t idx, size_t& nextIdx, int& base, m
|
|||
if (mpfr_set_str((*r)->mpfr_ptr(), token.c_str(), base, mpreal::get_default_rnd()) == 0) {
|
||||
if (!positive) *(*r) = -*(*r);
|
||||
return true;
|
||||
} else
|
||||
} else {
|
||||
delete *r;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
nextIdx = token.size() + idx + 1;
|
||||
return false;
|
||||
|
@ -206,16 +207,19 @@ bool Lexer::parseComplex(string& entry, size_t idx, size_t& nextIdx, vector<SynE
|
|||
}
|
||||
|
||||
size_t i = nextIdx;
|
||||
// while (i < entry.size() && entry[i] != ',') i++;
|
||||
if (i >= entry.size()) {
|
||||
elements.push_back({cmd_symbol, .value = entry.substr(idx, entry.size() - idx)});
|
||||
nextIdx = entry.size();
|
||||
if (re != nullptr) delete re;
|
||||
if (im != nullptr) delete im;
|
||||
return true; // complex format error, return a symbol
|
||||
}
|
||||
|
||||
if (!getNumberAt(entry, i, nextIdx, imBase, &im, ')')) {
|
||||
elements.push_back({cmd_symbol, .value = entry.substr(idx, entry.size() - idx)});
|
||||
nextIdx = entry.size();
|
||||
if (re != nullptr) delete re;
|
||||
if (im != nullptr) delete im;
|
||||
return true; // complex format error, return a symbol
|
||||
}
|
||||
elements.push_back({cmd_complex, .re = re, .im = im, .reBase = reBase, .imBase = imBase});
|
||||
|
|
|
@ -612,7 +612,10 @@ ret_value program::parse(string& entry) {
|
|||
break;
|
||||
default:
|
||||
show_error(ret_unknown_err, "error creating program from entry");
|
||||
break;
|
||||
}
|
||||
if (element.re != nullptr) delete element.re;
|
||||
if (element.im != nullptr) delete element.im;
|
||||
}
|
||||
} else
|
||||
for (SynError& err : errors) show_syntax_error(err.err.c_str());
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/bash
|
||||
|
||||
rpn=../build/rpn
|
||||
rpn=../debug/rpn
|
||||
|
||||
FG_RED="\033[0;31m"
|
||||
FG_GREEN="\033[0;32m"
|
||||
|
|
Loading…
Add table
Reference in a new issue