aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-04-04 18:37:00 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-04-04 18:37:00 -0700
commitbae4c91d0acf4fd70e0c17ad178b07d2eb6345d9 (patch)
tree8a02a4334992a4589896307279edfae1c2eeab83
parent10f70b2a9bd7b0a1fdc3c140bf3c00ebad8420a9 (diff)
pre-apply {{{ FI_* }}} as well
-rwxr-xr-xemscripten.py2
-rw-r--r--src/jsifier.js12
-rw-r--r--src/parseTools.js6
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;