Author: Carl Friedrich Bolz <cfb...@gmx.de> Branch: space-newtext Changeset: r89101:4d6b02c8898d Date: 2016-12-16 16:53 +0100 http://bitbucket.org/pypy/pypy/changeset/4d6b02c8898d/
Log: gave up finding the root cause of this translation problem, and instead enforce some W_Root types in gateway.py. (why things have to be None is another sad story) diff --git a/pypy/interpreter/gateway.py b/pypy/interpreter/gateway.py --- a/pypy/interpreter/gateway.py +++ b/pypy/interpreter/gateway.py @@ -27,6 +27,9 @@ from rpython.rlib.rarithmetic import r_longlong, r_int, r_ulonglong, r_uint from rpython.tool.sourcetools import func_with_new_name, compile2 +from rpython.rlib.signature import signature, finishsigs +from rpython.rlib import types as sigtypes + # internal non-translatable parts: class SignatureBuilder(object): @@ -795,11 +798,17 @@ w_result = space.w_None return w_result +w_root_or_none = sigtypes.instance(W_Root, can_be_None=True) +@finishsigs class BuiltinCode1(BuiltinCode): _immutable_ = True fast_natural_arity = 1 + @signature(sigtypes.self(), sigtypes.any(), + w_root_or_none, + w_root_or_none, + returns=w_root_or_none) def fastcall_1(self, space, w_func, w1): try: w_result = self.fastfunc_1(space, w1) @@ -816,10 +825,16 @@ return w_result +@finishsigs class BuiltinCode2(BuiltinCode): _immutable_ = True fast_natural_arity = 2 + @signature(sigtypes.self(), sigtypes.any(), + w_root_or_none, + w_root_or_none, + w_root_or_none, + returns=w_root_or_none) def fastcall_2(self, space, w_func, w1, w2): try: w_result = self.fastfunc_2(space, w1, w2) @@ -836,10 +851,17 @@ return w_result +@finishsigs class BuiltinCode3(BuiltinCode): _immutable_ = True fast_natural_arity = 3 + @signature(sigtypes.self(), sigtypes.any(), + w_root_or_none, + w_root_or_none, + w_root_or_none, + w_root_or_none, + returns=w_root_or_none) def fastcall_3(self, space, func, w1, w2, w3): try: w_result = self.fastfunc_3(space, w1, w2, w3) @@ -855,12 +877,20 @@ w_result = space.w_None return w_result - +@finishsigs class BuiltinCode4(BuiltinCode): _immutable_ = True fast_natural_arity = 4 + @signature(sigtypes.self(), sigtypes.any(), + w_root_or_none, + w_root_or_none, + w_root_or_none, + w_root_or_none, + w_root_or_none, + returns=w_root_or_none) def fastcall_4(self, space, func, w1, w2, w3, w4): + from rpython.rlib.debug import check_annotation try: w_result = self.fastfunc_4(space, w1, w2, w3, w4) except DescrMismatch: diff --git a/rpython/rlib/test/test_signature.py b/rpython/rlib/test/test_signature.py --- a/rpython/rlib/test/test_signature.py +++ b/rpython/rlib/test/test_signature.py @@ -221,6 +221,36 @@ @check_annotator_fails def bad_for_body(): f(C1()) + @check_annotator_fails + def ok_for_body(): + f(None) + +def test_instance_or_none(): + class C1(object): + pass + class C2(C1): + pass + class C3(C2): + pass + @signature(types.instance(C3, can_be_None=True), returns=types.instance(C2, can_be_None=True)) + def f(x): + assert isinstance(x, C2) or x is None + return x + argtype, rettype = getsig(f) + assert isinstance(argtype, model.SomeInstance) + assert argtype.classdef.classdesc.pyobj == C3 + assert argtype.can_be_None + assert isinstance(rettype, model.SomeInstance) + assert rettype.classdef.classdesc.pyobj == C2 + assert rettype.can_be_None + + @check_annotator_fails + def ok_for_body(): + f(C2()) + @check_annotator_fails + def bad_for_body(): + f(C1()) + def test_self(): @finishsigs diff --git a/rpython/rlib/types.py b/rpython/rlib/types.py --- a/rpython/rlib/types.py +++ b/rpython/rlib/types.py @@ -76,8 +76,8 @@ return model.SomeDict(dictdef) -def instance(cls): - return lambda bookkeeper: model.SomeInstance(bookkeeper.getuniqueclassdef(cls)) +def instance(cls, can_be_None=False): + return lambda bookkeeper: model.SomeInstance(bookkeeper.getuniqueclassdef(cls), can_be_None=can_be_None) class SelfTypeMarker(object): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit