diff options
-rw-r--r-- | tests/runner.py | 8 | ||||
-rw-r--r-- | tools/js-optimizer.js | 101 | ||||
-rw-r--r-- | tools/shared.py | 3 |
3 files changed, 94 insertions, 18 deletions
diff --git a/tests/runner.py b/tests/runner.py index 507a422d..df833b24 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -5479,14 +5479,14 @@ f.close() def test_js_optimizer(self): for input, expected, passes in [ - (open(path_from_root('tools', 'test-js-optimizer.js')).read(), open(path_from_root('tools', 'test-js-optimizer-output.js')).read(), + (path_from_root('tools', 'test-js-optimizer.js'), open(path_from_root('tools', 'test-js-optimizer-output.js')).read(), ['hoistMultiples', 'loopOptimizer', 'unGlobalize', 'removeAssignsToUndefined', 'simplifyExpressionsPre', 'simplifyExpressionsPost']), - (open(path_from_root('tools', 'test-js-optimizer-t2c.js')).read(), open(path_from_root('tools', 'test-js-optimizer-t2c-output.js')).read(), + (path_from_root('tools', 'test-js-optimizer-t2c.js'), open(path_from_root('tools', 'test-js-optimizer-t2c-output.js')).read(), ['simplifyExpressionsPre', 'optimizeShiftsConservative']), - (open(path_from_root('tools', 'test-js-optimizer-t2.js')).read(), open(path_from_root('tools', 'test-js-optimizer-t2-output.js')).read(), + (path_from_root('tools', 'test-js-optimizer-t2.js'), open(path_from_root('tools', 'test-js-optimizer-t2-output.js')).read(), ['simplifyExpressionsPre', 'optimizeShiftsAggressive']), ]: - output = Popen([NODE_JS, JS_OPTIMIZER] + passes, stdin=PIPE, stdout=PIPE).communicate(input)[0] + output = Popen([NODE_JS, JS_OPTIMIZER, input] + passes, stdin=PIPE, stdout=PIPE).communicate()[0] self.assertIdentical(expected, output.replace('\n\n', '\n')) elif 'benchmark' in str(sys.argv): diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 7ac2195f..a77e0e09 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -5,26 +5,103 @@ // conjunction with closure compiler. //============================================================================== -var uglify = require('../tools/eliminator/node_modules/uglify-js'); -var fs = require('fs'); +// *** Environment setup code *** +var arguments_ = []; + +var ENVIRONMENT_IS_NODE = typeof process === 'object'; +var ENVIRONMENT_IS_WEB = typeof window === 'object'; +var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (ENVIRONMENT_IS_NODE) { + // Expose functionality in the same simple way that the shells work + print = function(x) { + process['stdout'].write(x + '\n'); + }; + printErr = function(x) { + process['stderr'].write(x + '\n'); + }; + + var nodeFS = require('fs'); + + read = function(filename) { + var ret = nodeFS['readFileSync'](filename).toString(); + if (!ret && filename[0] != '/') { + filename = __dirname.split('/').slice(0, -1).join('/') + '/src/' + filename; + ret = nodeFS['readFileSync'](filename).toString(); + } + return ret; + }; + + arguments_ = process['argv'].slice(2); + +} else if (ENVIRONMENT_IS_SHELL) { + // Polyfill over SpiderMonkey/V8 differences + if (!this['read']) { + read = function(f) { snarf(f) }; + } + + if (!this['arguments']) { + arguments_ = scriptArgs; + } else { + arguments_ = arguments; + } + +} else if (ENVIRONMENT_IS_WEB) { + print = printErr = function(x) { + console.log(x); + }; -// Make node environment compatible with JS shells + read = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + }; -function print(text) { - process.stdout.write(text + '\n'); + if (this['arguments']) { + arguments_ = arguments; + } +} else if (ENVIRONMENT_IS_WORKER) { + // We can do very little here... + + load = importScripts; + +} else { + throw 'Unknown runtime environment. Where are we?'; +} + +function globalEval(x) { + eval.call(null, x); +} + +if (typeof load == 'undefined' && typeof read != 'undefined') { + load = function(f) { + globalEval(read(f)); + }; } -function printErr(text) { - process.stderr.write(text + '\n'); + +if (typeof printErr === 'undefined') { + printErr = function(){}; +} + +if (typeof print === 'undefined') { + print = printErr; } -function read(filename) { +// *** Environment setup code *** + +// Fix read for our location +read = function(filename) { if (filename[0] != '/') filename = __dirname.split('/').slice(0, -1).join('/') + '/src/' + filename; return fs.readFileSync(filename).toString(); } -var arguments = process.argv.slice(2); + +var uglify = require('../tools/eliminator/node_modules/uglify-js'); +var fs = require('fs'); // Load some modules -eval(read('utility.js')); +load('utility.js'); // Utilities @@ -1030,14 +1107,14 @@ var passes = { // Main -var src = fs.readFileSync('/dev/stdin').toString(); +var src = read(arguments_[0]); var ast = srcToAst(src); //printErr(JSON.stringify(ast)); throw 1; var metadata = src.split('\n').filter(function(line) { return line.indexOf('EMSCRIPTEN_GENERATED_FUNCTIONS') >= 0 })[0]; //assert(metadata, 'Must have EMSCRIPTEN_GENERATED_FUNCTIONS metadata'); if (metadata) setGeneratedFunctions(metadata); -arguments.forEach(function(arg) { +arguments_.slice(1).forEach(function(arg) { passes[arg](ast); }); //printErr('output: ' + dump(ast)); diff --git a/tools/shared.py b/tools/shared.py index 5fdfdfb8..f919bc8c 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -615,8 +615,7 @@ class Building: if type(passes) == str: passes = [passes] - input = open(filename, 'r').read() - output, err = Popen([NODE_JS, JS_OPTIMIZER] + passes, stdin=PIPE, stdout=PIPE, stderr=PIPE).communicate(input) + output, err = Popen([NODE_JS, JS_OPTIMIZER, filename] + passes, stdin=PIPE, stdout=PIPE, stderr=PIPE).communicate() assert len(output) > 0 and not output.startswith('Assertion failed'), 'Error in js optimizer: ' + err + '\n\n' + output filename += '.jo.js' f = open(filename, 'w') |