[pypy-svn] r7286 - in pypy/trunk/src: goal pypy/annotation pypy/translator
arigo at codespeak.net
arigo at codespeak.net
Tue Nov 16 15:00:05 CET 2004
Author: arigo
Date: Tue Nov 16 15:00:05 2004
New Revision: 7286
Modified:
pypy/trunk/src/goal/translate_pypy.py
pypy/trunk/src/pypy/annotation/binaryop.py
pypy/trunk/src/pypy/annotation/builtin.py
pypy/trunk/src/pypy/annotation/model.py
pypy/trunk/src/pypy/translator/genc.py
Log:
- Added SomePrebuiltConstant annotation for pre-built global constant
instances.
- isinstance() annotation support.
- enabled freezing the caches in translate_pypy.
- generate the name of well-known built-in types in genc.
Modified: pypy/trunk/src/goal/translate_pypy.py
==============================================================================
--- pypy/trunk/src/goal/translate_pypy.py (original)
+++ pypy/trunk/src/goal/translate_pypy.py Tue Nov 16 15:00:05 2004
@@ -23,7 +23,7 @@
global t
t = Translator(entry_point, verbose=True, simplifying=True)
space = StdObjSpace()
- #buildcache.buildcache(space)
+ buildcache.buildcache(space)
a = t.annotate([annmodel.immutablevalue(space)])
a.simplify()
Modified: pypy/trunk/src/pypy/annotation/binaryop.py
==============================================================================
--- pypy/trunk/src/pypy/annotation/binaryop.py (original)
+++ pypy/trunk/src/pypy/annotation/binaryop.py Tue Nov 16 15:00:05 2004
@@ -8,8 +8,10 @@
from pypy.annotation.model import SomeTuple, SomeImpossibleValue
from pypy.annotation.model import SomeInstance, SomeFunction, SomeMethod
from pypy.annotation.model import SomeBuiltin, SomeIterator
+from pypy.annotation.model import SomePrebuiltConstant, immutablevalue
from pypy.annotation.model import unionof, set, setunion, missing_operation
from pypy.annotation.factory import generalize
+from pypy.objspace.flow.model import Constant
# XXX unify this with ObjSpace.MethodTable
@@ -217,3 +219,26 @@
class __extend__(pairtype(SomeObject, SomeImpossibleValue)):
def union((obj1, imp2)):
return obj1
+
+
+class __extend__(pairtype(SomePrebuiltConstant, SomePrebuiltConstant)):
+ def union((pbc1, pbc2)):
+ return SomePrebuiltConstant(setunion(pbc1.prebuiltinstances,
+ pbc2.prebuiltinstances))
+
+class __extend__(pairtype(SomePrebuiltConstant, SomeObject)):
+ def getitem((pbc1, obj2)):
+ # special case for SomePrebuiltConstants that are dictionaries
+ # (actually frozendicts)
+ possibleresults = []
+ for c_inst in pbc1.prebuiltinstances:
+ assert isinstance(c_inst, Constant)
+ inst = c_inst.value
+ if isinstance(inst, dict):
+ possibleresults += inst.values()
+ elif isinstance(inst, list):
+ possibleresults += inst # maybe
+ else:
+ raise TypeError, "cannot getitem() from %r" % (inst,)
+ possibleresults = [immutablevalue(x) for x in possibleresults]
+ return unionof(*possibleresults)
Modified: pypy/trunk/src/pypy/annotation/builtin.py
==============================================================================
--- pypy/trunk/src/pypy/annotation/builtin.py (original)
+++ pypy/trunk/src/pypy/annotation/builtin.py Tue Nov 16 15:00:05 2004
@@ -2,7 +2,8 @@
Built-in functions.
"""
-from pypy.annotation.model import SomeInteger, SomeObject, SomeChar
+from pypy.annotation.model import SomeInteger, SomeObject, SomeChar, SomeBool
+from pypy.annotation.model import immutablevalue
from pypy.annotation.factory import ListFactory, getbookkeeper
import pypy.objspace.std.restricted_int
@@ -30,6 +31,14 @@
def builtin_chr(s_int):
return SomeChar()
+def builtin_isinstance(s_obj, s_type):
+ # XXX simple case only
+ if s_type.is_constant():
+ typ = s_type.const
+ if issubclass(s_obj.knowntype, typ):
+ return immutablevalue(True)
+ return SomeBool()
+
# collect all functions
import __builtin__
Modified: pypy/trunk/src/pypy/annotation/model.py
==============================================================================
--- pypy/trunk/src/pypy/annotation/model.py (original)
+++ pypy/trunk/src/pypy/annotation/model.py Tue Nov 16 15:00:05 2004
@@ -29,7 +29,9 @@
from types import ClassType, BuiltinFunctionType, FunctionType, MethodType
+from types import InstanceType
from pypy.annotation.pairtype import pair, extendabletype
+from pypy.objspace.flow.model import Constant
class SomeObject:
@@ -134,6 +136,14 @@
def __init__(self, meths):
self.meths = meths # map {python_function: classdef}
+class SomePrebuiltConstant(SomeObject):
+ """Stands for a global user instance, built prior to the analysis,
+ or a set of such instances."""
+ def __init__(self, prebuiltinstances):
+ self.prebuiltinstances = prebuiltinstances # set of Constants
+ self.knowntype = reduce(commonbase, [x.value.__class__
+ for x in prebuiltinstances])
+
class SomeImpossibleValue(SomeObject):
"""The empty set. Instances are placeholders for objects that
will never show up at run-time, e.g. elements of an empty list."""
@@ -171,6 +181,8 @@
result = SomeClass(x)
elif isinstance(x, (FunctionType, MethodType)):
result = SomeFunction({x: True})
+ elif hasattr(x, '__class__') and x.__class__.__module__ != '__builtin__':
+ result = SomePrebuiltConstant({Constant(x): True}) # pre-built instances
else:
result = SomeObject()
result.const = x
@@ -218,6 +230,11 @@
d[x] = True
return d
+def commonbase(cls1, cls2): # XXX single inheritance only XXX hum
+ while not issubclass(cls1, cls2):
+ cls2, = [x for x in cls2.__bases__ if x is not object] or [object]
+ return cls2
+
def missing_operation(cls, name):
def default_op(*args):
#print '* warning, no type available for %s(%s)' % (
Modified: pypy/trunk/src/pypy/translator/genc.py
==============================================================================
--- pypy/trunk/src/pypy/translator/genc.py (original)
+++ pypy/trunk/src/pypy/translator/genc.py Tue Nov 16 15:00:05 2004
@@ -157,9 +157,10 @@
bases = [base for base in cls.__bases__ if base is not object]
assert len(bases) <= 1, "%r needs multiple inheritance" % (cls,)
if bases:
- base = self.nameof(bases[0])
+ base = bases[0]
else:
- base = '(PyObject*) &PyBaseObject_Type'
+ base = object
+ base = self.nameof(base)
def initclassobj():
content = cls.__dict__.items()
content.sort()
@@ -180,9 +181,22 @@
nameof_class = nameof_classobj # for Python 2.2
+ typename_mapping = {
+ object: 'PyBaseObject_Type',
+ int: 'PyInt_Type',
+ long: 'PyLong_Type',
+ bool: 'PyBool_Type',
+ list: 'PyList_Type',
+ tuple: 'PyTuple_Type',
+ dict: 'PyDict_Type',
+ str: 'PyString_Type',
+ }
+
def nameof_type(self, cls):
+ if cls in self.typename_mapping:
+ return '(PyObject*) &%s' % self.typename_mapping[cls]
assert hasattr(cls, '__weakref__'), (
- "%r is not a user-defined class" % (cls,))
+ "built-in class %r not found in typename_mapping" % (cls,))
return self.nameof_classobj(cls)
def nameof_tuple(self, tup):
More information about the Pypy-commit
mailing list