Author: Maciej Fijalkowski <fij...@gmail.com> Branch: release-1.6.x Changeset: r46244:627d599f4c82 Date: 2011-08-03 15:29 +0200 http://bitbucket.org/pypy/pypy/changeset/627d599f4c82/
Log: merge default diff --git a/lib_pypy/_ctypes/function.py b/lib_pypy/_ctypes/function.py --- a/lib_pypy/_ctypes/function.py +++ b/lib_pypy/_ctypes/function.py @@ -91,13 +91,15 @@ raise TypeError( "item %d in _argtypes_ has no from_param method" % ( i + 1,)) - # - if all([hasattr(argtype, '_ffiargshape') for argtype in argtypes]): - fastpath_cls = make_fastpath_subclass(self.__class__) - fastpath_cls.enable_fastpath_maybe(self) self._argtypes_ = list(argtypes) + self._check_argtypes_for_fastpath() argtypes = property(_getargtypes, _setargtypes) + def _check_argtypes_for_fastpath(self): + if all([hasattr(argtype, '_ffiargshape') for argtype in self._argtypes_]): + fastpath_cls = make_fastpath_subclass(self.__class__) + fastpath_cls.enable_fastpath_maybe(self) + def _getparamflags(self): return self._paramflags @@ -216,6 +218,7 @@ import ctypes restype = ctypes.c_int self._ptr = self._getfuncptr_fromaddress(self._argtypes_, restype) + self._check_argtypes_for_fastpath() return diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py --- a/pypy/interpreter/baseobjspace.py +++ b/pypy/interpreter/baseobjspace.py @@ -111,6 +111,9 @@ def setslotvalue(self, index, w_val): raise NotImplementedError + def delslotvalue(self, index): + raise NotImplementedError + def descr_call_mismatch(self, space, opname, RequiredClass, args): if RequiredClass is None: classname = '?' diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py --- a/pypy/interpreter/typedef.py +++ b/pypy/interpreter/typedef.py @@ -258,6 +258,11 @@ self.slots_w = [None] * nslots def setslotvalue(self, index, w_value): self.slots_w[index] = w_value + def delslotvalue(self, index): + if self.slots_w[index] is None: + return False + self.slots_w[index] = None + return True def getslotvalue(self, index): return self.slots_w[index] add(Proto) @@ -530,11 +535,10 @@ """member.__delete__(obj) Delete the value of the slot 'member' from the given 'obj'.""" self.typecheck(space, w_obj) - w_oldresult = w_obj.getslotvalue(self.index) - if w_oldresult is None: + success = w_obj.delslotvalue(self.index) + if not success: raise OperationError(space.w_AttributeError, space.wrap(self.name)) # XXX better message - w_obj.setslotvalue(self.index, None) Member.typedef = TypeDef( "member_descriptor", diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_fastpath.py b/pypy/module/test_lib_pypy/ctypes_tests/test_fastpath.py --- a/pypy/module/test_lib_pypy/ctypes_tests/test_fastpath.py +++ b/pypy/module/test_lib_pypy/ctypes_tests/test_fastpath.py @@ -1,4 +1,4 @@ -from ctypes import CDLL, POINTER, pointer, c_byte, c_int, c_char_p +from ctypes import CDLL, POINTER, pointer, c_byte, c_int, c_char_p, CFUNCTYPE, c_void_p, c_size_t import sys import py from support import BaseCTypesTestChecker @@ -46,6 +46,12 @@ tf_b.argtypes = (c_byte,) assert tf_b(-126) == -42 + def test_from_cfunctype(self): + from _ctypes import _memmove_addr + functype = CFUNCTYPE(c_void_p, c_void_p, c_void_p, c_size_t) + my_memmove = functype(_memmove_addr) + assert my_memmove._is_fastpath + def test_undeclared_restype(self): # make sure we get a fresh function try: diff --git a/pypy/objspace/std/mapdict.py b/pypy/objspace/std/mapdict.py --- a/pypy/objspace/std/mapdict.py +++ b/pypy/objspace/std/mapdict.py @@ -421,6 +421,14 @@ key = ("slot", SLOTS_STARTING_FROM + index) self._get_mapdict_map().write(self, key, w_value) + def delslotvalue(self, index): + key = ("slot", SLOTS_STARTING_FROM + index) + new_obj = self._get_mapdict_map().delete(self, key) + if new_obj is None: + return False + self._become(new_obj) + return True + # used by _weakref implemenation def getweakref(self): diff --git a/pypy/objspace/std/test/test_mapdict.py b/pypy/objspace/std/test/test_mapdict.py --- a/pypy/objspace/std/test/test_mapdict.py +++ b/pypy/objspace/std/test/test_mapdict.py @@ -210,6 +210,12 @@ assert obj2.storage == [501, 601, 701, 51, 61, 71] assert obj.map is obj2.map + assert obj2.getslotvalue(b) == 601 + assert obj2.delslotvalue(b) + assert obj2.getslotvalue(b) is None + assert obj2.storage == [501, 701, 51, 61, 71] + assert not obj2.delslotvalue(b) + def test_slots_no_dict(): cls = Class(hasdict=False) @@ -631,6 +637,14 @@ a.__dict__ = {} a.__dict__ = {} + def test_delete_slot(self): + class A(object): + __slots__ = ['x'] + + a = A() + a.x = 42 + del a.x + raises(AttributeError, "a.x") class AppTestWithMapDictAndCounters(object): def setup_class(cls): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit