This commit is contained in:
alon@honor 2010-09-09 20:03:24 -07:00
Родитель dd766e9a45
Коммит a523ad539c
4 изменённых файлов: 30 добавлений и 463 удалений

21
emscripten.py Executable file
Просмотреть файл

@ -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])

Просмотреть файл

@ -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'])

Просмотреть файл

@ -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)

Просмотреть файл

@ -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'])