aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-07-04 12:17:06 -0700
committerAlon Zakai <alonzakai@gmail.com>2011-07-04 12:17:06 -0700
commit1aeee076cf70038b44ca84f9565bfb16d1401d87 (patch)
tree42e8b8ee92c6f54a32dae4ef3df4becdb84e6c66
parenta4262aa2c9028145516c1a23cbdc6b7b8a42b353 (diff)
ensure binding functions are not DFE'd away
-rw-r--r--tests/runner.py11
-rw-r--r--tools/bindings_generator.py31
2 files changed, 38 insertions, 4 deletions
diff --git a/tests/runner.py b/tests/runner.py
index 318187f2..beef1823 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -1646,7 +1646,6 @@ if 'benchmark' not in sys.argv:
expected = open(path_from_root('tests', 'time', 'output.txt'), 'r').read()
self.do_test(src, expected)
-
def test_statics(self):
# static initializers save i16 but load i8 for some reason
global COMPILER_TEST_OPTS; COMPILER_TEST_OPTS = ['-g']
@@ -2612,7 +2611,15 @@ if 'benchmark' not in sys.argv:
basename = os.path.join(self.get_dir(), 'bindingtest')
Popen(['python', BINDINGS_GENERATOR, basename, header_filename], stdout=PIPE, stderr=STDOUT).communicate()[0]
- src = src + '\n#include "bindingtest.c"\n'
+ src = '''
+ #include "header.h"
+
+ ScriptMe::ScriptMe(int val) : value(val) { }
+ int ScriptMe::getVal() { return value; }
+ void ScriptMe::mulVal(int mul) { value *= mul; }
+
+ #include "bindingtest.c"
+ '''
script_src_2 = '''
var sme = new ScriptMe(83);
diff --git a/tools/bindings_generator.py b/tools/bindings_generator.py
index 99d5e889..81d1a0fe 100644
--- a/tools/bindings_generator.py
+++ b/tools/bindings_generator.py
@@ -51,6 +51,8 @@ for header in sys.argv[2:]:
# Second pass - generate bindings
+funcs = []
+
gen_c = open(basename + '.c', 'w')
gen_js = open(basename + '.js', 'w')
@@ -83,6 +85,8 @@ for cname, clazz in classes.iteritems():
}
''' % (ret, fullname, typedargs, callprefix, mname, justargs))
+ funcs.append('emscripten_bind_' + fullname)
+
# JS
if constructor:
@@ -99,10 +103,33 @@ function %s(%s) {
}
''' % (cname, mname, justargs, 'return ' if ret != 'void' else '', fullname, (', ' if len(justargs) > 0 else '') + justargs))
+
# Finish up
-gen_c.write('\n}\n')
-gen_c.close()
+gen_c.write('''
+}
+
+#include <stdio.h>
+struct EmscriptenEnsurer
+{
+ EmscriptenEnsurer() {
+ // Actually use the binding functions, so DFE will not eliminate them
+ int sum = 0;
+ void *seen = (void*)%s;
+''' % funcs[0])
+
+for func in funcs[1:]:
+ gen_c.write(''' sum += (void*)%s == seen;
+''' % func)
+
+gen_c.write(''' printf("(%d)\\n", sum);
+ }
+};
+
+EmscriptenEnsurer emscriptenEnsurer;
+''')
+
+gen_c.close()
gen_js.close()