Author: Brian Kearns <bdkea...@gmail.com> Branch: py3k Changeset: r62175:1d7ef38982ad Date: 2013-03-07 06:28 -0500 http://bitbucket.org/pypy/pypy/changeset/1d7ef38982ad/
Log: merge default diff --git a/lib_pypy/_sqlite3.py b/lib_pypy/_sqlite3.py --- a/lib_pypy/_sqlite3.py +++ b/lib_pypy/_sqlite3.py @@ -243,7 +243,7 @@ ########################################## # SQLite version information -sqlite_version = sqlite.sqlite3_libversion().decode('utf-8') +sqlite_version = sqlite.sqlite3_libversion().decode('ascii') class Error(Exception): pass @@ -471,9 +471,8 @@ def _begin(self): statement = c_void_p() - next_char = c_char_p() ret = sqlite.sqlite3_prepare_v2(self._db, self.__begin_statement, -1, - byref(statement), next_char) + byref(statement), None) try: if ret != SQLITE_OK: raise self._get_exception(ret) @@ -496,9 +495,8 @@ obj._reset() statement = c_void_p() - next_char = c_char_p() ret = sqlite.sqlite3_prepare_v2(self._db, b"COMMIT", -1, - byref(statement), next_char) + byref(statement), None) try: if ret != SQLITE_OK: raise self._get_exception(ret) @@ -526,9 +524,8 @@ cursor._reset = True statement = c_void_p() - next_char = c_char_p() ret = sqlite.sqlite3_prepare_v2(self._db, b"ROLLBACK", -1, - byref(statement), next_char) + byref(statement), None) try: if ret != SQLITE_OK: raise self._get_exception(ret) @@ -1094,8 +1091,11 @@ num_params_needed = sqlite.sqlite3_bind_parameter_count(self._statement) if isinstance(params, (tuple, list)) or \ not isinstance(params, dict) and \ - hasattr(params, '__len__') and hasattr(params, '__getitem__'): - num_params = len(params) + hasattr(params, '__getitem__'): + try: + num_params = len(params) + except TypeError: + num_params = -1 if num_params != num_params_needed: raise ProgrammingError("Incorrect number of bindings supplied. " "The current statement uses %d, and " @@ -1190,7 +1190,8 @@ desc = [] for i in range(sqlite.sqlite3_column_count(self._statement)): name = sqlite.sqlite3_column_name(self._statement, i) - name = name.decode('utf-8').split("[")[0].strip() + if name is not None: + name = name.decode('utf-8').split("[")[0].strip() desc.append((name, None, None, None, None, None, None)) return desc diff --git a/pypy/module/_cffi_backend/cdataobj.py b/pypy/module/_cffi_backend/cdataobj.py --- a/pypy/module/_cffi_backend/cdataobj.py +++ b/pypy/module/_cffi_backend/cdataobj.py @@ -92,20 +92,15 @@ cdata1 = self._cdata other = space.interpclass_w(w_other) if isinstance(other, W_CData): - if requires_ordering: - if (isinstance(self.ctype, W_CTypePrimitive) or - isinstance(other.ctype, W_CTypePrimitive)): - raise OperationError(space.w_TypeError, - space.wrap("cannot do comparison on a " - "primitive cdata")) cdata2 = other._cdata - elif (misc.is_zero(space, w_other) and - not isinstance(self.ctype, W_CTypePrimitive)): - cdata2 = lltype.nullptr(rffi.CCHARP.TO) else: return space.w_NotImplemented if requires_ordering: + if (isinstance(self.ctype, W_CTypePrimitive) or + isinstance(other.ctype, W_CTypePrimitive)): + raise OperationError(space.w_TypeError, + space.wrap("cannot do comparison on a primitive cdata")) cdata1 = rffi.cast(lltype.Unsigned, cdata1) cdata2 = rffi.cast(lltype.Unsigned, cdata2) return space.newbool(op(cdata1, cdata2)) diff --git a/pypy/module/_cffi_backend/ctypeptr.py b/pypy/module/_cffi_backend/ctypeptr.py --- a/pypy/module/_cffi_backend/ctypeptr.py +++ b/pypy/module/_cffi_backend/ctypeptr.py @@ -156,10 +156,6 @@ space = self.space ob = space.interpclass_w(w_ob) if not isinstance(ob, cdataobj.W_CData): - if misc.is_zero(space, w_ob): - NULL = lltype.nullptr(rffi.CCHARP.TO) - rffi.cast(rffi.CCHARPP, cdata)[0] = NULL - return raise self._convert_error("cdata pointer", w_ob) other = ob.ctype if not isinstance(other, W_CTypePtrBase): @@ -180,8 +176,8 @@ class W_CTypePointer(W_CTypePtrBase): - _attrs_ = ['is_file', 'cache_array_type'] - _immutable_fields_ = ['is_file', 'cache_array_type?'] + _attrs_ = ['cache_array_type'] + _immutable_fields_ = ['cache_array_type?'] kind = "pointer" cache_array_type = None @@ -192,8 +188,6 @@ extra = "(*)" # obscure case: see test_array_add else: extra = " *" - self.is_file = (ctitem.name == "struct _IO_FILE" or - ctitem.name == "struct $FILE") W_CTypePtrBase.__init__(self, space, size, extra, 2, ctitem) def newp(self, w_init): @@ -245,52 +239,23 @@ p = rffi.ptradd(cdata, i * self.ctitem.size) return cdataobj.W_CData(space, p, self) - def cast(self, w_ob): - if self.is_file: - value = self.prepare_file(w_ob) - if value: - return cdataobj.W_CData(self.space, value, self) - return W_CTypePtrBase.cast(self, w_ob) - - def prepare_file(self, w_ob): - from pypy.module._io.interp_iobase import W_IOBase - ob = self.space.interpclass_w(w_ob) - if isinstance(ob, W_IOBase): - return prepare_iofile_argument(self.space, w_ob) - else: - return lltype.nullptr(rffi.CCHARP.TO) - def _prepare_pointer_call_argument(self, w_init, cdata): space = self.space - if misc.is_zero(space, w_init): - # Convert 0 to NULL. Note that passing 0 is not ambigous, - # despite the potential confusion: as a 'T*' argument, 0 means - # NULL, but as a 'T[]' argument it would mean "array of size 0" - # --- except that we specifically refuse to interpret numbers - # as the array size when passing arguments. - rffi.cast(rffi.CCHARPP, cdata)[0] = lltype.nullptr(rffi.CCHARP.TO) - return 3 - elif (space.isinstance_w(w_init, space.w_list) or + if (space.isinstance_w(w_init, space.w_list) or space.isinstance_w(w_init, space.w_tuple)): length = space.int_w(space.len(w_init)) elif (space.isinstance_w(w_init, space.w_unicode) or space.isinstance_w(w_init, space.w_bytes)): # from a string, we add the null terminator length = space.int_w(space.len(w_init)) + 1 - elif self.is_file: - result = self.prepare_file(w_init) - if result: - rffi.cast(rffi.CCHARPP, cdata)[0] = result - return 2 - return 0 else: - return 0 + return False itemsize = self.ctitem.size if itemsize <= 0: if isinstance(self.ctitem, ctypevoid.W_CTypeVoid): itemsize = 1 else: - return 0 + return False try: datasize = ovfcheck(length * itemsize) except OverflowError: @@ -304,7 +269,7 @@ lltype.free(result, flavor='raw') raise rffi.cast(rffi.CCHARPP, cdata)[0] = result - return 1 + return True def convert_argument_from_object(self, cdata, w_ob): from pypy.module._cffi_backend.ctypefunc import set_mustfree_flag @@ -312,7 +277,7 @@ ob = space.interpclass_w(w_ob) result = (not isinstance(ob, cdataobj.W_CData) and self._prepare_pointer_call_argument(w_ob, cdata)) - if result == 0: + if not result: self.convert_from_object(cdata, w_ob) set_mustfree_flag(cdata, result) return result @@ -342,42 +307,3 @@ if attrchar == 'i': # item return self.space.wrap(self.ctitem) return W_CTypePtrBase._fget(self, attrchar) - -# ____________________________________________________________ - - -rffi_fdopen = rffi.llexternal("fdopen", [rffi.INT, rffi.CCHARP], rffi.CCHARP) -rffi_setbuf = rffi.llexternal("setbuf", [rffi.CCHARP, rffi.CCHARP], lltype.Void) -rffi_fclose = rffi.llexternal("fclose", [rffi.CCHARP], rffi.INT) - -class CffiFileObj(object): - _immutable_ = True - - def __init__(self, fd, mode): - self.llf = rffi_fdopen(fd, mode) - if not self.llf: - raise OSError(rposix.get_errno(), "fdopen failed") - rffi_setbuf(self.llf, lltype.nullptr(rffi.CCHARP.TO)) - - def close(self): - rffi_fclose(self.llf) - - -def prepare_iofile_argument(space, w_fileobj): - fileobj = space.interpclass_w(w_fileobj) - from pypy.module._io.interp_iobase import W_IOBase - assert isinstance(fileobj, W_IOBase) - space.call_method(w_fileobj, "flush") - if fileobj.cffi_fileobj is None: - fd = space.int_w(space.call_method(w_fileobj, "fileno")) - if fd < 0: - raise OperationError(space.w_ValueError, - space.wrap("file has no OS file descriptor")) - fd = os.dup(fd) - mode = space.str_w(space.getattr(w_fileobj, space.wrap("mode"))) - try: - fileobj.cffi_fileobj = CffiFileObj(fd, mode) - except OSError, e: - raise wrap_oserror(space, e) - return fileobj.cffi_fileobj.llf - diff --git a/pypy/module/_cffi_backend/misc.py b/pypy/module/_cffi_backend/misc.py --- a/pypy/module/_cffi_backend/misc.py +++ b/pypy/module/_cffi_backend/misc.py @@ -209,9 +209,6 @@ neg_msg = "can't convert negative number to unsigned" ovf_msg = "long too big to convert" -def is_zero(space, w_ob): - return space.isinstance_w(w_ob, space.w_int) and not space.is_true(w_ob) - # ____________________________________________________________ class _NotStandardObject(Exception): diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py b/pypy/module/_cffi_backend/test/_backend_test_c.py --- a/pypy/module/_cffi_backend/test/_backend_test_c.py +++ b/pypy/module/_cffi_backend/test/_backend_test_c.py @@ -387,19 +387,8 @@ assert (x != None) is True assert (x == ["hello"]) is False assert (x != ["hello"]) is True - -def test_cmp_pointer_with_0(): - p = new_pointer_type(new_primitive_type("int")) - x = cast(p, 0) - assert (x == 0) is True - assert (x != 0) is False - assert (0 == x) is True - assert (0 != x) is False - y = cast(p, 42) - assert (y == 0) is False - assert (y != 0) is True - assert (0 == y) is False - assert (0 != y) is True + y = cast(p, 0) + assert (y == None) is False def test_invalid_indexing(): p = new_primitive_type("int") @@ -779,7 +768,7 @@ assert s.a2 == 456 assert s.a3 == 0 assert s.p4 == cast(BVoidP, 0) - assert s.p4 == 0 + assert s.p4 != 0 # s = newp(BStructPtr, {'a2': 41122, 'a3': -123}) assert s.a1 == 0 @@ -792,14 +781,11 @@ p = newp(BIntPtr, 14141) s = newp(BStructPtr, [12, 34, 56, p]) assert s.p4 == p - s.p4 = 0 - assert s.p4 == 0 + assert s.p4 # s = newp(BStructPtr, [12, 34, 56, cast(BVoidP, 0)]) - assert s.p4 == 0 - # - s = newp(BStructPtr, [12, 34, 56, 0]) assert s.p4 == cast(BVoidP, 0) + assert not s.p4 # py.test.raises(TypeError, newp, BStructPtr, [12, 34, 56, None]) @@ -1017,11 +1003,10 @@ f = cast(BFunc23, _testfunc(23)) res = f(b"foo") assert res == 1000 * ord(b'f') - res = f(0) # NULL - assert res == -42 - res = f(long(0)) # NULL + res = f(cast(BVoidP, 0)) # NULL assert res == -42 py.test.raises(TypeError, f, None) + py.test.raises(TypeError, f, 0) py.test.raises(TypeError, f, 0.0) def test_call_function_23_bis(): @@ -2503,15 +2488,16 @@ assert len(p) == 4 assert list(p) == [b"f", b"o", b"o", b"\x00"] -import io -fdopen_funcs = [io.open] -try: - import posix - fdopen_funcs.append(posix.fdopen) -except (ImportError, AttributeError): # win32, or py3k - pass +# XXX hack +if sys.version_info >= (3,): + try: + import posix, io + posix.fdopen = io.open + except ImportError: + pass # win32 def test_FILE(): + """FILE is not supported natively any more.""" if sys.platform == "win32": py.test.skip("testing FILE not implemented") # @@ -2521,83 +2507,16 @@ BCharP = new_pointer_type(BChar) BInt = new_primitive_type("int") BFunc = new_function_type((BCharP, BFILEP), BInt, False) - BFunc2 = new_function_type((BFILEP, BCharP), BInt, True) - ll = find_and_load_library('c') - fputs = ll.load_function(BFunc, "fputs") - fscanf = ll.load_function(BFunc2, "fscanf") - # - for fdopen in fdopen_funcs: - fdr, fdw = posix.pipe() - fr1 = fdopen(fdr, 'rb', 256) - fw1 = fdopen(fdw, 'wb', 256) - # - fw1.write(b"X") - res = fputs(b"hello world\n", fw1) - assert res >= 0 - fw1.flush() # should not be needed - # - p = newp(new_array_type(BCharP, 100), None) - res = fscanf(fr1, b"%s\n", p) - assert res == 1 - assert string(p) == b"Xhello" - fr1.close() - fw1.close() - -def test_FILE_only_for_FILE_arg(): - if sys.platform == "win32": - py.test.skip("testing FILE not implemented") - # - B_NOT_FILE = new_struct_type("NOT_FILE") - B_NOT_FILEP = new_pointer_type(B_NOT_FILE) - BChar = new_primitive_type("char") - BCharP = new_pointer_type(BChar) - BInt = new_primitive_type("int") - BFunc = new_function_type((BCharP, B_NOT_FILEP), BInt, False) ll = find_and_load_library('c') fputs = ll.load_function(BFunc, "fputs") # - for fdopen in fdopen_funcs: - fdr, fdw = posix.pipe() - fr1 = fdopen(fdr, 'r') - fw1 = fdopen(fdw, 'w') - # - e = py.test.raises(TypeError, fputs, b"hello world\n", fw1) - assert str(e.value).startswith( - "initializer for ctype 'struct NOT_FILE *' must " - "be a cdata pointer, not ") - -def test_FILE_object(): - if sys.platform == "win32": - py.test.skip("testing FILE not implemented") - # - BFILE = new_struct_type("$FILE") - BFILEP = new_pointer_type(BFILE) - BChar = new_primitive_type("char") - BCharP = new_pointer_type(BChar) - BInt = new_primitive_type("int") - BFunc = new_function_type((BCharP, BFILEP), BInt, False) - BFunc2 = new_function_type((BFILEP,), BInt, False) - ll = find_and_load_library('c') - fputs = ll.load_function(BFunc, "fputs") - fileno = ll.load_function(BFunc2, "fileno") - # - for fdopen in fdopen_funcs: - fdr, fdw = posix.pipe() - fw1 = fdopen(fdw, 'wb', 256) - # - fw1p = cast(BFILEP, fw1) - fw1.write(b"X") - fw1.flush() - res = fputs(b"hello\n", fw1p) - assert res >= 0 - res = fileno(fw1p) - if fdopen is not io.open and 'PY_DOT_PY' not in globals(): - assert res == fdw - fw1.close() - # - data = posix.read(fdr, 256) - assert data == b"Xhello\n" - posix.close(fdr) + import posix + fdr, fdw = posix.pipe() + fr1 = posix.fdopen(fdr, 'rb', 256) + fw1 = posix.fdopen(fdw, 'wb', 256) + py.test.raises(TypeError, fputs, b"hello world\n", fw1) + fr1.close() + fw1.close() def test_GetLastError(): if sys.platform != "win32": diff --git a/pypy/module/_cffi_backend/test/test_ztranslation.py b/pypy/module/_cffi_backend/test/test_ztranslation.py --- a/pypy/module/_cffi_backend/test/test_ztranslation.py +++ b/pypy/module/_cffi_backend/test/test_ztranslation.py @@ -1,20 +1,7 @@ from pypy.objspace.fake.checkmodule import checkmodule -from pypy.module._cffi_backend import ctypeptr -from rpython.rtyper.lltypesystem import lltype, rffi # side-effect: FORMAT_LONGDOUBLE must be built before test_checkmodule() from pypy.module._cffi_backend import misc def test_checkmodule(): - # W_CTypePointer.prepare_file() is not working without translating - # the _io module too - def dummy_prepare_file(self, w_ob): - return lltype.nullptr(rffi.CCHARP.TO) - old = ctypeptr.W_CTypePointer.prepare_file - try: - ctypeptr.W_CTypePointer.prepare_file = dummy_prepare_file - # - checkmodule('_cffi_backend') - # - finally: - ctypeptr.W_CTypePointer.prepare_file = old + checkmodule('_cffi_backend') diff --git a/pypy/module/_io/interp_iobase.py b/pypy/module/_io/interp_iobase.py --- a/pypy/module/_io/interp_iobase.py +++ b/pypy/module/_io/interp_iobase.py @@ -37,8 +37,6 @@ raise unsupported(space, "File or stream is not seekable") class W_IOBase(Wrappable): - cffi_fileobj = None # pypy/module/_cffi_backend - def __init__(self, space): # XXX: IOBase thinks it has to maintain its own internal state in # `__IOBase_closed` and call flush() by itself, but it is redundant @@ -108,12 +106,6 @@ def close_w(self, space): if self._CLOSED(): return - - cffifo = self.cffi_fileobj - self.cffi_fileobj = None - if cffifo is not None: - cffifo.close() - try: space.call_method(self, "flush") finally: diff --git a/pypy/module/test_lib_pypy/test_sqlite3.py b/pypy/module/test_lib_pypy/test_sqlite3.py --- a/pypy/module/test_lib_pypy/test_sqlite3.py +++ b/pypy/module/test_lib_pypy/test_sqlite3.py @@ -138,6 +138,9 @@ def __getitem__(self, key): return 2 con.execute('insert into foo(x) values (?)', seq()) + del seq.__len__ + with pytest.raises(_sqlite3.ProgrammingError): + con.execute('insert into foo(x) values (?)', seq()) with pytest.raises(_sqlite3.ProgrammingError): con.execute('insert into foo(x) values (?)', {2:2}) with pytest.raises(ValueError) as e: diff --git a/rpython/memory/gctransform/framework.py b/rpython/memory/gctransform/framework.py --- a/rpython/memory/gctransform/framework.py +++ b/rpython/memory/gctransform/framework.py @@ -7,8 +7,7 @@ from rpython.memory.gctransform.log import log from rpython.memory.gctransform.support import get_rtti, ll_call_destructor from rpython.memory.gctransform.transform import GCTransformer -from rpython.memory.gctypelayout import ll_weakref_deref, WEAKREF, \ - WEAKREFPTR +from rpython.memory.gctypelayout import ll_weakref_deref, WEAKREF, WEAKREFPTR from rpython.tool.sourcetools import func_with_new_name from rpython.translator.backendopt import graphanalyze from rpython.translator.backendopt.finalizer import FinalizerAnalyzer @@ -317,7 +316,8 @@ malloc_fast = func_with_new_name( malloc_fast_meth, "malloc_fast") - s_False = annmodel.SomeBool(); s_False.const = False + s_False = annmodel.SomeBool() + s_False.const = False self.malloc_fast_ptr = getfn( malloc_fast, [s_gc, s_typeid16, @@ -335,7 +335,8 @@ malloc_varsize_clear_fast = func_with_new_name( GCClass.malloc_varsize_clear.im_func, "malloc_varsize_clear_fast") - s_False = annmodel.SomeBool(); s_False.const = False + s_False = annmodel.SomeBool() + s_False.const = False self.malloc_varsize_clear_fast_ptr = getfn( malloc_varsize_clear_fast, [s_gc, s_typeid16, @@ -614,7 +615,7 @@ if self.collect_analyzer.analyze_direct_call(graph): raise Exception("'no_collect' function can trigger collection:" " %s" % func) - + if self.write_barrier_ptr: self.clean_sets = ( find_initializing_stores(self.collect_analyzer, graph)) @@ -1180,7 +1181,7 @@ if self.gcdata.gc.moving_gc and not keep_current_args: # moving GCs don't borrow, so the caller does not need to keep # the arguments alive - livevars = [var for var in hop.livevars_after_op()] + livevars = hop.livevars_after_op() else: livevars = hop.livevars_after_op() + hop.current_op_keeps_alive() return livevars diff --git a/rpython/rtyper/module/ll_termios.py b/rpython/rtyper/module/ll_termios.py --- a/rpython/rtyper/module/ll_termios.py +++ b/rpython/rtyper/module/ll_termios.py @@ -24,17 +24,28 @@ class CConfig: _compilation_info_ = eci NCCS = rffi_platform.DefinedConstantInteger('NCCS') + _HAVE_STRUCT_TERMIOS_C_ISPEED = rffi_platform.Defined( + '_HAVE_STRUCT_TERMIOS_C_ISPEED') + _HAVE_STRUCT_TERMIOS_C_OSPEED = rffi_platform.Defined( + '_HAVE_STRUCT_TERMIOS_C_OSPEED') -NCCS = rffi_platform.configure(CConfig)['NCCS'] +c_config = rffi_platform.configure(CConfig) +NCCS = c_config['NCCS'] TCFLAG_T = rffi.UINT CC_T = rffi.UCHAR SPEED_T = rffi.UINT INT = rffi.INT +_add = [] +if c_config['_HAVE_STRUCT_TERMIOS_C_ISPEED']: + _add.append(('c_ispeed', SPEED_T)) +if c_config['_HAVE_STRUCT_TERMIOS_C_OSPEED']: + _add.append(('c_ospeed', SPEED_T)) TERMIOSP = rffi.CStructPtr('termios', ('c_iflag', TCFLAG_T), ('c_oflag', TCFLAG_T), ('c_cflag', TCFLAG_T), ('c_lflag', TCFLAG_T), - ('c_cc', lltype.FixedSizeArray(CC_T, NCCS))) + ('c_line', CC_T), + ('c_cc', lltype.FixedSizeArray(CC_T, NCCS)), *_add) def c_external(name, args, result): return rffi.llexternal(name, args, result, compilation_info=eci) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit