aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/runner.py8
-rw-r--r--tools/js-optimizer.js101
-rw-r--r--tools/shared.py3
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')