Author: Greg Price <pr...@mit.edu> Branch: signatures Changeset: r59308:7ad4dbce9497 Date: 2012-12-02 15:20 -0800 http://bitbucket.org/pypy/pypy/changeset/7ad4dbce9497/
Log: Check actual arguments against signature diff --git a/pypy/annotation/signature.py b/pypy/annotation/signature.py --- a/pypy/annotation/signature.py +++ b/pypy/annotation/signature.py @@ -133,7 +133,15 @@ def enforce_signature_args(funcdesc, argtypes, inputcells): + assert len(argtypes) == len(inputcells) args_s = [] for i, argtype in enumerate(argtypes): args_s.append(annotation(argtype, bookkeeper=funcdesc.bookkeeper)) + for i, (s_arg, s_input) in enumerate(zip(args_s, inputcells)): + if not s_arg.contains(s_input): + raise Exception("%r argument %d:\n" + "expected %s,\n" + " got %s" % (funcdesc, i+1, + s_arg, + s_input)) inputcells[:] = args_s diff --git a/pypy/rlib/test/test_objectmodel.py b/pypy/rlib/test/test_objectmodel.py --- a/pypy/rlib/test/test_objectmodel.py +++ b/pypy/rlib/test/test_objectmodel.py @@ -511,6 +511,24 @@ return a + len(b) assert getsig(f) == [model.SomeInteger(), model.SomeString(), model.SomeInteger()] +def test_signature_errors(): + @signature(types.int(), types.str(), returns=types.int()) + def f(a, b): + return a + len(b) + def ok_for_body(): # would give no error without signature + f(2.0, 'b') + def bad_for_body(): # would give error inside 'f' body, instead errors at call + f('a', 'b') + + def check_fails(caller): + t = TranslationContext() + a = t.buildannotator() + exc = py.test.raises(Exception, a.annotate_helper, caller, []).value + assert caller.func_name in repr(exc.args) + + check_fails(ok_for_body) + check_fails(bad_for_body) + def getgraph(f, argtypes): from pypy.translator.translator import TranslationContext, graphof _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit