summaryrefslogtreecommitdiff
path: root/scripts/spidermonkify.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/spidermonkify.py')
-rw-r--r--scripts/spidermonkify.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/scripts/spidermonkify.py b/scripts/spidermonkify.py
new file mode 100644
index 000000000..6ac04e006
--- /dev/null
+++ b/scripts/spidermonkify.py
@@ -0,0 +1,56 @@
+'''
+A bunch of hackish fixups for testing of SpiderMonkey support. We should
+get rid of these ASAP.
+'''
+
+import os, sys, math, shutil, subprocess
+
+import emscripten
+
+binaryen_root = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
+
+js_target = sys.argv[1]
+wast_target = sys.argv[2]
+
+wasm_target = wast_target[:-5] + '.wasm'
+
+base_wast_target = os.path.basename(wast_target)
+base_wasm_target = os.path.basename(wasm_target)
+
+def fix(js, before, after):
+ assert js.count(before) == 1
+ return js.replace(before, after)
+
+# fix up js
+js = open(js_target).read()
+# send a buffer into wasm methods, not a typed array
+js = fix(js, 'instance = Wasm.instantiateModule(binary, info)', 'instance = Wasm.instantiateModule(binary.buffer, info)')
+# use the wasm, not wast
+js = js.replace('"' + base_wast_target + '"', '"' + base_wasm_target + '"')
+js = js.replace("'" + base_wast_target + "'", "'" + base_wasm_target + "'")
+open(js_target, 'w').write(js)
+
+# lower cases, spidermonkey has no support for them
+temp = wast_target + '.temp'
+subprocess.check_call([os.path.join(binaryen_root, 'bin', 'binaryen-shell'), wast_target, '--lower-case', '--print'], stdout=open(temp, 'w'))
+shutil.copyfile(temp, wast_target)
+
+# fix up wast
+wast = open(wast_target).read()
+# tableswitch => br_table
+wast = wast.replace('(tableswitch', '(br_table')
+# memory to page sizes
+PAGE_SIZE = 64 * 1024
+memory_start = wast.find('(memory') + 1
+memory_end = wast.find(')', memory_start)
+memory = wast[memory_start:memory_end]
+parts = memory.split(' ')
+parts[1] = str(int(math.ceil(float(parts[1]) / PAGE_SIZE)))
+if len(parts) == 3:
+ parts[2] = str(int(math.ceil(float(parts[2]) / PAGE_SIZE)))
+wast = wast[:memory_start] + ' '.join(parts) + wast[memory_end:]
+open(wast_target, 'w').write(wast)
+
+# convert to binary using spidermonkey
+subprocess.check_call(emscripten.shared.SPIDERMONKEY_ENGINE + ['-e', 'os.file.writeTypedArrayToFile("%s", new Uint8Array(wasmTextToBinary(os.file.readFile("%s"))))' % (wasm_target, wast_target)])
+