diff --git a/src/index.html b/src/index.html index adeebb5..d3b1ee4 100644 --- a/src/index.html +++ b/src/index.html @@ -676,6 +676,7 @@ + diff --git a/src/script.js b/src/script.js index 96975dc..fac93ca 100644 --- a/src/script.js +++ b/src/script.js @@ -334,16 +334,18 @@ var code = editur.cm.js.getValue(); cleanupErrors('js'); + var ast; if (jsMode === JsModes.JS) { try { - esprima.parse(code, { + ast = esprima.parse(code, { tolerant: true }); } catch(e) { showErrors('js', [ { lineNumber: e.lineNumber-1, message: e.description } ]); } finally { - d.resolve(code); + utils.addInfiniteLoopProtection(ast); + d.resolve(escodegen.generate(ast)); } } else if (jsMode === JsModes.COFFEESCRIPT) { var coffeeCode; @@ -352,23 +354,31 @@ } catch (e) { showErrors('js', [ { lineNumber: e.location.first_line, message: e.message } ]); } finally { - d.resolve(coffeeCode); + ast = esprima.parse(coffeeCode, { + tolerant: true + }); + utils.addInfiniteLoopProtection(ast); + d.resolve(escodegen.generate(ast)); } } else if (jsMode === JsModes.ES6) { try { - esprima.parse(code, { + ast = esprima.parse(code, { tolerant: true }); } catch(e) { showErrors('js', [ { lineNumber: e.lineNumber-1, message: e.description } ]); } finally { - d.resolve(Babel.transform(code, { presets: ['es2015'] }).code); + utils.addInfiniteLoopProtection(ast); + d.resolve(Babel.transform(escodegen.generate(ast), { presets: ['es2015'] }).code); } } return d.promise; } + window.previewException = function (error) { + console.error('Possible infinite loop detected.', error.stack) + } window.onunload = function () { saveCode('code'); }; @@ -391,7 +401,7 @@ var contents = '\n
\n' + '\n' + '\n' + - '\n' + html + '\n\n'; + '\n' + html + '\n\n