Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
2825b2ea
Kaydet (Commit)
2825b2ea
authored
Eyl 07, 2007
tarafından
Thomas Heller
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Add a 'c_longdouble' type to the ctypes module.
üst
1e534b54
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
115 additions
and
3 deletions
+115
-3
ctypes.rst
Doc/library/ctypes.rst
+9
-0
__init__.py
Lib/ctypes/__init__.py
+5
-0
test_arrays.py
Lib/ctypes/test/test_arrays.py
+1
-1
test_callbacks.py
Lib/ctypes/test/test_callbacks.py
+4
-0
test_cfuncs.py
Lib/ctypes/test/test_cfuncs.py
+12
-0
test_functions.py
Lib/ctypes/test/test_functions.py
+12
-0
test_repr.py
Lib/ctypes/test/test_repr.py
+1
-1
NEWS
Misc/NEWS
+2
-0
_ctypes.c
Modules/_ctypes/_ctypes.c
+1
-1
_ctypes_test.c
Modules/_ctypes/_ctypes_test.c
+35
-0
callproc.c
Modules/_ctypes/callproc.c
+1
-0
cfield.c
Modules/_ctypes/cfield.c
+30
-0
ctypes.h
Modules/_ctypes/ctypes.h
+2
-0
No files found.
Doc/library/ctypes.rst
Dosyayı görüntüle @
2825b2ea
...
...
@@ -249,6 +249,8 @@ Fundamental data types
+----------------------+--------------------------------+----------------------------+
| :class:`c_double` | ``double`` | float |
+----------------------+--------------------------------+----------------------------+
| :class:`c_longdouble`| ``long double`` | float |
+----------------------+--------------------------------+----------------------------+
| :class:`c_char_p` | ``char *`` (NUL terminated) | string or ``None`` |
+----------------------+--------------------------------+----------------------------+
| :class:`c_wchar_p` | ``wchar_t *`` (NUL terminated) | unicode or ``None`` |
...
...
@@ -2067,6 +2069,13 @@ These are the fundamental ctypes data types:
initializer.
.. class:: c_longdouble
Represents the C long double datatype. The constructor accepts an
optional float initializer. On platforms where ``sizeof(long
double) == sizeof(double)`` it is an alias to :class:`c_double`.
.. class:: c_float
Represents the C float datatype. The constructor accepts an optional float
...
...
Lib/ctypes/__init__.py
Dosyayı görüntüle @
2825b2ea
...
...
@@ -191,6 +191,11 @@ class c_double(_SimpleCData):
_type_
=
"d"
_check_size
(
c_double
)
class
c_longdouble
(
_SimpleCData
):
_type_
=
"D"
if
sizeof
(
c_longdouble
)
==
sizeof
(
c_double
):
c_longdouble
=
c_double
if
_calcsize
(
"l"
)
==
_calcsize
(
"q"
):
# if long and long long have the same size, make c_longlong an alias for c_long
c_longlong
=
c_long
...
...
Lib/ctypes/test/test_arrays.py
Dosyayı görüntüle @
2825b2ea
...
...
@@ -4,7 +4,7 @@ from ctypes import *
formats
=
"bBhHiIlLqQfd"
formats
=
c_byte
,
c_ubyte
,
c_short
,
c_ushort
,
c_int
,
c_uint
,
\
c_long
,
c_ulonglong
,
c_float
,
c_double
c_long
,
c_ulonglong
,
c_float
,
c_double
,
c_longdouble
class
ArrayTestCase
(
unittest
.
TestCase
):
def
test_simple
(
self
):
...
...
Lib/ctypes/test/test_callbacks.py
Dosyayı görüntüle @
2825b2ea
...
...
@@ -77,6 +77,10 @@ class Callbacks(unittest.TestCase):
self
.
check_type
(
c_double
,
3.14
)
self
.
check_type
(
c_double
,
-
3.14
)
def
test_longdouble
(
self
):
self
.
check_type
(
c_longdouble
,
3.14
)
self
.
check_type
(
c_longdouble
,
-
3.14
)
def
test_char
(
self
):
self
.
check_type
(
c_char
,
"x"
)
self
.
check_type
(
c_char
,
"a"
)
...
...
Lib/ctypes/test/test_cfuncs.py
Dosyayı görüntüle @
2825b2ea
...
...
@@ -158,6 +158,18 @@ class CFunctions(unittest.TestCase):
self
.
failUnlessEqual
(
self
.
_dll
.
tf_bd
(
0
,
42.
),
14.
)
self
.
failUnlessEqual
(
self
.
S
(),
42
)
def
test_longdouble
(
self
):
self
.
_dll
.
tf_D
.
restype
=
c_longdouble
self
.
_dll
.
tf_D
.
argtypes
=
(
c_longdouble
,)
self
.
failUnlessEqual
(
self
.
_dll
.
tf_D
(
42.
),
14.
)
self
.
failUnlessEqual
(
self
.
S
(),
42
)
def
test_longdouble_plus
(
self
):
self
.
_dll
.
tf_bD
.
restype
=
c_longdouble
self
.
_dll
.
tf_bD
.
argtypes
=
(
c_byte
,
c_longdouble
)
self
.
failUnlessEqual
(
self
.
_dll
.
tf_bD
(
0
,
42.
),
14.
)
self
.
failUnlessEqual
(
self
.
S
(),
42
)
def
test_callwithresult
(
self
):
def
process_result
(
result
):
return
result
*
2
...
...
Lib/ctypes/test/test_functions.py
Dosyayı görüntüle @
2825b2ea
...
...
@@ -143,6 +143,18 @@ class FunctionTestCase(unittest.TestCase):
self
.
failUnlessEqual
(
result
,
-
21
)
self
.
failUnlessEqual
(
type
(
result
),
float
)
def
test_longdoubleresult
(
self
):
f
=
dll
.
_testfunc_D_bhilfD
f
.
argtypes
=
[
c_byte
,
c_short
,
c_int
,
c_long
,
c_float
,
c_longdouble
]
f
.
restype
=
c_longdouble
result
=
f
(
1
,
2
,
3
,
4
,
5.0
,
6.0
)
self
.
failUnlessEqual
(
result
,
21
)
self
.
failUnlessEqual
(
type
(
result
),
float
)
result
=
f
(
-
1
,
-
2
,
-
3
,
-
4
,
-
5.0
,
-
6.0
)
self
.
failUnlessEqual
(
result
,
-
21
)
self
.
failUnlessEqual
(
type
(
result
),
float
)
def
test_longlongresult
(
self
):
try
:
c_longlong
...
...
Lib/ctypes/test/test_repr.py
Dosyayı görüntüle @
2825b2ea
...
...
@@ -4,7 +4,7 @@ import unittest
subclasses
=
[]
for
base
in
[
c_byte
,
c_short
,
c_int
,
c_long
,
c_longlong
,
c_ubyte
,
c_ushort
,
c_uint
,
c_ulong
,
c_ulonglong
,
c_float
,
c_double
,
c_bool
]:
c_float
,
c_double
,
c_
longdouble
,
c_
bool
]:
class
X
(
base
):
pass
subclasses
.
append
(
X
)
...
...
Misc/NEWS
Dosyayı görüntüle @
2825b2ea
...
...
@@ -249,6 +249,8 @@ Core and builtins
Library
-------
- A '
c_longdouble
' type was added to the ctypes module.
- Bug #1709599: Run test_1565150 only if the file system is NTFS.
- When encountering a password-protected robots.txt file the RobotFileParser
...
...
Modules/_ctypes/_ctypes.c
Dosyayı görüntüle @
2825b2ea
...
...
@@ -1101,7 +1101,7 @@ _type_ attribute.
*/
static
char
*
SIMPLE_TYPE_CHARS
=
"cbBhHiIlLdfuzZqQPXOvt"
;
static
char
*
SIMPLE_TYPE_CHARS
=
"cbBhHiIlLdfuzZqQPXOvt
D
"
;
static
PyObject
*
c_wchar_p_from_param
(
PyObject
*
type
,
PyObject
*
value
)
...
...
Modules/_ctypes/_ctypes_test.c
Dosyayı görüntüle @
2825b2ea
...
...
@@ -25,6 +25,29 @@
/* some functions handy for testing */
EXPORT
(
long
double
)
testfunc_Ddd
(
double
a
,
double
b
)
{
long
double
result
=
(
long
double
)(
a
*
b
);
printf
(
"testfunc_Ddd(%p, %p)
\n
"
,
&
a
,
&
b
);
printf
(
"testfunc_Ddd(%g, %g)
\n
"
,
a
,
b
);
return
result
;
}
EXPORT
(
long
double
)
testfunc_DDD
(
long
double
a
,
long
double
b
)
{
long
double
result
=
a
*
b
;
printf
(
"testfunc_DDD(%p, %p)
\n
"
,
&
a
,
&
b
);
printf
(
"testfunc_DDD(%Lg, %Lg)
\n
"
,
a
,
b
);
return
result
;
}
EXPORT
(
int
)
testfunc_iii
(
int
a
,
int
b
)
{
int
result
=
a
*
b
;
printf
(
"testfunc_iii(%p, %p)
\n
"
,
&
a
,
&
b
);
return
result
;
}
EXPORT
(
int
)
myprintf
(
char
*
fmt
,
...)
{
int
result
;
...
...
@@ -90,6 +113,14 @@ EXPORT(double) _testfunc_d_bhilfd(signed char b, short h, int i, long l, float f
return
(
double
)(
b
+
h
+
i
+
l
+
f
+
d
);
}
EXPORT
(
long
double
)
_testfunc_D_bhilfD
(
signed
char
b
,
short
h
,
int
i
,
long
l
,
float
f
,
long
double
d
)
{
/* printf("_testfunc_d_bhilfd got %d %d %d %ld %f %f\n",
b, h, i, l, f, d);
*/
return
(
long
double
)(
b
+
h
+
i
+
l
+
f
+
d
);
}
EXPORT
(
char
*
)
_testfunc_p_p
(
void
*
s
)
{
return
(
char
*
)
s
;
...
...
@@ -404,6 +435,7 @@ EXPORT(PY_LONG_LONG) tf_q(PY_LONG_LONG c) { S; return c/3; }
EXPORT
(
unsigned
PY_LONG_LONG
)
tf_Q
(
unsigned
PY_LONG_LONG
c
)
{
U
;
return
c
/
3
;
}
EXPORT
(
float
)
tf_f
(
float
c
)
{
S
;
return
c
/
3
;
}
EXPORT
(
double
)
tf_d
(
double
c
)
{
S
;
return
c
/
3
;
}
EXPORT
(
long
double
)
tf_D
(
long
double
c
)
{
S
;
return
c
/
3
;
}
#ifdef MS_WIN32
EXPORT
(
signed
char
)
__stdcall
s_tf_b
(
signed
char
c
)
{
S
;
return
c
/
3
;
}
...
...
@@ -418,6 +450,7 @@ EXPORT(PY_LONG_LONG) __stdcall s_tf_q(PY_LONG_LONG c) { S; return c/3; }
EXPORT
(
unsigned
PY_LONG_LONG
)
__stdcall
s_tf_Q
(
unsigned
PY_LONG_LONG
c
)
{
U
;
return
c
/
3
;
}
EXPORT
(
float
)
__stdcall
s_tf_f
(
float
c
)
{
S
;
return
c
/
3
;
}
EXPORT
(
double
)
__stdcall
s_tf_d
(
double
c
)
{
S
;
return
c
/
3
;
}
EXPORT
(
long
double
)
__stdcall
s_tf_D
(
long
double
c
)
{
S
;
return
c
/
3
;
}
#endif
/*******/
...
...
@@ -433,6 +466,7 @@ EXPORT(PY_LONG_LONG) tf_bq(signed char x, PY_LONG_LONG c) { S; return c/3; }
EXPORT
(
unsigned
PY_LONG_LONG
)
tf_bQ
(
signed
char
x
,
unsigned
PY_LONG_LONG
c
)
{
U
;
return
c
/
3
;
}
EXPORT
(
float
)
tf_bf
(
signed
char
x
,
float
c
)
{
S
;
return
c
/
3
;
}
EXPORT
(
double
)
tf_bd
(
signed
char
x
,
double
c
)
{
S
;
return
c
/
3
;
}
EXPORT
(
long
double
)
tf_bD
(
signed
char
x
,
long
double
c
)
{
S
;
return
c
/
3
;
}
EXPORT
(
void
)
tv_i
(
int
c
)
{
S
;
return
;
}
#ifdef MS_WIN32
...
...
@@ -448,6 +482,7 @@ EXPORT(PY_LONG_LONG) __stdcall s_tf_bq(signed char x, PY_LONG_LONG c) { S; retur
EXPORT
(
unsigned
PY_LONG_LONG
)
__stdcall
s_tf_bQ
(
signed
char
x
,
unsigned
PY_LONG_LONG
c
)
{
U
;
return
c
/
3
;
}
EXPORT
(
float
)
__stdcall
s_tf_bf
(
signed
char
x
,
float
c
)
{
S
;
return
c
/
3
;
}
EXPORT
(
double
)
__stdcall
s_tf_bd
(
signed
char
x
,
double
c
)
{
S
;
return
c
/
3
;
}
EXPORT
(
long
double
)
__stdcall
s_tf_bD
(
signed
char
x
,
long
double
c
)
{
S
;
return
c
/
3
;
}
EXPORT
(
void
)
__stdcall
s_tv_i
(
int
c
)
{
S
;
return
;
}
#endif
...
...
Modules/_ctypes/callproc.c
Dosyayı görüntüle @
2825b2ea
...
...
@@ -449,6 +449,7 @@ union result {
#ifdef HAVE_LONG_LONG
PY_LONG_LONG
q
;
#endif
long
double
D
;
double
d
;
float
f
;
void
*
p
;
...
...
Modules/_ctypes/cfield.c
Dosyayı görüntüle @
2825b2ea
...
...
@@ -5,6 +5,7 @@
#include "Python.h"
#include <ffi.h>
#include <fficonfig.h>
#ifdef MS_WIN32
#include <windows.h>
#endif
...
...
@@ -989,6 +990,29 @@ Q_get_sw(void *ptr, Py_ssize_t size)
*/
static
PyObject
*
D_set
(
void
*
ptr
,
PyObject
*
value
,
Py_ssize_t
size
)
{
long
double
x
;
x
=
PyFloat_AsDouble
(
value
);
if
(
x
==
-
1
&&
PyErr_Occurred
())
{
PyErr_Format
(
PyExc_TypeError
,
" float expected instead of %s instance"
,
value
->
ob_type
->
tp_name
);
return
NULL
;
}
memcpy
(
ptr
,
&
x
,
sizeof
(
long
double
));
_RET
(
value
);
}
static
PyObject
*
D_get
(
void
*
ptr
,
Py_ssize_t
size
)
{
long
double
val
;
memcpy
(
&
val
,
ptr
,
sizeof
(
long
double
));
return
PyFloat_FromDouble
(
val
);
}
static
PyObject
*
d_set
(
void
*
ptr
,
PyObject
*
value
,
Py_ssize_t
size
)
...
...
@@ -1584,6 +1608,7 @@ static struct fielddesc formattable[] = {
{
'B'
,
B_set
,
B_get
,
&
ffi_type_uchar
},
{
'c'
,
c_set
,
c_get
,
&
ffi_type_schar
},
{
'd'
,
d_set
,
d_get
,
&
ffi_type_double
,
d_set_sw
,
d_get_sw
},
{
'D'
,
D_set
,
D_get
,
&
ffi_type_longdouble
},
{
'f'
,
f_set
,
f_get
,
&
ffi_type_float
,
f_set_sw
,
f_get_sw
},
{
'h'
,
h_set
,
h_get
,
&
ffi_type_sshort
,
h_set_sw
,
h_get_sw
},
{
'H'
,
H_set
,
H_get
,
&
ffi_type_ushort
,
H_set_sw
,
H_get_sw
},
...
...
@@ -1666,6 +1691,7 @@ typedef struct { char c; int x; } s_int;
typedef
struct
{
char
c
;
long
x
;
}
s_long
;
typedef
struct
{
char
c
;
float
x
;
}
s_float
;
typedef
struct
{
char
c
;
double
x
;
}
s_double
;
typedef
struct
{
char
c
;
long
double
x
;
}
s_long_double
;
typedef
struct
{
char
c
;
char
*
x
;
}
s_char_p
;
typedef
struct
{
char
c
;
void
*
x
;
}
s_void_p
;
...
...
@@ -1677,6 +1703,8 @@ typedef struct { char c; void *x; } s_void_p;
*/
#define FLOAT_ALIGN (sizeof(s_float) - sizeof(float))
#define DOUBLE_ALIGN (sizeof(s_double) - sizeof(double))
#define LONGDOUBLE_ALIGN (sizeof(s_long_double) - sizeof(long double))
/* #define CHAR_P_ALIGN (sizeof(s_char_p) - sizeof(char*)) */
#define VOID_P_ALIGN (sizeof(s_void_p) - sizeof(void*))
...
...
@@ -1722,6 +1750,8 @@ ffi_type ffi_type_sint64 = { 8, LONG_LONG_ALIGN, FFI_TYPE_SINT64 };
ffi_type
ffi_type_float
=
{
sizeof
(
float
),
FLOAT_ALIGN
,
FFI_TYPE_FLOAT
};
ffi_type
ffi_type_double
=
{
sizeof
(
double
),
DOUBLE_ALIGN
,
FFI_TYPE_DOUBLE
};
ffi_type
ffi_type_longdouble
=
{
sizeof
(
long
double
),
LONGDOUBLE_ALIGN
,
FFI_TYPE_LONGDOUBLE
};
/* ffi_type ffi_type_longdouble */
...
...
Modules/_ctypes/ctypes.h
Dosyayı görüntüle @
2825b2ea
...
...
@@ -47,6 +47,7 @@ union value {
#ifdef HAVE_LONG_LONG
PY_LONG_LONG
ll
;
#endif
long
double
D
;
};
/*
...
...
@@ -300,6 +301,7 @@ struct tagPyCArgObject {
#ifdef HAVE_LONG_LONG
PY_LONG_LONG
q
;
#endif
long
double
D
;
double
d
;
float
f
;
void
*
p
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment