[pypy-commit] pypy online-transforms: fix some nonsense with other nonsense
rlamy
noreply at buildbot.pypy.org
Sat Oct 25 14:58:24 CEST 2014
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: online-transforms
Changeset: r74208:e768de5dd66a
Date: 2014-10-25 14:57 +0200
http://bitbucket.org/pypy/pypy/changeset/e768de5dd66a/
Log: fix some nonsense with other nonsense
diff --git a/rpython/annotator/bookkeeper.py b/rpython/annotator/bookkeeper.py
--- a/rpython/annotator/bookkeeper.py
+++ b/rpython/annotator/bookkeeper.py
@@ -362,6 +362,10 @@
# * a frozen pre-built constant (with _freeze_() == True)
# * a bound method of a frozen pre-built constant
try:
+ pyobj = normalize_method(pyobj)
+ except ValueError:
+ pass
+ try:
return self.descs[pyobj]
except KeyError:
if is_user_function(pyobj):
diff --git a/rpython/annotator/description.py b/rpython/annotator/description.py
--- a/rpython/annotator/description.py
+++ b/rpython/annotator/description.py
@@ -7,6 +7,7 @@
from rpython.tool.sourcetools import valid_identifier, func_with_new_name
from rpython.tool.pairtype import extendabletype
from rpython.annotator.model import AnnotatorError
+from rpython.tool.descriptor import normalize_method
class CallFamily(object):
"""A family of Desc objects that could be called from common call sites.
@@ -516,7 +517,10 @@
# pretend that built-in exceptions have no __init__,
# unless explicitly specified in builtin.py
from rpython.annotator.builtin import BUILTIN_ANALYZERS
- value = getattr(value, 'im_func', value)
+ try:
+ value = normalize_method(value)
+ except ValueError:
+ pass
if value not in BUILTIN_ANALYZERS:
return
self.classdict[name] = Constant(value)
diff --git a/rpython/rtyper/rbuiltin.py b/rpython/rtyper/rbuiltin.py
--- a/rpython/rtyper/rbuiltin.py
+++ b/rpython/rtyper/rbuiltin.py
@@ -7,6 +7,7 @@
from rpython.rtyper import rclass
from rpython.rtyper.rmodel import Repr
from rpython.tool.pairtype import pairtype
+from rpython.tool.descriptor import normalize_method
BUILTIN_TYPER = {}
@@ -276,13 +277,12 @@
return hop.r_result.newiter(hop)
- at typer_for(getattr(object.__init__, 'im_func', object.__init__))
+ at typer_for(normalize_method(object.__init__))
def rtype_object__init__(hop):
hop.exception_cannot_occur()
- at typer_for(getattr(EnvironmentError.__init__, 'im_func',
- EnvironmentError.__init__))
+ at typer_for(normalize_method(EnvironmentError.__init__))
def rtype_EnvironmentError__init__(hop):
hop.exception_cannot_occur()
v_self = hop.args_v[0]
@@ -306,8 +306,7 @@
except NameError:
pass
else:
- @typer_for(
- getattr(WindowsError.__init__, 'im_func', WindowsError.__init__))
+ @typer_for(normalize_method(WindowsError.__init__))
def rtype_WindowsError__init__(hop):
hop.exception_cannot_occur()
if hop.nb_args == 2:
diff --git a/rpython/tool/descriptor.py b/rpython/tool/descriptor.py
--- a/rpython/tool/descriptor.py
+++ b/rpython/tool/descriptor.py
@@ -36,8 +36,10 @@
if '__pypy__' in sys.modules:
def normalize_method(method):
- '''Turn everything that behaves like a method into an InstanceMethod object'''
+ '''Turn everything that behaves like a method into a regular function or an InstanceMethod object'''
if isinstance(method, types.MethodType):
+ if method.__self__ is None:
+ return method.im_func
return InstanceMethod(method.__func__, method.__self__, method.im_class)
else:
raise ValueError('Not a method')
@@ -48,8 +50,10 @@
method_descriptor = type(str.join)
def normalize_method(method):
- '''Turn everything that behaves like a method into an InstanceMethod object'''
+ '''Turn everything that behaves like a method into a regular function or an InstanceMethod object'''
if isinstance(method, types.MethodType):
+ if method.__self__ is None:
+ return method.__func__
return InstanceMethod(method.__func__, method.__self__, method.im_class)
elif isinstance(method, types.BuiltinMethodType):
im_self = method.__self__
More information about the pypy-commit
mailing list