Author: Alex Gaynor <alex.gay...@gmail.com> Branch: Changeset: r47726:bd078728c56a Date: 2011-09-30 14:33 -0400 http://bitbucket.org/pypy/pypy/changeset/bd078728c56a/
Log: Fix TypeSubClass(object) to work like type(object) diff --git a/pypy/objspace/std/test/test_typeobject.py b/pypy/objspace/std/test/test_typeobject.py --- a/pypy/objspace/std/test/test_typeobject.py +++ b/pypy/objspace/std/test/test_typeobject.py @@ -126,6 +126,12 @@ raises(TypeError, type, 'test', 42, {}) raises(TypeError, type, 'test', (object,), 42) + def test_call_type_subclass(self): + class A(type): + pass + + assert A("hello") is str + def test_bases(self): assert int.__bases__ == (object,) class X: diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py --- a/pypy/objspace/std/typeobject.py +++ b/pypy/objspace/std/typeobject.py @@ -822,14 +822,6 @@ def call__Type(space, w_type, __args__): promote(w_type) - # special case for type(x) - if space.is_w(w_type, space.w_type): - try: - w_obj, = __args__.fixedunpack(1) - except ValueError: - pass - else: - return space.type(w_obj) # invoke the __new__ of the type if not we_are_jitted(): # note that the annotator will figure out that w_type.w_bltin_new can diff --git a/pypy/objspace/std/typetype.py b/pypy/objspace/std/typetype.py --- a/pypy/objspace/std/typetype.py +++ b/pypy/objspace/std/typetype.py @@ -1,17 +1,28 @@ -from pypy.interpreter.error import OperationError, operationerrfmt from pypy.interpreter import gateway from pypy.interpreter.argument import Arguments +from pypy.interpreter.error import OperationError, operationerrfmt from pypy.interpreter.typedef import (GetSetProperty, descr_get_dict, weakref_descr) from pypy.objspace.std.stdtypedef import StdTypeDef -def descr__new__(space, w_typetype, w_name, w_bases, w_dict): + +def descr__new__(space, w_typetype, w_name, w_bases=gateway.NoneNotWrapped, + w_dict=gateway.NoneNotWrapped): + "This is used to create user-defined classes only." from pypy.objspace.std.typeobject import W_TypeObject # XXX check types w_typetype = _precheck_for_new(space, w_typetype) + # special case for type(x) + if (space.is_w(space.type(w_typetype), space.w_type) and w_bases is None and + w_dict is None): + return space.type(w_name) + elif w_bases is None or w_dict is None: + raise OperationError(space.w_TypeError, space.wrap("type() takes 1 or 3 arguments")) + + bases_w = space.fixedview(w_bases) w_winner = w_typetype _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit