[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