[pypy-svn] r29598 - in pypy/dist/pypy/rpython/ootypesystem: . test
fijal at codespeak.net
fijal at codespeak.net
Mon Jul 3 01:37:23 CEST 2006
Author: fijal
Date: Mon Jul 3 01:37:20 2006
New Revision: 29598
Modified:
pypy/dist/pypy/rpython/ootypesystem/bltregistry.py
pypy/dist/pypy/rpython/ootypesystem/test/test_bltann.py
Log:
ExternalBuiltin callback field support
Modified: pypy/dist/pypy/rpython/ootypesystem/bltregistry.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/bltregistry.py (original)
+++ pypy/dist/pypy/rpython/ootypesystem/bltregistry.py Mon Jul 3 01:37:20 2006
@@ -10,6 +10,8 @@
from pypy.annotation.bookkeeper import getbookkeeper
from pypy.rpython.lltypesystem.lltype import frozendict, isCompatibleType
from types import MethodType
+from pypy.rpython.extregistry import ExtRegistryEntry
+from pypy.rpython.rmodel import Repr
class ArgDesc(object):
def __init__(self, name, ex_value):
@@ -21,9 +23,10 @@
self.num = 0
self.args = [self.convert_val(arg) for arg in args]
self.retval = self.convert_val(retval)
+ self.example = self
def convert_val(self, val):
- if isinstance(val, ArgDesc):
+ if isinstance(val, ArgDesc) or isinstance(val, MethodDesc):
return val
elif isinstance(val, tuple):
return ArgDesc(*val)
@@ -31,6 +34,20 @@
self.num += 1
return ArgDesc('v%d' % (self.num-1), val)
+class CallableEntry(ExtRegistryEntry):
+ _type_ = MethodDesc
+
+ def compute_annotation(self):
+ # because we have no good annotation
+ # let's cheat a little bit for a while...
+ bookkeeper = getbookkeeper()
+ # hack, hack, hack, hack, hack, hack, hack, hack, hack, hack, hack, hack, hack, hack, hack
+ values = ["v%d"%i for i in xrange(len(self.instance.args))]
+ lb = eval("lambda %s: None" % ",".join(values))
+ s = annmodel.SomePBC([bookkeeper.getdesc(lb)])
+ #bookkeeper.pbc_call(s, bookkeeper.build_args("simple_call", [bookkeeper.annotation_from_example(arg.example) for arg in self.instance.args]))
+ return s
+
class BasicMetaExternal(type):
def _is_compatible(type2):
return type(type2) is BasicMetaExternal
@@ -44,13 +61,17 @@
_fields = {}
_methods = {}
-from pypy.rpython.extregistry import ExtRegistryEntry
-from pypy.rpython.rmodel import Repr
-
class Analyzer(object):
def __init__(self, name, value):
self.name = name
+ # dirty hack
+ # FIXME: to replace in future
+ #if value.args[-1].name == 'callback':
+ # itervalues = value.args[:-1]
+ #else:
+ # itervalues = value.args
self.args, self.retval = [i.example for i in value.args], value.retval.example
+ self.value = value
def __call__(self, *args):
#for i in xrange(len(args)):
@@ -62,6 +83,9 @@
for i in args:
if isinstance(i, annmodel.SomePBC):
bookkeeper = getbookkeeper()
+ #import pdb;pdb.set_trace()
+ #bookkeeper.pbc_call(i, bookkeeper.build_args("simple_call", [bookkeeper.annotation_from_example(arg) for arg in self.args]))
+
bookkeeper.pbc_call(i, bookkeeper.build_args("simple_call", (ann_retval,)))
return ann_retval
@@ -75,9 +99,8 @@
self._name = str(_class)
self._superclass = None
self._root = True
- self._fields = {}
self.updated = False
- self._data = _class._fields, _class._methods
+ self._data = frozendict(_class._fields), frozendict(_class._methods)
#self._methods = _class._methods
#_methods = dict([(i,ootype._meth(ootype.Meth(*val))) for i,val in _class._methods.iteritems()])
#ootype.Instance.__init__(self, str(_class), None, _class._fields, _methods, True)
@@ -94,6 +117,7 @@
def update_methods(self, _methods):
_signs = {}
+ self._fields = {}
for i, val in _methods.iteritems():
retval = getbookkeeper().annotation_from_example(val.retval.example)
values = [arg.example for arg in val.args]
@@ -133,6 +157,9 @@
def __repr__(self):
return "%s %s" % (self.__name__, self._name)
+
+ def _defl(self):
+ return _external_type(self)
## def _defl(self):
## raise AttributeError()
@@ -157,6 +184,11 @@
def get_field_annotation(self, ext_obj, attr):
return ext_obj.get_field(attr)
+ def get_arg_annotation(self, ext_obj, attr):
+ field = ext_obj._class_._fields[attr]
+ assert isinstance(field, MethodDesc)
+ return [getbookkeeper().annotation_from_example(arg.example) for arg in field.args]
+
def set_field_annotation(self, ext_obj, attr, s_val):
ext_obj.set_field(attr, s_val)
Modified: pypy/dist/pypy/rpython/ootypesystem/test/test_bltann.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/test/test_bltann.py (original)
+++ pypy/dist/pypy/rpython/ootypesystem/test/test_bltann.py Mon Jul 3 01:37:20 2006
@@ -94,3 +94,37 @@
s = a.build_types(set_callback, [])
assert s.knowntype is int
+class CC(BasicExternal):
+ _methods = {
+ 'some_method' : MethodDesc(['some_callback', MethodDesc([('some_int', 3)], 3.0)], 3)
+ }
+
+def test_callback_flowin():
+ def some_f(i):
+ return 3.2
+
+ def set_defined_callback():
+ a = CC()
+ return a.some_method(some_f)
+
+ a = RPythonAnnotator()
+ s = a.build_types(set_defined_callback, [])
+ assert s.knowntype is int
+
+class CD(BasicExternal):
+ _fields = {
+ 'callback_field' : MethodDesc([('some_int', 3)], 3.0)
+ }
+
+def test_callback_field():
+ def callback(x):
+ return 8.3
+
+ def callback_field():
+ a = CD()
+ a.callback_field = callback
+ return a.callback_field
+
+ a = RPythonAnnotator()
+ s = a.build_types(callback_field, [])
+ assert isinstance(s, annmodel.SomePBC)
More information about the Pypy-commit
mailing list