builtin_dir():  Treat classic classes like types.  Use PyDict_Keys instead
of PyMapping_Keys because we know we have a real dict.  Tolerate that
objects may have an attr named "__dict__" that's not a dict (Py_None
popped up during testing).

test_descr.py, test_dir():  Test the new classic-class behavior; beef up
the new-style class test similarly.

test_pyclbr.py, checkModule():  dir(C) is no longer a synonym for
C.__dict__.keys() when C is a classic class (looks like the same thing
that burned distutils! -- should it be *made* a synoym again?  Then it
would be inconsistent with new-style class behavior.).
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index ee924dc..dd411ac 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -183,8 +183,7 @@
     for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
         dir(arg)
 
-    # Check some details here because classic classes aren't working
-    # reasonably, and I want this to fail (eventually).
+    # Try classic classes.
     class C:
         Cdata = 1
         def Cmethod(self): pass
@@ -202,23 +201,45 @@
     class A(C):
         Adata = 1
         def Amethod(self): pass
-    astuff = ['Adata', 'Amethod', '__doc__', '__module__']
-    # This isn't finding C's stuff at all.
-    verify(dir(A) == astuff)
-    # But this is!  It's because a.__class__ exists but A.__class__ doesn't.
-    a = A()
-    verify(dir(a) == astuff[:2] + cstuff)
 
-    # The story for new-style classes is quite different.
+    astuff = ['Adata', 'Amethod'] + cstuff
+    verify(dir(A) == astuff)
+    a = A()
+    verify(dir(a) == astuff)
+    a.adata = 42
+    a.amethod = lambda self: 3
+    verify(dir(a) == astuff + ['adata', 'amethod'])
+
+    # The same, but with new-style classes.  Since these have object as a
+    # base class, a lot more gets sucked in.
+    def interesting(strings):
+        return [s for s in strings if not s.startswith('_')]
+
     class C(object):
         Cdata = 1
         def Cmethod(self): pass
+
+    cstuff = ['Cdata', 'Cmethod']
+    verify(interesting(dir(C)) == cstuff)
+
+    c = C()
+    verify(interesting(dir(c)) == cstuff)
+
+    c.cdata = 2
+    c.cmethod = lambda self: 0
+    verify(interesting(dir(c)) == cstuff + ['cdata', 'cmethod'])
+
     class A(C):
         Adata = 1
         def Amethod(self): pass
-    d = dir(A)
-    for expected in 'Cdata', 'Cmethod', 'Adata', 'Amethod':
-        verify(expected in d)
+
+    astuff = ['Adata', 'Amethod'] + cstuff
+    verify(interesting(dir(A)) == astuff)
+    a = A()
+    verify(interesting(dir(a)) == astuff)
+    a.adata = 42
+    a.amethod = lambda self: 3
+    verify(interesting(dir(a)) == astuff + ['adata', 'amethod'])
 
 binops = {
     'add': '+',
diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py
index e5de657..ce4d8ac 100644
--- a/Lib/test/test_pyclbr.py
+++ b/Lib/test/test_pyclbr.py
@@ -76,7 +76,7 @@
                 self.assertListEq(real_bases, pyclbr_bases, ignore)
 
                 actualMethods = []
-                for m in dir(py_item):
+                for m in py_item.__dict__.keys():
                     if type(getattr(py_item, m)) == MethodType:
                         actualMethods.append(m)
                 foundMethods = []