Author: Tom Krauss <thomas.p.kra...@gmail.com> Branch: sirtom67/float_complex Changeset: r2891:3ce9e47d35f0 Date: 2017-02-19 19:51 -0600 http://bitbucket.org/cffi/cffi/changeset/3ce9e47d35f0/
Log: "c" tests pass! diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c --- a/c/_cffi_backend.c +++ b/c/_cffi_backend.c @@ -3536,6 +3536,36 @@ return cd; } +static void check_bytes_for_float_compatible( + PyObject *io, + double * value, + int * got_value_indicator, + int * cannot_cast_indicator) +{ + *got_value_indicator = 0; + *cannot_cast_indicator = 0; + if (PyBytes_Check(io)) { + if (PyBytes_GET_SIZE(io) != 1) { + Py_DECREF(io); + *cannot_cast_indicator = 1; + } + *value = (unsigned char)PyBytes_AS_STRING(io)[0]; + *got_value_indicator = 1; + } +#if HAVE_WCHAR_H + else if (PyUnicode_Check(io)) { + wchar_t ordinal; + if (_my_PyUnicode_AsSingleWideChar(io, &ordinal) < 0) { + Py_DECREF(io); + *cannot_cast_indicator = 1; + } + *value = (long)ordinal; + *got_value_indicator = 1; + } +#endif + +} + static PyObject *do_cast(CTypeDescrObject *ct, PyObject *ob) { CDataObject *cd; @@ -3592,23 +3622,16 @@ Py_INCREF(io); } - if (PyBytes_Check(io)) { - if (PyBytes_GET_SIZE(io) != 1) { - Py_DECREF(io); - goto cannot_cast; - } - value = (unsigned char)PyBytes_AS_STRING(io)[0]; - } -#if HAVE_WCHAR_H - else if (PyUnicode_Check(io)) { - wchar_t ordinal; - if (_my_PyUnicode_AsSingleWideChar(io, &ordinal) < 0) { - Py_DECREF(io); - goto cannot_cast; - } - value = (long)ordinal; - } -#endif + int got_value_indicator; + int cannot_cast_indicator; + check_bytes_for_float_compatible(io, &value, + &got_value_indicator, &cannot_cast_indicator); + if (cannot_cast_indicator) { + goto cannot_cast; + } + if (got_value_indicator) { + // got it from string + } else if ((ct->ct_flags & CT_IS_LONGDOUBLE) && CData_Check(io) && (((CDataObject *)io)->c_type->ct_flags & CT_IS_LONGDOUBLE)) { @@ -3658,11 +3681,23 @@ Py_INCREF(io); } - value = PyComplex_AsCComplex(io); + int got_value_indicator; + int cannot_cast_indicator; + check_bytes_for_float_compatible(io, &(value.real), + &got_value_indicator, &cannot_cast_indicator); + if (cannot_cast_indicator) { + goto cannot_cast; + } + if (got_value_indicator) { + // got it from string + value.imag = 0.0; + } else { + value = PyComplex_AsCComplex(io); + } Py_DECREF(io); - if (value.real == -1.0 && value.imag == 0.0 && PyErr_Occurred()) + if (value.real == -1.0 && value.imag == 0.0 && PyErr_Occurred()) { return NULL; - + } cd = _new_casted_primitive(ct); if (cd != NULL) { write_raw_complex_data(cd->c_data, value, ct->ct_size); diff --git a/c/test_c.py b/c/test_c.py --- a/c/test_c.py +++ b/c/test_c.py @@ -206,8 +206,9 @@ assert cast(p, -1.1j) != cast(p, -1.1j) assert repr(complex(cast(p, -0.0)).real) == '-0.0' - assert repr(complex(cast(p, -0j))) == '-0j' - assert complex(cast(p, '\x09')) == 9.0 + #assert repr(complex(cast(p, -0j))) == '-0j' # http://bugs.python.org/issue29602 + assert complex(cast(p, b'\x09')) == 9.0 + assert complex(cast(p, u+'\x09')) == 9.0 assert complex(cast(p, True)) == 1.0 py.test.raises(TypeError, cast, p, None) # _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit