diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/file_packager.py | 18 | ||||
-rw-r--r-- | tools/js-optimizer.js | 12 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline1-output.js | 64 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline1.js | 2 |
4 files changed, 55 insertions, 41 deletions
diff --git a/tools/file_packager.py b/tools/file_packager.py index bb62e905..8a1f1ba5 100644 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -344,14 +344,7 @@ if has_preloaded: }, send: function() {}, onload: function() { - var data = this.byteArray.subarray(this.start, this.end); - var size = this.end - this.start; - var ptr = Module['_malloc'](size); // XXX leaked if a preload plugin replaces with new data - Module['HEAPU8'].set(data, ptr); - var arrayBuffer = Module['HEAPU8'].subarray(ptr, ptr + size); - assert(arrayBuffer, 'Loading file ' + name + ' failed'); - var byteArray = !arrayBuffer.subarray ? new Uint8Array(arrayBuffer) : arrayBuffer; - + var byteArray = this.byteArray.subarray(this.start, this.end); if (this.crunched) { var ddsHeader = byteArray.subarray(0, 128); var that = this; @@ -375,7 +368,7 @@ if has_preloaded: } else { Runtime.warn('Preloading file ' + that.name + ' failed'); } - }); + }, false, true); // canOwn this data in the filesystem, it is a slide into the heap that will never change this.requests[this.name] = null; }, }; @@ -419,7 +412,12 @@ for file_ in data_files: if has_preloaded: # Get the big archive and split it up - use_data = ' DataRequest.prototype.byteArray = byteArray;\n' + use_data = ''' + // copy the entire loaded file into a spot in the heap. Files will refer to slices in that. They cannot be freed though. + var ptr = Module['_malloc'](byteArray.length); + Module['HEAPU8'].set(byteArray, ptr); + DataRequest.prototype.byteArray = Module['HEAPU8'].subarray(ptr, ptr+byteArray.length); +''' for file_ in data_files: if file_['mode'] == 'preload': use_data += ' DataRequest.prototype.requests["%s"].onload();\n' % (file_['dstpath']) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 9a5104bf..b42164f9 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -135,6 +135,7 @@ var ASSIGN_OR_ALTER = set('assign', 'unary-postfix', 'unary-prefix'); var CONTROL_FLOW = set('do', 'while', 'for', 'if', 'switch'); var NAME_OR_NUM = set('name', 'num'); var ASSOCIATIVE_BINARIES = set('+', '*', '|', '&', '^'); +var ALTER_FLOW = set('break', 'continue', 'return'); var BREAK_CAPTURERS = set('do', 'while', 'for', 'switch'); var CONTINUE_CAPTURERS = LOOP; @@ -3070,10 +3071,10 @@ function outline(ast) { currSize += size; if (!isIf) { var last = part.body; - last = last[stats.length-1]; + last = last[last.length-1]; if (last && last[0] === 'block') last = last[1][last[1].length-1]; if (last && last[0] === 'stat') last = last[1]; - force = !last || last[0] !== 'break'; + force = !last || !(last[0] in ALTER_FLOW); } }); assert(currSize); @@ -3487,7 +3488,7 @@ function outline(ast) { } } outliningParents[newIdent] = func[1]; - printErr('performed outline ' + [func[1], newIdent, 'code sizes (pre/post):', originalCodeSize, measureSize(code), 'overhead (w/r):', setSize(setSub(codeInfo.writes, owned)), setSize(setSub(codeInfo.reads, owned)), ' owned: ', setSize(owned), ' left: ', setSize(asmData.vars), setSize(asmData.params), ' loopsDepth: ', loops]); + printErr('performed outline ' + [func[1], newIdent, 'pre size', originalCodeSize, 'resulting size', measureSize(code), 'overhead (w/r):', setSize(setSub(codeInfo.writes, owned)), setSize(setSub(codeInfo.reads, owned)), ' owned: ', setSize(owned), ' left: ', setSize(asmData.vars), setSize(asmData.params), ' loopsDepth: ', loops]); calculateThreshold(func, asmData); return [newFunc]; } @@ -3633,6 +3634,8 @@ function outline(ast) { var maxTotalFunctions = Infinity; // debugging tool + printErr('\n'); + var more = true; while (more) { more = false; @@ -3691,7 +3694,8 @@ function outline(ast) { } } } - printErr('... resulting size of ' + func[1] + ' is ' + measureSize(func)); + ret.push(func); + printErr('... resulting sizes of ' + func[1] + ' is ' + ret.map(measureSize) + '\n'); } denormalizeAsm(func, asmData); }); diff --git a/tools/test-js-optimizer-asm-outline1-output.js b/tools/test-js-optimizer-asm-outline1-output.js index 895004d8..612da16a 100644 --- a/tools/test-js-optimizer-asm-outline1-output.js +++ b/tools/test-js-optimizer-asm-outline1-output.js @@ -348,6 +348,15 @@ function switchh() { HEAP32[sp + 44 >> 2] = 0; switchh$2(sp); helper$0 = HEAP32[sp + 8 >> 2] | 0; + tempValue = HEAP32[sp + 40 >> 2] | 0; + tempInt = HEAP32[sp + 44 >> 2] | 0; + tempDouble = +HEAPF32[sp + 44 >> 2]; + HEAP32[sp + 40 >> 2] = 0; + HEAP32[sp + 44 >> 2] = 0; + if ((tempValue | 0) == 5) { + STACKTOP = sp; + return; + } HEAP32[sp + 8 >> 2] = helper$0; HEAP32[sp + 16 >> 2] = helper$1; HEAP32[sp + 32 >> 2] = 0; @@ -749,36 +758,39 @@ function switchh$2(sp) { var helper$0 = 0, helper$1 = 0; helper$0 = HEAP32[sp + 8 >> 2] | 0; helper$1 = HEAP32[sp + 16 >> 2] | 0; - if (helper$0) { - helper$0 = 0; - switch (helper$1 | 0) { - case 1: - { - f(1); - g(); - break; - } - default: - { - helper$0 = 1; + OL : do { + if (helper$0) { + helper$0 = 0; + switch (helper$1 | 0) { + case 1: + { + f(1); + g(); + HEAP32[sp + 40 >> 2] = 5; + break OL; + } + default: + { + helper$0 = 1; + } } } - } - if (helper$0) { - helper$0 = 0; - switch (helper$1 | 0) { - case 2: - { - f(2); - g(); - break; - } - default: - { - helper$0 = 1; + if (helper$0) { + helper$0 = 0; + switch (helper$1 | 0) { + case 2: + { + f(2); + g(); + break; + } + default: + { + helper$0 = 1; + } } } - } + } while (0); HEAP32[sp + 8 >> 2] = helper$0; } diff --git a/tools/test-js-optimizer-asm-outline1.js b/tools/test-js-optimizer-asm-outline1.js index 3c454182..4282ec8e 100644 --- a/tools/test-js-optimizer-asm-outline1.js +++ b/tools/test-js-optimizer-asm-outline1.js @@ -269,7 +269,7 @@ function switchh() { case 1: { f(1); g(); - break; + return; } case 2: { f(2); |