[pypy-svn] r18272 - in pypy/dist/pypy/translator/js: . test
ericvrp at codespeak.net
ericvrp at codespeak.net
Fri Oct 7 21:44:34 CEST 2005
Author: ericvrp
Date: Fri Oct 7 21:44:33 2005
New Revision: 18272
Modified:
pypy/dist/pypy/translator/js/codewriter.py
pypy/dist/pypy/translator/js/opwriter.py
pypy/dist/pypy/translator/js/test/runtest.py
Log:
* optimize phi nodes
* support javascript 'undefined' returntype
* various cleanup
Modified: pypy/dist/pypy/translator/js/codewriter.py
==============================================================================
--- pypy/dist/pypy/translator/js/codewriter.py (original)
+++ pypy/dist/pypy/translator/js/codewriter.py Fri Oct 7 21:44:33 2005
@@ -102,24 +102,40 @@
def phi(self, targetvar, type_, refs, blocknames):
assert refs and len(refs) == len(blocknames), "phi node requires blocks"
- mergelist = ", ".join(
- ["[%s, %s]" % item
- for item in zip(refs, blocknames)])
- s = "%s = phi %s %s" % (targetvar, type_, mergelist)
- self.llvm(s)
- self.append('switch (prevblock) {')
- for i, blockname in enumerate(blocknames):
- self.append('case %d: %s = %s; break' % (blockname, targetvar, refs[i]), 5)
- self.append('} // end of switch (prevblock)')
+ #mergelist = ", ".join(
+ # ["[%s, %s]" % item
+ # for item in zip(refs, blocknames)])
+ #s = "%s = phi %s %s" % (targetvar, type_, mergelist)
+ #self.llvm(s)
+ all_refs_identical = True
+ for ref in refs:
+ if ref != refs[0]:
+ all_refs_identical = False
+ break
+ if all_refs_identical:
+ if targetvar != refs[0]:
+ self.append('%s = %s' % (targetvar, refs[0]))
+ else:
+ if len(blocknames) == 1:
+ self.append('%s = %s' % (targetvar, refs[i]))
+ else:
+ n = 0
+ for i, blockname in enumerate(blocknames):
+ if targetvar != refs[i]:
+ if n > 0:
+ s = 'else '
+ else:
+ s = ''
+ self.append('%sif (prevblock == %d) %s = %s' % (s, blockname, targetvar, refs[i]))
+ n += 1
def binaryop(self, name, targetvar, type_, ref1, ref2):
- self.llvm("%s = %s %s %s, %s" % (targetvar, name, type_, ref1, ref2))
conv = { 'mul':'*', 'add':'+', 'sub':'-', 'div':'/' }
if name in conv:
c = conv[name]
self.append("%(targetvar)s = %(ref1)s %(c)s %(ref2)s" % locals())
else:
- self.append("TODO: binaryop")
+ self.llvm("%s = %s %s %s, %s" % (targetvar, name, type_, ref1, ref2))
def shiftop(self, name, targetvar, type_, ref1, ref2):
self.llvm("%s = %s %s %s, ubyte %s" % (targetvar, name, type_, ref1, ref2))
@@ -137,8 +153,6 @@
def cast(self, targetvar, fromtype, fromvar, targettype):
if fromtype == 'void' and targettype == 'void':
return
- self.llvm("%(targetvar)s = cast %(fromtype)s "
- "%(fromvar)s to %(targettype)s" % locals())
if targettype == fromtype:
self.append("%(targetvar)s = %(fromvar)s%(convfunc)s" % locals())
elif targettype in ('int','uint',):
@@ -148,7 +162,7 @@
elif targettype in ('bool',):
self.append("%(targetvar)s = %(fromvar)s == 0" % locals())
else:
- self.append("// TODO %(targetvar)s = %(fromvar)s...()" % locals())
+ self.llvm("%(targetvar)s = cast %(fromtype)s %(fromvar)s to %(targettype)s" % locals())
def malloc(self, targetvar, type_, size=1, atomic=False):
for s in self.js.gcpolicy.malloc(targetvar, type_, size, atomic, 'word', 'uword').split('\n'):
Modified: pypy/dist/pypy/translator/js/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/js/opwriter.py (original)
+++ pypy/dist/pypy/translator/js/opwriter.py Fri Oct 7 21:44:33 2005
@@ -131,7 +131,11 @@
last_val = res_val
targetvar = self.db.repr_arg(op.result)
self.codewriter.cast(targetvar, mult_type, res_val, mult_type)
-
+
+ def _skipped(self, op):
+ self.codewriter.comment('Skipping operation %s()' % op.opname)
+ keepalive = _skipped
+
def int_abs(self, op):
functionref = '%' + op.opname
ExternalFuncNode.used_external_functions[functionref] = True
@@ -442,7 +446,7 @@
("uint", index))
self.codewriter.load(targetvar, targettype, tmpvar)
else:
- self.codewriter.comment("***Skipping operation getfield()***")
+ self._skipped(op)
def getsubstruct(self, op):
struct, structtype = self.db.repr_argwithtype(op.args[0])
@@ -465,7 +469,7 @@
("uint", index))
self.codewriter.store(valuetype, valuevar, tmpvar)
else:
- self.codewriter.comment("***Skipping operation setfield()***")
+ self._skipped(op)
def getarrayitem(self, op):
array, arraytype = self.db.repr_argwithtype(op.args[0])
@@ -479,7 +483,7 @@
("uint", 1), (indextype, index))
self.codewriter.load(targetvar, targettype, tmpvar)
else:
- self.codewriter.comment("***Skipping operation getarrayitem()***")
+ self._skipped(op)
def getarraysubstruct(self, op):
array, arraytype = self.db.repr_argwithtype(op.args[0])
@@ -503,7 +507,7 @@
("uint", 1), (indextype, index))
self.codewriter.store(valuetype, valuevar, tmpvar)
else:
- self.codewriter.comment("***Skipping operation setarrayitem()***")
+ self._skipped(op)
def getarraysize(self, op):
array, arraytype = self.db.repr_argwithtype(op.args[0])
Modified: pypy/dist/pypy/translator/js/test/runtest.py
==============================================================================
--- pypy/dist/pypy/translator/js/test/runtest.py (original)
+++ pypy/dist/pypy/translator/js/test/runtest.py Fri Oct 7 21:44:33 2005
@@ -30,13 +30,15 @@
def __call__(self, *kwds):
args = ', '.join([str(kw).lower() for kw in kwds]) #lowerstr for (py)False->(js)false, etc.
wrappercode = self.js.wrappertemplate % args
- cmd = 'echo "%s" | js' % wrappercode
+ cmd = 'echo "%s" | js 2>&1' % wrappercode
log(cmd)
s = os.popen(cmd).read().strip()
if s == 'false':
res = False
elif s == 'true':
res = True
+ elif s == 'undefined':
+ res = None
else:
res = eval(s)
return res
More information about the Pypy-commit
mailing list