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

mwh at codespeak.net mwh at codespeak.net
Sat Oct 15 11:49:08 CEST 2005


Author: mwh
Date: Sat Oct 15 11:49:06 2005
New Revision: 18603

Modified:
   pypy/dist/pypy/rpython/lltypesystem/rclass.py
   pypy/dist/pypy/rpython/lltypesystem/rpbc.py
   pypy/dist/pypy/rpython/rpbc.py
Log:
(boria, mwh)
* moved most of ClassesPBCRepr from rpython.lltypesystem.rpbc back to 
  rpython.rpbc renamed as AbstractClassesPBCRepr.
* renamed rpython.lltypesystem.rclass.TYPEPTR to CLASSTYPE


Modified: pypy/dist/pypy/rpython/lltypesystem/rclass.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rclass.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/rclass.py	Sat Oct 15 11:49:06 2005
@@ -52,18 +52,18 @@
 # there's also a nongcobject 
 
 OBJECT_VTABLE = ForwardReference()
-TYPEPTR = Ptr(OBJECT_VTABLE)
-OBJECT = GcStruct('object', ('typeptr', TYPEPTR))
+CLASSTYPE = Ptr(OBJECT_VTABLE)
+OBJECT = GcStruct('object', ('typeptr', CLASSTYPE))
 OBJECTPTR = Ptr(OBJECT)
 OBJECT_VTABLE.become(Struct('object_vtable',
-                            ('parenttypeptr', TYPEPTR),
+                            ('parenttypeptr', CLASSTYPE),
                             ('subclassrange_min', Signed),
                             ('subclassrange_max', Signed),
                             ('rtti', Ptr(RuntimeTypeInfo)),
                             ('name', Ptr(Array(Char))),
                             ('instantiate', Ptr(FuncType([], OBJECTPTR)))))
 # non-gc case
-NONGCOBJECT = Struct('nongcobject', ('typeptr', TYPEPTR))
+NONGCOBJECT = Struct('nongcobject', ('typeptr', CLASSTYPE))
 NONGCOBJECTPTR = Ptr(OBJECT)
 
 def cast_vtable_to_typeptr(vtable):
@@ -496,7 +496,7 @@
                 vlist = [inputconst(Void, flavor)] + vlist
         vptr = llops.genop(mallocop, vlist,
                            resulttype = Ptr(self.object_type)) # xxx flavor
-        ctypeptr = inputconst(TYPEPTR, self.rclass.getvtable())
+        ctypeptr = inputconst(CLASSTYPE, self.rclass.getvtable())
         self.setfield(vptr, '__class__', ctypeptr, llops)
         # initialize instance attributes from their defaults from the class
         if self.classdef is not None:

Modified: pypy/dist/pypy/rpython/lltypesystem/rpbc.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rpbc.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/rpbc.py	Sat Oct 15 11:49:06 2005
@@ -11,7 +11,8 @@
 from pypy.rpython import rtuple
 from pypy.rpython.rpbc import SingleFrozenPBCRepr, getsignature, samesig,\
                                 commonbase, allattributenames, get_access_set,\
-                                MultiplePBCRepr, FunctionsPBCRepr
+                                MultiplePBCRepr, FunctionsPBCRepr, \
+                                AbstractClassesPBCRepr
 from pypy.rpython.lltypesystem import rclass
 from pypy.tool.sourcetools import has_varargs
 
@@ -273,45 +274,10 @@
 # ____________________________________________________________
 
 
-class ClassesPBCRepr(Repr):
+class ClassesPBCRepr(AbstractClassesPBCRepr):
     """Representation selected for a PBC of class(es)."""
 
-    def __init__(self, rtyper, s_pbc):
-        self.rtyper = rtyper
-        self.s_pbc = s_pbc
-        if None in s_pbc.prebuiltinstances:
-            raise TyperError("unsupported: variable of type "
-                             "class-pointer or None")
-        if s_pbc.is_constant():
-            self.lowleveltype = Void
-        else:
-            self.lowleveltype = rclass.TYPEPTR
-        self._access_set = None
-        self._class_repr = None
-
-    def get_access_set(self):
-        if self._access_set is None:
-            access_sets = self.rtyper.annotator.getpbcaccesssets()
-            classes = self.s_pbc.prebuiltinstances.keys()
-            _, _, access = access_sets.find(classes[0])
-            for obj in classes[1:]:
-                _, _, access1 = access_sets.find(obj)
-                assert access1 is access       # XXX not implemented
-            commonbase = access.commonbase
-            self._class_repr = rclass.getclassrepr(self.rtyper, commonbase)
-            self._access_set = access
-        return self._access_set
-
-    def get_class_repr(self):
-        self.get_access_set()
-        return self._class_repr
-
-    def convert_const(self, cls):
-        if cls not in self.s_pbc.prebuiltinstances:
-            raise TyperError("%r not in %r" % (cls, self))
-        if self.lowleveltype is Void:
-            return cls
-        return rclass.get_type_repr(self.rtyper).convert_const(cls)
+    # no __init__ here, AbstractClassesPBCRepr.__init__ is good enough
 
     def rtype_simple_call(self, hop):
         return self.redispatch_call(hop, call_args=False)
@@ -359,18 +325,6 @@
             hop2.dispatch()
         return v_instance
 
-    def rtype_getattr(self, hop):
-        if hop.s_result.is_constant():
-            return hop.inputconst(hop.r_result, hop.s_result.const)
-        else:
-            attr = hop.args_s[1].const
-            vcls, vattr = hop.inputargs(self, Void)
-            return self.getfield(vcls, attr, hop.llops)
-
-    def getfield(self, vcls, attr, llops):
-        access_set = self.get_access_set()
-        class_repr = self.get_class_repr()
-        return class_repr.getpbcfield(vcls, access_set, attr, llops)
 
 class __extend__(pairtype(ClassesPBCRepr, rclass.AbstractClassRepr)):
     def convert_from_to((r_clspbc, r_cls), v, llops):

Modified: pypy/dist/pypy/rpython/rpbc.py
==============================================================================
--- pypy/dist/pypy/rpython/rpbc.py	(original)
+++ pypy/dist/pypy/rpython/rpbc.py	Sat Oct 15 11:49:06 2005
@@ -293,6 +293,76 @@
 
 # ____________________________________________________________
 
+class AbstractClassesPBCRepr(Repr):
+    """Representation selected for a PBC of class(es)."""
+
+    def __init__(self, rtyper, s_pbc):
+        self.rtyper = rtyper
+        self.s_pbc = s_pbc
+        if None in s_pbc.prebuiltinstances:
+            raise TyperError("unsupported: variable of type "
+                             "class-pointer or None")
+        if s_pbc.is_constant():
+            self.lowleveltype = Void
+        else:
+            self.lowleveltype = rtyper.type_system.rclass.CLASSTYPE
+        self._access_set = None
+        self._class_repr = None
+
+    def get_access_set(self):
+        if self._access_set is None:
+            access_sets = self.rtyper.annotator.getpbcaccesssets()
+            classes = self.s_pbc.prebuiltinstances.keys()
+            _, _, access = access_sets.find(classes[0])
+            for obj in classes[1:]:
+                _, _, access1 = access_sets.find(obj)
+                assert access1 is access       # XXX not implemented
+            commonbase = access.commonbase
+            self._class_repr = rclass.getclassrepr(self.rtyper, commonbase)
+            self._access_set = access
+        return self._access_set
+
+    def get_class_repr(self):
+        self.get_access_set()
+        return self._class_repr
+
+    def convert_const(self, cls):
+        if cls not in self.s_pbc.prebuiltinstances:
+            raise TyperError("%r not in %r" % (cls, self))
+        if self.lowleveltype is Void:
+            return cls
+        return rclass.get_type_repr(self.rtyper).convert_const(cls)
+
+    def rtype_getattr(self, hop):
+        if hop.s_result.is_constant():
+            return hop.inputconst(hop.r_result, hop.s_result.const)
+        else:
+            attr = hop.args_s[1].const
+            vcls, vattr = hop.inputargs(self, Void)
+            return self.getfield(vcls, attr, hop.llops)
+
+    def getfield(self, vcls, attr, llops):
+        access_set = self.get_access_set()
+        class_repr = self.get_class_repr()
+        return class_repr.getpbcfield(vcls, access_set, attr, llops)
+
+class __extend__(pairtype(AbstractClassesPBCRepr, rclass.AbstractClassRepr)):
+    def convert_from_to((r_clspbc, r_cls), v, llops):
+        if r_cls.lowleveltype != r_clspbc.lowleveltype:
+            return NotImplemented   # good enough for now
+        return v
+
+class __extend__(pairtype(AbstractClassesPBCRepr, AbstractClassesPBCRepr)):
+    def convert_from_to((r_clspbc1, r_clspbc2), v, llops):
+        # this check makes sense because both source and dest repr are ClassesPBCRepr
+        if r_clspbc1.lowleveltype == r_clspbc2.lowleveltype:
+            return v
+        if r_clspbc1.lowleveltype is Void:
+            return inputconst(r_clspbc2, r_clspbc1.s_pbc.const)
+        return NotImplemented
+
+# ____________________________________________________________
+
 def getsignature(rtyper, func):
     f = rtyper.getcallable(func)
     graph = rtyper.type_system_deref(f).graph



More information about the Pypy-commit mailing list