[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