mirror of
https://github.com/louisrubet/rpn
synced 2025-02-07 08:45:48 +01:00
Merge pull request #232 from louisrubet/#225/mem_leak_due_to_perf_correction
#225 mem leak due to perf correction
This commit is contained in:
commit
d25c8cefbc
4 changed files with 15 additions and 8 deletions
|
@ -6,7 +6,7 @@ project(rpn)
|
||||||
|
|
||||||
if((NOT CMAKE_BUILD_TYPE MATCHES Debug)
|
if((NOT CMAKE_BUILD_TYPE MATCHES Debug)
|
||||||
AND (NOT CMAKE_BUILD_TYPE MATCHES Release))
|
AND (NOT CMAKE_BUILD_TYPE MATCHES Release))
|
||||||
set(CMAKE_BUILD_TYPE Release CACHE string "Choose the type of build, options are: None Debug Release" FORCE)
|
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release" FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
message(STATUS "Build mode: ${CMAKE_BUILD_TYPE}")
|
message(STATUS "Build mode: ${CMAKE_BUILD_TYPE}")
|
||||||
|
|
|
@ -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 {
|
||||||
return false;
|
delete *r;
|
||||||
|
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});
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Add table
Reference in a new issue