[pypy-svn] r27124 - in pypy/dist/pypy/translator/stackless: . test

mwh at codespeak.net mwh at codespeak.net
Fri May 12 12:45:36 CEST 2006


Author: mwh
Date: Fri May 12 12:45:34 2006
New Revision: 27124

Modified:
   pypy/dist/pypy/translator/stackless/test/test_transform.py
   pypy/dist/pypy/translator/stackless/transform.py
Log:
reenable test_frame_types


Modified: pypy/dist/pypy/translator/stackless/test/test_transform.py
==============================================================================
--- pypy/dist/pypy/translator/stackless/test/test_transform.py	(original)
+++ pypy/dist/pypy/translator/stackless/test/test_transform.py	Fri May 12 12:45:34 2006
@@ -1,6 +1,6 @@
 import py
 import os
-from pypy.translator.stackless.transform import StacklessTransformer
+from pypy.translator.stackless.transform import StacklessTransformer, FrameTyper
 from pypy.translator.c.genc import CStandaloneBuilder
 from pypy.translator.c import gc
 from pypy.rpython.memory.gctransform import varoftype
@@ -12,25 +12,27 @@
 from pypy.annotation.listdef import ListDef 
 from pypy import conftest
 
-## def test_frame_types():
-##     st = StacklessTransfomer(None)
+def test_frame_typer():
+    ft = FrameTyper()
+    ft4vars = lambda types:ft.frame_type_for_vars(types)[0]
+
+    signed = varoftype(lltype.Signed)
+    ptr = varoftype(lltype.Ptr(lltype.GcStruct("S")))
+    addr = varoftype(llmemory.Address)
+    float = varoftype(lltype.Float)
+    longlong = varoftype(lltype.SignedLongLong)
 
-##     signed = varoftype(lltype.Signed)
-##     ptr = varoftype(lltype.Ptr(lltype.GcStruct("S")))
-##     addr = varoftype(llmemory.Address)
-##     float = varoftype(lltype.Float)
-##     longlong = varoftype(lltype.SignedLongLong)
-
-##     ft4vars = st.frame_type_for_vars
     
-##     s1 = ft4vars([signed])
-##     assert 'header' in s1._flds
-##     assert len(s1._flds) == 2
+    s1_1 = ft4vars([signed])
+    assert 'header' in s1_1._flds
+    assert len(s1_1._flds) == 2
+    s1_2 = ft4vars([signed])
+    assert s1_1 is s1_2
 
-##     s2_1 = ft4vars([signed, ptr])
-##     s2_2 = ft4vars([ptr, signed])
+    s2_1 = ft4vars([signed, ptr])
+    s2_2 = ft4vars([ptr, signed])
 
-##     assert s2_1 is s2_2
+    assert s2_1 is s2_2
 
 from pypy.translator.stackless import code
 

Modified: pypy/dist/pypy/translator/stackless/transform.py
==============================================================================
--- pypy/dist/pypy/translator/stackless/transform.py	(original)
+++ pypy/dist/pypy/translator/stackless/transform.py	Fri May 12 12:45:34 2006
@@ -79,6 +79,37 @@
         self.frame_state_type = frame_state_type
         self.fieldnames = fieldnames
 
+class FrameTyper:
+    # this class only exists independently to ease testing
+    def __init__(self):
+        self.frametypes = {}
+
+    def frame_type_for_vars(self, vars):
+        fieldnames = []
+        counts = {}
+        for v in vars:
+            t = storage_type(v.concretetype)
+            if t is lltype.Void:
+                fieldnames.append(None)
+            else:
+                n = counts.get(t, 0)
+                fieldnames.append('state_%s_%d' % (STORAGE_FIELDS[t], n))
+                counts[t] = n + 1
+        key = lltype.frozendict(counts)
+        if key in self.frametypes:
+            T = self.frametypes[key]
+        else:
+            fields = []
+            for t in STORAGE_TYPES:
+                for j in range(counts.get(t, 0)):
+                    fields.append(('state_%s_%d' % (STORAGE_FIELDS[t], j), t))
+            T = lltype.GcStruct("FrameState",
+                                ('header', STATE_HEADER),
+                                *fields)
+            self.frametypes[key] = T
+        return T, fieldnames
+        
+
 class StacklessTransformer(object):
     def __init__(self, translator, entrypoint):
         self.translator = translator
@@ -89,9 +120,9 @@
         self.unwind_exception_type = getinstancerepr(
             self.translator.rtyper,
             bk.getuniqueclassdef(code.UnwindException)).lowleveltype
-        self.frametypes = {}
+        self.frametyper = FrameTyper()
         self.curr_graph = None
-                
+
         mixlevelannotator = MixLevelHelperAnnotator(translator.rtyper)
         l2a = annmodel.lltype_to_annotation
 
@@ -159,32 +190,6 @@
             r_global_state.lowleveltype)
         self.seen_blocks = set()
 
-
-    def frame_type_for_vars(self, vars):
-        fieldnames = []
-        counts = {}
-        for v in vars:
-            t = storage_type(v.concretetype)
-            if t is lltype.Void:
-                fieldnames.append(None)
-            else:
-                n = counts.get(t, 0)
-                fieldnames.append('state_%s_%d' % (STORAGE_FIELDS[t], n))
-                counts[t] = n + 1
-        key = lltype.frozendict(counts)
-        if key in self.frametypes:
-            T = self.frametypes[key]
-        else:
-            fields = []
-            for t in STORAGE_TYPES:
-                for j in range(counts.get(t, 0)):
-                    fields.append(('state_%s_%d' % (STORAGE_FIELDS[t], j), t))
-            T = lltype.GcStruct("FrameState",
-                                ('header', STATE_HEADER),
-                                *fields)
-            self.frametypes[key] = T
-        return T, fieldnames
-
     def transform_all(self):
         for graph in self.translator.graphs:
             self.transform_graph(graph)
@@ -430,7 +435,7 @@
         var_unwind_exception = unsimplify.copyvar(
             None, var_unwind_exception) 
 
-        frame_type, fieldnames = self.frame_type_for_vars(varstosave)
+        frame_type, fieldnames = self.frametyper.frame_type_for_vars(varstosave)
 
         save_state_block = model.Block(inputargs + [var_unwind_exception])
         saveops = save_state_block.operations



More information about the Pypy-commit mailing list