[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