Author: Benjamin Peterson <[email protected]>
Branch: 
Changeset: r44389:25ddcf115505
Date: 2011-05-23 17:50 -0500
http://bitbucket.org/pypy/pypy/changeset/25ddcf115505/

Log:    lookup __dir__ correctly

diff --git a/pypy/module/__builtin__/app_inspect.py 
b/pypy/module/__builtin__/app_inspect.py
--- a/pypy/module/__builtin__/app_inspect.py
+++ b/pypy/module/__builtin__/app_inspect.py
@@ -5,6 +5,8 @@
 
 import sys
 
+from __pypy__ import lookup_special
+
 def _caller_locals(): 
     # note: the reason why this is working is because the functions in here are
     # compiled by geninterp, so they don't have a frame
@@ -62,9 +64,9 @@
 
     obj = args[0]
 
-
-    if hasattr(type(obj), "__dir__"):
-        result = type(obj).__dir__(obj)
+    dir_meth = lookup_special(obj, "__dir__")
+    if dir_meth is not None:
+        result = dir_meth()
         if not isinstance(result, list):
             raise TypeError("__dir__() must return a list, not %r" % (
                 type(result),))
diff --git a/pypy/module/__builtin__/test/test_builtin.py 
b/pypy/module/__builtin__/test/test_builtin.py
--- a/pypy/module/__builtin__/test/test_builtin.py
+++ b/pypy/module/__builtin__/test/test_builtin.py
@@ -135,6 +135,15 @@
                 return ["blah"]
         assert dir(Foo("a_mod")) == ["blah"]
 
+    def test_dir_custom_lookup(self):
+        class M(type):
+            def __dir__(self, *args): return ["14"]
+        class X(object):
+            __metaclass__ = M
+        x = X()
+        x.__dir__ = lambda x: ["14"]
+        assert dir(x) != ["14"]
+
     def test_format(self):
         assert format(4) == "4"
         assert format(10, "o") == "12"
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to