Author: Ronan Lamy <ronan.l...@gmail.com>
Branch: online-transforms
Changeset: r74001:3b7f29937dd9
Date: 2014-10-17 16:18 +0100
http://bitbucket.org/pypy/pypy/changeset/3b7f29937dd9/

Log:    progress

diff --git a/rpython/annotator/bookkeeper.py b/rpython/annotator/bookkeeper.py
--- a/rpython/annotator/bookkeeper.py
+++ b/rpython/annotator/bookkeeper.py
@@ -317,6 +317,9 @@
                 s_self = self.immutablevalue(x.__self__)
                 result = s_self.find_method(x.__name__)
                 assert result is not None
+            elif hasattr(x, '__objclass__'):
+                s_type = self.valueoftype(x.__objclass__)
+                result = s_type.find_unboundmethod(x.__name__)
             else:
                 result = None
             if result is None:
diff --git a/rpython/annotator/model.py b/rpython/annotator/model.py
--- a/rpython/annotator/model.py
+++ b/rpython/annotator/model.py
@@ -558,6 +558,18 @@
         return False
 
 
+class SomeUnboundMethod(SomeBuiltin):
+    "Stands for an unbound built-in method."
+    def __init__(self, analyser, methodname=None):
+        if isinstance(analyser, MethodType):
+            analyser = descriptor.InstanceMethod(
+                analyser.im_func,
+                analyser.im_self,
+                analyser.im_class)
+        self.analyser = analyser
+        self.methodname = methodname
+
+
 class SomeBuiltinMethod(SomeBuiltin):
     """ Stands for a built-in method which has got special meaning
     """
diff --git a/rpython/annotator/test/test_annrpython.py 
b/rpython/annotator/test/test_annrpython.py
--- a/rpython/annotator/test/test_annrpython.py
+++ b/rpython/annotator/test/test_annrpython.py
@@ -434,7 +434,6 @@
             constmeth = getattr(type(example), methname)
             s_constmeth = iv(constmeth)
             assert isinstance(s_constmeth, annmodel.SomeObject)
-            assert s_constmeth.getKind() == 0
             s_meth = iv(example).getattr(iv(methname))
             assert isinstance(s_meth, annmodel.SomeObject)
 
diff --git a/rpython/annotator/unaryop.py b/rpython/annotator/unaryop.py
--- a/rpython/annotator/unaryop.py
+++ b/rpython/annotator/unaryop.py
@@ -8,7 +8,7 @@
 from rpython.flowspace.model import const
 from rpython.annotator.model import (SomeObject, SomeInteger, SomeBool,
     SomeString, SomeChar, SomeList, SomeDict, SomeTuple, SomeImpossibleValue,
-    SomeUnicodeCodePoint, SomeInstance, SomeBuiltin, SomeBuiltinMethod,
+    SomeUnicodeCodePoint, SomeInstance, SomeBuiltin, SomeUnboundMethod, 
SomeBuiltinMethod,
     SomeFloat, SomeIterator, SomePBC, SomeNone, SomeType, s_ImpossibleValue,
     s_Bool, s_None, unionof, add_knowntypedata,
     HarmlesslyBlocked, SomeWeakRef, SomeUnicodeString, SomeByteArray)
@@ -119,6 +119,15 @@
         else:
             return SomeBuiltinMethod(analyser, self, name)
 
+    def find_unboundmethod(self, name):
+        "Look for a special-case implementation for the named method."
+        try:
+            analyser = getattr(self.__class__, 'method_' + name)
+        except AttributeError:
+            return None
+        else:
+            return SomeUnboundMethod(analyser, name)
+
     def getattr(self, s_attr):
         # get a SomeBuiltin if the SomeObject has
         # a corresponding method to handle it
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to