@@ -1216,6 +1216,8 @@ get_native_fmtchar(char *result, const char *fmt)
12161216 case 'f' : size = sizeof (float ); break ;
12171217 case 'd' : size = sizeof (double ); break ;
12181218 case 'e' : size = sizeof (float ) / 2 ; break ;
1219+ case 'F' : size = 2 * sizeof (float ); break ;
1220+ case 'D' : size = 2 * sizeof (double ); break ;
12191221 case '?' : size = sizeof (_Bool ); break ;
12201222 case 'P' : size = sizeof (void * ); break ;
12211223 }
@@ -1260,6 +1262,8 @@ get_native_fmtstr(const char *fmt)
12601262 case 'f' : RETURN ("f" );
12611263 case 'd' : RETURN ("d" );
12621264 case 'e' : RETURN ("e" );
1265+ case 'F' : RETURN ("F" );
1266+ case 'D' : RETURN ("D" );
12631267 case '?' : RETURN ("?" );
12641268 case 'P' : RETURN ("P" );
12651269 }
@@ -1785,7 +1789,7 @@ unpack_single(PyMemoryViewObject *self, const char *ptr, const char *fmt)
17851789 long long lld ;
17861790 long ld ;
17871791 Py_ssize_t zd ;
1788- double d ;
1792+ double d [ 2 ] ;
17891793 unsigned char uc ;
17901794 void * p ;
17911795
@@ -1823,9 +1827,20 @@ unpack_single(PyMemoryViewObject *self, const char *ptr, const char *fmt)
18231827 case 'N' : UNPACK_SINGLE (zu , ptr , size_t ); goto convert_zu ;
18241828
18251829 /* floats */
1826- case 'f' : UNPACK_SINGLE (d , ptr , float ); goto convert_double ;
1827- case 'd' : UNPACK_SINGLE (d , ptr , double ); goto convert_double ;
1828- case 'e' : d = PyFloat_Unpack2 (ptr , endian ); goto convert_double ;
1830+ case 'f' : UNPACK_SINGLE (d [0 ], ptr , float ); goto convert_double ;
1831+ case 'd' : UNPACK_SINGLE (d [0 ], ptr , double ); goto convert_double ;
1832+ case 'e' : d [0 ] = PyFloat_Unpack2 (ptr , endian ); goto convert_double ;
1833+
1834+ /* complexes */
1835+ case 'F' :
1836+ d [0 ] = PyFloat_Unpack4 (ptr , endian );
1837+ d [1 ] = PyFloat_Unpack4 (ptr + sizeof (float ), endian );
1838+ goto convert_double_complex ;
1839+
1840+ case 'D' :
1841+ d [0 ] = PyFloat_Unpack8 (ptr , endian );
1842+ d [1 ] = PyFloat_Unpack8 (ptr + sizeof (double ), endian );
1843+ goto convert_double_complex ;
18291844
18301845 /* bytes object */
18311846 case 'c' : goto convert_bytes ;
@@ -1853,7 +1868,9 @@ unpack_single(PyMemoryViewObject *self, const char *ptr, const char *fmt)
18531868convert_zu :
18541869 return PyLong_FromSize_t (zu );
18551870convert_double :
1856- return PyFloat_FromDouble (d );
1871+ return PyFloat_FromDouble (d [0 ]);
1872+ convert_double_complex :
1873+ return PyComplex_FromDoubles (d [0 ], d [1 ]);
18571874convert_bool :
18581875 return PyBool_FromLong (ld );
18591876convert_bytes :
@@ -1885,6 +1902,7 @@ pack_single(PyMemoryViewObject *self, char *ptr, PyObject *item, const char *fmt
18851902 long ld ;
18861903 Py_ssize_t zd ;
18871904 double d ;
1905+ Py_complex c ;
18881906 void * p ;
18891907
18901908#if PY_LITTLE_ENDIAN
@@ -1986,6 +2004,25 @@ pack_single(PyMemoryViewObject *self, char *ptr, PyObject *item, const char *fmt
19862004 }
19872005 break ;
19882006
2007+ /* complexes */
2008+ case 'F' : case 'D' :
2009+ c = PyComplex_AsCComplex (item );
2010+ if (c .real == -1.0 && PyErr_Occurred ()) {
2011+ goto err_occurred ;
2012+ }
2013+ CHECK_RELEASED_INT_AGAIN (self );
2014+ if (fmt [0 ] == 'D' ) {
2015+ double x [2 ] = {c .real , c .imag };
2016+
2017+ memcpy (ptr , & x , sizeof (x ));
2018+ }
2019+ else {
2020+ float x [2 ] = {(float )c .real , (float )c .imag };
2021+
2022+ memcpy (ptr , & x , sizeof (x ));
2023+ }
2024+ break ;
2025+
19892026 /* bool */
19902027 case '?' :
19912028 ld = PyObject_IsTrue (item );
@@ -3023,6 +3060,24 @@ unpack_cmp(const char *p, const char *q, char fmt,
30233060 return (u == v );
30243061 }
30253062
3063+ /* complexes */
3064+ case 'F' :
3065+ {
3066+ float x [2 ], y [2 ];
3067+
3068+ memcpy (& x , p , sizeof (x ));
3069+ memcpy (& y , q , sizeof (y ));
3070+ return (x [0 ] == y [0 ]) && (x [1 ] == y [1 ]);
3071+ }
3072+ case 'D' :
3073+ {
3074+ double x [2 ], y [2 ];
3075+
3076+ memcpy (& x , p , sizeof (x ));
3077+ memcpy (& y , q , sizeof (y ));
3078+ return (x [0 ] == y [0 ]) && (x [1 ] == y [1 ]);
3079+ }
3080+
30263081 /* bytes object */
30273082 case 'c' : return * p == * q ;
30283083
0 commit comments