[pypy-svn] r23782 - in pypy/dist/pypy/rpython: . lltypesystem ootypesystem

nik at codespeak.net nik at codespeak.net
Tue Feb 28 21:50:22 CET 2006


Author: nik
Date: Tue Feb 28 21:50:05 2006
New Revision: 23782

Modified:
   pypy/dist/pypy/rpython/lltypesystem/rpbc.py
   pypy/dist/pypy/rpython/ootypesystem/rpbc.py
   pypy/dist/pypy/rpython/rpbc.py
Log:
(mwh, pedronis, nik)
refactored MultipleFrozenPBCRepr to share code between the two type systems.


Modified: pypy/dist/pypy/rpython/lltypesystem/rpbc.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rpbc.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/rpbc.py	Tue Feb 28 21:50:05 2006
@@ -10,9 +10,10 @@
 from pypy.rpython.rmodel import warning, mangle, CanBeNull
 from pypy.rpython import robject
 from pypy.rpython import rtuple
-from pypy.rpython.rpbc import SingleFrozenPBCRepr, samesig,\
+from pypy.rpython.rpbc import samesig,\
      commonbase, allattributenames, adjust_shape, FunctionsPBCRepr, \
-     AbstractClassesPBCRepr, AbstractMethodsPBCRepr, OverriddenFunctionPBCRepr
+     AbstractClassesPBCRepr, AbstractMethodsPBCRepr, OverriddenFunctionPBCRepr, \
+     AbstractMultipleFrozenPBCRepr
 from pypy.rpython.lltypesystem import rclass
 from pypy.tool.sourcetools import has_varargs
 
@@ -26,7 +27,7 @@
     
 # ____________________________________________________________
 
-class MultipleFrozenPBCRepr(CanBeNull, Repr):
+class MultipleFrozenPBCRepr(AbstractMultipleFrozenPBCRepr):
     """Representation selected for multiple non-callable pre-built constants."""
     def __init__(self, rtyper, access_set):
         self.rtyper = rtyper
@@ -36,77 +37,21 @@
         self.pbc_cache = {}
 
     def _setup_repr(self):
-        llfields = []
-        llfieldmap = {}
-        if self.access_set is not None:
-            attrlist = self.access_set.attrs.keys()
-            attrlist.sort()
-            for attr in attrlist:
-                s_value = self.access_set.attrs[attr]
-                r_value = self.rtyper.getrepr(s_value)
-                mangled_name = mangle('pbc', attr)
-                llfields.append((mangled_name, r_value.lowleveltype))
-                llfieldmap[attr] = mangled_name, r_value
+        llfields = self._setup_repr_fields()
         self.pbc_type.become(Struct('pbc', *llfields))
-        self.llfieldmap = llfieldmap
 
-    def convert_desc(self, frozendesc):
-        if (self.access_set is not None and
-            frozendesc not in self.access_set.descs):
-            raise TyperError("not found in PBC access set: %r" % (frozendesc,))
-        try:
-            return self.pbc_cache[frozendesc]
-        except KeyError:
-            self.setup()
-            result = malloc(self.pbc_type, immortal=True)
-            self.pbc_cache[frozendesc] = result
-            for attr, (mangled_name, r_value) in self.llfieldmap.items():
-                if r_value.lowleveltype is Void:
-                    continue
-                try:
-                    thisattrvalue = frozendesc.read_attribute(attr)
-                except AttributeError:
-                    warning("Desc %r has no attribute %r" % (frozendesc, attr))
-                    continue
-                llvalue = r_value.convert_const(thisattrvalue)
-                setattr(result, mangled_name, llvalue)
-            return result
-
-    def convert_const(self, pbc):
-        if pbc is None:
-            return nullptr(self.pbc_type)
-        if isinstance(pbc, types.MethodType) and pbc.im_self is None:
-            value = pbc.im_func   # unbound method -> bare function
-        frozendesc = self.rtyper.annotator.bookkeeper.getdesc(pbc)
-        return self.convert_desc(frozendesc)
-
-    def rtype_getattr(self, hop):
-        attr = hop.args_s[1].const
-        vpbc, vattr = hop.inputargs(self, Void)
-        v_res = self.getfield(vpbc, attr, hop.llops)
-        mangled_name, r_res = self.llfieldmap[attr]
-        return hop.llops.convertvar(v_res, r_res, hop.r_result)
+    def create_instance(self):
+        return malloc(self.pbc_type, immortal=True)
+
+    def null_instance(self):
+        return nullptr(self.pbc_type)
 
     def getfield(self, vpbc, attr, llops):
-        mangled_name, r_value = self.llfieldmap[attr]
+        mangled_name, r_value = self.fieldmap[attr]
         cmangledname = inputconst(Void, mangled_name)
         return llops.genop('getfield', [vpbc, cmangledname],
                            resulttype = r_value)
 
-class __extend__(pairtype(MultipleFrozenPBCRepr, MultipleFrozenPBCRepr)):
-    def convert_from_to((r_pbc1, r_pbc2), v, llops):
-        if r_pbc1.access_set == r_pbc2.access_set:
-            return v
-        return NotImplemented
-
-class __extend__(pairtype(SingleFrozenPBCRepr, MultipleFrozenPBCRepr)):
-    def convert_from_to((r_pbc1, r_pbc2), v, llops):
-        frozendesc1 = r_pbc1.frozendesc
-        access = frozendesc1.queryattrfamily()
-        if access is r_pbc2.access_set:
-            return inputdesc(r_pbc2, frozendesc1)
-        return NotImplemented
-
 # ____________________________________________________________
 
 

Modified: pypy/dist/pypy/rpython/ootypesystem/rpbc.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rpbc.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/rpbc.py	Tue Feb 28 21:50:05 2006
@@ -1,11 +1,12 @@
 from pypy.rpython.rmodel import CanBeNull, Repr, inputconst
-from pypy.rpython.rpbc import AbstractClassesPBCRepr, AbstractMethodsPBCRepr
-from pypy.rpython.rpbc import get_concrete_calltable
+from pypy.rpython.rpbc import AbstractClassesPBCRepr, AbstractMethodsPBCRepr, \
+        AbstractMultipleFrozenPBCRepr
 from pypy.rpython.rclass import rtype_new_instance, getinstancerepr
+from pypy.rpython.rpbc import get_concrete_calltable
 from pypy.rpython import callparse
 from pypy.rpython.ootypesystem import ootype
-from pypy.rpython.ootypesystem.rclass import ClassRepr, InstanceRepr, mangle
-from pypy.rpython.ootypesystem.rclass import rtype_classes_is_
+from pypy.rpython.ootypesystem.rclass import ClassRepr, InstanceRepr 
+from pypy.rpython.ootypesystem.rclass import rtype_classes_is_, mangle
 from pypy.annotation import model as annmodel
 from pypy.annotation import description
 from pypy.annotation.pairtype import pairtype
@@ -132,7 +133,7 @@
     rtype_is_ = rtype_classes_is_
 
 
-class MultipleFrozenPBCRepr(CanBeNull, Repr):
+class MultipleFrozenPBCRepr(AbstractMultipleFrozenPBCRepr):
     """Representation selected for multiple non-callable pre-built constants."""
     def __init__(self, rtyper, access_set):
         self.rtyper = rtyper
@@ -141,56 +142,14 @@
         self.pbc_cache = {}
 
     def _setup_repr(self):
-        fields = {}
-        fieldmap = {}
-        if self.access_set is not None:
-            attrlist = self.access_set.attrs.keys()
-            attrlist.sort()
-            for attr in attrlist:
-                s_value = self.access_set.attrs[attr]
-                r_value = self.rtyper.getrepr(s_value)
-                mangled_name = mangle(attr)
-                fields[mangled_name] = r_value.lowleveltype
-                fieldmap[attr] = mangled_name, r_value
-        ootype.addFields(self.lowleveltype, fields)
-        self.fieldmap = fieldmap
-
-    def convert_desc(self, frozendesc):
-        if (self.access_set is not None and
-            frozendesc not in self.access_set.descs):
-            raise TyperError("not found in PBC access set: %r" % (frozendesc,))
-        try:
-            return self.pbc_cache[frozendesc]
-        except KeyError:
-            self.setup()
-            result = ootype.new(self.lowleveltype)
-            self.pbc_cache[frozendesc] = result
-            for attr, (mangled_name, r_value) in self.fieldmap.items():
-                if r_value.lowleveltype is ootype.Void:
-                    continue
-                try:
-                    thisattrvalue = frozendesc.read_attribute(attr)
-                except AttributeError:
-                    warning("Desc %r has no attribute %r" % (frozendesc, attr))
-                    continue
-                llvalue = r_value.convert_const(thisattrvalue)
-                setattr(result, mangled_name, llvalue)
-            return result
-
-    def convert_const(self, pbc):
-        if pbc is None:
-            return ootype.null(self.lowleveltype)
-        if isinstance(pbc, types.MethodType) and pbc.im_self is None:
-            value = pbc.im_func   # unbound method -> bare function
-        frozendesc = self.rtyper.annotator.bookkeeper.getdesc(pbc)
-        return self.convert_desc(frozendesc)
-
-    def rtype_getattr(self, hop):
-        attr = hop.args_s[1].const
-        vpbc, vattr = hop.inputargs(self, ootype.Void)
-        v_res = self.getfield(vpbc, attr, hop.llops)
-        mangled_name, r_res = self.fieldmap[attr]
-        return hop.llops.convertvar(v_res, r_res, hop.r_result)
+        fields_list = self._setup_repr_fields()
+        ootype.addFields(self.lowleveltype, dict(fields_list))
+
+    def create_instance(self):
+        return ootype.new(self.lowleveltype)
+
+    def null_instance(self):
+        return ootype.null(self.lowleveltype)
 
     def getfield(self, vpbc, attr, llops):
         mangled_name, r_value = self.fieldmap[attr]

Modified: pypy/dist/pypy/rpython/rpbc.py
==============================================================================
--- pypy/dist/pypy/rpython/rpbc.py	(original)
+++ pypy/dist/pypy/rpython/rpbc.py	Tue Feb 28 21:50:05 2006
@@ -7,7 +7,8 @@
 from pypy.rpython.lltypesystem.lltype import \
      typeOf, Void, Bool, nullptr, frozendict, Ptr, Struct, malloc
 from pypy.rpython.error import TyperError
-from pypy.rpython.rmodel import Repr, inputconst, HalfConcreteWrapper, CanBeNull
+from pypy.rpython.rmodel import Repr, inputconst, HalfConcreteWrapper, CanBeNull, \
+        mangle, inputdesc
 from pypy.rpython import rclass
 from pypy.rpython import robject
 
@@ -378,6 +379,74 @@
         assert frozendesc is self.frozendesc
         return object()  # lowleveltype is Void
 
+
+class AbstractMultipleFrozenPBCRepr(CanBeNull, Repr):
+
+    def _setup_repr_fields(self):
+        fields = []
+        self.fieldmap = {}
+        if self.access_set is not None:
+            attrlist = self.access_set.attrs.keys()
+            attrlist.sort()
+            for attr in attrlist:
+                s_value = self.access_set.attrs[attr]
+                r_value = self.rtyper.getrepr(s_value)
+                mangled_name = mangle('pbc', attr)
+                fields.append((mangled_name, r_value.lowleveltype))
+                self.fieldmap[attr] = mangled_name, r_value
+        return fields 
+
+    def convert_desc(self, frozendesc):
+        if (self.access_set is not None and
+            frozendesc not in self.access_set.descs):
+            raise TyperError("not found in PBC access set: %r" % (frozendesc,))
+        try:
+            return self.pbc_cache[frozendesc]
+        except KeyError:
+            self.setup()
+            result = self.create_instance()
+            self.pbc_cache[frozendesc] = result
+            for attr, (mangled_name, r_value) in self.fieldmap.items():
+                if r_value.lowleveltype is Void:
+                    continue
+                try:
+                    thisattrvalue = frozendesc.read_attribute(attr)
+                except AttributeError:
+                    warning("Desc %r has no attribute %r" % (frozendesc, attr))
+                    continue
+                llvalue = r_value.convert_const(thisattrvalue)
+                setattr(result, mangled_name, llvalue)
+            return result
+
+    def convert_const(self, pbc):
+        if pbc is None:
+            return self.null_instance() 
+        if isinstance(pbc, types.MethodType) and pbc.im_self is None:
+            value = pbc.im_func   # unbound method -> bare function
+        frozendesc = self.rtyper.annotator.bookkeeper.getdesc(pbc)
+        return self.convert_desc(frozendesc)
+    
+    def rtype_getattr(self, hop):
+        attr = hop.args_s[1].const
+        vpbc, vattr = hop.inputargs(self, Void)
+        v_res = self.getfield(vpbc, attr, hop.llops)
+        mangled_name, r_res = self.fieldmap[attr]
+        return hop.llops.convertvar(v_res, r_res, hop.r_result)
+
+class __extend__(pairtype(AbstractMultipleFrozenPBCRepr, AbstractMultipleFrozenPBCRepr)):
+    def convert_from_to((r_pbc1, r_pbc2), v, llops):
+        if r_pbc1.access_set == r_pbc2.access_set:
+            return v
+        return NotImplemented
+
+class __extend__(pairtype(SingleFrozenPBCRepr, AbstractMultipleFrozenPBCRepr)):
+    def convert_from_to((r_pbc1, r_pbc2), v, llops):
+        frozendesc1 = r_pbc1.frozendesc
+        access = frozendesc1.queryattrfamily()
+        if access is r_pbc2.access_set:
+            return inputdesc(r_pbc2, frozendesc1)
+        return NotImplemented
+
 # __ None ____________________________________________________
 class NoneFrozenPBCRepr(SingleFrozenPBCRepr):
     



More information about the Pypy-commit mailing list