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

ericvrp at codespeak.net ericvrp at codespeak.net
Fri Jan 6 23:30:37 CET 2006


Author: ericvrp
Date: Fri Jan  6 23:30:35 2006
New Revision: 21764

Modified:
   pypy/dist/pypy/translator/js/codewriter.py
   pypy/dist/pypy/translator/js/opwriter.py
   pypy/dist/pypy/translator/js/src/ll_stackless.js
   pypy/dist/pypy/translator/js/src/stack.js
   pypy/dist/pypy/translator/js/test/runtest.py
Log:
* Decreased footprint of stackless javascript.
  (an unwind is now just one line of javascipt (calling a function)
   the resume is also just one line (calling eval()))

* Renamed some functionnames, proper fix required later

* Disabled if->switch transformation because there is no support here yet

* Small fix for the indirect calls that raises an exception.
  (TODO: write a test for this!)


Modified: pypy/dist/pypy/translator/js/codewriter.py
==============================================================================
--- pypy/dist/pypy/translator/js/codewriter.py	(original)
+++ pypy/dist/pypy/translator/js/codewriter.py	Fri Jan  6 23:30:35 2006
@@ -164,12 +164,7 @@
         if self.js.stackless:   # XXX and this funcnode has resumepoints
             self.append("if (slp_frame_stack_top) {")
             self.indent_more()
-            self.append('var t = slp_frame_stack_top.vars')
-            for i, k in enumerate(self._usedvars.keys()):
-                self.append('%-19s = t[%d]' % (k, i))
-            self.append('%-19s = slp_frame_stack_top.resume_blocknum' % 'block')
-            self.append('eval(slp_frame_stack_top.targetvar + " = slp_return_value")')
-            self.append('slp_frame_stack_top = null')
+            self.append('eval(slp_frame_stack_top.resumecode)')
             self.indent_less()
             self.append('}')
 
@@ -207,10 +202,11 @@
                 self.append("slp_stack_depth--")
                 selfdecl = self.decl.split('(')[0]
                 usedvars = ', '.join(self._usedvars.keys())
+                usedvarnames = '"' + '", "'.join(self._usedvars.keys()) + '"'
                 self.append('if (slp_frame_stack_bottom) {')
                 self.indent_more()
-                self.append('slp_new_frame("%s", %s, %d, new Array(%s))' %
-                    (targetvar, selfdecl, self._resume_blocknum, usedvars))
+                self.append('slp_new_frame("%s", %s, %d, new Array(%s), new Array(%s))' %
+                    (targetvar, selfdecl, self._resume_blocknum, usedvarnames, usedvars))
                 if specialreturnvalue:
                     self.append("return " + specialreturnvalue)
                 else:

Modified: pypy/dist/pypy/translator/js/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/js/opwriter.py	(original)
+++ pypy/dist/pypy/translator/js/opwriter.py	Fri Jan  6 23:30:35 2006
@@ -234,7 +234,7 @@
         op_args = [arg for arg in op.args
                    if arg.concretetype is not lltype.Void]
 
-        if op.opname == 'invoke:direct_call':
+        if op.opname in ('invoke:direct_call', 'invoke:indirect_call'):
             functionref = self.db.repr_arg(op_args[0])
         else:   #operation
             opname = op.opname.split(':',1)[1]

Modified: pypy/dist/pypy/translator/js/src/ll_stackless.js
==============================================================================
--- pypy/dist/pypy/translator/js/src/ll_stackless.js	(original)
+++ pypy/dist/pypy/translator/js/src/ll_stackless.js	Fri Jan  6 23:30:35 2006
@@ -32,7 +32,7 @@
     }
     return result;
 }
-ll_stackless_stack_frames_depth__ = ll_stackless_stack_frames_depth;
+ll_stackless_stack_frames_depth___ = ll_stackless_stack_frames_depth;
 
 //
 
@@ -50,30 +50,29 @@
     }
     return result;
 }
-ll_stack_too_big__ = ll_stack_too_big;
+ll_stack_too_big___ = ll_stack_too_big;
 
-function slp_new_frame(targetvar, func, resume_blocknum, vars) {
-    //LOG("slp_new_frame("+targetvar+","+function_name(func)+","+resume_blocknum+","+vars.toSource()+")");
+function slp_new_frame(targetvar, func, resume_blocknum, varnames, vars) {
     LOG("slp_new_frame("+function_name(func)+")");
-    var f             = new Object();
-    f.func            = func;
-    f.targetvar       = targetvar;
-    f.resume_blocknum = resume_blocknum;
-    f.vars            = vars;
-    f.f_back          = null;
+    var f = new Object({func:func, vars:vars, f_back:null});
+    var s = "block=" + resume_blocknum + ";";
+    for (var i = 0;i < vars.length;i++) {
+        if (varnames[i] == targetvar) {
+            s += targetvar + "=slp_return_value;"
+        } else {
+            s += varnames[i]  + "=slp_frame_stack_top.vars[" + i + "];";
+        }
+    }
+    s += "slp_frame_stack_top=null;";
+    f.resumecode = s
     slp_frame_stack_bottom.f_back = f; // push below bottom, to keep stack
     slp_frame_stack_bottom        = f; // correctly sorted after unwind
+    LOG(f.resumecode);
 }
 
 function slp_new_frame_simple(func) {
     LOG("slp_new_frame_simple("+function_name(func)+")");
-    var f             = new Object();
-    f.func            = func;
-    f.targetvar       = undefined;
-    f.resume_blocknum = undefined;
-    f.vars            = undefined;
-    f.f_back          = null;
-    return f;   // note: the non-simple version returns nothing
+    return new Object({func:func, f_back:null});    // note: the non-simple version returns nothing
 }
 
 function ll_stack_unwind() {
@@ -83,10 +82,10 @@
     } else {
         slp_frame_stack_top = slp_frame_stack_bottom = slp_new_frame_simple(ll_stack_unwind);
     }
-    LOG('slp_frame_stack_top='+slp_frame_stack_top + ', slp_frame_stack_bottom='+slp_frame_stack_bottom)
+    LOG('slp_frame_stack_top='+slp_frame_stack_top + ', slp_frame_stack_bottom='+slp_frame_stack_bottom);
     return slp_return_value;
 }
-ll_stack_unwind__ = ll_stack_unwind;
+ll_stack_unwind___ = ll_stack_unwind;
 
 function    slp_return_current_frame_to_caller() {
     LOG("slp_return_current_frame_to_caller");
@@ -102,7 +101,7 @@
     LOG("slp_end_of_yielding_function");
     if (!slp_frame_stack_top) log('slp_end_of_yielding_function !slp_frame_stack_top'); // can only resume from slp_return_current_frame_to_caller()
     if (!slp_return_value)    log('slp_end_of_yielding_function !slp_return_value');
-    LOG('slp_return_value is going to ' + function_name(slp_return_value.func))
+    LOG('slp_return_value is going to ' + function_name(slp_return_value.func));
     slp_frame_stack_top = slp_return_value;
     return null;
 }

Modified: pypy/dist/pypy/translator/js/src/stack.js
==============================================================================
--- pypy/dist/pypy/translator/js/src/stack.js	(original)
+++ pypy/dist/pypy/translator/js/src/stack.js	Fri Jan  6 23:30:35 2006
@@ -14,11 +14,11 @@
     }
     return false;
 }
-ll_stack_too_big__ = ll_stack_too_big;
+ll_stack_too_big___ = ll_stack_too_big;
 
 function ll_stack_unwind() {
     throw "Recursion limit exceeded";
 }
-ll_stack_unwind__ = ll_stack_unwind;
+ll_stack_unwind___ = ll_stack_unwind;
 
 // End of helpers

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 Jan  6 23:30:35 2006
@@ -24,7 +24,7 @@
         t = Translator(function)
         a = t.annotate(annotation)
         t.specialize()
-        t.backend_optimizations(inline_threshold=0, mallocs=False)
+        t.backend_optimizations(inline_threshold=0, mallocs=False, merge_if_blocks_to_switch=False)
         #t.backend_optimizations()
         if view:
             t.view()



More information about the Pypy-commit mailing list