[pypy-svn] r19788 - in pypy/dist/pypy/translator/js: . test

ericvrp at codespeak.net ericvrp at codespeak.net
Fri Nov 11 22:22:24 CET 2005


Author: ericvrp
Date: Fri Nov 11 22:22:21 2005
New Revision: 19788

Added:
   pypy/dist/pypy/translator/js/test/test_stackless.py
      - copied, changed from r19222, pypy/dist/pypy/translator/c/test/test_stackless.py
Modified:
   pypy/dist/pypy/translator/js/codewriter.py
   pypy/dist/pypy/translator/js/conftest.py
   pypy/dist/pypy/translator/js/js.py
Log:
Initial checkin for stackless feature in PyPy-Javascript.


Modified: pypy/dist/pypy/translator/js/codewriter.py
==============================================================================
--- pypy/dist/pypy/translator/js/codewriter.py	(original)
+++ pypy/dist/pypy/translator/js/codewriter.py	Fri Nov 11 22:22:21 2005
@@ -48,11 +48,11 @@
     def newline(self):
         self.append("")
 
-    def openblock(self, name):
+    def openblock(self, blocknum):
         self.indent_more()
-        self.append("case %d:" % name)
+        self.append("case %d:" % blocknum)
         self.indent_more()
-        self._currentblock = name
+        self._currentblocknum = blocknum
 
     def closeblock(self):
         if not self._skip_closeblock:
@@ -64,11 +64,11 @@
     def declare(self, decl):
         self.append(decl)
 
-    def _goto_block(self, block):
-        if block == self._currentblock + 1:
+    def _goto_block(self, blocknum):
+        if blocknum == self._currentblocknum + 1:
             self._skip_closeblock = True
         else:
-            self.append('block = ' + str(block))
+            self.append('block = ' + str(blocknum))
             self.append('break')
 
     def _phi(self, exit):
@@ -86,21 +86,21 @@
                     src = 'e'   #i.e. the caught exception
                 self.append('%s = %s' % (dest, src))
 
-    def br_uncond(self, block, exit): 
+    def br_uncond(self, blocknum, exit): 
         self._phi(exit)
-        self._goto_block(block)
+        self._goto_block(blocknum)
         self.skip_closeblock()
 
-    def br(self, cond, block_false, exit_false, block_true, exit_true):
+    def br(self, cond, blocknum_false, exit_false, blocknum_true, exit_true):
         self.append('if (%s) {' % cond)
         self.indent_more()
         self._phi(exit_true)
-        self._goto_block(block_true)
+        self._goto_block(blocknum_true)
         self.indent_less()
         self.append('} else {')
         self.indent_more()
         self._phi(exit_false)
-        self._goto_block(block_false)
+        self._goto_block(blocknum_false)
         self.indent_less()
         self.append('}')
         self.skip_closeblock()
@@ -109,29 +109,59 @@
         self.decl     = decl
         self.funcnode = funcnode
         self.blocks   = blocks
-        usedvars      = {}  #XXX could probably be limited to inputvars
+        self._save_blocknum   = len(blocks)+1000
+        self._resume_blocknum = len(blocks)+1001
+        self._usedvars = {}
+        paramstr = decl.split('(')[1][:-1]
+        for param in paramstr.split(','):
+            param = param.strip()
+            if param:
+                self._usedvars[param] = True
         for block in blocks:
             if block != blocks[0]:  #don't double startblock inputargs
                 for inputarg in block.inputargs:
                     targetvar = self.js.db.repr_arg(inputarg)
-                    usedvars[targetvar] = True
+                    self._usedvars[targetvar] = True
             for op in block.operations:
                 targetvar = self.js.db.repr_arg(op.result)
-                usedvars[targetvar] = True
+                self._usedvars[targetvar] = True
+
         self.append("function %s {" % self.decl)
         self.indent_more()
-        if usedvars:
-            self.append("var %s" % ', '.join(usedvars.keys()))
-        self.append("for (var block = 0;;) {")
+        if self._usedvars:
+            self.append("var %s" % ', '.join(self._usedvars.keys()))
+            
+        if self.js.stackless:
+            initial_block = "slp_frame_stack_top ? %d : 0" % self._resume_blocknum
+        else:
+            initial_block = '0'
+
+        self.append("for (block = %s;;) {" % initial_block)
         self.indent_more()
         self.append("switch (block) {")
 
     def closefunc(self): 
-        self.append("}")
+        if self.js.stackless:   #save&restore all local variable for now
+            self.openblock(self._save_blocknum)
+            self.comment('save block for stackless feature')
+            self.append('slp_frame_stack_top = new Array(slp_resume_block, %s)' % ', '.join(self._usedvars.keys()))
+            self.append('return undefined')
+            self.skip_closeblock()
+            self.closeblock()
+
+            self.openblock(self._resume_blocknum)
+            self.comment('resume block for stackless feature')
+            self.append('block = slp_frame_stack_top[0]')
+            for i, k in enumerate(self._usedvars.keys()):
+                self.append('%s = slp_frame_stack_top[%d]' % (k, i+1))
+            self.append('slp_frame_stack_top = null')
+            self.closeblock()
+
+        self.append("}")    #end of switch
         self.indent_less()
-        self.append("}")
+        self.append("}")    #end of forever (block) loop
         self.indent_less()
-        self.append("};")
+        self.append("};")   #end of function
         self.newline()
 
     def ret(self, ref=''): 

Modified: pypy/dist/pypy/translator/js/conftest.py
==============================================================================
--- pypy/dist/pypy/translator/js/conftest.py	(original)
+++ pypy/dist/pypy/translator/js/conftest.py	Fri Nov 11 22:22:21 2005
@@ -4,5 +4,7 @@
 
 option = py.test.Config.addoptions("pypy-js options", 
         Option('--browser', action="store_true",dest="jsbrowser", 
-               default=False, help="run Javscript tests in your (default) browser"),
+               default=False, help="run Javascript tests in your default browser"),
+        Option('--stackless', action="store_true",dest="jsstackless", 
+               default=False, help="enable stackless feature"),
     )

Modified: pypy/dist/pypy/translator/js/js.py
==============================================================================
--- pypy/dist/pypy/translator/js/js.py	(original)
+++ pypy/dist/pypy/translator/js/js.py	Fri Nov 11 22:22:21 2005
@@ -16,12 +16,13 @@
 from pypy.translator.js.database import Database 
 from pypy.translator.js.codewriter import CodeWriter
 from pypy.translator.js.log import log
-
+from pypy.translator.js import conftest
 
 class JS(object):   # JS = Javascript
-    def __init__(self, translator, entrypoint=None):
+    def __init__(self, translator, entrypoint=None, stackless=False):
         self.db = Database(translator)
         self.entrypoint = entrypoint or translator.entrypoint
+        self.stackless = stackless or conftest.option.jsstackless
 
     def write_source(self):
         func = self.entrypoint
@@ -63,7 +64,14 @@
         codewriter.newline()
         for node in self.db.getnodes():
             node.write_global_struct(codewriter)
+        codewriter.newline()
 
+        if self.stackless:
+            codewriter.comment("Global data for stackless feature")
+            codewriter.newline()
+            codewriter.append("slp_frame_stack_top = null")
+            codewriter.append("slp_resume_block    = 0")
+            codewriter.newline()
         f.close()
 
         entry_point= c.value._obj



More information about the Pypy-commit mailing list