aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/jsifier.js5
-rw-r--r--src/library.js4
-rwxr-xr-xtests/runner.py4
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>