[pypy-svn] r49754 - in pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Fri Dec 14 00:17:21 CET 2007


Author: cfbolz
Date: Fri Dec 14 00:17:20 2007
New Revision: 49754

Modified:
   pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py
   pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py
Log:
make instance.__new__ work


Modified: pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py
==============================================================================
--- pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py	(original)
+++ pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py	Fri Dec 14 00:17:20 2007
@@ -255,6 +255,18 @@
         return [None, None]
     return space.unpacktuple(w_tup, 2)
 
+def descr_instance_new(space, w_type, w_class, w_dict=None):
+    # w_type is not used at all
+    if not isinstance(w_class, W_ClassObject):
+        raise OperationError(
+            space.w_TypeError,
+            space.wrap("instance() first arg must be class"))
+    if w_dict is None:
+        w_dict = space.newdict()
+    elif not space.is_true(space.isinstance(w_dict, space.w_dict)):
+        raise TypeError("instance() second arg must be dictionary or None")
+    return W_InstanceObject(space, w_class, w_dict)
+
 class W_InstanceObject(Wrappable):
     def __init__(self, space, w_class, w_dict=None):
         if w_dict is None:
@@ -281,17 +293,6 @@
                 space.wrap("__class__ must be set to a class"))
         self.w_class = w_class
 
-    def descr_new(space, w_type, w_class, w_dict=None):
-        # typ is not used at all
-        if not isinstance(w_class, W_ClassObject):
-            raise OperationError(
-                space.w_TypeError,
-                space.wrap("instance() first arg must be class"))
-        if w_dict is None:
-            w_dict = space.newdict()
-        elif not space.is_true(space.isinstance(w_dict, space.w_dict)):
-            raise TypeError("instance() second arg must be dictionary or None")
-        return W_InstanceObject(space, w_class, w_dict)
 
     def getattr(self, space, w_name, exc=True):
         name = space.str_w(w_name)
@@ -621,7 +622,7 @@
         unwrap_spec=["self", ObjSpace, W_Root])
 
 W_InstanceObject.typedef = TypeDef("instance",
-    __new__ = interp2app(W_InstanceObject.descr_new),
+    __new__ = interp2app(descr_instance_new),
     __getattribute__ = interp2app(W_InstanceObject.descr_getattribute,
                                   unwrap_spec=['self', ObjSpace, W_Root]),
     __setattr__ = interp2app(W_InstanceObject.descr_setattr,

Modified: pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py
==============================================================================
--- pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py	(original)
+++ pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py	Fri Dec 14 00:17:20 2007
@@ -569,3 +569,11 @@
         raises(TypeError, "_classobj('abc', 1, {})")
         raises(TypeError, "_classobj('abc', (1, ), {})")
         raises(TypeError, "_classobj('abc', (), 3)")
+
+    def test_instance_new(self):
+        class A:
+            b = 1
+        a = A()
+        a = type(a).__new__(type(a), A, {'c': 2})
+        assert a.b == 1
+        assert a.c == 2



More information about the Pypy-commit mailing list