diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jsifier.js | 3 | ||||
-rw-r--r-- | src/library.js | 46 | ||||
-rw-r--r-- | src/modules.js | 20 |
3 files changed, 62 insertions, 7 deletions
diff --git a/src/jsifier.js b/src/jsifier.js index 2791c65b..595e057c 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -619,6 +619,7 @@ function JSify(data, functionsOnly, givenFunctions) { } // otherwise, should have been set before! if (func.setjmpTable) { var setjmpTable = {}; + ret += indent + 'var setjmped = false;'; // set to true if we setjmp in this invocation 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 },'; @@ -637,7 +638,7 @@ function JSify(data, functionsOnly, givenFunctions) { }).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) }'; + ret += ' } catch(e) { if (!setjmped) throw(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); diff --git a/src/library.js b/src/library.js index 0580407d..5c2e298e 100644 --- a/src/library.js +++ b/src/library.js @@ -4039,6 +4039,10 @@ LibraryManager.library = { return Math.floor(Math.random()*0x80000000); }, + drand48: function() { + return Math.random(); + }, + realpath__deps: ['$FS', '__setErrNo'], realpath: function(file_name, resolved_name) { // char *realpath(const char *restrict file_name, char *restrict resolved_name); @@ -5113,6 +5117,34 @@ LibraryManager.library = { llvm_objectsize_i32: function() { return -1 }, // TODO: support this // ========================================================================== + // llvm-mono integration + // ========================================================================== + + llvm_mono_load_i8_p0i8: function(ptr) { + return {{{ makeGetValue('ptr', 0, 'i8') }}}; + }, + + llvm_mono_store_i8_p0i8: function(value, ptr) { + {{{ makeSetValue('ptr', 0, 'value', 'i8') }}}; + }, + + llvm_mono_load_i16_p0i16: function(ptr) { + return {{{ makeGetValue('ptr', 0, 'i16') }}}; + }, + + llvm_mono_store_i16_p0i16: function(value, ptr) { + {{{ makeSetValue('ptr', 0, 'value', 'i16') }}}; + }, + + llvm_mono_load_i32_p0i32: function(ptr) { + return {{{ makeGetValue('ptr', 0, 'i32') }}}; + }, + + llvm_mono_store_i32_p0i32: function(value, ptr) { + {{{ makeSetValue('ptr', 0, 'value', 'i32') }}}; + }, + + // ========================================================================== // math.h // ========================================================================== @@ -5907,7 +5939,7 @@ LibraryManager.library = { setjmp__inline: function(env) { // Save the label - return '(' + makeSetValue(env, '0', 'label', 'i32') + ', 0)'; + return '(setjmped = true, ' + makeSetValue(env, '0', 'label', 'i32') + ', 0)'; }, longjmp: function(env, value) { @@ -6910,6 +6942,18 @@ LibraryManager.library = { return eval(Pointer_stringify(ptr)); }, + emscripten_run_script_string: function(ptr) { + var s = eval(Pointer_stringify(ptr)); + var me = _emscripten_run_script_string; + if (!me.bufferSize || me.bufferSize < s.length+1) { + if (me.bufferSize) _free(me.buffer); + me.bufferSize = s.length+1; + me.buffer = _malloc(me.bufferSize); + } + writeStringToMemory(s, me.buffer); + return me.buffer; + }, + emscripten_random: function() { return Math.random(); }, diff --git a/src/modules.js b/src/modules.js index 06677936..9ef87691 100644 --- a/src/modules.js +++ b/src/modules.js @@ -301,11 +301,21 @@ function cDefine(key) { var PassManager = { serialize: function() { - print('\n//FORWARDED_DATA:' + JSON.stringify({ - Types: Types, - Variables: Variables, - Functions: Functions - })); + if (phase == 'pre') { + print('\n//FORWARDED_DATA:' + JSON.stringify({ + Types: Types, + Variables: Variables, + Functions: Functions + })); + } else if (phase == 'funcs') { + print('\n//FORWARDED_DATA:' + JSON.stringify({ + Types: { preciseI64MathUsed: Types.preciseI64MathUsed }, + Functions: { + blockAddresses: Functions.blockAddresses, + indexedFunctions: Functions.indexedFunctions + } + })); + } }, load: function(json) { var data = JSON.parse(json); |