[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