[pypy-svn] r5542 - in pypy/trunk/src/pypy/interpreter: . test

arigo at codespeak.net arigo at codespeak.net
Tue Jul 13 11:58:39 CEST 2004


Author: arigo
Date: Tue Jul 13 11:58:37 2004
New Revision: 5542

Modified:
   pypy/trunk/src/pypy/interpreter/gateway.py
   pypy/trunk/src/pypy/interpreter/test/test_function.py
Log:
Checking the number of arguments in performance_shortcut_call().

Modified: pypy/trunk/src/pypy/interpreter/gateway.py
==============================================================================
--- pypy/trunk/src/pypy/interpreter/gateway.py	(original)
+++ pypy/trunk/src/pypy/interpreter/gateway.py	Tue Jul 13 11:58:37 2004
@@ -10,7 +10,7 @@
 
 """
 
-import types
+import types, sys
 from pypy.interpreter import eval, pycode
 from pypy.interpreter.function import Function, Method
 from pypy.interpreter.baseobjspace import Wrappable
@@ -76,6 +76,11 @@
             argnames[i] = a[2:]
 
         self.sig = argnames, varargname, kwargname
+        self.minargs = len(argnames)
+        if self.starargs:
+            self.maxargs = sys.maxint
+        else:
+            self.maxargs = self.minargs
 
     def create_frame(self, space, w_globals, closure=None):
         return BuiltinFrame(space, self, w_globals)
@@ -91,6 +96,8 @@
         if self.generalargs or args.kwds_w:
             return None
         args_w = args.args_w
+        if not (self.minargs <= len(args_w) <= self.maxargs):
+            return None
         if self.ismethod:
             if not args_w:
                 return None
@@ -114,6 +121,8 @@
         else:
             if args.kwds_w:
                 return None
+            if not (self.minargs <= 1+len(args.args_w) <= self.maxargs):
+                return None
             if self.ismethod:
                 w_obj = space.unwrap(w_obj) # abuse name w_obj
             if self.spacearg:

Modified: pypy/trunk/src/pypy/interpreter/test/test_function.py
==============================================================================
--- pypy/trunk/src/pypy/interpreter/test/test_function.py	(original)
+++ pypy/trunk/src/pypy/interpreter/test/test_function.py	Tue Jul 13 11:58:37 2004
@@ -136,6 +136,18 @@
         meth = func.__get__(obj, object)
         self.assertEquals(meth(), obj)
 
+    def test_call_builtin(self):
+        s = 'hello'
+        self.assertRaises(TypeError, len)
+        self.assertEquals(len(s), 5)
+        self.assertRaises(TypeError, len, s, s)
+        self.assertRaises(TypeError, len, s, s, s)
+        self.assertEquals(len(*[s]), 5)
+        self.assertEquals(len(s, *[]), 5)
+        self.assertRaises(TypeError, len, some_unknown_keyword=s)
+        self.assertRaises(TypeError, len, s, some_unknown_keyword=s)
+        self.assertRaises(TypeError, len, s, s, some_unknown_keyword=s)
+
 class AppTestMethod(testit.AppTestCase):
 
     def test_get(self):



More information about the Pypy-commit mailing list