Correct mpreal mem leaks due to perf issue correction

This commit is contained in:
Louis Rubet 2022-02-22 17:18:07 +01:00
parent 800dc3fc68
commit 8f5a334fe0
3 changed files with 14 additions and 7 deletions

View file

@ -5,7 +5,7 @@ bool Lexer::lexer(string& entry, map<string, ReservedWord>& keywords, vector<Syn
size_t jump; size_t jump;
for (size_t i = 0; i < entry.size(); i++) { for (size_t i = 0; i < entry.size(); i++) {
if (isspace(entry[i])) continue; if (isspace(entry[i])) continue;
SynElement element; SynElement element{.re = nullptr, .im = nullptr};
switch (entry[i]) { switch (entry[i]) {
case '"': case '"':
if (!parseString(entry, i, jump, errors, elements)) return false; 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] == '+') { if (entry[scan] == '+') {
scan++; scan++;
nextIdx = scan; nextIdx = scan;
} } else if (entry[scan] == '-') {
else if (entry[scan] == '-') {
scan++; scan++;
nextIdx = scan; nextIdx = scan;
positive = false; 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 (mpfr_set_str((*r)->mpfr_ptr(), token.c_str(), base, mpreal::get_default_rnd()) == 0) {
if (!positive) *(*r) = -*(*r); if (!positive) *(*r) = -*(*r);
return true; return true;
} else } else {
delete *r;
return false; return false;
}
} }
nextIdx = token.size() + idx + 1; nextIdx = token.size() + idx + 1;
return false; return false;
@ -206,16 +207,19 @@ bool Lexer::parseComplex(string& entry, size_t idx, size_t& nextIdx, vector<SynE
} }
size_t i = nextIdx; size_t i = nextIdx;
// while (i < entry.size() && entry[i] != ',') i++;
if (i >= entry.size()) { if (i >= entry.size()) {
elements.push_back({cmd_symbol, .value = entry.substr(idx, entry.size() - idx)}); elements.push_back({cmd_symbol, .value = entry.substr(idx, entry.size() - idx)});
nextIdx = entry.size(); nextIdx = entry.size();
if (re != nullptr) delete re;
if (im != nullptr) delete im;
return true; // complex format error, return a symbol return true; // complex format error, return a symbol
} }
if (!getNumberAt(entry, i, nextIdx, imBase, &im, ')')) { if (!getNumberAt(entry, i, nextIdx, imBase, &im, ')')) {
elements.push_back({cmd_symbol, .value = entry.substr(idx, entry.size() - idx)}); elements.push_back({cmd_symbol, .value = entry.substr(idx, entry.size() - idx)});
nextIdx = entry.size(); nextIdx = entry.size();
if (re != nullptr) delete re;
if (im != nullptr) delete im;
return true; // complex format error, return a symbol return true; // complex format error, return a symbol
} }
elements.push_back({cmd_complex, .re = re, .im = im, .reBase = reBase, .imBase = imBase}); elements.push_back({cmd_complex, .re = re, .im = im, .reBase = reBase, .imBase = imBase});

View file

@ -612,7 +612,10 @@ ret_value program::parse(string& entry) {
break; break;
default: default:
show_error(ret_unknown_err, "error creating program from entry"); 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 } else
for (SynError& err : errors) show_syntax_error(err.err.c_str()); for (SynError& err : errors) show_syntax_error(err.err.c_str());

View file

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
rpn=../build/rpn rpn=../debug/rpn
FG_RED="\033[0;31m" FG_RED="\033[0;31m"
FG_GREEN="\033[0;32m" FG_GREEN="\033[0;32m"