aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xemscripten.py21
-rw-r--r--patches/sauer443
-rw-r--r--tests/runner.py28
-rw-r--r--tests/settings.py1
4 files changed, 30 insertions, 463 deletions
diff --git a/emscripten.py b/emscripten.py
new file mode 100755
index 00000000..3bbbb8c9
--- /dev/null
+++ b/emscripten.py
@@ -0,0 +1,21 @@
+#!/usr/bin/python
+
+import os, sys, subprocess
+
+COMPILER = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'src', 'parser.js')
+
+def emscripten(filename, output_filename, js_engine):
+ cwd = os.getcwd()
+ os.chdir(os.path.dirname(COMPILER))
+ if output_filename is not None:
+ subprocess.Popen([js_engine] + [COMPILER], stdin=open(filename, 'r'), stdout=open(output_filename, 'w'), stderr=subprocess.STDOUT).communicate()[0]
+ else:
+ subprocess.Popen([js_engine] + [COMPILER], stdin=open(filename, 'r')).communicate()[0]
+ os.chdir(cwd)
+
+if __name__ == '__main__':
+ if sys.argv.__len__() != 3:
+ print '''\nEmscripten usage: emscripten.py INFILE PATH-TO-JS-ENGINE\n'''
+ else:
+ emscripten(sys.argv[1], None, sys.argv[2])
+
diff --git a/patches/sauer b/patches/sauer
deleted file mode 100644
index ce846e85..00000000
--- a/patches/sauer
+++ /dev/null
@@ -1,443 +0,0 @@
-diff --git a/patches/README b/patches/README
---- a/patches/README
-+++ b/patches/README
-@@ -4,7 +4,7 @@
-
- ln -s patches .hg/patches
-
--After doing so, |hg qpush| sauer, and then running |python tests/runner.py| will run only sauer, using v8, and without optimizations or relooping.
-+After doing so, |hg qpush| sauer, and then running |python tests/runner.py| will run only sauer, using v8, and without relooping.
-
- Note to patch queue maintainer: You need to manually copy from .hg/patches into this directory, after |qrefresh|ing the patch.
-
-diff --git a/src/settings.js b/src/settings.js
---- a/src/settings.js
-+++ b/src/settings.js
-@@ -1,5 +1,5 @@
- OPTIMIZE = 1;
--RELOOP = 1;
--SAFE_HEAP = 0;
-+RELOOP = 0;
-+SAFE_HEAP = 1;
- LABEL_DEBUG = 0;
-
-diff --git a/tests/runner.py b/tests/runner.py
---- a/tests/runner.py
-+++ b/tests/runner.py
-@@ -85,6 +85,7 @@
- if output is not None and 'Traceback' in output: print output; assert (0) # 'generating JavaScript failed'
- if DEBUG: print "\nGenerated JavaScript:\n\n===\n\n%s\n\n===\n\n" % output
- # if not DEBUG:
-+ raise Exception("Moshe");
- js_output = timeout_run(Popen([JS_ENGINE] + JS_ENGINE_OPTS + [filename + '.o.js'] + args, stdout=PIPE, stderr=STDOUT), 20, 'Execution')
- if output_nicerizer is not None:
- js_output = output_nicerizer(js_output)
-@@ -148,7 +149,7 @@
- print "Expected to NOT find '%s' in '%s'" % (value, string)
- self.assertTrue(value not in string)
-
-- def test_hello_world(self):
-+ def zzztest_hello_world(self):
- src = '''
- #include <stdio.h>
- int main()
-@@ -159,7 +160,7 @@
- '''
- self.do_test(src, 'hello, world!')
-
-- def test_intvars(self):
-+ def zzztest_intvars(self):
- src = '''
- #include <stdio.h>
- int global = 20;
-@@ -188,7 +189,7 @@
- '''
- self.do_test(src, '*5,23,10,19,121,1,37,1,0*')
-
-- def test_floatvars(self):
-+ def zzztest_floatvars(self):
- src = '''
- #include <stdio.h>
- int main()
-@@ -202,7 +203,7 @@
- '''
- self.do_test(src, '*1,10,10.5,1,1.2339')
-
-- def test_if(self):
-+ def zzztest_if(self):
- src = '''
- #include <stdio.h>
- int main()
-@@ -216,7 +217,7 @@
- '''
- self.do_test(src, '*yes*')
-
-- def test_loop(self):
-+ def zzztest_loop(self):
- src = '''
- #include <stdio.h>
- int main()
-@@ -230,7 +231,7 @@
- '''
- self.do_test(src, '*3600*')
-
-- def test_strings(self):
-+ def zzztest_strings(self):
- src = '''
- #include <stdio.h>
- #include <stdlib.h>
-@@ -245,7 +246,7 @@
- '''
- self.do_test(src, '*4*wowie*too*76*', ['wowie', 'too', '74'], lambda x: x.replace('\n', '*'))
-
-- def test_funcs(self):
-+ def zzztest_funcs(self):
- src = '''
- #include <stdio.h>
- int funcy(int x)
-@@ -260,7 +261,7 @@
- '''
- self.do_test(src, '*72,90*')
-
-- def test_structs(self):
-+ def zzztest_structs(self):
- src = '''
- #include <stdio.h>
- struct S
-@@ -304,13 +305,13 @@
- }
- '''
-
-- def test_mallocstruct(self):
-+ def zzztest_mallocstruct(self):
- self.do_test(self.gen_struct_src.replace('{{gen_struct}}', '(S*)malloc(ES_SIZEOF(S))').replace('{{del_struct}}', 'free'), '*51,62*')
-
-- def test_newstruct(self):
-+ def zzztest_newstruct(self):
- self.do_test(self.gen_struct_src.replace('{{gen_struct}}', 'new S').replace('{{del_struct}}', 'delete'), '*51,62*')
-
-- def test_addr_of_stacked(self):
-+ def zzztest_addr_of_stacked(self):
- src = '''
- #include <stdio.h>
- void alter(int *y)
-@@ -327,7 +328,7 @@
- '''
- self.do_test(src, '*7*')
-
-- def test_linked_list(self):
-+ def zzztest_linked_list(self):
- src = '''
- #include <stdio.h>
- struct worker_args {
-@@ -372,7 +373,7 @@
- '''
- self.do_test(src, '*1410,0*')
-
-- def test_assert(self):
-+ def zzztest_assert(self):
- src = '''
- #include <stdio.h>
- #include <assert.h>
-@@ -384,7 +385,7 @@
- '''
- self.do_test(src, 'Assertion failed: 1 == false')
-
-- def test_class(self):
-+ def zzztest_class(self):
- src = '''
- #include <stdio.h>
- struct Random {
-@@ -413,7 +414,7 @@
- '''
- self.do_test(src, '*0*')
-
-- def test_inherit(self):
-+ def zzztest_inherit(self):
- src = '''
- #include <stdio.h>
- struct Parent {
-@@ -441,7 +442,7 @@
- '''
- self.do_test(src, '*51,87,78,550,100,78,550*')
-
-- def test_polymorph(self):
-+ def zzztest_polymorph(self):
- src = '''
- #include <stdio.h>
- struct Parent {
-@@ -460,7 +461,7 @@
- '''
- self.do_test(src, '*11,74*')
-
-- def test_emptyclass(self):
-+ def zzztest_emptyclass(self):
- src = '''
- #include <stdio.h>
-
-@@ -501,7 +502,7 @@
- '''
- self.do_test(src, '*97,15,3*')
-
-- def test_conststructs(self):
-+ def zzztest_conststructs(self):
- src = '''
- #include <stdio.h>
- struct IUB {
-@@ -524,7 +525,7 @@
- '''
- self.do_test(src, '*97,15,3,3029*')
-
-- def test_ptrtoint(self):
-+ def zzztest_ptrtoint(self):
- src = '''
- #include <stdio.h>
-
-@@ -546,7 +547,7 @@
- runner.assertEquals(filter(lambda line: 'Warning' in line, output.split('\n')).__len__(), 4)
- self.do_test(src, '*5*', output_processor=check_warnings)
-
-- def test_sizeof(self):
-+ def zzztest_sizeof(self):
- src = '''
- #include <stdio.h>
- #include <string.h>
-@@ -582,7 +583,7 @@
- '''
- self.do_test(src, '*2,2,5,8,8*\n*8,8,5,8,8*\n*7,2,6,990,7,2*')
-
-- def test_llvmswitch(self):
-+ def zzztest_llvmswitch(self):
- src = '''
- #include <stdio.h>
- #include <string.h>
-@@ -607,7 +608,7 @@
- '''
- self.do_test(src, '*96,97,98,101,101*')
-
-- def test_varargs(self):
-+ def zzztest_varargs(self):
- src = '''
- #include <stdio.h>
- #include "stdarg.h"
-@@ -629,7 +630,7 @@
- '''
- self.do_test(src, '*cheez: 10+24*')
-
-- def test_atexit(self):
-+ def zzztest_atexit(self):
- src = '''
- #include <stdio.h>
- #include <stdlib.h>
-@@ -646,13 +647,13 @@
- '''
- self.do_test(src, '*cleaned*')
-
-- def test_fannkuch(self):
-+ def zzztest_fannkuch(self):
- results = [ (1,0), (2,1), (3,2), (4,4), (5,7), (6,10), (7, 16), (8,22) ]
- for i, j in results:
- src = open(path_from_root(['tests', 'fannkuch.cpp']), 'r').read()
- self.do_test(src, 'Pfannkuchen(%d) = %d.' % (i,j), [str(i)], no_build=i>1)
-
-- def test_fasta(self):
-+ def zzztest_fasta(self):
- results = [ (1,'''GG*ctt**tgagc**'''), (20,'''GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT*cttBtatcatatgctaKggNcataaaSatgtaaaDcDRtBggDtctttataattcBgtcg**tacgtgtagcctagtgtttgtgttgcgttatagtctatttgtggacacagtatggtcaaa**tgacgtcttttgatctgacggcgttaacaaagatactctg**'''),
- (50,'''GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA*TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT*cttBtatcatatgctaKggNcataaaSatgtaaaDcDRtBggDtctttataattcBgtcg**tactDtDagcctatttSVHtHttKtgtHMaSattgWaHKHttttagacatWatgtRgaaa**NtactMcSMtYtcMgRtacttctWBacgaa**agatactctgggcaacacacatacttctctcatgttgtttcttcggacctttcataacct**ttcctggcacatggttagctgcacatcacaggattgtaagggtctagtggttcagtgagc**ggaatatcattcgtcggtggtgttaatctatctcggtgtagcttataaatgcatccgtaa**gaatattatgtttatttgtcggtacgttcatggtagtggtgtcgccgatttagacgtaaa**ggcatgtatg**''') ]
- for i, j in results:
-@@ -661,7 +662,7 @@
-
- # XXX Warning: Running this in SpiderMonkey can lead to an extreme amount of memory being
- # used, see Mozilla bug 593659.
-- def zzztest_sauer(self):
-+ def test_sauer(self):
- self.do_test(path_from_root(['tests', 'sauer']), 'Hello sauer world!', main_file='command.cpp')
-
- if __name__ == '__main__':
-diff --git a/tests/sauer/command.cpp b/tests/sauer/command.cpp
---- a/tests/sauer/command.cpp
-+++ b/tests/sauer/command.cpp
-@@ -1,6 +1,8 @@
- // command.cpp: implements the parsing and execution of a tiny script language which
- // is largely backwards compatible with the quake console language.
-
-+// XXX Emscripten: changed all sizeof to ES_SIZEOF
-+
- // XXX Emscripten
- #define STANDALONE
-
-@@ -1312,7 +1314,7 @@
- void conoutfv(int type, const char *fmt, va_list args)
- {
- static char buf[CONSTRLEN];
-- vformatstring(buf, fmt, args, sizeof(buf));
-+ vformatstring(buf, fmt, args, ES_SIZEOF(char)*CONSTRLEN); // XXX Emscripten?
- conline(type, buf);
- //filtertext(buf, buf); // XXX Emscripten
- puts(buf);
-@@ -1404,6 +1406,11 @@
- {
- execute("echo Hello from sauer");
-
-+ ident moshe, david;
-+ printf("cheezme1 %d,%d\n", int(&moshe), int(&(moshe.type)));
-+ moshe = david;
-+ printf("cheezme2\n");
-+
- return 0;
- }
-
-diff --git a/tests/sauer/command.h b/tests/sauer/command.h
---- a/tests/sauer/command.h
-+++ b/tests/sauer/command.h
-@@ -84,7 +84,7 @@
-
- virtual ~ident() {}
-
-- ident &operator=(const ident &o) { memcpy(this, &o, sizeof(ident)); return *this; } // force vtable copy, ugh
-+ ident &operator=(const ident &o) { memcpy(this, &o, ES_SIZEOF(ident)); return *this; } // force vtable copy, ugh
-
- virtual void changed() { if(fun) fun(); }
- };
-diff --git a/tests/sauer/tools.h b/tests/sauer/tools.h
---- a/tests/sauer/tools.h
-+++ b/tests/sauer/tools.h
-@@ -3,6 +3,8 @@
- #ifndef _TOOLS_H
- #define _TOOLS_H
-
-+#include "emscripten.h" // XXX Emscripten
-+
- #ifdef NULL
- #undef NULL
- #endif
-@@ -173,7 +175,7 @@
- void put(const T *vals, int numvals)
- {
- if(maxlen-len<numvals) flags |= OVERWROTE;
-- memcpy(&buf[len], vals, min(maxlen-len, numvals)*sizeof(T));
-+ memcpy(&buf[len], vals, min(maxlen-len, numvals)*ES_SIZEOF(T));
- len += min(maxlen-len, numvals);
- }
-
-@@ -181,7 +183,7 @@
- {
- int read = min(maxlen-len, numvals);
- if(read<numvals) flags |= OVERREAD;
-- memcpy(vals, &buf[len], read*sizeof(T));
-+ memcpy(vals, &buf[len], read*ES_SIZEOF(T));
- len += read;
- return read;
- }
-@@ -207,7 +209,7 @@
- template<class T, class U>
- static inline void quicksort(T *buf, int n, int (__cdecl *func)(U *, U *))
- {
-- qsort(buf, n, sizeof(T), (int (__cdecl *)(const void *,const void *))func);
-+ qsort(buf, n, ES_SIZEOF(T), (int (__cdecl *)(const void *,const void *))func);
- }
-
- template <class T> struct vector
-@@ -268,7 +270,7 @@
- else
- {
- growbuf(ulen+v.ulen);
-- if(v.ulen) memcpy(&buf[ulen], v.buf, v.ulen*sizeof(T));
-+ if(v.ulen) memcpy(&buf[ulen], v.buf, v.ulen*ES_SIZEOF(T));
- ulen += v.ulen;
- v.ulen = 0;
- }
-@@ -309,10 +311,10 @@
- if(!alen) alen = max(MINSIZE, sz);
- else while(alen < sz) alen *= 2;
- if(alen <= olen) return;
-- uchar *newbuf = new uchar[alen*sizeof(T)];
-+ uchar *newbuf = new uchar[alen*ES_SIZEOF(T)];
- if(olen > 0)
- {
-- memcpy(newbuf, buf, olen*sizeof(T));
-+ memcpy(newbuf, buf, olen*ES_SIZEOF(T));
- delete[] (uchar *)buf;
- }
- buf = (T *)newbuf;
-@@ -515,6 +517,7 @@
- numelems = 0;
- chunks = NULL;
- unused = NULL;
-+ printf("unused is at %d : %d\n", int(&unused), int(unused));
- chains = new chain *[size];
- loopi(size) chains[i] = NULL;
- }
-@@ -527,6 +530,7 @@
-
- chain *insert(uint h)
- {
-+ printf("Insert. Unused: %d, addr of next is offset to: %d\n", int(unused), int(&(unused->next)));
- if(!unused)
- {
- chainchunk *chunk = new chainchunk;
-@@ -535,9 +539,13 @@
- loopi(CHUNKSIZE-1) chunk->chains[i].next = &chunk->chains[i+1];
- chunk->chains[CHUNKSIZE-1].next = unused;
- unused = chunk->chains;
-+ loopi(CHUNKSIZE) printf("chunk %d is at %d, and points to %d\n", i, int(&(chunk->chains[i])), int(chunk->chains[i].next));
-+ printf("PRE YO unused is NOW at %d : %d, %d, %d\n", int(&unused), int(unused), int(unused->next), int(unused->next->next));
- }
- chain *c = unused;
-+ //printf("unused PRE: %d : %d, %d, %d\n", int(&unused), int(unused), int(unused->next), int(unused->next->next));
- unused = unused->next;
-+ //printf("unused POST: %d : %d, %d, %d\n", int(&unused), int(unused), int(unused->next), int(unused->next->next));
- c->next = chains[h];
- chains[h] = c;
- numelems++;
-@@ -545,11 +553,11 @@
- }
-
- #define HTFIND(key, success, fail) \
-- uint h = hthash(key)&(this->size-1); \
-+ printf("HTFIND a\n"); uint h = hthash(key)&(this->size-1); \
- for(chain *c = this->chains[h]; c; c = c->next) \
-- { \
-+ { printf("HTFIND b\n"); \
- if(htcmp(key, c->elem)) return (success); \
-- } \
-+ } printf("HTFIND c\n"); \
- return (fail);
-
- template<class K>
-@@ -644,7 +652,9 @@
-
- entry &insert(const K &key, uint h)
- {
-+ printf("hashTABLE insert\n");
- chain *c = hashset<entry>::insert(h);
-+ printf("hashTABLE insert moving on\n");
- c->elem.key = key;
- return c->elem;
- }
-@@ -863,11 +873,11 @@
- virtual int printf(const char *fmt, ...) { return -1; }
- virtual uint getcrc() { return 0; }
-
-- template<class T> bool put(T n) { return write(&n, sizeof(n)) == sizeof(n); }
-+ template<class T> bool put(T n) { return write(&n, ES_SIZEOV(n)) == ES_SIZEOV(n); }
- template<class T> bool putlil(T n) { return put<T>(lilswap(n)); }
- template<class T> bool putbig(T n) { return put<T>(bigswap(n)); }
-
-- template<class T> T get() { T n; return read(&n, sizeof(n)) == sizeof(n) ? n : 0; }
-+ template<class T> T get() { T n; return read(&n, ES_SIZEOV(n)) == ES_SIZEOV(n) ? n : 0; }
- template<class T> T getlil() { return lilswap(get<T>()); }
- template<class T> T getbig() { return bigswap(get<T>()); }
- };
-diff --git a/tests/settings.py b/tests/settings.py
---- a/tests/settings.py
-+++ b/tests/settings.py
-@@ -9,7 +9,7 @@
- JS_ENGINE_OPTS=[]#['-j']
- PARSER_ENGINE=SPIDERMONKEY_SHELL
- PARSER_OPTS=[]#['-j']
--#PARSER_ENGINE=V8_ENGINE
-+PARSER_ENGINE=V8_ENGINE
- #PARSER_OPTS = []
- #JS_ENGINE=V8_ENGINE
- JS_COMPILER=path_from_root(['src', 'parser.js'])
diff --git a/tests/runner.py b/tests/runner.py
index 1c063a61..6eb3df1f 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -5,7 +5,7 @@ See settings.py file for options&params. Edit as needed.
'''
from subprocess import Popen, PIPE, STDOUT
-import os, unittest, tempfile, shutil, time
+import os, unittest, tempfile, shutil, time, sys
# Params
@@ -13,6 +13,10 @@ abspath = os.path.abspath(os.path.dirname(__file__))
def path_from_root(pathelems):
return os.path.join(os.path.sep, *(abspath.split(os.sep)[:-1] + pathelems))
+sys.path += [path_from_root([])]
+
+from emscripten import emscripten
+
exec(open(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'settings.py'), 'r').read())
def timeout_run(proc, timeout, note):
@@ -60,25 +64,11 @@ class T(unittest.TestCase):
print "Failed to compile C/C++ source:\n\n", output
raise Exception("Compilation error");
if DEBUG: print output
- if DEBUG: print "[[LLVM => JS]]"
- if False:
- # Use an llc backend, written in C++, to generate JS
- output = Popen([LLC, '-march='+LLVM_BACKEND, filename + '.o', '-o=' + filename + '.o.cpp'], stdout=PIPE, stderr=STDOUT).communicate()[0]
- elif False:
- # Use python parser to generate JS from disassembled llvm
- output = Popen([LLVM_DIS, filename + '.o', '-o=' + filename + '.o.llvm'], stdout=PIPE, stderr=STDOUT).communicate()[0]
- if DEBUG: print output
- output = Popen(['python', PY_PARSER, filename + '.o.llvm'], stdout=open(filename + '.o.js', 'w'), stderr=STDOUT).communicate()[0]
- else:
- # JS parser/compiler
- output = Popen([LLVM_DIS, filename + '.o', '-o=' + filename + '.o.llvm'], stdout=PIPE, stderr=STDOUT).communicate()[0]
- if DEBUG: print output
- cwd = os.getcwd()
- os.chdir(path_from_root(['src']))
- output = timeout_run(Popen([PARSER_ENGINE] + PARSER_OPTS + [JS_COMPILER], stdin=open(filename + '.o.llvm', 'r'), stdout=open(filename + '.o.js', 'w'), stderr=STDOUT), 200, 'Parser')
- os.chdir(cwd)
- # return
+ if DEBUG: print "[[C++ ==> LLVM]]"
+ output = Popen([LLVM_DIS, filename + '.o', '-o=' + filename + '.o.llvm'], stdout=PIPE, stderr=STDOUT).communicate()[0]
if DEBUG: print output
+ # Run Emscripten
+ emscripten(filename + '.o.llvm', filename + '.o.js', JS_ENGINE)
output = open(filename + '.o.js').read()
if output_processor is not None:
output_processor(output)
diff --git a/tests/settings.py b/tests/settings.py
index 34f90c87..1ed85ed4 100644
--- a/tests/settings.py
+++ b/tests/settings.py
@@ -12,5 +12,4 @@ PARSER_OPTS=[]#['-j']
#PARSER_ENGINE=V8_ENGINE
#PARSER_OPTS = []
#JS_ENGINE=V8_ENGINE
-JS_COMPILER=path_from_root(['src', 'parser.js'])