Author: Matti Picus <[email protected]>
Branch: cpyext-pickle
Changeset: r84713:874feb6ee033
Date: 2016-05-26 22:22 +0300
http://bitbucket.org/pypy/pypy/changeset/874feb6ee033/
Log: merge default into branch
diff too long, truncating to 2000 out of 2136 lines
diff --git a/lib_pypy/cffi/commontypes.py b/lib_pypy/cffi/commontypes.py
--- a/lib_pypy/cffi/commontypes.py
+++ b/lib_pypy/cffi/commontypes.py
@@ -35,8 +35,11 @@
"you call ffi.set_unicode()" % (commontype,))
else:
if commontype == cdecl:
- raise api.FFIError("Unsupported type: %r. Please file a bug "
- "if you think it should be." %
(commontype,))
+ raise api.FFIError(
+ "Unsupported type: %r. Please look at "
+ "http://cffi.readthedocs.io/en/latest/cdef.html#ffi-cdef-limitations "
+ "and file an issue if you think this type should really "
+ "be supported." % (commontype,))
result, quals = parser.parse_type_and_quals(cdecl) # recursive
assert isinstance(result, model.BaseTypeByIdentity)
diff --git a/pypy/interpreter/astcompiler/test/test_ast.py
b/pypy/interpreter/astcompiler/test/test_ast.py
--- a/pypy/interpreter/astcompiler/test/test_ast.py
+++ b/pypy/interpreter/astcompiler/test/test_ast.py
@@ -1,8 +1,8 @@
from pypy.interpreter.astcompiler import ast
class TestAstToObject:
def test_types(self, space):
- assert space.is_true(space.issubtype(
- ast.get(space).w_Module, ast.get(space).w_mod))
+ assert space.issubtype_w(
+ ast.get(space).w_Module, ast.get(space).w_mod)
def test_num(self, space):
value = space.wrap(42)
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -1215,7 +1215,7 @@
def abstract_issubclass_w(self, w_cls1, w_cls2):
# Equivalent to 'issubclass(cls1, cls2)'.
- return self.is_true(self.issubtype(w_cls1, w_cls2))
+ return self.issubtype_w(w_cls1, w_cls2)
def abstract_isinstance_w(self, w_obj, w_cls):
# Equivalent to 'isinstance(obj, cls)'.
@@ -1237,16 +1237,16 @@
def exception_is_valid_obj_as_class_w(self, w_obj):
if not self.isinstance_w(w_obj, self.w_type):
return False
- return self.is_true(self.issubtype(w_obj, self.w_BaseException))
+ return self.issubtype_w(w_obj, self.w_BaseException)
def exception_is_valid_class_w(self, w_cls):
- return self.is_true(self.issubtype(w_cls, self.w_BaseException))
+ return self.issubtype_w(w_cls, self.w_BaseException)
def exception_getclass(self, w_obj):
return self.type(w_obj)
def exception_issubclass_w(self, w_cls1, w_cls2):
- return self.is_true(self.issubtype(w_cls1, w_cls2))
+ return self.issubtype_w(w_cls1, w_cls2)
def new_exception_class(self, *args, **kwargs):
"NOT_RPYTHON; convenience method to create excceptions in modules"
diff --git a/pypy/module/__builtin__/__init__.py
b/pypy/module/__builtin__/__init__.py
--- a/pypy/module/__builtin__/__init__.py
+++ b/pypy/module/__builtin__/__init__.py
@@ -86,8 +86,8 @@
'max' : 'functional.max',
'reversed' : 'functional.reversed',
'super' : 'descriptor.W_Super',
- 'staticmethod' : 'descriptor.StaticMethod',
- 'classmethod' : 'descriptor.ClassMethod',
+ 'staticmethod' : 'pypy.interpreter.function.StaticMethod',
+ 'classmethod' : 'pypy.interpreter.function.ClassMethod',
'property' : 'descriptor.W_Property',
'globals' : 'interp_inspect.globals',
diff --git a/pypy/module/__builtin__/abstractinst.py
b/pypy/module/__builtin__/abstractinst.py
--- a/pypy/module/__builtin__/abstractinst.py
+++ b/pypy/module/__builtin__/abstractinst.py
@@ -76,11 +76,10 @@
w_pretendtype = space.getattr(w_obj, space.wrap('__class__'))
if space.is_w(w_pretendtype, space.type(w_obj)):
return False # common case: obj.__class__ is type(obj)
- if allow_override:
- w_result = space.issubtype_allow_override(w_pretendtype,
- w_klass_or_tuple)
- else:
- w_result = space.issubtype(w_pretendtype, w_klass_or_tuple)
+ if not allow_override:
+ return space.issubtype_w(w_pretendtype, w_klass_or_tuple)
+ w_result = space.issubtype_allow_override(w_pretendtype,
+ w_klass_or_tuple)
except OperationError as e:
if e.async(space):
raise
@@ -137,11 +136,9 @@
# -- case (type, type)
try:
- if allow_override:
- w_result = space.issubtype_allow_override(w_derived,
- w_klass_or_tuple)
- else:
- w_result = space.issubtype(w_derived, w_klass_or_tuple)
+ if not allow_override:
+ return space.issubtype_w(w_derived, w_klass_or_tuple)
+ w_result = space.issubtype_allow_override(w_derived, w_klass_or_tuple)
except OperationError as e: # if one of the args was not a type, ignore
it
if not e.match(space, space.w_TypeError):
raise # propagate other errors
diff --git a/pypy/module/__builtin__/descriptor.py
b/pypy/module/__builtin__/descriptor.py
--- a/pypy/module/__builtin__/descriptor.py
+++ b/pypy/module/__builtin__/descriptor.py
@@ -1,31 +1,39 @@
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.error import OperationError, oefmt
-from pypy.interpreter.function import StaticMethod, ClassMethod
-from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
-from pypy.interpreter.typedef import (TypeDef, interp_attrproperty_w,
- generic_new_descr)
+from pypy.interpreter.gateway import WrappedDefault, interp2app, unwrap_spec
+from pypy.interpreter.typedef import (
+ TypeDef, generic_new_descr, interp_attrproperty_w)
from pypy.objspace.descroperation import object_getattribute
class W_Super(W_Root):
- def __init__(self, space, w_starttype, w_objtype, w_self):
+
+ def __init__(self, space):
+ self.w_starttype = None
+ self.w_objtype = None
+ self.w_self = None
+
+ def descr_init(self, space, w_starttype, w_obj_or_type=None):
+ if space.is_none(w_obj_or_type):
+ w_type = None # unbound super object
+ w_obj_or_type = space.w_None
+ else:
+ w_type = _super_check(space, w_starttype, w_obj_or_type)
self.w_starttype = w_starttype
- self.w_objtype = w_objtype
- self.w_self = w_self
+ self.w_objtype = w_type
+ self.w_self = w_obj_or_type
def get(self, space, w_obj, w_type=None):
- w = space.wrap
if self.w_self is None or space.is_w(w_obj, space.w_None):
- return w(self)
+ return self
else:
# if type(self) is W_Super:
# XXX write a fast path for this common case
- w_selftype = space.type(w(self))
+ w_selftype = space.type(self)
return space.call_function(w_selftype, self.w_starttype, w_obj)
- @unwrap_spec(name=str)
- def getattribute(self, space, name):
- w = space.wrap
+ def getattribute(self, space, w_name):
+ name = space.str_w(w_name)
# only use a special logic for bound super objects and not for
# getting the __class__ of the super object itself.
if self.w_objtype is not None and name != '__class__':
@@ -45,44 +53,42 @@
return space.get_and_call_function(w_get, w_value,
w_obj, self.w_objtype)
# fallback to object.__getattribute__()
- return space.call_function(object_getattribute(space),
- w(self), w(name))
+ return space.call_function(object_getattribute(space), self, w_name)
-def descr_new_super(space, w_subtype, w_starttype, w_obj_or_type=None):
- if space.is_none(w_obj_or_type):
- w_type = None # unbound super object
- w_obj_or_type = space.w_None
- else:
- w_objtype = space.type(w_obj_or_type)
- if space.is_true(space.issubtype(w_objtype, space.w_type)) and \
- space.is_true(space.issubtype(w_obj_or_type, w_starttype)):
- w_type = w_obj_or_type # special case for class methods
- elif space.is_true(space.issubtype(w_objtype, w_starttype)):
- w_type = w_objtype # normal case
- else:
- try:
- w_type = space.getattr(w_obj_or_type, space.wrap('__class__'))
- except OperationError as o:
- if not o.match(space, space.w_AttributeError):
- raise
- w_type = w_objtype
- if not space.is_true(space.issubtype(w_type, w_starttype)):
- raise oefmt(space.w_TypeError,
- "super(type, obj): obj must be an instance or "
- "subtype of type")
- # XXX the details of how allocate_instance() should be used are not
- # really well defined
- w_result = space.allocate_instance(W_Super, w_subtype)
- W_Super.__init__(w_result, space, w_starttype, w_type, w_obj_or_type)
- return w_result
+def _super_check(space, w_starttype, w_obj_or_type):
+ """Check that the super() call makes sense. Returns a type"""
+ w_objtype = space.type(w_obj_or_type)
+
+ if (space.issubtype_w(w_objtype, space.w_type) and
+ space.issubtype_w(w_obj_or_type, w_starttype)):
+ # special case for class methods
+ return w_obj_or_type
+
+ if space.issubtype_w(w_objtype, w_starttype):
+ # normal case
+ return w_objtype
+
+ try:
+ w_type = space.getattr(w_obj_or_type, space.wrap('__class__'))
+ except OperationError as e:
+ if not e.match(space, space.w_AttributeError):
+ raise
+ w_type = w_objtype
+
+ if space.issubtype_w(w_type, w_starttype):
+ return w_type
+ raise oefmt(space.w_TypeError,
+ "super(type, obj): obj must be an instance or subtype of type")
W_Super.typedef = TypeDef(
'super',
- __new__ = interp2app(descr_new_super),
+ __new__ = generic_new_descr(W_Super),
+ __init__ = interp2app(W_Super.descr_init),
__thisclass__ = interp_attrproperty_w("w_starttype", W_Super),
__getattribute__ = interp2app(W_Super.getattribute),
__get__ = interp2app(W_Super.get),
- __doc__ = """super(type) -> unbound super object
+ __doc__ = """\
+super(type) -> unbound super object
super(type, obj) -> bound super object; requires isinstance(obj, type)
super(type, type2) -> bound super object; requires issubclass(type2, type)
@@ -100,10 +106,10 @@
def __init__(self, space):
pass
- @unwrap_spec(w_fget = WrappedDefault(None),
- w_fset = WrappedDefault(None),
- w_fdel = WrappedDefault(None),
- w_doc = WrappedDefault(None))
+ @unwrap_spec(w_fget=WrappedDefault(None),
+ w_fset=WrappedDefault(None),
+ w_fdel=WrappedDefault(None),
+ w_doc=WrappedDefault(None))
def init(self, space, w_fget=None, w_fset=None, w_fdel=None, w_doc=None):
self.w_fget = w_fget
self.w_fset = w_fset
@@ -113,18 +119,17 @@
# our __doc__ comes from the getter if we don't have an explicit one
if (space.is_w(self.w_doc, space.w_None) and
not space.is_w(self.w_fget, space.w_None)):
- w_getter_doc = space.findattr(self.w_fget, space.wrap("__doc__"))
+ w_getter_doc = space.findattr(self.w_fget, space.wrap('__doc__'))
if w_getter_doc is not None:
if type(self) is W_Property:
self.w_doc = w_getter_doc
else:
- space.setattr(space.wrap(self), space.wrap("__doc__"),
- w_getter_doc)
+ space.setattr(self, space.wrap('__doc__'), w_getter_doc)
self.getter_doc = True
def get(self, space, w_obj, w_objtype=None):
if space.is_w(w_obj, space.w_None):
- return space.wrap(self)
+ return self
if space.is_w(self.w_fget, space.w_None):
raise oefmt(space.w_AttributeError, "unreadable attribute")
return space.call_function(self.w_fget, w_obj)
@@ -162,11 +167,13 @@
else:
w_doc = self.w_doc
w_type = self.getclass(space)
- return space.call_function(w_type, w_getter, w_setter, w_deleter,
w_doc)
+ return space.call_function(w_type, w_getter, w_setter, w_deleter,
+ w_doc)
W_Property.typedef = TypeDef(
'property',
- __doc__ = '''property(fget=None, fset=None, fdel=None, doc=None) ->
property attribute
+ __doc__ = '''\
+property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
fget is a function to be used for getting an attribute value, and likewise
fset is a function for setting, and fdel a function for deleting, an
diff --git a/pypy/module/__builtin__/functional.py
b/pypy/module/__builtin__/functional.py
--- a/pypy/module/__builtin__/functional.py
+++ b/pypy/module/__builtin__/functional.py
@@ -145,8 +145,17 @@
else:
compare = space.lt
jitdriver = min_jitdriver
+ any_kwds = bool(args.keywords)
args_w = args.arguments_w
if len(args_w) > 1:
+ if unroll and len(args_w) == 2 and not any_kwds:
+ # a fast path for the common case, useful for interpreted
+ # mode and to reduce the length of the jit trace
+ w0, w1 = args_w
+ if space.is_true(compare(w1, w0)):
+ return w1
+ else:
+ return w0
w_sequence = space.newtuple(args_w)
elif len(args_w):
w_sequence = args_w[0]
@@ -155,8 +164,8 @@
"%s() expects at least one argument",
implementation_of)
w_key = None
- kwds = args.keywords
- if kwds:
+ if any_kwds:
+ kwds = args.keywords
if kwds[0] == "key" and len(kwds) == 1:
w_key = args.keywords_w[0]
else:
diff --git a/pypy/module/__builtin__/test/test_functional.py
b/pypy/module/__builtin__/test/test_functional.py
--- a/pypy/module/__builtin__/test/test_functional.py
+++ b/pypy/module/__builtin__/test/test_functional.py
@@ -296,6 +296,11 @@
assert min([1, 2, 3]) == 1
raises(TypeError, min, 1, 2, bar=2)
raises(TypeError, min, 1, 2, key=lambda x: x, bar=2)
+ assert type(min(1, 1.0)) is int
+ assert type(min(1.0, 1)) is float
+ assert type(min(1, 1.0, 1L)) is int
+ assert type(min(1.0, 1L, 1)) is float
+ assert type(min(1L, 1, 1.0)) is long
def test_max(self):
assert max(1, 2) == 2
@@ -303,3 +308,8 @@
assert max([1, 2, 3]) == 3
raises(TypeError, max, 1, 2, bar=2)
raises(TypeError, max, 1, 2, key=lambda x: x, bar=2)
+ assert type(max(1, 1.0)) is int
+ assert type(max(1.0, 1)) is float
+ assert type(max(1, 1.0, 1L)) is int
+ assert type(max(1.0, 1L, 1)) is float
+ assert type(max(1L, 1, 1.0)) is long
diff --git a/pypy/module/_cffi_backend/ctypeobj.py
b/pypy/module/_cffi_backend/ctypeobj.py
--- a/pypy/module/_cffi_backend/ctypeobj.py
+++ b/pypy/module/_cffi_backend/ctypeobj.py
@@ -233,10 +233,9 @@
# __________ app-level attributes __________
def dir(self):
space = self.space
- w_self = space.wrap(self)
lst = [space.wrap(name)
for name in _name_of_attributes
- if space.findattr(w_self, space.wrap(name)) is not None]
+ if space.findattr(self, space.wrap(name)) is not None]
return space.newlist(lst)
def _fget(self, attrchar):
diff --git a/pypy/module/_cffi_backend/lib_obj.py
b/pypy/module/_cffi_backend/lib_obj.py
--- a/pypy/module/_cffi_backend/lib_obj.py
+++ b/pypy/module/_cffi_backend/lib_obj.py
@@ -196,9 +196,13 @@
if is_getattr and attr == '__dict__':
return self.full_dict_copy()
if is_getattr and attr == '__class__':
- return self.space.type(self)
+ # used to be space.type(self). But HAAAAAACK!
+ # That makes help() behave correctly. I couldn't
+ # find a more reasonable way. Urgh.
+ from pypy.interpreter.module import Module
+ return self.space.gettypeobject(Module.typedef)
if is_getattr and attr == '__name__':
- return self.descr_repr()
+ return self.space.wrap("%s.lib" % self.libname)
raise oefmt(self.space.w_AttributeError,
"cffi library '%s' has no function, constant "
"or global variable named '%s'",
diff --git a/pypy/module/_cffi_backend/test/test_recompiler.py
b/pypy/module/_cffi_backend/test/test_recompiler.py
--- a/pypy/module/_cffi_backend/test/test_recompiler.py
+++ b/pypy/module/_cffi_backend/test/test_recompiler.py
@@ -1039,8 +1039,8 @@
assert MYFOO == 42
assert hasattr(lib, '__dict__')
assert lib.__all__ == ['MYFOO', 'mybar'] # but not 'myvar'
- assert lib.__name__ == repr(lib)
- assert lib.__class__ is type(lib)
+ assert lib.__name__ == '_CFFI_test_import_from_lib.lib'
+ assert lib.__class__ is type(sys) # !! hack for help()
def test_macro_var_callback(self):
ffi, lib = self.prepare(
diff --git a/pypy/module/_collections/interp_deque.py
b/pypy/module/_collections/interp_deque.py
--- a/pypy/module/_collections/interp_deque.py
+++ b/pypy/module/_collections/interp_deque.py
@@ -389,20 +389,18 @@
def copy(self):
"Return a shallow copy of a deque."
space = self.space
- w_self = space.wrap(self)
if self.maxlen == sys.maxint:
- return space.call_function(space.type(w_self), w_self)
+ return space.call_function(space.type(self), self)
else:
- return space.call_function(space.type(w_self), w_self,
+ return space.call_function(space.type(self), self,
space.wrap(self.maxlen))
def reduce(self):
"Return state information for pickling."
space = self.space
- w_self = space.wrap(self)
- w_type = space.type(w_self)
- w_dict = space.findattr(w_self, space.wrap('__dict__'))
- w_list = space.call_function(space.w_list, w_self)
+ w_type = space.type(self)
+ w_dict = space.findattr(self, space.wrap('__dict__'))
+ w_list = space.call_function(space.w_list, self)
if w_dict is None:
if self.maxlen == sys.maxint:
result = [
diff --git a/pypy/module/_weakref/interp__weakref.py
b/pypy/module/_weakref/interp__weakref.py
--- a/pypy/module/_weakref/interp__weakref.py
+++ b/pypy/module/_weakref/interp__weakref.py
@@ -156,12 +156,12 @@
class W_WeakrefBase(W_Root):
- def __init__(w_self, space, w_obj, w_callable):
+ def __init__(self, space, w_obj, w_callable):
assert w_callable is not space.w_None # should be really None
- w_self.space = space
+ self.space = space
assert w_obj is not None
- w_self.w_obj_weak = weakref.ref(w_obj)
- w_self.w_callable = w_callable
+ self.w_obj_weak = weakref.ref(w_obj)
+ self.w_callable = w_callable
@jit.dont_look_inside
def dereference(self):
@@ -171,8 +171,8 @@
def clear(self):
self.w_obj_weak = dead_ref
- def activate_callback(w_self):
- w_self.space.call_function(w_self.w_callable, w_self)
+ def activate_callback(self):
+ self.space.call_function(self.w_callable, self)
def descr__repr__(self, space):
w_obj = self.dereference()
@@ -189,9 +189,9 @@
class W_Weakref(W_WeakrefBase):
- def __init__(w_self, space, w_obj, w_callable):
- W_WeakrefBase.__init__(w_self, space, w_obj, w_callable)
- w_self.w_hash = None
+ def __init__(self, space, w_obj, w_callable):
+ W_WeakrefBase.__init__(self, space, w_obj, w_callable)
+ self.w_hash = None
def descr__init__weakref(self, space, w_obj, w_callable=None,
__args__=None):
diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -706,7 +706,7 @@
w_obj_type = space.type(w_obj)
w_type = get_w_type(space)
return (space.is_w(w_obj_type, w_type) or
- space.is_true(space.issubtype(w_obj_type, w_type)))
+ space.issubtype_w(w_obj_type, w_type))
def check_exact(space, w_obj):
"Implements the Py_Xxx_CheckExact function"
w_obj_type = space.type(w_obj)
diff --git a/pypy/module/cpyext/cdatetime.py b/pypy/module/cpyext/cdatetime.py
--- a/pypy/module/cpyext/cdatetime.py
+++ b/pypy/module/cpyext/cdatetime.py
@@ -1,4 +1,5 @@
from rpython.rtyper.lltypesystem import rffi, lltype
+from rpython.rtyper.annlowlevel import llhelper
from pypy.module.cpyext.pyobject import PyObject, make_ref
from pypy.module.cpyext.api import (cpython_api, CANNOT_FAIL, cpython_struct,
PyObjectFields)
@@ -16,6 +17,23 @@
('TimeType', PyTypeObjectPtr),
('DeltaType', PyTypeObjectPtr),
('TZInfoType', PyTypeObjectPtr),
+
+ ('Date_FromDate', lltype.Ptr(lltype.FuncType(
+ [rffi.INT_real, rffi.INT_real, rffi.INT_real, PyTypeObjectPtr],
+ PyObject))),
+ ('Time_FromTime', lltype.Ptr(lltype.FuncType(
+ [rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real,
+ PyObject, PyTypeObjectPtr],
+ PyObject))),
+ ('DateTime_FromDateAndTime', lltype.Ptr(lltype.FuncType(
+ [rffi.INT_real, rffi.INT_real, rffi.INT_real,
+ rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real,
+ PyObject, PyTypeObjectPtr],
+ PyObject))),
+ ('Delta_FromDelta', lltype.Ptr(lltype.FuncType(
+ [rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real,
+ PyTypeObjectPtr],
+ PyObject))),
))
@cpython_api([], lltype.Ptr(PyDateTime_CAPI))
@@ -45,6 +63,19 @@
datetimeAPI.c_TZInfoType = rffi.cast(
PyTypeObjectPtr, make_ref(space, w_type))
+ datetimeAPI.c_Date_FromDate = llhelper(
+ _PyDate_FromDate.api_func.functype,
+ _PyDate_FromDate.api_func.get_wrapper(space))
+ datetimeAPI.c_Time_FromTime = llhelper(
+ _PyTime_FromTime.api_func.functype,
+ _PyTime_FromTime.api_func.get_wrapper(space))
+ datetimeAPI.c_DateTime_FromDateAndTime = llhelper(
+ _PyDateTime_FromDateAndTime.api_func.functype,
+ _PyDateTime_FromDateAndTime.api_func.get_wrapper(space))
+ datetimeAPI.c_Delta_FromDelta = llhelper(
+ _PyDelta_FromDelta.api_func.functype,
+ _PyDelta_FromDelta.api_func.get_wrapper(space))
+
return datetimeAPI
PyDateTime_DateStruct = lltype.ForwardReference()
@@ -94,36 +125,40 @@
make_check_function("PyDelta_Check", "timedelta")
make_check_function("PyTZInfo_Check", "tzinfo")
-# Constructors
+# Constructors. They are better used as macros.
-@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real], PyObject)
-def PyDate_FromDate(space, year, month, day):
+@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real, PyTypeObjectPtr],
+ PyObject)
+def _PyDate_FromDate(space, year, month, day, w_type):
"""Return a datetime.date object with the specified year, month and day.
"""
year = rffi.cast(lltype.Signed, year)
month = rffi.cast(lltype.Signed, month)
day = rffi.cast(lltype.Signed, day)
- w_datetime = PyImport_Import(space, space.wrap("datetime"))
- return space.call_method(
- w_datetime, "date",
+ return space.call_function(
+ w_type,
space.wrap(year), space.wrap(month), space.wrap(day))
-@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real],
PyObject)
-def PyTime_FromTime(space, hour, minute, second, usecond):
+@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real,
+ PyObject, PyTypeObjectPtr], PyObject)
+def _PyTime_FromTime(space, hour, minute, second, usecond, w_tzinfo, w_type):
"""Return a ``datetime.time`` object with the specified hour, minute,
second and
microsecond."""
hour = rffi.cast(lltype.Signed, hour)
minute = rffi.cast(lltype.Signed, minute)
second = rffi.cast(lltype.Signed, second)
usecond = rffi.cast(lltype.Signed, usecond)
- w_datetime = PyImport_Import(space, space.wrap("datetime"))
- return space.call_method(
- w_datetime, "time",
+ return space.call_function(
+ w_type,
space.wrap(hour), space.wrap(minute), space.wrap(second),
- space.wrap(usecond))
+ space.wrap(usecond), w_tzinfo)
-@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real,
rffi.INT_real, rffi.INT_real, rffi.INT_real], PyObject)
-def PyDateTime_FromDateAndTime(space, year, month, day, hour, minute, second,
usecond):
+@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real,
+ rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real,
+ PyObject, PyTypeObjectPtr], PyObject)
+def _PyDateTime_FromDateAndTime(space, year, month, day,
+ hour, minute, second, usecond,
+ w_tzinfo, w_type):
"""Return a datetime.datetime object with the specified year, month, day,
hour,
minute, second and microsecond.
"""
@@ -134,12 +169,11 @@
minute = rffi.cast(lltype.Signed, minute)
second = rffi.cast(lltype.Signed, second)
usecond = rffi.cast(lltype.Signed, usecond)
- w_datetime = PyImport_Import(space, space.wrap("datetime"))
- return space.call_method(
- w_datetime, "datetime",
+ return space.call_function(
+ w_type,
space.wrap(year), space.wrap(month), space.wrap(day),
space.wrap(hour), space.wrap(minute), space.wrap(second),
- space.wrap(usecond))
+ space.wrap(usecond), w_tzinfo)
@cpython_api([PyObject], PyObject)
def PyDateTime_FromTimestamp(space, w_args):
@@ -161,8 +195,10 @@
w_method = space.getattr(w_type, space.wrap("fromtimestamp"))
return space.call(w_method, w_args)
-@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real], PyObject)
-def PyDelta_FromDSU(space, days, seconds, useconds):
+@cpython_api([rffi.INT_real, rffi.INT_real, rffi.INT_real, rffi.INT_real,
+ PyTypeObjectPtr],
+ PyObject)
+def _PyDelta_FromDelta(space, days, seconds, useconds, normalize, w_type):
"""Return a datetime.timedelta object representing the given number of
days,
seconds and microseconds. Normalization is performed so that the resulting
number of microseconds and seconds lie in the ranges documented for
@@ -171,9 +207,8 @@
days = rffi.cast(lltype.Signed, days)
seconds = rffi.cast(lltype.Signed, seconds)
useconds = rffi.cast(lltype.Signed, useconds)
- w_datetime = PyImport_Import(space, space.wrap("datetime"))
- return space.call_method(
- w_datetime, "timedelta",
+ return space.call_function(
+ w_type,
space.wrap(days), space.wrap(seconds), space.wrap(useconds))
# Accessors
diff --git a/pypy/module/cpyext/include/datetime.h
b/pypy/module/cpyext/include/datetime.h
--- a/pypy/module/cpyext/include/datetime.h
+++ b/pypy/module/cpyext/include/datetime.h
@@ -12,6 +12,13 @@
PyTypeObject *TimeType;
PyTypeObject *DeltaType;
PyTypeObject *TZInfoType;
+
+ /* constructors */
+ PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*);
+ PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int,
+ PyObject*, PyTypeObject*);
+ PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*);
+ PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*);
} PyDateTime_CAPI;
PyAPI_DATA(PyDateTime_CAPI*) PyDateTimeAPI;
@@ -41,6 +48,22 @@
PyObject_HEAD
} PyDateTime_TZInfo;
+/* Macros for accessing constructors in a simplified fashion. */
+#define PyDate_FromDate(year, month, day) \
+ PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType)
+
+#define PyDateTime_FromDateAndTime(year, month, day, hour, min, sec, usec) \
+ PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, \
+ min, sec, usec, Py_None, PyDateTimeAPI->DateTimeType)
+
+#define PyTime_FromTime(hour, minute, second, usecond) \
+ PyDateTimeAPI->Time_FromTime(hour, minute, second, usecond, \
+ Py_None, PyDateTimeAPI->TimeType)
+
+#define PyDelta_FromDSU(days, seconds, useconds) \
+ PyDateTimeAPI->Delta_FromDelta(days, seconds, useconds, 1, \
+ PyDateTimeAPI->DeltaType)
+
#ifdef __cplusplus
}
#endif
diff --git a/pypy/module/cpyext/modsupport.py b/pypy/module/cpyext/modsupport.py
--- a/pypy/module/cpyext/modsupport.py
+++ b/pypy/module/cpyext/modsupport.py
@@ -113,7 +113,7 @@
w_type = space.gettypeobject(Module.typedef)
w_obj_type = space.type(w_obj)
return int(space.is_w(w_type, w_obj_type) or
- space.is_true(space.issubtype(w_obj_type, w_type)))
+ space.issubtype_w(w_obj_type, w_type))
@cpython_api([PyObject], PyObject, result_borrowed=True)
def PyModule_GetDict(space, w_mod):
diff --git a/pypy/module/cpyext/ndarrayobject.py
b/pypy/module/cpyext/ndarrayobject.py
--- a/pypy/module/cpyext/ndarrayobject.py
+++ b/pypy/module/cpyext/ndarrayobject.py
@@ -35,7 +35,7 @@
w_obj_type = space.type(w_obj)
w_type = space.gettypeobject(W_NDimArray.typedef)
return (space.is_w(w_obj_type, w_type) or
- space.is_true(space.issubtype(w_obj_type, w_type)))
+ space.issubtype_w(w_obj_type, w_type))
@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL, header=HEADER)
def _PyArray_CheckExact(space, w_obj):
diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -78,8 +78,7 @@
args_w = space.fixedview(w_args)
ref = make_ref(space, w_self)
if (not ref.c_ob_type.c_tp_flags & Py_TPFLAGS_CHECKTYPES and
- not space.is_true(space.issubtype(space.type(args_w[0]),
- space.type(w_self)))):
+ not space.issubtype_w(space.type(args_w[0]), space.type(w_self))):
return space.w_NotImplemented
Py_DecRef(space, ref)
return generic_cpy_call(space, func_binary, w_self, args_w[0])
@@ -90,8 +89,7 @@
args_w = space.fixedview(w_args)
ref = make_ref(space, w_self)
if (not ref.c_ob_type.c_tp_flags & Py_TPFLAGS_CHECKTYPES and
- not space.is_true(space.issubtype(space.type(args_w[0]),
- space.type(w_self)))):
+ not space.issubtype_w(space.type(args_w[0]), space.type(w_self))):
return space.w_NotImplemented
Py_DecRef(space, ref)
return generic_cpy_call(space, func_binary, args_w[0], w_self)
@@ -113,8 +111,7 @@
args_w = space.fixedview(w_args)
ref = make_ref(space, w_self)
if (not ref.c_ob_type.c_tp_flags & Py_TPFLAGS_CHECKTYPES and
- not space.is_true(space.issubtype(space.type(args_w[0]),
- space.type(w_self)))):
+ not space.issubtype_w(space.type(args_w[0]), space.type(w_self))):
return space.w_NotImplemented
Py_DecRef(space, ref)
arg3 = space.w_None
@@ -346,8 +343,7 @@
check_num_args(space, w_args, 1)
w_other, = space.fixedview(w_args)
- if not space.is_true(space.issubtype(space.type(w_self),
- space.type(w_other))):
+ if not space.issubtype_w(space.type(w_self), space.type(w_other)):
raise oefmt(space.w_TypeError,
"%T.__cmp__(x,y) requires y to be a '%T', not a '%T'",
w_self, w_self, w_other)
diff --git a/pypy/module/cpyext/test/test_datetime.py
b/pypy/module/cpyext/test/test_datetime.py
--- a/pypy/module/cpyext/test/test_datetime.py
+++ b/pypy/module/cpyext/test/test_datetime.py
@@ -4,7 +4,8 @@
class TestDatetime(BaseApiTest):
def test_date(self, space, api):
- w_date = api.PyDate_FromDate(2010, 06, 03)
+ date_api = api._PyDateTime_Import()
+ w_date = api._PyDate_FromDate(2010, 06, 03, date_api.c_DateType)
assert space.unwrap(space.str(w_date)) == '2010-06-03'
assert api.PyDate_Check(w_date)
@@ -15,7 +16,9 @@
assert api.PyDateTime_GET_DAY(w_date) == 3
def test_time(self, space, api):
- w_time = api.PyTime_FromTime(23, 15, 40, 123456)
+ date_api = api._PyDateTime_Import()
+ w_time = api._PyTime_FromTime(23, 15, 40, 123456,
+ space.w_None, date_api.c_TimeType)
assert space.unwrap(space.str(w_time)) == '23:15:40.123456'
assert api.PyTime_Check(w_time)
@@ -27,8 +30,10 @@
assert api.PyDateTime_TIME_GET_MICROSECOND(w_time) == 123456
def test_datetime(self, space, api):
- w_date = api.PyDateTime_FromDateAndTime(
- 2010, 06, 03, 23, 15, 40, 123456)
+ date_api = api._PyDateTime_Import()
+ w_date = api._PyDateTime_FromDateAndTime(
+ 2010, 06, 03, 23, 15, 40, 123456,
+ space.w_None, date_api.c_DateTimeType)
assert space.unwrap(space.str(w_date)) == '2010-06-03 23:15:40.123456'
assert api.PyDateTime_Check(w_date)
@@ -45,6 +50,7 @@
assert api.PyDateTime_DATE_GET_MICROSECOND(w_date) == 123456
def test_delta(self, space, api):
+ date_api = api._PyDateTime_Import()
w_delta = space.appexec(
[space.wrap(3), space.wrap(15)], """(days, seconds):
from datetime import timedelta
@@ -53,7 +59,7 @@
assert api.PyDelta_Check(w_delta)
assert api.PyDelta_CheckExact(w_delta)
- w_delta = api.PyDelta_FromDSU(10, 20, 30)
+ w_delta = api._PyDelta_FromDelta(10, 20, 30, True,
date_api.c_DeltaType)
assert api.PyDelta_Check(w_delta)
assert api.PyDelta_CheckExact(w_delta)
@@ -118,6 +124,31 @@
datetime.tzinfo)
module.clear_types()
+ def test_constructors(self):
+ module = self.import_extension('foo', [
+ ("new_date", "METH_NOARGS",
+ """ PyDateTime_IMPORT;
+ return PyDateTimeAPI->Date_FromDate(
+ 2000, 6, 6, PyDateTimeAPI->DateType);
+ """),
+ ("new_time", "METH_NOARGS",
+ """ PyDateTime_IMPORT;
+ return PyDateTimeAPI->Time_FromTime(
+ 6, 6, 6, 6, Py_None, PyDateTimeAPI->TimeType);
+ """),
+ ("new_datetime", "METH_NOARGS",
+ """ PyDateTime_IMPORT;
+ return PyDateTimeAPI->DateTime_FromDateAndTime(
+ 2000, 6, 6, 6, 6, 6, 6, Py_None,
+ PyDateTimeAPI->DateTimeType);
+ """),
+ ])
+ import datetime
+ assert module.new_date() == datetime.date(2000, 6, 6)
+ assert module.new_time() == datetime.time(6, 6, 6, 6)
+ assert module.new_datetime() == datetime.datetime(
+ 2000, 6, 6, 6, 6, 6, 6)
+
def test_macros(self):
module = self.import_extension('foo', [
("test_date_macros", "METH_NOARGS",
@@ -222,3 +253,9 @@
return obj;
"""),
])
+ import datetime
+ assert module.test_date_macros() == datetime.date(2000, 6, 6)
+ assert module.test_datetime_macros() == datetime.datetime(
+ 2000, 6, 6, 6, 6, 6, 6)
+ assert module.test_time_macros() == datetime.time(6, 6, 6, 6)
+ assert module.test_delta_macros() == datetime.timedelta(6, 6, 6)
diff --git a/pypy/module/cpyext/test/test_typeobject.py
b/pypy/module/cpyext/test/test_typeobject.py
--- a/pypy/module/cpyext/test/test_typeobject.py
+++ b/pypy/module/cpyext/test/test_typeobject.py
@@ -744,7 +744,7 @@
int intval;
PyObject *name;
- if (!PyArg_ParseTuple(args, "l", &intval))
+ if (!PyArg_ParseTuple(args, "i", &intval))
return NULL;
IntLike_Type.tp_flags |= Py_TPFLAGS_DEFAULT;
diff --git a/pypy/module/cpyext/tupleobject.py
b/pypy/module/cpyext/tupleobject.py
--- a/pypy/module/cpyext/tupleobject.py
+++ b/pypy/module/cpyext/tupleobject.py
@@ -47,7 +47,7 @@
def tuple_check_ref(space, ref):
w_type = from_ref(space, rffi.cast(PyObject, ref.c_ob_type))
return (w_type is space.w_tuple or
- space.is_true(space.issubtype(w_type, space.w_tuple)))
+ space.issubtype_w(w_type, space.w_tuple))
def new_empty_tuple(space, length):
"""
diff --git a/pypy/module/cpyext/unicodeobject.py
b/pypy/module/cpyext/unicodeobject.py
--- a/pypy/module/cpyext/unicodeobject.py
+++ b/pypy/module/cpyext/unicodeobject.py
@@ -225,7 +225,7 @@
buffer, NULL if unicode is not a Unicode object."""
# Don't use PyUnicode_Check, it will realize the object :-(
w_type = from_ref(space, rffi.cast(PyObject, ref.c_ob_type))
- if not space.is_true(space.issubtype(w_type, space.w_unicode)):
+ if not space.issubtype_w(w_type, space.w_unicode):
raise oefmt(space.w_TypeError, "expected unicode object")
return PyUnicode_AS_UNICODE(space, rffi.cast(rffi.VOIDP, ref))
diff --git a/pypy/module/micronumpy/boxes.py b/pypy/module/micronumpy/boxes.py
--- a/pypy/module/micronumpy/boxes.py
+++ b/pypy/module/micronumpy/boxes.py
@@ -355,8 +355,8 @@
def descr_view(self, space, w_dtype):
from pypy.module.micronumpy.descriptor import W_Dtype
try:
- subclass = space.is_true(space.issubtype(
- w_dtype, space.gettypefor(W_NDimArray)))
+ subclass = space.issubtype_w(w_dtype,
+ space.gettypefor(W_NDimArray))
except OperationError as e:
if e.match(space, space.w_TypeError):
subclass = False
diff --git a/pypy/module/micronumpy/compile.py
b/pypy/module/micronumpy/compile.py
--- a/pypy/module/micronumpy/compile.py
+++ b/pypy/module/micronumpy/compile.py
@@ -124,6 +124,9 @@
return w_obj.getdictvalue(self, w_attr)
return None
+ def issubtype_w(self, w_sub, w_type):
+ return w_sub is w_type
+
def isinstance_w(self, w_obj, w_tp):
try:
return w_obj.tp == w_tp
diff --git a/pypy/module/micronumpy/descriptor.py
b/pypy/module/micronumpy/descriptor.py
--- a/pypy/module/micronumpy/descriptor.py
+++ b/pypy/module/micronumpy/descriptor.py
@@ -1082,7 +1082,7 @@
if w_dtype is dtype.w_box_type:
return _set_metadata_and_copy(space, w_metadata, dtype, copy)
if space.isinstance_w(w_dtype, space.w_type) and \
- space.is_true(space.issubtype(w_dtype, dtype.w_box_type)):
+ space.issubtype_w(w_dtype, dtype.w_box_type):
return _set_metadata_and_copy( space, w_metadata,
W_Dtype(dtype.itemtype, w_dtype, elsize=0), copy)
if space.isinstance_w(w_dtype, space.w_type):
diff --git a/pypy/module/micronumpy/ndarray.py
b/pypy/module/micronumpy/ndarray.py
--- a/pypy/module/micronumpy/ndarray.py
+++ b/pypy/module/micronumpy/ndarray.py
@@ -977,8 +977,7 @@
def descr_view(self, space, w_dtype=None, w_type=None):
if not w_type and w_dtype:
try:
- if space.is_true(space.issubtype(
- w_dtype, space.gettypefor(W_NDimArray))):
+ if space.issubtype_w(w_dtype, space.gettypefor(W_NDimArray)):
w_type = w_dtype
w_dtype = None
except OperationError as e:
diff --git a/pypy/module/micronumpy/ufuncs.py b/pypy/module/micronumpy/ufuncs.py
--- a/pypy/module/micronumpy/ufuncs.py
+++ b/pypy/module/micronumpy/ufuncs.py
@@ -66,10 +66,10 @@
lhs_for_subtype = w_lhs
rhs_for_subtype = w_rhs
#it may be something like a FlatIter, which is not an ndarray
- if not space.is_true(space.issubtype(lhs_type, w_ndarray)):
+ if not space.issubtype_w(lhs_type, w_ndarray):
lhs_type = space.type(w_lhs.base)
lhs_for_subtype = w_lhs.base
- if not space.is_true(space.issubtype(rhs_type, w_ndarray)):
+ if not space.issubtype_w(rhs_type, w_ndarray):
rhs_type = space.type(w_rhs.base)
rhs_for_subtype = w_rhs.base
diff --git a/pypy/module/posix/app_posix.py b/pypy/module/posix/app_posix.py
--- a/pypy/module/posix/app_posix.py
+++ b/pypy/module/posix/app_posix.py
@@ -53,8 +53,6 @@
st_flags = structseqfield(23, "user defined flags for file")
def __init__(self, *args, **kw):
- super(stat_result, self).__init__(*args, **kw)
-
# If we have been initialized from a tuple,
# st_?time might be set to None. Initialize it
# from the int slots.
diff --git a/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_recompiler.py
b/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_recompiler.py
--- a/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_recompiler.py
+++ b/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_recompiler.py
@@ -1168,8 +1168,8 @@
assert MYFOO == 42
assert hasattr(lib, '__dict__')
assert lib.__all__ == ['MYFOO', 'mybar'] # but not 'myvar'
- assert lib.__name__ == repr(lib)
- assert lib.__class__ is type(lib)
+ assert lib.__name__ == '_CFFI_test_import_from_lib.lib'
+ assert lib.__class__ is type(sys) # !! hack for help()
def test_macro_var_callback():
ffi = FFI()
diff --git a/pypy/module/thread/os_local.py b/pypy/module/thread/os_local.py
--- a/pypy/module/thread/os_local.py
+++ b/pypy/module/thread/os_local.py
@@ -50,10 +50,9 @@
self.dicts[ec] = w_dict
# call __init__
try:
- w_self = space.wrap(self)
- w_type = space.type(w_self)
+ w_type = space.type(self)
w_init = space.getattr(w_type, space.wrap("__init__"))
- space.call_obj_args(w_init, w_self, self.initargs)
+ space.call_obj_args(w_init, self, self.initargs)
except:
# failed, forget w_dict and propagate the exception
del self.dicts[ec]
diff --git a/pypy/objspace/descroperation.py b/pypy/objspace/descroperation.py
--- a/pypy/objspace/descroperation.py
+++ b/pypy/objspace/descroperation.py
@@ -359,7 +359,7 @@
w_right_src, w_right_impl = space.lookup_in_type_where(w_typ2,
'__rpow__')
# sse binop_impl
if (w_left_src is not w_right_src
- and space.is_true(space.issubtype(w_typ2, w_typ1))):
+ and space.issubtype_w(w_typ2, w_typ1)):
if (w_left_src and w_right_src and
not space.abstract_issubclass_w(w_left_src, w_right_src)
and
not space.abstract_issubclass_w(w_typ1, w_right_src)):
@@ -475,7 +475,7 @@
else:
w_right_src, w_right_impl = space.lookup_in_type_where(w_typ2,
'__coerce__')
if (w_left_src is not w_right_src
- and space.is_true(space.issubtype(w_typ2, w_typ1))):
+ and space.issubtype_w(w_typ2, w_typ1)):
w_obj1, w_obj2 = w_obj2, w_obj1
w_left_impl, w_right_impl = w_right_impl, w_left_impl
@@ -495,8 +495,11 @@
"coercion should return None or 2-tuple")
return w_res
+ def issubtype_w(space, w_sub, w_type):
+ return space._type_issubtype(w_sub, w_type)
+
def issubtype(space, w_sub, w_type):
- return space._type_issubtype(w_sub, w_type)
+ return space.wrap(space._type_issubtype(w_sub, w_type))
@specialize.arg_or_var(2)
def isinstance_w(space, w_inst, w_type):
@@ -553,7 +556,7 @@
else:
w_right_src, w_right_impl = space.lookup_in_type_where(w_typ2,
'__cmp__')
if (w_left_src is not w_right_src
- and space.is_true(space.issubtype(w_typ2, w_typ1))):
+ and space.issubtype_w(w_typ2, w_typ1)):
w_obj1, w_obj2 = w_obj2, w_obj1
w_left_impl, w_right_impl = w_right_impl, w_left_impl
do_neg1, do_neg2 = do_neg2, do_neg1
@@ -690,7 +693,7 @@
if ((seq_bug_compat and w_typ1.flag_sequence_bug_compat
and not w_typ2.flag_sequence_bug_compat)
# the non-bug-compat part is the following check:
- or space.is_true(space.issubtype(w_typ2, w_typ1))):
+ or space.issubtype_w(w_typ2, w_typ1)):
if (not space.abstract_issubclass_w(w_left_src,
w_right_src) and
not space.abstract_issubclass_w(w_typ1, w_right_src)):
w_obj1, w_obj2 = w_obj2, w_obj1
@@ -729,7 +732,7 @@
# if the type is the same, *or* if both are old-style classes,
# then don't reverse: try left first, right next.
pass
- elif space.is_true(space.issubtype(w_typ2, w_typ1)):
+ elif space.issubtype_w(w_typ2, w_typ1):
# for new-style classes, if typ2 is a subclass of typ1.
w_obj1, w_obj2 = w_obj2, w_obj1
w_left_impl, w_right_impl = w_right_impl, w_left_impl
diff --git a/pypy/objspace/fake/objspace.py b/pypy/objspace/fake/objspace.py
--- a/pypy/objspace/fake/objspace.py
+++ b/pypy/objspace/fake/objspace.py
@@ -281,6 +281,11 @@
def type(self, w_obj):
return w_some_type()
+ def issubtype_w(self, w_sub, w_type):
+ is_root(w_sub)
+ is_root(w_type)
+ return NonConstant(True)
+
def isinstance_w(self, w_inst, w_type):
is_root(w_inst)
is_root(w_type)
diff --git a/pypy/objspace/std/dictproxyobject.py
b/pypy/objspace/std/dictproxyobject.py
--- a/pypy/objspace/std/dictproxyobject.py
+++ b/pypy/objspace/std/dictproxyobject.py
@@ -12,8 +12,8 @@
erase = staticmethod(erase)
unerase = staticmethod(unerase)
- def __init__(w_self, space):
- DictStrategy.__init__(w_self, space)
+ def __init__(self, space):
+ DictStrategy.__init__(self, space)
def getitem(self, w_dict, w_key):
space = self.space
diff --git a/pypy/objspace/std/noneobject.py b/pypy/objspace/std/noneobject.py
--- a/pypy/objspace/std/noneobject.py
+++ b/pypy/objspace/std/noneobject.py
@@ -4,7 +4,7 @@
class W_NoneObject(W_Root):
- def unwrap(w_self, space):
+ def unwrap(self, space):
return None
def descr_nonzero(self, space):
diff --git a/pypy/objspace/std/objectobject.py
b/pypy/objspace/std/objectobject.py
--- a/pypy/objspace/std/objectobject.py
+++ b/pypy/objspace/std/objectobject.py
@@ -84,23 +84,23 @@
'object()' call."""
+def _excess_args(__args__):
+ return bool(__args__.arguments_w) or bool(__args__.keywords)
+
def descr__new__(space, w_type, __args__):
- from pypy.objspace.std.objectobject import W_ObjectObject
from pypy.objspace.std.typeobject import _precheck_for_new
+ w_type = _precheck_for_new(space, w_type)
+
# don't allow arguments if the default object.__init__() is about
# to be called
- w_type = _precheck_for_new(space, w_type)
- w_parentinit, _ = w_type.lookup_where('__init__')
- if w_parentinit is space.w_object:
- try:
- __args__.fixedunpack(0)
- except ValueError:
+ if _excess_args(__args__):
+ w_parent_init, _ = space.lookup_in_type_where(w_type, '__init__')
+ if w_parent_init is space.w_object:
raise oefmt(space.w_TypeError,
- "default __new__ takes no parameters")
+ "object() takes no parameters")
if w_type.is_abstract():
_abstract_method_error(space, w_type)
- w_obj = space.allocate_instance(W_ObjectObject, w_type)
- return w_obj
+ return space.allocate_instance(W_ObjectObject, w_type)
def descr___subclasshook__(space, __args__):
@@ -109,12 +109,10 @@
def descr__init__(space, w_obj, __args__):
# don't allow arguments unless __new__ is overridden
- w_type = space.type(w_obj)
- w_parent_new, _ = space.lookup_in_type_where(w_type, '__new__')
- if w_parent_new is space.w_object:
- try:
- __args__.fixedunpack(0)
- except ValueError:
+ if _excess_args(__args__):
+ w_type = space.type(w_obj)
+ w_parent_new, _ = space.lookup_in_type_where(w_type, '__new__')
+ if w_parent_new is space.w_object:
raise oefmt(space.w_TypeError,
"object.__init__() takes no parameters")
diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py
--- a/pypy/objspace/std/objspace.py
+++ b/pypy/objspace/std/objspace.py
@@ -617,7 +617,7 @@
def _type_issubtype(self, w_sub, w_type):
if isinstance(w_sub, W_TypeObject) and isinstance(w_type,
W_TypeObject):
- return self.wrap(w_sub.issubtype(w_type))
+ return w_sub.issubtype(w_type)
raise oefmt(self.w_TypeError, "need type objects")
@specialize.arg_or_var(2)
diff --git a/pypy/objspace/std/sliceobject.py b/pypy/objspace/std/sliceobject.py
--- a/pypy/objspace/std/sliceobject.py
+++ b/pypy/objspace/std/sliceobject.py
@@ -12,13 +12,13 @@
class W_SliceObject(W_Root):
_immutable_fields_ = ['w_start', 'w_stop', 'w_step']
- def __init__(w_self, w_start, w_stop, w_step):
+ def __init__(self, w_start, w_stop, w_step):
assert w_start is not None
assert w_stop is not None
assert w_step is not None
- w_self.w_start = w_start
- w_self.w_stop = w_stop
- w_self.w_step = w_step
+ self.w_start = w_start
+ self.w_stop = w_stop
+ self.w_step = w_step
def unwrap(w_slice, space):
return slice(space.unwrap(w_slice.w_start),
space.unwrap(w_slice.w_stop), space.unwrap(w_slice.w_step))
diff --git a/pypy/objspace/std/strbufobject.py
b/pypy/objspace/std/strbufobject.py
--- a/pypy/objspace/std/strbufobject.py
+++ b/pypy/objspace/std/strbufobject.py
@@ -26,10 +26,10 @@
else:
return self.w_str._value
- def __repr__(w_self):
+ def __repr__(self):
""" representation for debugging purposes """
return "%s(%r[:%d])" % (
- w_self.__class__.__name__, w_self.builder, w_self.length)
+ self.__class__.__name__, self.builder, self.length)
def unwrap(self, space):
return self.force()
diff --git a/pypy/objspace/std/transparent.py b/pypy/objspace/std/transparent.py
--- a/pypy/objspace/std/transparent.py
+++ b/pypy/objspace/std/transparent.py
@@ -52,15 +52,15 @@
raise oefmt(space.w_TypeError, "controller should be function")
if isinstance(w_type, W_TypeObject):
- if space.is_true(space.issubtype(w_type,
space.gettypeobject(Function.typedef))):
+ if space.issubtype_w(w_type, space.gettypeobject(Function.typedef)):
return W_TransparentFunction(space, w_type, w_controller)
- if space.is_true(space.issubtype(w_type,
space.gettypeobject(PyTraceback.typedef))):
+ if space.issubtype_w(w_type, space.gettypeobject(PyTraceback.typedef)):
return W_TransparentTraceback(space, w_type, w_controller)
- if space.is_true(space.issubtype(w_type,
space.gettypeobject(PyFrame.typedef))):
+ if space.issubtype_w(w_type, space.gettypeobject(PyFrame.typedef)):
return W_TransparentFrame(space, w_type, w_controller)
- if space.is_true(space.issubtype(w_type,
space.gettypeobject(GeneratorIterator.typedef))):
+ if space.issubtype_w(w_type,
space.gettypeobject(GeneratorIterator.typedef)):
return W_TransparentGenerator(space, w_type, w_controller)
- if space.is_true(space.issubtype(w_type,
space.gettypeobject(PyCode.typedef))):
+ if space.issubtype_w(w_type, space.gettypeobject(PyCode.typedef)):
return W_TransparentCode(space, w_type, w_controller)
if w_type.layout.typedef is space.w_object.layout.typedef:
return W_Transparent(space, w_type, w_controller)
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
@@ -153,223 +153,223 @@
w_new_function = None
@dont_look_inside
- def __init__(w_self, space, name, bases_w, dict_w,
+ def __init__(self, space, name, bases_w, dict_w,
overridetypedef=None, force_new_layout=False):
- w_self.space = space
- w_self.name = name
- w_self.bases_w = bases_w
- w_self.dict_w = dict_w
- w_self.hasdict = False
- w_self.hasuserdel = False
- w_self.weakrefable = False
- w_self.w_doc = space.w_None
- w_self.weak_subclasses = []
- w_self.flag_heaptype = False
- w_self.flag_cpytype = False
- w_self.flag_abstract = False
- w_self.flag_sequence_bug_compat = False
- w_self.flag_map_or_seq = '?' # '?' means "don't know, check
otherwise"
+ self.space = space
+ self.name = name
+ self.bases_w = bases_w
+ self.dict_w = dict_w
+ self.hasdict = False
+ self.hasuserdel = False
+ self.weakrefable = False
+ self.w_doc = space.w_None
+ self.weak_subclasses = []
+ self.flag_heaptype = False
+ self.flag_cpytype = False
+ self.flag_abstract = False
+ self.flag_sequence_bug_compat = False
+ self.flag_map_or_seq = '?' # '?' means "don't know, check otherwise"
if overridetypedef is not None:
assert not force_new_layout
- layout = setup_builtin_type(w_self, overridetypedef)
+ layout = setup_builtin_type(self, overridetypedef)
else:
- layout = setup_user_defined_type(w_self, force_new_layout)
- w_self.layout = layout
+ layout = setup_user_defined_type(self, force_new_layout)
+ self.layout = layout
- if not is_mro_purely_of_types(w_self.mro_w):
+ if not is_mro_purely_of_types(self.mro_w):
pass
else:
# the _version_tag should change, whenever the content of
# dict_w of any of the types in the mro changes, or if the mro
# itself changes
- w_self._version_tag = VersionTag()
+ self._version_tag = VersionTag()
from pypy.objspace.std.mapdict import DictTerminator, NoDictTerminator
# if the typedef has a dict, then the rpython-class does all the dict
# management, which means from the point of view of mapdict there is no
# dict. However, W_InstanceObjects are an exception to this
from pypy.module.__builtin__.interp_classobj import W_InstanceObject
- typedef = w_self.layout.typedef
- if (w_self.hasdict and not typedef.hasdict or
+ typedef = self.layout.typedef
+ if (self.hasdict and not typedef.hasdict or
typedef is W_InstanceObject.typedef):
- w_self.terminator = DictTerminator(space, w_self)
+ self.terminator = DictTerminator(space, self)
else:
- w_self.terminator = NoDictTerminator(space, w_self)
+ self.terminator = NoDictTerminator(space, self)
def __repr__(self):
"NOT_RPYTHON"
return '<W_TypeObject %r at 0x%x>' % (self.name, id(self))
- def mutated(w_self, key):
+ def mutated(self, key):
"""
The type is being mutated. key is either the string containing the
specific attribute which is being deleted/set or None to indicate a
generic mutation.
"""
- space = w_self.space
- assert w_self.is_heaptype() or w_self.is_cpytype()
+ space = self.space
+ assert self.is_heaptype() or self.is_cpytype()
- w_self.uses_object_getattribute = False
+ self.uses_object_getattribute = False
# ^^^ conservative default, fixed during real usage
if (key is None or key == '__eq__' or
key == '__cmp__' or key == '__hash__'):
- w_self.compares_by_identity_status = UNKNOWN
+ self.compares_by_identity_status = UNKNOWN
if space.config.objspace.std.newshortcut:
- w_self.w_new_function = None
+ self.w_new_function = None
- if w_self._version_tag is not None:
- w_self._version_tag = VersionTag()
+ if self._version_tag is not None:
+ self._version_tag = VersionTag()
- subclasses_w = w_self.get_subclasses()
+ subclasses_w = self.get_subclasses()
for w_subclass in subclasses_w:
assert isinstance(w_subclass, W_TypeObject)
w_subclass.mutated(key)
- def version_tag(w_self):
- if not we_are_jitted() or w_self.is_heaptype():
- return w_self._version_tag
+ def version_tag(self):
+ if not we_are_jitted() or self.is_heaptype():
+ return self._version_tag
# prebuilt objects cannot get their version_tag changed
- return w_self._pure_version_tag()
+ return self._pure_version_tag()
@elidable_promote()
- def _pure_version_tag(w_self):
- return w_self._version_tag
+ def _pure_version_tag(self):
+ return self._version_tag
- def getattribute_if_not_from_object(w_self):
+ def getattribute_if_not_from_object(self):
""" this method returns the applevel __getattribute__ if that is not
the one from object, in which case it returns None """
from pypy.objspace.descroperation import object_getattribute
if not we_are_jitted():
- if not w_self.uses_object_getattribute:
+ if not self.uses_object_getattribute:
# slow path: look for a custom __getattribute__ on the class
- w_descr = w_self.lookup('__getattribute__')
+ w_descr = self.lookup('__getattribute__')
# if it was not actually overriden in the class, we remember
this
# fact for the next time.
- if w_descr is object_getattribute(w_self.space):
- w_self.uses_object_getattribute = True
+ if w_descr is object_getattribute(self.space):
+ self.uses_object_getattribute = True
else:
return w_descr
return None
# in the JIT case, just use a lookup, because it is folded away
# correctly using the version_tag
- w_descr = w_self.lookup('__getattribute__')
- if w_descr is not object_getattribute(w_self.space):
+ w_descr = self.lookup('__getattribute__')
+ if w_descr is not object_getattribute(self.space):
return w_descr
- def has_object_getattribute(w_self):
- return w_self.getattribute_if_not_from_object() is None
+ def has_object_getattribute(self):
+ return self.getattribute_if_not_from_object() is None
- def compares_by_identity(w_self):
+ def compares_by_identity(self):
from pypy.objspace.descroperation import object_hash, type_eq
#
- if w_self.compares_by_identity_status != UNKNOWN:
+ if self.compares_by_identity_status != UNKNOWN:
# fast path
- return w_self.compares_by_identity_status == COMPARES_BY_IDENTITY
+ return self.compares_by_identity_status == COMPARES_BY_IDENTITY
#
- default_hash = object_hash(w_self.space)
- my_eq = w_self.lookup('__eq__')
- overrides_eq = (my_eq and my_eq is not type_eq(w_self.space))
+ default_hash = object_hash(self.space)
+ my_eq = self.lookup('__eq__')
+ overrides_eq = (my_eq and my_eq is not type_eq(self.space))
overrides_eq_cmp_or_hash = (overrides_eq or
- w_self.lookup('__cmp__') or
- w_self.lookup('__hash__') is not
default_hash)
+ self.lookup('__cmp__') or
+ self.lookup('__hash__') is not
default_hash)
if overrides_eq_cmp_or_hash:
- w_self.compares_by_identity_status = OVERRIDES_EQ_CMP_OR_HASH
+ self.compares_by_identity_status = OVERRIDES_EQ_CMP_OR_HASH
else:
- w_self.compares_by_identity_status = COMPARES_BY_IDENTITY
- return w_self.compares_by_identity_status == COMPARES_BY_IDENTITY
+ self.compares_by_identity_status = COMPARES_BY_IDENTITY
+ return self.compares_by_identity_status == COMPARES_BY_IDENTITY
- def ready(w_self):
- for w_base in w_self.bases_w:
+ def ready(self):
+ for w_base in self.bases_w:
if not isinstance(w_base, W_TypeObject):
continue
- w_base.add_subclass(w_self)
+ w_base.add_subclass(self)
# compute a tuple that fully describes the instance layout
- def get_full_instance_layout(w_self):
- layout = w_self.layout
- return (layout, w_self.hasdict, w_self.weakrefable)
+ def get_full_instance_layout(self):
+ layout = self.layout
+ return (layout, self.hasdict, self.weakrefable)
- def compute_default_mro(w_self):
- return compute_C3_mro(w_self.space, w_self)
+ def compute_default_mro(self):
+ return compute_C3_mro(self.space, self)
- def getdictvalue(w_self, space, attr):
- version_tag = w_self.version_tag()
+ def getdictvalue(self, space, attr):
+ version_tag = self.version_tag()
if version_tag is not None:
return unwrap_cell(
space,
- w_self._pure_getdictvalue_no_unwrapping(
+ self._pure_getdictvalue_no_unwrapping(
space, version_tag, attr))
- w_value = w_self._getdictvalue_no_unwrapping(space, attr)
+ w_value = self._getdictvalue_no_unwrapping(space, attr)
return unwrap_cell(space, w_value)
- def _getdictvalue_no_unwrapping(w_self, space, attr):
- w_value = w_self.dict_w.get(attr, None)
- if w_self.lazyloaders and w_value is None:
- if attr in w_self.lazyloaders:
+ def _getdictvalue_no_unwrapping(self, space, attr):
+ w_value = self.dict_w.get(attr, None)
+ if self.lazyloaders and w_value is None:
+ if attr in self.lazyloaders:
# very clever next line: it forces the attr string
# to be interned.
space.new_interned_str(attr)
- loader = w_self.lazyloaders[attr]
- del w_self.lazyloaders[attr]
+ loader = self.lazyloaders[attr]
+ del self.lazyloaders[attr]
w_value = loader()
if w_value is not None: # None means no such attribute
- w_self.dict_w[attr] = w_value
+ self.dict_w[attr] = w_value
return w_value
return w_value
@elidable
- def _pure_getdictvalue_no_unwrapping(w_self, space, version_tag, attr):
- return w_self._getdictvalue_no_unwrapping(space, attr)
+ def _pure_getdictvalue_no_unwrapping(self, space, version_tag, attr):
+ return self._getdictvalue_no_unwrapping(space, attr)
- def setdictvalue(w_self, space, name, w_value):
- if not w_self.is_heaptype():
+ def setdictvalue(self, space, name, w_value):
+ if not self.is_heaptype():
raise oefmt(space.w_TypeError,
- "can't set attributes on type object '%N'", w_self)
- if name == "__del__" and name not in w_self.dict_w:
+ "can't set attributes on type object '%N'", self)
+ if name == "__del__" and name not in self.dict_w:
msg = ("a __del__ method added to an existing type will not be "
"called")
space.warn(space.wrap(msg), space.w_RuntimeWarning)
- version_tag = w_self.version_tag()
+ version_tag = self.version_tag()
if version_tag is not None:
- w_curr = w_self._pure_getdictvalue_no_unwrapping(
+ w_curr = self._pure_getdictvalue_no_unwrapping(
space, version_tag, name)
w_value = write_cell(space, w_curr, w_value)
if w_value is None:
return True
- w_self.mutated(name)
- w_self.dict_w[name] = w_value
+ self.mutated(name)
+ self.dict_w[name] = w_value
return True
- def deldictvalue(w_self, space, key):
- if w_self.lazyloaders:
- w_self._cleanup_() # force un-lazification
- if not w_self.is_heaptype():
+ def deldictvalue(self, space, key):
+ if self.lazyloaders:
+ self._cleanup_() # force un-lazification
+ if not self.is_heaptype():
raise oefmt(space.w_TypeError,
- "can't delete attributes on type object '%N'", w_self)
+ "can't delete attributes on type object '%N'", self)
try:
- del w_self.dict_w[key]
+ del self.dict_w[key]
except KeyError:
return False
else:
- w_self.mutated(key)
+ self.mutated(key)
return True
- def lookup(w_self, name):
+ def lookup(self, name):
# note that this doesn't call __get__ on the result at all
- space = w_self.space
- return w_self.lookup_where_with_method_cache(name)[1]
+ space = self.space
+ return self.lookup_where_with_method_cache(name)[1]
- def lookup_where(w_self, name):
- space = w_self.space
- return w_self.lookup_where_with_method_cache(name)
+ def lookup_where(self, name):
+ space = self.space
+ return self.lookup_where_with_method_cache(name)
@unroll_safe
- def lookup_starting_at(w_self, w_starttype, name):
- space = w_self.space
+ def lookup_starting_at(self, w_starttype, name):
+ space = self.space
look = False
- for w_class in w_self.mro_w:
+ for w_class in self.mro_w:
if w_class is w_starttype:
look = True
elif look:
@@ -379,54 +379,54 @@
return None
@unroll_safe
- def _lookup(w_self, key):
+ def _lookup(self, key):
# nowadays, only called from ../../tool/ann_override.py
- space = w_self.space
- for w_class in w_self.mro_w:
+ space = self.space
+ for w_class in self.mro_w:
w_value = w_class.getdictvalue(space, key)
if w_value is not None:
return w_value
return None
@unroll_safe
- def _lookup_where(w_self, key):
+ def _lookup_where(self, key):
# like _lookup() but also returns the parent class in which the
# attribute was found
- space = w_self.space
- for w_class in w_self.mro_w:
+ space = self.space
+ for w_class in self.mro_w:
w_value = w_class.getdictvalue(space, key)
if w_value is not None:
return w_class, w_value
return None, None
- def _lookup_where_all_typeobjects(w_self, key):
- # like _lookup_where(), but when we know that w_self.mro_w only
+ def _lookup_where_all_typeobjects(self, key):
+ # like _lookup_where(), but when we know that self.mro_w only
# contains W_TypeObjects. (It differs from _lookup_where() mostly
# from a JIT point of view: it cannot invoke arbitrary Python code.)
- space = w_self.space
- for w_class in w_self.mro_w:
+ space = self.space
+ for w_class in self.mro_w:
assert isinstance(w_class, W_TypeObject)
w_value = w_class._getdictvalue_no_unwrapping(space, key)
if w_value is not None:
return w_class, w_value
return None, None
- def lookup_where_with_method_cache(w_self, name):
- space = w_self.space
- promote(w_self)
- version_tag = promote(w_self.version_tag())
+ def lookup_where_with_method_cache(self, name):
+ space = self.space
+ promote(self)
+ version_tag = promote(self.version_tag())
if version_tag is None:
- tup = w_self._lookup_where(name)
+ tup = self._lookup_where(name)
return tup
- tup_w = w_self._pure_lookup_where_with_method_cache(name, version_tag)
+ tup_w = self._pure_lookup_where_with_method_cache(name, version_tag)
w_class, w_value = tup_w
if isinstance(w_value, MutableCell):
return w_class, w_value.unwrap_cell(space)
return tup_w # don't make a new tuple, reuse the old one
@elidable
- def _pure_lookup_where_with_method_cache(w_self, name, version_tag):
- space = w_self.space
+ def _pure_lookup_where_with_method_cache(self, name, version_tag):
+ space = self.space
cache = space.fromcache(MethodCache)
SHIFT2 = r_uint.BITS - space.config.objspace.std.methodcachesizeexp
SHIFT1 = SHIFT2 - 5
@@ -451,70 +451,70 @@
tup = cache.lookup_where[method_hash]
if space.config.objspace.std.withmethodcachecounter:
cache.hits[name] = cache.hits.get(name, 0) + 1
-# print "hit", w_self, name
+# print "hit", self, name
return tup
- tup = w_self._lookup_where_all_typeobjects(name)
+ tup = self._lookup_where_all_typeobjects(name)
cache.versions[method_hash] = version_tag
cache.names[method_hash] = name
cache.lookup_where[method_hash] = tup
if space.config.objspace.std.withmethodcachecounter:
cache.misses[name] = cache.misses.get(name, 0) + 1
-# print "miss", w_self, name
+# print "miss", self, name
return tup
- def check_user_subclass(w_self, w_subtype):
- space = w_self.space
+ def check_user_subclass(self, w_subtype):
+ space = self.space
if not isinstance(w_subtype, W_TypeObject):
raise oefmt(space.w_TypeError,
"X is not a type object ('%T')", w_subtype)
- if not w_subtype.issubtype(w_self):
+ if not w_subtype.issubtype(self):
raise oefmt(space.w_TypeError,
"%N.__new__(%N): %N is not a subtype of %N",
- w_self, w_subtype, w_subtype, w_self)
- if w_self.layout.typedef is not w_subtype.layout.typedef:
+ self, w_subtype, w_subtype, self)
+ if self.layout.typedef is not w_subtype.layout.typedef:
raise oefmt(space.w_TypeError,
"%N.__new__(%N) is not safe, use %N.__new__()",
- w_self, w_subtype, w_subtype)
+ self, w_subtype, w_subtype)
return w_subtype
- def _cleanup_(w_self):
+ def _cleanup_(self):
"NOT_RPYTHON. Forces the lazy attributes to be computed."
- if 'lazyloaders' in w_self.__dict__:
- for attr in w_self.lazyloaders.keys():
- w_self.getdictvalue(w_self.space, attr)
- del w_self.lazyloaders
+ if 'lazyloaders' in self.__dict__:
+ for attr in self.lazyloaders.keys():
+ self.getdictvalue(self.space, attr)
+ del self.lazyloaders
- def getdict(w_self, space): # returning a dict-proxy!
+ def getdict(self, space): # returning a dict-proxy!
from pypy.objspace.std.dictproxyobject import DictProxyStrategy
from pypy.objspace.std.dictmultiobject import W_DictObject
- if w_self.lazyloaders:
- w_self._cleanup_() # force un-lazification
+ if self.lazyloaders:
+ self._cleanup_() # force un-lazification
strategy = space.fromcache(DictProxyStrategy)
- storage = strategy.erase(w_self)
+ storage = strategy.erase(self)
return W_DictObject(space, strategy, storage)
- def is_heaptype(w_self):
- return w_self.flag_heaptype
+ def is_heaptype(self):
+ return self.flag_heaptype
- def is_cpytype(w_self):
- return w_self.flag_cpytype
+ def is_cpytype(self):
+ return self.flag_cpytype
- def is_abstract(w_self):
- return w_self.flag_abstract
+ def is_abstract(self):
+ return self.flag_abstract
- def set_abstract(w_self, abstract):
- w_self.flag_abstract = bool(abstract)
+ def set_abstract(self, abstract):
+ self.flag_abstract = bool(abstract)
- def issubtype(w_self, w_type):
- promote(w_self)
+ def issubtype(self, w_type):
+ promote(self)
promote(w_type)
if we_are_jitted():
- version_tag1 = w_self.version_tag()
+ version_tag1 = self.version_tag()
version_tag2 = w_type.version_tag()
if version_tag1 is not None and version_tag2 is not None:
- res = _pure_issubtype(w_self, w_type, version_tag1,
version_tag2)
+ res = _pure_issubtype(self, w_type, version_tag1, version_tag2)
return res
- return _issubtype(w_self, w_type)
+ return _issubtype(self, w_type)
def get_module(self):
space = self.space
@@ -538,8 +538,8 @@
else:
return self.name
- def add_subclass(w_self, w_subclass):
- space = w_self.space
+ def add_subclass(self, w_subclass):
+ space = self.space
if not space.config.translation.rweakref:
# We don't have weakrefs! In this case, every class stores
# subclasses in a non-weak list. ALL CLASSES LEAK! To make
@@ -552,26 +552,26 @@
assert isinstance(w_subclass, W_TypeObject)
newref = weakref.ref(w_subclass)
- for i in range(len(w_self.weak_subclasses)):
- ref = w_self.weak_subclasses[i]
+ for i in range(len(self.weak_subclasses)):
+ ref = self.weak_subclasses[i]
if ref() is None:
- w_self.weak_subclasses[i] = newref
+ self.weak_subclasses[i] = newref
return
else:
- w_self.weak_subclasses.append(newref)
+ self.weak_subclasses.append(newref)
- def remove_subclass(w_self, w_subclass):
- space = w_self.space
- for i in range(len(w_self.weak_subclasses)):
- ref = w_self.weak_subclasses[i]
+ def remove_subclass(self, w_subclass):
+ space = self.space
+ for i in range(len(self.weak_subclasses)):
+ ref = self.weak_subclasses[i]
if ref() is w_subclass:
- del w_self.weak_subclasses[i]
+ del self.weak_subclasses[i]
return
- def get_subclasses(w_self):
- space = w_self.space
+ def get_subclasses(self):
+ space = self.space
subclasses_w = []
- for ref in w_self.weak_subclasses:
+ for ref in self.weak_subclasses:
w_ob = ref()
if w_ob is not None:
subclasses_w.append(w_ob)
@@ -697,9 +697,9 @@
w_typ = space.type(base)
if space.is_w(w_typ, space.w_classobj):
continue # special-case old-style classes
- if space.is_true(space.issubtype(w_winner, w_typ)):
+ if space.issubtype_w(w_winner, w_typ):
continue
- if space.is_true(space.issubtype(w_typ, w_winner)):
+ if space.issubtype_w(w_typ, w_winner):
w_winner = w_typ
continue
raise oefmt(space.w_TypeError,
diff --git a/pypy/objspace/std/unicodeobject.py
b/pypy/objspace/std/unicodeobject.py
--- a/pypy/objspace/std/unicodeobject.py
+++ b/pypy/objspace/std/unicodeobject.py
@@ -28,22 +28,22 @@
import_from_mixin(StringMethods)
_immutable_fields_ = ['_value']
- def __init__(w_self, unistr):
+ def __init__(self, unistr):
assert isinstance(unistr, unicode)
- w_self._value = unistr
+ self._value = unistr
- def __repr__(w_self):
+ def __repr__(self):
"""representation for debugging purposes"""
- return "%s(%r)" % (w_self.__class__.__name__, w_self._value)
+ return "%s(%r)" % (self.__class__.__name__, self._value)
- def unwrap(w_self, space):
+ def unwrap(self, space):
# for testing
- return w_self._value
+ return self._value
- def create_if_subclassed(w_self):
- if type(w_self) is W_UnicodeObject:
- return w_self
- return W_UnicodeObject(w_self._value)
+ def create_if_subclassed(self):
+ if type(self) is W_UnicodeObject:
+ return self
+ return W_UnicodeObject(self._value)
def is_w(self, space, w_other):
if not isinstance(w_other, W_UnicodeObject):
@@ -78,8 +78,8 @@
charbuf_w = str_w
- def listview_unicode(w_self):
- return _create_list_from_unicode(w_self._value)
+ def listview_unicode(self):
+ return _create_list_from_unicode(self._value)
def ord(self, space):
if len(self._value) != 1:
diff --git a/pypy/objspace/test/test_descroperation.py
b/pypy/objspace/test/test_descroperation.py
--- a/pypy/objspace/test/test_descroperation.py
+++ b/pypy/objspace/test/test_descroperation.py
@@ -25,7 +25,7 @@
pass
return Base, Sub""")
w_base, w_sub = space.unpackiterable(w_tup)
- assert space.is_true(space.issubtype(w_sub, w_base))
+ assert space.issubtype_w(w_sub, w_base)
w_inst = space.call_function(w_sub)
assert space.isinstance_w(w_inst, w_base)
diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/annrpython.py
--- a/rpython/annotator/annrpython.py
+++ b/rpython/annotator/annrpython.py
@@ -237,7 +237,10 @@
def setbinding(self, arg, s_value):
s_old = arg.annotation
if s_old is not None:
- assert s_value.contains(s_old)
+ if not s_value.contains(s_old):
+ log.WARNING("%s does not contain %s" % (s_value, s_old))
+ log.WARNING("%s" % annmodel.unionof(s_value, s_old))
+ assert False
arg.annotation = s_value
def warning(self, msg, pos=None):
diff --git a/rpython/flowspace/model.py b/rpython/flowspace/model.py
--- a/rpython/flowspace/model.py
+++ b/rpython/flowspace/model.py
@@ -172,6 +172,9 @@
# Constant(last_exception), see
below
self.exits = [] # list of Link(s)
+ def is_final_block(self):
+ return self.operations == () # return or except block
+
def at(self):
if self.operations and self.operations[0].offset >= 0:
return "@%d" % self.operations[0].offset
diff --git a/rpython/jit/backend/ppc/regalloc.py
b/rpython/jit/backend/ppc/regalloc.py
--- a/rpython/jit/backend/ppc/regalloc.py
+++ b/rpython/jit/backend/ppc/regalloc.py
@@ -605,6 +605,8 @@
def prepare_guard_value(self, op):
l0 = self.ensure_reg(op.getarg(0))
l1 = self.ensure_reg_or_16bit_imm(op.getarg(1))
+ op.getdescr().make_a_counter_per_value(op,
+ self.cpu.all_reg_indexes[l0.value])
arglocs = self._prepare_guard(op, [l0, l1])
return arglocs
diff --git a/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py
b/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py
--- a/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py
+++ b/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py
@@ -1,4 +1,4 @@
-import os, random, struct
+import sys, os, random, struct
import py
from rpython.jit.backend.x86 import rx86
from rpython.rlib.rarithmetic import intmask
@@ -257,6 +257,9 @@
g.close()
error = [line for line in got.splitlines() if 'error' in line.lower()]
if error:
+ if (sys.maxint <= 2**32 and
+ 'no compiled in support for x86_64' in error[0]):
+ py.test.skip(error)
raise Exception("Assembler got an error: %r" % error[0])
error = [line for line in got.splitlines()
if 'warning' in line.lower()]
diff --git a/rpython/rlib/rfloat.py b/rpython/rlib/rfloat.py
--- a/rpython/rlib/rfloat.py
+++ b/rpython/rlib/rfloat.py
@@ -281,6 +281,35 @@
return (u - 1.) * x / math.log(u)
return math.exp(x) - 1.
+def log2(x):
+ # Uses an algorithm that should:
+ # (a) produce exact results for powers of 2, and
+ # (b) be monotonic, assuming that the system log is monotonic.
+ if not isfinite(x):
+ if isnan(x):
+ return x # log2(nan) = nan
+ elif x > 0.0:
+ return x # log2(+inf) = +inf
+ else:
+ # log2(-inf) = nan, invalid-operation
+ raise ValueError("math domain error")
+
+ if x > 0.0:
+ if 0: # HAVE_LOG2
+ return math.log2(x)
+ m, e = math.frexp(x)
+ # We want log2(m * 2**e) == log(m) / log(2) + e. Care is needed when
+ # x is just greater than 1.0: in that case e is 1, log(m) is negative,
+ # and we get significant cancellation error from the addition of
+ # log(m) / log(2) to e. The slight rewrite of the expression below
+ # avoids this problem.
+ if x >= 1.0:
+ return math.log(2.0 * m) / math.log(2.0) + (e - 1)
+ else:
+ return math.log(m) / math.log(2.0) + e
+ else:
+ raise ValueError("math domain error")
+
def round_away(x):
# round() from libm, which is not available on all platforms!
absx = abs(x)
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -1045,15 +1045,23 @@
win32traits = make_win32_traits(traits)
path1 = traits.as_str0(path1)
path2 = traits.as_str0(path2)
- if not win32traits.MoveFile(path1, path2):
+ if not win32traits.MoveFileEx(path1, path2, 0):
raise rwin32.lastSavedWindowsError()
@specialize.argtype(0, 1)
def replace(path1, path2):
- if os.name == 'nt':
- raise NotImplementedError(
- 'On windows, os.replace() should overwrite the destination')
- return rename(path1, path2)
+ if _WIN32:
+ traits = _preferred_traits(path1)
+ win32traits = make_win32_traits(traits)
+ path1 = traits.as_str0(path1)
+ path2 = traits.as_str0(path2)
+ ret = win32traits.MoveFileEx(path1, path2,
+ win32traits.MOVEFILE_REPLACE_EXISTING)
+ if not ret:
+ raise rwin32.lastSavedWindowsError()
+ else:
+ ret = rename(path1, path2)
+ return ret
#___________________________________________________________________
@@ -1211,21 +1219,14 @@
if times is None:
error = c_utime(path, lltype.nullptr(UTIMBUFP.TO))
else:
- actime, modtime = times
if HAVE_UTIMES:
- import math
- l_times = lltype.malloc(TIMEVAL2P.TO, 2, flavor='raw')
- fracpart, intpart = math.modf(actime)
- rffi.setintfield(l_times[0], 'c_tv_sec', int(intpart))
- rffi.setintfield(l_times[0], 'c_tv_usec', int(fracpart * 1e6))
- fracpart, intpart = math.modf(modtime)
- rffi.setintfield(l_times[1], 'c_tv_sec', int(intpart))
- rffi.setintfield(l_times[1], 'c_tv_usec', int(fracpart * 1e6))
- error = c_utimes(path, l_times)
- lltype.free(l_times, flavor='raw')
+ with lltype.scoped_alloc(TIMEVAL2P.TO, 2) as l_timeval2p:
+ times_to_timeval2p(times, l_timeval2p)
+ error = c_utimes(path, l_timeval2p)
else:
# we only have utime(), which does not allow
# sub-second resolution
+ actime, modtime = times
l_utimbuf = lltype.malloc(UTIMBUFP.TO, flavor='raw')
l_utimbuf.c_actime = rffi.r_time_t(actime)
l_utimbuf.c_modtime = rffi.r_time_t(modtime)
@@ -1268,6 +1269,17 @@
lltype.free(atime, flavor='raw')
lltype.free(mtime, flavor='raw')
+def times_to_timeval2p(times, l_timeval2p):
+ actime, modtime = times
+ _time_to_timeval(actime, l_timeval2p[0])
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit