[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