diff options
-rwxr-xr-x | emscripten.py | 2 | ||||
-rw-r--r-- | src/jsifier.js | 12 | ||||
-rw-r--r-- | src/parseTools.js | 6 |
3 files changed, 13 insertions, 7 deletions
diff --git a/emscripten.py b/emscripten.py index a42fe116..8f68ee77 100755 --- a/emscripten.py +++ b/emscripten.py @@ -312,7 +312,7 @@ def emscript(infile, settings, outfile, libraries=[], compiler_engine=None, def split_32(x): x = int(x) return '%d,%d,%d,%d' % (x&255, (x >> 8)&255, (x >> 16)&255, (x >> 24)&255) - ret = re.sub(r"\"'{{ FI_([\w\d_$]+) }}'\",0,0,0", lambda m: split_32(indexing.get(m.groups(0)[0]) or 0), js) + ret = re.sub(r"\"?'?{{ FI_([\w\d_$]+) }}'?\"?,0,0,0", lambda m: split_32(indexing.get(m.groups(0)[0]) or 0), js) return re.sub(r"'{{ FI_([\w\d_$]+) }}'", lambda m: str(indexing.get(m.groups(0)[0]) or 0), ret) blockaddrs = forwarded_json['Functions']['blockAddresses'] diff --git a/src/jsifier.js b/src/jsifier.js index ac3d1955..ce089334 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -1505,12 +1505,18 @@ function JSify(data, functionsOnly, givenFunctions) { if (memoryInitialization.length > 0) { // apply postsets directly into the big memory initialization itemsDict.GlobalVariablePostSet = itemsDict.GlobalVariablePostSet.filter(function(item) { - var m - if (m = /^HEAP([\dFU]+)\[([()>\d]+)\] *= *([()|\d]+);?$/.exec(item.JS)) { + var m; + if (m = /^HEAP([\dFU]+)\[([()>\d]+)\] *= *([()|\d{}\w_' ]+);?$/.exec(item.JS)) { var type = getTypeFromHeap(m[1]); var bytes = Runtime.getNativeTypeSize(type); var target = eval(m[2]) << log2(bytes); - var value = eval(m[3]); + var value = m[3]; + try { + value = eval(value); + } catch(e) { + // possibly function table {{{ FT_* }}} etc. + if (value.indexOf('{{ ') < 0) return true; + } writeInt8s(memoryInitialization, target - TOTAL_STACK, value, type); return false; } diff --git a/src/parseTools.js b/src/parseTools.js index 639c583b..20049094 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -1470,12 +1470,12 @@ function writeInt8s(slab, i, value, type) { case 'i1': case 'i8': temp8[0] = value; currSize = 1; break; case 'i16': temp16[0] = value; currSize = 2; break; - case 'i64': // fall through, i64 is two i32 chunks - case 'i32': temp32[0] = value; currSize = 4; break; case 'float': temp32f[0] = value; currSize = 4; break; case 'double': temp64f[0] = value; currSize = 8; break; + case 'i64': // fall through, i64 is two i32 chunks + case 'i32': // fall through, i32 can be a pointer default: { - if (type[type.length-1] == '*') { + if (type == 'i32' || type == 'i64' || type[type.length-1] == '*') { if (!isNumber(value)) { // function table stuff, etc. slab[i] = value; slab[i+1] = slab[i+2] = slab[i+3] = 0; |