[pypy-svn] r25536 - in pypy/branch/stacklesscfg/pypy/translator/stackless: . test
hpk at codespeak.net
hpk at codespeak.net
Sat Apr 8 12:14:28 CEST 2006
Author: hpk
Date: Sat Apr 8 12:14:27 2006
New Revision: 25536
Modified:
pypy/branch/stacklesscfg/pypy/translator/stackless/test/test_transform.py
pypy/branch/stacklesscfg/pypy/translator/stackless/transform.py
Log:
(hpk, mwh) intermediate checkins with some bugs fixed but C not compiling ... stay tuned
Modified: pypy/branch/stacklesscfg/pypy/translator/stackless/test/test_transform.py
==============================================================================
--- pypy/branch/stacklesscfg/pypy/translator/stackless/test/test_transform.py (original)
+++ pypy/branch/stacklesscfg/pypy/translator/stackless/test/test_transform.py Sat Apr 8 12:14:27 2006
@@ -1,8 +1,13 @@
+import py
+import os
from pypy.translator.stackless.transform import StacklessTransfomer
+from pypy.translator.c.genc import CStandaloneBuilder
from pypy.rpython.memory.gctransform import varoftype
from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.translator.translator import TranslationContext, graphof
from pypy.objspace.flow.model import checkgraph
+from pypy.annotation import model as annmodel
+from pypy.annotation.listdef import ListDef
from pypy import conftest
## def test_frame_types():
@@ -32,18 +37,32 @@
raise UnwindException # XXX or so
def g(x):
check(x)
- return 2
+ return x + 1
def example(x):
- return g(x) + x + 1
+ return g(x) + 1
+ res = run_stackless_function(example, example, g)
+ assert res == "6"
+
+def run_stackless_function(fn, *stacklessfuncs):
+ def entry_point(argv):
+ os.write(1, str(fn(len(argv)))+'\n')
+ return 0
+
+ s_list_of_strings = annmodel.SomeList(ListDef(None, annmodel.SomeString()))
+ s_list_of_strings.listdef.resize()
t = TranslationContext()
- t.buildannotator().build_types(example, [int])
+ t.buildannotator().build_types(entry_point, [s_list_of_strings])
t.buildrtyper().specialize()
+
st = StacklessTransfomer(t)
- st.transform_graph(graphof(t, example))
- st.transform_graph(graphof(t, g))
- for graph in t.graphs:
- checkgraph(graph) # XXX
- example_graph = graphof(t, example)
+ for func in stacklessfuncs:
+ graph = graphof(t, func)
+ st.transform_graph(graph)
+ checkgraph(graph)
if conftest.option.view:
t.view()
-
+
+ cbuilder = CStandaloneBuilder(t, entry_point)
+ cbuilder.generate_source()
+ cbuilder.compile()
+ return cbuilder.cmdexec('')
Modified: pypy/branch/stacklesscfg/pypy/translator/stackless/transform.py
==============================================================================
--- pypy/branch/stacklesscfg/pypy/translator/stackless/transform.py (original)
+++ pypy/branch/stacklesscfg/pypy/translator/stackless/transform.py Sat Apr 8 12:14:27 2006
@@ -1,5 +1,5 @@
from pypy.rpython.lltypesystem import lltype, llmemory
-from pypy.rpython import rarithmetic, rclass
+from pypy.rpython import rarithmetic, rclass, rmodel
from pypy.translator.backendopt import support
from pypy.objspace.flow import model
from pypy.rpython.memory.gctransform import varoftype
@@ -120,7 +120,7 @@
assert self.curr_graph is None
self.curr_graph = graph
- for block in graph.iterblocks():
+ for block in list(graph.iterblocks()):
self.transform_block(block)
if self.resume_points:
XXX
@@ -141,17 +141,18 @@
link = block.exits[0]
var_unwind_exception = varoftype(evalue)
-
+
+ args = [v for v in link.args if v is not op.result]
save_block = self.generate_save_block(
- link.args, var_unwind_exception)
+ args, var_unwind_exception)
- newlink = model.Link(link.args + [var_unwind_exception],
+ newlink = model.Link(args + [var_unwind_exception],
save_block, code.UnwindException)
block.exitswitch = model.c_last_exception
newlink.last_exception = model.Constant(code.UnwindException)
newlink.last_exc_value = var_unwind_exception
block.recloseblock(link, newlink) # exits.append(newlink)
- self.translator.rtyper._convert_link(block, newlink)
+ self._convertlink(block, newlink)
# ARGH ...
block = after_block
@@ -159,20 +160,34 @@
else:
i += 1
+ def _convertlink(self, block, link):
+ rtyper = self.translator.rtyper
+ if link.exitcase is not None:
+ if isinstance(block.exitswitch, model.Variable):
+ r_case = rtyper.bindingrepr(block.exitswitch)
+ else:
+ assert block.exitswitch == model.c_last_exception
+ r_case = rclass.get_type_repr(rtyper)
+ link.llexitcase = r_case.convert_const(link.exitcase)
+ else:
+ link.llexitcase = None
+
def generate_save_block(self, varstosave, var_unwind_exception):
- edata = self.translator.rtyper.getexceptiondata()
+ rtyper = self.translator.rtyper
+ edata = rtyper.getexceptiondata()
etype = edata.lltype_of_exception_type
evalue = edata.lltype_of_exception_value
inputargs = [copyvar(self.translator, v) for v in varstosave]
- var_unwind_exception = varoftype(getinstancerepr(self.translator.rtyper,
+ unwind_exception_type = getinstancerepr(rtyper,
self.translator.annotator.bookkeeper.getuniqueclassdef(
- code.UnwindException)).lowleveltype)
+ code.UnwindException)).lowleveltype
+ var_unwind_exception = copyvar(self.translator, var_unwind_exception)
fields = []
for i, v in enumerate(varstosave):
if v.concretetype is not lltype.Void:
fields.append(('field_%d'%(i,), v.concretetype))
- frame_type = lltype.Struct("S",
+ frame_type = lltype.GcStruct("S",
('header', STATE_HEADER),
*fields)
@@ -191,24 +206,30 @@
## state.header.state = XXX
## u.frame = state.header
header_var = varoftype(lltype.Ptr(STATE_HEADER))
+ var_exc = varoftype(unwind_exception_type)
+ saveops.append(model.SpaceOperation("cast_pointer", [var_unwind_exception],
+ var_exc))
+
saveops.append(model.SpaceOperation("cast_pointer", [frame_state_var], header_var))
var_unwind_exception_frame = varoftype(lltype.Ptr(STATE_HEADER))
- saveops.append(model.SpaceOperation("getfield",
- [var_unwind_exception, model.Constant("frame", lltype.Void)],
- var_unwind_exception_frame))
- saveops.append(model.SpaceOperation("setfield",
- [header_var, model.Constant("f_back", lltype.Void), var_unwind_exception_frame],
- varoftype(lltype.Void)))
- saveops.append(model.SpaceOperation("setfield",
- [var_unwind_exception, model.Constant("frame", lltype.Void)],
- varoftype(lltype.Void)))
-
- save_state_block.closeblock(model.Link([model.Constant(code.UnwindException),
- var_unwind_exception],
+ # XXX
+ saveops.append(model.SpaceOperation(
+ "getfield", [var_exc, model.Constant("frame_bottom", lltype.Void)],
+ var_unwind_exception_frame))
+ saveops.append(model.SpaceOperation(
+ "setfield", [header_var, model.Constant("f_back", lltype.Void),
+ var_unwind_exception_frame],
+ varoftype(lltype.Void)))
+ saveops.append(model.SpaceOperation(
+ "setfield", [var_exc, model.Constant("frame", lltype.Void), header_var],
+ varoftype(lltype.Void)))
+
+ s_exc = self.translator.annotator.bookkeeper.immutablevalue(code.UnwindException)
+ r_exc = rtyper.getrepr(s_exc)
+ c_unwindexception = rmodel.inputconst(r_exc, code.UnwindException)
+ save_state_block.closeblock(model.Link([c_unwindexception, var_exc],
self.curr_graph.exceptblock))
-
return save_state_block
-
def generate_saveops(self, frame_state_var, varstosave):
More information about the Pypy-commit
mailing list