diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-04-18 21:39:22 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-04-18 21:39:22 -0700 |
commit | 5bdc1a5bab4a14a9970fb53be603989a57a3a67b (patch) | |
tree | 4e8a8329fef3cd39ca8bf79f5a43e68b615c80bc | |
parent | 93e4ae68d6263556f6bd2dfd4ffc9f1377ada7ce (diff) |
exit to caller when setjmp encounters an id that is not ours; enable test_longjmp2 and 3 in asm
-rw-r--r-- | src/jsifier.js | 5 | ||||
-rw-r--r-- | src/library.js | 4 | ||||
-rwxr-xr-x | tests/runner.py | 4 |
3 files changed, 5 insertions, 8 deletions
diff --git a/src/jsifier.js b/src/jsifier.js index 7086922c..ea1289c6 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -1473,8 +1473,9 @@ function JSify(data, functionsOnly, givenFunctions) { } if (ASM_JS && funcData.setjmpTable) { - // check if a longjmp was done - ret += '; if (((__THREW__|0) != 0) & ((threwValue|0) > 0)) { setjmpLabel = _testSetjmp(' + makeGetValue('__THREW__', 0, 'i32') + ', setjmpTable); if ((setjmpLabel|0) > 0) { label = -1111; break } } __THREW__ = threwValue = 0;\n'; + // check if a longjmp was done. If a setjmp happened, check if ours. If ours, go to -111 to handle it. + // otherwise, just return - the call to us must also have been an invoke, so the setjmp propagates that way + ret += '; if (((__THREW__|0) != 0) & ((threwValue|0) > 0)) { setjmpLabel = _testSetjmp(' + makeGetValue('__THREW__', 0, 'i32') + ', setjmpTable); if ((setjmpLabel|0) > 0) { label = -1111; break } else return ' + (funcData.returnType != 'void' ? asmCoercion('0', funcData.returnType) : '') + ' } __THREW__ = threwValue = 0;\n'; } return ret; diff --git a/src/library.js b/src/library.js index f9ed3ee6..2663512d 100644 --- a/src/library.js +++ b/src/library.js @@ -6253,10 +6253,10 @@ LibraryManager.library = { table = table|0; var i = 0, curr = 0; while ((i|0) < {{{ MAX_SETJMPS }}}) { - curr = {{{ makeGetValueAsm('table', 'i', 'i32') }}}; + curr = {{{ makeGetValueAsm('table', 'i*4', 'i32') }}}; if ((curr|0) == 0) break; if ((curr|0) == (id|0)) { - return {{{ makeGetValueAsm('table', 'i+1', 'i32') }}}; + return {{{ makeGetValueAsm('table', 'i*4+4', 'i32') }}}; } i = (i+2)|0; } diff --git a/tests/runner.py b/tests/runner.py index fd8fce20..60b670f7 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -2341,8 +2341,6 @@ cat |umber one top notchfi FI FO FUM WHEN WHERE WHY HOW WHO|''', ['wowie', 'too' self.do_run(src, 'second\nmain: 1\n') def test_longjmp2(self): - if Settings.ASM_JS: return self.skip('asm does not support longjmp') - src = r''' #include <setjmp.h> #include <stdio.h> @@ -2389,8 +2387,6 @@ Exiting stack_manipulate_func, level: 0 ''') def test_longjmp3(self): - if Settings.ASM_JS: return self.skip('asm does not support longjmp') - src = r''' #include <setjmp.h> #include <stdio.h> |