From f04dd1bb5b06d64ebfdd347a852a55322743b363 Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Tue, 15 Mar 2016 02:56:12 -0700 Subject: Don't reinsert in set when interning strings. --- src/emscripten-optimizer/istring.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/emscripten-optimizer/istring.h b/src/emscripten-optimizer/istring.h index abc1e327b..498c7c27c 100644 --- a/src/emscripten-optimizer/istring.h +++ b/src/emscripten-optimizer/istring.h @@ -75,10 +75,10 @@ struct IString { char *copy = (char*)malloc(strlen(s)+1); // XXX leaked strcpy(copy, s); s = copy; + strings->insert(s); } else { s = *existing; } - strings->insert(s); str = s; } } -- cgit v1.2.3 From ac2a4a62dd903e11be089018bcd11d7a7584a973 Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Tue, 15 Mar 2016 03:24:55 -0700 Subject: Remove recursion from s-expr parsing. --- src/wasm-s-parser.h | 54 ++++++++++++++++++++++------------------------------- 1 file changed, 22 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index db57dda9f..2f2eeb937 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -125,47 +125,37 @@ public: SExpressionParser(char* input) : input(input) { root = nullptr; while (!root) { // keep parsing until we pass an initial comment - root = parseInnerList(); + root = parse(); } } Element* root; private: - // parses the internal part of a list, inside the parens. - Element* parseInnerList() { - if (input[0] == ';') { - // comment - input++; - if (input[0] == ';') { - while (input[0] != '\n') input++; - return nullptr; - } - input = strstr(input, ";)"); - assert(input); - return nullptr; - } - auto ret = allocator.alloc(); - while (1) { - Element* curr = parse(); - if (!curr) return ret; - ret->list().push_back(curr); - } - } - Element* parse() { - skipWhitespace(); - if (input[0] == 0 || input[0] == ')') return nullptr; - if (input[0] == '(') { - // a list - input++; - auto ret = parseInnerList(); + std::vector stack; + Element *curr = allocator.alloc(); + while (1) { skipWhitespace(); - assert(input[0] == ')'); - input++; - return ret; + if (input[0] == 0) + break; + if (input[0] == '(') { + input++; + stack.push_back(curr); + curr = allocator.alloc(); + } else if (input[0] == ')') { + input++; + auto last = curr; + curr = stack.back(); + assert(stack.size()); + stack.pop_back(); + curr->list().push_back(last); + } else { + curr->list().push_back(parseString()); + } } - return parseString(); + assert(stack.size() == 0); + return curr; } void skipWhitespace() { -- cgit v1.2.3 From e35a06baa37f2b392fd4bb9796f71317665a0b08 Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Tue, 15 Mar 2016 10:38:48 -0700 Subject: fix block comments --- src/wasm-s-parser.h | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index 2f2eeb937..bb3492e9a 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -164,7 +164,26 @@ private: if (input[0] == ';' && input[1] == ';') { while (input[0] && input[0] != '\n') input++; } else if (input[0] == '(' && input[1] == ';') { - input = strstr(input, ";)") + 2; + // Skip nested block comments. + input += 2; + int depth = 1; + while (1) { + if (input[0] == 0) { + return; + } + if (input[0] == '(' && input[1] == ';') { + input += 2; + depth++; + } else if (input[0] == ';' && input[1] == ')') { + input += 2; + --depth; + if (depth == 0) { + break; + } + } else { + input++; + } + } } else { return; } -- cgit v1.2.3