[pypy-commit] pypy default: Fix TypeSubClass(object) to work like type(object)
alex_gaynor
noreply at buildbot.pypy.org
Fri Sep 30 20:34:05 CEST 2011
Author: Alex Gaynor <alex.gaynor at 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
More information about the pypy-commit
mailing list