diff options
-rw-r--r-- | tests/test_core.py | 15 | ||||
-rw-r--r-- | tools/js-optimizer.js | 12 |
2 files changed, 19 insertions, 8 deletions
diff --git a/tests/test_core.py b/tests/test_core.py index 6442f894..1dc25dce 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -4652,12 +4652,15 @@ return malloc(size); if Settings.QUANTUM_SIZE == 1: return self.skip('TODO: make this work') if os.environ.get('EMCC_FAST_COMPILER') == '1': return self.skip('todo in fastcomp') - self.do_run('', - 'hello lua world!\n17\n1\n2\n3\n4\n7', - args=['-e', '''print("hello lua world!");print(17);for x = 1,4 do print(x) end;print(10-3)'''], - libraries=self.get_library('lua', [os.path.join('src', 'lua'), os.path.join('src', 'liblua.a')], make=['make', 'generic'], configure=None), - includes=[path_from_root('tests', 'lua')], - output_nicerizer=lambda string, err: (string + err).replace('\n\n', '\n').replace('\n\n', '\n')) + for aggro in ([0, 1] if '-O2' in self.emcc_args else [0]): + print aggro + Settings.AGGRESSIVE_VARIABLE_ELIMINATION = aggro + self.do_run('', + 'hello lua world!\n17\n1\n2\n3\n4\n7', + args=['-e', '''print("hello lua world!");print(17);for x = 1,4 do print(x) end;print(10-3)'''], + libraries=self.get_library('lua', [os.path.join('src', 'lua'), os.path.join('src', 'liblua.a')], make=['make', 'generic'], configure=None), + includes=[path_from_root('tests', 'lua')], + output_nicerizer=lambda string, err: (string + err).replace('\n\n', '\n').replace('\n\n', '\n')) def get_freetype(self): Settings.DEAD_FUNCTIONS += ['_inflateEnd', '_inflate', '_inflateReset', '_inflateInit2_'] diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 7b1c6bd1..b507a45a 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -3030,17 +3030,18 @@ function aggressiveVariableEliminationInternal(func, asmData) { allTrivials = {}; - var values = {}; + var values = {}, recursives = {}; function evaluate(name) { var node = values[name]; if (node) return node; - values[node] = null; // prevent infinite recursion + values[name] = null; // prevent infinite recursion var def = defs[name]; if (def) { node = def[3]; if (node[0] == 'name') { var name2 = node[1]; + assert(name2 !== name); if (name2 in trivials) { node = evaluate(name2); } @@ -3048,6 +3049,10 @@ function aggressiveVariableEliminationInternal(func, asmData) { traverse(node, function(node, type) { if (type == 'name') { var name2 = node[1]; + if (name2 === name) { + recursives[name] = 1; + return false; + } if (name2 in trivials) { return evaluate(name2); } @@ -3062,6 +3067,9 @@ function aggressiveVariableEliminationInternal(func, asmData) { for (var name in trivials) { evaluate(name); } + for (var name in recursives) { + delete trivials[name]; + } for (var name in trivials) { var def = defs[name]; |