[pypy-svn] r26895 - in pypy/dist/pypy: rpython translator/stackless

arigo at codespeak.net arigo at codespeak.net
Sat May 6 20:57:00 CEST 2006


Author: arigo
Date: Sat May  6 20:56:58 2006
New Revision: 26895

Modified:
   pypy/dist/pypy/rpython/rtyper.py
   pypy/dist/pypy/translator/stackless/transform.py
Log:
(pedronis, arigo)
Type-erase the frame state structures.


Modified: pypy/dist/pypy/rpython/rtyper.py
==============================================================================
--- pypy/dist/pypy/rpython/rtyper.py	(original)
+++ pypy/dist/pypy/rpython/rtyper.py	Sat May  6 20:56:58 2006
@@ -759,7 +759,7 @@
     llop_raising_exceptions = None
     implicit_exceptions_checked = None
 
-    def __init__(self, rtyper, originalblock=None):
+    def __init__(self, rtyper=None, originalblock=None):
         self.rtyper = rtyper
         self.originalblock = originalblock
 

Modified: pypy/dist/pypy/translator/stackless/transform.py
==============================================================================
--- pypy/dist/pypy/translator/stackless/transform.py	(original)
+++ pypy/dist/pypy/translator/stackless/transform.py	Sat May  6 20:56:58 2006
@@ -73,11 +73,13 @@
 #     return retval + x + 1
 
 class ResumePoint:
-    def __init__(self, var_result, args, links_to_resumption, frame_state_type):
+    def __init__(self, var_result, args, links_to_resumption,
+                 frame_state_type, fieldnames):
         self.var_result = var_result
         self.args = args
         self.links_to_resumption = links_to_resumption
         self.frame_state_type = frame_state_type
+        self.fieldnames = fieldnames
 
 class StacklessTransformer(object):
     def __init__(self, translator):
@@ -143,24 +145,30 @@
 
 
     def frame_type_for_vars(self, vars):
-        types = [storage_type(v.concretetype) for v in vars]
+        fieldnames = []
         counts = [0] * len(STORAGE_TYPES)
-        for t in types:
-            counts[t] = counts[t] + 1
+        for v in vars:
+            t = storage_type(v.concretetype)
+            if t is None:
+                fieldnames.append(None)
+            else:
+                fieldnames.append('state_%s_%d' % (STORAGE_FIELDS[t],
+                                                   counts[t]))
+                counts[t] = counts[t] + 1
         key = tuple(counts)
         if key in self.frametypes:
-            return self.frametypes[key]
+            T = self.frametypes[key]
         else:
             fields = []
-            for i, k in enumerate(key):
-                for j in range(k):
-                    fields.append(
-                        ('state_%s_%d'%(STORAGE_FIELDS[i], j), STORAGE_TYPES[i]))
-            T = lltype.Struct("state_%d_%d_%d_%d"%tuple(key),
-                              ('header', STATE_HEADER),
-                              *fields)
+            for t in range(len(STORAGE_TYPES)):
+                for j in range(counts[t]):
+                    fields.append(('state_%s_%d'%(STORAGE_FIELDS[t], j),
+                                   STORAGE_TYPES[t]))
+            T = lltype.GcStruct("FrameState_%d_%d_%d_%d" % tuple(key),
+                                ('header', STATE_HEADER),
+                                *fields)
             self.frametypes[key] = T
-            return T
+        return T, fieldnames
 
     def transform_all(self):
         for graph in self.translator.graphs:
@@ -225,23 +233,25 @@
         for resume_point_index, resume_point in enumerate(self.resume_points):
             newblock = model.Block([])
             newargs = []
-            ops = []
+            llops = LowLevelOpList()
             frame_state_type = resume_point.frame_state_type
             frame_top = varoftype(lltype.Ptr(frame_state_type))
-            ops.extend(self.ops_read_global_state_field(frame_top, "top"))
-            ops.append(model.SpaceOperation(
-                "setfield",
-                [self.ll_global_state,
-                 model.Constant("inst_top", lltype.Void),
-                 model.Constant(null_state, lltype.typeOf(null_state))],
-                varoftype(lltype.Void)))
+            llops.extend(self.ops_read_global_state_field(frame_top, "top"))
+            llops.genop("setfield",
+                       [self.ll_global_state,
+                        model.Constant("inst_top", lltype.Void),
+                        model.Constant(null_state, lltype.typeOf(null_state))])
             varmap = {}
             for i, arg in enumerate(resume_point.args):
-                newarg = varmap[arg] = unsimplify.copyvar(self.translator, arg)
                 assert arg is not resume_point.var_result
-                fname = model.Constant(frame_state_type._names[i+1], lltype.Void)
-                ops.append(model.SpaceOperation(
-                    'getfield', [frame_top, fname], newarg))
+                t = storage_type(arg.concretetype)
+                if t is None:
+                    continue
+                fname = model.Constant(resume_point.fieldnames[i], lltype.Void)
+                v_newarg = llops.genop('getfield', [frame_top, fname],
+                                       resulttype = STORAGE_TYPES[t])
+                v_newarg = gen_cast(llops, arg.concretetype, v_newarg)
+                varmap[arg] = v_newarg
 
             r = storage_type(resume_point.var_result.concretetype)
             if r is not None:
@@ -265,10 +275,11 @@
 ##                        need_address_conversion = True
                 getretval = self.fetch_retval_void_p_ptr
 
-            varmap[resume_point.var_result] = retval = varoftype(rettype)
-            ops.append(model.SpaceOperation("direct_call", [getretval], retval))
+            retval = llops.genop("direct_call", [getretval],
+                                 resulttype = rettype)
+            varmap[resume_point.var_result] = retval
 
-            newblock.operations.extend(ops)
+            newblock.operations.extend(llops)
 
             def rename(arg):
                 if isinstance(arg, model.Variable):
@@ -291,7 +302,7 @@
                 newblock.exitswitch = None
 
             if resume_point.var_result.concretetype != rettype:
-                llops = LowLevelOpList(None)
+                llops = LowLevelOpList()
                 newvar = gen_cast(llops,
                                   resume_point.var_result.concretetype,
                                   retval)
@@ -378,11 +389,12 @@
                            and arg not in args:
                             args.append(arg)
                 
-                save_block, frame_state_type = self.generate_save_block(
-                                args, var_unwind_exception)
+                save_block, frame_state_type, fieldnames = \
+                        self.generate_save_block(args, var_unwind_exception)
 
                 self.resume_points.append(
-                    ResumePoint(op.result, args, tuple(block.exits), frame_state_type))
+                    ResumePoint(op.result, args, tuple(block.exits),
+                                frame_state_type, fieldnames))
 
                 newlink = model.Link(args + [var_unwind_exception], 
                                      save_block, code.UnwindException)
@@ -408,17 +420,7 @@
         var_unwind_exception = unsimplify.copyvar(
             self.translator, var_unwind_exception) 
 
-        fields = []
-        n = []
-        for i, v in enumerate(varstosave):
-            assert v.concretetype is not lltype.Void
-            fields.append(('field_%d'%(i,), v.concretetype))
-            n.append(repr(v.concretetype))
-        
-        frame_type = lltype.GcStruct("S" + '-'.join(n),
-                            ('header', STATE_HEADER),
-                            *fields)
-        
+        frame_type, fieldnames = self.frame_type_for_vars(varstosave)
 
         save_state_block = model.Block(inputargs + [var_unwind_exception])
         saveops = save_state_block.operations
@@ -429,7 +431,8 @@
             [model.Constant(frame_type, lltype.Void)],
             frame_state_var))
         
-        saveops.extend(self.generate_saveops(frame_state_var, inputargs))
+        saveops.extend(self.generate_saveops(frame_state_var, inputargs,
+                                             fieldnames))
 
         var_exc = varoftype(self.unwind_exception_type)
         saveops.append(model.SpaceOperation(
@@ -483,16 +486,16 @@
             self.curr_graph.exceptblock))
         self.translator.rtyper._convert_link(
             save_state_block, save_state_block.exits[0])
-        return save_state_block, frame_type
+        return save_state_block, frame_type, fieldnames
         
-    def generate_saveops(self, frame_state_var, varstosave):
+    def generate_saveops(self, frame_state_var, varstosave, fieldnames):
         frame_type = frame_state_var.concretetype.TO
-        ops = []
+        llops = LowLevelOpList()
         for i, var in enumerate(varstosave):
             t = storage_type(var.concretetype)
-            fname = model.Constant(frame_type._names[i+1], lltype.Void)
-            ops.append(model.SpaceOperation(
-                'setfield',
-                [frame_state_var, fname, var],
-                varoftype(lltype.Void)))
-        return ops
+            if t is lltype.Void:
+                continue
+            fname = model.Constant(fieldnames[i], lltype.Void)
+            v_typeerased = gen_cast(llops, STORAGE_TYPES[t], var)
+            llops.genop('setfield', [frame_state_var, fname, v_typeerased])
+        return llops



More information about the Pypy-commit mailing list