[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