diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-02-18 12:01:57 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-02-18 12:01:57 -0800 |
commit | 52897895fb947665984a784555405ee0a806af18 (patch) | |
tree | f3bf5efac22ce12ddff4db971b4239c7c14ed5e6 /src/jsifier.js | |
parent | c4e578be4cc6f5a6d801b8106422eb30de725b18 (diff) |
basic support for setjmp/longjmp
Diffstat (limited to 'src/jsifier.js')
-rw-r--r-- | src/jsifier.js | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/jsifier.js b/src/jsifier.js index b830fc7c..7caeea61 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -576,12 +576,28 @@ function JSify(data, functionsOnly, givenFunctions) { if (block.entries.length == 1) { ret += indent + '__label__ = ' + getLabelId(block.entries[0]) + '; ' + (SHOW_LABELS ? '/* ' + block.entries[0] + ' */' : '') + '\n'; } // otherwise, should have been set before! - ret += indent + 'while(1) switch(__label__) {\n'; + if (func.setjmpTable) { + var setjmpTable = {}; + ret += indent + 'var setjmpTable = {'; + func.setjmpTable.forEach(function(triple) { // original label, label we created for right after the setjmp, variable setjmp result goes into + ret += getLabelId(triple[0])+ ': ' + 'function(value) { __label__ = ' + getLabelId(triple[1]) + '; ' + triple[2] + ' = value },'; + }); + ret += 'dummy: 0'; + ret += '};\n'; + } + ret += indent + 'while(1) '; + if (func.setjmpTable) { + ret += 'try { '; + } + ret += 'switch(__label__) {\n'; ret += block.labels.map(function(label) { return indent + ' case ' + getLabelId(label.ident) + ': // ' + label.ident + '\n' + getLabelLines(label, indent + ' '); }).join('\n'); ret += '\n' + indent + ' default: assert(0, "bad label: " + __label__);\n' + indent + '}'; + if (func.setjmpTable) { + ret += ' } catch(e) { if (!e.longjmp) throw(e); setjmpTable[e.label](e.value) }'; + } } else { ret += (SHOW_LABELS ? indent + '/* ' + block.entries[0] + ' */' : '') + '\n' + getLabelLines(block.labels[0], indent); } |