diff options
-rw-r--r-- | src/library_egl.js | 6 | ||||
-rw-r--r-- | src/library_html5.js | 8 | ||||
-rw-r--r-- | src/relooper/Relooper.cpp | 2 | ||||
-rw-r--r-- | src/relooper/test.cpp | 2 | ||||
-rw-r--r-- | src/relooper/test.txt | 8 | ||||
-rw-r--r-- | tests/test_html5_mouse.c | 20 | ||||
-rw-r--r-- | tools/js-optimizer.js | 51 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline1-output.js | 39 |
8 files changed, 89 insertions, 47 deletions
diff --git a/src/library_egl.js b/src/library_egl.js index e2d1df43..46ec939e 100644 --- a/src/library_egl.js +++ b/src/library_egl.js @@ -492,7 +492,11 @@ var LibraryEGL = { EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); return 1; }, - + + + // EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void); + eglWaitGL: 'eglWaitClient', + // EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval); eglSwapInterval: function(display, interval) { if (display != 62000 /* Magic ID for Emscripten 'default display' */) { diff --git a/src/library_html5.js b/src/library_html5.js index 080bfe39..d9376c2a 100644 --- a/src/library_html5.js +++ b/src/library_html5.js @@ -126,7 +126,8 @@ var LibraryJSEvents = { isInternetExplorer: function() { return navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0; }, _removeHandler: function(i) { - JSEvents.eventHandlers[i].target.removeEventListener(JSEvents.eventHandlers[i].eventTypeString, JSEvents.eventHandlers[i].handlerFunc, true); + var h = JSEvents.eventHandlers[i]; + h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); JSEvents.eventHandlers.splice(i, 1); }, @@ -146,6 +147,7 @@ var LibraryJSEvents = { } if (eventHandler.callbackfunc) { + eventHandler.eventListenerFunc = jsEventHandler; eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); JSEvents.eventHandlers.push(eventHandler); JSEvents.registerRemoveEventListeners(); @@ -208,8 +210,8 @@ var LibraryJSEvents = { {{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenMouseEvent.metaKey, 'e.metaKey', 'i32') }}}; {{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenMouseEvent.button, 'e.button', 'i16') }}}; {{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenMouseEvent.buttons, 'e.buttons', 'i16') }}}; - {{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenMouseEvent.movementX, 'e.movementX || e.mozMovementX || e.webkitMovementX || (e.screenX-JSEvents.previousScreenX)', 'i32') }}}; - {{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenMouseEvent.movementY, 'e.movementY || e.mozMovementY || e.webkitMovementY || (e.screenY-JSEvents.previousScreenY)', 'i32') }}}; + {{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenMouseEvent.movementX, 'e["movementX"] || e["mozMovementX"] || e["webkitMovementX"] || (e.screenX-JSEvents.previousScreenX)', 'i32') }}}; + {{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenMouseEvent.movementY, 'e["movementY"] || e["mozMovementY"] || e["webkitMovementY"] || (e.screenY-JSEvents.previousScreenY)', 'i32') }}}; {{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenMouseEvent.canvasX, 'e.clientX - rect.left', 'i32') }}}; {{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenMouseEvent.canvasY, 'e.clientY - rect.top', 'i32') }}}; JSEvents.previousScreenX = e.screenX; diff --git a/src/relooper/Relooper.cpp b/src/relooper/Relooper.cpp index c6830158..780a6d59 100644 --- a/src/relooper/Relooper.cpp +++ b/src/relooper/Relooper.cpp @@ -655,7 +655,7 @@ void Relooper::Calculate(Block *Entry) { Block *Curr = *iter; for (BlockBranchMap::iterator iter = Curr->BranchesOut.begin(); iter != Curr->BranchesOut.end(); iter++) { Block *Target = iter->first; - if (!contains(Hoisted, Target) && !contains(NextEntries, Target)) + if (!contains(Hoisted, Target) && !contains(NextEntries, Target)) { // abort this hoisting abort = true; break; diff --git a/src/relooper/test.cpp b/src/relooper/test.cpp index 2b25001b..78de9e64 100644 --- a/src/relooper/test.cpp +++ b/src/relooper/test.cpp @@ -312,7 +312,7 @@ int main() { printf("\n\n", "the_var"); r.Render(); - puts(buffer); + puts(r.GetOutputBuffer()); } if (1) { diff --git a/src/relooper/test.txt b/src/relooper/test.txt index 1fa205ba..7d79e037 100644 --- a/src/relooper/test.txt +++ b/src/relooper/test.txt @@ -324,10 +324,6 @@ label = 1; L0: while(1) { switch(label|0) { - case 3: { - // block C - break; - } case 1: { // block A if (check == 10) { @@ -357,6 +353,10 @@ } break; } + case 3: { + // block C + break; + } } } diff --git a/tests/test_html5_mouse.c b/tests/test_html5_mouse.c index e73211c4..f087a62b 100644 --- a/tests/test_html5_mouse.c +++ b/tests/test_html5_mouse.c @@ -79,6 +79,13 @@ EM_BOOL mouse_callback(int eventType, const EmscriptenMouseEvent *e, void *userD if (eventType == EMSCRIPTEN_EVENT_MOUSEMOVE && (e->movementX != 0 || e->movementY != 0)) gotMouseMove = 1; } + if (eventType == EMSCRIPTEN_EVENT_CLICK && e->screenX == -500000) + { + printf("ERROR! Received an event to a callback that should have been unregistered!\n"); + gotClick = 0; + report_result(1); + } + instruction(); return 0; } @@ -123,6 +130,19 @@ int main() window.dispatchEvent(event); } sendEvent('click', { screenX: 1, screenY: 1, clientX: 1, clientY: 1, button: 0, buttons: 1 }); + ); + // Test that unregistering a callback works. Clicks should no longer be received. + ret = emscripten_set_click_callback(0, 0, 1, 0); + TEST_RESULT(emscripten_set_click_callback); + + EM_ASM( + function sendEvent(type, data) { + var event = document.createEvent('Event'); + event.initEvent(type, true, true); + for(var d in data) event[d] = data[d]; + window.dispatchEvent(event); + } + sendEvent('click', { screenX: -500000, screenY: -500000, clientX: -500000, clientY: -500000, button: 0, buttons: 1 }); // Send a dummy event that should not be received. sendEvent('mousedown', { screenX: 1, screenY: 1, clientX: 1, clientY: 1, button: 0, buttons: 1 }); sendEvent('mouseup', { screenX: 1, screenY: 1, clientX: 1, clientY: 1, button: 0, buttons: 0 }); sendEvent('dblclick', { screenX: 1, screenY: 1, clientX: 1, clientY: 1, button: 0, buttons: 1 }); diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 240ee2bd..81bf8824 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -279,6 +279,28 @@ function clearEmptyNodes(list) { } } +function filterEmptyNodes(list) { // creates a copy and returns it + return list.filter(function(node) { + return !(isEmptyNode(node) || (node[0] === 'stat' && isEmptyNode(node[1]))); + }); +} + +function removeEmptySubNodes(node) { + if (node[0] === 'defun') { + node[3] = filterEmptyNodes(node[3]); + } else if (node[0] === 'block' && node[1]) { + node[1] = filterEmptyNodes(node[1]); + } +/* + var stats = getStatements(node); + if (stats) clearEmptyNodes(stats); +*/ +} + +function removeAllEmptySubNodes(ast) { + traverse(ast, removeEmptySubNodes); +} + // Passes // Dump the AST. Useful for debugging. For example, @@ -1281,6 +1303,7 @@ function vacuum(ast) { traverseGeneratedFunctions(ast, function(node) { vacuumInternal(node); simplifyNotComps(node); + removeEmptySubNodes(node); }); } @@ -1687,6 +1710,11 @@ function denormalizeAsm(func, data) { if (!isEmptyNode(stats[i])) break; } } + // calculate variable definitions + var varDefs = []; + for (var v in data.vars) { + varDefs.push(makeAsmVarDef(v, data.vars[v])); + } // each param needs a line; reuse emptyNodes as much as we can var numParams = 0; for (var i in data.params) numParams++; @@ -1695,26 +1723,21 @@ function denormalizeAsm(func, data) { if (!isEmptyNode(stats[emptyNodes])) break; emptyNodes++; } - var neededEmptyNodes = numParams + 1; // params plus one big var + var neededEmptyNodes = numParams + (varDefs.length ? 1 : 0); // params plus one big var if there are vars if (neededEmptyNodes > emptyNodes) { var args = [0, 0]; for (var i = 0; i < neededEmptyNodes - emptyNodes; i++) args[i+2] = 0; stats.splice.apply(stats, args); + } else if (neededEmptyNodes < emptyNodes) { + stats.splice(0, emptyNodes - neededEmptyNodes); } // add param coercions var next = 0; func[2].forEach(function(param) { stats[next++] = ['stat', ['assign', true, ['name', param], makeAsmCoercion(['name', param], data.params[param])]]; }); - // add variable definitions - var varDefs = []; - for (var v in data.vars) { - varDefs.push(makeAsmVarDef(v, data.vars[v])); - } if (varDefs.length) { stats[next] = ['var', varDefs]; - } else { - stats[next] = emptyNode(); } if (data.inlines.length > 0) { var i = 0; @@ -3877,6 +3900,8 @@ function eliminate(ast, memSafe) { } new ExpressionOptimizer(ast).run(); } + + removeAllEmptySubNodes(ast); } function eliminateMemSafe(ast) { @@ -4247,6 +4272,8 @@ function aggressiveVariableEliminationInternal(func, asmData) { } } }); + + removeAllEmptySubNodes(func); } function aggressiveVariableElimination(ast) { @@ -5281,7 +5308,15 @@ if (extraInfoStart > 0) extraInfo = JSON.parse(src.substr(extraInfoStart + 14)); arguments_.slice(1).forEach(function(arg) { + //traverse(ast, function(node) { + // if (node[0] === 'defun' && node[1] === 'copyTempFloat') printErr('pre ' + JSON.stringify(node, null, ' ')); + //}); passes[arg](ast); + //var func; + //traverse(ast, function(node) { + // if (node[0] === 'defun') func = node; + // if (isEmptyNode(node)) throw 'empty node after ' + arg + ', in ' + func[1]; + //}); }); if (asm && last) { asmLastOpts(ast); // TODO: move out of last, to make last faster when done later (as in side modules) diff --git a/tools/test-js-optimizer-asm-outline1-output.js b/tools/test-js-optimizer-asm-outline1-output.js index c4792c51..40c028c6 100644 --- a/tools/test-js-optimizer-asm-outline1-output.js +++ b/tools/test-js-optimizer-asm-outline1-output.js @@ -176,11 +176,12 @@ function vars(x, y) { y = +y; var sp = 0; sp = STACKTOP; - STACKTOP = STACKTOP + 152 | 0; + STACKTOP = STACKTOP + 136 | 0; c(1 + (x + y)); c(2 + y * x); c(3 + (x + y)); c(4 + y * x); + c(5 + (x + y)); HEAP32[sp + 8 >> 2] = x; HEAPF32[sp + 16 >> 2] = y; HEAP32[sp + 24 >> 2] = 0; @@ -213,7 +214,7 @@ function vars3(x, y) { y = +y; var a = 0, sp = 0; sp = STACKTOP; - STACKTOP = STACKTOP + 160 | 0; + STACKTOP = STACKTOP + 144 | 0; a = x + y; a = c(1 + a); a = c(2 + y * x); @@ -256,15 +257,11 @@ function vars_w_stack(x, y) { var a = 0, b = +0, sp = 0; sp = STACKTOP; STACKTOP = STACKTOP + 208 | 0; - HEAP32[sp + 24 >> 2] = x; - HEAPF32[sp + 32 >> 2] = y; - HEAP32[sp + 40 >> 2] = a; - HEAPF32[sp + 48 >> 2] = b; - HEAP32[sp + 72 >> 2] = 0; - HEAP32[sp + 76 >> 2] = 0; - vars_w_stack$1(sp); - a = HEAP32[sp + 40 >> 2] | 0; - b = +HEAPF32[sp + 48 >> 2]; + a = x + y; + b = y * x; + a = c(1 + a); + a = c(2 + a); + a = c(3 + a); HEAP32[sp + 40 >> 2] = a; HEAPF32[sp + 48 >> 2] = b; HEAP32[sp + 64 >> 2] = 0; @@ -585,10 +582,9 @@ function mix$1(sp) { } function vars$0(sp) { sp = sp | 0; - var x = 0, y = +0; + var y = +0, x = 0; x = HEAP32[sp + 8 >> 2] | 0; y = +HEAPF32[sp + 16 >> 2]; - c(5 + (x + y)); c(6 + y * x); c(7 + (x + y)); c(8 + y * x); @@ -632,6 +628,7 @@ function vars_w_stack$0(sp) { var a = 0, b = +0; a = HEAP32[sp + 40 >> 2] | 0; b = +HEAPF32[sp + 48 >> 2]; + a = c(4 + a); a = c(5 + a); a = c(6 + a); b = c(7 + a); @@ -639,22 +636,6 @@ function vars_w_stack$0(sp) { HEAP32[sp + 40 >> 2] = a; HEAPF32[sp + 48 >> 2] = b; } -function vars_w_stack$1(sp) { - sp = sp | 0; - var a = 0, x = 0, y = +0, b = +0; - x = HEAP32[sp + 24 >> 2] | 0; - y = +HEAPF32[sp + 32 >> 2]; - a = HEAP32[sp + 40 >> 2] | 0; - b = +HEAPF32[sp + 48 >> 2]; - a = x + y; - b = y * x; - a = c(1 + a); - a = c(2 + a); - a = c(3 + a); - a = c(4 + a); - HEAP32[sp + 40 >> 2] = a; - HEAPF32[sp + 48 >> 2] = b; -} function chain$0(sp) { sp = sp | 0; var helper$0 = 0; |