diff options
Diffstat (limited to 'src/emscripten-optimizer')
-rw-r--r-- | src/emscripten-optimizer/istring.h | 4 | ||||
-rw-r--r-- | src/emscripten-optimizer/parser.cpp | 26 | ||||
-rw-r--r-- | src/emscripten-optimizer/simple_ast.cpp | 9 | ||||
-rw-r--r-- | src/emscripten-optimizer/simple_ast.h | 1 |
4 files changed, 26 insertions, 14 deletions
diff --git a/src/emscripten-optimizer/istring.h b/src/emscripten-optimizer/istring.h index 149f77d23..e47361eeb 100644 --- a/src/emscripten-optimizer/istring.h +++ b/src/emscripten-optimizer/istring.h @@ -149,11 +149,13 @@ namespace cashew { // IStringSet class IStringSet : public std::unordered_set<IString> { + std::vector<char> data; public: IStringSet() {} IStringSet(const char *init) { // comma-delimited list int size = strlen(init) + 1; - char *curr = new char[size]; // leaked! + data.resize(size); + char *curr = &data[0]; strncpy(curr, init, size); while (1) { char *end = strchr(curr, ' '); diff --git a/src/emscripten-optimizer/parser.cpp b/src/emscripten-optimizer/parser.cpp index b8297fc29..ef2891941 100644 --- a/src/emscripten-optimizer/parser.cpp +++ b/src/emscripten-optimizer/parser.cpp @@ -121,19 +121,19 @@ static std::vector<std::unordered_map<IString, int>> precedences; // op, type => struct Init { Init() { // operators, rtl, type - operatorClasses.push_back(OperatorClass(".", false, OperatorClass::Binary)); - operatorClasses.push_back(OperatorClass("! ~ + -", true, OperatorClass::Prefix)); - operatorClasses.push_back(OperatorClass("* / %", false, OperatorClass::Binary)); - operatorClasses.push_back(OperatorClass("+ -", false, OperatorClass::Binary)); - operatorClasses.push_back(OperatorClass("<< >> >>>", false, OperatorClass::Binary)); - operatorClasses.push_back(OperatorClass("< <= > >=", false, OperatorClass::Binary)); - operatorClasses.push_back(OperatorClass("== !=", false, OperatorClass::Binary)); - operatorClasses.push_back(OperatorClass("&", false, OperatorClass::Binary)); - operatorClasses.push_back(OperatorClass("^", false, OperatorClass::Binary)); - operatorClasses.push_back(OperatorClass("|", false, OperatorClass::Binary)); - operatorClasses.push_back(OperatorClass("? :", true, OperatorClass::Tertiary)); - operatorClasses.push_back(OperatorClass("=", true, OperatorClass::Binary)); - operatorClasses.push_back(OperatorClass(",", true, OperatorClass::Binary)); + operatorClasses.emplace_back(".", false, OperatorClass::Binary); + operatorClasses.emplace_back("! ~ + -", true, OperatorClass::Prefix); + operatorClasses.emplace_back("* / %", false, OperatorClass::Binary); + operatorClasses.emplace_back("+ -", false, OperatorClass::Binary); + operatorClasses.emplace_back("<< >> >>>", false, OperatorClass::Binary); + operatorClasses.emplace_back("< <= > >=", false, OperatorClass::Binary); + operatorClasses.emplace_back("== !=", false, OperatorClass::Binary); + operatorClasses.emplace_back("&", false, OperatorClass::Binary); + operatorClasses.emplace_back("^", false, OperatorClass::Binary); + operatorClasses.emplace_back("|", false, OperatorClass::Binary); + operatorClasses.emplace_back("? :", true, OperatorClass::Tertiary); + operatorClasses.emplace_back("=", true, OperatorClass::Binary); + operatorClasses.emplace_back(",", true, OperatorClass::Binary); precedences.resize(OperatorClass::Tertiary + 1); diff --git a/src/emscripten-optimizer/simple_ast.cpp b/src/emscripten-optimizer/simple_ast.cpp index 285686b9a..dddaeab02 100644 --- a/src/emscripten-optimizer/simple_ast.cpp +++ b/src/emscripten-optimizer/simple_ast.cpp @@ -56,6 +56,15 @@ bool Ref::operator!() { Arena arena; +Arena::~Arena() { + for (auto* chunk : chunks) { + delete[] chunk; + } + for (auto* chunk : arr_chunks) { + delete[] chunk; + } +} + Ref Arena::alloc() { if (chunks.size() == 0 || index == CHUNK_SIZE) { chunks.push_back(new Value[CHUNK_SIZE]); diff --git a/src/emscripten-optimizer/simple_ast.h b/src/emscripten-optimizer/simple_ast.h index 75b7987be..bfb42c510 100644 --- a/src/emscripten-optimizer/simple_ast.h +++ b/src/emscripten-optimizer/simple_ast.h @@ -84,6 +84,7 @@ struct Arena { int arr_index; Arena() : index(0), arr_index(0) {} + ~Arena(); Ref alloc(); ArrayStorage* allocArray(); |