[pypy-svn] r23752 - in pypy/dist/pypy/rpython: . test
goden at codespeak.net
goden at codespeak.net
Tue Feb 28 17:55:18 CET 2006
Author: goden
Date: Tue Feb 28 17:55:10 2006
New Revision: 23752
Modified:
pypy/dist/pypy/rpython/extregistry.py
pypy/dist/pypy/rpython/rbuiltin.py
pypy/dist/pypy/rpython/test/test_extregistry.py
Log:
- (micktwomey, arigo, goden) - added support for specializing registered
external functions. added a test.
Modified: pypy/dist/pypy/rpython/extregistry.py
==============================================================================
--- pypy/dist/pypy/rpython/extregistry.py (original)
+++ pypy/dist/pypy/rpython/extregistry.py Tue Feb 28 17:55:10 2006
@@ -1,8 +1,9 @@
import weakref
class ExtRegistryFunc(object):
- def __init__(self, compute_result_annotation):
+ def __init__(self, compute_result_annotation, specialize):
self.compute_result_annotation = compute_result_annotation
+ self.specialize = specialize
def get_annotation(self, type, func=None):
assert func is not None
@@ -27,7 +28,7 @@
EXT_REGISTRY_BY_TYPE = weakref.WeakKeyDictionary()
EXT_REGISTRY_BY_METATYPE = weakref.WeakKeyDictionary()
-def register_func(func, compute_result_annotation):
+def register_func(func, compute_result_annotation, specialize=None):
from pypy.annotation import model as annmodel
if isinstance(compute_result_annotation, annmodel.SomeObject):
s_result = compute_result_annotation
@@ -36,7 +37,8 @@
compute_result_annotation = annotation
- EXT_REGISTRY_BY_VALUE[func] = ExtRegistryFunc(compute_result_annotation)
+ EXT_REGISTRY_BY_VALUE[func] = ExtRegistryFunc(compute_result_annotation,
+ specialize)
def register_type(t, compute_annotation):
from pypy.annotation import model as annmodel
Modified: pypy/dist/pypy/rpython/rbuiltin.py
==============================================================================
--- pypy/dist/pypy/rpython/rbuiltin.py (original)
+++ pypy/dist/pypy/rpython/rbuiltin.py Tue Feb 28 17:55:10 2006
@@ -11,6 +11,7 @@
from pypy.rpython.robject import pyobj_repr
from pypy.rpython.rdict import rtype_r_dict
from pypy.tool import sourcetools
+from pypy.rpython import extregistry
class __extend__(annmodel.SomeBuiltin):
def rtyper_makerepr(self, rtyper):
@@ -61,6 +62,9 @@
except KeyError:
if hasattr(self.builtinfunc,"specialize"):
bltintyper = self.builtinfunc.specialize
+ elif extregistry.is_registered(self.builtinfunc):
+ entry = extregistry.lookup(self.builtinfunc)
+ bltintyper = entry.specialize
else:
raise TyperError("don't know about built-in function %r" % (
self.builtinfunc,))
Modified: pypy/dist/pypy/rpython/test/test_extregistry.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_extregistry.py (original)
+++ pypy/dist/pypy/rpython/test/test_extregistry.py Tue Feb 28 17:55:10 2006
@@ -8,6 +8,8 @@
from pypy.annotation import model as annmodel
from pypy.annotation.annrpython import RPythonAnnotator
from pypy.translator.translator import TranslationContext
+from pypy.rpython.lltypesystem import lltype
+from pypy.rpython.test.test_llinterp import interpret
def dummy():
raiseNameError
@@ -118,17 +120,18 @@
s = a.build_types(func, [RealClass])
assert isinstance(s, annmodel.SomeInteger)
-def failing_test_register_func_with_specialization():
+def test_register_func_with_specialization():
def dummy_func():
raiseNameError
+
+ def dummy_specialize(hop):
+ return hop.inputconst(lltype.Signed, 42)
- register_func(dummy_func, annmodel.SomeInteger())
+ register_func(dummy_func, annmodel.SomeInteger(), dummy_specialize)
def func():
return dummy_func()
- t = TranslationContext()
- a = t.buildannotator()
- s = a.build_types(func, [])
- t.buildrtyper().specialize()
-
\ No newline at end of file
+ res = interpret(func, [])
+
+ assert res == 42
More information about the Pypy-commit
mailing list