aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/js-optimizer.js97
-rw-r--r--tools/shared.py23
-rw-r--r--tools/test-js-optimizer-output.js19
-rw-r--r--tools/test-js-optimizer.js21
4 files changed, 104 insertions, 56 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index bc5d5d8c..665ba0db 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -433,52 +433,57 @@ function hoistMultiples(ast) {
var more = true;
while (more) {
more = false;
- traverse(ast, function(node, type) {
- if (type == 'if' && node[2][0] == 'block' && node[2][1].length == 0) {
- more = true;
- if (node[2][2]) { // if there is an else, return that
- return node[2][2];
- } else {
- return emptyNode();
- }
- } else if (type == 'block' && !node[1]) {
- return emptyNode();
- } else if (type == 'block' && (node[1].length == 0 || (node[1].length == 1 && jsonCompare(node[1][0], emptyNode())))) {
- more = true;
- return emptyNode();
- } else if (type == 'block' && node[1].length == 1 && node[1][0][0] == 'block') {
- more = true;
- return node[1][0];
- } else if (type == 'stat' && node[1][0] == 'block') {
- more = true;
- return node[1];
- } else if (type == 'block') {
- var pre = node[1].length;
- node[1] = node[1].filter(function(blockItem) { return !jsonCompare(blockItem, emptyNode()) });
- if (node[1].length < pre) {
- more = true;
- return node;
- }
- } else if (type == 'defun' && node[3].length == 1 && node[3][0][0] == 'block') {
- more = true;
- node[3] = node[3][0][1];
- return node;
- } else if (type == 'defun') {
- var pre = node[3].length;
- node[3] = node[3].filter(function(blockItem) { return !jsonCompare(blockItem, emptyNode()) });
- if (node[3].length < pre) {
- more = true;
- return node;
- }
- } else if (type == 'do' && node[1][0] == 'num' && jsonCompare(node[2], emptyNode())) {
- more = true;
- return emptyNode();
- } else if (type == 'label' && jsonCompare(node[2], emptyNode())) {
- more = true;
- return emptyNode();
- } else if (type == 'if' && jsonCompare(node[3], emptyNode())) { // empty else clauses
- node[3] = null;
- return node;
+ ast[1].forEach(function(node, i) {
+ var type = node[0];
+ if (type == 'defun') {
+ traverse(node, function(node, type) {
+ if (type == 'if' && node[2][0] == 'block' && node[2][1].length == 0) {
+ more = true;
+ if (node[2][2]) { // if there is an else, return that
+ return node[2][2];
+ } else {
+ return emptyNode();
+ }
+ } else if (type == 'block' && !node[1]) {
+ return emptyNode();
+ } else if (type == 'block' && (node[1].length == 0 || (node[1].length == 1 && jsonCompare(node[1][0], emptyNode())))) {
+ more = true;
+ return emptyNode();
+ } else if (type == 'block' && node[1].length == 1 && node[1][0][0] == 'block') {
+ more = true;
+ return node[1][0];
+ } else if (type == 'stat' && node[1][0] == 'block') {
+ more = true;
+ return node[1];
+ } else if (type == 'block') {
+ var pre = node[1].length;
+ node[1] = node[1].filter(function(blockItem) { return !jsonCompare(blockItem, emptyNode()) });
+ if (node[1].length < pre) {
+ more = true;
+ return node;
+ }
+ } else if (type == 'defun' && node[3].length == 1 && node[3][0][0] == 'block') {
+ more = true;
+ node[3] = node[3][0][1];
+ return node;
+ } else if (type == 'defun') {
+ var pre = node[3].length;
+ node[3] = node[3].filter(function(blockItem) { return !jsonCompare(blockItem, emptyNode()) });
+ if (node[3].length < pre) {
+ more = true;
+ return node;
+ }
+ } else if (type == 'do' && node[1][0] == 'num' && jsonCompare(node[2], emptyNode())) {
+ more = true;
+ return emptyNode();
+ } else if (type == 'label' && jsonCompare(node[2], emptyNode())) {
+ more = true;
+ return emptyNode();
+ } else if (type == 'if' && jsonCompare(node[3], emptyNode())) { // empty else clauses
+ node[3] = null;
+ return node;
+ }
+ });
}
});
}
diff --git a/tools/shared.py b/tools/shared.py
index 3567e28e..adf3004e 100644
--- a/tools/shared.py
+++ b/tools/shared.py
@@ -273,8 +273,9 @@ class Settings:
QUANTUM_SIZE = 4
reset = Settings.reset
+ # Given some emcc-type args (-O3, -s X=Y, etc.), fill Settings with the right settings
@classmethod
- def load_settings(self, args):
+ def load(self, args):
# Load the JS defaults into python
settings = open(path_from_root('src', 'settings.js')).read().replace('var ', 'Settings.').replace('//', '#')
exec settings in globals()
@@ -288,6 +289,16 @@ class Settings:
if args[i] == '-s':
exec 'Settings.' + args[i+1] in globals() # execute the setting
+ # Transforms the Settings information into emcc-compatible args (-s X=Y, etc.). Basically
+ # the reverse of load_settings, except for -Ox which is relevant there but not here
+ @classmethod
+ def serialize(self):
+ ret = []
+ for key, value in Settings.__dict__.iteritems():
+ if key == key.upper(): # this is a hack. all of our settings are ALL_CAPS, python internals are not
+ ret += ['-s', key + '=' + json.dumps(value)]
+ return ret
+
@classmethod
def apply_opt_level(self, opt_level, noisy=False):
if opt_level >= 1:
@@ -469,15 +480,7 @@ class Building:
extra_args += ['-H', 'libc/fcntl.h,libc/sys/unistd.h,poll.h,libc/math.h,libc/langinfo.h,libc/time.h']
# Run Emscripten
- exported_settings = {}
- for setting in ['QUANTUM_SIZE', 'RELOOP', 'MICRO_OPTS', 'ASSERTIONS', 'USE_TYPED_ARRAYS', 'SAFE_HEAP', 'CHECK_OVERFLOWS', 'CORRECT_OVERFLOWS', 'CORRECT_SIGNS', 'CHECK_SIGNS', 'CORRECT_OVERFLOWS_LINES', 'CORRECT_SIGNS_LINES', 'CORRECT_ROUNDINGS', 'CORRECT_ROUNDINGS_LINES', 'INVOKE_RUN', 'SAFE_HEAP_LINES', 'INIT_STACK', 'PGO', 'EXPORTED_FUNCTIONS', 'EXPORTED_GLOBALS', 'BUILD_AS_SHARED_LIB', 'RUNTIME_LINKED_LIBS', 'INCLUDE_FULL_LIBRARY', 'RUNTIME_TYPE_INFO', 'DISABLE_EXCEPTION_CATCHING', 'TOTAL_MEMORY', 'FAST_MEMORY', 'EXCEPTION_DEBUG', 'PROFILE', 'I64_MODE', 'EMULATE_UNALIGNED_ACCESSES', 'CATCH_EXIT_CODE', 'USE_FHEAP']:
- try:
- value = eval('Settings.' + setting)
- if value is not None:
- exported_settings[setting] = value
- except:
- pass
- settings = ['-s %s=%s' % (k, json.dumps(v)) for k, v in exported_settings.items()]
+ settings = Settings.serialize()
compiler_output = timeout_run(Popen(['python', EMSCRIPTEN, filename + ('.o.ll' if append_ext else ''), '-o', filename + '.o.js'] + settings + extra_args, stdout=PIPE), None, 'Compiling')
#print compiler_output
diff --git a/tools/test-js-optimizer-output.js b/tools/test-js-optimizer-output.js
index 4c5b073c..aa494a05 100644
--- a/tools/test-js-optimizer-output.js
+++ b/tools/test-js-optimizer-output.js
@@ -145,4 +145,23 @@ function hoisting() {
somethingElse();
}
}
+var FS = {
+ absolutePath: (function(relative, base) {
+ if (typeof relative !== "string") return null;
+ if (base === undefined) base = FS.currentPath;
+ if (relative && relative[0] == "/") base = "";
+ var full = base + "/" + relative;
+ var parts = full.split("/").reverse();
+ var absolute = [ "" ];
+ while (parts.length) {
+ var part = parts.pop();
+ if (part == "" || part == ".") {} else if (part == "..") {
+ if (absolute.length > 1) absolute.pop();
+ } else {
+ absolute.push(part);
+ }
+ }
+ return absolute.length == 1 ? "/" : absolute.join("/");
+ })
+};
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["abc", "xyz", "xyz2", "expr", "loopy", "bits", "maths", "hoisting"]
diff --git a/tools/test-js-optimizer.js b/tools/test-js-optimizer.js
index 8c2ad183..8d10d222 100644
--- a/tools/test-js-optimizer.js
+++ b/tools/test-js-optimizer.js
@@ -160,4 +160,25 @@ function hoisting() {
somethingElse();
}
}
+var FS = {
+ absolutePath: function(relative, base) { // Don't touch this!
+ if (typeof relative !== 'string') return null;
+ if (base === undefined) base = FS.currentPath;
+ if (relative && relative[0] == '/') base = '';
+ var full = base + '/' + relative;
+ var parts = full.split('/').reverse();
+ var absolute = [''];
+ while (parts.length) {
+ var part = parts.pop();
+ if (part == '' || part == '.') {
+ // Nothing.
+ } else if (part == '..') {
+ if (absolute.length > 1) absolute.pop();
+ } else {
+ absolute.push(part);
+ }
+ }
+ return absolute.length == 1 ? '/' : absolute.join('/');
+ }
+}
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["abc", "xyz", "xyz2", "expr", "loopy", "bits", "maths", "hoisting"]