Author: Ronan Lamy <ronan.l...@gmail.com> Branch: Changeset: r71598:d11d5d0dc890 Date: 2014-05-20 02:28 +0100 http://bitbucket.org/pypy/pypy/changeset/d11d5d0dc890/
Log: Split SomeBuiltinMethod from SomeBuiltin diff --git a/rpython/annotator/binaryop.py b/rpython/annotator/binaryop.py --- a/rpython/annotator/binaryop.py +++ b/rpython/annotator/binaryop.py @@ -9,7 +9,7 @@ SomeObject, SomeInteger, SomeBool, s_Bool, SomeString, SomeChar, SomeList, SomeDict, SomeOrderedDict, SomeUnicodeCodePoint, SomeUnicodeString, SomeTuple, SomeImpossibleValue, s_ImpossibleValue, SomeInstance, - SomeBuiltin, SomeIterator, SomePBC, SomeFloat, s_None, SomeByteArray, + SomeBuiltinMethod, SomeIterator, SomePBC, SomeFloat, s_None, SomeByteArray, SomeWeakRef, SomeSingleFloat, SomeLongFloat, SomeType, SomeConstantType, unionof, UnionError, read_can_only_throw, add_knowntypedata, @@ -730,15 +730,14 @@ return SomeIterator(s_cont, *iter1.variant) -class __extend__(pairtype(SomeBuiltin, SomeBuiltin)): - +class __extend__(pairtype(SomeBuiltinMethod, SomeBuiltinMethod)): def union((bltn1, bltn2)): if (bltn1.analyser != bltn2.analyser or - bltn1.methodname != bltn2.methodname or - bltn1.s_self is None or bltn2.s_self is None): + bltn1.methodname != bltn2.methodname): raise UnionError(bltn1, bltn2) s_self = unionof(bltn1.s_self, bltn2.s_self) - return SomeBuiltin(bltn1.analyser, s_self, methodname=bltn1.methodname) + return SomeBuiltinMethod(bltn1.analyser, s_self, + methodname=bltn1.methodname) class __extend__(pairtype(SomePBC, SomePBC)): diff --git a/rpython/annotator/model.py b/rpython/annotator/model.py --- a/rpython/annotator/model.py +++ b/rpython/annotator/model.py @@ -533,6 +533,20 @@ return False +class SomeBuiltinMethod(SomeBuiltin): + """ Stands for a built-in method which has got special meaning + """ + def __init__(self, analyser, s_self, methodname): + if isinstance(analyser, MethodType): + analyser = descriptor.InstanceMethod( + analyser.im_func, + analyser.im_self, + analyser.im_class) + self.analyser = analyser + self.s_self = s_self + self.methodname = methodname + + class SomeImpossibleValue(SomeObject): """The empty set. Instances are placeholders for objects that will never show up at run-time, e.g. elements of an empty list.""" diff --git a/rpython/annotator/unaryop.py b/rpython/annotator/unaryop.py --- a/rpython/annotator/unaryop.py +++ b/rpython/annotator/unaryop.py @@ -7,8 +7,8 @@ from rpython.flowspace.operation import op from rpython.annotator.model import (SomeObject, SomeInteger, SomeBool, SomeString, SomeChar, SomeList, SomeDict, SomeTuple, SomeImpossibleValue, - SomeUnicodeCodePoint, SomeInstance, SomeBuiltin, SomeFloat, SomeIterator, - SomePBC, SomeType, s_ImpossibleValue, + SomeUnicodeCodePoint, SomeInstance, SomeBuiltin, SomeBuiltinMethod, + SomeFloat, SomeIterator, SomePBC, SomeType, s_ImpossibleValue, s_Bool, s_None, unionof, add_knowntypedata, HarmlesslyBlocked, SomeWeakRef, SomeUnicodeString, SomeByteArray) from rpython.annotator.bookkeeper import getbookkeeper, immutablevalue @@ -108,7 +108,7 @@ except AttributeError: return None else: - return SomeBuiltin(analyser, self, name) + return SomeBuiltinMethod(analyser, self, name) def getattr(self, s_attr): # get a SomeBuiltin if the SomeObject has diff --git a/rpython/rtyper/rbuiltin.py b/rpython/rtyper/rbuiltin.py --- a/rpython/rtyper/rbuiltin.py +++ b/rpython/rtyper/rbuiltin.py @@ -11,37 +11,32 @@ class __extend__(annmodel.SomeBuiltin): def rtyper_makerepr(self, rtyper): - if self.s_self is None: - # built-in function case - if not self.is_constant(): - raise TyperError("non-constant built-in function!") - return BuiltinFunctionRepr(self.const) - else: - # built-in method case - assert self.methodname is not None - result = BuiltinMethodRepr(rtyper, self.s_self, self.methodname) - return result + if not self.is_constant(): + raise TyperError("non-constant built-in function!") + return BuiltinFunctionRepr(self.const) + def rtyper_makekey(self): - if self.s_self is None: - # built-in function case + const = getattr(self, 'const', None) + if extregistry.is_registered(const): + const = extregistry.lookup(const) + return self.__class__, const - const = getattr(self, 'const', None) +class __extend__(annmodel.SomeBuiltinMethod): + def rtyper_makerepr(self, rtyper): + assert self.methodname is not None + result = BuiltinMethodRepr(rtyper, self.s_self, self.methodname) + return result - if extregistry.is_registered(const): - const = extregistry.lookup(const) - - return self.__class__, const - else: - # built-in method case - # NOTE: we hash by id of self.s_self here. This appears to be - # necessary because it ends up in hop.args_s[0] in the method call, - # and there is no telling what information the called - # rtype_method_xxx() will read from that hop.args_s[0]. - # See test_method_join in test_rbuiltin. - # There is no problem with self.s_self being garbage-collected and - # its id reused, because the BuiltinMethodRepr keeps a reference - # to it. - return (self.__class__, self.methodname, id(self.s_self)) + def rtyper_makekey(self): + # NOTE: we hash by id of self.s_self here. This appears to be + # necessary because it ends up in hop.args_s[0] in the method call, + # and there is no telling what information the called + # rtype_method_xxx() will read from that hop.args_s[0]. + # See test_method_join in test_rbuiltin. + # There is no problem with self.s_self being garbage-collected and + # its id reused, because the BuiltinMethodRepr keeps a reference + # to it. + return (self.__class__, self.methodname, id(self.s_self)) def call_args_expand(hop, takes_kwds = True): hop = hop.copy() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit